| 11 | 
  | 
  | 
| 12 | 
 for my $src ($src->get_attribute ('ModuleSet') | 
 for my $src ($src->get_attribute ('ModuleSet') | 
| 13 | 
           || $src->get_attribute ('DocumentType')) { | 
           || $src->get_attribute ('DocumentType')) { | 
| 14 | 
   for (qw/ID Copyright BaseURI Description Version/) { | 
   for (qw/Description/) { | 
| 15 | 
     $Info->{$_} = $src->get_attribute_value ($_); | 
     $Info->{$_} = $src->get_attribute_value ($_); | 
| 16 | 
   } | 
   } | 
| 17 | 
   $Info->{Name} = $src->get_attribute_value ('Name'); | 
   for (qw/Name ID Copyright BaseURI Version/) { | 
| 18 | 
  | 
     $Info->{$_} = normalize_wsp ($src->get_attribute_value ($_)); | 
| 19 | 
  | 
   } | 
| 20 | 
  | 
   $Info->{realname} = $Info->{Name}; | 
| 21 | 
   $Info->{Name} .= ' ' . $Info->{Version} if length $Info->{Version}; | 
   $Info->{Name} .= ' ' . $Info->{Version} if length $Info->{Version}; | 
| 22 | 
   $Info->{ns} = $src->get_attribute ('Namespace'); | 
   $Info->{ns} = $src->get_attribute ('Namespace'); | 
| 23 | 
 } | 
 } | 
| 44 | 
 } | 
 } | 
| 45 | 
 exit} | 
 exit} | 
| 46 | 
  | 
  | 
| 47 | 
  | 
 sub normalize_wsp ($;%) { | 
| 48 | 
  | 
   my $s = shift; | 
| 49 | 
  | 
   $s =~ s/\s+/ /g; | 
| 50 | 
  | 
   $s =~ s/^ +//; | 
| 51 | 
  | 
   $s =~ s/ +$//; | 
| 52 | 
  | 
   $s; | 
| 53 | 
  | 
 } | 
| 54 | 
 sub make_paragraphs ($;%) { | 
 sub make_paragraphs ($;%) { | 
| 55 | 
   my ($para, %opt) = @_; | 
   my ($para, %opt) = @_; | 
| 56 | 
   join "\n\n", map { | 
   join "\n\n", map { | 
| 307 | 
 ]]> | 
 ]]> | 
| 308 | 
 <!ENTITY % $module_set->{ID}.xmlns.decl.attrib "">\n\n); | 
 <!ENTITY % $module_set->{ID}.xmlns.decl.attrib "">\n\n); | 
| 309 | 
   } | 
   } | 
| 310 | 
  | 
   $s .= <<EOH; | 
| 311 | 
  | 
 <!-- Declare a parameter entity %XSI.prefix as a prefix to use for | 
| 312 | 
  | 
      XML Schema Instance attributes. --> | 
| 313 | 
  | 
 <!ENTITY % XSI.prefix "xsi"> | 
| 314 | 
  | 
  | 
| 315 | 
  | 
 <!ENTITY % XSI.pfx "%XSI.prefix;:"> | 
| 316 | 
  | 
  | 
| 317 | 
  | 
 <!ENTITY % XSI.xmlns "http://www.w3.org/2001/XMLSchema-instance"> | 
| 318 | 
  | 
  | 
| 319 | 
  | 
 <!-- Declare a parameter entity %XSI.xmlns.attrib as support for | 
| 320 | 
  | 
      the schemaLocation attribute. --> | 
| 321 | 
  | 
 <!ENTITY % XSI.xmlns.attrib | 
| 322 | 
  | 
         "xmlns:%XSI.prefix;     %URI.datatype;  #FIXED '%XSI.xmlns;'"> | 
| 323 | 
  | 
 EOH | 
