| let Comment = require('postcss/lib/comment') | |
| let Parser = require('postcss/lib/parser') | |
| let tokenizer = require('postcss/lib/tokenize') | |
| class SafeParser extends Parser { | |
| checkMissedSemicolon() {} | |
| comment(token) { | |
| let node = new Comment() | |
| this.init(node, token[2]) | |
| let pos = | |
| this.input.fromOffset(token[3]) || | |
| this.input.fromOffset(this.input.css.length - 1) | |
| node.source.end = { | |
| column: pos.col, | |
| line: pos.line, | |
| offset: token[3] + 1 | |
| } | |
| let text = token[1].slice(2) | |
| if (text.slice(-2) === '*/') text = text.slice(0, -2) | |
| if (/^\s*$/.test(text)) { | |
| node.text = '' | |
| node.raws.left = text | |
| node.raws.right = '' | |
| } else { | |
| let match = text.match(/^(\s*)([^]*\S)(\s*)$/) | |
| node.text = match[2] | |
| node.raws.left = match[1] | |
| node.raws.right = match[3] | |
| } | |
| } | |
| createTokenizer() { | |
| this.tokenizer = tokenizer(this.input, { ignoreErrors: true }) | |
| } | |
| decl(tokens) { | |
| if (tokens.length > 1 && tokens.some(i => i[0] === 'word')) { | |
| super.decl(tokens) | |
| } | |
| } | |
| doubleColon() {} | |
| endFile() { | |
| if (this.current.nodes && this.current.nodes.length) { | |
| this.current.raws.semicolon = this.semicolon | |
| } | |
| this.current.raws.after = (this.current.raws.after || '') + this.spaces | |
| while (this.current.parent) { | |
| this.current = this.current.parent | |
| this.current.raws.after = '' | |
| } | |
| this.root.source.end = this.getPosition(this.tokenizer.position()) | |
| } | |
| precheckMissedSemicolon(tokens) { | |
| let colon = this.colon(tokens) | |
| if (colon === false) return | |
| let nextStart, prevEnd | |
| for (nextStart = colon - 1; nextStart >= 0; nextStart--) { | |
| if (tokens[nextStart][0] === 'word') break | |
| } | |
| if (nextStart === 0 || nextStart < 0) return | |
| for (prevEnd = nextStart - 1; prevEnd >= 0; prevEnd--) { | |
| if (tokens[prevEnd][0] !== 'space') { | |
| prevEnd += 1 | |
| break | |
| } | |
| } | |
| let other = tokens.slice(nextStart) | |
| let spaces = tokens.slice(prevEnd, nextStart) | |
| tokens.splice(prevEnd, tokens.length - prevEnd) | |
| this.spaces = spaces.map(i => i[1]).join('') | |
| this.decl(other) | |
| } | |
| unclosedBracket() {} | |
| unexpectedClose() { | |
| this.current.raws.after += '}' | |
| } | |
| unknownWord(tokens) { | |
| this.spaces += tokens.map(i => i[1]).join('') | |
| } | |
| unnamedAtrule(node) { | |
| node.name = '' | |
| } | |
| } | |
| module.exports = SafeParser |