edit.js 15 KB

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