BlankSlate

いや、そういう声もあるというだけです

ANSIピクセルアートをターミナルで上下中央揃えにする

ゆのっちを中央揃えにしたかった

ざっくりした考え

  • 左右中央揃え
    • (ターミナルの横幅 - 表示したい内容の最大幅) / 2 がマージン量になる
    • 表示したい内容 の先頭にマージン量分のスペースを足せば中央に揃う(ように見える)
    • 日本語が交じるとめんどい(できないことはないけど、マージン量を日本語分増やさないといけない)
  • 上下中央揃え
    • (ターミナルの縦幅 - 表示したい内容の行数) / 2 がマージン量になる
    • 表示したい内容 の手間にマージン量分の改行を足せば中央に揃う(ように見える)
    • プロンプトを消さないと中央寄せした感がないので clear で消すといい

左右中央揃え

# 標準入力された内容の最大文字数を返す
function maxCharSize() {
    # 1. 標準入力を受け取る
    # 2. ANSIエスケープシーケンスを消す
    # 3. 標準入力された内容の最大文字数を返す
    cat - \
        | sed "s,`printf '\x1b'`\[[0-9;]*[a-zA-Z],,g" \
        | awk '{cl=length($0);if(ml<cl)ml=cl}END{print(ml)}'
}

# 標準入力された内容を左右中央寄せする
function centering() {
    content="$(cat -)"
    max="$(echo "${content}" | maxCharSize)"

    # マージン(スペース)を生成
    margin="$(
        for i in $(seq 1 $(((`tput cols` - max) / 2))); {
            printf ' ';
        }
    )"

    # マージンを先頭に挿入する
    echo "${content}" | sed "s/^/${margin}/g"
}
bash yuno.sh | centering

上下中央寄せ

# 標準入力された内容を上下中央寄せする
function middling() {
    content="$(cat -)"
    # 標準入力された内容の行数を取得
    lines="$(echo "${content}" | awk 'END{print NR}')"

    # 行数分のマージン(改行)を生成
    margin="$(
        for i in $(seq 1 $(((`tput lines` - lines) / 2))); {
            printf " \n";
        }
    )"

    # マージンを表示したあとに、内容を表示する
    echo "${margin}"
    echo "${content}"
}
clear; bash yuno.sh | middling; sleep 100;

組み合わせ

clear; bash yuno.sh | centering | middling; sleep 100;

最後に

✘╹◡╹✘ < ひだまりスケッチ×365 来週も見てくださいね!

History