markdown.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. "use strict";
  2. // 걍 언더바로 통일하자
  3. class opennamu_render_markdown {
  4. // Init Part
  5. constructor(
  6. render_part_id,
  7. render_part_id_after,
  8. render_part_id_add,
  9. doc_name
  10. ) {
  11. this.doc_data = document.getElementById(render_part_id_add + render_part_id).innerHTML;
  12. render_part_id_add = render_part_id_add.replace(/_/g, '<underBar>');
  13. this.doc_data = this.doc_data.replace(/&amp;/g, '&');
  14. this.doc_data = '<brStart>\n' + this.doc_data + '\n<brEnd>';
  15. this.doc_data.replace(/\r/g, '');
  16. this.doc_name = doc_name;
  17. this.parser_data_temp = {};
  18. this.parser_data_temp_other = {};
  19. this.parser_data_temp_other['toc'] = '';
  20. this.parser_data_temp_other['footnote'] = '';
  21. this.parser_data_temp_other['category'] = '';
  22. this.parser_data_js = [];
  23. this.parser_count = {};
  24. this.parser_count['parser'] = 0;
  25. this.parser_count['nowiki'] = 0;
  26. this.render_part_id = render_part_id;
  27. this.render_part_id_add = render_part_id_add;
  28. this.render_part_id_after = render_part_id_after;
  29. }
  30. // Func Part
  31. do_func_parser_to_text(data, parser_type = 'parser') {
  32. let parser_data_temp = this.parser_data_temp;
  33. let parser_match;
  34. if(parser_type === 'nowiki' || parser_type === 'nowikiLink' || parser_type === 'nowikiEnd') {
  35. parser_match = /<(\/?nowiki[0-9]+Span)>/;
  36. } else {
  37. parser_match = /<(\/?render[0-9]+Span)>/;
  38. }
  39. while(data.match(parser_match)) {
  40. data = data.replace(parser_match, function(match, x1) {
  41. if(parser_type === 'nowikiEnd') {
  42. return parser_data_temp[x1 + 'End'];
  43. } else if(parser_type === 'nowikiLink') {
  44. let nowiki_data = parser_data_temp[x1];
  45. nowiki_data = nowiki_data.replace(/\\(.)/g, '$1');
  46. return nowiki_data;
  47. } else {
  48. return parser_data_temp[x1];
  49. }
  50. });
  51. }
  52. return data;
  53. }
  54. do_func_xss_encode(data) {
  55. data = data.replace(/'/g, '&#x27;');
  56. data = data.replace(/"/g, '&quot;');
  57. data = data.replace(/</g, '&lt;');
  58. data = data.replace(/</g, '&gt;');
  59. data = data.replace(/&/g, '&amp;');
  60. return data;
  61. }
  62. do_func_xss_decode(data) {
  63. data = data.replace(/&#x27;/g, '\'');
  64. data = data.replace(/&quot;/g, '"');
  65. data = data.replace(/&lt;/g, '<');
  66. data = data.replace(/&gt;/g, '>');
  67. data = data.replace(/&amp;/g, '&');
  68. return data;
  69. }
  70. // Render Part
  71. do_part_text() {
  72. let parser_count = this.parser_count['parser'];
  73. let parser_data_temp = this.parser_data_temp;
  74. this.doc_data = this.doc_data.replace(/~~((?:(?!~~|\n).)+)~~/g, function(match, x1) {
  75. parser_count += 1;
  76. let parser_count_str = String(parser_count);
  77. parser_data_temp['render' + parser_count_str + 'Span'] = '<s>';
  78. parser_data_temp['/render' + parser_count_str + 'Span'] = '</s>';
  79. return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
  80. });
  81. this.doc_data = this.doc_data.replace(/\*\*((?:(?!\*\*|\n).)+)\*\*/g, function(match, x1) {
  82. parser_count += 1;
  83. let parser_count_str = String(parser_count);
  84. parser_data_temp['render' + parser_count_str + 'Span'] = '<b>';
  85. parser_data_temp['/render' + parser_count_str + 'Span'] = '</b>';
  86. return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
  87. });
  88. this.doc_data = this.doc_data.replace(/__((?:(?!__|\n).)+)__/g, function(match, x1) {
  89. parser_count += 1;
  90. let parser_count_str = String(parser_count);
  91. parser_data_temp['render' + parser_count_str + 'Span'] = '<b>';
  92. parser_data_temp['/render' + parser_count_str + 'Span'] = '</b>';
  93. return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
  94. });
  95. this.doc_data = this.doc_data.replace(/\*([^*\n]+)\*/g, function(match, x1) {
  96. parser_count += 1;
  97. let parser_count_str = String(parser_count);
  98. parser_data_temp['render' + parser_count_str + 'Span'] = '<i>';
  99. parser_data_temp['/render' + parser_count_str + 'Span'] = '</i>';
  100. return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
  101. });
  102. this.doc_data = this.doc_data.replace(/_([^_\n]+)_/g, function(match, x1) {
  103. parser_count += 1;
  104. let parser_count_str = String(parser_count);
  105. parser_data_temp['render' + parser_count_str + 'Span'] = '<i>';
  106. parser_data_temp['/render' + parser_count_str + 'Span'] = '</i>';
  107. return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
  108. });
  109. this.doc_data = this.doc_data.replace(/&lt;ins&gt;((?:(?!&lt;ins&gt;|&lt;\/ins&gt;|\n).)+)&lt;\/ins&gt;/g, function(match, x1) {
  110. parser_count += 1;
  111. let parser_count_str = String(parser_count);
  112. parser_data_temp['render' + parser_count_str + 'Span'] = '<u>';
  113. parser_data_temp['/render' + parser_count_str + 'Span'] = '</u>';
  114. return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
  115. });
  116. this.doc_data = this.doc_data.replace(/&lt;sub&gt;((?:(?!&lt;sub&gt;|&lt;\/sub&gt;|\n).)+)&lt;\/sub&gt;/g, function(match, x1) {
  117. parser_count += 1;
  118. let parser_count_str = String(parser_count);
  119. parser_data_temp['render' + parser_count_str + 'Span'] = '<sub>';
  120. parser_data_temp['/render' + parser_count_str + 'Span'] = '</sub>';
  121. return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
  122. });
  123. this.doc_data = this.doc_data.replace(/&lt;sup&gt;((?:(?!&lt;sup&gt;|&lt;\/sup&gt;|\n).)+)&lt;\/sup&gt;/g, function(match, x1) {
  124. parser_count += 1;
  125. let parser_count_str = String(parser_count);
  126. parser_data_temp['render' + parser_count_str + 'Span'] = '<sup>';
  127. parser_data_temp['/render' + parser_count_str + 'Span'] = '</sup>';
  128. return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
  129. });
  130. this.parser_count['parser'] = parser_count;
  131. this.parser_data_temp = parser_data_temp;
  132. }
  133. do_part_heading() {
  134. let parser_count = this.parser_count['parser'];
  135. let parser_data_temp = this.parser_data_temp;
  136. let toc_data = '';
  137. let heading_n = 0;
  138. let heading_list = [0, 0, 0, 0, 0, 0];
  139. let heading_regex = /\n(#{1,6})([^#][^\n]*)\n/;
  140. while(this.doc_data.match(heading_regex)) {
  141. this.doc_data = this.doc_data.replace(heading_regex, function(match, x1, x2) {
  142. let heading_level = x1.length - 1;
  143. let heading_level_str = String(heading_level + 1);
  144. heading_list[heading_level] += 1;
  145. for(let for_a = heading_level + 1; for_a < 6; for_a++) {
  146. heading_list[for_a] = 0;
  147. }
  148. let heading_list_str = '';
  149. for(let for_a = 0; for_a < 6; for_a++) {
  150. if(heading_list[for_a] !== 0) {
  151. heading_list_str += String(heading_list[for_a]) + '.'
  152. }
  153. }
  154. let heading_list_str_2 = heading_list_str.replace(/\.$/, '');
  155. heading_n += 1;
  156. let heading_n_str = String(heading_n);
  157. toc_data += '' +
  158. '<a href="#opennamuHeading' + heading_list_str_2 + '">' + heading_list_str + '</a> ' +
  159. '<span id="opennamuTOCcontent' + heading_n_str + '"></span>' +
  160. '<br>' +
  161. ''
  162. let heading_data = x2;
  163. heading_data = heading_data.replace(/^ /, '');
  164. return '' +
  165. '\n<brEnd>' +
  166. '<h' + heading_level_str + ' id="opennamuHeading' + heading_list_str_2 + '">' +
  167. '<a href="#opennamuTOC">' + heading_list_str + '</a> ' +
  168. '<span id="opennamuHeadingContent' + heading_n_str + '">' + heading_data + '</span>' +
  169. '</h' + heading_level_str + '>' +
  170. '<brStart>\n' +
  171. '';
  172. });
  173. }
  174. this.parser_data_temp_other['toc'] = toc_data;
  175. }
  176. do_part_image() {
  177. let render_main = this;
  178. let render_part_id_add = this.render_part_id_add;
  179. let parser_count = this.parser_count['parser'];
  180. let parser_data_temp = this.parser_data_temp;
  181. this.doc_data = this.doc_data.replace(/!\[([^\[\]\n]*)\]\(([^\(\)\n]*)\)/g, function(match, x1, x2) {
  182. if(x1 === '' && x2 === '') {
  183. return '<imageBlink>';
  184. } else {
  185. if(x2 !== '' && x2.match(/^https?:\/\//)) {
  186. parser_count += 1;
  187. let parser_count_str = String(parser_count);
  188. let image_src = render_main.do_func_xss_encode(x2);
  189. let image_alt;
  190. if(x1 !== '') {
  191. image_alt = render_main.do_func_xss_encode(x1);
  192. } else {
  193. image_alt = image_src;
  194. }
  195. parser_data_temp['render' + parser_count_str + 'Span'] = '<img alt="' + image_alt + '" src="' + image_src + '">';
  196. parser_data_temp['/render' + parser_count_str + 'Span'] = '';
  197. return '<render' + parser_count_str + 'Span></render' + parser_count_str + 'Span>';
  198. } else {
  199. parser_count += 1;
  200. let parser_count_str = String(parser_count);
  201. parser_data_temp['render' + parser_count_str + 'Span'] = '<img>';
  202. parser_data_temp['/render' + parser_count_str + 'Span'] = '';
  203. return '<render' + parser_count_str + 'Span></render' + parser_count_str + 'Span>';
  204. }
  205. }
  206. });
  207. this.doc_data = this.doc_data.replace(/<imageBlink>/g, '![]()');
  208. this.parser_count['parser'] = parser_count;
  209. this.parser_data_temp = parser_data_temp;
  210. }
  211. do_part_link() {
  212. let render_main = this;
  213. let render_part_id_add = this.render_part_id_add;
  214. let parser_count = this.parser_count['parser'];
  215. let parser_data_temp = this.parser_data_temp;
  216. this.doc_data = this.doc_data.replace(/\[([^\[\]\n]*)\]\(([^\(\)\n]*)\)/g, function(match, x1, x2) {
  217. if(x1 === '' && x2 === '') {
  218. return '<linkBlink>';
  219. } else {
  220. if(x2 !== '' && x2.match(/^https?:\/\//)) {
  221. parser_count += 1;
  222. let parser_count_str = String(parser_count);
  223. let link_main = render_main.do_func_parser_to_text(x2, 'nowikiLink');
  224. link_main = render_main.do_func_xss_encode(link_main);
  225. let link_sub;
  226. if(x1 === '') {
  227. link_sub = x2;
  228. } else {
  229. link_sub = x1;
  230. }
  231. parser_data_temp['render' + parser_count_str + 'Span'] = '<a class="opennamuLinkOut" href="' + link_main + '">';
  232. parser_data_temp['/render' + parser_count_str + 'Span'] = '</a>';
  233. return '<render' + parser_count_str + 'Span>' + link_sub + '</render' + parser_count_str + 'Span>';
  234. } else {
  235. parser_count += 1;
  236. let parser_count_str = String(parser_count);
  237. let link_main;
  238. let link_sub;
  239. let link_title;
  240. if(x2 === '') {
  241. link_main = x1;
  242. link_sub = x1;
  243. } else if(x1 === '') {
  244. link_main = x2;
  245. link_sub = x2;
  246. } else {
  247. link_main = x2;
  248. link_sub = x1;
  249. }
  250. link_main = render_main.do_func_parser_to_text(link_main, 'nowikiLink');
  251. link_main = render_main.do_func_xss_encode(link_main);
  252. link_title = link_main;
  253. link_main = render_main.do_func_xss_decode(link_main);
  254. link_main = opennamu_do_url_encode(link_main);
  255. parser_data_temp['render' + parser_count_str + 'Span'] = '<a class="' + render_part_id_add + 'opennamuLink" title="' + link_title + '" href="/w/' + link_main + '">';
  256. parser_data_temp['/render' + parser_count_str + 'Span'] = '</a>';
  257. return '<render' + parser_count_str + 'Span>' + link_sub + '</render' + parser_count_str + 'Span>';
  258. }
  259. }
  260. });
  261. this.doc_data = this.doc_data.replace(/<linkBlink>/g, '[]()');
  262. this.doc_data = this.doc_data.replace(/&lt;(https?:\/\/(?:(?:(?!&lt;|&gt;).)+))&gt;/g, function(match, x1) {
  263. parser_count += 1;
  264. let parser_count_str = String(parser_count);
  265. let link_main = render_main.do_func_parser_to_text(x1, 'nowikiLink');
  266. link_main = render_main.do_func_xss_encode(link_main);
  267. let link_sub = x1;
  268. parser_data_temp['render' + parser_count_str + 'Span'] = '<a class="opennamuLinkOut" href="' + link_main + '">';
  269. parser_data_temp['/render' + parser_count_str + 'Span'] = '</a>';
  270. return '<render' + parser_count_str + 'Span>' + link_sub + '</render' + parser_count_str + 'Span>';
  271. });
  272. this.parser_count['parser'] = parser_count;
  273. this.parser_data_temp = parser_data_temp;
  274. }
  275. do_part_footnote_list() {
  276. if(this.parser_data_temp_other['footnote'] !== '') {
  277. let footnote = '';
  278. footnote += '<ul id="footnote<underBar>data">';
  279. footnote += this.parser_data_temp_other['footnote'];
  280. footnote += '</ul>';
  281. this.parser_data_temp_other['footnote'] = '';
  282. return footnote;
  283. } else {
  284. return '';
  285. }
  286. }
  287. do_part_footnote() {
  288. let render_main = this;
  289. let parser_count = this.parser_count['parser'];
  290. let parser_data_temp = this.parser_data_temp;
  291. let parser_data_temp_other = this.parser_data_temp_other;
  292. let footnote_n = 0;
  293. let footnote_name_all = {};
  294. this.doc_data = this.doc_data.replace(/(?:\[\^((?:(?!\[\^| ).)*)(?: ((?:(?!\[\^|\]).)+))?\]|(\[fnote\(\)]))/g, function(match, x1, x2, x3) {
  295. if(x3 === undefined) {
  296. if(x1 === '' && x2 === undefined) {
  297. return '<footnoteBlink>';
  298. } else {
  299. footnote_n += 1;
  300. let footnote_name;
  301. let footnote_id = String(footnote_n);
  302. if(x1 === '') {
  303. footnote_name = footnote_id;
  304. } else {
  305. footnote_name = x1;
  306. }
  307. let footnote_content;
  308. if(x2 === undefined) {
  309. if(footnote_name_all[footnote_name]) {
  310. footnote_content = footnote_name_all[footnote_name];
  311. } else {
  312. footnote_content = '';
  313. footnote_name_all[footnote_name] = footnote_content;
  314. }
  315. } else {
  316. footnote_content = x2;
  317. footnote_name_all[footnote_name] = footnote_content;
  318. }
  319. let footnote_list = '';
  320. footnote_list += '<li>';
  321. footnote_list += '<a id="opennamuFnGo' + footnote_id + '" href="#opennamuFnIn' + footnote_id + '">'
  322. footnote_list += '(' + footnote_name + ')';
  323. footnote_list += '</a>';
  324. footnote_list += ' ';
  325. footnote_list += footnote_content;
  326. footnote_list += '</li>';
  327. parser_data_temp_other['footnote'] += footnote_list;
  328. parser_count += 1;
  329. let parser_count_str = String(parser_count);
  330. let footnote_data = '';
  331. footnote_data += '<sup>'
  332. footnote_data += '<a id="opennamuFnIn' + footnote_id + '" href="#opennamuFnGo' + footnote_id + '">';
  333. footnote_data += '(' + footnote_name + ')';
  334. footnote_data += '</a>';
  335. footnote_data += '</sup>';
  336. parser_data_temp['render' + parser_count_str + 'Span'] = footnote_data;
  337. parser_data_temp['/render' + parser_count_str + 'Span'] = '';
  338. return '<render' + parser_count_str + 'Span></render' + parser_count_str + 'Span>';
  339. }
  340. } else {
  341. return render_main.do_part_footnote_list();
  342. }
  343. });
  344. this.doc_data = this.doc_data.replace(/<footnoteBlink>/g, '[^]');
  345. this.doc_data += this.do_part_footnote_list();
  346. this.parser_count['parser'] = parser_count;
  347. this.parser_data_temp = parser_data_temp;
  348. this.parser_data_temp_other = parser_data_temp_other;
  349. }
  350. do_part_macro() {
  351. let render_main = this;
  352. let render_part_id_add = this.render_part_id_add;
  353. let parser_count = this.parser_count['parser'];
  354. let parser_data_temp = this.parser_data_temp;
  355. let parser_data_temp_other = this.parser_data_temp_other;
  356. this.doc_data = this.doc_data.replace(/\[([^\[\(<>\n]+)\(((?:(?!\(|\)\]|<|>|\n).)*)\)\]/g, function(match, x1, x2) {
  357. if(x1 === 'anchor') {
  358. parser_count += 1;
  359. let parser_count_str = String(parser_count);
  360. let anchor_data = render_main.do_func_parser_to_text(x2, 'nowiki');
  361. anchor_data = render_main.do_func_xss_encode(anchor_data);
  362. parser_data_temp['render' + parser_count_str + 'Span'] = '<span id="' + anchor_data + '">';
  363. parser_data_temp['/render' + parser_count_str + 'Span'] = '</span>';
  364. return '<render' + parser_count_str + 'Span></render' + parser_count_str + 'Span>'
  365. } else if(x1 === 'category') {
  366. let category = x2.split(',');
  367. let category_data = render_main.do_func_parser_to_text(category[0], 'nowiki');
  368. let link_main = 'category:' + category_data;
  369. let link_title = render_main.do_func_xss_encode(link_main);
  370. link_main = render_main.do_func_xss_decode(link_main);
  371. link_main = opennamu_do_url_encode(link_main);
  372. parser_data_temp_other['category'] += '<a class="' + render_part_id_add + 'opennamuLink" title="' + link_title + '" href="/w/' + link_main + '">';
  373. parser_data_temp_other['category'] += category_data;
  374. parser_data_temp_other['category'] += '</a>';
  375. parser_data_temp_other['category'] += ' | ';
  376. return '';
  377. } else if(x1 === 'toc') {
  378. if(parser_data_temp_other['toc'] !== '') {
  379. return '' +
  380. '<div class="opennamu_TOC">' +
  381. '<span class="opennamu_TOC_title">' +
  382. 'TOC' +
  383. '</span>' +
  384. '<br>' +
  385. '<br>' +
  386. parser_data_temp_other['toc'] +
  387. '</div>' +
  388. '';
  389. } else {
  390. return '';
  391. }
  392. }
  393. else {
  394. return match;
  395. }
  396. });
  397. this.parser_count['parser'] = parser_count;
  398. this.parser_data_temp = parser_data_temp;
  399. this.parser_data_temp_other = parser_data_temp_other;
  400. }
  401. do_part_nowiki() {
  402. let render_main = this;
  403. let parser_count = this.parser_count['parser'];
  404. let parser_data_temp = this.parser_data_temp;
  405. this.doc_data = this.doc_data.replace(/\\\n/g, '\n');
  406. this.doc_data = this.doc_data.replace(/\\(&#x27;|&quot;|&lt;|&gt;|&amp;|.)/g, function(match, x1) {
  407. let nowiki_data = x1;
  408. parser_count += 1;
  409. let parser_count_str = String(parser_count);
  410. parser_data_temp['nowiki' + parser_count_str + 'Span'] = match;
  411. parser_data_temp['/nowiki' + parser_count_str + 'Span'] = '';
  412. parser_data_temp['nowiki' + parser_count_str + 'SpanEnd'] = '<code>' + nowiki_data;
  413. parser_data_temp['/nowiki' + parser_count_str + 'SpanEnd'] = '</code>';
  414. return '<nowiki' + parser_count_str + 'Span>' + '</nowiki' + parser_count_str + 'Span>';
  415. });
  416. this.doc_data = this.doc_data.replace(/```((?:(?:(?!```).)|\n)+)```/g, function(match, x1) {
  417. let nowiki_data = render_main.do_func_parser_to_text(x1, 'nowiki');
  418. parser_count += 1;
  419. let parser_count_str = String(parser_count);
  420. if(nowiki_data.match(/\n/)) {
  421. parser_data_temp['nowiki' + parser_count_str + 'Span'] = match;
  422. parser_data_temp['/nowiki' + parser_count_str + 'Span'] = '';
  423. parser_data_temp['nowiki' + parser_count_str + 'SpanEnd'] = '<pre>' + nowiki_data;
  424. parser_data_temp['/nowiki' + parser_count_str + 'SpanEnd'] = '</pre>';
  425. } else {
  426. parser_data_temp['nowiki' + parser_count_str + 'Span'] = match;
  427. parser_data_temp['/nowiki' + parser_count_str + 'Span'] = '';
  428. parser_data_temp['nowiki' + parser_count_str + 'SpanEnd'] = '<code>' + nowiki_data;
  429. parser_data_temp['/nowiki' + parser_count_str + 'SpanEnd'] = '</code>';
  430. }
  431. return '<nowiki' + parser_count_str + 'Span>' + '</nowiki' + parser_count_str + 'Span>';
  432. });
  433. this.doc_data = this.doc_data.replace(/`([^`\n]+)`/g, function(match, x1) {
  434. let nowiki_data = render_main.do_func_parser_to_text(x1, 'nowiki');
  435. parser_count += 1;
  436. let parser_count_str = String(parser_count);
  437. parser_data_temp['nowiki' + parser_count_str + 'Span'] = match;
  438. parser_data_temp['/nowiki' + parser_count_str + 'Span'] = '';
  439. parser_data_temp['nowiki' + parser_count_str + 'SpanEnd'] = '<code>' + nowiki_data;
  440. parser_data_temp['/nowiki' + parser_count_str + 'SpanEnd'] = '</code>';
  441. return '<nowiki' + parser_count_str + 'Span>' + '</nowiki' + parser_count_str + 'Span>';
  442. });
  443. this.parser_count['parser'] = parser_count;
  444. this.parser_data_temp = parser_data_temp;
  445. }
  446. do_part_horizon() {
  447. let horizone_regex = /\n((?:\*|\* |-|- ){3,})\n/;
  448. while(this.doc_data.match(horizone_regex)) {
  449. this.doc_data = this.doc_data.replace(horizone_regex, function(match, x1, x2) {
  450. return '\n<brEnd><hr><brStart>\n';
  451. });
  452. }
  453. }
  454. do_part_blockquote() {
  455. let parser_count = this.parser_count['parser'];
  456. let parser_data_temp = this.parser_data_temp;
  457. let blockquote_regex = /((?:\n&gt;(?:[^\n]+))+)/;
  458. while(this.doc_data.match(blockquote_regex)) {
  459. this.doc_data = this.doc_data.replace(blockquote_regex, function(match, x1) {
  460. let blockquote_data = '<brStart>' + x1;
  461. blockquote_data = blockquote_data.replace(/\n&gt; ?/g, '\n');
  462. parser_count += 1;
  463. let parser_count_str = String(parser_count);
  464. parser_data_temp['render' + parser_count_str + 'Span'] = '<blockquote>';
  465. parser_data_temp['/render' + parser_count_str + 'Span'] = '</blockquote>';
  466. return '\n<brEnd><render' + parser_count_str + 'Span>' + blockquote_data + '</render' + parser_count_str + 'Span>';
  467. });
  468. }
  469. this.parser_count['parser'] = parser_count;
  470. this.parser_data_temp = parser_data_temp;
  471. }
  472. do_part_list() {
  473. let parser_count = this.parser_count['parser'];
  474. let parser_data_temp = this.parser_data_temp;
  475. // 여기 파트 개선 필요
  476. this.doc_data = this.doc_data.replace(/((?:\n(?: )*\* ?(?:[^\n]+))+)/g, function(match, x1) {
  477. let list_data = x1;
  478. let list_depth = -1;
  479. list_data = list_data.replace(/\n( )*\* ?([^\n]+)/g, function(match, x1, x2) {
  480. return '';
  481. });
  482. parser_count += 1;
  483. let parser_count_str = String(parser_count);
  484. parser_data_temp['render' + parser_count_str + 'Span'] = '<ul>';
  485. parser_data_temp['/render' + parser_count_str + 'Span'] = '</ul>';
  486. return '\n<brEnd><render' + parser_count_str + 'Span>' + list_data + '</render' + parser_count_str + 'Span>';
  487. });
  488. this.parser_count['parser'] = parser_count;
  489. this.parser_data_temp = parser_data_temp;
  490. }
  491. do_part_final() {
  492. this.doc_data = this.doc_data.replace(/<brStart>\n?/g, '');
  493. this.doc_data = this.doc_data.replace(/\n?<brEnd>/g, '');
  494. this.doc_data = this.doc_data.replace(/<underBar>/g, '_');
  495. this.render_part_id_add = this.render_part_id_add.replace(/<underBar>/g, '_');
  496. this.doc_data = this.doc_data.replace(/\n/g, '<br>');
  497. if(this.parser_data_temp_other['category'] !== '') {
  498. let category = this.parser_data_temp_other['category'];
  499. category = category.replace(/ \| $/, '');
  500. this.doc_data += '<hr class="main_hr">';
  501. this.doc_data += '<div id="cate_all"><div id="cate">';
  502. this.doc_data += 'Category : ';
  503. this.doc_data += category;
  504. this.doc_data += '</div></div>';
  505. }
  506. }
  507. // Main Part
  508. do_main() {
  509. this.do_part_nowiki();
  510. this.do_part_list();
  511. this.do_part_blockquote();
  512. this.do_part_heading();
  513. this.do_part_horizon();
  514. this.do_part_footnote();
  515. this.do_part_macro();
  516. this.do_part_image();
  517. this.do_part_link();
  518. this.do_part_text();
  519. this.do_part_final();
  520. this.doc_data = this.do_func_parser_to_text(this.doc_data);
  521. this.doc_data = this.do_func_parser_to_text(this.doc_data, 'nowikiEnd');
  522. document.getElementById(this.render_part_id_add + this.render_part_id_after).innerHTML = this.doc_data;
  523. document.getElementById(this.render_part_id_add + this.render_part_id).style.display = "none";
  524. document.getElementById(this.render_part_id_add + this.render_part_id_after).style.display = "";
  525. for(let x1 in this.parser_data_js) {
  526. eval(this.parser_data_js[x1]);
  527. }
  528. new opennamu_render_wiki(
  529. render_part_id_add = this.render_part_id_add
  530. ).do_main();
  531. }
  532. }