From 0a7d69c3442f843bb361e630ca0d9971c1b457b9 Mon Sep 17 00:00:00 2001 From: Piotr Banaszkiewicz Date: Wed, 18 Feb 2015 20:12:31 +0100 Subject: [PATCH] Render specific blockquotes as Bootstrap panels Blockquotes that have a header (with class "callout", "challenge", "prereq", "objectives") as their first element will get rendered as
s. Their structure will resemble Bootstrap's panel: http://getbootstrap.com/components/#panels-alternatives There's currently an issue with pandoc: the header nested under the blockquote will never have assigned attributes. This is causing the panel's heading to look enormous. I'll fix it in https://github.com/swcarpentry/styles/pull/11. BTW: glyphicons won't render correctly unless 'fonts' directory gets moved up one level to the 'css' directory. I'll fix that in https://github.com/swcarpentry/styles/pull/11 too. --- _includes/header.html | 1 + tools/filters/blockquote2div.py | 50 +++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/_includes/header.html b/_includes/header.html index c0891e6..42ba959 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,6 +1,7 @@ + diff --git a/tools/filters/blockquote2div.py b/tools/filters/blockquote2div.py index 828f74c..2d4f578 100755 --- a/tools/filters/blockquote2div.py +++ b/tools/filters/blockquote2div.py @@ -21,7 +21,7 @@ For example, this is a valid blockquote: and it will be converted into this markdown: -
+
## Callout time! Let's do something.
@@ -33,7 +33,7 @@ This is also a valid blockquote: and it will be converted into this markdown: -
+
## Prerequisites Breakfast!
@@ -46,10 +46,14 @@ like this: """ import pandocfilters as pf - # These are classes that, if set on the title of a blockquote, will # trigger the blockquote to be converted to a div. -SPECIAL_CLASSES = ['callout', 'challenge', 'prereq', 'objectives'] +SPECIAL_CLASSES = { + "callout": ("panel-info", "glyphicon-pushpin"), + "challenge": ("panel-success", "glyphicon-pencil"), + "prereq": ("panel-warning", "glyphicon-education"), + "objectives": ("panel-primary", "glyphicon-certificate"), +} def find_header(blockquote): @@ -64,18 +68,6 @@ def find_header(blockquote): return level, attr, inline -def remove_attributes(blockquote): - """Remove attributes from a blockquote if they are defined on a - header that is the first thing in the blockquote. - - Modifies the blockquote inplace. - """ - if blockquote[0]['t'] == 'Header': - level, attr, inlines = blockquote[0]['c'] - attr = pf.attributes({}) - blockquote[0] = pf.Header(level, attr, inlines) - - def blockquote2div(key, value, format, meta): """Convert a blockquote into a div if it begins with a header that has attributes containing a single class that is in the @@ -96,10 +88,32 @@ def blockquote2div(key, value, format, meta): id, classes, kvs = attr if len(classes) == 1 and classes[0] in SPECIAL_CLASSES: - remove_attributes(blockquote) + panel_kind, glyphicon_kind = SPECIAL_CLASSES[classes[0]] + + h_level, h_attr, h_inlines = blockquote[0]['c'] + + # insert an icon as the first sub-item of the header + span = pf.Span(["", ["glyphicon", glyphicon_kind], []], []) + h_inlines.insert(0, span) + + # only the header goes into panel-heading + # WARNING: pandoc doesn't preserve header attributes when the + # header is nested under blockquote. This makes it + # impossible to alter header's "class" attribute, for + # example. + header = pf.Header(h_level, h_attr, h_inlines) + panel_header = pf.Div(("", ["panel-heading"], []), [header]) + + # the rest of the blockquote goes into panel-body + panel_body = pf.Div(("", ["panel-body"], []), blockquote[1:]) + + # apply Bootstrap panel classes to the div + classes.append("panel") + classes.append(panel_kind) + # a blockquote is just a list of blocks, so it can be # passed directly to Div, which expects Div(attr, blocks) - return pf.Div(attr, blockquote) + return pf.Div((id, classes, kvs), [panel_header, panel_body]) if __name__ == '__main__': -- GitLab