変数サポート
This commit is contained in:
		
							parent
							
								
									21b72f7854
								
							
						
					
					
						commit
						df5a8768ec
					
				
					 2 changed files with 64 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -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 = '';
 | 
			
		||||
 | 
			
		||||
	function push(token) {
 | 
			
		||||
		html += token.html;
 | 
			
		||||
		code = code.substr(token.next);
 | 
			
		||||
	}
 | 
			
		||||
	let vars = [];
 | 
			
		||||
 | 
			
		||||
	let i = 0;
 | 
			
		||||
 | 
			
		||||
	function push(token) {
 | 
			
		||||
		html += token.html;
 | 
			
		||||
		code = code.substr(token.next);
 | 
			
		||||
		i += token.next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -130,6 +130,11 @@ pre > code
 | 
			
		|||
	.number
 | 
			
		||||
		color #ae81ff
 | 
			
		||||
 | 
			
		||||
	.var:not(.keyword)
 | 
			
		||||
		font-weight bold
 | 
			
		||||
		font-style italic
 | 
			
		||||
		//text-decoration underline
 | 
			
		||||
 | 
			
		||||
mk-locker
 | 
			
		||||
	display block
 | 
			
		||||
	position fixed
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue