[BlueLeaf1336]> PROBLEMS> Sql2Html>

Sql2Html - What's this?

historyTOP

2004/06/12:作成。
2004/06/13:とりあえず動くモノを作成。
2004/06/14:複数行コメント対応。飽きかけ。

overviewTOP

SQL文をHTMLのソースに変換したくなりました。いかにもいくらでもありそうですが(こればっかり)。

このサイトでは、DelphiのコードをHTML化する時に、Leafel's note - Softwareで公開されている"src2html"をヒジョウによく利用させてもらってるんですが、色のつけ方はこのプログラムの出力結果をパクらせてもらうことにします(そこまで話が進めば、ですが)。

また、構文の強調表示については、C Magazine 2003年1月号のプログラムのレシピ 第5回 を参考にすることにします。それっぽいことを書いてあった場合は、このテキストからの引用がほとんどだと思ってください。

形になるまで頑張れるように頑張ります。

参考サイトメモTOP

強調表示の対象TOP

とりあえず、強調表示を行う必要がある単語や範囲についてまとめます。元々、テキストでは C/C++ の構文の強調表示可能なテキストエディタを解説しているのですが、SQLであっても基本は変わらないはずです。ここでは、同じ色で表示するもので整理します。どうせ我流で解析するし失敗するだろうし。

パターン内容
コメント1行コメント・複数行コメント
予約語直前・直後の文字とくっつくと非予約語になる。
演算子直前・直後の文字とくっついても大丈夫。
文字定数シングル(あるいはダブル)クオートで挟まれた範囲。
数値数値

こんなもんですか。とりあえず注意するべきは、複数行コメントと文字列定数です、間違いなく。どちらも決められた文字で対象を挟むことになるので、その中は対象からはずす必要があるし、文字列の中で再度クオーテーションが出たら...とか。いろいろですね。

楽なところから行くということで。とりあえず予約語あたりですか?

これだけは死守したいのが、設定ファイルに出すということです。これさえしておけば他の言語でも大丈夫ではないかと。ただ、他の言語といってもメジャーな奴(すら怪しいですが)しか自分が関わらないわけで、そういうメジャーな奴は当然需要も高いわけで、供給もいくらでも、でしょうねぇ。

とりあえずの基本方針TOP

先に書いたように、まずは予約語から攻めようと思います。で、とりあえず、予約語一覧を外部ファイルに書いておいて、起動時にでも読み込みますわな。

それからクリップボードかファイル(最初はクリップボードで十分でしょう。テストし易いし)からSQL文をもらいます。

次に、1行ずつ取り出し(予約語が2行に分かれていることはないでしょうから)て、その1行を前から順に「予約語はないですかぁ?」と調べていく。見つかったり見つからなかったりしたら、その度に、別に用意した文字列に、強調表示された予約語あるいは何もしなかった本文のどちらかを足し込んでいく。1行が終わったら次の行を...最終的に全部の行が終われば、めでたしめでたし。となるはずです。

しばらく沈黙します。

もう少し突っ込んだ方針(2004/06/12)TOP

簡単のために予約語が「SELECT」と「INSERT」だけとします。ここで、ある1行を調べて強調表示したい時、単純に「SELECT」を「強調表示されたSELECT」・「INSERT」を「強調表示されたINSERT」に置き換えることはできません。それは「SELECTION」が「強調表示されたSELECT」+「ION」になったり、「DINSERT」が「D」+「強調表示されたINSERT」になってしまうからです。もちろんうまくいく場合もありますが...。

これは予約語が、文法的に、他の文字から隔離された状態でないと意味をなさないからです(威張りすぎ)。結局、その1行を1文字ずつ調べていき、SELECTあるいは「INSERT」が他の文字から隔離された状態で見つかった場所を1つずつ調べていかなければならないことがわかります。

