use CGI ':all';
use strict;
use Digest::MD5 qw(md5_hex);

use vars qw/%metadata $rx_nl $debug__/;

$rx_nl = '(?:\r\n|\n|\r)';  # portable newline matching regexp
$debug__ = 0;

sub sub_template {
	my ($text, %map) = @_;
	for my $name (keys %map) {
		my $value = $map{$name}; $value =~ s/$rx_nl*$//;
		$text =~ s/\$$name\b/$value/ge;
	}
	return $text; }

sub ohno {
	my $line = (caller)[2];
	my $msg = "@_" || "Something is wrong; line $line";
	print header();
	print '<font color="red"><h1>'.$msg.'</h1></font>';
	exit(0); }

sub slurp {
	my ($file) = @_;
	open SLURP__H, $file;
	my $text = join '', <SLURP__H>;
	close SLURP__H;
	return $text; }

sub belch {
	my ($text, $file) = @_;
	open DUMP__H, ">$file" or return 0;
	print DUMP__H $text; return 1; }

sub copy { # XXX this is NOT ideal, should stream data
	my ($file, $dest) = @_;
	my $text = slurp($file);
	belch($text, $dest);
}

sub debug {
	$debug__++ or print header();
	print map {my $x = escapeHTML($_); "<pre>$x</pre>"} @_;
	print "<hr>"; }

#sub which_edit_button {
#	return param('Section');
#	my $params = $query->Vars;
#	for (keys %$params) { if (s/^Edit_//) { return $_; } }
#	ohno("no button was pressed!"); }

#sub html2wiki {
#	local $_ = $_[0];
#	s/<br>$//gm;
#	s:&nbsp;: :g;
#	return $_; }

#sub wiki2html {
#	local $_ = $_[0];
#	chomp;
#	s/$/<br>/gm; s/<br>$//;
#	s/( +) /("&nbsp;" x length($1))." "/ge;
#	return $_; }

sub read_metadata {
	my ($html) = @_;
	%metadata = ();
	while ($html =~ /<!-- :(.*?):\s*(.*?)\s*-->/sg) {
		my ($key, $value) = ($1, $2);
		$value =~ s/----/--/gs;
		$metadata{$key} = $value;
	}	
}

sub write_metadata {
	$_[0] =~ s/\s*\z/\n/;

	for my $key (sort keys %metadata) {
		my $value = $metadata{$key};
		$value =~ s/--/----/sg;
		chomp $value;
		if ($value =~ /\n/s) { $value = "\n$value\n"; }
		$_[0] =~ s/<!-- :\Q$key\E:\s*(.*?)\s*-->/"<!-- :$key: $value -->"/se or
		  $_[0] .= "<!-- :$key: $value -->\n";
	}
}

sub oneway {
	my ($pass, $key) = @_;
	return md5_hex("$pass $key");
}

1