| 324 | 
   $s .= qq(\n<!ENTITY % NS.decl.attrib | 
   $s .= qq(\n<!ENTITY % NS.decl.attrib | 
| 325 | 
         ").join ("\n\t", (map {qq(%$_->{ID}.xmlns.decl.attrib;)} @src), | 
         ").join ("\n\t", (map {qq(%$_->{ID}.xmlns.decl.attrib;)} @src), | 
| 326 | 
                          map {qq(%$_->{ID}.xmlns.extra.attrib;)} @src).qq(">\n); | 
                          map {qq(%$_->{ID}.xmlns.extra.attrib;)} @src) | 
| 327 | 
  | 
           .qq(\n\t%XSI.xmlns.attrib;">\n); | 
| 328 | 
   $s .= qq(\n); | 
   $s .= qq(\n); | 
| 329 | 
   for my $module_set (@src) { | 
   for my $module_set (@src) { | 
| 330 | 
     $s .= qq(<!ENTITY % $module_set->{ID}.xmlns.attrib "%NS.decl.attrib;">\n); | 
     $s .= qq(<!ENTITY % $module_set->{ID}.xmlns.attrib "%NS.decl.attrib;">\n); | 
| 423 | 
   my $ID = $Info->{ID}; | 
   my $ID = $Info->{ID}; | 
| 424 | 
   my $ns = $src->get_attribute ('Namespace'); | 
   my $ns = $src->get_attribute ('Namespace'); | 
| 425 | 
   my $s = <<EOH; | 
   my $s = <<EOH; | 
| 426 | 
  | 
 <!ENTITY % sgml.tag.minimizable "IGNORE"> | 
| 427 | 
  | 
  | 
| 428 | 
 <!ENTITY % NS.prefixed "@{[$ns->get_attribute_value ('UsePrefix')==1? | 
 <!ENTITY % NS.prefixed "@{[$ns->get_attribute_value ('UsePrefix')==1? | 
| 429 | 
                             q(INCLUDE):q(IGNORE)]}"> | 
                             q(INCLUDE):q(IGNORE)]}"> | 
| 430 | 
  | 
  | 
| 431 | 
 <!-- Section A: XML Namespace Framework :::::::::::::::::::::::::: --> | 
 <!-- Section A: XML Namespace Framework :::::::::::::::::::::::::: --> | 
| 432 | 
  | 
  | 
| 433 | 
 <!-- 1. Declare conditional section keyword, used to activate namespace | 
 <!-- 1. Declare a %$ID.prefixed; conditional section keyword, used | 
| 434 | 
         prefixing. --> | 
         to activate namespace prefixing. --> | 
| 435 | 
 <!ENTITY % $ID.prefixed "@{[$ns->get_attribute_value ('UsePrefix')==1? | 
 <!ENTITY % $ID.prefixed "@{[$ns->get_attribute_value ('UsePrefix')==1? | 
| 436 | 
                             q(INCLUDE): | 
                             q(INCLUDE): | 
| 437 | 
                             $ns->get_attribute_value ('UsePrefix')==-1? | 
                             $ns->get_attribute_value ('UsePrefix')==-1? | 
| 438 | 
                             q(IGNORE): | 
                             q(IGNORE): | 
| 439 | 
                             q(%NS.prefixed;)]}"> | 
                             q(%NS.prefixed;)]}"> | 
| 440 | 
  | 
  | 
| 441 | 
 <!-- 2. Declare a parameter entity containing the namespace name. --> | 
 <!ENTITY % $ID.global.attrs.prefixed "@{[$ns->get_attribute_value ('UsePrefix')==1? | 
| 442 | 
  | 
                             q(INCLUDE): | 
| 443 | 
  | 
                             $ns->get_attribute_value ('UsePrefix')==-1? | 
| 444 | 
  | 
                             q(IGNORE): | 
| 445 | 
  | 
                             q(%NS.prefixed;)]}"> | 
| 446 | 
  | 
  | 
| 447 | 
  | 
 <!ENTITY % $ID.xsi.attrs "INCLUDE"> | 
| 448 | 
  | 
  | 
| 449 | 
  | 
 <!-- 2. Declare a parameter entity %$ID.xmlns; containing | 
| 450 | 
  | 
         the URI reference used to identity the namespace. --> | 
| 451 | 
 <!ENTITY % $ID.xmlns "@{[$ns->get_attribute_value ('Name')]}"> | 
 <!ENTITY % $ID.xmlns "@{[$ns->get_attribute_value ('Name')]}"> | 
| 452 | 
  | 
  | 
| 453 | 
 <!-- 3. Declare parameter entities containing the default namespace prefix | 
 <!-- 3. Declare parameter entity %$ID.prefix; containing | 
| 454 | 
         string to use when prefixing is enabled. --> | 
         the default namespace prefix string to use when prefixing | 
| 455 | 
  | 
         is enabled. This may be overridden in the DTD driver or the | 
