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,)} |
---|