aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Setup/Standard.pm
blob: bdf52f25a58da20e688b1081cf18de4b4cc568ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/perl
# Standard ikiwiki setup module.
# Parameters to import should be all the standard ikiwiki config stuff,
# plus an array of wrappers to set up.

package IkiWiki::Setup::Standard;

use warnings;
use strict;
use IkiWiki;

sub import {
	IkiWiki::Setup::merge($_[1]);
}

sub dumpline ($$$$) {
	my $key=shift;
	my $value=shift;
	my $type=shift;
	my $prefix=shift;
	
	eval q{use Data::Dumper};
	error($@) if $@;
	local $Data::Dumper::Terse=1;
	local $Data::Dumper::Indent=1;
	local $Data::Dumper::Pad="\t";
	local $Data::Dumper::Sortkeys=1;
	local $Data::Dumper::Quotekeys=0;
	# only the perl version preserves utf-8 in output
	local $Data::Dumper::Useperl=1;
	
	my $dumpedvalue;
	if (($type eq 'boolean' || $type eq 'integer') && $value=~/^[0-9]+$/) {
		# avoid quotes
		$dumpedvalue=$value;
	}
	elsif (ref $value eq 'ARRAY' && @$value && ! grep { /[^\S]/ } @$value) {
		# dump simple array as qw{}
		$dumpedvalue="[qw{".join(" ", @$value)."}]";
	}
	else {
		$dumpedvalue=Dumper($value);
		chomp $dumpedvalue;
		if (length $prefix) {
			# add to second and subsequent lines
			my @lines=split(/\n/, $dumpedvalue);
			$dumpedvalue="";
			for (my $x=0; $x <= $#lines; $x++) {
				$lines[$x] =~ s/^\t//;
				$dumpedvalue.="\t".($x ? $prefix : "").$lines[$x]."\n";
			}
		}
		$dumpedvalue=~s/^\t//;
		chomp $dumpedvalue;
	}
	
	return "\t$prefix$key => $dumpedvalue,";
}

sub dumpvalues ($@) {
	my $setup=shift;
	my @ret;
	while (@_) {
		my $key=shift;
		my %info=%{shift()};

		next if $key eq "plugin" || $info{type} eq "internal";
		
		push @ret, "\t# ".$info{description} if exists $info{description};
		
		if (exists $setup->{$key} && defined $setup->{$key}) {
			push @ret, dumpline($key, $setup->{$key}, $info{type}, "");
			delete $setup->{$key};
		}
		elsif (exists $info{example}) {
			push @ret, dumpline($key, $info{example}, $info{type}, "#");
		}
		else {
			push @ret, dumpline($key, "", $info{type}, "#");
		}
	}
	return @ret;
}

sub gendump ($) {
	my $description=shift;
	my %setup=(%config);
	my @ret;
	
	# disable logging to syslog while dumping
	$config{syslog}=undef;

	eval q{use Text::Wrap};
	die $@ if $@;

	my %section_plugins;
	push @ret, dumpvalues(\%setup, IkiWiki::getsetup());
	foreach my $pair (IkiWiki::Setup::getsetup()) {
		my $plugin=$pair->[0];
		my $setup=$pair->[1];
		my %s=@{$setup};
		my $section=$s{plugin}->{section};
		push @{$section_plugins{$section}}, $plugin;
		if (@{$section_plugins{$section}} == 1) {
			push @ret, "", "\t#", "\t# $section plugins",
				sub {
					wrap("\t#   (", "\t#   ",
						join(", ", @{$section_plugins{$section}})).")"
				},
				"\t#";
		}

		my @values=dumpvalues(\%setup, @{$setup});
		if (@values) {
			push @ret, "", "\t# $plugin plugin", @values;
		}
	}

	unshift @ret,
		"#!/usr/bin/perl",
		"# $description",
		"#",
		"# Passing this to ikiwiki --setup will make ikiwiki generate",
		"# wrappers and build the wiki.",
		"#",
		"# Remember to re-run ikiwiki --setup any time you edit this file.",
		"use IkiWiki::Setup::Standard {";
	push @ret, "}";

	return map { ref $_ ? $_->() : $_ } @ret;
}

1