少し前から「ローカルでもいろいろできるじゃん」と気がついてから、テキストファイルを中心に自分のデータを扱うようになっていました。
一つの目標は「データベース」(SQL的なやつ)を使わない、というもの。SQLって便利なんですが、結局「生のデータ」を人間が直接扱えないので、それはちょっとなと思ったのです。それだったら、企業が提供しているツールを使うのと根本的には変わらないだろうなと、ObsidianやLogseqを使っていて思いました。
で、Webブラウザで使えるツールとなるとJavaScriptがプログラミング言語となり、となるとJSONが一つの候補に上がってきます。比較的人間でも読み書ききやすいプレーンなテキストファイルで扱える形式です。JavaScriptだとそのJSONを読み込んでパースしてくれる関数があらかじめ用意されているのでバッチリです。
少し前はその形式を使ってカード型表示のツールも作っていました。たとえば、以下。
https://honkure.net/tool/MindGarden/
これはこれですごく便利なのですが、でも、たとえばLogseqと比べると不満もあります。テキストデータだと言っても、「そのまま編集する」のは若干面倒なのです。きちんと構造を維持する必要がありますし、そのために記号も書いていかなければなりません。
このデータを使って表示するならばいいのですが、このデータそのものをテキストファイルで編集しようとは思わない。そんな感じです。
結局その辺をずっとうろちょろしながら考えていたのですが、あるとき天啓が降りてきました。「自分でパースする関数を作れば、どんなデータ形式であってもいいんじゃね?」という天啓です。
たとえば、以下のツールはごく普通のマークダウンファイルを読み込んで、個別のカードとして表示してくれます。
http://rashita.sakura.ne.jp/tool/slider/index.html
読み込まれるファイルの中身は、たとえば以下のような見出し+本文の形式になっています。
これだとコーディングでデータを加えるだけでなく、そのまま手書きでも書き足すことができそうですよね。その「感覚」が私には大切でした。データを追記するために、何かしらの関数やプログラムを通さなければならないのは不自然ではないかと思ったのです。
そもそもとして、JSONだってどこかの誰かが「よし作ろう」と思って作ったのであって、この世界にはじめから存在していたわけではありません。だったら「マークダウン記法のファイルを部品的に扱える方式」をどこかの誰かが開発したって別段変ではないでしょう。でも、なかなかそのことに気がつきませんでした。
やっていることは(日曜大工プログラマナー)なので簡単な解析でしかありません。意図しない形でマークダウンが書かれていたらあっという間にエラーをだしてしまうような処理になっています。でも、自分が使う分にはこれで十分です。
おそらく今後も「必要であれば、自分で処理を書く」ことをやっていくでしょう。その中には車輪の再発明が含まれているかもしれませんし、電車があるのに馬のくつわを開発するようなものも含まれているかもしれません。でもまあ、そんな話はどうでもいいのです。
自分が使いたいようにツールの環境を整えること。それができれば十分です。でもって、ついでにいえば、「人間が普通に書けるテキストファイルの形式を、プログラミング側が頑張って解析する」という方がナチュラルではないでしょうか。なぜ私たちがわざわざプログラミング処理の方に寄らなければならないのか?
そんな傲慢な考えがちょっとだけあります。もちろん、マークダウン記法だってプログラミングに寄せてはいるのですが、それでも「人間側の領域」がずいぶん多いような気がします。その割合が結構大切です。
function convertMdtoList(text){
const lines = text.split(/\n/);
const regex = new RegExp('^###');
const regex2 = new RegExp('^## ');
let contens = []
let title="";
let body="";
let flag = false;
for(item of lines){
if(regex2.test(item)){continue}
if(regex.test(item)){
if (flag == false){
flag = true;
}else{
contens.push({"title":title.replace("### ",""),"body":body.trim()});
body="";
}
title = item;
}else{
body = body + "\n" +item;
}
}
if (body != ""){
contens.push({"title":title.replace("### ",""),"body":body.trim()});
body="";
}
return contens
}