11ef15e30SBram Moolenaar" Vim completion script 21ef15e30SBram Moolenaar" Language: Java Script 31ef15e30SBram Moolenaar" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) 4*8b6144bdSBram Moolenaar" Last Change: 2006 Feb 6 51ef15e30SBram Moolenaar 61ef15e30SBram Moolenaarfunction! javascriptcomplete#CompleteJS(findstart, base) 71ef15e30SBram Moolenaar if a:findstart 81ef15e30SBram Moolenaar " locate the start of the word 91ef15e30SBram Moolenaar let line = getline('.') 101ef15e30SBram Moolenaar let start = col('.') - 1 111ef15e30SBram Moolenaar let curline = line('.') 121ef15e30SBram Moolenaar let compl_begin = col('.') - 2 131ef15e30SBram Moolenaar " Bit risky but JS is rather limited language and local chars shouldn't 141ef15e30SBram Moolenaar " fint way into names 151ef15e30SBram Moolenaar while start >= 0 && line[start - 1] =~ '\w' 161ef15e30SBram Moolenaar let start -= 1 171ef15e30SBram Moolenaar endwhile 181ef15e30SBram Moolenaar let b:compl_context = getline('.')[0:compl_begin] 191ef15e30SBram Moolenaar return start 201ef15e30SBram Moolenaar else 211ef15e30SBram Moolenaar " Initialize base return lists 221ef15e30SBram Moolenaar let res = [] 231ef15e30SBram Moolenaar let res2 = [] 241ef15e30SBram Moolenaar " a:base is very short - we need context 251ef15e30SBram Moolenaar " Shortcontext is context without a:base, useful for checking if we are 26*8b6144bdSBram Moolenaar " looking for objects and for what objects we are looking for 27*8b6144bdSBram Moolenaar let context = b:compl_context 281ef15e30SBram Moolenaar let shortcontext = substitute(context, a:base.'$', '', '') 291ef15e30SBram Moolenaar unlet! b:compl_context 301ef15e30SBram Moolenaar 31*8b6144bdSBram Moolenaar if exists("b:jsrange") 32*8b6144bdSBram Moolenaar let file = getline(b:jsrange[0],b:jsrange[1]) 33*8b6144bdSBram Moolenaar unlet! b:jsrange 34*8b6144bdSBram Moolenaar 35*8b6144bdSBram Moolenaar if len(b:js_extfiles) > 0 36*8b6144bdSBram Moolenaar let file = b:js_extfiles + file 37*8b6144bdSBram Moolenaar endif 38*8b6144bdSBram Moolenaar 39*8b6144bdSBram Moolenaar else 40*8b6144bdSBram Moolenaar let file = getline(1, '$') 41*8b6144bdSBram Moolenaar endif 42*8b6144bdSBram Moolenaar 43*8b6144bdSBram Moolenaar 44*8b6144bdSBram Moolenaar " Completion of properties, methods, etc. {{{ 451ef15e30SBram Moolenaar if shortcontext =~ '\.$' 461ef15e30SBram Moolenaar " Complete methods and properties for objects 471ef15e30SBram Moolenaar " DOM separate 481ef15e30SBram Moolenaar let doms = ['style.'] 491ef15e30SBram Moolenaar " Arrays 501ef15e30SBram Moolenaar let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype'] 511ef15e30SBram Moolenaar let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift', 521ef15e30SBram Moolenaar \ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf', 531ef15e30SBram Moolenaar \ 'watch', 'unwatch'] 541ef15e30SBram Moolenaar call map(arraymeth, 'v:val."("') 551ef15e30SBram Moolenaar let arrays = arrayprop + arraymeth 561ef15e30SBram Moolenaar 571ef15e30SBram Moolenaar " Boolean - complete subset of array values 581ef15e30SBram Moolenaar " properties - constructor, prototype 591ef15e30SBram Moolenaar " methods - toSource, toString, valueOf 601ef15e30SBram Moolenaar 611ef15e30SBram Moolenaar " Date 621ef15e30SBram Moolenaar " properties - constructor, prototype 631ef15e30SBram Moolenaar let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds', 641ef15e30SBram Moolenaar \ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset', 651ef15e30SBram Moolenaar \ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds', 661ef15e30SBram Moolenaar \ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds', 671ef15e30SBram Moolenaar \ 'getYear', 'parse', 'parse', 681ef15e30SBram Moolenaar \ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds', 691ef15e30SBram Moolenaar \ 'setMinutes', 'setMonth', 'setSeconds', 701ef15e30SBram Moolenaar \ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds', 711ef15e30SBram Moolenaar \ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime', 721ef15e30SBram Moolenaar \ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString', 731ef15e30SBram Moolenaar \ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch'] 741ef15e30SBram Moolenaar call map(datemeth, 'v:val."("') 751ef15e30SBram Moolenaar let dates = datemeth 761ef15e30SBram Moolenaar 771ef15e30SBram Moolenaar " Function 781ef15e30SBram Moolenaar let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length', 791ef15e30SBram Moolenaar \ 'arity', 'constructor', 'length', 'prototype'] 801ef15e30SBram Moolenaar let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf'] 811ef15e30SBram Moolenaar call map(funcmeth, 'v:val."("') 821ef15e30SBram Moolenaar let funcs = funcprop + funcmeth 831ef15e30SBram Moolenaar 841ef15e30SBram Moolenaar " Math 851ef15e30SBram Moolenaar let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT'] 861ef15e30SBram Moolenaar let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 871ef15e30SBram Moolenaar \ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan', 881ef15e30SBram Moolenaar \ 'watch', 'unwatch'] 891ef15e30SBram Moolenaar call map(mathmeth, 'v:val."("') 901ef15e30SBram Moolenaar let maths = mathprop + mathmeth 911ef15e30SBram Moolenaar 921ef15e30SBram Moolenaar " Number 931ef15e30SBram Moolenaar let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY', 941ef15e30SBram Moolenaar \ 'constructor', 'prototype'] 951ef15e30SBram Moolenaar let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf', 961ef15e30SBram Moolenaar \ 'watch', 'unwatch'] 971ef15e30SBram Moolenaar call map(numbmeth, 'v:val."("') 981ef15e30SBram Moolenaar let numbs = numbprop + numbmeth 991ef15e30SBram Moolenaar 1001ef15e30SBram Moolenaar " Object 1011ef15e30SBram Moolenaar let objeprop = ['constructor', 'prototype'] 1021ef15e30SBram Moolenaar let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf'] 1031ef15e30SBram Moolenaar call map(objemeth, 'v:val."("') 1041ef15e30SBram Moolenaar let objes = objeprop + objemeth 1051ef15e30SBram Moolenaar 1061ef15e30SBram Moolenaar " RegExp 1071ef15e30SBram Moolenaar let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype'] 108*8b6144bdSBram Moolenaar let regemeth = ['exec', 'test', 'toSource', 'toString', 'watch', 'unwatch'] 1091ef15e30SBram Moolenaar call map(regemeth, 'v:val."("') 1101ef15e30SBram Moolenaar let reges = regeprop + regemeth 1111ef15e30SBram Moolenaar 1121ef15e30SBram Moolenaar " String 1131ef15e30SBram Moolenaar let striprop = ['constructor', 'length', 'prototype'] 1141ef15e30SBram Moolenaar let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat', 1151ef15e30SBram Moolenaar \ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics', 1161ef15e30SBram Moolenaar \ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small', 1171ef15e30SBram Moolenaar \ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase', 1181ef15e30SBram Moolenaar \ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch'] 1191ef15e30SBram Moolenaar call map(strimeth, 'v:val."("') 1201ef15e30SBram Moolenaar let stris = striprop + strimeth 1211ef15e30SBram Moolenaar 1221ef15e30SBram Moolenaar " User created properties 1231ef15e30SBram Moolenaar let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\w"') 1241ef15e30SBram Moolenaar let juser_props1 = join(user_props1, ' ') 1251ef15e30SBram Moolenaar let user_props1 = split(juser_props1, '\zethis\.') 1261ef15e30SBram Moolenaar unlet! juser_props1 1271ef15e30SBram Moolenaar call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\w\\+\\ze")') 128*8b6144bdSBram Moolenaar 1291ef15e30SBram Moolenaar let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\w"') 130*8b6144bdSBram Moolenaar let juser_props2 = join(user_props2, ' ') 131*8b6144bdSBram Moolenaar let user_props2 = split(juser_props2, '\zeprototype\.') 132*8b6144bdSBram Moolenaar unlet! juser_props2 133*8b6144bdSBram Moolenaar call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\w\\+\\ze")') 1341ef15e30SBram Moolenaar let user_props = user_props1 + user_props2 1351ef15e30SBram Moolenaar 1361ef15e30SBram Moolenaar " HTML DOM properties 1371ef15e30SBram Moolenaar " Anchors - anchor. 1381ef15e30SBram Moolenaar let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML', 1391ef15e30SBram Moolenaar \ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus'] 1401ef15e30SBram Moolenaar let anchmeth = ['blur', 'focus'] 1411ef15e30SBram Moolenaar call map(anchmeth, 'v:val."("') 1421ef15e30SBram Moolenaar let anths = anchprop + anchmeth 1431ef15e30SBram Moolenaar " Area - area. 1441ef15e30SBram Moolenaar let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id', 1451ef15e30SBram Moolenaar \ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target'] 1461ef15e30SBram Moolenaar let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver'] 1471ef15e30SBram Moolenaar call map(areameth, 'v:val."("') 1481ef15e30SBram Moolenaar let areas = areaprop + areameth 1491ef15e30SBram Moolenaar " Base - base. 1501ef15e30SBram Moolenaar let baseprop = ['href', 'id', 'target'] 1511ef15e30SBram Moolenaar let bases = baseprop 1521ef15e30SBram Moolenaar " Body - body. 1531ef15e30SBram Moolenaar let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop', 1541ef15e30SBram Moolenaar \ 'text', 'vLink'] 1551ef15e30SBram Moolenaar let bodys = bodyprop 1561ef15e30SBram Moolenaar " Document - document. 1571ef15e30SBram Moolenaar let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets', 1581ef15e30SBram Moolenaar \ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL'] 1591ef15e30SBram Moolenaar let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById', 1601ef15e30SBram Moolenaar \ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln', 1611ef15e30SBram Moolenaar \ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp', 1621ef15e30SBram Moolenaar \ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize'] 1631ef15e30SBram Moolenaar call map(documeth, 'v:val."("') 164*8b6144bdSBram Moolenaar let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild', 165*8b6144bdSBram Moolenaar \ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 166*8b6144bdSBram Moolenaar \ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling'] 167*8b6144bdSBram Moolenaar let docuxmeth = ['createAttribute', 'createCDATASection', 168*8b6144bdSBram Moolenaar \ 'createComment', 'createDocument', 'createDocumentFragment', 169*8b6144bdSBram Moolenaar \ 'createElement', 'createEntityReference', 'createProcessingInstruction', 170*8b6144bdSBram Moolenaar \ 'createTextNode'] 171*8b6144bdSBram Moolenaar call map(docuxmeth, 'v:val."("') 172*8b6144bdSBram Moolenaar let docus = docuprop + docuxprop + documeth + docuxmeth 1731ef15e30SBram Moolenaar " Form - form. 1741ef15e30SBram Moolenaar let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length', 1751ef15e30SBram Moolenaar \ 'method', 'name', 'tabIndex', 'target'] 1761ef15e30SBram Moolenaar let formmeth = ['reset', 'submit', 'onReset', 'onSubmit'] 1771ef15e30SBram Moolenaar call map(formmeth, 'v:val."("') 1781ef15e30SBram Moolenaar let forms = formprop + formmeth 1791ef15e30SBram Moolenaar " Frame - frame. 1801ef15e30SBram Moolenaar let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth', 1811ef15e30SBram Moolenaar \ 'name', 'noResize', 'scrolling', 'src'] 1821ef15e30SBram Moolenaar let frammeth = ['blur', 'focus'] 1831ef15e30SBram Moolenaar call map(frammeth, 'v:val."("') 1841ef15e30SBram Moolenaar let frams = framprop + frammeth 1851ef15e30SBram Moolenaar " Frameset - frameset. 1861ef15e30SBram Moolenaar let fsetprop = ['cols', 'id', 'rows'] 1871ef15e30SBram Moolenaar let fsetmeth = ['blur', 'focus'] 1881ef15e30SBram Moolenaar call map(fsetmeth, 'v:val."("') 1891ef15e30SBram Moolenaar let fsets = fsetprop + fsetmeth 1901ef15e30SBram Moolenaar " History - history. 1911ef15e30SBram Moolenaar let histprop = ['length'] 1921ef15e30SBram Moolenaar let histmeth = ['back', 'forward', 'go'] 1931ef15e30SBram Moolenaar call map(histmeth, 'v:val."("') 1941ef15e30SBram Moolenaar let hists = histprop + histmeth 1951ef15e30SBram Moolenaar " Iframe - iframe. 1961ef15e30SBram Moolenaar let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth', 1971ef15e30SBram Moolenaar \ 'name', 'scrolling', 'src', 'width'] 1981ef15e30SBram Moolenaar let ifras = ifraprop 1991ef15e30SBram Moolenaar " Image - image. 2001ef15e30SBram Moolenaar let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc', 201*8b6144bdSBram Moolenaar \ 'lowSrc', 'name', 'src', 'useMap', 'vspace', 'width'] 2021ef15e30SBram Moolenaar let imagmeth = ['onAbort', 'onError', 'onLoad'] 2031ef15e30SBram Moolenaar call map(imagmeth, 'v:val."("') 2041ef15e30SBram Moolenaar let imags = histprop + imagmeth 2051ef15e30SBram Moolenaar " Button - accessible only by other properties 2061ef15e30SBram Moolenaar let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 2071ef15e30SBram Moolenaar let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp'] 2081ef15e30SBram Moolenaar call map(buttmeth, 'v:val."("') 2091ef15e30SBram Moolenaar let butts = buttprop + buttmeth 2101ef15e30SBram Moolenaar " Checkbox - accessible only by other properties 2111ef15e30SBram Moolenaar let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 2121ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 2131ef15e30SBram Moolenaar let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp'] 2141ef15e30SBram Moolenaar call map(checmeth, 'v:val."("') 2151ef15e30SBram Moolenaar let checs = checprop + checmeth 2161ef15e30SBram Moolenaar " File upload - accessible only by other properties 2171ef15e30SBram Moolenaar let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 2181ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 2191ef15e30SBram Moolenaar let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp'] 2201ef15e30SBram Moolenaar call map(filemeth, 'v:val."("') 2211ef15e30SBram Moolenaar let files = fileprop + filemeth 2221ef15e30SBram Moolenaar " Hidden - accessible only by other properties 2231ef15e30SBram Moolenaar let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value'] 2241ef15e30SBram Moolenaar let hidds = hiddprop 2251ef15e30SBram Moolenaar " Password - accessible only by other properties 2261ef15e30SBram Moolenaar let passprop = ['accept', 'accessKey', 'defaultValue', 2271ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex', 2281ef15e30SBram Moolenaar \ 'type', 'value'] 2291ef15e30SBram Moolenaar let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown', 2301ef15e30SBram Moolenaar \ 'onKeyPress', 'onKeyUp'] 2311ef15e30SBram Moolenaar call map(passmeth, 'v:val."("') 2321ef15e30SBram Moolenaar let passs = passprop + passmeth 2331ef15e30SBram Moolenaar " Radio - accessible only by other properties 2341ef15e30SBram Moolenaar let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 2351ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 2361ef15e30SBram Moolenaar let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus'] 2371ef15e30SBram Moolenaar call map(radimeth, 'v:val."("') 2381ef15e30SBram Moolenaar let radis = radiprop + radimeth 2391ef15e30SBram Moolenaar " Reset - accessible only by other properties 2401ef15e30SBram Moolenaar let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 2411ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 2421ef15e30SBram Moolenaar let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus'] 2431ef15e30SBram Moolenaar call map(resemeth, 'v:val."("') 2441ef15e30SBram Moolenaar let reses = reseprop + resemeth 2451ef15e30SBram Moolenaar " Submit - accessible only by other properties 2461ef15e30SBram Moolenaar let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 2471ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 2481ef15e30SBram Moolenaar let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart'] 2491ef15e30SBram Moolenaar call map(submmeth, 'v:val."("') 2501ef15e30SBram Moolenaar let subms = submprop + submmeth 2511ef15e30SBram Moolenaar " Text - accessible only by other properties 2521ef15e30SBram Moolenaar let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 2531ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 2541ef15e30SBram Moolenaar \ 'size', 'tabIndex', 'type', 'value'] 2551ef15e30SBram Moolenaar let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown', 2561ef15e30SBram Moolenaar \ 'onKeyPress', 'onKeyUp', 'onSelect'] 2571ef15e30SBram Moolenaar call map(textmeth, 'v:val."("') 2581ef15e30SBram Moolenaar let texts = textprop + textmeth 2591ef15e30SBram Moolenaar " Link - link. 2601ef15e30SBram Moolenaar let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media', 2611ef15e30SBram Moolenaar \ 'rel', 'rev', 'target', 'type'] 2621ef15e30SBram Moolenaar let linkmeth = ['onLoad'] 2631ef15e30SBram Moolenaar call map(linkmeth, 'v:val."("') 2641ef15e30SBram Moolenaar let links = linkprop + linkmeth 2651ef15e30SBram Moolenaar " Location - location. 2661ef15e30SBram Moolenaar let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol', 2671ef15e30SBram Moolenaar \ 'search'] 2681ef15e30SBram Moolenaar let locameth = ['assign', 'reload', 'replace'] 2691ef15e30SBram Moolenaar call map(locameth, 'v:val."("') 2701ef15e30SBram Moolenaar let locas = locaprop + locameth 2711ef15e30SBram Moolenaar " Meta - meta. 2721ef15e30SBram Moolenaar let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme'] 2731ef15e30SBram Moolenaar let metas = metaprop 2741ef15e30SBram Moolenaar " Navigator - navigator. 2751ef15e30SBram Moolenaar let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled', 2761ef15e30SBram Moolenaar \ 'platform', 'userAgent'] 2771ef15e30SBram Moolenaar let navimeth = ['javaEnabled', 'taintEnabled'] 2781ef15e30SBram Moolenaar call map(navimeth, 'v:val."("') 2791ef15e30SBram Moolenaar let navis = naviprop + navimeth 2801ef15e30SBram Moolenaar " Object - object. 2811ef15e30SBram Moolenaar let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data', 2821ef15e30SBram Moolenaar \ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex', 2831ef15e30SBram Moolenaar \ 'type', 'useMap', 'vspace', 'width'] 2841ef15e30SBram Moolenaar let objes = objeprop 2851ef15e30SBram Moolenaar " Option - accessible only by other properties 2861ef15e30SBram Moolenaar let optiprop = ['defaultSelected', 2871ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value'] 2881ef15e30SBram Moolenaar let optis = optiprop 2891ef15e30SBram Moolenaar " Screen - screen. 2901ef15e30SBram Moolenaar let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width'] 2911ef15e30SBram Moolenaar let scres = screprop 2921ef15e30SBram Moolenaar " Select - accessible only by other properties 2931ef15e30SBram Moolenaar let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name', 2941ef15e30SBram Moolenaar \ 'selectedIndex', 'size', 'tabIndex', 'type', 'value'] 2951ef15e30SBram Moolenaar let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus'] 2961ef15e30SBram Moolenaar call map(selemeth, 'v:val."("') 2971ef15e30SBram Moolenaar let seles = seleprop + selemeth 2981ef15e30SBram Moolenaar " Style - style. 2991ef15e30SBram Moolenaar let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage', 3001ef15e30SBram Moolenaar \ 'backgroundPosition', 'backgroundRepeat', 3011ef15e30SBram Moolenaar \ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop', 3021ef15e30SBram Moolenaar \ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 3031ef15e30SBram Moolenaar \ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle', 3041ef15e30SBram Moolenaar \ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', 3051ef15e30SBram Moolenaar \ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom', 3061ef15e30SBram Moolenaar \ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth', 3071ef15e30SBram Moolenaar \ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom', 3081ef15e30SBram Moolenaar \ 'paddingLeft', 'paddingRight', 'paddingTop', 3091ef15e30SBram Moolenaar \ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content', 3101ef15e30SBram Moolenaar \ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction', 3111ef15e30SBram Moolenaar \ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight', 3121ef15e30SBram Moolenaar \ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility', 3131ef15e30SBram Moolenaar \ 'width', 3141ef15e30SBram Moolenaar \ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType', 3151ef15e30SBram Moolenaar \ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex', 3161ef15e30SBram Moolenaar \ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside', 3171ef15e30SBram Moolenaar \ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout', 3181ef15e30SBram Moolenaar \ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', 3191ef15e30SBram Moolenaar \ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes', 3201ef15e30SBram Moolenaar \ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition', 3211ef15e30SBram Moolenaar \ 'unicodeBidi', 'whiteSpace', 'wordSpacing'] 3221ef15e30SBram Moolenaar let styls = stylprop 3231ef15e30SBram Moolenaar " Table - table. 3241ef15e30SBram Moolenaar let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding', 3251ef15e30SBram Moolenaar \ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width'] 3261ef15e30SBram Moolenaar let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow', 3271ef15e30SBram Moolenaar \ 'deleteTFoot', 'deleteTHead', 'insertRow'] 3281ef15e30SBram Moolenaar call map(tablmeth, 'v:val."("') 3291ef15e30SBram Moolenaar let tabls = tablprop + tablmeth 3301ef15e30SBram Moolenaar " Table data - TableData. 3311ef15e30SBram Moolenaar let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff', 3321ef15e30SBram Moolenaar \ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width'] 3331ef15e30SBram Moolenaar let tdats = tdatprop 3341ef15e30SBram Moolenaar " Table row - TableRow. 3351ef15e30SBram Moolenaar let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex', 3361ef15e30SBram Moolenaar \ 'vAlign'] 3371ef15e30SBram Moolenaar let trowmeth = ['deleteCell', 'insertCell'] 3381ef15e30SBram Moolenaar call map(trowmeth, 'v:val."("') 3391ef15e30SBram Moolenaar let trows = trowprop + trowmeth 3401ef15e30SBram Moolenaar " Textarea - accessible only by other properties 3411ef15e30SBram Moolenaar let tareprop = ['accessKey', 'cols', 'defaultValue', 3421ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows', 343*8b6144bdSBram Moolenaar \ 'tabIndex', 'type', 'value', 'selectionStart', 'selectionEnd'] 3441ef15e30SBram Moolenaar let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus'] 3451ef15e30SBram Moolenaar call map(taremeth, 'v:val."("') 3461ef15e30SBram Moolenaar let tares = tareprop + taremeth 3471ef15e30SBram Moolenaar " Window - window. 348*8b6144bdSBram Moolenaar let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history', 349*8b6144bdSBram Moolenaar \ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self', 350*8b6144bdSBram Moolenaar \ 'status', 'top', 'XMLHttpRequest', 'ActiveXObject'] 3511ef15e30SBram Moolenaar let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus', 3521ef15e30SBram Moolenaar \ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval', 3531ef15e30SBram Moolenaar \ 'setTimeout'] 3541ef15e30SBram Moolenaar call map(windmeth, 'v:val."("') 3551ef15e30SBram Moolenaar let winds = windprop + windmeth 3561ef15e30SBram Moolenaar " XMLHttpRequest - access by new xxx() 3571ef15e30SBram Moolenaar let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML', 358*8b6144bdSBram Moolenaar \ 'status', 'statusText', 'parseError'] 3591ef15e30SBram Moolenaar let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open', 3601ef15e30SBram Moolenaar \ 'send', 'setRequestHeader'] 3611ef15e30SBram Moolenaar call map(xmlhmeth, 'v:val."("') 3621ef15e30SBram Moolenaar let xmlhs = xmlhprop + xmlhmeth 3631ef15e30SBram Moolenaar 364*8b6144bdSBram Moolenaar " XML DOM 365*8b6144bdSBram Moolenaar " Attributes - element.attributes[x]. 366*8b6144bdSBram Moolenaar let xdomattrprop = ['name', 'specified', 'value'] 367*8b6144bdSBram Moolenaar " Element - anyelement. 368*8b6144bdSBram Moolenaar let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild', 369*8b6144bdSBram Moolenaar \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', 370*8b6144bdSBram Moolenaar \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName'] 371*8b6144bdSBram Moolenaar let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode', 372*8b6144bdSBram Moolenaar \ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize', 373*8b6144bdSBram Moolenaar \ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild', 374*8b6144bdSBram Moolenaar \ 'setAttribute', 'setAttributeNode'] 375*8b6144bdSBram Moolenaar call map(xdomelemmeth, 'v:val."("') 376*8b6144bdSBram Moolenaar let xdomelems = xdomelemprop + xdomelemmeth 377*8b6144bdSBram Moolenaar " Node - anynode. 378*8b6144bdSBram Moolenaar let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild', 379*8b6144bdSBram Moolenaar \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', 380*8b6144bdSBram Moolenaar \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling'] 381*8b6144bdSBram Moolenaar let xdomnodemeth = ['appendChild', 'cloneNode', 382*8b6144bdSBram Moolenaar \ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild'] 383*8b6144bdSBram Moolenaar call map(xdomnodemeth, 'v:val."("') 384*8b6144bdSBram Moolenaar let xdomnodes = xdomnodeprop + xdomnodemeth 385*8b6144bdSBram Moolenaar " NodeList 386*8b6144bdSBram Moolenaar let xdomnliss = ['length', 'item('] 387*8b6144bdSBram Moolenaar " Error - parseError. 388*8b6144bdSBram Moolenaar let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos'] 389*8b6144bdSBram Moolenaar 390*8b6144bdSBram Moolenaar " Find object type declaration to reduce number of suggestions. {{{ 391*8b6144bdSBram Moolenaar " 1. Get object name 392*8b6144bdSBram Moolenaar " 2. Find object declaration line 393*8b6144bdSBram Moolenaar " 3. General declaration follows "= new Type" syntax, additional else 394*8b6144bdSBram Moolenaar " for regexp "= /re/" 395*8b6144bdSBram Moolenaar " 4. Make correction for Microsoft.XMLHTTP ActiveXObject 396*8b6144bdSBram Moolenaar " 5. Repeat for external files 3971ef15e30SBram Moolenaar let object = matchstr(shortcontext, '\zs\w\+\ze\(\[.\{-}\]\)\?\.$') 398*8b6144bdSBram Moolenaar if len(object) > 0 3991ef15e30SBram Moolenaar let decl_line = search(object.'.\{-}=\s*new\s*', 'bn') 400*8b6144bdSBram Moolenaar if decl_line > 0 4011ef15e30SBram Moolenaar let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\w\+\ze') 402*8b6144bdSBram Moolenaar if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != '' 403*8b6144bdSBram Moolenaar let object_type = 'XMLHttpRequest' 404*8b6144bdSBram Moolenaar endif 405*8b6144bdSBram Moolenaar else 406*8b6144bdSBram Moolenaar let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn') 407*8b6144bdSBram Moolenaar if decl_line > 0 408*8b6144bdSBram Moolenaar let object_type = 'RegExp' 409*8b6144bdSBram Moolenaar endif 410*8b6144bdSBram Moolenaar endif 411*8b6144bdSBram Moolenaar " We didn't find var declaration in current file but we may have 412*8b6144bdSBram Moolenaar " something in external files. 413*8b6144bdSBram Moolenaar if decl_line == 0 && exists("b:js_extfiles") 414*8b6144bdSBram Moolenaar let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"') 415*8b6144bdSBram Moolenaar if len(dext_line) > 0 416*8b6144bdSBram Moolenaar let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\w\+\ze') 417*8b6144bdSBram Moolenaar if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != '' 418*8b6144bdSBram Moolenaar let object_type = 'XMLHttpRequest' 419*8b6144bdSBram Moolenaar endif 420*8b6144bdSBram Moolenaar else 421*8b6144bdSBram Moolenaar let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"') 422*8b6144bdSBram Moolenaar if len(dext_line) > 0 423*8b6144bdSBram Moolenaar let object_type = 'RegExp' 424*8b6144bdSBram Moolenaar endif 425*8b6144bdSBram Moolenaar endif 426*8b6144bdSBram Moolenaar endif 427*8b6144bdSBram Moolenaar endif 428*8b6144bdSBram Moolenaar " }}} 429*8b6144bdSBram Moolenaar 430*8b6144bdSBram Moolenaar if !exists('object_type') 431*8b6144bdSBram Moolenaar let object_type = '' 432*8b6144bdSBram Moolenaar endif 4331ef15e30SBram Moolenaar 4341ef15e30SBram Moolenaar if object_type == 'Date' 4351ef15e30SBram Moolenaar let values = dates 4361ef15e30SBram Moolenaar elseif object_type == 'Image' 4371ef15e30SBram Moolenaar let values = imags 4381ef15e30SBram Moolenaar elseif object_type == 'Array' 4391ef15e30SBram Moolenaar let values = arrays 4401ef15e30SBram Moolenaar elseif object_type == 'Boolean' 4411ef15e30SBram Moolenaar " TODO: a bit more than real boolean 4421ef15e30SBram Moolenaar let values = arrays 4431ef15e30SBram Moolenaar elseif object_type == 'XMLHttpRequest' 4441ef15e30SBram Moolenaar let values = xmlhs 4451ef15e30SBram Moolenaar elseif object_type == 'String' 4461ef15e30SBram Moolenaar let values = stris 447*8b6144bdSBram Moolenaar elseif object_type == 'RegExp' 448*8b6144bdSBram Moolenaar let values = reges 449*8b6144bdSBram Moolenaar elseif object_type == 'Math' 450*8b6144bdSBram Moolenaar let values = maths 4511ef15e30SBram Moolenaar endif 4521ef15e30SBram Moolenaar 4531ef15e30SBram Moolenaar if !exists('values') 4541ef15e30SBram Moolenaar " List of properties 4551ef15e30SBram Moolenaar if shortcontext =~ 'Math\.$' 4561ef15e30SBram Moolenaar let values = maths 457*8b6144bdSBram Moolenaar elseif shortcontext =~ 'anchors\(\[.\{-}\]\)\?\.$' 4581ef15e30SBram Moolenaar let values = anths 4591ef15e30SBram Moolenaar elseif shortcontext =~ 'area\.$' 4601ef15e30SBram Moolenaar let values = areas 4611ef15e30SBram Moolenaar elseif shortcontext =~ 'base\.$' 4621ef15e30SBram Moolenaar let values = bases 4631ef15e30SBram Moolenaar elseif shortcontext =~ 'body\.$' 4641ef15e30SBram Moolenaar let values = bodys 4651ef15e30SBram Moolenaar elseif shortcontext =~ 'document\.$' 4661ef15e30SBram Moolenaar let values = docus 467*8b6144bdSBram Moolenaar elseif shortcontext =~ 'forms\(\[.\{-}\]\)\?\.$' 4681ef15e30SBram Moolenaar let values = forms 4691ef15e30SBram Moolenaar elseif shortcontext =~ 'frameset\.$' 4701ef15e30SBram Moolenaar let values = fsets 4711ef15e30SBram Moolenaar elseif shortcontext =~ 'history\.$' 4721ef15e30SBram Moolenaar let values = hists 4731ef15e30SBram Moolenaar elseif shortcontext =~ 'iframe\.$' 4741ef15e30SBram Moolenaar let values = ifras 475*8b6144bdSBram Moolenaar elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$' 4761ef15e30SBram Moolenaar let values = imags 477*8b6144bdSBram Moolenaar elseif shortcontext =~ 'links\(\[.\{-}\]\)\?\.$' 4781ef15e30SBram Moolenaar let values = links 4791ef15e30SBram Moolenaar elseif shortcontext =~ 'location\.$' 4801ef15e30SBram Moolenaar let values = locas 4811ef15e30SBram Moolenaar elseif shortcontext =~ 'meta\.$' 4821ef15e30SBram Moolenaar let values = metas 4831ef15e30SBram Moolenaar elseif shortcontext =~ 'navigator\.$' 4841ef15e30SBram Moolenaar let values = navis 4851ef15e30SBram Moolenaar elseif shortcontext =~ 'object\.$' 4861ef15e30SBram Moolenaar let values = objes 4871ef15e30SBram Moolenaar elseif shortcontext =~ 'screen\.$' 4881ef15e30SBram Moolenaar let values = scres 4891ef15e30SBram Moolenaar elseif shortcontext =~ 'style\.$' 4901ef15e30SBram Moolenaar let values = styls 4911ef15e30SBram Moolenaar elseif shortcontext =~ 'table\.$' 4921ef15e30SBram Moolenaar let values = tabls 4931ef15e30SBram Moolenaar elseif shortcontext =~ 'TableData\.$' 4941ef15e30SBram Moolenaar let values = tdats 4951ef15e30SBram Moolenaar elseif shortcontext =~ 'TableRow\.$' 4961ef15e30SBram Moolenaar let values = trows 4971ef15e30SBram Moolenaar elseif shortcontext =~ 'window\.$' 4981ef15e30SBram Moolenaar let values = winds 499*8b6144bdSBram Moolenaar elseif shortcontext =~ 'parseError\.$' 500*8b6144bdSBram Moolenaar let values = xdomerror 501*8b6144bdSBram Moolenaar elseif shortcontext =~ 'attributes\[\d\+\]\.$' 502*8b6144bdSBram Moolenaar let values = xdomattrprop 5031ef15e30SBram Moolenaar else 5041ef15e30SBram Moolenaar let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris 5051ef15e30SBram Moolenaar let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists 506*8b6144bdSBram Moolenaar let values += ifras + imags + links + locas + metas + navis + objes + scres 507*8b6144bdSBram Moolenaar let values += tabls + trows + tares + winds 508*8b6144bdSBram Moolenaar let values += xdomnodes + xdomnliss + xdomelems 5091ef15e30SBram Moolenaar endif 5101ef15e30SBram Moolenaar endif 5111ef15e30SBram Moolenaar 5121ef15e30SBram Moolenaar for m in values 5131ef15e30SBram Moolenaar if m =~? '^'.a:base 5141ef15e30SBram Moolenaar call add(res, m) 5151ef15e30SBram Moolenaar elseif m =~? a:base 5161ef15e30SBram Moolenaar call add(res2, m) 5171ef15e30SBram Moolenaar endif 5181ef15e30SBram Moolenaar endfor 5191ef15e30SBram Moolenaar 5201ef15e30SBram Moolenaar unlet! values 5211ef15e30SBram Moolenaar return res + res2 5221ef15e30SBram Moolenaar 5231ef15e30SBram Moolenaar endif 524*8b6144bdSBram Moolenaar " }}} 5251ef15e30SBram Moolenaar 5261ef15e30SBram Moolenaar " Get variables data. 5271ef15e30SBram Moolenaar let variables = filter(copy(file), 'v:val =~ "var\\s"') 5281ef15e30SBram Moolenaar call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")') 5291ef15e30SBram Moolenaar call map(variables, 'substitute(v:val, ";\\|$", ",", "g")') 5301ef15e30SBram Moolenaar let vars = [] 531*8b6144bdSBram Moolenaar " This loop (and next one) is necessary to get variable names from 532*8b6144bdSBram Moolenaar " constructs like: var var1, var2, var3 = "something"; 5331ef15e30SBram Moolenaar for i in range(len(variables)) 5341ef15e30SBram Moolenaar let comma_separated = split(variables[i], ',\s*') 5351ef15e30SBram Moolenaar call map(comma_separated, 'matchstr(v:val, "\\w\\+")') 5361ef15e30SBram Moolenaar let vars += comma_separated 5371ef15e30SBram Moolenaar endfor 5381ef15e30SBram Moolenaar 5391ef15e30SBram Moolenaar let variables = sort(vars) 540*8b6144bdSBram Moolenaar unlet! vars 5411ef15e30SBram Moolenaar 542*8b6144bdSBram Moolenaar " Add "no var" variables. 5431ef15e30SBram Moolenaar let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\w\\+\\s*="') 544*8b6144bdSBram Moolenaar let u_vars = [] 545*8b6144bdSBram Moolenaar for i in range(len(undeclared_variables)) 546*8b6144bdSBram Moolenaar let split_equal = split(undeclared_variables[i], '\s*=') 547*8b6144bdSBram Moolenaar call map(split_equal, 'matchstr(v:val, "\\w\\+$")') 548*8b6144bdSBram Moolenaar let u_vars += split_equal 549*8b6144bdSBram Moolenaar endfor 5501ef15e30SBram Moolenaar 551*8b6144bdSBram Moolenaar let variables += sort(u_vars) 552*8b6144bdSBram Moolenaar unlet! u_vars 5531ef15e30SBram Moolenaar 5541ef15e30SBram Moolenaar " Get functions 5551ef15e30SBram Moolenaar let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"') 5561ef15e30SBram Moolenaar let arguments = copy(functions) 5571ef15e30SBram Moolenaar call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\w\\+")') 5581ef15e30SBram Moolenaar call map(functions, 'v:val."("') 559*8b6144bdSBram Moolenaar let functions = sort(functions) 5601ef15e30SBram Moolenaar 5611ef15e30SBram Moolenaar " Get functions arguments 5621ef15e30SBram Moolenaar call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")') 5631ef15e30SBram Moolenaar let jargs = join(arguments, ',') 5641ef15e30SBram Moolenaar let jargs = substitute(jargs, '\s', '', 'g') 5651ef15e30SBram Moolenaar let arguments = split(jargs, ',') 566*8b6144bdSBram Moolenaar let arguments = sort(arguments) 5671ef15e30SBram Moolenaar 5681ef15e30SBram Moolenaar " Built-in functions 569*8b6144bdSBram Moolenaar let builtin = ['alert(', 'confirm('] 5701ef15e30SBram Moolenaar 5711ef15e30SBram Moolenaar " Top-level HTML DOM objects 5721ef15e30SBram Moolenaar let htmldom = ['document', 'anchor', 'area', 'base', 'body', 'document', 'event', 'form', 'frame', 'frameset', 'history', 'iframe', 'image', 'input', 'link', 'location', 'meta', 'navigator', 'object', 'option', 'screen', 'select', 'table', 'tableData', 'tableHeader', 'tableRow', 'textarea', 'window'] 5731ef15e30SBram Moolenaar call map(htmldom, 'v:val."."') 5741ef15e30SBram Moolenaar 5751ef15e30SBram Moolenaar " Top-level properties 5761ef15e30SBram Moolenaar let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 5771ef15e30SBram Moolenaar \ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat', 5781ef15e30SBram Moolenaar \ 'parseInt', 'String', 'undefined', 'escape', 'unescape'] 5791ef15e30SBram Moolenaar 5801ef15e30SBram Moolenaar " Keywords 5811ef15e30SBram Moolenaar let keywords = ["Array", "Boolean", "Date", "Function", "Math", "Number", "Object", "RegExp", "String", "XMLHttpRequest", "ActiveXObject", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double ", "else", "enum", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in ", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super ", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with"] 5821ef15e30SBram Moolenaar 5831ef15e30SBram Moolenaar let values = variables + functions + htmldom + arguments + builtin + properties + keywords 5841ef15e30SBram Moolenaar 5851ef15e30SBram Moolenaar for m in values 5861ef15e30SBram Moolenaar if m =~? '^'.a:base 5871ef15e30SBram Moolenaar call add(res, m) 5881ef15e30SBram Moolenaar elseif m =~? a:base 5891ef15e30SBram Moolenaar call add(res2, m) 5901ef15e30SBram Moolenaar endif 5911ef15e30SBram Moolenaar endfor 5921ef15e30SBram Moolenaar 5931ef15e30SBram Moolenaar return res + res2 5941ef15e30SBram Moolenaarendfunction 595*8b6144bdSBram Moolenaar 596*8b6144bdSBram Moolenaar" vim:set foldmethod=marker: 597