diff options
Diffstat (limited to 'ikiwiki-transition')
-rwxr-xr-x | ikiwiki-transition | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/ikiwiki-transition b/ikiwiki-transition new file mode 100755 index 000000000..1fd23cec5 --- /dev/null +++ b/ikiwiki-transition @@ -0,0 +1,66 @@ +#!/usr/bin/perl -i +use warnings; +use strict; + +my $regex = qr{ + (\\?) # 1: escape? + \[\[(!?) # directive open; 2: optional prefix + ([-\w]+) # 3: command + ( # 4: the parameters (including initial whitespace) + \s+ + (?: + (?:[-\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; + +sub handle_directive { + my $escape = shift; + my $prefix = shift; + my $directive = shift; + my $args = shift; + + if (length $escape) { + return "${escape}[[${prefix}${directive}${args}]]" + } + if ($directive =~ m/^(if|more|table|template|toggleable)$/) { + $args =~ s{$regex}{handle_directive($1, $2, $3, $4)}eg; + } + return "[[!${directive}${args}]]" +} + +sub prefix_directives { + $/=undef; # process whole files at once + + while (<>) { + s{$regex}{handle_directive($1, $2, $3, $4)}eg; + print; + } +} + +sub usage { + print STDERR "Usage: ikiwiki-transition type file ...\n"; + print STDERR "Currently supported transition types:\n"; + print STDERR " prefix_directives\n"; + exit 1; +} + +usage() unless @ARGV; + +my $mode=shift; +if ($mode eq 'prefix_directives') { + prefix_directives(@ARGV); +} +else { + usage(); +} |