home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / linuxdoc-sgml-1.1 / sgmls-1.1 / sgmls.pl < prev    next >
Encoding:
Perl Script  |  1995-05-03  |  4.5 KB  |  248 lines

  1. #! /usr/bin/perl
  2.  
  3. # This is a skeleton of a perl script for processing the output of
  4. # sgmls.  You must change the parts marked with "XXX".
  5.  
  6. # XXX This is for troff: in data, turn \ into \e (which prints as \).
  7. # Backslashes in SDATA entities are left as backslashes.
  8.  
  9. $backslash_in_data = "\\e";
  10.  
  11. $prog = $0;
  12.  
  13. $prog =~ s|.*/||;
  14.  
  15. $level = 0;
  16.  
  17. while (<STDIN>) {
  18.     chop;
  19.     $command = substr($_, 0, 1);
  20.     substr($_, 0, 1) = "";
  21.     if ($command eq '(') {
  22.     &start_element($_);
  23.     $level++;
  24.     }
  25.     elsif ($command eq ')') {
  26.     $level--;
  27.     &end_element($_);
  28.     foreach $key (keys %attribute_value) {
  29.         @splitkey = split($;, $key);
  30.         if ($splitkey[0] == $level) {
  31.         delete $attribute_value{$key};
  32.         delete $attribute_type{$key};
  33.         }
  34.     }
  35.     }
  36.     elsif ($command eq '-') {
  37.     &unescape_data($_);
  38.     &data($_);
  39.     }
  40.     elsif ($command eq 'A') {
  41.     @field = split(/ /, $_, 3);
  42.     $attribute_type{$level,$field[0]} = $field[1];
  43.     &unescape_data($field[2]);
  44.     $attribute_value{$level,$field[0]} = $field[2];
  45.     }
  46.     elsif ($command eq '&') {
  47.     &entity($_);
  48.     }
  49.     elsif ($command eq 'D') {
  50.     @field = split(/ /, $_, 4);
  51.     $data_attribute_type{$field[0], $field[1]} = $field[2];
  52.     &unescape_data($field[3]);
  53.     $data_attribute_value{$field[0], $field[1]} = $field[3];
  54.     }
  55.     elsif ($command eq 'N') {
  56.     $notation{$_} = 1;
  57.     if (defined($sysid)) {
  58.         $notation_sysid{$_} = $sysid;
  59.         undef($sysid);
  60.     }
  61.     if (defined($pubid)) {
  62.         $notation_pubid{$_} = $pubid;
  63.         undef($pubid);
  64.     }
  65.     }
  66.     elsif ($command eq 'I') {
  67.         @field = split(/ /, $_, 3);
  68.     $entity_type{$field[0]} = $field[1];
  69.     &unescape($field[2]);
  70.     # You may want to substitute \e for \ if the type is CDATA.
  71.     $entity_text{$field[0]} = $field[2];
  72.     $entity_code{$field[0]} = 'I';
  73.     }
  74.     elsif ($command eq 'E') {
  75.     @field = split(/ /, $_);
  76.     $entity_code{$field[0]} = 'E';
  77.     $entity_type{$field[0]} = $field[1];
  78.     $entity_notation{$field[0]} = $field[2];
  79.     if (defined(@files)) {
  80.         foreach $i (0..$#files) {
  81.         $entity_filename{$field[0], $i} = $files[i];
  82.         }
  83.         undef(@files);
  84.     }
  85.     if (defined($sysid)) {
  86.         $entity_sysid{$field[0]} = $sysid;
  87.         undef($sysid);
  88.     }
  89.     if (defined($pubid)) {
  90.         $entity_pubid{$field[0]} = $pubid;
  91.         undef($pubid);
  92.     }
  93.     }
  94.     elsif ($command eq 'S') {
  95.     $entity_code{$_} = 'S';
  96.     if (defined(@files)) {
  97.         foreach $i (0..$#files) {
  98.         $entity_filename{$_, $i} = $files[i];
  99.         }
  100.         undef(@files);
  101.     }
  102.     if (defined($sysid)) {
  103.         $entity_sysid{$_} = $sysid;
  104.         undef($sysid);
  105.     }
  106.     if (defined($pubid)) {
  107.         $entity_pubid{$_} = $pubid;
  108.         undef($pubid);
  109.     }
  110.     }
  111.     elsif ($command eq '?') {
  112.     &unescape($_);
  113.     &pi($_);
  114.     }
  115.     elsif ($command eq 'L') {
  116.     @field = split(/ /, $_);
  117.     $lineno = $field[0];
  118.     if ($#field >= 1) {
  119.         &unescape($field[1]);
  120.         $filename = $field[1];
  121.     }
  122.     }
  123.     elsif ($command eq 'V') {
  124.     @field = split(/ /, $_, 2);
  125.     &unescape($field[1]);
  126.     $environment{$field[0]} = $field[1];
  127.     }
  128.     elsif ($command eq '{') {
  129.     &start_subdoc($_);
  130.     }
  131.     elsif ($command eq '}') {
  132.     &end_subdoc($_);
  133.     }
  134.     elsif ($command eq 'f') {
  135.     &unescape($_);
  136.     push(@files, $_);
  137.     }
  138.     elsif ($command eq 'p') {
  139.     &unescape($_);
  140.     $pubid = $_;
  141.     }
  142.     elsif ($command eq 's') {
  143.     &unescape($_);
  144.     $sysid = $_;
  145.     }
  146.     elsif ($command eq 'C') {
  147.     $conforming = 1;
  148.     }
  149.     else {
  150.     warn "$prog:$ARGV:$.: unrecognized command \`$command'\n";
  151.     }
  152. }
  153.  
  154. sub unescape {
  155.     $_[0] =~ s/\\([0-7][0-7]?[0-7]?|.)/&esc($1)/eg;
  156. }
  157.  
  158. sub esc {
  159.     local($_) = $_[0];
  160.     if ($_ eq '012' || $_ eq '12') {
  161.     "";            # ignore RS
  162.     }
  163.     elsif (/^[0-7]/) {
  164.     sprintf("%c", oct);
  165.     }
  166.     elsif ($_ eq 'n') {
  167.     "\n";
  168.     }
  169.     elsif ($_ eq '|') {
  170.     "";
  171.     }
  172.     elsif ($_ eq "\\") {
  173.     "\\";
  174.     }
  175.     else {
  176.     $_;
  177.     }
  178. }
  179.  
  180. sub unescape_data {
  181.     local($sdata) = 0;
  182.     $_[0] =~ s/\\([0-7][0-7]?[0-7]?|.)/&esc_data($1)/eg;
  183. }
  184.  
  185. sub esc_data {
  186.     local($_) = $_[0];
  187.     if ($_ eq '012' || $_ eq '12') {
  188.     "";            # ignore RS
  189.     }
  190.     elsif (/^[0-7]/) {
  191.     sprintf("%c", oct);
  192.     }
  193.     elsif ($_ eq 'n') {
  194.     "\n";
  195.     }
  196.     elsif ($_ eq '|') {
  197.     $sdata = !$sdata;
  198.     "";
  199.     }
  200.     elsif ($_ eq "\\") {
  201.     $sdata ? "\\" : $backslash_in_data;
  202.     }
  203.     else {
  204.     $_;
  205.     }
  206. }
  207.  
  208.  
  209. sub start_element {
  210.     local($gi) = $_[0];
  211.     # XXX
  212. }
  213.  
  214. sub end_element {
  215.     local($gi) = $_[0];
  216.     # XXX
  217. }
  218.  
  219. sub data {
  220.     local($data) = $_[0];
  221.     # XXX
  222. }
  223.  
  224. # A processing instruction.
  225.  
  226. sub pi {
  227.     local($data) = $_[0];
  228.     # XXX
  229. }
  230.  
  231. # A reference to an external entity.
  232.  
  233. sub entity {
  234.     local($name) = $_[0];
  235.     # XXX
  236. }
  237.  
  238. sub start_subdoc {
  239.     local($name) = $_[0];
  240.     # XXX
  241. }
  242.  
  243. sub end_subdoc {
  244.     local($name) = $_[0];
  245.     # XXX
  246. }
  247.  
  248.