edit.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. var editormd;
  2. var template_list ;
  3. var json_table_data='|'+lang["params"]+'|'+lang["type"]+'|'+lang["description"]+'|\n'+
  4. '|:-------|:-------|:-------|\n';
  5. $(function() {
  6. //给按钮文字加上颜色,点击后则去掉颜色
  7. if (is_showdoc_online()) {
  8. set_text_color( "runapi" , "red");
  9. };
  10. /*加载目录*/
  11. secondCatList();
  12. function secondCatList() {
  13. var default_second_cat_id = $("#default_second_cat_id").val();
  14. var item_id = $("#item_id").val();
  15. $.post(
  16. "?s=home/catalog/secondCatList",
  17. {
  18. "item_id": item_id,
  19. },
  20. function(data) {
  21. $("#cat_id").html('<OPTION value="0">'+lang["none"]+'</OPTION>');
  22. if (data.error_code == 0) {
  23. json = data.data;
  24. console.log(json);
  25. for (var i = 0; i < json.length; i++) {
  26. cat_html = '<OPTION value="' + json[i].cat_id + '" ';
  27. if (default_second_cat_id == json[i].cat_id) {
  28. cat_html += ' selected ';
  29. }
  30. cat_html += ' ">' + json[i].cat_name + '</OPTION>';
  31. $("#cat_id").append(cat_html);
  32. };
  33. getChildCatList();
  34. };
  35. },
  36. "json"
  37. );
  38. }
  39. function getChildCatList() {
  40. var cat_id = $("#cat_id").val();
  41. var default_child_cat_id = $("#default_child_cat_id").val();
  42. $.post(
  43. "?s=home/catalog/childCatList", {
  44. "cat_id": cat_id
  45. },
  46. function(data) {
  47. $("#parent_cat_id").html('<OPTION value="0">'+lang["none"]+'</OPTION>');
  48. if (data.error_code == 0) {
  49. json = data.data;
  50. console.log(json);
  51. for (var i = 0; i < json.length; i++) {
  52. cat_html = '<OPTION value="' + json[i].cat_id + '" ';
  53. if (default_child_cat_id == json[i].cat_id) {
  54. cat_html += ' selected ';
  55. }
  56. cat_html += ' ">' + json[i].cat_name + '</OPTION>';
  57. $("#parent_cat_id").append(cat_html);
  58. };
  59. }else{
  60. }
  61. },
  62. "json"
  63. );
  64. }
  65. //监听是否选择了目录。如果选择了,则跟后台判断是否还子目录
  66. $("#cat_id").change(function(){
  67. getChildCatList();
  68. });
  69. var keyMap = {
  70. // 保存
  71. "Ctrl-S": function() {
  72. $("#save").click();
  73. }
  74. };
  75. initEditorOutsideKeys();
  76. function initEditorOutsideKeys() {
  77. if (!editormd) return;
  78. var $doc = $(document);
  79. $.each(keyMap, function(key, fn) {
  80. $doc.on('keydown', null, key.replace('-', '+'), function(e) {
  81. e.preventDefault();
  82. fn();
  83. });
  84. });
  85. }
  86. // 如果是新增页面,则光标为标题文本框
  87. if (location.href.indexOf('type=new') !== -1) {
  88. setTimeout(function() {
  89. $('#page_title').focus();
  90. }, 1000);
  91. }
  92. /*初始化编辑器*/
  93. editormd = editormd("editormd", {
  94. width: "90%",
  95. height: 1000,
  96. syncScrolling: "single",
  97. path: DocConfig.pubile + "/editor.md/lib/",
  98. placeholder: lang["editormd_placeholder"] ,
  99. taskList : true,
  100. tex : true, // 默认不解析
  101. flowChart : true, // 默认不解析
  102. sequenceDiagram : true, // 默认不解析
  103. imageUpload: true,
  104. imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"],
  105. imageUploadURL: "?s=home/page/uploadImg",
  106. onload: function() {
  107. this.addKeyMap(keyMap);
  108. }
  109. });
  110. /*插入API接口模板*/
  111. $("#api-doc").click(function() {
  112. var tmpl = $("#api-doc-templ").html();
  113. editormd.insertValue(tmpl);
  114. });
  115. /*插入数据字典模板*/
  116. $("#database-doc").click(function() {
  117. var tmpl = $("#database-doc-templ").html();
  118. editormd.insertValue(tmpl);
  119. });
  120. /*JSON转参数表格*/
  121. $("#jsons").click(function() {
  122. $("#json-templ").show();
  123. });
  124. /*JSON格式美化*/
  125. $("#beautify-json").click(function() {
  126. $("#beautify-json-dialog").show();
  127. });
  128. $("#json-templ .editormd-enter-btn").click(function(){
  129. var datas=$("#json-templ .jsons").val();
  130. try{
  131. Change($.parseJSON(datas));
  132. }
  133. catch(e){
  134. alert(lang["json_fail"] + e);
  135. }
  136. //datas=processJSONImport(datas);
  137. //alert(datas);
  138. /*var datas='|键|值|类型|空|注释|\n'+
  139. '|:-------|:-------|:-------|:-------|:-------|\n'+
  140. '|uid|int(10)|否|||\n'+
  141. '|username|varchar(20)|否||用户名|';*/
  142. //alert(json_table_data);return;
  143. editormd.insertValue(json_table_data);
  144. json_table_data='|'+lang["filed"]+'|'+lang["type"]+'|'+lang["description"]+'|\n'+
  145. '|:-------|:-------|:-------|\n';
  146. $("#json-templ .jsons").val("");
  147. $("#json-templ").hide();
  148. });
  149. $("#beautify-json-dialog .editormd-enter-btn").click(function(){
  150. var data = $("#beautify-json-dialog .jsons").val();
  151. try{
  152. data = data.replace(/(^\s*)|(\s*$)/g,"");
  153. op1 = data.substr(0, 1) == "[" ? "[":"{";
  154. op2 = (op1 == "[") ? "]":"}";
  155. var text="\n ``` \n "+op1+" \n"+dump(JSON.parse(data))+" "+op2+" \n\n ```\n\n";//整体加个大括号
  156. //$("#beautify-json-dialog .jsons").val(text);
  157. $("#beautify-json-dialog .jsons").val("");
  158. editormd.insertValue(text);
  159. }catch(e){
  160. //非json数据直接显示
  161. //$("#beautify-json-dialog .jsons").val(data);
  162. $("#beautify-json-dialog .jsons").val("");
  163. editormd.insertValue(data);
  164. }
  165. $("#beautify-json-dialog").hide();
  166. });
  167. //{"dgfgdfg":"gdfgdfg"}
  168. //格式化json数据
  169. function dump(arr,level) {
  170. var dumped_text = "";
  171. if(!level) level = 0;
  172. //The padding given at the beginning of the line.
  173. var level_padding = "";
  174. for(var j=0;j<level+1;j++) level_padding += " ";
  175. if(typeof(arr) == 'object') { //Array/Hashes/Objects
  176. var i=0;
  177. for(var item in arr) {
  178. var value = arr[item];
  179. if(typeof(value) == 'object') { //If it is an array,
  180. dumped_text += level_padding + "\"" + item + "\" : \{ \n";
  181. dumped_text += dump(value,level+1);
  182. dumped_text +=level_padding +"\}";
  183. } else {
  184. dumped_text += level_padding + "\"" + item + "\" : \"" + value + "\"";
  185. }
  186. if(i<Object.getOwnPropertyNames(arr).length-1){
  187. dumped_text+=", \n";
  188. }else{
  189. dumped_text+=" \n";
  190. }
  191. i++;
  192. }
  193. } else { //Stings/Chars/Numbers etc.
  194. dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
  195. }
  196. return dumped_text;
  197. }
  198. /*保存*/
  199. var saving = false;
  200. $("#save").click(function() {
  201. if (saving) return false;
  202. var page_id = $("#page_id").val();
  203. var item_id = $("#item_id").val();
  204. var page_title = $("#page_title").val();
  205. var page_comments = $("#page_comments").val();
  206. var page_content = $("#page_content").val();
  207. var item_id = $("#item_id").val();
  208. var s_number = $("#s_number").val();
  209. var cat_id = $("#cat_id").val();
  210. var parent_cat_id = $("#parent_cat_id").val();
  211. if (parent_cat_id > 0 ) {
  212. cat_id = parent_cat_id ;
  213. };
  214. saving = true;
  215. $.post(
  216. "?s=home/page/save", {
  217. "page_id": page_id,
  218. "cat_id": cat_id,
  219. "s_number": s_number,
  220. "page_content": page_content,
  221. "page_title": page_title,
  222. "page_comments": page_comments,
  223. "item_id": item_id
  224. },
  225. function(data) {
  226. if (data.error_code == 0) {
  227. $.bootstrapGrowl(lang["save_success"]);
  228. window.location.href = "?s=home/item/show&page_id=" + data.data.page_id + "&item_id=" + item_id;
  229. } else {
  230. $.bootstrapGrowl(lang["save_fail"]);
  231. }
  232. saving = false;
  233. },
  234. 'json'
  235. )
  236. });
  237. $(".editormd-preview-container").bind('DOMNodeInserted', function(e){
  238. $(".editormd-preview-container table thead tr").css({"background-color":"#08c","color":"#fff"});
  239. $(".editormd-preview-container table tr").eq(0).css({"background-color":"#08c","color":"#fff"});
  240. $(".editormd-preview-container table tr").each(function(){
  241. if($(this).find("td").eq(1).html()=="object" || $(this).find("td").eq(1).html()=="array[object]")
  242. {
  243. $(this).css({"background-color":"#99CC99","color":"#000"});
  244. }
  245. });
  246. });
  247. });
  248. function closeDiv(target)
  249. {
  250. $(target).hide();
  251. }
  252. function Change(data)
  253. {
  254. var level_str="- ";
  255. if(arguments.length>1)
  256. {
  257. var level;
  258. arguments[1]>0?level=arguments[1]:level=1;
  259. for(var i=0;i<level;i++)
  260. {
  261. level_str+="- ";
  262. }
  263. }
  264. for(var key in data)
  265. {
  266. var value = data[key];
  267. var type = typeof(value);
  268. if(type == "object")
  269. {
  270. json_table_data+='| '+level_str+key+' |'+type+' | '+lang["none"]+' |\n';
  271. if(value instanceof Array)
  272. {
  273. var j=level+1;
  274. Change(value[0],j);
  275. continue;
  276. }
  277. //else
  278. //{
  279. Change(value,level);
  280. //}
  281. }
  282. else
  283. {
  284. json_table_data+='| '+key+' | '+type+'| '+lang["none"]+' |\n';
  285. }
  286. }
  287. }
  288. //{"Result":[{"name":"test1","list":{"pros":"prosfsf","ppps":{"images":[{"22":"22"}]}}}]}
  289. $("#save-to-templ").click(function(){
  290. layer.prompt({title: lang["save_templ_title"]}, function(template_title, index){
  291. if (template_title!=null && template_title!="")
  292. {
  293. var template_content = $("#page_content").val();
  294. $.post(
  295. "?s=home/template/save",
  296. {"template_title":template_title,"template_content":template_content},
  297. function(data){
  298. if (data.error_code == 0) {
  299. layer.close(index);
  300. layer.alert(lang["saved_templ_msg1"]+template_title+lang["saved_templ_msg2"]);
  301. } else {
  302. $.bootstrapGrowl(lang["save_fail"]);
  303. }
  304. },
  305. "json"
  306. );
  307. }
  308. $("#save-btn-group").removeClass("open");
  309. return false;
  310. });
  311. });
  312. $("#more-templ").click(function(){
  313. $.post(
  314. "?s=home/template/getList",
  315. {},
  316. function(data){
  317. if (data.error_code == 0) {
  318. var html = '<TR><td>'+lang["save_time"]+'</td><td>'+lang["templ_title"]+'</td><td>'+lang["operation"]+'</td></TR>';
  319. template_list = data.data;
  320. json = data.data;
  321. for (var i = 0; i < json.length; i++) {
  322. html += '<TR><td>'+json[i]['addtime']+'</td>';
  323. html += '<td>'+json[i]['template_title']+'</td>';
  324. html += '<td><a href="javascript:use_template('+json[i]['id']+')">'+lang["use_this_template"]+'</a> | <a href="javascript:delete_template('+json[i]['id']+')">'+lang["delete_this_template"]+'</a></td>';
  325. html +='</TR>';
  326. };
  327. $("#templ-table").html(html);
  328. $("#more-templ-modal").modal();
  329. } else {
  330. //$.bootstrapGrowl("获取模板列表失败");
  331. $("#more-templ-modal").modal("hide");
  332. layer.alert(lang["no_templ_msg"]);
  333. }
  334. },
  335. "json"
  336. );
  337. });
  338. //使用模板
  339. function use_template(id){
  340. for (var i = 0; i < template_list.length; i++) {
  341. if (id > 0 && id == template_list[i]['id']) {
  342. editormd.insertValue(template_list[i]['template_content']);
  343. $("#more-templ-modal").modal("hide");
  344. };
  345. };
  346. }
  347. //删除模板
  348. function delete_template(id){
  349. $.post(
  350. "?s=home/template/delete",
  351. {"id":id},
  352. function(data){
  353. if (data.error_code == 0) {
  354. $("#more-templ").click();
  355. } else {
  356. $.bootstrapGrowl(lang["save_fail"]);
  357. }
  358. },
  359. "json"
  360. );
  361. }
  362. $("#add-page-comments").click(function(){
  363. var page_comments =prompt(lang["add_page_comments_msg"],"");
  364. if (page_comments!=null && page_comments!="")
  365. {
  366. $("#page_comments").val(page_comments);
  367. $("#save").click();
  368. }
  369. $("#save-btn-group").removeClass("open");
  370. return false;
  371. });
  372. /** 粘贴上传图片 **/
  373. document.getElementById("editormd").addEventListener('paste', function(e) {
  374. var clipboard = e.clipboardData;
  375. for(var i=0,len=clipboard.items.length; i<len; i++) {
  376. if(clipboard.items[i].kind == 'file' || clipboard.items[i].type.indexOf('image') > -1) {
  377. var imageFile = clipboard.items[i].getAsFile();
  378. var form = new FormData;
  379. form.append('t', 'ajax-uploadpic');
  380. form.append('editormd-image-file', imageFile);
  381. var layer_index = {};
  382. var callback = function(type, data){
  383. type = type || 'before';
  384. var $the = $('#content');
  385. switch(type){
  386. // 开始上传
  387. case 'before':
  388. layer_index = layer.load(1, {
  389. shade: [0.1,'#fff'] //0.1透明度的白色背景
  390. });
  391. break;
  392. // 服务器返回错误
  393. case 'error':
  394. $the.attr('disabled', false);
  395. layer.close(layer_index);
  396. layer.alert('图片上传失败');
  397. break;
  398. // 上传成功
  399. case 'success':
  400. $the.attr('disabled', false);
  401. layer.close(layer_index);
  402. if (data.success == 1 ) {
  403. var value = '![]('+data.url+')';
  404. editormd.insertValue(value);
  405. }else{
  406. layer.alert(data.message);
  407. }
  408. break;
  409. }
  410. };
  411. $.ajax({
  412. url: "?s=home/page/uploadImg",
  413. type: "POST",
  414. dataType: "json",
  415. data: form,
  416. processData: false,
  417. contentType: false,
  418. beforeSend: function() {
  419. callback('before');
  420. },
  421. error: function() {
  422. callback('error');
  423. },
  424. success: function(data) {
  425. callback('success', data);
  426. }
  427. })
  428. e.preventDefault();
  429. }
  430. }
  431. });