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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.17 - (show annotations) (download)
Sun Sep 10 11:19:23 2006 UTC (18 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.16: +15 -1 lines
File MIME type: text/plain
++ manakai/bin/ChangeLog	10 Sep 2006 11:09:00 -0000
2006-09-10  Wakaba  <wakaba@suika.fam.cx>

	* daf.pl (--dtd-suffix, --create-dtd-driver): New options
	for DTD driver support.

++ manakai/lib/Message/Markup/ChangeLog	10 Sep 2006 11:12:09 -0000
2006-09-10  Wakaba  <wakaba@suika.fam.cx>

	* Atom.dis (Atom): The |mv:systemIdentifierBaseURI|
	property is set.  It is an empty value to allow to move
	DTD modules without modification.
	(Atom10): New DTD driver for ordinary Atom 1.0 documents.
	(AtomNameElement, AtomUriElement, AtomEmailElement): References
	for |Atom| module are added for |%ATOM.xmlns.attrib;|
	references in the |ATTLIST| declarations.
	(AtomContentElement): Content attribute definitions
	for |type| and |src| attributes are added.

	* Makefile (atom): Generate |Atom10| DTD driver.

++ manakai/lib/Message/Markup/XML/ChangeLog	10 Sep 2006 11:13:04 -0000
2006-09-10  Wakaba  <wakaba@suika.fam.cx>

	* Parser.pm: Comment out Unicode comparibility character
	checking clause since |\p{Compat}| regexp set is not
	supported in the current version of perl.

++ manakai/lib/manakai/ChangeLog	10 Sep 2006 11:19:19 -0000
2006-09-10  Wakaba  <wakaba@suika.fam.cx>

	* DISMarkup.dis (mv:systemIdentifierBaseURI): New property.
	(mv:XMLDTDAnyModule, mv:XMLDTDDriver): New resource types.

	* daf-dtd-modules.pl (daf_dtd_modules): Its main part
	is split into another function named |daf_dm_create_module_file|.
	(daf_dtd_driver): New function for DTD driver support.
	(daf_dm_create_module_file): New function.
	(daf_dm_dtd_driver_content): New function.
	(daf_dm_qname_module_content): What declarations
	are generated is changed so that generated DTD modules
	are more resemble to HTML WG's ones.
	(daf_dm_register_all_components): New function.
	(daf_dm_get_module_group): New function.
	(daf_dm_get_entity_name): Support for DTD drivers is added.  Use
	uppercase'ized name for DTD module sets (to align with
	HTML WG's DTD modules).

1 #!/usr/bin/perl -w
2 use strict;
3 use Message::Util::QName::Filter {
4 c => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core#>,
5 DIS => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/DIS#>,
6 dis => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis-->,
7 dp => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/DIS#Perl/>,
8 fe => q<http://suika.fam.cx/www/2006/feature/>,
9 ManakaiDOM => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#>,
10 pc => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/PerlCode#>,
11 swcfg21 => q<http://suika.fam.cx/~wakaba/archive/2005/swcfg21#>,
12 Util => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/>,
13 };
14
15 our$VERSION=do{my @r=(q$Revision: 1.16 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
16 use Cwd;
17 use Getopt::Long;
18 use Pod::Usage;
19 our %Opt = (create_module => []);
20 my @target_modules;
21 GetOptions (
22 'create-dtd-driver=s' => sub {
23 shift;
24 my $i = [split /\s+/, shift, 3];
25 $i->[3] = 'dtd-driver';
26 push @{$Opt{create_module}}, $i;
27 },
28 'create-dtd-modules=s' => sub {
29 shift;
30 my $i = [split /\s+/, shift, 3];
31 $i->[3] = 'dtd-modules';
32 push @{$Opt{create_module}}, $i;
33 },
34 'create-perl-module=s' => sub {
35 shift;
36 my $i = [split /\s+/, shift, 3];
37 $i->[3] = 'perl-pm';
38 push @{$Opt{create_module}}, $i;
39 push @target_modules, [$i->[0], $i->[2]];
40 },
41 'create-perl-test=s' => sub {
42 shift;
43 my $i = [split /\s+/, shift, 3];
44 $i->[3] = 'perl-t';
45 push @{$Opt{create_module}}, $i;
46 push @target_modules, [$i->[0], $i->[2]];
47 },
48 'debug' => \$Opt{debug},
49 'dis-file-suffix=s' => \$Opt{dis_suffix},
50 'daem-file-suffix=s' => \$Opt{daem_suffix},
51 'dafs-file-suffix=s' => \$Opt{dafs_suffix},
52 'dafx-file-suffix=s' => \$Opt{dafx_suffix},
53 'dtd-file-suffix=s' => \$Opt{dtd_suffix},
54 'help' => \$Opt{help},
55 'load-module=s' => sub {
56 shift;
57 my $i = [split /\s+/, shift, 2];
58 push @target_modules, [$i->[0], $i->[1]];
59 },
60 'mod-file-suffix=s' => \$Opt{mod_suffix},
61 'search-path|I=s' => sub {
62 shift;
63 my @value = split /\s+/, shift;
64 while (my ($ns, $path) = splice @value, 0, 2, ()) {
65 unless (defined $path) {
66 die qq[$0: Search-path parameter without path: "$ns"];
67 }
68 push @{$Opt{input_search_path}->{$ns} ||= []}, $path;
69 }
70 },
71 'search-path-catalog-file-name=s' => sub {
72 shift;
73 require File::Spec;
74 my $path = my $path_base = shift;
75 $path_base =~ s#[^/]+$##;
76 $Opt{search_path_base} = $path_base;
77 open my $file, '<', $path or die "$0: $path: $!";
78 while (<$file>) {
79 if (s/^\s*\@//) { ## Processing instruction
80 my ($target, $data) = split /\s+/;
81 if ($target eq 'base') {
82 $Opt{search_path_base} = File::Spec->rel2abs ($data, $path_base);
83 } else {
84 die "$0: $target: Unknown target";
85 }
86 } elsif (/^\s*\#/) { ## Comment
87 #
88 } elsif (/\S/) { ## Catalog entry
89 s/^\s+//;
90 my ($ns, $path) = split /\s+/;
91 push @{$Opt{input_search_path}->{$ns} ||= []},
92 File::Spec->rel2abs ($path, $Opt{search_path_base});
93 }
94 }
95 ## NOTE: File paths with SPACEs are not supported
96 ## NOTE: Future version might use file: URI instead of file path.
97 },
98 'undef-check!' => \$Opt{no_undef_check},
99 'verbose!' => \$Opt{verbose},
100 ) or pod2usage (2);
101 pod2usage ({-exitval => 0, -verbose => 1}) if $Opt{help};
102 $Opt{no_undef_check} = defined $Opt{no_undef_check}
103 ? $Opt{no_undef_check} ? 0 : 1 : 0;
104 $Opt{dis_suffix} = '.dis' unless defined $Opt{dis_suffix};
105 $Opt{daem_suffix} = '.dafm' unless defined $Opt{daem_suffix};
106 $Opt{dafx_suffix} = '.dafx' unless defined $Opt{dafx_suffix};
107 $Opt{dafs_suffix} = '.dafs' unless defined $Opt{dafs_suffix};
108 $Opt{dtd_suffix} = '.dtd' unless defined $Opt{dtd_suffix};
109 $Opt{mod_suffix} = '.mod' unless defined $Opt{mod_suffix};
110 $Message::DOM::DOMFeature::DEBUG = 1 if $Opt{debug};
111 require Error;
112 $Error::Debug = 1 if $Opt{debug};
113 $Message::Util::Error::VERBOSE = 1 if $Opt{verbose};
114
115 sub status_msg ($) {
116 my $s = shift;
117 $s .= "\n" unless $s =~ /\n$/;
118 print STDERR $s;
119 }
120
121 sub status_msg_ ($) {
122 my $s = shift;
123 print STDERR $s;
124 }
125
126 sub verbose_msg ($) {
127 my $s = shift;
128 $s .= "\n" unless $s =~ /\n$/;
129 print STDERR $s if $Opt{verbose};
130 }
131
132 sub verbose_msg_ ($) {
133 my $s = shift;
134 print STDERR $s if $Opt{verbose};
135 }
136
137 ## ---- The MAIN Program
138
139 my $start_time;
140 BEGIN { $start_time = time }
141
142 use Message::Util::DIS::DNLite;
143
144 my %feature;
145
146 for (@{$Opt{create_module}}) {
147 my (undef, undef, undef, $out_type) = @$_;
148
149 if ($out_type eq 'perl-pm') {
150 require 'manakai/daf-perl-pm.pl';
151 $feature{'+' . ExpandedURI q<Util:PerlCode>} = '1.0';
152 } elsif ($out_type eq 'perl-t') {
153 require 'manakai/daf-perl-t.pl';
154 $feature{ExpandedURI q<fe:GenericLS>} = '3.0';
155 $feature{'+' . ExpandedURI q<DIS:TDT>} = '1.0';
156 $feature{'+' . ExpandedURI q<Util:PerlCode>} = '1.0';
157 } elsif ($out_type eq 'dtd-modules') {
158 require 'manakai/daf-dtd-modules.pl';
159 $feature{ExpandedURI q<fe:GenericLS>} = '3.0';
160 $feature{'+' . ExpandedURI q<fe:XDP>} = '3.0';
161 } elsif ($out_type eq 'dtd-driver') {
162 require 'manakai/daf-dtd-modules.pl';
163 $feature{ExpandedURI q<fe:GenericLS>} = '3.0';
164 $feature{'+' . ExpandedURI q<fe:XDP>} = '3.0';
165 }
166 }
167
168 our $limpl = $Message::DOM::ImplementationRegistry->get_implementation
169 ({ExpandedURI q<fe:Min> => '3.0',
170 '+' . ExpandedURI q<DIS:DNLite> => '1.0',
171 '+' . ExpandedURI q<DIS:Core> => '1.0',
172 %feature,
173 });
174 our $impl = $limpl->get_feature (ExpandedURI q<DIS:Core> => '1.0');
175
176 ## --- Loading and Updating the Database
177
178 my $HasError;
179 our $db = $impl->create_dis_database;
180 $db->pl_database_module_resolver (\&daf_db_module_resolver);
181 $db->dom_config->set_parameter ('error-handler' => \&daf_on_error);
182
183 my $parser = $impl->create_dis_parser;
184 my $DNi = $impl->get_feature (ExpandedURI q<DIS:DNLite> => '1.0');
185 my %ModuleSourceDISDocument;
186 my %ModuleSourceDNLDocument;
187 my %ModuleNameNamespaceBinding = (
188 DISCore => q<http://suika.fam.cx/~wakaba/archive/2004/dis/Core#>,
189 ## This builtin binding is required since
190 ## some module has |DISCore:author| property before |dis:Require|
191 ## property.
192 );
193
194 my $ResourceCount = 0;
195 $db->pl_update_module (\@target_modules,
196 get_module_index_file_name => sub {
197 shift; # $db
198 daf_get_module_index_file_name (@_);
199 },
200 get_module_source_document_from_uri => sub {
201 my ($db, $module_uri, $module_for) = @_;
202 status_msg '';
203 status_msg qq<Loading module <$module_uri> for <$module_for>...>;
204 $ResourceCount = 0;
205
206 unless (defined $ModuleSourceDNLDocument{$module_uri}) {
207 unless (defined $ModuleSourceDISDocument{$module_uri}) {
208 daf_open_source_dis_document ($module_uri);
209 }
210 daf_convert_dis_document_to_dnl_document ();
211 }
212 return $ModuleSourceDNLDocument{$module_uri};
213 },
214 get_module_source_document_from_resource => sub ($$$$$$) {
215 my ($self, $db, $uri, $ns, $ln, $for) = @_;
216 status_msg '';
217 status_msg qq<Loading module "$ln" for <$for>...>;
218 $ResourceCount = 0;
219
220 my $module_uri = $ns.$ln;
221 unless (defined $ModuleSourceDNLDocument{$module_uri}) {
222 unless (defined $ModuleSourceDISDocument{$module_uri}) {
223 daf_open_source_dis_document ($module_uri);
224 }
225 daf_convert_dis_document_to_dnl_document ();
226 }
227 return $ModuleSourceDNLDocument{$module_uri};
228 },
229 get_module_source_revision => sub {
230 my ($db, $module_uri) = @_;
231 my $ns = $module_uri;
232 $ns =~ s/(\w+)\z//;
233 my $ln = $1;
234
235 my $name = dac_search_file_path_stem ($ns, $ln, $Opt{dis_suffix});
236 if (defined $name) {
237 return [stat $name.$Opt{dis_suffix}]->[9];
238 } else {
239 return 0;
240 }
241 },
242 get_referring_module_uri_list => sub {
243 my ($db, $module_uri) = @_;
244 unless (defined $ModuleSourceDNLDocument{$module_uri}) {
245 unless (defined $ModuleSourceDISDocument{$module_uri}) {
246 daf_open_source_dis_document ($module_uri);
247 }
248 }
249 return daf_get_referring_module_uri_list ($module_uri);
250 },
251 on_resource_read => sub ($$) {
252 if ((++$ResourceCount % 10) == 0) {
253 status_msg_ "*";
254 status_msg_ " " if ($ResourceCount % (10 * 10)) == 0;
255 status_msg '' if ($ResourceCount % (10 * 50)) == 0;
256 }
257 });
258
259
260 ## Removes reference from document to database
261 our @Document;
262 for my $dis (@Document) {
263 $dis->unlink_from_document;
264 $dis->dis_database (undef);
265 }
266
267 status_msg '';
268
269 status_msg qq<Reading properties...>;
270 $ResourceCount = 0;
271 $db->read_properties (on_resource_read => sub ($$) {
272 if ((++$ResourceCount % 10) == 0) {
273 status_msg_ "*";
274 status_msg_ " " if ($ResourceCount % (10 * 10)) == 0;
275 status_msg '' if ($ResourceCount % (10 * 50)) == 0;
276 }
277 }, implementation => $impl);
278 status_msg '';
279 status_msg "done";
280
281 status_msg_ qq<Writing database files...>;
282 $db->pl_store ('dummy', sub ($$) {
283 my ($db, $mod, $type) = @_;
284 my $ns = $mod->namespace_uri;
285 my $ln = $mod->local_name;
286 my $suffix = $type eq ExpandedURI q<dp:ModuleIndexFile>
287 ? $Opt{dafx_suffix} : $Opt{daem_suffix};
288 my $name = dac_search_file_path_stem ($ns, $ln, $suffix);
289 if (defined $name) {
290 $name .= $suffix;
291 } elsif (defined ($name = dac_search_file_path_stem
292 ($ns, $ln, $Opt{dis_suffix}))) {
293 $name .= $suffix;
294 } else {
295 $name = Cwd::abs_path
296 (File::Spec->canonpath
297 (File::Spec->catfile
298 (defined $Opt{input_search_path}->{$ns}->[0]
299 ? $Opt{input_search_path}->{$ns}->[0] : '.',
300 $ln.$suffix)));
301 }
302 verbose_msg qq<Database >.
303 ($type eq <Q::dp|ModuleIndexFile> ? 'index' : 'module').
304 qq< <$ns$ln> is written to "$name">;
305 return $name;
306 }, no_main_database => 1);
307 status_msg "done";
308
309 daf_check_undefined ();
310
311 undef $DNi;
312 undef %ModuleSourceDNLDocument;
313 exit $HasError if $HasError;
314
315 ## --- Creating Files
316
317 for (@{$Opt{create_module}}) {
318 my ($mod_uri, $out_file_path, $mod_for, $out_type) = @$_;
319
320 if ($out_type eq 'perl-pm') {
321 daf_perl_pm ($mod_uri, $out_file_path, $mod_for);
322 } elsif ($out_type eq 'perl-t') {
323 daf_perl_t ($mod_uri, $out_file_path, $mod_for);
324 } elsif ($out_type eq 'dtd-modules') {
325 daf_dtd_modules ($mod_uri, $out_file_path, $mod_for);
326 } elsif ($out_type eq 'dtd-driver') {
327 daf_dtd_driver ($mod_uri, $out_file_path, $mod_for);
328 }
329 }
330
331 daf_check_undefined ();
332
333 ## --- The END
334
335 status_msg_ "Closing the database...";
336 $db->free;
337 undef $db;
338 status_msg "done";
339
340 undef $limpl;
341 undef $impl;
342
343 {
344 use integer;
345 my $time = time - $start_time;
346 status_msg sprintf qq<%d'%02d''>, $time / 60, $time % 60;
347 }
348 exit $HasError;
349
350 END {
351 $db->free if $db;
352 }
353
354 ## ---- Subroutines
355
356 sub daf_open_source_dis_document ($) {
357 my ($module_uri) = @_;
358
359 ## -- Finds |dis| source file
360 my $ns = $module_uri;
361 $ns =~ s/(\w+)\z//;
362 my $ln = $1;
363 my $file_name = dac_search_file_path_stem ($ns, $ln, $Opt{dis_suffix});
364 unless (defined $file_name) {
365 die "$0: Source file for <$ns$ln> is not found";
366 }
367 $file_name .= $Opt{dis_suffix};
368
369 status_msg_ qq<Opening dis source file "$file_name"...>;
370
371 ## -- Opens |dis| file and construct |DISDocument| tree
372 open my $file, '<', $file_name or die "$0: $file_name: $!";
373 my $dis = $parser->parse ({character_stream => $file});
374 require File::Spec;
375 $dis->flag (ExpandedURI q<swcfg21:fileName> =>
376 File::Spec->abs2rel ($file_name));
377 $dis->dis_namespace_resolver (\&daf_module_name_namespace_resolver);
378 close $file;
379
380 ## -- Registers namespace URI
381 my $mod = $dis->module_element;
382 if ($mod) {
383 my $qn = $mod->get_attribute_ns (ExpandedURI q<dis:>, 'QName');
384 if ($qn) {
385 my $prefix = $qn->value;
386 $prefix =~ s/^[^:|]*[:|]\s*//;
387 $prefix =~ s/\s+$//;
388 unless (defined $ModuleNameNamespaceBinding{$prefix}) {
389 $ModuleNameNamespaceBinding{$prefix} = $mod->defining_namespace_uri;
390 }
391 }
392 }
393
394 $ModuleSourceDISDocument{$module_uri} = $dis;
395 status_msg q<done>;
396
397 R: for (@{daf_get_referring_module_uri_list ($module_uri)}) {
398 next R if defined $db->{modDef}->{$_};
399 next R if defined $ModuleSourceDNLDocument{$_};
400 next R if defined $ModuleSourceDISDocument{$_};
401 my $idx_file_name = daf_get_module_index_file_name ($_);
402 if (-f $idx_file_name) {
403 daf_open_current_module_index ($_, $idx_file_name);
404 } else {
405 daf_open_source_dis_document ($_);
406 }
407 }
408 } # daf_open_source_dis_document
409
410 sub daf_open_current_module_index ($$) {
411 my ($module_uri, $file_name) = @_;
412 $db->pl_load_dis_database_index ($file_name);
413
414 R: for (@{$db->get_module ($module_uri)
415 ->get_referring_module_uri_list}) {
416 next R if defined $db->{modDef}->{$_};
417 next R if defined $ModuleSourceDNLDocument{$_};
418 next R if defined $ModuleSourceDISDocument{$_};
419 my $idx_file_name = daf_get_module_index_file_name ($_);
420 if (-f $idx_file_name) {
421 daf_open_current_module_index ($_, $idx_file_name);
422 } else {
423 daf_open_source_dis_document ($_);
424 }
425 }
426 } # daf_open_current_module_index
427
428 sub daf_convert_dis_document_to_dnl_document () {
429 M: for my $module_uri (keys %ModuleSourceDISDocument) {
430 my $dis_doc = $ModuleSourceDISDocument{$module_uri};
431 next M unless $dis_doc;
432 verbose_msg_ qq<Converting <$module_uri>...>;
433 my $dnl_doc = $DNi->convert_dis_document_to_dnl_document
434 ($dis_doc, database_arg => $db,
435 base_namespace_binding =>
436 {(map {$_->local_name => $_->target_namespace_uri}
437 grep {$_} values %{$db->{modDef}}),
438 %ModuleNameNamespaceBinding});
439 push @Document, $dnl_doc;
440 $ModuleSourceDNLDocument{$module_uri} = $dnl_doc;
441 $dis_doc->free;
442 delete $ModuleSourceDISDocument{$module_uri};
443 verbose_msg q<done>;
444 }
445 } # daf_convert_dis_document_to_dnl_document
446
447 sub daf_get_referring_module_uri_list ($) {
448 my $module_uri = shift;
449 my $ns = $module_uri;
450 $ns =~ s/\w+\z//;
451 my $src = $ModuleSourceDNLDocument{$module_uri};
452 $src = $ModuleSourceDISDocument{$module_uri} unless defined $src;
453 my $mod_el = $src->module_element;
454 my $r = [];
455 if ($mod_el) {
456 my $req_el = $mod_el->require_element;
457 if ($req_el) {
458 M: for my $m_el (@{$req_el->child_nodes}) {
459 next M unless $m_el->node_type eq '#element';
460 next M unless $m_el->expanded_uri eq ExpandedURI q<dis:Module>;
461 my $qn_el = $m_el->get_attribute_ns (ExpandedURI q<dis:>, 'QName');
462 if ($qn_el) {
463 push @$r, $qn_el->qname_value_uri;
464 } else {
465 my $n_el = $m_el->get_attribute_ns (ExpandedURI q<dis:>, 'Name');
466 if ($n_el) {
467 push @$r, $ns.$n_el->value;
468 } else {
469 # The module itself
470 }
471 }
472 }
473 }
474 }
475 return $r;
476 } # daf_get_referring_module_uri_list
477
478 sub dac_search_file_path_stem ($$$) {
479 my ($ns, $ln, $suffix) = @_;
480 require File::Spec;
481 for my $dir (@{$Opt{input_search_path}->{$ns}||[]}) {
482 my $name = Cwd::abs_path
483 (File::Spec->canonpath
484 (File::Spec->catfile ($dir, $ln)));
485 if (-f $name.$suffix) {
486 return $name;
487 }
488 }
489 return undef;
490 } # dac_search_file_path_stem;
491
492 sub daf_get_module_index_file_name ($$) {
493 my ($module_uri) = @_;
494 my $ns = $module_uri;
495 $ns =~ s/(\w+)\z//;
496 my $ln = $1;
497
498 verbose_msg qq<Database module index <$module_uri> is requested>;
499 my $suffix = $Opt{dafx_suffix};
500 my $name = dac_search_file_path_stem ($ns, $ln, $suffix);
501 if (defined $name) {
502 $name .= $suffix;
503 } elsif (defined ($name = dac_search_file_path_stem
504 ($ns, $ln, $Opt{dis_suffix}))) {
505 $name .= $suffix;
506 } else {
507 $name = Cwd::abs_path
508 (File::Spec->canonpath
509 (File::Spec->catfile
510 (defined $Opt{input_search_path}->{$ns}->[0]
511 ? $Opt{input_search_path}->{$ns}->[0] : '.',
512 $ln.$suffix)));
513 }
514 return $name;
515 } # daf_get_module_index_file_name
516
517 sub daf_module_name_namespace_resolver ($) {
518 my $prefix = shift;
519
520 ## -- From modules in database
521 M: for (values %{$db->{modDef}}) {
522 my $mod = $_;
523 next M unless defined $mod;
524 if ($mod->local_name eq $prefix) {
525 return $mod->target_namespace_uri;
526 }
527 }
528
529 ## -- From not-in-database-yet module list
530 if (defined $ModuleNameNamespaceBinding{$prefix}) {
531 return $ModuleNameNamespaceBinding{$prefix};
532 }
533 return undef;
534 } # daf_module_name_namespace_resolver
535
536 sub daf_db_module_resolver ($$$) {
537 my ($db, $mod, $type) = @_;
538 my $ns = $mod->namespace_uri;
539 my $ln = $mod->local_name;
540 my $suffix = {
541 ExpandedURI q<dp:ModuleIndexFile> => $Opt{dafx_suffix},
542 ExpandedURI q<dp:ModuleResourceFile> => $Opt{daem_suffix},
543 ExpandedURI q<dp:ModuleNodeStorageFile> => $Opt{dafs_suffix},
544 }->{$type} or die "Unsupported type: <$type>";
545 verbose_msg qq<Database module <$ns$ln> is requested>;
546 my $name = dac_search_file_path_stem ($ns, $ln, $suffix);
547 if (defined $name) {
548 return $name.$suffix;
549 } else {
550 return undef;
551 }
552 } # daf_db_module_resolver
553
554 sub daf_on_error ($$) {
555 my ($self, $err) = @_;
556 if ($err->severity == $err->SEVERITY_WARNING) {
557 my $info = ExpandedURI q<dp:info>;
558 if ($err->type =~ /\Q$info\E/) {
559 my $msg = $err->text;
560 if ($msg =~ /\.\.\.\z/) {
561 verbose_msg_ $msg;
562 } else {
563 verbose_msg $msg;
564 }
565 } else {
566 my $msg = $err->text;
567 if ($msg =~ /\.\.\.\z/) {
568 status_msg_ $msg;
569 } else {
570 status_msg $msg;
571 }
572 }
573 } else {
574 warn $err;
575 $HasError = 1;
576 }
577 } # daf_on_error
578
579 sub daf_check_undefined () {
580 unless ($Opt{no_undef_check}) {
581 status_msg_ "Checking undefined resources...";
582 $db->check_undefined_resource;
583 print STDERR "done\n";
584 }
585 } # daf_check_undefined
586
587 __END__
588
589 =head1 NAME
590
591 dac.pl - Creating "dac" Database File from "dis" Source Files
592
593 =head1 SYNOPSIS
594
595 perl path/to/dac.pl [--input-db-file-name=input.dac] \
596 --output-file-name=out.dac [options...] \
597 input.dis
598 perl path/to/dac.pl --help
599
600 =head1 DESCRIPTION
601
602 This script, C<dac.pl>, compiles "dis" source files into "dac"
603 database file. The generated database file can be used
604 in turn to generate Perl module file, for example, by another
605 script C<dac2pm.pl> or can be used to create larger database
606 by specifying its file name as the C<--input-db-file-name>
607 argument of another C<dac.pl> execution.
608
609 This script is part of manakai.
610
611 =head1 OPTIONS
612
613 =over 4
614
615 =item I<input.dis> (Required)
616
617 The unnamed option specifies a file name path of the source "dis" file
618 from which a database is created. This option is required.
619
620 =item C<--input-db-file-name=I<file-name>> (Default: none)
621
622 A file path of the base database. This option is optional; if this
623 option is specified, the database file is loaded first
624 and then I<input.dis> file is loaded in the context of it.
625 Otherwise, a new database is created.
626
627 =back
628
629 =head1 SEE ALSO
630
631 L<lib/Message/Util/DIS.dis> - The actual implementation
632 of the "dis" interpretation.
633
634 =head1 LICENSE
635
636 Copyright 2004-2006 Wakaba <w@suika.fam.cx>. All rights reserved.
637
638 This program is free software; you can redistribute it and/or
639 modify it under the same terms as Perl itself.
640
641 =cut

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24