From 3a83151b31bf3bef0dbb70b75cbccee9268fa65a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 11 Sep 2017 17:19:01 +0200 Subject: [PATCH] m.images: override the Figure directive as well. And add the m-figure class implicitly. --- pelican-plugins/m/images.py | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/pelican-plugins/m/images.py b/pelican-plugins/m/images.py index db12467d..d61b4e08 100644 --- a/pelican-plugins/m/images.py +++ b/pelican-plugins/m/images.py @@ -42,6 +42,7 @@ class Image(Directive): 'class': directives.class_option, 'target': directives.unchanged_required} + # Overriden by Figure image_class = 'm-image' def run(self): @@ -89,6 +90,52 @@ class Image(Directive): if self.image_class: image_node['classes'] += [self.image_class] + classes return messages + [image_node] +class Figure(Image): + """Figure directive + + Copy of docutils.parsers.rst.directives.Figure with: + + - the align, figwidth options removed (handled better by m.css) + - .m-figure CSS class added + """ + + option_spec = Image.option_spec.copy() + option_spec['figclass'] = directives.class_option + has_content = True + + image_class = None + + def run(self): + figclasses = self.options.pop('figclass', None) + (image_node,) = Image.run(self) + if isinstance(image_node, nodes.system_message): + return [image_node] + figure_node = nodes.figure('', image_node) + if figclasses: + figure_node['classes'] += figclasses + figure_node['classes'] += ['m-figure'] + + if self.content: + node = nodes.Element() # anonymous container for parsing + self.state.nested_parse(self.content, self.content_offset, node) + first_node = node[0] + if isinstance(first_node, nodes.paragraph): + caption = nodes.caption(first_node.rawsource, '', + *first_node.children) + caption.source = first_node.source + caption.line = first_node.line + figure_node += caption + elif not (isinstance(first_node, nodes.comment) + and len(first_node) == 0): + error = self.state_machine.reporter.error( + 'Figure caption must be a paragraph or empty comment.', + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + return [figure_node, error] + if len(node) > 1: + figure_node += nodes.legend('', *node[1:]) + return [figure_node] + class ImageGrid(rst.Directive): has_content = True @@ -137,4 +184,5 @@ def register(): signals.initialized.connect(configure) rst.directives.register_directive('image', Image) + rst.directives.register_directive('figure', Figure) rst.directives.register_directive('image-grid', ImageGrid) -- 2.30.2