comparison parsematerial.pl @ 0:c4f3b5b88891

Import material and alloy stuff into new repository.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 05 Jan 2016 07:54:37 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:c4f3b5b88891
1 #!/usr/bin/perl -w
2 #
3 # BatMUD material data parser and converter
4 # Developed by Matti Hämäläinen (Ggr Pupunen) <ccr@tnsp.org>
5 # (C) Copyright 2006-2015 Tecnic Software productions (TNSP)
6 #
7 # Converts "raw" material data (output of 'cast identify at material')
8 # from log(s) into various formats and intermediate data for additional
9 # processing by other tools.
10 #
11 use strict;
12 use warnings;
13 use Data::Dumper;
14
15
16 #
17 # Data translation table generated with csv2transtab.pl
18 #
19 my $transTable =
20 {
21 2 => {
22 "very light" => 0,
23 "light" => 1,
24 "normal" => 2,
25 "heavy" => 3,
26 "very heavy" => 4,
27 "incredibly heavy" => 5,
28 },
29 3 => {
30 "very fragile" => 0,
31 "fragile" => 1,
32 "normal" => 2,
33 "sturdy" => 3,
34 "very sturdy" => 4,
35 "incredibly sturdy" => 5,
36 },
37 4 => {
38 "not magical" => 0,
39 "weakly magical" => 1,
40 "a bit magical" => 2,
41 "magical" => 3,
42 "notable magical" => 4,
43 "very magical" => 5,
44 "highly magical" => 6,
45 },
46 5 => {
47 "unburnable" => 0,
48 "almost unburnable" => 1,
49 "quite unburnable" => 2,
50 "normal" => 3,
51 "quite flammable" => 4,
52 "very flammable" => 5,
53 "highly flammable" => 6,
54 },
55 6 => {
56 "icy" => 0,
57 "chilly" => 1,
58 "drafty" => 2,
59 "comfortable" => 3,
60 "very warm" => 4,
61 "excellent" => 5,
62 },
63 7 => {
64 "non toxic" => 0,
65 "very low toxicity" => 1,
66 "low toxicity" => 2,
67 "mediocre toxicity" => 3,
68 "toxic" => 4,
69 "very toxic" => 5,
70 "highly toxic" => 6,
71 },
72 8 => {
73 "lousy" => 0,
74 "poor" => 1,
75 "weak" => 2,
76 "insulator" => 3,
77 "good" => 4,
78 "great" => 5,
79 },
80 9 => {
81 "loose" => 0,
82 "a bit loose" => 1,
83 "quite solid" => 2,
84 "solid" => 3,
85 "very solid" => 4,
86 "incredibly solid" => 5,
87 },
88 10 => {
89 "poor mentality" => 0,
90 "low mentality" => 1,
91 "some mentality" => 2,
92 "mental" => 3,
93 "high mentality" => 4,
94 "great mentality" => 5,
95 },
96 11 => {
97 "great reactivity" => 0,
98 "high reactivity" => 1,
99 "notable reactivity" => 2,
100 "reactive" => 3,
101 "low reactivity" => 4,
102 "poor reactivity" => 5,
103 "not reactive" => 6,
104 },
105 12 => {
106 "not used" => 0,
107 "rarely used" => 1,
108 "sometimes used" => 2,
109 "quite much used" => 3,
110 "frequently used" => 4,
111 "most common" => 5,
112 },
113 13 => {
114 "not used" => 0,
115 "rarely used" => 1,
116 "sometimes used" => 2,
117 "quite much used" => 3,
118 "frequently used" => 4,
119 "most common" => 5,
120 },
121 14 => {
122 "cheap" => 0,
123 "low-priced" => 1,
124 "average" => 2,
125 "valuable" => 3,
126 "very valuable" => 4,
127 "highly valuable" => 5,
128 },
129 15 => {
130 "very common" => 0,
131 "quite common" => 1,
132 "common" => 2,
133 "average" => 3,
134 "rare" => 4,
135 "very rare" => 5,
136 "impossible" => 6,
137 },
138 16 => {
139 "Organ" => 0,
140 "Cloth" => 1,
141 "Paper" => 2,
142 "Bone" => 3,
143 "Metal" => 4,
144 "Wood" => 5,
145 "Stone" => 6,
146 "Alloy" => 7,
147 "Inorg" => 8,
148 "Glass" => 9,
149 "Gem" => 10,
150 },
151 17 => {
152 "No" => 0,
153 "Yes" => 1,
154 },
155 18 => {
156 "Hit" => 0,
157 "Protrusion" => 1,
158 "Crag" => 2,
159 "Lode" => 3,
160 "Pocket" => 4,
161 "Gloss" => 5,
162 "Shard" => 6,
163 "Deposit" => 7,
164 "Mountain" => 8,
165 "Nest" => 9,
166 "Stack" => 10,
167 "Mound" => 11,
168 "Chunky" => 12,
169 "Puddle" => 13,
170 "Slab" => 14,
171 "Network" => 15,
172 "Pool" => 16,
173 "Hill" => 17,
174 "Mass" => 18,
175 "Tangle" => 19,
176 "Graveyard" => 20,
177 "Lump" => 21,
178 "Coil" => 22,
179 "Abyss" => 23,
180 "Pile" => 24,
181 "Torrent" => 25,
182 "Conflagration" => 26,
183 },
184 19 => {
185 "heap" => 0,
186 "stick" => 1,
187 "pocket" => 2,
188 "hunk" => 3,
189 "shard" => 4,
190 "string" => 5,
191 "stone" => 6,
192 "slice" => 7,
193 "wisp" => 8,
194 "wad" => 9,
195 "clump" => 10,
196 "carcass" => 11,
197 "gob" => 12,
198 "strip" => 13,
199 "dough" => 14,
200 "ball" => 15,
201 "chunk" => 16,
202 "load" => 17,
203 "leaf" => 18,
204 "salt" => 19,
205 "pile" => 20,
206 "isotope" => 21,
207 "tusk" => 22,
208 "clod" => 23,
209 "lump" => 24,
210 "lode" => 25,
211 "piece" => 26,
212 "flame" => 27,
213 "stem" => 28,
214 "sphere" => 29,
215 "fragment" => 30,
216 "mineral" => 31,
217 "twig" => 32,
218 "stalk" => 33,
219 "crystal" => 34,
220 "log" => 35,
221 "reed" => 36,
222 "nugget" => 37,
223 "mix" => 38,
224 "mic" => 39,
225 "pulp" => 40,
226 "block" => 41,
227 "puddle" => 42,
228 "sliver" => 43,
229 "bulge" => 44,
230 },
231 20 => {
232 "formed" => 0,
233 "stick" => 1,
234 "bundle" => 2,
235 "ellipsoid" => 3,
236 "pocket" => 4,
237 "brick" => 5,
238 "mold" => 6,
239 "gene" => 7,
240 "shard" => 8,
241 "form" => 9,
242 "wisp" => 10,
243 "isometric" => 11,
244 "cord" => 12,
245 "billot" => 13,
246 "bar" => 14,
247 "bolt" => 15,
248 "strip" => 16,
249 "ball" => 17,
250 "billit" => 18,
251 "chunk" => 19,
252 "octagon" => 20,
253 "cube" => 21,
254 "ingot" => 22,
255 "chip" => 23,
256 "casting" => 24,
257 "dean" => 25,
258 "piece" => 26,
259 "flame" => 27,
260 "billet" => 28,
261 "crafted" => 29,
262 "cut" => 30,
263 "pelt" => 31,
264 "strand" => 32,
265 "crystal" => 33,
266 "log" => 34,
267 "reed" => 35,
268 "tetragonal" => 36,
269 "sheet" => 37,
270 "strap" => 38,
271 "reem" => 39,
272 "length" => 40,
273 "sculpted" => 41,
274 "block" => 42,
275 "hexagonal" => 43,
276 "product" => 44,
277 "shaped" => 45,
278 "puddle" => 46,
279 "fibres" => 47,
280 "slab" => 48,
281 "flare" => 49,
282 },
283 };
284
285 my $transFixes =
286 {
287 16 => {
288 "Organic" => 0,
289 "Cloth" => 1,
290 "Paper" => 2,
291 "Bone" => 3,
292 "Metal" => 4,
293 "Wood" => 5,
294 "Stone" => 6,
295 "Alloy" => 7,
296 "Inorganic" => 8,
297 "Glass" => 9,
298 "Gem" => 10,
299 },
300 };
301
302
303 my $revTransTable = {};
304
305 my @fieldInfo = (
306 { "i" => 1, "f" => "name", "w" => 15, "l" => "Name", "s" => "Name" },
307 { "i" => 2, "f" => "weight", "w" => 10, "l" => "Weight", "s" => "Weight" },
308
309 { "i" => 3, "f" => "sturdyness", "w" => 18, "l" => "Sturdyness", "s" => "Sturdyness" },
310 { "i" => 4, "f" => "magic", "w" => 15, "l" => "Magic", "s" => "Magic" },
311 { "i" => 5, "f" => "flammability", "w" => 18, "l" => "Flammability", "s" => "Flammability" },
312 { "i" => 6, "f" => "warmth", "w" => 11, "l" => "Warmth", "s" => "Warmth" },
313 { "i" => 7, "f" => "toxicity", "w" => 18, "l" => "Toxicity", "s" => "Toxicity" },
314 { "i" => 8, "f" => "resistivity", "w" => 9, "l" => "Resistivity", "s" => "Resist" },
315 { "i" => 9, "f" => "malleability", "w" => 18, "l" => "Malleability", "s" => "Malleability" },
316 { "i" => 10, "f" => "mentality", "w" => 18, "l" => "Mentality", "s" => "Mentality" },
317 { "i" => 11, "f" => "reactivity", "w" => 18, "l" => "Reactivity", "s" => "Reactivity" },
318
319 { "i" => 12, "f" => "weapon_rarity", "w" => 15, "l" => "Weapon rarity", "s" => "Weapon rarity" },
320 { "i" => 13, "f" => "armour_rarity", "w" => 15, "l" => "Armour rarity", "s" => "Armour rarity" },
321 { "i" => 14, "f" => "value", "w" => 15, "l" => "Value", "s" => "Value" },
322 { "i" => 15, "f" => "rarity", "w" => 12, "l" => "Rarity", "s" => "Rarity" },
323 { "i" => 16, "f" => "type", "w" => 6, "l" => "Type", "s" => "Type" },
324 { "i" => 17, "f" => "found_nature", "w" => 3, "l" => "Found in Nature", "s" => "FN?" },
325 { "i" => 18, "f" => "lode_name", "w" => 13, "l" => "Lode name", "s" => "Lode name" },
326 { "i" => 19, "f" => "raw_names", "w" => 35, "l" => "Raw names", "s" => "Raw names" },
327 { "i" => 20, "f" => "refined_names", "w" => 35, "l" => "Refined names", "s" => "Refined names" },
328 );
329
330
331 sub ptranslate($$)
332 {
333 if (defined($$revTransTable{$_[0]}{$_[1]}))
334 {
335 return $$revTransTable{$_[0]}{$_[1]};
336 }
337 else
338 {
339 die("$0: Unknown REVERSE translation table type ".$_[0]." : ".$_[1]."\n");
340 }
341 }
342
343
344 sub pt($$)
345 {
346 return ptranslate($_[1], $_[0]{$_[1]})
347 }
348
349
350 sub pta($$)
351 {
352 return map { ptranslate($_[1], $_) } @{$_[0]{$_[1]}};
353 }
354
355
356 sub mtranslate($$)
357 {
358 if (defined($$transTable{$_[0]}{$_[1]}))
359 {
360 return $$transTable{$_[0]}{$_[1]};
361 }
362 else
363 {
364 die("$0: Unknown translation table type ".$_[0]." : ".$_[1]."\n");
365 }
366 }
367
368
369 ###
370 ### Check options
371 ###
372 my $opt_mode = "";
373 my $opt_strip = 1;
374
375 while (defined(my $arg = shift))
376 {
377 if ($arg eq "-csv") { $opt_mode = $arg; }
378 elsif ($arg eq "-tf") { $opt_mode = $arg; }
379 elsif ($arg eq "-names") { $opt_mode = $arg; }
380 elsif ($arg eq "-perl") { $opt_mode = $arg; }
381 elsif ($arg eq "-php") { $opt_mode = $arg; }
382 elsif ($arg eq "-table") { $opt_mode = $arg; }
383 elsif ($arg eq "-dumpfiles") { $opt_mode = $arg; $opt_strip = 0; }
384 elsif ($arg eq "-dump") { $opt_mode = $arg; $opt_strip = 0; }
385 else
386 {
387 die("Invalid option '$arg'\n");
388 }
389 }
390
391
392 ###
393 ### Parse input materials
394 ###
395 my $data = {};
396 my $name = "";
397 my $nline = 0;
398 while (defined(my $line = <STDIN>))
399 {
400 $nline++;
401 chomp($line);
402 if ($line =~ /MATERIAL STATS \(([a-z ]+)\)\:/)
403 {
404 $name = $1;
405 }
406 elsif ($line =~ /^Weight \(g\/l\)\: *\(([a-z. ]+)\) *Sturdyness\: *\(([a-z. ]+)\)/)
407 {
408 $$data{$name}{2} = mtranslate(2, $1);
409 $$data{$name}{3} = mtranslate(3, $2);
410 }
411 elsif ($line =~ /^Magic\: *\(([a-z. ]+)\) *Flammability\: *\(([a-z. ]+)\)/)
412 {
413 $$data{$name}{4} = mtranslate(4, $1);
414 $$data{$name}{5} = mtranslate(5, $2);
415 }
416 elsif ($line =~ /^Warmth\: *\(([a-z. ]+ outfit)\) *Toxicity\: *\(([a-z. ]+)\)/)
417 {
418 my ($tmp1, $tmp2) = ($1, $2);
419 $tmp1 =~ s/ +outfit$//;
420 $$data{$name}{6} = mtranslate(6, $tmp1);
421 $$data{$name}{7} = mtranslate(7, $tmp2);
422 }
423 elsif ($line =~ /^Warmth\: *\(([a-z. ]+)\) *Toxicity\: *\(([a-z. ]+)\)/)
424 {
425 my ($tmp1, $tmp2) = ($1, $2);
426 $$data{$name}{6} = mtranslate(6, $1);
427 $$data{$name}{7} = mtranslate(7, $2);
428 }
429 elsif ($line =~ /^Resistivity\: *\(([a-z. ]+ insulator)\) *Malleability\: *\(([a-z. ]+)\)?/)
430 {
431 my ($tmp1, $tmp2) = ($1, $2);
432 $tmp1 =~ s/ +insulator$//;
433 $$data{$name}{8} = mtranslate(8, $tmp1);
434 $$data{$name}{9} = mtranslate(9, $tmp2);
435 }
436 elsif ($line =~ /^Resistivity\: *\(([a-z. ]+)\) *Malleability\: *\(([a-z. ]+)\)?/)
437 {
438 $$data{$name}{8} = mtranslate(8, $1);
439 $$data{$name}{9} = mtranslate(9, $2);
440 }
441 elsif ($line =~ /^Mentality\: *\(([a-z. ]+)\) *Reactivity\: *\(([a-z. ]+)\)?/)
442 {
443 $$data{$name}{10} = mtranslate(10, $1);
444 $$data{$name}{11} = mtranslate(11, $2);
445 }
446 elsif ($line =~ /^Weapon rarity\: *\(([a-z. ]+)\) *Armour rarity\: *\(([a-z. ]+)\)/)
447 {
448 $$data{$name}{12} = mtranslate(12, $1);
449 $$data{$name}{13} = mtranslate(13, $2);
450 }
451 elsif ($line =~ /^Value \(gp\/kg\)\: *\(([a-z -]+)\) *Rarity\: *\(([a-z. ]+)\)/)
452 {
453 $$data{$name}{14} = mtranslate(14, $1);
454 $$data{$name}{15} = mtranslate(15, $2);
455 }
456 elsif ($line =~ /^Article\: *([a-z. ]+) *Type: *([A-Za-z]+)/)
457 {
458 my ($tmp1, $tmp2) = ($1, $2);
459 $tmp1 =~ s/ *$//;
460
461 $$data{$name}{"article"} = $tmp1;
462 $$data{$name}{16} = mtranslate(16, $tmp2);
463 }
464 elsif ($line =~ /^Found nature\: *(Yes|No) *Lode name\: *([A-Za-z]+)/)
465 {
466 $$data{$name}{17} = mtranslate(17, $1);
467 $$data{$name}{18} = mtranslate(18, $2);
468 }
469 elsif ($line =~ /^Raw names\: *([a-z, ]+[a-z])/)
470 {
471 my $tmp = $1;
472 @{$$data{$name}{19}} = map { mtranslate(19, $_) } split(/, */, $tmp);
473 }
474 elsif ($line =~ /^Refined names\: *([a-z, ]+[a-z])/)
475 {
476 my $tmp = $1;
477 @{$$data{$name}{20}} = map { mtranslate(20, $_) } split(/, */, $tmp);
478 }
479 elsif ($line =~ /^-+$|^\s*$/)
480 {
481 # Ignore empty lines, and -*
482 }
483 else
484 {
485 print STDERR "Unparsed line #".$nline.": ".$line."\n";
486 }
487 }
488
489 # Fix material types
490 foreach my $mid (keys %$transFixes)
491 {
492 $$transTable{$mid} = $$transFixes{$mid};
493 }
494
495 # Sort the entries by name
496 my @entries = sort { $a cmp $b } keys %$data;
497
498 # Sort materials by type
499 my %matByType = ();
500 foreach my $name (@entries)
501 {
502 push(@{$matByType{$$data{$name}{16}}}, lc($name));
503 }
504
505 # List of known types
506 my $matTypes = $$transTable{16};
507
508 # Create reverse translation table
509 foreach my $mid (keys %$transTable)
510 {
511 foreach my $mkey (keys %{$$transTable{$mid}})
512 {
513 $$revTransTable{$mid}{$$transTable{$mid}{$mkey}} = $mkey;
514 }
515 }
516
517
518 sub get_datastr($$)
519 {
520 my ($name, $i) = @_;
521 return $name if ($i == 1);
522 return join(", ", pta($$data{$name}, $i)) if (ref($$data{$name}{$i}) eq "ARRAY");
523 return pt($$data{$name}, $i);
524 }
525
526
527 sub print_material_long($$$)
528 {
529 my ($file, $mat, $name) = @_;
530
531 printf $file
532 "MATERIAL STATS (".$name."):\n".
533 "-------------------------------------------------------------------------------\n".
534 "Weight (g/l): %-17s Sturdyness: (%s)\n".
535 "Magic: %-17s Flammability: (%s)\n",
536 "(".pt($mat, 2).")", pt($mat, 3),
537 "(".pt($mat, 4).")", pt($mat, 5);
538
539 printf $file
540 "Warmth: %-17s Toxicity: (%s)\n".
541 "Resistivity: %-17s Malleability: (%s)\n",
542 "(".pt($mat, 6).")", pt($mat, 7),
543 "(".pt($mat, 8).")", pt($mat, 9);
544
545 printf $file
546 "Mentality: %-17s Reactivity: (%s)\n".
547 "Weapon rarity: %-17s Armour rarity: (%s)\n".
548 "Value (gp/kg): %-17s Rarity: (%s)\n",
549 "(".pt($mat, 10).")", pt($mat, 11),
550 "(".pt($mat, 12).")", pt($mat, 13),
551 "(".pt($mat, 14).")", pt($mat, 15);
552
553 printf $file
554 "Article: %-17s Type: %s\n".
555 "Found nature: %-17s Lode name: %s\n".
556 "Raw names: %s\n".
557 "Refined names: %s\n",
558 $$mat{"article"}, pt($mat, 16),
559 pt($mat, 17), pt($mat, 18),
560 join(", ", pta($mat, 19)),
561 join(", ", pta($mat, 20));
562 }
563
564
565 ###
566 ### Output functionality begins here
567 ###
568
569 ###
570 ### Print material names only, one per line
571 ###
572 if ($opt_mode eq "-names")
573 {
574 foreach my $name (@entries)
575 {
576 print $name."\n";
577 }
578 }
579 ###
580 ### Print CSV format list
581 ###
582 elsif ($opt_mode eq "-csv")
583 {
584 foreach my $name (@entries)
585 {
586 print join(";", map { get_datastr($name, $$_{"i"}) } @fieldInfo)."\n";
587 }
588 }
589 ###
590 ### Dump long-format material data to individual files
591 ###
592 elsif ($opt_mode eq "-dumpfiles")
593 {
594 foreach my $name (@entries)
595 {
596 my $filename = $name.".mat";
597 $filename =~ s/[^a-z0-9]/_/g;
598 open(OUTFILE, ">", $filename) or die("Error opening file '".$filename."' ".$!."\n");
599 print_material_long(\*OUTFILE, $$data{$name}, $name);
600 close(OUTFILE);
601 }
602 }
603 ###
604 ### Dump long-format material data to stdout
605 ###
606 elsif ($opt_mode eq "-dump")
607 {
608 foreach my $name (@entries)
609 {
610 print "\n".
611 "-------------------------------------------------------------------------------\n";
612 print_material_long(\*STDOUT, $$data{$name}, $name);
613 }
614 }
615 ###
616 ### Print TinyFugue script variables
617 ###
618 elsif ($opt_mode eq "-tf")
619 {
620 print "/set gmat_names=".join(' ', map { my $tmp = $_; $tmp =~ s/ /_/g; $tmp } @entries)."\n";
621 print "/set gmat_ntypes=".join(' ', map(lc(ptranslate(16, $$data{$_}{16})), @entries))."\n";
622 print "/set gmat_types=".join(' ', sort map(lc(ptranslate(16, $_)), values %$matTypes))."\n";
623
624 foreach my $mkey (sort keys %$matTypes)
625 {
626 my $type = $$matTypes{$mkey};
627 print "/set gmat_type_".
628 lc(ptranslate(16, $type))."=".
629 join('|', @{$matByType{$type}})."\n";
630 }
631 }
632 ###
633 ### Print a nice ASCII table
634 ###
635 elsif ($opt_mode eq "-table")
636 {
637 my $str = join("",
638 map {
639 sprintf("%-".$$_{"w"}."s | ", $$_{"s"})
640 } @fieldInfo);
641
642 print $str."\n";
643 $str =~ s/[^|]/-/g;
644 $str =~ s/\|/+/g;
645 print $str."\n";
646
647 foreach my $name (@entries)
648 {
649 print join("", map {
650 sprintf("%-".$$_{"w"}."s | ", get_datastr($name, $$_{"i"}));
651 } @fieldInfo)."\n";
652 }
653 }
654 ###
655 ### Dump a Perl module with material data
656 ###
657 elsif ($opt_mode eq "-perl")
658 {
659 $Data::Dumper::Indent = 0;
660 $Data::Dumper::Useqq = 1;
661 $Data::Dumper::Purity = 1;
662
663 print
664 "package Materials;\n".
665 "require Exporter;\n".
666 "\@ISA = qw(Exporter);\n".
667 "\n".
668 "\@EXPORT = qw(matTable transTable revTransTable matByType matTypes);\n".
669 "\n";
670
671 my $dumper = Data::Dumper->new([$data], ["matTable"]);
672 print "our ".$dumper->Dump()."\n\n";
673
674 $dumper = Data::Dumper->new([\%$transTable], ["transTable"]);
675 print "our ".$dumper->Dump()."\n\n";
676
677 $dumper = Data::Dumper->new([\%$revTransTable], ["revTransTable"]);
678 print "our ".$dumper->Dump()."\n\n";
679
680 $dumper = Data::Dumper->new([\%matByType], ["matByType"]);
681 print "our ".$dumper->Dump()."\n\n";
682
683 $dumper = Data::Dumper->new([\%$matTypes], ["matTypes"]);
684 print "our ".$dumper->Dump()."\n\n";
685
686 print "1;\n";
687 }
688 ###
689 ### Dump PHP array format data
690 ###
691 elsif ($opt_mode eq "-php")
692 {
693 print "<?php\n".
694 "\$matTransNames = [".
695 join(",", map { "\"".$$_{"l"}."\"" } @fieldInfo).
696 "];\n\n".
697 "\$matTransTable = [\n";
698 foreach my $i (sort { $a <=> $b } keys %$transTable)
699 {
700 print " [";
701 foreach my $j (sort { $$transTable{$i}{$a} <=> $$transTable{$i}{$b} } keys %{$$transTable{$i}})
702 {
703 print $$transTable{$i}{$j};
704 $j =~ s/very /v./;
705 $j =~ s/incredibly /incr./;
706 print " => \"".$j."\","
707 }
708 print "],\n";
709 }
710 print "];\n\n".
711 "\$matDataTable = [\n";
712 foreach my $name (sort { $a cmp $b } keys %$data)
713 {
714 print " \"$name\" => [";
715 for (my $qn = 1; $qn < scalar(@fieldInfo); $qn++)
716 {
717 my $i = $fieldInfo[$qn]{"i"};
718 if (ref($$data{$name}{$i}) eq "ARRAY")
719 {
720 print "[".join(",", @{$$data{$name}{$i}})."],";
721 }
722 else
723 {
724 print $$data{$name}{$i}.", ";
725 }
726 }
727 print "],\n";
728 }
729 print "];\n?>\n";
730 }