diff options
author | Minteck <contact@minteck.org> | 2021-12-21 15:25:09 +0100 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2021-12-21 15:25:09 +0100 |
commit | e703e51c9c09b22e3bcda9a1faf1e05897f60616 (patch) | |
tree | 4fd67a209ad6988fbf569d7dff8bc37ba45baf95 /_mint/node_modules/js-beautify/js/src/html/tokenizer.js | |
download | mint-e703e51c9c09b22e3bcda9a1faf1e05897f60616.tar.gz mint-e703e51c9c09b22e3bcda9a1faf1e05897f60616.tar.bz2 mint-e703e51c9c09b22e3bcda9a1faf1e05897f60616.zip |
Initial commit
Diffstat (limited to '_mint/node_modules/js-beautify/js/src/html/tokenizer.js')
-rw-r--r-- | _mint/node_modules/js-beautify/js/src/html/tokenizer.js | 332 |
1 files changed, 332 insertions, 0 deletions
diff --git a/_mint/node_modules/js-beautify/js/src/html/tokenizer.js b/_mint/node_modules/js-beautify/js/src/html/tokenizer.js new file mode 100644 index 0000000..6c473af --- /dev/null +++ b/_mint/node_modules/js-beautify/js/src/html/tokenizer.js @@ -0,0 +1,332 @@ +/*jshint node:true */ +/* + + The MIT License (MIT) + + Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +'use strict'; + +var BaseTokenizer = require('../core/tokenizer').Tokenizer; +var BASETOKEN = require('../core/tokenizer').TOKEN; +var Directives = require('../core/directives').Directives; +var TemplatablePattern = require('../core/templatablepattern').TemplatablePattern; +var Pattern = require('../core/pattern').Pattern; + +var TOKEN = { + TAG_OPEN: 'TK_TAG_OPEN', + TAG_CLOSE: 'TK_TAG_CLOSE', + ATTRIBUTE: 'TK_ATTRIBUTE', + EQUALS: 'TK_EQUALS', + VALUE: 'TK_VALUE', + COMMENT: 'TK_COMMENT', + TEXT: 'TK_TEXT', + UNKNOWN: 'TK_UNKNOWN', + START: BASETOKEN.START, + RAW: BASETOKEN.RAW, + EOF: BASETOKEN.EOF +}; + +var directives_core = new Directives(/<\!--/, /-->/); + +var Tokenizer = function(input_string, options) { + BaseTokenizer.call(this, input_string, options); + this._current_tag_name = ''; + + // Words end at whitespace or when a tag starts + // if we are indenting handlebars, they are considered tags + var templatable_reader = new TemplatablePattern(this._input).read_options(this._options); + var pattern_reader = new Pattern(this._input); + + this.__patterns = { + word: templatable_reader.until(/[\n\r\t <]/), + single_quote: templatable_reader.until_after(/'/), + double_quote: templatable_reader.until_after(/"/), + attribute: templatable_reader.until(/[\n\r\t =>]|\/>/), + element_name: templatable_reader.until(/[\n\r\t >\/]/), + + handlebars_comment: pattern_reader.starting_with(/{{!--/).until_after(/--}}/), + handlebars: pattern_reader.starting_with(/{{/).until_after(/}}/), + handlebars_open: pattern_reader.until(/[\n\r\t }]/), + handlebars_raw_close: pattern_reader.until(/}}/), + comment: pattern_reader.starting_with(/<!--/).until_after(/-->/), + cdata: pattern_reader.starting_with(/<!\[CDATA\[/).until_after(/]]>/), + // https://en.wikipedia.org/wiki/Conditional_comment + conditional_comment: pattern_reader.starting_with(/<!\[/).until_after(/]>/), + processing: pattern_reader.starting_with(/<\?/).until_after(/\?>/) + }; + + if (this._options.indent_handlebars) { + this.__patterns.word = this.__patterns.word.exclude('handlebars'); + } + + this._unformatted_content_delimiter = null; + + if (this._options.unformatted_content_delimiter) { + var literal_regexp = this._input.get_literal_regexp(this._options.unformatted_content_delimiter); + this.__patterns.unformatted_content_delimiter = + pattern_reader.matching(literal_regexp) + .until_after(literal_regexp); + } +}; +Tokenizer.prototype = new BaseTokenizer(); + +Tokenizer.prototype._is_comment = function(current_token) { // jshint unused:false + return false; //current_token.type === TOKEN.COMMENT || current_token.type === TOKEN.UNKNOWN; +}; + +Tokenizer.prototype._is_opening = function(current_token) { + return current_token.type === TOKEN.TAG_OPEN; +}; + +Tokenizer.prototype._is_closing = function(current_token, open_token) { + return current_token.type === TOKEN.TAG_CLOSE && + (open_token && ( + ((current_token.text === '>' || current_token.text === '/>') && open_token.text[0] === '<') || + (current_token.text === '}}' && open_token.text[0] === '{' && open_token.text[1] === '{'))); +}; + +Tokenizer.prototype._reset = function() { + this._current_tag_name = ''; +}; + +Tokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false + var token = null; + this._readWhitespace(); + var c = this._input.peek(); + + if (c === null) { + return this._create_token(TOKEN.EOF, ''); + } + + token = token || this._read_open_handlebars(c, open_token); + token = token || this._read_attribute(c, previous_token, open_token); + token = token || this._read_close(c, open_token); + token = token || this._read_raw_content(c, previous_token, open_token); + token = token || this._read_content_word(c); + token = token || this._read_comment_or_cdata(c); + token = token || this._read_processing(c); + token = token || this._read_open(c, open_token); + token = token || this._create_token(TOKEN.UNKNOWN, this._input.next()); + + return token; +}; + +Tokenizer.prototype._read_comment_or_cdata = function(c) { // jshint unused:false + var token = null; + var resulting_string = null; + var directives = null; + + if (c === '<') { + var peek1 = this._input.peek(1); + // We treat all comments as literals, even more than preformatted tags + // we only look for the appropriate closing marker + if (peek1 === '!') { + resulting_string = this.__patterns.comment.read(); + + // only process directive on html comments + if (resulting_string) { + directives = directives_core.get_directives(resulting_string); + if (directives && directives.ignore === 'start') { + resulting_string += directives_core.readIgnored(this._input); + } + } else { + resulting_string = this.__patterns.cdata.read(); + } + } + + if (resulting_string) { + token = this._create_token(TOKEN.COMMENT, resulting_string); + token.directives = directives; + } + } + + return token; +}; + +Tokenizer.prototype._read_processing = function(c) { // jshint unused:false + var token = null; + var resulting_string = null; + var directives = null; + + if (c === '<') { + var peek1 = this._input.peek(1); + if (peek1 === '!' || peek1 === '?') { + resulting_string = this.__patterns.conditional_comment.read(); + resulting_string = resulting_string || this.__patterns.processing.read(); + } + + if (resulting_string) { + token = this._create_token(TOKEN.COMMENT, resulting_string); + token.directives = directives; + } + } + + return token; +}; + +Tokenizer.prototype._read_open = function(c, open_token) { + var resulting_string = null; + var token = null; + if (!open_token) { + if (c === '<') { + + resulting_string = this._input.next(); + if (this._input.peek() === '/') { + resulting_string += this._input.next(); + } + resulting_string += this.__patterns.element_name.read(); + token = this._create_token(TOKEN.TAG_OPEN, resulting_string); + } + } + return token; +}; + +Tokenizer.prototype._read_open_handlebars = function(c, open_token) { + var resulting_string = null; + var token = null; + if (!open_token) { + if (this._options.indent_handlebars && c === '{' && this._input.peek(1) === '{') { + if (this._input.peek(2) === '!') { + resulting_string = this.__patterns.handlebars_comment.read(); + resulting_string = resulting_string || this.__patterns.handlebars.read(); + token = this._create_token(TOKEN.COMMENT, resulting_string); + } else { + resulting_string = this.__patterns.handlebars_open.read(); + token = this._create_token(TOKEN.TAG_OPEN, resulting_string); + } + } + } + return token; +}; + + +Tokenizer.prototype._read_close = function(c, open_token) { + var resulting_string = null; + var token = null; + if (open_token) { + if (open_token.text[0] === '<' && (c === '>' || (c === '/' && this._input.peek(1) === '>'))) { + resulting_string = this._input.next(); + if (c === '/') { // for close tag "/>" + resulting_string += this._input.next(); + } + token = this._create_token(TOKEN.TAG_CLOSE, resulting_string); + } else if (open_token.text[0] === '{' && c === '}' && this._input.peek(1) === '}') { + this._input.next(); + this._input.next(); + token = this._create_token(TOKEN.TAG_CLOSE, '}}'); + } + } + + return token; +}; + +Tokenizer.prototype._read_attribute = function(c, previous_token, open_token) { + var token = null; + var resulting_string = ''; + if (open_token && open_token.text[0] === '<') { + + if (c === '=') { + token = this._create_token(TOKEN.EQUALS, this._input.next()); + } else if (c === '"' || c === "'") { + var content = this._input.next(); + if (c === '"') { + content += this.__patterns.double_quote.read(); + } else { + content += this.__patterns.single_quote.read(); + } + token = this._create_token(TOKEN.VALUE, content); + } else { + resulting_string = this.__patterns.attribute.read(); + + if (resulting_string) { + if (previous_token.type === TOKEN.EQUALS) { + token = this._create_token(TOKEN.VALUE, resulting_string); + } else { + token = this._create_token(TOKEN.ATTRIBUTE, resulting_string); + } + } + } + } + return token; +}; + +Tokenizer.prototype._is_content_unformatted = function(tag_name) { + // void_elements have no content and so cannot have unformatted content + // script and style tags should always be read as unformatted content + // finally content_unformatted and unformatted element contents are unformatted + return this._options.void_elements.indexOf(tag_name) === -1 && + (this._options.content_unformatted.indexOf(tag_name) !== -1 || + this._options.unformatted.indexOf(tag_name) !== -1); +}; + + +Tokenizer.prototype._read_raw_content = function(c, previous_token, open_token) { // jshint unused:false + var resulting_string = ''; + if (open_token && open_token.text[0] === '{') { + resulting_string = this.__patterns.handlebars_raw_close.read(); + } else if (previous_token.type === TOKEN.TAG_CLOSE && + previous_token.opened.text[0] === '<' && previous_token.text[0] !== '/') { + // ^^ empty tag has no content + var tag_name = previous_token.opened.text.substr(1).toLowerCase(); + if (tag_name === 'script' || tag_name === 'style') { + // Script and style tags are allowed to have comments wrapping their content + // or just have regular content. + var token = this._read_comment_or_cdata(c); + if (token) { + token.type = TOKEN.TEXT; + return token; + } + resulting_string = this._input.readUntil(new RegExp('</' + tag_name + '[\\n\\r\\t ]*?>', 'ig')); + } else if (this._is_content_unformatted(tag_name)) { + + resulting_string = this._input.readUntil(new RegExp('</' + tag_name + '[\\n\\r\\t ]*?>', 'ig')); + } + } + + if (resulting_string) { + return this._create_token(TOKEN.TEXT, resulting_string); + } + + return null; +}; + +Tokenizer.prototype._read_content_word = function(c) { + var resulting_string = ''; + if (this._options.unformatted_content_delimiter) { + if (c === this._options.unformatted_content_delimiter[0]) { + resulting_string = this.__patterns.unformatted_content_delimiter.read(); + } + } + + if (!resulting_string) { + resulting_string = this.__patterns.word.read(); + } + if (resulting_string) { + return this._create_token(TOKEN.TEXT, resulting_string); + } +}; + +module.exports.Tokenizer = Tokenizer; +module.exports.TOKEN = TOKEN; |