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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#! /usr/bin/env ruby
# murphy's rb2art
# version 2005.august.11
# Licence: LGPL
if ARGV.empty?
puts <<-INFO
Usage: ruby rb2art.rb <script:file> <graphic:file> <scale:float> <intens: -/+ 1..16>
INFO
exit
end
intens = ARGV.size==4 ? ARGV.pop.to_i : 5
scale = ARGV.size==3 ? ARGV.pop : 1
require 'RMagick'
graphic = Magick::ImageList.new ARGV.pop
c, r = graphic.columns, graphic.rows
graphic.resize! c * scale.to_f, r * 0.625 * scale.to_f
c, r = graphic.columns, graphic.rows
a = graphic.export_pixels 0, 0, c, r, 'I'
max_int = (a.max/16)
colors = intens > 0 ? ('#' * intens) : (' '*(16+intens) + '#'*(-intens))
require 'enumerator'
ascii = ''
a.each_slice(c) do |row|
ascii << row.map { |x| x=x/max_int; colors[ x > 15 ? 15 : x, 1]||' ' }.join.sub(/ +$/,'') << "\n"
end
program = File.read ARGV.pop
module AsciiMask
ENCODE = {
"\s" => '=s',
"\t" => '=t',
"\n" => '=n',
"\r" => '=r',
"=" => '==',
"#" => '=#',
}
DECODE = ENCODE.invert
def encode s
s.gsub!(/[\s#=]/) { |c| ENCODE[c] }
end
def decode s
s.gsub!(/=./m) { |c| DECODE[c] }
end
end
include AsciiMask
program = encode program
i = -1
art = ascii.split('').map do |a|
if a == '#'
if i + 1 < program.size
program[i += 1,1]
else
'#'
end
else
a
end
end.join
$stderr.puts "Warning: Graphic is too small for script! #{i+1} #{program.size}" if i + 1 != program.size
puts <<-'ART' % art
#! /usr/bin/env ruby
eval <<-'RUBY'.gsub(/\s/,'').gsub(/=./){|c|{'=s'=>"\s",'=t'=>"\t",'=n'=>"\n",'=r'=>"\r",'=='=>'=','=#' => '#'}[c]
%sRUBY
ART</pre></code>
<code><pre>#! /usr/bin/env ruby
eval <<-'RUBY'.gsub(/\s/,'').gsub(/=./){|c|{'=s'=>"\s",'=t'=>"\t",'=n'=>"\n",'=r'=>"\r",'=='=>'=','=#' => '#'}[c]}
=#! =s
/usr/ bin/env =sr
uby=n=#= smurphy's=srb2ar t=n =#
=sversion =s2005.august.11=n=#=sLi cenc
e:=sLGPL=n=nif=sARGV.empty?=n=s=sput
s=s<<-INFO=n=s=s=s=sUsage:=sruby=s
rb2art.rb=s<script:file>=s
<graphic:file>=s<scale:float
>=s<intens:=s-/+=s1-16>=n=s=
sINFO=n=s=sexit=nend=n=nintens
=s===sARGV.size====4=s?=sARGV.
pop.to_i=s:=s5=nscale=s===sARGV.siz
e====3 =s?=sARGV.pop=s:=s1=n= nreq uire=s
'RMagi ck'=ngraphic=s===sM ag ick::ImageList.
ne w=s ARGV.pop=nc, =sr=s===sgraphic.column s,= sg rap
hic.rows=ng r aphic.resize!=sc=s*=ssc ale .to_f,=sr=s*=
s0.625=s*=ss cale.to_f=nc,=sr=s===sgraphi c.columns,=sgraphic.row
s=na=s===sgra phic.export_pixels=s0,=s0,=s c,=sr,=s'I'=nmax_int=s===s(a.
max/16)=ncolor s= s===sintens=s>=s0=s?=s('=#'=s* =sintens)=s:=s('=s'*(16+intens)=s +=s'=#'
*(-intens))=n =nrequire=s'enumerator'=nascii=s ===s''=n=na.each_slice(c)=sdo=s |row
|=n=s=sascii= s<<=srow.map=s{=s|x|=sx==x/max_i nt;=scolors[=sx=s>=s15=s?=s15=s:= sx,
=s1]||'= s'=s}. join.sub(/=s+$/, '')=s<<=s"\n"=n end=n=npr ogram=s===sFi
le.read=sARGV.pop=n=nmodule=sAsci iMask=n=s=sEN CODE=s===s {=n=s=s=s=
s"\s"=s==>=s'= =s',=n=s=s=s=s"\t "=s==>=s'== t',=n=s=s=s =s"\n"
=s==>=s'==n',=n =s=s=s=s"\r"=s ==>=s'==r',=n= s=s=s=s"
=="=s==>=s'== ==',=n=s=s=s=s"=# "=s==>=s'===#', =n=s=s}
=n=s=sDECO DE=s===sENCODE.invert=n=n=s=sde f=sencode=ss=n=s=s =s=ss.gs
ub!(/[\s=#==]/ )=s{=s|c|=sENCODE[c]=s}=n=s=s end=n=s=s=n=s=sdef= sdecode=
ss=n=s=s=s=ss.gs ub!(/==./m)=s{=s|c|=sDECODE[ c]=s}=n=s=send=nend=n=ninclud
e= sAsciiMask= n=nprogram=s===sencode=sprogram=n =ni=s===s-1=nart=s===sascii.s p
lit('').map=sdo=s|a|=n=s=sif=sa=s=====s'=#'=n=s=s=s =sif=si=s+=s1=s<=sprogram.size =n=
s=s=s=s=s=sprogram[i=s+===s1,1]=n=s=s=s=selse=n= s=s=s=s=s=s'=#'=n=s=s=s=send=n=s= se
lse=n=s=s=s=sa=n=s=send=nend.join=n$stderr.p uts=s"Warning:=sGraphic=sis=stoo=s sm
all=sfor=sscript!=s=#{i+1}=s=#{program.size} "=sif=si=s+=s1=s!===sprog ram.size=n=
nputs=s<<-'ART'=s%=sart=n=#!=s/usr/bin/en v=sruby=n eva l=s<<-'R
UBY'. gsub(/\s/,''). gsub(/==./){|c|{'==s '==>"\
s",'= =t'==>"\t",'==n'==>"\ n",'
==r'==>"\r",'=== ='==>
'==',' ===#'=s==
>= s'=#'} [c]}=n%sR
UBY=nART=n############# ########
#######################
# ####### #
RUBY |