Kaynağa Gözat

Added audio plugin for liquid_tags

Inspired from the video plugin. It uses the html5 audio tag to insert
audio to a blog post. It is possible to add more versions of a file to
be a little more compatible for more browsers and os's.
Marvin Steadfast 8 yıl önce
ebeveyn
işleme
adea2d1d43
3 değiştirilmiş dosya ile 125 ekleme ve 0 silme
  1. 13 0
      liquid_tags/Readme.md
  2. 74 0
      liquid_tags/audio.py
  3. 38 0
      liquid_tags/test_audio.py

+ 13 - 0
liquid_tags/Readme.md

@@ -96,6 +96,19 @@ which is used as a preview of the video.
 To use a video from file, make sure it's in a static directory and put in
 the appropriate url.
 
+## Audio Tag
+To insert HTML5 audio into a post, enable the ``liquid_tags.audio`` plugin,
+and add to your document:
+
+    {% audio url/to/audio [url/to/audio] [url/to/audio] %}
+
+Up to 3 audio urls are possible. So you can add different versions of
+the audio file you want to post because not every browser support every
+file format.
+
+To use a audio from file, make sure it's in a static directory and put in
+the appropriate url.
+
 ## Include Code
 To include code from a file in your document with a link to the original
 file, enable the ``liquid_tags.include_code`` plugin, and add to your

+ 74 - 0
liquid_tags/audio.py

@@ -0,0 +1,74 @@
+"""
+Audio Tag
+---------
+This implements a Liquid-style audio tag for Pelican,
+based on the pelican video plugin [1]_
+
+Syntax
+------
+{% audio url/to/audio [url/to/audio] [/url/to/audio] %}
+
+Example
+-------
+{% audio http://example.tld/foo.mp3 http://example.tld/foo.ogg %}
+
+Output
+------
+<audio controls><source src="http://example.tld/foo.mp3" type="audio/mpeg"><source src="http://example.tld/foo.ogg" type="audio/ogg">Your browser does not support the audio element.</audio>
+
+[1] https://github.com/getpelican/pelican-plugins/blob/master/liquid_tags/video.py
+"""
+import os
+import re
+from .mdx_liquid_tags import LiquidTags
+
+SYNTAX = "{% audio url/to/audio [url/to/audio] [/url/to/audio] %}"
+AUDIO = re.compile(r'(/\S+|https?:\S+)(?:\s+(/\S+|https?:\S+))?(?:\s+(/\S+|https?:\S+))?')
+
+AUDIO_TYPEDICT = {'.mp3': 'audio/mpeg',
+                  '.ogg': 'audio/ogg',
+                  '.opus': 'audio/ogg',
+                  '.wav': 'audio/wav',
+                  '.mp4': 'audio/mp4'}
+
+
+def create_html(markup):
+    match = AUDIO.search(markup)
+    if match:
+        groups = match.groups()
+        audio_files = [g for g in groups if g]
+
+    if any(audio_files):
+        audio_out = '<audio controls>'
+
+        for audio_file in audio_files:
+
+            base, ext = os.path.splitext(audio_file)
+
+            if ext not in AUDIO_TYPEDICT:
+                raise ValueError("Unrecognized audio extension: "
+                                 "{0}".format(ext))
+
+            # add audio source
+            audio_out += '<source src="{}" type="{}">'.format(
+                audio_file, AUDIO_TYPEDICT[ext])
+
+        # close audio tag
+        audio_out += 'Your browser does not support the audio element.'
+        audio_out += '</audio>'
+
+    else:
+        raise ValueError("Error processing input, "
+                         "expected syntax: {0}".format(SYNTAX))
+
+    return audio_out
+
+
+@LiquidTags.register('audio')
+def audio(preprocessor, tag, markup):
+    return create_html(markup)
+
+
+# ---------------------------------------------------
+# This import allows image tag to be a Pelican plugin
+from liquid_tags import register

+ 38 - 0
liquid_tags/test_audio.py

@@ -0,0 +1,38 @@
+from . import audio
+import pytest
+import re
+
+
+@pytest.mark.parametrize('input,expected', [
+    ('http://foo.bar https://bar.foo',
+     ('http://foo.bar', 'https://bar.foo', None)),
+    ('http://test.foo',
+     ('http://test.foo', None, None)),
+    ('https://test.foo',
+     ('https://test.foo', None, None)),
+    ('http://foo.foo https://bar.bar http://zonk.zonk',
+     ('http://foo.foo', 'https://bar.bar', 'http://zonk.zonk'))
+])
+def test_regex(input, expected):
+    assert re.match(audio.AUDIO, input).groups() == expected
+
+
+@pytest.mark.parametrize('input,expected', [
+    ('http://foo.foo/foo.mp3',
+     ('<audio controls>'
+      '<source src="http://foo.foo/foo.mp3" type="audio/mpeg">'
+      'Your browser does not support the audio element.</audio>')),
+    ('https://foo.foo/foo.ogg http://bar.bar/bar.opus',
+     ('<audio controls>'
+      '<source src="https://foo.foo/foo.ogg" type="audio/ogg">'
+      '<source src="http://bar.bar/bar.opus" type="audio/ogg">'
+      'Your browser does not support the audio element.</audio>')),
+    ('http://1.de/1.wav http://2.de/2.mp4 http://3.de/3.ogg',
+     ('<audio controls>'
+      '<source src="http://1.de/1.wav" type="audio/wav">'
+      '<source src="http://2.de/2.mp4" type="audio/mp4">'
+      '<source src="http://3.de/3.ogg" type="audio/ogg">'
+      'Your browser does not support the audio element.</audio>'))
+])
+def test_create_html(input, expected):
+    assert audio.create_html(input) == expected