12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- """
- Image Tag
- ---------
- This implements a Liquid-style image tag for Pelican,
- based on the octopress image tag [1]_
- Syntax
- ------
- {% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | "title text" ["alt text"]] %}
- Examples
- --------
- {% img /images/ninja.png Ninja Attack! %}
- {% img left half http://site.com/images/ninja.png Ninja Attack! %}
- {% img left half http://site.com/images/ninja.png 150 150 "Ninja Attack!" "Ninja in attack posture" %}
- Output
- ------
- <img src="/images/ninja.png">
- <img class="left half" src="http://site.com/images/ninja.png" title="Ninja Attack!" alt="Ninja Attack!">
- <img class="left half" src="http://site.com/images/ninja.png" width="150" height="150" title="Ninja Attack!" alt="Ninja in attack posture">
- [1] https://github.com/imathis/octopress/blob/master/plugins/image_tag.rb
- """
- import re
- from .mdx_liquid_tags import LiquidTags
- import six
- SYNTAX = '{% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | "title text" ["alt text"]] %}'
- # Regular expression to match the entire syntax
- ReImg = re.compile("""(?P<class>\S.*\s+)?(?P<src>(?:https?:\/\/|\/|\S+\/)\S+)(?:\s+(?P<width>\d+))?(?:\s+(?P<height>\d+))?(?P<title>\s+.+)?""")
- # Regular expression to split the title and alt text
- ReTitleAlt = re.compile("""(?:"|')(?P<title>[^"']+)?(?:"|')\s+(?:"|')(?P<alt>[^"']+)?(?:"|')""")
- @LiquidTags.register('img')
- def img(preprocessor, tag, markup):
- attrs = None
- # Parse the markup string
- match = ReImg.search(markup)
- if match:
- attrs = dict([(key, val.strip())
- for (key, val) in six.iteritems(match.groupdict()) if val])
- else:
- raise ValueError('Error processing input. '
- 'Expected syntax: {0}'.format(SYNTAX))
- # 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']
- # Return the formatted text
- return "<img {0}>".format(' '.join('{0}="{1}"'.format(key, val)
- for (key, val) in six.iteritems(attrs)))
- #----------------------------------------------------------------------
- # This import allows image tag to be a Pelican plugin
- from .liquid_tags import register
|