[2] | 1 | # Author: Ollie Rutherfurd |
---|
| 2 | # Contact: oliver@rutherfurd.net |
---|
| 3 | # Revision: $Revision: 2884 $ |
---|
| 4 | # Date: $Date: 2004-12-08 20:49:05 +0100 (Wed, 08 Dec 2004) $ |
---|
| 5 | # Copyright: This module has been placed in the public domain. |
---|
| 6 | |
---|
| 7 | """ |
---|
| 8 | Simple .ht (HyperText Template) document tree Writer. |
---|
| 9 | |
---|
| 10 | .ht tmeplate files are essentially normal HTML, with |
---|
| 11 | an option set of RFC 2822-like headers at the top of |
---|
| 12 | the file. There must be at least one blank line between |
---|
| 13 | the last header and the start of the body HTML. |
---|
| 14 | |
---|
| 15 | See http://ht2html.sf.net/ for more information on |
---|
| 16 | .ht files and ht2html.. |
---|
| 17 | """ |
---|
| 18 | |
---|
| 19 | __docformat__ = 'reStructuredText' |
---|
| 20 | |
---|
| 21 | import os |
---|
| 22 | from docutils import nodes |
---|
| 23 | from docutils import writers |
---|
| 24 | from docutils import frontend |
---|
| 25 | from docutils.writers.html4css1 import HTMLTranslator, utils |
---|
| 26 | |
---|
| 27 | |
---|
| 28 | class Writer(writers.Writer): |
---|
| 29 | |
---|
| 30 | supported = ('htmlfrag',) |
---|
| 31 | """Formats this writer supports.""" |
---|
| 32 | |
---|
| 33 | settings_spec = ( |
---|
| 34 | 'HTML-Specific Options', |
---|
| 35 | None, |
---|
| 36 | (('Specify a stylesheet URL, used verbatim. Default is ' |
---|
| 37 | '"default.css". Overrides --stylesheet-path.', |
---|
| 38 | ['--stylesheet'], |
---|
| 39 | {'default': 'default.css', 'metavar': '<URL>', |
---|
| 40 | 'overrides': 'stylesheet_path'}), |
---|
| 41 | ('Specify a stylesheet file, relative to the current working ' |
---|
| 42 | 'directory. The path is adjusted relative to the output HTML ' |
---|
| 43 | 'file. Overrides --stylesheet.', |
---|
| 44 | ['--stylesheet-path'], |
---|
| 45 | {'metavar': '<file>', 'overrides': 'stylesheet'}), |
---|
| 46 | ('Link to the stylesheet in the output HTML file. This is the ' |
---|
| 47 | 'default.', |
---|
| 48 | ['--link-stylesheet'], |
---|
| 49 | {'dest': 'embed_stylesheet', 'action': 'store_false', |
---|
| 50 | 'validator': frontend.validate_boolean}), |
---|
| 51 | ('Embed the stylesheet in the output HTML file. The stylesheet ' |
---|
| 52 | 'file must be accessible during processing (--stylesheet-path is ' |
---|
| 53 | 'recommended). Default: link the stylesheet, do not embed it.', |
---|
| 54 | ['--embed-stylesheet'], |
---|
| 55 | {'action': 'store_true', 'validator': frontend.validate_boolean}), |
---|
| 56 | ('Specify the initial header level. Default is 1 for "<h1>". ' |
---|
| 57 | 'Does not affect document title & subtitle (see --no-doc-title).', |
---|
| 58 | ['--initial-header-level'], |
---|
| 59 | {'choices': '1 2 3 4 5 6'.split(), 'default': '3', |
---|
| 60 | 'metavar': '<level>'}), |
---|
| 61 | ('Specify the maximum width (in characters) for one-column field ' |
---|
| 62 | 'names. Longer field names will span an entire row of the table ' |
---|
| 63 | 'used to render the field list. Default is 14 characters. ' |
---|
| 64 | 'Use 0 for "no limit".', |
---|
| 65 | ['--field-name-limit'], |
---|
| 66 | {'default': 14, 'metavar': '<level>', |
---|
| 67 | 'validator': frontend.validate_nonnegative_int}), |
---|
| 68 | ('Specify the maximum width (in characters) for options in option ' |
---|
| 69 | 'lists. Longer options will span an entire row of the table used ' |
---|
| 70 | 'to render the option list. Default is 14 characters. ' |
---|
| 71 | 'Use 0 for "no limit".', |
---|
| 72 | ['--option-limit'], |
---|
| 73 | {'default': 14, 'metavar': '<level>', |
---|
| 74 | 'validator': frontend.validate_nonnegative_int}), |
---|
| 75 | ('Format for footnote references: one of "superscript" or ' |
---|
| 76 | '"brackets". Default is "brackets".', |
---|
| 77 | ['--footnote-references'], |
---|
| 78 | {'choices': ['superscript', 'brackets'], 'default': 'brackets', |
---|
| 79 | 'metavar': '<format>', |
---|
| 80 | 'overrides': 'trim_footnote_reference_space'}), |
---|
| 81 | ('Format for block quote attributions: one of "dash" (em-dash ' |
---|
| 82 | 'prefix), "parentheses"/"parens", or "none". Default is "dash".', |
---|
| 83 | ['--attribution'], |
---|
| 84 | {'choices': ['dash', 'parentheses', 'parens', 'none'], |
---|
| 85 | 'default': 'dash', 'metavar': '<format>'}), |
---|
| 86 | ('Remove extra vertical whitespace between items of bullet lists ' |
---|
| 87 | 'and enumerated lists, when list items are "simple" (i.e., all ' |
---|
| 88 | 'items each contain one paragraph and/or one "simple" sublist ' |
---|
| 89 | 'only). Default: enabled.', |
---|
| 90 | ['--compact-lists'], |
---|
| 91 | {'default': 1, 'action': 'store_true', |
---|
| 92 | 'validator': frontend.validate_boolean}), |
---|
| 93 | ('Disable compact simple bullet and enumerated lists.', |
---|
| 94 | ['--no-compact-lists'], |
---|
| 95 | {'dest': 'compact_lists', 'action': 'store_false'}), |
---|
| 96 | ('Omit the XML declaration. Use with caution.', |
---|
| 97 | ['--no-xml-declaration'], |
---|
| 98 | {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false', |
---|
| 99 | 'validator': frontend.validate_boolean}), |
---|
| 100 | ('Scramble email addresses to confuse harvesters. ' |
---|
| 101 | 'For example, "abc@example.org" will become ' |
---|
| 102 | '``<a href="mailto:%61%62%63%40...">abc at example dot org</a>``.', |
---|
| 103 | ['--cloak-email-addresses'], |
---|
| 104 | {'action': 'store_true', 'validator': frontend.validate_boolean}),)) |
---|
| 105 | |
---|
| 106 | |
---|
| 107 | relative_path_settings = ('stylesheet_path',) |
---|
| 108 | |
---|
| 109 | output = None |
---|
| 110 | |
---|
| 111 | def __init__(self): |
---|
| 112 | writers.Writer.__init__(self) |
---|
| 113 | self.translator_class = HTMLFragTranslator |
---|
| 114 | |
---|
| 115 | def translate(self): |
---|
| 116 | visitor = self.translator_class(self.document) |
---|
| 117 | self.document.walkabout(visitor) |
---|
| 118 | self.output = visitor.astext() |
---|
| 119 | self.stylesheet = visitor.stylesheet |
---|
| 120 | self.body = visitor.body |
---|
| 121 | |
---|
| 122 | |
---|
| 123 | class HTMLFragTranslator(HTMLTranslator): |
---|
| 124 | |
---|
| 125 | def __init__(self, document): |
---|
| 126 | # I don't believe we can embed any style content |
---|
| 127 | # the header, so always link to the stylesheet. |
---|
| 128 | document.settings.embed_stylesheet = 0 |
---|
| 129 | HTMLTranslator.__init__(self, document) |
---|
| 130 | |
---|
| 131 | def astext(self): |
---|
| 132 | # kludge! want footer, but not '</body></html>' |
---|
| 133 | body = self.body_pre_docinfo + self.docinfo + self.body + \ |
---|
| 134 | self.body_suffix[:-1] |
---|
| 135 | return ''.join(body) |
---|
| 136 | |
---|
| 137 | # :indentSize=4:lineSeparator=\n:noTabs=true:tabSize=4: |
---|