俺様専用チートシート - PDFの作成

動機

例えば、ブラウザのショートカットキー。
例えば、アプリケーションのショートカットキー。
あるいは、文法や何かの指定フォーマット。


慣れれば指が勝手に動いてくれるのでしょうが、それまではそうはいきません。
かといって、毎回メニューから選んでいては大変です。
そんなときに役立つショートカットキー。


Mac OS Xのキーボードショートカットを調べてみると以下のページが良くまとまっていました。

UsingMac - Mac OS X Leopard: 200+ Productivity Booster Keyboard Shortcuts

ですが、印刷しようとするとレイアウトがイマイチだったりします。
そこで、よくあるチートシートの形式に整形してPDFに出力を試みました。

方法概要

Webページからプレーンテキストとしてコピーしてiniファイルに貼付ける。
[hogehoge]
foo=bar
...
としたときに、hogehogeがセクション名。fooがショートカットキー、barがアクションなど。
そしてスクリプトからiniファイルを読み込み表作成。PDFとして出力する。

準備

まず、サイト(上記のような表形式にまとめてくださっていると助かります)から表部分をコピーし、適当なテキストファイルにペースト。
すると項目が以下のように並びます。

1 Cmd-C Copy files
2 Cmd-V Paste files
3 Option-Drag Copy files to new location
4 Cmd-Drag Move and auto-align icons

各項目間がホワイトスペースに置き換わります。
これを正規表現で「はじめに見つかった空白を=に置換」します。
例えば次のようにします。

画像はCotEditorのものです。
検索:で

^(\d+?)\s+?(\S+?)

置換:で

\1=\2

と指定しています。
すると以下のようになります。

1=Cmd-C Copy files
2=Cmd-V Paste files
3=Option-Drag Copy files to new location
4=Cmd-Drag Move and auto-align icons

また最初の行に"[common]"と1行書き、最終的に

[common]
1=Cmd-C Copy files
2=Cmd-V Paste files
3=Option-Drag Copy files to new location
4=Cmd-Drag Move and auto-align icons

とします。ファイル名は"test.ini"としておきます。


次にrubyからiniファイルを扱うために以下からruby-inifileをダウンロードしてきます。

RAA - ruby-inifile

解凍して出来た lib/inifile.rb をフォルダごとtest.iniと同じところに移動します。
また、rubyからPDFを扱うためにPrawnを用います。

Prawn: Fast, Nimble PDF Generation For Ruby

インストールはgemsで行います。

sudo gem install prawn

以下rubyスクリプト。test.iniと同じ場所にあることとする。

require 'rubygems'
require 'prawn'
require './lib/inifile'

def table_title(headers)
    {:font_size => 9,
     :horizontal_padding => 10,
     :vertical_padding => 3,
     :border_width => 0,
     :position => :left,
     :align => {1 => :left},
     :headers => headers,
     :align_headers => :center,
     :row_colors => :pdf_writer }
end

inifile = "test.ini"
section = []
File.open(inifile, "r") do |f|
  f.each_line do |line|
    section << $1 if /^\[(.+?)\]$/ =~ line
  end
end

Prawn::Document.generate("test.pdf") do
  font "./default.ttf"
  text "Mac OS X Shortcut Cheat Sheet", :size => 12, :align => :center
  move_down 18

  oIni = IniFile::new inifile
  h = 690
  section.each do |sec|
    h = 720 and start_new_page if h - (24 + 22 * oIni[sec].size) < 0
    bounding_box [5,h], :width => 300 do
      text "" + sec, :align => :left
      stroke { line bounds.bottom_left, bounds.bottom_right }
    end
    command = []
    oIni[sec].each do |k, v|
      v.scan /(\S+?)\s+?(.+)/ do |key, act|
        command << [k, key, act]
      end
    end
    table command.sort{|a, b| a[0].to_i <=> b[0].to_i}, table_title(["No.","ショートカットキー","アクション"])
    move_down 18
    h -= 24 + 22 * command.size
  end
end

ちなみに、フォントも同フォルダに"default.ttf"として置いておきました。


Prawnに関して、以下のサンプルがとても参考になります。
sandal's prawn at master ― GitHub


上記スクリプトを実行した結果は次のようになります(PDFの一部のスクショです)。


上のスクリプトは、複数セクションがあったり、コマンド数が多い場合に(最低限ごりおしで)対応させたようなものなので、
スクリプトとして美しくありませんwあと数値は感覚で。
複数セクションだと以下のようになります。


また、Google Chromeのキーボードショートカットも作ってみました。
空白がいろいろな箇所に入っていたので整形は手動の部分もその分発生してしまいましたが。


ネットで探したPDFからPNGに変換するスクリプトを利用して掲載しているので、これは文字が潰れて使えませんが。
このように、A4横指定もできます。
スクリプトは以下のようになります。ほとんど上のと一緒です。一部省略(...)しています。

require 'rubygems'
require 'prawn'
require './lib/inifile'

def table_title(headers)
  ...
end

inifile = "google_chrome_keyboard_shortcut.ini"
section = []
File.open(inifile, "r") do
  ...
end

Prawn::Document.generate("google_chrome_keyboard_shortcut.pdf", :page_layout => :landscape) do
  font "./default.ttf"
  text "Google Chrome Shortcut Cheat Sheet", :size => 12, :align => :center
  move_down 18

  oIni = IniFile::new inifile
  h = 492
  section.each do |sec|
    h = 540 and start_new_page if h - (24 + 24 * oIni[sec].size) < 0
    bounding_box [5,h], :width => 300 do
      ...
    end
    command = []
    oIni[sec].each do |k, v|
      command << [k, v]
    end
    table command.sort, table_title(["ショートカットキー","アクション"])
    move_down 20
    h -= 40 + 24 * command.size
  end
end

つまり、これらの2スクリプト間で変更した箇所を変えてやればある程度対応出来るものと思います。


こんなことするくらいならExcellでよくね?といわれれば、なんとも言い返せませんが。
イチから自分でチートシートを作る場合は、iniファイルの形式で作ればまぁまぁ上手く変換してくれるはず、はず、はず・・・・・・。