forked from varia/varia.website
many many many Varia's websites, work in progress: https://many.vvvvvvaria.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.6 KiB
103 lines
3.6 KiB
"""
|
|
Instagram Image Tag
|
|
-------------------
|
|
|
|
By `Tom Spalding <https://github.com/digitalvapor>`_
|
|
|
|
You can see a working example at `antivapor.net/instagram-tag.html <http://antivapor.net/instagram-tag.html>`_.
|
|
|
|
Based on `Liquid Image Tag <https://github.com/getpelican/pelican-plugins/blob/master/liquid_tags/img.py>`_ by `Jake Vanderplas <https://github.com/jakevdp>`_.
|
|
|
|
Optional Todo:
|
|
* Query JSON to automatically include descriptions.
|
|
http://api.instagram.com/oembed?url=http://instagr.am/p/olw8jXiz1_/
|
|
and option to add wrapping anchor link to original http://instagram.com/p/olw8jXiz1_
|
|
* Default to size m
|
|
http://instagr.am/p/olw8jXiz1_/media/?size=t
|
|
http://instagr.am/p/olw8jXiz1_/media
|
|
* Provide examples using with [Better Figures and Images](https://github.com/getpelican/pelican-plugins/tree/master/better_figures_and_images).
|
|
|
|
Syntax
|
|
------
|
|
|
|
{% gram shortcode [size] [width] [class name(s)] [title text | "title text" ["alt text"]] %}
|
|
|
|
where size is t, m, or l, and it defaults to m. see http://instagram.com/developer/embedding.
|
|
|
|
Examples
|
|
--------
|
|
|
|
{% gram pFG7naIZkr t %}
|
|
{% gram pFJE11IZnx %}
|
|
{% gram pFI0CAIZna l 400 figure 'pretty turkey tail fungus' %}
|
|
{% gram rOru21oZpe l 450 test_class instagram 'warehouse window title' 'alt text' %}
|
|
|
|
Output
|
|
------
|
|
|
|
<img src="http://photos-c.ak.instagram.com/hphotos-ak-xaf1/t51.2885-15/917172_604907902963826_254280879_n.jpg" width="450" title="warehouse window title" alt="alt text" class="test_class instagram">
|
|
"""
|
|
import re
|
|
try:
|
|
from urllib.request import urlopen
|
|
except ImportError:
|
|
from urllib import urlopen
|
|
from .mdx_liquid_tags import LiquidTags
|
|
|
|
SYNTAX = '{% gram shortcode [size] [width] [class name(s)] [title text | "title text" ["alt text"]] %}'
|
|
|
|
# Regular expression for full syntax
|
|
# ReGram = re.compile("""(?P<shortcode>\S+)(?:\s+(?P<size>[tml]?))?(?:\s+(?P<width>\d*))?(?:\s+(?P<class>\S*))?(?P<title>\s+.+)?""")
|
|
ReGram = re.compile("""(?P<shortcode>\S+)(?:\s+(?P<size>[tml]?))?(?:\s+(?P<width>\d*))?(?:\s+(?P<class>[^']*))?(?P<title>.+)?""")
|
|
|
|
# Regular expression to split the title and alt text
|
|
ReTitleAlt = re.compile("""(?:"|')(?P<title>[^"']+)?(?:"|')\s+(?:"|')(?P<alt>[^"']+)?(?:"|')""")
|
|
|
|
@LiquidTags.register('gram')
|
|
def gram(preprocessor, tag, markup):
|
|
|
|
attrs = None
|
|
|
|
# Parse the markup string
|
|
match = ReGram.search(markup)
|
|
if match:
|
|
attrs = dict([(key, val.strip())
|
|
for (key, val) in match.groupdict().items() if val])
|
|
else:
|
|
raise ValueError('Error processing input. '
|
|
'Expected syntax: {0}'.format(SYNTAX))
|
|
|
|
# Construct URI
|
|
#print(attrs)
|
|
shortcode = attrs['shortcode']
|
|
url = 'http://instagr.am/p/'+shortcode+'/media/'
|
|
del attrs['shortcode']
|
|
|
|
if 'size' in attrs:
|
|
size = '?size={0}'.format(attrs['size'])
|
|
url = url+size
|
|
del attrs['size']
|
|
|
|
r = urlopen(url)
|
|
|
|
if(r.getcode()==404):
|
|
raise ValueError('%s isnt a photo.'%shortcode)
|
|
|
|
gram_url = r.geturl()
|
|
|
|
# Check if alt text is present -- if so, split it from title
|
|
if 'title' in attrs:
|
|
match = ReTitleAlt.search(attrs['title'])
|
|
if match:
|
|
attrs.update(match.groupdict())
|
|
if not attrs.get('alt'):
|
|
attrs['alt'] = attrs['title']
|
|
|
|
#print('updated dict: '+repr(attrs))
|
|
|
|
# Return the formatted text
|
|
return '<img src="{0}"{1}>'.format(gram_url,' '.join(' {0}="{1}"'.format(key,val) for (key,val) in attrs.items()))
|
|
|
|
#----------------------------------------------------------------------
|
|
# This import allows image tag to be a Pelican plugin
|
|
from liquid_tags import register
|
|
|