/[suikacvs]/webroot/gate/2007/html/WebHACC/Language/DOM.pm
Suika

Contents of /webroot/gate/2007/html/WebHACC/Language/DOM.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (show annotations) (download)
Thu Dec 11 05:11:11 2008 UTC (15 years, 5 months ago) by wakaba
Branch: MAIN
CVS Tags: HEAD
Changes since 1.9: +2 -1 lines
++ ChangeLog	11 Dec 2008 05:09:03 -0000
	* cc-about.en.html: Added links to Regexp modules.

	* cc-script.js: Adds a class name to |iframe| element used instead
	of XHR such that non-Ajax |iframe| element can be distinguished by
	style sheets.

	* cc-style.css: Displays non-Ajax |iframe| element.

	* error-description-source.en.xml: Added catalog entries for
	regexp graph sections.

	* standards.en.html: s/WDCC/WebHACC/g.  Added a subsection on
	regular expressions.

2008-12-11  Wakaba  <wakaba@suika.fam.cx>

++ html/WebHACC/Language/ChangeLog	11 Dec 2008 05:11:06 -0000
	* Table.pm: Bug fix: Subsections are no longer associated with tabs.

	* RegExpJS.pm: Implemented graphization of regular expressions.

2008-12-11  Wakaba  <wakaba@suika.fam.cx>

++ html/WebHACC/ChangeLog	11 Dec 2008 05:10:00 -0000
	* Output.pm (start_section): Don't output |script| element for tab
	control if not desired.

2008-12-11  Wakaba  <wakaba@suika.fam.cx>

