diff options
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r-- | IkiWiki/Plugin/embed.pm | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/IkiWiki/Plugin/embed.pm b/IkiWiki/Plugin/embed.pm new file mode 100644 index 000000000..4fc91d978 --- /dev/null +++ b/IkiWiki/Plugin/embed.pm @@ -0,0 +1,68 @@ +#!/usr/bin/perl +package IkiWiki::Plugin::embed; + +use warnings; +use strict; +use IkiWiki 2.00; + +my $attribr=qr/[^<>"]+/; + +# regexp matching known-safe html +my $safehtml=qr{( + # google maps + <\s*iframe\s+width="\d+"\s+height="\d+"\s+frameborder="$attribr"\s+ + scrolling="$attribr"\s+marginheight="\d+"\s+marginwidth="\d+"\s+ + src="http://maps.google.com/\?$attribr"\s*>\s*</iframe> + + | + + # youtube + <\s*object\s+width="\d+"\s+height="\d+"\s*>\s* + <\s*param\s+name="movie"\s+value="http://www.youtube.com/v/$attribr"\s*>\s* + </param>\s* + <\s*param\s+name="wmode"\s+value="transparent"\s*>\s*</param>\s* + <embed\s+src="http://www.youtube.com/v/$attribr"\s+ + type="application/x-shockwave-flash"\s+wmode="transparent"\s+ + width="\d+"\s+height="\d+"\s*>\s*</embed>\s*</object> + + | + + # google video + <\s*embed\s+style="\s*width:\d+px;\s+height:\d+px;\s*"\s+id="$attribr"\s+ + type="application/x-shockwave-flash"\s+ + src="http://video.google.com/googleplayer.swf\?$attribr"\s+ + flashvars=""\s*>\s*</embed> + + | + + # google calendar + <\s*iframe\s+src="http://www.google.com/calendar/embed\?src=$attribr"\s+ + style="\s*border-width:\d+\s*"\s+width="\d+"\s+frameborder="\d+"\s* + height="\d+"\s*>\s*</iframe> +)}sx; + +my @embedded; + +sub import { #{{{ + hook(type => "filter", id => "embed", call => \&filter); +} # }}} + +sub embed ($) { #{{{ + hook(type => "format", id => "embed", call => \&format) unless @embedded; + push @embedded, shift; + return "<div class=\"embed$#embedded\"></div>"; +} #}}} + +sub filter (@) { #{{{ + my %params=@_; + $params{content} =~ s/$safehtml/embed($1)/eg; + return $params{content}; +} # }}} + +sub format (@) { #{{{ + my %params=@_; + $params{content} =~ s/<div class="embed(\d+)"><\/div>/$embedded[$1]/eg; + return $params{content}; +} # }}} + +1 |