diff options
Diffstat (limited to 'sonar-css-plugin/src/main/resources/tokenize.js')
| -rw-r--r-- | sonar-css-plugin/src/main/resources/tokenize.js | 374 |
1 files changed, 0 insertions, 374 deletions
diff --git a/sonar-css-plugin/src/main/resources/tokenize.js b/sonar-css-plugin/src/main/resources/tokenize.js deleted file mode 100644 index bbf9b1b..0000000 --- a/sonar-css-plugin/src/main/resources/tokenize.js +++ /dev/null @@ -1,374 +0,0 @@ -/* - * SonarCSS - * Copyright (C) 2018-2018 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -/* - * The MIT License (MIT) - * - * Copyright 2013 Andrey Sitnik <andrey@sitnik.ru> - * - * 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. - */ - -var SINGLE_QUOTE = '\''.charCodeAt(0); -var DOUBLE_QUOTE = '"'.charCodeAt(0); -var BACKSLASH = '\\'.charCodeAt(0); -var SLASH = '/'.charCodeAt(0); -var NEWLINE = '\n'.charCodeAt(0); -var SPACE = ' '.charCodeAt(0); -var FEED = '\f'.charCodeAt(0); -var TAB = '\t'.charCodeAt(0); -var CR = '\r'.charCodeAt(0); -var OPEN_SQUARE = '['.charCodeAt(0); -var CLOSE_SQUARE = ']'.charCodeAt(0); -var OPEN_PARENTHESES = '('.charCodeAt(0); -var CLOSE_PARENTHESES = ')'.charCodeAt(0); -var OPEN_CURLY = '{'.charCodeAt(0); -var CLOSE_CURLY = '}'.charCodeAt(0); -var SEMICOLON = ';'.charCodeAt(0); -var ASTERISK = '*'.charCodeAt(0); -var COLON = ':'.charCodeAt(0); -var AT = '@'.charCodeAt(0); - -var RE_AT_END = /[ \n\t\r\f\{\(\)'"\\;/\[\]#]/g; -var RE_WORD_END = /[ \n\t\r\f\(\)\{\}:;@!'"\\\]\[#]|\/(?=\*)/g; -var RE_BAD_BRACKET = /.[\\\/\("'\n]/; -var RE_HEX_ESCAPE = /[a-f0-9]/i; - -function tokenize(css) { - var input = {css: css, error: function() {}}; - var processor = tokenizer(input); - var tokens = []; - while (!processor.endOfFile()) { - tokens.push(processor.nextToken()); - } - return tokens; -} - -function tokenizer(input ) { - var options = {}; - var css = input.css.valueOf(); - var ignore = options.ignoreErrors; - - var code, next, quote, lines, last, content, escape, - nextLine, nextOffset, escaped, escapePos, prev, n, currentToken; - - var length = css.length; - var offset = -1; - var line = 1; - var pos = 0; - var buffer = []; - var returned = []; - - function unclosed(what) { - throw input.error('Unclosed ' + what, line, pos - offset); - } - - function endOfFile() { - return returned.length === 0 && pos >= length; - } - - function nextToken() { - if ( returned.length ) return returned.pop(); - if ( pos >= length ) return; - - code = css.charCodeAt(pos); - if ( code === NEWLINE || code === FEED || - code === CR && css.charCodeAt(pos + 1) !== NEWLINE ) { - offset = pos; - line += 1; - } - - switch ( code ) { - case NEWLINE: - case SPACE: - case TAB: - case CR: - case FEED: - next = pos; - do { - next += 1; - code = css.charCodeAt(next); - if ( code === NEWLINE ) { - offset = next; - line += 1; - } - } while ( code === SPACE || - code === NEWLINE || - code === TAB || - code === CR || - code === FEED ); - - currentToken = ['space', css.slice(pos, next)]; - pos = next - 1; - break; - - case OPEN_SQUARE: - currentToken = ['[', '[', line, pos - offset]; - break; - - case CLOSE_SQUARE: - currentToken = [']', ']', line, pos - offset]; - break; - - case OPEN_CURLY: - currentToken = ['{', '{', line, pos - offset]; - break; - - case CLOSE_CURLY: - currentToken = ['}', '}', line, pos - offset]; - break; - - case COLON: - currentToken = [':', ':', line, pos - offset]; - break; - - case SEMICOLON: - currentToken = [';', ';', line, pos - offset]; - break; - - case OPEN_PARENTHESES: - prev = buffer.length ? buffer.pop()[1] : ''; - n = css.charCodeAt(pos + 1); - if ( prev === 'url' && - n !== SINGLE_QUOTE && n !== DOUBLE_QUOTE && - n !== SPACE && n !== NEWLINE && n !== TAB && - n !== FEED && n !== CR ) { - next = pos; - do { - escaped = false; - next = css.indexOf(')', next + 1); - if ( next === -1 ) { - if ( ignore ) { - next = pos; - break; - } else { - unclosed('bracket'); - } - } - escapePos = next; - while ( css.charCodeAt(escapePos - 1) === BACKSLASH ) { - escapePos -= 1; - escaped = !escaped; - } - } while ( escaped ); - - currentToken = ['brackets', css.slice(pos, next + 1), - line, pos - offset, - line, next - offset - ]; - - pos = next; - - } else { - next = css.indexOf(')', pos + 1); - content = css.slice(pos, next + 1); - - if ( next === -1 || RE_BAD_BRACKET.test(content) ) { - currentToken = ['(', '(', line, pos - offset]; - } else { - currentToken = ['brackets', content, - line, pos - offset, - line, next - offset - ]; - pos = next; - } - } - - break; - - case CLOSE_PARENTHESES: - currentToken = [')', ')', line, pos - offset]; - break; - - case SINGLE_QUOTE: - case DOUBLE_QUOTE: - quote = code === SINGLE_QUOTE ? '\'' : '"'; - next = pos; - do { - escaped = false; - next = css.indexOf(quote, next + 1); - if ( next === -1 ) { - if ( ignore ) { - next = pos + 1; - break; - } else { - unclosed('string'); - } - } - escapePos = next; - while ( css.charCodeAt(escapePos - 1) === BACKSLASH ) { - escapePos -= 1; - escaped = !escaped; - } - } while ( escaped ); - - content = css.slice(pos, next + 1); - lines = content.split('\n'); - last = lines.length - 1; - - if ( last > 0 ) { - nextLine = line + last; - nextOffset = next - lines[last].length; - } else { - nextLine = line; - nextOffset = offset; - } - - currentToken = ['string', css.slice(pos, next + 1), - line, pos - offset, - nextLine, next - nextOffset - ]; - - offset = nextOffset; - line = nextLine; - pos = next; - break; - - case AT: - RE_AT_END.lastIndex = pos + 1; - RE_AT_END.test(css); - if ( RE_AT_END.lastIndex === 0 ) { - next = css.length - 1; - } else { - next = RE_AT_END.lastIndex - 2; - } - - currentToken = ['at-word', css.slice(pos, next + 1), - line, pos - offset, - line, next - offset - ]; - - pos = next; - break; - - case BACKSLASH: - next = pos; - escape = true; - while ( css.charCodeAt(next + 1) === BACKSLASH ) { - next += 1; - escape = !escape; - } - code = css.charCodeAt(next + 1); - if ( escape && (code !== SLASH && - code !== SPACE && - code !== NEWLINE && - code !== TAB && - code !== CR && - code !== FEED ) ) { - next += 1; - if ( RE_HEX_ESCAPE.test(css.charAt(next)) ) { - while ( RE_HEX_ESCAPE.test(css.charAt(next + 1)) ) { - next += 1; - } - if ( css.charCodeAt(next + 1) === SPACE ) { - next += 1; - } - } - } - - currentToken = ['word', css.slice(pos, next + 1), - line, pos - offset, - line, next - offset - ]; - - pos = next; - break; - - default: - if ( code === SLASH && css.charCodeAt(pos + 1) === ASTERISK ) { - next = css.indexOf('*/', pos + 2) + 1; - if ( next === 0 ) { - if ( ignore ) { - next = css.length; - } else { - unclosed('comment'); - } - } - - content = css.slice(pos, next + 1); - lines = content.split('\n'); - last = lines.length - 1; - - if ( last > 0 ) { - nextLine = line + last; - nextOffset = next - lines[last].length; - } else { - nextLine = line; - nextOffset = offset; - } - - currentToken = ['comment', content, - line, pos - offset, - nextLine, next - nextOffset - ]; - - offset = nextOffset; - line = nextLine; - pos = next; - - } else { - RE_WORD_END.lastIndex = pos + 1; - RE_WORD_END.test(css); - if ( RE_WORD_END.lastIndex === 0 ) { - next = css.length - 1; - } else { - next = RE_WORD_END.lastIndex - 2; - } - - currentToken = ['word', css.slice(pos, next + 1), - line, pos - offset, - line, next - offset - ]; - - buffer.push(currentToken); - - pos = next; - } - - break; - } - - pos++; - return currentToken; - } - - function back(token) { - returned.push(token); - } - - return { - back:back, nextToken:nextToken, endOfFile:endOfFile - }; -} |
