def self.encode(str, wrap_lines = 80)
return '' if str.to_s.empty?
padding_length = (-str.to_s.length) % 4
tuples = (str.to_s + ("\0" * padding_length)).unpack('N*')
tuples.map! do |tuple|
if tuple == 0
'z'
else
tmp = ""
5.times do
tmp += ((tuple % 85) + 33).chr
tuple /= 85
end
tmp.reverse
end
end
if (padding_length > 0) and (tuples.last == 'z')
tuples[-1] = '!!!!!'
end
tuples[-1] = tuples[-1][0..(4 - padding_length)]
result = '<~' + tuples.join
if (!wrap_lines)
return result + '~>'
end
line_length = [2, wrap_lines.to_i].max
wrapped = []
0.step(result.length, line_length) do |index|
wrapped << result.slice(index, line_length)
end
if (wrapped.last.length + 2) > line_length
wrapped << '~>'
else
wrapped[-1] += '~>'
end
return wrapped.join("\n")
end