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