1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
# outlines groups of similar characters
# 2003-11-24 15:07:28 Created by nsg
# 2004-06-18 14:29:45 changed hex boxset to x; added double, horz, vert boxsets
use strict;
use utf8;
use Getopt::Std;
our (
$opt_s, # boxset (x=hex)
$opt_d, # double each input character
$opt_e, # output encoding
);
getopts("s:de:");
$opt_s='s' if '' eq $opt_s;
$opt_e='utf8' if '' eq $opt_e;
binmode (STDIN, ":encoding($opt_e)");
binmode (STDOUT, ":encoding($opt_e)");
#binmode (STDOUT, ":encoding(utf8)");
my $p='';
my %boxset=(
# 1|.,'}\u{25',"1 (_2 ]\ o_utf8) {~ 4#.2*#:i.16
's'=>" \x{2502}\x{2500}\x{2514}\x{2502}\x{2502}\x{250c}\x{251c}\x{2500}\x{2518}\x{2500}\x{2534}\x{2510}\x{2524}\x{252c}\x{253c}\n",
'd'=>" \x{2551}\x{2550}\x{255a}\x{2551}\x{2551}\x{2554}\x{2560}\x{2550}\x{255d}\x{2550}\x{2569}\x{2557}\x{2563}\x{2566}\x{256c}\n",
'h'=>" \x{2502}\x{2550}\x{2558}\x{2502}\x{2502}\x{2552}\x{255e}\x{2550}\x{255b}\x{2550}\x{2567}\x{2555}\x{2561}\x{2564}\x{256a}\n",
'v'=>" \x{2551}\x{2500}\x{2559}\x{2551}\x{2551}\x{2553}\x{255f}\x{2500}\x{255c}\x{2500}\x{2568}\x{2556}\x{2562}\x{2565}\x{256b}\n",
);
my $BOX=$boxset{$opt_s} || $boxset{'s'};
# corners/splits:
# ┌┬┐╓╥╖╒╤╕╔╦╗ 6ec
# ├┼┤╟╫╢╞╪╡╠╬╣ 7fd
# └┴┘╙╨╜╘╧╛╚╩╝ 3b9
# round corners:
# 256d 256e
# 2570 256f
# horizontal
# ═ ─
# vertical
# │ ║
while(<STDIN>){
chomp;
s/./$&$&/g if $opt_d;
process_line();
$p=$_;
}
$_='';
process_line();
sub process_line
{
my $out;
my $l=length;
$l=length($p) if length($p)>$l;
for my$i(0..$l) {
my $c=0;
$c|=1 if sc($p,$i-1) ne sc($p,$i);
$c|=2 if sc($p,$i) ne sc($_,$i);
$c|=4 if sc($_,$i) ne sc($_,$i-1);
$c|=8 if sc($_,$i-1) ne sc($p,$i-1);
$out.=substr($BOX,$c,1) if 'x' ne $opt_s;
$out.=sprintf"%1x",$c if 'x' eq $opt_s;
}
print "$out\n";
}
sub sc # (str, index)
{
return ' ' if 0>$_[1] || $_[1]>=length($_[0]);
return substr($_[0],$_[1],1);
}
|