From 4c8dbed95f0c77014ea86f773bb9256e8c3ed775 Mon Sep 17 00:00:00 2001 From: Nikolay Kostyurin Date: Sat, 14 Jul 2018 01:50:33 +0200 Subject: [PATCH] feat(parser): optimize size --- packages/bbob-parser/lib/Token.js | 16 ++---- packages/bbob-parser/lib/Tokenizer.js | 19 +------ packages/bbob-parser/lib/parse.js | 58 ++++++++------------- packages/bbob-parser/test/Tokenizer.test.js | 10 +++- 4 files changed, 37 insertions(+), 66 deletions(-) diff --git a/packages/bbob-parser/lib/Token.js b/packages/bbob-parser/lib/Token.js index 6a0ca8c..1f67499 100644 --- a/packages/bbob-parser/lib/Token.js +++ b/packages/bbob-parser/lib/Token.js @@ -80,6 +80,10 @@ class Token { return isAttrValueToken(this); } + isStart() { + return isTagStart(this); + } + isEnd() { return isTagEnd(this); } @@ -117,15 +121,3 @@ module.exports.TYPE_ATTR_NAME = TOKEN_TYPE_ATTR_NAME; module.exports.TYPE_ATTR_VALUE = TOKEN_TYPE_ATTR_VALUE; module.exports.TYPE_SPACE = TOKEN_TYPE_SPACE; module.exports.TYPE_NEW_LINE = TOKEN_TYPE_NEW_LINE; - -module.exports.convertTagToText = convertTagToText; -module.exports.getTagName = getTagName; -module.exports.getTokenColumn = getTokenColumn; -module.exports.getTokenLine = getTokenLine; -module.exports.getTokenValue = getTokenValue; -module.exports.isAttrNameToken = isAttrNameToken; -module.exports.isAttrValueToken = isAttrValueToken; -module.exports.isTagStart = isTagStart; -module.exports.isTagToken = isTagToken; -module.exports.isTextToken = isTextToken; -module.exports.isTagEnd = isTagEnd; diff --git a/packages/bbob-parser/lib/Tokenizer.js b/packages/bbob-parser/lib/Tokenizer.js index f88133a..1187e92 100644 --- a/packages/bbob-parser/lib/Tokenizer.js +++ b/packages/bbob-parser/lib/Tokenizer.js @@ -339,27 +339,10 @@ class Tokenizer { } isTokenNested(token) { - const value = getChar(OPEN_BRAKET) + getChar(SLASH) + Token.getTokenValue(token); + const value = getChar(OPEN_BRAKET) + getChar(SLASH) + token.getValue(); return this.buffer.indexOf(value) > -1; } } -new Tokenizer('[ [g]G[/g] ]').tokenize() - module.exports = Tokenizer; module.exports.createTokenOfType = createTokenOfType; -module.exports.TYPE = { - WORD: Token.TYPE_WORD, - TAG: Token.TYPE_TAG, - ATTR_NAME: Token.TYPE_ATTR_NAME, - ATTR_VALUE: Token.TYPE_ATTR_VALUE, - SPACE: Token.TYPE_SPACE, - NEW_LINE: Token.TYPE_NEW_LINE, -}; -module.exports.TOKEN = { - TYPE_ID: Token.TYPE_ID, - VALUE_ID: Token.VALUE_ID, - LINE_ID: Token.LINE_ID, - COLUMN_ID: Token.COLUMN_ID, -}; - diff --git a/packages/bbob-parser/lib/parse.js b/packages/bbob-parser/lib/parse.js index 4521cc1..32207d7 100644 --- a/packages/bbob-parser/lib/parse.js +++ b/packages/bbob-parser/lib/parse.js @@ -1,17 +1,3 @@ -const { - convertTagToText, - getTagName, - getTokenColumn, - getTokenLine, - getTokenValue, - isAttrNameToken, - isAttrValueToken, - isTagStart, - isTagToken, - isTextToken, - isTagEnd, -} = require('./Token'); - const Tokenizer = require('./Tokenizer'); const TagNode = require('./TagNode'); @@ -67,14 +53,16 @@ const getTagNode = () => (tagNodes.length ? tagNodes[tagNodes.length - 1] : null /** * @private + * @param {Token} token * @return {Array} */ -const createTagNode = token => tagNodes.push(newTagNode(getTokenValue(token))); +const createTagNode = token => tagNodes.push(newTagNode(token.getValue())); /** * @private + * @param {Token} token * @return {Array} */ -const createTagNodeAttrName = token => tagNodesAttrName.push(getTokenValue(token)); +const createTagNodeAttrName = token => tagNodesAttrName.push(token.getValue()); /** * @private @@ -140,10 +128,10 @@ const isAllowedTag = (value) => { }; /** * @private - * @param token + * @param {Token} token */ const handleTagStart = (token) => { - if (isTagStart(token)) { + if (token.isStart()) { createTagNode(token); if (isTagNested(token)) { @@ -157,10 +145,10 @@ const handleTagStart = (token) => { /** * @private - * @param token + * @param {Token} token */ const handleTagEnd = (token) => { - if (isTagEnd(token)) { + if (token.isEnd()) { clearTagNode(); const lastNestedNode = nestedNodes.pop(); @@ -168,9 +156,9 @@ const handleTagEnd = (token) => { if (lastNestedNode) { appendNode(lastNestedNode); } else if (options.onError) { - const tag = getTokenValue(token); - const line = getTokenLine(token); - const column = getTokenColumn(token); + const tag = token.getValue(); + const line = token.getLine(); + const column = token.getColumn(); options.onError({ message: `Inconsistent tag '${tag}' on line ${line} and column ${column}`, lineNumber: line, @@ -182,41 +170,41 @@ const handleTagEnd = (token) => { /** * @private - * @param token + * @param {Token} token */ const handleTagToken = (token) => { - if (isTagToken(token)) { - if (isAllowedTag(getTagName(token))) { + if (token.isTag()) { + if (isAllowedTag(token.getName())) { // [tag] handleTagStart(token); // [/tag] handleTagEnd(token); } else { - appendNode(convertTagToText(token)); + appendNode(token.toString()); } } }; /** * @private - * @param token + * @param {Token} token */ const handleTagNode = (token) => { const tagNode = getTagNode(); if (tagNode) { - if (isAttrNameToken(token)) { + if (token.isAttrName()) { createTagNodeAttrName(token); tagNode.attr(getTagNodeAttrName(), null); - } else if (isAttrValueToken(token)) { - tagNode.attr(getTagNodeAttrName(), getTokenValue(token)); + } else if (token.isAttrValue()) { + tagNode.attr(getTagNodeAttrName(), token.getValue()); clearTagNodeAttrName(); - } else if (isTextToken(token)) { - tagNode.append(getTokenValue(token)); + } else if (token.isText()) { + tagNode.append(token.getValue()); } - } else if (isTextToken(token)) { - appendNode(getTokenValue(token)); + } else if (token.isText()) { + appendNode(token.getValue()); } }; diff --git a/packages/bbob-parser/test/Tokenizer.test.js b/packages/bbob-parser/test/Tokenizer.test.js index afa2e18..cc04b14 100644 --- a/packages/bbob-parser/test/Tokenizer.test.js +++ b/packages/bbob-parser/test/Tokenizer.test.js @@ -1,6 +1,14 @@ const Tokenizer = require('../lib/Tokenizer'); +const Token = require('../lib/Token'); -const { TYPE } = Tokenizer; +const TYPE = { + WORD: Token.TYPE_WORD, + TAG: Token.TYPE_TAG, + ATTR_NAME: Token.TYPE_ATTR_NAME, + ATTR_VALUE: Token.TYPE_ATTR_VALUE, + SPACE: Token.TYPE_SPACE, + NEW_LINE: Token.TYPE_NEW_LINE, +}; const tokenize = input => (new Tokenizer(input).tokenize());