matts       2003/01/24 07:30:32

  Modified:    lib/Apache/AxKit/Language XSP.pm
  Log:
  Re-write to reduce size of XSP compiled files by using functions to create 
nodes etc
  
  Revision  Changes    Path
  1.25      +90 -61    xml-axkit/lib/Apache/AxKit/Language/XSP.pm
  
  Index: XSP.pm
  ===================================================================
  RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/Language/XSP.pm,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- XSP.pm    2 Jan 2003 16:09:34 -0000       1.24
  +++ XSP.pm    24 Jan 2003 15:30:31 -0000      1.25
  @@ -339,6 +339,7 @@
                   "use Apache;",
                   "use Apache::Constants qw(:common);",
                   "use XML::LibXML;",
  +                "Apache::AxKit::Language::XSP::Page->import 
qw(__mk_text_node __mk_comment_node __mk_ns_element_node __mk_element_node);",
                   );
       
       foreach my $ns (keys %Apache::AxKit::Language::XSP::tag_lib) {
  @@ -628,14 +629,11 @@
   # output through a characters SAX event."
   
       if ($e->current_element() =~ /^(content)$/) {
  -        $text = makeSingleQuoted($text);
  -
  -        return <<"EOT";
  -{
  -    my \$text = \$document->createTextNode($text);
  -    \$parent->appendChild(\$text); 
  -}
  -EOT
  +        if ($text =~ /\S/ || $e->{XSP_Indent}) {
  +            $text = makeSingleQuoted($text);
  +            return "__mk_text_node(\$document,\$parent,$text);";
  +        }
  +        return '';
       }
       elsif ($e->current_element() =~ /^(attribute|comment|name)$/) {
           return '' if ($e->current_element() eq 'attribute' && 
!$e->{attrib_seen_name});
  @@ -693,8 +691,7 @@
           }
           if (my $name = $attribs{name}) {
               $e->manage_text(0);
  -            return '{ my $elem = $document->createElement(' . 
makeSingleQuoted($name) . ');' .
  -                    '$parent->appendChild($elem); $parent = $elem; }' . "\n";
  +            return '$parent = __mk_element_node($document, $parent, ' . 
makeSingleQuoted($name) . ');';
           }
       }
       elsif ($tag eq 'attribute') {
  @@ -705,39 +702,45 @@
           $e->{attrib_seen_name} = 0;
       }
       elsif ($tag eq 'name') {
  -        return '{ my $name = ""';
  +        if ($node->{Parent}->{Name} =~ /^(.*:)?element$/) {
  +            return '$parent = __mk_element_node($document, $parent, ""';
  +        }
  +        elsif ($node->{Parent}->{Name} =~ /^(.*:)?attribute$/) {
  +            $e->{attrib_seen_name} = 1;
  +            return '__mk_attribute_node($document, $parent, $name, ""';
  +        }
  +        else {
  +            die "xsp:name parent node: $node->{Parent}->{Name} not valid";
  +        }
       }
       elsif ($tag eq 'pi') {
       }
       elsif ($tag eq 'comment') {
  -        return '{ my $comment = $document->createComment(""';
  +        return '__mk_comment_node($document, $parent, ""';
       }
       elsif ($tag eq 'text') {
  -        return '{ my $text = $document->createTextNode(""';
  +        return '__mk_text_node($document, $parent, ""';
       }
       elsif ($tag eq 'expr') {
   #        warn "expr: -2 = {", $node->{Parent}->{NamespaceURI}, "}", 
$node->{Parent}->{Name}, "\n";
           if 
(Apache::AxKit::Language::XSP::is_xsp_namespace($node->{Parent}->{NamespaceURI}))
 {
               if (!$e->manage_text() || $node->{Parent}->{Name} =~ 
/^(.*:)?content$/) {
  -                return <<'EOT';
  -{
  -    my $text = $document->createTextNode("".do {
  -EOT
  +                return '__mk_text_node($document, $parent, "" . do {';
               }
               elsif ($node->{Parent}->{Name} =~ /^(.*:)?(logic|expr)$/) {
                   return 'do {';
               }
  +            return ' . do {';
           }
           else {
  -            return <<'EOT';
  -{
  -    my $text = $document->createTextNode("".do {
  -EOT
  +            return '__mk_text_node($document, $parent, "" . do {';
           }
  -        
  -        return '. do {';
  +        warn("EEEK - Should never get here!!!");
   #        warn "start Expr: CurrentEl: ", $e->current_element, "\n";
       }
  +    else {
  +        warn("Unrecognised tag: $tag");
  +    }
   
       return '';
   }
  @@ -767,52 +770,37 @@
           return '$parent = $parent->getParentNode;' . "\n";
       }
       elsif ($tag eq 'attribute') {
  -        return ');' . "\n";
  +        # ends function from either start('attribute') or end('name)
  +        # as in either <xsp:attribute name="foo">
  +        #           vs <xsp:attrubute><xsp:name>foo</xsp:name>
  +        return ");\n";
       }
       elsif ($tag eq 'name') {
  -        if ($node->{Parent}->{Name} =~ /^(.*:)?element$/) {
  -            $e->manage_text(0, 1);
  -            return '; my $elem = $document->createElement($name);' .
  -                    '$parent->appendChild($elem); $parent = $elem; }' . "\n";
  -        }
  -        elsif ($node->{Parent}->{Name} =~ /^(.*:)?attribute$/) {
  -            $e->{attrib_seen_name} = 1;
  -            return '; my $attr = $document->createAttribute($name, ""';
  -        }
  -        else {
  -            die "xsp:name parent node: $node->{Parent}->{Name} not valid";
  -        }
       }
       elsif ($tag eq 'pi') {
       }
       elsif ($tag eq 'comment') {
  -        return '); $parent->appendChild($comment); }' . "\n";
  +        return ");\n";
       }
       elsif ($tag eq 'text') {
  -        return '); $parent->appendChild($text); }' . "\n";
  +        return ");\n";
       }
       elsif ($tag eq 'expr') {
   #        warn "expr: -2 = {", $node->{Parent}->{NamespaceURI}, "}", 
$node->{Parent}->{Name}, "\n";
           if 
(Apache::AxKit::Language::XSP::is_xsp_namespace($node->{Parent}->{NamespaceURI}))
 {
               if (!$e->manage_text() || $node->{Parent}->{Name} =~ 
/^(.*:)?content$/) {
  -                return <<'EOT';
  -}); # xsp tag
  -    $parent->appendChild($text); 
  -}
  -EOT
  +                return "}); # xsp tag\n";
               }
               elsif ($node->{Parent}->{Name} =~ /^(.*:)?(logic|expr)$/) {
                   return '}';
               }
  +            else {
  +                return '}';
  +            }
           }
           else {
  -            return <<'EOT';
  -}); # non xsp tag
  -    $parent->appendChild($text); 
  -}
  -EOT
  +            return "}); # non xsp tag\n";
           }
  -        return '}';
       }
       
       return '';
  @@ -848,12 +836,13 @@
   #            if ($node->{Name} !~ m/:/) {
   #                $node->{Name} = 
