edit.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  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. imageUpload: true,
  102. imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"],
  103. imageUploadURL: "?s=home/page/uploadImg",
  104. onload: function() {
  105. this.addKeyMap(keyMap);
  106. }
  107. });
  108. /*插入API接口模板*/
  109. $("#api-doc").click(function() {
  110. var tmpl = $("#api-doc-templ").html();
  111. editormd.insertValue(tmpl);
  112. });
  113. /*插入数据字典模板*/
  114. $("#database-doc").click(function() {
  115. var tmpl = $("#database-doc-templ").html();
  116. editormd.insertValue(tmpl);
  117. });
  118. /*JSON转参数表格*/
  119. $("#jsons").click(function() {
  120. $("#json-templ").show();
  121. });
  122. /*JSON格式美化*/
  123. $("#beautify-json").click(function() {
  124. $("#beautify-json-dialog").show();
  125. });
  126. $("#json-templ .editormd-enter-btn").click(function() {
  127. var datas = $("#json-templ .jsons").val();
  128. try {
  129. Change($.parseJSON(datas));
  130. } catch (e) {
  131. alert(lang["json_fail"] + e);
  132. }
  133. //datas=processJSONImport(datas);
  134. //alert(datas);
  135. /*var datas='|键|值|类型|空|注释|\n'+
  136. '|:-------|:-------|:-------|:-------|:-------|\n'+
  137. '|uid|int(10)|否|||\n'+
  138. '|username|varchar(20)|否||用户名|';*/
  139. //alert(json_table_data);return;
  140. editormd.insertValue(json_table_data);
  141. json_table_data = '|' + lang["filed"] + '|' + lang["type"] + '|' + lang["description"] + '|\n' +
  142. '|:-------|:-------|:-------|\n';
  143. $("#json-templ .jsons").val("");
  144. $("#json-templ").hide();
  145. });
  146. $("#beautify-json-dialog .editormd-enter-btn").click(function() {
  147. var data = $("#beautify-json-dialog .jsons").val();
  148. try {
  149. data = data.replace(/(^\s*)|(\s*$)/g, "");
  150. op1 = data.substr(0, 1) == "[" ? "[" : "{";
  151. op2 = (op1 == "[") ? "]" : "}";
  152. var text = "\n ``` \n " + op1 + " \n" + dump(JSON.parse(data)) + " " + op2 + " \n\n ```\n\n"; //整体加个大括号
  153. //$("#beautify-json-dialog .jsons").val(text);
  154. $("#beautify-json-dialog .jsons").val("");
  155. editormd.insertValue(text);
  156. } catch (e) {
  157. //非json数据直接显示
  158. //$("#beautify-json-dialog .jsons").val(data);
  159. $("#beautify-json-dialog .jsons").val("");
  160. editormd.insertValue(data);
  161. }
  162. $("#beautify-json-dialog").hide();
  163. });
  164. //{"dgfgdfg":"gdfgdfg"}
  165. //格式化json数据
  166. function dump(arr, level) {
  167. var dumped_text = "";
  168. if (!level) level = 0;
  169. //The padding given at the beginning of the line.
  170. var level_padding = "";
  171. for (var j = 0; j < level + 1; j++) level_padding += " ";
  172. if (typeof(arr) == 'object') { //Array/Hashes/Objects
  173. var i = 0;
  174. for (var item in arr) {
  175. var value = arr[item];
  176. if (typeof(value) == 'object') { //If it is an array,
  177. dumped_text += level_padding + "\"" + item + "\" : \{ \n";
  178. dumped_text += dump(value, level + 1);
  179. dumped_text += level_padding + "\}";
  180. } else {
  181. dumped_text += level_padding + "\"" + item + "\" : \"" + value + "\"";
  182. }
  183. if (i < Object.getOwnPropertyNames(arr).length - 1) {
  184. dumped_text += ", \n";
  185. } else {
  186. dumped_text += " \n";
  187. }
  188. i++;
  189. }
  190. } else { //Stings/Chars/Numbers etc.
  191. dumped_text = "===>" + arr + "<===(" + typeof(arr) + ")";
  192. }
  193. return dumped_text;
  194. }
  195. /*保存*/
  196. var saving = false;
  197. $("#save").click(function() {
  198. if (saving) return false;
  199. var page_id = $("#page_id").val();
  200. var item_id = $("#item_id").val();
  201. var page_title = $("#page_title").val();
  202. var page_comments = $("#page_comments").val();
  203. var page_content = $("#page_content").val();
  204. var item_id = $("#item_id").val();
  205. var s_number = $("#s_number").val();
  206. var cat_id = $("#cat_id").val();
  207. var parent_cat_id = $("#parent_cat_id").val();
  208. if (parent_cat_id > 0) {
  209. cat_id = parent_cat_id;
  210. };
  211. saving = true;
  212. $.post(
  213. "?s=home/page/save", {
  214. "page_id": page_id,
  215. "cat_id": cat_id,
  216. "s_number": s_number,
  217. "page_content": page_content,
  218. "page_title": page_title,
  219. "page_comments": page_comments,
  220. "item_id": item_id
  221. },
  222. function(data) {
  223. if (data.error_code == 0) {
  224. $.bootstrapGrowl(lang["save_success"]);
  225. window.location.href = "?s=home/item/show&page_id=" + data.data.page_id + "&item_id=" + item_id;
  226. } else {
  227. $.bootstrapGrowl(lang["save_fail"]);
  228. }
  229. saving = false;
  230. },
  231. 'json'
  232. )
  233. });
  234. $(".editormd-preview-container").bind('DOMNodeInserted', function(e) {
  235. $(".editormd-preview-container table thead tr").css({
  236. "background-color": "#08c",
  237. "color": "#fff"
  238. });
  239. $(".editormd-preview-container table tr").eq(0).css({
  240. "background-color": "#08c",
  241. "color": "#fff"
  242. });
  243. $(".editormd-preview-container table tr").each(function() {
  244. if ($(this).find("td").eq(1).html() == "object" || $(this).find("td").eq(1).html() == "array[object]") {
  245. $(this).css({
  246. "background-color": "#99CC99",
  247. "color": "#000"
  248. });
  249. }
  250. });
  251. });
  252. function closeDiv(target) {
  253. $(target).hide();
  254. }
  255. function Change(data) {
  256. var level_str = "- ";
  257. if (arguments.length > 1) {
  258. var level;
  259. arguments[1] > 0 ? level = arguments[1] : level = 1;
  260. for (var i = 0; i < level; i++) {
  261. level_str += "- ";
  262. }
  263. }
  264. for (var key in data) {
  265. var value = data[key];
  266. var type = typeof(value);
  267. if (type == "object") {
  268. json_table_data += '| ' + level_str + key + ' |' + type + ' | ' + lang["none"] + ' |\n';
  269. if (value instanceof Array) {
  270. var j = level + 1;
  271. Change(value[0], j);
  272. continue;
  273. }
  274. //else
  275. //{
  276. Change(value, level);
  277. //}
  278. } else {
  279. json_table_data += '| ' + key + ' | ' + type + '| ' + lang["none"] + ' |\n';
  280. }
  281. }
  282. }
  283. //{"Result":[{"name":"test1","list":{"pros":"prosfsf","ppps":{"images":[{"22":"22"}]}}}]}
  284. $("#save-to-templ").click(function() {
  285. layer.prompt({
  286. title: lang["save_templ_title"]
  287. }, function(template_title, index) {
  288. if (template_title != null && template_title != "") {
  289. var template_content = $("#page_content").val();
  290. $.post(
  291. "?s=home/template/save", {
  292. "template_title": template_title,
  293. "template_content": template_content
  294. },
  295. function(data) {
  296. if (data.error_code == 0) {
  297. layer.close(index);
  298. layer.alert(lang["saved_templ_msg1"] + template_title + lang["saved_templ_msg2"]);
  299. } else {
  300. $.bootstrapGrowl(lang["save_fail"]);
  301. }
  302. },
  303. "json"
  304. );
  305. }
  306. $("#save-btn-group").removeClass("open");
  307. return false;
  308. });
  309. });
  310. $("#more-templ").click(function() {
  311. $.post(
  312. "?s=home/template/getList", {},
  313. function(data) {
  314. if (data.error_code == 0) {
  315. var html = '<TR><td>' + lang["save_time"] + '</td><td>' + lang["templ_title"] + '</td><td>' + lang["operation"] + '</td></TR>';
  316. template_list = data.data;
  317. json = data.data;
  318. for (var i = 0; i < json.length; i++) {
  319. html += '<TR><td>' + json[i]['addtime'] + '</td>';
  320. html += '<td>' + json[i]['template_title'] + '</td>';
  321. 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>';
  322. html += '</TR>';
  323. };
  324. $("#templ-table").html(html);
  325. $("#more-templ-modal").modal();
  326. } else {
  327. //$.bootstrapGrowl("获取模板列表失败");
  328. $("#more-templ-modal").modal("hide");
  329. layer.alert(lang["no_templ_msg"]);
  330. }
  331. },
  332. "json"
  333. );
  334. });
  335. $("#add-page-comments").click(function() {
  336. var page_comments = prompt(lang["add_page_comments_msg"], "");
  337. if (page_comments != null && page_comments != "") {
  338. $("#page_comments").val(page_comments);
  339. $("#save").click();
  340. }
  341. $("#save-btn-group").removeClass("open");
  342. return false;
  343. });
  344. /** 粘贴上传图片 **/
  345. document.getElementById("editormd").addEventListener('paste', function(e) {
  346. var clipboard = e.clipboardData;
  347. for (var i = 0, len = clipboard.items.length; i < len; i++) {
  348. if (clipboard.items[i].kind == 'file' || clipboard.items[i].type.indexOf('image') > -1) {
  349. var imageFile = clipboard.items[i].getAsFile();
  350. var form = new FormData;
  351. form.append('t', 'ajax-uploadpic');
  352. form.append('editormd-image-file', imageFile);
  353. var layer_index = {};
  354. var callback = function(type, data) {
  355. type = type || 'before';
  356. var $the = $('#content');
  357. switch (type) {
  358. // 开始上传
  359. case 'before':
  360. layer_index = layer.load(1, {
  361. shade: [0.1, '#fff'] //0.1透明度的白色背景
  362. });
  363. break;
  364. // 服务器返回错误
  365. case 'error':
  366. $the.attr('disabled', false);
  367. layer.close(layer_index);
  368. layer.alert('图片上传失败');
  369. break;
  370. // 上传成功
  371. case 'success':
  372. $the.attr('disabled', false);
  373. layer.close(layer_index);
  374. if (data.success == 1) {
  375. var value = '![](' + data.url + ')';
  376. editormd.insertValue(value);
  377. } else {
  378. layer.alert(data.message);
  379. }
  380. break;
  381. }
  382. };
  383. $.ajax({
  384. url: "?s=home/page/uploadImg",
  385. type: "POST",
  386. dataType: "json",
  387. data: form,
  388. processData: false,
  389. contentType: false,
  390. beforeSend: function() {
  391. callback('before');
  392. },
  393. error: function() {
  394. callback('error');
  395. },
  396. success: function(data) {
  397. callback('success', data);
  398. }
  399. })
  400. e.preventDefault();
  401. }
  402. }
  403. });
  404. //更改选择文件框的文件类型让它更快地弹出
  405. $("#editormd").on("mouseover", '[name=editormd-image-file]', function(){
  406. $(this).attr("accept","image/png,image/jpg,image/jpeg,imge/bmp,image/gif")
  407. });
  408. });
  409. //使用模板
  410. function use_template(id) {
  411. for (var i = 0; i < template_list.length; i++) {
  412. if (id > 0 && id == template_list[i]['id']) {
  413. editormd.insertValue(template_list[i]['template_content']);
  414. $("#more-templ-modal").modal("hide");
  415. };
  416. };
  417. }
  418. //删除模板
  419. function delete_template(id) {
  420. $.post(
  421. "?s=home/template/delete", {
  422. "id": id
  423. },
  424. function(data) {
  425. if (data.error_code == 0) {
  426. $("#more-templ").click();
  427. } else {
  428. $.bootstrapGrowl(lang["save_fail"]);
  429. }
  430. },
  431. "json"
  432. );
  433. }