小技チョコレート

ちょっとした小技を紹介するだけのブログです。

Dynalistからプレーンテキスト形式でエクスポートした内容をScrapbox記法に置換するUserScript

Dynalistからプレーンテキスト形式でエクスポートした内容をScrapbox記法に置換するUserScriptを作ったので、コードと使い方を書いておきます。

スクリプトのコードは更新されることがあります(更新履歴)。


〈目次〉


機能

概要

Dynalistからプレーンテキスト形式でエクスポートし、Scrapboxにペーストしてあるテキストを、マウスで選択してボタンを1回クリックすると、選択範囲に含まれているMarkdownやDynalistの独自記法をScrapbox記法に置換します。Dynalistにおける階層も再現されます。

f:id:ichbin:20190911224812p:plain
(置換前)

f:id:ichbin:20190911224909p:plain
(置換後)

置換できるもの/できないもののリスト

全てのMarkdownやDynalistの独自記法を完全にScrapbox記法へ置換できるわけではなく、置換できないものも存在します。置換できるもの/できないものの詳しいリストは下記のとおりです。

置換できるもの
  • ハイパーリンク
    • [リンクテキスト](URL)[リンクテキスト URL]
    • [](URL)[URL]
  • 画像
    • ![リンクテキスト](URL)[リンクテキスト URL]
    • ![](URL)[URL]
  • 強調を太字へ置換(**hoge**[* hoge]
  • イタリック(__hoge__[/ hoge]
  • 取り消し線(~~hoge~~[- hoge]
  • 日時記法
    • !(2019-09-08)2019-09-08
    • !(2019-09-08 10:00)2019-09-08 10:00
  • ハッシュタグ用の@#へ置換(@hoge#hoge
  • 数式($$E=mc^2$$[$ E=mc^2]
  • 余分なインデント(Dynalistでは階層が1段下がるごとにインデントが4個ずつ付くので、これをインデント1個ずつに置換)*1
置換できないもの
  • Scrapboxのページタイトルに含まれているMarkdownや、同じくページタイトルに含まれているDynalistの独自記法(ちょっとした工夫を加えれば解決します)。
    • Dynalistからエクスポートしたテキストの1行目がこれに相当します。
  • Dynalistにおいて見出し(H1, H2, H3)の状態にある項目(Ctrl+Shift+Hを押した行)は、Dynalistではフォントサイズが大きくなっていますが、そのサイズ変更は再現されません。
  • カラーラベル(Dynalistで特定の行にのみ使用している背景色)は再現されません。
  • Dynalistでチェック(Check off)した項目(hogeのように表示されているもの=Ctrl+Enterを押した行)そのものは消さずに引き継ぐことができますが、この項目のフォントカラーの変更(色が薄くなっていること)と、同項目に付けられている取り消し線は再現されません。
    • Dynalistのcheckbox(行頭に付けることができるチェック機能)にチェックを入れた項目も、これに該当します。
  • Dynalistのcheckbox(行頭に付けることができるチェック機能)は再現されません。
  • Dynalistの1項目(1行)の内部で改行してある場合(Ctrl+Shift+Enterを押してある場合)は、その項目における改行以降の部分には、階層の深さが引き継がれません。他の項目の階層は正しく再現されます。
  • Dynalistのnoteに記入したものは、Dynalistにおけるスタイル(小さいフォントで各項目の下側に付いている状態)がScrapboxに引き継がれず、独立の1項目(1行)に置き換えられます。

その他の、仕様上どうしても実現できないことなどを「既知の問題点」の節にまとめています。細かいことなので、詳しく知りたい場合はお読み下さい。

後述の「他のツールとの機能比較」も参考にしてください。

導入のしかた

こちらのヘルプに書かれている手順でUserScriptをEnableにします。

次に、Scrapboxの「自分のページ」を開き、code:script.jsと記入します。その下の行にdy2sc.jsのコード(下記の画像の赤枠部分、全体で約30行)をペーストします。

f:id:ichbin:20190916081939p:plain

そしてブラウザをリロードし、Scrapboxの上部に表示される“Load new UserScript”をクリックします。

f:id:ichbin:20190911235056p:plain

これで完了です。

使い方

Dynalistにこのような内容があるとき、これをScrapbox記法に置換する、という例を示します。

f:id:ichbin:20190910180730p:plain
(この例では1行の中にMarkdownやDynalistの独自記法が1つずつあるだけですが、複数個ある場合も正しく置換できます。)

Dynalistからエクスポートしたい内容の、最上位の行の行頭にマウスポインタを合わせると、「≡」の形のアイコンが表示されるので、それをクリックしてメニューを開き、“Export...”をクリック。

f:id:ichbin:20190910181020p:plain

f:id:ichbin:20190910181109p:plain

このような画面が開きます。

f:id:ichbin:20190910181622p:plain

中央上部の“Plain text”をマウスで選択し、下の方にある“Indentation style”のところで“Spaces”を選択しておきます(通常は何もしなくても“Spaces”が選択されていると思います)。

そして“Copy to clipboard”のボタンを押すか、もしくは、中央の入力欄の内容を選択した状態でCtrl+cなどと操作して、この入力欄の内容をクリップボードにコピーします。

それをScrapboxの新規ページや既存のページに貼り付けます。

f:id:ichbin:20190911224604p:plain
(エクスポートしたテキストをそのまま貼り付けた状態)

エクスポートしたテキストのうち、ページタイトルを除いた部分をマウスで選択します。
すると、“Dynalist”という名前のボタンが表示されます。

f:id:ichbin:20190911224812p:plain
(ページタイトルより下側をマウスで選択した状態)

「Dynalist」のボタンを押すと、このように置換されます。

f:id:ichbin:20190911224909p:plain
(数式記法のところで行頭のマーカー(・)が見えなくなっているのはScrapboxの仕様です)

ページタイトルを置換対象に含める方法

上掲のとおり、Scrapboxのページタイトル部分は、このUserScriptでの置換対象に含めることができません。

f:id:ichbin:20190911230248p:plain
(ページタイトルまで選択範囲に含めると、置換操作のための“Dynalist”ボタンが出ない)

この問題は、次のような小さな工夫で解決します。

DynalistからエクスポートしたテキストをScrapboxに貼り付ける際に、Scrapboxページの1行目(すなわちページタイトルの位置)に貼り付けるのではなく、2行目以降の位置に貼り付けます。そうすれば、全体をUserScriptの置換対象に含めることができます。置換が終わった後で、本来ページタイトルになるべきだった行を、ページタイトルの位置まで上げてやれば完了です。

f:id:ichbin:20190911225933p:plain
(ページタイトルよりも下の行に貼り付ければ、全体が置換対象に入る)

〈Dynalistに存在しているが画面上で見えていないもの〉をエクスポート対象から除外する方法

Dynalistにおいて「存在はしているけれども画面上で見えていないもの」を、エクスポート対象に含めないようにすることができます。詳細は別の記事をご覧ください。

既知の問題点

  • 次のような場合は、その箇所では正しい置換結果になりません。
    • Markdown入れ子になっている場合(**__hoge__**~~**hoge **~~など)
    • Dynalistの数式記法($$〜$$)で式に]を含む場合(例:$$[a + b]$$*2
    • 数式記法($$〜$$)で半角の$が3個以上連続している場合
      • 数式の左端や右端に$がある場合($aとかa+$のような数式)がこれに該当します。
      • 1行の中で数式記法が連続しているだけの場合は、問題ありません。
        • $$a+b$$$$x-y$$[$ a+b][$ x-y]と正しく置換される。
  • Dynalistで行頭に半角スペースがあると、Scrapboxにおいて階層が正しく再現されません。行頭の半角スペースがインデントとして解釈されてしまうためです。

f:id:ichbin:20190910182404p:plain
(1行目は行頭に半角スペースがある)

他のツールとの機能比較

インデント除去専用のUserScriptとの比較

MarkdownやDynalistの独自記法を置換する必要が一切なく、Dynalistからエクスポートした内容に含まれる余分なインデントを取り除くことのみを必要とする場合は、それ専用のUserScriptを使うほうがよいと思います。*3

scrapbox-converterとの比較

Markdown形式のテキストをScrapbox形式に変換できるツールとしてscrapbox-converterというツールがあります(使い方の解説)。*4

本記事のUserScriptで「置換できるもの」のうち、scrapbox-converter(Jun 28, 2019のバージョン)では置換できないものは下記の8つです。

  • 画像*5
    • ![リンクテキスト](URL)[リンクテキスト URL]
    • ![](URL)[URL]
  • イタリック(__hoge__[/ hoge]
  • 取り消し線(~~hoge~~[- hoge]*6
  • 日時記法
    • !(2019-09-08)2019-09-08
    • !(2019-09-08 10:00)2019-09-08 10:00
  • ハッシュタグ用の@@hoge#hoge
  • 数式($$E=mc^2$$[$ E=mc^2]

また、本記事のUserScriptで「置換できないもの」のうち、scrapbox-converterなら置換できるものはこちらです。

  • Dynalistにおける見出し(H1, H2, H3)としている項目のフォントサイズ(通常の項目よりも大きい字になる)

その他に次のような相違点があります。

  • scrapbox-converterは出力形式がJSON形式に限られ、Scrapboxインポート機能を使ってインポートする必要がある。*7
  • scrapbox-converterはページタイトルを手動で決める必要がある(置換前のテキストを格納しているファイルの名前が、Scrapboxでのページタイトルになる)。*8

従って、画像/イタリック/取り消し線/日時記法/ハッシュタグ用の@/数式を置換する必要がなく、且つ見出しを置換したい場合や、Scrapboxのインポート機能を使ってJSON形式でインポートしたいという場合には、本記事のスクリプトを使うよりも、scrapbox-converterを使うほうがよいと思います。

Pythonスクリプト版との比較

置換性能が本記事のUserScriptと同じであるPythonスクリプト版もあります。Pythonスクリプト版にだけある機能は主に次のとおりです。

  • Scrapboxでページタイトルになる部分にMarkdownや数式記法($$〜$$)が含まれていたら、Scrapbox記法に置換せずに取り除く(例:**hoge**hoge など)。
    • Scrapboxのページタイトル部分ではScrapbox記法が機能しないので、置換する必要がないため。
    • あえて置換することも可能。
  • 自動でブラウザを開いて、置換後のテキストをScrapboxに自動で書き込むことができる。
  • Scrapboxの新規ページ(空白ページ)をブラウザで自動で開くことができる。

おわりに

不具合のご報告やご要望、改良のアイデアなどがありましたら、本記事のコメント欄か筆者のTwitterメールGithubなどへお知らせ下さい。

免責事項

本記事で紹介したUserScriptの使用やその不具合等により生じたいかなる損害に関しましても、筆者は一切の責任を負いません。

*1:インデントを4個のままにすると、Scrapboxにおいては箇条書きの階層が深くなりすぎます。

*2:これはScrapboxの仕様によるものです。

*3:このUserScriptの名前は「Workflowyからのペーストを〜」となっていますが、Dynalistからエクスポートした内容に対しても使えます。

*4:ブラウザで使えるOnline Scrapbox Converterもあります。

*5:ただしOnline Scrapbox Converterなら置換できます。

*6:ただしOnline Scrapbox Converterなら置換できます。

*7:Online Scrapbox Converterはテキスト形式で出力できます。

*8:Online Scrapbox Converterにはそのような仕様はありません。