ikiwiki/IkiWiki/Plugin/color.pm

80 lines
2.1 KiB
Perl
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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 = @_;
# Preprocess the text to expand any preprocessor directives
# embedded inside it.
$params{text} = IkiWiki::preprocess($params{page}, $params{destpage},
IkiWiki::filter($params{page}, $params{destpage}, $params{text}));
return preserve_style($params{foreground}, $params{background}, $params{text});
}
sub format (@) {
my %params = @_;
$params{content} = replace_preserved_style($params{content});
return $params{content};
}
1