123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- """
- 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
|