aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/color.pm
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki/Plugin/color.pm')
-rw-r--r--IkiWiki/Plugin/color.pm78
1 files changed, 78 insertions, 0 deletions
diff --git a/IkiWiki/Plugin/color.pm b/IkiWiki/Plugin/color.pm
new file mode 100644
index 000000000..9bb2359ce
--- /dev/null
+++ b/IkiWiki/Plugin/color.pm
@@ -0,0 +1,78 @@
+#!/usr/bin/perl
+# Ikiwiki text colouring plugin
+# Paweł‚ Tęcza <ptecza@net.icm.edu.pl>
+package IkiWiki::Plugin::color;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+ hook(type => "preprocess", id => "color", call => \&preprocess);
+ hook(type => "format", id => "color", call => \&format);
+ hook(type => "getsetup", id => "color", call => \&getsetup);
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ safe => 1,
+ rebuild => undef,
+ section => "widget",
+ },
+}
+
+sub preserve_style ($$$) {
+ my $foreground = shift;
+ my $background = shift;
+ my $text = shift;
+
+ $foreground = defined $foreground ? lc($foreground) : '';
+ $background = defined $background ? lc($background) : '';
+ $text = '' unless (defined $text);
+
+ # Validate colors. Only color name or color code are valid.
+ $foreground = '' unless ($foreground &&
+ ($foreground =~ /^[a-z]+$/ || $foreground =~ /^#[0-9a-f]{3,6}$/));
+ $background = '' unless ($background &&
+ ($background =~ /^[a-z]+$/ || $background =~ /^#[0-9a-f]{3,6}$/));
+
+ my $preserved = '';
+ $preserved .= '<span class="color">';
+ $preserved .= 'color: '.$foreground if ($foreground);
+ $preserved .= '; ' if ($foreground && $background);
+ $preserved .= 'background-color: '.$background if ($background);
+ $preserved .= '</span>';
+ $preserved .= '<span class="colorend">'.$text.'</span>';
+
+ return $preserved;
+
+}
+
+sub replace_preserved_style ($) {
+ my $content = shift;
+
+ $content =~ s!<span class="color">((color: ([a-z]+|\#[0-9a-f]{3,6})?)?((; )?(background-color: ([a-z]+|\#[0-9a-f]{3,6})?)?)?)</span>!<span class="color" style="$1">!g;
+ $content =~ s!<span class="colorend">!!g;
+
+ return $content;
+}
+
+sub preprocess (@) {
+ my %params = @_;
+
+ return preserve_style($params{foreground}, $params{background},
+ # Preprocess the text to expand any preprocessor directives
+ # embedded inside it.
+ IkiWiki::preprocess($params{page}, $params{destpage},
+ $params{text}));
+}
+
+sub format (@) {
+ my %params = @_;
+
+ $params{content} = replace_preserved_style($params{content});
+ return $params{content};
+}
+
+1