Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #3046 from getnikola/make-chart-independent
Make chart independent
  • Loading branch information
Kwpolska committed Apr 16, 2018
2 parents 9487a25 + bb89efe commit ee7dece
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 43 deletions.
4 changes: 3 additions & 1 deletion CHANGES.txt
Expand Up @@ -51,7 +51,9 @@ Features
Bugfixes
--------

* Put post_list shortcode in its own plugin and make the reSt
* Make chart shortcode its own plugin and make the reST directive
depend on it.
* Put post_list shortcode in its own plugin and make the reST
directive depend on it.
* Don’t silence syntax errors and other exceptions that occur while
reading metadata
Expand Down
47 changes: 5 additions & 42 deletions nikola/plugins/compile/rest/chart.py
Expand Up @@ -23,11 +23,8 @@
# 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.

"""Chart directive for reSTructuredText."""

from ast import literal_eval

from docutils import nodes
from docutils.parsers.rst import Directive, directives

Expand All @@ -37,7 +34,6 @@
pygal = None # NOQA

from nikola.plugin_categories import RestExtension
from nikola.utils import req_missing

_site = None

Expand All @@ -52,7 +48,6 @@ def set_site(self, site):
global _site
_site = self.site = site
directives.register_directive('chart', Chart)
self.site.register_shortcode('chart', _gen_chart)
return super(Plugin, self).set_site(site)


Expand Down Expand Up @@ -157,41 +152,9 @@ class Chart(Directive):
def run(self):
"""Run the directive."""
self.options['site'] = None
html = _gen_chart(self.arguments[0], data='\n'.join(self.content), **self.options)
html = _site.plugin_manager.getPluginByName(
'chart', 'ShortcodePlugin').plugin_object.handler(
self.arguments[0],
data='\n'.join(self.content),
**self.options)
return [nodes.raw('', html, format='html')]


def _gen_chart(chart_type, **_options):
if pygal is None:
msg = req_missing(['pygal'], 'use the Chart directive', optional=True)
return '<div class="text-error">{0}</div>'.format(msg)
options = {}
data = _options.pop('data')
_options.pop('post', None)
_options.pop('site')
if 'style' in _options:
style_name = _options.pop('style')
else:
style_name = 'BlueStyle'
if '(' in style_name: # Parametric style
style = eval('pygal.style.' + style_name)
else:
style = getattr(pygal.style, style_name)
for k, v in _options.items():
try:
options[k] = literal_eval(v)
except Exception:
options[k] = v
chart = pygal
for o in chart_type.split('.'):
chart = getattr(chart, o)
chart = chart(style=style)
if _site and _site.invariant:
chart.no_prefix = True
chart.config(**options)
for line in data.splitlines():
line = line.strip()
if line:
label, series = literal_eval('({0})'.format(line))
chart.add(label, series)
return chart.render().decode('utf8')
13 changes: 13 additions & 0 deletions nikola/plugins/shortcode/chart.plugin
@@ -0,0 +1,13 @@
[Core]
name = chart
module = chart

[Nikola]
PluginCategory = Shortcode

[Documentation]
author = Roberto Alsina
version = 0.1
website = https://getnikola.com/
description = Chart directive based in PyGal

81 changes: 81 additions & 0 deletions nikola/plugins/shortcode/chart.py
@@ -0,0 +1,81 @@
# -*- coding: utf-8 -*-

# Copyright © 2012-2018 Roberto Alsina and others.

# 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.
"""Chart shortcode."""

from ast import literal_eval

try:
import pygal
except ImportError:
pygal = None # NOQA

from nikola.plugin_categories import ShortcodePlugin
from nikola.utils import req_missing

_site = None


class ChartShortcode(ShortcodePlugin):
"""Plugin for chart shortcode."""

name = "chart"

def handler(self, chart_type, **_options):
"""Generate chart using Pygal."""
if pygal is None:
msg = req_missing(
['pygal'], 'use the Chart directive', optional=True)
return '<div class="text-error">{0}</div>'.format(msg)
options = {}
data = _options.pop('data')
_options.pop('post', None)
_options.pop('site')
if 'style' in _options:
style_name = _options.pop('style')
else:
style_name = 'BlueStyle'
if '(' in style_name: # Parametric style
style = eval('pygal.style.' + style_name)
else:
style = getattr(pygal.style, style_name)
for k, v in _options.items():
try:
options[k] = literal_eval(v)
except Exception:
options[k] = v
chart = pygal
for o in chart_type.split('.'):
chart = getattr(chart, o)
chart = chart(style=style)
if _site and _site.invariant:
chart.no_prefix = True
chart.config(**options)
for line in data.splitlines():
line = line.strip()
if line:
label, series = literal_eval('({0})'.format(line))
chart.add(label, series)
return chart.render().decode('utf8')

0 comments on commit ee7dece

Please sign in to comment.