俺様専用チートシート - 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をダウンロードしてきます。
解凍して出来た 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ファイルの形式で作ればまぁまぁ上手く変換してくれるはず、はず、はず・・・・・・。