Scrapboxで書いた勉強の記録をQrunchに移植してみた

公開日:2018-11-13
最終更新:2018-11-13

きっかけ

[Coursera] Machine Learning

上記のコースを一通り学習しながらScrapboxに学習内容を少しずつ英語でまとめていっていたのですが、せっかく「エンジニアのアウトプットをもっと気軽に!」というコンセプトのQrunchに登録してみたのだから内容を共有してみよう!(内容が内容なのでログという形にして主に自分で見返す用として)

ということでScrapboxで書いた内容をQrunchに移植しようと思ったのですが、ScrapboxはMarkdownで書かれていないんですね。というかかなり独特な記法?っぽいので、書きやすいは書きやすいのですが、他の媒体に移植するとなると、 [****** TITLE]# TITLE に書き換えたり [画像へのURL]![代替テキスト](画像へのURL) に書き換えたりと、途方もない労力が必要になります。

これは自動化の出番では!?ってことで ruby の練習も兼ねて変換プログラムを作ってみました。

https://github.com/KIRAryo1/output_util

(参考: Scrapboxページの文章をMarkdownに変換するBookmarkletを書いた 先人が既に似たものを作られていたようです。今回は数式を多用したので上記のパーサーを使ってもう1回自分で手作業するより自作した方が早いかと思って使いませんでしたが、数式とかあまり使っていなければすごく良さそうです。何よりブックマークレットなので操作がとても簡単そう)

どれくらい崩れるの?

Scrapboxのオリジナル

数式がキレイに表示されていますね。段落分けやコードスニペット、画像の挿入もうまくいってます( [W,s,v] = ... と書かれている部分が画像です。ものぐさ。)

ではQrunchにそのまま移植してみましょう。

ScrapboxからQrunchにそのまま貼り付けた出力

  • Scrapbox のスタイルが残りまくり!
  • 太字になってない!
  • 改行されていない!
  • 数式モードが適用されてない!
  • スタイルが誤って適用されてる!
  • 画像が表示されてない!

違う記法を使ってるので当然ですが、このままではいくら自分用とはいえとても見返せるものではありませんね。という訳で自動化自動化!

やったこと

ruby を使って構文を変換するプログラムを作成。

  1. Scrapboxの記事をコピペして machine_learning.in を作成(プレーンテキスト形式)
  2. $ ruby sb2md.rb machine_learning.in
  3. machine_learning.out が出来上がるので内容をQrunchにコピペ
  4. プログラムが不完全なので該当部分を手動で変換(くやしいポイント+5)
  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の簡単な自分用のまとめにもなっていますので興味のある方は一番下のリンクをどうぞ)

記事が少しでもいいなと思ったらクラップを送ってみよう!
42
+1
@qillの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする