# -*-perl-*- # # Miscalleneous notes on S2, the 2nd major # version of the LiveJournal style system. # # Brad Fitzpatrick # 2001-02-03 # ########### ## goals # # 1. flexible/extensible: # - layers # - full programming language (*) # - allows for internationalization # - not specific to one view: # - describe how to format objects # - makes new views automatically supported, # at least mostly. # 2. safe: # - (*) programming language has no unsafe # looping/branching. only foreach # on finite lists, ifs, etc. # 3. fast: # - precompiled # 4. easy: # - wizards/tools to generate each layer # of S2 # # ########### ## layers # # # core (definitions, defaults) # style - the "style" # colors - tied to a style. # i18n - not tied to a style # custom - changing comment links, counters, # page.insert_html shit. # # layers are parsed and compiled before use. # compiled into native language of appserver # this is perl now, but easy to change later: # parser -> AST stays the same. # just change AST -> pretty printer. # S2 is not tied to perl, then. can move to # something faster later... C, anybody? # S2 parser will be written in java, and # tools will be provided for users to run and # test styles on their own machines # ########### ## core layer # # only layer where classes can be declared. set layertype "core"; set author "webmaster"; class image { var string url, var int w, var int h, method void print (), # allow trailing commas: so nice. }; method image::print { """"""; }; class comment_read { var string urlread, var int comment_count, method void print (), }; method comment_read::print () { $noun = "Comments"; if ($comment_count ==1 ) { $noun = "Comment"; } """Read $comment_count $noun"""; }; class comment_post { var string urlpost, method void print (), }; method comment_post::print () { """Leave a comment!"""; } class comment_info { var bool can_comment, var comment_post post, var comment_read read, method void print (), }; method comment_info::print () { if ($can_comment == false) { return; } if ($comment_count != 0) { call $read print; print " | "; } call $post print; } # ack! There's English in there! ^^^^^^^^^ # # English will be default, everywhere, since it # is anyway, right? Later we can have our # master team of translators make new i18n layers # that override these defaults. still, users # can then override those i18n layers later, with # their own words. users won't write in S2: # we'll have stupid little wizards that ask them # questions and generate/compile the S2 behind # the scenes for them. for them, the process will # be like: # # Pick Style: [ \/ ] # Pick Language: [ \/ ] # # [ Continue--> ] # # Pick Style color theme: [ \/] # or, enter your own: # # [ Finish ] [ More Customization -->] # # What do you want the comment links to say? # ____________________ # How many items on a page at once? _______ # More stupid questions: _____________ class journal_entry { var string event, var string subject, var datetime eventtime, var string current_mood, var string mood_image, var string current_music, var bool opt_nocomments, var user userpost, var user userjournal, var image userpic, var comment_info comments, var string urlself, var string head, method void print, }; method journal_entry::print { print "

\n"; ""; call $eventtime print_long; "
"; print $event; if ($comments.can_comment) { "

"; call $comments print; } "

\n"; }; class page { var string view, var bool remote_logged_in, # logged in user? var bool remote_is_owner, # is it the journal owner? var journal_entry[] entries, # method void print, }; method page::print { local string title; if ($view == "lastn") { } """$title$head"""; print "\n"; print ""; } ######## ### style layer ## set layertype "style"; set layername "Generator"; set author "evan"; var string colitemborder = "#00f033"; var string colpageback = "#a0a0a0"; ######## ### color layer ## set layertype "colors"; set overlays "Generator"; # only for style layers set author "bradfitz"; var string colitemborder = "#ff0000"; var string colpageback = "#00cc00"; ######## ### i18n layer ## set layertype "i18n"; set layerlang "de"; set author "mausal"; method comment_read::print () { $noun = "Kommentar"; # warning: probably wrong. if ($comment_count ==1 ) { $noun = "Kommentar"; # probably wrong. } """Lesen $comment_count $noun"""; }; method comment_post::print () { """Schrieben eine Kommentar!"""; } ###### ### custom layer ## ## - auto-generated from a wizard ## ... or written by hand. (unlikely) set layertype "custom"; set author "ibrad"; # ibrad-style popcorn links method comment_read::print () { $noun = "Kernels"; if ($comment_count ==1 ) { $noun = "Kernel"; } """$comment_count $noun."""; }; # ibrad-style popcorn links method comment_post::print () { """Pop!"""; } ######## ### implementation # # request in: /users/bradfitz/ make_journal("bradfitz", "lastn"); my %methods; foreach $layers ("core", @user_layers) { load_layer($layers, } $pageob = new S2::ob::page; $pageob->setup_all_datastructures($dbh, $user, $view); $journal = $methods{'page'}->{'print'}->($pageob);