ljr/livejournal/bin/upgrading/s2layers/sturdygesture/layout.s2

851 lines
24 KiB
Plaintext
Raw Normal View History

2019-02-05 21:49:12 +00:00
# -*-s2-*-
layerinfo type = "layout";
layerinfo name = "A Sturdy Gesture";
layerinfo lang = "en";
layerinfo author = "Martin Atkins";
layerinfo author_email = "mart@livejournal.com";
layerinfo redist_uniq = "sturdygesture/layout";
layerinfo previews = "sturdygesture/sturdygesture.jpg";
propgroup colors {
property Color clr_page_back { des = "Page background"; }
set clr_page_back = "#ffffff";
property Color clr_page_text { des = "Box border color"; }
set clr_page_text = "#000000";
property Color clr_box_text { des = "Box content color"; }
set clr_boxhead_text = "#ffffff";
property Color clr_box_back { des = "Box background color"; }
set clr_boxhead_back = "#000000";
property Color clr_boxhead_text { des = "Box heading text color"; }
set clr_boxhead_text = "#ffffff";
property Color clr_boxhead_back { des = "Box heading background color"; }
set clr_boxhead_back = "#000000";
property Color clr_page_link { des = "Link color"; }
set clr_page_link = "#0000ff";
property Color clr_page_vlink { des = "Visited link color"; }
set clr_page_vlink = "#0000ff";
}
propgroup fonts {
property use font_base;
property use font_fallback;
}
propgroup presentation {
property string opt_navbar_pos {
des = "Navigation Bar Location";
values = "left|Left|right|Right";
}
set opt_navbar_pos = "left";
property bool opt_friends_colors {
des = "Use friend colors on friends page";
note = "If this option is on, the titles of friends' entries will use the colors you have selected for each friend.";
}
set opt_friends_colors = true;
property bool opt_always_userpic {
des = "Always show userpics";
note = "With this off, userpics are only shown in the friends view.";
}
set opt_always_userpic = false;
## These have no UI, but S2 generates an empty settings page if they aren't in a group
property string text_page_prev {
des = "Text used to link to the previous page";
noui = 1;
}
property string text_page_next {
des = "Text used to link to the next page";
noui = 1;
}
set text_page_prev = "Previous Page";
set text_page_next = "Next Page";
property string{} text_entry_links {
des = "Captions for Entry Action links";
noui = 1;
}
set text_entry_links = {"edit_entry" => "Edit Entry",
"edit_tags" => "Edit Tags",
"mem_add" => "Add As Memory",
"tell_friend" => "Tell a Friend",
"nav_prev" => "Previous Entry",
"nav_next" => "Next Entry"};
property string{} text_comment_links {
des = "Captions for Comment Action links";
noui = 1;
}
set text_comment_links = {"delete_comment" => "Delete",
"screen_comment" => "Screen",
"unscreen_comment" => "Unscreen",
"freeze_thread" => "Freeze",
"unfreeze_thread" => "Unfreeze", };
property use use_shared_pic;
property use linklist_support;
property use external_stylesheet;
}
set tags_aware = true;
function navheading(RecentNav nav, int entries) : string
"i18n layers should override this to translate the skiplink box heading." {
return ($nav.skip == 0 ? $entries+" most recent" : "skipped back "+$nav.skip);
}
function navlinktext(RecentNav nav, bool next) : string
"i18n layers should override this to translate the skiplinks. If \$next is false, output 'Previous X', else 'Next X'." {
return ($next ? "Next "+$nav.forward_count : "Previous "+$nav.backward_count);
}
function print_stylesheet() {
"""
body {
background: $*clr_page_back;
color: $*clr_page_text;
""";
# Ugliness
if ($*font_base != "" or $*font_fallback != "none") {
"font-family: ";
if ($*font_base != "") {
"\"$*font_base\"";
if ($*font_fallback != "none") {
", ";
}
}
if ($*font_fallback != "none") {
print $*font_fallback;
}
";";
}
"""
}
a {
color: $*clr_page_link;
}
a:visited {
color: $*clr_page_vlink;
}
img {
border: 0;
}
.box {
border: 1px solid $*clr_page_text;
margin: 1em;
background: $*clr_box_back;
color: $*clr_box_text;
}
#navbar {
width: 25%;
}
#body {
width: 75%;
}
#navbar .box h1, .box h2, .box h3 {
font-size: 1em;
background: $*clr_boxhead_back;
color: $*clr_boxhead_text;
padding: 3px;
margin: 0;
}
#navbar .box h1 {
text-align: center;
}
.box h1 a, .box h2 a, .box h3 a {
color: $*clr_boxhead_text;
background: $*clr_boxhead_back;
}
#navbar .box div.userpic {
margin: 1em;
text-align: center;
}
#navbar p {
margin-left: 1em;
margin-right: 1em;
margin-bottom: 0;
}
#navbar ul, #skipbar ul {
list-style: none;
padding: 0;
margin: 0.5em;
}
#navbar ul li.active, #skipbar ul li.active {
font-weight: bold;
}
.box .entry {
margin: 1em;
}
.box .talklinks {
margin: 1em;
text-align: right;
clear: both;
}
.box .talklinks .permalink {
float: left;
}
.box .minicomment {
clear: both;
}
body.day #body h1 {
font-size: 1.1em;
font-weight: bold;
}
table.box, table.box td, table.box th {
border: 1px solid #000000;
}
.metadata {
margin-top: 1em;
}
form#postform table {
background: $*clr_box_back;
color: $*clr_box_text;
}
""";
}
function Page::lay_page_nav() {
}
function RecentPage::lay_page_nav() {
if ($.nav.backward_url == "" and $.nav.forward_url == "") {
return;
}
println "<div class=\"box\">";
println "<h2>"+navheading($.nav,size $.entries)+"</h2>\n<ul>";
if ($.nav.backward_url != "") {
println "<li><a href=\""+$.nav.backward_url+"\">"+
navlinktext($.nav,false)+"</a></li>";
}
if ($.nav.forward_url != "") {
println "<li><a href=\""+$.nav.forward_url+"\">"+
navlinktext($.nav,true)+"</a></li>";
}
println "</ul>\n";
println "</div>\n";
}
function DayPage::lay_page_nav() {
println "<div class=\"box\"><ul>";
println "<li><a href=\"$.prev_url\">"+$.prev_date->date_format("med")+"</a></li>";
println "<li><a href=\"$.next_url\">"+$.next_date->date_format("med")+"</a></li>";
println "</ul></div>";
}
function YearPage::lay_page_nav() {
println "<div class=\"box\"><ul>";
foreach var YearYear y ($.years) {
if ($y.displayed) {
println "<li class=\"active\">$y.year</li>";
} else {
println "<li><a href=\"$y.url\">$y.year</a></li>";
}
}
println "</ul></div>";
}
function MonthPage::lay_page_nav() {
println "<div class=\"box\"><ul>";
if ($.prev_url != "") {
"""<li><a href="$.prev_url">"""+$.prev_date->date_format($*lang_fmt_month_long)+"""</a></li>""";
}
if ($.next_url != "") {
"""<li><a href="$.next_url">"""+$.next_date->date_format($*lang_fmt_month_long)+"""</a></li>""";
}
"</ul>";
"<form method='post' action='$.redir.url'><center>";
$.redir->print_hiddens();
if (size $.months > 1) {
"<select name='redir_key'>\n";
foreach var MonthEntryInfo mei ($.months) {
var string sel;
if ($mei.date.year == $.date.year and $mei.date.month == $.date.month) {
$sel = " selected='selected'";
}
"<option value='$mei.redir_key'$sel>" + $mei.date->date_format($*lang_fmt_month_long) + "</option>";
}
"</select>\n<input type='submit' value='View' />";
}
"</center></form>\n</div>\n";
}
function EntryPage::lay_page_nav() {
println "<div class=\"box\">";
if (size $.comments > 0 and not $.comment_pages.all_subitems_displayed) {
"<h2>"+lang_page_of_pages($.comment_pages.current, $.comment_pages.total)+"</h2>\n";
}
print "<ul>\n";
if ($.entry.comments.enabled) {
"<li>"; $.entry.comments->print_postlink(); "</li>\n";
}
if ($.comment_pages.url_prev != "") {
"""<li><a href="$.comment_pages.url_prev">$*text_page_prev</a></li>\n""";
}
if ($.comment_pages.url_next != "") {
"""<li><a href="$.comment_pages.url_next">$*text_page_next</a></li>\n""";
}
println "<li>&nbsp;</li>";
var Link l = new Link;
$l = $.entry->get_link("nav_next");
println """<li><a href="$l.url">$*text_entry_links{"nav_next"}</a></li>""";
foreach var string ls ($.entry.link_keyseq) {
$l = $.entry->get_link($ls);
if (defined $l) {
println """<li><a href="$l.url">$*text_entry_links{$ls}</a></li>""";
}
}
$l = $.entry->get_link("nav_prev");
println """<li><a href="$l.url">$*text_entry_links{"nav_prev"}</a></li>""";
println "</ul></div>";
}
function Page::lay_show_firstnav() : bool {
return false;
}
function RecentPage::lay_show_firstnav() : bool {
return ((size $.entries) > 5);
}
function DayPage::lay_show_firstnav() : bool {
return ((size $.entries) > 5);
}
function YearPage::lay_show_firstnav() : bool {
return true;
}
function MonthPage::lay_show_firstnav() : bool {
return true;
}
function EntryPage::lay_show_firstnav() : bool {
return ((size $.comments) > 5);
}
function EntryPage::lay_show_firstnav() : bool {
return false;
}
function Page::lay_navbar() {
var string userpic;
var Image up_img = $.journal.default_pic;
if (defined $up_img) {
$userpic = """<div class="userpic">
<img src="$up_img.url"
class="userpic" alt=""
height="$up_img.height" width="$up_img.width" />
</div>
""";
}
var string website;
if ($.journal.website_url != "") {
$website = """<li><a href="$.journal.website_url">$.journal.website_name</a></li>\n""";
}
"""
<td id="navbar" width="25%">
<div class="box">
<h1>$.journal.name</h1>
<ul>
""";
foreach var string v ($.views_order) {
if ($.view == $v) {
println "<li class=\"active\">"+lang_viewname($v)+"</li>";
} else {
println "<li><a href=\""+$.view_url{$v}+"\">"+lang_viewname($v)+"</a></li>";
}
}
"""
$website</ul>
$userpic
</div>
""";
if ($this->lay_show_firstnav()) {
$this->lay_page_nav();
}
if (size $this.linklist > 0 and $*linklist_support) {
println "<div class=\"box\">";
println "<h2>Links</h2>\n";
$this->print_linklist();
println "</div>";
}
"</td>";
}
function Page::print_linklist() {
if (size $.linklist <= 0) {
return;
}
var bool section_open = false;
println "<ul>";
foreach var UserLink l ($.linklist) {
if ($l.title) {
if ($l.is_heading) {
if ($section_open) {
println "</ul></li>";
}
println """<li><span style="font-weight: bold;">$l.title</span>\n<ul>""";
$section_open = true;
} else {
println """<li><a href="$l.url">$l.title</a></li>""";
}
}
}
if ($section_open) {
println "</ul></li>";
}
println "</ul>";
}
function Page::print() {
var string title = $this->title();
"""<html>\n<head>\n""";
if ($*external_stylesheet) {
println """<link rel="stylesheet" href="$.stylesheet_url" type="text/css" />""";
} else {
println """<style type="text/css">"""; print_stylesheet(); "</style>";
}
$this->print_head();
"<title>"+$this->title()+"</title>";
"""
</head>
<body class="$.view">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr valign="top">
""";
if ($*opt_navbar_pos == "left") {
$this->lay_navbar();
}
"<td rowspan=\"2\" id=\"body\">\n";
$this->print_body();
"</td>\n";
if ($*opt_navbar_pos == "right") {
$this->lay_navbar();
}
"</tr><tr><td valign=\"bottom\" id=\"skipbar\">";
$this->lay_page_nav();
"</td>";
"""
</tr>
</table>
</body>
</html>
""";
}
function print_entry(Page p, Entry e, Color bgcolor, Color fgcolor) {
var string datetime;
if ($p.view != "day") {
$datetime = $e.time->date_format("med_day")+", "+$e.time->time_format();
} else {
$datetime = $e.time->time_format();
}
if (not (defined $bgcolor) or not $*opt_friends_colors) {
$bgcolor = $*clr_boxhead_back;
}
if (not (defined $fgcolor) or not $*opt_friends_colors) {
$fgcolor = $*clr_boxhead_text;
}
"""<div class="box"><h2 style="color: $fgcolor; background: $bgcolor;">$datetime """;
if ($e.security != "") {
print """<img src="$e.security_icon.url" align="right" """+
"""width="$e.security_icon.width" height="$e.security_icon.height" """+
"""alt="[$e.security]" />""";
}
if ($p.view == "friends" or
$e.subject != "" or
$e.poster.username != $p.journal.username) {
print "<br />";
if ($p.view == "friends" or $e.poster.username != $p.journal.username) {
$p->print_entry_poster($e);
print ": ";
}
print $e.subject;
}
"</h2>\n<div class=\"entry\">\n";
if (defined $e.userpic and (
$*opt_always_userpic
or ($e.poster.username != $p.journal.username and $e.userpic.url != $p.journal.default_pic.url)
or $p.view == "friends"
or $p.view == "entry")) {
"""<img src="$e.userpic.url" """;
"""width="$e.userpic.width" height="$e.userpic.height" """;
"""alt="" align="right" style="margin: 5px;" />\n""";
}
"$e.text";
$e->print_metadata();
"""</div><div class="talklinks">""";
"""<div class="permalink"><a href="$e.permalink_url">$*text_permalink</a></div>&nbsp;""";
$e.comments->print();
"</div>";
"</div>";
} # print_entry(Page,Entry,Color,Color)
function Entry::print_metadata() {
var string caption;
var string val;
var Image i;
if (size $.metadata == 0 and size $.tags == 0) { return; }
println """<div class="metadata">""";
if ($this.tags) {
var int tcount = 0;
"<div class='ljtags'><strong>Tags:</strong> ";
foreach var Tag t ($this.tags) {
"""<a rel="tag" href="$t.url">$t.name</a>""";
$tcount++;
if ($tcount != size $this.tags) { ", "; }
}
"</div>";
}
if (size $.metadata != 0) {
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 = """<img src="$i.url" width="$i.width" height="$i.height" align="absmiddle"> $val""";
}
}
println """<div class="metadata-$k"><span style="font-weight: bold;">$caption:</span> $val</div>""";
}
}
println "</div>";
}
function Page::print_entry(Entry e) {
print_entry($this, $e, null Color, null Color);
}
function FriendsPage::print_entry(Entry e) {
var Friend f = $.friends{$e.journal.username};
print_entry($this, $e, $f.bgcolor, $f.fgcolor);
}
function colored_ljuser(UserLite u, Color fg, Color bg) : string {
var Image uiimg = userinfoicon($u);
var string dir = $u.journal_type == "C" ? "community" : "users";
return """<span class="ljuser" style="white-space:nowrap;"><a href="$*SITEROOT/userinfo.bml?user=$u.username" style="color: $fg; background: $bg;"><img src="$uiimg.url" alt="[i]" width="$uiimg.width" height="$uiimg.height" style="vertical-align:bottom;border:0;" /></a><a href="$*SITEROOT/$dir/$u.username/" style="color: $fg; background: $bg; font-weight: bold;">$u.username</a></span>""";
}
function FriendsPage::print_entry_poster(Entry e) {
var Friend f = $.friends{$e.journal.username};
var Color fg; var Color bg;
if ($*opt_friends_colors) {
$fg = $f.fgcolor;
$bg = $f.bgcolor;
} else {
$fg = $*clr_boxhead_text;
$bg = $*clr_boxhead_back;
}
print colored_ljuser($e.poster, $fg, $bg);
if ($e.poster.username != $e.journal.username) {
" posting in ";
print colored_ljuser($e.journal, $fg, $bg);
}
}
function RecentPage::print_body() {
foreach var Entry e ($.entries) {
$this->print_entry($e);
}
}
function CommentInfo::print() {
if ($.enabled) {
$this->print_postlink();
if ($.count > 0 or $.screened) {
" | ";
$this->print_readlink();
}
}
}
function DayPage::print_body() {
println """<h1 style="font-size: 1.5em; text-align: center;">"""+$.date->date_format("long")+"</h1>";
if (not $.has_entries) {
print "<p>$*text_noentries_day</p>";
return;
}
foreach var Entry e ($.entries) {
$this->print_entry($e);
}
}
function EntryPage::print_body() {
$this->print_entry($.entry);
if ($this.multiform_on) {
$this->print_multiform_start();
}
if ($.entry.comments.enabled) {
$this->print_comments($.comments);
}
if ($this.multiform_on) {
"<div class='box'><h2>Mass Action on Selected Comments:</h2>";
"<p class='entry'>"; $this->print_multiform_actionline(); "</p>";
"</div>";
$this->print_multiform_end();
}
}
function EntryPage::print_comments(Comment[] cs) {
if (size $cs == 0) { return; }
print "<div style=\"margin-left: 25px;\">";
foreach var Comment c ($cs) {
var int indent = ($c.depth - 1) * 25;
if ($c.full) {
$this->print_comment($c);
} else {
$this->print_comment_partial($c);
}
}
print "</div>";
}
function EntryPage::print_comment(Comment c) {
var string datetime;
$datetime = $c.time->date_format("med_day")+", "+$c.time->time_format();
"""<a name='$c.anchor'></a><div id="$c.dom_id" class="box"><h3 style="color: $*clr_boxhead_text; background: $*clr_boxhead_back;">""";
if ($c.metadata{"poster_ip"}) { print """<div style="float: right; vertical-align: top; font-size: 0.75em;">(""" +
$c.metadata{"poster_ip"} +
""")</div>"""; }
print $datetime;
if (defined $c.subject_icon) {
print """<img src="$c.subject_icon.url" align="right" """+
"""width="$c.subject_icon.width" height="$c.subject_icon.height" """+
"""alt="" />""";
}
var string poster = defined $c.poster ? $c.poster->as_string() : "<i>(Anonymous)</i>";
print "<br />"+$poster;
if ($c.subject != "") {
print ": "+$c.subject;
}
"</h3>\n<div class=\"entry\">\n";
if (defined $c.userpic and $*comment_userpic_style != "off") {
"""<img src="$c.userpic.url" """;
"""width="$c.userpic.width" height="$c.userpic.height" """;
"""alt="" align="right" style="margin: 5px;" />\n""";
}
"$c.text</div>";
"""<div class="talklinks">""";
"""<div class="permalink"><a href="$c.permalink_url">$*text_permalink</a></div>""";
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> - """; }
var Link l = new Link;
foreach var string ls ($c.link_keyseq) {
$l = $c->get_link($ls);
if (defined $l) {
println """<a href="$l.url">$*text_comment_links{$ls}</a> - """;
}
}
if (not $c.frozen) {
"""<a href="$c.reply_url">$*text_comment_reply</a>""";
} else {
"""$*text_comment_frozen""";
}
# FIXME: better location?
if ($.multiform_on) {
"""<br /><label for="ljcomsel_$c.talkid">$*text_multiform_check</label> """; $c->print_multiform_check();
}
"</div>";
if ((size $c.replies) > 0 and $c.replies[0].full == false) {
"""<div style="margin-top: 5px; margin-bottom: 5px; clear: both;">\n""";
$this->print_comments($c.replies);
"</div>\n";
}
"</div>";
if ((size $c.replies) > 0 and $c.replies[0].full == true) {
$this->print_comments($c.replies);
}
}
function EntryPage::print_comment_partial(Comment c) {
var string poster = defined $c.poster ? $c.poster->as_string() : "<i>(Anonymous)</i>";
var string subj = $c.subject != "" ? $c.subject : $*text_nosubject;
print """<div class="minicomment"><a href="$c.permalink_url">$subj</a> - $poster</div>""";
$this->print_comments($c.replies);
}
function ReplyPage::print_body() {
var EntryLite c = $.replyto;
var string datetime;
$datetime = $c.time->date_format("med_day")+", "+$c.time->time_format();
"""<div class="box"><h2 style="color: $*clr_boxhead_text; background: $*clr_boxhead_back;">$datetime """;
var string poster = defined $c.poster ? $c.poster->as_string() : "<i>(Anonymous)</i>";
print "<br />"+$poster;
if ($c.subject != "") {
print ": "+$c.subject;
}
"</h2>\n<div class=\"entry\">\n";
if (defined $c.userpic and $*comment_userpic_style != "off") {
"""<img src="$c.userpic.url" """;
"""width="$c.userpic.width" height="$c.userpic.height" """;
"""alt="" align="right" style="margin: 5px;" />\n""";
}
"$c.text</div>";
if (defined $c.userpic and $*comment_userpic_style != "off") {
"""<br clear="all" />""";
}
"</div>";
"""<div class="box" style="margin-left: 25px;">\n""";
$.form->print();
"</div>\n";
}
function YearPage::print_body {
foreach var YearMonth m ($.months) {
$this->print_month($m);
}
}
function YearPage::print_month(YearMonth m) {
if (not $m.has_entries) { return; }
"""<table class="box" style="border-collapse: collapse; border: 1px solid; width: 80%; margin-left: 10%; margin-right: 10%;" border="1">\n
<tr><th colspan="7" style="background: $*clr_boxhead_back; color: $*clr_boxhead_text; text-align: center;">""";
print $m->month_format();
"""</th></tr>\n""";
foreach var int d (weekdays()) {
"<th style=\"width: 14%;\">"+$*lang_dayname_short[$d]+"</th>\n";
}
"</tr>\n";
foreach var YearWeek w ($m.weeks) {
$w->print();
}
"""<tr><td colspan="7" style="text-align: center;">
<a href="$m.url">$*text_view_month</a></td></tr>\n""";
"</table>";
}
function YearWeek::print() {
"""<tr valign="top" style="height: 2.75em;">\n""";
if ($.pre_empty > 0) {
"""<td class="emptyday" colspan="$.pre_empty">&nbsp;</td>\n""";
}
foreach var YearDay d ($.days) {
"""<td>\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">&nbsp;</td>\n""";
}
"</tr>";
}
function MonthPage::print_body {
"""<div class="box"><h2>"""+$.date->date_format($*lang_fmt_month_long)+"</h2>\n";
"<dl style=\"margin: 1em;\">";
foreach var MonthDay d ($.days) {
if ($d.has_entries) {
"<dt><a href=\"$d.url\"><b>";
print lang_ordinal($d.day);
"</b></a></dt>\n<dd>";
$d->print_subjectlist();
"</dd>\n";
}
}
"</dl>\n</div>\n";
}
### Handler for the theme previews
function print_theme_preview() {
"""
<div style="padding: 1em; background: $*clr_page_back; color: $*clr_page_text;">
<div style="border: 1px solid $*clr_page_text; margin: 1em; background: $*clr_box_back; color: $*clr_box_text;">
<h2 style="color: $*clr_boxhead_text; background: $*clr_boxhead_back; font-size: 1em; padding: 4px; margin: 0;">Cir zuta besho cavu mabu</h2>
<div style="margin: 1em;">
Cir zuta besho cavu mabu. Jad dop fugu hige wiju. Jam nek sapu shek noshea, moz lolle jil hattou daz.
Heck mippe giffou tipe pello, govo goof wachou fenu betui, mumu niffo puffu hivoo ziv! Sap gap jozo vem
sushu jiwo peru diche gese zar. Zuk kah rec sok vapui, mumu. Puw wuti mufe bak jivo, zef kazou gipwew cus.
Cev lepp gik fego rer. Tucku mickou jeck helou soopp! Vowa vov fawea pip wok. Heg fum heafsum pele.
Piz kuzu louw rome puir. Pashi jog huku pobi ckush. Zuj bit wido guih biha. Som veh nelo ruh ruju.
Coosh jecko nuh tutt tab. Zutt ckek vano fic der, hivu?
</div>
<div style="margin: 1em; text-align: right; clear: both;">
<div style="float: left;"><span style="color: #0000ff; text-decoration: underline; cursor: hand;">$*text_permalink</span></div>&nbsp;
</div>
</div>
</div>
""";
}