Explorar o código

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 %!s(int64=8) %!d(string=hai) anos
pai
achega
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):

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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