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;
  
  
  

Reply via email to