なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

●ナデシコシンタックスハイライト(txtを) //その3 完成

!変数宣言必要
!配色番号 = 1 //1…背景が白、文字が黒  2…背景が黒、文字が白
結果とは変数

STYLEとはハッシュ
//<span style="{STYLE@type}"> </span>
#type	配色番号=1	配色番号=2
「
文字列	color:blue;	color:#FFFF00;
コメント	color:green;	color:#999999;
助詞	color:#A0522D;	color:#00ff00;
関数	color:#ff00ff;	color:#ff00ff;
記号	color:#00BFFF;	color:#00ffff;
宣言	color:blue;	color:#ffafc9;
予約語	color:blue;	color:#00ffff;
定数	color:red;	color:red;
」TSV取得して反復
  もし対象==「」ならば続ける
  STYLE(対象[0]) = 対象[配色番号]

//タグで囲うとか、引用符をつけるとか
●仕上げ(htmlを)
 preタグとは変数
 配色番号条件分岐
   1ならば、preタグ = 『<pre style="background-color:#eeeeee; color:#000000">』
   2ならば、preタグ = 『<pre style="background-color:#333333; color:#ffffff">』
   違えば、preタグ = 「pre>」
 html = 「{preタグ}<code>{html}</code></pre>」
 html戻す

/* カンニング用
 background-color:#ffffff; 
 color:red;
 color:#ffffff;
*/

#----------------------
変換テーブルとは変数
//endあり:「{first}*{end}」でワイルドカードマッチ
//endなし:firstでワイルドカードマッチ  にあてはまるようにする
#タイプ	開始	終了	をタブ区切りでいれる(改行は\n)
#type	first	end	の変数に入る
変換テーブル=「
文字列	{カッコ}	{カッコ閉じ}
文字列	『	』
文字列	"	"
コメント	/\*	\*/
コメント	[=//|'|#|#|※]	\n
関数	[=●|*|■]	\n
関数	・[*!\(~ \n]
記号	[+\+\-\*\/\=\%\^\<\>\(\)\!\[\]\\\&\@\|]
記号	[++-×÷=%^<>()![]¥&@|≦≧→←~]
宣言	[=とは変数|とはハッシュ|とは配列|とはボタン|とはラベル|とはエディタ|とはメモ|とはフォーム|とはパネル|とはスプリッタ]
助詞	[=とは|は|について|ならば|なら|でなければ|から|ここまで|まで|までを|までの|で|を|の|が|に|へ|と|して|だけ|くらい|なのか|として|より|ほど|など|って|では|て]
予約語	[=もし|違えば|それ|対象|その|ループ|繰り返す|条件分岐|反復|戻す|戻る|続ける]
予約語	[=母艦|かつ|または]
定数	[=はい|いいえ|改行|必要|不要]
定数	[+1234567890]
」TSV取得
//「宣言」はプログラム部分に例外処理をしてあります
//保留  { } 、。*(掛け算)::,.▲/

#----------------------#----------------------
●ナデシコシンタックスハイライト(txtを)
 oldtxtとは変数  //無限ループ検知
 firstとは変数
 endとは変数
 パターンとは変数
 typeとは変数  //html修飾タイプ
 hitとは変数
 posとは変数
 minposとは変数
 minhitとは変数
 mintypeとは変数
 結果=「」
 (txt<>「」)ループ
   oldtxt=txt
   minpos=-1 //初期化 未発見
   変換テーブル反復
     もし対象[0]==「」ならば続ける
     type = 対象[0]
     first = 対象[1]
     end = 対象[2]
     もしend==「」でなければ
       パターン = 「{first}*{end}」
     違えば
       パターン = first
     hit = txtパターンワイルドカードマッチ
     もしhit==「」ならば続ける
     
     pos = txthit文字検索
     もしpos<=0ならばエラー発生 //マッチしたのに検索に失敗?
     
     //いちばん左にヒットしたパターンを記録
     もしminpos==-1またはpos<minposならば
       //例外処理:空白に装飾は要らないのでトリムしてみる
       hit=hitトリム
       minpos=pos
       minhit=hit
       mintype=type
   //反復ここまで
   
   //もうヒットするものがない
   もしminpos==-1ならば
     txtテキスト出力
     txt=「」
     抜ける
   違えば
     txtminhitまで切り取る//txtから消す
     それテキスト出力
     minhitmintypeマークアップ出力
   もしoldtxt=txtならば
     「無限ループの可能性があります」言う
     デバッグ
 結果戻す

●テキスト出力(txtを)
 txt=txtHTML変換
 結果txt追加
●マークアップ出力(txtをtypeで)
 txt=txtHTML変換
 もしtype==「宣言」ならば//宣言だけ例外処理
   マークアップ出力(「とは」「助詞」)
   txtから「とは」まで切り取る//切り取って捨てる
 styleとは変数
 style=STYLEtype
 txt=「<span style="{style}">{txt}</span>」
 結果txt追加

●HTML変換(txtを)
 txt=txt「&」「&amp;」置換
 txt=txt「<」「&lt;」置換
 txt=txt「>」「&gt;」置換
 txt=txtタブ「&#09;」置換
 txt戻す
#----------------------#----------------------
//実行部分
クリップボード取得
それナデシコシンタックスハイライト
それ仕上げ
コピー
おわり

完成!(予定)です。
なでしこプログラムをクリップボードにコピーした状態で実行すると、シンタックスハイライト(HTML修飾)をつけてクリップボードに返します。
完成品のサンプルは上記そのものです。

色はセンスある人が提示してくれたら変えていきたいです。
HTMLとスタイルシートの知識が付け焼き刃なので、そこも指摘があればなおしましょう。
処理の高速化は……いらないかな?

!配色番号 = 1 の部分を2にすると黒背景モードになります。
↓実行結果はこんな感じ

コピーボタンとはボタン
そのクリックした時ボタンイベント
●ボタンイベント
 クリップボード取得してコピー