ぴよログ

↓に移転したのでこっちは更新されません、多分。

markdown_section_numbering gemをアップデート

昔こんなのを作ったわけだけど、本当に少しだけ足りないなと思うところがあったのでアップデートしました。

マークダウンに見出し番号をつけるRuby Gem書いた - PILOG


上の記事で、「Automatorと連携して選択中のテキストを変換する」っていう使い方について書いたのだけれど、それをやるには標準入力を受け取ってgemのクラスに渡して標準出力するっていうスクリプトをわざわざgem外で用意する必要があったわけです。

そのときは気が回っていなかったんだけど、そんな機能はgemに実行ファイルとして含めればいいということにようやく気がついたので今回のアプデに至りました。

markdown_section_numbering | RubyGems.org | your community gem host

バージョン1.1をインストールするとmarkdown-section-numberingというコマンドが使えるようになります。このコマンドにMarkdown形式のテキストを与えると番号付きのマークダウンが標準出力に返ってきます。

中身は単純でこんな感じ。

#!/usr/bin/env ruby

begin
  require 'markdown_section_numbering'
rescue LoadError
  require 'rubygems'
  require 'markdown_section_numbering'
end

$stdout.write MarkdownSectionNumbering.convert($stdin.read)

Effective Ruby

Effective Ruby

CSVテキストをMarkdown形式のテーブルに変換するgem作った

markdown_section_numberingに続いて単発のテキスト変換gemを作ってRubygemsで公開した。

今回作ったのはコンマ区切りで書いたテキストをマークダウン形式のテーブルに変換するメソッドを提供するモジュールで、基本的には自分がAutomator経由で呼び出すことを想定している。

ブログや資料をMarkdown形式で書くことが多いんだけど、これまではMarkdown Tables generatorを使っていた。このサイトはこのサイトでかなり素晴らしいが、どうせならエディタ内で簡単に済ませたい。Markdownのテーブルは人間が手作業で書けるものではないので人間でも書きやすいCSV形式を取ることにした。

リンク

使いかた

READMEからそのまんま持ってきた。

基本

require "csvtomd"

csv = <<CSV
head1, head2, head3, head4
line1-1, line1-2, line1-3, line1-4
line2-1, line2-2, line2-3, line2-4
line3-1, line3-2, line3-3, line3-4
CSV

puts CsvToMd.convert(csv)

上のコードで次の出力が得られる。

|head1|head2|head3|head4|
|---|---|---|---|
|line1-1|line1-2|line1-3|line1-4|
|line2-1|line2-2|line2-3|line2-4|
|line3-1|line3-2|line3-3|line3-4|

実際に表にしてみるとこんな感じ。

head1 head2 head3 head4
line1-1 line1-2 line1-3 line1-4
line2-1 line2-2 line2-3 line2-4
line3-1 line3-2 line3-3 line3-4

応用

空のセルがあっても大丈夫。勝手に補うようにしている。

require "csvtomd"

csv = <<CSV
, , , head,
, ,
,
CSV

puts CsvToMd.convert(csv)

上のコードではこんな出力になる。

||||head||
|---|---|---|---|---|
||||||
||||||

スカスカの表になる。

head
|
|

はてなブログではMarkdownの解釈が若干異なるようで5列目が潰れてしまっているが、KobitoやGitHubでは空の5列目はそのまま残って表示される。

table

Automatorと連携

このあたりに同じようなことが書いてあるので参考にしてもらえると良いっす。

マークダウンに見出し番号をつけるRuby Gem書いた - PILOG テキスト欄に書いたRubyのコードをAutomatorで評価する - PILOG

  1. CSVを書く
  2. 選択する
  3. 設定したショートカットキー
  4. Markdown形式に置き換えられる

Markdown生活がまた便利になった。

マークダウンに見出し番号をつけるRuby Gem書いた

マークダウンでメモを書いたりブログを書いたりしていたけど、kobito-cliでPDF化すると見た目もなかなか良いということもあって、そこそこしっかりしたドキュメントもKobitoでマークダウンするのが最近自分の中での流行りになってきた。

