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

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

●ナデシコシンタックスハイライト(txtを)


!変数宣言必要
結果とは変数

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

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

//タグで囲うとか、引用符をつけるとか
●仕上げ(htmlを)
 html = 「<pre><code>{改行}{html}{改行}</code></pre>」
 html戻す

/* カンニング用
 background-color:#ffffff; 
 color:red;
 color:#ffffff;
*/
#----------------------#----------------------
●ナデシコシンタックスハイライト(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戻す
#----------------------
//実行部分
クリップボード取得
それナデシコシンタックスハイライト
それ仕上げ
コピー
おわり

試作品ができました。
色のセンスが残念ですが、それ以外はいい感じだと思います。
背景を白色にして通常文字が黒色ならそれっぽくなると思います。
……どこをかえるといいのかわかりません。preタグかな?

マッチのパターンも全部は網羅してませんが、だいたいOKでしょう。
上のほうが設定部分、その下が関数。 130行くらいです。
下の5行が実行部分で、クリップボードの内容をいじくってその後クリップボードに戻します。 「仕上げ」という関数はpreタグで囲うとかですね。

できあがりは以下のようになります。

<pre><code>
<span style="color:#00BFFF;">!</span>変数宣言<span style="color:#A0522D;"></span><span style="color:red;">必要</span>
結果<span style="color:#A0522D;">とは</span><span style="color:blue;">変数</span>
</code></pre>

実はHTMLにろくに触れたことがないです。 慣れている人から見たら変な書き方をしているかも。