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