$e->generate_nsprefix($node->{NamespaceURI}).':'.$node->{Name};
   #            }
  -            $code = '{ my $elem = 
$document->createElementNS('.makeSingleQuoted($node->{NamespaceURI}).','.makeSingleQuoted($node->{Name}).');'
 .
  -                '$document->setDocumentElement($elem); $parent = $elem; }' . 
"\n";
  +            $code = '$parent = __mk_ns_element_node($document, $parent, '.
  +              makeSingleQuoted($node->{NamespaceURI}).','.
  +              makeSingleQuoted($node->{Name}).");\n";
           }
           else {
  -            $code = '{ my $elem = 
$document->createElement('.makeSingleQuoted($node->{Name}).');' .
  -                    '$document->setDocumentElement($elem); $parent = $elem; 
}' . "\n";
  +            $code = '$parent = __mk_element_node($document, $parent, '.
  +              makeSingleQuoted($node->{Name}).");\n";
           }
       }
       else {
  @@ -865,12 +854,13 @@
               );
           }
           if ($node->{NamespaceURI}) {
  -            $code = '{ my $elem = 
$document->createElementNS('.makeSingleQuoted($node->{NamespaceURI}).','.makeSingleQuoted($node->{Name}).');'
 .
  -                '$parent->appendChild($elem); $parent = $elem; }' . "\n";
  +            $code = '$parent = __mk_ns_element_node($document, $parent, ' .
  +              makeSingleQuoted($node->{NamespaceURI}).','.
  +              makeSingleQuoted($node->{Name}).");\n";
           }
           else {
  -            $code = '{ my $elem = 
$document->createElement('.makeSingleQuoted($node->{Name}).');' .
  -                '$parent->appendChild($elem); $parent = $elem; }' . "\n";
  +            $code = '$parent = __mk_element_node($document, $parent, ' .
  +              makeSingleQuoted($node->{Name}).");\n";
           }
       }
   
  @@ -879,7 +869,7 @@
   #                '), q(' . $attr->{Value} .
   #                '));' . "\n";
           $code .= '$parent->setAttribute('.makeSingleQuoted($attr->{Name}).
  -                ','.makeSingleQuoted($attr->{Value}).');' . "\n";
  +                ','.makeSingleQuoted($attr->{Value}).");\n";
       }
   
       for my $ns (keys %{$e->{Current_NS}}) {
  @@ -926,8 +916,7 @@
       
       $text =~ s/\|/\\\|/g;
       
  -    return '{ my $text = 
$document->createTextNode('.makeSingleQuoted($text).');' .
  -            '$parent->appendChild($text); }' . "\n";
  +    return '__mk_text_node($document, $parent, 
'.makeSingleQuoted($text).");\n";
   }
   
   sub comment {
  @@ -971,6 +960,7 @@
       else {
           $doc = $parser->parse_string($thing);
       }
  +    AxKit::Debug(10, 'XSP: Parser returned doc');
       $doc->process_xinclude;
       
       my $encoding = $doc->getEncoding() || 'UTF-8';
  @@ -1098,6 +1088,10 @@
   ############################################################
   
   package Apache::AxKit::Language::XSP::Page;
  +use Exporter;
  [EMAIL PROTECTED]::AxKit::Language::XSP::Page::ISA = qw(Exporter);
  [EMAIL PROTECTED]::AxKit::Language::XSP::Page::EXPORT_OK = 
  +  qw(__mk_text_node __mk_element_node __mk_comment_node 
__mk_ns_element_node);
   
   sub has_changed {
       my $class = shift;
  @@ -1111,6 +1105,41 @@
       return '';
   }
   
  +sub __mk_text_node {
  +    my ($document, $parent, $text) = @_;
  +    my $node = $document->createTextNode($text);
  +    $parent->appendChild($node);
  +}
  +
  +sub __mk_element_node {
  +    my ($document, $parent, $name) = @_;
  +    my $elem = $document->createElement($name);
  +    if ($parent) {
  +        $parent->appendChild($elem);
  +    }
  +    else {
  +        $document->setDocumentElement($elem);
  +    }
  +    return $elem;
  +}
  +
  +sub __mk_ns_element_node {
  +    my ($document, $parent, $ns, $name) = @_;
  +    my $elem = $document->createElementNS($ns, $name);
  +    if ($parent) {
  +        $parent->appendChild($elem);
  +    }
  +    else {
  +        $document->setDocumentElement($elem);
  +    }
  +    return $elem;
  +}
  +
  +sub __mk_comment_node {
  +    my ($document, $parent, $text) = @_;
  +    my $node = $document->createCommentNode($text);
  +    $parent->appendChild($node);
  +}
   
   # helper class for PerlTidy
   
  
  
  

Reply via email to