summaryrefslogtreecommitdiff
path: root/src/common/text
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2017-02-09 20:13:44 +0900
committersyuilo <syuilotan@yahoo.co.jp>2017-02-09 20:13:44 +0900
commitdf5a8768ece9801c08dfcca3e690f296de8f3df6 (patch)
treef197749a6cbf1d2d888d85ab53bd5dda763798d2 /src/common/text
parent#139 (diff)
downloadsharkey-df5a8768ece9801c08dfcca3e690f296de8f3df6.tar.gz
sharkey-df5a8768ece9801c08dfcca3e690f296de8f3df6.tar.bz2
sharkey-df5a8768ece9801c08dfcca3e690f296de8f3df6.zip
変数サポート
Diffstat (limited to 'src/common/text')
-rw-r--r--src/common/text/elements/code.js63
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;