288 lines
5.8 KiB
Perl
288 lines
5.8 KiB
Perl
# -*-perl-*-
|
|
#
|
|
# Miscalleneous notes on S2, the 2nd major
|
|
# version of the LiveJournal style system.
|
|
#
|
|
# Brad Fitzpatrick <bradfitz@livejournal.com>
|
|
# 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 {
|
|
"""<img src="$url" width=$w height=$h border=0>""";
|
|
};
|
|
|
|
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";
|
|
}
|
|
"""<a href="$urlread">Read $comment_count $noun</a>""";
|
|
};
|
|
|
|
class comment_post {
|
|
var string urlpost,
|
|
method void print (),
|
|
};
|
|
|
|
method comment_post::print ()
|
|
{
|
|
"""<a href="$urlpost">Leave a comment!</a>""";
|
|
}
|
|
|
|
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 "<p><table><tr><td>\n";
|
|
"<b>"; call $eventtime print_long; "</b><br>";
|
|
print $event;
|
|
if ($comments.can_comment) {
|
|
"<p>";
|
|
call $comments print;
|
|
}
|
|
"</td></tr></table>\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") {
|
|
|
|
}
|
|
"""<html><head><title>$title</title>$head""";
|
|
print "<body>\n";
|
|
|
|
|
|
print "</body></html>";
|
|
}
|
|
|
|
########
|
|
### 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.
|
|
}
|
|
"""<a href="$urlread">Lesen $comment_count $noun</a>""";
|
|
};
|
|
|
|
method comment_post::print ()
|
|
{
|
|
"""<a href="$urlpost">Schrieben eine Kommentar!</a>""";
|
|
}
|
|
|
|
######
|
|
### 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";
|
|
}
|
|
"""<a href="$urlread">$comment_count $noun.</a>""";
|
|
};
|
|
|
|
# ibrad-style popcorn links
|
|
method comment_post::print ()
|
|
{
|
|
"""<a href="$urlpost">Pop!</a>""";
|
|
}
|
|
|
|
########
|
|
### 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);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|