方法としては、やはりテキストどおりになりそうです。つまり、まず「SELECT」についてその1行に正しい姿で含まれているかどうかを調べます。複数見つかるかもしれないけれども、その行の中で一番左端にあるものを見つけたら「SELECT」についてはとりあえず処理を終えます。次に「INSERT」について同様に調べます。結果「SELECT」と「INSERT」についてどちらが左側において見つかったか(あるいは見つからなかったか)を見極め、より早い段階(1行の先頭に近い側)で見つかった方を採用します。

どちらかでも見つかったとすると、ここまでの処理で、「予約語」+「のこり」あるいは「普通の本文」+「予約語」+「のこり」という形になるはずです。さて、「予約語」あるいは「普通の本文」+「予約語」までは文字列として確定することができます。つまり、「普通の本文」+「強調された予約語」として確定できます。後は「のこり」の文字列について再び「SELECT」および「INSERT」がないですか? を調べていき、「のこり」の文字列がなくなった時点で、オリジナルの1行から、強調表示を行った1行が生成されることになります。

...多分テキストの方法は、この理解で正しいと思うんですが、よくわからないですねぇ。やってみるのが一番ですか?

しばらく沈黙します。

予約語についてはできるようになりました。ほぼ同じ方法で1行コメントも可能だと思いますが、文字定数の処理を一切行っていないので全く使い物にならないと思います。今のままでは、文字定数の中に、正しいクエリーが含まれていると強調表示してしまう、ということです。まずは文字列処理からか...。飽きる前に完成しますように。

しばらく沈黙します。

参考サイトメモ2(2004/06/13)TOP

スタート地点(2004/06/13)TOP

何はともあれ、動くものができました。1行で完結している文字列(シングルクオートで始まり終わるもの)・1行コメント(/**/はだめ)・予約語の3種類に対応(?)しています。ダウンロードしてもらえる場合は20040613Sql2Html.zip(7,485bytes)です。基本的に文字列解析処理のソースは人のを見ても参考にならないと思いますが、輪をかけて適当なソースファイルと、実行ファイルです。

インターフェースの適当な画面はこんな感じです。サンプルのクエリーは、「長い」という理由だけでWorks - 逆引きSQL比較から無断でお借りしています。

画面上のテキスト領域にクエリーを貼り付けて「実行」を押すと、画面上のテキスト領域に結果を書き込みます。「デスクトップに保存」をクリックすると、適当な名前でデスクトップに保存しますので、ブラウザで表示してみてください。こんな感じになるはずです。

まあ、なんというか...予約語と1行コメントとシングルクオートで囲まれた文字列が強調表示されていることだけ確認してください。組み込み関数とかダブルクオートとか一切合財知ったこっちゃありませんので。でも、そこそこヨイカンジではないでしょうか。適当なわりには。

少しヤバイのは、満足しかかっていることですか。

複数行コメント対応(2004/06/14)TOP

タイトルのとおり、複数行コメントに対応しました。外部ファイルに出すのが邪魔くさくなってきて、プログラムの中で、「/*」と「*/」をべたに書いたり、メビウスにつかまったり、おかしな答えになったりしましたが、なんとか動いているような気がします。こんな感じで。

サンプルのクエリーは、「複数行コメントが使用されている」という理由だけでOracle PL/SQL 編18 - パッケージサブプログラムオーバーロード、package - SAK Streetsから無断でお借りしています。これがそのサンプルです。予約語は標準SQL(SQL92、だったっけ?)だけなので、いかにも色の変わって欲しい所が平文に見えてしまいますが、もともとPL/SQLなんて相手にしてませんのでご了承ください。多分、予約語リストをいじるだけだとは思いますが...。

ダウンロードしてもらえる場合は20040614Sql2Html.zip(8,253bytes)です。あなたのパソコンに無限ループの神様が降臨しませんように。検索処理は、自分で読むのも嫌になってきました。10日もほっといたら理解できない感じです。よい感じ。

EOFTOP