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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide annotations) (download)
Fri Mar 4 12:18:52 2005 UTC (19 years, 8 months ago) by wakaba
Branch: MAIN
Changes since 1.2: +8 -5 lines
File MIME type: text/plain
lib/Message/Markup/SuikaWikiConfig21.dis (nodePath): Use realQualifiedName instead of qualifiedName; lib/Message/Util/DIS.dis: plStore and plLoadDISDatabase added; lib/Message/Util/ManakaiNode.dis: Non-nodal value bug fixed for SuikaWikiConfig21 support

1 wakaba 1.1 #!/usr/bin/perl -w
2     use strict;
3     use Message::Util::QName::Filter {
4     DIS => q<http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/DIS#>,
5     dis => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis-->,
6     ManakaiDOM => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#>,
7 wakaba 1.3 swcfg21 => q<http://suika.fam.cx/~wakaba/archive/2005/swcfg21#>,
8 wakaba 1.1 };
9    
10     use Getopt::Long;
11     use Pod::Usage;
12     use Storable qw/nstore retrieve/;
13     my %Opt;
14     GetOptions (
15     'db-base-directory-path=s' => \$Opt{db_base_path},
16     'for=s' => \$Opt{For},
17     'help' => \$Opt{help},
18     'input-cdis-file-name=s' => \$Opt{input_file_name},
19     'output-file-name=s' => \$Opt{output_file_name},
20 wakaba 1.2 'search-path|I=s' => sub {
21     shift;
22     my @value = split /\s+/, shift;
23     while (my ($ns, $path) = splice @value, 0, 2, ()) {
24     push @{$Opt{input_search_path}->{$ns} ||= []}, $path;
25     }
26     },
27 wakaba 1.1 'undef-check!' => \$Opt{no_undef_check},
28     'verbose!' => $Opt{verbose},
29     ) or pod2usage (2);
30     pod2usage ({-exitval => 0, -verbose => 1}) if $Opt{help};
31     $Opt{file_name} = shift;
32     pod2usage ({-exitval => 2, -verbose => 0}) unless $Opt{file_name};
33     pod2usage ({-exitval => 2, -verbose => 0}) unless $Opt{output_file_name};
34     $Opt{no_undef_check} = defined $Opt{no_undef_check}
35     ? $Opt{no_undef_check} ? 0 : 1 : 0;
36     push @{$Opt{module_file_search_path}}, '.';
37    
38     use Message::DOM::DOMMetaImpl;
39     use Message::Util::DIS;
40     my $impl = $Message::DOM::DOMImplementationRegistry
41     ->get_dom_implementation
42     ({ExpandedURI q<ManakaiDOM:Minimum> => '3.0',
43     '+' . ExpandedURI q<DIS:Core> => '1.0'})
44     ->get_feature (ExpandedURI q<DIS:Core> => '1.0');
45     my $parser = $impl->create_dis_parser;
46    
47     my $db;
48    
49     if (defined $Opt{input_file_name}) {
50 wakaba 1.3 $db = $impl->pl_load_dis_database ($Opt{input_file_name});
51 wakaba 1.1 } else { ## New database
52     $db = $impl->create_dis_database;
53     }
54    
55     require Cwd;
56     my $file_name = Cwd::abs_path ($Opt{file_name});
57     my $base_path = Cwd::abs_path ($Opt{db_base_path}) if length $Opt{db_base_path};
58     my $doc = dac_load_module_file ($db, $parser, $file_name, $base_path);
59     $doc->dis_database ($db);
60    
61     my $for = $Opt{for};
62     $for = $doc->module_element->default_for_uri unless length $for;
63 wakaba 1.3 $db->get_for ($for)->is_referred ($doc);
64 wakaba 1.2 print STDERR qq<Loading definition of "$file_name" for <$for>...\n>;
65 wakaba 1.1
66     $db->load_module ($doc, sub ($$$$$$) {
67     my ($self, $db, $uri, $ns, $ln, $for) = @_;
68 wakaba 1.2 print STDERR qq<Loading definition of "$ln" for <$for>...\n>;
69    
70     ## -- Already in database
71 wakaba 1.1 my $doc = $db->get_source_file ($ns.$ln);
72 wakaba 1.2 return $doc if $doc;
73 wakaba 1.1
74 wakaba 1.2 ## -- Finds the source file
75     require File::Spec;
76     for my $dir ('.', @{$Opt{input_search_path}->{$ns}||[]}) {
77     my $name = Cwd::abs_path
78     (File::Spec->canonpath
79     (File::Spec->catfile ($dir, $ln.'.dis')));
80     if (-f $name) {
81     my $doc = dac_load_module_file ($db, $parser, $name, $base_path);
82     $doc->dis_database ($db);
83     return $doc;
84     }
85     }
86    
87     ## -- Not found
88     return undef;
89 wakaba 1.1 }, for_arg => $for);
90    
91 wakaba 1.3
92     $db->check_undefined_resource unless $Opt{no_undef_check};
93    
94 wakaba 1.1 #if (dis_uri_for_match (ExpandedURI q<ManakaiDOM:Perl>, $State->{DefaultFor})) {
95     # dis_perl_init ($source, For => $State->{DefaultFor});
96     #}
97    
98 wakaba 1.3 $db->pl_store ($Opt{output_file_name});
99 wakaba 1.1 exit;
100    
101     ## (db, parser, abs file path, abs base path) -> dis doc obj
102     sub dac_load_module_file ($$$;$) {
103     my ($db, $parser, $file_name, $base_path) = @_;
104     require URI::file;
105     my $base_uri = length $base_path ? URI::file->new ($base_path.'/')
106     : 'http://dummy.invalid/';
107     my $file_uri = URI::file->new ($file_name)->rel ($base_uri);
108     my $dis = $db->get_source_file ($file_uri);
109     unless ($dis) {
110 wakaba 1.2 print STDERR qq<Opening file "$file_name"...>;
111 wakaba 1.1 open my $file, '<', $file_name or die "$0: $file_name: $!";
112     $dis = $parser->parse ({character_stream => $file});
113     $db->set_source_file ($file_uri => $dis);
114 wakaba 1.3 $dis->flag (ExpandedURI q<swcfg21:fileName> => $file_uri);
115 wakaba 1.2 print STDERR qq<done\n>;
116 wakaba 1.1 }
117     $dis;
118     }
119    
120     __END__
121    
122     =head1 NAME
123    
124     ...
125    
126     =head1 OPTIONS
127    
128     ...
129 wakaba 1.2
130     =cut

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24