# -*-s2-*- layerinfo "type" = "layout"; layerinfo "name" = "Parrhesia"; layerinfo "lang" = "en"; layerinfo "author" = "Sam Angove"; layerinfo "author_email" = "samATrephraseFULLSTOPnet"; layerinfo "is_public" = 1; layerinfo "source_viewable" = 1; # v. 1.0 - 2006.01.31 # # A long, long time ago, back when S2 was new and promising, this style was # based on 's "A Sturdy Gesture". # # I don't think there's much/any code from it left over, but it (and other # system styles) were ripped off^H^H^H^H^H^H^H^H^H^Hconsulted. # Blah blah blah GPL Free Software etc. etc. # # A bunch of things aren't supported, because this isn't a system style # and it's a lot of work. There's some hard-coded English in there, for # example. # # Friend colours aren't there because it's a *huge* pain to write a style # with dynamic colours -- borders, underlines, headings &c. have to change # shades to match the simple foreground and background picked. # Colour properties aren't supported because making them simple requires # just as much bother with dynamic colouring, and if they're complex then # it's easier for people to just edit the CSS. propgroup CSS { property string external_css_url { des = "URL to external stylesheet."; } property string custom_css { des = "CSS rules to append to theme stylesheet."; rows = 20; cols = 40; } } propgroup Sidebar { property string custom_sidebar { des = "HTML appended to the bottom of the sidebar. (RecentPage only.)"; rows = 20; cols = 40; } property string sidebar_footer { des = "The footer is appended to the sidebar."; rows = 20; cols = 40; } } propgroup Text { property use text_permalink; property use text_post_comment; property use text_post_comment_friends; property use text_read_comments; property use text_nosubject; property use text_poster_anonymous; property use text_meta_mood; property use text_meta_music; property use text_day_next; property use text_day_prev; property use text_skiplinks_back; property use text_skiplinks_forward; property use text_view_archive; property use text_view_recent; property use text_view_friends; property use text_view_month; property use text_view_userinfo; set text_permalink = "#"; set text_post_comment = "reply"; set text_post_comment_friends = "reply"; set text_nosubject = "(no subject)"; set text_poster_anonymous = "(anonymous)"; property string text_error { des = "Error page header"; } set text_error = "Error"; } propgroup misc { property string custom_favicon { des = "URL of custom favicon."; example = "http://example.com/favicon.ico"; } set custom_favicon = ""; property use page_recent_items; set page_recent_items = 10; property use page_friends_items; set page_friends_items = 50; property int friendspage_expanded_limit { des = "Show how many FriendsPage entries if all are expanded?"; } set friendspage_expanded_limit = 20; } # These noui properties are just global variables. property int expanded_count { noui = 1; } set expanded_count = 0; property string lastfeed { noui = 1; } set lastfeed = ""; property bool collapsed { noui = 1; } set collapsed = false; property int itemsonpage { noui = 1; } set itemsonpage = 0; set tags_aware = true; # string replace function and rehtmlizerer # from: http://www.livejournal.com/community/lj_style/317854.html?thread=1504670#t1504670 # function replacetext(string text, string find, string replacement) : string { var string[] findarray; var int pos = 1; foreach var string findcharacter($find) { $findarray[$pos] = $findcharacter; $pos = $pos+1; } var int place = 1; var bool found = false; var string completedtext = ""; var string foundtext = ""; foreach var string searchcharacter($text) { if ($searchcharacter == $findarray[$place]) { if ($place == $find->length()) { $foundtext = $replacement; $place = 1; } else { $foundtext = $foundtext + $searchcharacter; $place = $place + 1; } } else { $completedtext = $completedtext + $foundtext + $searchcharacter; $foundtext = ""; $place = 1; } } $completedtext = $completedtext + $foundtext; return $completedtext; } function rehtml(string text) : string { return replacetext( replacetext( replacetext($text , ">", ">") , "<", "<"), "&", "&"); } # override me in themes function print_footer() { if ($*sidebar_footer != "") { print rehtml(replacetext($*sidebar_footer, "
", "")); } } function print_tags(Entry e) : string { var string tags; var string tag; if ($e.tags) { var int tcount = 0; foreach var Tag t ($e.tags) { $tcount++; $tag = """"""; $tags = $tags+$tag; if ($tcount != size $e.tags) { $tags = $tags+", "; } } } return $tags; } # function print_linklist(UserLink[] linklist) { println ""; } # Converts an associative array to an argument list, # i.e. {"page" => "somevar", "id" => "othervar"} to # "?page=somevar&id=othervar" # function array_to_args(string{} items) : string { var string args; var bool q = false; foreach var string key ($items) { if ($key != "") { if (not $q) { $args = "?"; $q = true; } else { $args = $args+"&"; } $args = $args+"$key="+$items{"$key"}; } } return $args; } # # Default stylesheet. Override this function in themes, et voila! # function lay_stylesheet() { """ body { font: 11px/16px Verdana, Arial, sans-serif; color: #000; background: #fff; margin: 0; padding: 0; } a { text-decoration: none; } a:link { color: #69f;} a:visited { color: #36c; } a:hover { color:#9cf; } a:active { color: #9cf; } img { border: 0; } h1 { font: bold 2em/1em Verdana, Times New Roman, serif; color: #fff; margin: 0 0.3em 0.3em 0.3em; border-bottom: 1px solid #fff; } h2 { font: bold 1em Georgia, Times New Roman, serif; } h2 a, h2 a:link, h2 a:hover, h2 a:active, h2 a:visited { color: #000; text-decoration: none; } #central { padding: 0; margin: 0; text-align: justify; position: absolute; left: 18em; top: 0; width: 52em; } #comment-central { margin: 0; padding: 0; } #side { position: absolute; left: 2.5em; top: 0; width: 15em; } #side ul { list-style-type: none; margin: 0; padding: 0; } #side li { margin: 0; padding: 0; } .sidebox { margin-top: 0.2em; padding: 0.5em 0.8em; background: #fff; color: #333; } .sidebox .title { color: #333; margin-bottom: 0.3em; border-bottom: 0.1em solid #999; text-align: center; text-transform: uppercase; } #sidebox-title { background: #6af; color: #fff; padding: 0.9em; text-align: center; } #sidebox-nav { background: #eee; } #sidebox-expand, #sidebox-months, #sidebox-years, #sidebox-links, #sidebox-tools { background: #ddd; } #sidebox-login { background: #fff; border: 2px dotted #ccc; } #sidebox-tags { background: #ccc; } #sidebox-types { text-align: center; background: #aaa; } #sidebox-tools { text-align: center; } .box { margin: 1em 5em 0 0; background-color: transparent; } .entry { background-color: transparent; padding: 1em; } .entry-title { font: normal 2em "Georgia", "Times New Roman", Times New Roman, serif; color: #333; border-bottom: 2px solid #ddd; } .entry-title a { text-decoration: none; color: #000; } .entry-links { width: 100%; color: #000; text-decoration: none; text-align: left; } .entry-meta { text-align: right; font-size: 0.9em; margin-top: 1em; padding: 1em; } .entry-datetime { color: #999; } .entry-header { text-align: left; font-weight: bold; background-color: transparent; color: black; padding-left: 1em; padding-bottom: 0; } /* Collapsed/small items on FriendsPage, MonthPage, TagsPage, YearPage... */ .c-item { width: 57.5em; margin: 0.5em 5em 0 2em; height: 1.6em; } .c-item a { color: #333; } .c-header { margin: 0.5em; font-size: 1em; } .c-expand { width: 1em; padding: 0.2em; } .c-title { width: 40em; padding: 0.2em; } .c-poster { width: 14em; text-align: right; padding: 0.2em; text-align: right; } .c-count { color: #aaa; text-align: right; padding: 0 0 0.5em 0.5em; font-size: 0.8em; } .c-security { text-align: center; } .poster { padding-left: 1em; padding-right: 1em; height: 2.5em; font-weight: normal; } .ljuser { text-decoration: none; font-weight: bold; white-space: nowrap; } .ljuser img { vertical-align: bottom; } .commentqr { background: #ccc; border: 1px solid #ddd; } input[type="text"], textarea { border: 1px solid #333; background: #eee; } .replyform { background: #ccc; border: 1px solid #333; padding: 5px; } textarea.textbox { width: 35em; } .metaitem { margin: 0; } .metaitemlabel { font-weight: bold; } .commentspacer { margin-left: 2.5em; } .comment { margin: 0.5em; width: 50em; background: #fff; border-bottom: 0.2em solid #ccc; } .comment-top { border-bottom: 0.2em solid #ccc; padding: 0.2em; background-color: #eee; } .comment-datetime { float: right; text-align: center; color: #666; font-weight: normal; } .comment-tools { text-align: right; } .commentnaked { text-align: center; padding: 0.3em; } .commenttalklinks { text-align: center; font-size: 1em; } .commententry { padding: 1em; } .collapsedcomments { margin-top: 0.5em; margin-bottom: 0.5em; clear: both; } .replybox { margin-left: 2.5em; border: 0.1em solid #666; } /* yp: yearpage; yw: yearweek */ .yp-month td { width: 3em; height: 3em; padding: 0.2em; font-size: 2em; } .yp-month { text-align: center; } .yw-day-blank { background: #fff; } .yw-day-full { background: #eee; } .ymd { float: right; font-size: 0.6em; margin-top: -1.5em; color: #999; } """; } function print_stylesheet() { # override CSS in themes without breaking custom_css property lay_stylesheet(); if ($*custom_css != "") { print replacetext($*custom_css, "
", ""); } } # ::lay_build_url() # returns the current url plus arguments, sort of # function Page::lay_build_url(string{} items) : string { return $.base_url + array_to_args($items); } function RecentPage::lay_build_url(string{} items) : string { if ($.nav.skip != 0) { $items{"skip"} = string($.nav.skip); } return $.base_url + array_to_args($items); } function FriendsPage::lay_build_url(string{} items) : string { var string url = $.base_url; if ($.friends_mode != "") { $url = $url + "/$.friends_mode"; } else { $url = $url + "/friends"; } if ($.filter_active) { $url = $url + "/$.filter_name"; } if ($.nav.skip != 0) { $items{"skip"} = string($.nav.skip); } return $url + array_to_args($items); } function TagsPage::lay_build_url(string{} items) : string { return $.base_url + "/tag/" + array_to_args($items); } function YearPage::lay_build_url(string{} items) : string { foreach var YearYear y ($.years) { if ($y.displayed) { return $y.url+array_to_args($items); } } return $.base_url; } function Page::lay_page_nav() { } function RecentPage::lay_page_nav() { if ($.nav.backward_url == "" and $.nav.forward_url == "") { return; } if ($.nav.backward_url != "") { var string previous = get_plural_phrase($.nav.backward_count, "text_skiplinks_back"); println """
  • $previous
  • """; } if ($.nav.forward_url != "") { var string next = get_plural_phrase($.nav.backward_count, "text_skiplinks_forward"); println """
  • $next
  • """; } } function Page::title() : string { var string title = $this.global_title; var string view = $this->view_title(); return """$title : $view"""; } function Page::lay_print_error(string message) { """

    $*text_error

    $message

    """; } function Page::lay_collapsed_entry(Entry e) { $*collapsed = true; var string name = $.args{"name"}; var string subject = ($e.subject != "" ? $e.subject : $*text_nosubject); var string count = ""; println """"""; if ($.view != "month") { println """+"""; } println """$subject"""; if (not $e.comments.enabled) { $count = "-"; } elseif ($e.comments.count > 0) { $count = string($e.comments.count); } println """$count"""; if ($.view == "friends" or $e.poster.username != $.journal.username) { """"""; if ($e.journal.username != $*lastfeed) { $this->print_entry_poster($e); } $*lastfeed = $e.journal.username; """"""; } if ($e.security != "") { println """[$e.security]"""; } println """"""; } function Entry::print_metadata() { var string caption; var string val; var Image i; if (size $.metadata == 0) { return; } foreach var string k ($.metadata) { $caption = $k; $val = $.metadata{$k}; if ($k == "music") { $caption = $*text_meta_music; } elseif ($k == "mood") { $caption = $*text_meta_mood; if (defined $.mood_icon) { $i = $.mood_icon; $val = $i->as_string("'$.metadata{$k}'")+" "+$val; } } println """
    $caption: $val
    """; } } function Page::lay_entry(Entry e) { $*collapsed = false; # $e.dom_id isn't populated (yet?) var string dom_id = ($e.dom_id != "") ? $e.dom_id : "e-$e.itemid"; var string datetime = $e.time->date_format("%%HH%%:%%min%%, %%dd%%/%%mm%%/%%yyyy%%"); var string subject = ($e.subject != "" ? $e.subject : $*text_nosubject); """

    $subject

    """; if ($this.view == "friends" or $e.poster.username != $this.journal.username) { $this->print_entry_poster($e); } if ($e.security != "") { print """[$e.security]"""; } """
    """; $e->print_text(); """
    """; if ($this.view == "recent" or $this.view == "friends") { """
    """; } } function Page::print_entry(Entry e) { $this->lay_entry($e); } function FriendsPage::print_entry(Entry e) { var Friend f = $.friends{$e.journal.username}; var bool using_tag = false; foreach var Tag t ($e.tags) { if ($this.args{"tag"} == $t.name) { $using_tag = true; } } if ($this.args{"name"} == "all") { $*expanded_count++; if ($*expanded_count > $*friendspage_expanded_limit) { return; } } if ($e.new_day) { """

    """+$e.time->date_format($*lang_fmt_date_long)+"""

    """; } if (($this.args{"name"} == "all") or ($using_tag == true) or ($this.args{"name"} == $e.journal.username) or (int($this.args{"id"}) == $e.itemid) or ($.args{"when"} == string($e.time.year)+zeropad($e.time.month, 2)+zeropad($e.time.day, 2))) { """"""; $this->lay_entry($e); """"""; } else { $this->lay_collapsed_entry($e); } } function Page::print_entry_poster(Entry e) { var string poster = $e.journal->as_string(); if (not $e.poster->equals($e.journal) and not $*collapsed) { $poster = $e.poster->as_string()+" in "+$poster; } print $poster; } ####### # SIDE BOXES # # # # # # # For paid user override in theme layers function lay_user_boxes() : void { } function Page::lay_subtitle() : string { if ($.global_subtitle != "") { return "$this.global_subtitle, "+$this->view_title(); } else { return $this->view_title(); } } function Page::lay_title_box() : void { """ """; } function Page::lay_nav_box() : void { """ """; } function Page::lay_login_box() { if (not viewer_logged_in()) { """ """; } } function Page::lay_link_box() { if (size $.linklist < 1) { return; } """ """; } function MonthPage::lay_months_box() : void { if (size $.months == 0) { return; } """ """; } function DayPage::lay_day_box() { """ """; } function RecentPage::lay_tag_box() : bool { var int{} feed_itemcount; var int{} feed_tagcount; var int num_entries = size $.entries; var bool is_tagpage = false; foreach var Entry e ($.entries) { $feed_itemcount{"$e.journal.username"} = $feed_itemcount{"$e.journal.username"} + 1; $*itemsonpage = $*itemsonpage + 1; foreach var Tag t ($e.tags) { $feed_tagcount{"$t.name"} = $feed_tagcount{"$t.name"} + 1; # If the same tag is on every entry, we're going to assume # it's the archive for that tag. Dodgy, dodgy... # Awaiting resolution of if ($feed_tagcount{"$t.name"} == $num_entries) { $is_tagpage = true; } } } if (not $is_tagpage) { return false; } """ """; return true; } function EntryPage::lay_tool_box() { var string text; """ """; } function YearPage::lay_years_box() { var string year; if (size $.years < 2) { return; } """ """; } function FriendsPage::lay_expand_boxes() { var int{} feed_itemcount; var int{} feed_tagcount; var int num_entries = size $.entries; var int expanded_items = ($*friendspage_expanded_limit <= $num_entries) ? $*friendspage_expanded_limit : $num_entries; var bool is_tagpage = false; foreach var Entry e ($.entries) { $feed_itemcount{"$e.journal.username"} = $feed_itemcount{"$e.journal.username"} + 1; $*itemsonpage = $*itemsonpage + 1; foreach var Tag t ($e.tags) { $feed_tagcount{"$t.name"} = $feed_tagcount{"$t.name"} + 1; # If the same tag is on every entry, we're going to assume # it's the archive for that tag. Dodgy, dodgy... if ($feed_tagcount{"$t.name"} == $num_entries) { $is_tagpage = true; } } } """ """; if (size $feed_tagcount > 0) { """ """; } """ """; } function Page::lay_side_boxes() { $this->lay_title_box(); $this->lay_login_box(); $this->lay_nav_box(); } function MonthPage::lay_side_boxes() { $this->lay_title_box(); $this->lay_login_box(); $this->lay_nav_box(); $this->lay_months_box(); } function DayPage::lay_side_boxes() { $this->lay_title_box(); $this->lay_login_box(); $this->lay_nav_box(); $this->lay_day_box(); } function RecentPage::lay_side_boxes() { $this->lay_title_box(); $this->lay_login_box(); $this->lay_nav_box(); if (not $this->lay_tag_box()) { $this->lay_link_box(); lay_user_boxes(); } if ($*custom_sidebar != "") { print rehtml(replacetext($*custom_sidebar, "
    ", "")); } } function FriendsPage::lay_side_boxes() { $this->lay_title_box(); $this->lay_login_box(); $this->lay_nav_box(); $this->lay_expand_boxes(); } function EntryPage::lay_side_boxes() { $this->lay_title_box(); $this->lay_nav_box(); $this->lay_tool_box(); } function YearPage::lay_side_boxes() { $this->lay_title_box(); $this->lay_nav_box(); $this->lay_years_box(); } function RecentPage::print_body() { if (size $.entries == 0) { $this->lay_print_error($*text_noentries_recent); } else { foreach var Entry e ($.entries) { $this->print_entry($e); } } } function FriendsPage::print_body() { if (size $.entries == 0) { $this->lay_print_error($*text_noentries_recent); } else { println "
    "; foreach var Entry e ($.entries) { $this->print_entry($e); } println "
    "; } } # tag list output -- using heatmap instead #function TagsPage::print_body() { # var string sort = ($.args{"sort"} == "" or $.args{"sort"} == "ascending") ? "descending" : "ascending"; # # """ # # # # # # """; # # if ($.args{"sort"} == "descending") { # $.tags = reverse $.tags; # } # # foreach var TagDetail tag ($.tags) { # """ # # # # # """; # } # # """
    tagcount
    $tag.name$tag.use_count
    """; # #} # tag heatmap output function TagsPage::print_body() { var string sort = ($.args{"sort"} == "" or $.args{"sort"} == "ascending") ? "descending" : "ascending"; var int highest = 0; var int lowest = 99999999; var int countspread; var int fontmin = 10; var int fontmax = 100; var int fontspread = $fontmax - $fontmin; var int fontstep = 0; var int fontsize; var string font; foreach var TagDetail tag ($.tags) { if ($tag.use_count > $highest) { $highest = $tag.use_count; } if ($tag.use_count < $lowest) { $lowest = $tag.use_count; } } $countspread = $highest - $lowest; if ($countspread > 0) { $fontstep = $fontspread/$countspread; } foreach var TagDetail tag ($.tags) { if ($highest == $lowest) { $font = string($fontmin) + "px"; } else { $fontsize = $fontmin + (($tag.use_count - $lowest) * $fontstep); $font = string($fontsize) + "px"; } """$tag.name """; } } function CommentInfo::print() { if ($.enabled) { if ($.count > 0 or $.screened) { $this->print_readlink(); } " ("; $this->print_postlink(); ")"; } } function DayPage::print_body() { if (not $.has_entries) { $this->lay_print_error($*text_noentries_day); } else { foreach var Entry e ($.entries) { $this->print_entry($e); } } } function Page::lay_entrylite(EntryLite e, string title) { var string datetime = $e.time->date_format("%%HH%%:%%min%%, %%dd%%/%%mm%%/%%yyyy%%"); var string subject = ($e.subject != "" ? $e.subject : $*text_nosubject); var string box_id; if ($e.dom_id != "") { $box_id = """id='$e.dom_id'"""; } """
    """; if ($title != "") { println "

    $title

    "; } """

    $subject

    """; print $e.poster->as_string(); """
    """; $e->print_text(); """
    """; } function EntryPage::print_body() { if ($.viewing_thread) { """

    Viewing a comment on ‘$this.entry.subject

    """; } else { $this->print_entry($.entry); } """
    """; if ($.entry.comments.enabled) { if ($.multiform_on) { $this->print_multiform_start(); } if ($.entry.comments.count > 0) { """
    """; var ItemRange range = $.comment_pages; if (not $range.all_subitems_displayed) { if ($range.url_last != "") { """"""; } foreach var int page (1 .. $range.total) { if ($range.current != $page) { """ [$page]"""; } else { """ [$page]"""; } } if ($range.url_next != "") { """ """; } } """
    """; } $this->print_comments($.comments); if ($.multiform_on) { """
    """; $this->print_multiform_actionline(); $this->print_multiform_end(); """
    """; } } """
    """; } function ReplyPage::print_body() { # # Is this an entry or a comment to an entry? # if ($this.replyto.depth == 0) { $this->lay_entrylite($.entry, ""); } else { var string title = """Displaying a comment on the entry “$this.entry.subject”."""; $this->lay_entrylite($.replyto, $title); } """
    """; $this.form->print(); "
    "; } function EntryPage::print_comments(Comment[] cs) { if (size $cs == 0) { return; } print """
    """; foreach var Comment c ($cs) { if ($c.full) { $this->print_comment($c); } else { $this->print_comment_partial($c); } } print """
    """; } function Comment::print_linkbar() { var Link link; foreach var string k ($.link_keyseq) { $link = $this->get_link($k); print $link; } } function EntryPage::print_comment(Comment c) { var string poster = defined $c.poster ? $c.poster->as_string() : "$*text_poster_anonymous"; if ($c.userpic) { $poster = $c.userpic->as_string() + $poster; } var string datetime = $c.time->date_format("%%HH%%:%%min%%, %%dd%%/%%mm%%/%%yyyy%%"); var string dtstr = $datetime; if ($c.metadata{"poster_ip"}) { $dtstr = $dtstr+" ("+$c.metadata{"poster_ip"}+")"; } var string subject = ($c.subject == "") ? "" : $c.subject; if (defined $c.subject_icon) { $subject = """subject icon""" + $subject; } """
    $dtstr
    $poster
    """; if (size $c.link_keyseq > 0) { println """
    """; $c->print_linkbar(); if ($.multiform_on) { $c->print_multiform_check(); } println """
    """; } println """
    """; println """

    $subject

    """; $c->print_text(); println """
    """; """
    """; if ((size $c.replies) > 0) { if ($c.replies[0].full == false) { """
    """; $this->print_comments($c.replies); """
    """; } else { $this->print_comments($c.replies); } } } function EntryPage::print_comment_partial(Comment c) { var string poster = defined $c.poster ? $c.poster->as_string() : "$*text_poster_anonymous"; var string subj = $c.subject != "" ? $c.subject : $*text_nosubject; print """
    $subj - $poster
    \n"""; $this->print_comments($c.replies); } function YearPage::lay_collapsed_month(YearMonth m) { if (not $m.has_entries) { return; } """ + """+$m->month_format("%%month%%")+""" """; } function YearPage::print_month(YearMonth m) { """

    """+$m->month_format("%%month%%")+"""

    """; foreach var int d (weekdays()) { """"""; } """"""; foreach var YearWeek w ($m.weeks) { $w->print(); } """
    $*lang_dayname_short[$d]
    """; } function YearWeek::print() { """"""; if ($.pre_empty > 0) { foreach var int i (1..$.pre_empty) { """ """; } } foreach var YearDay d ($.days) { if ($d.num_entries > 0) { """ $d.day
    $d.num_entries
    """; } else { """ $d.day   """; } } if ($.post_empty > 0) { foreach var int i (1..$.post_empty) { """ """; } } """"""; } function YearPage::print_body { """"""; foreach var YearMonth m ($.months) { if ($m.has_entries) { if ($.args{"month"} == string($m.month)) { $this->print_month($m); } else { $this->lay_collapsed_month($m); } } } """
    """; } function ReplyPage::print_body() { var EntryLite c = $.replyto; var string datetime; $datetime = $c.time->date_format("%%HH%%:%%min%%, %%dd%%/%%mm%%/%%yyyy%%"); var string poster = defined $c.poster ? $c.poster->as_string() : "$*text_poster_anonymous"; """
    $poster"""; if ($c.subject != "") { print ": "+$c.subject; } """
    $datetime
    $c.text
    """; $.form->print(); """
    """; } function MonthPage::print_body { """"""; #$.date->date_format($*lang_fmt_month_long) foreach var MonthDay d ($.days) { if ($d.has_entries) { """ """; foreach var Entry e ($d.entries) { $this->lay_collapsed_entry($e); } } } """

    """+lang_ordinal($d.day)+"""

    """; } function Page::print() { """ """+$this->title()+""" """; $this->print_head(); """ """; if ($*custom_favicon != "") { """"""; } """
    """; $this->lay_side_boxes(); print_footer(); """
    """; $this->print_body(); """
    """; }