/[pub]/suikawiki/script/lib/SuikaWiki/Plugin/WikiResource.wp2
Suika

Contents of /suikawiki/script/lib/SuikaWiki/Plugin/WikiResource.wp2

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations) (download)
Sun Feb 1 12:19:16 2004 UTC (21 years, 3 months ago) by wakaba
Branch: MAIN
Changes since 1.3: +35 -4 lines
Use try..catch for WikiDB

1 wakaba 1.1 #?SuikaWikiConfig/2.0
2    
3     Plugin:
4     @Name: WikiResource
5     @Description:
6     @@@: Wiki resource text support
7     @@lang:en
8     @License: %%GPL%%
9     @Author:
10     @@Name:
11     @@@@: Wakaba
12     @@@lang:ja
13     @@@script:Latn
14     @@Mail[list]: w@suika.fam.cx
15 wakaba 1.4 @Date.RCS: $Date: 2004/01/16 07:47:04 $
16 wakaba 1.3 @RequiredPlugin[list]:
17     SuikaWikiConst09
18 wakaba 1.2 @Use:
19     use Message::Util::Error;
20 wakaba 1.4 my $RESOURCE_CACHE;
21 wakaba 1.1
22     PluginConst:
23     @NS_XHTML1:
24     http://www.w3.org/1999/xhtml
25    
26     FormattingRule:
27     @Category[list]:
28     view
29     view-resource
30     page-link
31 wakaba 1.3 link-to-resource
32 wakaba 1.1 form-input
33     form-template
34     @Name: res
35     @Description:
36     @@@: Resource
37     @@lang: en
38     @Parameter:
39     @@Name: name
40     @@Type: CDATA
41     @@Default: #REQUIRED
42     @@Description:
43     @@@@: Resource name
44     @@@lang:en
45     @Formatting:
46     __ATTRTEXT:%name__;
47 wakaba 1.3 __FUNCPACK__->get (name => $p->{name},
48     wiki => $o->{wiki},
49     formatter_context => 'view_resource',
50     formatter_option => {param => $o,
51     -parent => $p->{-parent}});
52 wakaba 1.1
53 wakaba 1.4 FormattingRule:
54     @Category[list]:
55     view
56     view-resource
57     page-link
58     link-to-resource
59     form-input
60     form-template
61     @Name: resource-as-plain-text
62     @Description:
63     @@@: Resource
64     @@lang: en
65     @Parameter:
66     @@Name: name
67     @@Type: CDATA
68     @@Default: #REQUIRED
69     @@Description:
70     @@@@: Resource name
71     @@@lang:en
72     @Formatting:
73     __ATTRTEXT:%name__;
74     __FUNCPACK__->get (name => $p->{name},
75     wiki => $o->{wiki});
76    
77 wakaba 1.2 Function:
78     @Name: logging_template_error
79     @Description:
80     @@@:
81     Logging formatting-template-text error
82     @@lang:en
83     @Main:
84     my (undef, $err, $wiki, %opt) = @_;
85     my $error = {};
86     my $dl = $error->{description}
87     = new Message::Markup::XML::Node
88     (type => '#element',
89     namespace_uri => $NS_XHTML1,
90     local_name => 'dl');
91     ## TODO: Use resource
92     $dl->append_new_node (type => '#element',
93     namespace_uri => $NS_XHTML1,
94     local_name => 'dt')
95     ->append_text ('Resource name');
96     $dl->append_new_node (type => '#element',
97     namespace_uri => $NS_XHTML1,
98     local_name => 'dd')
99     ->append_text ($opt{resource_name});
100     $dl->append_new_node (type => '#element',
101     namespace_uri => $NS_XHTML1,
102     local_name => 'dt')
103     ->append_text ('Error condition');
104     $dl->append_new_node (type => '#element',
105     namespace_uri => $NS_XHTML1,
106     local_name => 'dd')
107     ->append_text ($err->text);
108     $dl->append_new_node (type => '#element',
109     namespace_uri => $NS_XHTML1,
110     local_name => 'dt')
111     ->append_text ('Formatting context');
112     $dl->append_new_node (type => '#element',
113     namespace_uri => $NS_XHTML1,
114     local_name => 'dd')
115     ->append_text (qq($err->{-formatter}->{-category_name}));
116    
117     push @{$wiki->{var}->{error}||=[]}, $error;
118 wakaba 1.3
119     Function:
120     @Name: get_text
121     @Main:
122     my (undef, %opt) = @_;
123     __FUNCPACK__->get (%opt);
124     ## TODO: Implements formatter.
125    
126     Function:
127     @Name: append_node
128     @Main:
129     my (undef, %opt) = @_;
130     __FUNCPACK__->get (%opt, formatter_context => 'view_resource',
131     formatter_option => {param => $opt{param},
132     -parent => $opt{parent}});
133    
134     Function:
135     @Name: get
136     @Main:
137     my (undef, %opt) = @_;
138    
139    
140    
141     my $text = __FUNCPACK__->temp_get_resource_text
142     (resource_ns => [qw/Wiki Resource/],
143     name => $opt{name},
144     wiki => $opt{wiki});
145     if (defined $text) {
146     #
147     } elsif (defined $opt{defailt}) {
148     $text = $opt{default};
149     } else {
150     $text = $opt{name};
151     }
152    
153     return $text unless $opt{formatter_context};
154     try {
155     $text = SuikaWiki::Plugin->formatter ($opt{formatter_context})
156     ->replace ($text, %{$opt{formatter_option}});
157     } catch Message::Util::Formatter::error with {
158     my $err = shift;
159     if ($err->{-formatter}->{-category_name} eq $opt{formatter_context}) {
160     __FUNCPACK__->logging_template_error ($err,
161     $err->{-option}->{param}->{wiki},
162     resource_name => $opt{name});
163     undef;
164     } else {
165     $err->throw;
166     }
167     };
168     return $text;
169    
170     Function:
171     @Name: temp_get_resource_text
172     @Main:
173     my (undef, %opt) = @_;
174 wakaba 1.4 CORE::die "Buggy implementation: \$opt{wiki} required ".Carp::longmess()
175     unless ref $opt{wiki};
176 wakaba 1.3 $opt{accept_language} ||= __FUNCPACK__->temp_get_accept_language (%opt);
177 wakaba 1.4 $opt{resource} ||= $RESOURCE_CACHE ||= {};
178 wakaba 1.3 my $v;
179     for my $lang (sort {$opt{accept_language}->{$b} <=>
180     $opt{accept_language}->{$a}}
181     grep {$opt{accept_language}->{$_} != 0}
182     keys %{$opt{accept_language}}) {
183     while (length $lang) {
184     unless ($opt{accept_language}->{defined $opt{accept_language}->{$lang}
185     ? $lang : '*'} == 0) {
186     ## WikiPage defined resource text (SuikaWikiConst/0.9)
187 wakaba 1.4 if (not $opt{resource}->{$lang} and ref $opt{wiki}->{db}) {
188     try {
189     $v = $opt{wiki}->{db}->get (content => [@{$opt{resource_ns}}, $lang]);
190     } catch SuikaWiki::DB::Util::Error with {
191     $v = undef;
192     };
193 wakaba 1.3 $opt{resource}->{$lang} = {};
194     SuikaWiki::Plugin->module_package ('SuikaWikiConst09')
195     ->text_to_hash (text => \$v,
196     hash => $opt{resource}->{$lang});
197     }
198     $v = $opt{resource}->{$lang}->{$opt{name}};
199     last if defined $v;
200     ## WikiPlugin defined resource text (SuikaWiki 3 WikiPlugin)
201     if (defined $SuikaWiki::Plugin::Resource::BaseResource->{$lang}->{''}->{$opt{name}}) {
202     $v = $SuikaWiki::Plugin::Resource::BaseResource->{$lang}->{''}->{$opt{name}};
203     last;
204     }
205     }
206     $lang =~ s/[^+-]*$//; $lang =~ s/[+-]$//;
207     }
208     last if defined $v;
209     } # Accepted languages
210     if (defined $v) {
211     return $v;
212     } else {
213     ## Plugin defined resource text or undef
214     return $SuikaWiki::Plugin::Resource::BaseResource->{und}->{''}->{$opt{name}};
215     }
216    
217     Function:
218     @Name: temp_get_accept_language
219     @Main:
220     my (undef, %opt) = @_;
221     my %alang = (ja => 0.0002, en => 0.0001);
222     if ($opt{wiki}->{var}->{client}->{user_agent_name} =~ m#^Mozilla/0\.#) {
223     $alang{ja} = 0.00001;
224     }
225     my $i = 0.1;
226     for (split /\s*,\s*/, $opt{wiki}->{input}->meta_variable ('HTTP_ACCEPT_LANGUAGE')) {
227     tr/\x09\x0A\x0D\x20//d;
228     if (/((?:(?!;q=).)+)(?:;q="?([0-9.]+)"?)?/) {
229     my $l = lc $1; $l =~ tr/\x22\x5C//d;
230     $alang{$l} = (defined $2 ? $2 : 1.000)*1000;
231     $alang{$l} += $i unless $alang{$l} == 0;
232     $i -= 0.001;
233     }
234     }
235     return \%alang;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24