From 46daadc1378d47bc3fd66a2676156c5053a04f36 Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Fri, 8 Jun 2012 11:21:52 +0200 Subject: [PATCH] add a youtube directive to pelican --- pelican/rstdirectives.py | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/pelican/rstdirectives.py b/pelican/rstdirectives.py index 3d7c2fe7..cb9c6f77 100644 --- a/pelican/rstdirectives.py +++ b/pelican/rstdirectives.py @@ -36,3 +36,59 @@ class Pygments(Directive): directives.register_directive('code-block', Pygments) directives.register_directive('sourcecode', Pygments) + + +class YouTube(Directive): + """ Embed YouTube video in posts. + + VIDEO_ID is required, with / height are optional integer, + and align could be left / center / right. + + Usage: + .. youtube:: VIDEO_ID + :width: 640 + :height: 480 + :align: center + """ + + def align(argument): + """Conversion function for the "align" option.""" + return directives.choice(argument, ('left', 'center', 'right')) + + required_arguments = 1 + optional_arguments = 2 + option_spec = { + 'width': directives.positive_int, + 'height': directives.positive_int, + 'align': align + } + + final_argument_whitespace = False + has_content = False + + def run(self): + videoID = self.arguments[0].strip() + width = 420 + height = 315 + align = 'left' + + if 'width' in self.options: + width = self.options['width'] + + if 'height' in self.options: + height = self.options['height'] + + if 'align' in self.options: + align = self.options['align'] + + url = 'http://www.youtube.com/embed/%s' % videoID + div_block = '
' % align + embed_block = '' % (width, height, url) + + return [ + nodes.raw('', div_block, format='html'), + nodes.raw('', embed_block, format='html'), + nodes.raw('', '
', format='html')] + +directives.register_directive('youtube', YouTube)