読者です 読者をやめる 読者になる 読者になる

罫線用文字の重なり部分の処理を簡単にするgemを書きました

文字列で数独を表示するときに、罫線用の文字をたくさん使うのでそれを扱う専用クラスを書きました。gemを書いたことが無かったので、せっかくなのでgemにして(/nnabeyang/box_drawing_char)に公開しています。罫線の重なり、例えば└と┘が隣接するとき、┴で置き換えると隙間なく表示されます。この置き換えは、このgemを使えば次のような文字同士の足し算で楽に処理できます。

    a = BoxDrawingChar::Char.new(?└)
    b = BoxDrawingChar::Char.new(?┘)
    expect((a + b).to_s).to eq(?┴)

罫線は、下の図のような十字の4つの線の無し、有り、太いから成ります。足し算は、足される文字の4要素を足します。ただし2重に足されるところの値は大きい値になるようにします。

f:id:nabeyang:20170413092733j:plain

文字の無し、有り、太いという情報を0, 1, 2として、4桁の3進数で表すことにします。この時計回りに書く仕様はCSSのパディングとか書くときの順番と一致させています。説明が分かりにくいですが、次の例を見ればなんとなく分かると思います。

    dict[t_ary_num(0d0110)] = ?┌

    dict[t_ary_num(0d0111)] = ?┬ 

    dict[t_ary_num(0d0112)] = ?┭ 

    dict[t_ary_num(0d0120)] = ?┎