968 lines
30 KiB
Plaintext
Executable File
968 lines
30 KiB
Plaintext
Executable File
|
|
|
|
layerinfo "type" = "layout";
|
|
layerinfo "name" = "Variable Flow";
|
|
layerinfo "author_name" = "Martin Atkins";
|
|
layerinfo "des" = "A really simple layout that you can customize like crazy!";
|
|
layerinfo "redist_uniq" = "variableflow/layout";
|
|
layerinfo "previews" = "variableflow/preview.jpg";
|
|
|
|
# Originally known as "Cleanly Shaven"
|
|
#
|
|
# This layout is full of customization options, and is designed
|
|
# with code overrides in mind.
|
|
# It also uses meaningful markup an CSS, for those who like that
|
|
# sort of thing. If you like, you can override the stylesheet
|
|
# completely in your user layer to drastically change the
|
|
# presentation.
|
|
|
|
propgroup colors {
|
|
property Color clr_margin {
|
|
des = "Page Background Color";
|
|
}
|
|
property Color clr_line {
|
|
des = "Color of line separating the entry area from the background";
|
|
requires = "opt_page_border";
|
|
}
|
|
property Color clr_back {
|
|
des = "Background Color of Main Content Area";
|
|
requires = "opt_page_background";
|
|
}
|
|
property Color clr_text {
|
|
des = "Main Text Color";
|
|
}
|
|
property Color clr_link {
|
|
des = "Color of normal links";
|
|
}
|
|
property Color clr_vlink {
|
|
des = "Color of visited links";
|
|
}
|
|
property Color clr_alink {
|
|
des = "Color of links once clicked on";
|
|
}
|
|
property Color clr_title {
|
|
des = "Journal Title Color";
|
|
}
|
|
set clr_margin = "#337CCD";
|
|
set clr_line = "#000000";
|
|
set clr_back = "#33ABCD";
|
|
set clr_text = "#000000";
|
|
set clr_link = "#261A72";
|
|
set clr_vlink = "#190F57";
|
|
set clr_alink = "#261A72";
|
|
set clr_title = "#190F57";
|
|
}
|
|
|
|
propgroup layout {
|
|
property string margin_left {
|
|
des = "Page Left Margin Size";
|
|
values = "0|None|5px|Tiny|5%|Small|10%|Medium|25%|Large|50%|Massive";
|
|
}
|
|
property string margin_right {
|
|
des = "Page Right Margin Size";
|
|
values = "0|None|5px|Tiny|5%|Small|10%|Medium|25%|Large|50%|Massive";
|
|
}
|
|
property string margin_top {
|
|
des = "Page Top Margin Size";
|
|
values = "0|None|5px|Tiny|5%|Small|10%|Medium|25%|Large|50%|Massive";
|
|
}
|
|
property string margin_bottom {
|
|
des = "Page Bottom Margin Size";
|
|
values = "0|None|5px|Tiny|5%|Small|10%|Medium|25%|Large|50%|Massive";
|
|
}
|
|
set margin_left = "25%";
|
|
set margin_right = "25%";
|
|
set margin_top = "5px";
|
|
set margin_bottom = "5px";
|
|
|
|
property string padding_left {
|
|
des = "Page Left Inner Padding Size";
|
|
values = "0|None|5px|Tiny|5%|Small|10%|Medium|25%|Large|50%|Massive";
|
|
}
|
|
property string padding_right {
|
|
des = "Page Right Inner Padding Size";
|
|
values = "0|None|5px|Tiny|5%|Small|10%|Medium|25%|Large|50%|Massive";
|
|
}
|
|
property string padding_top {
|
|
des = "Page Top Inner Padding Size";
|
|
values = "0|None|5px|Tiny|5%|Small|10%|Medium|25%|Large|50%|Massive";
|
|
}
|
|
property string padding_bottom {
|
|
des = "Page Bottom Inner Padding Size";
|
|
values = "0|None|5px|Tiny|5%|Small|10%|Medium|25%|Large|50%|Massive";
|
|
}
|
|
set padding_left = "5px";
|
|
set padding_right = "5px";
|
|
set padding_top = "5px";
|
|
set padding_bottom = "5px";
|
|
|
|
property string align_viewlinks {
|
|
des = "Position of links to other journal views";
|
|
values = "left|Left|right|Right|center|Center";
|
|
}
|
|
property string align_title {
|
|
des = "Position of journal title";
|
|
values = "left|Left|right|Right|center|Center";
|
|
}
|
|
property string align_talklinks {
|
|
des = "Position of comment links";
|
|
values = "left|Left|right|Right|center|Center";
|
|
}
|
|
set align_viewlinks = "right";
|
|
set align_title = "left";
|
|
set align_talklinks = "right";
|
|
|
|
|
|
# Some "advanced" settings which don't appear in the UI,
|
|
# either because they have non-obvious interactions with
|
|
# other properties or they have issues in certain browsers.
|
|
property string adv_page_max_width {
|
|
des = "Maximum Width of Content Area";
|
|
note = "If you set this, you should also set margin_left and/or margin_right to 'auto'. Internet Explorer 6 does not support this property.";
|
|
noui = 1;
|
|
}
|
|
property string adv_entry_max_width {
|
|
des = "Maximum Width of Entry Text";
|
|
note = "Internet Explorer 6 does not support this property, and will present entries full-width.";
|
|
noui = 1;
|
|
}
|
|
property bool adv_enable_print_styles {
|
|
des = "Enable Print Stylesheet";
|
|
note = "If you disable this, your journal views may be unsuitable for printing.";
|
|
noui = 1;
|
|
}
|
|
property bool adv_enable_projection_styles {
|
|
des = "Enable Projection Stylesheet";
|
|
note = "With this enabled, browsers which support projection stylesheets will see a different stylesheet.";
|
|
noui = 1;
|
|
}
|
|
property bool adv_horrible_userpic_markup {
|
|
des = "Enable horrible userpic markup";
|
|
note = "With this enabled, the layout will use a table hack to present userpics. With it disabled, the userpics will just be shown raw with class userpic. You'll have to add your own stylesheet rules for them.";
|
|
# See the comment within Page::print_entry for more details
|
|
noui = 1;
|
|
}
|
|
set adv_page_max_width = "";
|
|
set adv_entry_max_width = "";
|
|
set adv_enable_print_styles = true;
|
|
set adv_enable_projection_styles = true;
|
|
set adv_horrible_userpic_markup = true;
|
|
}
|
|
|
|
propgroup presentation {
|
|
property use font_base;
|
|
property use font_fallback;
|
|
|
|
property string font_size {
|
|
des = "Size of text";
|
|
values = "0.75em|Tiny|1em|Normal|1.1em|Large";
|
|
}
|
|
set font_size = "0.75em";
|
|
|
|
property bool opt_page_border {
|
|
des = "Draw Line Around Content Box";
|
|
note = "With this disabled, the line color option has no effect";
|
|
}
|
|
property bool opt_page_background {
|
|
des = "Content Box has Background";
|
|
note = "With this disabled, the Content Box Background Color and Image options have no effect and the page background will show through instead.";
|
|
}
|
|
set opt_page_border = true;
|
|
set opt_page_background = true;
|
|
|
|
property string url_background_img_page {
|
|
des = "Page Background Image URL";
|
|
note = "Leave this blank if you do not wish to use a background image.";
|
|
palimg_transform = "tint;*clr_back"; # Doesn't do anything right now
|
|
}
|
|
set url_background_img_page = "";
|
|
|
|
property string background_properties_page {
|
|
des = "Page Background Image Display Options";
|
|
values = "scroll|Scrolling, Tiled|scroll no-repeat|Scrolling, No repeat|scroll repeat-x|Scrolling, tile horizontally|scroll repeat-y|Scrolling, tile vertically|fixed|Fixed, Tiled|fixed no-repeat|Fixed, No repeat|fixed repeat-x|Fixed, tile horizontally|fixed repeat-y|Fixed, tile vertically";
|
|
requires = "url_background_img_page";
|
|
}
|
|
set background_properties_page = "scroll";
|
|
|
|
property string background_position_page {
|
|
des = "Page Background Position";
|
|
values = "center|Centered|center left|Centered Vertically, Left|center right|Centered Vertically, Right|top center|Top, Centered Horizontally|top left|Top, Left|top right|Top, Right|bottom center|Bottom, Centered Horizontally|bottom left|Bottom, Left|bottom right|Bottom, Right";
|
|
requires = "url_background_img_page";
|
|
}
|
|
set background_position_page = "top left";
|
|
|
|
property string url_background_img_box {
|
|
des = "Content Box Background Image URL";
|
|
note = "Leave this blank if you do not wish to use a background image.";
|
|
palimg_transform = "tint;*clr_back"; # Doesn't do anything right now
|
|
requires = "opt_page_background";
|
|
}
|
|
set url_background_img_box = "";
|
|
|
|
property string background_properties_box {
|
|
des = "Content Box Background Image Display Options";
|
|
values = "scroll|Scrolling, Tiled|scroll no-repeat|Scrolling, No repeat|scroll repeat-x|Scrolling, tile horizontally|scroll repeat-y|Scrolling, tile vertically|fixed|Fixed, Tiled|fixed no-repeat|Fixed, No repeat|fixed repeat-x|Fixed, tile horizontally|fixed repeat-y|Fixed, tile vertically";
|
|
requires = "opt_page_background,url_background_img_box";
|
|
}
|
|
set background_properties_box = "scroll";
|
|
|
|
property string background_position_box {
|
|
des = "Content Box Background Position";
|
|
values = "center|Centered|center left|Centered Vertically, Left|center right|Centered Vertically, Right|top center|Top, Centered Horizontally|top left|Top, Left|top right|Top, Right|bottom center|Bottom, Centered Horizontally|bottom left|Bottom, Left|bottom right|Bottom, Right";
|
|
requires = "opt_page_background,url_background_img_box";
|
|
}
|
|
set background_position_box = "top left";
|
|
|
|
property bool opt_entry_userpics {
|
|
des = "Enable Userpics On Entries";
|
|
note = "With this disabled, no entries will show userpics, even on the friends page.";
|
|
}
|
|
set opt_entry_userpics = true;
|
|
|
|
property bool opt_own_userpics {
|
|
des = "Show Own Userpics";
|
|
note = "Enable this to show userpics on your own entries. You must also have the previous option enabled. This option has no effect on community journals.";
|
|
requires = "opt_entry_userpics";
|
|
}
|
|
set opt_own_userpics = false;
|
|
|
|
# This layout has quite a big stylesheet so let's avoid
|
|
# transferring it over and over.
|
|
set external_stylesheet = true;
|
|
|
|
# No good support for EntryPage/ReplyPage yet
|
|
set view_entry_disabled = true;
|
|
}
|
|
|
|
propgroup options {
|
|
|
|
# Some standard constructional properties
|
|
property use page_recent_items;
|
|
property use page_friends_items;
|
|
property use page_year_sortorder;
|
|
property use page_day_sortorder;
|
|
|
|
# Tell the system this layout has no linklist support
|
|
# If you add linklist support in a user layer, you should also
|
|
# set this property to true in your layer.
|
|
set linklist_support = false;
|
|
}
|
|
|
|
propgroup text {
|
|
property use text_post_comment;
|
|
property use text_read_comments;
|
|
property use text_post_comment_friends;
|
|
property use text_read_comments_friends;
|
|
}
|
|
|
|
function makefontspec() : string
|
|
"Forms a CSS 'font-family' value based on the font-related properties."
|
|
{
|
|
var string fontspec;
|
|
if ($*font_base != "") {
|
|
$fontspec="\""+$*font_base+"\"";
|
|
if ($*font_fallback != "") {
|
|
$fontspec=$fontspec+",";
|
|
}
|
|
}
|
|
$fontspec=$fontspec+$*font_fallback;
|
|
return $fontspec;
|
|
}
|
|
|
|
function Page::lay_print_viewlinks()
|
|
"If you override this, be sure to still use foreach or your style won't support any future views."
|
|
{
|
|
# Output a list of textual links in a particular order
|
|
var bool first = true;
|
|
|
|
"<ul class=\"navbar\">\n";
|
|
foreach var string vl ($.views_order) {
|
|
if ($vl == $.view) {
|
|
print "<li class=\"active\">"+lang_viewname($vl)+"</li>\n";
|
|
} else {
|
|
print "<li><a href=\""+ehtml($.view_url{$vl})+"\">"+lang_viewname($vl)+"</a></li>\n";
|
|
}
|
|
$first = false;
|
|
}
|
|
"</ul>\n";
|
|
}
|
|
|
|
function Page::lay_print_heading()
|
|
"This can be overridden to change the main page titles to something else."
|
|
{
|
|
"""<h1>"""+$.global_title+"""</h1>
|
|
<div id="viewtitle">""";
|
|
|
|
if ($.view == "recent" and $.global_subtitle != "") {
|
|
print $.global_subtitle;
|
|
} else {
|
|
print $this->view_title();
|
|
}
|
|
|
|
println """</div>""";
|
|
|
|
}
|
|
|
|
function Page::print() {
|
|
"""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>"""+$this->title()+"""</title>
|
|
""";
|
|
if ($*external_stylesheet) {
|
|
println """<link rel="stylesheet" href="$.stylesheet_url" type="text/css" />""";
|
|
}
|
|
else {
|
|
println """<style type="text/css">""";
|
|
print_stylesheet();
|
|
println """</style>""";
|
|
}
|
|
$this->print_head();
|
|
"""
|
|
</head>
|
|
|
|
<body class="$.view">
|
|
<div id="page">
|
|
"""; $this->lay_print_viewlinks(); """
|
|
|
|
<div id="title">
|
|
"""; $this->lay_print_heading(); """
|
|
</div>
|
|
|
|
"""; $this->print_body(); """
|
|
|
|
<div id="serversig" style="margin-top: 3em; text-align: center;">"""; server_sig(); """</div>
|
|
|
|
</div>
|
|
</body>
|
|
</html>""";
|
|
|
|
}
|
|
|
|
function lang_skipped_back(RecentNav nav) : string
|
|
"Return short text saying how many entries have been skipped back. i18n layers should override this."
|
|
{
|
|
return "Skipped Back $nav.skip";
|
|
}
|
|
|
|
## The properties for these links are currently broken
|
|
## in core - they were never updated to work with lang_map_plural.
|
|
# So, FIXME: When core does them right, remove the hardcoded English
|
|
function RecentPage::lay_print_skiplinks() {
|
|
if ($.nav.backward_url != "" or $.nav.forward_url != "") {
|
|
println """<ul class="viewspecnavbar">""";
|
|
if ($.nav.backward_url) {
|
|
println """<li><a href="$.nav.backward_url">Previous $.nav.backward_count</a></li>""";
|
|
}
|
|
if ($.nav.skip > 0) {
|
|
println "<li>"+lang_skipped_back($.nav)+"</li>";
|
|
}
|
|
if ($.nav.forward_url) {
|
|
println """<li><a href="$.nav.forward_url">Next $.nav.forward_count</a></li>""";
|
|
}
|
|
println "</ul>";
|
|
}
|
|
}
|
|
|
|
function RecentPage::print_body() {
|
|
|
|
$this->lay_print_skiplinks();
|
|
|
|
foreach var Entry e ($.entries) {
|
|
if ($e.new_day) {
|
|
"""<div class="day" id="day"""+$e.time->date_format("%%yyyy%%%%mm%%%%dd%%")+"\">\n";
|
|
}
|
|
# Print the entry
|
|
$this->print_entry($e);
|
|
if ($e.end_day) {
|
|
"</div>";
|
|
}
|
|
}
|
|
|
|
if (size $.entries > 0) {
|
|
$this->lay_print_skiplinks();
|
|
}
|
|
|
|
}
|
|
|
|
function DayPage::print_body() {
|
|
|
|
"""<ul class="viewspecnavbar">\n""";
|
|
"<li><a href=\"$.prev_url\">$*text_day_prev</a></li>\n";
|
|
"<li><a href=\"$.next_url\">$*text_day_next</a></li>\n</ul>";
|
|
|
|
|
|
if ($.has_entries) {
|
|
"<div class=\"day\" id=\"dayyymmmmmdddd\">\n";
|
|
|
|
foreach var Entry e ($.entries) {
|
|
$this->print_entry($e);
|
|
}
|
|
|
|
"</div>";
|
|
|
|
"<div class=\"skiplinks\">\n";
|
|
"<a href=\"$.prev_url\">$*text_day_prev</a> - ";
|
|
"<a href=\"$.next_url\">$*text_day_next</a>\n</div>";
|
|
|
|
|
|
} else {
|
|
"<p>$*text_noentries_day</p>";
|
|
}
|
|
|
|
}
|
|
|
|
|
|
## YearPage Stuff
|
|
function YearPage::print_body {
|
|
$this->print_year_links();
|
|
println """<div id="calendarmonthcontainer">""";
|
|
foreach var YearMonth m ($.months) {
|
|
$this->print_month($m);
|
|
}
|
|
println "</div>";
|
|
}
|
|
function YearPage::print_year_links() {
|
|
"""<ul class="viewspecnavbar">\n""";
|
|
foreach var YearYear y ($.years) {
|
|
if ($y.displayed) {
|
|
"""<li class="active">$y.year</li>\n""";
|
|
} else {
|
|
"""<li><a href="$y.url">$y.year</a></li>\n""";
|
|
}
|
|
}
|
|
"""</ul>\n""";
|
|
}
|
|
function YearPage::print_month(YearMonth m) {
|
|
if (not $m.has_entries) { return; }
|
|
"""<table class="calendarmonth">\n
|
|
<tr><th colspan="7" style="text-align: center;">""";
|
|
print "<h2>"+$m->month_format()+"</h2>\n";
|
|
"""</th></tr>\n""";
|
|
foreach var int d (weekdays()) {
|
|
"<th>"+$*lang_dayname_short[$d]+"</th>\n";
|
|
}
|
|
"</tr>\n";
|
|
foreach var YearWeek w ($m.weeks) {
|
|
$w->print();
|
|
}
|
|
"""<tr><td colspan="7" style="text-align: center;" class="calendarmonthlink">
|
|
<a href="$m.url">$*text_view_month</a></td></tr>\n""";
|
|
"</table>";
|
|
}
|
|
function YearWeek::print() {
|
|
"""<tr valign="top" style="height: 3em;">\n""";
|
|
if ($.pre_empty > 0) {
|
|
"""<td class="emptyday" colspan="$.pre_empty"> </td>\n""";
|
|
}
|
|
foreach var YearDay d ($.days) {
|
|
"""<td class="calendarday">\n""";
|
|
"""<div style="text-align: right;">$d.day</div>\n""";
|
|
if ($d.num_entries > 0) {
|
|
"""<div style="text-align: center;"><a href="$d.url">$d.num_entries</a></div>\n""";
|
|
}
|
|
"""</td>\n""";
|
|
}
|
|
if ($.post_empty > 0) {
|
|
"""<td colspan="$.post_empty"> </td>\n""";
|
|
}
|
|
"</tr>";
|
|
}
|
|
|
|
|
|
function metadata_title(string which) : string
|
|
"Until core provides a function for this, i18n layers should override this."
|
|
{
|
|
if ($which == "music") {
|
|
return "Current Music";
|
|
}
|
|
elseif ($which == "mood") {
|
|
return "Current Mood";
|
|
}
|
|
else {
|
|
return $which;
|
|
}
|
|
}
|
|
|
|
# Since there's currently no trusted print_entry_text function
|
|
# in core, I have to do this here. Later, when something similar
|
|
# is added to core, this can become a wrapper and be deprecated.
|
|
function Page::lay_print_entry_text(Entry e) [fixed]
|
|
"Don't override this. All it does is print the entry text."
|
|
{
|
|
print $e.text;
|
|
}
|
|
|
|
# Since the metadata keys have to be hardcoded (bad core design)
|
|
# let's separate this out so people can override print_entry
|
|
# and still get any new metadata added later.
|
|
function Page::lay_print_entry_metadata(Entry e)
|
|
"Overriding this is strongly discouraged, since if any new entry metadata is added in the future your overridden version will not support it."
|
|
{
|
|
if (size $e.metadata > 0) {
|
|
# This is horrible and unextensible. We have core to thank.
|
|
# C'est la vie.
|
|
"<div class=\"metadata\">\n";
|
|
if ($e.metadata{"music"} != "") {
|
|
"""<div class="currentmusic"><span class="metacaption">"""+metadata_title("music") + ":</span> " +
|
|
$e.metadata{"music"}+"</div>\n";
|
|
}
|
|
if ($e.metadata{"mood"} != "") {
|
|
"""<div class="currentmood"><span class="metacaption">"""+metadata_title("mood") + ":</span> ";
|
|
if (defined $e.mood_icon) {
|
|
print $e.mood_icon->as_string()+" ";
|
|
}
|
|
print $e.metadata{"mood"}+"</div>\n";
|
|
}
|
|
"</div>\n";
|
|
}
|
|
}
|
|
|
|
function Page::print_entry(Entry e) {
|
|
"""<div class="entry" id="entry$e.itemid">\n""";
|
|
|
|
var bool altposter = $e.poster.username != $e.journal.username;
|
|
var bool showpic = $*opt_entry_userpics and (($.view == "friends" or $altposter) or $*opt_own_userpics);
|
|
|
|
# By default, this layout uses an ugly table hack to present the userpic
|
|
# alongside the entry. This is because I've been bitten on many previous
|
|
# occasions by a bug with floats in IE causing text to vanish in certain
|
|
# cases. You can set the property adv_horrible_userpic_markup to false
|
|
# in a user layer to disable this behavior, but there are no CSS rules
|
|
# in the stock stylesheet to handle it, so you'll have to supply your
|
|
# own.
|
|
|
|
if ($showpic) {
|
|
if ($*adv_horrible_userpic_markup) {
|
|
"""<table cellpadding="0" border="0" cellspacing="0" style="margin: 0;" class="uglykludgeuserpic">
|
|
<tr valign="top">
|
|
<td style="text-align: center;" width="105">""";
|
|
}
|
|
if (defined $e.userpic) {
|
|
println """<img src="$e.userpic.url" width="$e.userpic.width" width="$e.userpic.height" alt="" class="userpic" />""";
|
|
} else {
|
|
if ($*adv_horrible_userpic_markup) {
|
|
print " ";
|
|
}
|
|
}
|
|
if ($*adv_horrible_userpic_markup) {
|
|
"</td><td>";
|
|
}
|
|
}
|
|
"""<h2 class="entryheading">""";
|
|
if ($.view != "day") {
|
|
print $e.time->date_format()+" ";
|
|
}
|
|
print $e.time->time_format();
|
|
if ($.view == "friends") {
|
|
" - "; $this->print_entry_poster($e);
|
|
}
|
|
elseif ($altposter) {
|
|
" - " + $e.poster->as_string();
|
|
}
|
|
if ($e.security != "") {
|
|
" - " + $e.security_icon->as_string();
|
|
}
|
|
if ($e.subject != "") {
|
|
" - $e.subject";
|
|
}
|
|
"</h2>\n"; $this->lay_print_entry_text($e);
|
|
|
|
$this->lay_print_entry_metadata($e);
|
|
|
|
if ($showpic and $*adv_horrible_userpic_markup) {
|
|
"</td></tr></table>";
|
|
}
|
|
$e.comments->print();
|
|
"</div>";
|
|
}
|
|
|
|
function CommentInfo::print {
|
|
if (not $.enabled) { return; }
|
|
"""<ul class="entryextra">""";
|
|
if ($.count > 0) {
|
|
print """<li class="entryreadlink">""";
|
|
$this->print_readlink();
|
|
println "</li>";
|
|
}
|
|
print """<li class="entrypostlink">""";
|
|
$this->print_postlink();
|
|
print "</li>";
|
|
"</ul>";
|
|
}
|
|
|
|
function EntryPage::print_comment (Comment c) {
|
|
var Color barlight = $*color_comment_bar->clone();
|
|
$barlight->lightness(($barlight->lightness() + 255) / 2);
|
|
var string poster = defined $c.poster ? $c.poster->as_string() : "<i>(Anonymous)</i>";
|
|
|
|
"<div style='margin-top: 10px; padding: 2px'>";
|
|
"<table summary='0' style='width: 100%;'><tr valign='top'>";
|
|
if (defined $c.userpic and $*comment_userpic_style != "off") {
|
|
var int w = $c.userpic.width;
|
|
var int h = $c.userpic.height;
|
|
# WARNING: this will later be done by the system (it'll be a
|
|
# constructional property), so don't copy this hack into your
|
|
# layout layers or you'll be messed up later.
|
|
$w = $w / 2;
|
|
$h = $h / 2;
|
|
print "<td><img src='$c.userpic.url' width='$w' height='$h' alt='' /></td>";
|
|
}
|
|
"<td align='left'>";
|
|
if (defined $c.subject_icon or $c.subject != "") { "<h3>$c.subject_icon $c.subject</h3>\n"; }
|
|
print "<strong>$*text_comment_from</strong> $poster<br />\n";
|
|
print "<strong>$*text_comment_date</strong> ";
|
|
print $c.time->date_format("long") + " - " + $c.time->time_format();
|
|
if ($c.metadata{"poster_ip"}) { print " ($*text_comment_ipaddr " + $c.metadata{"poster_ip"} + ")"; }
|
|
print " <strong>(<a href='$c.permalink_url'>$*text_permalink</a>)</strong>\n";
|
|
|
|
var Link link;
|
|
foreach var string s (["delete_comment", "screen_comment", "unscreen_comment"]) {
|
|
|
|
}
|
|
$link = $c->get_link("delete_comment"); " $link";
|
|
$link = $c->get_link("screen_comment"); " $link";
|
|
$link = $c->get_link("unscreen_comment"); " $link";
|
|
|
|
if ($this.multiform_on) {
|
|
" <label for='ljcomsel_$c.talkid'>$*text_multiform_check</label> ";
|
|
$c->print_multiform_check();
|
|
}
|
|
|
|
print "</td></tr></table></div>";
|
|
print "<div style='margin-left: 5px'>$c.text</div>\n";
|
|
print "<div style='margin-top: 3px; font-size: smaller'>(<a href='$c.reply_url'>$*text_comment_reply</a>) ";
|
|
if ($c.parent_url != "") { "(<a href='$c.parent_url'>$*text_comment_parent</a>) "; }
|
|
if ($c.thread_url != "") { "(<a href='$c.thread_url'>$*text_comment_thread</a>) "; }
|
|
"</div>\n";
|
|
}
|
|
|
|
function css_rule_if_set(string prop, string val)
|
|
"Print a CSS rule only if val is not an empty string."
|
|
{
|
|
if ($val != "") {
|
|
println " $prop: $val;";
|
|
}
|
|
}
|
|
|
|
function custom_stylesheet()
|
|
"Override this in your user layer to add new stuff to the stylesheet"
|
|
{
|
|
# None, by default
|
|
}
|
|
|
|
function print_stylesheet_for_printing()
|
|
"If you have printing styles enabled, you can override this function to change how the page is styled for printing."
|
|
{
|
|
|
|
""" body, #page, a, a:link, a:visited, a:active, a:hover, #title, h2 {
|
|
background: #ffffff;
|
|
color: #000000;
|
|
}
|
|
body {
|
|
margin-top: 1em;
|
|
margin-bottom: 1em;
|
|
font-size: 12pt;
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
font-family: "Garamond", "Palatino", "Palatino Linotype", serif;
|
|
max-width: 15cm;
|
|
}
|
|
h1, h2, h3, h4, h5, h6, #title #viewtitle {
|
|
font-family: "Frutiger", "Frutiger Linotype", "Helvetica", sans-serif;
|
|
page-break-after: avoid;
|
|
}
|
|
.entry {
|
|
page-break-inside: avoid;
|
|
text-align: justify;
|
|
}
|
|
.calendarmonth {
|
|
page-break-inside: avoid;
|
|
}
|
|
#page {
|
|
border: 0;
|
|
margin: 0;
|
|
}
|
|
.navbar, .entryextra, .viewspecnavbar {
|
|
display: none;
|
|
}
|
|
#title {
|
|
display: block;
|
|
}
|
|
#title h1, #title #viewtitle {
|
|
display: inline;
|
|
}
|
|
#title #viewtitle {
|
|
margin-left: 2em;
|
|
font-style: italic;
|
|
}
|
|
""";
|
|
}
|
|
|
|
function print_stylesheet_for_projection()
|
|
"If you have projection styles enabled, you can override this function to change how the page is styled for projection."
|
|
{
|
|
|
|
|
|
var string background_body = $*clr_margin;
|
|
if ($*url_background_img_page != "" and not $*url_background_img_page->contains(")")) {
|
|
$background_body = $background_body + " url($*url_background_img_page)";
|
|
if (not $*background_properties_page->contains(";")) {
|
|
$background_body = $background_body + " $*background_properties_page";
|
|
}
|
|
}
|
|
else {
|
|
$background_body = $background_body + " none";
|
|
}
|
|
|
|
var string background_page = $*clr_back;
|
|
if ($*url_background_img_box != "" and not $*url_background_img_box->contains(")")) {
|
|
$background_page = $background_page + " url($*url_background_img_box)";
|
|
if (not $*background_properties_box->contains(";")) {
|
|
$background_page = $background_page + " $*background_properties_box";
|
|
}
|
|
}
|
|
else {
|
|
$background_page = $background_page + " none";
|
|
}
|
|
|
|
""" #page {
|
|
margin: 10px;
|
|
padding: 0;
|
|
border: 0;
|
|
font-size: 2em;
|
|
}
|
|
body {
|
|
background: $background_body;
|
|
color: $*clr_text;
|
|
}
|
|
.navbar, .viewspecnavbar { display: none; }
|
|
.entry, #title {
|
|
page-break-after: always;
|
|
margin: auto;
|
|
padding: 10px;
|
|
position: absolute;
|
|
top: 10px;
|
|
bottom: 10px;
|
|
left: 10px;
|
|
right: 10px;
|
|
""";
|
|
if ($*opt_page_border) {
|
|
println """ border: 1px solid $*clr_line;""";
|
|
}
|
|
if ($*opt_page_background) {
|
|
println """ background: $background_page;""";
|
|
}
|
|
" }\n";
|
|
}
|
|
|
|
function print_stylesheet() {
|
|
var string fontspec=makefontspec();
|
|
if ($fontspec != "") {
|
|
$fontspec=" font-family: $fontspec;";
|
|
}
|
|
|
|
var string eextrastyle="";
|
|
if ($*align_talklinks != "right") {
|
|
$eextrastyle=$eextrastyle+
|
|
""".entryextra:after { content: " :."; }\n""";
|
|
}
|
|
if ($*align_talklinks != "left") {
|
|
$eextrastyle=$eextrastyle+
|
|
""".entryextra:before { content: ".: "; }\n""";
|
|
}
|
|
$eextrastyle=$eextrastyle+
|
|
""".entryextra { text-align: $*align_talklinks; font-size: 0.9em; }""";
|
|
|
|
# This tries to do a bit of "sanity" checking to ensure users
|
|
# don't inadvertently break the CSS, but it's not brilliant.
|
|
var string background_body = $*clr_margin;
|
|
if ($*url_background_img_page != "" and not $*url_background_img_page->contains(")")) {
|
|
$background_body = $background_body + " url($*url_background_img_page)";
|
|
if (not $*background_properties_page->contains(";")) {
|
|
$background_body = $background_body + " $*background_properties_page";
|
|
}
|
|
if (not $*background_position_page->contains(";")) {
|
|
$background_body = $background_body + " $*background_position_page";
|
|
}
|
|
}
|
|
else {
|
|
$background_body = $background_body + " none";
|
|
}
|
|
|
|
var string background_page = $*clr_back;
|
|
if ($*url_background_img_box != "" and not $*url_background_img_box->contains(")")) {
|
|
$background_page = $background_page + " url($*url_background_img_box)";
|
|
if (not $*background_properties_box->contains(";")) {
|
|
$background_page = $background_page + " $*background_properties_box";
|
|
}
|
|
if (not $*background_position_box->contains(";")) {
|
|
$background_page = $background_page + " $*background_position_box";
|
|
}
|
|
}
|
|
else {
|
|
$background_page = $background_page + " none";
|
|
}
|
|
|
|
|
|
"""
|
|
body {
|
|
margin: 0;
|
|
padding: 0;
|
|
border: 0;
|
|
background: $background_body;
|
|
color: $*clr_text;
|
|
$fontspec font-size: $*font_size;
|
|
}
|
|
table, tr, td, th {
|
|
font-size: 1em;
|
|
}
|
|
#page {
|
|
""";
|
|
css_rule_if_set("margin-left", $*margin_left);
|
|
css_rule_if_set("margin-right", $*margin_right);
|
|
css_rule_if_set("margin-top", $*margin_top);
|
|
css_rule_if_set("margin-bottom", $*margin_bottom);
|
|
css_rule_if_set("padding-left", $*padding_left);
|
|
css_rule_if_set("padding-right", $*padding_right);
|
|
css_rule_if_set("padding-top", $*padding_top);
|
|
css_rule_if_set("padding-bottom", $*padding_bottom);
|
|
css_rule_if_set("max-width", $*adv_page_max_width);
|
|
|
|
if ($*opt_page_border) {
|
|
println """ border: 1px solid $*clr_line;""";
|
|
}
|
|
if ($*opt_page_background) {
|
|
println """ background: $background_page;""";
|
|
}
|
|
"""
|
|
}
|
|
#title h1 {
|
|
font-size: 1.4em;
|
|
font-weight: bold;
|
|
text-align: $*align_title;
|
|
margin: 0;
|
|
}
|
|
#title #viewtitle {
|
|
font-size: 1.1em;
|
|
font-weight: bold;
|
|
text-align: $*align_title;
|
|
margin: 0;
|
|
}
|
|
.navbar {
|
|
text-align: $*align_viewlinks;
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
display: block;
|
|
}
|
|
.viewspecnavbar {
|
|
text-align: center;
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
display: block;
|
|
margin-top: 1em;
|
|
margin-bottom: 1em;
|
|
}
|
|
.navbar li { display: inline; white-space: nowrap; }
|
|
.navbar li.active { display: inline; }
|
|
.navbar li:before { content: " :: "; }
|
|
.navbar li:first-child:before { content: ""; }
|
|
.viewspecnavbar li { display: inline; white-space: nowrap; }
|
|
.viewspecnavbar li.active { display: inline; }
|
|
.viewspecnavbar li:before { content: " :: "; }
|
|
.viewspecnavbar li:first-child:before { content: ""; }
|
|
|
|
#title {
|
|
margin-top: 3em;
|
|
margin-bottom: 0.5em;
|
|
color: $*clr_title;
|
|
background: transparent;
|
|
}
|
|
a:link { color: $*clr_link; background: transparent; }
|
|
a:visited { color: $*clr_vlink; background: transparent; }
|
|
a:active, a:hover { color: $*clr_alink; background: transparent; }
|
|
.entry {
|
|
margin-bottom: 4em;
|
|
}
|
|
.entryheading {
|
|
font-weight: bold; font-size: 1.0em;
|
|
}
|
|
.entrytext {
|
|
"""; css_rule_if_set("max-width", $*adv_entry_max_width);
|
|
""" margin-left: auto;
|
|
margin-right: auto;
|
|
}
|
|
|
|
.entry .metadata {
|
|
margin-top: 0.5em;
|
|
margin-bottom: 0;
|
|
margin-left: 0;
|
|
margin-right: 0;
|
|
}
|
|
|
|
.entryextra {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin-left: 0;
|
|
margin-right: 0;
|
|
display: block;
|
|
}
|
|
.entryextra li {
|
|
display: inline;
|
|
}
|
|
.entryextra li.entryreadlink:after {
|
|
content: " :: ";
|
|
}
|
|
.entryextra li.entryreadlink {
|
|
font-weight: bold;
|
|
}
|
|
$eextrastyle
|
|
|
|
/* IE hack - center the block with text-align! */
|
|
.calendarmonthcontainer {
|
|
text-align: center;
|
|
}
|
|
|
|
.calendarmonth {
|
|
margin-top: 2em;
|
|
margin-bottom: 2em;
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
text-align: left;
|
|
}
|
|
.calendarmonth h2 {
|
|
font-size: 1em;
|
|
font-weight: bold;
|
|
margin: 0;
|
|
}
|
|
.calendarday {
|
|
width: 3em;
|
|
max-width: 3em;
|
|
height: 3em;
|
|
}
|
|
|
|
""";
|
|
|
|
if ($*adv_enable_print_styles) {
|
|
"""
|
|
@media print {
|
|
"""; print_stylesheet_for_printing(); """
|
|
}
|
|
""";
|
|
}
|
|
|
|
if ($*adv_enable_projection_styles) {
|
|
"""
|
|
@media projection {
|
|
"""; print_stylesheet_for_projection(); """
|
|
}
|
|
""";
|
|
}
|
|
|
|
custom_stylesheet();
|
|
|
|
}
|
|
|