ただそこそこ量がある報告書っぽい文書となると見出し番号があったほうがわかりやすいというのが正直なところ。見出し番号はマークダウン自身の仕様ではカバーされていない(はず)なので、マークダウンを使うのであれば別の方法と組み合わせる必要がある。

  • pandoc
  • CSS
  • 手動で番号をつける
  • 自動で番号をつける

pandocを使っていたこともあったが、使い勝手がそんなに良くない(お手軽じゃない)し、見た目もいまいちになりがちなのでトータルでKobitoに劣る。

CSSを使うという手は十分にありえる。kobito-cliからブラウザで開いたときに指定されているCSSに追記するなり差し替えるなりして、見出しに番号を振るようにするのは有り。

手動/自動で番号をつける、というのは、## ◯◯についてとなっているところを## 2.1 ◯◯についてなどと数字を直接書いてしまう方法だけど、手動でこれをやるのはかなり辛いため現実的ではない。

今回は以上の4種類の方法の中から自動で番号を振るという方法を取ることにしてみた。もっといい方法があったら知りたい。

Gem

そのライブラリをRubyで書いてGemとして配布するようにした。

markdown_section_numbering | RubyGems.org | your community gem hostmarkdown_section_numbering | RubyGems.org | your community gem host

ちなみにGitHubはこちら。

xoyip/markdown_section_numberingxoyip/markdown_section_numbering

使い方

% gem install markdown_section_numberingでインストールできる。

require "markdown_section_numbering"

markdown = <<MD
# a
## b

foo bar

## c

- list
- list
- list
MD

puts MarkdownSectionNumbering.convert(markdown)

このコードを実行すると、↓のように変換されたマークダウンが得られる。

# 1 a
## 1.1 b

foo bar

## 1.2 c

- list
- list
- list

見出し番号の付け直しにも対応していて、すでに見出し番号がついているこのようなマークダウンを渡すと、

# foo
# 1 a
## 1.1 b
## bar
## 1.2 c

新しい見出し番号が付いたマークダウンが返ってくるようになっている。

# 1 foo
# 2 a
## 2.1 b
## 2.2 bar
## 2.3 c

これによって編集中でもとりあえずの見出し番号をつけて見やすくすることができるし、変更があれば再び見出し番号を付け直せばいいだけだから割と使い勝手も悪くないんじゃないかと個人的には思っている。

現実的な使い方

ライブラリ化をしたはいいが、毎回コマンドを叩くというもの現実的ではない。そんな面倒なプロセスであれば使わなくなってしまう。僕の場合はAutomatorで作ったサービスと連携して、ショートカット一発で呼び出せるようにしていて、流れとしてはこんな感じになっている。

  1. マークダウンの文書を全選択
  2. 指定したショートカットキーでサービス起動
  3. 選択中の文字列が結果で置き換わる

スクリプトを書く

Automatorからこのライブラリを呼び出すためのスクリプトを書いておく。

require "markdown_section_numbering"
input = $stdin.read
puts MarkdownSectionNumbering.convert(input)

標準出力を受け取ってライブラリに渡し、結果を出力するだけのコード。

サービスを作る

Automator.appを起動し、サービスを作る。

左側のアクション一覧のライブラリ→ユーティリティから「シェルスクリプトを実行」を右側にドラッグ&ドロップする。そしてシェルスクリプトのところにさっき作ったスクリプトを呼び出すように書いてあげればよい。

他の設定も含めると最終的にはこのような感じになる。

これで保存して終了すればOK。

テキストを選択した状態でメニューバーからサービスを起動すると、選択中のマークダウンを見出し番号つきのものに変換した上で元のテキストを置き換えてくれるというわけだ。

ショートカットをアサインする

システム環境設定→キーボード→ショートカットからサービスにショートカットを割り当てることができるようになる。メニューから選ぶよりかは楽になる。

Gemを書いたお話と、Automatorで便利に使う方法を紹介しました。