UNPKG

rwt-orthographic-earth

Version:

An orthographic projection of Earth, a standards-based DOM Component

409 lines (343 loc) 22.4 kB
/* The code in this file (c) 2103, Tab Atkins, Jr. http://www.xanthir.com/blog/b4Ju0. It is licensed under the CC0 license. */ var between = function(e, n, t) { return e >= n && e <= t; }; function digit(e) { return between(e, 48, 57); } function hexdigit(e) { return digit(e) || between(e, 65, 70) || between(e, 97, 102); } function uppercaseletter(e) { return between(e, 65, 90); } function lowercaseletter(e) { return between(e, 97, 122); } function letter(e) { return uppercaseletter(e) || lowercaseletter(e); } function nonascii(e) { return e >= 160; } function namestartchar(e) { return letter(e) || nonascii(e) || 95 == e; } function namechar(e) { return namestartchar(e) || digit(e) || 45 == e; } function nonprintable(e) { return between(e, 0, 8) || between(e, 14, 31) || between(e, 127, 159); } function newline(e) { return 10 == e || 13 == e; } function whitespace(e) { return newline(e) || 9 == e || 32 == e; } function badescape(e) { return newline(e) || isNaN(e); } var maximumallowedcodepoint = 1114111; export default function cssTokenizer(e, n) { null == n && (n = { transformFunctionWhitespace: !1, scientificNotation: !1 }); for (var t, o, r = -1, i = [], a = 'data', s = 0, p = 0, u = 0, d = { line: s, column: p }, next = function(n) { return void 0 === n && (n = 1), e.charCodeAt(r + n); }, consume = function(n) { return void 0 === n && (n = 1), r += n, newline(t = e.charCodeAt(r)) ? (s += 1, u = p, p = 0) : p += n, !0; }, reconsume = function() { return r -= 1, newline(t) ? (s -= 1, p = u) : p -= 1, d.line = s, d.column = p, !0; }, eof = function() { return r >= e.length; }, emit = function(e) { return e ? e.finish() : e = o.finish(), !0 === n.loc && (e.loc = {}, e.loc.start = { line: d.line, column: d.column }, d = { line: s, column: p }, e.loc.end = d), i.push(e), o = void 0, !0; }, create = function(e) { return o = e, !0; }, parseerror = function() { return console.log('Parse error at index ' + r + ', processing codepoint 0x' + t.toString(16) + ' in state ' + a + '.'), !0; }, catchfire = function(e) { return console.log('MAJOR SPEC ERROR: ' + e), !0; }, switchto = function(e) { return a = e, !0; }, consumeEscape = function() { if (consume(), hexdigit(t)) { for (var e = [], n = 0; n < 6 && hexdigit(t); n++) e.push(t), consume(); var o = parseInt(e.map(String.fromCharCode).join(''), 16); return o > maximumallowedcodepoint && (o = 65533), whitespace(t) || reconsume(), o; } return t; }; ;) { if (r > 2 * e.length) return 'I\'m infinite-looping!'; switch (consume(), a) { case 'data': if (whitespace(t)) for (emit(new WhitespaceToken); whitespace(next()); ) consume(); else if (34 == t) switchto('double-quote-string'); else if (35 == t) switchto('hash'); else if (39 == t) switchto('single-quote-string'); else if (40 == t) emit(new OpenParenToken); else if (41 == t) emit(new CloseParenToken); else if (43 == t) digit(next()) || 46 == next() && digit(next(2)) ? switchto('number') && reconsume() : emit(new DelimToken(t)); else if (45 == t) 45 == next(1) && 62 == next(2) ? consume(2) && emit(new CDCToken) : digit(next()) || 46 == next(1) && digit(next(2)) ? switchto('number') && reconsume() : switchto('ident') && reconsume(); else if (46 == t) digit(next()) ? switchto('number') && reconsume() : emit(new DelimToken(t)); else if (47 == t) 42 == next() ? consume() && switchto('comment') : emit(new DelimToken(t)); else if (58 == t) emit(new ColonToken); else if (59 == t) emit(new SemicolonToken); else if (60 == t) 33 == next(1) && 45 == next(2) && 45 == next(3) ? consume(3) && emit(new CDOToken) : emit(new DelimToken(t)); else if (64 == t) switchto('at-keyword'); else if (91 == t) emit(new OpenSquareToken); else if (92 == t) badescape(next()) ? parseerror() && emit(new DelimToken(t)) : switchto('ident') && reconsume(); else if (93 == t) emit(new CloseSquareToken); else if (123 == t) emit(new OpenCurlyToken); else if (125 == t) emit(new CloseCurlyToken); else if (digit(t)) switchto('number') && reconsume(); else if (85 == t || 117 == t) 43 == next(1) && hexdigit(next(2)) ? consume() && switchto('unicode-range') : switchto('ident') && reconsume(); else if (namestartchar(t)) switchto('ident') && reconsume(); else { if (eof()) return emit(new EOFToken), i; emit(new DelimToken(t)); } break; case 'double-quote-string': null == o && create(new StringToken), 34 == t ? emit() && switchto('data') : eof() ? parseerror() && emit() && switchto('data') && reconsume() : newline(t) ? parseerror() && emit(new BadStringToken) && switchto('data') && reconsume() : 92 == t ? badescape(next()) ? parseerror() && emit(new BadStringToken) && switchto('data') : newline(next()) ? consume() : o.append(consumeEscape()) : o.append(t); break; case 'single-quote-string': null == o && create(new StringToken), 39 == t ? emit() && switchto('data') : eof() ? parseerror() && emit() && switchto('data') : newline(t) ? parseerror() && emit(new BadStringToken) && switchto('data') && reconsume() : 92 == t ? badescape(next()) ? parseerror() && emit(new BadStringToken) && switchto('data') : newline(next()) ? consume() : o.append(consumeEscape()) : o.append(t); break; case 'hash': namechar(t) ? create(new HashToken(t)) && switchto('hash-rest') : 92 == t ? badescape(next()) ? parseerror() && emit(new DelimToken(35)) && switchto('data') && reconsume() : create(new HashToken(consumeEscape())) && switchto('hash-rest') : emit(new DelimToken(35)) && switchto('data') && reconsume(); break; case 'hash-rest': namechar(t) ? o.append(t) : 92 == t ? badescape(next()) ? parseerror() && emit() && switchto('data') && reconsume() : o.append(consumeEscape()) : emit() && switchto('data') && reconsume(); break; case 'comment': 42 == t ? 47 == next() && consume() && switchto('data') : eof() && parseerror() && switchto('data') && reconsume(); break; case 'at-keyword': 45 == t ? namestartchar(next()) ? create(new AtKeywordToken(45)) && switchto('at-keyword-rest') : 92 != next(1) || badescape(next(2)) ? parseerror() && emit(new DelimToken(64)) && switchto('data') && reconsume() : create(new AtKeywordtoken(45)) && switchto('at-keyword-rest') : namestartchar(t) ? create(new AtKeywordToken(t)) && switchto('at-keyword-rest') : 92 == t ? badescape(next()) ? parseerror() && emit(new DelimToken(35)) && switchto('data') && reconsume() : create(new AtKeywordToken(consumeEscape())) && switchto('at-keyword-rest') : emit(new DelimToken(64)) && switchto('data') && reconsume(); break; case 'at-keyword-rest': namechar(t) ? o.append(t) : 92 == t ? badescape(next()) ? parseerror() && emit() && switchto('data') && reconsume() : o.append(consumeEscape()) : emit() && switchto('data') && reconsume(); break; case 'ident': 45 == t ? namestartchar(next()) ? create(new IdentifierToken(t)) && switchto('ident-rest') : 92 != next(1) || badescape(next(2)) ? emit(new DelimToken(45)) && switchto('data') : create(new IdentifierToken(t)) && switchto('ident-rest') : namestartchar(t) ? create(new IdentifierToken(t)) && switchto('ident-rest') : 92 == t ? badescape(next()) ? parseerror() && switchto('data') && reconsume() : create(new IdentifierToken(consumeEscape())) && switchto('ident-rest') : catchfire('Hit the generic \'else\' clause in ident state.') && switchto('data') && reconsume(); break; case 'ident-rest': namechar(t) ? o.append(t) : 92 == t ? badescape(next()) ? parseerror() && emit() && switchto('data') && reconsume() : o.append(consumeEscape()) : 40 == t ? o.ASCIImatch('url') ? switchto('url') : emit(new FunctionToken(o)) && switchto('data') : whitespace(t) && n.transformFunctionWhitespace ? switchto('transform-function-whitespace') && reconsume() : emit() && switchto('data') && reconsume(); break; case 'transform-function-whitespace': whitespace(next()) || (40 == t ? emit(new FunctionToken(o)) && switchto('data') : emit() && switchto('data') && reconsume()); break; case 'number': create(new NumberToken), 45 == t ? digit(next()) ? consume() && o.append([ 45, t ]) && switchto('number-rest') : 46 == next(1) && digit(next(2)) ? consume(2) && o.append([ 45, 46, t ]) && switchto('number-fraction') : switchto('data') && reconsume() : 43 == t ? digit(next()) ? consume() && o.append([ 43, t ]) && switchto('number-rest') : 46 == next(1) && digit(next(2)) ? consume(2) && o.append([ 43, 46, t ]) && switchto('number-fraction') : switchto('data') && reconsume() : digit(t) ? o.append(t) && switchto('number-rest') : 46 == t && digit(next()) ? consume() && o.append([ 46, t ]) && switchto('number-fraction') : switchto('data') && reconsume(); break; case 'number-rest': digit(t) ? o.append(t) : 46 == t ? digit(next()) ? consume() && o.append([ 46, t ]) && switchto('number-fraction') : emit() && switchto('data') && reconsume() : 37 == t ? emit(new PercentageToken(o)) && switchto('data') : 69 == t || 101 == t ? digit(next()) ? consume() && o.append([ 37, t ]) && switchto('sci-notation') : 43 != next(1) && 45 != next(1) || !digit(next(2)) ? create(new DimensionToken(o, t)) && switchto('dimension') : o.append([ 37, next(1), next(2) ]) && consume(2) && switchto('sci-notation') : 45 == t ? namestartchar(next()) ? consume() && create(new DimensionToken(o, [ 45, t ])) && switchto('dimension') : 92 == next(1) && badescape(next(2)) ? parseerror() && emit() && switchto('data') && reconsume() : 92 == next(1) ? consume() && create(new DimensionToken(o, [ 45, consumeEscape() ])) && switchto('dimension') : emit() && switchto('data') && reconsume() : namestartchar(t) ? create(new DimensionToken(o, t)) && switchto('dimension') : 92 == t ? badescape(next) ? parseerror() && emit() && switchto('data') && reconsume() : create(new DimensionToken(o, consumeEscape)) && switchto('dimension') : emit() && switchto('data') && reconsume(); break; case 'number-fraction': o.type = 'number', digit(t) ? o.append(t) : 37 == t ? emit(new PercentageToken(o)) && switchto('data') : 69 == t || 101 == t ? digit(next()) ? consume() && o.append([ 101, t ]) && switchto('sci-notation') : 43 != next(1) && 45 != next(1) || !digit(next(2)) ? create(new DimensionToken(o, t)) && switchto('dimension') : o.append([ 101, next(1), next(2) ]) && consume(2) && switchto('sci-notation') : 45 == t ? namestartchar(next()) ? consume() && create(new DimensionToken(o, [ 45, t ])) && switchto('dimension') : 92 == next(1) && badescape(next(2)) ? parseerror() && emit() && switchto('data') && reconsume() : 92 == next(1) ? consume() && create(new DimensionToken(o, [ 45, consumeEscape() ])) && switchto('dimension') : emit() && switchto('data') && reconsume() : namestartchar(t) ? create(new DimensionToken(o, t)) && switchto('dimension') : 92 == t ? badescape(next) ? parseerror() && emit() && switchto('data') && reconsume() : create(new DimensionToken(o, consumeEscape())) && switchto('dimension') : emit() && switchto('data') && reconsume(); break; case 'dimension': namechar(t) ? o.append(t) : 92 == t ? badescape(next()) ? parseerror() && emit() && switchto('data') && reconsume() : o.append(consumeEscape()) : emit() && switchto('data') && reconsume(); break; case 'sci-notation': o.type = 'number', digit(t) ? o.append(t) : emit() && switchto('data') && reconsume(); break; case 'url': eof() ? parseerror() && emit(new BadURLToken) && switchto('data') : 34 == t ? switchto('url-double-quote') : 39 == t ? switchto('url-single-quote') : 41 == t ? emit(new URLToken) && switchto('data') : whitespace(t) || switchto('url-unquoted') && reconsume(); break; case 'url-double-quote': o instanceof URLToken || create(new URLToken), eof() ? parseerror() && emit(new BadURLToken) && switchto('data') : 34 == t ? switchto('url-end') : newline(t) ? parseerror() && switchto('bad-url') : 92 == t ? newline(next()) ? consume() : badescape(next()) ? parseerror() && emit(new BadURLToken) && switchto('data') && reconsume() : o.append(consumeEscape()) : o.append(t); break; case 'url-single-quote': o instanceof URLToken || create(new URLToken), eof() ? parseerror() && emit(new BadURLToken) && switchto('data') : 39 == t ? switchto('url-end') : newline(t) ? parseerror() && switchto('bad-url') : 92 == t ? newline(next()) ? consume() : badescape(next()) ? parseerror() && emit(new BadURLToken) && switchto('data') && reconsume() : o.append(consumeEscape()) : o.append(t); break; case 'url-end': eof() ? parseerror() && emit(new BadURLToken) && switchto('data') : whitespace(t) || (41 == t ? emit() && switchto('data') : parseerror() && switchto('bad-url') && reconsume()); break; case 'url-unquoted': o instanceof URLToken || create(new URLToken), eof() ? parseerror() && emit(new BadURLToken) && switchto('data') : whitespace(t) ? switchto('url-end') : 41 == t ? emit() && switchto('data') : 34 == t || 39 == t || 40 == t || nonprintable(t) ? parseerror() && switchto('bad-url') : 92 == t ? badescape(next()) ? parseerror() && switchto('bad-url') : o.append(consumeEscape()) : o.append(t); break; case 'bad-url': eof() ? parseerror() && emit(new BadURLToken) && switchto('data') : 41 == t ? emit(new BadURLToken) && switchto('data') : 92 == t && (badescape(next()) || consumeEscape()); break; case 'unicode-range': for (var k = [ t ], c = [ t ], T = 1; T < 6 && hexdigit(next()); T++) consume(), k.push(t), c.push(t); if (63 == next()) { for (;T < 6 && 63 == next(); T++) consume(), k.push('0'.charCodeAt(0)), c.push('f'.charCodeAt(0)); emit(new UnicodeRangeToken(k, c)) && switchto('data'); } else if (45 == next(1) && hexdigit(next(2))) { consume(), consume(), c = [ t ]; for (T = 1; T < 6 && hexdigit(next()); T++) consume(), c.push(t); emit(new UnicodeRangeToken(k, c)) && switchto('data'); } else emit(new UnicodeRangeToken(k)) && switchto('data'); break; default: catchfire('Unknown state \'' + a + '\''); } } } function stringFromCodeArray(e) { return String.fromCharCode.apply(null, e.filter((function(e) { return e; }))); } function CSSParserToken(e) { return this; } function BadStringToken() { return this; } function BadURLToken() { return this; } function WhitespaceToken() { return this; } function CDOToken() { return this; } function CDCToken() { return this; } function ColonToken() { return this; } function SemicolonToken() { return this; } function OpenCurlyToken() { return this; } function CloseCurlyToken() { return this; } function OpenSquareToken() { return this; } function CloseSquareToken() { return this; } function OpenParenToken() { return this; } function CloseParenToken() { return this; } function EOFToken() { return this; } function DelimToken(e) { return this.value = String.fromCharCode(e), this; } function StringValuedToken() { return this; } function IdentifierToken(e) { this.value = [], this.append(e); } function FunctionToken(e) { this.value = e.finish().value; } function AtKeywordToken(e) { this.value = [], this.append(e); } function HashToken(e) { this.value = [], this.append(e); } function StringToken(e) { this.value = [], this.append(e); } function URLToken(e) { this.value = [], this.append(e); } function NumberToken(e) { this.value = [], this.append(e), this.type = 'integer'; } function PercentageToken(e) { e.finish(), this.value = e.value, this.repr = e.repr; } function DimensionToken(e, n) { e.finish(), this.num = e.value, this.unit = [], this.repr = e.repr, this.append(n); } function UnicodeRangeToken(e, n) { return e = parseInt(stringFromCodeArray(e), 16), n = void 0 === n ? e + 1 : parseInt(stringFromCodeArray(n), 16), e > maximumallowedcodepoint && (n = e), n < e && (n = e), n > maximumallowedcodepoint && (n = maximumallowedcodepoint), this.start = e, this.end = n, this; } CSSParserToken.prototype.finish = function() { return this; }, CSSParserToken.prototype.toString = function() { return this.tokenType; }, CSSParserToken.prototype.toJSON = function() { return this.toString(); }, BadStringToken.prototype = new CSSParserToken, BadStringToken.prototype.tokenType = 'BADSTRING', BadURLToken.prototype = new CSSParserToken, BadURLToken.prototype.tokenType = 'BADURL', WhitespaceToken.prototype = new CSSParserToken, WhitespaceToken.prototype.tokenType = 'WHITESPACE', WhitespaceToken.prototype.toString = function() { return 'WS'; }, CDOToken.prototype = new CSSParserToken, CDOToken.prototype.tokenType = 'CDO', CDCToken.prototype = new CSSParserToken, CDCToken.prototype.tokenType = 'CDC', ColonToken.prototype = new CSSParserToken, ColonToken.prototype.tokenType = ':', SemicolonToken.prototype = new CSSParserToken, SemicolonToken.prototype.tokenType = ';', OpenCurlyToken.prototype = new CSSParserToken, OpenCurlyToken.prototype.tokenType = '{', CloseCurlyToken.prototype = new CSSParserToken, CloseCurlyToken.prototype.tokenType = '}', OpenSquareToken.prototype = new CSSParserToken, OpenSquareToken.prototype.tokenType = '[', CloseSquareToken.prototype = new CSSParserToken, CloseSquareToken.prototype.tokenType = ']', OpenParenToken.prototype = new CSSParserToken, OpenParenToken.prototype.tokenType = '(', CloseParenToken.prototype = new CSSParserToken, CloseParenToken.prototype.tokenType = ')', EOFToken.prototype = new CSSParserToken, EOFToken.prototype.tokenType = 'EOF', DelimToken.prototype = new CSSParserToken, DelimToken.prototype.tokenType = 'DELIM', DelimToken.prototype.toString = function() { return 'DELIM(' + this.value + ')'; }, StringValuedToken.prototype = new CSSParserToken, StringValuedToken.prototype.append = function(e) { if (e instanceof Array) for (var n = 0; n < e.length; n++) this.value.push(e[n]); else this.value.push(e); return !0; }, StringValuedToken.prototype.finish = function() { return this.value = this.valueAsString(), this; }, StringValuedToken.prototype.ASCIImatch = function(e) { return this.valueAsString().toLowerCase() == e.toLowerCase(); }, StringValuedToken.prototype.valueAsString = function() { return 'string' == typeof this.value ? this.value : stringFromCodeArray(this.value); }, StringValuedToken.prototype.valueAsCodes = function() { if ('string' == typeof this.value) { for (var e = [], n = 0; n < this.value.length; n++) e.push(this.value.charCodeAt(n)); return e; } return this.value.filter((function(e) { return e; })); }, IdentifierToken.prototype = new StringValuedToken, IdentifierToken.prototype.tokenType = 'IDENT', IdentifierToken.prototype.toString = function() { return 'IDENT(' + this.value + ')'; }, FunctionToken.prototype = new StringValuedToken, FunctionToken.prototype.tokenType = 'FUNCTION', FunctionToken.prototype.toString = function() { return 'FUNCTION(' + this.value + ')'; }, AtKeywordToken.prototype = new StringValuedToken, AtKeywordToken.prototype.tokenType = 'AT-KEYWORD', AtKeywordToken.prototype.toString = function() { return 'AT(' + this.value + ')'; }, HashToken.prototype = new StringValuedToken, HashToken.prototype.tokenType = 'HASH', HashToken.prototype.toString = function() { return 'HASH(' + this.value + ')'; }, StringToken.prototype = new StringValuedToken, StringToken.prototype.tokenType = 'STRING', StringToken.prototype.toString = function() { return '"' + this.value + '"'; }, URLToken.prototype = new StringValuedToken, URLToken.prototype.tokenType = 'URL', URLToken.prototype.toString = function() { return 'URL(' + this.value + ')'; }, NumberToken.prototype = new StringValuedToken, NumberToken.prototype.tokenType = 'NUMBER', NumberToken.prototype.toString = function() { return 'integer' == this.type ? 'INT(' + this.value + ')' : 'NUMBER(' + this.value + ')'; }, NumberToken.prototype.finish = function() { return this.repr = this.valueAsString(), this.value = 1 * this.repr, Math.abs(this.value) % 1 != 0 && (this.type = 'number'), this; }, PercentageToken.prototype = new CSSParserToken, PercentageToken.prototype.tokenType = 'PERCENTAGE', PercentageToken.prototype.toString = function() { return 'PERCENTAGE(' + this.value + ')'; }, DimensionToken.prototype = new CSSParserToken, DimensionToken.prototype.tokenType = 'DIMENSION', DimensionToken.prototype.toString = function() { return 'DIM(' + this.num + ',' + this.unit + ')'; }, DimensionToken.prototype.append = function(e) { if (e instanceof Array) for (var n = 0; n < e.length; n++) this.unit.push(e[n]); else this.unit.push(e); return !0; }, DimensionToken.prototype.finish = function() { return this.unit = stringFromCodeArray(this.unit), this.repr += this.unit, this; }, UnicodeRangeToken.prototype = new CSSParserToken, UnicodeRangeToken.prototype.tokenType = 'UNICODE-RANGE', UnicodeRangeToken.prototype.toString = function() { return this.start + 1 == this.end ? 'UNICODE-RANGE(' + this.start.toString(16).toUpperCase() + ')' : this.start < this.end ? 'UNICODE-RANGE(' + this.start.toString(16).toUpperCase() + '-' + this.end.toString(16).toUpperCase() + ')' : 'UNICODE-RANGE()'; }, UnicodeRangeToken.prototype.contains = function(e) { return e >= this.start && e < this.end; };