| var List = require('../utils/list'); |
| |
| function getFirstMatchNode(matchNode) { |
| if (matchNode.type === 'ASTNode') { |
| return matchNode.node; |
| } |
| |
| return getFirstMatchNode(matchNode.match[0]); |
| } |
| |
| function getLastMatchNode(matchNode) { |
| if (matchNode.type === 'ASTNode') { |
| return matchNode.node; |
| } |
| |
| return getLastMatchNode(matchNode.match[matchNode.match.length - 1]); |
| } |
| |
| function matchFragments(lexer, ast, match, type, name) { |
| function findFragments(matchNode) { |
| if (matchNode.type === 'ASTNode') { |
| return; |
| } |
| |
| if (matchNode.syntax.type === type && |
| matchNode.syntax.name === name) { |
| var start = getFirstMatchNode(matchNode); |
| var end = getLastMatchNode(matchNode); |
| |
| lexer.syntax.walk(ast, function(node, item, list) { |
| if (node === start) { |
| var nodes = new List(); |
| |
| do { |
| nodes.appendData(item.data); |
| |
| if (item.data === end) { |
| break; |
| } |
| |
| item = item.next; |
| } while (item !== null); |
| |
| fragments.push({ |
| parent: list, |
| nodes: nodes |
| }); |
| } |
| }); |
| } |
| |
| matchNode.match.forEach(findFragments); |
| } |
| |
| var fragments = []; |
| |
| if (match.matched !== null) { |
| findFragments(match.matched); |
| } |
| |
| return fragments; |
| } |
| |
| module.exports = { |
| matchFragments: matchFragments |
| }; |