From 22009784ce1c2b4129b054b1f609d46a124ceaac Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Fri, 23 Nov 2018 14:42:28 -0500 Subject: [PATCH 1/2] Add config_role plugin --- v7/config_role/README.md | 11 +++++++ v7/config_role/config_role.plugin | 13 ++++++++ v7/config_role/config_role.py | 52 +++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 v7/config_role/README.md create mode 100644 v7/config_role/config_role.plugin create mode 100644 v7/config_role/config_role.py diff --git a/v7/config_role/README.md b/v7/config_role/README.md new file mode 100644 index 00000000..8d1373c4 --- /dev/null +++ b/v7/config_role/README.md @@ -0,0 +1,11 @@ +Add the `config` role, it reads a value from the `conf.py` file. + +Usage: + +```rst +Send us an email to :config:`BLOG_EMAIL` +``` + +Here `BLOG_EMAIL` is the variable name from the `conf.py` file. +Note that the text is rendered as an email link, not just as plain text. +This is because the value is interpreted as reStructuredText. diff --git a/v7/config_role/config_role.plugin b/v7/config_role/config_role.plugin new file mode 100644 index 00000000..49a7fb6f --- /dev/null +++ b/v7/config_role/config_role.plugin @@ -0,0 +1,13 @@ +[Core] +Name = config_role +Module = config_role + +[Nikola] +Compiler = rest +PluginCategory = RestExtension + +[Documentation] +Author = Santos Gallegos +Version = 0.1 +Website = http://plugins.getnikola.com/#config_role +Description = Inserts values from config.py diff --git a/v7/config_role/config_role.py b/v7/config_role/config_role.py new file mode 100644 index 00000000..e427386d --- /dev/null +++ b/v7/config_role/config_role.py @@ -0,0 +1,52 @@ +""" +Add the ``config`` role, it reads a value from the `conf.py` file. + +Usage: + + Send us an email to :config:`BLOG_EMAIL` + +Here `BLOG_EMAIL` is the variable name from the conf.py file. +Note that the text is rendered as an email link, not just as plain text. +This is because the value is interpreted as reStructuredText. +""" + +from docutils.frontend import OptionParser +from docutils.parsers.rst import Parser, roles +from docutils.utils import new_document +from nikola.plugin_categories import RestExtension + + +class Plugin(RestExtension): + + name = 'config_role' + + def set_site(self, site): + roles.register_canonical_role('config', config_role(site)) + return super().set_site(site) + + +def config_role(site): + """ + Inject a value from the ``conf.py`` file. + + Before injecting the value, it is parsed by the rst parser, + that way we can have a link when reading an email from the config + for example. + + This role needs access to the `site` object. + As we can't pass extra args to a role function we are using a closure. + """ + def role(name, rawtext, text, lineno, inliner, options=None, content=None): + parser = Parser() + settings = OptionParser(components=(Parser,)).get_default_values() + document = new_document('Raw rst from config value', settings) + + config_value = site.config.get(text, '') + parser.parse(config_value, document) + + # The whole text is interpreted as a big paragraph + # causing a new line to be inserted at the end, + # so we only take the elements inside that paragraph. + paragraph, *_ = document.children + return paragraph.children, [] + return role From 70853a849145fcf4a688c431491d4aa5662777bc Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Fri, 23 Nov 2018 15:04:25 -0500 Subject: [PATCH 2/2] Add licence --- v7/config_role/config_role.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/v7/config_role/config_role.py b/v7/config_role/config_role.py index e427386d..e4b13bcd 100644 --- a/v7/config_role/config_role.py +++ b/v7/config_role/config_role.py @@ -1,3 +1,29 @@ +# -*- coding: utf-8 -*- + +# Copyright © 2018 Santos Gallegos. + +# Permission is hereby granted, free of charge, to any +# person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice +# shall be included in all copies or substantial portions of +# the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +# OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + """ Add the ``config`` role, it reads a value from the `conf.py` file.