-
-
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?