fragments and .js files.", token);
- }
- if (option.fragment) {
- if (n !== 'div') {
- error("ADsafe violation: Wrap the widget in a div.", token);
- }
- } else {
- error("Use the fragment option.", token);
- }
- }
- option.browser = true;
- assume();
- }
-
- function doAttribute(n, a, v) {
- var u, x;
- if (a === 'id') {
- u = typeof v === 'string' ? v.toUpperCase() : '';
- if (ids[u] === true) {
- warning("Duplicate id='{a}'.", nexttoken, v);
- }
- if (!/^[A-Za-z][A-Za-z0-9._:\-]*$/.test(v)) {
- warning("Bad id: '{a}'.", nexttoken, v);
- } else if (option.adsafe) {
- if (adsafe_id) {
- if (v.slice(0, adsafe_id.length) !== adsafe_id) {
- warning("ADsafe violation: An id must have a '{a}' prefix",
- nexttoken, adsafe_id);
- } else if (!/^[A-Z]+_[A-Z]+$/.test(v)) {
- warning("ADSAFE violation: bad id.");
- }
- } else {
- adsafe_id = v;
- if (!/^[A-Z]+_$/.test(v)) {
- warning("ADSAFE violation: bad id.");
- }
- }
- }
- x = v.search(dx);
- if (x >= 0) {
- warning("Unexpected character '{a}' in {b}.", token, v.charAt(x), a);
- }
- ids[u] = true;
- } else if (a === 'class' || a === 'type' || a === 'name') {
- x = v.search(qx);
- if (x >= 0) {
- warning("Unexpected character '{a}' in {b}.", token, v.charAt(x), a);
- }
- ids[u] = true;
- } else if (a === 'href' || a === 'background' ||
- a === 'content' || a === 'data' ||
- a.indexOf('src') >= 0 || a.indexOf('url') >= 0) {
- if (option.safe && ux.test(v)) {
- error("ADsafe URL violation.");
- }
- urls.push(v);
- } else if (a === 'for') {
- if (option.adsafe) {
- if (adsafe_id) {
- if (v.slice(0, adsafe_id.length) !== adsafe_id) {
- warning("ADsafe violation: An id must have a '{a}' prefix",
- nexttoken, adsafe_id);
- } else if (!/^[A-Z]+_[A-Z]+$/.test(v)) {
- warning("ADSAFE violation: bad id.");
- }
- } else {
- warning("ADSAFE violation: bad id.");
- }
- }
- } else if (a === 'name') {
- if (option.adsafe && v.indexOf('_') >= 0) {
- warning("ADsafe name violation.");
- }
- }
- }
-
- function doTag(n, a) {
- var i, t = htmltag[n], x;
- src = false;
- if (!t) {
- error("Unrecognized tag '<{a}>'.",
- nexttoken,
- n === n.toLowerCase() ? n :
- n + ' (capitalization error)');
- }
- if (stack.length > 0) {
- if (n === 'html') {
- error("Too many tags.", token);
- }
- x = t.parent;
- if (x) {
- if (x.indexOf(' ' + stack[stack.length - 1].name + ' ') < 0) {
- error("A '<{a}>' must be within '<{b}>'.",
- token, n, x);
- }
- } else if (!option.adsafe && !option.fragment) {
- i = stack.length;
- do {
- if (i <= 0) {
- error("A '<{a}>' must be within '<{b}>'.",
- token, n, 'body');
- }
- i -= 1;
- } while (stack[i].name !== 'body');
- }
- }
- switch (n) {
- case 'div':
- if (option.adsafe && stack.length === 1 && !adsafe_id) {
- warning("ADSAFE violation: missing ID_.");
- }
- break;
- case 'script':
- xmode = 'script';
- advance('>');
- indent = nexttoken.from;
- if (a.lang) {
- warning("lang is deprecated.", token);
- }
- if (option.adsafe && stack.length !== 1) {
- warning("ADsafe script placement violation.", token);
- }
- if (a.src) {
- if (option.adsafe && (!adsafe_may || !approved[a.src])) {
- warning("ADsafe unapproved script source.", token);
- }
- if (a.type) {
- warning("type is unnecessary.", token);
- }
- } else {
- if (adsafe_went) {
- error("ADsafe script violation.", token);
- }
- statements('script');
- }
- xmode = 'html';
- advance('');
- if (!nexttoken.identifier && nexttoken.value !== 'script') {
- warning("Expected '{a}' and instead saw '{b}'.",
- nexttoken, 'script', nexttoken.value);
- }
- advance();
- xmode = 'outer';
- break;
- case 'style':
- xmode = 'style';
- advance('>');
- styles();
- xmode = 'html';
- advance('');
- if (!nexttoken.identifier && nexttoken.value !== 'style') {
- warning("Expected '{a}' and instead saw '{b}'.",
- nexttoken, 'style', nexttoken.value);
- }
- advance();
- xmode = 'outer';
- break;
- case 'input':
- switch (a.type) {
- case 'radio':
- case 'checkbox':
- case 'button':
- case 'reset':
- case 'submit':
- break;
- case 'text':
- case 'file':
- case 'password':
- case 'file':
- case 'hidden':
- case 'image':
- if (option.adsafe && a.autocomplete !== 'off') {
- warning("ADsafe autocomplete violation.");
- }
- break;
- default:
- warning("Bad input type.");
- }
- break;
- case 'applet':
- case 'body':
- case 'embed':
- case 'frame':
- case 'frameset':
- case 'head':
- case 'iframe':
- case 'noembed':
- case 'noframes':
- case 'object':
- case 'param':
- if (option.adsafe) {
- warning("ADsafe violation: Disallowed tag: " + n);
- }
- break;
- }
- }
-
-
- function closetag(n) {
- return '' + n + '>';
- }
-
- function html() {
- var a, attributes, e, n, q, t, v, w = option.white, wmode;
- xmode = 'html';
- xquote = '';
- stack = null;
- for (;;) {
- switch (nexttoken.value) {
- case '<':
- xmode = 'html';
- advance('<');
- attributes = {};
- t = nexttoken;
- if (!t.identifier) {
- warning("Bad identifier {a}.", t, t.value);
- }
- n = t.value;
- if (option.cap) {
- n = n.toLowerCase();
- }
- t.name = n;
- advance();
- if (!stack) {
- stack = [];
- doBegin(n);
- }
- v = htmltag[n];
- if (typeof v !== 'object') {
- error("Unrecognized tag '<{a}>'.", t, n);
- }
- e = v.empty;
- t.type = n;
- for (;;) {
- if (nexttoken.id === '/') {
- advance('/');
- if (nexttoken.id !== '>') {
- warning("Expected '{a}' and instead saw '{b}'.",
- nexttoken, '>', nexttoken.value);
- }
- break;
- }
- if (nexttoken.id && nexttoken.id.substr(0, 1) === '>') {
- break;
- }
- if (!nexttoken.identifier) {
- if (nexttoken.id === '(end)' || nexttoken.id === '(error)') {
- error("Missing '>'.", nexttoken);
- }
- warning("Bad identifier.");
- }
- option.white = true;
- nonadjacent(token, nexttoken);
- a = nexttoken.value;
- option.white = w;
- advance();
- if (!option.cap && a !== a.toLowerCase()) {
- warning("Attribute '{a}' not all lower case.", nexttoken, a);
- }
- a = a.toLowerCase();
- xquote = '';
- if (is_own(attributes, a)) {
- warning("Attribute '{a}' repeated.", nexttoken, a);
- }
- if (a.slice(0, 2) === 'on') {
- if (!option.on) {
- warning("Avoid HTML event handlers.");
- }
- xmode = 'scriptstring';
- advance('=');
- q = nexttoken.id;
- if (q !== '"' && q !== "'") {
- error("Missing quote.");
- }
- xquote = q;
- wmode = option.white;
- option.white = false;
- advance(q);
- statements('on');
- option.white = wmode;
- if (nexttoken.id !== q) {
- error("Missing close quote on script attribute.");
- }
- xmode = 'html';
- xquote = '';
- advance(q);
- v = false;
- } else if (a === 'style') {
- xmode = 'scriptstring';
- advance('=');
- q = nexttoken.id;
- if (q !== '"' && q !== "'") {
- error("Missing quote.");
- }
- xmode = 'styleproperty';
- xquote = q;
- advance(q);
- substyle();
- xmode = 'html';
- xquote = '';
- advance(q);
- v = false;
- } else {
- if (nexttoken.id === '=') {
- advance('=');
- v = nexttoken.value;
- if (!nexttoken.identifier &&
- nexttoken.id !== '"' &&
- nexttoken.id !== '\'' &&
- nexttoken.type !== '(string)' &&
- nexttoken.type !== '(number)' &&
- nexttoken.type !== '(color)') {
- warning("Expected an attribute value and instead saw '{a}'.", token, a);
- }
- advance();
- } else {
- v = true;
- }
- }
- attributes[a] = v;
- doAttribute(n, a, v);
- }
- doTag(n, attributes);
- if (!e) {
- stack.push(t);
- }
- xmode = 'outer';
- advance('>');
- break;
- case '':
- xmode = 'html';
- advance('');
- if (!nexttoken.identifier) {
- warning("Bad identifier.");
- }
- n = nexttoken.value;
- if (option.cap) {
- n = n.toLowerCase();
- }
- advance();
- if (!stack) {
- error("Unexpected '{a}'.", nexttoken, closetag(n));
- }
- t = stack.pop();
- if (!t) {
- error("Unexpected '{a}'.", nexttoken, closetag(n));
- }
- if (t.name !== n) {
- error("Expected '{a}' and instead saw '{b}'.",
- nexttoken, closetag(t.name), closetag(n));
- }
- if (nexttoken.id !== '>') {
- error("Missing '{a}'.", nexttoken, '>');
- }
- xmode = 'outer';
- advance('>');
- break;
- case '' || nexttoken.id === '(end)') {
- break;
- }
- if (nexttoken.value.indexOf('--') >= 0) {
- warning("Unexpected --.");
- }
- if (nexttoken.value.indexOf('<') >= 0) {
- warning("Unexpected <.");
- }
- if (nexttoken.value.indexOf('>') >= 0) {
- warning("Unexpected >.");
- }
- }
- xmode = 'outer';
- advance('>');
- break;
- case '(end)':
- return;
- default:
- if (nexttoken.id === '(end)') {
- error("Missing '{a}'.", nexttoken,
- '' + stack[stack.length - 1].value + '>');
- } else {
- advance();
- }
- }
- if (stack && stack.length === 0 && (option.adsafe ||
- !option.fragment || nexttoken.id === '(end)')) {
- break;
- }
- }
- if (nexttoken.id !== '(end)') {
- error("Unexpected material after the end.");
- }
- }
-
-
-// Build the syntax table by declaring the syntactic elements of the language.
-
- type('(number)', idValue);
- type('(string)', idValue);
-
- syntax['(identifier)'] = {
- type: '(identifier)',
- lbp: 0,
- identifier: true,
- nud: function () {
- var v = this.value,
- s = scope[v],
- f;
- if (typeof s === 'function') {
- s = undefined;
- } else if (typeof s === 'boolean') {
- f = funct;
- funct = functions[0];
- addlabel(v, 'var');
- s = funct;
- funct = f;
- }
-
-// The name is in scope and defined in the current function.
-
- if (funct === s) {
-
-// Change 'unused' to 'var', and reject labels.
-
- switch (funct[v]) {
- case 'unused':
- funct[v] = 'var';
- break;
- case 'label':
- warning("'{a}' is a statement label.", token, v);
- break;
- }
-
-// The name is not defined in the function. If we are in the global scope,
-// then we have an undefined variable.
-
- } else if (funct['(global)']) {
- if (option.undef && predefined[v] !== 'boolean') {
- warning("'{a}' is not defined.", token, v);
- }
- note_implied(token);
-
-// If the name is already defined in the current
-// function, but not as outer, then there is a scope error.
-
- } else {
- switch (funct[v]) {
- case 'closure':
- case 'function':
- case 'var':
- case 'unused':
- warning("'{a}' used out of scope.", token, v);
- break;
- case 'label':
- warning("'{a}' is a statement label.", token, v);
- break;
- case 'outer':
- case 'global':
- break;
- default:
-
-// If the name is defined in an outer function, make an outer entry, and if
-// it was unused, make it var.
-
- if (s === true) {
- funct[v] = true;
- } else if (s === null) {
- warning("'{a}' is not allowed.", token, v);
- note_implied(token);
- } else if (typeof s !== 'object') {
- if (option.undef) {
- warning("'{a}' is not defined.", token, v);
- } else {
- funct[v] = true;
- }
- note_implied(token);
- } else {
- switch (s[v]) {
- case 'function':
- case 'var':
- case 'unused':
- s[v] = 'closure';
- funct[v] = s['(global)'] ? 'global' : 'outer';
- break;
- case 'closure':
- case 'parameter':
- funct[v] = s['(global)'] ? 'global' : 'outer';
- break;
- case 'label':
- warning("'{a}' is a statement label.", token, v);
- }
- }
- }
- }
- return this;
- },
- led: function () {
- error("Expected an operator and instead saw '{a}'.",
- nexttoken, nexttoken.value);
- }
- };
-
- type('(regexp)', function () {
- return this;
- });
-
- delim('(endline)');
- delim('(begin)');
- delim('(end)').reach = true;
- delim('').reach = true;
- delim('');
- delim('(error)').reach = true;
- delim('}').reach = true;
- delim(')');
- delim(']');
- delim('"').reach = true;
- delim("'").reach = true;
- delim(';');
- delim(':').reach = true;
- delim(',');
- delim('#');
- delim('@');
- reserve('else');
- reserve('case').reach = true;
- reserve('catch');
- reserve('default').reach = true;
- reserve('finally');
- reservevar('arguments');
- reservevar('eval');
- reservevar('false');
- reservevar('Infinity');
- reservevar('NaN');
- reservevar('null');
- reservevar('this');
- reservevar('true');
- reservevar('undefined');
- assignop('=', 'assign', 20);
- assignop('+=', 'assignadd', 20);
- assignop('-=', 'assignsub', 20);
- assignop('*=', 'assignmult', 20);
- assignop('/=', 'assigndiv', 20).nud = function () {
- error("A regular expression literal can be confused with '/='.");
- };
- assignop('%=', 'assignmod', 20);
- bitwiseassignop('&=', 'assignbitand', 20);
- bitwiseassignop('|=', 'assignbitor', 20);
- bitwiseassignop('^=', 'assignbitxor', 20);
- bitwiseassignop('<<=', 'assignshiftleft', 20);
- bitwiseassignop('>>=', 'assignshiftright', 20);
- bitwiseassignop('>>>=', 'assignshiftrightunsigned', 20);
- infix('?', function (left, that) {
- that.left = left;
- that.right = parse(10);
- advance(':');
- that['else'] = parse(10);
- return that;
- }, 30);
-
- infix('||', 'or', 40);
- infix('&&', 'and', 50);
- bitwise('|', 'bitor', 70);
- bitwise('^', 'bitxor', 80);
- bitwise('&', 'bitand', 90);
- relation('==', function (left, right) {
- if (option.eqeqeq) {
- warning("Expected '{a}' and instead saw '{b}'.",
- this, '===', '==');
- } else if (isPoorRelation(left)) {
- warning("Use '{a}' to compare with '{b}'.",
- this, '===', left.value);
- } else if (isPoorRelation(right)) {
- warning("Use '{a}' to compare with '{b}'.",
- this, '===', right.value);
- }
- return this;
- });
- relation('===');
- relation('!=', function (left, right) {
- if (option.eqeqeq) {
- warning("Expected '{a}' and instead saw '{b}'.",
- this, '!==', '!=');
- } else if (isPoorRelation(left)) {
- warning("Use '{a}' to compare with '{b}'.",
- this, '!==', left.value);
- } else if (isPoorRelation(right)) {
- warning("Use '{a}' to compare with '{b}'.",
- this, '!==', right.value);
- }
- return this;
- });
- relation('!==');
- relation('<');
- relation('>');
- relation('<=');
- relation('>=');
- bitwise('<<', 'shiftleft', 120);
- bitwise('>>', 'shiftright', 120);
- bitwise('>>>', 'shiftrightunsigned', 120);
- infix('in', 'in', 120);
- infix('instanceof', 'instanceof', 120);
- infix('+', function (left, that) {
- var right = parse(130);
- if (left && right && left.id === '(string)' && right.id === '(string)') {
- left.value += right.value;
- left.character = right.character;
- if (jx.test(left.value)) {
- warning("JavaScript URL.", left);
- }
- return left;
- }
- that.left = left;
- that.right = right;
- return that;
- }, 130);
- prefix('+', 'num');
- infix('-', 'sub', 130);
- prefix('-', 'neg');
- infix('*', 'mult', 140);
- infix('/', 'div', 140);
- infix('%', 'mod', 140);
-
- suffix('++', 'postinc');
- prefix('++', 'preinc');
- syntax['++'].exps = true;
-
- suffix('--', 'postdec');
- prefix('--', 'predec');
- syntax['--'].exps = true;
- prefix('delete', function () {
- var p = parse(0);
- if (!p || (p.id !== '.' && p.id !== '[')) {
- warning("Expected '{a}' and instead saw '{b}'.",
- nexttoken, '.', nexttoken.value);
- }
- this.first = p;
- return this;
- }).exps = true;
-
-
- prefix('~', function () {
- if (option.bitwise) {
- warning("Unexpected '{a}'.", this, '~');
- }
- parse(150);
- return this;
- });
- prefix('!', function () {
- this.right = parse(150);
- this.arity = 'unary';
- if (bang[this.right.id] === true) {
- warning("Confusing use of '{a}'.", this, '!');
- }
- return this;
- });
- prefix('typeof', 'typeof');
- prefix('new', function () {
- var c = parse(155), i;
- if (c && c.id !== 'function') {
- if (c.identifier) {
- c['new'] = true;
- switch (c.value) {
- case 'Object':
- warning("Use the object literal notation {}.", token);
- break;
- case 'Array':
- if (nexttoken.id !== '(') {
- warning("Use the array literal notation [].", token);
- } else {
- advance('(');
- if (nexttoken.id === ')') {
- warning("Use the array literal notation [].", token);
- } else {
- i = parse(0);
- c.dimension = i;
- if ((i.id === '(number)' && /[.+\-Ee]/.test(i.value)) ||
- (i.id === '-' && !i.right) ||
- i.id === '(string)' || i.id === '[' ||
- i.id === '{' || i.id === 'true' ||
- i.id === 'false' ||
- i.id === 'null' || i.id === 'undefined' ||
- i.id === 'Infinity') {
- warning("Use the array literal notation [].", token);
- }
- if (nexttoken.id !== ')') {
- error("Use the array literal notation [].", token);
- }
- }
- advance(')');
- }
- this.first = c;
- return this;
- case 'Number':
- case 'String':
- case 'Boolean':
- case 'Math':
- case 'JSON':
- warning("Do not use {a} as a constructor.", token, c.value);
- break;
- case 'Function':
- if (!option.evil) {
- warning("The Function constructor is eval.");
- }
- break;
- case 'Date':
- case 'RegExp':
- break;
- default:
- if (c.id !== 'function') {
- i = c.value.substr(0, 1);
- if (option.newcap && (i < 'A' || i > 'Z')) {
- warning(
- "A constructor name should start with an uppercase letter.",
- token);
- }
- }
- }
- } else {
- if (c.id !== '.' && c.id !== '[' && c.id !== '(') {
- warning("Bad constructor.", token);
- }
- }
- } else {
- warning("Weird construction. Delete 'new'.", this);
- }
- adjacent(token, nexttoken);
- if (nexttoken.id !== '(') {
- warning("Missing '()' invoking a constructor.");
- }
- this.first = c;
- return this;
- });
- syntax['new'].exps = true;
-
- infix('.', function (left, that) {
- adjacent(prevtoken, token);
- var m = identifier();
- if (typeof m === 'string') {
- countMember(m);
- }
- that.left = left;
- that.right = m;
- if (!option.evil && left && left.value === 'document' &&
- (m === 'write' || m === 'writeln')) {
- warning("document.write can be a form of eval.", left);
- } else if (option.adsafe) {
- if (left && left.value === 'ADSAFE') {
- if (m === 'id' || m === 'lib') {
- warning("ADsafe violation.", that);
- } else if (m === 'go') {
- if (xmode !== 'script') {
- warning("ADsafe violation.", that);
- } else if (adsafe_went || nexttoken.id !== '(' ||
- peek(0).id !== '(string)' ||
- peek(0).value !== adsafe_id ||
- peek(1).id !== ',') {
- error("ADsafe violation: go.", that);
- }
- adsafe_went = true;
- adsafe_may = false;
- }
- }
- }
- if (!option.evil && (m === 'eval' || m === 'execScript')) {
- warning('eval is evil.');
- } else if (option.safe) {
- for (;;) {
- if (banned[m] === true) {
- warning("ADsafe restricted word '{a}'.", token, m);
- }
- if (typeof predefined[left.value] !== 'boolean' ||
- nexttoken.id === '(') {
- break;
- }
- if (standard_member[m] === true) {
- if (nexttoken.id === '.') {
- warning("ADsafe violation.", that);
- }
- break;
- }
- if (nexttoken.id !== '.') {
- warning("ADsafe violation.", that);
- break;
- }
- advance('.');
- token.left = that;
- token.right = m;
- that = token;
- m = identifier();
- if (typeof m === 'string') {
- countMember(m);
- }
- }
- }
- return that;
- }, 160, true);
-
- infix('(', function (left, that) {
- adjacent(prevtoken, token);
- nospace();
- var n = 0,
- p = [];
- if (left) {
- if (left.type === '(identifier)') {
- if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) {
- if (left.value !== 'Number' && left.value !== 'String' &&
- left.value !== 'Boolean' &&
- left.value !== 'Date') {
- if (left.value === 'Math') {
- warning("Math is not a function.", left);
- } else if (option.newcap) {
- warning(
-"Missing 'new' prefix when invoking a constructor.", left);
- }
- }
- }
- } else if (left.id === '.') {
- if (option.safe && left.left.value === 'Math' &&
- left.right === 'random') {
- warning("ADsafe violation.", left);
- }
- }
- }
- if (nexttoken.id !== ')') {
- for (;;) {
- p[p.length] = parse(10);
- n += 1;
- if (nexttoken.id !== ',') {
- break;
- }
- comma();
- }
- }
- advance(')');
- if (option.immed && left.id === 'function' && nexttoken.id !== ')') {
- warning("Wrap the entire immediate function invocation in parens.",
- that);
- }
- nospace(prevtoken, token);
- if (typeof left === 'object') {
- if (left.value === 'parseInt' && n === 1) {
- warning("Missing radix parameter.", left);
- }
- if (!option.evil) {
- if (left.value === 'eval' || left.value === 'Function' ||
- left.value === 'execScript') {
- warning("eval is evil.", left);
- } else if (p[0] && p[0].id === '(string)' &&
- (left.value === 'setTimeout' ||
- left.value === 'setInterval')) {
- warning(
- "Implied eval is evil. Pass a function instead of a string.", left);
- }
- }
- if (!left.identifier && left.id !== '.' && left.id !== '[' &&
- left.id !== '(' && left.id !== '&&' && left.id !== '||' &&
- left.id !== '?') {
- warning("Bad invocation.", left);
- }
- }
- that.left = left;
- return that;
- }, 155, true).exps = true;
-
- prefix('(', function () {
- nospace();
- var v = parse(0);
- advance(')', this);
- nospace(prevtoken, token);
- if (option.immed && v.id === 'function') {
- if (nexttoken.id === '(') {
- warning(
-"Move the invocation into the parens that contain the function.", nexttoken);
- } else {
- warning(
-"Do not wrap function literals in parens unless they are to be immediately invoked.",
- this);
- }
- }
- return v;
- });
-
- infix('[', function (left, that) {
- nospace();
- var e = parse(0), s;
- if (e && e.type === '(string)') {
- if (option.safe && banned[e.value] === true) {
- warning("ADsafe restricted word '{a}'.", that, e.value);
- } else if (!option.evil &&
- (e.value === 'eval' || e.value === 'execScript')) {
- warning("eval is evil.", that);
- } else if (option.safe &&
- (e.value.charAt(0) === '_' || e.value.charAt(0) === '-')) {
- warning("ADsafe restricted subscript '{a}'.", that, e.value);
- }
- countMember(e.value);
- if (!option.sub && ix.test(e.value)) {
- s = syntax[e.value];
- if (!s || !s.reserved) {
- warning("['{a}'] is better written in dot notation.",
- e, e.value);
- }
- }
- } else if (!e || e.type !== '(number)' || e.value < 0) {
- if (option.safe) {
- warning('ADsafe subscripting.');
- }
- }
- advance(']', that);
- nospace(prevtoken, token);
- that.left = left;
- that.right = e;
- return that;
- }, 160, true);
-
- prefix('[', function () {
- var b = token.line !== nexttoken.line;
- this.first = [];
- if (b) {
- indent += option.indent;
- if (nexttoken.from === indent + option.indent) {
- indent += option.indent;
- }
- }
- while (nexttoken.id !== '(end)') {
- while (nexttoken.id === ',') {
- warning("Extra comma.");
- advance(',');
- }
- if (nexttoken.id === ']') {
- break;
- }
- if (b && token.line !== nexttoken.line) {
- indentation();
- }
- this.first.push(parse(10));
- if (nexttoken.id === ',') {
- comma();
- if (nexttoken.id === ']') {
- warning("Extra comma.", token);
- break;
- }
- } else {
- break;
- }
- }
- if (b) {
- indent -= option.indent;
- indentation();
- }
- advance(']', this);
- return this;
- }, 160);
-
- (function (x) {
- x.nud = function () {
- var b, i, s, seen = {};
- b = token.line !== nexttoken.line;
- if (b) {
- indent += option.indent;
- if (nexttoken.from === indent + option.indent) {
- indent += option.indent;
- }
- }
- for (;;) {
- if (nexttoken.id === '}') {
- break;
- }
- if (b) {
- indentation();
- }
- i = optionalidentifier(true);
- if (!i) {
- if (nexttoken.id === '(string)') {
- i = nexttoken.value;
- if (ix.test(i)) {
- s = syntax[i];
- }
- advance();
- } else if (nexttoken.id === '(number)') {
- i = nexttoken.value.toString();
- advance();
- } else {
- error("Expected '{a}' and instead saw '{b}'.",
- nexttoken, '}', nexttoken.value);
- }
- }
- if (seen[i] === true) {
- warning("Duplicate member '{a}'.", nexttoken, i);
- }
- seen[i] = true;
- countMember(i);
- advance(':');
- nonadjacent(token, nexttoken);
- parse(10);
- if (nexttoken.id === ',') {
- comma();
- if (nexttoken.id === ',' || nexttoken.id === '}') {
- warning("Extra comma.", token);
- }
- } else {
- break;
- }
- }
- if (b) {
- indent -= option.indent;
- indentation();
- }
- advance('}', this);
- return this;
- };
- x.fud = function () {
- error("Expected to see a statement and instead saw a block.", token);
- };
- }(delim('{')));
-
-
- function varstatement(prefix) {
-
-// JavaScript does not have block scope. It only has function scope. So,
-// declaring a variable in a block can have unexpected consequences.
-
- var id, name, value;
-
- if (funct['(onevar)'] && option.onevar) {
- warning("Too many var statements.");
- } else if (!funct['(global)']) {
- funct['(onevar)'] = true;
- }
- this.first = [];
- for (;;) {
- nonadjacent(token, nexttoken);
- id = identifier();
- if (funct['(global)'] && predefined[id] === false) {
- warning("Redefinition of '{a}'.", token, id);
- }
- addlabel(id, 'unused');
- if (prefix) {
- break;
- }
- name = token;
- this.first.push(token);
- if (nexttoken.id === '=') {
- nonadjacent(token, nexttoken);
- advance('=');
- nonadjacent(token, nexttoken);
- if (nexttoken.id === 'undefined') {
- warning("It is not necessary to initialize '{a}' to 'undefined'.", token, id);
- }
- if (peek(0).id === '=' && nexttoken.identifier) {
- error("Variable {a} was not declared correctly.",
- nexttoken, nexttoken.value);
- }
- value = parse(0);
- name.first = value;
- }
- if (nexttoken.id !== ',') {
- break;
- }
- comma();
- }
- return this;
- }
-
-
- stmt('var', varstatement).exps = true;
-
-
- function functionparams() {
- var i, t = nexttoken, p = [];
- advance('(');
- nospace();
- if (nexttoken.id === ')') {
- advance(')');
- nospace(prevtoken, token);
- return;
- }
- for (;;) {
- i = identifier();
- p.push(i);
- addlabel(i, 'parameter');
- if (nexttoken.id === ',') {
- comma();
- } else {
- advance(')', t);
- nospace(prevtoken, token);
- return p;
- }
- }
- }
-
- function doFunction(i) {
- var s = scope;
- scope = Object.create(s);
- funct = {
- '(name)' : i || '"' + anonname + '"',
- '(line)' : nexttoken.line,
- '(context)' : funct,
- '(breakage)': 0,
- '(loopage)' : 0,
- '(scope)' : scope
- };
- token.funct = funct;
- functions.push(funct);
- if (i) {
- addlabel(i, 'function');
- }
- funct['(params)'] = functionparams();
-
- block(false);
- scope = s;
- funct['(last)'] = token.line;
- funct = funct['(context)'];
- }
-
-
- blockstmt('function', function () {
- if (inblock) {
- warning(
-"Function statements cannot be placed in blocks. Use a function expression or move the statement to the top of the outer function.", token);
-
- }
- var i = identifier();
- adjacent(token, nexttoken);
- addlabel(i, 'unused');
- doFunction(i);
- if (nexttoken.id === '(' && nexttoken.line === token.line) {
- error(
-"Function statements are not invocable. Wrap the whole function invocation in parens.");
- }
- return this;
- });
-
- prefix('function', function () {
- var i = optionalidentifier();
- if (i) {
- adjacent(token, nexttoken);
- } else {
- nonadjacent(token, nexttoken);
- }
- doFunction(i);
- if (funct['(loopage)']) {
- warning("Don't make functions within a loop.");
- }
- return this;
- });
-
- blockstmt('if', function () {
- var t = nexttoken;
- advance('(');
- nonadjacent(this, t);
- nospace();
- parse(20);
- if (nexttoken.id === '=') {
- warning("Expected a conditional expression and instead saw an assignment.");
- advance('=');
- parse(20);
- }
- advance(')', t);
- nospace(prevtoken, token);
- block(true);
- if (nexttoken.id === 'else') {
- nonadjacent(token, nexttoken);
- advance('else');
- if (nexttoken.id === 'if' || nexttoken.id === 'switch') {
- statement(true);
- } else {
- block(true);
- }
- }
- return this;
- });
-
- blockstmt('try', function () {
- var b, e, s;
- if (option.adsafe) {
- warning("ADsafe try violation.", this);
- }
- block(false);
- if (nexttoken.id === 'catch') {
- advance('catch');
- nonadjacent(token, nexttoken);
- advance('(');
- s = scope;
- scope = Object.create(s);
- e = nexttoken.value;
- if (nexttoken.type !== '(identifier)') {
- warning("Expected an identifier and instead saw '{a}'.",
- nexttoken, e);
- } else {
- addlabel(e, 'exception');
- }
- advance();
- advance(')');
- block(false);
- b = true;
- scope = s;
- }
- if (nexttoken.id === 'finally') {
- advance('finally');
- block(false);
- return;
- } else if (!b) {
- error("Expected '{a}' and instead saw '{b}'.",
- nexttoken, 'catch', nexttoken.value);
- }
- return this;
- });
-
- blockstmt('while', function () {
- var t = nexttoken;
- funct['(breakage)'] += 1;
- funct['(loopage)'] += 1;
- advance('(');
- nonadjacent(this, t);
- nospace();
- parse(20);
- if (nexttoken.id === '=') {
- warning("Expected a conditional expression and instead saw an assignment.");
- advance('=');
- parse(20);
- }
- advance(')', t);
- nospace(prevtoken, token);
- block(true);
- funct['(breakage)'] -= 1;
- funct['(loopage)'] -= 1;
- return this;
- }).labelled = true;
-
- reserve('with');
-
- blockstmt('switch', function () {
- var t = nexttoken,
- g = false;
- funct['(breakage)'] += 1;
- advance('(');
- nonadjacent(this, t);
- nospace();
- this.condition = parse(20);
- advance(')', t);
- nospace(prevtoken, token);
- nonadjacent(token, nexttoken);
- t = nexttoken;
- advance('{');
- nonadjacent(token, nexttoken);
- indent += option.indent;
- this.cases = [];
- for (;;) {
- switch (nexttoken.id) {
- case 'case':
- switch (funct['(verb)']) {
- case 'break':
- case 'case':
- case 'continue':
- case 'return':
- case 'switch':
- case 'throw':
- break;
- default:
- warning(
- "Expected a 'break' statement before 'case'.",
- token);
- }
- indentation(-option.indent);
- advance('case');
- this.cases.push(parse(20));
- g = true;
- advance(':');
- funct['(verb)'] = 'case';
- break;
- case 'default':
- switch (funct['(verb)']) {
- case 'break':
- case 'continue':
- case 'return':
- case 'throw':
- break;
- default:
- warning(
- "Expected a 'break' statement before 'default'.",
- token);
- }
- indentation(-option.indent);
- advance('default');
- g = true;
- advance(':');
- break;
- case '}':
- indent -= option.indent;
- indentation();
- advance('}', t);
- if (this.cases.length === 1 || this.condition.id === 'true' ||
- this.condition.id === 'false') {
- warning("This 'switch' should be an 'if'.", this);
- }
- funct['(breakage)'] -= 1;
- funct['(verb)'] = undefined;
- return;
- case '(end)':
- error("Missing '{a}'.", nexttoken, '}');
- return;
- default:
- if (g) {
- switch (token.id) {
- case ',':
- error("Each value should have its own case label.");
- return;
- case ':':
- statements();
- break;
- default:
- error("Missing ':' on a case clause.", token);
- }
- } else {
- error("Expected '{a}' and instead saw '{b}'.",
- nexttoken, 'case', nexttoken.value);
- }
- }
- }
- }).labelled = true;
-
- stmt('debugger', function () {
- if (!option.debug) {
- warning("All 'debugger' statements should be removed.");
- }
- return this;
- }).exps = true;
-
- (function () {
- var x = stmt('do', function () {
- funct['(breakage)'] += 1;
- funct['(loopage)'] += 1;
- this.first = block(true);
- advance('while');
- var t = nexttoken;
- nonadjacent(token, t);
- advance('(');
- nospace();
- parse(20);
- if (nexttoken.id === '=') {
- warning("Expected a conditional expression and instead saw an assignment.");
- advance('=');
- parse(20);
- }
- advance(')', t);
- nospace(prevtoken, token);
- funct['(breakage)'] -= 1;
- funct['(loopage)'] -= 1;
- return this;
- });
- x.labelled = true;
- x.exps = true;
- }());
-
- blockstmt('for', function () {
- var f = option.forin, s, t = nexttoken;
- funct['(breakage)'] += 1;
- funct['(loopage)'] += 1;
- advance('(');
- nonadjacent(this, t);
- nospace();
- if (peek(nexttoken.id === 'var' ? 1 : 0).id === 'in') {
- if (nexttoken.id === 'var') {
- advance('var');
- varstatement(true);
- } else {
- switch (funct[nexttoken.value]) {
- case 'unused':
- funct[nexttoken.value] = 'var';
- break;
- case 'var':
- break;
- default:
- warning("Bad for in variable '{a}'.",
- nexttoken, nexttoken.value);
- }
- advance();
- }
- advance('in');
- parse(20);
- advance(')', t);
- s = block(true);
- if (!f && (s.length > 1 || typeof s[0] !== 'object' ||
- s[0].value !== 'if')) {
- warning("The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.", this);
- }
- funct['(breakage)'] -= 1;
- funct['(loopage)'] -= 1;
- return this;
- } else {
- if (nexttoken.id !== ';') {
- if (nexttoken.id === 'var') {
- advance('var');
- varstatement();
- } else {
- for (;;) {
- parse(0, 'for');
- if (nexttoken.id !== ',') {
- break;
- }
- comma();
- }
- }
- }
- nolinebreak(token);
- advance(';');
- if (nexttoken.id !== ';') {
- parse(20);
- if (nexttoken.id === '=') {
- warning("Expected a conditional expression and instead saw an assignment.");
- advance('=');
- parse(20);
- }
- }
- nolinebreak(token);
- advance(';');
- if (nexttoken.id === ';') {
- error("Expected '{a}' and instead saw '{b}'.",
- nexttoken, ')', ';');
- }
- if (nexttoken.id !== ')') {
- for (;;) {
- parse(0, 'for');
- if (nexttoken.id !== ',') {
- break;
- }
- comma();
- }
- }
- advance(')', t);
- nospace(prevtoken, token);
- block(true);
- funct['(breakage)'] -= 1;
- funct['(loopage)'] -= 1;
- return this;
- }
- }).labelled = true;
-
-
- stmt('break', function () {
- var v = nexttoken.value;
- if (funct['(breakage)'] === 0) {
- warning("Unexpected '{a}'.", nexttoken, this.value);
- }
- nolinebreak(this);
- if (nexttoken.id !== ';') {
- if (token.line === nexttoken.line) {
- if (funct[v] !== 'label') {
- warning("'{a}' is not a statement label.", nexttoken, v);
- } else if (scope[v] !== funct) {
- warning("'{a}' is out of scope.", nexttoken, v);
- }
- this.first = nexttoken;
- advance();
- }
- }
- reachable('break');
- return this;
- }).exps = true;
-
-
- stmt('continue', function () {
- var v = nexttoken.value;
- if (funct['(breakage)'] === 0) {
- warning("Unexpected '{a}'.", nexttoken, this.value);
- }
- nolinebreak(this);
- if (nexttoken.id !== ';') {
- if (token.line === nexttoken.line) {
- if (funct[v] !== 'label') {
- warning("'{a}' is not a statement label.", nexttoken, v);
- } else if (scope[v] !== funct) {
- warning("'{a}' is out of scope.", nexttoken, v);
- }
- this.first = nexttoken;
- advance();
- }
- } else if (!funct['(loopage)']) {
- warning("Unexpected '{a}'.", nexttoken, this.value);
- }
- reachable('continue');
- return this;
- }).exps = true;
-
-
- stmt('return', function () {
- nolinebreak(this);
- if (nexttoken.id === '(regexp)') {
- warning("Wrap the /regexp/ literal in parens to disambiguate the slash operator.");
- }
- if (nexttoken.id !== ';' && !nexttoken.reach) {
- nonadjacent(token, nexttoken);
- this.first = parse(20);
- }
- reachable('return');
- return this;
- }).exps = true;
-
-
- stmt('throw', function () {
- nolinebreak(this);
- nonadjacent(token, nexttoken);
- this.first = parse(20);
- reachable('throw');
- return this;
- }).exps = true;
-
- reserve('void');
-
-// Superfluous reserved words
-
- reserve('class');
- reserve('const');
- reserve('enum');
- reserve('export');
- reserve('extends');
- reserve('import');
- reserve('super');
-
- reserve('let');
- reserve('yield');
- reserve('implements');
- reserve('interface');
- reserve('package');
- reserve('private');
- reserve('protected');
- reserve('public');
- reserve('static');
-
- function jsonValue() {
-
- function jsonObject() {
- var o = {}, t = nexttoken;
- advance('{');
- if (nexttoken.id !== '}') {
- for (;;) {
- if (nexttoken.id === '(end)') {
- error("Missing '}' to match '{' from line {a}.",
- nexttoken, t.line);
- } else if (nexttoken.id === '}') {
- warning("Unexpected comma.", token);
- break;
- } else if (nexttoken.id === ',') {
- error("Unexpected comma.", nexttoken);
- } else if (nexttoken.id !== '(string)') {
- warning("Expected a string and instead saw {a}.",
- nexttoken, nexttoken.value);
- }
- if (o[nexttoken.value] === true) {
- warning("Duplicate key '{a}'.",
- nexttoken, nexttoken.value);
- } else if (nexttoken.value === '__proto__') {
- warning("Stupid key '{a}'.",
- nexttoken, nexttoken.value);
- } else {
- o[nexttoken.value] = true;
- }
- advance();
- advance(':');
- jsonValue();
- if (nexttoken.id !== ',') {
- break;
- }
- advance(',');
- }
- }
- advance('}');
- }
-
- function jsonArray() {
- var t = nexttoken;
- advance('[');
- if (nexttoken.id !== ']') {
- for (;;) {
- if (nexttoken.id === '(end)') {
- error("Missing ']' to match '[' from line {a}.",
- nexttoken, t.line);
- } else if (nexttoken.id === ']') {
- warning("Unexpected comma.", token);
- break;
- } else if (nexttoken.id === ',') {
- error("Unexpected comma.", nexttoken);
- }
- jsonValue();
- if (nexttoken.id !== ',') {
- break;
- }
- advance(',');
- }
- }
- advance(']');
- }
-
- switch (nexttoken.id) {
- case '{':
- jsonObject();
- break;
- case '[':
- jsonArray();
- break;
- case 'true':
- case 'false':
- case 'null':
- case '(number)':
- case '(string)':
- advance();
- break;
- case '-':
- advance('-');
- if (token.character !== nexttoken.from) {
- warning("Unexpected space after '-'.", token);
- }
- adjacent(token, nexttoken);
- advance('(number)');
- break;
- default:
- error("Expected a JSON value.", nexttoken);
- }
- }
-
-
-// The actual JSLINT function itself.
-
- var itself = function (s, o) {
- var a, i;
- JSLINT.errors = [];
- predefined = Object.create(standard);
- if (o) {
- a = o.predef;
- if (a instanceof Array) {
- for (i = 0; i < a.length; i += 1) {
- predefined[a[i]] = true;
- }
- }
- if (o.adsafe) {
- o.safe = true;
- }
- if (o.safe) {
- o.browser = false;
- o.css = false;
- o.debug = false;
- o.devel = false;
- o.eqeqeq = true;
- o.evil = false;
- o.forin = false;
- o.nomen = true;
- o.on = false;
- o.rhino = false;
- o.safe = true;
- o.sidebar = false;
- o.strict = true;
- o.sub = false;
- o.undef = true;
- o.widget = false;
- predefined.Date = null;
- predefined['eval'] = null;
- predefined.Function = null;
- predefined.Object = null;
- predefined.ADSAFE = false;
- predefined.lib = false;
- }
- option = o;
- } else {
- option = {};
- }
- option.indent = option.indent || 4;
- option.maxerr = option.maxerr || 50;
- adsafe_id = '';
- adsafe_may = false;
- adsafe_went = false;
- approved = {};
- if (option.approved) {
- for (i = 0; i < option.approved.length; i += 1) {
- approved[option.approved[i]] = option.approved[i];
- }
- } else {
- approved.test = 'test';
- }
- tab = '';
- for (i = 0; i < option.indent; i += 1) {
- tab += ' ';
- }
- indent = 1;
- global = Object.create(predefined);
- scope = global;
- funct = {
- '(global)': true,
- '(name)': '(global)',
- '(scope)': scope,
- '(breakage)': 0,
- '(loopage)': 0
- };
- functions = [funct];
- ids = {};
- urls = [];
- src = false;
- xmode = false;
- stack = null;
- member = {};
- membersOnly = null;
- implied = {};
- inblock = false;
- lookahead = [];
- jsonmode = false;
- warnings = 0;
- lex.init(s);
- prereg = true;
- strict_mode = false;
-
- prevtoken = token = nexttoken = syntax['(begin)'];
- assume();
-
- try {
- advance();
- if (nexttoken.value.charAt(0) === '<') {
- html();
- if (option.adsafe && !adsafe_went) {
- warning("ADsafe violation: Missing ADSAFE.go.", this);
- }
- } else {
- switch (nexttoken.id) {
- case '{':
- case '[':
- option.laxbreak = true;
- jsonmode = true;
- jsonValue();
- break;
- case '@':
- case '*':
- case '#':
- case '.':
- case ':':
- xmode = 'style';
- advance();
- if (token.id !== '@' || !nexttoken.identifier ||
- nexttoken.value !== 'charset' || token.line !== 1 ||
- token.from !== 1) {
- error('A css file should begin with @charset "UTF-8";');
- }
- advance();
- if (nexttoken.type !== '(string)' &&
- nexttoken.value !== 'UTF-8') {
- error('A css file should begin with @charset "UTF-8";');
- }
- advance();
- advance(';');
- styles();
- break;
-
- default:
- if (option.adsafe && option.fragment) {
- error("Expected '{a}' and instead saw '{b}'.",
- nexttoken, '
', nexttoken.value);
- }
- statements('lib');
- }
- }
- advance('(end)');
- } catch (e) {
- if (e) {
- JSLINT.errors.push({
- reason : e.message,
- line : e.line || nexttoken.line,
- character : e.character || nexttoken.from
- }, null);
- }
- }
- return JSLINT.errors.length === 0;
- };
-
- function is_array(o) {
- return Object.prototype.toString.apply(o) === '[object Array]';
- }
-
- function to_array(o) {
- var a = [], k;
- for (k in o) {
- if (is_own(o, k)) {
- a.push(k);
- }
- }
- return a;
- }
-
-// Data summary.
-
- itself.data = function () {
-
- var data = {functions: []}, fu, globals, implieds = [], f, i, j,
- members = [], n, unused = [], v;
- if (itself.errors.length) {
- data.errors = itself.errors;
- }
-
- if (jsonmode) {
- data.json = true;
- }
-
- for (n in implied) {
- if (is_own(implied, n)) {
- implieds.push({
- name: n,
- line: implied[n]
- });
- }
- }
- if (implieds.length > 0) {
- data.implieds = implieds;
- }
-
- if (urls.length > 0) {
- data.urls = urls;
- }
-
- globals = to_array(scope);
- if (globals.length > 0) {
- data.globals = globals;
- }
-
- for (i = 1; i < functions.length; i += 1) {
- f = functions[i];
- fu = {};
- for (j = 0; j < functionicity.length; j += 1) {
- fu[functionicity[j]] = [];
- }
- for (n in f) {
- if (is_own(f, n) && n.charAt(0) !== '(') {
- v = f[n];
- if (is_array(fu[v])) {
- fu[v].push(n);
- if (v === 'unused') {
- unused.push({
- name: n,
- line: f['(line)'],
- 'function': f['(name)']
- });
- }
- }
- }
- }
- for (j = 0; j < functionicity.length; j += 1) {
- if (fu[functionicity[j]].length === 0) {
- delete fu[functionicity[j]];
- }
- }
- fu.name = f['(name)'];
- fu.param = f['(params)'];
- fu.line = f['(line)'];
- fu.last = f['(last)'];
- data.functions.push(fu);
- }
-
- if (unused.length > 0) {
- data.unused = unused;
- }
-
- members = [];
- for (n in member) {
- if (typeof member[n] === 'number') {
- data.member = member;
- break;
- }
- }
-
- return data;
- };
-
- itself.report = function (option) {
- var data = itself.data();
-
- var a = [], c, e, err, f, i, k, l, m = '', n, o = [], s;
-
- function detail(h, array) {
- var b, i, singularity;
- if (array) {
- o.push('
' + h + ' ');
- array = array.sort();
- for (i = 0; i < array.length; i += 1) {
- if (array[i] !== singularity) {
- singularity = array[i];
- o.push((b ? ', ' : '') + singularity);
- b = true;
- }
- }
- o.push('
');
- }
- }
-
-
- if (data.errors || data.implieds || data.unused) {
- err = true;
- o.push('
Error:');
- if (data.errors) {
- for (i = 0; i < data.errors.length; i += 1) {
- c = data.errors[i];
- if (c) {
- e = c.evidence || '';
- o.push('
Problem' + (isFinite(c.line) ? ' at line ' +
- c.line + ' character ' + c.character : '') +
- ': ' + c.reason.entityify() +
- '
' +
- (e && (e.length > 80 ? e.slice(0, 77) + '...' :
- e).entityify()) + '
');
- }
- }
- }
-
- if (data.implieds) {
- s = [];
- for (i = 0; i < data.implieds.length; i += 1) {
- s[i] = '
' + data.implieds[i].name + '
' +
- data.implieds[i].line + '';
- }
- o.push('
Implied global: ' + s.join(', ') + '
');
- }
-
- if (data.unused) {
- s = [];
- for (i = 0; i < data.unused.length; i += 1) {
- s[i] = '
' + data.unused[i].name + '
' +
- data.unused[i].line + ' ' +
- data.unused[i]['function'] + '
';
- }
- o.push('
Unused variable: ' + s.join(', ') + '
');
- }
- if (data.json) {
- o.push('
JSON: bad.
');
- }
- o.push('
');
- }
-
- if (!option) {
-
- o.push('
');
-
- if (data.urls) {
- detail("URLs
", data.urls, '
');
- }
-
- if (xmode === 'style') {
- o.push('
CSS.
');
- } else if (data.json && !err) {
- o.push('
JSON: good.
');
- } else if (data.globals) {
- o.push('
Global ' +
- data.globals.sort().join(', ') + '
');
- } else {
- o.push('
No new global variables introduced.
');
- }
-
- for (i = 0; i < data.functions.length; i += 1) {
- f = data.functions[i];
-
- o.push('
' + f.line + '-' +
- f.last + ' ' + (f.name || '') + '(' +
- (f.param ? f.param.join(', ') : '') + ')
');
- detail('
Unused', f.unused);
- detail('Closure', f.closure);
- detail('Variable', f['var']);
- detail('Exception', f.exception);
- detail('Outer', f.outer);
- detail('Global', f.global);
- detail('Label', f.label);
- }
-
- if (data.member) {
- a = to_array(data.member);
- if (a.length) {
- a = a.sort();
- m = '
/*members ';
- l = 10;
- for (i = 0; i < a.length; i += 1) {
- k = a[i];
- n = k.name();
- if (l + n.length > 72) {
- o.push(m + '
');
- m = ' ';
- l = 1;
- }
- l += n.length + 2;
- if (data.member[k] === 1) {
- n = '' + n + '';
- }
- if (i < a.length - 1) {
- n += ', ';
- }
- m += n;
- }
- o.push(m + '
*/
');
- }
- o.push('
');
- }
- }
- return o.join('');
- };
- itself.jslint = itself;
-
- itself.edition = '2010-03-02';
-
- return itself;
-
-}());
-
-// rhino.js
-// 2009-09-11
-/*
-Copyright (c) 2002 Douglas Crockford (www.JSLint.com) Rhino Edition
-*/
-
-// This is the Rhino companion to fulljslint.js.
-
-/*global JSLINT */
-/*jslint rhino: true, strict: false */
-
-(function (a) {
- var e, i, input;
- if (!a[0]) {
- print("Usage: jslint.js file.js");
- quit(1);
- }
- input = readFile(a[0]);
- if (!input) {
- print("jslint: Couldn't open file '" + a[0] + "'.");
- quit(1);
- }
- if (!JSLINT(input, {
- bitwise: true, eqeqeq: true, immed: true, newcap: true, nomen: true, onevar: true, rhino: true, undef: true, browser: true,
- predef: [ "window", "xui", "emile", "string" ]
- })) {
- for (i = 0; i < JSLINT.errors.length; i += 1) {
- e = JSLINT.errors[i];
- if (e) {
- print('Lint at line ' + e.line + ' character ' +
- e.character + ': ' + e.reason);
- print((e.evidence || '').
- replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1"));
- print('');
- }
- }
- quit(2);
- } else {
- print("jslint: No problems found in " + a[0]);
- quit();
- }
-}(arguments));
\ No newline at end of file