mirror of
https://iceshrimp.dev/limepotato/jormungandr-bite.git
synced 2024-11-15 14:37:36 -07:00
変数サポート
This commit is contained in:
parent
1f9d4a125d
commit
a3de6c36b9
2 changed files with 64 additions and 8 deletions
|
@ -80,6 +80,14 @@ const symbols = [
|
||||||
'~'
|
'~'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// 変数宣言
|
||||||
|
const varDef = [
|
||||||
|
'var',
|
||||||
|
'const',
|
||||||
|
'let',
|
||||||
|
'mut'
|
||||||
|
];
|
||||||
|
|
||||||
const elements = [
|
const elements = [
|
||||||
// comment
|
// comment
|
||||||
code => {
|
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
|
// number
|
||||||
(code, i, source) => {
|
(code, i, source) => {
|
||||||
const prev = source[i - 1];
|
const prev = source[i - 1];
|
||||||
|
@ -139,7 +186,10 @@ const elements = [
|
||||||
},
|
},
|
||||||
|
|
||||||
// keyword
|
// 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];
|
const match = keywords.filter(k => code.substr(0, k.length) == k)[0];
|
||||||
if (match) {
|
if (match) {
|
||||||
if (/^[a-zA-Z]/.test(code.substr(match.length))) return null;
|
if (/^[a-zA-Z]/.test(code.substr(match.length))) return null;
|
||||||
|
@ -171,16 +221,19 @@ function genHtml(source, lang) {
|
||||||
let code = source;
|
let code = source;
|
||||||
let html = '';
|
let html = '';
|
||||||
|
|
||||||
function push(token) {
|
let vars = [];
|
||||||
html += token.html;
|
|
||||||
code = code.substr(token.next);
|
|
||||||
}
|
|
||||||
|
|
||||||
let i = 0;
|
let i = 0;
|
||||||
|
|
||||||
|
function push(token) {
|
||||||
|
html += token.html;
|
||||||
|
code = code.substr(token.next);
|
||||||
|
i += token.next;
|
||||||
|
}
|
||||||
|
|
||||||
while (code != '') {
|
while (code != '') {
|
||||||
const parsed = elements.some(el => {
|
const parsed = elements.some(el => {
|
||||||
const e = el(code, i, source);
|
const e = el(code, i, source, vars);
|
||||||
if (e) {
|
if (e) {
|
||||||
push(e);
|
push(e);
|
||||||
return true;
|
return true;
|
||||||
|
@ -193,8 +246,6 @@ function genHtml(source, lang) {
|
||||||
next: 1
|
next: 1
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
|
|
|
@ -130,6 +130,11 @@ pre > code
|
||||||
.number
|
.number
|
||||||
color #ae81ff
|
color #ae81ff
|
||||||
|
|
||||||
|
.var:not(.keyword)
|
||||||
|
font-weight bold
|
||||||
|
font-style italic
|
||||||
|
//text-decoration underline
|
||||||
|
|
||||||
mk-locker
|
mk-locker
|
||||||
display block
|
display block
|
||||||
position fixed
|
position fixed
|
||||||
|
|
Loading…
Reference in a new issue