diff options
Diffstat (limited to '.library/IkiWiki/Plugin')
-rw-r--r-- | .library/IkiWiki/Plugin/copyright.pm | 60 | ||||
-rw-r--r-- | .library/IkiWiki/Plugin/field.pm | 722 | ||||
-rw-r--r-- | .library/IkiWiki/Plugin/getfield.pm | 126 | ||||
-rw-r--r-- | .library/IkiWiki/Plugin/license.pm | 59 | ||||
-rw-r--r-- | .library/IkiWiki/Plugin/reset_mtimes.pm | 84 | ||||
-rw-r--r-- | .library/IkiWiki/Plugin/texinfo.pm | 226 | ||||
-rw-r--r-- | .library/IkiWiki/Plugin/ymlfront.pm | 434 |
7 files changed, 0 insertions, 1711 deletions
diff --git a/.library/IkiWiki/Plugin/copyright.pm b/.library/IkiWiki/Plugin/copyright.pm deleted file mode 100644 index 16acaccd..00000000 --- a/.library/IkiWiki/Plugin/copyright.pm +++ /dev/null @@ -1,60 +0,0 @@ -# A plugin for ikiwiki to implement adding a footer with copyright information -# based on a default value taken out of a file. - -# Copyright © 2007, 2008 Thomas Schwinge <tschwinge@gnu.org> -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 2, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Unless overridden with the `meta' plugin, a footer with copyright information -# will be added to every page using a source file `copyright' (e.g., -# `copyright.mdwn') (using the same ``locating rules'' as for the sidebar -# plugin). -# -# The state which page's copyright text was gathered from which source is not -# tracked, so you'll need a full wiki-rebuild if the `copyright' file is -# changed. - -package IkiWiki::Plugin::copyright; - -use warnings; -use strict; -use IkiWiki 2.00; - -my %copyright; - -sub import -{ - hook (type => "scan", id => "copyright", call => \&scan); -} - -sub scan (@) -{ - my %params = @_; - my $page = $params{page}; - - return if defined $pagestate{$page}{meta}{copyright}; - - my $content; - my $copyright_page = bestlink ($page, "copyright") || return; - my $copyright_file = $pagesources{$copyright_page} || return; - - # Only an optimization to avoid reading the same file again and again. - $copyright{$copyright_file} = readfile (srcfile ($copyright_file)) - unless defined $copyright{$copyright_file}; - - $pagestate{$page}{meta}{copyright} = $copyright{$copyright_file}; -} - -1 diff --git a/.library/IkiWiki/Plugin/field.pm b/.library/IkiWiki/Plugin/field.pm deleted file mode 100644 index d77e7282..00000000 --- a/.library/IkiWiki/Plugin/field.pm +++ /dev/null @@ -1,722 +0,0 @@ -#!/usr/bin/perl -# Ikiwiki field plugin. -# See doc/plugin/contrib/field.mdwn for documentation. -package IkiWiki::Plugin::field; -use warnings; -use strict; -=head1 NAME - -IkiWiki::Plugin::field - front-end for per-page record fields. - -=head1 VERSION - -This describes version B<1.20101101> of IkiWiki::Plugin::field - -=cut - -our $VERSION = '1.20101115'; - -=head1 PREREQUISITES - - IkiWiki - -=head1 AUTHOR - - Kathryn Andersen (RUBYKAT) - http://github.com/rubykat - -=head1 COPYRIGHT - -Copyright (c) 2009-2010 Kathryn Andersen - -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -=cut - -use IkiWiki 3.00; - -my %Fields = ( - _first => { - id => '_first', - seq => 'BB', - }, - _last => { - id => '_last', - seq => 'YY', - }, - _middle => { - id => '_middle', - seq => 'MM', - }, -); -my @FieldsLookupOrder = (); - -my %Cache = (); - -sub field_get_value ($$); - -sub import { - hook(type => "getsetup", id => "field", call => \&getsetup); - hook(type => "checkconfig", id => "field", call => \&checkconfig); - hook(type => "scan", id => "field", call => \&scan, last=>1); - hook(type => "pagetemplate", id => "field", call => \&pagetemplate); -} - -# =============================================== -# Hooks -# --------------------------- -sub getsetup () { - return - plugin => { - safe => 1, - rebuild => undef, - }, - field_register => { - type => "hash", - example => "field_register => {meta => 'last'}", - description => "simple registration of fields by plugin", - safe => 0, - rebuild => undef, - }, - field_allow_config => { - type => "boolean", - example => "field_allow_config => 1", - description => "allow config settings to be queried", - safe => 0, - rebuild => undef, - }, - field_tags => { - type => "hash", - example => "field_tags => {BookAuthor => '/books/authors'}", - description => "fields flagged as tag-fields", - safe => 0, - rebuild => undef, - }, -} - -sub checkconfig () { - # use the simple by-plugin pagestatus method for - # those plugins registered with the field_register config option. - if (defined $config{field_register}) - { - if (ref $config{field_register} eq 'ARRAY') - { - foreach my $id (@{$config{field_register}}) - { - field_register(id=>$id); - } - } - elsif (ref $config{field_register} eq 'HASH') - { - foreach my $id (keys %{$config{field_register}}) - { - field_register(id=>$id, order=>$config{field_register}->{$id}); - } - } - else - { - field_register(id=>$config{field_register}); - } - } - if (!defined $config{field_allow_config}) - { - $config{field_allow_config} = 0; - } -} # checkconfig - -sub scan (@) { - my %params=@_; - my $page=$params{page}; - my $content=$params{content}; - - # scan for tag fields - if ($config{field_tags}) - { - foreach my $field (keys %{$config{field_tags}}) - { - my @values = field_get_value($field, $page); - if (@values) - { - foreach my $tag (@values) - { - if ($tag) - { - my $link = $config{field_tags}{$field} . '/' - . titlepage($tag); - add_link($page, $link, lc($field)); - } - } - } - } - } -} # scan - -sub pagetemplate (@) { - my %params=@_; - my $page=$params{page}; - my $template=$params{template}; - - field_set_template_values($template, $page); -} # pagetemplate - -# =============================================== -# Field interface -# --------------------------- - -sub field_register (%) { - my %param=@_; - if (!exists $param{id}) - { - error 'field_register requires id parameter'; - return 0; - } - if (exists $param{call} and !ref $param{call}) - { - error 'field_register call parameter must be function'; - return 0; - } - - my $id = $param{id}; - $Fields{$id} = \%param; - - # add this to the ordering hash - # first, last, order; by default, middle - my $when = ($param{first} - ? '_first' - : ($param{last} - ? '_last' - : ($param{order} - ? ($param{order} eq 'first' - ? '_first' - : ($param{order} eq 'last' - ? '_last' - : ($param{order} eq 'middle' - ? '_middle' - : $param{order} - ) - ) - ) - : '_middle' - ) - )); - add_lookup_order($id, $when); - return 1; -} # field_register - -sub field_get_value ($$) { - my $field_name = shift; - my $page = shift; - - # This will return the first value it finds - # where the value returned is not undefined. - # This will return an array of values if wantarray is true. - - # The reason why it checks every registered plugin rather than have - # plugins declare which fields they know about, is that it is quite - # possible that a plugin doesn't know, ahead of time, what fields - # will be available; for example, a YAML format plugin would return - # any field that happens to be defined in a YAML page file, which - # could be anything! - - # check the cache first - my $lc_field_name = lc($field_name); - if (wantarray) - { - if (exists $Cache{$page}{$lc_field_name}{array} - and defined $Cache{$page}{$lc_field_name}{array}) - { - return @{$Cache{$page}{$lc_field_name}{array}}; - } - } - else - { - if (exists $Cache{$page}{$lc_field_name}{scalar} - and defined $Cache{$page}{$lc_field_name}{scalar}) - { - return $Cache{$page}{$lc_field_name}{scalar}; - } - } - - if (!@FieldsLookupOrder) - { - build_fields_lookup_order(); - } - - # Get either the scalar or the array value depending - # on what is requested - don't get both because it wastes time. - if (wantarray) - { - my @array_value = undef; - foreach my $id (@FieldsLookupOrder) - { - # get the data from the pagestate hash if it's there - if (exists $pagestate{$page}{$id}{$field_name} - and defined $pagestate{$page}{$id}{$field_name}) - { - @array_value = (ref $pagestate{$page}{$id}{$field_name} - ? @{$pagestate{$page}{$id}{$field_name}} - : ($pagestate{$page}{$id}{$field_name})); - } - elsif (exists $pagestate{$page}{$id}{$lc_field_name} - and defined $pagestate{$page}{$id}{$lc_field_name}) - { - @array_value = (ref $pagestate{$page}{$id}{$lc_field_name} - ? @{$pagestate{$page}{$id}{$lc_field_name}} - : ($pagestate{$page}{$id}{$lc_field_name})); - } - elsif (exists $Fields{$id}{call}) - { - @array_value = $Fields{$id}{call}->($field_name, $page); - } - if (@array_value and $array_value[0]) - { - last; - } - } - if (!@array_value) - { - @array_value = field_calculated_values($field_name, $page); - } - # cache the value - $Cache{$page}{$lc_field_name}{array} = \@array_value; - return @array_value; - } - else # scalar - { - my $value = undef; - foreach my $id (@FieldsLookupOrder) - { - # get the data from the pagestate hash if it's there - # but only if it's already a scalar - if (exists $pagestate{$page}{$id}{$field_name} - and !ref $pagestate{$page}{$id}{$field_name}) - { - $value = $pagestate{$page}{$id}{$field_name}; - } - elsif (exists $pagestate{$page}{$id}{$lc_field_name} - and !ref $pagestate{$page}{$id}{$lc_field_name}) - { - $value = $pagestate{$page}{$id}{$lc_field_name}; - } - elsif (exists $Fields{$id}{call}) - { - $value = $Fields{$id}{call}->($field_name, $page); - } - if (defined $value) - { - last; - } - } - if (!defined $value) - { - $value = field_calculated_values($field_name, $page); - } - # cache the value - $Cache{$page}{$lc_field_name}{scalar} = $value; - return $value; - } - - return undef; -} # field_get_value - -# set the values for the given HTML::Template template -sub field_set_template_values ($$;@) { - my $template = shift; - my $page = shift; - my %params = @_; - - my $get_value_fn = (exists $params{value_fn} - ? $params{value_fn} - : \&field_get_value); - - # Find the parameter names in this template - # and see if you can find their values. - - # The reason we check the template for field names is because we - # don't know what fields the registered plugins provide; and this is - # reasonable because for some plugins (e.g. a YAML data plugin) they - # have no way of knowing, ahead of time, what fields they might be - # able to provide. - - my @parameter_names = $template->param(); - foreach my $field (@parameter_names) - { - # Don't redefine if the field already has a value set. - next if ($template->param($field)); - - my $type = $template->query(name => $field); - if ($type eq 'LOOP' and $field =~ /_LOOP$/oi) - { - # Loop fields want arrays. - # Figure out what field names to look for: - # * names are from the enclosed loop fields - my @loop_fields = $template->query(loop => $field); - - my @loop_vals = (); - my %loop_field_arrays = (); - foreach my $fn (@loop_fields) - { - if ($fn !~ /^__/o) # not a special loop variable - { - my @ival_array = $get_value_fn->($fn, $page); - if (@ival_array) - { - $loop_field_arrays{$fn} = \@ival_array; - } - } - } - foreach my $fn (sort keys %loop_field_arrays) - { - my $i = 0; - foreach my $v (@{$loop_field_arrays{$fn}}) - { - if (!defined $loop_vals[$i]) - { - $loop_vals[$i] = {}; - } - $loop_vals[$i]{$fn} = $v; - $i++; - } - } - $template->param($field => \@loop_vals); - } - else # not a loop field - { - my $value = $get_value_fn->($field, $page); - if (defined $value) - { - $template->param($field => $value); - } - } - } -} # field_set_template_values - -# =============================================== -# Private Functions -# --------------------------- - -# Calculate the lookup order -# <module, >module, AZ -# This is crabbed from the PmWiki Markup function -sub add_lookup_order { - my $id = shift; - my $when = shift; - - # may have given an explicit ordering - if ($when =~ /^[A-Z][A-Z]$/o) - { - $Fields{$id}{seq} = $when; - } - else - { - my $cmp = '='; - my $seq_field = $when; - if ($when =~ /^([<>])(.+)$/o) - { - $cmp = $1; - $seq_field = $2; - } - $Fields{$seq_field}{dep}{$id} = $cmp; - if (exists $Fields{$seq_field}{seq} - and defined $Fields{$seq_field}{seq}) - { - $Fields{$id}{seq} = $Fields{$seq_field}{seq} . $cmp; - } - } - if ($Fields{$id}{seq}) - { - foreach my $i (keys %{$Fields{$id}{dep}}) - { - my $m = $Fields{$id}{dep}{$i}; - add_lookup_order($i, "$m$id"); - } - delete $Fields{$id}{dep}; - } -} - -sub build_fields_lookup_order { - - # remove the _first, _last and _middle dummy fields - # because we don't need them anymore - delete $Fields{_first}; - delete $Fields{_last}; - delete $Fields{_middle}; - my %lookup_spec = (); - # Make a hash of the lookup sequences - foreach my $id (sort keys %Fields) - { - my $seq = ($Fields{$id}{seq} - ? $Fields{$id}{seq} - : 'MM'); - if (!exists $lookup_spec{$seq}) - { - $lookup_spec{$seq} = {}; - } - $lookup_spec{$seq}{$id} = 1; - } - - # get the field-lookup order by (a) sorting by lookup_spec - # and (b) sorting by field-name for the fields that registered - # the same field-lookup order - foreach my $ord (sort keys %lookup_spec) - { - push @FieldsLookupOrder, sort keys %{$lookup_spec{$ord}}; - } -} # build_fields_lookup_order - -# standard values deduced from other values -sub field_calculated_values { - my $field_name = shift; - my $page = shift; - - my $value = undef; - - # Exception for titles - # If the title hasn't been found, construct it - if ($field_name eq 'title') - { - $value = pagetitle(IkiWiki::basename($page)); - } - # and set "page" if desired - elsif ($field_name eq 'page') - { - $value = $page; - } - # the page above this page; aka the current directory - elsif ($field_name eq 'parent_page') - { - if ($page =~ m{^(.*)/[-\.\w]+$}o) - { - $value = $1; - } - } - elsif ($field_name eq 'basename') - { - $value = IkiWiki::basename($page); - } - elsif ($config{field_allow_config} - and $field_name =~ /^config-(.*)$/oi) - { - my $cfield = $1; - if (exists $config{$cfield}) - { - $value = $config{$cfield}; - } - } - elsif ($field_name =~ /^(.*)-tagpage$/o) - { - my @array_value = undef; - my $real_fn = $1; - if (exists $config{field_tags}{$real_fn} - and defined $config{field_tags}{$real_fn}) - { - my @values = field_get_value($real_fn, $page); - if (@values) - { - foreach my $tag (@values) - { - if ($tag) - { - my $link = $config{field_tags}{$real_fn} . '/' . $tag; - push @array_value, $link; - } - } - if (wantarray) - { - return @array_value; - } - else - { - $value = join(",", @array_value) if $array_value[0]; - } - } - } - } - return (wantarray ? ($value) : $value); -} # field_calculated_values - -# match field funcs -# page-to-check, wanted -sub match_a_field ($$) { - my $page=shift; - my $wanted=shift; - - # The field name is first; the rest is the match - my $field_name; - my $glob; - if ($wanted =~ /^(\w+)\s+(.*)$/o) - { - $field_name = $1; - $glob = $2; - } - else - { - return IkiWiki::FailReason->new("cannot match field"); - } - - # turn glob into a safe regexp - my $re=IkiWiki::glob2re($glob); - - my $val = IkiWiki::Plugin::field::field_get_value($field_name, $page); - - if (defined $val) { - if ($val=~/^$re$/i) { - return IkiWiki::SuccessReason->new("$re matches $field_name of $page", $page => $IkiWiki::DEPEND_CONTENT, "" => 1); - } - else { - return IkiWiki::FailReason->new("$re does not match $field_name of $page", "" => 1); - } - } - else { - return IkiWiki::FailReason->new("$page does not have a $field_name", "" => 1); - } -} # match_a_field - -# check against individual items of a field -# (treat the field as an array) -# page-to-check, wanted -sub match_a_field_item ($$) { - my $page=shift; - my $wanted=shift; - - # The field name is first; the rest is the match - my $field_name; - my $glob; - if ($wanted =~ /^(\w+)\s+(.*)$/o) - { - $field_name = $1; - $glob = $2; - } - else - { - return IkiWiki::FailReason->new("cannot match field"); - } - - # turn glob into a safe regexp - my $re=IkiWiki::glob2re($glob); - - my @val_array = IkiWiki::Plugin::field::field_get_value($field_name, $page); - - if (@val_array) - { - foreach my $val (@val_array) - { - if (defined $val) { - if ($val=~/^$re$/i) { - return IkiWiki::SuccessReason->new("$re matches $field_name of $page", $page => $IkiWiki::DEPEND_CONTENT, "" => 1); - } - } - } - # not found - return IkiWiki::FailReason->new("$re does not match $field_name of $page", "" => 1); - } - else { - return IkiWiki::FailReason->new("$page does not have a $field_name", "" => 1); - } -} # match_a_field_item - -# =============================================== -# PageSpec functions -# --------------------------- - -package IkiWiki::PageSpec; - -sub match_field ($$;@) { - my $page=shift; - my $wanted=shift; - return IkiWiki::Plugin::field::match_a_field($page, $wanted); -} # match_field - -sub match_destfield ($$;@) { - my $page=shift; - my $wanted=shift; - my %params=@_; - - return IkiWiki::FailReason->new("cannot match destpage") unless exists $params{destpage}; - - # Match the field on the destination page, not the source page - return IkiWiki::Plugin::field::match_a_field($params{destpage}, $wanted); -} # match_destfield - -sub match_field_item ($$;@) { - my $page=shift; - my $wanted=shift; - return IkiWiki::Plugin::field::match_a_field_item($page, $wanted); -} # match_field - -sub match_destfield_item ($$;@) { - my $page=shift; - my $wanted=shift; - my %params=@_; - - return IkiWiki::FailReason->new("cannot match destpage") unless exists $params{destpage}; - - # Match the field on the destination page, not the source page - return IkiWiki::Plugin::field::match_a_field_item($params{destpage}, $wanted); -} # match_destfield - -sub match_field_tagged ($$;@) { - my $page=shift; - my $wanted=shift; - my %params=@_; - - # The field name is first; the rest is the match - my $field_name; - my $glob; - if ($wanted =~ /^(\w+)\s+(.*)$/o) - { - $field_name = $1; - $glob = $2; - } - else - { - return IkiWiki::FailReason->new("cannot match field"); - } - return match_link($page, $glob, linktype => lc($field_name), @_); -} - -sub match_destfield_tagged ($$;@) { - my $page=shift; - my $wanted=shift; - my %params=@_; - - return IkiWiki::FailReason->new("cannot match destpage") unless exists $params{destpage}; - - # Match the field on the destination page, not the source page - return IkiWiki::Plugin::field::match_field_tagged($params{destpage}, $wanted); -} - -# =============================================== -# SortSpec functions -# --------------------------- -package IkiWiki::SortSpec; - -sub cmp_field { - my $field = shift; - error(gettext("sort=field requires a parameter")) unless defined $field; - - my $left = IkiWiki::Plugin::field::field_get_value($field, $a); - my $right = IkiWiki::Plugin::field::field_get_value($field, $b); - - $left = "" unless defined $left; - $right = "" unless defined $right; - return $left cmp $right; -} - -sub cmp_field_natural { - my $field = shift; - error(gettext("sort=field requires a parameter")) unless defined $field; - - eval q{use Sort::Naturally}; - error $@ if $@; - - my $left = IkiWiki::Plugin::field::field_get_value($field, $a); - my $right = IkiWiki::Plugin::field::field_get_value($field, $b); - - $left = "" unless defined $left; - $right = "" unless defined $right; - return Sort::Naturally::ncmp($left, $right); -} - -1; diff --git a/.library/IkiWiki/Plugin/getfield.pm b/.library/IkiWiki/Plugin/getfield.pm deleted file mode 100644 index 971e7ecb..00000000 --- a/.library/IkiWiki/Plugin/getfield.pm +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/perl -# Ikiwiki getfield plugin. -# Substitute field values in the content of the page. -# See plugin/contrib/getfield for documentation. -package IkiWiki::Plugin::getfield; -use strict; -=head1 NAME - -IkiWiki::Plugin::getfield - query the values of fields - -=head1 VERSION - -This describes version B<1.20101101> of IkiWiki::Plugin::getfield - -=cut - -our $VERSION = '1.20101101'; - -=head1 PREREQUISITES - - IkiWiki - IkiWiki::Plugin::field - -=head1 AUTHOR - - Kathryn Andersen (RUBYKAT) - http://github.com/rubykat - -=head1 COPYRIGHT - -Copyright (c) 2009 Kathryn Andersen - -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -=cut - -use IkiWiki 3.00; - -sub import { - hook(type => "getsetup", id => "getfield", call => \&getsetup); - hook(type => "filter", id => "getfield", call => \&do_filter, last=>1); - - IkiWiki::loadplugin("field"); -} - -#--------------------------------------------------------------- -# Hooks -# -------------------------------- - -sub getsetup () { - return - plugin => { - safe => 1, - rebuild => undef, - }, -} - -sub do_filter (@) { - my %params=@_; - my $page = $params{page}; - my $destpage = ($params{destpage} ? $params{destpage} : $params{page}); - - my $page_file=$pagesources{$page}; - my $page_type=pagetype($page_file); - if (defined $page_type) - { - while ($params{content} =~ /{{\$([-\w\/]+#)?[-\w]+}}/) - { - # substitute {{$var}} variables (source-page) - $params{content} =~ s/{{\$([-\w]+)}}/get_field_value($1,$page)/eg; - - # substitute {{$page#var}} variables (source-page) - $params{content} =~ s/{{\$([-\w\/]+)#([-\w]+)}}/get_other_page_field_value($2,$page,$1)/eg; - } - } - - $page_file=$pagesources{$destpage}; - $page_type=pagetype($page_file); - if (defined $page_type) - { - while ($params{content} =~ /{{\+\$([-\w\/]+#)?[-\w]+\+}}/) - { - # substitute {{+$var+}} variables (dest-page) - $params{content} =~ s/{{\+\$([-\w]+)\+}}/get_field_value($1,$destpage)/eg; - # substitute {{+$page#var+}} variables (source-page) - $params{content} =~ s/{{\+\$([-\w\/]+)#([-\w]+)\+}}/get_other_page_field_value($2,$destpage,$1)/eg; - } - } - - return $params{content}; -} # do_filter - -#--------------------------------------------------------------- -# Private functions -# -------------------------------- -sub get_other_page_field_value ($$$) { - my $field = shift; - my $page = shift; - my $other_page = shift; - - my $use_page = bestlink($page, $other_page); - # add a dependency for the page from which we get the value - add_depends($page, $use_page); - - my $val = get_field_value($field, $use_page); - if ($val eq $field) - { - return "${other_page}#$field"; - } - return $val; - -} # get_other_page_field_value - -sub get_field_value ($$) { - my $field = shift; - my $page = shift; - - my $value = IkiWiki::Plugin::field::field_get_value($field,$page); - return $value if defined $value; - - # if there is no value, return the field name. - return $field; -} # get_field_value - -1; diff --git a/.library/IkiWiki/Plugin/license.pm b/.library/IkiWiki/Plugin/license.pm deleted file mode 100644 index 651c039a..00000000 --- a/.library/IkiWiki/Plugin/license.pm +++ /dev/null @@ -1,59 +0,0 @@ -# A plugin for ikiwiki to implement adding a footer with licensing information -# based on a default value taken out of a file. - -# Copyright © 2007, 2008 Thomas Schwinge <tschwinge@gnu.org> -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 2, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Unless overridden with the `meta' plugin, a footer with licensing information -# will be added to every page using a source file `license' (e.g., -# `license.mdwn') (using the same ``locating rules'' as for the sidebar -# plugin). -# -# The state which page's license text was gathered from which source is not -# tracked, so you'll need a full wiki-rebuild if the `license' file is changed. - -package IkiWiki::Plugin::license; - -use warnings; -use strict; -use IkiWiki 2.00; - -my %license; - -sub import -{ - hook (type => "scan", id => "license", call => \&scan); -} - -sub scan (@) -{ - my %params = @_; - my $page = $params{page}; - - return if defined $pagestate{$page}{meta}{license}; - - my $content; - my $license_page = bestlink ($page, "license") || return; - my $license_file = $pagesources{$license_page} || return; - - # Only an optimization to avoid reading the same file again and again. - $license{$license_file} = readfile (srcfile ($license_file)) - unless defined $license{$license_file}; - - $pagestate{$page}{meta}{license} = $license{$license_file}; -} - -1 diff --git a/.library/IkiWiki/Plugin/reset_mtimes.pm b/.library/IkiWiki/Plugin/reset_mtimes.pm deleted file mode 100644 index a168652b..00000000 --- a/.library/IkiWiki/Plugin/reset_mtimes.pm +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright © 2010 Thomas Schwinge <thomas@schwinge.name> - -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 2, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -package IkiWiki::Plugin::reset_mtimes; - -use warnings; -use strict; -use IkiWiki 3.00; - -# This plugin resets pages' / files' mtimes according to the RCS information -# when using --refresh mode. -# -# Note that the files' mtimes are *always* set, even if the file has -# un-committed changes. -# -# <http://ikiwiki.info/bugs/pagemtime_in_refresh_mode/> - -sub import -{ - hook (type => "needsbuild", - id => "reset_mtimes", - call => \&needsbuild); -} - -sub needsbuild (@) -{ - # Only proceed if --gettime is in effect, as we're clearly not intersted in - # this functionality otherwise. - return unless $config{gettime}; - - my $files = shift; - foreach my $file (@$files) - { - # [TODO. Perhaps not necessary. Can this hook ever be called for - # removed pages -- that need to be ``rebuilt'' in the sense that - # they're to be removed?] Don't bother for pages that don't exist - # anymore. - next unless -e "$config{srcdir}/$file"; - - my $page = pagename ($file); - debug ("needsbuild: <$file> <$page>"); - - # Only ever update -- otherwise ikiwiki shall do its own thing. - if (defined $IkiWiki::pagemtime{$page}) - { - debug ("pagemtime: " . $IkiWiki::pagemtime{$page}); - - my $mtime = 0; - eval - { - $mtime = IkiWiki::rcs_getmtime ($file); - }; - if ($@) - { - print STDERR $@; - } - elsif ($mtime > 0) - { - $IkiWiki::pagemtime{$page} = $mtime; - - # We have to set the actual file's mtime too, as otherwise - # ikiwiki will update it again and again. - utime($mtime, $mtime, "$config{srcdir}/$file"); - } - - debug ("pagemtime: " . $IkiWiki::pagemtime{$page}); - } - } -} - -1 diff --git a/.library/IkiWiki/Plugin/texinfo.pm b/.library/IkiWiki/Plugin/texinfo.pm deleted file mode 100644 index 8c651160..00000000 --- a/.library/IkiWiki/Plugin/texinfo.pm +++ /dev/null @@ -1,226 +0,0 @@ -# A GNU Texinfo rendering plugin. - -# Copyright © 2007 Thomas Schwinge <tschwinge@gnu.org> -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 2, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# http://ikiwiki.info/plugins/contrib/texinfo/ - -package IkiWiki::Plugin::texinfo; - -use warnings; -use strict; -use IkiWiki 2.00; - -# From `Ikiwiki/Plugins/teximg.pm'. -sub create_tmp_dir ($) -{ - # Create a temp directory, it will be removed when ikiwiki exits. - my $base = shift; - - my $template = $base . ".XXXXXXXXXX"; - use File::Temp qw (tempdir); - my $tmpdir = tempdir ($template, TMPDIR => 1, CLEANUP => 1); - return $tmpdir; -} - -sub import -{ - hook (type => "filter", id => "texi", call => \&filter); - hook (type => "htmlize", id => "texi", call => \&htmlize); - hook (type => "pagetemplate", id => "texi", call => \&pagetemplate); -} - -my %copyright; -my %license; - -sub filter (@) -{ - my %params = @_; - my $page = $params{page}; - -# TODO. For ``$page eq 'shortcuts''' this fails. Is this expected? - goto out unless defined $pagesources{$page}; - - # Only care for `.texi' files. - goto out unless pagetype ($pagesources{$page}) eq 'texi'; - - # No need to parse twice. - goto out if exists $copyright{$page}; - -# TODO. Check the `meta' plugin about when to do this at all. - $copyright{$page} = undef; - $license{$page} = undef; - # We assume that the copyright and licensing information is to be taken - # from the main `.texi' file. - @_ = split /\n/, $params{content}; - # Do some parsing to cut out the interesting bits, if there are any. - while (defined ($_ = shift @_)) - { - # Did we find a start tag? - last if /^\@copying$/; - } - # Already at the end of the page? - goto out unless defined $_; - while (defined ($_ = shift @_)) - { - # Already at the end of the copying section? (Shouldn't happen.) - goto out if /^\@end\ copying/; - # Found the ``^Copyright'' line? - last if /^Copyright/; - } - # Already at the end of the page? (Shouldn't happen.) - goto out unless defined $_; - # Copyright text will follow. - $copyright{$page} = $_; - while (defined ($_ = shift @_)) - { - # Found the separator of copyright and licensind information? - last if /^$/; - # Already at the end of the copying section? - goto finish if /^\@end\ copying/; - $copyright{$page} .= ' ' . $_; - } - # Already at the end of the page? (Shouldn't happen.) - goto finish unless defined $_; - # Licensing text will follow. - while (defined ($_ = shift @_)) - { - # Already at the end of the copying section? - last if /^\@end\ copying/; - $license{$page} .= ' ' . $_; - } - - finish: - # ``Render'' by hand some stuff that is commonly found in this section. - if (defined $copyright{$page}) - { - $copyright{$page} =~ s/\@copyright{}/©/g; - } - if (defined $license{$page}) - { - $license{$page} =~ s/\@quotation//g; - $license{$page} =~ s/\@end\ quotation//g; - $license{$page} =~ s/\@ignore/<!--/g; - $license{$page} =~ s/\@end\ ignore/-->/g; - } - - out: - return $params{content}; -} - -sub htmlize (@) -{ - my %params = @_; - my $page = $params{page}; - - my $home; - if (defined $pagesources{$page}) - { - $home = $config{srcdir} . '/' . dirname ($pagesources{$page}); - } - else - { - # This happens in the CGI web frontent, when freshly creating a - # `texi'-type page and selecting to ``Preview'' the page before doing a - # ``Save Page''. -# TODO. - $home = $config{srcdir}; - } - - my $pid; - my $sigpipe = 0; - $SIG{PIPE} = sub - { - $sigpipe = 1; - }; - - my $tmp = eval - { - create_tmp_dir ("texinfo") - }; - if (! $@ && - # `makeinfo' can't work directly on stdin. - writefile ("texinfo.texi", $tmp, $params{content}) == 0) - { - return "couldn't write temporary file"; - } - - use File::Basename; - use IPC::Open2; - $pid = open2 (*IN, *OUT, - 'makeinfo', - '--html', - '--no-split', '--output=-', - # We might be run from a directory different from the one the - # `.texi' file is stored in. -# TODO. Should we `cd' to this directory instead? - '-P', $home, -# TODO. Adding the following allows for putting files like `gpl.texinfo' into -# the top-level wiki directory. - '-I', $config{srcdir}, - $tmp . "/texinfo.texi"); - # open2 doesn't respect "use open ':utf8'" - binmode (IN, ':utf8'); -# binmode (OUT, ':utf8'); - -# print OUT $params{content}; - close OUT; - - local $/ = undef; - my $ret = <IN>; - close IN; - waitpid $pid, 0; - $SIG{PIPE} = "DEFAULT"; - - return "failed to render" if $sigpipe; - - # Cut out the interesting bits. - $ret =~ s/.*<body>//s; - $ret =~ s/<\/body>.*//s; - - return $ret; -} - -sub pagetemplate (@) -{ - my %params = @_; - my $page = $params{page}; - my $destpage = $params{destpage}; - - my $template = $params{template}; - -# TODO. Check the `meta' plugin about when to do this at all. - if ($template->query (name => "copyright") && - ! defined $template->param ('copyright')) - { - if (defined $copyright{$page} && length $copyright{$page}) - { - $template->param (copyright => - IkiWiki::linkify ($page, $destpage, $copyright{$page})); - } - } - if ($template->query (name => "license") && - ! defined $template->param ('license')) - { - if (defined $license{$page} && length $license{$page}) - { - $template->param (license => - IkiWiki::linkify ($page, $destpage, $license{$page})); - } - } -} - -1 diff --git a/.library/IkiWiki/Plugin/ymlfront.pm b/.library/IkiWiki/Plugin/ymlfront.pm deleted file mode 100644 index 9c033833..00000000 --- a/.library/IkiWiki/Plugin/ymlfront.pm +++ /dev/null @@ -1,434 +0,0 @@ -#!/usr/bin/perl -# YAML format for structured data -# See plugins/contrib/ymlfront for documentation. -package IkiWiki::Plugin::ymlfront; -use warnings; -use strict; -=head1 NAME - -IkiWiki::Plugin::ymlfront - add YAML-format data to a page - -=head1 VERSION - -This describes version B<1.20100808> of IkiWiki::Plugin::ymlfront - -=cut - -our $VERSION = '1.20101116'; - -=head1 PREREQUISITES - - IkiWiki - IkiWiki::Plugin::field - YAML::Any - -=head1 AUTHOR - - Kathryn Andersen (RUBYKAT) - http://github.com/rubykat - -=head1 COPYRIGHT - -Copyright (c) 2009 Kathryn Andersen - -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -=cut -use IkiWiki 3.00; - -sub import { - hook(type => "getsetup", id => "ymlfront", call => \&getsetup); - hook(type => "checkconfig", id => "ymlfront", call => \&checkconfig); - hook(type => "filter", id => "ymlfront", call => \&filter, first=>1); - hook(type => "preprocess", id => "ymlfront", call => \&preprocess, scan=>1); - hook(type => "scan", id => "ymlfront", call => \&scan); - hook(type => "checkcontent", id => "ymlfront", call => \&checkcontent); - - IkiWiki::loadplugin('field'); - IkiWiki::Plugin::field::field_register(id=>'ymlfront', - call=>\&yml_get_value, - first=>1); -} - -# ------------------------------------------------------------ -# Package Vars -# -------------------------------- -my $ymlfront_regex = qr{ - (\\?) # 1: escape? - \[\[(!) # directive open; 2: prefix - (ymlfront) # 3: command - ( # 4: the parameters.. - \s+ # Must have space if parameters present - (?: - (?:[-\w]+=)? # named parameter key? - (?: - """.*?""" # triple-quoted value - | - "[^"]*?" # single-quoted value - | - [^"\s\]]+ # unquoted value - ) - \s* # whitespace or end - # of directive - ) - *)? # 0 or more parameters - \]\] # directive closed - }sx; - -# ------------------------------------------------------------ -# Hooks -# -------------------------------- -sub getsetup () { - return - plugin => { - safe => 1, - rebuild => 1, - }, - ymlfront_delim => { - type => "array", - example => "ymlfront_sep => [qw(--YAML-START-- --YAML-END--)]", - description => "delimiters of YAML data", - safe => 0, - rebuild => undef, - }, -} - -sub checkconfig () { - eval q{use YAML::Any}; - eval q{use YAML} if $@; - if ($@) - { - return error ("ymlfront: failed to use YAML::Any or YAML"); - } - - $YAML::UseBlock = 1; - $YAML::Syck::ImplicitUnicode = 1; - - if (!defined $config{ymlfront_delim}) - { - $config{ymlfront_delim} = [qw(--- ---)]; - } -} # checkconfig - -# scan gets called before filter -sub scan (@) { - my %params=@_; - my $page = $params{page}; - - my $page_file=$pagesources{$page} || return; - my $page_type=pagetype($page_file); - if (!defined $page_type) - { - return; - } - # clear the old data - if (exists $pagestate{$page}{ymlfront}) - { - delete $pagestate{$page}{ymlfront}; - } - my $parsed_yml = parse_yml(%params); - if (defined $parsed_yml - and defined $parsed_yml->{yml}) - { - # save the data to pagestate - foreach my $fn (keys %{$parsed_yml->{yml}}) - { - my $fval = $parsed_yml->{yml}->{$fn}; - $pagestate{$page}{ymlfront}{$fn} = $fval; - } - } - # update meta hash - if (exists $pagestate{$page}{ymlfront}{title} - and $pagestate{$page}{ymlfront}{title}) - { - $pagestate{$page}{meta}{title} = $pagestate{$page}{ymlfront}{title}; - } - if (exists $pagestate{$page}{ymlfront}{description} - and $pagestate{$page}{ymlfront}{description}) - { - $pagestate{$page}{meta}{description} = $pagestate{$page}{ymlfront}{description}; - } - if (exists $pagestate{$page}{ymlfront}{author} - and $pagestate{$page}{ymlfront}{author}) - { - $pagestate{$page}{meta}{author} = $pagestate{$page}{ymlfront}{author}; - } -} # scan - -# use this for data in a [[!ymlfront ...]] directive -sub preprocess (@) { - my %params=@_; - my $page = $params{page}; - - if (! exists $params{data} - or ! defined $params{data} - or !$params{data}) - { - error gettext("missing data parameter") - } - # All the work of this is done in scan mode; - # when in preprocessing mode, just return an empty string. - my $scan=! defined wantarray; - - if (!$scan) - { - return ''; - } - - # clear the old data - if (exists $pagestate{$page}{ymlfront}) - { - delete $pagestate{$page}{ymlfront}; - } - my $parsed_yml = parse_yml(%params); - if (defined $parsed_yml - and defined $parsed_yml->{yml}) - { - # save the data to pagestate - foreach my $fn (keys %{$parsed_yml->{yml}}) - { - my $fval = $parsed_yml->{yml}->{$fn}; - $pagestate{$page}{ymlfront}{$fn} = $fval; - } - } - # update meta hash - if (exists $pagestate{$page}{ymlfront}{title} - and $pagestate{$page}{ymlfront}{title}) - { - $pagestate{$page}{meta}{title} = $pagestate{$page}{ymlfront}{title}; - } - if (exists $pagestate{$page}{ymlfront}{description} - and $pagestate{$page}{ymlfront}{description}) - { - $pagestate{$page}{meta}{description} = $pagestate{$page}{ymlfront}{description}; - } - if (exists $pagestate{$page}{ymlfront}{author} - and $pagestate{$page}{ymlfront}{author}) - { - $pagestate{$page}{meta}{author} = $pagestate{$page}{ymlfront}{author}; - } - return ''; -} # preprocess - -sub filter (@) { - my %params=@_; - my $page = $params{page}; - - my $page_file=$pagesources{$page} || return $params{content}; - my $page_type=pagetype($page_file); - if (!defined $page_type) - { - return $params{content}; - } - my $parsed_yml = parse_yml(%params); - if (defined $parsed_yml - and defined $parsed_yml->{yml} - and defined $parsed_yml->{content}) - { - $params{content} = $parsed_yml->{content}; - # also check for a content value - if (exists $pagestate{$page}{ymlfront}{content} - and defined $pagestate{$page}{ymlfront}{content} - and $pagestate{$page}{ymlfront}{content}) - { - $params{content} .= $pagestate{$page}{ymlfront}{content}; - } - } - - return $params{content}; -} # filter - -# check the correctness of the YAML code before saving a page -sub checkcontent { - my %params=@_; - my $page = $params{page}; - - my $page_file=$pagesources{$page}; - if ($page_file) - { - my $page_type=pagetype($page_file); - if (!defined $page_type) - { - return undef; - } - } - my $parsed_yml = parse_yml(%params); - if (!defined $parsed_yml) - { - debug("ymlfront: Save of $page failed: $@"); - return gettext("YAML data incorrect: $@"); - } - return undef; -} # checkcontent - -# ------------------------------------------------------------ -# Field functions -# -------------------------------- -sub yml_get_value ($$) { - my $field_name = shift; - my $page = shift; - - my $value = undef; - if (exists $pagestate{$page}{ymlfront}{$field_name}) - { - $value = $pagestate{$page}{ymlfront}{$field_name}; - } - elsif (exists $pagestate{$page}{ymlfront}{lc($field_name)}) - { - $value = $pagestate{$page}{ymlfront}{lc($field_name)}; - } - if (defined $value) - { - if (ref $value) - { - my @value_array = @{$value}; - return (wantarray - ? @value_array - : join(",", @value_array)); - } - else - { - return (wantarray ? ($value) : $value); - } - } - return undef; -} # yml_get_value - -# ------------------------------------------------------------ -# Helper functions -# -------------------------------- - -# parse the YAML data from the given content -# Expects page, content -# Returns { yml=>%yml_data, content=>$content } or undef -sub parse_yml { - my %params=@_; - my $page = $params{page}; - my $content = $params{content}; - - my $page_file=$pagesources{$page}; - if ($page_file) - { - my $page_type=pagetype($page_file); - if (!defined $page_type) - { - return undef; - } - } - my $start_of_content = ''; - my $yml_str = ''; - my $rest_of_content = ''; - if ($params{data}) - { - $yml_str = $params{data}; - } - elsif ($content) - { - my $ystart = $config{ymlfront_delim}[0]; - my $yend = $config{ymlfront_delim}[1]; - if ($ystart eq '---' - and $yend eq '---' - and $content =~ /^---[\n\r](.*?[\n\r])---[\n\r](.*)$/s) - { - $yml_str = $1; - $rest_of_content = $2; - } - elsif ($content =~ /^(.*?)${ystart}[\n\r](.*?[\n\r])${yend}([\n\r].*)$/s) - { - $yml_str = $2; - $rest_of_content = $1 . $3; - } - elsif ($content =~ $ymlfront_regex) - { - my $escape=$1; - my $prefix=$2; - my $command=$3; - my $params=$4; - if ($escape) - { - $rest_of_content = $content; - } - else - { - my %phash = (); - while ($params =~ m{ - (?:([-\w]+)=)? # 1: named parameter key? - (?: - """(.*?)""" # 2: triple-quoted value - | - "([^"]*?)" # 3: single-quoted value - | - (\S+) # 4: unquoted value - ) - (?:\s+|$) # delimiter to next param - }sgx) { - my $key=$1; - my $val; - if (defined $2) { - $val=$2; - $val=~s/\r\n/\n/mg; - $val=~s/^\n+//g; - $val=~s/\n+$//g; - } - elsif (defined $3) { - $val=$3; - } - elsif (defined $4) { - $val=$4; - } - - if (defined $key) { - $phash{$key} = $val; - } - else { - $phash{''} = $val; - } - } - if (defined $phash{data}) - { - $yml_str = $phash{data}; - $content =~ /^(.*?)\[\[!ymlfront.*?\]\](.*?)$/s; - $start_of_content = $1; - $rest_of_content = $2; - # TODO: This breaks if the YAML string itself contains ]]. - # Workaround: all [[!ymlfront [...]]] directives shall be - # at the end of the files. - $rest_of_content = ''; - } - } - } - } - if ($yml_str) - { - # if {{$page}} is there, do an immediate substitution - $yml_str =~ s/\{\{\$page\}\}/$page/sg; - - my $ydata; - eval q{$ydata = Load($yml_str);}; - if ($@) - { - debug("ymlfront: Load of $page failed: $@"); - return undef; - } - if (!$ydata) - { - debug("ymlfront: no YAML for $page"); - return undef; - } - my %lc_data = (); - if ($ydata) - { - # make lower-cased versions of the data - foreach my $fn (keys %{$ydata}) - { - my $fval = $ydata->{$fn}; - $lc_data{lc($fn)} = $fval; - } - } - return { yml=>\%lc_data, - content=>$start_of_content . $rest_of_content}; - } - return { yml=>undef, content=>$content }; -} # parse_yml -1; |