jwalt 2003/02/20 02:22:19
Modified: lib/Apache/AxKit ConfigReader.pm lib/Apache/AxKit/Language XSP.pm Log: - add XSP line numbering for XML source lines and taglib locations - skip unneccessary DOM->string->DOM conversion in XSP - AxCacheDir and AxTraceIntermediate can take docroot-relative paths now: values starting with "+" are prepended with $r->document_root Revision Changes Path 1.14 +7 -7 xml-axkit/lib/Apache/AxKit/ConfigReader.pm Index: ConfigReader.pm =================================================================== RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/ConfigReader.pm,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- ConfigReader.pm 7 Feb 2003 16:21:44 -0000 1.13 +++ ConfigReader.pm 20 Feb 2003 10:22:18 -0000 1.14 @@ -65,9 +65,9 @@ $self->{cfg}->{CacheDir} || $self->{apache}->dir_config('AxCacheDir')) { - #if (substr($cachedir,0,1) ne '/') { - # $self->{cfg}->{CacheDir} = $cachedir = Apache->request()->document_root.'/'.$cachedir; - #} + if (substr($cachedir,0,1) eq '+') { + $self->{cfg}->{CacheDir} = $cachedir = Apache->request()->document_root.'/'.substr($cachedir,1); + } return $cachedir; } @@ -163,9 +163,9 @@ if (my $dir = $self->{cfg}{TraceIntermediate} || $self->{apache}->dir_config('AxTraceIntermediate')) { return undef if $dir =~ m/^\s*(?:off|none|disabled?)\s*$/i; - #if (substr($dir,0,1) ne '/') { - # $self->{cfg}{TraceIntermediate} = $dir = Apache->request()->document_root.'/'.$dir; - #} + if (substr($dir,0,1) eq '+') { + $self->{cfg}{TraceIntermediate} = $dir = Apache->request()->document_root.'/'.substr($dir,1); + } return $dir; } 1.38 +90 -63 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.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- XSP.pm 18 Feb 2003 22:37:22 -0000 1.37 +++ XSP.pm 20 Feb 2003 10:22:19 -0000 1.38 @@ -24,11 +24,11 @@ # useful for debugging - not actually used by AxKit: # sub get_code { # my $filename = shift; -# +# # # cannot register - no $AxKit::Cfg... # # _register_me_and_others(); # __PACKAGE__->register(); -# +# # my $package = get_package_name($filename); # my $parser = get_parser($package, $filename); # return $parser->parsefile($filename); @@ -49,6 +49,7 @@ my $handler = AxKit::XSP::SAXHandler->new_handler( XSP_Package => $package, XSP_Line => $key, + XSP_Debug => 1, ); my $parser = AxKit::XSP::SAXParser->new( provider => $xml, @@ -62,7 +63,7 @@ eval { if (my $dom_tree = $r->pnotes('dom_tree')) { AxKit::Debug(5, 'XSP: parsing dom_tree'); - $to_eval = $parser->parse($dom_tree->toString); + $to_eval = $parser->parse($dom_tree); delete $r->pnotes()->{'dom_tree'}; } elsif (my $xmlstr = $r->pnotes('xml_string')) { @@ -288,12 +289,13 @@ sub append_to_script { my ($e, $code) = @_; - $e->{XSP_Script} .= $code; + my (undef, $file, $line) = caller; + $e->{XSP_Script} .= $e->location_debug_string($file,$line).$code; } sub manage_text { my ($e, $set, $go_back) = @_; - + $go_back ||= 0; my $depth = $e->depth(); @@ -328,44 +330,52 @@ return $tag; } +sub location_debug_string { + my ($e, $file, $line) = @_; + return '' if !$e->{XSP_Debug} || $file =~ m/^AxKit::XSP::Core::/; + (undef, $file, $line) = caller if (@_ < 3); + $file =~ s/"/''/; + $file =~ s/\n/ /; + return "\n# line $line \"XSP generated by $file\"\n"; +} + sub start_document { my $e = shift; - + $e->{XSP_chars} = 0; $e->{XSP_Script} = join("\n", + $e->location_debug_string, "package $e->{XSP_Package};", - # "#line 2 ".$e->{XSP_Line}."\n", # This is wrong. Currently, line numbers are unrelated to the source file's lines. - # Better leave it out, it makes debug output confusing. "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) { my $pkg = $Apache::AxKit::Language::XSP::tag_lib{$ns}; my $sub; local $AxKit::XSP::TaglibPkg = $pkg; if (($sub = $pkg->can("start_document")) && ($sub != \&start_document)) { - $e->{XSP_Script} .= $sub->($e); + $e->{XSP_Script} .= $e->location_debug_string("${pkg}::start_document",1).$sub->($e); } elsif ($sub = $pkg->can("parse_init")) { - $e->{XSP_Script} .= $sub->($e); + $e->{XSP_Script} .= $e->location_debug_string("${pkg}::parse_init",1).$sub->($e); } } } sub end_document { my $e = shift; - + $e->{XSP_chars} = 0; foreach my $ns (keys %Apache::AxKit::Language::XSP::tag_lib) { my $pkg = $Apache::AxKit::Language::XSP::tag_lib{$ns}; my $sub; local $AxKit::XSP::TaglibPkg = $pkg; if (($sub = $pkg->can("end_document")) && ($sub != \&end_document)) { - $e->{XSP_Script} .= $sub->($e); + $e->{XSP_Script} .= $e->location_debug_string("${pkg}::end_document",1).$sub->($e); } elsif ($sub = $pkg->can("parse_final")) { - $e->{XSP_Script} .= $sub->($e); + $e->{XSP_Script} .= $e->location_debug_string("${pkg}::parse_final",1).$sub->($e); } } @@ -373,7 +383,7 @@ ## (most likely the default start_element() sub) must have started the ## "sub xml_generator {" declaration, and that we need to close it if ($e->{XSP_User_Root}) { - $e->{XSP_Script} .= "return OK;\n}\n"; + $e->{XSP_Script} .= $e->location_debug_string."return OK;\n}\n"; } else { throw Apache::AxKit::Exception::Error( @@ -388,17 +398,18 @@ sub start_element { my $e = shift; my $element = shift; - + $e->{XSP_chars} = 0; + $element->{Parent} ||= $e->{Current_Element}; $e->{Current_Element} = $element; my $ns = $element->{NamespaceURI}; - + # warn "START-NS: $ns : $element->{Name}\n"; - + my @attribs; - + for my $attr (@{$element->{Attributes}}) { if ($attr->{Name} eq 'xmlns') { unless (Apache::AxKit::Language::XSP::is_xsp_namespace($attr->{Value})) { @@ -415,9 +426,9 @@ push @attribs, $attr; } } - + $element->{Attributes} = [EMAIL PROTECTED]; - + if (!defined($ns) || !exists($Apache::AxKit::Language::XSP::tag_lib{ $ns })) { @@ -440,10 +451,10 @@ my $sub; local $AxKit::XSP::TaglibPkg = $pkg; if (($sub = $pkg->can("start_element")) && ($sub != \&start_element)) { - $e->{XSP_Script} .= $sub->($e, $element); + $e->{XSP_Script} .= $e->location_debug_string("${pkg}::start_element",1).$sub->($e, $element); } elsif ($sub = $pkg->can("parse_start")) { - $e->{XSP_Script} .= $sub->($e, $tag, %attribs); + $e->{XSP_Script} .= $e->location_debug_string("${pkg}::parse_start",1).$sub->($e, $tag, %attribs); } } } @@ -451,6 +462,7 @@ sub end_element { my $e = shift; my $element = shift; + $e->{XSP_chars} = 0; my $ns = $element->{NamespaceURI}; @@ -469,10 +481,10 @@ my $sub; local $AxKit::XSP::TaglibPkg = $pkg; if (($sub = $pkg->can("end_element")) && ($sub != \&end_element)) { - $e->{XSP_Script} .= $sub->($e, $element); + $e->{XSP_Script} .= $e->location_debug_string("${pkg}::end_element",1).$sub->($e, $element); } elsif ($sub = $pkg->can("parse_end")) { - $e->{XSP_Script} .= $sub->($e, $tag); + $e->{XSP_Script} .= $e->location_debug_string("${pkg}::parse_end",1).$sub->($e, $tag); } } @@ -503,6 +515,7 @@ $e->{XSP_Script} .= $sub->($e, $text->{Data}); } } + $e->{XSP_chars} = 1; } sub comment { @@ -510,7 +523,7 @@ my $comment = shift; my $ns = $e->{Current_Element}->{NamespaceURI}; - + if (!defined($ns) || !exists($Apache::AxKit::Language::XSP::tag_lib{ $ns })) { @@ -535,7 +548,7 @@ my $pi = shift; my $ns = $e->{Current_Element}->{NamespaceURI}; - + if (!defined($ns) || !exists($Apache::AxKit::Language::XSP::tag_lib{ $ns })) { @@ -621,7 +634,18 @@ # return '' unless $e->{XSP_User_Root}; - return $text; + my $debug = ""; + if (!$e->{XSP_chars}) { + $e->{XSP_Debug_Section} ||= 1; + my $lineno = $node->{LineNumber}; + if (!$lineno) { + $debug = $e->location_debug_string("expr|logic section nr. ".$e->{XSP_Debug_Section},1); + } else { + $debug = $e->location_debug_string("XSP page",$lineno); + } + $e->{XSP_Debug_Section}++; + } + return $debug.$text; } sub start_element { @@ -702,7 +726,8 @@ return '__mk_text_node($document, $parent, ""'; } elsif ($tag eq 'expr') { -# warn "expr: -2 = {", $node->{Parent}->{NamespaceURI}, "}", $node->{Parent}->{Name}, "\n"; + #warn "expr: parent = {", $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 '__mk_text_node($document, $parent, "" . do {'; @@ -804,6 +829,7 @@ my $base_class = $e->{XSP_Base_Class} || 'Apache::AxKit::Language::XSP::Page'; $e->{XSP_Script} .= join("\n", + $e->location_debug_string(), "[EMAIL PROTECTED]>{XSP_Package}::ISA = ('$base_class');", 'sub xml_generator {', 'my $class = shift;', @@ -816,10 +842,11 @@ my $pkg = $Apache::AxKit::Language::XSP::tag_lib{$ns}; local $AxKit::XSP::TaglibPkg = $pkg; if (my $sub = $pkg->can("start_xml_generator")) { - $e->{XSP_Script} .= $sub->($e); + $e->{XSP_Script} .= $e->location_debug_string("${pkg}::start_xml_generator",1).$sub->($e); } } + # Note: No debugging here, to reduce bloat. Shouldn't be neccessary anyways. if ($node->{NamespaceURI}) { $code = '$parent = __mk_ns_element_node($document, $parent, '. makeSingleQuoted($node->{NamespaceURI}).','. @@ -931,42 +958,51 @@ my $doc; - my $parser = XML::LibXML->new(); - Apache::AxKit::LibXMLSupport->reset(); - $parser->expand_entities(1); - - if (ref($thing)) { - $doc = $parser->parse_fh($thing); - } - else { - $doc = $parser->parse_string($thing); + if (ref($thing) ne 'XML::LibXML::Document') { + my $parser = XML::LibXML->new(); + Apache::AxKit::LibXMLSupport->reset(); + $parser->expand_entities(1); + eval { + $parser->line_numbers(1); + AxKit::Debug(6,"enabled line numbers"); + } if $self->{Handler}->{XSP_Debug}; + + if (ref($thing)) { + $doc = $parser->parse_fh($thing); + } + else { + $doc = $parser->parse_string($thing); + } + AxKit::Debug(10, 'XSP: Parser returned doc'); + $doc->process_xinclude; + } else { + $doc = $thing; } - AxKit::Debug(10, 'XSP: Parser returned doc'); - $doc->process_xinclude; - + my $encoding = $doc->getEncoding() || 'UTF-8'; my $document = { Parent => undef }; $self->{Handler}->start_document($document); - + my $root = $doc->getDocumentElement; if ($root) { process_node($self->{Handler}, $root, $encoding); } - + $self->{Handler}->end_document($document); } sub process_node { my ($handler, $node, $encoding) = @_; + my $lineno = eval { $node->lineNumber; } if $handler->{XSP_Debug}; my $node_type = $node->getType(); if ($node_type == XML_COMMENT_NODE) { - $handler->comment( { Data => $node->getData } ); + $handler->comment( { Data => $node->getData, LineNumber => $lineno } ); } elsif ($node_type == XML_TEXT_NODE || $node_type == XML_CDATA_SECTION_NODE) { # warn($node->getData . "\n"); - $handler->characters( { Data => encodeToUTF8($encoding,$node->getData()) } ); + $handler->characters( { Data => encodeToUTF8($encoding,$node->getData()), LineNumber => $lineno } ); } elsif ($node_type == XML_ELEMENT_NODE) { # warn("<" . $node->getName . ">\n"); @@ -1000,31 +1036,36 @@ my ($handler, $element, $encoding) = @_; my @attr; + my $debug = $handler->{XSP_Debug}; foreach my $attr ($element->getAttributes) { + my $lineno = eval { $attr->lineNumber; } if $debug; push @attr, { Name => encodeToUTF8($encoding,$attr->getName), Value => encodeToUTF8($encoding,$attr->getData), NamespaceURI => encodeToUTF8($encoding,$attr->getNamespaceURI), Prefix => encodeToUTF8($encoding,$attr->getPrefix), LocalName => encodeToUTF8($encoding,$attr->getLocalName), + LineNumber => $lineno, }; } + my $lineno = eval { $element->lineNumber; } if $debug; my $node = { Name => encodeToUTF8($encoding,$element->getName), Attributes => [EMAIL PROTECTED], NamespaceURI => encodeToUTF8($encoding,$element->getNamespaceURI), Prefix => encodeToUTF8($encoding,$element->getPrefix), LocalName => encodeToUTF8($encoding,$element->getLocalName), + LineNumber => $lineno, }; - + $handler->start_element($node); foreach my $child ($element->getChildnodes) { process_node($handler, $child, $encoding); } - + $handler->end_element($node); } @@ -1089,20 +1130,6 @@ my ($document, $parent, $text) = @_; my $node = $document->createComment($text); $parent->appendChild($node); -} - -# helper class for PerlTidy - -package Apache::AxKit::Language::XSP::StringWriter; - -sub new { - $_[1] = ''; - return bless \$_[1], $_[0]; -} - -sub print { - my $self = shift; - $$self .= join("",@_); } 1;