| import { tokenize } from '../tokenizer/index.js'; |
| |
| const astToTokens = { |
| decorator(handlers) { |
| const tokens = []; |
| let curNode = null; |
| |
| return { |
| ...handlers, |
| node(node) { |
| const tmp = curNode; |
| curNode = node; |
| handlers.node.call(this, node); |
| curNode = tmp; |
| }, |
| emit(value, type, auto) { |
| tokens.push({ |
| type, |
| value, |
| node: auto ? null : curNode |
| }); |
| }, |
| result() { |
| return tokens; |
| } |
| }; |
| } |
| }; |
| |
| function stringToTokens(str) { |
| const tokens = []; |
| |
| tokenize(str, (type, start, end) => |
| tokens.push({ |
| type, |
| value: str.slice(start, end), |
| node: null |
| }) |
| ); |
| |
| return tokens; |
| } |
| |
| export default function(value, syntax) { |
| if (typeof value === 'string') { |
| return stringToTokens(value); |
| } |
| |
| return syntax.generate(value, astToTokens); |
| }; |