Index: wikitopdf/formats.py
===================================================================
--- wikitopdf/formats.py (revision 4556)
+++ wikitopdf/formats.py (working copy)
@@ -24,12 +24,6 @@
from api import IWikiToPdfFormat
from wikitopdf import wiki_to_pdf, html_to_pdf
-EXCLUDE_RES = [
- re.compile(r'\[\[PageOutline([^]]*)\]\]'),
- re.compile(r'\[\[TracGuideToc([^]]*)\]\]'),
- re.compile(r'----(\r)?$\n^Back up: \[\[ParentWiki\]\]', re.M|re.I)
-]
-
class WikiToPdfOutput(Component):
"""Output wiki pages as a PDF/PS document using HTMLDOC."""
Index: wikitopdf/wikitopdf.py
===================================================================
--- wikitopdf/wikitopdf.py (revision 4556)
+++ wikitopdf/wikitopdf.py (working copy)
@@ -10,15 +10,35 @@
from tempfile import mkstemp
import os
import re
+import random
+from urllib import urlretrieve
EXCLUDE_RES = [
re.compile(r'\[\[PageOutline([^]]*)\]\]'),
re.compile(r'\[\[TracGuideToc([^]]*)\]\]'),
+ re.compile(r'\[\[TOC([^]]*)\]\]'),
re.compile(r'----(\r)?$\n^Back up: \[\[ParentWiki\]\]', re.M|re.I)
]
+IMG_CACHE = { }
+def tagattrfind(page, tag, attr, pos):
+ tb_pos = page.find('<%s' % tag, pos)
+
+ while tb_pos != -1:
+ te_pos = page.find('>', tb_pos)
+ tc_pos = page.find(attr, tb_pos, te_pos)
+
+ if tc_pos != -1:
+ return tb_pos, te_pos+1
+
+ tb_pos = page.find('<%s' % tag, te_pos+1)
+
+ return -1, -1
+
+
def wiki_to_pdf(text, env, req, base_dir, codepage):
+ global IMG_CACHE
env.log.debug('WikiToPdf => Start function wiki_to_pdf')
@@ -29,7 +49,6 @@
env.log.debug('WikiToPdf => Wiki intput for WikiToPdf: %r' % text)
page = wiki_to_html(text, env, req)
- page = page.replace('raw-attachment', 'attachments')
page = page.replace('', '')
page = page.replace('
', '')
- imgpos = page.find('/dev/null' % (tmp_dir))
+
+ # Create a random prefix
+ random.seed()
+ tmp_dir += '/%(#)04x_' %{"#":random.randint(0,65535)}
+
+ imgcounter = 0
+ imgpos = page.find('',tablepos)
+ page = page[:endpos+8] + '' + page[endpos+8:]
+ page = page[:tablepos] + '' + page[tablepos:];
+
+ endpos = page.find('
',tablepos)
+ (tablepos,tableend) = tagattrfind(page, 'table', 'align="center"', endpos)
+
+ # Add table around ''
+ (tablepos,tableend) = tagattrfind(page, 'div', 'class="code"', 0)
+ while tablepos != -1:
+ endpos = page.find('
',tablepos)
+ page = page[:endpos+6] + '
' + page[endpos+6:]
+ page = page[:tableend] + '' + page[tableend:]
+
+ endpos = page.find('',tablepos)
+ (tablepos,tableend) = tagattrfind(page, 'div', 'class="code"', endpos)
+
+ # Add table around ' '
+ (tablepos,tableend) = tagattrfind(page, 'div', 'class="system-message"', 0)
+ while tablepos != -1:
+ endpos = page.find(' ',tablepos)
+ page = page[:endpos+6] + ' |
' + page[endpos+6:]
+ page = page[:tableend] + '' + page[tableend:]
+
+ endpos = page.find('',tablepos)
+ (tablepos,tableend) = tagattrfind(page, 'div', 'class="system-message"', endpos)
+
+ # Add table around ' '
+ (tablepos,tableend) = tagattrfind(page, 'div', 'class="error"', 0)
+ while tablepos != -1:
+ endpos = page.find(' ',tablepos)
+ page = page[:endpos+6] + ' |
' + page[endpos+6:]
+ page = page[:tableend] + '' + page[tableend:]
+
+ endpos = page.find('',tablepos)
+ (tablepos,tableend) = tagattrfind(page, 'div', 'class="error"', endpos)
+
+ # Add table around ' '
+ (tablepos,tableend) = tagattrfind(page, 'div', 'class="important"', 0)
+ while tablepos != -1:
+ endpos = page.find(' ',tablepos)
+ page = page[:endpos+6] + ' |
' + page[endpos+6:]
+ page = page[:tableend] + '' + page[tableend:]
+
+ endpos = page.find('',tablepos)
+ (tablepos,tableend) = tagattrfind(page, 'div', 'class="important"', endpos)
+
meta = ('' % codepage)
+ css = ''
+ if env.config.get('wikitopdf', 'css_file') != '':
+ css = ('' % env.config.get('wikitopdf', 'css_file')).encode(codepage)
- page = '' + meta + '' + page + ''
+ page = '' + meta + css + '' + page + ''
page = page.encode(codepage,'replace')
env.log.debug('WikiToPdf => HTML output for WikiToPdf in charset %s is: %r' % (codepage, page))
@@ -63,6 +177,7 @@
env.log.debug('WikiToPdf => Start function html_to_pdf')
+ global IMG_CACHE
os.environ["HTMLDOC_NOCGI"] = 'yes'
args_string = ' '.join(['--%s %s' % (arg, value or '') for arg, value
@@ -74,6 +189,11 @@
cmd_string = 'htmldoc %s %s -f %s'%(args_string, ' '.join(files), pfilename)
env.log.debug('WikiToPdf => Htmldoc command line: %s' % cmd_string)
os.system(cmd_string.encode(codepage))
+
+ # Delete files from tmp_dir
+ for v in IMG_CACHE.values():
+ os.unlink(v);
+ IMG_CACHE = { }
infile = open(pfilename, 'rb')
out = infile.read()
Index: docs/css/htmldoc.css
===================================================================
--- docs/css/htmldoc.css (revision 0)
+++ docs/css/htmldoc.css (revision 0)
@@ -0,0 +1,124 @@
+div.error, div.system-message {
+ background: #fdc;
+ border: 2px solid #d00;
+ color: #500;
+ padding: .5em;
+ margin: 1em 0;
+}
+
+div.important {
+ background: #fcb;
+ border: 1px dotted #d00;
+ color: #500;
+ padding: 0 .5em 0 .5em;
+ margin: .5em;
+}
+
+blockquote.citation {
+ margin: -0.6em 0;
+ border-style: solid;
+ border-width: 0 0 0 2px;
+ padding-left: .5em;
+ border-color: #b44;
+}
+.citation blockquote.citation { border-color: #4b4; }
+.citation .citation blockquote.citation { border-color: #44b; }
+.citation .citation .citation blockquote.citation { border-color: #c55; }
+
+table.wiki {
+ border: 2px solid #ccc;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+table.wiki td {
+ border: 1px solid #ccc;
+ padding: .1em .25em;
+}
+
+:link {
+ border: none;
+ text-decoration: none;
+ color: #000000;
+}
+
+tt {
+ font-family: courier;
+}
+
+pre.wiki {
+ padding: .25em;
+ font-family: courier;
+ color: #000000;
+ font-style: normal;
+ font-weight: normal;
+}
+
+div.code {
+ padding: .25em;
+ font-family: courier;
+ color: #000000;
+ font-style: normal;
+ font-weight: normal;
+}
+
+div.code pre { margin: 0; background: #ffffff; white-space: pre; }
+div.code pre .c { color: #999988; font-style: italic; white-space: pre; }
+div.code pre .err { color: #a61717; background-color: #e3d2d2; white-space: pre; }
+div.code pre .k { font-weight: bold; white-space: pre; }
+div.code pre .o { font-weight: bold; white-space: pre; }
+div.code pre .cm { color: #999988; font-style: italic; white-space: pre; }
+div.code pre .cp { color: #999999; font-weight: bold; white-space: pre; }
+div.code pre .c1 { color: #999988; font-style: italic; white-space: pre; }
+div.code pre .cs { color: #999999; font-weight: bold; font-style: italic; white-space: pre; }
+div.code pre .gd { color: #000000; background-color: #ffdddd; white-space: pre; }
+div.code pre .ge { font-style: italic; white-space: pre; }
+div.code pre .gr { color: #aa0000; white-space: pre; }
+div.code pre .gh { color: #999999; white-space: pre; }
+div.code pre .gi { color: #000000; background-color: #ddffdd; white-space: pre; }
+div.code pre .go { color: #888888; white-space: pre; }
+div.code pre .gp { color: #555555; white-space: pre; }
+div.code pre .gs { font-weight: bold; white-space: pre; }
+div.code pre .gu { color: #aaaaaa; white-space: pre; }
+div.code pre .gt { color: #aa0000; white-space: pre; }
+div.code pre .kc { font-weight: bold; white-space: pre; }
+div.code pre .kd { font-weight: bold; white-space: pre; }
+div.code pre .kp { font-weight: bold; white-space: pre; }
+div.code pre .kr { font-weight: bold; white-space: pre; }
+div.code pre .kt { color: #445588; font-weight: bold; white-space: pre; }
+div.code pre .m { color: #009999; white-space: pre; }
+div.code pre .s { color: #bb8844; white-space: pre; }
+div.code pre .na { color: #008080; white-space: pre; }
+div.code pre .nb { color: #999999; white-space: pre; }
+div.code pre .nc { color: #445588; font-weight: bold; white-space: pre; }
+div.code pre .no { color: #008080; white-space: pre; }
+div.code pre .ni { color: #800080; white-space: pre; }
+div.code pre .ne { color: #990000; font-weight: bold; white-space: pre; }
+div.code pre .nf { color: #990000; font-weight: bold; white-space: pre; }
+div.code pre .nn { color: #555555; white-space: pre; }
+div.code pre .nt { color: #000080; white-space: pre; }
+div.code pre .nv { color: #008080; white-space: pre; }
+div.code pre .ow { font-weight: bold; white-space: pre; }
+div.code pre .w { color: #bbbbbb; white-space: pre; }
+div.code pre .mf { color: #009999; white-space: pre; }
+div.code pre .mh { color: #009999; white-space: pre; }
+div.code pre .mi { color: #009999; white-space: pre; }
+div.code pre .mo { color: #009999; white-space: pre; }
+div.code pre .sb { color: #bb8844; white-space: pre; }
+div.code pre .sc { color: #bb8844; white-space: pre; }
+div.code pre .sd { color: #bb8844; white-space: pre; }
+div.code pre .s2 { color: #bb8844; white-space: pre; }
+div.code pre .se { color: #bb8844; white-space: pre; }
+div.code pre .sh { color: #bb8844; white-space: pre; }
+div.code pre .si { color: #bb8844; white-space: pre; }
+div.code pre .sx { color: #bb8844; white-space: pre; }
+div.code pre .sr { color: #808000; white-space: pre; }
+div.code pre .s1 { color: #bb8844; white-space: pre; }
+div.code pre .ss { color: #bb8844; white-space: pre; }
+div.code pre .bp { color: #999999; white-space: pre; }
+div.code pre .vc { color: #008080; white-space: pre; }
+div.code pre .vg { color: #008080; white-space: pre; }
+div.code pre .vi { color: #008080; white-space: pre; }
+div.code pre .il { color: #009999; white-space: pre; }
+div.code pre .workaround { }
+
|