-
-
Save dbrgn/2922648 to your computer and use it in GitHub Desktop.
# -*- 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) |
@seonman Call setup()
function which should (even in conf.py
) register new classes that handle a non-standard RST directives such as youtube
and vimeo
from this file.
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.
Hi,
How can I add this to conf.py so that I can use it from my rst file?