Inquiry

Notebooks for MacでのTOC生成時に日本語見出しが正常に出力されない件について

Notebooks for MacのTOC生成機能

Notebooks for Macには、Table of Contents、いわゆる目次を自動生成する機能があります。

目次の元となる見出し(Heading)をMarkdownで記述すれば、非常に簡単にTOCを作成することができます。

しかも、TOCには、リンクアンカーが付与されるため、各見出しにジャンプすることも可能です。HTML的には、見出しの内容が、そのままアンカー名になります。

アンカー名のエスケープにまつわる問題

この際、アンカー名に含まれる一部の文字は自動的にエスケープ(ドット(.)に置換)されるのですが、日本語文字が全てエスケープ対象なのです。

そのため、同じ文字数の日本語見出しは同じアンカー名になってしまい、正常にジャンプできない事態が多発します。

例えば、以下のような見出しがあるとして、

# 見出し赤
# 見出し青

TOCのHTMLソースは、以下のようになってしまいます。

<ul>
 <li><a href="#L............">見出し赤</a></li>
 <li><a href="#L............">見出し青</a></li>
</ul>

おいそのLはなんだ。

問い合わせてみた

thanks a lot for your bug report, we were not aware of this issue before. I am not sure if we can find a short term solution for this, because these anchors are automatically inserted during Markdown conversion (we are using a third party component for that). To ensure correct and easily manageable URLs, all “special characters” are escaped, and that seems to be the reason why Japanese characters are replaced, too. - We will see what we can do about it, though.

これはバグ報告です。

見出しが日本語を含む場合、TOCを挿入すると問題が生じます。アンカーの名前において、見出しの日本語文字がドットに置換されてしまいます。そのため、正しくジャンプできない場合があります。

This is a bug report.

Problems arise if the headers containing Japanese, when you insert a TOC. In the name of the anchor, Japanese characters in headings would have been replaced by a dot. Therefore, you might not be able to jump correctly.

例によって怪しい意訳するとこんなところでしょうか。

  • バグレポート多すぎてそんなバグ埋もれてたわすまん。
  • ちと一朝一夕には解決できないっぽい。
  • というのも、アンカーはサードパーティ製のコンポーネントによって自動的に挿入されるからね。
  • URLを簡単確実に生成するために、特殊文字は全部エスケープしとるんで、日本語も置換されちゃうんだろうね。
  • けどまあ、なんかうまい方法考えてみるよ。レポートありがと。

いや、あのLはなんだ。

ともあれ、使用しているサードパーティ製コンポーネント、この場合はMarkdownパーサーを指すのでしょうが、その仕様であるようです。

他のパーサーの場合

例えばSublime TextのMarkdown Prevewパッケージに使われているpython-markdown(のTOC拡張、ああややこい)、あるいはJekyllなどで利用されているKramdownでは、日本語文字を含む特殊文字は全部消去した上で、アンカー名が重複する場合には接尾辞で連番を付与しています。

例えば、以下のような見出しがあるとして、

# 見出し赤
# 見出し青

これをSublime Textで変換すると、TOC部分のHTMLソースは、以下のようになるわけです。なお、TOCを挿入するには、[TOC]と記述します。

<ul>
<li><a href="#_1">見出し赤</a></li>
<li><a href="#_2">見出し青</a></li>
</ul>

こちらの方が、エスケープルールとしてスマートであるようには思われますね。

なお、python-markdownでは、以下のような記述で、任意のアンカー名を与えることが可能です。

# 見出し赤 {#red}
# 見出し青 { #blue }

あえて記法をぶれさせましたが、どちらも有効です。この場合、日本語のアンカー名も記述できます。

Kramdownを含む、Jekyllに組み込まれた各種パーサーでのTOC生成ルールについては、後日別の記事にまとめようと思います。

このように、パーサーによっては対策の取りようもあるわけですが、Notebooks for Macの場合、そもそも利用されているパーサーが不明なため、このような対策もとれません。それも問い合わせしてみようかな。

CloudApp/Monosnapによる画像ホスティング

はてなブログ開設当初、スクリーンショットの添付は(Skitch)→Evernote→はてなフォトライフのルートで行っていました。

しかし、この方法だと記事投稿画面にアクセスしなければ画像の確認ができませんし、そもそもはてな以外では使えません。ブログ以外にも、手元のMarkdownメモ(というかnvALT)にスクリーンショットを付けたいことがたまにあるのです。

どうやったら一番簡単にスクリーンショットを添付できるか、考えたところ以下のようになりました。

使用ツール/サービス

TextExpander

以下のようなスニペットを登録しておけば、クリップボードの画像リンクを、Markdownの画像フォーマットに変換できます。