| 456 | 
  | 
         internal subset of a document instance. | 
| 457 | 
  | 
          | 
| 458 | 
  | 
         NOTE: As specified in XML Namespace speficications, the namespace | 
| 459 | 
  | 
         prefix serves as a proxy for the URI reference, and is not in itself | 
| 460 | 
  | 
         significant. --> | 
| 461 | 
 <!ENTITY % $ID.prefix "@{[$ns->get_attribute_value ('DefaultPrefix')]}"> | 
 <!ENTITY % $ID.prefix "@{[$ns->get_attribute_value ('DefaultPrefix')]}"> | 
| 462 | 
  | 
  | 
| 463 | 
 <!-- 4. Declare parameter entities containing the colonized prefix | 
 <!-- 4. Declare parameter entity %$ID.pfx; containing the | 
| 464 | 
         used when prefixing is active, an empty string when it is not. --> | 
         colonized prefix (e.g, '%$ID.prefix;:') used when | 
| 465 | 
  | 
         prefixing is active, an empty string when it is not. --> | 
| 466 | 
 <![%$ID.prefixed;[ | 
 <![%$ID.prefixed;[ | 
| 467 | 
 <!ENTITY % $ID.pfx "%$ID.prefix;:"> | 
 <!ENTITY % $ID.pfx "%$ID.prefix;:"> | 
| 468 | 
 ]]> | 
 ]]> | 
| 469 | 
 <!ENTITY % $ID.pfx ""> | 
 <!ENTITY % $ID.pfx ""> | 
| 470 | 
  | 
  | 
| 471 | 
 <!-- declare qualified name extensions here --> | 
 <!-- declare qualified name extensions here ............ --> | 
| 472 | 
 <!ENTITY % ${ID}-qname-extra.mod ""> | 
 <!ENTITY % ${ID}-qname-extra.mod ""> | 
| 473 | 
 %${ID}-qname-extra.mod; | 
 %${ID}-qname-extra.mod; | 
| 474 | 
  | 
  | 
| 475 | 
 <!-- 5. This parameter entity may be redeclared to contain any foreign | 
 <!-- 5. The parameter entity %$ID.xmlns.extra.attrib; may be | 
| 476 | 
         namespace declaration attributes for namespaces embedded. --> | 
         redeclared to contain any foreign namespace declaration | 
| 477 | 
  | 
         attributes for namespaces embedded.  The default | 
| 478 | 
  | 
         is an empty string. --> | 
| 479 | 
 <!ENTITY % $ID.xmlns.extra.attrib ""> | 
 <!ENTITY % $ID.xmlns.extra.attrib ""> | 
| 480 | 
  | 
  | 
| 481 | 
  | 
 <!-- The parameter entity %URI.datatype; should already be defined in | 
| 482 | 
  | 
      Datatype module. --> | 
| 483 | 
  | 
 <!ENTITY % URI.datatype; "CDATA"> | 
| 484 | 
  | 
  | 
