ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra/res2pm
Revision: 1.4
Committed: Wed Feb 22 22:05:53 2006 UTC (18 years, 2 months ago) by root
Branch: MAIN
Changes since 1.3: +0 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #!/opt/bin/perl
2
3 # usage: res2pm
4
5 open STDOUT, ">:utf8", "Crossfire/Data.pm"
6 or die "Crossfire/Data.pm: $!";
7
8 print <<EOF;
9 =head1 NAME
10
11 Crossfire::Data - various data structures useful for understanding archs and objects
12
13 =head1
14
15 THIS FILE IS AUTOGENERATED, DO NOT EDIT!
16
17 It's a translation of the following files:
18
19 res/spells.xml
20 res/types.xml
21 res/typenumbers.xml
22
23 See F<res/README> for more info.
24
25 =cut
26
27 EOF
28
29 use Data::Dumper;
30 use XML::Parser::Grove;
31
32 sub dump_hash {
33 my ($names, $refs) = @_;
34
35 $d = new Data::Dumper ($refs, [map "*$_", @$names]);
36 $d->Terse (1);
37 $d->Indent (1);
38 $d->Quotekeys (0);
39 $d->Useqq (0);
40 $d->Useperl(1);
41 $d->Sortkeys (sub {
42 [sort {
43 $a > 0 && $b > 0 ? $a <=> $b
44 : $a cmp $b
45 } keys %{+shift}]
46 });
47
48 my @vals = $d->Dump;
49
50 while (@vals) {
51 my $v = shift @vals;
52 $v =~ s/^ /\t\t/gm;
53 $v =~ s/^ /\t/gm;
54 $v =~ s/\s+$//;
55
56 my $name = shift @$names;
57 my $ref = shift @$refs;
58
59 my $sigil = ref $ref eq "ARRAY" ? '@' : '%';
60
61 print "our $sigil$name = $v;\n\n";
62 }
63 }
64
65 my $type = XML::Parser->new (Style => 'grove')->parsefile ("res/types.xml");
66
67 my %bitmask;
68 my %list;
69 my %type;
70 my %typename;
71 my @attr0;
72 my %attr;
73 my %ignore_list;
74 my %default_attr;
75 my %spell;
76
77 sub string($) {
78 local $_ = join "", @{shift->contents};
79 $_ =~ s/^\s+//;
80 $_ =~ s/\s+$//;
81 $_ =~ s/\s+/ /g;
82 $_
83 }
84
85 sub parse_attr {
86 my ($e, $sect) = @_;
87
88 my $arch = {
89 type => $e->attr ("type"),
90 name => $e->attr ("editor"),
91 desc => string $e,
92 $e->attr("arch_begin") ? (end => $e->attr("arch_end")) : (),
93 };
94
95 delete $arch->{name} unless defined $arch->{name};
96 delete $arch->{desc} unless length $arch->{desc};
97
98 if ($arch->{type} =~ s/^(bitmask)_(.*)/$1/) {
99 $arch->{value} = $bitmask{$2} ||= {};
100 } elsif ($arch->{type} =~ s/^(list)_(.*)/$1/) {
101 $arch->{value} = $list{$2} ||= {};
102 } elsif ($arch->{type} =~ s/^bool_special$/bool/) {
103 $arch->{value} = [$e->attr ("false"), $e->attr ("true")];
104 }
105
106 $sect->{$e->attr ("arch") || $e->attr("arch_begin")} = $arch;
107 }
108
109 sub parse_type {
110 my ($e, $type) = @_;
111
112 for my $e (grep ref, @{$e->contents}) {
113 if ($e->name eq "required") {
114 for my $i (grep ref, @{$e->contents}) {
115 $type->{required}{$i->attr ("arch")} = $i->attr ("value");
116 }
117 } elsif ($e->name eq "attribute") {
118 parse_attr $e, $type->{attr}{Main} ||= {};
119 } elsif ($e->name eq "ignore") {
120 for my $i (grep ref, @{$e->contents}) {
121 if ($i->name eq "ignore_list") {
122 push @{$type->{ignore}}, $ignore_list{$i->attr ("name")} ||= [];
123 } elsif ($i->name eq "attribute") {
124 push @{$type->{ignore}}, $i->attr ("arch");
125 }
126 }
127 } elsif ($e->name eq "import_type") {
128 push @{$type->{import}}, $type{$e->attr ("name")} ||= {};
129 } elsif ($e->name eq "use") {
130 $type->{use} = string $e;
131 } elsif ($e->name eq "description") {
132 $type->{desc} = string $e;
133 } elsif ($e->name eq "section") {
134 for my $i (grep ref, @{$e->contents}) {
135 parse_attr $i, $type->{attr}{$e->attr ("name")} ||= {};
136 }
137 } else {
138 warn "unknown types subelement ", $e->name;
139 }
140 }
141
142 $type
143 }
144
145 for my $e (grep ref, @{$type->root->contents}) {
146 if ($e->name eq "bitmask") {
147 my $bm = $bitmask{$e->attr ("name")} ||= {};
148 for my $b (grep ref, @{$e->contents}) {
149 $bm->{$b->attr ("bit")} = $b->attr ("name");
150 }
151 } elsif ($e->name eq "list") {
152 my $list = $list{$e->attr ("name")} ||= {};
153 for my $b (grep ref, @{$e->contents}) {
154 $list->{$b->attr ("value")} = $b->attr ("name");
155 }
156 } elsif ($e->name eq "ignore_list") {
157 my $list = $ignore_list{$e->attr ("name")} ||= [];
158 for my $b (grep ref, @{$e->contents}) {
159 push @$list, $b->attr ("arch");
160 }
161 } elsif ($e->name eq "default_type") {
162 parse_type $e, \%default_attr;
163 } elsif ($e->name eq "type") {
164 my $type = $type{$e->attr ("name")} ||= {};
165 parse_type $e, $type;
166 #unshift @{$type->{import}}, \%default_attr;
167
168 if ($e->attr ("number") > 0) {
169 $attr{$e->attr ("number")} = $type;
170 } elsif ($e->attr ("name") eq "Misc") {
171 delete $type->{required};
172 } else {
173 push @attr0, $type;
174 }
175
176 } else {
177 warn "unknown types element ", $e->name;
178 }
179 }
180
181 my $type = XML::Parser->new (Style => 'grove')->parsefile ("res/typenumbers.xml");
182
183 for (grep ref, @{$type->root->contents}) {
184 $typename{$_->attr ("number")} = $_->attr ("name");
185 }
186
187 my $spell = XML::Parser->new (Style => 'grove')->parsefile ("res/spells.xml")
188 or die;
189
190 for (grep ref, @{$spell->root->contents}) {
191 $spell{$_->attr ("id")} = $_->attr ("name");
192 }
193
194 dump_hash ["BITMASK", "LIST", "IGNORE_LIST", "DEFAULT_ATTR", "TYPE", "ATTR0", "ATTR", "TYPENAME", "SPELL"],
195 [\%bitmask, \%list, \%ignore_list, \%default_attr, \%type, \@attr0, \%attr, \%typename, \%spell];
196
197 print <<EOF;
198
199 =head1 AUTHOR
200
201 Marc Lehmann <schmorp@schmorp.de>
202 http://home.schmorp.de/
203
204 The source files are part of the CFJavaEditor.
205
206 =cut
207
208 1
209 EOF
210