Created
June 13, 2012 07:56
-
-
Save dbrgn/2922648 to your computer and use it in GitHub Desktop.
ReStructuredText Youtube / Vimeo video embed directive
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
ReST directive for embedding Youtube and Vimeo videos. | |
There are two directives added: ``youtube`` and ``vimeo``. The only | |
argument is the video id of the video to include. | |
Both directives have three optional arguments: ``height``, ``width`` | |
and ``align``. Default height is 281 and default width is 500. | |
Example:: | |
.. youtube:: anwy2MPT5RE | |
:height: 315 | |
:width: 560 | |
:align: left | |
:copyright: (c) 2012 by Danilo Bargen. | |
:license: BSD 3-clause | |
""" | |
from __future__ import absolute_import | |
from docutils import nodes | |
from docutils.parsers.rst import Directive, directives | |
def align(argument): | |
"""Conversion function for the "align" option.""" | |
return directives.choice(argument, ('left', 'center', 'right')) | |
class IframeVideo(Directive): | |
has_content = False | |
required_arguments = 1 | |
optional_arguments = 0 | |
final_argument_whitespace = False | |
option_spec = { | |
'height': directives.nonnegative_int, | |
'width': directives.nonnegative_int, | |
'align': align, | |
} | |
default_width = 500 | |
default_height = 281 | |
def run(self): | |
self.options['video_id'] = directives.uri(self.arguments[0]) | |
if not self.options.get('width'): | |
self.options['width'] = self.default_width | |
if not self.options.get('height'): | |
self.options['height'] = self.default_height | |
if not self.options.get('align'): | |
self.options['align'] = 'left' | |
return [nodes.raw('', self.html % self.options, format='html')] | |
class Youtube(IframeVideo): | |
html = '<iframe src="http://www.youtube.com/embed/%(video_id)s" \ | |
width="%(width)u" height="%(height)u" frameborder="0" \ | |
webkitAllowFullScreen mozallowfullscreen allowfullscreen \ | |
class="align-%(align)s"></iframe>' | |
class Vimeo(IframeVideo): | |
html = '<iframe src="http://player.vimeo.com/video/%(video_id)s" \ | |
width="%(width)u" height="%(height)u" frameborder="0" \ | |
webkitAllowFullScreen mozallowfullscreen allowFullScreen \ | |
class="align-%(align)s"></iframe>' | |
def setup(builder): | |
directives.register_directive('youtube', Youtube) | |
directives.register_directive('vimeo', Vimeo) |
Thank you for this directive. It worked for me. What are the allowable inputs for align
? I tried center
and there was no change.
@jukent hehe, nice that this is still being used 🙂
Alignment options are left, center and right. I don't know if it still works, you may need to adjust the code. I haven't used this in a long time.
Suggest to update the iframe embed url from http to https, otherwise this error may pop up
MQTT.html:332 Mixed Content: The page at 'https://xxxxxxxx' was loaded over HTTPS, but requested an insecure frame 'http://www.youtube.com/embed/xxxxxxxxx'. This request has been blocked; the content must be served over HTTPS.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@seonman Call
setup()
function which should (even inconf.py
) register new classes that handle a non-standard RST directives such asyoutube
andvimeo
from this file.