/* * Walk throught the children tokens tree, and execute function * for each token with a text range relative to the base token * * It stops at block tokens * * @param {Token} base * @param {Function(token, range)} iter: function to call for each range of text * @return {String} */ function walk(base, iter) { var offset = 0; var tokens = base.getTokens(); if (tokens.size === 0) { iter(base, Range(0, base.getText().length)); return base.getText(); } return tokens.reduce(function(output, token) { if (token.isBlock()) { return output; } var innerText = walk(token, function(tok, range) { var realRange = Range.moveBy(range, offset); iter(tok, realRange); }); iter( token, Range(offset, innerText.length) ); offset += innerText.length; return (output + innerText); }, ''); }
return tokens.reduce(function(output, token) { if (token.isBlock()) { return output; } var innerText = walk(token, function(tok, range) { var realRange = Range.moveBy(range, offset); iter(tok, realRange); }); iter( token, Range(offset, innerText.length) ); offset += innerText.length; return (output + innerText); }, '');