docs.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:18k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.docs");
  9. dojo.require("dojo.io.*");
  10. dojo.require("dojo.event.topic");
  11. dojo.require("dojo.rpc.JotService");
  12. dojo.require("dojo.dom");
  13. dojo.require("dojo.uri.Uri");
  14. dojo.require("dojo.Deferred");
  15. dojo.require("dojo.DeferredList");
  16. /*
  17.  * TODO:
  18.  *
  19.  * Package summary needs to compensate for "is"
  20.  * Handle host environments
  21.  * Deal with dojo.widget weirdness
  22.  * Parse parameters
  23.  * Limit function parameters to only the valid ones (Involves packing parameters onto meta during rewriting)
  24.  *
  25.  */
  26. dojo.docs = new function() {
  27. this._url = dojo.uri.dojoUri("docscripts");
  28. this._rpc = new dojo.rpc.JotService;
  29. this._rpc.serviceUrl = dojo.uri.dojoUri("docscripts/jsonrpc.php");
  30. };
  31. dojo.lang.mixin(dojo.docs, {
  32. _count: 0,
  33. _callbacks: {function_names: []},
  34. _cache: {}, // Saves the JSON objects in cache
  35. require: function(/*String*/ require, /*bool*/ sync) {
  36. dojo.debug("require(): " + require);
  37. var parts = require.split("/");
  38. var size = parts.length;
  39. var deferred = new dojo.Deferred;
  40. var args = {
  41. mimetype: "text/json",
  42. load: function(type, data){
  43. dojo.debug("require(): loaded for " + require);
  44. if(parts[0] != "function_names") {
  45. for(var i = 0, part; part = parts[i]; i++){
  46. data = data[part];
  47. }
  48. }
  49. deferred.callback(data);
  50. },
  51. error: function(){
  52. deferred.errback();
  53. }
  54. };
  55. if(location.protocol == "file:"){
  56. if(size){
  57. if(parts[parts.length - 1] == "documentation"){
  58. parts[parts.length - 1] = "meta";
  59. }
  60. if(parts[0] == "function_names"){
  61. args.url = [this._url, "local_json", "function_names"].join("/");
  62. }else{
  63. var dirs = parts[0].split(".");
  64. args.url = [this._url, "local_json", dirs[0]].join("/");
  65. if(dirs.length > 1){
  66. args.url = [args.url, dirs[1]].join(".");
  67. }
  68. }
  69. }
  70. }
  71. dojo.io.bind(args);
  72. return deferred;
  73. },
  74. getFunctionNames: function(){
  75. return this.require("function_names"); // dojo.Deferred
  76. },
  77. unFormat: function(/*String*/ string){
  78. var fString = string;
  79. if(string.charAt(string.length - 1) == "_"){
  80. fString = [string.substring(0, string.length - 1), "*"].join("");
  81. }
  82. return fString;
  83. },
  84. getMeta: function(/*String*/ pkg, /*String*/ name, /*Function*/ callback, /*String?*/ id){
  85. // summary: Gets information about a function in regards to its meta data
  86. if(typeof name == "function"){
  87. // pId: a
  88. // pkg: ignore
  89. id = callback;
  90. callback = name;
  91. name = pkg;
  92. pkg = null;
  93. dojo.debug("getMeta(" + name + ")");
  94. }else{
  95. dojo.debug("getMeta(" + pkg + "/" + name + ")");
  96. }
  97. if(!id){
  98. id = "_";
  99. }
  100. },
  101. _withPkg: function(/*String*/ type, /*Object*/ data, /*Object*/ evt, /*Object*/ input, /*String*/ newType){
  102. dojo.debug("_withPkg(" + evt.name + ") has package: " + data[0]);
  103. evt.pkg = data[0];
  104. if("load" == type && evt.pkg){
  105. evt.type = newType;
  106. }else{
  107. if(evt.callbacks && evt.callbacks.length){
  108. evt.callbacks.shift()("error", {}, evt, evt.input);
  109. }
  110. }
  111. },
  112. _gotMeta: function(/*String*/ type, /*Object*/ data, /*Object*/ evt){
  113. dojo.debug("_gotMeta(" + evt.name + ")");
  114. var cached = dojo.docs._getCache(evt.pkg, evt.name, "meta", "functions", evt.id);
  115. if(cached.summary){
  116. data.summary = cached.summary;
  117. }
  118. if(evt.callbacks && evt.callbacks.length){
  119. evt.callbacks.shift()(type, data, evt, evt.input);
  120. }
  121. },
  122. getSrc: function(/*String*/ name, /*Function*/ callback, /*String?*/ id){
  123. // summary: Gets src file (created by the doc parser)
  124. dojo.debug("getSrc(" + name + ")");
  125. if(!id){
  126. id = "_";
  127. }
  128. },
  129. getDoc: function(/*String*/ name, /*Function*/ callback, /*String?*/ id){
  130. // summary: Gets external documentation stored on Jot for a given function
  131. dojo.debug("getDoc(" + name  + ")");
  132. if(!id){
  133. id = "_";
  134. }
  135. var input = {};
  136. input.type = "doc";
  137. input.name = name;
  138. input.callbacks = [callback];
  139. },
  140. _gotDoc: function(/*String*/ type, /*Array*/ data, /*Object*/ evt, /*Object*/ input){
  141. dojo.debug("_gotDoc(" + evt.type + ")");
  142. evt[evt.type] = data;
  143. if(evt.expects && evt.expects.doc){
  144. for(var i = 0, expect; expect = evt.expects.doc[i]; i++){
  145. if(!(expect in evt)){
  146. dojo.debug("_gotDoc() waiting for more data");
  147. return;
  148. }
  149. }
  150. }
  151. var cache = dojo.docs._getCache(evt.pkg, "meta", "functions", evt.name, evt.id, "meta");
  152. var description = evt.fn.description;
  153. cache.description = description;
  154. data = {
  155. returns: evt.fn.returns,
  156. id: evt.id,
  157. variables: []
  158. }
  159. if(!cache.parameters){
  160. cache.parameters = {};
  161. }
  162. for(var i = 0, param; param = evt.param[i]; i++){
  163. var fName = param["DocParamForm/name"];
  164. if(!cache.parameters[fName]){
  165. cache.parameters[fName] = {};
  166. }
  167. cache.parameters[fName].description = param["DocParamForm/desc"]
  168. }
  169. data.description = cache.description;
  170. data.parameters = cache.parameters;
  171. evt.type = "doc";
  172. if(evt.callbacks && evt.callbacks.length){
  173. evt.callbacks.shift()("load", data, evt, input);
  174. }
  175. },
  176. getPkgDoc: function(/*String*/ name, /*Function*/ callback){
  177. // summary: Gets external documentation stored on Jot for a given package
  178. dojo.debug("getPkgDoc(" + name + ")");
  179. var input = {};
  180. },
  181. getPkgInfo: function(/*String*/ name, /*Function*/ callback){
  182. // summary: Gets a combination of the metadata and external documentation for a given package
  183. dojo.debug("getPkgInfo(" + name + ")");
  184. var input = {
  185. expects: {
  186. pkginfo: ["pkgmeta", "pkgdoc"]
  187. },
  188. callback: callback
  189. };
  190. dojo.docs.getPkgMeta(input, name, dojo.docs._getPkgInfo);
  191. dojo.docs.getPkgDoc(input, name, dojo.docs._getPkgInfo);
  192. },
  193. _getPkgInfo: function(/*String*/ type, /*Object*/ data, /*Object*/ evt){
  194. dojo.debug("_getPkgInfo() for " + evt.type);
  195. var input = {};
  196. var results = {};
  197. if(typeof key == "object"){
  198. input = key;
  199. input[evt.type] = data;
  200. if(input.expects && input.expects.pkginfo){
  201. for(var i = 0, expect; expect = input.expects.pkginfo[i]; i++){
  202. if(!(expect in input)){
  203. dojo.debug("_getPkgInfo() waiting for more data");
  204. return;
  205. }
  206. }
  207. }
  208. results = input.pkgmeta;
  209. results.description = input.pkgdoc;
  210. }
  211. if(input.callback){
  212. input.callback("load", results, evt);
  213. }
  214. },
  215. getInfo: function(/*String*/ name, /*Function*/ callback){
  216. dojo.debug("getInfo(" + name + ")");
  217. var input = {
  218. expects: {
  219. "info": ["meta", "doc"]
  220. },
  221. callback: callback
  222. }
  223. dojo.docs.getMeta(input, name, dojo.docs._getInfo);
  224. dojo.docs.getDoc(input, name, dojo.docs._getInfo);
  225. },
  226. _getInfo: function(/*String*/ type, /*String*/ data, /*Object*/ evt, /*Object*/ input){
  227. dojo.debug("_getInfo(" + evt.type + ")");
  228. if(input && input.expects && input.expects.info){
  229. input[evt.type] = data;
  230. for(var i = 0, expect; expect = input.expects.info[i]; i++){
  231. if(!(expect in input)){
  232. dojo.debug("_getInfo() waiting for more data");
  233. return;
  234. }
  235. }
  236. }
  237. if(input.callback){
  238. input.callback("load", dojo.docs._getCache(evt.pkg, "meta", "functions", evt.name, evt.id, "meta"), evt, input);
  239. }
  240. },
  241. _getMainText: function(/*String*/ text){
  242. // summary: Grabs the innerHTML from a Jot Rech Text node
  243. dojo.debug("_getMainText()");
  244. return text.replace(/^<html[^<]*>/, "").replace(/</html>$/, "").replace(/<w+s*/>/g, "");
  245. },
  246. getPackageMeta: function(/*Object*/ input){
  247. dojo.debug("getPackageMeta(): " + input.package);
  248. return this.require(input.package + "/meta", input.sync);
  249. },
  250. getFunctionMeta: function(/*Object*/ input){
  251. var package = input.package || "";
  252. var name = input.name;
  253. var id = input.id || "_";
  254. dojo.debug("getFunctionMeta(): " + name);
  255. if(!name) return;
  256. if(package){
  257. return this.require(package + "/meta/functions/" + name + "/" + id + "/meta");
  258. }else{
  259. this.getFunctionNames();
  260. }
  261. },
  262. getFunctionDocumentation: function(/*Object*/ input){
  263. var package = input.package || "";
  264. var name = input.name;
  265. var id = input.id || "_";
  266. dojo.debug("getFunctionDocumentation(): " + name);
  267. if(!name) return;
  268. if(package){
  269. return this.require(package + "/meta/functions/" + name + "/" + id + "/documentation");
  270. }
  271. },
  272. _onDocSearch: function(/*Object*/ input){
  273. var _this = this;
  274. var name = input.name.toLowerCase();
  275. if(!name) return;
  276. this.getFunctionNames().addCallback(function(data){
  277. dojo.debug("_onDocSearch(): function names loaded for " + name);
  278. var output = [];
  279. var list = [];
  280. var closure = function(pkg, fn) {
  281. return function(data){
  282. dojo.debug("_onDocSearch(): package meta loaded for: " + pkg);
  283. if(data.functions){
  284. var functions = data.functions;
  285. for(var key in functions){
  286. if(fn == key){
  287. var ids = functions[key];
  288. for(var id in ids){
  289. var fnMeta = ids[id];
  290. output.push({
  291. package: pkg,
  292. name: fn,
  293. id: id,
  294. summary: fnMeta.summary
  295. });
  296. }
  297. }
  298. }
  299. }
  300. return output;
  301. }
  302. }
  303. pkgLoop:
  304. for(var pkg in data){
  305. if(pkg.toLowerCase() == name){
  306. name = pkg;
  307. dojo.debug("_onDocSearch found a package");
  308. //dojo.docs._onDocSelectPackage(input);
  309. return;
  310. }
  311. for(var i = 0, fn; fn = data[pkg][i]; i++){
  312. if(fn.toLowerCase().indexOf(name) != -1){
  313. dojo.debug("_onDocSearch(): Search matched " + fn);
  314. var meta = _this.getPackageMeta({package: pkg});
  315. meta.addCallback(closure(pkg, fn));
  316. list.push(meta);
  317. // Build a list of all packages that need to be loaded and their loaded state.
  318. continue pkgLoop;
  319. }
  320. }
  321. }
  322. list = new dojo.DeferredList(list);
  323. list.addCallback(function(results){
  324. dojo.debug("_onDocSearch(): All packages loaded");
  325. _this._printFunctionResults(results[0][1]);
  326. });
  327. });
  328. },
  329. _onDocSearchFn: function(/*String*/ type, /*Array*/ data, /*Object*/ evt){
  330. dojo.debug("_onDocSearchFn(" + evt.name + ")");
  331. var name = evt.name || evt.pkg;
  332. dojo.debug("_onDocSearchFn found a function");
  333. evt.pkgs = packages;
  334. evt.pkg = name;
  335. evt.loaded = 0;
  336. for(var i = 0, pkg; pkg = packages[i]; i++){
  337. dojo.docs.getPkgMeta(evt, pkg, dojo.docs._onDocResults);
  338. }
  339. },
  340. _onPkgResults: function(/*String*/ type, /*Object*/ data, /*Object*/ evt, /*Object*/ input){
  341. dojo.debug("_onPkgResults(" + evt.type + ")");
  342. var description = "";
  343. var path = "";
  344. var methods = {};
  345. var requires = {};
  346. if(input){
  347. input[evt.type] = data;
  348. if(input.expects && input.expects.pkgresults){
  349. for(var i = 0, expect; expect = input.expects.pkgresults[i]; i++){
  350. if(!(expect in input)){
  351. dojo.debug("_onPkgResults() waiting for more data");
  352. return;
  353. }
  354. }
  355. }
  356. path = input.pkgdoc.path;
  357. description = input.pkgdoc.description;
  358. methods = input.pkgmeta.methods;
  359. requires = input.pkgmeta.requires;
  360. }
  361. var pkg = evt.name.replace("_", "*");
  362. var results = {
  363. path: path,
  364. description: description,
  365. size: 0,
  366. methods: [],
  367. pkg: pkg,
  368. requires: requires
  369. }
  370. var rePrivate = /_[^.]+$/;
  371. for(var method in methods){
  372. if(!rePrivate.test(method)){
  373. for(var pId in methods[method]){
  374. results.methods.push({
  375. pkg: pkg,
  376. name: method,
  377. id: pId,
  378. summary: methods[method][pId].summary
  379. })
  380. }
  381. }
  382. }
  383. results.size = results.methods.length;
  384. dojo.docs._printPkgResult(results);
  385. },
  386. _onDocResults: function(/*String*/ type, /*Object*/ data, /*Object*/ evt, /*Object*/ input){
  387. dojo.debug("_onDocResults(" + evt.name + "/" + input.pkg + ") " + type);
  388. ++input.loaded;
  389. if(input.loaded == input.pkgs.length){
  390. var pkgs = input.pkgs;
  391. var name = input.pkg;
  392. var results = {methods: []};
  393. var rePrivate = /_[^.]+$/;
  394. data = dojo.docs._cache;
  395. for(var i = 0, pkg; pkg = pkgs[i]; i++){
  396. var methods = dojo.docs._getCache(pkg, "meta", "methods");
  397. for(var fn in methods){
  398. if(fn.toLowerCase().indexOf(name) == -1){
  399. continue;
  400. }
  401. if(fn != "requires" && !rePrivate.test(fn)){
  402. for(var pId in methods[fn]){
  403. var result = {
  404. pkg: pkg,
  405. name: fn,
  406. id: "_",
  407. summary: ""
  408. }
  409. if(methods[fn][pId].summary){
  410. result.summary = methods[fn][pId].summary;
  411. }
  412. results.methods.push(result);
  413. }
  414. }
  415. }
  416. }
  417. dojo.debug("Publishing docResults");
  418. dojo.docs._printFnResults(results);
  419. }
  420. },
  421. _printFunctionResults: function(results){
  422. dojo.debug("_printFnResults(): called");
  423. // summary: Call this function to send the /docs/function/results topic
  424. },
  425. _printPkgResult: function(results){
  426. dojo.debug("_printPkgResult(): called");
  427. },
  428. _onDocSelectFunction: function(/*Object*/ input){
  429. // summary: Get doc, meta, and src
  430. var name = input.name;
  431. var package = input.package || "";
  432. var id = input.id || "_";
  433. dojo.debug("_onDocSelectFunction(" + name + ")");
  434. if(!name || !package) return false;
  435. var pkgMeta = this.getPackageMeta({package: package});
  436. var meta = this.getFunctionMeta({package: package, name: name, id: id});
  437. var doc = this.getFunctionDocumentation({package: package, name: name, id: id});
  438. var list = new dojo.DeferredList([pkgMeta, meta, doc]);
  439. list.addCallback(function(results){
  440. dojo.debug("_onDocSelectFunction() loaded");
  441. for(var i = 0, result; result = results[i]; i++){
  442. dojo.debugShallow(result[1]);
  443. }
  444. });
  445. return list;
  446. },
  447. _onDocSelectPackage: function(/*Object*/ input){
  448. dojo.debug("_onDocSelectPackage(" + input.name + ")")
  449. input.expects = {
  450. "pkgresults": ["pkgmeta", "pkgdoc"]
  451. };
  452. dojo.docs.getPkgMeta(input, input.name, dojo.docs._onPkgResults);
  453. dojo.docs.getPkgDoc(input, input.name, dojo.docs._onPkgResults);
  454. },
  455. _onDocSelectResults: function(/*String*/ type, /*Object*/ data, /*Object*/ evt, /*Object*/ input){
  456. dojo.debug("_onDocSelectResults(" + evt.type + ", " + evt.name + ")");
  457. if(evt.type == "meta"){
  458. dojo.docs.getPkgMeta(input, evt.pkg, dojo.docs._onDocSelectResults);
  459. }
  460. if(input){
  461. input[evt.type] = data;
  462. if(input.expects && input.expects.docresults){
  463. for(var i = 0, expect; expect = input.expects.docresults[i]; i++){
  464. if(!(expect in input)){
  465. dojo.debug("_onDocSelectResults() waiting for more data");
  466. return;
  467. }
  468. }
  469. }
  470. }
  471. dojo.docs._printFunctionDetail(input);
  472. },
  473. _printFunctionDetail: function(results) {
  474. // summary: Call this function to send the /docs/function/detail topic event
  475. },
  476. selectFunction: function(/*String*/ name, /*String?*/ id){
  477. // summary: The combined information
  478. },
  479. savePackage: function(/*Object*/ callbackObject, /*String*/ callback, /*Object*/ parameters){
  480. dojo.event.kwConnect({
  481. srcObj: dojo.docs,
  482. srcFunc: "_savedPkgRpc",
  483. targetObj: callbackObject,
  484. targetFunc: callback,
  485. once: true
  486. });
  487. var props = {};
  488. var cache = dojo.docs._getCache(parameters.pkg, "meta");
  489. var i = 1;
  490. if(!cache.path){
  491. var path = "id";
  492. props[["pname", i].join("")] = "DocPkgForm/require";
  493. props[["pvalue", i++].join("")] = parameters.pkg;
  494. }else{
  495. var path = cache.path;
  496. }
  497. props.form = "//DocPkgForm";
  498. props.path = ["/WikiHome/DojoDotDoc/", path].join("");
  499. if(parameters.description){
  500. props[["pname", i].join("")] = "main/text";
  501. props[["pvalue", i++].join("")] = parameters.description;
  502. }
  503. dojo.docs._rpc.callRemote("saveForm", props).addCallbacks(dojo.docs._pkgRpc, dojo.docs._pkgRpc);
  504. },
  505. _pkgRpc: function(data){
  506. if(data.name){
  507. dojo.docs._getCache(data["DocPkgForm/require"], "meta").path = data.name;
  508. dojo.docs._savedPkgRpc("load");
  509. }else{
  510. dojo.docs._savedPkgRpc("error");
  511. }
  512. },
  513. _savedPkgRpc: function(type){
  514. },
  515. functionPackages: function(/*String*/ name, /*Function*/ callback, /*Object*/ input){
  516. // summary: Gets the package associated with a function and stores it in the .pkg value of input
  517. dojo.debug("functionPackages() name: " + name);
  518. if(!input){
  519. input = {};
  520. }
  521. if(!input.callbacks){
  522. input.callbacks = [];
  523. }
  524. input.type = "function_names";
  525. input.name = name;
  526. input.callbacks.unshift(callback);
  527. input.callbacks.unshift(dojo.docs._functionPackages);
  528. },
  529. _functionPackages: function(/*String*/ type, /*Array*/ data, /*Object*/ evt){
  530. dojo.debug("_functionPackages() name: " + evt.name);
  531. evt.pkg = '';
  532. var results = [];
  533. var data = dojo.docs._cache['function_names'];
  534. for(var key in data){
  535. if(dojo.lang.inArray(data[key], evt.name)){
  536. dojo.debug("_functionPackages() package: " + key);
  537. results.push(key);
  538. }
  539. }
  540. if(evt.callbacks && evt.callbacks.length){
  541. evt.callbacks.shift()(type, results, evt, evt.input);
  542. }
  543. },
  544. setUserName: function(/*String*/ name){
  545. dojo.docs._userName = name;
  546. if(name && dojo.docs._password){
  547. dojo.docs._logIn();
  548. }
  549. },
  550. setPassword: function(/*String*/ password){
  551. dojo.docs._password = password;
  552. if(password && dojo.docs._userName){
  553. dojo.docs._logIn();
  554. }
  555. },
  556. _logIn: function(){
  557. dojo.io.bind({
  558. url: dojo.docs._rpc.serviceUrl.toString(),
  559. method: "post",
  560. mimetype: "text/json",
  561. content: {
  562. username: dojo.docs._userName,
  563. password: dojo.docs._password
  564. },
  565. load: function(type, data){
  566. if(data.error){
  567. dojo.docs.logInSuccess();
  568. }else{
  569. dojo.docs.logInFailure();
  570. }
  571. },
  572. error: function(){
  573. dojo.docs.logInFailure();
  574. }
  575. });
  576. },
  577. logInSuccess: function(){},
  578. logInFailure: function(){},
  579. _set: function(/*Object*/ base, /*String...*/ keys, /*String*/ value){
  580. var args = [];
  581. for(var i = 0, arg; arg = arguments[i]; i++){
  582. args.push(arg);
  583. }
  584. if(args.length < 3) return;
  585. base = args.shift();
  586. value = args.pop();
  587. var key = args.pop();
  588. for(var i = 0, arg; arg = args[i]; i++){
  589. if(typeof base[arg] != "object"){
  590. base[arg] = {};
  591. }
  592. base = base[arg];
  593. }
  594. base[key] = value;
  595. },
  596. _getCache: function(/*String...*/ keys){
  597. var obj = dojo.docs._cache;
  598. for(var i = 0; i < arguments.length; i++){
  599. var arg = arguments[i];
  600. if(!obj[arg]){
  601. obj[arg] = {};
  602. }
  603. obj = obj[arg];
  604. }
  605. return obj;
  606. }
  607. });
  608. dojo.event.topic.subscribe("/docs/search", dojo.docs, "_onDocSearch");
  609. dojo.event.topic.subscribe("/docs/function/select", dojo.docs, "_onDocSelectFunction");
  610. dojo.event.topic.subscribe("/docs/package/select", dojo.docs, "_onDocSelectPackage");
  611. dojo.event.topic.registerPublisher("/docs/function/results", dojo.docs, "_printFunctionResults");
  612. dojo.event.topic.registerPublisher("/docs/function/detail", dojo.docs, "_printFunctionDetail");
  613. dojo.event.topic.registerPublisher("/docs/package/detail", dojo.docs, "_printPkgResult");