[Fswiki-dev] Re: [RFC] キーに=を含む設定の取り扱い

Back to archive index

Naoki Takezoe takez****@gmail*****
2005年 12月 25日 (日) 08:39:02 JST


竹添です。

05/12/18 に N.Katoh<typer_jp****@yahoo*****> さんは書きました:
> 加藤です。大雪で家に籠ってます(笑)
>
> On Sun, 18 Dec 2005 11:51:56 +0900
> Naoki Takezoe <takez****@gmail*****> wrote:
>
> > 竹添です。
> >
> > 05/12/18 に Makamaka<maka2_fswik****@donzo*****> さんは書きました:
> > > まかまかです。
> > >
> > > Naoki Takezoe <takez****@gmail*****> wrote:
> > > >URLエンコードは確かにあまりうまい方法だとは思いませんが、手でいじる
> > > >ときのことを考えるのであれば
> > > >
> > > >> 分割する「=」の前後の空白が無視されることを利用して
> > > >
> > > >という実装上の都合を意識してないとはまってしまいそうな気が…。
> > > >
> > > >もちろんこれを意識しなくてはいけない場合というのはレアケースでしょ
> > > >うけれど、様々なプラグインから利用される関数でもあるわけですし、や
> > > >るならきちっとエスケープ処理を実装しとくべきなんじゃないかなぁと思
> > > >います。
> > > >
> > > ># そうすれば4.0でもそのコードが使えますし…。
> > >
> > > うーん、言われてみれば。
> > > であれば、いわゆるCSV準拠で
> > > キーに'='か'"'がある場合、'"'は'""'に変換した上で'"'で囲む。
> > > という処理はどうでしょうか。
> > > (これも手でいじる場合に戸惑うと言われればそれまでですね……)
> >
> > 方法はどうあれ結局何らかの方法でエスケープしなければいけないわけで
> > その方法が妥当かどうか、というところが判断基準になると思います。
> > CSV準拠の方法であれば、FSWikiでのテーブル記法でも使用していますし、
> > 割と一般的な方法なので納得感があると思うのですが、
>
> ただ、「CSVではない所にその方法が出てくる」という点でちょと微妙かなと思
> います。ただ、あらかじめ設定ファイルにCSV準拠である旨のコメントを入れて
> おけば驚きも少ないですね。
>
> > > 分割する「=」の前後の空白が無視されることを利用して
> >
> > というのは、確かにうまい方法だとは思いますが、実装上都合がいい回避策と
> > いうのがありありと見えてしまいますし、逆にこの仕様を知らない人にとって
> > はコードを読まなければ絶対に出てこない発想だと思うんですよね。
>
> たしかに独自仕様なのでわかり難いですね。
>
>
> じゃあどうすればという話ですが、「key=value」形式で一般的な方法という所
> で考えてみると、UNIX系ではsh、Win系ではiniファイルとなります。
>
> shだと「"」「'」「\」それぞれ3様のエスケープ方法がありますが、「\」だけ
> でも真面目に実装すればうまくエスケープできるようになります。これは最初の
> 案に近いですが、
>
> ・「\=」→リテラルとしての「=」
> ・「\\=」→リテラルとしての「\」+区切りとしての「=」
> ・「\\\=」→リテラルとしての「\=」
> ・「\\\\=」→リテラルとしての「\\」+区切りとしての「=」
> ...
>
> と、「\」の対をちゃんと認識させる様にするという事です。
> 問題として、load時に「\a」とかの解釈をどうするかという点でしょうか。
> 最初の案では「\\」「\=」→「\」「=」だけでしたが、「\a」→「a」までやる
> かどうか。
> また、keyのみにするかvalueもエスケープの解釈をするかどうか。
> 互換性を考えると「\\」「\=」だけにとどめた方が影響範囲が少なくて良いです
> が、「\」がエスケープ文字として扱われる場合とそうでない場合があるのは
> 一貫性に欠けるともいえます。
>
> あと、iniファイルは...どうなってましたっけ。
> iniでそんな問題に出会ったの記憶がない(^^;
>
>
> いずれにしろエスケープ方法をあらかじめコメントとして入れておくとわかりや
> すいですね。行頭が「#」はコメントであるというのも示せますし。

今の仕様だとキーや値に改行を含めることができないという問題もありますので
値とキーの両方をエスケープ対象として、以下のようなエスケープ方法はどうで
しょうか。

・値またはキーに=が含まれている場合は全体を"で囲む
・上記とは関係なく改行それぞれは\\n、\\rにエスケープ、\は\\にエスケープ
・全体を"で囲んだ場合、値またはキーに"が含まれていた場合は""にエスケープ

例えばキーがThis is "key"、値がThis is "value"の場合、

"This is ""key"""="This is ""value"""

のような感じになります。

エスケープ方式そのものはFSWikiのCSV記法でのエスケープ方式を拡張したもの
ですが、=で分割することになるので特にCSVの記法という印象は与えないと思い
ますし、現在FSWikiのパーサで使用している正規表現を流用可能なので実装も
それほど難しくないでしょう。

また、バージョンアップ時の互換性という点も重要になりますが、現在の形式のファ
イルも問題なく読み込めるようにできると思います。

--
Naoki Takezoe <takez****@gmail*****>



Fswiki-dev メーリングリストの案内
Back to archive index