| 1 |
wakaba |
1.1 |
#!/usr/bin/perl -w |
| 2 |
|
|
use strict; |
| 3 |
wakaba |
1.7 |
use Message::Util::QName::Filter { |
| 4 |
|
|
d => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis-->, |
| 5 |
|
|
dis2pm => q<http://suika.fam.cx/~wakaba/archive/2004/11/8/dis2pm#>, |
| 6 |
|
|
DOMCore => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core#>, |
| 7 |
|
|
DOMMain => q<http://suika.fam.cx/~wakaba/archive/2004/dom/main#>, |
| 8 |
|
|
lang => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#>, |
| 9 |
|
|
Perl => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#Perl-->, |
| 10 |
|
|
license => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/license#>, |
| 11 |
|
|
ManakaiDOM => q<http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#>, |
| 12 |
|
|
owl => q<http://www.w3.org/2002/07/owl#>, |
| 13 |
|
|
rdf => q<http://www.w3.org/1999/02/22-rdf-syntax-ns#>, |
| 14 |
|
|
rdfs => q<http://www.w3.org/2000/01/rdf-schema#>, |
| 15 |
|
|
}; |
| 16 |
wakaba |
1.1 |
|
| 17 |
wakaba |
1.4 |
use Getopt::Long; |
| 18 |
wakaba |
1.5 |
use Pod::Usage; |
| 19 |
wakaba |
1.4 |
my %Opt; |
| 20 |
|
|
GetOptions ( |
| 21 |
wakaba |
1.5 |
'for=s' => \$Opt{For}, |
| 22 |
wakaba |
1.4 |
'help' => \$Opt{help}, |
| 23 |
wakaba |
1.7 |
'verbose!' => $Opt{verbose}, |
| 24 |
wakaba |
1.4 |
) or pod2usage (2); |
| 25 |
|
|
if ($Opt{help}) { |
| 26 |
|
|
pod2usage (0); |
| 27 |
|
|
exit; |
| 28 |
wakaba |
1.1 |
} |
| 29 |
wakaba |
1.7 |
$Opt{file_name} = shift; |
| 30 |
wakaba |
1.1 |
|
| 31 |
|
|
BEGIN { |
| 32 |
wakaba |
1.5 |
require 'manakai/genlib.pl'; |
| 33 |
|
|
require 'manakai/dis.pl'; |
| 34 |
wakaba |
1.4 |
} |
| 35 |
wakaba |
1.5 |
our $State; |
| 36 |
wakaba |
1.7 |
our $result = ''; |
| 37 |
wakaba |
1.4 |
|
| 38 |
wakaba |
1.7 |
eval q{ |
| 39 |
|
|
sub impl_msg ($;%) { |
| 40 |
|
|
warn shift () . "\n"; |
| 41 |
wakaba |
1.1 |
} |
| 42 |
wakaba |
1.7 |
} unless $Opt{verbose}; |
| 43 |
wakaba |
1.1 |
|
| 44 |
wakaba |
1.5 |
sub perl_change_package (%) { |
| 45 |
wakaba |
1.7 |
my %opt = @_; |
| 46 |
|
|
my $fn = $opt{full_name}; |
| 47 |
|
|
unless ($fn eq $State->{ExpandedURI q<dis2pm:currentPackage>}) { |
| 48 |
|
|
$State->{ExpandedURI q<dis2pm:currentPackage>} = $fn; |
| 49 |
wakaba |
1.1 |
return perl_statement qq<package $fn>; |
| 50 |
|
|
} else { |
| 51 |
|
|
return ''; |
| 52 |
|
|
} |
| 53 |
wakaba |
1.5 |
} # perl_change_package |
| 54 |
wakaba |
1.1 |
|
| 55 |
wakaba |
1.7 |
$State->{DefaultFor} = $Opt{For}; |
| 56 |
wakaba |
1.6 |
|
| 57 |
wakaba |
1.5 |
my $source = dis_load_module_file (module_file_name => $Opt{file_name}, |
| 58 |
wakaba |
1.7 |
For => $Opt{For}, |
| 59 |
wakaba |
1.5 |
use_default_for => 1); |
| 60 |
|
|
$State->{for_def_required}->{$State->{DefaultFor}} ||= 1; |
| 61 |
wakaba |
1.3 |
|
| 62 |
wakaba |
1.7 |
dis_check_undef_type_and_for () unless $Opt{no_undef_check}; |
| 63 |
|
|
|
| 64 |
|
|
if (dis_uri_for_match (ExpandedURI q<ManakaiDOM:Perl>, $State->{DefaultFor})) { |
| 65 |
|
|
dis_perl_init ($source, For => $State->{DefaultFor}); |
| 66 |
|
|
} |
| 67 |
wakaba |
1.1 |
|
| 68 |
wakaba |
1.7 |
$State->{ExpandedURI q<dis2pm:currentPackage>} = 'main'; |
| 69 |
|
|
$result .= "#!/usr/bin/perl \n"; |
| 70 |
wakaba |
1.5 |
$result .= perl_comment q<This file is automatically generated from> . "\n" . |
| 71 |
|
|
q<"> . $Opt{file_name} . q<" at > . |
| 72 |
|
|
rfc3339_date (time) . qq<.\n> . |
| 73 |
|
|
q<Don't edit by hand!>; |
| 74 |
|
|
$result .= perl_statement q<use strict>; |
| 75 |
wakaba |
1.7 |
$result .= perl_change_package |
| 76 |
|
|
(full_name => $State->{Module}->{$State->{module}} |
| 77 |
|
|
->{ExpandedURI q<dis2pm:packageName>}); |
| 78 |
|
|
$result .= perl_statement |
| 79 |
|
|
perl_assign |
| 80 |
|
|
perl_var (type => '$', local_name => 'VERSION', |
| 81 |
|
|
scope => 'our') |
| 82 |
|
|
=> perl_literal version_date time; |
| 83 |
|
|
|
| 84 |
|
|
for my $pack (values %{$State->{Module}->{$State->{module}} |
| 85 |
|
|
->{ExpandedURI q<dis2pm:package>}||{}}) { |
| 86 |
|
|
next unless defined $pack->{Name}; |
| 87 |
|
|
if ({ |
| 88 |
|
|
ExpandedURI q<ManakaiDOM:Class> => 1, |
| 89 |
|
|
ExpandedURI q<ManakaiDOM:IF> => 1, |
| 90 |
|
|
ExpandedURI q<ManakaiDOM:ExceptionClass> => 1, |
| 91 |
|
|
ExpandedURI q<ManakaiDOM:ExceptionIF> => 1, |
| 92 |
|
|
ExpandedURI q<ManakaiDOM:WarningIF> => 1, |
| 93 |
|
|
}->{$pack->{ExpandedURI q<dis2pm:type>}}) { |
| 94 |
|
|
## Package name and version |
| 95 |
|
|
$result .= perl_change_package |
| 96 |
|
|
(full_name => $pack->{ExpandedURI q<dis2pm:packageName>}); |
| 97 |
|
|
$result .= perl_statement |
| 98 |
|
|
perl_assign |
| 99 |
|
|
perl_var (type => '$', local_name => 'VERSION', |
| 100 |
|
|
scope => 'our') |
| 101 |
|
|
=> perl_literal version_date time; |
| 102 |
|
|
## Inheritance |
| 103 |
|
|
my @isa; |
| 104 |
|
|
for my $uri (@{$pack->{ISA}||[]}, @{$pack->{Implement}||[]}) { |
| 105 |
|
|
my $pack = $State->{Type}->{$uri}; |
| 106 |
|
|
if (defined $pack->{ExpandedURI q<dis2pm:packageName>}) { |
| 107 |
|
|
push @isa, $pack->{ExpandedURI q<dis2pm:packageName>}; |
| 108 |
|
|
} else { |
| 109 |
|
|
impl_msg ("Inheriting package name for <$uri> not defined", |
| 110 |
|
|
node => $pack->{src}) if $Opt{verbose}; |
| 111 |
|
|
} |
| 112 |
|
|
} |
| 113 |
|
|
$result .= perl_inherit \@isa; |
| 114 |
|
|
## Members |
| 115 |
|
|
if ({ |
| 116 |
|
|
ExpandedURI q<ManakaiDOM:Class> => 1, |
| 117 |
|
|
ExpandedURI q<ManakaiDOM:ExceptionClass> => 1, |
| 118 |
|
|
ExpandedURI q<ManakaiDOM:WarningClass> => 1, |
| 119 |
|
|
}->{$pack->{ExpandedURI q<dis2pm:type>}}) { |
| 120 |
|
|
for my $method (values %{$pack->{ExpandedURI q<dis2pm:method>}}) { |
| 121 |
|
|
next unless defined $method->{Name}; |
| 122 |
|
|
if ($method->{ExpandedURI q<dis2pm:type>} eq |
| 123 |
|
|
ExpandedURI q<ManakaiDOM:DOMMethod>) { |
| 124 |
|
|
$result .= perl_sub |
| 125 |
|
|
(name => $method->{ExpandedURI q<dis2pm:methodName>}, |
| 126 |
|
|
code => ''); |
| 127 |
|
|
} elsif ($method->{ExpandedURI q<dis2pm:type>} eq |
| 128 |
|
|
ExpandedURI q<ManakaiDOM:DOMAttribute>) { |
| 129 |
|
|
$result .= perl_sub |
| 130 |
|
|
(name => $method->{ExpandedURI q<dis2pm:methodName>}, |
| 131 |
|
|
'prototype' |
| 132 |
|
|
=> (defined $method->{ExpandedURI q<dis2pm:setter>} |
| 133 |
|
|
->{Name} ? '$;$' : '$'), |
| 134 |
|
|
code => ''); |
| 135 |
|
|
} |
| 136 |
|
|
} # package method |
| 137 |
|
|
## TODO: Const |
| 138 |
|
|
} |
| 139 |
|
|
## TODO: Const |
| 140 |
|
|
} # root object |
| 141 |
|
|
} |
| 142 |
wakaba |
1.1 |
|
| 143 |
wakaba |
1.5 |
## Export |
| 144 |
|
|
if (keys %{$State->{perl_primary_module}->{perl_export_ok}||{}}) { |
| 145 |
|
|
$result .= perl_change_package |
| 146 |
|
|
full_name => $State->{perl_primary_module}->{perl_package_name}; |
| 147 |
|
|
$result .= perl_statement 'require Exporter'; |
| 148 |
|
|
$result .= perl_inherit ['Exporter']; |
| 149 |
|
|
$result .= perl_statement |
| 150 |
|
|
perl_assign |
| 151 |
|
|
perl_var (type => '@', scope => 'our', |
| 152 |
|
|
local_name => 'EXPORT_OK') |
| 153 |
|
|
=> '(' . perl_list (keys %{$State->{perl_primary_module} |
| 154 |
|
|
->{perl_export_ok}}) . ')'; |
| 155 |
|
|
if (keys %{$State->{perl_primary_module}->{perl_export_tags}||{}}) { |
| 156 |
|
|
$result .= perl_statement |
| 157 |
|
|
perl_assign |
| 158 |
|
|
perl_var (type => '%', scope => 'our', |
| 159 |
|
|
local_name => 'EXPORT_TAGS') |
| 160 |
|
|
=> '(' . perl_list (map { |
| 161 |
|
|
$_ => [keys %{$State->{perl_primary_module} |
| 162 |
|
|
->{perl_export_tags}->{$_}}] |
| 163 |
|
|
} keys %{$State->{perl_primary_module} |
| 164 |
|
|
->{perl_export_tags}}) . ')'; |
| 165 |
wakaba |
1.1 |
} |
| 166 |
|
|
} |
| 167 |
|
|
|
| 168 |
wakaba |
1.5 |
$result .= perl_statement 1; |
| 169 |
wakaba |
1.1 |
|
| 170 |
wakaba |
1.5 |
output_result $result; |
| 171 |
wakaba |
1.1 |
|
| 172 |
wakaba |
1.5 |
1; |