11ef15e30SBram Moolenaar" Vim completion script 21ef15e30SBram Moolenaar" Language: Java Script 31ef15e30SBram Moolenaar" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) 48b6144bdSBram 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 15*1d2ba7faSBram Moolenaar while start >= 0 && line[start - 1] =~ '\k' 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 268b6144bdSBram Moolenaar " looking for objects and for what objects we are looking for 278b6144bdSBram Moolenaar let context = b:compl_context 281ef15e30SBram Moolenaar let shortcontext = substitute(context, a:base.'$', '', '') 291ef15e30SBram Moolenaar unlet! b:compl_context 301ef15e30SBram Moolenaar 318b6144bdSBram Moolenaar if exists("b:jsrange") 328b6144bdSBram Moolenaar let file = getline(b:jsrange[0],b:jsrange[1]) 338b6144bdSBram Moolenaar unlet! b:jsrange 348b6144bdSBram Moolenaar 358b6144bdSBram Moolenaar if len(b:js_extfiles) > 0 368b6144bdSBram Moolenaar let file = b:js_extfiles + file 378b6144bdSBram Moolenaar endif 388b6144bdSBram Moolenaar 398b6144bdSBram Moolenaar else 408b6144bdSBram Moolenaar let file = getline(1, '$') 418b6144bdSBram Moolenaar endif 428b6144bdSBram Moolenaar 438b6144bdSBram Moolenaar 448b6144bdSBram 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'] 1088b6144bdSBram 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 123*1d2ba7faSBram Moolenaar let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\k"') 1241ef15e30SBram Moolenaar let juser_props1 = join(user_props1, ' ') 1251ef15e30SBram Moolenaar let user_props1 = split(juser_props1, '\zethis\.') 1261ef15e30SBram Moolenaar unlet! juser_props1 127*1d2ba7faSBram Moolenaar call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\k\\+\\ze")') 1288b6144bdSBram Moolenaar 129*1d2ba7faSBram Moolenaar let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\k"') 1308b6144bdSBram Moolenaar let juser_props2 = join(user_props2, ' ') 1318b6144bdSBram Moolenaar let user_props2 = split(juser_props2, '\zeprototype\.') 1328b6144bdSBram Moolenaar unlet! juser_props2 133*1d2ba7faSBram Moolenaar call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\k\\+\\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."("') 1648b6144bdSBram Moolenaar let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild', 1658b6144bdSBram Moolenaar \ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 1668b6144bdSBram Moolenaar \ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling'] 1678b6144bdSBram Moolenaar let docuxmeth = ['createAttribute', 'createCDATASection', 1688b6144bdSBram Moolenaar \ 'createComment', 'createDocument', 'createDocumentFragment', 1698b6144bdSBram Moolenaar \ 'createElement', 'createEntityReference', 'createProcessingInstruction', 1708b6144bdSBram Moolenaar \ 'createTextNode'] 1718b6144bdSBram Moolenaar call map(docuxmeth, 'v:val."("') 1728b6144bdSBram 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', 2018b6144bdSBram 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', 3438b6144bdSBram 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. 3488b6144bdSBram Moolenaar let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history', 3498b6144bdSBram Moolenaar \ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self', 3508b6144bdSBram 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', 3588b6144bdSBram 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 3648b6144bdSBram Moolenaar " XML DOM 3658b6144bdSBram Moolenaar " Attributes - element.attributes[x]. 3668b6144bdSBram Moolenaar let xdomattrprop = ['name', 'specified', 'value'] 3678b6144bdSBram Moolenaar " Element - anyelement. 3688b6144bdSBram Moolenaar let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild', 3698b6144bdSBram Moolenaar \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', 3708b6144bdSBram Moolenaar \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName'] 3718b6144bdSBram Moolenaar let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode', 3728b6144bdSBram Moolenaar \ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize', 3738b6144bdSBram Moolenaar \ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild', 3748b6144bdSBram Moolenaar \ 'setAttribute', 'setAttributeNode'] 3758b6144bdSBram Moolenaar call map(xdomelemmeth, 'v:val."("') 3768b6144bdSBram Moolenaar let xdomelems = xdomelemprop + xdomelemmeth 3778b6144bdSBram Moolenaar " Node - anynode. 3788b6144bdSBram Moolenaar let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild', 3798b6144bdSBram Moolenaar \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', 3808b6144bdSBram Moolenaar \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling'] 3818b6144bdSBram Moolenaar let xdomnodemeth = ['appendChild', 'cloneNode', 3828b6144bdSBram Moolenaar \ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild'] 3838b6144bdSBram Moolenaar call map(xdomnodemeth, 'v:val."("') 3848b6144bdSBram Moolenaar let xdomnodes = xdomnodeprop + xdomnodemeth 3858b6144bdSBram Moolenaar " NodeList 3868b6144bdSBram Moolenaar let xdomnliss = ['length', 'item('] 3878b6144bdSBram Moolenaar " Error - parseError. 3888b6144bdSBram Moolenaar let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos'] 3898b6144bdSBram Moolenaar 3908b6144bdSBram Moolenaar " Find object type declaration to reduce number of suggestions. {{{ 3918b6144bdSBram Moolenaar " 1. Get object name 3928b6144bdSBram Moolenaar " 2. Find object declaration line 3938b6144bdSBram Moolenaar " 3. General declaration follows "= new Type" syntax, additional else 3948b6144bdSBram Moolenaar " for regexp "= /re/" 3958b6144bdSBram Moolenaar " 4. Make correction for Microsoft.XMLHTTP ActiveXObject 3968b6144bdSBram Moolenaar " 5. Repeat for external files 397*1d2ba7faSBram Moolenaar let object = matchstr(shortcontext, '\zs\k\+\ze\(\[.\{-}\]\)\?\.$') 3988b6144bdSBram Moolenaar if len(object) > 0 3991ef15e30SBram Moolenaar let decl_line = search(object.'.\{-}=\s*new\s*', 'bn') 4008b6144bdSBram Moolenaar if decl_line > 0 401*1d2ba7faSBram Moolenaar let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\k\+\ze') 4028b6144bdSBram Moolenaar if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != '' 4038b6144bdSBram Moolenaar let object_type = 'XMLHttpRequest' 4048b6144bdSBram Moolenaar endif 4058b6144bdSBram Moolenaar else 4068b6144bdSBram Moolenaar let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn') 4078b6144bdSBram Moolenaar if decl_line > 0 4088b6144bdSBram Moolenaar let object_type = 'RegExp' 4098b6144bdSBram Moolenaar endif 4108b6144bdSBram Moolenaar endif 4118b6144bdSBram Moolenaar " We didn't find var declaration in current file but we may have 4128b6144bdSBram Moolenaar " something in external files. 4138b6144bdSBram Moolenaar if decl_line == 0 && exists("b:js_extfiles") 4148b6144bdSBram Moolenaar let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"') 4158b6144bdSBram Moolenaar if len(dext_line) > 0 416*1d2ba7faSBram Moolenaar let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\k\+\ze') 4178b6144bdSBram Moolenaar if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != '' 4188b6144bdSBram Moolenaar let object_type = 'XMLHttpRequest' 4198b6144bdSBram Moolenaar endif 4208b6144bdSBram Moolenaar else 4218b6144bdSBram Moolenaar let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"') 4228b6144bdSBram Moolenaar if len(dext_line) > 0 4238b6144bdSBram Moolenaar let object_type = 'RegExp' 4248b6144bdSBram Moolenaar endif 4258b6144bdSBram Moolenaar endif 4268b6144bdSBram Moolenaar endif 4278b6144bdSBram Moolenaar endif 4288b6144bdSBram Moolenaar " }}} 4298b6144bdSBram Moolenaar 4308b6144bdSBram Moolenaar if !exists('object_type') 4318b6144bdSBram Moolenaar let object_type = '' 4328b6144bdSBram 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 4478b6144bdSBram Moolenaar elseif object_type == 'RegExp' 4488b6144bdSBram Moolenaar let values = reges 4498b6144bdSBram Moolenaar elseif object_type == 'Math' 4508b6144bdSBram 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 4578b6144bdSBram 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 4678b6144bdSBram 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 4758b6144bdSBram Moolenaar elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$' 4761ef15e30SBram Moolenaar let values = imags 4778b6144bdSBram 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 4998b6144bdSBram Moolenaar elseif shortcontext =~ 'parseError\.$' 5008b6144bdSBram Moolenaar let values = xdomerror 5018b6144bdSBram Moolenaar elseif shortcontext =~ 'attributes\[\d\+\]\.$' 5028b6144bdSBram 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 5068b6144bdSBram Moolenaar let values += ifras + imags + links + locas + metas + navis + objes + scres 5078b6144bdSBram Moolenaar let values += tabls + trows + tares + winds 5088b6144bdSBram 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 5248b6144bdSBram 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 = [] 5318b6144bdSBram Moolenaar " This loop (and next one) is necessary to get variable names from 5328b6144bdSBram 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*') 535*1d2ba7faSBram Moolenaar call map(comma_separated, 'matchstr(v:val, "\\k\\+")') 5361ef15e30SBram Moolenaar let vars += comma_separated 5371ef15e30SBram Moolenaar endfor 5381ef15e30SBram Moolenaar 5391ef15e30SBram Moolenaar let variables = sort(vars) 5408b6144bdSBram Moolenaar unlet! vars 5411ef15e30SBram Moolenaar 5428b6144bdSBram Moolenaar " Add "no var" variables. 543*1d2ba7faSBram Moolenaar let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\k\\+\\s*="') 5448b6144bdSBram Moolenaar let u_vars = [] 5458b6144bdSBram Moolenaar for i in range(len(undeclared_variables)) 5468b6144bdSBram Moolenaar let split_equal = split(undeclared_variables[i], '\s*=') 547*1d2ba7faSBram Moolenaar call map(split_equal, 'matchstr(v:val, "\\k\\+$")') 5488b6144bdSBram Moolenaar let u_vars += split_equal 5498b6144bdSBram Moolenaar endfor 5501ef15e30SBram Moolenaar 5518b6144bdSBram Moolenaar let variables += sort(u_vars) 5528b6144bdSBram 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) 557*1d2ba7faSBram Moolenaar call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\k\\+")') 5581ef15e30SBram Moolenaar call map(functions, 'v:val."("') 5598b6144bdSBram Moolenaar let functions = sort(functions) 5601ef15e30SBram Moolenaar 561*1d2ba7faSBram Moolenaar " Create table to keep arguments for additional 'menu' info 562*1d2ba7faSBram Moolenaar let b:js_menuinfo = {} 563*1d2ba7faSBram Moolenaar for i in arguments 564*1d2ba7faSBram Moolenaar let g:ia = i 565*1d2ba7faSBram Moolenaar let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))') 566*1d2ba7faSBram Moolenaar if len(f_elements) == 3 567*1d2ba7faSBram Moolenaar let b:js_menuinfo[f_elements[1].'('] = f_elements[2] 568*1d2ba7faSBram Moolenaar endif 569*1d2ba7faSBram Moolenaar endfor 570*1d2ba7faSBram Moolenaar 5711ef15e30SBram Moolenaar " Get functions arguments 5721ef15e30SBram Moolenaar call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")') 5731ef15e30SBram Moolenaar let jargs = join(arguments, ',') 5741ef15e30SBram Moolenaar let jargs = substitute(jargs, '\s', '', 'g') 5751ef15e30SBram Moolenaar let arguments = split(jargs, ',') 5768b6144bdSBram Moolenaar let arguments = sort(arguments) 5771ef15e30SBram Moolenaar 5781ef15e30SBram Moolenaar " Built-in functions 5798b6144bdSBram Moolenaar let builtin = ['alert(', 'confirm('] 5801ef15e30SBram Moolenaar 5811ef15e30SBram Moolenaar " Top-level HTML DOM objects 5821ef15e30SBram 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'] 5831ef15e30SBram Moolenaar call map(htmldom, 'v:val."."') 5841ef15e30SBram Moolenaar 5851ef15e30SBram Moolenaar " Top-level properties 5861ef15e30SBram Moolenaar let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 5871ef15e30SBram Moolenaar \ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat', 5881ef15e30SBram Moolenaar \ 'parseInt', 'String', 'undefined', 'escape', 'unescape'] 5891ef15e30SBram Moolenaar 5901ef15e30SBram Moolenaar " Keywords 5911ef15e30SBram 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"] 5921ef15e30SBram Moolenaar 5931ef15e30SBram Moolenaar let values = variables + functions + htmldom + arguments + builtin + properties + keywords 5941ef15e30SBram Moolenaar 5951ef15e30SBram Moolenaar for m in values 5961ef15e30SBram Moolenaar if m =~? '^'.a:base 5971ef15e30SBram Moolenaar call add(res, m) 5981ef15e30SBram Moolenaar elseif m =~? a:base 5991ef15e30SBram Moolenaar call add(res2, m) 6001ef15e30SBram Moolenaar endif 6011ef15e30SBram Moolenaar endfor 6021ef15e30SBram Moolenaar 603*1d2ba7faSBram Moolenaar let menu = res + res2 604*1d2ba7faSBram Moolenaar let final_menu = [] 605*1d2ba7faSBram Moolenaar for i in range(len(menu)) 606*1d2ba7faSBram Moolenaar let item = menu[i] 607*1d2ba7faSBram Moolenaar if item =~ '($' 608*1d2ba7faSBram Moolenaar let kind = 'f' 609*1d2ba7faSBram Moolenaar if has_key(b:js_menuinfo, item) 610*1d2ba7faSBram Moolenaar let m_info = b:js_menuinfo[item] 611*1d2ba7faSBram Moolenaar else 612*1d2ba7faSBram Moolenaar let m_info = '' 613*1d2ba7faSBram Moolenaar endif 614*1d2ba7faSBram Moolenaar else 615*1d2ba7faSBram Moolenaar let kind = 'v' 616*1d2ba7faSBram Moolenaar let m_info = '' 617*1d2ba7faSBram Moolenaar endif 618*1d2ba7faSBram Moolenaar let final_menu += [{'word':item, 'menu':m_info, 'kind':kind}] 619*1d2ba7faSBram Moolenaar endfor 620*1d2ba7faSBram Moolenaar let g:fm = final_menu 621*1d2ba7faSBram Moolenaar return final_menu 622*1d2ba7faSBram Moolenaar 6231ef15e30SBram Moolenaarendfunction 6248b6144bdSBram Moolenaar 6258b6144bdSBram Moolenaar" vim:set foldmethod=marker: 626