"use strict"; function opennamu_xss_filter(str) { return str.replace(/[&<>"']/g, function(match) { switch(match) { case '&': return '&'; case '<': return '<'; case '>': return '>'; case "'": return '''; case '"': return '"'; } }); } function opennamu_xss_filter_decode(str) { return str.replace(/&|<|>|'|"/g, function(match) { switch(match) { case '&': return '&'; case '<': return '<'; case '>': return '>'; case ''': return "'"; case '"': return '"'; } }); } function renderSimpleSet(data) { let tocData = ''; const tocRegexAll = /([^<>]+)<\/h[1-6]>/g; const tocRegex = /([^<>]+)<\/h[1-6]>/; const tocSearchData = [...data.matchAll(tocRegexAll)]; let headingStack = [0, 0, 0, 0, 0, 0]; if (tocSearchData.length > 0) { tocData += `
TOC
`; } tocSearchData.forEach((tocSearchIn) => { const headingLevel = parseInt(tocSearchIn[1]); const headingLevelStr = headingLevel.toString(); headingStack[headingLevel - 1] += 1; for (let i = headingLevel; i < 6; i++) { headingStack[i] = 0; } const headingStackStr = headingStack .map((val) => (val !== 0 ? val + '.' : '')) .join('') .replace(/\.$/, ''); tocData += `
${''.repeat(headingStackStr.split('.').length - 1)} ${headingStackStr}. ${tocSearchIn[2]} `; data = data.replace( tocRegex, `${headingStackStr}. ${tocSearchIn[2]}` ); }); if (tocData !== '') { tocData += '

'; } let footnoteData = ''; const footnoteRegex = /((?:(?!|<\/sup>).)+)<\/sup>/g; const footnoteSearchData = [...data.matchAll(footnoteRegex)]; let footnoteCount = 1; if (footnoteSearchData.length > 0) { footnoteData += '
'; } footnoteSearchData.forEach((footnoteSearch) => { const footnoteCountStr = footnoteCount.toString(); if (footnoteCount !== 1) { footnoteData += '
'; } footnoteData += `(${footnoteCountStr}) ${footnoteSearch[1]}`; data = data.replace( footnoteRegex, `(${footnoteCountStr})` ); footnoteCount += 1; }); if (footnoteData !== '') { footnoteData += '
'; } data = tocData + data + footnoteData; return data; } function opennamu_do_id_check(data) { if(data.match(/\.|\:/)) { return 0; } else { return 1; } } function opennamu_do_ip_click(obj) { if (obj.id === "") { let user_name = obj.name; fetch('/api/v2/ip_menu/' + user_name) .then(response => { if (!response.ok) { throw new Error(`API 호출 실패: ${response.status}`); } return response.json(); }) .then(data => { data = data["data"]; let data_html = ''; for (let key in data) { for (let for_a = 0; for_a < data[key].length; for_a++) { data_html += '' + data[key][for_a][1] + ' | '; } } data_html = data_html.replace(/ \| $/g, ''); let for_a; for (for_a = 0; document.getElementById("opennamu_ip_render_" + String(for_a) + "_load"); for_a++) {} let popup_html = ''; popup_html += ''; obj.innerHTML += popup_html; obj.id = 'opennamu_ip_render_' + String(for_a); obj.onclick = ''; document.getElementById('opennamu_ip_render_' + String(for_a)).addEventListener("click", function () { opennamu_do_footnote_popover('opennamu_ip_render_' + String(for_a), '', 'opennamu_ip_tool_' + String(for_a), 'open'); }); document.addEventListener("click", function () { opennamu_do_footnote_popover('opennamu_ip_render_' + String(for_a), '', 'opennamu_ip_tool_' + String(for_a), 'close'); }); obj.click(); }) .catch(err => { console.error('IP 메뉴 호출 중 오류 발생:', err); obj.innerHTML = 'IP 정보를 불러오는 데 실패했습니다.'; }); } } function opennamu_do_ip_render() { for (let for_a = 0; for_a < document.getElementsByClassName('opennamu_render_ip').length; for_a++) { let ip = document.getElementsByClassName('opennamu_render_ip')[for_a].innerHTML.replace(/&/g, '&'); fetch('/api/v2/ip/' + opennamu_do_url_encode(ip)) .then(response => { if (!response.ok) { throw new Error(`API 호출 실패: ${response.status}`); } return response.json(); }) .then(data => { if (document.getElementsByClassName('opennamu_render_ip')[for_a].id !== "opennamu_render_end") { document.getElementsByClassName('opennamu_render_ip')[for_a].innerHTML = data["data"]; document.getElementsByClassName('opennamu_render_ip')[for_a].id = "opennamu_render_end"; } }) .catch(err => { console.error('IP 렌더링 호출 중 오류 발생:', err); document.getElementsByClassName('opennamu_render_ip')[for_a].innerHTML = 'IP 정보를 불러오는 데 실패했습니다.'; }); } } function opennamu_do_url_encode(data) { return encodeURIComponent(data); } function opennamu_cookie_split_regex(data) { return new RegExp('(?:^|; )' + data + '=([^;]*)'); } function opennamu_send_render(data) { if(data === '<br>' || data === '' || data.match(/^ +$/)) { data = '
'; } else { data = data.replace(/( |^)(https?:\/\/(?:[^ ]+))/g, function(m0, m1, m2) { let link_main = m2; link_main = link_main.replace('"', '"'); return m1 + '' + link_main + ''; }); data = data.replace(/<a(?:(?:(?!>).)*)>((?:(?!<\/a>).)+)<\/a>/g, function(m0, m1) { let data_unescape = opennamu_xss_filter_decode(m1) return '' + m1 + '' }) } return data; } function opennamu_insert_v(name, data) { document.getElementById(name).value = data; } function opennamu_do_trace_spread() { if(document.getElementsByClassName('opennamu_trace')) { document.getElementsByClassName('opennamu_trace')[0].innerHTML = '' + '' + '' + document.getElementsByClassName('opennamu_trace')[0].innerHTML } } function opennamu_page_control(url, page, data_length, data_length_max = 50) { let next = function() { if(data_length_max === data_length) { return '(+)'; } else { return ''; } }; let back = function() { if(page !== 1) { return '(-)'; } else { return ''; } }; return (back() + ' ' + next()).replace(/^ /, ''); } function opennamu_list_hidden_remove() { const style = document.querySelector('#opennamu_list_hidden_style'); if(style !== null) { if(style.innerHTML !== "") { style.innerHTML = ''; } else { style.innerHTML = '.opennamu_list_hidden { display: none; }'; } } } function opennamu_make_list(left = '', right = '', bottom = '', class_name = '') { let data_html = ''; data_html += '
'; data_html += left; data_html += '
'; data_html += right; data_html += '
' data_html += '
'; if(bottom !== "") { data_html += '
' data_html += bottom; } data_html += '
'; data_html += '
'; data_html += '
'; return data_html; }