初歩からの無職

【Scrapbox】md2sbのネストしたリストの表示が崩れないように修正する

  • JavaScript

Github上の放送大学のノートをScrapboxに移すにあたってMarkdownからScrapbox記法に変換してくれるmd2sbを使ってみました。

しかし、現状issueにもあがっているようにネストされたリストは改行がずれるような表示の崩れ方をします。コードを見るとulに対してスペース(scrapboxではスペースでリストになる)で変換し、各liの末尾改行するようですが、ネストした場合はliの中にulが入ることになるので改行されず、結果的にネストされたulの終わりに改行が2回くるような感じになっています。

sample.md
- 1
- 1
  - 2
  - 2
    - 3
    - 3
  - 2
  - 2
sample.txt
<!--- md2sbで変換後 --->
 1
 1  2
  2   3
   3

  2
  2

色々試行錯誤した結果、コンパイル処理部分を少し書き換えれば概ね期待した出力になったので自分の修正方法を書いておきます。md2sbをグローバルにインストールした場合は次のコマンドでnode_modulesのpathが出ます。

npm root -g

(path)/node_modules/md2sb/dist/libs/compiler.jsを開いて122行目あたりのcase 'listItem'のresultへの加算代入の末尾の\を先頭に持ってきます。

// 末尾の`\n`を先頭にする
case 'listItem':
  result += '\
' + ' '.repeat(context.parents.filter(i => i === 'ol' || i === 'ul').length) + (node.listItemCount ? node.listItemCount + '. ' : '') + this.compile(node.children, context);
  break;

さて、これで先程と同じファイルを変換してみます。

sample.txt
<!--- sample.txt(md2sb修正後) --->
 1
 1
  2
  2
   3
   3
  2
  2

先頭に余分な改行が出るものの、リスト自体は期待した出力になりました。試しに長文のmd形式のノートを変換してみましたが問題はなさそうです。別種のリスト混在なしのシンプルな構成だと概ね修正作業なしでそのまま変換できる感じだと思います。

プルリクを送ったほうがいいのかと思いましたが、testフォルダのリストが複数種類混在したケースではまだ期待した出力になってないみたいなのでとりあえず対症療法的な修正方法でした。(もしかしたらどこかにクリティカルな影響が出てるかも…)