markdown.js 27 KB

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