![%filltext:name=リンクテキスト:default=スクリーンショット%](%clipboard)

クリップボードのURLをMarkdown画像フォーマットに変換するとともに、Altテキストに当たる部分にテキストを挿入するための入力フィールドを表示します。

Monosnap

Monosnapは、基本無料のMac用スクリーンショット&アノテーションアプリです。スクリーンショットした画像に書き込みをしたり、撮影即アップロードもできます。

アノテーションツールはSkitchの方が百倍オシャレですが、MonosnapはEvernote以外の各種クラウドストレージサービスとも連携できます。(サードパーティサービスとの連携は500円でアンロック)

また、Monosnapのスクリーンショットはなかなか賢く、ボタンやパネルにフォーカスすると、そこを綺麗に囲んでくれます。

ここで素直にDropbox行きでもいいのですが、Dropboxの容量は貴重なので、別のサービスを利用します。

CloudApp

CloudAppは、イチオシのクラウドストレージサービスです。

Evernoteと同じように、期間ごとのアップロード制限はあるが、ストレージ上限はないのが最大の特徴。フォルダ機能はなく、ファイルは種類によってのみ管理されます。

また、ローカルフォルダからの同期ではなく、常駐アプリ/Webサイト/APIからのアップロードのみ対応しています。イメージとしては、いわゆるアップローダーに近い。従って、ローカル容量を圧迫しません。

この常駐アプリは、直近のアップロードファイルを表示し、公開コントロールやURLの取得、そしてスクリーンショットの作成が可能です。(Mac/Windows共通)
まあ、矩形スクリーンショットしかできませんが。

めっちゃくちゃクセがありますが、私の需要にはどストライクで、セクシーなサービスです。無料プランの10ファイル/日制限はかなり厳しいですが、今のところ困ったことはありません。

というか、好きです。感情論です。

ただし……

MonosnapはCloudAppもサポートしているのですが、アップロード時に画像URLを取得できません。画像フォーマットを作成するには、CloudApp常駐アプリから画像URLを取得する必要があります。台無しです。

これは、CloudApp側のAPI仕様であるようです。問い合わせたところ、以下のように回答がありました。

Hi!

I’ll look into it. When I checked CloudApp API last time, there was no option to request direct link for 3rd party applications. If it have appeared, I’ll definitely implement it in one of the upcoming releases.

というわけで、雑なスクリーンショットでいい場合、これで対応します。

box.com

ほぼDropbox(+コラボレーション/企業向けサポート)のクラウドストレージサービス。

使いたい理由がなに一つありませんが、しょーがないのでMonosnap使うときはこれ。

実際の流れ

  1. CloudAppでスクリーンショット
  2. 自動でアップロード&画像URLをクリップボードにコピー
  3. TextExpanderで貼り付け

または、

  1. Monosnapでスクリーンショット
  2. アノテーションしてアップロード&自動で画像URLをクリップボードにコピー
  3. TextExpanderで貼り付け

終わりです。CloudAppに拘りがなければ、Monosnap+boxに統一したほうが絶対楽だと思いますけど。スクリーンショットだけなら。

おまけ:スクリーンショット以外のアップロード

CloudAppのMacアプリには、Mac OS Xサービスによるアップロード機能があります。要するに、Finderのコンテクストメニューからアップロードできます。

探して見付けてポイ。本当に楽です。

(追記)

Alfredからもアップロードできます。Alfred2 Powerpackがあるなら、こっちのほうが楽だと思われ。

FoldingTextの行頭スペース問題は次回リリースで修正されるらしい

FoldingTextの行頭スペース問題

FoldingTextは、テキスト構造のコントロールにすぐれた、Mac用テキストエディタです。

Scrivenerのリッチテキストっぷりにウンザリして代わりを探していた私は、FoldingTextで小説本文を執筆することを目論みました。ところが、そこで持ち上がってきたのがこの問題。

行頭に全角スペースを入力すると、以下のように、行末で折り返されたテキストが行頭揃えされてしまうのです。(バージョン2.0.2)

折り返されたテキストが行頭揃えされる

これは小説を書くにはツラい。ということでフォーラムに投げたところ、以下のように回答がありました。

I’ve changed this behavior for the next release. Text will only be wrapped to match with tab or 4 spaces in a row.

(適当訳:次回、タブか半角スペース4個のときだけ行頭揃えするように修正しとくわ。)

Indent by whitespace - FoldingText Support Forums

やったーーーー!

2.1開発版でさっそく解決!

以下の通り、小説も書けるようになりました!

タブの場合のみ行頭揃えされる

なお、半角スペース4個の場合、 コードブロックとしてマークアップされることになります。