きっかけ
上記のコースを一通り学習しながらScrapboxに学習内容を少しずつ英語でまとめていっていたのですが、せっかく「エンジニアのアウトプットをもっと気軽に!」というコンセプトのQrunchに登録してみたのだから内容を共有してみよう!(内容が内容なのでログという形にして主に自分で見返す用として)
ということでScrapboxで書いた内容をQrunchに移植しようと思ったのですが、ScrapboxはMarkdownで書かれていないんですね。というかかなり独特な記法?っぽいので、書きやすいは書きやすいのですが、他の媒体に移植するとなると、
[****** TITLE]
を # TITLE
に書き換えたり [画像へのURL]
を 
に書き換えたりと、途方もない労力が必要になります。
これは自動化の出番では!?ってことで ruby
の練習も兼ねて変換プログラムを作ってみました。
https://github.com/KIRAryo1/output_util
(参考: Scrapboxページの文章をMarkdownに変換するBookmarkletを書いた 先人が既に似たものを作られていたようです。今回は数式を多用したので上記のパーサーを使ってもう1回自分で手作業するより自作した方が早いかと思って使いませんでしたが、数式とかあまり使っていなければすごく良さそうです。何よりブックマークレットなので操作がとても簡単そう)
どれくらい崩れるの?
数式がキレイに表示されていますね。段落分けやコードスニペット、画像の挿入もうまくいってます( [W,s,v] = ...
と書かれている部分が画像です。ものぐさ。)
ではQrunchにそのまま移植してみましょう。
- Scrapbox のスタイルが残りまくり!
- 太字になってない!
- 改行されていない!
- 数式モードが適用されてない!
- スタイルが誤って適用されてる!
- 画像が表示されてない!
違う記法を使ってるので当然ですが、このままではいくら自分用とはいえとても見返せるものではありませんね。という訳で自動化自動化!
やったこと
ruby
を使って構文を変換するプログラムを作成。
- Scrapboxの記事をコピペして
machine_learning.in
を作成(プレーンテキスト形式) $ ruby sb2md.rb machine_learning.in
-
machine_learning.out
が出来上がるので内容をQrunchにコピペ - プログラムが不完全なので該当部分を手動で変換(くやしいポイント+5)
- Scrapbox が吸収してくれていた表記揺らぎを手動で修正(例: 数式モードの
\theta_0
と\theta _0
など。後者はMarkdownの 斜体 の記法と認識されてしまう)
中でやってることはすごくシンプル。
sb2md.rb
引数で受け取ったファイル名からScrapboxのテキストをまるっと読み込んで1行ごとに分割
filename = ARGV[0] || 'machine_learning.in'
outfile = filename.split('.')[0] + '.out'
txt = ""
File.open(filename, "r") do |io|
txt = io.read
lines = txt.split("\n")
各種変換ルールを適用
lines = lines.map{|e| headline_bold(e)}
lines = lines.map{|e| inline_bold(e)}
lines = lines.map{|e| headline_size(e)}
lines = lines.map{|e| numerical_formula(e)}
lines = lines.map{|e| embedded_gyazo(e)}
lines = lines.map{|e| embedded_picture(e)}
lines = lines.map{|e| footmark_for_numerical_formula(e)}
最後にMarkdown用に改行が反映されるよう \n\n
でくっつけて出力しておしまい
txt = lines.join("\n\n")
end
File.open(outfile, "w") do |io|
io.puts txt
end
変換ルールは基本的には gsub
を使ってScrapbox構文にマッチした部分を対応するMarkdown構文に置換していくだけ。
def inline_bold(str)
str.gsub(/\[\[(.+?)\]\]/, '__\1__')
end
見出しの大きさを保存したいと思ったので、[****** ]
の*
の数を数えてMarkdownの見出しレベルに反映するように工夫した。
def headline_size(str)
matches = str.match(/\[(\*\*+) (.+?)\]/)
return matches ? "#" * (7 - matches[1].length) + " " + matches[2] : str
end
数式は行中に埋め込む数式($
で囲む)と1行で独立する数式($$
で囲む)があるので、順番に適用していく。
def numerical_formula(str)
str.gsub(/^\[\$ (.+?)\]$/, '$$ \1 $$').gsub(/\[\$ (.+?)\]/, '$ \1 $')
end
(このアルゴリズムが不完全で、1行に複数の埋め込み数式がある場合にまとめて1つの数式として扱ってしまう。もう少し複雑な正規表現を使えば検出できると思うが、今回はスキップして手動で行うことにした。無念。)
結果
うまくいかなかったところ
数式が変換されていない(1行に複数の数式を検知できていない)
まとめ
不完全・局所的な形ではあるが一応Scrapboxの記事をQrunchに移植することができました。今後は自分でまたScrapboxの記事を作った時に気が向いたら機能を追加したり、改善したり、他の変換ツールを作ってみたりするかもしれません。
最後に今回の検証に使ったログをおいておきます。
上から順に【変換なし】【変換あり】【変換→手動修正(完成版)】
(Machine Learningの簡単な自分用のまとめにもなっていますので興味のある方は一番下のリンクをどうぞ)
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
0件のコメント