# -*- coding: utf-8 -*- """ Use LinkPeek via reStructuredText ================================= This plugin allows you to use LinkPeek images from within reST documents. For example: .. code-block:: restructuredtext .. linkpeek:: uri = https://www.remarkbox.com action = link-image size = 600x400 In Pelican static site generator, you can register this Docutils plugin in your ``pelicanconf.py`` .. code-block:: python # register linkpeek docutils directive. import sys sys.path.append("lib") import rst_linkpeek linkpeek = rst_linkpeek.LinkPeek linkpeek.apikey = LINKPEEK_APIKEY linkpeek.secret = LINKPEEK_SECRET linkpeek.register() """ from __future__ import unicode_literals from docutils import nodes from docutils.parsers.rst import ( directives, Directive, ) from collections import defaultdict from liblinkpeek import api_v1 class LinkPeek(Directive): required_arguments = 0 optional_arguments = 0 final_argument_whitespace = True has_content = True apikey = None secret = None params = defaultdict(str) def api_call(self): return api_v1( self.params["uri"], self.apikey, self.secret, self.params["size"], self.params["viewport"], ) def html_image(self): """return html image markup.""" html = '{}' return html.format( self.api_call(), self.params["title"], self.params["align"], self.params["style"], self.params["class"], self.params["alt"], ) def html_link_image(self): """return html link image markup.""" html = '{}' return html.format(self.params["uri"], self.html_image()) def _get_params(self): """ turn [u"uri = linkpeek.com", u"size = 200x200"] into {u"uri": u"linkpeek.com", u"size": u"200x200"} """ params = defaultdict(str) for c in self.content: # split on = and then remove leading/trailing whitespace. key, value = c.split("=") key = key.strip() value = value.strip() params[key] = value self.params = params return params @property def action_registry(self): return { "image" : self.html_image, "link-image" : self.html_link_image, "" : self.api_call, } def run(self): """this method is fired when rendering.""" self._get_params() action = self.action_registry.get(self.params["action"]) output = action() return [nodes.raw("", output, format="html")] @classmethod def register(cls): """register this directive/class with docutils.""" # this allows us to modify apikey and secret attributes before registering. directives.register_directive("linkpeek", cls)