top > 拡張子クラスとは?
一言でいうと拡張子で区別されるグループのことを拡張子クラスといいます。例えば、.txt に対応する拡張子クラスがあって、それに対してフォントは MS UI Gothic だよ、とか設定しておくと、ほげほげ.txt を開いたときその設定で表示されるわけです。
拡張子ごとに個別に設定を行えるというのはテキストエディタにおいては割と一般的な仕様だと思いますが、萌ディタにおいてはおのおのの拡張子クラスが独立した存在ではなくて、継承関係を持っているというのがミソです。
例を挙げます。C のソースファイル、pascal のソースファイル、java のソースファイルに対応する拡張子クラスがあるとします。で、「やっぱりソースは背景黒じゃないと落ち着かないよっ」と思って設定を変えようとします。拡張子ごとの設定がおのおの独立していると、拡張子のグループごとに同じような設定をしなければならないので、めどいです。
そういう場合、萌ディタではこうします。まずプログラムソースに共通する拡張子クラスを定義します('programsource' とでもします)。それに対して、背景色を設定します(App.Prop('programsource', 'background-color') = 'black' とかする)。
次に、'programsource' を継承した 'c-source'、'pascal-source'、'java-source' を定義して、それぞれに固有の設定だけ行います。
このとき、子供の拡張子クラスには背景色を設定しません。その状態で、App.Prop('c-source', 'background-color') を参照すると、それぞれの拡張子クラスは、自分に設定されていないプロパティについては継承元の親のプロパティを返すようになっています。つまり、いずれの拡張子クラスも背景色は黒だよ、と返してくれる。
逆に 'programsource' の背景色を設定すれば、子供の背景色も自動的に変わります(それぞれの子供が背景色を上書き定義していなければ)。そういう感じで、まず共通の設定を行い、それぞれの拡張子クラスに固有のものだけを差分として設定していくのが萌ディタで環境を構築する流れになると思います。
それから、キー押下に反応するスクリプト側のイベントハンドラも拡張子クラスに対して設定するわけですが、こちらも同じように、定義しなければ自動的に親のイベントハンドラを呼ぶようになっています(定義しつつ、親のハンドラを呼ぶこともできる)。
拡張子クラスの定義は、まずスクリプト側で関数オブジェクトを定義します。
function class_textfile() {
this.name = 'textfile'; //拡張子クラスの名称
this.parent = 'plaintext'; //親となる拡張子クラスの名称
this.ext = '*'; //この拡張子クラスに対応する拡張子
}
拡張子は正規表現で指定します。'.txt' にマッチさせる場合は '\.txt$' などです。また、上記の例でいう 'programsource' のようにファイルとは直接対応しない場合は、拡張子を '?' にしておきます。
次に、この関数オブジェクトのプロトタイプに、適宜イベントハンドラを定義します(イベント リファレンスを参照してください)。また、特に onInitProp ハンドラではその拡張子クラスに特有のプロパティを設定します(プロパティ リファレンスを参照してください)。
最後に、addClass() 関数を呼び出して、萌ディタに登録します。
addClass(new class_textfile());
top > 拡張子クラスとは?