aboutsummaryrefslogtreecommitdiff
path: root/vim/boxdraw/bdua2b.pl
blob: 2e94b9ae04cbca4aea0dddf68885bd8f1d6a7043 (plain)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# Convert +-| style drawings into utf characters
# BoxDraw-unicode-ascii to box
# 2003-11-24 10:12:22 created by nsg
# 2003-11-25 13:16:17 renamed and small fix in "intelligence"
# 2004-06-18 14:18:11 boxsets
# 2004-06-21 21:41:30 hex input codes
use strict;
use utf8;
use 5.8.0;
use Getopt::Std;

our (
  $opt_s, # boxset 's', 'd', 'v' or 'h'
  $opt_x, # convert hex digits into appropriate bd characters
  $opt_t, # ternary codes ' ' .. 'p' 
);
getopts("s:xt");
$opt_s||='s';

my $o_utf8='--0251--001459--50585a----------0202----0c1c----525e------------51--51--53--5f--54--60------------------------------------------00185c--003468------------------1024----2c3c--------------------56--62--65--6b--------------------------------------------------505b5d----------506769----------5561------------646a------------57--63----------66--6c------------------------------------------------------------------01';

binmode (STDOUT, ":utf8");
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'};

my $prev='';
my $pprev='';
while(<STDIN>) {
  process_line();
}
process_line();

sub process_line
{
 my $out='';
 for(my $i=0; $i<length($prev); ++$i) {
   my $code=0;
   my $c=substr($prev,$i,1);
   if( $opt_x ) {
     $code=0;
     $code=hex($c) if $c=~/[[:xdigit:]]/;
   } elsif( $opt_t ) {
     $code=0;
     if( ord($c)>32 ) {
       $c=ord($c)-32;
       for(0..3){$code =($code>>2)+(($c%3)<<6); $c=int($c/3);}
       $c=chr(hex('25'.substr($o_utf8, $code*2,2)));
     }
     $code=0;
   } else {
     if( $c=~/[-+\|]/ ) {
       $code |= 1 if substr($pprev,$i  ,1)=~/[\|+]/ ;
       $code |= 2 if substr($prev ,$i+1,1)=~/[-+]/ ;
       $code |= 4 if substr($_    ,$i  ,1)=~/[\|+]/ ;
       $code |= 8 if substr($prev ,$i-1,1)=~/[-+]/ ;

       $code = 10 if $code && '-' eq $c;
       $code = 5 if $code && '|' eq $c;
     }
   }
   $out.=$code?substr($BOX,$code,1):$c;
 }
 print $out;
 $pprev=$prev;
 $prev=$_;
}

#
#  
#  0001 02
#  0010 00
#  0011 14
#  0100 02
#  0101 02
#  0110 0c
#  0111 1c
#  1000 00
#  1001 18
#  1010 00
#  1011 34
#  1100 10
#  1101 24
#  1110 2c
#  1111 3c