X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/4142c02f738ac119086509aa979ead5146b32a52..14609ab92d01133c6b13fac5c5ae5336d512e8dd:/IkiWiki/Plugin/table.pm diff --git a/IkiWiki/Plugin/table.pm b/IkiWiki/Plugin/table.pm index c7b664052..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 { #{{{ @@ -22,10 +23,6 @@ sub preprocess (@) { #{{{ } $params{data} = readfile(srcfile($params{file})); } - else { - $params{data} = IkiWiki::linkify($params{page}, - $params{destpage}, $params{data}); - } if (lc $params{format} eq 'auto') { # first try the more simple format @@ -39,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")."]]"; @@ -94,7 +109,7 @@ 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"); @@ -104,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'),