diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2017-02-09 20:13:44 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2017-02-09 20:13:44 +0900 |
| commit | df5a8768ece9801c08dfcca3e690f296de8f3df6 (patch) | |
| tree | f197749a6cbf1d2d888d85ab53bd5dda763798d2 /src/common/text/elements | |
| parent | #139 (diff) | |
| download | sharkey-df5a8768ece9801c08dfcca3e690f296de8f3df6.tar.gz sharkey-df5a8768ece9801c08dfcca3e690f296de8f3df6.tar.bz2 sharkey-df5a8768ece9801c08dfcca3e690f296de8f3df6.zip | |
変数サポート
Diffstat (limited to 'src/common/text/elements')
| -rw-r--r-- | src/common/text/elements/code.js | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/src/common/text/elements/code.js b/src/common/text/elements/code.js index 190a090d96..e55b11c235 100644 --- a/src/common/text/elements/code.js +++ b/src/common/text/elements/code.js @@ -80,6 +80,14 @@ const symbols = [ '~' ]; +// 変数宣言 +const varDef = [ + 'var', + 'const', + 'let', + 'mut' +]; + const elements = [ // comment code => { @@ -122,6 +130,45 @@ const elements = [ } }, + // extract vars + (code, i, source, vars) => { + const prev = source[i - 1]; + if (prev && /[a-zA-Z]/.test(prev)) return null; + + const match = varDef.filter(v => code.substr(0, v.length + 1) == v + ' ')[0]; + + if (match) { + const bar = code.substr(match.length + 1).match(/^[a-zA-Z0-9_-]+/); + if (bar) { + if (!keywords.some(k => k == bar)) { + console.log(bar[0]); + vars.push(bar[0]); + } + } + } + + return null; + }, + + // vars + (code, i, source, vars) => { + const prev = source[i - 1]; + if (prev && /[a-zA-Z]/.test(prev)) return null; + + const match = vars.sort((a, b) => b.length - a.length) + .filter(v => code.substr(0, v.length) == v)[0]; + + if (match) { + if (/^[a-zA-Z]/.test(code.substr(match.length))) return null; + return { + html: `<span class="var">${match}</span>`, + next: match.length + }; + } else { + return null; + } + }, + // number (code, i, source) => { const prev = source[i - 1]; @@ -139,7 +186,10 @@ const elements = [ }, // keyword - code => { + (code, i, source) => { + const prev = source[i - 1]; + if (prev && /[a-zA-Z]/.test(prev)) return null; + const match = keywords.filter(k => code.substr(0, k.length) == k)[0]; if (match) { if (/^[a-zA-Z]/.test(code.substr(match.length))) return null; @@ -171,16 +221,19 @@ function genHtml(source, lang) { let code = source; let html = ''; + let vars = []; + + let i = 0; + function push(token) { html += token.html; code = code.substr(token.next); + i += token.next; } - let i = 0; - while (code != '') { const parsed = elements.some(el => { - const e = el(code, i, source); + const e = el(code, i, source, vars); if (e) { push(e); return true; @@ -193,8 +246,6 @@ function genHtml(source, lang) { next: 1 }); } - - i++; } return html; |