(function (){ var html5 = require('html5'), events = require('events'), util = require('util'), fs = require('fs'); var output = ''; var parser = new html5.Parser(); var idl = null ; function augmentIDL(idl){ return augmentIDLDefinitions(idl); } function augmentIDLDefinitions(idl){ for (var i in idl){ augmentIDLDefinition(idl[i]); } return idl; } function augmentIDLDefinition(def){ if (def && !!def.type) { if (def.type == 'interface') { augmentIDLInterface(def); } } } function augmentIDLInterface(def){ augmentIDLConstructors(def); } function augmentIDLConstructors(def){ for (var i in def.extAttrs){ var xa = def.extAttrs[i]; if (!!xa.name && (xa.name == 'Constructor')) { def.members.push(generateIDLConstructor(def, xa)); } } for (var i in def.extAttrs){ var xa = def.extAttrs[i]; if (!!xa.name && (xa.name == 'NamedConstructor')) { def.members.push(generateIDLConstructor(def, xa)); } } } function generateIDLConstructor(def, xa){ return { type: 'constructor', idlType: def.name, name: xa.value || def.name, arguments: !!xa.arguments? xa.arguments: [] , raises: '', extAttrs: xa.extAttrs} ; } var eol = '\n'; function needsEOL(ln, end){ if ((ln == 'html') && !end) { return eol; } else if ((ln == 'body') && end) { return eol; } else { return ''; } } var ANOLIS_BOOLEAN_ATTRIBUTES = ['data-anolis-ref'] ; function isBooleanAttr(ln, n){ if ((html5.BOOLEAN_ATTRIBUTES[ln] || [] ).indexOf(n) != -1) { return true ; } else if (ANOLIS_BOOLEAN_ATTRIBUTES.indexOf(n) != -1) { return true ; } else { return false ; } } var rSub = new RegExp(/^\{@([^\}]*)\}$/); function getSubstitutionComment(comment){ var m = rSub.exec(comment); if (m && (_AN_Read_length('length', m) > 1)) { return m[1]; } else { return null ; } } function isIDLComment(comment){ var c = getSubstitutionComment(comment); return c && (c.search(/^idl[a-zA-Z]*\([^\)]*\)$/) == 0); } var rIdl = new RegExp(/^(idl[a-zA-Z]*)\(([^\)]*)\)$/); var rSep = new RegExp(/\s*,\s*/); function processIDLComment(comment){ var m = rIdl.exec(getSubstitutionComment(comment)); if (m && (_AN_Read_length('length', m) > 2)) { return formatIDLComment(m[1], m[2].split(rSep)); } else { return ''; } } function hasArg(args, arg, skip){ if (skip === 'undefined') { skip = 0; } var n = 0; for (var i in args){ if (n++ < skip) { continue ; } else { var a = args[i].split('='); if (a[0] == arg) { return true ; } } } return false ; } function getArgValue(args, arg, skip){ if (skip === 'undefined') { skip = 0; } var n = 0; for (var i in args){ if (n++ < skip) { continue ; } else { var a = args[i].split('='); if (a[0] == arg) { return (_AN_Read_length('length', a) > 1)? a[1]: ''; } } } return ''; } function formatIDLComment(method, args){ if (method == 'idl') { return formatIDL(args); } else if (method == 'idlDoc') { return formatIDLDoc(args); } else if (method == 'idlDef') { return formatIDLDef(args); } else if (method == 'idlDocMembers') { return formatIDLDocMembers(args); } else { return ''; } } function formatIDL(args){ var s = ''; s += formatIDLDoc(args); s += formatIDLDef(args); s += formatIDLDocMembers(args); return s; } function findIDL(name){ for (var i in idl){ var d = idl[i]; if (!!d.name && (d.name == name)) { return d; } else if (!!_AN_Read_target('target', d) && (_AN_Read_target('target', d) == name)) { return d; } } return null ; } function formatIDLDef(args){ var d = findIDL(args[0]); if (d) { return formatIDLDefinition(d, args); } else { return ''; } } function formatIDLDefinition(def, args){ var t = def.type; if (t == 'interface') { return formatIDLInterface(def, false , args); } else if (t == 'partialinterface') { return formatIDLInterface(def, true , args); } else if (t == 'typedef') { return formatIDLTypedef(def, args); } else if (t == 'implements') { return formatIDLImplements(def, args); } else { return '[[TBD - ' + t + ']]'; } } function formatIDLInterface(def, partial, args){ var n = def.name; var x = def.inheritance; var s = ''; s += eol; s += eltStart('pre', [newAttr('class', 'idl')] , false ); s += eltStart('span', [newAttr('class', 'idlInterface'), newAttr('id', generateIDLDefinitionID(def))] , false ); s += formatIDLExtendedAttributes(def, args); if (partial) { s += 'partial '; } s += 'interface '; s += eltStart('span', [newAttr('class', 'idlInterfaceID')] , false ); s += n; s += eltEnd('span', false ); if (x && (_AN_Read_length('length', x) > 0)) { s += ' : '; var xti = 0; for (var i in x){ var xt = x[i]; if (xti++ > 0) { s += ', '; } s += eltStart('span', [newAttr('class', 'idlSuperclass')] , false ); s += formatNamedIDLDefinitionNameAsLink(xt); s += eltEnd('span', false ); } } s += ' {' + eol; for (var i in def.members){ var m = def.members[i]; var f = formatIDLMember(def, m, args); if (f != '') { s += f + eol; } } s += '};'; s += eltEnd('span', false ); s += eltEnd('pre', true ); return s; } function formatIDLExtendedAttributes(def, args){ var s = ''; var numExposed = 0; for (var i in def.extAttrs){ var ea = def.extAttrs[i]; if (isExposedExtendedAttribute(ea)) { numExposed++ ; } } if (numExposed > 0) { s += '['; } var numOutput = 0; for (var i in def.extAttrs){ var ea = def.extAttrs[i]; if (isExposedExtendedAttribute(ea)) { if (numOutput > 0) { s += ',' + eol + ' '; } s += ea.name; if (!!ea.value) { s += '='; if (isIDLIdentifier(ea.value)) { s += ea.value; s += formatIDLExtendedAttributesArguments(ea); } else { s += '"' + ea.value + '"'; } } else if (!!ea.arguments) { s += formatIDLExtendedAttributesArguments(ea); } numOutput++ ; } } if (numExposed > 0) { if (numOutput > 1) { s += eol; } s += ']' + eol; } return s; } function isIDLIdentifier(s){ for (var i = 0, n = _AN_Read_length('length', s); i < n; i++ ){ var c = s.charAt(i); if ((c >= 'A') && (c <= 'Z')) { continue ; } else if ((c >= 'a') && (c <= 'z')) { continue ; } else if ((i > 0) && (c >= '0') && (c <= '9')) { continue ; } else { return false ; } } return true ; } function isExposedExtendedAttribute(ea){ var n = ea.name; if (n == 'ArrayClass') { return true ; } else if (n == 'Clamp') { return true ; } else if (n == 'Constructor') { return true ; } else if (n == 'EnforceRange') { return true ; } else if (n == 'ImplicitThis') { return true ; } else if (n == 'LenientThis') { return true ; } else if (n == 'NamedConstructor') { return true ; } else if (n == 'NoInterfaceObject') { return true ; } else if (n == 'OverrideBuiltins') { return true ; } else if (n == 'PutForwards') { return true ; } else if (n == 'Replaceable') { return true ; } else if (n == 'NamedPropertiesObject') { return true ; } else if (n == 'TreatNonCallableAsNull') { return true ; } else if (n == 'TreatNullAs') { return true ; } else if (n == 'TreatUndefinedAs') { return true ; } else if (n == 'Unforgeable') { return true ; } else { return false ; } } function formatIDLExtendedAttributesArguments(ea){ var s = ''; if (!!ea.arguments && (_AN_Read_length('length', ea.arguments) > 0)) { s += '('; for (var i in ea.arguments){ var a = ea.arguments[i]; if (i > 0) { s += ','; } s += a.type.idlType; s += ' '; s += a.name; } s += ')'; } return s; } function formatIDLMember(def, mem, args){ if (mem.type == 'const') { return formatIDLConstMember(def, mem, args); } else if (mem.type == 'attribute') { return formatIDLAttrMember(def, mem, args); } else if (mem.type == 'operation') { return formatIDLOperMember(def, mem, args); } else { return ''; } } function formatIDLConstMember(def, mem, args){ var n = mem.name; var s = ''; s += eltStart('span', [newAttr('class', 'idlConst')] , false ); s += ' '; s += 'const '; s += formatIDLConstType(def, mem, mem.idlType, false , args); s += ' '; s += eltStart('span', [newAttr('class', 'idlConstName')] , false ); s += eltStart('a', [newAttr('href', generateIDLConstIDRef(def, mem))] , false ); s += n; s += eltEnd('a', false ); s += eltEnd('span', false ); if (!!mem.value) { s += ' = '; s += eltStart('span', [newAttr('class', 'idlConstValue')] , false ); s += mem.value; s += eltEnd('span', false ); } s += ';'; s += eltEnd('span', false ); return s; } function formatIDLAttrMember(def, mem, args){ var n = mem.name; var s = ''; s += eltStart('span', [newAttr('class', 'idlAttribute')] , false ); s += ' '; if (mem.stringifier) { s += ' stringifier'; } if (mem.readonly) { s += ' readonly'; } s += ' '; s += 'attribute '; s += formatIDLAttrType(def, mem, mem.idlType, false , args); s += ' '; s += eltStart('span', [newAttr('class', 'idlAttrName')] , false ); s += eltStart('a', [newAttr('href', generateIDLAttrIDRef(def, mem))] , false ); s += n; s += eltEnd('a', false ); s += eltEnd('span', false ); s += ';'; s += eltEnd('span', false ); return s; } function generateIDRef(id){ return '#' + id; } var IDL_ID_PREFIX = 'widl'; function generateIDLDefinitionID(def){ return IDL_ID_PREFIX + '-def-' + def.name; } function generateIDLMemberID(def, mem, args){ if (mem.type == 'const') { return generateIDLConstID(def, mem, args); } else if (mem.type == 'attribute') { return generateIDLAttrID(def, mem, args); } else if (mem.type == 'operation') { return generateIDLOperID(def, mem, false , args); } else if (mem.type == 'constructor') { return generateIDLOperID(def, mem, false , args); } else { return ''; } } function generateIDLConstID(def, mem, args){ return IDL_ID_PREFIX + '-' + def.name + '-' + mem.name; } function generateIDLConstIDRef(def, mem, args){ return generateIDRef(generateIDLConstID(def, mem, args)); } function formatIDLConstType(def, mem, type, verbose, args){ return formatIDLType(def, mem, type, 'idlConstType', verbose, args); } function formatIDLConstSignature(def, mem, verbose, args){ var s = ''; s += ' '; s += formatIDLConstType(def, mem, mem.idlType, verbose, args); if (!!mem.value) { s += ', with value '; s += mem.value; } return s; } function generateIDLAttrID(def, mem, args){ return IDL_ID_PREFIX + '-' + def.name + '-' + mem.name; } function generateIDLAttrIDRef(def, mem, args){ return generateIDRef(generateIDLAttrID(def, mem, args)); } function formatIDLAttrType(def, mem, type, verbose, args){ return formatIDLType(def, mem, type, 'idlAttrType', verbose, args); } function formatIDLAttrSignature(def, mem, verbose, args){ var s = ''; s += ' '; s += formatIDLAttrType(def, mem, mem.idlType, verbose, args); return s; } function formatIDLOperMember(def, mem, args){ var n = mem.name; var s = ''; s += eltStart('span', [newAttr('class', 'idlMethod')] , false ); s += ' '; s += formatIDLOperType(def, mem, mem.idlType, false , args); s += ' '; s += eltStart('span', [newAttr('class', 'idlMethName')] , false ); s += eltStart('a', [newAttr('href', generateIDLOperIDRef(def, mem, args))] , false ); s += n; s += eltEnd('a', false ); s += eltEnd('span', false ); s += ' ('; for (var i in mem.arguments){ var p = mem.arguments[i]; if (i > 0) { s += ', '; } s += formatIDLOperParam(def, mem, p, i, false , args); } s += ')'; s += ';'; s += eltEnd('span', false ); return s; } function formatIDLOperSignature(def, mem, includeReturnType, args){ var s = ''; s += ' ('; for (var i in mem.arguments){ var p = mem.arguments[i]; if (i > 0) { s += ', '; } s += formatIDLOperParam(def, mem, p, i, false , args); } s += ')'; if (!!includeReturnType) { s += ', returns '; s += formatIDLOperType(def, mem, mem.idlType, false , args); } return s; } function generateIDLOperID(def, mem, verbose, args){ var s = ''; s += IDL_ID_PREFIX; s += '-'; s += def.name; if (mem.type == 'operation') { s += '-'; s += mem.name; if ((mem.idlType != 'void') || (_AN_Read_length('length', mem.arguments) > 0)) { s += '-'; s += generateIDLOperTypeID(def, mem, mem.idlType, verbose, args); } } if (!!mem.arguments && (_AN_Read_length('length', mem.arguments) > 0)) { for (var i in mem.arguments){ var p = mem.arguments[i]; s += '-'; s += generateIDLOperParamID(def, mem, p, verbose, args); } } else if (mem.type == 'constructor') { s += '-void'; } return s; } function generateIDLOperIDRef(def, mem, args){ return '#' + generateIDLOperID(def, mem, false , args); } function formatIDLOperType(def, mem, type, verbose, args){ return formatIDLType(def, mem, type, 'idlMethType', verbose, args); } function generateIDLOperTypeID(def, mem, type, verbose, args){ return generateIDLTypeID(def, mem, type, verbose, args); } function formatIDLOperParam(def, mem, param, index, excludeParamName, args){ var s = ''; s += eltStart('span', [newAttr('class', 'idlParam')] , false ); if (!!param.optional) { s += 'optional '; } s += formatIDLParamType(def, mem, param.type, false , args); if (!excludeParamName) { s += ' '; s += eltStart('span', [newAttr('class', 'idlParamName')] , false ); s += param.name; s += eltEnd('span', false ); } s += eltEnd('span', false ); return s; } function generateIDLOperParamID(def, mem, param, verbose, args){ var s = ''; s += generateIDLTypeID(def, mem, param.type, verbose, args); s += '-'; s += param.name; return s; } function formatIDLParamType(def, mem, type, verbose, args){ return formatIDLType(def, mem, type, 'idlParamType', verbose, args); } function formatIDLType(def, mem, type, cssClass, verbose, args){ var s = ''; if (!!verbose) { s += 'of type '; } if (!!cssClass) { s += eltStart('span', [newAttr('class', cssClass)] , false ); } s += eltStart('a', [] , false ); s += type.idlType || type; s += eltEnd('a', false ); if (!!type.nullable) { s += '?'; } if (!!cssClass) { s += eltEnd('span', false ); } if (!!verbose) { if (!!mem.readonly) { s += ', readonly'; } if (!!mem.nullable) { s += ', nullable'; } } return s; } function generateIDLTypeID(def, mem, type, verbose, args){ return hyphenateForID(type.idlType || type); } function hyphenateForID(token){ var t = token; t = _AN_Call_replace('replace', t, / /g, '-'); t = _AN_Call_replace('replace', t, /_/g, '-'); return t; } function formatIDLTypedef(def, partial, args){ var s = ''; s += eol; s += eltStart('pre', [newAttr('class', 'idl')] , false ); s += '[[TBD - TYPEDEF]]\n'; s += eltEnd('pre', true ); return s; } function formatIDLImplements(def, partial, args){ var s = ''; s += eol; s += eltStart('pre', [newAttr('class', 'idl')] , false ); s += '[[TBD - IMPLEMENTS]]\n'; s += eltEnd('pre', true ); return s; } function generateIDLOtherID(def, mem){ var s = ''; s += IDL_ID_PREFIX; s += '-'; s += def.name; if (mem) { s += '-'; s += mem.name; } return s; } function getIDLMemberID(def, mem, args){ if (mem.type == 'const') { return generateIDLConstID(def, mem, args); } else if (mem.type == 'attribute') { return generateIDLAttrID(def, mem, args); } else if (mem.type == 'operation') { return generateIDLOperID(def, mem, false , args); } else if (mem.type == 'constructor') { return generateIDLOperID(def, mem, false , args); } else { return generateIDLOtherID(def, mem, args); } } function getIDLMemberCSSClass(def, mem, args){ if (mem.type == 'const') { return 'idlConstant'; } else if (mem.type == 'attribute') { return 'idlAttribute'; } else if (mem.type == 'operation') { return 'idlMethod'; } else if (mem.type == 'constructor') { return 'idlConstructor'; } else { return 'unknown'; } } function getIDLMemberTermCSSClass(def, mem, args){ if (mem.type == 'const') { return 'constant'; } else if (mem.type == 'attribute') { return 'attribute'; } else if (mem.type == 'operation') { return 'method'; } else if (mem.type == 'constructor') { return 'constructor'; } else { return 'unknown'; } } function getIDLMembersHeader(cssClass){ if (cssClass == 'attributes') { return 'Attributes'; } else if (cssClass == 'constants') { return 'Constants'; } else if (cssClass == 'constructors') { return 'Constructors'; } else if (cssClass == 'members') { return 'Members'; } else if (cssClass == 'methods') { return 'Methods'; } else { return '[TBD] - Unmapped CSS Class - ' + cssClass; } } function wrap(s, en, getAttrs, newLine, def, mem, args){ var sNew = ''; sNew += eltStart(en, !!getAttrs? getAttrs(def, mem, args): [] , newLine); sNew += s; sNew += eltEnd(en, newLine); return sNew; } function join(strings, sep){ var s = ''; for (var i in strings){ if (sep && (_AN_Read_length('length', s) > 0)) { s += sep; } s += strings[i]; } return s; } var rKeyPattern = new RegExp(/(\{@[^\}]*\})/); var rKey = new RegExp(/\{@([^\}]*)\}/); function performKeywordSubs(s, subs){ var sa = s.split(rKeyPattern); for (var i in sa){ var p = sa[i]; var m = rKey.exec(p); if (m && (_AN_Read_length('length', m) > 1)) { var k = m[1]; if (subs && !!subs[k]) { sa[i] = subs[k]; } } } return join(sa); } function formatIDLDoc(args){ var d = findIDL(args[0]); if (d) { return formatIDLDefinitionDoc(d, args); } else { return ''; } } function formatIDLDefinitionDoc(def, args){ for (var i in def.extAttrs){ var xa = def.extAttrs[i]; if (!!xa.name && (xa.name == 'Documentation')) { return performKeywordSubs(xa.value || '', collectIDLDefinitionKeywords(def, args)); } } return ''; } function getIDLConstructorCount(def){ return !!def.constructors? _AN_Read_length('length', def.constructors): 0; } function collectIDLDefinitionKeywords(def, args){ return { type: def.type, name: formatAsCode(def.name), link: formatIDLDefinitionNameAsLink(def, args), memberCount: !!def.members? _AN_Read_length('length', def.members): 0, constructorCount: countConstructorMembers(def, args)} ; } function formatIDLDefinitionNameAsLink(def, args){ return formatAsLink(def.name, 'idlType', generateIDRef(generateIDLDefinitionID(def, args)), args); } function formatNamedIDLDefinitionNameAsLink(name, args){ if (name) { var d = findIDL(name); if (d) { return formatIDLDefinitionNameAsLink(d, args); } else { return formatAsCode(name); } } else { return ''; } } function formatIDLDocMembers(args){ var d = findIDL(args[0]); if (d) { return formatIDLDefinitionDocMembers(d, args); } else { return ''; } } function formatIDLDefinitionDocMembers(def, args){ if (hasArg(args, 'uncollatedMembers')) { return formatIDLDefinitionDocMembersUncollated(def, args); } else { return formatIDLDefinitionDocMembersCollated(def, args); } } function countConstMembers(def, args){ return countMembers('const', def, args); } function countAttrMembers(def, args){ return countMembers('attribute', def, args); } function countOperMembers(def, args){ return countMembers('operation', def, args); } function countConstructorMembers(def, args){ return countMembers('constructor', def, args); } function countMembers(type, def, args){ var n = 0; for (var i in def.members){ var m = def.members[i]; if (m.type == type) { n++ ; } } return n; } function formatIDLDefinitionDocMembersCollated(def, args){ var s = ''; if (countConstructorMembers(def, args) > 0) { s += formatIDLDefinitionDocConstructorMembers(def, args); } if (countConstMembers(def, args) > 0) { s += formatIDLDefinitionDocConstMembers(def, args); } if (countAttrMembers(def, args) > 0) { s += formatIDLDefinitionDocAttrMembers(def, args); } if (countOperMembers(def, args) > 0) { s += formatIDLDefinitionDocOperMembers(def, args); } return s; } function formatIDLDefinitionDocMembersUncollated(def, args){ return formatIDLDefinitionDocAllMembers(def, args); } function formatIDLDefinitionDocConstMembers(def, args){ return formatIDLDefinitionDocMembersByType('const', def, args); } function formatIDLDefinitionDocAttrMembers(def, args){ return formatIDLDefinitionDocMembersByType('attribute', def, args); } function formatIDLDefinitionDocOperMembers(def, args){ return formatIDLDefinitionDocMembersByType('operation', def, args); } function formatIDLDefinitionDocConstructorMembers(def, args){ return formatIDLDefinitionDocMembersByType('constructor', def, args); } function formatIDLDefinitionDocAllMembers(def, args){ return formatIDLDefinitionDocMembersByType(null , def, args); } function getIDLDefinitionListCSSClass(type){ if (type == 'const') { return 'constants'; } else if (type == 'attribute') { return 'attributes'; } else if (type == 'operation') { return 'methods'; } else if (type == 'constructor') { return 'constructors'; } else { return 'members'; } } function formatIDLDefinitionDocMembersByType(type, def, args){ var s = ''; var c = getIDLDefinitionListCSSClass(type); s += formatIDLDefinitionDocMembersHeader(type, def, args, c); s += eltStart('dl', [newAttr('class', c)] , true ); for (var i in def.members){ var m = def.members[i]; if (!type || (m.type == type)) { s += formatIDLMemberTerm(def, m, args); s += formatIDLMemberDefinition(def, m, args); } } s += eltEnd('dl', true ); return s; } function formatIDLDefinitionDocMembersHeader(type, def, args, cssClass){ var s = ''; if (hasArg(args, 'level')) { var level = parseInt(getArgValue(args, 'level')) + 1; var heading = 'h' + level; s += eltStart(heading, [newAttr('class', 'no-toc'), newAttr('id', generateIDLOtherID(def) + '-' + cssClass)] , false ); s += getIDLMembersHeader(cssClass); s += eltEnd(heading, true ); } return s; } function formatIDLMemberTerm(def, mem, args){ var getDTAttrs = function (def, mem, args){ return [newAttr('class', getIDLMemberTermCSSClass(def, mem, args)), newAttr('id', getIDLMemberID(def, mem, args))] ; } ; return wrap(formatIDLMemberTermContent(def, mem, args), 'dt', getDTAttrs, true , def, mem, args); } function formatIDLMemberTermContent(def, mem, args){ var s = formatAsCode(mem.name); if (mem.type == 'const') { s += formatIDLConstSignature(def, mem, true , args); } else if (mem.type == 'attribute') { s += formatIDLAttrSignature(def, mem, true , args); } else if (mem.type == 'operation') { s += formatIDLOperSignature(def, mem, true , args); } else if (mem.type == 'constructor') { s += formatIDLOperSignature(def, mem, false , args); } return s; } function wrapIDLMemberDD(s, def, mem, args){ return wrap(s, 'dd', null , true , def, mem, args); } function formatIDLMemberDefinition(def, mem, args){ for (var i in mem.extAttrs){ var xa = mem.extAttrs[i]; if (!!xa.name && (xa.name == 'Documentation')) { return wrapIDLMemberDD(performKeywordSubs(xa.value || '', collectIDLMemberKeywords(def, mem, args)), def, mem, args); } } return ''; } function getIDLOperParamsSignature(mem, sep){ var s = ''; for (var i in mem.arguments){ var a = mem.arguments[i]; if (sep && (_AN_Read_length('length', s) > 0)) { s += sep; } } return s; } function getIDLMemberSignature(mem){ if (mem.type == 'operation') { return '(' + getIDLOperParamsSignature(mem, ',') + ')'; } else if (mem.type == 'constructor') { return '(' + getIDLOperParamsSignature(mem, ',') + ')'; } else { return ''; } } function collectIDLMemberKeywords(def, mem, args){ return { type: mem.type, name: formatAsCode(mem.name), link: formatIDLMemberNameAsLink(def, mem, args), signature: getIDLMemberSignature(mem)} ; } function formatIDLMemberNameAsLink(def, mem, args){ return formatAsLink(mem.name, getIDLMemberCSSClass(def, mem, args), generateIDRef(generateIDLMemberID(def, mem, args)), args); } function newAttr(n, v){ return { nodeName: n, nodeValue: v} ; } function eltStartMaybeEmpty(ln, attrs, empty, newLine){ var s = '<' + ln; for (var i in attrs){ var a = attrs[i]; s += ' ' + formatAttr(a, ln); } if (empty) { s += '/'; } s += '>' + (newLine? eol: ''); return s; } function eltEmpty(ln, attrs, newLine){ return eltStartMaybeEmpty(ln, attrs, true , newLine); } function eltStart(ln, attrs, newLine){ return eltStartMaybeEmpty(ln, attrs, false , newLine); } function eltEnd(ln, newLine){ var s = '' + (newLine? eol: ''); return s; } function formatAsCode(s){ return wrap(s, 'code'); } function formatAsLink(inner, cssClass, href, args){ var s = ''; var aa = [] ; if (!!cssClass) { aa.push(newAttr('class', cssClass)); } if (!!href) { aa.push(newAttr('href', href)); } s += eltStart('a', aa); s += formatAsCode(inner); s += eltEnd('a'); return s; } var rQuote = new RegExp('[' + html5.SPACE_CHARACTERS_IN + '<=>\'\"' + ']'); var alwaysQuote = true ; function formatAttr(a, ln){ var n = a.nodeName; var v = _AN_Read_nodevalue('nodeValue', a); var s = n; if (!isBooleanAttr(ln, n)) { var quote = alwaysQuote || (_AN_Read_length('length', v) == 0) || rQuote.test(v); s += '='; if (quote) { s += '"'; } v = _AN_Call_replace('replace', v, /&/g, '&'); v = _AN_Call_replace('replace', v, /\"/g, '"'); v = _AN_Call_replace('replace', v, //g, '>'); s += v; if (quote) { s += '"'; } } return s; } function formatChars(chars, ln){ var newChars = chars; newChars = _AN_Call_replace('replace', newChars, /&/g, '&'); newChars = _AN_Call_replace('replace', newChars, //g, '>'); return newChars; } var $ = { ondata: function (data){ output += data; } , ontoken: function (token){ if (token.type == 'Doctype') { $.ondata('' + eol); } else if ((token.type == 'Characters') || (token.type == 'SpaceCharacters')) { $.ondata(formatChars(token.data)); } else if ((token.type == 'StartTag') || (token.type == 'EmptyTag')) { var ln = token.name.toLowerCase(); var attrs = [] ; for (var i = 0, n = _AN_Read_length('length', token.data); i < n; i++ ){ attrs.push(token.data.item(i)); } var attributes = ''; for (var i in attrs){ var a = attrs[i]; attributes += ' ' + formatAttr(a, ln); } $.ondata('<' + ln + attributes + ((token.type == 'EmptyTag')? '/': '') + '>' + needsEOL(ln, false )); } else if (token.type == 'EndTag') { var ln = token.name.toLowerCase(); $.ondata('' + needsEOL(ln, true )); } else if (token.type == 'Comment') { if (isIDLComment(token.data)) { $.ondata(processIDLComment(token.data)); } else { $.ondata(''); } } else { } } , onend: function (){ new html5.TreeWalker(parser.tree.document, $.ontoken); util.puts(output); } , run: function (argv){ var argc = _AN_Read_length('length', argv) - 2; if (argc < 1) { util.error("Error: Missing JSONFILE argument."); process.exit(2); } else if (argc < 2) { util.error("Error: Missing INPUTFILE argument."); process.exit(2); } else { try { var jsonFile = argv[argc++ ]; var inFile = argv[argc++ ]; var sIdl = fs.readFileSync(jsonFile, 'utf8'); idl = augmentIDL(JSON.parse(sIdl)); var sDoc = fs.createReadStream(inFile); parser.on('end', $.onend); parser.parse(sDoc); } catch (e) { util.error(util.inspect(e)); process.exit(1); } } } } ; $.run(process.argv); } )();