docs.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:18k
- /*
- 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){
- 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({package: 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,
- 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 = {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);
- }
- }
- }
- }
- dojo.debug("Publishing docResults");
- dojo.docs._printFnResults(results);
- }
- },
- _printFunctionResults: function(results){
- dojo.debug("_printFnResults(): called");
- // summary: Call this function to send the /docs/function/results topic
- },
- _printPkgResult: function(results){
- dojo.debug("_printPkgResult(): called");
- },
- _onDocSelectFunction: function(/*Object*/ input){
- // summary: Get doc, meta, and src
- var name = input.name;
- var package = input.package || "";
- var id = input.id || "_";
- dojo.debug("_onDocSelectFunction(" + name + ")");
- if(!name || !package) return false;
- var pkgMeta = this.getPackageMeta({package: package});
- var meta = this.getFunctionMeta({package: package, name: name, id: id});
- var doc = this.getFunctionDocumentation({package: package, name: name, id: id});
-
- var list = new dojo.DeferredList([pkgMeta, meta, doc]);
- list.addCallback(function(results){
- dojo.debug("_onDocSelectFunction() loaded");
- for(var i = 0, result; result = results[i]; i++){
- dojo.debugShallow(result[1]);
- }
- });
-
- return list;
- },
- _onDocSelectPackage: function(/*Object*/ input){
- dojo.debug("_onDocSelectPackage(" + input.name + ")")
- input.expects = {
- "pkgresults": ["pkgmeta", "pkgdoc"]
- };
- dojo.docs.getPkgMeta(input, input.name, dojo.docs._onPkgResults);
- dojo.docs.getPkgDoc(input, input.name, dojo.docs._onPkgResults);
- },
- _onDocSelectResults: function(/*String*/ type, /*Object*/ data, /*Object*/ evt, /*Object*/ input){
- dojo.debug("_onDocSelectResults(" + evt.type + ", " + evt.name + ")");
- if(evt.type == "meta"){
- dojo.docs.getPkgMeta(input, evt.pkg, dojo.docs._onDocSelectResults);
- }
- if(input){
- input[evt.type] = data;
- if(input.expects && input.expects.docresults){
- for(var i = 0, expect; expect = input.expects.docresults[i]; i++){
- if(!(expect in input)){
- dojo.debug("_onDocSelectResults() waiting for more data");
- return;
- }
- }
- }
- }
- dojo.docs._printFunctionDetail(input);
- },
-
- _printFunctionDetail: function(results) {
- // summary: Call this function to send the /docs/function/detail topic event
- },
- selectFunction: function(/*String*/ name, /*String?*/ id){
- // summary: The combined information
- },
- savePackage: function(/*Object*/ callbackObject, /*String*/ callback, /*Object*/ parameters){
- dojo.event.kwConnect({
- srcObj: dojo.docs,
- srcFunc: "_savedPkgRpc",
- targetObj: callbackObject,
- targetFunc: callback,
- once: true
- });
-
- var props = {};
- var cache = dojo.docs._getCache(parameters.pkg, "meta");
- var i = 1;
- if(!cache.path){
- var path = "id";
- props[["pname", i].join("")] = "DocPkgForm/require";
- props[["pvalue", i++].join("")] = parameters.pkg;
- }else{
- var path = cache.path;
- }
- props.form = "//DocPkgForm";
- props.path = ["/WikiHome/DojoDotDoc/", path].join("");
- if(parameters.description){
- props[["pname", i].join("")] = "main/text";
- props[["pvalue", i++].join("")] = parameters.description;
- }
-
- dojo.docs._rpc.callRemote("saveForm", props).addCallbacks(dojo.docs._pkgRpc, dojo.docs._pkgRpc);
- },
- _pkgRpc: function(data){
- if(data.name){
- dojo.docs._getCache(data["DocPkgForm/require"], "meta").path = data.name;
- dojo.docs._savedPkgRpc("load");
- }else{
- dojo.docs._savedPkgRpc("error");
- }
- },
- _savedPkgRpc: function(type){
- },
- functionPackages: function(/*String*/ name, /*Function*/ callback, /*Object*/ input){
- // summary: Gets the package associated with a function and stores it in the .pkg value of input
- dojo.debug("functionPackages() name: " + name);
- if(!input){
- input = {};
- }
- if(!input.callbacks){
- input.callbacks = [];
- }
- input.type = "function_names";
- input.name = name;
- input.callbacks.unshift(callback);
- input.callbacks.unshift(dojo.docs._functionPackages);
- },
- _functionPackages: function(/*String*/ type, /*Array*/ data, /*Object*/ evt){
- dojo.debug("_functionPackages() name: " + evt.name);
- evt.pkg = '';
- var results = [];
- var data = dojo.docs._cache['function_names'];
- for(var key in data){
- if(dojo.lang.inArray(data[key], evt.name)){
- dojo.debug("_functionPackages() package: " + key);
- results.push(key);
- }
- }
- if(evt.callbacks && evt.callbacks.length){
- evt.callbacks.shift()(type, results, evt, evt.input);
- }
- },
- setUserName: function(/*String*/ name){
- dojo.docs._userName = name;
- if(name && dojo.docs._password){
- dojo.docs._logIn();
- }
- },
- setPassword: function(/*String*/ password){
- dojo.docs._password = password;
- if(password && dojo.docs._userName){
- dojo.docs._logIn();
- }
- },
- _logIn: function(){
- dojo.io.bind({
- url: dojo.docs._rpc.serviceUrl.toString(),
- method: "post",
- mimetype: "text/json",
- content: {
- username: dojo.docs._userName,
- password: dojo.docs._password
- },
- load: function(type, data){
- if(data.error){
- dojo.docs.logInSuccess();
- }else{
- dojo.docs.logInFailure();
- }
- },
- error: function(){
- dojo.docs.logInFailure();
- }
- });
- },
- logInSuccess: function(){},
- logInFailure: function(){},
- _set: function(/*Object*/ base, /*String...*/ keys, /*String*/ value){
- var args = [];
- for(var i = 0, arg; arg = arguments[i]; i++){
- args.push(arg);
- }
- if(args.length < 3) return;
- base = args.shift();
- value = args.pop();
- var key = args.pop();
- for(var i = 0, arg; arg = args[i]; i++){
- if(typeof base[arg] != "object"){
- base[arg] = {};
- }
- base = base[arg];
- }
- base[key] = value;
- },
- _getCache: function(/*String...*/ keys){
- var obj = dojo.docs._cache;
- for(var i = 0; i < arguments.length; i++){
- var arg = arguments[i];
- if(!obj[arg]){
- obj[arg] = {};
- }
- obj = obj[arg];
- }
- return obj;
- }
- });
- dojo.event.topic.subscribe("/docs/search", dojo.docs, "_onDocSearch");
- dojo.event.topic.subscribe("/docs/function/select", dojo.docs, "_onDocSelectFunction");
- dojo.event.topic.subscribe("/docs/package/select", dojo.docs, "_onDocSelectPackage");
- dojo.event.topic.registerPublisher("/docs/function/results", dojo.docs, "_printFunctionResults");
- dojo.event.topic.registerPublisher("/docs/function/detail", dojo.docs, "_printFunctionDetail");
- dojo.event.topic.registerPublisher("/docs/package/detail", dojo.docs, "_printPkgResult");