diff options
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r-- | IkiWiki/Plugin/flattr.pm | 97 | ||||
-rw-r--r-- | IkiWiki/Plugin/relativedate.pm | 2 | ||||
-rw-r--r-- | IkiWiki/Plugin/toggle.pm | 2 |
3 files changed, 99 insertions, 2 deletions
diff --git a/IkiWiki/Plugin/flattr.pm b/IkiWiki/Plugin/flattr.pm new file mode 100644 index 000000000..3aee1eb93 --- /dev/null +++ b/IkiWiki/Plugin/flattr.pm @@ -0,0 +1,97 @@ +#!/usr/bin/perl +package IkiWiki::Plugin::flattr; + +use warnings; +use strict; +use IkiWiki 3.00; + +sub import { + hook(type => "getsetup", id => "flattr", call => \&getsetup); + hook(type => "preprocess", id => "flattr", call => \&preprocess); + hook(type => "format", id => "flattr", call => \&format); +} + +sub getsetup () { + return + plugin => { + safe => 1, + rebuild => undef, + }, + flattr_userid => { + type => "string", + example => 'joeyh', + description => "userid or user name to use by default for Flattr buttons", + advanced => 0, + safe => 1, + rebuild => undef, + }, +} + +my %flattr_pages; + +sub preprocess (@) { + my %params=@_; + + $flattr_pages{$params{destpage}}=1; + + my $url=$params{url}; + if (! defined $url) { + $url=urlto($params{page}, "", 1); + } + + my @fields; + foreach my $field (qw{language uid button hidden category tags}) { + if (exists $params{$field}) { + push @fields, "$field:$params{$field}"; + } + } + + return '<a class="FlattrButton" href="'.$url.'"'. + (exists $params{title} ? ' title="'.$params{title}.'"' : ''). + ' rev="flattr;'.join(';', @fields).';"'. + '>'. + (exists $params{description} ? $params{description} : ''). + '</a>'; +} + +sub format (@) { + my %params=@_; + + # Add flattr's javascript to pages with flattr buttons. + if ($flattr_pages{$params{page}}) { + if (! ($params{content}=~s!^(<body[^>]*>)!$1.flattrjs()!em)) { + # no <body> tag, probably in preview mode + $params{content}=flattrjs().$params{content}; + } + } + return $params{content}; +} + +my $js_cached; +sub flattrjs { + return $js_cached if defined $js_cached; + + my $js_url='https://api.flattr.com/js/0.5.0/load.js?mode=auto'; + if (defined $config{flattr_userid}) { + my $userid=$config{flattr_userid}; + $userid=~s/[^-A-Za-z0-9_]//g; # sanitize for inclusion in javascript + $js_url.="&uid=$userid"; + } + + # This is Flattr's standard javascript snippet to include their + # external javascript file, asynchronously. + return $js_cached=<<"EOF"; +<script type="text/javascript"> +<!--//--><![CDATA[//><!-- +(function() { + var s = document.createElement('script'), t = document.getElementsByTagName('script')[0]; + s.type = 'text/javascript'; + s.async = true; + s.src = '$js_url'; + t.parentNode.insertBefore(s, t); +})();//--><!]]> +</script> +EOF +} + +1 diff --git a/IkiWiki/Plugin/relativedate.pm b/IkiWiki/Plugin/relativedate.pm index c9280ef14..7296889ab 100644 --- a/IkiWiki/Plugin/relativedate.pm +++ b/IkiWiki/Plugin/relativedate.pm @@ -27,7 +27,7 @@ sub format (@) { my %params=@_; if (! ($params{content}=~s!^(<body[^>]*>)!$1.include_javascript($params{page})!em)) { - # no </body> tag, probably in preview mode + # no <body> tag, probably in preview mode $params{content}=include_javascript($params{page}, 1).$params{content}; } return $params{content}; diff --git a/IkiWiki/Plugin/toggle.pm b/IkiWiki/Plugin/toggle.pm index 20967d3fd..1f93f87fe 100644 --- a/IkiWiki/Plugin/toggle.pm +++ b/IkiWiki/Plugin/toggle.pm @@ -69,7 +69,7 @@ sub format (@) { if ($params{content}=~s!(<div class="toggleable(?:-open)?" id="[^"]+">\s*)</div>!$1!g) { $params{content}=~s/<div class="toggleableend">//g; if (! ($params{content}=~s!^(<body[^>]*>)!$1.include_javascript($params{page})!em)) { - # no </body> tag, probably in preview mode + # no <body> tag, probably in preview mode $params{content}=include_javascript($params{page}, 1).$params{content}; } } |