/[pub]/suikawiki/script/misc/plugins/view/stylesheet.wp2
Suika

Contents of /suikawiki/script/misc/plugins/view/stylesheet.wp2

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations) (download)
Sat Feb 14 10:50:38 2004 UTC (20 years, 8 months ago) by wakaba
Branch: MAIN
Changes since 1.1: +5 -5 lines
Set cookie path

1 wakaba 1.1 #?SuikaWikiConfig/2.0
2    
3     Plugin:
4     @Name: StyleSheet
5     @Description:
6     @@@: Stylesheet support
7     @@lang:en
8 wakaba 1.2 @License: %%Perl%%
9 wakaba 1.1 @Author:
10     @@Name:
11     @@@@: Wakaba
12     @@@lang:ja
13     @@@script:Latn
14     @@Mail[list]: w@suika.fam.cx
15 wakaba 1.2 @Date.RCS:
16     $Date: 2004/02/08 08:44:13 $
17 wakaba 1.1 @RequiredPlugin[list]:
18     Error
19     HTML
20     @Use:
21     use Message::Util::Error;
22     my $WIKIRESOURCE;
23    
24     PluginConst:
25     @NS_XHTML1:
26     http://www.w3.org/1999/xhtml
27     @WIKIRESOURCE:
28     {($WIKIRESOURCE ||= SuikaWiki::Plugin->module_package ('WikiResource'))}
29    
30     Format:
31     @ModuleName:
32     StyleSheet::CSS
33    
34     @Name: CSS
35     @Type: text/css
36     @Description:
37     @@@: Cascading Style Sheets (CSS)
38     @@lang: en
39    
40     @Use:
41     use Message::Markup::XML::QName qw(NS_xml_URI);
42    
43     @Converter:
44     @@Type: text/css
45     @@Description:
46     @@@: CSS -> CSS (no convertion)
47     @@lang: en
48     @@ToString:
49     return $$source;
50     ## BUG: Insecure specification MUST be removed
51    
52     @Converter:
53     @@Type: text/html
54     @@IsFragment: 1
55     @@Description:
56     @@@: CSS with some decoration, marked-up in HTML
57     @@lang: en
58     @@Main:
59     my $node = $opt->{-parent}->append_new_node
60     (type => '#element',
61     namespace_uri => $NS_XHTML1,
62     local_name => 'pre');
63     $node->set_attribute (class => 'text-css');
64     $node->set_attribute (space => 'preserve', namespace_uri => NS_xml_URI);
65     $node->append_text ($$source);
66     return $node;
67    
68     ViewDefinition:
69     @Mode: css
70     @Condition:
71     @@http-method[list]:
72     GET
73     HEAD
74     POST
75     @Description:
76     @@@: CSS Style Sheet
77     @@lang: en
78     @template:
79     @@http-status-code: 200
80     @@media-type: text/css
81     @@use-media-type-charset: 1
82     @@expires: %%stylesheet%%
83     @@body:
84     %read (Type => {text/css}, return-type => {ToString},
85     when-no-converter => 406);
86    
87     FormattingRule:
88     @Category[list]:
89     view
90     view-resource
91     @Name: styles-wiki-html
92     @Description:
93     @@@:
94     Stylesheet list as HTML (link element)
95     @@lang: en
96     @Paramater:
97     @@Name: page
98     @@Type: WikiName
99     @@Default: (auto)
100     @@Description:
101     @@@@: WikiPage in which stylesheet list is defined
102     @@@lang: en
103     @Formatting:
104     my $list = __FUNCPACK__->_get_stylelist_definition_page
105     (page => $o->{wiki}->name
106     ($p->{page} ||
107     $o->{wiki}->{config}->{page}
108     ->{'StyleSheetList(text/html)'} ||
109     [qw!Wiki Style List text/html!]),
110     o => $o, wiki => $o->{wiki});
111     return unless $list;
112     my $parent = $p->{-parent};
113    
114     my $ua_apply;
115     my $dg = $o->{wiki}->{var}->{client}->{downgrade};
116     if ($dg->{stylesheet_non_standard}) {
117     $ua_apply = $dg->{ua_netscape4} ? 'Netscape4'
118     : $dg->{ua_winie60} ? 'WinIE6.0'
119     : $dg->{ua_winie55} ? 'WinIE5.5'
120     : $dg->{ua_winie50} ? 'WinIE5.0'
121     : $dg->{ua_winie40} ? 'WinIE4.0'
122     : $dg->{ua_winie30} ? 'WinIE3.0'
123     : 1;
124     }
125    
126     for my $set (@{$list->child_nodes}) {
127     if ($set->local_name eq 'StyleSet') {
128     my $type = {
129     map {$_ => 1}
130     map {ref $_ ? @$_ : [$_]}
131     $set->get_attribute_value ('Apply', default => ['alternate'])
132     };
133     next if $ua_apply and not $type->{$ua_apply};
134     my $rel = $type->{alternate} ? 'alternate stylesheet' : 'stylesheet';
135     my $title = __FUNCPACK__->_get_styleset_title
136     (StyleSet => $set, o => $o,
137     type => $type);
138     for my $sheet (@{$set->child_nodes}) {
139     if ($sheet->local_name eq 'StyleSheet') {
140     my $link = $parent->append_new_node
141     (type => '#element',
142     namespace_uri => $NS_XHTML1,
143     local_name => 'link');
144     $link->option (use_EmptyElemTag => 1);
145     $link->set_attribute (rel => $rel);
146     $link->set_attribute (title => $title) unless $type->{persistent};
147     my $media_type = $sheet->get_attribute_value
148     ('Type', default => 'text/css');
149     ## TODO: parameter
150     $link->set_attribute (type => $media_type);
151     unless ($dg->{html_link_no_media}) {
152     my $media_descriptor = $sheet->get_attribute_value ('Media');
153     $link->set_attribute (media => $media_descriptor || 'all');
154     }
155     my $mode = 'css'; ## ISSUE: Make this media-type independent!
156     $link->set_attribute
157     (href => $o->{wiki}->uri_reference
158     (page => $o->{wiki}->name
159     ($sheet->get_attribute_value
160     ('WikiPage', default => '')),
161     mode => $mode,
162     with_lm => 1, base => 1));
163     $parent->append_text ("\n");
164     }
165     }
166    
167     }
168     }
169    
170     FormattingRule:
171     @Category[list]:
172     view
173     view-resource
174     @Name: styles-wiki-xml
175     @Description:
176     @@@:
177     Stylesheet list in xml-stylesheet processing instructions
178     @@lang: en
179     @Parameter:
180     @@Name: downgrade-html
181     @@Type: boolean
182     @@Default: "0"
183     @@Description:
184     @@@@:
185     HTML downgrade mode. PIs are not outputed if User-Agent does not
186     support PIs (eg. Classic Mozilla).
187     @@lang: en
188     @Paramater:
189     @@Name: page
190     @@Type: WikiName
191     @@Default: (auto)
192     @@Description:
193     @@@@: WikiPage in which stylesheet list is defined
194     @@@lang: en
195     @Formatting:
196     __ATTRTEXT:%downgrade_html__;
197     if ($p->{downgrade_html}) {
198     return if $o->{wiki}->{var}->{client}->{downgrade}->{html_no_pi};
199     }
200     my $list = __FUNCPACK__->_get_stylelist_definition_page
201     (page => $o->{wiki}->name
202     ($p->{page} ||
203     $o->{wiki}->{config}->{page}
204     ->{'StyleSheetList(text/html)'} ||
205     [qw!Wiki Style List text/html!]),
206     o => $o, wiki => $o->{wiki});
207     return unless $list;
208     my $parent = $p->{-parent};
209    
210     for my $set (@{$list->child_nodes}) {
211     if ($set->local_name eq 'StyleSet') {
212     my $type = {map {$_ => 1}
213     @{
214     $set->get_attribute_value ('Apply', default => ['alternate'])
215     }};
216     my $rel = $type->{alternate} ? 'alternate stylesheet' : 'stylesheet';
217     my $title = __FUNCPACK__->_get_styleset_title
218     (StyleSet => $set, o => $o,
219     type => $type);
220     for my $sheet (@{$set->child_nodes}) {
221     if ($sheet->local_name eq 'StyleSheet') {
222     my $link = $parent->append_new_node
223     (type => '#pi',
224     local_name => 'xml-stylesheet');
225     $link->set_attribute (alternate => $type->{preferred} ? 'no'
226     : 'yes')
227     unless $type->{persistent};
228     $link->set_attribute (title => $title) unless $type->{persistent};
229     my $media_type = $sheet->get_attribute_value
230     ('Type', default => 'text/css');
231     ## TODO: parameter
232     $link->set_attribute (type => $media_type);
233     unless ($o->{wiki}->{var}->{client}->{downgrade}
234     ->{html_link_no_media}) {
235     my $media_descriptor = $sheet->get_attribute_value ('Media');
236     $link->set_attribute (media => $media_descriptor || 'all');
237     }
238     my $mode = 'css'; ## ISSUE: Make this media-type independent!
239     $link->set_attribute
240     (href => $o->{wiki}->uri_reference
241     (page => $o->{wiki}->name
242     ($sheet->get_attribute_value
243     ('WikiPage', default => '')),
244     mode => $mode,
245     with_lm => 1));
246     $parent->append_text ("\n");
247     }
248     }
249     }
250     }
251    
252     FormattingRule:
253     @Category[list]:
254     view
255     view-resource
256     form-input
257     @Name: select-user-preferred-style
258     @Description:
259     @@@:
260     Select user preferred style
261     @@lang: en
262     @Paramater:
263     @@Name: page
264     @@Type: WikiName
265     @@Default: (auto)
266     @@Description:
267     @@@@: WikiPage in which stylesheet list is defined
268     @@@lang: en
269     @Formatting:
270     __ATTRTEXT:%page__;
271     my $list = __FUNCPACK__->_get_stylelist_definition_page
272     (page => $o->{wiki}->name
273     ($p->{page} ||
274     $o->{wiki}->{config}->{page}
275     ->{'StyleSheetList(text/html)'} ||
276     [qw!Wiki Style List text/html!]),
277     o => $o, wiki => $o->{wiki});
278     return unless $list;
279     my $form = $p->{-parent}->append_new_node
280     (type => '#element',
281     namespace_uri => $NS_XHTML1,
282     local_name => 'form');
283     my $id = SuikaWiki::Plugin->module_package ('WikiFormCore')
284     ->control_id ($o,
285     local_id => 'style-selector',
286     require_local_id => 1);
287     $form->set_attribute (id => $id->{global_id});
288     my $div = $form->append_new_node
289     (type => '#element',
290     namespace_uri => $NS_XHTML1,
291     local_name => 'div');
292     my $parent = $div->append_new_node
293     (type => '#element',
294     namespace_uri => $NS_XHTML1,
295     local_name => 'select');
296     $parent->set_attribute (id => $id->{global_id}.'-list');
297    
298     my $default = $parent->append_new_node
299     (type => '#element',
300     namespace_uri => $NS_XHTML1,
301     local_name => 'option');
302     $default->set_attribute (value => 'no-style');
303     $default->append_text ($WIKIRESOURCE->get (name => 'Style:Default',
304     o => $o, wiki => $o->{wiki}));
305     my $selected = 0;
306    
307     for my $set (@{$list->child_nodes}) {
308     if ($set->local_name eq 'StyleSet') {
309     my $type = {map {$_ => 1}
310     @{
311     $set->get_attribute_value ('Apply', default => ['alternate'])
312     }};
313     next unless $type->{preferred} or $type->{alternate};
314     my $title = __FUNCPACK__->_get_styleset_title
315     (StyleSet => $set, o => $o,
316     type => $type);
317     my $link = $parent->append_new_node
318     (type => '#element',
319     namespace_uri => $NS_XHTML1,
320     local_name => 'option');
321     $link->set_attribute (selected => 'selected'), $selected = 1
322     if $type->{preferred};
323     $link->set_attribute (value => $title);
324     $link->append_text ($title);
325     $parent->append_text ("\n");
326     }
327     }
328    
329     $default->set_attribute (selected => 'selected') unless $selected;
330    
331     for ($div->append_new_node (type => '#element',
332     namespace_uri => $NS_XHTML1,
333     local_name => 'input')) {
334     $_->set_attribute (type => 'button');
335     $_->set_attribute (id => $id->{global_id}.'-save');
336     $_->set_attribute (value => $WIKIRESOURCE->get
337     (name => 'Style:Save',
338     o => $o, wiki => $o->{wiki}));
339     $_->set_attribute (class => 'save');
340     $_->option (use_EmptyElemTag => 1);
341     }
342     for ($div->append_new_node (type => '#element',
343     namespace_uri => $NS_XHTML1,
344     local_name => 'input')) {
345     $_->set_attribute (type => 'reset');
346     $_->set_attribute (id => $id->{global_id}.'-reset');
347     $_->set_attribute (value => $WIKIRESOURCE->get
348     (name => 'Style:Reset',
349     o => $o, wiki => $o->{wiki}));
350     $_->set_attribute (class => 'reset');
351     $_->option (use_EmptyElemTag => 1);
352     }
353    
354     __ATTRTEXT:%expires__;
355 wakaba 1.2 my $cookie_path = $o->{wiki}->uri_reference->path;
356 wakaba 1.1 for ($div->append_new_node (type => '#element',
357     namespace_uri => $NS_XHTML1,
358     local_name => 'script')) {
359     $_->set_attribute (type => $o->{wiki}->{var}->{client}->{downgrade}
360     ->{media_type_no_app_js}
361     ? 'text/javascript'
362     : 'application/x-javascript');
363     $_->set_attribute (defer => 'defer');
364     ## Gecko assumes <script> content as CDATA even if it is XHTML,
365     ## when it is labeled as text/html. (Pseudo) comment declaration
366     ## nor CDATA marked section can be used to keep compatibility and
367     ## well-formedness. Use #xml type, instead of #text, not to escape
368     ## GREATER-THAN SIGN.
369     $_->append_new_node (type => '#xml', value => <<EOH);
370    
371     function getCookieValue (name) {
372     var c = document.cookie.split(';');
373     for (var i = 0; c.length > i; i++) {
374     var v = c[i].split('=');
375     if (v[0].replace(/^\\s+/,'').replace(/\\s+\$/,'') == name) {
376     return decodeURIComponent (v[1].replace(/^\\s+/,'')
377     .replace(/\\s+\$/,''));
378     }
379     }
380     return '';
381     }
382     var selectList = document.getElementById('$id->{global_id}-list');
383     selectList.value = getCookieValue('Selected');
384     selectList.onchange = function () {
385     var selectList = document.getElementById('$id->{global_id}-list');
386     for (var i = 0; document.styleSheets.length > i; i++) {
387     var s = document.styleSheets.item(i);
388     if (s.href != document.URL) {
389     if (s.title)
390     s.disabled = (s.title != selectList.value);
391     }
392     }
393     }
394     document.getElementById('$id->{global_id}-save').onclick = function () {
395     var selectList = document.getElementById('$id->{global_id}-list');
396     var expires = new Date();
397     expires.setTime (expires.getTime()
398     + 1000*3600*24*@{[$p->{expires}||365]});
399     document.cookie = 'Selected=' + encodeURIComponent(selectList.value)
400     + ';path=$cookie_path;expires='+expires.toGMTString();
401     }
402     document.getElementById('$id->{global_id}-reset').onclick = function () {
403     var expires = new Date();
404     expires.setTime (expires.getTime() - 3600);
405     document.cookie = 'Selected=;path=$cookie_path;expires='
406     + expires.toGMTString();
407     }
408    
409     EOH
410     }
411    
412     FormattingRule:
413     @Category[list]:
414     view
415     view-resource
416     form-input
417     @Name: apply-user-preferred-style
418     @Description:
419     @@@:
420     Applying user preferred style
421     @@lang: en
422     @Formatting:
423     for ($p->{-parent}->append_new_node
424     (type => '#element',
425     namespace_uri => $NS_XHTML1,
426     local_name => 'script')) {
427     $_->set_attribute (type => $o->{wiki}->{var}->{client}->{downgrade}
428     ->{media_type_no_app_js}
429     ? 'text/javascript'
430     : 'application/x-javascript');
431     $_->set_attribute (defer => 'defer');
432     ## TODO: Some mechanism to prevent multiple outputing of same functions
433     ## required.
434     $_->append_new_node (type => '#xml', value => <<EOH);
435    
436     function getCookieValue (name) {
437     var c = document.cookie.split(';');
438     for (var i = 0; c.length > i; i++) {
439     var v = c[i].split('=');
440     if (v[0].replace(/^\\s+/,'').replace(/\\s+\$/,'') == name) {
441     return decodeURIComponent (v[1].replace(/^\\s+/,'')
442     .replace(/\\s+\$/,''));
443     }
444     }
445     return '';
446     }
447    
448     var styleName = getCookieValue('Selected');
449     if (styleName) {
450     for (var i = 0; document.styleSheets.length > i; i++) {
451     var s = document.styleSheets.item(i);
452     if (s.href != document.URL) {
453     if (s.title)
454     s.disabled = (s.title != styleName) ? true : false;
455     }
456     }
457     }
458    
459     EOH
460     }
461    
462     Function:
463     @Name: _get_stylelist_definition_page
464     @Main:
465     my (undef, %opt) = @_;
466     my $content;
467     if ($opt{wiki}->{db}) {
468     try {
469     $content = $opt{wiki}->{db}->get (content => $opt{page});
470     } catch SuikaWiki::DB::Util::Error with {
471     $content = undef;
472     };
473     }
474     my $format = SuikaWiki::Plugin->module_package ('WikiFormat')
475     ->handler (\$content,
476     o => $opt{o},
477     wiki => $opt{o}->{wiki});
478     my $cfg;
479     try {
480     $cfg = $format->convert (\$content,
481     Type => 'application/x.suikawiki.config',
482     Type_param => {version => '2.0'},
483     o => $opt{o}, page => $opt{page});
484     } catch SuikaWiki::Format::Definition::error with {
485     my $err = shift;
486     if ($err->{-type} eq 'CONVERTER_NOT_FOUND') {
487     SuikaWiki::Plugin->module_package ('Error')
488     ->report_error_simple
489     ($opt{o}->{wiki},
490     'Condition' => $err->stringify);
491     } else {
492     $err->throw;
493     }
494     };
495     $cfg;
496    
497     Function:
498     @Name: _get_styleset_title
499     @Description:
500     @@@: Get "title" of the styleset
501     @@lang: en
502     @Main:
503     my (undef, %opt) = @_;
504     my $title;
505     if (not $opt{type}->{persistent}) {
506     $title = $opt{StyleSet}->get_attribute_value
507     ('DisplayName', default => '');
508     if (length $title) {
509     try {
510     $title = SuikaWiki::Plugin->formatter ('view_resource')
511     ->replace ($title,
512     param => $opt{o})
513     ->inner_text;
514     } catch Message::Util::Formatter::error with {
515     my $err = shift;
516     if ($err->{-object}->{-category_name} eq 'view_resource') {
517     my $wiki = $err->{option}->{param}->{wiki};
518     SuikaWiki::Plugin->module_package ('Error')
519     ->reporting_formatting_template_error
520     ($err, $wiki,
521     template => $title);
522     } else {
523     $err->throw;
524     }
525     $title ||= $opt{StyleSet}->get_attribute_value
526     ('Name', default => '');
527     };
528     } else {
529     $title = $opt{StyleSet}->get_attribute_value ('Name', default => '');
530     }
531     }
532     return $title;
533    
534     FormattingRule:
535     @Category[list]:
536     view
537     view-resource
538     form-input
539     @Name: select-user-preferred-mode
540     @Description:
541     @@@:
542     Select user preferred mode
543     @@lang: en
544     @Formatting:
545     my $list = [grep /^[0-9A-Za-z_]/, keys %{$o->{wiki}->{view}->{definition}}];
546     my $form = $p->{-parent}->append_new_node
547     (type => '#element',
548     namespace_uri => $NS_XHTML1,
549     local_name => 'form');
550     my $id = SuikaWiki::Plugin->module_package ('WikiFormCore')
551     ->control_id ($o,
552     local_id => 'spss--mode-selector',
553     require_local_id => 1);
554     $form->set_attribute (id => $id->{global_id});
555     my $div = $form->append_new_node
556     (type => '#element',
557     namespace_uri => $NS_XHTML1,
558     local_name => 'div');
559     my $parent = $div->append_new_node
560     (type => '#element',
561     namespace_uri => $NS_XHTML1,
562     local_name => 'select');
563     $parent->set_attribute (id => $id->{global_id}.'-list');
564    
565     my $default = $parent->append_new_node
566     (type => '#element',
567     namespace_uri => $NS_XHTML1,
568     local_name => 'option');
569     $default->set_attribute (value => 'default');
570     $default->append_text ($WIKIRESOURCE->get (name => 'Mode:Default',
571     o => $o, wiki => $o->{wiki}));
572     $default->set_attribute (selected => 'selected');
573    
574     for my $set (@$list) {
575     my $title = $WIKIRESOURCE->get (name => 'Mode:'.$set,
576     o => $o, wiki => $o->{wiki});
577     my $link = $parent->append_new_node
578     (type => '#element',
579     namespace_uri => $NS_XHTML1,
580     local_name => 'option');
581     $link->set_attribute (value => $set);
582     $link->append_text ($title);
583     $parent->append_text ("\n");
584     }
585    
586     for ($div->append_new_node (type => '#element',
587     namespace_uri => $NS_XHTML1,
588     local_name => 'input')) {
589     $_->set_attribute (type => 'button');
590     $_->set_attribute (id => $id->{global_id}.'-save');
591     $_->set_attribute (value => $WIKIRESOURCE->get
592     (name => 'Mode:Save',
593     o => $o, wiki => $o->{wiki}));
594     $_->set_attribute (class => 'save');
595     $_->option (use_EmptyElemTag => 1);
596     }
597     for ($div->append_new_node (type => '#element',
598     namespace_uri => $NS_XHTML1,
599     local_name => 'input')) {
600     $_->set_attribute (type => 'reset');
601     $_->set_attribute (id => $id->{global_id}.'-reset');
602     $_->set_attribute (value => $WIKIRESOURCE->get
603     (name => 'Mode:Reset',
604     o => $o, wiki => $o->{wiki}));
605     $_->set_attribute (class => 'reset');
606     $_->option (use_EmptyElemTag => 1);
607     }
608    
609     __ATTRTEXT:%expires__;
610 wakaba 1.2 my $cookie_path = $o->{wiki}->uri_reference->path;
611 wakaba 1.1 for ($div->append_new_node (type => '#element',
612     namespace_uri => $NS_XHTML1,
613     local_name => 'script')) {
614     $_->set_attribute (type => $o->{wiki}->{var}->{client}->{downgrade}
615     ->{media_type_no_app_js}
616     ? 'text/javascript'
617     : 'application/x-javascript');
618     $_->set_attribute (defer => 'defer');
619     $_->append_new_node (type => '#xml', value => <<EOH);
620    
621     function getCookieValue (name) {
622     var c = document.cookie.split(';');
623     for (var i = 0; c.length > i; i++) {
624     var v = c[i].split('=');
625     if (v[0].replace(/^\\s+/,'').replace(/\\s+\$/,'') == name) {
626     return decodeURIComponent (v[1].replace(/^\\s+/,'')
627     .replace(/\\s+\$/,''));
628     }
629     }
630     return '';
631     }
632    
633     document.getElementById ('$id->{global_id}-list').value
634     = getCookieValue('SelectedMode');
635     document.getElementById ('$id->{global_id}-save').onclick = function () {
636     var expires = new Date ();
637     expires.setTime (expires.getTime ()
638     + 1000*3600*24*@{[$p->{expires}||365]});
639     document.cookie = 'SelectedMode='
640     + encodeURIComponent
641     (document.getElementById('$id->{global_id}-list')
642     .value)
643     + ';path=$cookie_path;expires='
644     + expires.toGMTString ();
645     }
646     document.getElementById('$id->{global_id}-reset').onclick = function () {
647     var expires = new Date();
648     expires.setTime (expires.getTime() - 3600);
649     document.cookie = 'SelectedMode=;path=$cookie_path;expires='
650     + expires.toGMTString();
651     }
652    
653     EOH
654     }
655    
656     ViewFragment:
657     @Name: ht--stylesheets-html
658     @Order: 0
659     @Description:
660     @@@: Default stylesheets links
661     @@lang: en
662     @Formatting:
663     %styles-wiki-html;
664    
665     ViewFragment:
666     @Name: ht--pre-element-content
667     @Order: 0
668     @Description:
669     @@@: Default stylesheets links (as xml-stylesheet PIs)
670     @@lang: en
671     @Formatting:
672     %styles-wiki-xml (downgrade-html);
673    
674     ViewFragment:
675     @Name: ws--footer
676     @Order: 100000
677     @Description:
678     @@@: Apply user selected stylesheets
679     @@lang: en
680     @Formatting:
681     %apply-user-preferred-style;
682    
683     Resource:
684     @Mode:css:
685     @@@: Cascading Style Sheet output
686     @@lang: en
687     @Mode:Default:
688     @@@:
689     Default
690     @@lang: en
691     @Mode:Reset:
692     @@@: Reset default mode selection
693     @@lang: en
694     @Mode:Save:
695     @@@: Save default mode selection
696     @@lang: en
697     @Style:Default:
698     @@@:
699     Basic Page Style
700     @@: lang: en
701     @Style:Reset:
702     @@@:
703     Reset style selection
704     @@lang: en
705     @Style:Save:
706     @@@:
707     Save style selection
708     @@lang: en
709    
710    

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24