(Linux)printerbannnerを左回転

3-2.加工

TVアニメ『ねじ巻き精霊戦記 天鏡のアルデラミン』(2016)
(2016年当時の感想です。)
まだ2話あたりなので何とも分かりませんが、OPの雰囲気とか、敵陣営からの脱出劇を見ていると、女ったらしの若者が大軍を勝利に導く智将になる物語、のような気がします。銀河英雄伝説のヤンウェンリー(女たらしではないけれど)っぽいんではなかろうか、という淡い期待で見ています。

タイトルの「ねじ巻き」はまったく意味が分かっていないのですが、「ねじ巻き」と聞いて思い出すのが私が子供の頃のおもちゃです。ゼンマイ式ばかりでした。その遊び方ですが動かして遊ぶ、というよりも、ねじを巻くのを楽しんでいた記憶しかありません。本来はネジが横で終わるはずが、縦になるまでめいっぱい回して遊んでました。時計の針は12時ジャストだから、縦で終わるととても気分が良く思えて、ねじ巻きも縦にぴったり合わないと気が済まなかったようです。もし12時を通り越して1時の方向で止まってしまったら、さらに回転させて12時を目指していたので、ゼンマイ式おもちゃのゼンマイというゼンマイが外に飛び出してしまってたと思います。

さて、縦と横の話なのですが、printerbannerは、90度倒れて表示されているので、ずっと気持ち悪いと思ってました。今回はそれを解消したいと思います。「雨ニモマケズnkfでひらがなカタカナ変換、ついでにrubyで縦書き」のrubyのスクリプトを使って、printerbannerを左に90度回転して表示してみます。

回転させるためのrubyのスクリプトはrotate.shというファイルにしておきます。

~$ cat -n rotate.sh
     1	ruby -e "y=[]
     2	STDIN.read.split(/\n/).each{|m|
     3	x = m.split(//)
     4	(8-x.length()).times{x.push('A')}
     5	y.push(x)
     6	}
     7	y.transpose.each {|m| puts m.join() }
     8	" | tac | tr 'A' ' '

まずは、sysvbannerを使って実験。

~$ banner A
   #
  # #
 #   #
#     #
#######
#     #
#     #

~$ banner A | . rotate.sh
       
   ####
  # #  
 #  #  
#   #  
 #  #  
  # #  
   ####
~$ 

簡単に回転できました。

文字を2個に増やすとどうでしょうか。ABを回転させてみます。

~$ banner AB | . rotate.sh
-e:7:in `transpose': element size differs (15 should be 14) (IndexError)
	from -e:7:in `<main>'
~$ 

エラーが出てしまいました。bannerの桁数が変わった時のことを考慮していないためです。桁数はbanner | wc -Lで求めますが、この結果をrubyで使用するためには、bannerをrotate.shに組み込んでしまう必要があります。rotate.shのファイル名をbanner-rotate.shに変えて、bannerを組み込んでみましょう。

~$ cat -n banner-rotate.sh
     1	col=`banner $1 | wc -L`
     2	banner $1 | ruby -e "y=[]
     3	STDIN.read.split(/\n/).each{|m|
     4	x = m.split(//)
     5	($col-x.length()).times{x.push('A')}
     6	y.push(x)
     7	}
     8	y.transpose.each {|m| puts m.join() }
     9	" | tac | tr 'A' ' '

これでいろいろ試してみます。

~$ . banner-rotate-sh HELLO
#######
#     #
#     #
#     #
#     #
#     #
#######
       
      #
      #
      #
      #
      #
      #
#######
       
      #
      #
      #
      #
      #
      #
#######
       
#     #
#     #
#  #  #
#  #  #
#  #  #
#  #  #
#######
       
#######
   #   
   #   
   #   
   #   
   #   
#######
~$ . banner-rotate-sh takk
 #    #
  #  # 
   ##  
   #   
   #   
 ######
       
       
 #    #
  #  # 
   ##  
   #   
   #   
 ######
       
       
   ####
  # #  
 #  #  
 #  #  
  # #  
   ####
       
       
 #     
 #     
 ######
 #     
 #     
       

いい感じです。
では、printerbanner用に改造します。banner-rotate.shを下のようにしました。
発行するコマンドを変えて、エスケープシーケンスで色をつけただけです。

~$ cat -n pbanner-rotate.sh
     1	echo -ne "\x1b[33m"
     2	col=`printerbanner $1 | wc -L`
     3	printerbanner $1 | ruby -e "y=[]
     4	STDIN.read.split(/\n/).each{|m|
     5	x = m.split(//)
     6	($col-x.length()).times{x.push('A')}
     7	y.push(x)
     8	}
     9	y.transpose.each {|m| puts m.join() }
    10	" | tac | tr 'A' ' '
    11	echo -ne "\x1b[37m"
~$ . pbanner-rotate-sh command

実行すると下のように縦長の表示になります。
banner-90rotate

あとは、sed -n 1~2p等で、行を間引いてやればタイトルのようなテキストが出来上がります。

コメント

タイトルとURLをコピーしました