X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/ee1ad53c4c2710aa7ded61bdc56f3a8cce514f22..f6e6d561e9d0269d8b52bf926adb3f782e777bde:/IkiWiki/Plugin/table.pm

diff --git a/IkiWiki/Plugin/table.pm b/IkiWiki/Plugin/table.pm
index 698f9c9b6..11474c8f0 100644
--- a/IkiWiki/Plugin/table.pm
+++ b/IkiWiki/Plugin/table.pm
@@ -3,6 +3,7 @@ package IkiWiki::Plugin::table;
 
 use warnings;
 use strict;
+use Encode;
 use IkiWiki 2.00;
 
 sub import { #{{{
@@ -21,6 +22,7 @@ sub preprocess (@) { #{{{
 			return "[[table ".gettext("cannot find file")."]]";
 		}
 		$params{data} = readfile(srcfile($params{file}));
+		add_depends($params{page}, $params{file});
 	}
 
 	if (lc $params{format} eq 'auto') {
@@ -35,10 +37,28 @@ sub preprocess (@) { #{{{
 
 	my @data;
 	if (lc $params{format} eq 'csv') {
-		@data=split_csv($params{data}, $params{delimiter});
+		@data=split_csv($params{data},
+			defined $params{delimiter} ? $params{delimiter} : ",",);
+		# linkify after parsing since html link quoting can
+		# confuse CSV parsing
+		if (! exists $params{file}) {
+			@data=map {
+				[ map {
+					IkiWiki::linkify($params{page},
+						$params{destpage}, $_);
+				} @$_ ]
+			} @data;
+		}
 	}
 	elsif (lc $params{format} eq 'dsv') {
-		@data=split_dsv($params{data}, $params{delimiter});
+		# linkify before parsing since wikilinks can contain the
+		# delimiter
+		if (! exists $params{file}) {
+			$params{data} = IkiWiki::linkify($params{page},
+				$params{destpage}, $params{data});
+		}
+		@data=split_dsv($params{data},
+			defined $params{delimiter} ? $params{delimiter} : "|",);
 	}
 	else {
 		return "[[table ".gettext("unknown data format")."]]";
@@ -59,7 +79,7 @@ sub preprocess (@) { #{{{
 	push @lines, "\t<thead>",
 		genrow($params{page}, $params{destpage}, "th", @$header),
 	        "\t</thead>" if defined $header;
-	push @lines, "\t<tbody>";
+	push @lines, "\t<tbody>" if defined $header;
 	push @lines, genrow($params{page}, $params{destpage}, "td", @$_)
 		foreach @data;
 	push @lines, "\t</tbody>" if defined $header;
@@ -90,8 +110,9 @@ sub split_csv ($$) { #{{{
 	eval q{use Text::CSV};
 	error($@) if $@;
 	my $csv = Text::CSV->new({ 
-		sep_char	=> defined $delimiter ? $delimiter : ",",
+		sep_char	=> $delimiter,
 		binary		=> 1,
+		allow_loose_quotes => 1,
 	}) || error("could not create a Text::CSV object");
 	
 	my $l=0;
@@ -99,7 +120,7 @@ sub split_csv ($$) { #{{{
 	foreach my $line (@text_lines) {
 		$l++;
 		if ($csv->parse($line)) {
-			push(@data, [ $csv->fields() ]);
+			push(@data, [ map { decode_utf8 $_ } $csv->fields() ]);
 		}
 		else {
 			debug(sprintf(gettext('parse fail at line %d: %s'), 
@@ -153,17 +174,9 @@ sub genrow ($$$@) { #{{{
 sub htmlize ($$$) { #{{{
 	my $page = shift;
 	my $destpage = shift;
-	my $text = shift;
-
-	$text=IkiWiki::htmlize($page, pagetype($pagesources{$page}),
-		IkiWiki::preprocess($page, $destpage, $text));
-
-	# hack to get rid of enclosing junk added by markdown
-	$text=~s!^<p>!!;
-	$text=~s!</p>$!!;
-	chomp $text;
 
-	return $text;
+	return IkiWiki::htmlize($page, $destpage, pagetype($pagesources{$page}),
+		IkiWiki::preprocess($page, $destpage, shift));
 }
 
 1