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;