📄 docs.js
字号:
/* Copyright (c) 2004-2006, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.docs");dojo.require("dojo.io.*");dojo.require("dojo.event.topic");dojo.require("dojo.rpc.JotService");dojo.require("dojo.dom");dojo.require("dojo.uri.Uri");dojo.require("dojo.Deferred");dojo.require("dojo.DeferredList");/* * TODO: * * Package summary needs to compensate for "is" * Handle host environments * Deal with dojo.widget weirdness * Parse parameters * Limit function parameters to only the valid ones (Involves packing parameters onto meta during rewriting) * */dojo.docs = new function() { this._url = dojo.uri.dojoUri("docscripts"); this._rpc = new dojo.rpc.JotService; this._rpc.serviceUrl = dojo.uri.dojoUri("docscripts/jsonrpc.php");};dojo.lang.mixin(dojo.docs, { _count: 0, _callbacks: {function_names: []}, _cache: {}, // Saves the JSON objects in cache require: function(/*String*/ require, /*bool*/ sync) { dojo.debug("require(): " + require); var parts = require.split("/"); var size = parts.length; var deferred = new dojo.Deferred; var args = { mimetype: "text/json", load: function(type, data){ dojo.debug("require(): loaded"); if(parts[0] != "function_names") { for(var i = 0, part; part = parts[i]; i++){ data = data[part]; } } deferred.callback(data); }, error: function(){ deferred.errback(); } }; if (sync) { args.sync = true; } if(location.protocol == "file:"){ if(size){ if(parts[0] == "function_names"){ args.url = [this._url, "local_json", "function_names"].join("/"); }else{ var dirs = parts[0].split("."); args.url = [this._url, "local_json", dirs[0]].join("/"); if(dirs.length > 1){ args.url = [args.url, dirs[1]].join("."); } } } } dojo.io.bind(args); return deferred; }, getFunctionNames: function(){ return this.require("function_names"); // dojo.Deferred }, unFormat: function(/*String*/ string){ var fString = string; if(string.charAt(string.length - 1) == "_"){ fString = [string.substring(0, string.length - 1), "*"].join(""); } return fString; }, getMeta: function(/*mixed*/ selectKey, /*String*/ pkg, /*String*/ name, /*Function*/ callback, /*String?*/ id){ // summary: Gets information about a function in regards to its meta data if(typeof name == "function"){ // pId: a // pkg: ignore id = callback; callback = name; name = pkg; pkg = null; dojo.debug("getMeta(" + name + ")"); }else{ dojo.debug("getMeta(" + pkg + "/" + name + ")"); } if(!id){ id = "_"; } if(!selectKey){ selectKey = ++dojo.docs._count; } var input; if(typeof selectKey == "object" && selectKey.selectKey){ input = selectKey; selectKey = selectKey.selectKey; }else{ input = {}; } dojo.docs._buildCache({ type: "meta", callbacks: [dojo.docs._gotMeta, callback], pkg: pkg, name: name, id: id, selectKey: selectKey, input: input }); }, _withPkg: function(/*String*/ type, /*Object*/ data, /*Object*/ evt, /*Object*/ input, /*String*/ newType){ dojo.debug("_withPkg(" + evt.name + ") has package: " + data[0]); evt.pkg = data[0]; if("load" == type && evt.pkg){ evt.type = newType; dojo.docs._buildCache(evt); }else{ if(evt.callbacks && evt.callbacks.length){ evt.callbacks.shift()("error", {}, evt, evt.input); } } }, _gotMeta: function(/*String*/ type, /*Object*/ data, /*Object*/ evt){ dojo.debug("_gotMeta(" + evt.name + ")"); var cached = dojo.docs._getCache(evt.pkg, evt.name, "meta", "functions", evt.id); if(cached.summary){ data.summary = cached.summary; } if(evt.callbacks && evt.callbacks.length){ evt.callbacks.shift()(type, data, evt, evt.input); } }, getSrc: function(/*mixed*/ selectKey, /*String*/ name, /*Function*/ callback, /*String?*/ id){ // summary: Gets src file (created by the doc parser) dojo.debug("getSrc(" + name + ")"); if(!id){ id = "_"; } if(!selectKey){ selectKey = ++dojo.docs._count; } var input; if(typeof selectKey == "object" && selectKey.selectKey){ input = selectKey; selectKey = selectKey.selectKey; }else{ input = {}; } dojo.docs._buildCache({ type: "src", callbacks: [callback], name: name, id: id, input: input, selectKey: selectKey }); }, getDoc: function(/*mixed*/ selectKey, /*String*/ name, /*Function*/ callback, /*String?*/ id){ // summary: Gets external documentation stored on Jot for a given function dojo.debug("getDoc(" + name + ")"); if(!id){ id = "_"; } if(!selectKey){ selectKey = ++dojo.docs._count; } var input = {}; if(typeof selectKey == "object" && selectKey.selectKey){ input.input = selectKey; selectKey = selectKey.selectKey; } input.type = "doc"; input.name = name; input.selectKey = selectKey; input.callbacks = [callback]; input.selectKey = selectKey; dojo.docs._buildCache(input); }, _gotDoc: function(/*String*/ type, /*Array*/ data, /*Object*/ evt, /*Object*/ input){ dojo.debug("_gotDoc(" + evt.type + ")"); evt[evt.type] = data; if(evt.expects && evt.expects.doc){ for(var i = 0, expect; expect = evt.expects.doc[i]; i++){ if(!(expect in evt)){ dojo.debug("_gotDoc() waiting for more data"); return; } } } var cache = dojo.docs._getCache(evt.pkg, "meta", "functions", evt.name, evt.id, "meta"); var description = evt.fn.description; cache.description = description; data = { returns: evt.fn.returns, id: evt.id, variables: [], selectKey: evt.selectKey } if(!cache.parameters){ cache.parameters = {}; } for(var i = 0, param; param = evt.param[i]; i++){ var fName = param["DocParamForm/name"]; if(!cache.parameters[fName]){ cache.parameters[fName] = {}; } cache.parameters[fName].description = param["DocParamForm/desc"] } data.description = cache.description; data.parameters = cache.parameters; evt.type = "doc"; if(evt.callbacks && evt.callbacks.length){ evt.callbacks.shift()("load", data, evt, input); } }, getPkgDoc: function(/*mixed*/ selectKey, /*String*/ name, /*Function*/ callback){ // summary: Gets external documentation stored on Jot for a given package dojo.debug("getPkgDoc(" + name + ")"); var input = {}; if(typeof selectKey == "object" && selectKey.selectKey){ input = selectKey; selectKey = selectKey.selectKey; } if(!selectKey){ selectKey = ++dojo.docs._count; } dojo.docs._buildCache({ type: "pkgdoc", callbacks: [callback], name: name, selectKey: selectKey, input: input }); }, getPkgInfo: function(/*mixed*/ selectKey, /*String*/ name, /*Function*/ callback){ // summary: Gets a combination of the metadata and external documentation for a given package dojo.debug("getPkgInfo(" + name + ")"); if(!selectKey){ selectKey = ++dojo.docs._count; } var input = { selectKey: selectKey, expects: { pkginfo: ["pkgmeta", "pkgdoc"] }, callback: callback }; dojo.docs.getPkgMeta(input, name, dojo.docs._getPkgInfo); dojo.docs.getPkgDoc(input, name, dojo.docs._getPkgInfo); }, _getPkgInfo: function(/*String*/ type, /*Object*/ data, /*Object*/ evt){ dojo.debug("_getPkgInfo() for " + evt.type); var key = evt.selectKey; var input = {}; var results = {}; if(typeof key == "object"){ input = key; key = key.selectKey; input[evt.type] = data; if(input.expects && input.expects.pkginfo){ for(var i = 0, expect; expect = input.expects.pkginfo[i]; i++){ if(!(expect in input)){ dojo.debug("_getPkgInfo() waiting for more data"); return; } } } results = input.pkgmeta; results.description = input.pkgdoc; } if(input.callback){ input.callback("load", results, evt); } }, getInfo: function(/*mixed*/ selectKey, /*String*/ name, /*Function*/ callback){ dojo.debug("getInfo(" + name + ")"); var input = { expects: { "info": ["meta", "doc"] }, selectKey: selectKey, callback: callback } dojo.docs.getMeta(input, name, dojo.docs._getInfo); dojo.docs.getDoc(input, name, dojo.docs._getInfo); }, _getInfo: function(/*String*/ type, /*String*/ data, /*Object*/ evt, /*Object*/ input){ dojo.debug("_getInfo(" + evt.type + ")"); if(input && input.expects && input.expects.info){ input[evt.type] = data; for(var i = 0, expect; expect = input.expects.info[i]; i++){ if(!(expect in input)){ dojo.debug("_getInfo() waiting for more data"); return; } } } if(input.callback){ input.callback("load", dojo.docs._getCache(evt.pkg, "meta", "functions", evt.name, evt.id, "meta"), evt, input); } }, _getMainText: function(/*String*/ text){ // summary: Grabs the innerHTML from a Jot Rech Text node dojo.debug("_getMainText()"); return text.replace(/^<html[^<]*>/, "").replace(/<\/html>$/, "").replace(/<\w+\s*\/>/g, ""); }, getPackageMeta: function(/*Object*/ input){ dojo.debug("getPackageMeta(): " + input.pkg); return this.require(input.pkg + "/meta", input.sync); }, OLDgetPkgMeta: function(/*mixed*/ selectKey, /*String*/ name, /*Function*/ callback){ dojo.debug("getPkgMeta(" + name + ")"); var input = {}; if(typeof selectKey == "object" && selectKey.selectKey){ input = selectKey; selectKey = selectKey.selectKey; }else if(!selectKey){ selectKey = ++dojo.docs._count; } dojo.docs._buildCache({ type: "pkgmeta", callbacks: [callback], name: name, selectKey: selectKey, input: input }); }, OLD_getPkgMeta: function(/*Object*/ input){ dojo.debug("_getPkgMeta(" + input.name + ")"); input.type = "pkgmeta"; dojo.docs._buildCache(input); }, _onDocSearch: function(/*Object*/ input){ var _this = this; var name = input.name.toLowerCase(); if(!name) return; this.getFunctionNames().addCallback(function(data){ dojo.debug("_onDocSearch(): function names loaded for " + name); var output = []; var list = []; var closure = function(pkg, fn) { return function(data){ dojo.debug("_onDocSearch(): package meta loaded for: " + pkg); if(data.functions){ var functions = data.functions; for(var key in functions){ if(fn == key){ var ids = functions[key]; for(var id in ids){ var fnMeta = ids[id]; output.push({ package: pkg, name: fn, id: id, summary: fnMeta.summary }); } } } } return output; } } pkgLoop: for(var pkg in data){ if(pkg.toLowerCase() == name){ name = pkg; dojo.debug("_onDocSearch found a package"); //dojo.docs._onDocSelectPackage(input); return; } for(var i = 0, fn; fn = data[pkg][i]; i++){ if(fn.toLowerCase().indexOf(name) != -1){ dojo.debug("_onDocSearch(): Search matched " + fn); var meta = _this.getPackageMeta({pkg: pkg}); meta.addCallback(closure(pkg, fn)); list.push(meta); // Build a list of all packages that need to be loaded and their loaded state. continue pkgLoop; } } } list = new dojo.DeferredList(list); list.addCallback(function(results){ dojo.debug("_onDocSearch(): All packages loaded"); _this._printFunctionResults(results[0][1]); }); }); }, _onDocSearchFn: function(/*String*/ type, /*Array*/ data, /*Object*/ evt){ dojo.debug("_onDocSearchFn(" + evt.name + ")"); var name = evt.name || evt.pkg; dojo.debug("_onDocSearchFn found a function"); evt.pkgs = packages; evt.pkg = name; evt.loaded = 0; for(var i = 0, pkg; pkg = packages[i]; i++){ dojo.docs.getPkgMeta(evt, pkg, dojo.docs._onDocResults); } }, _onPkgResults: function(/*String*/ type, /*Object*/ data, /*Object*/ evt, /*Object*/ input){ dojo.debug("_onPkgResults(" + evt.type + ")"); var description = ""; var path = ""; var methods = {}; var requires = {}; if(input){ input[evt.type] = data; if(input.expects && input.expects.pkgresults){ for(var i = 0, expect; expect = input.expects.pkgresults[i]; i++){ if(!(expect in input)){ dojo.debug("_onPkgResults() waiting for more data"); return; } } } path = input.pkgdoc.path; description = input.pkgdoc.description; methods = input.pkgmeta.methods; requires = input.pkgmeta.requires; } var pkg = evt.name.replace("_", "*"); var results = { path: path, description: description, size: 0, methods: [], pkg: pkg, selectKey: evt.selectKey, requires: requires } var rePrivate = /_[^.]+$/; for(var method in methods){ if(!rePrivate.test(method)){ for(var pId in methods[method]){ results.methods.push({ pkg: pkg, name: method, id: pId, summary: methods[method][pId].summary }) } } } results.size = results.methods.length; dojo.docs._printPkgResult(results); }, _onDocResults: function(/*String*/ type, /*Object*/ data, /*Object*/ evt, /*Object*/ input){ dojo.debug("_onDocResults(" + evt.name + "/" + input.pkg + ") " + type); ++input.loaded; if(input.loaded == input.pkgs.length){ var pkgs = input.pkgs; var name = input.pkg; var results = {selectKey: evt.selectKey, methods: []}; var rePrivate = /_[^.]+$/; data = dojo.docs._cache; for(var i = 0, pkg; pkg = pkgs[i]; i++){ var methods = dojo.docs._getCache(pkg, "meta", "methods"); for(var fn in methods){ if(fn.toLowerCase().indexOf(name) == -1){ continue; } if(fn != "requires" && !rePrivate.test(fn)){ for(var pId in methods[fn]){ var result = { pkg: pkg, name: fn, id: "_", summary: "" } if(methods[fn][pId].summary){ result.summary = methods[fn][pId].summary; } results.methods.push(result); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -