Permalink
Fetching contributors…
Cannot retrieve contributors at this time
executable file 109 lines (91 sloc) 2.1 KB
#!/usr/bin/env perl
# Copyright (c) 2015 Christian Jaeger, copying@christianjaeger.ch
# This is free software. See the file COPYING.md that came bundled
# with this file.
use strict; use warnings; use warnings FATAL => 'uninitialized';
# find modules from functional-perl working directory (not installed)
use Cwd 'abs_path';
our ($mydir, $myname); BEGIN {
my $location= (-l $0) ? abs_path ($0) : $0;
$location=~ /(.*?)([^\/]+?)_?\z/s or die "?";
($mydir, $myname)=($1,$2);
}
use lib "$mydir/../lib";
sub usage {
print "usage: $myname < file.diff > file-diff.html
Turn a textual diff as output by `git diff` into HTML format with
some coloring.
Uses streaming and hence works with arbitrarily long inputs.
";
exit (@_ ? 1 : 0);
}
use Getopt::Long;
our $verbose=0;
GetOptions("verbose"=> \$verbose,
"help"=> sub{usage},
) or exit 1;
usage if @ARGV;
use Method::Signatures;
use FP::Stream ":all";
use FP::IOStream ":all";
use PXML::Serialize qw(puthtmlfile);
use PXML::XHTML ":all";
use FP::Ops ":all";
use Chj::xopen "glob_to_fh";
our $lines=
fh_to_stream (glob_to_fh (*STDIN, "utf-8"),
the_method("xreadline_chomp"),
the_method("xclose"));
our $html=
HTML
(HEAD
(TITLE ($myname),
META ({'http-equiv'=> "Content-Type",
content=> "text/html;charset=utf-8"}),
STYLE({type=> "text/css"},
'
.diff {
color: #008;
border-top: 1px solid;
margin-top: 20px;
padding-top: 10px;
}
.meta {
color: #008;
}
.position {
color: blue;
}
.add {
color: green;
}
.del {
color: red;
}
.context {
color: black;
}
.other {
color: orange;
}
'),
BODY
(PRE
(stream_map
func ($line) {
DIV ({class=> ($line=~ /^diff / ? "diff" :
$line=~ /^(index|new|\+\+\+|---) / ? "meta" :
do {
my $c= substr $line,0,1;
($c eq '@' ? "position" :
$c eq '+' ? "add" :
$c eq '-' ? "del" :
$c eq ' ' ? "context" :
"other")
})},
$line)
},
$lines))));
puthtmlfile ("-", $html);
# TODO: why have `puthtmlfile` to write to magic "-" file as
# filehandle, but do glob_to_fh etc. manipulation?