sitolost/pelican-plugins/liquid_tags/giphy.py

90 lines
2.4 KiB
Python

"""
Giphy Tag
---------
This implements a Liquid-style Giphy tag for Pelican.
IMPORTANT: You have to request a production API key from giphy `here <https://api.giphy.com/submit>`.
For the first runs you could also use the public beta key you can get `here <https://github.com/giphy/GiphyAPI>`.
Syntax
------
{% giphy gif_id ["alt text"|'alt text'] %}
Example
-------
{% giphy aMSJFS6oFX0fC 'ive had some free time' %}
Output
------
<a href="http://giphy.com/gifs/veronica-mars-aMSJFS6oFX0fC"><img src="http://media4.giphy.com/media/aMSJFS6oFX0fC/giphy.gif" alt="ive had some free time"></a>
"""
import json
import re
try:
from urllib.request import urlopen
except ImportError:
from urllib import urlopen
from .mdx_liquid_tags import LiquidTags
SYNTAX = '''{% giphy gif_id ["alt text"|'alt text'] %}'''
GIPHY = re.compile('''(?P<gif_id>[\S+]+)(?:\s+(['"]{0,1})(?P<alt>.+)(\\2))?''')
def get_gif(api_key, gif_id):
'''Returns dict with gif informations from the API.'''
url = 'http://api.giphy.com/v1/gifs/{}?api_key={}'.format(gif_id, api_key)
r = urlopen(url)
return json.loads(r.read().decode('utf-8'))
def create_html(api_key, attrs):
'''Returns complete html tag string.'''
gif = get_gif(api_key, attrs['gif_id'])
if 'alt' not in attrs.keys():
attrs['alt'] = 'source: {}'.format(gif['data']['source'])
html_out = '<a href="{}">'.format(gif['data']['url'])
html_out += '<img src="{}" alt="{}">'.format(
gif['data']['images']['original']['url'],
attrs['alt'])
html_out += '</a>'
return html_out
def main(api_key, markup):
'''Doing the regex parsing and running the create_html function.'''
match = GIPHY.search(markup)
attrs = None
if match:
attrs = dict(
[(key, value.strip())
for (key, value) in match.groupdict().items() if value])
else:
raise ValueError('Error processing input. '
'Expected syntax: {}'.format(SYNTAX))
return create_html(api_key, attrs)
@LiquidTags.register('giphy')
def giphy(preprocessor, tag, markup):
api_key = preprocessor.configs.getConfig('GIPHY_API_KEY')
if api_key is None:
raise ValueError('Please set GIPHY_API_KEY.')
return main(api_key, markup)
# ---------------------------------------------------
# This import allows image tag to be a Pelican plugin
from liquid_tags import register