1 package WebHACC::Language::DOM;
2 use strict;
3 require WebHACC::Language::Base;
4 push our @ISA, 'WebHACC::Language::Base';
5
6 use Scalar::Util qw[refaddr];
7
8 sub generate_structure_dump_section ($) {
9 my $self = shift;
10
11 my $out = $self->output;
12
13 $out->start_section (role => 'tree');
14
15 $out->start_tag ('ol', class => 'xoxo');
16
17 my @node = ($self->{structure});
18 while (@node) {
19 my $child = shift @node;
20 unless (ref $child) {
21 $out->html ($child);
22 next;
23 }
24
25 my $node_id = 'node-'.refaddr $child;
26 my $nt = $child->node_type;
27 if ($nt == $child->ELEMENT_NODE) {
28 my $child_nsuri = $child->namespace_uri;
29 $out->start_tag ('li', id => $node_id, class => 'tree-element');
30 $out->start_tag ('code',
31 title => defined $child_nsuri ? $child_nsuri : '');
32 $out->text ($child->tag_name); ## TODO: case
33 $out->end_tag ('code');
34
35 if ($child->has_attributes) {
36 $out->start_tag ('ul', class => 'attributes');
37 for my $attr (sort {$a->[0] cmp $b->[0]} map { [$_->name, $_->value, $_->namespace_uri, 'node-'.refaddr $_] }
38 @{$child->attributes}) {
39 $out->start_tag ('li', id => $attr->[3], class => 'tree-attribute');
40 $out->start_tag ('code',
41 title => defined $attr->[2] ? $attr->[2] : '');
42 $out->html ($attr->[0]); ## ISSUE: case
43 $out->end_tag ('code');
44 $out->text (' = ');
45 $out->start_tag ('q');
46 $out->text ($attr->[1]); ## TODO: children
47 $out->end_tag ('q');
48 }
49 $out->end_tag ('ul');
50 }
51
52 if ($child->has_child_nodes) {
53 $out->start_tag ('ol', class => 'children');
54 unshift @node, @{$child->child_nodes}, '</ol></li>';
55 }
56 } elsif ($nt == $child->TEXT_NODE) {
57 $out->start_tag ('li', id => $node_id, class => 'tree-text');
58 $out->start_tag ('q', lang => '');
59 $out->text ($child->data);
60 $out->end_tag ('q');
61 } elsif ($nt == $child->CDATA_SECTION_NODE) {
62 $out->start_tag ('li', id => $node_id, class => 'tree-cdata');
63 $out->start_tag ('code');
64 $out->text ('<![CDATA[');
65 $out->end_tag ('code');
66 $out->start_tag ('q', lang => '');
67 $out->text ($child->data);
68 $out->end_tag ('q');
69 $out->start_tag ('code');
70 $out->text (']]>');
71 $out->end_tag ('code');
72 } elsif ($nt == $child->COMMENT_NODE) {
73 $out->start_tag ('li', id => $node_id, class => 'tree-cdata');
74 $out->start_tag ('code');
75 $out->text ('<!--');
76 $out->end_tag ('code');
77 $out->start_tag ('q', lang => '');
78 $out->text ($child->data);
79 $out->end_tag ('q');
80 $out->start_tag ('code');
81 $out->text ('-->');
82 $out->end_tag ('code');
83 } elsif ($nt == $child->DOCUMENT_NODE) {
84 $out->start_tag ('li', id => $node_id, class => 'tree-document');
85 $out->nl_text ('Document');
86
87 $out->start_tag ('ul', class => 'attributes');
88
89 my $cp = $child->manakai_charset;
90 if (defined $cp) {
91 $out->start_tag ('li');
92 $out->nl_text ('manakaiCharset');
93 $out->text (' = ');
94 $out->code ($cp);
95 }
96
97 $out->start_tag ('li');
98 $out->nl_text ('inputEncoding');
99 $out->text (' = ');
100 my $ie = $child->input_encoding;
101 if (defined $ie) {
102 $out->code ($ie);
103 if ($child->manakai_has_bom) {
104 $out->nl_text ('... with BOM');
105 }
106 } else {
107 $out->html (qq[(<code>null</code>)]);
108 }
109
110 $out->start_tag ('li');
111 $out->nl_text ('manakaiIsHTML:'.($child->manakai_is_html?1:0));
112
113 $out->start_tag ('li');
114 $out->nl_text ('manakaiCompatMode:'.$child->manakai_compat_mode);
115
116 unless ($child->manakai_is_html) {
117 $out->start_tag ('li');
118 $out->nl_text ('xmlVersion');
119 $out->text (' = ');
120 $out->code ($child->xml_version);
121
122 $out->start_tag ('li');
123 $out->nl_text ('xmlEncoding');
124 $out->text (' = ');
125 if (defined $child->xml_encoding) {
126 $out->code ($child->xml_encoding);
127 } else {
128 $out->html ('(<code>null</code>)');
129 }
130
131 $out->start_tag ('li');
132 $out->nl_text ('xmlStandalone');
133 $out->text (' = ');
134 $out->code ($child->xml_standalone ? 'true' : 'false');
135 }
136
137 $out->end_tag ('ul');
138
139 if ($child->has_child_nodes) {
140 $out->start_tag ('ol', class => 'children');
141 unshift @node, @{$child->child_nodes}, '</ol></li>';
142 }
143 } elsif ($nt == $child->DOCUMENT_TYPE_NODE) {
144 $out->start_tag ('li', id => $node_id, class => 'tree-doctype');
145 $out->code ('<!DOCTYPE>');
146 $out->start_tag ('ul', class => 'attributes');
147
148 $out->start_tag ('li', class => 'tree-doctype-name');
149 $out->text ('Name = ');
150 $out->code ($child->name);
151
152 $out->start_tag ('li', class => 'tree-doctype-publicid');
153 $out->text ('Public identifier = ');
154 $out->code ($child->public_id);
155
156 $out->start_tag ('li', class => 'tree-doctype-systemid');
157 $out->text ('System identifier = ');
158 $out->code ($child->system_id);
159
160 $out->end_tag ('ul');
161 } elsif ($nt == $child->PROCESSING_INSTRUCTION_NODE) {
162 $out->start_tag ('li', id => $node_id, class => 'tree-id');
163 $out->code ('<?');
164 $out->code ($child->target);
165 $out->text (' ');
166 $out->code ($child->data);
167 $out->code ('?>');
168 } else { # error
169 $out->start_tag ('li', id => $node_id, class => 'tree-unknown');
170 $out->text ($child->node_type . ' ' . $child->node_name);
171 }
172 }
173 $out->end_tag ('ol');
174
175 $out->end_section;
176 } # generate_structure_dump_section
177
178 sub generate_structure_error_section ($) {
179 my $self = shift;
180
181 my $out = $self->output;
182 $out->start_section (role => 'structure-errors');
183 $out->start_error_list (role => 'structure-errors');
184 $self->result->layer_applicable ('structure');
185
186 my $input = $self->input;
187 my $result = $self->result;
188
189 require Whatpm::ContentChecker;
190 my $onerror = sub {
191 $result->add_error (layer => 'structure', @_);
192 };
193
194 my $onsubdoc = $self->onsubdoc;
195 if ($self->{structure}->node_type == $self->{structure}->ELEMENT_NODE) {
196 $self->{add_info} = Whatpm::ContentChecker->check_element
197 ($self->{structure}, $onerror, $onsubdoc);
198 } else {
199 $self->{add_info} = Whatpm::ContentChecker->check_document
200 ($self->{structure}, $onerror, $onsubdoc);
201 }
202
203 $out->end_error_list (role => 'structure-errors');
204 $out->end_section;
205
206 $self->result->layer_uncertain ('semantics');
207 } # generate_structure_error_section
208
209 sub generate_additional_sections ($) {
210 my $self = shift;
211 $self->SUPER::generate_additional_sections;
212
213 $self->generate_table_section;
214
215 $self->generate_listing_section (
216 key => 'id', id => 'identifiers',
217 short_title => 'IDs', title => 'Identifiers',
218 );
219 $self->generate_listing_section (
220 key => 'term', id => 'terms',
221 short_title => 'Terms', title => 'Terms',
222 );
223 $self->generate_listing_section (
224 key => 'class', id => 'classes',
225 short_title => 'Classes', title => 'Classes',
226 );
227
228 $self->generate_rdf_section;
229 } # generate_additional_sections
230
231 sub generate_table_section ($) {
232 my $self = shift;
233
234 my $tables = $self->{add_info}->{table} || [];
235 return unless @$tables;
236
237 my $out = $self->output;
238 $out->start_section (id => 'tables', short_title => 'Tables',
239 title => 'Tables Section');
240
241 $out->html (q[<!--[if IE]><script type="text/javascript" src="../excanvas.js"></script><![endif]-->
242 <script src="../table-script.js" type="text/javascript"></script>
243 <noscript>
244 <p><em>Structure of tables are visualized here if scripting is enabled.</em></p>
245 </noscript>]);
246
247 require JSON;
248
249 my $i = 0;
250 for my $table (@$tables) {
251 $i++;
252 my $index = $out->input->full_subdocument_index;
253 $index = $index ? $index . '.' . $i : $i;
254 $out->start_section (id => 'table-' . $i,
255 title => 'Table #',
256 text => $index,
257 notab => 1);
258
259 $out->start_tag ('dl');
260 $out->dt ('Table Element');
261 $out->start_tag ('dd');
262 $out->node_link ($table->{element});
263 $out->end_tag ('dl');
264 delete $table->{element};
265
266 for (@{$table->{column_group}}, @{$table->{column}}, $table->{caption},
267 @{$table->{row}}) {
268 next unless $_;
269 delete $_->{element};
270 }
271
272 for (@{$table->{row_group}}) {
273 next unless $_;
274 next unless $_->{element};
275 $_->{type} = $_->{element}->manakai_local_name;
276 delete $_->{element};
277 }
278
279 for (@{$table->{cell}}) {
280 next unless $_;
281 for (@{$_}) {
282 next unless $_;
283 for (@$_) {
284 $_->{id} = refaddr $_->{element} if defined $_->{element};
285 delete $_->{element};
286 $_->{is_header} = $_->{is_header} ? 1 : 0;
287 }
288 }
289 }
290
291 my $id_prefix = $self->input->id_prefix;
292 $out->script (q[tableToCanvas (] .
293 JSON::objToJson ($table) .
294 q[, document.getElementById ('] . $id_prefix . 'table-' . $i . q[')] .
295 q[, '] . $id_prefix . q[');]);
296
297 $out->end_section;
298 }
299
300 $out->end_section;
301 } # generate_table_section
302
303 sub generate_listing_section ($%) {
304 my $self = shift;
305 my %opt = @_;
306
307 my $list = $self->{add_info}->{$opt{key}} || {};
308 return unless keys %$list;
309
310 my $out = $self->output;
311
312 $out->start_section (id => $opt{id},
313 title => $opt{title},
314 short_title => $opt{short_title});
315 $out->start_tag ('dl');
316
317 for my $id (sort {$a cmp $b} keys %$list) {
318 $out->start_tag ('dt');
319 $out->code ($id);
320 for (@{$list->{$id}}) {
321 $out->start_tag ('dd');
322 $out->node_link ($_);
323 }
324 }
325
326 $out->end_tag ('dl');
327 $out->end_section;
328 } # generate_listing_section
329
330 my $generate_rdf_resource_html = sub ($$) {
331 my ($resource, $out) = @_;
332
333 if (defined $resource->{uri}) {
334 $out->url ($resource->{uri});
335 } elsif (defined $resource->{bnodeid}) {
336 $out->text ('_:' . $resource->{bnodeid});
337 } elsif ($resource->{nodes}) {
338 $out->text ('(rdf:XMLLiteral)');
339 } elsif (defined $resource->{value}) {
340 $out->start_tag ('q',
341 lang => defined $resource->{language}
342 ? $resource->{language} : '');
343 $out->text ($resource->{value});
344 $out->end_tag ('q');
345
346 if (defined $resource->{datatype}) {
347 $out->text ('^^');
348 $out->url ($resource->{datatype});
349 } elsif (length $resource->{language}) {
350 $out->text ('@' . $resource->{language});
351 }
352 } else {
353 $out->text ('??'); ## NOTE: An error of the implementation.
354 }
355 }; # $generate_rdf_resource_html
356
357 ## TODO: Should we move this method to another module,
358 ## such as Base or RDF?
359 sub generate_rdf_section ($) {
360 my $self = shift;
361
362 my $list = $self->{add_info}->{rdf} || [];
363 return unless @$list;
364
365 my $out = $self->output;
366 $out->start_section (id => 'rdf', short_title => 'RDF',
367 title => 'RDF Triples');
368 $out->start_tag ('dl');
369
370 my $i = 0;
371 for my $rdf (@$list) {
372 $out->start_tag ('dt', id => 'rdf-' . $i++);
373 $out->node_link ($rdf->[0]);
374 $out->start_tag ('dd');
375 $out->start_tag ('dl');
376 for my $triple (@{$rdf->[1]}) {
377 $out->start_tag ('dt');
378 $out->node_link ($triple->[0]);
379 $out->start_tag ('dd');
380 $out->nl_text ('Subject');
381 $out->text (': ');
382 $generate_rdf_resource_html->($triple->[1] => $out);
383 $out->start_tag ('dd');
384 $out->nl_text ('Predicate');
385 $out->text (': ');
386 $generate_rdf_resource_html->($triple->[2] => $out);
387 $out->start_tag ('dd');
388 $out->nl_text ('Object');
389 $out->text (': ');
390 $generate_rdf_resource_html->($triple->[3] => $out);
391 }
392 $out->end_tag ('dl');
393 }
394 $out->end_tag ('dl');
395 $out->end_section;
396 } # generate_rdf_section
397
398 1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24