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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by wakaba, Sun Feb 8 08:44:13 2004 UTC revision 1.9 by wakaba, Sun Dec 5 12:57:37 2004 UTC
# Line 5  Plugin: Line 5  Plugin:
5    @Description:    @Description:
6      @@@: Stylesheet support      @@@: Stylesheet support
7      @@lang:en      @@lang:en
8    @License: %%GPL%%    @License: %%Perl%%
9    @Author:    @Author:
10      @@Name:      @@Name:
11        @@@@: Wakaba        @@@@: Wakaba
12        @@@lang:ja        @@@lang:ja
13        @@@script:Latn        @@@script:Latn
14      @@Mail[list]: w@suika.fam.cx      @@Mail[list]: w@suika.fam.cx
15    @Date.RCS: $Date$    @Date.RCS:
16    @RequiredModule[list]:      $Date$
17    @RequiredPlugin[list]:    @RequiredPlugin[list]:
18      Error      Error
19      HTML      HTML
20      @RequiredModule[list]:
21        URI
22    @Use:    @Use:
23        use URI;
24      use Message::Util::Error;      use Message::Util::Error;
25      my $WIKIRESOURCE;      my $WIKIRESOURCE;
26      @Namespace:
27        @@ss:
28          http://suika.fam.cx/~wakaba/archive/2004/05/sw-stylesheet#
29        @@media-type:
30          http://suika.fam.cx/~wakaba/-temp/2004/04/24/mt#
31        @@edit:
32          http://suika.fam.cx/~wakaba/-temp/2004/7/25/sw-edit#
33    
34  PluginConst:  PluginConst:
35    @NS_XHTML1:    @NS_XHTML1:
# Line 65  Format: Line 75  Format:
75        $node->append_text ($$source);        $node->append_text ($$source);
76        return $node;        return $node;
77    
78      @content_written:
79        @@Main:
80          if ($opt{wiki}->{config}->{<Q:ss:use-static>}) {
81            $opt{wiki}->{db}->set (static__css => $opt{page} => ${$opt{new_content}});
82          }
83    
84      @content_removed:
85        @@Main:
86          if ($opt{wiki}->{config}->{<Q:ss:use-static>}) {
87            $opt{wiki}->{db}->delete (static__css => $opt{page});
88          }
89    
90      @content_type_changed_from:
91        @@Main:
92          if ($opt{wiki}->{config}->{<Q:ss:use-static>}) {
93            $opt{wiki}->{db}->delete (static__css => $opt{page});
94          }
95    
96      @Prop:
97        @@edit:new-mode--edit: edit
98        @@edit:new-mode--adminedit: adminedit
99    
100  ViewDefinition:  ViewDefinition:
101    @Mode: css    @Mode: css
102    @Condition:    @Condition:
# Line 122  FormattingRule: Line 154  FormattingRule:
154                  : $dg->{ua_winie30}   ? 'WinIE3.0'                  : $dg->{ua_winie30}   ? 'WinIE3.0'
155                  :                       1;                  :                       1;
156      }      }
157    
158        my $mkuri = $o->{wiki}->{config}->{<Q:ss:wikiname-to-uri>} ||
159     \               \&__FUNCPACK__::generate_uri;
160            
161      for my $set (@{$list->child_nodes}) {      for my $set (@{$list->child_nodes}) {
162        if ($set->local_name eq 'StyleSet') {        if ($set->local_name eq 'StyleSet') {
163            my $apply = $set->get_attribute_value ('Apply',
164                                                   default => ['alternate'],
165                                                   as_array => 1);
166          my $type = {          my $type = {
167                      map {$_ => 1}                       map {$_ => 1}
168                      map {ref $_ ? @$_ : [$_]}     \                 @$apply
                     $set->get_attribute_value ('Apply', default => ['alternate'])  
169                     };                     };
170          next if $ua_apply and not $type->{$ua_apply};          next if $ua_apply and not $type->{$ua_apply};
171          my $rel = $type->{alternate} ? 'alternate stylesheet' : 'stylesheet';          my $rel = $type->{alternate} ? 'alternate stylesheet' : 'stylesheet';
# Line 137  FormattingRule: Line 174  FormattingRule:
174                                       type => $type);                                       type => $type);
175          for my $sheet (@{$set->child_nodes}) {          for my $sheet (@{$set->child_nodes}) {
176            if ($sheet->local_name eq 'StyleSheet') {            if ($sheet->local_name eq 'StyleSheet') {
177                my $stype = {
178                        map {$_ => 1}
179      \                 @{$sheet->get_attribute_value ('Apply', default => $apply,
180                                                       as_array => 1)}
181                       };
182                next if $ua_apply and not $stype->{$ua_apply};
183                next if not $ua_apply and (not $stype->{alternate} and
184                                           not $stype->{preferred} and
185                                           not $stype->{persistent});
186              my $link = $parent->append_new_node              my $link = $parent->append_new_node
187                                    (type => '#element',                                    (type => '#element',
188                                     namespace_uri => $NS_XHTML1,                                     namespace_uri => $NS_XHTML1,
# Line 152  FormattingRule: Line 198  FormattingRule:
198                my $media_descriptor = $sheet->get_attribute_value ('Media');                my $media_descriptor = $sheet->get_attribute_value ('Media');
199                $link->set_attribute (media => $media_descriptor || 'all');                $link->set_attribute (media => $media_descriptor || 'all');
200              }              }
201              my $mode = 'css'; ## ISSUE: Make this media-type independent!              my $uri = $mkuri->(undef, o => $o, wiki => $o->{wiki},
202              $link->set_attribute                                 wikiname => $o->{wiki}->name
203                       (href => $o->{wiki}->uri_reference                                           ($sheet->get_attribute_value
                                 (page => $o->{wiki}->name  
                                            ($sheet->get_attribute_value  
204                                                ('WikiPage', default => '')),                                                ('WikiPage', default => '')),
205                                   mode => $mode,                                 mode => 'css'); ## ISSUE: Make this media-type independent!
206                                   with_lm => 1, base => 1));              $link->set_attribute (href => $uri);
207              $parent->append_text ("\n");              $parent->append_text ("\n");
208            }            }
209          }          }
# Line 207  FormattingRule: Line 251  FormattingRule:
251      return unless $list;      return unless $list;
252      my $parent = $p->{-parent};      my $parent = $p->{-parent};
253    
254        my $mkuri = $o->{wiki}->{config}->{<Q:ss:wikiname-to-uri>} ||
255     \               \&__FUNCPACK__::generate_uri;
256        
257      for my $set (@{$list->child_nodes}) {      for my $set (@{$list->child_nodes}) {
258        if ($set->local_name eq 'StyleSet') {        if ($set->local_name eq 'StyleSet') {
259          my $type = {map {$_ => 1}          my $apply = $set->get_attribute_value
260                     @{                               ('Apply', default => ['alternate'],
261                     $set->get_attribute_value ('Apply', default => ['alternate'])                                as_array => 1);
262                     }};          my $type = {map {$_ => 1} @$apply};
263          my $rel = $type->{alternate} ? 'alternate stylesheet' : 'stylesheet';          my $rel = $type->{alternate} ? 'alternate stylesheet' : 'stylesheet';
264          my $title = __FUNCPACK__->_get_styleset_title          my $title = __FUNCPACK__->_get_styleset_title
265                                      (StyleSet => $set, o => $o,                                      (StyleSet => $set, o => $o,
266                                       type => $type);                                       type => $type);
267          for my $sheet (@{$set->child_nodes}) {          for my $sheet (@{$set->child_nodes}) {
268            if ($sheet->local_name eq 'StyleSheet') {            if ($sheet->local_name eq 'StyleSheet') {
269                my $stype = {
270                        map {$_ => 1}
271     \                  @{$sheet->get_attribute_value ('Apply', default => $apply,
272                                                       as_array => 1)}
273                       };
274                next if (not $stype->{alternate} and
275                         not $stype->{preferred} and
276                         not $stype->{persistent});
277              my $link = $parent->append_new_node              my $link = $parent->append_new_node
278                                    (type => '#pi',                                    (type => '#pi',
279                                     local_name => 'xml-stylesheet');                                     local_name => 'xml-stylesheet');
# Line 235  FormattingRule: Line 290  FormattingRule:
290                my $media_descriptor = $sheet->get_attribute_value ('Media');                my $media_descriptor = $sheet->get_attribute_value ('Media');
291                $link->set_attribute (media => $media_descriptor || 'all');                $link->set_attribute (media => $media_descriptor || 'all');
292              }              }
293              my $mode = 'css'; ## ISSUE: Make this media-type independent!              my $uri = $mkuri->(undef, o => $o, wiki => $o->{wiki},
294              $link->set_attribute                                 wikiname => $o->{wiki}->name
295                       (href => $o->{wiki}->uri_reference                                           ($sheet->get_attribute_value
                                 (page => $o->{wiki}->name  
                                            ($sheet->get_attribute_value  
296                                                ('WikiPage', default => '')),                                                ('WikiPage', default => '')),
297                                   mode => $mode,                                 lm => time,     ## TODO: Should be last-modified
298                                   with_lm => 1));                                 mode => 'css'); ## ISSUE: Make this media-type independent!
299                $link->set_attribute (href => $uri);
300              $parent->append_text ("\n");              $parent->append_text ("\n");
301            }            }
302          }          }
303        }        }
304      }      }
305    
306    Function:
307      @Name: generate_uri
308      @Description:
309        @@@: Default generator for stylesheet URI
310        @@lang: en
311      @Main:
312        my (undef, %opt) = @_;
313        return $opt{wiki}->uri_reference
314                                    (page => $opt{wikiname},
315                                     mode => $opt{mode},
316                                     with_lm => 1, base => 1);
317    
318    ViewDefinition:
319      @Mode: ss--no-static
320      @Condition:
321        @@http-method[list]:
322          GET
323          HEAD
324          POST
325      @Description:
326        @@@: Generate static version
327        @@lang: en
328      @method:
329        @@Name: main
330        @@@:
331          require SuikaWiki::Output::HTTP;
332          my $wiki = $self->{view}->{wiki};
333          $wiki->init_db;
334    
335          GENSTATIC: {
336            last GENSTATIC unless ref $wiki->{config}->{<Q:ss:uri-to-wikiname>} and
337                                  $wiki->{config}->{<Q:ss:use-static>} and
338                                  $wiki->{db} and $wiki->{input};
339            my $uri = $wiki->{input}->meta_variable ('REDIRECT_URL');
340            last GENSTATIC unless $uri;
341            my $wn = $wiki->{config}->{<Q:ss:uri-to-wikiname>}
342                          ->(undef, wiki => $wiki,
343                             uri => URI->new ($uri));
344    
345            my $prop = $wiki->{db}->get (content_prop => $wn);
346            my $mt = $prop->get_attribute_value (<Q:media-type:media-type>,
347                                                 default => '--');
348            last GENSTATIC unless $mt eq 'IMT:text/css##';
349            
350            $wiki->{db}->set (static__css => $wn =>
351                              $wiki->{db}->get (content => $wn));
352    
353            $uri = $wiki->{config}->{<Q:ss:wikiname-to-uri>}
354                        ->(undef, wiki => $wiki,
355                           wikiname => $wn);
356            $uri = $uri->abs ($wiki->uri_reference);
357            $uri->query (time);
358            
359            my $output = new SuikaWiki::Output::HTTP (wiki => $wiki);
360            $output->set_redirect (uri => $uri, status_code => 303,
361                                   status_phrase => 'Created');
362            $output->output (output => 'http-cgi');
363            
364            return;
365          }
366          my $output = new SuikaWiki::Output::HTTP (wiki => $wiki);
367          $output->{status_code} = 404;
368          $output->{entity}->{media_type} = 'text/plain';
369          $output->{entity}->{body} = '404';
370          $output->output (output => 'http-cgi');
371    
372  FormattingRule:  FormattingRule:
373    @Category[list]:    @Category[list]:
374      view      view
# Line 352  FormattingRule: Line 472  FormattingRule:
472      }      }
473            
474      __ATTRTEXT:%expires__;      __ATTRTEXT:%expires__;
475      my $cookie_path = '/';  ## ISSUE: Need some mechanism      my $cookie_path = $o->{wiki}->uri_reference->path;
476      for ($div->append_new_node (type => '#element',      for ($div->append_new_node (type => '#element',
477                                  namespace_uri => $NS_XHTML1,                                  namespace_uri => $NS_XHTML1,
478                                  local_name => 'script')) {                                  local_name => 'script')) {
# Line 464  Function: Line 584  Function:
584    @Main:    @Main:
585      my (undef, %opt) = @_;      my (undef, %opt) = @_;
586      my $content;      my $content;
587        my $content_prop;
588      if ($opt{wiki}->{db}) {      if ($opt{wiki}->{db}) {
589        try {        try {
590          $content = $opt{wiki}->{db}->get (content => $opt{page});          $content = $opt{wiki}->{db}->get (content => $opt{page});
591            $content_prop = $opt{wiki}->{db}->get (content_prop => $opt{page});
592        } catch SuikaWiki::DB::Util::Error with {        } catch SuikaWiki::DB::Util::Error with {
593            my $err = shift;
594            $err->throw if $err->{-type} eq 'ERROR_REPORTED';
595          $content = undef;          $content = undef;
596        };        };
597      }      }
598      my $format = SuikaWiki::Plugin->module_package ('WikiFormat')      my $format = SuikaWiki::Plugin->module_package ('WikiFormat')
599                                    ->handler (\$content,                                    ->handler (\$content,
600                                                 content_prop => $content_prop,
601                                               o => $opt{o},                                               o => $opt{o},
602                                               wiki => $opt{o}->{wiki});                                               wiki => $opt{o}->{wiki});
603      my $cfg;      my $cfg;
# Line 607  FormattingRule: Line 732  FormattingRule:
732      }      }
733            
734      __ATTRTEXT:%expires__;      __ATTRTEXT:%expires__;
735      my $cookie_path = '/';  ## ISSUE: Need some mechanism      my $cookie_path = $o->{wiki}->uri_reference->path;
736      for ($div->append_new_node (type => '#element',      for ($div->append_new_node (type => '#element',
737                                  namespace_uri => $NS_XHTML1,                                  namespace_uri => $NS_XHTML1,
738                                  local_name => 'script')) {                                  local_name => 'script')) {
# Line 706  Resource: Line 831  Resource:
831      @@@:      @@@:
832        Save style selection        Save style selection
833      @@lang: en      @@lang: en
834      @WikiFormat:MediaType:Description:IMT:text/css##:
835        @@@: CSS (Cascading Style Sheets)
836        @@lang: en
837      @WikiFormat:MediaType:Label:IMT:text/css##:
838        @@@: CSS
839        @@lang: en
840    
841    

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.9

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24