render.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. "use strict";
  2. function opennamu_heading_folding(data, element = '') {
  3. let fol = document.getElementById(data);
  4. if(fol.style.display === '' || fol.style.display === 'inline-block' || fol.style.display === 'block') {
  5. document.getElementById(data).style.display = 'none';
  6. document.getElementById(data + '_sub').style.opacity = '0.5';
  7. } else {
  8. document.getElementById(data).style.display = 'block';
  9. document.getElementById(data + '_sub').style.opacity = '1';
  10. }
  11. if(element !== '') {
  12. if(element.innerHTML !== '⊖') {
  13. element.innerHTML = '⊖';
  14. } else {
  15. element.innerHTML = '⊕';
  16. }
  17. }
  18. }
  19. function opennamu_do_render_html(name = '') {
  20. if(document.getElementById(name)) {
  21. let data = document.getElementById(name).innerHTML;
  22. let src_list = ['www.youtube.com', 'www.google.com', 'play-tv.kakao.com'];
  23. let t_data = [
  24. 'b', 'i', 's', 'del', 'strong', 'bold', 'em', 'sub', 'sup',
  25. 'div', 'span',
  26. 'a',
  27. 'iframe'
  28. ];
  29. for(let key in t_data) {
  30. let patt = new RegExp(
  31. '<' + t_data[key] + '( (?:(?:(?!>).)+))?>((?:(?!<\/' + t_data[key] + '>).)*)(<\/' + t_data[key] + '>|$)',
  32. 'ig'
  33. );
  34. data = data.replace(patt, function(full, in_data, in_data_2) {
  35. if(['b', 'i', 's', 'del', 'strong', 'bold', 'em', 'sub', 'sup'].includes(t_data[key])) {
  36. return '<' + t_data[key] + '>' + in_data_2 + '</' + t_data[key] + '>'
  37. } else if(t_data[key] === 'div' || t_data[key] === 'span') {
  38. let style_data = in_data?.match(/ style=['"]([^'"]*)['"]/);
  39. if(style_data) {
  40. style_data = style_data[1];
  41. const find_regex = [
  42. / *box-shadow *: *(([^,;]*)(,|;|$)){10,}/i,
  43. / *url\([^()]*\)/i,
  44. / *linear-gradient\((([^(),]+)(,|\))){10,}/i,
  45. / *position *: */i
  46. ];
  47. for(let regex of find_regex) {
  48. if(regex.test(style_data)) {
  49. style_data = "";
  50. break;
  51. }
  52. }
  53. } else {
  54. style_data = '';
  55. }
  56. return '<' + t_data[key] + ' style="' + style_data + '">' + in_data_2 + '</' + t_data[key] + '>';
  57. } else if(t_data[key] === 'a') {
  58. let link_data = in_data?.match(/ href=['"]([^'"]*)['"]/);
  59. if(link_data) {
  60. link_data = link_data[1].replace(/^javascript:/ig, '');
  61. } else {
  62. link_data = '';
  63. }
  64. return '<' + t_data[key] + ' class="opennamu_link_out" href="' + link_data + '">' + in_data_2 + '</' + t_data[key] + '>';
  65. } else if(t_data[key] === 'iframe') {
  66. let src_data = in_data?.match(/ src=['"]([^'"]*)['"]/);
  67. if(src_data) {
  68. src_data = src_data[1];
  69. let src_check = src_data.match(/^http(?:s)?:\/\/([^/]+)/);
  70. if(src_check) {
  71. if(!src_list.includes(src_check[1])) {
  72. src_data = '';
  73. }
  74. } else {
  75. src_data = '';
  76. }
  77. } else {
  78. src_data = '';
  79. }
  80. let width_data = in_data?.match(/ width=['"]([^'"]*)['"]/);
  81. if(width_data) {
  82. width_data = width_data[1];
  83. } else {
  84. width_data = '';
  85. }
  86. let height_data = in_data?.match(/ height=['"]([^'"]*)['"]/);
  87. if(height_data) {
  88. height_data = height_data[1];
  89. } else {
  90. height_data = '';
  91. }
  92. return '<' + t_data[key] + ' src="' + src_data + '" width="' + width_data + '" height="' + height_data + '" allowfullscreen frameborder="0">' + in_data_2 + '</' + t_data[key] + '>';
  93. } else {
  94. let src_data = in_data?.match(/ src=['"]([^'"]*)['"]/);
  95. if(src_data) {
  96. src_data = src_data[1];
  97. } else {
  98. src_data = '';
  99. }
  100. let width_data = in_data?.match(/ width=['"]([^'"]*)['"]/);
  101. if(width_data) {
  102. width_data = width_data[1];
  103. } else {
  104. width_data = '';
  105. }
  106. let height_data = in_data?.match(/ height=['"]([^'"]*)['"]/);
  107. if(height_data) {
  108. height_data = height_data[1];
  109. } else {
  110. height_data = '';
  111. }
  112. return '<' + t_data[key] + ' controls src="' + src_data + '" width="' + width_data + '" height="' + height_data + '">' + in_data_2 + '</' + t_data[key] + '>';
  113. }
  114. });
  115. }
  116. document.getElementById(name).innerHTML = data;
  117. }
  118. }
  119. function opennamu_do_footnote_spread(set_name, load_name) {
  120. if(document.getElementById(set_name + '_load').style.display === 'none') {
  121. document.getElementById(set_name).title = '';
  122. document.getElementById(set_name + '_load').innerHTML = '<a href="#' + load_name + '">(Go)</a> ' + document.getElementById(load_name + '_title').innerHTML;
  123. document.getElementById(set_name + '_load').style.display = "inline-block";
  124. } else {
  125. document.getElementById(set_name + '_load').style.display = "none";
  126. }
  127. }
  128. function opennamu_do_footnote_popover(set_name, load_name, sub_obj = undefined, do_type = 'open') {
  129. if(document.getElementById(set_name + '_load')) {
  130. if(do_type === 'open') {
  131. if(sub_obj !== undefined) {
  132. document.getElementById(set_name + '_load').innerHTML = document.getElementById(sub_obj).innerHTML;
  133. } else {
  134. document.getElementById(set_name).title = '';
  135. document.getElementById(set_name + '_load').innerHTML = '<a href="#' + load_name + '">(Go)</a> ' + document.getElementById(load_name + '_title').innerHTML;
  136. }
  137. document.getElementById(set_name + '_load').style.display = "inline-block";
  138. document.getElementById(set_name + '_load').count = 0;
  139. let width = document.getElementById(set_name + '_load').clientWidth;
  140. let screen_width = window.innerWidth;
  141. let left = document.getElementById(set_name).getBoundingClientRect().left;
  142. let left_org = document.getElementById(set_name + '_load').getBoundingClientRect().left;
  143. let top = window.pageYOffset + document.getElementById(set_name).getBoundingClientRect().top;
  144. document.getElementById(set_name + '_load').style.top = String(top) + "px";
  145. if(screen_width - (left + width) < 50) {
  146. if(left > 350) {
  147. document.getElementById(set_name + '_load').style.left = String(left - 300) + "px";
  148. } else {
  149. document.getElementById(set_name + '_load').style.left = "0px";
  150. }
  151. left = document.getElementById(set_name + '_load').getBoundingClientRect().left;
  152. width = document.getElementById(set_name + '_load').clientWidth;
  153. if(300 > width) {
  154. document.getElementById(set_name + '_load').style.left = String(left + (300 - width)) + "px";
  155. } else {
  156. document.getElementById(set_name + '_load').style.marginTop = "20px";
  157. }
  158. }
  159. } else {
  160. if(document.getElementById(set_name + '_load').count === 1) {
  161. document.getElementById(set_name + '_load').style.display = "none";
  162. } else {
  163. document.getElementById(set_name + '_load').count = 1;
  164. }
  165. }
  166. }
  167. }
  168. function opennamu_do_category_spread() {
  169. if(document.getElementsByClassName('opennamu_render_complete')) {
  170. document.getElementsByClassName('opennamu_render_complete')[0].innerHTML = '' +
  171. '<style>.opennamu_main .opennamu_category_button { display: none; } .opennamu_main .opennamu_category { white-space: pre-wrap; overflow-x: unset; text-overflow: unset; }</style>' +
  172. '' + document.getElementsByClassName('opennamu_render_complete')[0].innerHTML;
  173. }
  174. }
  175. function opennamu_do_toc() {
  176. let data = document.getElementById('opennamu_render_complete');
  177. let h_tag = data.querySelectorAll("h1, h2, h3, h4, h5, h6");
  178. let toc_count = [0, 0, 0, 0, 0, 0];
  179. let toc_html = '';
  180. for(let for_a = 0; for_a < h_tag.length; for_a++) {
  181. let tag = h_tag[for_a].tagName.toLowerCase();
  182. tag = tag.replace('h', '');
  183. tag = Number(tag) - 1;
  184. for(let for_b = tag + 1; for_b < 6; for_b++) {
  185. toc_count[for_b] = 0;
  186. }
  187. toc_count[tag] += 1;
  188. let toc_string = '';
  189. let add_on = false;
  190. for(let for_b = 5; for_b >= 0; for_b--) {
  191. if(add_on === false && toc_count[for_b] != 0) {
  192. add_on = true;
  193. }
  194. if(add_on === true) {
  195. toc_string = String(toc_count[for_b]) + '.' + toc_string;
  196. }
  197. }
  198. toc_string = toc_string.replace(/^(0\.)+/, '');
  199. let toc_string_sub = toc_string.replace(/\.$/, '');
  200. let toc_margin = '<span style="margin-left: 10px;"></span>'.repeat(toc_string_sub.split('.').length - 1);
  201. toc_html += toc_margin + '<a href="#s-' + toc_string_sub + '">' + toc_string + '</a> ' + h_tag[for_a].innerHTML + '<br>';
  202. h_tag[for_a].innerHTML = '<a id="s-' + toc_string_sub + '" href="#toc">' + toc_string + '</a> ' + h_tag[for_a].innerHTML;
  203. }
  204. data.innerHTML = data.innerHTML.replace(/(<h[1-6]>)/, '<div class="opennamu_toc"></div>$1');
  205. data.innerHTML = data.innerHTML.replace(/<div class="opennamu_toc"><\/div>/g, function(match) {
  206. return '<div class="opennamu_TOC" id="toc"><div class="opennamu_TOC_title">TOC</div><br>' + toc_html + '</div>';
  207. });
  208. }