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

diff --git a/IkiWiki/Plugin/table.pm b/IkiWiki/Plugin/table.pm
index 698f9c9b6..e8df17487 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 { #{{{
@@ -35,10 +36,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")."]]";
@@ -90,8 +109,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 +119,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'),