root/main/trunk/greenstone2/macros/style.dm @ 27786

Revision 27786, 12.7 KB (checked in by kjdon, 7 years ago)

the name att of a meta tag must be a single token. So lets use a static name rather than language specific name

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1# this file must be UTF-8 encoded
2#######################################################################
3# PAGE STYLES
4#######################################################################
5
6package Style
7
8# to use this style system output
9# _header_
10# all your page content, then
11# _footer_
12
13# use the page parameter 'style' to choose the appropriate style
14
15# Current values: "html" and "xhtml"
16_compliance_ {html}
17
18# the style system uses
19# _pagetitle_  - what gets displayed at the top of the browser window
20# _pagescriptextra_ - any extra javascript you want included in the header
21# _pagebannerextra_ - anything extra you want displayed in the page banner
22# _pagefooterextra_ - anything extra you want displayed in the footer
23
24# defaults for the above macros
25_pagetitle_ {_collectionname_}
26_pagescriptfileextra_ {}
27_pagescriptextra_ {}
28_pagebannerextra_ {}
29_pagefooterextra_ {}
30
31# collection specific style and script may be set in collection's extra.dm
32# using the following macros
33_collectionspecificstyle_ {}
34_collectionspecificscript_ {}
35
36# it also relies on lots of Globals, the most important of these are:
37# _cookie_ - put in the cgi header
38# _globalscripts_ - javascript stuff
39# _imagecollection_
40# _imagehome_
41# _imagehelp_
42# _imagepref_
43# _imagethispage_ (this is now not an image, but text. should be renamed?)
44# _linkotherversion_
45
46# _httpiconchalk_ - the image down the left of the page - is now done
47# by the style sheet.
48
49_header_ {_cgihead_
50_htmlhead_(class="bgimage")_startspacer__pagebanner_
51}
52
53_header_[v=1] {_cgihead_
54_htmlhead__pagebanner_
55}
56
57# _cgihead_ {Content-type: text/html
58# _cookie_
59#
60# }
61_cgihead_{}
62
63
64# any declarations relating to CSS that should go in the html head part.
65# declarations containing images are done here so the path is correct
66# at runtime.
67
68_csslink_{
69  <link rel="stylesheet" href="_cssfilelink_" type="text/css"
70   title="Greenstone Style" charset="UTF-8" _linktagend_
71  <link rel="alternate stylesheet" href="_httpstyle_/style-print.css"
72   type="text/css" title="Printer" charset="UTF-8" media="print, screen" _linktagend_
73  <link rel="stylesheet" href="_httpstyle_/style-print.css" type="text/css"
74   title="Printer" charset="UTF-8" media="print" _linktagend_
75  _cssfilelinkextra_
76}
77
78_cssheader_ {
79_csslink_
80<style type="text/css">
81body.bgimage \{ background: url("_httpimages_/chalk.gif") scroll repeat-y left top; \}
82div.navbar \{ background-image: url("_httpimages_/bg_green.png"); \}
83div.divbar \{ background-image: url("_httpimages_/bg_green.png"); \}
84a.navlink \{ background-image: url("_httpimages_/bg_off.png"); \}
85a.navlink_sel \{ background-image: url("_httpimages_/bg_green.png"); \}
86a.navlink:hover \{ background-image: url("_httpimages_/bg_on.png"); \}
87p.bannertitle \{background-image: url("_httpimages_/banner_bg.png"); \}
88p.collectiontitle \{background-image: url("_httpimages_/banner_bg.png"); \}
89</style>
90_collectionspecificstyle_
91
92}
93
94# separate macro so it can be easily overridden for customised collections
95_cssfilelink_ {_httpstyle_/style.css}
96
97# separate macro so additional stylesheets (to those included by default) can be specified
98_cssfilelinkextra_ {}
99
100# Languages that should be displayed right-to-left
101_htmlextra_ [l=ar] { dir=rtl }
102_htmlextra_ [l=fa] { dir=rtl }
103_htmlextra_ [l=he] { dir=rtl }
104_htmlextra_ [l=ur] { dir=rtl }
105_htmlextra_ [l=ps] { dir=rtl }
106_htmlextra_ [l=prs] { dir=rtl }
107
108# htmlhead uses:
109# _1_ - extra parameters for the body tag
110# _pagetitle_
111# _globalscripts_
112_htmlhead_ {<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
113"http://www.w3.org/TR/html4/loose.dtd">
114
115<html_htmlextra_>
116<head>
117<title>_pagetitle_</title>
118<meta name="Greenstone_version_number" content="_versionnum_" _metatagend_
119_globalscripts_
120_cssheader_
121_document:documentheader_
122</head>
123
124<body _1_>
125}
126
127# Link and meta tags must be closed differently for HTML/XHTML validation
128_linktagend_ {_If_("_compliance_" eq "xhtml",/>,>)}
129_metatagend_ {_If_("_compliance_" eq "xhtml",/>,>)}
130
131_spacerwidth_ {65}
132
133# _startspacer_ is a spacer that gives pages a left-hand margin.
134# It must eventually be closed by _endspacer_.
135_startspacer_ {
136<div id="page">
137}
138
139# If you want to move the home/help/pref buttons, override this to be empty
140# and then explicitly include _globallinks_ somewhere else
141# on the page
142_optgloballinks_ {_globallinks_}
143
144# _bannertitle_ is defined in nav_css/ns4.dm, and is either text or
145# a banner image
146_pagebanner_ {
147<!-- page banner (\_style:pagebanner\_) -->
148<div id="banner">
149<div class="pageinfo"> 
150<p class="bannerlinks">_optgloballinks_</p>
151_bannertitle_
152</div>
153<div class="collectimage">_imagecollection_</div>
154</div>
155<div class="bannerextra">_pagebannerextra_</div>
156<!-- end of page banner -->
157_If_("_activateweb20_" eq "2",
158  _If_("_activatetalkback_" eq "1",_talkback:uploadForm_)
159)
160}
161
162_pagebanner_[v=1] {
163<!-- page banner - text version [v=1] (\_style:pagebanner\_) -->
164<center><h2><b><u>_imagecollection_</u></b></h2></center><p>
165_optgloballinks_
166_pagebannerextra_
167<p>
168<!-- end of page banner -->
169_If_("_activateweb20_" eq "2",
170  _If_("_activatetalkback_" eq "1",_talkback:uploadForm_)
171)
172}
173
174# note we no longer close off one of the startspacer tables here!!
175_footer_ {
176_If_("_cgiargtalkback_" eq "1",_talkback:monitorUpload_)
177<!-- page footer (\_style:footer\_) -->
178_pagefooterextra__endspacer__htmlfooter_
179}
180
181# v=1 footer: not using startspacer in the header, so dont put it in the footer
182_footer_ [v=1]{
183_If_("_cgiargtalkback_" eq "1",_talkback:monitorUpload_)
184<!-- page footer [v=1] (\_style:footer\_) -->
185_pagefooterextra_
186_htmlfooter_
187}
188
189# close off anything opened by startspacer
190_endspacer_ {   
191</div> <!-- id=page -->
192}   
193
194
195_htmlfooter_ {
196</body>
197</html>
198}
199
200_loginscript_ {
201   function appendUsernameArgs(id,addOn)
202   \{
203     var a=document.getElementById(id);
204     var url = a.getAttribute("href");
205     if (url == "") \{
206       url = document.location.toString();
207     \}
208
209     //alert("url before = " + url);
210
211     // clear out any earlier user name/authentication values
212     url = url.replace(/(&|\\\\?)uan=\\d\{0,1\}/g,"");
213     url = url.replace(/(&|\\\\?)un=[a-z0-9:\\-]*/g,"");
214     url = url.replace(/(&|\\\\?)pw=[a-z0-9:\\-]*/g,"");
215
216     //alert("url after = " + url);
217
218     var gwcgi = "_gwcgi_";
219
220     var tailUrl = url.substr(url.length-gwcgi.length);
221
222     url += (tailUrl == "_gwcgi_") ? "?" : "&";
223     url += addOn;
224
225     //alert("url with add on = " + url);
226
227     a.setAttribute("href",url);
228   \}
229}
230
231
232# imagescript only used in nav_ns4.dm
233_globalscripts_{
234  <script type="text/javascript" src="_httpscript_/gsajaxapi.js"></script>
235
236  <script language="javascript" type="text/javascript">
237    function gsdefined(val)
238    \{
239       return (typeof(val) != "undefined");
240    \}
241
242    var un = "_cgiargun_";
243    var ky = "_cgiargky_";
244    var gsapi = new GSAjaxAPI("_gwcgi_","_cgiargc_","_cgiargun_","_cgiargky_");
245   
246    // http://stackoverflow.com/questions/6312993/javascript-seconds-to-time-with-format-hhmmss
247    // Call as: alert(timestamp.printTime());
248    function formatTime(timestamp) \{
249      var int_timestamp    = parseInt(timestamp, 10); // don't forget the second param
250      var date = new Date(int_timestamp);
251      return date.toLocaleDateString() + " " + date.toLocaleTimeString();   
252   \}
253
254    function loadUserComments() \{
255
256        // don't bother loading comments if we're not on a document page (in which case there's no usercommentdiv)
257        var usercommentdiv = document.getElementById("usercomments");
258    if(usercommentdiv == undefined || usercommentdiv == null) \{
259    return;
260    \}
261
262    // else, if we have a usercommentdiv, we would have a docid. Get toplevel section of the docid
263    var doc_id = "_cgiargd_"; //escape("_cgiargd_");
264    var period = doc_id.indexOf(".");
265    if(period != -1) \{
266        doc_id = doc_id.substring(0, period);
267    \}
268
269    var username_rec = \{
270        metaname: "username",
271        metapos: "all"
272    \};
273
274    var timestamp_rec = \{
275        metaname: "usertimestamp",
276        metapos: "all"
277    \};
278
279    var comment_rec = \{
280        metaname: "usercomment",
281        metapos: "all"
282    \};
283
284    var doc_rec = \{
285        docid: doc_id,
286        metatable: [username_rec, timestamp_rec, comment_rec]       
287    \};
288
289    var docArray = [doc_rec];
290    //alert(JSON.stringify(docArray));
291
292    var json_result_str = gsapi.getMetadataArray(docArray, "index");
293//  alert(json_result_str);
294    var result = JSON.parse(json_result_str);
295    // result contains only one docrec (result[0]), since we asked for the usercomments of one docid
296    var metatable = result[0].metatable;
297//  alert(JSON.stringify(metatable));
298
299    var i = 0;
300    var looping = true;
301    var print_heading = true;
302
303    // metatable[0] = list of usernames, metatable[1] = list of timestamps, metatable[2] = list of comments
304    // the 3 lists/arrays should be of even length. Assuming this, loop as long as there's another username
305    while(looping) \{
306        var metaval_rec = metatable[0].metavals[i];
307        if(metaval_rec == undefined) \{
308            looping = false;
309        \}
310        else \{
311
312            if(print_heading) \{
313                 var heading=document.createElement("div");
314                 var attr=document.createAttribute("class");
315                 attr.nodeValue="usercommentheading";
316                 heading.setAttributeNode(attr);
317                 var txt=document.createTextNode("_text-usercomments-section_");
318                 heading.appendChild(txt);
319                 usercommentdiv.appendChild(heading);
320
321                 print_heading = false;
322            \}
323
324                var username = metaval_rec.metavalue;
325            var timestamp = metatable[1].metavals[i].metavalue; 
326            var comment = metatable[2].metavals[i].metavalue;
327
328            //alert("Comment: " + username + " " + timestamp + " " + comment);
329
330            // No need to sort by time, as the meta are already stored sorted
331            // and hence retrieved in the right order by using the i (metapos) counter
332            // If sorting the array of comment records, which would be by timestamp, see
333            // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort
334
335             // for each usercomment, create a child div with the username, timestamp and comment
336             displayInUserCommentList(usercommentdiv, username, timestamp, comment);
337             
338             i++;
339         \}     
340    \}
341
342    \}
343
344
345    function displayInUserCommentList(usercommentdiv, username, timestamp, comment) \{
346
347        var divgroup=document.createElement("div");
348    var attr=document.createAttribute("class");
349    attr.nodeValue="usercomment";
350    divgroup.setAttributeNode(attr);
351
352    var divuser=document.createElement("div");
353    var divtime=document.createElement("div");
354    var divcomment=document.createElement("div");
355
356   
357    divgroup.appendChild(divuser);
358    var txt=document.createTextNode(username);
359    divuser.appendChild(txt);
360
361    divgroup.appendChild(divtime);
362    txt=document.createTextNode(formatTime(timestamp)); // format timestamp for date/time display
363    divtime.appendChild(txt);
364
365    // any quotes and colons in the fields would have been protected for transmitting as JSON
366    // so decode their entity values
367    comment = comment.replace(/&quot;/gmi, '"');
368    comment = comment.replace(/&58;/gmi, ':');
369
370    divgroup.appendChild(divcomment);
371    txt=document.createTextNode(comment);
372    divcomment.appendChild(txt);
373
374    usercommentdiv.appendChild(divgroup);
375             
376    \}
377
378    // http://stackoverflow.com/questions/807878/javascript-that-executes-after-page-load
379    // ensure we don't replace any other onLoad() functions, but append the loadUserComments()
380    // function to the existing onLoad handlers
381
382    if(window.onload) {\
383        var curronload = window.onload;
384        var newonload = function() {\
385            curronload();
386            loadUserComments();
387        \};
388        window.onload = newonload;
389    \} else {\
390        window.onload = loadUserComments;
391    \}
392  </script>
393
394_If_("_activatejquery_" eq "1",_jqueryScriptAndStyle_)
395
396_If_("_activateweb20_" eq "2",
397  _If_("_activateseaweed_" eq "1",_seaweedscript_)
398  _If_("_activatetalkback_" eq "1",_talkbackscript_)
399)
400_If_(_pagescriptfileextra_,_pagescriptfileextra_)
401<script language="javascript" type="text/javascript">
402_loginscript_
403_If_(_pagescriptextra_,_pagescriptextra_)
404_collectionspecificscript_
405_imagescript_
406</script>
407}
408
409_globalscripts_ [v=1] {
410
411_If_("_activatejquery_" eq "1",_jqueryScriptAndStyle_)
412
413_If_("_activateweb20_" eq "2",
414  <script type="text/javascript" src="_httpscript_/gsajaxapi.js"></script>
415  _If_("_activateseaweed_" eq "1",_seaweedscript_)
416  _If_("_activatetalkback_" eq "1",_talkbackscript_)
417)
418_If_(_pagescriptfileextra_,_pagescriptfileextra_)
419<script language="javascript" type="text/javascript">
420<!--
421_loginscript_
422_If_(_cgiargx_,_scriptdetach_)
423_If_(_pagescriptextra_,_pagescriptextra_)
424_collectionspecificscript_
425// -->
426</script>
427}
428
429_scriptdetach_ {
430    function close\_detach() \{
431    close();
432    \}
433}
434
435
436_jqueryScriptAndStyle_ {
437<link type="text/css" href="_httpstyle_/max-video/jquery-ui-1.8.4.custom.css" rel="stylesheet" />
438<script type="text/javascript" src="_httpscript_/jquery-1.4.2.min.js"></script>
439<script type="text/javascript" src="_httpscript_/jquery-ui-1.8.4.custom.min.js"></script>
440}
441
Note: See TracBrowser for help on using the browser.