package MojoMojo::Formatter::DocBook; use strict; use warnings; use parent qw/MojoMojo::Formatter/; eval "use XML::LibXSLT;use XML::SAX::ParserFactory (); use XML::LibXML::Reader;"; my $eval_res = $@; use MojoMojo::Formatter::DocBook::Colorize; my $xsltfile = "/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/xhtml/docbook.xsl"; =head2 module_loaded Return true if the module is loaded. =cut sub module_loaded { return 0 unless -f $xsltfile; return $eval_res ? 0 : 1; } my $debug = 0; =head1 NAME MojoMojo::Formatter::DocBook - format part of content as DocBook =head1 DESCRIPTION This formatter will format content between two =docbook blocks as DocBook document. =head1 METHODS =head2 format_content_order Format order can be 1-99. The DocBook formatter runs on 10. =cut sub format_content_order { 10 } =head2 format_content Calls the formatter. Takes a ref to the content as well as the context object. =cut sub format_content { my ($class, $content, $c) = @_; my @lines = split /\n/, $$content; my $dbk; $$content = ""; my $start_re = $class->gen_re(qr/docbook/); my $end_re = $class->gen_re(qr/end/); foreach my $line (@lines) { if ($dbk) { if ($line =~ m/^(.*)$end_re(.*)$/) { $$content .= $class->to_xhtml($dbk); $dbk = ""; } else { $dbk .= $line . "\n"; } } else { if ($line =~ m/^(.*)$start_re(.*)$/) { $$content .= $1; $dbk = " " . $2; # make it true :) } else { $$content .= $line . "\n"; } } } } =head2 to_xhtml Takes DocBook documentation and renders it as XHTML. =cut sub to_xhtml { my ($class, $dbk) = @_; my $result; # Beurk $dbk =~ s/&/_-_amp_-_;/g; $dbk =~ s/^\s+//; $dbk =~ s/^\n+//; # 1 - Mark lang # to [lang=...] code [/lang] my $my_Handler = MojoMojo::Formatter::DocBook::Colorize->new($debug); $my_Handler->step('marklang'); my $parsersax = XML::SAX::ParserFactory->parser(Handler => $my_Handler,); my @markeddbk = eval { $parsersax->parse_string($dbk) }; if ($@) { return "\nDocument malformed : $@\n"; } # 2 - Transform with xslt my $parser = XML::LibXML->new(); my $xslt = XML::LibXSLT->new(); my $source = eval { $parser->parse_string("@markeddbk") }; if ($@) { return "\nDocument malformed : line $@\n"; } my $style_doc = $parser->parse_file($xsltfile); my $stylesheet = eval { $xslt->parse_stylesheet($style_doc); }; # warn "@_" if @_; #return "XHTML XHTML XHTML"; # C'est ici que l'on peut ajouter le css, LANG ... # voir http://docbook.sourceforge.net/release/xsl/current/doc/html/index.html # et http://www.sagehill.net/docbookxsl my $results = $stylesheet->transform( $source, XML::LibXSLT::xpath_to_string( 'section.autolabel' => '1', 'chapter.autolabel' => '1', 'suppress.navigation' => '1', 'generate.toc' => '0' ) ); my $format = 0; my $string = eval { $results->toString($format); }; # 3 - Colorize Code [lang=...] ... code ... [/lang] $my_Handler->step('colorize'); my @colorized = $parsersax->parse_string($string); $string = "@colorized"; $string =~ s/_-_amp_-_;/&/g; # 4 - filter # To adapt to mojomojo # delete , ,,,,, $string =~ s/^.*//s; $string =~ s/<\/body>.*<\/html>//s; $string =~ s/<\/a>//g; $string =~ s/clear:\sboth//g; return $string; } =head1 SEE ALSO L, L =head1 AUTHORS Daniel Brosseau =head1 LICENSE This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself. =cut 1;