Просмотр исходного кода

Added giphy plugin for liquid_tags

A plugin that makes it easier to use gif images from giphy.com. you just
need the gif id and the rest will be get from the giphy api.
Marvin Steadfast лет назад: 8
Родитель
Сommit
06cc3e3bcc

+ 8 - 0
liquid_tags/Readme.md

@@ -53,6 +53,14 @@ To insert a Flickr image to a post, follow these steps:
 
     ``{% flickr image_id [small|medium|large] ["alt text"|'alt text'] %}``
 
+## Giphy Tag
+To insert a gif from Giphy in your document by its id (such as ``aMSJFS6oFX0fC``), enable the ``liquid_tags.giphy`` plugin and use the following:
+
+    {% giphy gif_id ["alt text"|'alt text'] %}
+
+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).
+
 ## Soundcloud Tag
 To insert a Soundcloud Widget to a post, follow these steps:
 

+ 89 - 0
liquid_tags/giphy.py

@@ -0,0 +1,89 @@
+"""
+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

+ 4 - 2
liquid_tags/mdx_liquid_tags.py

@@ -21,11 +21,13 @@ LIQUID_TAG = re.compile(r'\{%.*?%\}', re.MULTILINE | re.DOTALL)
 EXTRACT_TAG = re.compile(r'(?:\s*)(\S+)(?:\s*)')
 LT_CONFIG = { 'CODE_DIR': 'code',
               'NOTEBOOK_DIR': 'notebooks',
-              'FLICKR_API_KEY': 'flickr'
+              'FLICKR_API_KEY': 'flickr',
+              'GIPHY_API_KEY': 'giphy'
 }
 LT_HELP = { 'CODE_DIR' : 'Code directory for include_code subplugin',
             'NOTEBOOK_DIR' : 'Notebook directory for notebook subplugin',
-            'FLICKR_API_KEY': 'Flickr key for accessing the API'
+            'FLICKR_API_KEY': 'Flickr key for accessing the API',
+            'GIPHY_API_KEY': 'Giphy key for accessing the API'
 }
 
 class _LiquidTagsPreprocessor(markdown.preprocessors.Preprocessor):

Разница между файлами не показана из-за своего большого размера
+ 2 - 0
liquid_tags/test_data/giphy.json


+ 29 - 0
liquid_tags/test_giphy.py

@@ -0,0 +1,29 @@
+from . import giphy
+try:
+    from unittest.mock import patch
+except ImportError:
+    from mock import patch
+import os
+import pytest
+
+
+PLUGIN_DIR = os.path.dirname(__file__)
+TEST_DATA_DIR = os.path.join(PLUGIN_DIR, 'test_data')
+
+
+@pytest.mark.parametrize('input,expected', [
+    (dict(gif_id='abc123'),
+     ('<a href="http://giphy.com/gifs/veronica-mars-aMSJFS6oFX0fC">'
+      '<img src="http://media2.giphy.com/media/'
+      'aMSJFS6oFX0fC/giphy.gif" alt="source: http://www.tumblr.com"></a>')),
+    (dict(gif_id='abc123', alt='ive had some free time'),
+     ('<a href="http://giphy.com/gifs/veronica-mars-aMSJFS6oFX0fC">'
+      '<img src="http://media2.giphy.com/media/'
+      'aMSJFS6oFX0fC/giphy.gif" alt="ive had some free time"></a>'))
+])
+@patch('liquid_tags.giphy.urlopen')
+def test_create_html(mock_urlopen, input, expected):
+    with open(TEST_DATA_DIR + '/giphy.json', 'rb') as f:
+        mock_urlopen.return_value.read.return_value = f.read()
+
+        assert giphy.create_html('test_api_key', input) == expected