~bzr-pqm/bzr/bzr.dev

2624.1.1 by Adeodato Simó
Loose python2.4-specific shebangs; use generic python instead.
1
#!/usr/bin/env python
2054.2.16 by Aaron Bentley
More updates from review comments
2
2054.2.1 by Aaron Bentley
Start work on pretty rest conversion
3
import errno
4
import os
5
from StringIO import StringIO
6
import sys
7
2054.2.16 by Aaron Bentley
More updates from review comments
8
try:
9
    from docutils.core import publish_file
10
    from docutils.parsers import rst
11
except ImportError:
12
    print "Missing dependency.  Please install docutils."
13
    sys.exit(1)
14
try:
15
    from elementtree.ElementTree import XML
16
    from elementtree import HTMLTreeBuilder
17
except ImportError:
18
    print "Missing dependency.  Please install ElementTree."
19
    sys.exit(1)
20
try:
21
    import kid
22
except ImportError:
23
    print "Missing dependency.  Please install Kid."
24
    sys.exit(1)
25
2054.2.1 by Aaron Bentley
Start work on pretty rest conversion
26
27
def kidified_rest(rest_file, template_name):
2054.2.12 by Aaron Bentley
Switch to HTMLTreeBuilder, so that HTML entity references are handled.
28
    xhtml_file = StringIO()
29
    # prevent docutils from autoclosing the StringIO
30
    xhtml_file.close = lambda: None
31
    xhtml = publish_file(rest_file, writer_name='html', destination=xhtml_file,
2054.2.5 by Aaron Bentley
Make subheadings appear correctly, hide inappropriate menu, fix search
32
                         settings_overrides={"doctitle_xform": 0} 
33
    
34
    )
2054.2.12 by Aaron Bentley
Switch to HTMLTreeBuilder, so that HTML entity references are handled.
35
    xhtml_file.seek(0)
36
    xml = HTMLTreeBuilder.parse(xhtml_file)
37
    head = xml.find('head')
38
    body = xml.find('body')
2054.2.1 by Aaron Bentley
Start work on pretty rest conversion
39
    assert head is not None
40
    assert body is not None
41
    template=kid.Template(file=template_name, 
42
                          head=head, body=body)
2054.2.3 by Aaron Bentley
Get page generation working
43
    return (template.serialize(output="html"))
2054.2.1 by Aaron Bentley
Start work on pretty rest conversion
44
2054.2.16 by Aaron Bentley
More updates from review comments
45
2054.2.1 by Aaron Bentley
Start work on pretty rest conversion
46
def safe_open(filename, mode):
47
    try:
48
        return open(filename, mode + 'b')
49
    except IOError, e:
50
        if e.errno != errno.ENOENT:
51
            raise
52
        sys.stderr.write('file not found: %s\n' % sys.argv[2])
53
        sys.exit(3)
2054.2.16 by Aaron Bentley
More updates from review comments
54
55
56
def main(template, source=None, target=None):
57
    if source is not None:
58
        rest_file = safe_open(source, 'r')
59
    else:
60
        rest_file = sys.stdin
61
    if target is not None:
62
        out_file = safe_open(target, 'w')
63
    else:
64
        out_file = sys.stdout
65
    out_file.write(kidified_rest(rest_file, template))
66
67
assert len(sys.argv) > 1
68
69
main(*sys.argv[1:])
70