久々にDynalistのカスタマイズの話。
MarkdownやScrapboxを常用していると、Dynalistでも似たような形で書式が反映されればいいのに、と思うことがある。例えば引用やコードブロック。
Dynalistでは各ノードに色を設定でき、そうするとノードのHTML要素にclassが適用されるので、CSSをいじれば「紫色設定は引用書式ということにする」みたいなことも可能である。最初はそうやっていた。
しかしこのやり方だとその情報はDynalist上でしか有効でないし、未来永劫同じルールで運用しなければならなくなる。色の設定も微妙に手間だ。だんだん苦しくなってきたので、別のやり方を考えることにした。
コピペで他のツールと行き来できた方が良いので、例えば引用は「> 」を頭に付けることで引用判定されるといい。つまり、本文が「> 」で始まるノードに引用スタイルを適用したclassを付けたい。
これはDynalistの機能ではできない操作なので、自分でスクリプトを書いて実行する。具体的にはChrome拡張機能を作る。あるいはブックマークレットにしてロード時に手動で実行する。
Chrome拡張機能開発については以前Chrome拡張機能を自分で作って活用する(Dynalist)でちょっと書いた。
class付与のタイミングをイベントで判定するのは面倒な気がしたので、setIntervalを使っている(試していないがblur時とかでもいいかも)。実際に使っているコードの一部がこちら。
// styleを記述しやすいようにclassを整理しておく
const IS_COMMENT = 'is-comment';
const IS_QUOTE = 'is-quote';
const IS_CODE = 'is-code';
const IS_BODY = 'is-body';
// スタイルを記述する(ここでは引用のみ例示)
const style = document.body.appendChild(document.createElement('style'));
style.textContent = `
.${IS_QUOTE} > .Node-self .Node-renderedContent {
background-color: #f0f0f0;
padding: 2px 4px;
font-size: 12px;
border: 1px solid #888;
}
`;
// 条件を整理しておく(今回は本文が何で始まるかで判定するものとする)
const condition = [
{ start: '🖋', className: IS_BODY },
{ start: '//', className: IS_COMMENT },
{ start: '> ', className: IS_QUOTE },
{ start: 'Code:', className: IS_CODE }
]
// 毎秒各条件をチェックしてclassを付け外し
setInterval(() => {
const lines = document.querySelectorAll('.node-line.Node-renderedContent');
lines.forEach(elm => {
condition.forEach(({ start, className }) => {
if (elm.textContent.startsWith(start)) {
elm.closest('.Node').classList.add(className);
} else {
elm.closest('.Node').classList.remove(className);
}
})
})
}, 1000);
ここでは「何で始まるか」だけで判定しているが、何を含むかや何で終わるかで判定しても良い。こうすると本文次第でスタイルを変更できるので、Dynalist固有のメタデータに依存することもなく、また条件の数も無制限に設定できる。(とはいえあんまり複雑にすると後で嫌になってくる可能性がある。意味が自明なルールに限った方が健康的だろう。)
現在実際に設定しているのはコード例に書いた四種だけで、それぞれ以下のような意味と見た目になっている。
(書き忘れたけどコードブロック風スタイルはフォントもコード用に変更している。)
Webブラウザの仕組みに頼ったものなのでスマホアプリでは反映されないのが難点だが、今現在はほとんどPCで編集しているのでPCだけでも効果は高い。
ちなみにこのようにしてからもう半年近く経っているけれど、今のところ飽きはないし便利に思っている。
関連度が高いかもしれない記事
- ブックマークレットを活用する(Dynalist)
- サイトの作り方③Dynalist APIを理解する
- サイトの作り方④取得したデータを加工する
- サイトの作り方②APIを利用してみる
- サイトの作り方①ホスティングサービスを使って公開してみる
「アウトライナー(Dynalist)と仲良くなったシリーズ」シリーズの記事
- ノート欄に本文を貼る(Dynalist)
- 知見ノートを作る/タグ機能と仲良くなった②(Dynalist)
- Chrome拡張機能を自分で作って活用する(Dynalist)
- ブックマークレットを活用する(Dynalist)
- タグ機能と仲良くなった(Dynalist)
- ノート機能と仲良くなった(Dynalist)
- ファイル・フォルダ機能と仲良くなった(Dynalist)
- アウトライナー(Dynalist)と仲良くなった
他の「Dynalist」タグの記事
- ノートツール環境スナップショット(2024/09)
- ライフ・アウトライン日記: ノート欄を楽しむ
- サイトの作り方④取得したデータを加工する
- サイトの作り方③Dynalist APIを理解する
- Dynalistでブログを書く
- アウトライナー日誌:バレットを「┠」にしたらバレット感に邪魔されなくなった
- デジタル日記の試み④~Dynalistに日記と日誌のファイルを作る~
他の「アウトライナー」タグの記事
- 「文脈エディタ」としてのアウトライナー
- アウトライナーを前にしてやりたくなること
- アウトライナー×つぶやき×平面配置②~ツール紹介編~
- アウトライナー×つぶやき×平面配置①~経緯編~
- アウトラインではなくキューを作る
- ツール製作日誌:カード式アウトライナー③カードっていうかルーズリーフだった編
- アウトライナーと手帳と表紙
- タイムライン型・カード型・デスクトップ型②~デスクトップ型~
- タイムライン型・カード型・デスクトップ型①~タイムライン型とカード型を使い分ける~
- ツール製作日誌:カード式アウトライナー②背景説明編
- ツール製作日誌:カード式アウトライナー①機能説明編
- 座標のない平面
- ツール製作日誌:「面のアウトライナー」
- アウトライナー日誌:アウトライナーとは何型のメモなのか
- 発想を文脈から解放するには④~余談~
- アウトライナー日誌:「設計図」または「説明図」という意識を持ってみた
- アウトライナーの使い方ド下手問題~はじめに~