edit.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  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. window.location.href = "?s=home/item/show&page_id=" + data.data.page_id + "&item_id=" + item_id;
  231. } else {
  232. $.bootstrapGrowl(lang["save_fail"]);
  233. }
  234. saving = false;
  235. },
  236. 'json'
  237. )
  238. });
  239. $(".editormd-preview-container").bind('DOMNodeInserted', function(e) {
  240. $(".editormd-preview-container table thead tr").css({
  241. "background-color": "#08c",
  242. "color": "#fff"
  243. });
  244. $(".editormd-preview-container table tr").eq(0).css({
  245. "background-color": "#08c",
  246. "color": "#fff"
  247. });
  248. $(".editormd-preview-container table tr").each(function() {
  249. if ($(this).find("td").eq(1).html() == "object" || $(this).find("td").eq(1).html() == "array[object]") {
  250. $(this).css({
  251. "background-color": "#99CC99",
  252. "color": "#000"
  253. });
  254. }
  255. });
  256. });
  257. function closeDiv(target) {
  258. $(target).hide();
  259. }
  260. function Change(data) {
  261. var level_str = "- ";
  262. if (arguments.length > 1) {
  263. var level;
  264. arguments[1] > 0 ? level = arguments[1] : level = 1;
  265. for (var i = 0; i < level; i++) {
  266. level_str += "- ";
  267. }
  268. }
  269. for (var key in data) {
  270. var value = data[key];
  271. var type = typeof(value);
  272. if (type == "object") {
  273. json_table_data += '| ' + level_str + key + ' |' + type + ' | ' + lang["none"] + ' |\n';
  274. if (value instanceof Array) {
  275. var j = level + 1;
  276. Change(value[0], j);
  277. continue;
  278. }
  279. //else
  280. //{
  281. Change(value, level);
  282. //}
  283. } else {
  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. $.prompt({
  291. title: lang["save_templ_title"]
  292. }, function(template_title, index) {
  293. if (template_title != null && template_title != "") {
  294. var template_content = $("#page_content").val();
  295. $.post(
  296. "?s=home/template/save", {
  297. "template_title": template_title,
  298. "template_content": template_content
  299. },
  300. function(data) {
  301. if (data.error_code == 0) {
  302. $.closeDialog(index);
  303. $.alert(lang["saved_templ_msg1"] + template_title + lang["saved_templ_msg2"]);
  304. } else {
  305. $.bootstrapGrowl(lang["save_fail"]);
  306. }
  307. },
  308. "json"
  309. );
  310. }
  311. $("#save-btn-group").removeClass("open");
  312. return false;
  313. });
  314. });
  315. $("#more-templ").click(function() {
  316. $.post(
  317. "?s=home/template/getList", {},
  318. function(data) {
  319. if (data.error_code == 0) {
  320. var html = '<TR><td>' + lang["save_time"] + '</td><td>' + lang["templ_title"] + '</td><td>' + lang["operation"] + '</td></TR>';
  321. template_list = data.data;
  322. json = data.data;
  323. for (var i = 0; i < json.length; i++) {
  324. html += '<TR><td>' + json[i]['addtime'] + '</td>';
  325. html += '<td>' + json[i]['template_title'] + '</td>';
  326. 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>';
  327. html += '</TR>';
  328. };
  329. $("#templ-table").html(html);
  330. $("#more-templ-modal").modal();
  331. } else {
  332. //$.bootstrapGrowl("获取模板列表失败");
  333. $("#more-templ-modal").modal("hide");
  334. $.alert(lang["no_templ_msg"]);
  335. }
  336. },
  337. "json"
  338. );
  339. });
  340. $("#add-page-comments").click(function() {
  341. var page_comments = prompt(lang["add_page_comments_msg"], "");
  342. if (page_comments != null && page_comments != "") {
  343. $("#page_comments").val(page_comments);
  344. $("#save").click();
  345. }
  346. $("#save-btn-group").removeClass("open");
  347. return false;
  348. });
  349. /** 粘贴上传图片 **/
  350. document.getElementById("editormd").addEventListener('paste', function(e) {
  351. var clipboard = e.clipboardData;
  352. for (var i = 0, len = clipboard.items.length; i < len; i++) {
  353. if (clipboard.items[i].kind == 'file' || clipboard.items[i].type.indexOf('image') > -1) {
  354. var imageFile = clipboard.items[i].getAsFile();
  355. var form = new FormData;
  356. form.append('t', 'ajax-uploadpic');
  357. form.append('editormd-image-file', imageFile);
  358. var layer_index = {};
  359. var callback = function(type, data) {
  360. type = type || 'before';
  361. var $the = $('#content');
  362. switch (type) {
  363. // 开始上传
  364. case 'before':
  365. layer_index = layer.load(1, {
  366. shade: [0.1, '#fff'] //0.1透明度的白色背景
  367. });
  368. break;
  369. // 服务器返回错误
  370. case 'error':
  371. $the.attr('disabled', false);
  372. $.closeDialog(layer_index);
  373. $.alert('图片上传失败');
  374. break;
  375. // 上传成功
  376. case 'success':
  377. $the.attr('disabled', false);
  378. $.closeDialog(layer_index);
  379. if (data.success == 1) {
  380. var value = '![](' + data.url + ')';
  381. editormd.insertValue(value);
  382. } else {
  383. $.alert(data.message);
  384. }
  385. break;
  386. }
  387. };
  388. $.ajax({
  389. url: "?s=home/page/uploadImg",
  390. type: "POST",
  391. dataType: "json",
  392. data: form,
  393. processData: false,
  394. contentType: false,
  395. beforeSend: function() {
  396. callback('before');
  397. },
  398. error: function() {
  399. callback('error');
  400. },
  401. success: function(data) {
  402. callback('success', data);
  403. }
  404. })
  405. e.preventDefault();
  406. }
  407. }
  408. });
  409. //更改选择文件框的文件类型让它更快地弹出
  410. $("#editormd").on("mouseover", '[name=editormd-image-file]', function(){
  411. $(this).attr("accept","image/png,image/jpg,image/jpeg,imge/bmp,image/gif")
  412. });
  413. });
  414. //使用模板
  415. function use_template(id) {
  416. for (var i = 0; i < template_list.length; i++) {
  417. if (id > 0 && id == template_list[i]['id']) {
  418. editormd.insertValue(template_list[i]['template_content']);
  419. $("#more-templ-modal").modal("hide");
  420. };
  421. };
  422. }
  423. //删除模板
  424. function delete_template(id) {
  425. $.post(
  426. "?s=home/template/delete", {
  427. "id": id
  428. },
  429. function(data) {
  430. if (data.error_code == 0) {
  431. $("#more-templ").click();
  432. } else {
  433. $.bootstrapGrowl(lang["save_fail"]);
  434. }
  435. },
  436. "json"
  437. );
  438. }