| 485 | 
 <![%$ID.prefixed;[ | 
 <![%$ID.prefixed;[ | 
| 486 | 
 <!ENTITY % $ID.xmlns.decl.attrib | 
 <!ENTITY % $ID.xmlns.decl.attrib | 
| 487 | 
         "xmlns:%$ID.prefix;     %URI.datatype;  #FIXED '%$ID.xmlns;'"> | 
         "xmlns:%$ID.prefix;     %URI.datatype;  #FIXED '%$ID.xmlns;'"> | 
| 489 | 
 <!ENTITY % $ID.xmlns.decl.attrib | 
 <!ENTITY % $ID.xmlns.decl.attrib | 
| 490 | 
         "xmlns  %URI.datatype;  #FIXED '%$ID.xmlns;'"> | 
         "xmlns  %URI.datatype;  #FIXED '%$ID.xmlns;'"> | 
| 491 | 
  | 
  | 
| 492 | 
  | 
 <!-- Declare a parameter entity %XSI.prefix as a prefix to use for | 
| 493 | 
  | 
      XML Schema Instance attributes. --> | 
| 494 | 
  | 
 <!ENTITY % XSI.prefix "xsi"> | 
| 495 | 
  | 
  | 
| 496 | 
  | 
 <!ENTITY % XSI.pfx "%XSI.prefix;:"> | 
| 497 | 
  | 
  | 
| 498 | 
  | 
 <!ENTITY % XSI.xmlns "http://www.w3.org/2001/XMLSchema-instance"> | 
| 499 | 
  | 
  | 
| 500 | 
  | 
 <!-- Declare a parameter entity %XSI.xmlns.attrib as support for | 
| 501 | 
  | 
      the schemaLocation attribute. --> | 
| 502 | 
  | 
 <!ENTITY % XSI.xmlns.attrib | 
| 503 | 
  | 
         "xmlns:%XSI.prefix;     %URI.datatype;  #FIXED '%XSI.xmlns;'"> | 
| 504 | 
  | 
  | 
| 505 | 
 <![%$ID.prefixed;[ | 
 <![%$ID.prefixed;[ | 
| 506 | 
 <!ENTITY % NS.decl.attrib | 
 <!ENTITY % NS.decl.attrib | 
| 507 | 
         "%$ID.xmlns.decl.attrib; | 
         "%$ID.xmlns.decl.attrib; | 
| 508 | 
         %$ID.xmlns.extra.attrib;"> | 
         %$ID.xmlns.extra.attrib; | 
| 509 | 
  | 
         %XSI.xmlns.attrib;"> | 
| 510 | 
 ]]> | 
 ]]> | 
| 511 | 
 <!ENTITY % NS.decl.attrib | 
 <!ENTITY % NS.decl.attrib | 
| 512 | 
         "%$ID.xmlns.extra.attrib;"> | 
         "%$ID.xmlns.extra.attrib; | 
| 513 | 
  | 
         %XSI.xmlns.attrib;"> | 
| 514 | 
  | 
  | 
| 515 | 
 <!-- Declare a parameter entity containing all XML namespace declaration | 
 <!-- Declare a parameter entity containing all XML namespace declaration | 
| 516 | 
      attributes used, including a default xmlns declaration when prefixing | 
      attributes used, including a default xmlns declaration when prefixing | 
| 523 | 
         "%$ID.xmlns.decl.attrib; | 
         "%$ID.xmlns.decl.attrib; | 
| 524 | 
         %NS.decl.attrib;"> | 
         %NS.decl.attrib;"> | 
| 525 | 
  | 
  | 
| 526 | 
 <!-- Section B: Qualified Names :::::::::::::::::::::::::::::::::: --> | 
 <!-- @{[dot_padding qq(Section B: $Info->{realname} Qualified Names ), | 
| 527 | 
  | 
                length => 71-9, dot => q(:)]} --> | 
| 528 | 
  | 
  | 
| 529 | 
 <!-- placeholder for qualified name redeclarations --> | 
 <!-- placeholder for qualified name redeclarations --> | 
| 530 | 
 <!ENTITY % ${ID}-qname-extra.mod ""> | 
 <!ENTITY % ${ID}-qname.redecl ""> | 
| 531 | 
 %${ID}-qname-extra.mod; | 
 %${ID}-qname.redecl; | 
| 532 | 
  | 
  | 
| 533 | 
 <!-- 6. Declare parameter entities used to provide namespace-qualified | 
 <!-- 6. This section declare parameter entities used to provide | 
| 534 | 
         names for all element types and global attribute names. --> | 
         namespace-qualified names for all element types and global | 
| 535 | 
  | 
         attribute names. --> | 
| 536 | 
 EOH | 
 EOH | 
| 537 | 
   for my $lname (sort keys %{$Info->{QName}}) { | 
   for my $lname (sort keys %{$Info->{QName}}) { | 
| 538 | 
     $s .= qq(<!ENTITY % ) | 
     $s .= qq(<!ENTITY % ) | 
| 616 | 
  | 
  | 
| 617 | 
 sub get_desc ($$;%) { | 
 sub get_desc ($$;%) { | 
| 618 | 
   my ($src, $Info, %opt) = @_; | 
   my ($src, $Info, %opt) = @_; | 
| 619 | 
       my $desc = $src->get_attribute_value ('Description'); | 
   my $desc = $src->get_attribute_value ('Description'); | 
| 620 | 
       $desc =~ s/\n/\n     /g; | 
   $desc =~ s/\n/\n     /g; | 
| 621 | 
   if (length $desc) { | 
   if (length $desc) { | 
| 622 | 
     $desc = qq($opt{prefix}$desc); | 
     $desc = qq($opt{prefix}$desc); | 
| 623 | 
     $desc .= q( ) if $opt{padding_length}; | 
     $desc .= q( ) if $opt{padding_length}; | 
| 624 | 
     $desc = q(<!-- ).(dot_padding $desc, length => $opt{padding_length}, | 
     $desc = q(<!-- ).(dot_padding $desc, length => $opt{padding_length}, | 
| 625 | 
                                          dot => $opt{padding_dot}).qq( -->\n); | 
                                          dot => $opt{padding_dot}).qq( -->\n); | 
| 626 | 
  | 
   } elsif (length $opt{default}) { | 
| 627 | 
  | 
     $desc = $opt{default}; | 
| 628 | 
  | 
     $desc .= q( ) if $opt{padding_length}; | 
| 629 | 
  | 
     $desc = q(<!-- ).(dot_padding $desc, length => $opt{padding_length}, | 
| 630 | 
  | 
                                          dot => $opt{padding_dot}).qq( -->\n); | 
| 631 | 
   } | 
   } | 
| 632 | 
   $desc; | 
   $desc; | 
| 633 | 
 } | 
 } | 
| 707 | 
     'xml:base'  => q<xml:base   %URI.datatype;  #IMPLIED>, | 
     'xml:base'  => q<xml:base   %URI.datatype;  #IMPLIED>, | 
| 708 | 
     'xml:lang'  => q<xml:lang   %LanguageCode.datatype; #IMPLIED>, | 
     'xml:lang'  => q<xml:lang   %LanguageCode.datatype; #IMPLIED>, | 
| 709 | 
     'xml:space' => q<xml:space  (default|preserve)      #IMPLIED>, | 
     'xml:space' => q<xml:space  (default|preserve)      #IMPLIED>, | 
| 710 | 
  | 
     'xsi:nil'   => q<%XSI.prefix;:nil (true|false|1|0) #IMPLIED>, | 
| 711 | 
  | 
     'xsi:noNamespaceSchemaLocation'     => q<%XSI.prefix;:noNamespaceSchemaLocation CDATA #IMPLIED>, | 
| 712 | 
  | 
     'xsi:schemaLocation'        => q<%XSI.prefix;:schemaLocation CDATA #IMPLIED>, | 
| 713 | 
  | 
     'xsi:type'  => q<%XSI.prefix;:type NMTOKEN #IMPLIED>, | 
| 714 | 
   }->{$src->value}; | 
   }->{$src->value}; | 
| 715 | 
 } | 
 } | 
| 716 | 
  | 
  | 
| 770 | 
     $short_name = $1; | 
     $short_name = $1; | 
| 771 | 
   } | 
   } | 
