[3] | 1 | # Author: David Goodger |
---|
| 2 | # Contact: goodger@users.sourceforge.net |
---|
| 3 | # Revision: $Revision: 3038 $ |
---|
| 4 | # Date: $Date: 2005-03-14 17:16:57 +0100 (Mon, 14 Mar 2005) $ |
---|
| 5 | # Copyright: This module has been placed in the public domain. |
---|
| 6 | |
---|
| 7 | """ |
---|
| 8 | Directives for typically HTML-specific constructs. |
---|
| 9 | """ |
---|
| 10 | |
---|
| 11 | __docformat__ = 'reStructuredText' |
---|
| 12 | |
---|
| 13 | import sys |
---|
| 14 | from docutils import nodes, utils |
---|
| 15 | from docutils.parsers.rst import states |
---|
| 16 | from docutils.transforms import components |
---|
| 17 | |
---|
| 18 | |
---|
| 19 | def meta(name, arguments, options, content, lineno, |
---|
| 20 | content_offset, block_text, state, state_machine): |
---|
| 21 | node = nodes.Element() |
---|
| 22 | if content: |
---|
| 23 | new_line_offset, blank_finish = state.nested_list_parse( |
---|
| 24 | content, content_offset, node, initial_state='MetaBody', |
---|
| 25 | blank_finish=1, state_machine_kwargs=metaSMkwargs) |
---|
| 26 | if (new_line_offset - content_offset) != len(content): |
---|
| 27 | # incomplete parse of block? |
---|
| 28 | error = state_machine.reporter.error( |
---|
| 29 | 'Invalid meta directive.', |
---|
| 30 | nodes.literal_block(block_text, block_text), line=lineno) |
---|
| 31 | node += error |
---|
| 32 | else: |
---|
| 33 | error = state_machine.reporter.error( |
---|
| 34 | 'Empty meta directive.', |
---|
| 35 | nodes.literal_block(block_text, block_text), line=lineno) |
---|
| 36 | node += error |
---|
| 37 | return node.children |
---|
| 38 | |
---|
| 39 | meta.content = 1 |
---|
| 40 | |
---|
| 41 | def imagemap(name, arguments, options, content, lineno, |
---|
| 42 | content_offset, block_text, state, state_machine): |
---|
| 43 | return [] |
---|
| 44 | |
---|
| 45 | |
---|
| 46 | class MetaBody(states.SpecializedBody): |
---|
| 47 | |
---|
| 48 | class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): |
---|
| 49 | """HTML-specific "meta" element.""" |
---|
| 50 | pass |
---|
| 51 | |
---|
| 52 | def field_marker(self, match, context, next_state): |
---|
| 53 | """Meta element.""" |
---|
| 54 | node, blank_finish = self.parsemeta(match) |
---|
| 55 | self.parent += node |
---|
| 56 | return [], next_state, [] |
---|
| 57 | |
---|
| 58 | def parsemeta(self, match): |
---|
| 59 | name = self.parse_field_marker(match) |
---|
| 60 | indented, indent, line_offset, blank_finish = \ |
---|
| 61 | self.state_machine.get_first_known_indented(match.end()) |
---|
| 62 | node = self.meta() |
---|
| 63 | pending = nodes.pending(components.Filter, |
---|
| 64 | {'component': 'writer', |
---|
| 65 | 'format': 'html', |
---|
| 66 | 'nodes': [node]}) |
---|
| 67 | node['content'] = ' '.join(indented) |
---|
| 68 | if not indented: |
---|
| 69 | line = self.state_machine.line |
---|
| 70 | msg = self.reporter.info( |
---|
| 71 | 'No content for meta tag "%s".' % name, |
---|
| 72 | nodes.literal_block(line, line), |
---|
| 73 | line=self.state_machine.abs_line_number()) |
---|
| 74 | return msg, blank_finish |
---|
| 75 | tokens = name.split() |
---|
| 76 | try: |
---|
| 77 | attname, val = utils.extract_name_value(tokens[0])[0] |
---|
| 78 | node[attname.lower()] = val |
---|
| 79 | except utils.NameValueError: |
---|
| 80 | node['name'] = tokens[0] |
---|
| 81 | for token in tokens[1:]: |
---|
| 82 | try: |
---|
| 83 | attname, val = utils.extract_name_value(token)[0] |
---|
| 84 | node[attname.lower()] = val |
---|
| 85 | except utils.NameValueError, detail: |
---|
| 86 | line = self.state_machine.line |
---|
| 87 | msg = self.reporter.error( |
---|
| 88 | 'Error parsing meta tag attribute "%s": %s.' |
---|
| 89 | % (token, detail), nodes.literal_block(line, line), |
---|
| 90 | line=self.state_machine.abs_line_number()) |
---|
| 91 | return msg, blank_finish |
---|
| 92 | self.document.note_pending(pending) |
---|
| 93 | return pending, blank_finish |
---|
| 94 | |
---|
| 95 | |
---|
| 96 | metaSMkwargs = {'state_classes': (MetaBody,)} |
---|