from trac.core import * from trac.util import escape from trac.mimeview.api import IContentConverter from trac.wiki.formatter import wiki_to_html import os import re from cStringIO import StringIO import urllib from tidy import parseString import libxml2 import libxslt from pkg_resources import resource_filename class PageToDocbookPlugin(Component): """Convert Wiki pages to docbook.""" implements(IContentConverter) def wiki_to_docbook(wikitext, env, req, db=None, absurls=False, escape_newlines=False): if not wikitext: return "" out = StringIO() DocbookFormatter(env, req, absurls, db).format(wikitext, out, escape_newlines) return out.getvalue() # IContentConverter methods def get_supported_conversions(self): yield ('docbook', 'Docbook', 'docbook', 'text/x-trac-wiki', 'application/docbook+xml', 7) def convert_content(self, req, input_type, source, output_type): #extract all data resources datadir = resource_filename(__name__, 'data') html = wiki_to_html(source, self.env, req) options = dict(output_xhtml=1, add_xml_decl=1, indent=1, tidy_mark=0, input_encoding='utf8', output_encoding='utf8', doctype='auto', wrap=0, char_encoding='utf8') xhtml = parseString(html.encode("utf-8"), **options) xhtml2dbXsl = u""" """ normalizedHeadingsXsl = u""" """ xhtml_xmldoc = libxml2.parseDoc(str(xhtml)) normalizedHeadingsXsl_xmldoc = libxml2.parseDoc(normalizedHeadingsXsl) normalizedHeadingsXsl_xsldoc = libxslt.parseStylesheetDoc(normalizedHeadingsXsl_xmldoc) xhtml2_xmldoc = normalizedHeadingsXsl_xsldoc.applyStylesheet(xhtml_xmldoc, None) nhstring = normalizedHeadingsXsl_xsldoc.saveResultToString(xhtml2_xmldoc) xhtml2dbXsl_xmldoc = libxml2.parseDoc(xhtml2dbXsl) xhtml2dbXsl_xsldoc = libxslt.parseStylesheetDoc(xhtml2dbXsl_xmldoc) docbook_xmldoc = xhtml2dbXsl_xsldoc.applyStylesheet(xhtml2_xmldoc, None) dbstring = xhtml2dbXsl_xsldoc.saveResultToString(docbook_xmldoc) xhtml_xmldoc.freeDoc() normalizedHeadingsXsl_xsldoc.freeStylesheet() xhtml2dbXsl_xsldoc.freeStylesheet() xhtml2_xmldoc.freeDoc() docbook_xmldoc.freeDoc() return (dbstring, 'text/plain') #application/docbook+xml