UNPKG

oxe

Version:

A mighty tiny web components framework/library

162 lines (147 loc) 5.19 kB
const $string = 'string'; const $number = 'number'; const $binder = 'binder'; const $unknown = 'unknown'; const $variable = 'variable'; const $function = 'function'; const finish = function (node, tree) { if (node.value === 'NaN') { node.type = 'nan'; } else if (node.value === 'null') { node.type = 'null'; } else if (node.value === 'true') { node.type = 'boolean'; } else if (node.value === 'false') { node.type = 'boolean'; } else if (node.value === 'undefined') { node.type = 'undefined'; } else if (node.type === $number) { } else if (node.type === $string) { } else if (node.type === $function) { } else if (node.type === $binder) { } else if (node.type === $variable) { } else { node.type = 'unknown'; } tree.push(node); return null; }; const unknown = (value, depth) => ({ value, type: '', depth }); const binder = (value, depth) => ({ value, type: $binder, depth }); const string = (value, depth) => ({ value, type: $string, depth }); const number = (value, depth) => ({ value, type: $number, depth }); const variable = (value, depth) => ({ value, type: $variable, depth }); export default function expression (expression, data) { const tree = []; let node, depth = 0; // let node = { value: '', type: 'binder' }; let level = ''; for (let i = 0; i < expression.length; i++) { const c = expression[ i ]; const next = expression[ i + 1 ]; const previous = expression[ i - 1 ]; if ( '=>{' === `${node?.value}${c}` || '=>' === `${node?.value}${c}` || '){' === `${node?.value}${c}` ) { level = 'function'; console.log(level, `${node?.value}${c}`); } console.log(level, `${node?.value}${c}`); if (depth === 0) { if (' ' === c) { continue; } else if (',' === c) { finish(node, tree); node = unknown(c, depth); depth--; } else if (':' === c) { finish(node, tree); depth++; node = unknown(c, depth); } else if (node?.type === $binder) { node.value += c; } else { node = binder(c, depth); } } else if (node?.type === $string) { node.value += c; if (node.value[ 0 ] === c && previous !== '\\') { finish(node, tree); node = unknown(c, depth); depth--; } } else if (' ' === c) { continue; } else if ( ';' === c || '=' === c || '<' === c || '>' === c ) { finish(node, tree); node = unknown(c, depth); } else if (',' === c) { finish(node, tree); depth--; node = unknown(c, depth); } else if (':' === c) { if (depth > 0) { node.type = ''; finish(node, tree); } node = unknown(c, depth); } else if ('[' === c || '{' === c) { finish(node, tree); node = unknown(c, depth); depth++; } else if (']' === c || '}' === c) { finish(node, tree); depth--; node = unknown(c, depth); } else if ('(' === c) { node.type = $variable; finish(node, tree); node = unknown(c, depth); depth++; } else if (')' === c) { finish(node, tree); depth--; node = unknown(c, depth); } else if (node?.type === $variable) { if (c === '?' && node?.value?.slice(-1) !== '.') { finish(node, tree); node = unknown(c, depth); } else { node.value += c; } } else if (c === '?') { finish(node, tree); node = unknown(c, depth); } else if (/'|`|"/.test(c) && !node?.type) { node = string(c, depth); depth++; } else if (/[0-9.]/.test(c) && !node?.type) { node = number(c, depth); } else if (/[a-zA-Z$_.?]/.test(c) && !node?.type) { node = variable(c, depth); } else { node.value += c; } console.log(node, c); } return tree; }; // expression(`bin1:()=>test`); // expression(`bin1:()=>{test}`); // expression(`bin1:()=>({test})`); // expression(`bin1:var1, bin2:var2=var3, bin3:'string'`); expression(`bin1:{key1:var1,key2:var2,key3:{key4:var34}}`); // expression(`bin1:var1, bin2:var2=var3, bin3:'string', bin4:123, bin5:{foo:bar,deep:{test}}`); // const object = /([a-zA-Z$_][a-z0-9A-Z$_]+):({.*?})(?:,|$)/; // const array = /([a-zA-Z$_][a-z0-9A-Z$_]+):(\[.*?\])(?:,|$)/; // const single = /([a-zA-Z$_][a-z0-9A-Z$_]+):('.*')(?:,|$)/; // const double = /([a-zA-Z$_][a-z0-9A-Z$_]+):(".*")(?:,|$)/; // const tick = /([a-zA-Z$_][a-z0-9A-Z$_]+):(`.*`)(?:,|$)/; // const fun = /([a-zA-Z$_][a-z0-9A-Z$_]+):(.*?=>.*?)(?:,|$)/;