| 772 | 
   my $s = get_desc $src, $Info, prefix => qq($short_name: ), | 
   my $s = get_desc $src, $Info, prefix => qq($short_name: ), | 
| 773 | 
                    padding_length => 51, padding_dot => q(.); | 
                    padding_length => 51, padding_dot => q(.), | 
| 774 | 
  | 
                    default => qq($short_name); | 
| 775 | 
   $s .= "\n"; | 
   $s .= "\n"; | 
| 776 | 
   $s .= xml_parameter_ENTITY qq($mname.element), value => 'INCLUDE'; | 
   $s .= xml_parameter_ENTITY qq($mname.element), value => 'INCLUDE'; | 
| 777 | 
  | 
   my $cm = convert_content_model ($src, $Info, default => 'EMPTY'); | 
| 778 | 
   $s .= xml_condition_section (qq($mname.element) => | 
   $s .= xml_condition_section (qq($mname.element) => | 
| 779 | 
             xml_parameter_ENTITY | 
             xml_parameter_ENTITY (qq($name.content), value => $cm) | 
 | 
               (qq($name.content), | 
  | 
 | 
                value => convert_content_model ($src, $Info, default => 'EMPTY')) | 
  | 
| 780 | 
           . xml_parameter_ENTITY (qq($name.qname), value => $short_name) | 
           . xml_parameter_ENTITY (qq($name.qname), value => $short_name) | 
| 781 | 
           . qq(<!ELEMENT %$name.qname; %$name.content;>\n)); | 
           . xml_parameter_ENTITY (qq($name.tagmin.start), value => q<->) | 
| 782 | 
  | 
           . xml_parameter_ENTITY (qq($name.tagmin.end), value => $cm eq 'EMPTY' ? q<o> : q<->) | 
| 783 | 
  | 
           . xml_condition_section (qq(sgml.tag.minimizable) => | 
| 784 | 
  | 
               xml_parameter_ENTITY (qq($name.tagmin), | 
| 785 | 
  | 
                                     value => qq"%$name.tagmin.start; %$name.tagmin.end;")) | 
| 786 | 
  | 
           . xml_parameter_ENTITY (qq($name.tagmin), value => q"") | 
| 787 | 
  | 
           . qq(<!ELEMENT %$name.qname; %$name.tagmin; %$name.content;>\n)); | 
