/[suikacvs]/messaging/manakai/bin/mkdisdump.pl
Suika

Contents of /messaging/manakai/bin/mkdisdump.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (hide annotations) (download)
Sat Sep 17 15:03:02 2005 UTC (19 years, 2 months ago) by wakaba
Branch: MAIN
Changes since 1.5: +5 -2 lines
File MIME type: text/plain
Perl-related methods moved from DIS to DIS/Perl; DIS readProperties method implemented (still buggy)

1 wakaba 1.1 #!/usr/bin/perl -w
2     use strict;
3    
4     =head1 NAME
5    
6 wakaba 1.5 mkdisdump.pl - Generating Perl Module Documentation Source
7 wakaba 1.1
8     =head1 SYNOPSIS
9    
10 wakaba 1.5 perl path/to/mkdisdump.pl input.cdis \
11 wakaba 1.1 {--module-name=ModuleName | --module-uri=module-uri} \
12     [--for=for-uri] [options] > ModuleName.pm
13     perl path/to/cdis2pm.pl --help
14    
15     =head1 DESCRIPTION
16    
17     The C<cdis2pm> script generates a Perl module from a compiled "dis"
18     ("cdis") file. It is intended to be used to generate a manakai
19     DOM Perl module files, although it might be useful for other purpose.
20    
21     This script is part of manakai.
22    
23     =cut
24    
25     use Message::DOM::DOMLS;
26     use Message::Util::DIS::DISDump;
27     use Message::Util::QName::Filter {
28 wakaba 1.3 ddel => q<http://suika.fam.cx/~wakaba/archive/2005/disdoc#>,
29 wakaba 1.1 ddoct => q<http://suika.fam.cx/~wakaba/archive/2005/8/disdump-xslt#>,
30     DIS => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/DIS#>,
31     dis => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis-->,
32     dis2pm => q<http://suika.fam.cx/~wakaba/archive/2004/11/8/dis2pm#>,
33     DISCore => q<http://suika.fam.cx/~wakaba/archive/2004/dis/Core#>,
34     DISLang => q<http://suika.fam.cx/~wakaba/archive/2004/dis/Lang#>,
35     DISPerl => q<http://suika.fam.cx/~wakaba/archive/2004/dis/Perl#>,
36     disPerl => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis--Perl-->,
37     DOMCore => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core#>,
38     DOMEvents => q<http://suika.fam.cx/~wakaba/archive/2004/dom/events#>,
39     DOMLS => q<http://suika.fam.cx/~wakaba/archive/2004/dom/ls#>,
40     DOMMain => q<http://suika.fam.cx/~wakaba/archive/2004/dom/main#>,
41     DOMXML => q<http://suika.fam.cx/~wakaba/archive/2004/dom/xml#>,
42     dump => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/DIS#DISDump/>,
43     DX => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException#>,
44 wakaba 1.5 ecore => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/Core/>,
45 wakaba 1.1 html5 => q<http://www.w3.org/1999/xhtml>,
46 wakaba 1.3 infoset => q<http://www.w3.org/2001/04/infoset#>,
47 wakaba 1.1 lang => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#>,
48     Perl => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#Perl-->,
49     license => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/license#>,
50     ManakaiDOM => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#>,
51     Markup => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup#>,
52     MDOMX => q<http://suika.fam.cx/~wakaba/archive/2004/8/4/manakai-dom-exception#>,
53     owl => q<http://www.w3.org/2002/07/owl#>,
54     pc => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/PerlCode#>,
55     rdf => q<http://www.w3.org/1999/02/22-rdf-syntax-ns#>,
56     rdfs => q<http://www.w3.org/2000/01/rdf-schema#>,
57     swcfg21 => q<http://suika.fam.cx/~wakaba/archive/2005/swcfg21#>,
58     TreeCore => q<>,
59     Util => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/>,
60     xhtml1 => q<http://www.w3.org/1999/xhtml>,
61     xhtml2 => q<http://www.w3.org/2002/06/xhtml2>,
62     xml => q<http://www.w3.org/XML/1998/namespace>,
63 wakaba 1.3 xmlns => q<http://www.w3.org/2000/xmlns/>,
64 wakaba 1.1 };
65    
66     =head1 OPTIONS
67    
68     =over 4
69    
70     =item --for=I<for-uri> (Optional)
71    
72     Specifies the "For" URI reference for which the outputed module is.
73     If this parameter is ommitted, the default "For" URI reference
74     for the module, if any, or the C<ManakaiDOM:all> is assumed.
75    
76     =item --help
77    
78     Shows the help message.
79    
80     =item --module-uri=I<module-uri>
81    
82     A URI reference that identifies a module to output. Either
83     C<--module-name> or C<--module-uri> is required.
84    
85 wakaba 1.5 =item --verbose / --noverbose (default)
86 wakaba 1.1
87 wakaba 1.5 Whether a verbose message mode should be selected or not.
88 wakaba 1.1
89 wakaba 1.5 =item --with-implementators-note / --nowith-implementators-note (default)
90 wakaba 1.1
91 wakaba 1.5 Whether the implemetator's notes should also be included
92     in the result or not.
93 wakaba 1.1
94     =back
95    
96     =cut
97    
98     use Getopt::Long;
99     use Pod::Usage;
100     use Storable;
101     use Message::Util::Error;
102 wakaba 1.4 my %Opt = (
103     module_uri => {},
104     );
105 wakaba 1.1 GetOptions (
106     'for=s' => \$Opt{For},
107     'help' => \$Opt{help},
108 wakaba 1.4 'module-uri=s' => sub {
109     shift;
110     $Opt{module_uri}->{+shift} = 1;
111     },
112 wakaba 1.5 'with-implementators-note' => \$Opt{with_impl_note},
113 wakaba 1.1 ) or pod2usage (2);
114     pod2usage ({-exitval => 0, -verbose => 1}) if $Opt{help};
115     $Opt{file_name} = shift;
116     pod2usage ({-exitval => 2, -verbose => 0}) unless $Opt{file_name};
117 wakaba 1.4 pod2usage (2) unless keys %{$Opt{module_uri}};
118 wakaba 1.1
119     sub status_msg ($) {
120     my $s = shift;
121     $s .= "\n" unless $s =~ /\n$/;
122     print STDERR $s;
123     }
124    
125     sub status_msg_ ($) {
126     my $s = shift;
127     print STDERR $s;
128     }
129    
130     sub verbose_msg ($) {
131     my $s = shift;
132     $s .= "\n" unless $s =~ /\n$/;
133     print STDERR $s;
134     }
135    
136     sub verbose_msg_ ($) {
137     my $s = shift;
138     print STDERR $s;
139     }
140    
141 wakaba 1.5 my $impl = $Message::DOM::ImplementationRegistry->get_implementation
142 wakaba 1.1 ({
143     ExpandedURI q<ManakaiDOM:Minimum> => '3.0',
144     '+' . ExpandedURI q<DOMLS:LS> => '3.0',
145     '+' . ExpandedURI q<DIS:Doc> => '2.0',
146     ExpandedURI q<DIS:Dump> => '1.0',
147     });
148    
149     ## -- Load input dac database file
150     status_msg_ qq<Opening dac file "$Opt{file_name}"...>;
151 wakaba 1.5 our $db = $impl->get_feature (ExpandedURI q<DIS:Core> => '1.0')
152     ->pl_load_dis_database ($Opt{file_name});
153 wakaba 1.1 status_msg qq<done\n>;
154    
155 wakaba 1.2 our %ReferredResource;
156 wakaba 1.5 our %ClassMembers;
157     our %ClassInheritance;
158     our @ClassInheritance;
159     our %ClassImplements;
160 wakaba 1.2
161 wakaba 1.1 sub append_module_documentation (%) {
162     my %opt = @_;
163     my $section = $opt{result_parent}->create_module ($opt{source_resource}->uri);
164 wakaba 1.2
165     add_uri ($opt{source_resource} => $section);
166 wakaba 1.1
167     my $pl_full_name = $opt{source_resource}->pl_fully_qualified_name;
168     if (defined $pl_full_name) {
169     $section->perl_package_name ($pl_full_name);
170 wakaba 1.5
171     my $path = $opt{source_resource}->get_property_text
172     (ExpandedURI q<dis:FileName>, $pl_full_name);
173 wakaba 1.1 $path =~ s#::#/#g;
174     $section->resource_file_path_stem ($path);
175 wakaba 1.5
176 wakaba 1.1 $section->set_attribute_ns
177     (ExpandedURI q<ddoct:>, 'ddoct:basePath', '../' x ($path =~ tr#/#/#));
178 wakaba 1.2 $pl_full_name =~ s/.*:://g;
179     $section->perl_name ($pl_full_name);
180 wakaba 1.1 }
181    
182     append_description (source_resource => $opt{source_resource},
183     result_parent => $section);
184    
185 wakaba 1.2 if ($opt{is_partial}) {
186     $section->resource_is_partial (1);
187     return;
188     }
189    
190 wakaba 1.1 for my $rres (@{$opt{source_resource}->get_property_resource_list
191     (ExpandedURI q<DIS:resource>)}) {
192 wakaba 1.4 if ($rres->owner_module eq $opt{source_resource} and## Defined in this module
193     not ($ReferredResource{$rres->uri} < 0)) {
194 wakaba 1.1 ## TODO: Modification required to support modplans
195 wakaba 1.2 status_msg_ "*";
196 wakaba 1.1 if ($rres->is_type_uri (ExpandedURI q<ManakaiDOM:Class>)) {
197     append_class_documentation
198     (result_parent => $section,
199     source_resource => $rres);
200     } elsif ($rres->is_type_uri (ExpandedURI q<ManakaiDOM:IF>)) {
201     append_interface_documentation
202     (result_parent => $section,
203     source_resource => $rres);
204 wakaba 1.3 } elsif ($rres->is_type_uri (ExpandedURI q<DISCore:AbstractDataType>)) {
205     append_datatype_documentation
206     (result_parent => $section,
207     source_resource => $rres);
208 wakaba 1.1 }
209     } else { ## Aliases
210     #
211     }
212     }
213 wakaba 1.2 status_msg "";
214 wakaba 1.1 } # append_module_documentation
215    
216 wakaba 1.3 sub append_datatype_documentation (%) {
217     my %opt = @_;
218     my $section = $opt{result_parent}->create_data_type
219     ($opt{source_resource}->uri);
220    
221     add_uri ($opt{source_resource} => $section);
222    
223 wakaba 1.4 my $uri = $opt{source_resource}->name_uri;
224     if ($uri) {
225     my $fu = $opt{source_resource}->for_uri;
226     unless ($fu eq ExpandedURI q<ManakaiDOM:all>) {
227     $fu =~ /([\w.-]+)[^\w.-]*$/;
228     $uri .= '-' . $1;
229     }
230     } else {
231     $opt{source_resource}->uri;
232     }
233     $uri =~ s#\b(\d\d\d\d+)/(\d\d?)/(\d\d?)#sprintf '%04d%02d%02d', $1, $2, $3#ge;
234     my @file = map {s/[^\w-]/_/g; $_} split m{[/:#?]+}, $uri;
235 wakaba 1.3
236     $section->resource_file_path_stem (join '/', @file);
237 wakaba 1.5 $section->set_attribute_ns
238     (ExpandedURI q<ddoct:>, 'ddoct:basePath', '../' x (@file - 1));
239 wakaba 1.3
240     my $docr = $opt{source_resource}->get_feature (ExpandedURI q<DIS:Doc>, '2.0');
241     my $label = $docr->get_label ($section->owner_document);
242     if ($label) {
243     $section->create_label->append_child (transform_disdoc_tree ($label));
244     }
245    
246     append_description (source_resource => $opt{source_resource},
247     result_parent => $section);
248    
249     if ($opt{is_partial}) {
250     $section->resource_is_partial (1);
251     return;
252     }
253    
254 wakaba 1.5 append_subclassof (source_resource => $opt{source_resource},
255     result_parent => $section);
256 wakaba 1.3 } # append_datatype_documentation
257    
258 wakaba 1.1 sub append_interface_documentation (%) {
259     my %opt = @_;
260     my $section = $opt{result_parent}->create_interface
261 wakaba 1.5 (my $class_uri = $opt{source_resource}->uri);
262     push @ClassInheritance, $class_uri;
263 wakaba 1.2
264     add_uri ($opt{source_resource} => $section);
265 wakaba 1.1
266     my $pl_full_name = $opt{source_resource}->pl_fully_qualified_name;
267     if (defined $pl_full_name) {
268     $section->perl_package_name ($pl_full_name);
269 wakaba 1.5
270     my $path = $opt{source_resource}->get_property_text
271     (ExpandedURI q<dis:FileName>, $pl_full_name);
272 wakaba 1.1 $path =~ s#::#/#g;
273     $section->resource_file_path_stem ($path);
274 wakaba 1.5
275 wakaba 1.1 $section->set_attribute_ns
276     (ExpandedURI q<ddoct:>, 'ddoct:basePath',
277     join '', '../' x ($path =~ tr#/#/#));
278 wakaba 1.2 $pl_full_name =~ s/.*:://g;
279     $section->perl_name ($pl_full_name);
280 wakaba 1.1 }
281    
282     $section->is_exception_interface (1)
283     if $opt{source_resource}->is_type_uri
284     (ExpandedURI q<ManakaiDOM:ExceptionIF>);
285    
286     append_description (source_resource => $opt{source_resource},
287     result_parent => $section);
288    
289 wakaba 1.2 if ($opt{is_partial}) {
290     $section->resource_is_partial (1);
291     return;
292     }
293    
294 wakaba 1.1 ## Inheritance
295     append_inheritance (source_resource => $opt{source_resource},
296 wakaba 1.5 result_parent => $section,
297     class_uri => $class_uri);
298 wakaba 1.1
299     for my $memres (@{$opt{source_resource}->get_property_resource_list
300     (ExpandedURI q<DIS:childResource>)}) {
301     if ($memres->is_type_uri (ExpandedURI q<DISLang:Method>)) {
302     append_method_documentation (source_resource => $memres,
303 wakaba 1.5 result_parent => $section,
304     class_uri => $class_uri);
305 wakaba 1.1 } elsif ($memres->is_type_uri (ExpandedURI q<DISLang:Attribute>)) {
306     append_attr_documentation (source_resource => $memres,
307 wakaba 1.5 result_parent => $section,
308     class_uri => $class_uri);
309 wakaba 1.1 } elsif ($memres->is_type_uri (ExpandedURI q<ManakaiDOM:ConstGroup>)) {
310 wakaba 1.3 append_constgroup_documentation (source_resource => $memres,
311 wakaba 1.5 result_parent => $section,
312     class_uri => $class_uri);
313 wakaba 1.1 }
314     }
315     } # append_interface_documentation
316    
317     sub append_class_documentation (%) {
318     my %opt = @_;
319 wakaba 1.5 my $section = $opt{result_parent}->create_class
320     (my $class_uri = $opt{source_resource}->uri);
321     push @ClassInheritance, $class_uri;
322 wakaba 1.2
323     add_uri ($opt{source_resource} => $section);
324 wakaba 1.1
325     my $pl_full_name = $opt{source_resource}->pl_fully_qualified_name;
326     if (defined $pl_full_name) {
327     $section->perl_package_name ($pl_full_name);
328 wakaba 1.5
329     my $path = $opt{source_resource}->get_property_text
330     (ExpandedURI q<dis:FileName>, $pl_full_name);
331 wakaba 1.1 $path =~ s#::#/#g;
332 wakaba 1.5
333 wakaba 1.1 $section->resource_file_path_stem ($path);
334     $section->set_attribute_ns
335     (ExpandedURI q<ddoct:>, 'ddoct:basePath', '../' x ($path =~ tr#/#/#));
336 wakaba 1.2 $pl_full_name =~ s/.*:://g;
337     $section->perl_name ($pl_full_name);
338 wakaba 1.1 }
339    
340     append_description (source_resource => $opt{source_resource},
341     result_parent => $section);
342    
343 wakaba 1.2 if ($opt{is_partial}) {
344     $section->resource_is_partial (1);
345     return;
346     }
347    
348 wakaba 1.5 my $has_const = 0;
349 wakaba 1.1 for my $memres (@{$opt{source_resource}->get_property_resource_list
350     (ExpandedURI q<DIS:childResource>)}) {
351     if ($memres->is_type_uri (ExpandedURI q<DISLang:Method>)) {
352     append_method_documentation (source_resource => $memres,
353 wakaba 1.5 result_parent => $section,
354     class_uri => $class_uri);
355 wakaba 1.1 } elsif ($memres->is_type_uri (ExpandedURI q<DISLang:Attribute>)) {
356     append_attr_documentation (source_resource => $memres,
357 wakaba 1.5 result_parent => $section,
358     class_uri => $class_uri);
359 wakaba 1.1 } elsif ($memres->is_type_uri (ExpandedURI q<ManakaiDOM:ConstGroup>)) {
360 wakaba 1.5 $has_const = 1;
361 wakaba 1.3 append_constgroup_documentation
362     (source_resource => $memres,
363 wakaba 1.5 result_parent => $section,
364     class_uri => $class_uri);
365 wakaba 1.1 }
366     }
367 wakaba 1.5
368     ## Inheritance
369     append_inheritance (source_resource => $opt{source_resource},
370     result_parent => $section,
371     append_implements => 1,
372     class_uri => $class_uri,
373     has_const => $has_const,
374     is_class => 1);
375    
376 wakaba 1.1 } # append_class_documentation
377    
378     sub append_method_documentation (%) {
379     my %opt = @_;
380     my $perl_name = $opt{source_resource}->pl_name;
381     my $m;
382     if (defined $perl_name) {
383     $m = $opt{result_parent}->create_method ($perl_name);
384 wakaba 1.5 $ClassMembers{$opt{class_uri}}->{$perl_name}
385     = {
386     resource => $opt{source_resource},
387     type => 'method',
388     };
389 wakaba 1.1
390     } else { ## Anonymous
391     ## TODO
392     return;
393     }
394 wakaba 1.2
395     add_uri ($opt{source_resource} => $m);
396 wakaba 1.1
397     append_description (source_resource => $opt{source_resource},
398 wakaba 1.4 result_parent => $m,
399     method_resource => $opt{source_resource});
400 wakaba 1.1
401     my $ret = $opt{source_resource}->get_child_resource_by_type
402     (ExpandedURI q<DISLang:MethodReturn>);
403     if ($ret) {
404     my $r = $m->dis_return;
405    
406     try {
407 wakaba 1.2 $r->resource_data_type (my $u = $ret->dis_data_type_resource->uri);
408     $ReferredResource{$u} ||= 1;
409     $r->resource_actual_data_type
410     ($u = $ret->dis_actual_data_type_resource->uri);
411     $ReferredResource{$u} ||= 1;
412    
413 wakaba 1.1 ## TODO: Exceptions
414     } catch Message::Util::DIS::ManakaiDISException with {
415    
416     };
417 wakaba 1.4
418     append_description (source_resource => $ret,
419     result_parent => $r,
420     has_case => 1,
421     method_resource => $opt{source_resource});
422 wakaba 1.5
423     append_raises (source_resource => $ret,
424     result_parent => $r,
425     method_resource => $opt{source_resource});
426 wakaba 1.1 }
427    
428     for my $cr (@{$opt{source_resource}->get_property_resource_list
429     (ExpandedURI q<DIS:childResource>)}) {
430     if ($cr->is_type_uri (ExpandedURI q<DISLang:MethodParameter>)) {
431     append_param_documentation (source_resource => $cr,
432 wakaba 1.4 result_parent => $m,
433     method_resource => $opt{source_resource});
434 wakaba 1.1 }
435     }
436    
437     $m->resource_access ('private')
438     if $opt{source_resource}->get_property_boolean
439     (ExpandedURI q<ManakaiDOM:isForInternal>, 0);
440     } # append_method_documentation
441    
442     sub append_attr_documentation (%) {
443     my %opt = @_;
444     my $perl_name = $opt{source_resource}->pl_name;
445     my $m;
446     if (defined $perl_name) {
447     $m = $opt{result_parent}->create_attribute ($perl_name);
448 wakaba 1.5 $ClassMembers{$opt{class_uri}}->{$perl_name}
449     = {
450     resource => $opt{source_resource},
451     type => 'attr',
452     };
453 wakaba 1.1
454     } else { ## Anonymous
455     ## TODO
456     return;
457     }
458 wakaba 1.2
459     add_uri ($opt{source_resource} => $m);
460 wakaba 1.1
461     append_description (source_resource => $opt{source_resource},
462     result_parent => $m,
463     has_case => 1);
464    
465     my $ret = $opt{source_resource}->get_child_resource_by_type
466     (ExpandedURI q<DISLang:AttributeGet>);
467     if ($ret) {
468     my $r = $m->dis_get;
469    
470 wakaba 1.2 $r->resource_data_type (my $u = $ret->dis_data_type_resource->uri);
471     $ReferredResource{$u} ||= 1;
472     $r->resource_actual_data_type
473     ($u = $ret->dis_actual_data_type_resource->uri);
474     $ReferredResource{$u} ||= 1;
475    
476 wakaba 1.1 append_description (source_resource => $ret,
477     result_parent => $r,
478     has_case => 1);
479    
480 wakaba 1.5 append_raises (source_resource => $ret,
481     result_parent => $r);
482 wakaba 1.1 }
483    
484     my $set = $opt{source_resource}->get_child_resource_by_type
485     (ExpandedURI q<DISLang:AttributeSet>);
486     if ($set) {
487     my $r = $m->dis_set;
488    
489 wakaba 1.2 $r->resource_data_type (my $u = $set->dis_data_type_resource->uri);
490     $ReferredResource{$u} ||= 1;
491 wakaba 1.1 $r->resource_actual_data_type ($set->dis_actual_data_type_resource->uri);
492 wakaba 1.2 $ReferredResource{$u} ||= 1;
493 wakaba 1.1
494     append_description (source_resource => $set,
495     result_parent => $r,
496     has_case => 1);
497    
498 wakaba 1.5 append_raises (source_resource => $set,
499     result_parent => $r);
500 wakaba 1.1 } else {
501     $m->is_read_only_attribute (1);
502     }
503    
504     $m->resource_access ('private')
505     if $opt{source_resource}->get_property_boolean
506     (ExpandedURI q<ManakaiDOM:isForInternal>, 0);
507     } # append_attr_documentation
508    
509 wakaba 1.3 sub append_constgroup_documentation (%) {
510     my %opt = @_;
511     my $perl_name = $opt{source_resource}->pl_name;
512     my $m = $opt{result_parent}->create_const_group ($perl_name);
513 wakaba 1.5 $ClassMembers{$opt{class_uri}}->{$perl_name}
514     = {
515     resource => $opt{source_resource},
516     type => 'const-group',
517     };
518 wakaba 1.3
519     add_uri ($opt{source_resource} => $m);
520    
521     append_description (source_resource => $opt{source_resource},
522     result_parent => $m);
523    
524     $m->resource_data_type
525     (my $u = $opt{source_resource}->dis_data_type_resource->uri);
526     $ReferredResource{$u} ||= 1;
527     $m->resource_actual_data_type
528     ($u = $opt{source_resource}->dis_actual_data_type_resource->uri);
529     $ReferredResource{$u} ||= 1;
530    
531 wakaba 1.5 append_subclassof (source_resource => $opt{source_resource},
532     result_parent => $m);
533 wakaba 1.3
534     for my $cr (@{$opt{source_resource}->get_property_resource_list
535     (ExpandedURI q<DIS:childResource>)}) {
536     if ($cr->is_type_uri (ExpandedURI q<ManakaiDOM:Const>)) {
537     append_const_documentation (source_resource => $cr,
538     result_parent => $m);
539     }
540     }
541     } # append_constgroup_documentation
542    
543     sub append_const_documentation (%) {
544     my %opt = @_;
545     my $perl_name = $opt{source_resource}->pl_name;
546     my $m = $opt{result_parent}->create_const ($perl_name);
547    
548     add_uri ($opt{source_resource} => $m);
549    
550     append_description (source_resource => $opt{source_resource},
551     result_parent => $m);
552    
553     $m->resource_data_type
554     (my $u = $opt{source_resource}->dis_data_type_resource->uri);
555     $ReferredResource{$u} ||= 1;
556     $m->resource_actual_data_type
557     ($u = $opt{source_resource}->dis_actual_data_type_resource->uri);
558     $ReferredResource{$u} ||= 1;
559    
560     my $value = $opt{source_resource}->pl_code_fragment;
561     if ($value) {
562     $m->create_value->text_content ($value->stringify);
563     }
564    
565     for my $cr (@{$opt{source_resource}->get_property_resource_list
566     (ExpandedURI q<DIS:childResource>)}) {
567     if ($cr->is_type_uri (ExpandedURI q<ManakaiDOM:ExceptionOrWarningSubType>)) {
568     append_xsubtype_documentation (source_resource => $cr,
569     result_parent => $m);
570     }
571     }
572     ## TODO: xparam
573     } # append_const_documentation
574    
575     sub append_xsubtype_documentation (%) {
576     my %opt = @_;
577     my $m = $opt{result_parent}->create_exception_sub_code
578     ($opt{source_resource}->uri);
579     add_uri ($opt{source_resource} => $m);
580    
581     append_description (source_resource => $opt{source_resource},
582     result_parent => $m);
583    
584     ## TODO: xparam
585     } # append_xsubtype_documentation
586    
587 wakaba 1.1 sub append_param_documentation (%) {
588     my %opt = @_;
589    
590     my $is_named_param = $opt{source_resource}->get_property_boolean
591     (ExpandedURI q<DISPerl:isNamedParameter>, 0);
592    
593     my $perl_name = $is_named_param
594     ? $opt{source_resource}->pl_name
595     : $opt{source_resource}->pl_variable_name;
596    
597     my $p = $opt{result_parent}->create_parameter ($perl_name, $is_named_param);
598    
599 wakaba 1.2 add_uri ($opt{source_resource} => $p);
600    
601 wakaba 1.1 $p->is_nullable_parameter ($opt{source_resource}->pl_is_nullable);
602 wakaba 1.2 $p->resource_data_type
603     (my $u = $opt{source_resource}->dis_data_type_resource->uri);
604     $ReferredResource{$u} ||= 1;
605 wakaba 1.1 $p->resource_actual_data_type
606 wakaba 1.2 ($u = $opt{source_resource}->dis_actual_data_type_resource->uri);
607     $ReferredResource{$u} ||= 1;
608 wakaba 1.1
609     append_description (source_resource => $opt{source_resource},
610     result_parent => $p,
611 wakaba 1.4 has_case => 1,
612     method_resource => $opt{method_resource});
613 wakaba 1.1 } # append_param_documentation
614    
615     sub append_description (%) {
616     my %opt = @_;
617 wakaba 1.2
618 wakaba 1.1 my $od = $opt{result_parent}->owner_document;
619     my $resd = $opt{source_resource}->get_feature (ExpandedURI q<DIS:Doc>, '2.0');
620 wakaba 1.5 my $doc = transform_disdoc_tree
621     ($resd->get_description
622     ($od, undef,
623     $Opt{with_impl_note},
624     parent_element_arg => $opt{source_element}),
625     method_resource => $opt{method_resource});
626 wakaba 1.1 $opt{result_parent}->create_description->append_child ($doc);
627     ## TODO: Negotiation
628    
629 wakaba 1.3 my $fn = $resd->get_full_name ($od);
630     if ($fn) {
631     $opt{result_parent}->create_full_name
632 wakaba 1.4 ->append_child (transform_disdoc_tree
633     ($fn,
634     method_resource => $opt{method_resource}));
635 wakaba 1.3 }
636    
637 wakaba 1.1 if ($opt{has_case}) {
638     for my $caser (@{$opt{source_resource}->get_property_resource_list
639     (ExpandedURI q<DIS:childResource>)}) {
640     if ($caser->is_type_uri (ExpandedURI q<ManakaiDOM:InCase>)) {
641     my $case = $opt{result_parent}->append_case;
642     my $cased = $caser->get_feature (ExpandedURI q<DIS:Doc>, '2.0');
643     my $label = $cased->get_label ($od);
644     if ($label) {
645 wakaba 1.4 $case->create_label->append_child
646     (transform_disdoc_tree ($label,
647     method_resource => $opt{method_resource}));
648 wakaba 1.1 }
649     my $value = $caser->pl_code_fragment;
650     if ($value) {
651     $case->create_value->text_content ($value->stringify);
652     }
653 wakaba 1.3 $case->resource_data_type
654     (my $u = $caser->dis_data_type_resource->uri);
655     $ReferredResource{$u} ||= 1;
656     $case->resource_actual_data_type
657     ($u = $caser->dis_actual_data_type_resource->uri);
658     $ReferredResource{$u} ||= 1;
659    
660 wakaba 1.1 append_description (source_resource => $caser,
661 wakaba 1.4 result_parent => $case,
662     method_resource => $opt{method_resource});
663 wakaba 1.1 }
664     }
665     }
666     } # append_description
667    
668 wakaba 1.3 sub transform_disdoc_tree ($;%) {
669     my ($el, %opt) = @_;
670     my @el = ($el);
671     EL: while (defined (my $el = shift @el)) {
672     if ($el->node_type == $el->ELEMENT_NODE and
673     defined $el->namespace_uri) {
674     my $mmParsed = $el->get_attribute_ns (ExpandedURI q<ddel:>, 'mmParsed');
675     if ($mmParsed) {
676     my $lextype = $el->get_attribute_ns (ExpandedURI q<ddel:>, 'lexType');
677     if ($lextype eq ExpandedURI q<dis:TFQNames>) {
678 wakaba 1.4 my $uri = dd_get_tfqnames_uri ($el);
679     if (defined $uri) {
680     $ReferredResource{$uri} ||= 1;
681     next EL;
682     }
683 wakaba 1.5 } elsif ($lextype eq ExpandedURI q<dis:TypeQName> or
684     $lextype eq ExpandedURI q<DISCore:NCNameOrQName>) {
685     my $uri = dd_get_qname_uri ($el);
686     if (defined $uri) {
687     $ReferredResource{$uri} ||= 1;
688     next EL;
689     }
690     } elsif ($lextype eq ExpandedURI q<DISPerl:MemRef> or
691     $lextype eq ExpandedURI q<DOMMain:XCodeRef>) {
692 wakaba 1.4 my @nm = @{$el->get_elements_by_tag_name_ns
693     (ExpandedURI q<ddel:>, 'name')};
694     if (@nm == 1) {
695 wakaba 1.5 my $uri = dd_get_tfqnames_uri ($nm[0]);
696     if (defined $uri) {
697     $el->set_attribute_ns (ExpandedURI q<dump:>, 'dump:uri', $uri);
698     $ReferredResource{$uri} ||= 1;
699     next EL;
700     }
701     } elsif (@nm == 3) {
702     my $uri = dd_get_tfqnames_uri ($nm[2]);
703 wakaba 1.4 if (defined $uri) {
704 wakaba 1.5 $el->set_attribute_ns (ExpandedURI q<dump:>, 'dump:uri', $uri);
705 wakaba 1.4 $ReferredResource{$uri} ||= 1;
706     next EL;
707     }
708     } elsif (@nm == 2) {
709     my $uri = dd_get_tfqnames_uri ($nm[0]);
710     if (not defined $uri) {
711     #
712     } elsif ($nm[1]->get_elements_by_tag_name_ns
713     (ExpandedURI q<ddel:>, 'prefix')->[0]) {
714     #my $luri = dd_get_qname_uri ($nm[1]);
715     ## QName: Currently not used
716     } else {
717     my $lnel = $nm[1]->get_elements_by_tag_name_ns
718     (ExpandedURI q<ddel:>, 'localName')->[0];
719     my $lname = $lnel ? $lnel->text_content : '';
720 wakaba 1.5 my $res;
721     if ($lextype eq ExpandedURI q<DOMMain:XCodeRef> or
722     {
723     ExpandedURI q<ddel:C> => 1,
724     ExpandedURI q<ddel:X> => 1,
725     }->{$el->namespace_uri . $el->local_name}) {
726     ## NOTE: $db
727     $res = $db->get_resource ($uri)
728     ->get_const_resource_by_name ($lname);
729     } else {
730     ## NOTE: $db
731     $res = $db->get_resource ($uri)
732     ->get_child_resource_by_name_and_type
733 wakaba 1.4 ($lname, ExpandedURI q<DISLang:AnyMethod>);
734 wakaba 1.5 }
735 wakaba 1.4 if ($res) {
736     $el->set_attribute_ns
737     (ExpandedURI q<dump:>, 'dump:uri', $res->uri);
738     $ReferredResource{$res->uri} ||= 1;
739     }
740     next EL;
741     }
742     }
743     } # lextype
744     } # mmParsed
745     elsif ($opt{method_resource} and
746     $el->namespace_uri eq ExpandedURI q<ddel:> and
747     $el->local_name eq 'P') {
748     my $res = $opt{method_resource}
749     ->get_child_resource_by_name_and_type
750     ($el->text_content, ExpandedURI q<DISLang:MethodParameter>);
751     if ($res) {
752     $el->set_attribute_ns
753     (ExpandedURI q<dump:>, 'dump:uri', $res->uri);
754     $ReferredResource{$res->uri} ||= 1;
755 wakaba 1.3 }
756 wakaba 1.4 next EL;
757 wakaba 1.3 }
758 wakaba 1.4 push @el, @{$el->child_nodes};
759 wakaba 1.3 } elsif ($el->node_type == $el->DOCUMENT_FRAGMENT_NODE or
760     $el->node_type == $el->DOCUMENT_NODE) {
761 wakaba 1.4 push @el, @{$el->child_nodes};
762 wakaba 1.3 }
763     } # EL
764     $el;
765     } # transform_disdoc_tree
766    
767 wakaba 1.4 sub dd_get_tfqnames_uri ($;%) {
768     my ($el, %opt) = @_;
769     return '' unless $el;
770     my $turi = dd_get_qname_uri ($el->get_elements_by_tag_name_ns
771     (ExpandedURI q<ddel:>, 'nameQName')->[0]);
772     my $furi = dd_get_qname_uri ($el->get_elements_by_tag_name_ns
773     (ExpandedURI q<ddel:>, 'forQName')->[0]);
774     return undef if not defined $turi or not defined $furi;
775     my $uri = tfuris2uri ($turi, $furi);
776     $el->set_attribute_ns (ExpandedURI q<dump:>, 'dump:uri', $uri);
777     $uri;
778     } # dd_get_tfqnames_uri
779 wakaba 1.3
780     sub dd_get_qname_uri ($;%) {
781     my ($el, %opt) = @_;
782 wakaba 1.4 return undef unless $el;
783 wakaba 1.3 my $plel = $el->get_elements_by_tag_name_ns
784     (ExpandedURI q<ddel:>, 'prefix')->[0];
785     my $lnel = $el->get_elements_by_tag_name_ns
786     (ExpandedURI q<ddel:>, 'localName')->[0];
787     my $nsuri = ($plel ? $plel : $el)->lookup_namespace_uri
788     ($plel ? $plel->text_content : undef);
789     $nsuri = '' unless defined $nsuri;
790     if ($plel and $nsuri eq '') {
791     $plel->remove_attribute_ns
792 wakaba 1.4 (ExpandedURI q<xmlns:>, $plel->text_content);
793     $el->set_attribute_ns (ExpandedURI q<dump:>, 'dump:namespaceURI', $nsuri);
794     return undef;
795     } else {
796     $el->set_attribute_ns (ExpandedURI q<dump:>, 'dump:namespaceURI', $nsuri);
797 wakaba 1.3 }
798     if ($lnel) {
799     $nsuri . $lnel->text_content;
800     } else {
801     $el->get_attribute_ns (ExpandedURI q<ddel:>, 'defaultURI');
802     }
803     } # dd_get_qname_uri
804    
805     sub tfuris2uri ($$) {
806     my ($turi, $furi) = @_;
807     my $uri;
808 wakaba 1.5 if ($furi eq ExpandedURI q<ManakaiDOM:all>) {
809 wakaba 1.3 $uri = $turi;
810     } else {
811     my $__turi = $turi;
812     my $__furi = $furi;
813     for my $__uri ($__turi, $__furi) {
814     $__uri =~ s{([^0-9A-Za-z:;?=_./-])}{sprintf '%%%02X', ord $1}ge;
815     }
816     $uri = qq<data:,200411tf#xmlns(t=data:,200411tf%23)>.
817     qq<t:tf($__turi,$__furi)>;
818     }
819     $uri;
820     } # tfuris2uri
821    
822 wakaba 1.1 sub append_inheritance (%) {
823     my %opt = @_;
824     if (($opt{depth} ||= 0) == 100) {
825     warn "<".$opt{source_resource}->uri.">: Loop in inheritance";
826     return;
827     }
828 wakaba 1.5
829     my $has_isa = 0;
830 wakaba 1.1
831     for my $isa (@{$opt{source_resource}->get_property_resource_list
832     (ExpandedURI q<dis:ISA>,
833     default_media_type => ExpandedURI q<dis:TFQNames>)}) {
834 wakaba 1.5 $has_isa = 1;
835 wakaba 1.1 append_inheritance
836     (source_resource => $isa,
837     result_parent => $opt{result_parent}->append_new_extends ($isa->uri),
838 wakaba 1.5 depth => $opt{depth} + 1,
839     is_class => $opt{is_class});
840     $ReferredResource{$isa->uri} ||= 1;
841     if ($opt{class_uri}) {
842     unshift @ClassInheritance, $isa->uri;
843     push @{$ClassInheritance{$opt{class_uri}} ||= []}, $isa->uri;
844     }
845     }
846    
847     if ($opt{source_resource}->is_defined) {
848     for my $isa_pack (@{$opt{source_resource}->pl_additional_isa_packages}) {
849     my $isa;
850     if ($isa_pack eq 'Message::Util::Error') {
851     ## NOTE: $db
852     $isa = $db->get_resource (ExpandedURI q<ecore:MUError>,
853     for_arg => ExpandedURI q<ManakaiDOM:Perl>);
854     } elsif ($isa_pack eq 'Tie::Array') {
855     ## NOTE: $db
856     $isa = $db->get_resource (ExpandedURI q<DISPerl:TieArray>);
857     } elsif ($isa_pack eq 'Error') {
858     ## NOTE: $db
859     $isa = $db->get_resource (ExpandedURI q<ecore:Error>,
860     for_arg => ExpandedURI q<ManakaiDOM:Perl>);
861     } else {
862     ## TODO: What to do?
863     }
864     if ($isa) {
865     $has_isa = 1;
866     append_inheritance
867     (source_resource => $isa,
868     result_parent => $opt{result_parent}->append_new_extends ($isa->uri),
869     depth => $opt{depth} + 1,
870     is_class => $opt{is_class});
871     $ReferredResource{$isa->uri} ||= 1;
872     if ($opt{class_uri}) {
873     unshift @ClassInheritance, $isa->uri;
874     push @{$ClassInheritance{$opt{class_uri}} ||= []}, $isa->uri;
875     }
876     }
877     }} # AppISA
878    
879     if ($opt{has_const}) {
880     ## NOTE: $db
881     my $isa = $db->get_resource (ExpandedURI q<DISPerl:Exporter>);
882     append_inheritance
883     (source_resource => $isa,
884     result_parent => $opt{result_parent}->append_new_extends ($isa->uri),
885     depth => $opt{depth} + 1,
886     is_class => $opt{is_class});
887     $ReferredResource{$isa->uri} ||= 1;
888     if ($opt{class_uri}) {
889     unshift @ClassInheritance, $isa->uri;
890     push @{$ClassInheritance{$opt{class_uri}} ||= []}, $isa->uri;
891     }
892     }
893    
894     if (not $has_isa and $opt{is_class} and
895     $opt{source_resource}->uri ne ExpandedURI q<DISPerl:UNIVERSAL>) {
896     ## NOTE: $db
897     my $isa = $db->get_resource (ExpandedURI q<DISPerl:UNIVERSAL>);
898     append_inheritance
899     (source_resource => $isa,
900     result_parent => $opt{result_parent}->append_new_extends ($isa->uri),
901     depth => $opt{depth} + 1,
902     is_class => $opt{is_class});
903 wakaba 1.2 $ReferredResource{$isa->uri} ||= 1;
904 wakaba 1.5 if ($opt{class_uri}) {
905     unshift @ClassInheritance, $isa->uri;
906     push @{$ClassInheritance{$opt{class_uri}} ||= []}, $isa->uri;
907     }
908 wakaba 1.1 }
909    
910     if ($opt{append_implements}) {
911 wakaba 1.5 ## NOTE: $db
912     my $u = $db->get_resource (ExpandedURI q<DISPerl:UNIVERSALInterface>);
913 wakaba 1.1 for my $impl (@{$opt{source_resource}->get_property_resource_list
914     (ExpandedURI q<dis:Implement>,
915     default_media_type => ExpandedURI q<dis:TFQNames>,
916 wakaba 1.5 isa_recursive => 1)}, $u) {
917 wakaba 1.1 append_inheritance
918     (source_resource => $impl,
919     result_parent => $opt{result_parent}->append_new_implements
920     ($impl->uri),
921     depth => $opt{depth});
922 wakaba 1.2 $ReferredResource{$impl->uri} ||= 1;
923 wakaba 1.5 $ClassImplements{$opt{class_uri}}->{$impl->uri} = 1
924     if $opt{class_uri};
925 wakaba 1.1 }
926     }
927     } # append_inheritance
928    
929 wakaba 1.5 sub append_subclassof (%) {
930     my %opt = @_;
931    
932     ## NOTE: This subroutine directly access to internal structure
933     ## of ManakaiDISResourceDefinition
934    
935     my $a;
936     $a = sub ($$) {
937     my ($gdb, $s) = @_;
938     my %s = keys %$s;
939     while (my $i = [keys %s]->[0]) {
940     ## Removes itself
941     delete $s->{$i};
942     #warn $i;
943    
944     my $ires = $gdb->get_resource ($i);
945     for my $j (keys %$s) {
946     next if $i eq $j;
947     if ($ires->{subOf}->{$j}) {
948     $s->{$i}->{$j} = $s->{$j};
949     delete $s->{$j};
950     delete $s{$j};
951     }
952     }
953    
954     delete $s{$i};
955     } # %s
956    
957     for my $i (keys %$s) {
958     $a->($s->{$i}) if keys %{$s->{$i}};
959     }
960     };
961    
962     my $b;
963     $b = sub ($$) {
964     my ($s, $p) = @_;
965     for my $i (keys %$s) {
966     my $el = $p->append_new_sub_class_of ($i);
967     $b->($s->{$i}, $el) if keys %{$s->{$i}};
968     }
969     };
970    
971    
972     my $sub = {$opt{source_resource}->uri =>
973     {map {$_ => {}} keys %{$opt{source_resource}->{subOf}}}};
974     ## NOTE: $db
975     $a->($db, $sub);
976     $b->($sub, $opt{result_parent});
977     } # append_subclassof
978    
979 wakaba 1.2 sub add_uri ($$;%) {
980     my ($res, $el, %opt) = @_;
981     my $canon_uri = $res->uri;
982     for my $uri (@{$res->uris}) {
983     $el->add_uri ($uri, $canon_uri eq $uri ? 0 : 1);
984     $ReferredResource{$uri} = -1;
985     }
986 wakaba 1.3
987     my $nsuri = $res->namespace_uri;
988     $el->resource_namespace_uri ($nsuri) if defined $nsuri;
989     my $lname = $res->local_name;
990     $el->resource_local_name ($lname) if defined $lname;
991 wakaba 1.2 } # add_uri
992    
993 wakaba 1.5 sub append_raises (%) {
994     my %opt = @_;
995     my $parent = $opt{source_resource}->source_element;
996     return unless $parent;
997    
998     for my $el (@{$parent->dis_child_elements
999     (for_arg => $opt{source_resource}->for_uri,
1000     forp_arg => $opt{source_resource}->forp_uri)}) {
1001     if ($el->expanded_uri eq ExpandedURI q<ManakaiDOM:raises>) {
1002     ## NOTE: $db is used
1003     my ($a, $b, $c) = @{$db->xcref_to_resource
1004     ($el->value, $el,
1005     for_arg => $opt{source_resource}->for_uri)};
1006    
1007     my $rel = $opt{result_parent}->create_raises
1008     ($a->uri, $b ? $b->uri : undef, $c ? $c->uri : undef);
1009    
1010     append_description (source_resource => $opt{source_resource},
1011     source_element => $el,
1012     result_parent => $rel,
1013     method_resource => $opt{method_resource});
1014     }
1015     }
1016     } # append_raises
1017 wakaba 1.4
1018    
1019 wakaba 1.1 my $doc = $impl->create_disdump_document;
1020    
1021     my $body = $doc->document_element;
1022    
1023    
1024 wakaba 1.4 ## -- Outputs requested modules
1025    
1026     for my $mod_uri (keys %{$Opt{module_uri}}) {
1027 wakaba 1.5 my $mod_for = $Opt{For};
1028     my $mod = $db->get_module ($mod_uri, for_arg => $mod_for);
1029     unless ($mod_for) {
1030 wakaba 1.4 my $el = $mod->source_element;
1031     if ($el) {
1032 wakaba 1.5 $mod_for = $el->default_for_uri;
1033     $mod = $db->get_module ($mod_uri, for_arg => $mod_for);
1034 wakaba 1.4 }
1035     }
1036     unless ($mod->is_defined) {
1037 wakaba 1.5 die qq<$0: Module <$mod_uri> for <$mod_for> is not defined>;
1038 wakaba 1.4 }
1039    
1040 wakaba 1.5 status_msg qq<Module <$mod_uri> for <$mod_for>...>;
1041 wakaba 1.4
1042     append_module_documentation
1043     (result_parent => $body,
1044     source_resource => $mod);
1045 wakaba 1.5
1046     status_msg qq<done>;
1047 wakaba 1.4 } # mod_uri
1048    
1049     ## -- Outputs referenced resources in external modules
1050 wakaba 1.2
1051 wakaba 1.5 status_msg q<Other modules...>;
1052    
1053 wakaba 1.2 while (my @ruri = grep {$ReferredResource{$_} > 0} keys %ReferredResource) {
1054     U: while (defined (my $uri = shift @ruri)) {
1055     next U if $ReferredResource{$uri} < 0; ## Already done
1056 wakaba 1.5 status_msg_ q<*>;
1057 wakaba 1.2 my $res = $db->get_resource ($uri);
1058     unless ($res->is_defined) {
1059     $res = $db->get_module ($uri);
1060     unless ($res->is_defined) {
1061     $ReferredResource{$uri} = -1;
1062     next U;
1063     }
1064     append_module_documentation
1065     (result_parent => $body,
1066     source_resource => $res,
1067     is_partial => 1);
1068     } elsif ($res->is_type_uri (ExpandedURI q<ManakaiDOM:Class>)) {
1069     my $mod = $res->owner_module;
1070     unless ($ReferredResource{$mod->uri} < 0) {
1071     unshift @ruri, $uri;
1072     unshift @ruri, $mod->uri;
1073     next U;
1074     }
1075     append_class_documentation
1076     (result_parent => $body->create_module ($mod->uri),
1077     source_resource => $res,
1078     is_partial => 1);
1079     } elsif ($res->is_type_uri (ExpandedURI q<ManakaiDOM:IF>)) {
1080     my $mod = $res->owner_module;
1081     unless ($mod->is_defined) {
1082     $ReferredResource{$uri} = -1;
1083     next U;
1084     } elsif (not ($ReferredResource{$mod->uri} < 0)) {
1085     unshift @ruri, $uri;
1086     unshift @ruri, $mod->uri;
1087     next U;
1088     }
1089     append_interface_documentation
1090     (result_parent => $body->create_module ($mod->uri),
1091     source_resource => $res,
1092     is_partial => 1);
1093 wakaba 1.3 } elsif ($res->is_type_uri (ExpandedURI q<DISCore:AbstractDataType>)) {
1094     my $mod = $res->owner_module;
1095     unless ($mod->is_defined) {
1096     $ReferredResource{$uri} = -1;
1097     next U;
1098     } elsif (not ($ReferredResource{$mod->uri} < 0)) {
1099     unshift @ruri, $uri;
1100     unshift @ruri, $mod->uri;
1101     next U;
1102     }
1103     append_datatype_documentation
1104     (result_parent => $body->create_module ($mod->uri),
1105     source_resource => $res);
1106     } elsif ($res->is_type_uri (ExpandedURI q<DISLang:AnyMethod>) or
1107     $res->is_type_uri (ExpandedURI q<ManakaiDOM:ConstGroup>)) {
1108 wakaba 1.2 my $cls = $res->get_property_resource
1109     (ExpandedURI q<dis2pm:parentResource>);
1110     if (not ($ReferredResource{$cls->uri} < 0) and
1111     ($cls->is_type_uri (ExpandedURI q<ManakaiDOM:Class>) or
1112     $cls->is_type_uri (ExpandedURI q<ManakaiDOM:IF>))) {
1113     unshift @ruri, $uri;
1114     unshift @ruri, $cls->uri;
1115     next U;
1116     }
1117     my $model = $body->create_module ($cls->owner_module->uri);
1118     my $clsel = $cls->is_type_uri (ExpandedURI q<ManakaiDOM:Class>)
1119     ? $model->create_class ($cls->uri)
1120     : $model->create_interface ($cls->uri);
1121     if ($res->is_type_uri (ExpandedURI q<DISLang:Method>)) {
1122     append_method_documentation
1123     (result_parent => $clsel,
1124     source_resource => $res);
1125 wakaba 1.3 } elsif ($res->is_type_uri (ExpandedURI q<DISLang:Attribute>)) {
1126 wakaba 1.2 append_attr_documentation
1127 wakaba 1.3 (result_parent => $clsel,
1128     source_resource => $res);
1129     } elsif ($res->is_type_uri (ExpandedURI q<ManakaiDOM:ConstGroup>)) {
1130     append_constgroup_documentation
1131     (result_parent => $clsel,
1132 wakaba 1.2 source_resource => $res);
1133     }
1134     } elsif ($res->is_type_uri (ExpandedURI q<DISLang:MethodParameter>)) {
1135     my $m = $res->get_property_resource
1136     (ExpandedURI q<dis2pm:parentResource>);
1137     if (not ($ReferredResource{$m->uri} < 0) and
1138     $m->is_type_uri (ExpandedURI q<DISLang:Method>)) {
1139     unshift @ruri, $m->uri;
1140 wakaba 1.4 $ReferredResource{$res->uri} = -1;
1141 wakaba 1.2 next U;
1142     }
1143 wakaba 1.3 } elsif ($res->is_type_uri (ExpandedURI q<ManakaiDOM:Const>)) {
1144     my $m = $res->get_property_resource
1145     (ExpandedURI q<dis2pm:parentResource>);
1146     if (not ($ReferredResource{$m->uri} < 0) and
1147     $m->is_type_uri (ExpandedURI q<ManakaiDOM:ConstGroup>)) {
1148     unshift @ruri, $m->uri;
1149 wakaba 1.4 $ReferredResource{$res->uri} = -1;
1150 wakaba 1.3 next U;
1151     }
1152     } elsif ($res->is_type_uri
1153     (ExpandedURI q<ManakaiDOM:ExceptionOrWarningSubType>)) {
1154     my $m = $res->get_property_resource
1155     (ExpandedURI q<dis2pm:parentResource>);
1156     if (not ($ReferredResource{$m->uri} < 0) and
1157     $m->is_type_uri (ExpandedURI q<ManakaiDOM:Const>)) {
1158     unshift @ruri, $m->uri;
1159 wakaba 1.4 $ReferredResource{$res->uri} = -1;
1160 wakaba 1.3 next U;
1161     }
1162 wakaba 1.2 } else { ## Unsupported type
1163     $ReferredResource{$uri} = -1;
1164     }
1165     } # U
1166     }
1167    
1168 wakaba 1.5 status_msg q<done>;
1169    
1170     ## -- Inheriting methods information
1171 wakaba 1.1
1172 wakaba 1.5 {
1173     verbose_msg_ q<Adding inheritance information...>;
1174     my %class_done;
1175     for my $class_uri (@ClassInheritance) {
1176     next if $class_done{$class_uri};
1177     $class_done{$class_uri};
1178     for my $sclass_uri (@{$ClassInheritance{$class_uri}}) {
1179     for my $scm_name (keys %{$ClassMembers{$sclass_uri}}) {
1180     if ($ClassMembers{$class_uri}->{$scm_name}) {
1181     $ClassMembers{$class_uri}->{$scm_name}->{overrides}
1182     ->{$ClassMembers{$sclass_uri}->{$scm_name}->{resource}->uri} = 1;
1183     } else {
1184     $ClassMembers{$class_uri}->{$scm_name}
1185     = {
1186     %{$ClassMembers{$sclass_uri}->{$scm_name}},
1187     is_inherited => 1,
1188     };
1189     }
1190     }
1191     } # superclasses
1192     } # classes
1193 wakaba 1.1
1194 wakaba 1.5 for my $class_uri (keys %ClassImplements) {
1195     for my $if_uri (keys %{$ClassImplements{$class_uri}||{}}) {
1196     for my $mem_name (keys %{$ClassMembers{$if_uri}}) {
1197     unless ($ClassMembers{$class_uri}->{$mem_name}) {
1198     ## Not defined - error
1199     $ClassMembers{$class_uri}->{$mem_name}
1200     = {
1201     %{$ClassMembers{$if_uri}->{$mem_name}},
1202     is_inherited => 1,
1203     };
1204     }
1205     $ClassMembers{$class_uri}->{$mem_name}->{implements}
1206     ->{$ClassMembers{$if_uri}->{$mem_name}->{resource}->uri} = 1;
1207     }
1208     } # interfaces
1209     } # classes
1210    
1211     for my $class_uri (keys %ClassMembers) {
1212     my $cls_res = $db->get_resource ($class_uri);
1213     next unless $cls_res->is_defined;
1214     verbose_msg_ q<.>;
1215     my $cls_el = $body->create_module ($cls_res->owner_module->uri);
1216     if ($cls_res->is_type_uri (ExpandedURI q<ManakaiDOM:IF>)) {
1217     $cls_el = $cls_el->create_interface ($class_uri);
1218     } else {
1219     $cls_el = $cls_el->create_class ($class_uri);
1220     }
1221     for my $mem_name (keys %{$ClassMembers{$class_uri}}) {
1222     my $mem_info = $ClassMembers{$class_uri}->{$mem_name};
1223     my $el;
1224     if ($mem_info->{type} eq 'const-group') {
1225     $el = $cls_el->create_const_group ($mem_name);
1226     } elsif ($mem_info->{type} eq 'attr') {
1227     $el = $cls_el->create_attribute ($mem_name);
1228     } else {
1229     $el = $cls_el->create_method ($mem_name);
1230     }
1231     if ($mem_info->{is_inherited}) {
1232     $el->ref ($mem_info->{resource}->uri);
1233     }
1234     for my $or (keys %{$mem_info->{overrides}||{}}) {
1235     $el->append_new_overrides ($or);
1236     }
1237     for my $or (keys %{$mem_info->{implements}||{}}) {
1238     $el->append_new_implements ($or);
1239     }
1240     } # members
1241     } # classes
1242    
1243     verbose_msg q<done>;
1244     undef %ClassMembers;
1245     }
1246    
1247     {
1248     status_msg_ qq<Writing file ""...>;
1249    
1250     require Encode;
1251     my $lsimpl = $impl->get_feature (ExpandedURI q<DOMLS:LS> => '3.0');
1252     my $serializer = $lsimpl->create_mls_serializer
1253 wakaba 1.1 ({ExpandedURI q<DOMLS:SerializeDocumentInstance> => ''});
1254 wakaba 1.5 my $serialized = $serializer->write_to_string ($doc);
1255 wakaba 1.6 verbose_msg_ qq< serialized, >;
1256     my $encoded = Encode::encode ('utf8', $serialized);
1257     verbose_msg_ qq<bytenized, and >;
1258     print STDOUT $encoded;
1259 wakaba 1.5 close STDOUT;
1260     status_msg qq<done>;
1261     }
1262 wakaba 1.1
1263     verbose_msg_ qq<Checking undefined resources...>;
1264     $db->check_undefined_resource;
1265     verbose_msg qq<done>;
1266    
1267     verbose_msg_ qq<Closing database...>;
1268 wakaba 1.5 $db->free;
1269 wakaba 1.1 undef $db;
1270     verbose_msg qq<done>;
1271    
1272 wakaba 1.5 END {
1273     $db->free if $db;
1274     }
1275    
1276 wakaba 1.1 =head1 SEE ALSO
1277    
1278     L<lib/manakai/dis.pl> and L<bin/cdis2pm.pl> - Old version of
1279     this script.
1280    
1281 wakaba 1.5 L<lib/Message/Util/DIS.dis> - The I<dis> object implementation.
1282 wakaba 1.1
1283     L<lib/Message/Util/PerlCode.dis> - The Perl code generator.
1284    
1285     L<lib/manakai/DISCore.dis> - The definition for the "dis" format.
1286    
1287     L<lib/manakai/DISPerl.dis> - The definition for the "dis" Perl-specific
1288     vocabulary.
1289    
1290     =head1 LICENSE
1291    
1292     Copyright 2004-2005 Wakaba <w@suika.fam.cx>. All rights reserved.
1293    
1294     This program is free software; you can redistribute it and/or
1295     modify it under the same terms as Perl itself.
1296    
1297     =cut
1298    
1299 wakaba 1.6 1; # $Date: 2005/09/09 04:26:04 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24