📄 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 for " + require);
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(location.protocol == "file:"){
if(size){
if(parts[parts.length - 1] == "documentation"){
parts[parts.length - 1] = "meta";
}
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(/*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 = "_";
}
},
_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;
}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(/*String*/ name, /*Function*/ callback, /*String?*/ id){
// summary: Gets src file (created by the doc parser)
dojo.debug("getSrc(" + name + ")");
if(!id){
id = "_";
}
},
getDoc: function(/*String*/ name, /*Function*/ callback, /*String?*/ id){
// summary: Gets external documentation stored on Jot for a given function
dojo.debug("getDoc(" + name + ")");
if(!id){
id = "_";
}
var input = {};
input.type = "doc";
input.name = name;
input.callbacks = [callback];
},
_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: []
}
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(/*String*/ name, /*Function*/ callback){
// summary: Gets external documentation stored on Jot for a given package
dojo.debug("getPkgDoc(" + name + ")");
var input = {};
},
getPkgInfo: function(/*String*/ name, /*Function*/ callback){
// summary: Gets a combination of the metadata and external documentation for a given package
dojo.debug("getPkgInfo(" + name + ")");
var input = {
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 input = {};
var results = {};
if(typeof key == "object"){
input = key;
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(/*String*/ name, /*Function*/ callback){
dojo.debug("getInfo(" + name + ")");
var input = {
expects: {
"info": ["meta", "doc"]
},
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.package);
return this.require(input.package + "/meta", input.sync);
},
getFunctionMeta: function(/*Object*/ input){
var package = input.package || "";
var name = input.name;
var id = input.id || "_";
dojo.debug("getFunctionMeta(): " + name);
if(!name) return;
if(package){
return this.require(package + "/meta/functions/" + name + "/" + id + "/meta");
}else{
this.getFunctionNames();
}
},
getFunctionDocumentation: function(/*Object*/ input){
var package = input.package || "";
var name = input.name;
var id = input.id || "_";
dojo.debug("getFunctionDocumentation(): " + name);
if(!name) return;
if(package){
return this.require(package + "/meta/functions/" + name + "/" + id + "/documentation");
}
},
_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){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -