coffeescriptでシンタックスハイライトを実装したくて次のようなコードを書いたところ、途中までうまく行っているのですが最後の文字が繰り返されるようになってしまいました。
lang
1code = """ 2<script src="./string"></script> 3""" 4html = "" 5 6defo = """ 7 var nibe = function (){ 8 switch (false) { 9 case !(code === ""): 10 return html; 11 case !/^"/.test(code): 12 html += "<quote>\\\""; 13 code = code.replace(/^"/, ""); 14 highlight(quote); 15 case !/^./.test(code): 16 html += RegExp.lastMatch; 17 code = code.replace(/^./, ""); 18 highlight(defo); 19 } 20 } 21""" 22quote = """ 23 var nibe = function (){ 24 switch (false) { 25 case !(code === ""): 26 return html; 27 case !/^"/.test(code): 28 html += "\\\"</quote>"; 29 code = code.replace(/^"/, ""); 30 highlight(defo); 31 case !/^./.test(code): 32 html += RegExp.lastMatch; 33 code = code.replace(/^./, ""); 34 highlight(quote); 35 } 36 } 37""" 38highlight = (rule) -> 39 eval(rule) 40 nibe() 41 html 42 43console.log highlight(defo) 44
コードの内容はhighlight関数の引数にシンタックスハイライトの条件をいれ、それをevalで実行するコードを再帰的に動かすことで動的に条件を変更しながらダブルクオーテーション「"」とその中身を<quote>と</quote>で囲むというものです。
ですが、これをnode.jsでnode highlight.js(上のコードをコンパイルしたもの)と実行したところ結果は
<script src=<quote>"./string"</quote>></script>>>となり最後の文字の>が不必要に増えてしまっています。
ダブルクオーテーションの数だけ最後の文字が増えるのでシンタックスハイライトの条件を変えるためにhighlight()の引数を変えるときに何かおかしくなっているのだと思いますが僕には理由がわかりません。
console.logで変数の値を確認しながら動かしたところ一番最後のところでcodeの中身がもうなくなっているのに条件分岐の一番下である
lang
1 case !/^./.test(code): 2 html += RegExp.lastMatch; 3 code = code.replace(/^./, ""); 4 highlight(quote); 5コード
と
lang
1 case !/^./.test(code): 2 html += RegExp.lastMatch; 3 code = code.replace(/^./, ""); 4 highlight(defo); 5コード
これがcodeの中身が無いのにもかかわらずhtmlを返す一番上の条件が動かず、動いてしまっていました。
わかる方いらしたらどうしたら治るか教えて下さい。
--- 補足 ---
lexのような字句解析をやってくれるライブラリでオススメの物がjavascriptであればそれを教えてくださると助かります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。