168 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
		
		
			
		
	
	
			168 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
|  | #!/usr/bin/perl | ||
|  | # | ||
|  | 
 | ||
|  | package LJ; | ||
|  | 
 | ||
|  | $verbose = 0; | ||
|  | @obs = (); | ||
|  | 
 | ||
|  | sub load_objects_from_file | ||
|  | { | ||
|  |     my ($file, $oblist) = @_; | ||
|  | 
 | ||
|  |     # hard-code these common (er, only) cases | ||
|  |     if ($file eq "views.dat" || $file eq "vars.dat") { | ||
|  |         $file = "$LJ::HOME/doc/raw/s1/$file"; | ||
|  |     } | ||
|  | 
 | ||
|  |     open (FIL, $file); | ||
|  |     load_objects(\*FIL, $oblist); | ||
|  |     close FIL; | ||
|  | } | ||
|  | 
 | ||
|  | sub load_objects | ||
|  | { | ||
|  |     my ($fh, $oblist) = @_; | ||
|  |     my $l; | ||
|  | 
 | ||
|  |     while ($l = <$fh>) | ||
|  |     { | ||
|  |         chomp $l; | ||
|  |         next unless ($l =~ /\S/); | ||
|  |         next if ($l =~ /^\#/); | ||
|  |         if ($l =~ /^\{\s*(\S+)\s*$/) | ||
|  |         { | ||
|  |           &load_object($fh, $1, $oblist); | ||
|  |         } | ||
|  |         else | ||
|  |         { | ||
|  |           print STDERR "Unexpected line: $l\n"; | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | sub load_object  | ||
|  | { | ||
|  |     my ($fh, $obname, $listref) = @_; | ||
|  |     my $var = ""; | ||
|  |     my $vartype = ""; | ||
|  |     my $ob = { name => $obname, props => {} }; | ||
|  |     my $l; | ||
|  | 
 | ||
|  |     print "Loading object $obname ... \n" if $verbose; | ||
|  |   SUCKLINES: | ||
|  |     while ($l = <$fh>) | ||
|  |     { | ||
|  |         chomp $l; | ||
|  |         if ($l =~ /^\.(\S+)\s*$/) | ||
|  |         { | ||
|  |           $var = $1; | ||
|  |           print "current var = $var\n" if $verbose; | ||
|  |           next SUCKLINES; | ||
|  |         } | ||
|  |         if ($l =~ /^\}\s*$/) | ||
|  |         { | ||
|  |           print "End object $obname.\n" if $verbose; | ||
|  |           last SUCKLINES; | ||
|  |         } | ||
|  |         next unless $var; | ||
|  |         next unless ($l =~ /\S/); | ||
|  |         next if ($l =~ /^\#/); | ||
|  | 
 | ||
|  |         if ($l =~ /^\{\s*(\S+)\s*$/) | ||
|  |         { | ||
|  |           print "Encounted object ($1) as property.\n" if $verbose; | ||
|  |           if (defined $ob->{'props'}->{$var}) | ||
|  |           { | ||
|  |               if (ref $ob->{'props'}->{$var} ne "ARRAY") | ||
|  |               { | ||
|  |                 print STDERR "Object encountered where text expected.\n"; | ||
|  |                 my $blah = []; | ||
|  |                 &load_object($fh, "blah", $blah); # ignore object | ||
|  |               } | ||
|  |               else | ||
|  |               { | ||
|  |                 &load_object($fh, $1, $ob->{'props'}->{$var}); | ||
|  |               } | ||
|  |           } | ||
|  |           else | ||
|  |           { | ||
|  |               $ob->{'props'}->{$var} = []; | ||
|  |               &load_object($fh, $1, $ob->{'props'}->{$var}); | ||
|  |           } | ||
|  |         } | ||
|  |         else | ||
|  |         { | ||
|  |           print "Normal line.\n" if $verbose; | ||
|  |           if (defined $ob->{'props'}->{$var}) | ||
|  |           { | ||
|  |               print "defined.\n" if $verbose; | ||
|  |               if (ref $ob->{'props'}->{$var} eq "ARRAY") | ||
|  |               { | ||
|  |                 print STDERR "Scalar found where object expected!\n"; | ||
|  |               } | ||
|  |               else | ||
|  |               { | ||
|  |                 print "appending var \"$var\".\n" if $verbose; | ||
|  |                 $ob->{'props'}->{$var} .= "\n$l"; | ||
|  |               } | ||
|  |           } | ||
|  |           else | ||
|  |           { | ||
|  |               print "setting $var to $l\n" if $verbose; | ||
|  |               $ob->{'props'}->{$var} = $l; | ||
|  |           } | ||
|  |         } | ||
|  | 
 | ||
|  |     } # end while | ||
|  |     print "done loading object $obname\n" if $verbose; | ||
|  | 
 | ||
|  |     push @{$listref}, $ob; | ||
|  | 
 | ||
|  | } # end sub | ||
|  | 
 | ||
|  | sub xlinkify | ||
|  | { | ||
|  |     my ($a) = $_[0]; | ||
|  |     $$a =~ s/\[var\[([A-Z0-9\_]{2,})\]\]/<a href=\"\/developer\/varinfo.bml?$1\">$1<\/a>/g; | ||
|  |     $$a =~ s/\[view\[(\S+?)\]\]/<a href=\"\/developer\/views.bml\#$1\">$1<\/a>/g; | ||
|  | } | ||
|  | 
 | ||
|  | sub dump_struct | ||
|  | { | ||
|  |     my ($ref, $depth) = @_; | ||
|  |     my $type = ref $ref; | ||
|  |     my $indent = "  "x$depth; | ||
|  |     if ($type eq "ARRAY") | ||
|  |     { | ||
|  |         print "ARRAY\n"; | ||
|  |         my $count = 0; | ||
|  |         foreach (@{$ref}) | ||
|  |         { | ||
|  |           print $indent, "[$count] = "; | ||
|  |           &dump_struct($_, $depth+1); | ||
|  |           $count++; | ||
|  |         } | ||
|  |     } | ||
|  |     elsif ($type eq "HASH") | ||
|  |     { | ||
|  |         print "HASH\n"; | ||
|  |         my $k; | ||
|  |         foreach $k (sort keys %{$ref}) | ||
|  |         { | ||
|  |           print $indent, "{$k} = "; | ||
|  |           &dump_struct($ref->{$k}, $depth+1); | ||
|  |         } | ||
|  |     } | ||
|  |     elsif ($type eq "") | ||
|  |     { | ||
|  |         print $ref, "\n"; | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         print $indent, "UNKNOWN_TYPE"; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | 1; |