countries: indicate code references in description
[sheet.git] / source.plp
index 83a583385966b1b4285c0522667959ef294af682..7b0ebec82552e55bb6a09bef911ea6c50c6cff0d 100644 (file)
@@ -3,9 +3,32 @@
 my $source = $ENV{PATH_INFO};
 $source =~ s{^/}{};
 
+if ($source =~ s{(?<=\Q.inc.pl\E)/jsonp?$}{} and -r $source) {
+       # convert perl include to json construct
+       checkmodified($source);
+       eval {
+               my $data = do $source or die $@ || $! || 'read error';
+               require JSON;
+               my $converter = JSON->new;
+               $converter->utf8->indent->space_after->canonical;
+
+               $header{content_type} = 'application/json';
+               $header{content_type} = 'text/plain' if exists $get{debug};
+               print $_, '(' for $get{callback} // ();
+               print $converter->encode($data);
+               print     ')' for $get{callback} // ();
+               return 1;
+       } or do {
+               $header{status} = '500 File unavailable';
+               $header{content_type} = 'text/plain';
+               print "Conversion failed: $@";
+       };
+       exit;
+}
+
 Html({
        title => "$source source code",
-       version => 'v1.0',
+       version => 'v1.1',
        description => !$source ? 'Index of source files for this site.' : [
                "Source code of the $source file at this site,",
                "with syntax highlighted and references linked."
@@ -37,7 +60,7 @@ else {
        }
        elsif ($source =~ s{::}{/}g or !-e $source) {
                $source .= '.pm';
-               for (0 .. $#{@INC}) {
+               for (0 .. $#INC) {
                        -e ($_ = "$INC[$_]/$source") or next;
                        $source = $_;
                        last;
@@ -45,6 +68,7 @@ else {
        }
        -r $source or die "Requested file not found\n";
 
+       require Encode;
        if (eval { require Text::VimColor and Text::VimColor->VERSION(0.12) }) {
                delete $Text::VimColor::SYNTAX_TYPE{Underlined};
                my %TYPETAG = (
@@ -70,13 +94,15 @@ else {
                        if (!$_->[0] and $_->[1] =~ s/^(\s*)([A-Z]\w+(?:::\w+)+)(?![^;\s])//) {
                                printf '%s<a href="%s">%s</a>', $1, "/source/$2", $2;
                        }
-                       print Text::VimColor::_xml_escape($_->[1]);
+                       print Text::VimColor::_xml_escape(Encode::decode_utf8($_->[1]));
                        print "</$tag>" if $tag;
                }
                print "</pre>\n";
        }
        else {
-               print "<pre>\n", EscapeHTML(ReadFile($source)), "</pre>\n";
+               print "<pre>\n";
+               print EscapeHTML(Encode::decode_utf8(ReadFile($source)));
+               print "</pre>\n";
        }
 
        print "\n";