| 788 | 
   $s .= "\n"; | 
   $s .= "\n"; | 
| 789 | 
   $s .= attlist_def (scalar $src->get_attribute ('Attribute', make_new_node => 1), $Info, $mname); | 
   $s .= attlist_def (scalar $src->get_attribute ('Attribute', make_new_node => 1), $Info, $mname); | 
| 790 | 
   $s; | 
   $s; | 
| 877 | 
      }]} --> | 
      }]} --> | 
| 878 | 
 <!-- file: $Info->{ID}-$id.mod | 
 <!-- file: $Info->{ID}-$id.mod | 
| 879 | 
       | 
       | 
| 880 | 
      $Info->{Description} | 
 @{[make_paragraphs [$Info->{Description}], indent => q<     >]} | 
| 881 | 
  | 
       | 
| 882 | 
      Copyright @{[(gmtime)[5]+1900]} $Info->{Copyright}, All Rights Reserved. | 
      Copyright @{[(gmtime)[5]+1900]} $Info->{Copyright}, All Rights Reserved. | 
| 883 | 
  | 
       | 
| 884 | 
  | 
      Permission to use, copy, modify and distribute this DTD and its | 
| 885 | 
  | 
      accompanying documentation for any purpose and without fee is hereby | 
| 886 | 
  | 
      granted in perpetuity, provided that the above copyright notice and | 
| 887 | 
  | 
      this paragraph appear in all copies.  The copyright holders make no | 
| 888 | 
  | 
      representation about the suitability of the DTD for any purpose. | 
| 889 | 
  | 
       | 
| 890 | 
  | 
      It is provided "as is" without expressed or implied warranty. | 
| 891 | 
  | 
       | 
| 892 | 
      Revision: @{[sprintf '%04d-%02d-%02dT%02d:%02d:%02d+00:00', | 
      Revision: @{[sprintf '%04d-%02d-%02dT%02d:%02d:%02d+00:00', | 
| 893 | 
                           (gmtime)[5]+1900, (gmtime)[4]+1, (gmtime)[3,2,1,0] | 
                           (gmtime)[5]+1900, (gmtime)[4]+1, (gmtime)[3,2,1,0] | 
| 894 | 
                ]} (Generated by $SCRIPT_NAME/$VERSION) | 
                ]} (Generated by $SCRIPT_NAME/$VERSION) | 
| 949 | 
               }->{$id}, $src->get_attribute_value ('Description')); | 
               }->{$id}, $src->get_attribute_value ('Description')); | 
| 950 | 
   unshift @para, '  '.join ', ', sort @{$Info->{elements}||[]} if @{$Info->{elements}||[]}; | 
   unshift @para, '  '.join ', ', sort @{$Info->{elements}||[]} if @{$Info->{elements}||[]}; | 
| 951 | 
   if (@para) { | 
   if (@para) { | 
| 952 | 
  | 
     $name = qq($Info->{realname} QName (Qualified Name) Module) | 
| 953 | 
  | 
       if $id eq 'qname'; | 
| 954 | 
     $r .= <<EOH; | 
     $r .= <<EOH; | 
| 955 | 
 <!-- $name | 
 <!-- $name | 
| 956 | 
  | 
  | 
| 983 | 
  | 
  | 
| 984 | 
 <!-- $Info->{Name} DTD | 
 <!-- $Info->{Name} DTD | 
| 985 | 
  | 
  | 
| 986 | 
      $Info->{Description} | 
 @{[make_paragraphs [$Info->{Description}], indent => q<     >]} | 
| 987 | 
  | 
  | 
| 988 | 
      Copyright @{[(gmtime)[5]+1900]} $Info->{Copyright}, All Rights Reserved. | 
      Copyright @{[(gmtime)[5]+1900]} $Info->{Copyright}, All Rights Reserved. | 
| 989 | 
  | 
  |