{"id":15197,"date":"2026-10-09T16:01:02","date_gmt":"2026-10-09T07:01:02","guid":{"rendered":"https:\/\/code-plus.jp\/gp\/?page_id=15197"},"modified":"2026-10-14T14:13:39","modified_gmt":"2026-10-14T05:13:39","slug":"excel2table-converter","status":"publish","type":"page","link":"https:\/\/code-plus.jp\/gp\/tools\/excel2table-converter\/","title":{"rendered":"Excel\u2192HTML\u30c6\u30fc\u30d6\u30eb\u5909\u63db\u30c4\u30fc\u30eb\uff5c\u8cbc\u308a\u4ed8\u3051\u308b\u3060\u3051\u30fb\u7d50\u5408\u30bb\u30eb\u5bfe\u5fdc"},"content":{"rendered":"<!-- \u0f3b\u273f\ud835\udc0f\ud835\udc00\ud835\udc06\ud835\udc04-Excel\u2192Table \u30aa\u30f3\u30e9\u30a4\u30f3\u5909\u63db\u30c4\u30fc\u30eb \uff08\/tools\/excel2table-converter\/\uff09\r\n* \u30da\u30fc\u30b8\u30af\u30e9\u30b9\uff1apg-saracnvtvkaa\uff08WordPress\u304c\u5c0f\u6587\u5b57\u3067\u3057\u304b\u51fa\u529b\u3067\u304d\u306a\u3044\u305f\u3081\uff09\r\n* \u8b58\u5225\u30b3\u30fc\u30c9\uff1acnvtVkaA\uff08section\/dept \u306e\u30af\u30e9\u30b9\u540d, \u753b\u50cf\u540d\u306b\u4f7f\u7528\uff09\r\n\u0fd0\u0f36\u22b0\u27e1\u22b1\u0f36\u22b0\u27e1\u22b1\u0f36\u22b0\u27e1\u22b1\u0f36\u2740\u0f36\u22b0\u27e1\u22b1\u0f36\u22b0\u27e1\u22b1\u0f36\u22b0\u27e1\u22b1\u0f36\u0f04 -->\r\n\r\n<div class=\"pg-saracnvtvkaa bg-hackingGate\">\r\n\r\n  <!-- \u0f3b.mezzala\uff08\u4f59\u767d\u8abf\u6574\uff1apage\u4e0a\uff09\u0f3a -->\r\n  <hr class=\"spacer-mezzala\" \/>\r\n\r\n  <header class=\"page-header mx-auto\">\r\n    <!-- \u2756\u30d1\u30f3\u304f\u305a\u30ea\u30b9\u30c8 --><div><!-- breadcrumb.php -->\n<style>\n\/* \u2756breadcrumb.leckermaul\uff08\u30d1\u30f3\u304f\u305a\u30ea\u30b9\u30c8\uff09\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u0f1a\u0f36\u22b0\u27e1\u22b1\u0f36\u0f1a\u0f3a*\/\n.zaratan .breadcrumb.leckermaul {\n\twidth: 100%;\n\tmax-width: calc(var(--zvw,1vw) * 92.5);\n\tmargin-inline: auto;\n}\n\n.zaratan .breadcrumb.leckermaul :is(ul, ol) {\n\tmin-height: 3rem;\n\tline-height: initial;\n\tfont-size: 0;\n\tletter-spacing: 0;\n\toverflow: hidden;\n}\n\n.zaratan .breadcrumb.leckermaul li {\n\tdisplay: inline;\n\tline-height: 1.6;\n\tfont-size: clamp(0.775rem, calc(0.775rem + ((1vw - 0.225rem) * 0.1563)), 0.8750rem);\n}\n\n.zaratan .breadcrumb.leckermaul li>*,\n.zaratan .breadcrumb.leckermaul li::before {\n\tposition: relative;\n\ttop: 0.125em;\n\tdisplay: inline-flex;\n\talign-items: center;\n}\n\n.zaratan .breadcrumb.leckermaul a {\n\tdisplay: inline;\n\tcolor: var(--c-base-300, hsl(224, 6%, 74%));\n\tmargin-right: .5em;\n}\n\n.zaratan .breadcrumb.leckermaul li:nth-of-type(n+2) a {\n\tmargin-left: .5em;\n}\n\n\/* \u73fe\u5728\u306e\u30da\u30fc\u30b8\uff08\u30ea\u30f3\u30af\u306a\u3057\u3002<span aria-current=\"page\">\uff09\n   \u203b a \u3068\u540c\u3058\u4f59\u767d\u30fb\u8272\u3002\u30af\u30ea\u30c3\u30af\u3067\u304d\u306a\u3044\u8981\u7d20\u306a\u306e\u3067 pointer-events \u306f\u4e0d\u8981 *\/\n.zaratan .breadcrumb.leckermaul [aria-current=\"page\"] {\n\tdisplay: inline;\n\tmargin-inline: .5em;\n\tcolor: var(--c-base-300, hsl(224, 6%, 74%));\n}\n\n@media (any-hover:hover) {\n\t.zaratan .breadcrumb.leckermaul a:hover {\n\t\tcolor: var(--c-base-300, hsl(224, 6%, 74%));\n\t}\n}\n\n\/* .ma-home *\/\n.zaratan .breadcrumb.leckermaul .ma-home {\n\tvertical-align: top;\n}\n\n\/* .separator *\/\n.zaratan .breadcrumb.leckermaul li:nth-of-type(n+2)::before,\n.zaratan .breadcrumb.leckermaul.chevron-right li:nth-of-type(n+2)::before {\n\tcontent: \">\";\n\tcolor: var(--c-base-300, hsl(224, 6%, 74%))\n}\n\n.zaratan .breadcrumb.leckermaul.slash li:nth-of-type(n+2)::before {\n\tcontent: \"\/\";\n}\n\n.zaratan .breadcrumb.leckermaul.trigon-bullet li:nth-of-type(n+2)::before {\n\tcontent: \"\u2023\";\n}\n<\/style>\n\n\n<nav class=\"breadcrumb leckermaul py-0.5r mx-auto\" aria-label=\"\u30d1\u30f3\u304f\u305a\u30ea\u30b9\u30c8\">\n  <ul class=\"breadcrumb-wrapper\">\n    <!-- \u30c8\u30c3\u30d7\u30da\u30fc\u30b8\u3078\u306e\u30ea\u30f3\u30af\u3092\u8868\u793a -->\n    <li><a href=\"https:\/\/code-plus.jp\/gp\/\"><i><\/i>\u30c8\u30c3\u30d7<\/a><\/li>\n\n          <!-- \u56fa\u5b9a\u30da\u30fc\u30b8\uff08\u305d\u308c\u4ee5\u5916\uff09\uff1a \u5148\u7956\u30da\u30fc\u30b8\u540d\u3068\u3001\u73fe\u5728\u306e\u30da\u30fc\u30b8\u540d\u3092\u8868\u793a -->\n      <li><a href=\"https:\/\/code-plus.jp\/gp\/tools\/\">Web\u30c4\u30fc\u30eb\u4e00\u89a7\uff5cHTML\/CSS\u30fb\u6587\u66f8\u7de8\u96c6\u30fb\u753b\u50cf\u7de8\u96c6<\/a><\/li><li class=\"current_page_item\"><span aria-current=\"page\">Excel\u2192HTML\u30c6\u30fc\u30d6\u30eb\u5909\u63db\u30c4\u30fc\u30eb\uff5c\u8cbc\u308a\u4ed8\u3051\u308b\u3060\u3051\u30fb\u7d50\u5408\u30bb\u30eb\u5bfe\u5fdc<\/span><\/li>    <!-- \/\/\/if (is_page()) -->\n\n  <\/ul>\n<\/nav><\/div>\r\n  <\/header><!-- \/\/\/.inheader -->\r\n\r\n\r\n  <!-- \u0f3b\u00a7\ud835\udc12\ud835\udc04\ud835\udc02\ud835\udc13\ud835\udc08\ud835\udc0e\ud835\udc0d\u0f3a -->\r\n  <section class=\"sect-cnvtVkaA-Intro\">\r\n    <header class=\"section__inheader mx-auto\">\r\n      <div class=\"hgroup-wrapper mb-0.5r\">\r\n        <h1 class=\"hdg-page d-iblock w-auto fz-xxl mb-0.25pc\"><span>Excel\u2192HTML\u30c6\u30fc\u30d6\u30eb\u5909\u63db\u30c4\u30fc\u30eb\uff5c\u8cbc\u308a\u4ed8\u3051\u308b\u3060\u3051\u30fb\u7d50\u5408\u30bb\u30eb\u5bfe\u5fdc<\/span><\/h1>\r\n\r\n        <p class=\"rowgroup fl-right bdrs-0.25r mt-0.25r\">\r\n          <a class=\"badge is-outlined is-gray fz-xs whs-nowrap\" href=\"#ch-Explanation\">\r\n            <i class=\"icon mas ma-help\"><\/i>&nbsp;<span>\u4f7f\u3044\u65b9<\/span>\r\n          <\/a>\r\n          <a class=\"badge is-outlined is-gray fz-xs whs-nowrap\" href=\"\/gp\/tools\/markdown-converter\/\">\r\n            <span>Markdown \u2192 HTML<\/span>\r\n          <\/a>\r\n          <a class=\"badge is-outlined is-gray fz-xs whs-nowrap\" href=\"\/gp\/tools\/excel2table-converter\/\">\r\n            <span>Excel \u2192 Table<\/span>\r\n          <\/a>\r\n        <\/p>\r\n\r\n        <p class=\"page-foreword fz-ss\">Excel\u30fbGoogle \u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u304b\u3089\u30b3\u30d4\u30fc\u3057\u305f\u8868\u3092\u3001\u8cbc\u308a\u4ed8\u3051\u308b\u3060\u3051\u3067 HTML \u306e table \u306b\u5909\u63db\u3002\u7d50\u5408\u30bb\u30eb\u306f colspan\u30fbrowspan \u306b\u3001\u80cc\u666f\u8272\u306f bgcolor \u5c5e\u6027\u306b\u3082\u5bfe\u5fdc\u3002Markdown \u306e\u8868\u3068\u3057\u3066\u7de8\u96c6\u3067\u304d\u3001HTML\u2192Markdown \u306e\u9006\u5909\u63db\u3082\u53ef\u80fd\u3067\u3059\u3002<\/p>\r\n      <\/div><!-- \/\/\/.hgroup -->\r\n    <\/header><!-- \/\/\/.inheader -->\r\n  <\/section>\r\n\r\n\r\n  <!-- \u0f3b\u00a7\ud835\udc12\ud835\udc04\ud835\udc02\ud835\udc13\ud835\udc08\ud835\udc0e\ud835\udc0d\u0f3a -->\r\n  <hr id=\"ch-Converter\" anchor \/>\r\n  <section class=\"sect-cnvtVkaA-Converter\">\r\n    <div class=\"section__interior fxd-row mx-auto\">\r\n      <figure class=\"section__leftlane\">\r\n        <div class=\"hgroup-wrapper\">\r\n          <h3 class=\"fz-rg hdg-section mb-0.25pc\"><span>\u25bc\u30c6\u30ad\u30b9\u30c8\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044<\/span><\/h3>\r\n        <\/div><!-- \/\/\/.hgroup -->\r\n\r\n        <div class=\"chest-wrapper relatived\">\r\n          <textarea id=\"encodeArea\" class=\"textarea\" style=\"height:17.5pc;\" placeholder=\"Excel\u30fb\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306e\u7bc4\u56f2\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3001\u3053\u3053\u306b\u8cbc\u308a\u4ed8\u3051\u3066\u304f\u3060\u3055\u3044\uff08Markdown \u306e\u8868\u306b\u5909\u63db\u3055\u308c\u307e\u3059\uff09\"><\/textarea>\r\n          <ins id=\"decodedMessage\"><\/ins>\r\n        <\/div><!-- \/\/\/.chest -->\r\n\r\n        <!-- \u30aa\u30d7\u30b7\u30e7\u30f3 -->\r\n        <div class=\"colgroup w-full mt-1r\">\r\n          <h4 class=\"title is-outlined fz-sm\">\u30aa\u30d7\u30b7\u30e7\u30f3\u8a2d\u5b9a\r\n            <a href=\"javascript:void(0);\" onclick=\"uncheckAllOptions()\" class=\"badge is-outlined is-gray fz-xxs ml-auto\">\r\n              <i class=\"icon mas ma-close\"><\/i>&nbsp;<span>\u3059\u3079\u3066\u30c1\u30a7\u30c3\u30af\u3092\u5916\u3059<\/span>\r\n            <\/a>\r\n            <a href=\"javascript:void(0);\" onclick=\"resetDefaultOptions()\" class=\"badge is-outlined is-gray fz-xxs ml-0.5r\">\r\n              <i class=\"icon mas ma-restart_alt\"><\/i>&nbsp;<span>\u30c7\u30d5\u30a9\u30eb\u30c8\u306b\u623b\u3059<\/span>\r\n            <\/a>\r\n          <\/h4>\r\n          <label class=\"label is-outlined fz-sm checked-summary\">\r\n            <input type=\"checkbox\" class=\"checked-switch\" id=\"convertExcelPaste\" checked>\r\n            <span>Excel \u306e\u7bc4\u56f2\u3092\u8cbc\u308a\u4ed8\u3051 \u2192 Markdown \u306e\u8868\u306b\u5909\u63db<\/span>\r\n          <\/label>\r\n          <figure class=\"checked-details checkedion\">\r\n            <figcaption class=\"checked-content colgroup bd-left ov-hidden\">\r\n              <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"excelHeaderRow\" checked>1 \u884c\u76ee\u3092 \u2192 \u898b\u51fa\u3057\u884c\uff08&lt;thead&gt;\uff09\u306b\u3059\u308b<\/label>\r\n              <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"excelAutoConvert\" checked>\u8cbc\u308a\u4ed8\u3051\u305f\u3089 \u2192 \u3059\u3050 HTML \u306b\u5909\u63db\u3059\u308b<\/label>\r\n              <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"excelBgcolor\">\u30bb\u30eb\u306e\u80cc\u666f\u8272\u3092 \u2192 <code>bgcolor<\/code> \u5c5e\u6027\u3067\u6b8b\u3059<br>\uff08Excel \u304b\u3089\u8cbc\u308a\u4ed8\u3051\u305f\u8868\u3060\u3051\u3002\u884c\u30fb\u5217\u306e\u6570\u3092\u5909\u3048\u308b\u3068\u4ed8\u304d\u307e\u305b\u3093\uff09<\/label>\r\n            <\/figcaption>\r\n          <\/figure>\r\n          <label class=\"label is-outlined fz-sm\">\u30c6\u30fc\u30d6\u30eb\u8868\u73fe\uff1a&nbsp;\r\n            <select id=\"convertTableStyle\" class=\"select w-10e\">\r\n              <option value=\"table\" selected>table &gt; tr &gt; th\/td<\/option>\r\n              <option value=\"dl\">dl &gt; div &gt; dt\/dd<\/option>\r\n            <\/select>\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertTableBorder\">\r\n            &lt;table&gt; \u306b \u2192 border \u5c5e\u6027&nbsp;<input type=\"text\" id=\"tableBorderValue\" class=\"input w-4e\" value=\"1\">&nbsp;\u3092\u4ed8\u3051\u308b\uff08HTML \u30e1\u30fc\u30eb\u7528\uff09\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm checked-summary\">\r\n            <input type=\"checkbox\" class=\"checked-switch\" id=\"convertMd2Html\" checked>\r\n            <span>Markdown \u2192 HTML \u306b\u5909\u63db<\/span>\r\n          <\/label>\r\n          <figure class=\"checked-details checkedion\">\r\n            <figcaption class=\"checked-content colgroup bd-left ov-hidden\">\r\n              <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertMd2Breaks\" checked>Markdown \u2192 HTML \u306b\u5909\u63db\u6642\uff1a\u5358\u4e00\u306e\u6539\u884c\u3092 &lt;br&gt; \u306b\u5909\u63db<\/label>\r\n              <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertTagTd2Ths\" checked>&lt;table&gt; \u5404\u884c\u6700\u521d\u306e\u30bb\u30eb\u3092 \u2192 &lt;th&gt; \u306b\u5909\u63db<\/label>\r\n              <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertMd2HeadingIds\" checked>\u898b\u51fa\u3057\u306b \u2192 \u898b\u51fa\u3057\u306e\u6587\u5b57\u5217\u304b\u3089 id \u3092\u4ed8\u3051\u308b<\/label>\r\n              <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertMd2BlankLines\" checked>\u898b\u51fa\u3057\u30fbhr\u30fb\u30ea\u30b9\u30c8\u30fb\u8868\u30fbpre\u30fb\u5f15\u7528\u30fbdetails \u306e\u524d\u306b \u2192 \u7a7a\u884c\u3092\u5165\u308c\u308b<\/label>\r\n              <label class=\"d-none label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertMd2LinkCards\" checked>\u81ea\u30b5\u30a4\u30c8\u306e URL \u3060\u3051\u306e\u884c\u3092 \u2192 <code>&lsqb;linkbox href=\"\u2026\"&rsqb;<\/code> \u306b\u5909\u63db<\/label>\r\n              <label class=\"d-none label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertMd2ExternalLinks\" checked>\u5916\u90e8\u30ea\u30f3\u30af\u306b \u2192 <code>&lt;cite&gt;<\/code> \u3068 <code>target=\"_blank\"<\/code> \u3092\u4ed8\u3051\u308b<\/label>\r\n              <label class=\"d-none label is-outlined fz-sm\">\u81ea\u30b5\u30a4\u30c8\u306e\u30c9\u30e1\u30a4\u30f3\uff1a<input type=\"text\" id=\"convertMd2SiteDomain\" class=\"input w-11e\" value=\"code-plus.jp\"><\/label>\r\n            <\/figcaption>\r\n          <\/figure>\r\n          <label class=\"label is-outlined fz-sm\">\r\n            <input type=\"checkbox\" class=\"checkbox\" id=\"convertReindentCode\">\r\n            <span>\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u5185\u3092\u30a4\u30f3\u30c7\u30f3\u30c8\u6574\u5f62\u3059\u308b<br \/>\uff08<code>{}<\/code>\u30fb<code>[]<\/code>\u30fbHTML\u30bf\u30b0\u30fbPHP\u5236\u5fa1\u69cb\u9020\u3067\u5b57\u4e0b\u3052\uff09<\/span>\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"encloseTagImgPictures\" checked>&lt;img \/&gt; \u3092 \u2192 &lt;picture&gt; \u3067\u56f2\u3080<\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertUListStyles\" checked>\r\n            &lt;ul&gt; \u306e list-style-type\u3092 \u2192&nbsp;\r\n            <select class=\"select w-10e placeholder-shown\">\r\n              <option value=\"none\">none<\/option>\r\n              <option value=\"indent\">indent<\/option>\r\n              <option value=\"bullet\" selected>bullet<\/option>\r\n              <option value=\"white-bullet\">white-bullet<\/option>\r\n              <option value=\"trigon-bullet\">trigon-bullet<\/option>\r\n              <option value=\"white-trigon-bullet\">white-trigon-bullet<\/option>\r\n              <option value=\"trigon-right\">trigon-right<\/option>\r\n              <option value=\"white-trigon-right\">white-trigon-right<\/option>\r\n              <option value=\"disc\">disc<\/option>\r\n              <option value=\"circle\">circle<\/option>\r\n              <option value=\"square\">square<\/option>\r\n              <option value=\"box\">box<\/option>\r\n              <option value=\"check\">check<\/option>\r\n              <option value=\"diamond\">diamond<\/option>\r\n            <\/select>&nbsp;\u306b\u5909\u63db\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertOListStyles\" checked>\r\n            &lt;ol&gt; \u306e list-style-type\u3092 \u2192&nbsp;\r\n            <select class=\"select w-10e placeholder-shown\">\r\n              <option value=\"none\">none<\/option>\r\n              <option value=\"indent\">indent<\/option>\r\n              <option value=\"decimal\" selected>decimal<\/option>\r\n              <option value=\"decimal-leading-zero\">decimal-leading-zero<\/option>\r\n              <option value=\"lower-alpha\">lower-alpha<\/option>\r\n              <option value=\"upper-alpha\">upper-alpha<\/option>\r\n              <option value=\"lower-roman\">lower-roman<\/option>\r\n              <option value=\"upper-roman\">upper-roman<\/option>\r\n              <option value=\"parenthesized-decimal\">parenthesized-decimal<\/option>\r\n              <option value=\"parenthesized-lower-alpha\">parenthesized-lower-alpha<\/option>\r\n              <option value=\"parenthesized-lower-roman\">parenthesized-lower-roman<\/option>\r\n              <option value=\"circled-decimal\">circled-decimal<\/option>\r\n              <option value=\"circled-upper-alpha\">circled-upper-alpha<\/option>\r\n              <option value=\"circled-upper-roman\">circled-upper-roman<\/option>\r\n              <option value=\"boxed-decimal\">boxed-decimal<\/option>\r\n              <option value=\"boxed-upper-alpha\">boxed-upper-alpha<\/option>\r\n              <option value=\"boxed-upper-roman\">boxed-upper-roman<\/option>\r\n              <option value=\"filled-circled-decimal\">filled-circled-decimal<\/option>\r\n              <option value=\"filled-circled-upper-alpha\">filled-circled-upper-alpha<\/option>\r\n              <option value=\"filled-circled-upper-roman\">filled-circled-upper-roman<\/option>\r\n              <option value=\"filled-boxed-decimal\">filled-boxed-decimal<\/option>\r\n              <option value=\"filled-boxed-upper-alpha\">filled-boxed-upper-alpha<\/option>\r\n              <option value=\"filled-boxed-upper-roman\">filled-boxed-upper-roman<\/option>\r\n            <\/select>&nbsp;\u306b\u5909\u63db\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertUpdateTag1s\" checked>\r\n            <input type=\"text\" id=\"targetUpdateTag1\" class=\"input\" style=\"min-width:6.6em;\" value='&lt;strong&gt;'>&nbsp;\u30bf\u30b0\u3092 \u2192\r\n            <input type=\"text\" id=\"afterUpdateTag1\" class=\"input\" style=\"min-width:8.5em;\" value='&lt;b class=\"fw-600\"&gt;'>&nbsp;\u306b\u5909\u63db\r\n          <\/label>\r\n          <label class=\"d-none label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertUpdateTag2s\">\r\n            <input type=\"text\" id=\"targetUpdateTag2\" class=\"input\" style=\"min-width:6.6em;\" value='&lt;table class=\"table\"&gt;'>&nbsp;\u30bf\u30b0\u3092 \u2192\r\n            <input type=\"text\" id=\"afterUpdateTag2\" class=\"input\" style=\"min-width:8.5em;\" value='&lt;dl class=\"deline\"&gt;'>&nbsp;\u306b\u5909\u63db\r\n          <\/label>\r\n          <label class=\"d-none label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertUpdateTag3s\">\r\n            <input type=\"text\" id=\"targetUpdateTag3\" class=\"input\" style=\"min-width:6.6em;\" value='&lt;tr class=\"rung\"&gt;'>&nbsp;\u30bf\u30b0\u3092 \u2192\r\n            <input type=\"text\" id=\"afterUpdateTag3\" class=\"input\" style=\"min-width:8.5em;\" value='&lt;div class=\"rung\"&gt;'>&nbsp;\u306b\u5909\u63db\r\n          <\/label>\r\n          <label class=\"d-none label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertUpdateTag4s\">\r\n            <input type=\"text\" id=\"targetUpdateTag4\" class=\"input\" style=\"min-width:6.6em;\" value='&lt;th&gt;'>&nbsp;\u30bf\u30b0\u3092 \u2192\r\n            <input type=\"text\" id=\"afterUpdateTag4\" class=\"input\" style=\"min-width:8.5em;\" value='&lt;dt&gt;'>&nbsp;\u306b\u5909\u63db\r\n          <\/label>\r\n          <label class=\"d-none label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertUpdateTag5s\">\r\n            <input type=\"text\" id=\"targetUpdateTag5\" class=\"input\" style=\"min-width:6.6em;\" value='&lt;td&gt;'>&nbsp;\u30bf\u30b0\u3092 \u2192\r\n            <input type=\"text\" id=\"afterUpdateTag5\" class=\"input\" style=\"min-width:8.5em;\" value='&lt;dd&gt;'>&nbsp;\u306b\u5909\u63db\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase1s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase1\" class=\"input\" style=\"min-width:6.6em;\" value='a'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase1\" class=\"input\" style=\"min-width:8.5em;\" value='link'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase2s\">\r\n            <input type=\"text\" id=\"targetAddClase2\" class=\"input\" style=\"min-width:6.6em;\" value='b'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase2\" class=\"input\" style=\"min-width:8.5em;\" value='bold'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase3s\">\r\n            <input type=\"text\" id=\"targetAddClase3\" class=\"input\" style=\"min-width:6.6em;\" value='i'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase3\" class=\"input\" style=\"min-width:8.5em;\" value='italic'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase4s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase4\" class=\"input\" style=\"min-width:6.6em;\" value='q'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase4\" class=\"input\" style=\"min-width:8.5em;\" value='quote'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase5s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase5\" class=\"input\" style=\"min-width:6.6em;\" value='s'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase5\" class=\"input\" style=\"min-width:8.5em;\" value='strike'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase6s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase6\" class=\"input\" style=\"min-width:6.6em;\" value='u, ins'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase6\" class=\"input\" style=\"min-width:8.5em;\" value='underline'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase7s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase7\" class=\"input\" style=\"min-width:6.6em;\" value='mark'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase7\" class=\"input\" style=\"min-width:8.5em;\" value='mark'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase8s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase8\" class=\"input\" style=\"min-width:6.6em;\" value='hr'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase8\" class=\"input\" style=\"min-width:8.5em;\" value='separator mt-3r'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase9s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase9\" class=\"input\" style=\"min-width:6.6em;\" value='picture'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase9\" class=\"input\" style=\"min-width:8.5em;\" value='bd-bounds my-0.5r'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase10s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase10\" class=\"input\" style=\"min-width:6.6em;\" value='p'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase10\" class=\"input\" style=\"min-width:8.5em;\" value='fz-ss'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase11s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase11\" class=\"input\" style=\"min-width:6.6em;\" value='small'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase11\" class=\"input\" style=\"min-width:8.5em;\" value='fz-xs'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase12s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase12\" class=\"input\" style=\"min-width:6.6em;\" value='em'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase12\" class=\"input\" style=\"min-width:8.5em;\" value='fz-rg'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase13s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase13\" class=\"input\" style=\"min-width:6.6em;\" value='strong'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase13\" class=\"input\" style=\"min-width:8.5em;\" value='fz-ml'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase14s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase14\" class=\"input\" style=\"min-width:6.6em;\" value='h2'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase14\" class=\"input\" style=\"min-width:8.5em;\" value='fz-xl'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase15s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase15\" class=\"input\" style=\"min-width:6.6em;\" value='h3'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase15\" class=\"input\" style=\"min-width:8.5em;\" value='fz-ml'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase16s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase16\" class=\"input\" style=\"min-width:6.6em;\" value='h4'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase16\" class=\"input\" style=\"min-width:8.5em;\" value='fz-md'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase17s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase17\" class=\"input\" style=\"min-width:6.6em;\" value='h5'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase17\" class=\"input\" style=\"min-width:8.5em;\" value='fz-ss'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase18s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase18\" class=\"input\" style=\"min-width:6.6em;\" value='h6'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase18\" class=\"input\" style=\"min-width:8.5em;\" value='fz-xs'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase19s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase19\" class=\"input\" style=\"min-width:6.6em;\" value='ul, ol, dl'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase19\" class=\"input\" style=\"min-width:8.5em;\" value='my-0.5r'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n<label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase20s\" checked>\r\n<input type=\"text\" id=\"targetAddClase20\" class=\"input\" style=\"min-width:6.6em;\" value='dt'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n<input type=\"text\" id=\"afterAddClase20\" class=\"input\" style=\"min-width:8.5em;\" value='fw-500'>&nbsp;\u8ffd\u52a0\r\n<\/label>\r\n<label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase21s\" checked>\r\n<input type=\"text\" id=\"targetAddClase21\" class=\"input\" style=\"min-width:6.6em;\" value='dd'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n<input type=\"text\" id=\"afterAddClase21\" class=\"input\" style=\"min-width:8.5em;\" value='ml-2r'>&nbsp;\u8ffd\u52a0\r\n<\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase22s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase22\" class=\"input\" style=\"min-width:6.6em;\" value='table'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase22\" class=\"input\" style=\"min-width:8.5em;\" value='table my-0.75r'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAddClase23s\" checked>\r\n            <input type=\"text\" id=\"targetAddClase23\" class=\"input\" style=\"min-width:6.6em;\" value='blockquote, details'>&nbsp;\u30bf\u30b0\u306b \u2192 class&nbsp;\r\n            <input type=\"text\" id=\"afterAddClase23\" class=\"input\" style=\"min-width:8.5em;\" value='alert mt-1r'>&nbsp;\u8ffd\u52a0\r\n          <\/label>\r\n        <\/div><!-- \/\/\/.colgroup -->\r\n\r\n        <!-- \u62e1\u5f35\u30aa\u30d7\u30b7\u30e7\u30f3 -->\r\n        <dl class=\"dion-details clickdion\">\r\n          <dt class=\"dion-summary\">\r\n            <h4 class=\"title is-outlined fz-sm\">\u62e1\u5f35\u30aa\u30d7\u30b7\u30e7\u30f3<i class=\"dion-switch\"><\/i><\/h4>\r\n          <\/dt>\r\n          <dd class=\"dion-content colgroup is-full\">\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"removeTags\">\u3059\u3079\u3066\u306eHTML\u30bf\u30b0\u3092\u9664\u53bb<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"removeLineBreaks\">\u5168\u3066\u306e\u6539\u884c\u3092\u524a\u9664<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"adjustLineBreaks\">\u5358\u4e00\u6539\u884c\u3092\u524a\u9664\u3001\u9023\u7d9a\u6539\u884c\u306f\uff11\u3064\u6e1b\u3089\u3059<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertTagBreaks\">\u6539\u884c\u3092 \u2192 &lt;br&gt; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertNspacesTabs\">\r\n              <input type=\"number\" id=\"spaceCount\" class=\"w-4e\" value=\"4\" min=\"2\">&nbsp;\u500b\u4ee5\u4e0a\u306e\u9023\u7d9a\u3059\u308b\u30b9\u30da\u30fc\u30b9\u3092 \u2192 \u30bf\u30d6 \u306b\u5909\u63db\r\n            <\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertNthBreak2Tabs\">\r\n              <input type=\"text\" id=\"nthBreakCount\" class=\"w-4e\" value=\"n+1\">&nbsp;\u756a\u76ee\u306e\u6539\u884c\u3092 \u2192 \u30bf\u30d6 \u306b\u5909\u63db\r\n            <\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntityAmps\"><code>&amp;<\/code>\u3092 \u2192 &amp;amp; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntityNewLines\">\u6539\u884c\u3092 \u2192 &#38;#13;&#38;#10; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntityTabs\">\u30bf\u30d6\u3092 \u2192 &#38;#9; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntityLtGts\"><code>&lt; &gt;<\/code>\u3092 \u2192 &amp;lt; &amp;gt; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntitySqbs\"><code>&lsqb; &rsqb;<\/code>\u3092 \u2192 &amp;lsqb; &amp;rsqb; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntityPars\"><code>&lpar; &rpar;<\/code>\u3092 \u2192 &amp;lpar; &amp;rpar; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntityCubs\"><code>&lcub; &rcub;<\/code>\u3092 \u2192 &amp;lcub; &amp;rcub; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntityQuots\"><code>&quot;<\/code>\u3092 \u2192 &amp;quot; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntityAposs\"><code>&apos;<\/code>\u3092 \u2192 &amp;apos; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertEntityGraves\"><code>&grave;<\/code>\u3092 \u2192 &amp;grave; \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertHalfNumbers\">\u5168\u89d2\u6570\u5b57\u3092 \u2192 \u534a\u89d2\u6570\u5b57\u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertFullNumbers\">\u5358\u72ec\u534a\u89d2\u6570\u5b57\u3092 \u2192 \u5168\u89d2\u6570\u5b57 \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertHalfAlphabets\">\u5168\u89d2\u82f1\u5b57\u3092 \u2192 \u534a\u89d2\u82f1\u5b57\u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertFullAlphabets\">\u5358\u72ec\u534a\u89d2\u82f1\u5b57\u3092 \u2192 \u5168\u89d2\u82f1\u5b57 \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertHalfParenthesis\">\u5168\u89d2\u62ec\u5f27\uff08\uff09\u3092 \u2192 \u534a\u89d2\u62ec\u5f27() \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertFullParenthesis\">\u534a\u89d2\u62ec\u5f27()\u3092 \u2192 \u5168\u89d2\u62ec\u5f27\uff08\uff09 \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertNumber0s\">\u6570\u5b57\u3092 \u2192 \ud835\udf03 \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertNumberRandoms\">\u6570\u5b57\u3092 \u2192 \u30e9\u30f3\u30c0\u30e0\u306a\u6570\u5b57 \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAlphaLowers\">\u82f1\u5c0f\u6587\u5b57\u3092 \u2192 \u29c4 \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertAlphaUppers\">\u82f1\u5927\u6587\u5b57\u3092 \u2192 \u2341 \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertFullWidths\">\u5168\u89d2\u6587\u5b57\u3092 \u2192 \u303c \u306b\u5909\u63db<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertRenumbers\">Markdown\u5f62\u5f0f\u306e\u756a\u53f7\uff08*. \uff09\u3092 \u2192 \u4e0a\u304b\u3089\u9023\u756a\u3067\u4ed8\u3051\u76f4\u3059<\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"removeMultiWords\">JSON\u5f62\u5f0f&nbsp;\r\n              <input type=\"text\" id=\"removeTxts\" class=\"input w-10e\" value='\u300e, \u300f'>&nbsp;\u3092\u524a\u9664\r\n            <\/label>\r\n            <label class=\"label is-outlined fz-sm\"><input type=\"checkbox\" class=\"checkbox\" id=\"convertMultiWords\">JSON\u5f62\u5f0f&nbsp;\r\n              <input type=\"text\" id=\"beforeTxts\" class=\"input w-10e\" value='[\u300e, \u300f]'> \u2192\r\n              <input type=\"text\" id=\"afterTxts\" class=\"input w-10e\" value='[\u300c, \u300d]'>&nbsp;\u306b\u5909\u63db\r\n            <\/label>\r\n          <\/dd>\r\n        <\/dl><!-- \/\/\/.clickdion -->\r\n\r\n        <!-- \u975e\u8868\u793a\u30b0\u30eb\u30fc\u30d7 -->\r\n        <div class=\"colgroup\" style=\"display:none;\">\r\n\r\n        <\/div>\r\n      <\/figure><!-- \/\/\/.leftlane -->\r\n\r\n      <figure class=\"section__centerlane\">\r\n        <aside class=\"sticky-sidebar fxd-column pc-center\">\r\n          <a class=\"button is-solided is-primary\" href=\"#ch-Converter\" onclick=\"encodeText()\"><span>\u5909\u63db&nbsp;\u00bb<\/span><\/a>\r\n          <a class=\"button is-solided is-primary mt-2r\" href=\"#ch-Converter\" onclick=\"decodeText()\"><span>\u00ab&nbsp;\u5909\u63db<\/span><\/a>\r\n        <\/aside>\r\n      <\/figure><!-- \/\/\/.centerlane -->\r\n\r\n\r\n      <figure class=\"section__rightlane\">\r\n        <div class=\"chest-wrapper relatived\">\r\n          <h3 class=\"fz-rg hdg-section mb-0.25pc\"><span>\u25bc\u5909\u63db\u5f8c\u306e\u30c6\u30ad\u30b9\u30c8<\/span><\/h3>\r\n          <textarea class=\"textarea\" id=\"decodeArea\" style=\"height:17.5pc;\" placeholder=\"\u3053\u3053\u306b\u5909\u63db\u5f8c\u306e\u30c6\u30ad\u30b9\u30c8\u304c\u8868\u793a\u3055\u308c\u307e\u3059\"><\/textarea>\r\n          <ins id=\"encodedMessage\"><\/ins>\r\n        <\/div><!-- \/\/\/.chest -->\r\n\r\n        <!-- \u30aa\u30d7\u30b7\u30e7\u30f3\uff08\u30c7\u30b3\u30fc\u30c9\u6642\uff09 -->\r\n        <div class=\"colgroup w-full mt-1r\">\r\n          <h4 class=\"title is-outlined fz-sm\">\u30aa\u30d7\u30b7\u30e7\u30f3\u8a2d\u5b9a\uff08\u30c7\u30b3\u30fc\u30c9\u6642\uff09<\/h4>\r\n          <label class=\"label is-outlined fz-sm\">\r\n            <input type=\"checkbox\" class=\"checkbox\" id=\"decodeRemoveHtmlTags\">\r\n            <span>\u5909\u63db\u5f8c\u306b\u6b8b\u3063\u305fHTML\u30bf\u30b0\u3092\u9664\u53bb<br \/>\uff08<code>&lt;br&gt;<\/code>\u306f\u5bfe\u8c61\u5916\u3002\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u30fb\u30a4\u30f3\u30e9\u30a4\u30f3\u30b3\u30fc\u30c9\u306e\u4e2d\u8eab\u3082\u5bfe\u8c61\u5916\uff09<\/span>\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\">\r\n            <input type=\"checkbox\" class=\"checkbox\" id=\"decodeKeepComments\">\r\n            <span>\u30b3\u30e1\u30f3\u30c8\uff08<code>&lt;!-- --&gt;<\/code>\uff09\u3092\u7dad\u6301\u3059\u308b<\/span>\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm d-iblock\">\r\n            <span><code>:::<\/code>\uff08\u30ab\u30b9\u30bf\u30e0\u30b3\u30f3\u30c6\u30ca\uff09\u306b\u5909\u63db\u3059\u308b\u30bf\u30b0<br>\uff08\u30ab\u30f3\u30de\u533a\u5207\u308a\u3002<code>&lt;div&gt;<\/code> \u306f\u5c5e\u6027\u306e\u3042\u308b\u3082\u306e\u3060\u3051\u3002\u300cHTML \u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u30bf\u30b0\u300d\u3068\u91cd\u306a\u308b\u3068\u304d\u306f\u3001\u305d\u3061\u3089\u3092\u512a\u5148\uff09<\/span>\r\n            <hr class=\"fxbr\" \/>\r\n            <textarea id=\"decodeFencedDivTags\" class=\"textarea fz-xs mt-0.25pc\" style=\"height:4pc;\">article, section, nav, aside, header, footer, address, pre, figure, figcaption, div, main<\/textarea>\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm d-iblock\">\r\n            <span>HTML \u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u30bf\u30b0<br>\uff08\u30ab\u30f3\u30de\u533a\u5207\u308a\u3002\u30bf\u30b0\u3060\u3051\u3092\u7dad\u6301\u3057\u3001\u4e2d\u8eab\u306f Markdown \u306b\u5909\u63db\u3002\u7a7a\u6b04\u306a\u3089\u5bfe\u8c61\u7121\u3057\uff09<\/span>\r\n            <hr class=\"fxbr\" \/>\r\n            <textarea id=\"decodeKeepTagOnlyTags\" class=\"textarea fz-xs mt-0.25pc\" style=\"height:4pc;\">dl, dt, dd, font, img, kbd, samp, var<\/textarea>\r\n          <\/label>\r\n          <!-- \uff3b\u30bf\u30b0\uff3d\u3092 \u2192 MathJax\u88c5\u98fe\uff08<font>$\u30b3\u30de\u30f3\u30c9{\\mathsf{ \u4e2d\u8eab }}$<\/font>\uff09\u306b\u5909\u63db -->\r\n          <label class=\"label is-outlined fz-sm\">\r\n            <input type=\"checkbox\" class=\"checkbox\" id=\"decodeMathJax1s\">\r\n            <input type=\"text\" id=\"decodeMathJaxTag1\" class=\"input w-6e\" value=\"small\">&nbsp;\u30bf\u30b0\u3092 \u2192 MathJax\r\n            <input type=\"text\" id=\"decodeMathJaxCmd1\" class=\"input\" style=\"min-width:6.6em;\">&nbsp;\u306b\u5909\u63db\r\n          <\/label>\r\n          <label class=\"label is-outlined fz-sm\">\r\n            <input type=\"checkbox\" class=\"checkbox\" id=\"decodeMathJax2s\">\r\n            <input type=\"text\" id=\"decodeMathJaxTag2\" class=\"input w-6e\" value=\"mark\">&nbsp;\u30bf\u30b0\u3092 \u2192 MathJax\r\n            <input type=\"text\" id=\"decodeMathJaxCmd2\" class=\"input\" style=\"min-width:6.6em;\">&nbsp;\u306b\u5909\u63db\r\n          <\/label>\r\n        <\/div><!-- \/\/\/.colgroup -->\r\n      <\/figure><!-- \/\/\/.rightlane -->\r\n    <\/div><!-- \/\/\/.interior.fxd-row -->\r\n  <\/section>\r\n\r\n\r\n  <!-- \u0f3b\u00a7\ud835\udc12\ud835\udc04\ud835\udc02\ud835\udc13\ud835\udc08\ud835\udc0e\ud835\udc0d\uff1a\u4f7f\u3044\u65b9\u0f3a -->\r\n  <hr id=\"ch-Explanation\" anchor \/>\r\n  <section class=\"sect-cnvtVkaA-Explanation pt-3r\">\r\n    <div class=\"section__interior mx-auto scroll-fadeIn\">\r\n      <div class=\"box is-broad is-solided c-base-900\">\r\n        <h4 class=\"hdg-explanation fz-md mb-0.25pc\">\u4f7f\u3044\u65b9<\/h4>\r\n\r\n        <p class=\"fz-ss mb-1r\">\r\n          \u3053\u306e\u30c4\u30fc\u30eb\u306f\u3001<b class=\"fw-600\">Excel\u30fbGoogle \u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306e\u8868\u3092\u3001\u8cbc\u308a\u4ed8\u3051\u308b\u3060\u3051\u3067 HTML \u306e <code>&lt;table&gt;<\/code> \u306b\u5909\u63db<\/b>\u3067\u304d\u308b\u30aa\u30f3\u30e9\u30a4\u30f3\u30b3\u30f3\u30d0\u30fc\u30bf\u30fc\u3067\u3059\u3002\u30b3\u30d4\u30fc\u3057\u305f\u7bc4\u56f2\u3092\u5de6\u5074\u306e\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u306b\u8cbc\u308a\u4ed8\u3051\u308b\u3068\u3001\u3044\u3063\u305f\u3093 Markdown \u306e\u8868\u306b\u306a\u308a\u3001\u3059\u3050\u53f3\u5074\u306b HTML \u304c\u51fa\u529b\u3055\u308c\u307e\u3059\u3002\u5909\u63db\u7d50\u679c\u306f\u81ea\u52d5\u3067\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3055\u308c\u307e\u3059\u3002\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e0d\u8981\u30fb\u30d6\u30e9\u30a6\u30b6\u5185\u3067\u5b8c\u7d50\u3057\u3001\u8cbc\u308a\u4ed8\u3051\u305f\u5185\u5bb9\u304c\u30b5\u30fc\u30d0\u30fc\u306b\u9001\u4fe1\u3055\u308c\u308b\u3053\u3068\u306f\u3042\u308a\u307e\u305b\u3093\u3002\r\n        <\/p>\r\n\r\n        <hr class=\"separator my-1.5r\">\r\n\r\n        <!-- \u2605 AI\u306b\u3082\u4f1d\u308f\u308b\u3088\u3046\u3001\u4e8b\u5b9f\u30d9\u30fc\u30b9\u3067\u300c\u4ed6\u30c4\u30fc\u30eb\u3068\u306e\u9055\u3044\u300d\u3092\u660e\u793a -->\r\n        <h5 class=\"hdg-subexplanation fz-rg mb-0.5r\">\u2728 \u3053\u306e\u30c4\u30fc\u30eb\u306e\u7279\u5fb4\uff08\u4ed6\u306e\u5909\u63db\u30c4\u30fc\u30eb\u3068\u306e\u9055\u3044\uff09<\/h5>\r\n        <p class=\"fz-ss mb-1r\">\r\n          \u4e00\u822c\u7684\u306a Excel\u2192HTML \u5909\u63db\u30c4\u30fc\u30eb\u306e\u591a\u304f\u306f\u3001\u8cbc\u308a\u4ed8\u3051\u305f\u8868\u3092\u305d\u306e\u307e\u307e HTML \u306b\u3059\u308b\u3060\u3051\u3067\u3059\u3002\u3053\u306e\u30c4\u30fc\u30eb\u306f\u3001<b class=\"fw-600\">\u7d50\u5408\u30bb\u30eb\u3092\u5d29\u3055\u305a\u3001\u5909\u63db\u5f8c\u3082\u7de8\u96c6\u3057\u3084\u3059\u3044\u3053\u3068<\/b>\u3092\u91cd\u8996\u3057\u3066\u8a2d\u8a08\u3055\u308c\u3066\u304a\u308a\u3001\u6b21\u306e\u70b9\u304c\u4e3b\u306a\u9055\u3044\u3067\u3059\u3002\r\n        <\/p>\r\n        <table class=\"table tbl-responsive fz-ss mb-1r\">\r\n          <thead>\r\n            <tr class=\"rung\">\r\n              <th style=\"min-width:9em;\">\u89b3\u70b9<\/th>\r\n              <td>\u4e00\u822c\u7684\u306a\u5909\u63db\u30c4\u30fc\u30eb<\/td>\r\n              <td>\u3053\u306e\u30c4\u30fc\u30eb<\/td>\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody>\r\n            <tr class=\"rung\">\r\n              <th>\u7d50\u5408\u30bb\u30eb<\/th>\r\n              <td>\u7d50\u5408\u304c\u5916\u308c\u305f\u308a\u3001\u7a7a\u306e\u30bb\u30eb\u304c\u6b8b\u3063\u305f\u308a\u3059\u308b\u3053\u3068\u304c\u3042\u308b<\/td>\r\n              <td>\u6a2a\u30fb\u7e26\u306e\u7d50\u5408\u3092 <b class=\"fw-600\"><code>colspan<\/code>\u30fb<code>rowspan<\/code> \u306b\u305d\u306e\u307e\u307e\u5909\u63db<\/b>\u30022\u00d72 \u306a\u3069\u306e\u7e26\u6a2a\u306e\u7d50\u5408\u306b\u3082\u5bfe\u5fdc<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>\u5909\u63db\u5f8c\u306e\u7de8\u96c6<\/th>\r\n              <td>HTML \u3092\u76f4\u63a5\u66f8\u304d\u76f4\u3059\u5fc5\u8981\u304c\u3042\u308b<\/td>\r\n              <td>\u3044\u3063\u305f\u3093 <b class=\"fw-600\">Markdown \u306e\u8868\uff08\u30d1\u30a4\u30d7\u8a18\u6cd5\uff09<\/b>\u306b\u306a\u308b\u306e\u3067\u3001\u6587\u5b57\u306e\u4fee\u6b63\u3084\u884c\u306e\u8ffd\u52a0\u304c\u304b\u3093\u305f\u3093<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>\u51fa\u529b\u306e\u5f62<\/th>\r\n              <td><code>&lt;table&gt;<\/code> \u306e\u307f<\/td>\r\n              <td><code>&lt;table&gt;<\/code> \u306e\u307b\u304b\u3001<b class=\"fw-600\"><code>&lt;dl&gt;&lt;div&gt;&lt;dt&gt;&lt;dd&gt;<\/code> \u306e\u5b9a\u7fa9\u30ea\u30b9\u30c8<\/b>\u3067\u3082\u51fa\u529b\u3067\u304d\u308b<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>HTML \u30e1\u30fc\u30eb<\/th>\r\n              <td>\u80cc\u666f\u8272\u3084\u7f6b\u7dda\u306f style \u3067\u51fa\u529b\u3055\u308c\u3001\u30e1\u30fc\u30eb\u30bd\u30d5\u30c8\u306b\u3088\u3063\u3066\u306f\u6d88\u3048\u308b<\/td>\r\n              <td>\u30bb\u30eb\u306e\u80cc\u666f\u8272\u3092 <b class=\"fw-600\"><code>bgcolor<\/code> \u5c5e\u6027<\/b>\u3001\u7f6b\u7dda\u3092 <b class=\"fw-600\"><code>border<\/code> \u5c5e\u6027<\/b>\u3067\u51fa\u529b\u3067\u304d\u308b<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>\u9006\u5909\u63db<\/th>\r\n              <td>HTML \u2192 \u8868\u3078\u306e\u623b\u3057\u306b\u306f\u5bfe\u5fdc\u3057\u3066\u3044\u306a\u3044\u3053\u3068\u304c\u591a\u3044<\/td>\r\n              <td><b class=\"fw-600\">HTML \u2192 Markdown \u306e\u9006\u5909\u63db<\/b>\u306b\u5bfe\u5fdc\u3002\u65e2\u5b58\u306e <code>&lt;table&gt;<\/code> \u3092 Markdown \u306e\u8868\u306b\u623b\u305b\u308b<\/td>\r\n            <\/tr>\r\n          <\/tbody>\r\n        <\/table>\r\n        <p class=\"fz-ss mb-1r c-base-600\">\r\n          \u307e\u3068\u3081\u308b\u3068\u3001<b class=\"fw-600\">\u300c\u7d50\u5408\u30bb\u30eb\u3054\u3068\u8cbc\u308a\u4ed8\u3051\u308b\u3060\u3051\u3067\u5909\u63db\u3067\u304d\u3001Markdown \u3067\u305d\u306e\u307e\u307e\u76f4\u305b\u308b\u300d<\/b>\u70b9\u304c\u3001\u4ed6\u306e Excel\u2192HTML \u5909\u63db\u30c4\u30fc\u30eb\u3068\u306e\u4e3b\u306a\u9055\u3044\u3067\u3059\u3002\r\n        <\/p>\r\n\r\n        <hr class=\"separator my-1.5r\">\r\n\r\n        <h5 class=\"hdg-subexplanation fz-rg mb-0.5r\">\ud83d\udca1 \u57fa\u672c\u306e\u4f7f\u3044\u65b9<\/h5>\r\n        <ol class=\"fz-ss mb-1.5r\">\r\n          <li>Excel\u30fbGoogle \u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u3067\u3001\u5909\u63db\u3057\u305f\u3044\u7bc4\u56f2\u3092\u9078\u3093\u3067\u30b3\u30d4\u30fc\u3059\u308b<\/li>\r\n          <li>\u5de6\u5074\u306e\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u306b\u8cbc\u308a\u4ed8\u3051\u308b\uff08Markdown \u306e\u8868\u306b\u306a\u308a\u3001\u53f3\u5074\u306b HTML \u304c\u51fa\u529b\u3055\u308c\u3001\u81ea\u52d5\u3067\u30b3\u30d4\u30fc\u3055\u308c\u308b\uff09<\/li>\r\n          <li>\u6587\u5b57\u3092\u76f4\u3057\u305f\u3044\u3068\u304d\u306f\u3001\u5de6\u5074\u306e Markdown \u3092\u7de8\u96c6\u3057\u3066\u300c\u5909\u63db \u00bb\u300d\u3092\u30af\u30ea\u30c3\u30af<\/li>\r\n          <li>\u65e2\u5b58\u306e HTML \u306e\u8868\u3092 Markdown \u306b\u623b\u3057\u305f\u3044\u3068\u304d\u306f\u3001\u53f3\u5074\u306b HTML \u3092\u8cbc\u308a\u4ed8\u3051\u3066\u300c\u00ab \u5909\u63db\u300d\u3092\u30af\u30ea\u30c3\u30af<\/li>\r\n        <\/ol>\r\n\r\n        <hr class=\"separator my-1.5r\">\r\n\r\n        <h5 class=\"hdg-subexplanation fz-rg mb-0.5r\">\u2699\ufe0f \u3088\u304f\u4f7f\u3046\u30aa\u30d7\u30b7\u30e7\u30f3<\/h5>\r\n        <table class=\"table tbl-responsive fz-ss mb-1.5r\">\r\n          <thead>\r\n            <tr class=\"rung\">\r\n              <th style=\"min-width:12em;\">\u30aa\u30d7\u30b7\u30e7\u30f3<\/th>\r\n              <td>\u8aac\u660e\u30fb\u4f7f\u3044\u3069\u3053\u308d<\/td>\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody>\r\n            <tr class=\"rung\">\r\n              <th>1 \u884c\u76ee\u3092\u898b\u51fa\u3057\u884c\uff08&lt;thead&gt;\uff09\u306b\u3059\u308b<\/th>\r\n              <td>\u30b3\u30d4\u30fc\u3057\u305f\u7bc4\u56f2\u306e 1 \u884c\u76ee\u3092\u3001\u8868\u306e\u898b\u51fa\u3057\u884c\u306b\u3057\u307e\u3059\u3002\u898b\u51fa\u3057\u306e\u306a\u3044\u8868\u3092\u5909\u63db\u3059\u308b\u3068\u304d\u306f OFF \u306b\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>\u8cbc\u308a\u4ed8\u3051\u305f\u3089\u3059\u3050 HTML \u306b\u5909\u63db\u3059\u308b<\/th>\r\n              <td>\u8cbc\u308a\u4ed8\u3051\u3068\u540c\u6642\u306b HTML \u3078\u5909\u63db\u3057\u3001\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059\u3002Markdown \u3092\u76f4\u3057\u3066\u304b\u3089\u5909\u63db\u3057\u305f\u3044\u3068\u304d\u306f OFF \u306b\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>\u30bb\u30eb\u306e\u80cc\u666f\u8272\u3092 bgcolor \u5c5e\u6027\u3067\u6b8b\u3059<\/th>\r\n              <td>Excel \u3067\u5857\u308a\u3064\u3076\u3057\u305f\u30bb\u30eb\u306e\u8272\u3092\u3001<code>bgcolor=\"#E7E6E6\"<\/code> \u306e\u3088\u3046\u306b\u51fa\u529b\u3057\u307e\u3059\u3002HTML \u30e1\u30fc\u30eb\u3067\u8868\u306b\u8272\u3092\u4ed8\u3051\u305f\u3044\u3068\u304d\u306b\u3002\u8cbc\u308a\u4ed8\u3051\u305f\u5f8c\u306b\u884c\u30fb\u5217\u306e\u6570\u3092\u5909\u3048\u308b\u3068\u3001\u8272\u306f\u4ed8\u304d\u307e\u305b\u3093\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>\u30c6\u30fc\u30d6\u30eb\u8868\u73fe<\/th>\r\n              <td><code>table &gt; tr &gt; th\/td<\/code>\uff08\u8868\uff09\u3068\u3001<code>dl &gt; div &gt; dt\/dd<\/code>\uff08\u5b9a\u7fa9\u30ea\u30b9\u30c8\uff09\u304b\u3089\u9078\u3079\u307e\u3059\u3002\u5b9a\u7fa9\u30ea\u30b9\u30c8\u3067\u306f\u3001\u5404\u884c\u306e 1 \u5217\u76ee\u304c <code>&lt;dt&gt;<\/code>\u3001\u6b8b\u308a\u304c <code>&lt;dd&gt;<\/code> \u306b\u306a\u308a\u307e\u3059\u3002\u6599\u91d1\u8868\u3084\u4f1a\u793e\u6982\u8981\u306a\u3069\u3001\u9805\u76ee\u3068\u8aac\u660e\u306e 2 \u5217\u306e\u8868\u306b\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>&lt;table&gt; \u306b border \u5c5e\u6027\u3092\u4ed8\u3051\u308b<\/th>\r\n              <td><code>&lt;table border=\"1\"&gt;<\/code> \u306e\u3088\u3046\u306b\u3001\u8868\u5168\u4f53\u306b\u7f6b\u7dda\u306e\u5c5e\u6027\u3092\u4ed8\u3051\u307e\u3059\u3002CSS \u304c\u4f7f\u3048\u306a\u3044 HTML \u30e1\u30fc\u30eb\u3067\u3001\u7f6b\u7dda\u3092\u8868\u793a\u3057\u305f\u3044\u3068\u304d\u306b\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>&lt;table&gt; \u5404\u884c\u6700\u521d\u306e\u30bb\u30eb\u3092 &lt;th&gt; \u306b\u5909\u63db<\/th>\r\n              <td>\u5404\u884c\u306e 1 \u5217\u76ee\u3092\u898b\u51fa\u3057\u30bb\u30eb\uff08<code>&lt;th&gt;<\/code>\uff09\u306b\u3057\u307e\u3059\u3002\u7e26\u306b\u7d50\u5408\u3057\u305f\u30bb\u30eb\u306e\u4e0b\u306e\u884c\u306f\u30012 \u5217\u76ee\u304c <code>&lt;th&gt;<\/code> \u306b\u306a\u3089\u306a\u3044\u3088\u3046\u8abf\u6574\u3055\u308c\u307e\u3059\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>\u30bf\u30b0\u3078\u306e class \u81ea\u52d5\u4ed8\u4e0e<\/th>\r\n              <td>\u5909\u63db\u5f8c\u306e\u30bf\u30b0\u306b\u30c6\u30fc\u30de\u306e\u30af\u30e9\u30b9\u540d\u3092\u81ea\u52d5\u8ffd\u52a0\u3057\u307e\u3059\u3002\u305f\u3068\u3048\u3070 <code>table<\/code> \u30bf\u30b0\u306b <code>table my-0.75r<\/code> \u3092\u4ed8\u4e0e\u3059\u308b\u306a\u3069\u3001\u30c6\u30fc\u30de\u306b\u5408\u308f\u305b\u3066\u8a2d\u5b9a\u3092\u5909\u66f4\u3067\u304d\u307e\u3059\u3002<\/td>\r\n            <\/tr>\r\n          <\/tbody>\r\n        <\/table>\r\n\r\n        <hr class=\"separator my-1.5r\">\r\n\r\n        <h5 class=\"hdg-subexplanation fz-rg mb-0.5r\">\ud83c\udfaf \u6d3b\u7528\u4f8b<\/h5>\r\n        <table class=\"table tbl-responsive fz-ss mb-1.5r\">\r\n          <thead>\r\n            <tr class=\"rung\">\r\n              <th style=\"min-width:10em;\">\u30b7\u30fc\u30f3<\/th>\r\n              <td>\u4f7f\u3044\u65b9<\/td>\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody>\r\n            <tr class=\"rung\">\r\n              <th>WordPress \u306e\u8868<\/th>\r\n              <td>Excel \u3067\u4f5c\u3063\u305f\u6599\u91d1\u8868\u30fb\u30b9\u30da\u30c3\u30af\u8868\u3092\u8cbc\u308a\u4ed8\u3051\u3066\u3001\u51fa\u529b\u3055\u308c\u305f HTML \u3092\u30d6\u30ed\u30c3\u30af\u30a8\u30c7\u30a3\u30bf\u306e\u300c\u30ab\u30b9\u30bf\u30e0 HTML\u300d\u306b\u8cbc\u308b\u3060\u3051\u3002\u30af\u30e9\u30b9\u81ea\u52d5\u4ed8\u4e0e\u3067\u3001\u30c6\u30fc\u30de\u306e\u8868\u306e\u30c7\u30b6\u30a4\u30f3\u304c\u305d\u306e\u307e\u307e\u5f53\u305f\u308a\u307e\u3059\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>HTML \u30e1\u30fc\u30eb\u306e\u8868<\/th>\r\n              <td>\u300c\u80cc\u666f\u8272\u3092 bgcolor \u5c5e\u6027\u3067\u6b8b\u3059\u300d\u3068\u300cborder \u5c5e\u6027\u3092\u4ed8\u3051\u308b\u300d\u3092 ON \u306b\u3059\u308b\u3068\u3001CSS \u304c\u52b9\u304d\u306b\u304f\u3044\u30e1\u30fc\u30eb\u30bd\u30d5\u30c8\u3067\u3082\u8272\u3068\u7f6b\u7dda\u304c\u8868\u793a\u3055\u308c\u3084\u3059\u304f\u306a\u308a\u307e\u3059\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>Excel \u2192 Markdown<\/th>\r\n              <td>\u5de6\u5074\u306b\u51fa\u308b Markdown \u306e\u8868\u3092\u305d\u306e\u307e\u307e\u30b3\u30d4\u30fc\u3059\u308c\u3070\u3001GitHub\u30fbQiita\u30fbZenn\u30fbNotion \u306a\u3069\u306b\u8cbc\u308c\u308b Markdown \u306e\u8868\u3068\u3057\u3066\u4f7f\u3048\u307e\u3059\uff08\u30bb\u30eb\u306e\u7d50\u5408\u306f\u3053\u306e\u30c4\u30fc\u30eb\u72ec\u81ea\u306e\u66f8\u304d\u65b9\u3067\u3059\uff09\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>\u4f1a\u793e\u6982\u8981\u30fb\u6599\u91d1\u8868\u3092\u5b9a\u7fa9\u30ea\u30b9\u30c8\u306b<\/th>\r\n              <td>\u300c\u30c6\u30fc\u30d6\u30eb\u8868\u73fe\u300d\u3092 <code>dl &gt; div &gt; dt\/dd<\/code> \u306b\u3059\u308b\u3068\u30012 \u5217\u306e\u8868\u3092 <code>&lt;dl&gt;<\/code> \u3067\u51fa\u529b\u3067\u304d\u307e\u3059\u3002\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u3067\u6a2a\u306b\u30b9\u30af\u30ed\u30fc\u30eb\u3055\u305b\u305f\u304f\u306a\u3044\u8868\u306b\u3002<\/td>\r\n            <\/tr>\r\n            <tr class=\"rung\">\r\n              <th>\u65e2\u5b58\u306e\u8868\u3092 Markdown \u306b\u623b\u3059<\/th>\r\n              <td>\u30b5\u30a4\u30c8\u306e <code>&lt;table&gt;<\/code> \u3092\u53f3\u5074\u306b\u8cbc\u308a\u4ed8\u3051\u3066\u300c\u00ab \u5909\u63db\u300d\u3092\u62bc\u3059\u3068\u3001\u7d50\u5408\u30bb\u30eb\u3082\u542b\u3081\u3066 Markdown \u306e\u8868\u306b\u623b\u305b\u307e\u3059\u3002<\/td>\r\n            <\/tr>\r\n          <\/tbody>\r\n        <\/table>\r\n\r\n        <hr class=\"separator my-1.5r\">\r\n\r\n        <h5 class=\"hdg-subexplanation fz-rg mb-0.5r\">\ud83d\udccb \u8cbc\u308a\u4ed8\u3051\u306b\u3064\u3044\u3066<\/h5>\r\n        <p class=\"fz-ss mb-1r\">\r\n          Excel\uff08Windows\u30fbMac\uff09\u3001Google \u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306a\u3069\u304c\u30b3\u30d4\u30fc\u6642\u306b\u7528\u610f\u3059\u308b HTML \u304b\u3089\u3001\u30bb\u30eb\u306e\u6587\u5b57\u30fb\u7d50\u5408\u30fb\u80cc\u666f\u8272\u3092\u8aad\u307f\u53d6\u308a\u307e\u3059\u3002HTML \u304c\u306a\u3044\u3068\u304d\u306f\u3001\u30bf\u30d6\u533a\u5207\u308a\u306e\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u8aad\u307f\u53d6\u308a\u307e\u3059\u3002\u30bb\u30eb\u5185\u306e\u6539\u884c\uff08<kbd>Alt<\/kbd> + <kbd>Enter<\/kbd>\uff09\u306f <code>&lt;br&gt;<\/code> \u306b\u306a\u308a\u307e\u3059\u3002\r\n        <\/p>\r\n        <p class=\"fz-ss\">\r\n          \u8868\u3067\u306f\u306a\u3044\u3082\u306e\uff08\u666e\u901a\u306e\u6587\u7ae0\u3084\u30b3\u30fc\u30c9\uff09\u3092\u8cbc\u308a\u4ed8\u3051\u305f\u3068\u304d\u306f\u3001\u5909\u63db\u305b\u305a\u306b\u305d\u306e\u307e\u307e\u5165\u308a\u307e\u3059\u3002\u8cbc\u308a\u4ed8\u3051\u305f\u8868\u306e Markdown \u306f\u3001markdown-converter \u3068\u540c\u3058\u8a18\u6cd5\u306a\u306e\u3067\u3001\u898b\u51fa\u3057\u3084\u30ea\u30b9\u30c8\u306a\u3069\u3068\u7d44\u307f\u5408\u308f\u305b\u305f\u6587\u7ae0\u3082\u4e00\u7dd2\u306b\u5909\u63db\u3067\u304d\u307e\u3059\u3002\r\n        <\/p>\r\n\r\n      <\/div><!-- \/\/\/.box -->\r\n    <\/div><!-- \/\/\/.interior -->\r\n  <\/section><!-- \/\/\/.section -->\r\n\r\n\r\n  <!-- \u0f3b\u00a7\ud835\udc03\ud835\udc04\ud835\udc0f\ud835\udc00\ud835\udc11\ud835\udc13\ud835\udc0c\ud835\udc04\ud835\udc0d\ud835\udc13\u0f3a -->\r\n  <hr id=\"ch-Relation\" anchor \/>\r\n  <section class=\"sect-cnvtVkaA-Relation pt-3r\">\r\n    <div class=\"section__interior mx-auto scroll-fadeIn\">\r\n      <div class=\"hgroup-wrapper mb-0.5pc\">\r\n        <h5 class=\"hdg-relation fz-rg\"><span>\u95a2\u9023\u30c4\u30fc\u30eb<\/span><\/h5>\r\n      <\/div><!-- \/\/\/.hgroup -->\r\n\r\n      <ul class=\"shelf-wrapper_pc\" data-cols_pc=\"2\">\r\n        <li class=\"slide\">\r\n          <a href=\"https:\/\/code-plus.jp\/gp\/tools\/table-converter\/\" class=\"linkbox my-1.5r\">\r\n            <h4 class=\"linkbox-title fz-rg\">\u00a0|\uff08\u30d1\u30a4\u30d7\uff09\u3092Table\u30bf\u30b0\u306b\u5909\u63db\u30c4\u30fc\u30eb | Markdown\u8868\u5f62\u5f0f\u2192HTML\u81ea\u52d5\u5909\u63db<\/h4>\r\n            <picture class=\"linkbox-thumbnail\">\r\n              <img decoding=\"async\" width=\"300\" height=\"200\" src=\"https:\/\/code-plus.jp\/gp\/wp-content\/uploads\/ed713607a8503186c9303c0b0a88726c.png?ver=20261014141339\" alt=\"\u00a0|\uff08\u30d1\u30a4\u30d7\uff09\u3092Table\u30bf\u30b0\u306b\u5909\u63db\u30c4\u30fc\u30eb | Markdown\u8868\u5f62\u5f0f\u2192HTML\u81ea\u52d5\u5909\u63db\" loading=\"lazy\" \/>\r\n            <\/picture>\r\n            <span class=\"linkbox-excerpt\">\u30d1\u30a4\u30d7\u533a\u5207\u308a\u306e\u30c6\u30ad\u30b9\u30c8\u3092HTML\u306etable\u30bf\u30b0\u306b\u81ea\u52d5\u5909\u63db\u3002Markdown\u8a18\u6cd5\u304b\u3089WordPress\u6295\u7a3f\u7528HTML\u3001\u6280\u8853\u6587\u66f8\u4f5c\u6210\u3001CMS\u6295\u7a3f\u306b\u6700\u9069\u3002\u30af\u30e9\u30b9\u81ea\u52d5\u4ed8\u4e0e\u3067\u5b9f\u52d9\u5bfe\u5fdc\u3002\r\n            <\/span>\r\n          <\/a>\r\n        <\/li>\r\n        <li class=\"slide\">\r\n          <a href=\"https:\/\/code-plus.jp\/gp\/tools\/deline-converter\/\" class=\"linkbox my-1.5r\">\r\n            <h4 class=\"linkbox-title fz-rg\">\u00a0|\uff08\u30d1\u30a4\u30d7\uff09\u3092Dl\u30bf\u30b0\u306b\u5909\u63db\u30c4\u30fc\u30eb - \u5b9a\u7fa9\u30ea\u30b9\u30c8\u30fb\u7528\u8a9e\u96c6HTML\u81ea\u52d5\u751f\u6210<\/h4>\r\n            <picture class=\"linkbox-thumbnail\">\r\n              <img decoding=\"async\" width=\"300\" height=\"200\" src=\"https:\/\/code-plus.jp\/gp\/wp-content\/uploads\/75b351e079a1d1d3abad38372152ff91.png?ver=20261014141339\" alt=\"\u00a0|\uff08\u30d1\u30a4\u30d7\uff09\u3092Dl\u30bf\u30b0\u306b\u5909\u63db\u30c4\u30fc\u30eb - \u5b9a\u7fa9\u30ea\u30b9\u30c8\u30fb\u7528\u8a9e\u96c6HTML\u81ea\u52d5\u751f\u6210\" loading=\"lazy\" \/>\r\n            <\/picture>\r\n            <span class=\"linkbox-excerpt\">\u30d1\u30a4\u30d7\u533a\u5207\u308a\u30c6\u30ad\u30b9\u30c8\u3092HTML\u306e\u5b9a\u7fa9\u30ea\u30b9\u30c8\uff08dl\/dt\/dd\uff09\u306b\u81ea\u52d5\u5909\u63db\u3002\u7528\u8a9e\u96c6\u3001\u4ed5\u69d8\u66f8\u3001FAQ\u3001\u5546\u54c1\u30b9\u30da\u30c3\u30af\u8868\u306e\u4f5c\u6210\u306b\u6700\u9069\u3002Markdown\u5bfe\u5fdc\u3067\u5b9f\u52d9\u3092\u52b9\u7387\u5316\u3002\r\n            <\/span>\r\n          <\/a>\r\n        <\/li>\r\n      <\/ul><!-- \/\/\/.shelf -->\r\n    <\/div><!-- \/\/\/.interior -->\r\n  <\/section><!-- \/\/\/.section -->\r\n\r\n\r\n\r\n\r\n  <!-- \u0f3b.mediano\uff08\u4f59\u767d\u8abf\u6574\uff1apage\u4e0b\uff09\u0f3a -->\r\n  <hr class=\"spacer-mediano\" \/>\r\n\r\n<\/div><!-- \/\/\/\u25b2.page  -->\r\n\r\n\r\n\r\n\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/marked@18.0.13\/lib\/marked.umd.min.js\"><\/script>\r\n<script src=\"https:\/\/unpkg.com\/turndown@7.2.4\/dist\/turndown.js\"><\/script>\r\n<script>\r\n  \/\/ ============================================================================\r\n  \/\/ \u3010STEP5.4\u3011\u65e5\u672c\u8a9e\uff08CJK\uff09\u5f37\u8abf\u8a18\u53f7\uff08*\/**\/***\uff09\u306e\u672a\u8a8d\u8b58\u30d0\u30b0\u3092\u4fee\u6b63\uff0b\u65e2\u5b58\u6a5f\u80fd\u4e00\u5f0f\r\n  \/\/   \u30fbCommonMark\u4ed5\u69d8\u30d0\u30b0\uff1a\u5f37\u8abf\u8a18\u53f7\u306e\u5185\u5074\u304c\u65e5\u672c\u8a9e\u306e\u7d04\u7269\uff08\u300c\u300d\uff08\uff09\u3002\u3001\u7b49\uff09\u3001\r\n  \/\/     \u5916\u5074\u304c\u305d\u308c\u4ee5\u5916\u306e\u6587\u5b57\uff08\uff1d\u7d04\u7269\u3067\u3082\u7a7a\u767d\u3067\u3082\u306a\u3044\u6587\u5b57\uff09\u306e\u5834\u5408\u3001\u958b\u59cb\u30fb\u7d42\u4e86\u306e\r\n  \/\/     \u3069\u3061\u3089\u306e\u8a18\u53f7\u3068\u3057\u3066\u3082\u8a8d\u8b58\u3055\u308c\u306a\u3044\u30d0\u30b0\u3078\u306e\u5bfe\u5fdc\u3002\r\n  \/\/     \uff08\u30a2\u30b9\u30bf\u30ea\u30b9\u30af\u7cfb(*\/**\/***)\u306e\u307f\u5bfe\u5fdc\u3002\r\n  \/\/     \u30a2\u30f3\u30c0\u30fc\u30b9\u30b3\u30a2\u7cfb(_\/__\/___)\u306f\u3001CommonMark\u672c\u6765\u306e\u4ed5\u69d8\u901a\u308a\u3001\u975e\u5bfe\u5fdc\u306e\u307e\u307e\uff09\r\n  \/\/   \u30fb\u5b9f\u88c5\u65b9\u91dd\uff1amarked\u516c\u5f0f\u306e\u62e1\u5f35\u30dd\u30a4\u30f3\u30c8\uff08tokenizer.emStrong\u306e\u5dee\u3057\u66ff\u3048\uff09\u306e\u307f\u3092\u4f7f\u3044\u3001\r\n  \/\/     \u6587\u5b57\u5217\u306e\u66f8\u304d\u63db\u3048\uff08\u5185\u90e8\u306emaskedSrc\u30de\u30b9\u30af\u51e6\u7406\uff09\u306b\u306f\u4e00\u5207\u624b\u3092\u5165\u308c\u306a\u3044\u3002\r\n  \/\/     \u2192 \u524d\u56de\u306e\u4f8b\u5916\uff08del\uff1d\u6253\u3061\u6d88\u3057\u7dda\u5074\u3067\"Cannot read properties of undefined\"\uff09\u306f\u3001\r\n  \/\/     \u3000\u30de\u30b9\u30af\u5f8c\u306e\u6587\u5b57\u5217\u9577\u304c\u5143\u306e\u6587\u5b57\u5217\u3068\u98df\u3044\u9055\u3044\u3001\u5185\u90e8\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a08\u7b97\u304c\r\n  \/\/     \u3000\u30ba\u30ec\u305f\u3053\u3068\u304c\u539f\u56e0\u3068\u63a8\u5b9a\u3055\u308c\u308b\uff08marked\u516c\u5f0f\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u985e\u4f3c\u306e\u65e2\u77e5\u30d0\u30b0\r\n  \/\/     \u3000\uff08PR #4044\uff09\u3068\u540c\u3058\u75c7\u72b6\uff09\u3002\u4eca\u56de\u306f\u30de\u30b9\u30af\u51e6\u7406\u3092\u4f7f\u308f\u305a\u3001\u6b63\u898f\u8868\u73fe\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\r\n  \/\/     \u3000\u4e00\u6642\u7684\u306a\u5dee\u3057\u66ff\u3048\u30fb\u5fa9\u5143\u306e\u307f\u3067\u5b8c\u7d50\u3055\u305b\u3001\u5bfe\u8c61\u3082\u30a2\u30b9\u30bf\u30ea\u30b9\u30af(*)\u958b\u59cb\u6642\u306b\u9650\u5b9a\r\n  \/\/     \u3000\u3059\u308b\u3053\u3068\u3067\u3001_\uff08\u30a2\u30f3\u30c0\u30fc\u30b9\u30b3\u30a2\uff09\u3084del\uff08\u6253\u3061\u6d88\u3057\u7dda\uff09\u306e\u51e6\u7406\u306b\u306f\u4e00\u5207\u5f71\u97ff\u3057\u306a\u3044\u3002\r\n  \/\/   \u30fb\u3053\u306e\u30b5\u30a4\u30c8\u306e\u672c\u6587\u7d4c\u7531\u3067\u914d\u4fe1\u3059\u308b\u3068\u3001\u30bd\u30fc\u30b9\u4e2d\u306e\u751f\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u6587\u5b57\u304c\r\n  \/\/     \u3059\u3079\u3066\u5931\u308f\u308c\u308b\uff08WordPress\u5074\u306e\u4f55\u3089\u304b\u306e\u51e6\u7406\u3068\u63a8\u6e2c\u3001\u8981\u8abf\u67fb\uff09\u3002\r\n  \/\/     \u3053\u308c\u306b\u3088\u308a\u6b63\u898f\u8868\u73fe\u30ea\u30c6\u30e9\u30eb\u306e\u6539\u884c\uff0f\u7a7a\u767d\uff0f\u5358\u8a9e\u5883\u754c\u30a8\u30b9\u30b1\u30fc\u30d7\u304c\u58ca\u308c\u3001\r\n  \/\/     \u300cInvalid regular expression flags\u300d\u3067 script \u5168\u4f53\u304c\u8aad\u307f\u8fbc\u307f\u4e0d\u80fd\u306b\u306a\u3063\u3066\u3044\u305f\u3002\r\n  \/\/   \u30fb\u5bfe\u7b56\uff1a\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u304c\u5fc5\u8981\u306a\u7b87\u6240\u306f String.fromCharCode() \u3067\u5b9f\u884c\u6642\u306b\u69cb\u7bc9\u3057\u3001\r\n  \/\/     \u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u4e0a\u306b\u306f\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u6587\u5b57\u3092\u4e00\u5207\u66f8\u304b\u306a\u3044\uff08NL\/BS \u5b9a\u6570\u3092\u53c2\u7167\uff09\u3002\r\n  \/\/   \u30fb\u3042\u308f\u305b\u3066\u3001\u30b3\u30e1\u30f3\u30c8\u4e2d\u306b\u6b8b\u3063\u3066\u3044\u305f\u751f\u306e \uff3bamazon ...\uff3d \u304c\u5b9f\u969b\u306eAmazon\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\r\n  \/\/     \u3068\u3057\u3066\u5c55\u958b\u3055\u308c\u3066\u3057\u307e\u3063\u3066\u3044\u305f\uff08\u958b\u304d\u30d6\u30e9\u30b1\u30c3\u30c8\u306e\u76f4\u5f8c\u304c\u767b\u9332\u6e08\u307f\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u540d\u3060\u3063\u305f\u305f\u3081\uff09\u3002\r\n  \/\/     \u5168\u89d2\u30d6\u30e9\u30b1\u30c3\u30c8\u306b\u7f6e\u304d\u63db\u3048\u6e08\u307f\u3002\r\n  \/\/ ============================================================================\r\n\r\n  \/\/ marked \u30aa\u30d7\u30b7\u30e7\u30f3\u65b9\u91dd\uff08\u3053\u3053\u3067\u4e00\u5143\u7ba1\u7406\uff09\r\n  \/\/ breaks \u306f\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3067ON\/OFF\u3067\u304d\u308b\u305f\u3081\u3001\u547c\u3073\u51fa\u3057\u306e\u90fd\u5ea6\u30c1\u30a7\u30c3\u30af\u72b6\u614b\u3092\u8aad\u3080\u3002\r\n  \/\/ gfm \u306f\u5e38\u6642 true\uff08\u8868\u30fb\u6253\u6d88\u3057\u7dda\u30fb\u81ea\u52d5\u30ea\u30f3\u30af\u7b49\u3092\u6709\u52b9\u5316\u3002\u8868\u30fb\u30ea\u30b9\u30c8\u306f\u5225\u9014 tokenizer \u7121\u52b9\u5316\u3067\u72ec\u81ea\u5b9f\u88c5\u306b\u4e00\u672c\u5316\uff09\r\n  function getMarkedOptions() {\r\n    return {\r\n      gfm: true,\r\n      breaks: document.getElementById('convertMd2Breaks').checked,  \/\/ \u5358\u4e00\u306e\u6539\u884c\u3092 <br> \u306b\u3059\u308b\u304b\u306e\u8a2d\u5b9a\r\n    };\r\n  }\r\n\r\n  \/\/ \u30bd\u30fc\u30b9\u4e2d\u306b\u751f\u306e\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u6587\u5b57\u3084\u534a\u89d2\u30d6\u30e9\u30b1\u30c3\u30c8\u3092\u66f8\u304b\u306a\u3044\u305f\u3081\u306e\u5b9f\u884c\u6642\u5b9a\u6570\u3002\r\n  \/\/ \u30fb\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5 \u2026 \u3053\u306e\u30b5\u30a4\u30c8\u7d4c\u7531\u3067\u914d\u4fe1\u3059\u308b\u3068\u5931\u308f\u308c\u308b\u305f\u3081\u3001\r\n  \/\/   \u6539\u884c\uff0f\u7a7a\u767d\uff0f\u5358\u8a9e\u5883\u754c\u30a8\u30b9\u30b1\u30fc\u30d7\u304c\u5fc5\u8981\u306a\u7b87\u6240\u306f\u3059\u3079\u3066\u3053\u306e\u5b9a\u6570\u304b\u3089\u7d44\u307f\u7acb\u3066\u308b\r\n  \/\/ \u30fb\u534a\u89d2\u30d6\u30e9\u30b1\u30c3\u30c8 \u2026 WordPress \u306e\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u8aa4\u7206\u9632\u6b62\u306e\u305f\u3081\uff08\u5f93\u6765\u304b\u3089\u306e\u5bfe\u7b56\u3092\u7d71\u4e00\uff09\r\n  const NL = String.fromCharCode(10); \/\/ \u6539\u884c\r\n  const BS = String.fromCharCode(92); \/\/ \u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\r\n  const OB = String.fromCharCode(91); \/\/ [\r\n  const CB = String.fromCharCode(93); \/\/ ]\r\n  const TAB = String.fromCharCode(9); \/\/ \u30bf\u30d6\r\n\r\n  \/\/ \u30c6\u30fc\u30d6\u30eb\u306f\u72ec\u81ea\u5b9f\u88c5\uff08convertTagTables\uff09\u306b\u4e00\u672c\u5316\u3059\u308b\u305f\u3081\u3001\r\n  \/\/ marked \u5074\u306e\u30c6\u30fc\u30d6\u30eb\u8a8d\u8b58\u3060\u3051\u3092\u63e1\u308a\u3064\u3076\u3059\uff08tokenizer \u304c undefined \u3092\u8fd4\u3059\u3068\r\n  \/\/ marked \u306f\u305d\u306e\u30c8\u30fc\u30af\u30ca\u30a4\u30b6\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u3001\u4ed6\u306e GFM \u62e1\u5f35\u306b\u306f\u5f71\u97ff\u3057\u306a\u3044\uff09\r\n  marked.use({ tokenizer: { table() { return undefined; } } });\r\n\r\n  \/\/ \u30ea\u30b9\u30c8\u3082\u72ec\u81ea\u5b9f\u88c5\uff08protectLists\uff09\u306b\u4e00\u672c\u5316\u3059\u308b\u305f\u3081\u3001marked \u5074\u306e\u30ea\u30b9\u30c8\u8a8d\u8b58\u3092\u7121\u52b9\u5316\u3002\r\n  \/\/ tight\/loose\uff08\u9805\u76ee\u9593\u306e\u7a7a\u884c\uff09\u306e\u5224\u5b9a\u3092\u3084\u3081\u3001\u300c\u7a7a\u884c\u307e\u305f\u306f\u8a18\u53f7\u306e\u5207\u308a\u66ff\u308f\u308a\u3067\r\n  \/\/ <ul>\/<ol> \u3092\u5206\u5272\u3059\u308b\u300d\u3068\u3044\u3046\u30b7\u30f3\u30d7\u30eb\u306a\u898f\u5247\u306b\u7f6e\u304d\u63db\u3048\u308b\uff08<li> \u306b <p> \u306f\u4ed8\u3051\u306a\u3044\uff09\u3002\r\n  marked.use({ tokenizer: { list() { return undefined; } } });\r\n\r\n  \/\/ \u2500\u2500 \u65e5\u672c\u8a9e\uff08CJK\uff09\u5f37\u8abf\u8a18\u53f7\u306e\u672a\u8a8d\u8b58\u30d0\u30b0\u4fee\u6b63 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  \/\/ \u300c*\u300d\u958b\u59cb\u6642\u306e\u307f\u5bfe\u8c61\u3002marked\u5185\u90e8\u306e\u5171\u6709\u6b63\u898f\u8868\u73fe\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u3001\r\n  \/\/ \u547c\u3073\u51fa\u3057\u306e\u76f4\u524d\u306b\u4e00\u6642\u7684\u306b\u5dee\u3057\u66ff\u3048\u3066\u76f4\u5f8c\u306b\u5fa9\u5143\u3059\u308b\u3060\u3051\u3067\u3001\u6587\u5b57\u5217\u5074\u306e\r\n  \/\/ \u66f8\u304d\u63db\u3048\uff08\u30de\u30b9\u30af\u51e6\u7406\uff09\u306b\u306f\u4e00\u5207\u89e6\u308c\u306a\u3044\u8a2d\u8a08\uff08del\u30fb_ \u306b\u306f\u5f71\u97ff\u3057\u306a\u3044\uff09\u3002\r\n  (function () {\r\n    \/\/ \u65e5\u672c\u8a9e\uff08CJK\uff09\u3068\u898b\u306a\u3059\u6587\u5b57\u7bc4\u56f2\u3092\u3001\u5b9f\u969b\u306e\u30ea\u30c6\u30e9\u30eb\u6587\u5b57\u3092\u4e26\u3079\u3066\u69cb\u7bc9\u3059\u308b\r\n    \/\/ \uff08\u6b63\u898f\u8868\u73fe\u306eu\u30a8\u30b9\u30b1\u30fc\u30d7\u8868\u8a18\u306f\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u304c\u5fc5\u8981\u306a\u305f\u3081\u4f7f\u308f\u306a\u3044\uff09\u3002\r\n    function buildCjkCharClass() {\r\n      const cc = String.fromCharCode;\r\n      const cp = String.fromCodePoint;\r\n      return (\r\n        cc(0x3000) + '-' + cc(0x303f) + \/\/ CJK\u306e\u8a18\u53f7\u30fb\u53e5\u8aad\u70b9\uff08\u300c\u300d\uff08\uff09\u3002\u3001\u301c\u306a\u3069\uff09\r\n        cc(0x3041) + '-' + cc(0x3096) + \/\/ \u3072\u3089\u304c\u306a\r\n        cc(0x30a0) + '-' + cc(0x30ff) + \/\/ \u30ab\u30bf\u30ab\u30ca\r\n        cc(0x3400) + '-' + cc(0x4dbf) + \/\/ CJK\u7d71\u5408\u6f22\u5b57\u62e1\u5f35A\r\n        cc(0x4e00) + '-' + cc(0x9fff) + \/\/ CJK\u7d71\u5408\u6f22\u5b57\r\n        cc(0xf900) + '-' + cc(0xfaff) + \/\/ CJK\u4e92\u63db\u6f22\u5b57\r\n        cc(0xff00) + '-' + cc(0xffef) + \/\/ \u534a\u89d2\u30fb\u5168\u89d2\u5f62\r\n        cc(0xac00) + '-' + cc(0xd7a3) + \/\/ \u30cf\u30f3\u30b0\u30eb\u97f3\u7bc0\r\n        cc(0x1100) + '-' + cc(0x11ff) + \/\/ \u30cf\u30f3\u30b0\u30eb\u5b57\u6bcd\r\n        cc(0x2018) + cc(0x2019) + cc(0x201c) + cc(0x201d) + \/\/ \u66f2\u7dda\u5f15\u7528\u7b26\uff08\u2018\u2019\u201c\u201d\uff09\r\n        cp(0x20000) + '-' + cp(0x2ffff)  \/\/ \u8ffd\u52a0\u6f22\u5b57\u9762\uff08\u7a00\u306a\u6f22\u5b57\uff09\r\n      );\r\n    }\r\n    const CJK_CLASS = buildCjkCharClass();\r\n    const originalEmStrong = marked.Tokenizer.prototype.emStrong;\r\n\r\n    \/\/ \u5bfe\u8c61\u306e\u6b63\u898f\u8868\u73fe\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\uff08gfm \/ breaks \u306e\u5404\u8a2d\u5b9a\u3054\u3068\u306b1\u56de\u305a\u3064\uff09\u306b\u3001\r\n    \/\/ CJK\u5bfe\u5fdc\u7248\u306e\u6b63\u898f\u8868\u73fe\u3092\u7528\u610f\u3057\u3066\u4ed5\u8fbc\u3093\u3067\u304a\u304f\uff08\u521d\u56de\u547c\u3073\u51fa\u3057\u6642\u306e\u307f\u5b9f\u884c\uff09\u3002\r\n    function ensurePatched(inline) {\r\n      if (inline.cjkPatchDone) return;\r\n\r\n      \/\/ \u958b\u59cb\u8a18\u53f7\u5074\uff1a\u300c\u5916\u5074\u304c\u7d04\u7269\u30fb\u7a7a\u767d\u306e\u3069\u3061\u3089\u3067\u3082\u306a\u3044\u6587\u5b57\u300d\u3092\u5224\u5b9a\u3059\u308b\r\n      \/\/ punctuation \u6b63\u898f\u8868\u73fe\u306b\u3001CJK\u6587\u5b57\u3082\u8a31\u5bb9\u7bc4\u56f2\u3068\u3057\u3066\u8ffd\u52a0\u3059\u308b\u3002\r\n      const punctNeedle = OB + BS + 's' + BS + 'p{P}' + BS + 'p{S}' + CB; \/\/ \u5143\u30d1\u30bf\u30fc\u30f3\u76f8\u5f53\uff08\u7a7a\u767d\u307e\u305f\u306f\u8a18\u53f71\u6587\u5b57\uff09\r\n      const origPunct = inline.punctuation;\r\n      const widenedPunctSrc = origPunct.source.replace(\r\n        punctNeedle,\r\n        '(?:' + punctNeedle + '|' + OB + CJK_CLASS + CB + ')'\r\n      );\r\n      inline.cjkWidenedPunct = (widenedPunctSrc !== origPunct.source)\r\n        ? new RegExp(widenedPunctSrc, origPunct.flags)\r\n        : origPunct; \/\/ \u60f3\u5b9a\u3057\u305f\u7b87\u6240\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306f\u5143\u306e\u307e\u307e\uff08\u5b89\u5168\u5074\u306b\u5012\u3059\uff09\r\n\r\n      \/\/ \u7d42\u4e86\u8a18\u53f7\u5074\uff1a\u300c\u5185\u5074\u304c\u7d04\u7269\u3001\u5916\u5074\u304c\u7a7a\u767d\u307e\u305f\u306f\u884c\u672b\u300d\u3092\u7d42\u4e86\u3068\u307f\u306a\u3059\u6761\u4ef6\u306b\u3001\r\n      \/\/ \u300c\u5916\u5074\u304cCJK\u6587\u5b57\u300d\u3082\u52a0\u3048\u308b\uff08emStrongRDelimAst \u306e\u5148\u8aad\u307f\u90e8\u5206\u3092\u62e1\u5f35\uff09\u3002\r\n      const astNeedle = '(?=' + OB + BS + 's' + CB + '|$)'; \/\/ \u5143\u30d1\u30bf\u30fc\u30f3\u76f8\u5f53\uff08\u5148\u8aad\u307f\uff1a\u7a7a\u767d\u307e\u305f\u306f\u884c\u672b\uff09\r\n      const origAst = inline.emStrongRDelimAst;\r\n      const widenedAstSrc = origAst.source.replace(\r\n        astNeedle,\r\n        '(?=' + OB + BS + 's' + CJK_CLASS + CB + '|$)'\r\n      );\r\n      if (widenedAstSrc !== origAst.source) {\r\n        inline.emStrongRDelimAst = new RegExp(widenedAstSrc, origAst.flags);\r\n      }\r\n      inline.cjkPatchDone = true;\r\n    }\r\n\r\n    marked.use({\r\n      tokenizer: {\r\n        emStrong(src, maskedSrc, prevChar) {\r\n          if (src.charAt(0) !== '*') {\r\n            \/\/ \u30a2\u30f3\u30c0\u30fc\u30b9\u30b3\u30a2\u306f\u5143\u306e\u6319\u52d5\u306e\u307e\u307e\uff08CommonMark\u4ed5\u69d8\u901a\u308a\u3001CJK\u5bfe\u5fdc\u306e\u5bfe\u8c61\u5916\uff09\r\n            return originalEmStrong.call(this, src, maskedSrc, prevChar || '');\r\n          }\r\n          const inline = this.rules.inline;\r\n          ensurePatched(inline);\r\n          const savedPunct = inline.punctuation;\r\n          inline.punctuation = inline.cjkWidenedPunct;\r\n          try {\r\n            return originalEmStrong.call(this, src, maskedSrc, prevChar || '');\r\n          } finally {\r\n            inline.punctuation = savedPunct; \/\/ \u5fc5\u305a\u5143\u306b\u623b\u3059\uff08del\u30fb_ \u306b\u5f71\u97ff\u3092\u6b8b\u3055\u306a\u3044\uff09\r\n          }\r\n        }\r\n      }\r\n    });\r\n  })();\r\n\r\n  \/\/ \u2500\u2500 \u4e0a\u4ed8\u304d\u30fb\u4e0b\u4ed8\u304d\u30fb\u30cf\u30a4\u30e9\u30a4\u30c8\u30fb\u633f\u5165\u30fb\u524a\u9664\uff08marked \u62e1\u5f35\uff09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  \/\/   H~2~O        \u2192 H<sub>2<\/sub>O       \uff08Pandoc\u30fbmarkdown-it \u3068\u540c\u3058\u3002\u4e2d\u306e\u7a7a\u767d\u306f\u300c\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\uff0b\u7a7a\u767d\u300d\uff09\r\n  \/\/   2^10^        \u2192 2<sup>10<\/sup>\r\n  \/\/   ==\u6587\u5b57==     \u2192 <mark>\u6587\u5b57<\/mark>     \uff08Pandoc \u306e +mark\u30fbmarkdown-it \u3068\u540c\u3058\uff09\r\n  \/\/   ++\u6587\u5b57++     \u2192 <ins>\u6587\u5b57<\/ins>       \uff08markdown-it \u3068\u540c\u3058\uff09\r\n  \/\/   --\u6587\u5b57--     \u2192 <del>\u6587\u5b57<\/del>\r\n  \/\/   ~~\u6587\u5b57~~     \u2192 <s>\u6587\u5b57<\/s>           \uff08\u6253\u3061\u6d88\u3057\u7dda\u3002GFM \u306e ~ 1 \u500b\u306e\u6253\u3061\u6d88\u3057\u7dda\u306f\u4e0b\u4ed8\u304d\u306b\u306a\u308b\uff09\r\n  \/\/   \u2022\u6587\u5b57\u2022       \u2192 <small>\u6587\u5b57<\/small>   \uff08\u3053\u306e\u30c4\u30fc\u30eb\u72ec\u81ea\u3002\u6ce8\u8a18\u30fb\u88dc\u8db3\u7528\uff09\r\n  \/\/ == ++ -- \u306f\u3001C++ \u3084 a==b \u306e\u3088\u3046\u306b\u82f1\u6570\u5b57\u306e\u76f4\u5f8c\u306b\u7d9a\u304f\u3082\u306e\u3001=== --- \u306e\u3088\u3046\u306b\r\n  \/\/ \u540c\u3058\u8a18\u53f7\u304c 3 \u500b\u4ee5\u4e0a\u4e26\u3076\u3082\u306e\uff08\u30c6\u30fc\u30d6\u30eb\u306e\u533a\u5207\u308a\u884c |---| \u306a\u3069\uff09\u306f\u5bfe\u8c61\u306b\u3057\u306a\u3044\u3002\r\n  (function () {\r\n    const ALNUM = OB + 'A-Za-z0-9' + CB;\r\n    const escapedSpaceRe = new RegExp(BS + BS + ' ', 'g');\r\n    const alnumRe = new RegExp(ALNUM);\r\n\r\n    \/\/ \u76f4\u524d\u306e\u30c8\u30fc\u30af\u30f3\u306e\u6700\u5f8c\u306e\u6587\u5b57\uff08\u82f1\u6570\u5b57\u3084\u540c\u3058\u8a18\u53f7\u306e\u76f4\u5f8c\u304b\u3069\u3046\u304b\u306e\u5224\u5b9a\u7528\uff09\r\n    function prevCharOf(tokens) {\r\n      const t = tokens && tokens.length ? tokens[tokens.length - 1] : null;\r\n      return (t && t.raw) ? t.raw.charAt(t.raw.length - 1) : '';\r\n    }\r\n\r\n    \/\/ \u4e0a\u4ed8\u304d\u30fb\u4e0b\u4ed8\u304d\uff1a\u4e2d\u306f\u300c\u7a7a\u767d\u4ee5\u5916\u300d\u307e\u305f\u306f\u300c\u30a8\u30b9\u30b1\u30fc\u30d7\u3055\u308c\u305f\u6587\u5b57\u300d\r\n    function scriptExtension(name, tag, mark, extraRe) {\r\n      const m = BS + mark;\r\n      const re = new RegExp('^' + m + extraRe + '((?:' + BS + BS + '.|' + OB + '^' + m + BS + 's' + BS + BS + CB + ')+)' + m + (mark === '~' ? '(?!~)' : ''));\r\n      return {\r\n        name: name,\r\n        level: 'inline',\r\n        start: function (src) {\r\n          const i = src.indexOf(mark);\r\n          return i === -1 ? undefined : i;\r\n        },\r\n        tokenizer: function (src) {\r\n          const match = re.exec(src);\r\n          if (!match) return undefined;\r\n          const text = match[1].replace(escapedSpaceRe, ' ');\r\n          return { type: name, raw: match[0], text: text, tokens: this.lexer.inlineTokens(text) };\r\n        },\r\n        renderer: function (token) {\r\n          return '<' + tag + '>' + this.parser.parseInline(token.tokens) + '<\/' + tag + '>';\r\n        }\r\n      };\r\n    }\r\n\r\n    \/\/ == ++ -- \uff1a\u524d\u5f8c\u304c\u7a7a\u767d\u3067\u306a\u3044\u6587\u5b57\u5217\u3092 2 \u500b\u306e\u8a18\u53f7\u3067\u56f2\u3080\r\n    function pairExtension(name, tag, ch) {\r\n      const c = BS + ch;\r\n      const pair = c + c;\r\n      const re = new RegExp('^' + pair + '(?!' + OB + c + BS + 's' + CB + ')(' + OB + BS + 's' + BS + 'S' + CB + '*?' + OB + '^' + c + BS + 's' + CB + ')' + pair + '(?!' + c + ')');\r\n      const startRe = new RegExp('(?<!' + OB + 'A-Za-z0-9' + c + CB + ')' + pair + '(?!' + OB + c + BS + 's' + CB + ')');\r\n      return {\r\n        name: name,\r\n        level: 'inline',\r\n        start: function (src) {\r\n          const i = src.search(startRe);\r\n          return i === -1 ? undefined : i;\r\n        },\r\n        tokenizer: function (src, tokens) {\r\n          const prev = prevCharOf(tokens);\r\n          if (prev === ch || alnumRe.test(prev)) return undefined;\r\n          const match = re.exec(src);\r\n          if (!match) return undefined;\r\n          return { type: name, raw: match[0], text: match[1], tokens: this.lexer.inlineTokens(match[1]) };\r\n        },\r\n        renderer: function (token) {\r\n          return '<' + tag + '>' + this.parser.parseInline(token.tokens) + '<\/' + tag + '>';\r\n        }\r\n      };\r\n    }\r\n\r\n    \/\/ \u2022\u6587\u5b57\u2022 \u2192 <small>\u6587\u5b57<\/small>\uff08\u3053\u306e\u30c4\u30fc\u30eb\u72ec\u81ea\u306e\u8a18\u6cd5\u3002\u6ce8\u8a18\u30fb\u88dc\u8db3\u30fb\u4f46\u3057\u66f8\u304d\u7528\uff09\r\n    \/\/ \u30fb1 \u500b\u306e \u2022 \u3067\u56f2\u3080\u3002\u958b\u304d\u306e\u76f4\u5f8c\u3068\u9589\u3058\u306e\u76f4\u524d\u304c\u7a7a\u767d\u306e\u3082\u306e\u306f\u5bfe\u8c61\u306b\u3057\u306a\u3044\r\n    \/\/   \uff08\u8cbc\u308a\u4ed8\u3051\u305f\u7b87\u6761\u66f8\u304d\u300c\u2022 \u9805\u76ee\u300d\u3084\u3001\u533a\u5207\u308a\u306e\u8a18\u53f7\u300cA \u2022 B\u300d\u3092\u8aa4\u5909\u63db\u3057\u306a\u3044\u305f\u3081\uff09\r\n    \/\/ \u30fb\u82f1\u6570\u5b57\u3084 \u2022 \u306e\u76f4\u5f8c\u306e \u2022 \u306f\u3001\u958b\u304d\u3068\u3057\u3066\u6271\u308f\u306a\u3044\uff08HTML\u2022CSS\u2022JS \u306a\u3069\uff09\r\n    function smallExtension() {\r\n      const mark = '\u2022';\r\n      const re = new RegExp('^' + mark + '(?!' + OB + mark + BS + 's' + CB + ')(' + OB + '^' + mark + CB + '*?' + OB + '^' + mark + BS + 's' + CB + ')' + mark);\r\n      const startRe = new RegExp('(?<!' + OB + 'A-Za-z0-9' + mark + CB + ')' + mark + '(?!' + OB + mark + BS + 's' + CB + ')');\r\n      return {\r\n        name: 'small',\r\n        level: 'inline',\r\n        start: function (src) {\r\n          const i = src.search(startRe);\r\n          return i === -1 ? undefined : i;\r\n        },\r\n        tokenizer: function (src, tokens) {\r\n          const prev = prevCharOf(tokens);\r\n          if (prev === mark || alnumRe.test(prev)) return undefined;\r\n          const match = re.exec(src);\r\n          if (!match) return undefined;\r\n          return { type: 'small', raw: match[0], text: match[1], tokens: this.lexer.inlineTokens(match[1]) };\r\n        },\r\n        renderer: function (token) {\r\n          return '<small>' + this.parser.parseInline(token.tokens) + '<\/small>';\r\n        }\r\n      };\r\n    }\r\n\r\n    marked.use({\r\n      extensions: [\r\n        scriptExtension('subscript', 'sub', '~', '(?!~)'),\r\n        scriptExtension('superscript', 'sup', '^', ''),\r\n        pairExtension('highlight', 'mark', '='),\r\n        pairExtension('insertion', 'ins', '+'),\r\n        pairExtension('deletion', 'del', '-'),\r\n        smallExtension()\r\n      ]\r\n    });\r\n\r\n    \/\/ GFM \u306e\u6253\u3061\u6d88\u3057\u7dda\uff08del\uff09\u306f ~~ \u3060\u3051\u306b\u3057\u3001\u51fa\u529b\u3092 <s> \u306b\u3059\u308b\r\n    \/\/ \uff08~ 1 \u500b\u306f\u4e0a\u306e\u4e0b\u4ed8\u304d\u306e\u62e1\u5f35\u304c\u5148\u306b\u51e6\u7406\u3059\u308b\u3002\u6b8b\u3063\u305f ~ 1 \u500b\u306f\u6587\u5b57\u306e\u307e\u307e\uff09\r\n    const originalDel = marked.Tokenizer.prototype.del;\r\n    marked.use({\r\n      tokenizer: {\r\n        del(src, maskedSrc, prevChar) {\r\n          if (src.charAt(0) === '~' && src.charAt(1) === '~') {\r\n            return originalDel.call(this, src, maskedSrc, prevChar || '');\r\n          }\r\n          return undefined;\r\n        }\r\n      },\r\n      renderer: {\r\n        del(token) {\r\n          return '<s>' + this.parser.parseInline(token.tokens) + '<\/s>';\r\n        }\r\n      }\r\n    });\r\n  })();\r\n\r\n  \/\/\u5de6\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2 \u2192 \u53f3\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u3078\u306e\u5909\u63db\r\n  \/\/ \u2605\u30a8\u30e9\u30fc\u53ef\u8996\u5316\u30e9\u30c3\u30d1\u30fc\u2605 \u4f8b\u5916\u6642\u3082\u7121\u53cd\u5fdc\u306b\u305b\u305a\u53f3\u30a8\u30ea\u30a2\u306b\u5185\u5bb9\u8868\u793a\r\n  function encodeText() {\r\n    try {\r\n      return _encodeTextImpl();\r\n    } catch (e) {\r\n      const out = document.getElementById('decodeArea');\r\n      if (out) {\r\n        out.value = '\u26a0 \u5909\u63db\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f' + NL + NL +\r\n          (e && e.message ? e.message : e) + NL + NL +\r\n          (e && e.stack ? e.stack : '');\r\n      }\r\n      if (typeof console !== 'undefined' && console.error) console.error(e);\r\n    }\r\n  }\r\n\r\n  function _encodeTextImpl() {\r\n    const encode_area = document.getElementById('encodeArea');\r\n    const decode_area = document.getElementById('decodeArea');\r\n    let text = encode_area.value;\r\n\r\n\r\n    \/\/ ============================================================================\r\n    \/\/ Markdown \u2192 HTML \u306b\u5909\u63db\uff1a\r\n    \/\/ ============================================================================\r\n    if (document.getElementById('convertMd2Html').checked) {\r\n\r\n      \/\/ \u2500\u2500 \u4fdd\u8b77\uff08marked \u524d\uff09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n      \/\/ \u30b3\u30fc\u30c9\uff08\u30d5\u30a7\u30f3\u30b9\uff0b\u30a4\u30f3\u30e9\u30a4\u30f3\uff09\u3068\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u3092\u3001\u5909\u63db\u51e6\u7406\u304b\u3089\u5b88\u308b\u305f\u3081\r\n      \/\/ \u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u3078\u9000\u907f\u3059\u308b\u3002\u30b3\u30fc\u30c9\u3092\u5148\u306b\u4fdd\u8b77\u3059\u308b\u3053\u3068\u3067\u3001\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u5185\u306e\r\n      \/\/ \u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u304c\u8aa4\u3063\u3066\u52d5\u304f\u306e\u3092\u9632\u3050\u3002\r\n      const codeStore = [];\r\n      \/\/ \u6298\u308a\u305f\u305f\u307f\u306e\u30a2\u30e9\u30fc\u30c8\uff08> \uff3b!NOTE\uff3d- \/ > \uff3b!NOTE\uff3d+\uff09\u3092 <details> \u306b\u66f8\u304d\u63db\u3048\u308b\r\n      \/\/ \uff08\u30b3\u30fc\u30c9\u306e\u9000\u907f\u3088\u308a\u524d\u3002\u672c\u6587\u306e\u4e2d\u306e\u30b3\u30fc\u30c9\u3082\u3001\u3053\u306e\u5f8c\u306e\u9000\u907f\u51e6\u7406\u304c\u62fe\u3046\uff09\r\n      text = convertCalloutsToDetails(text);\r\n      \/\/ \u30ab\u30b9\u30bf\u30e0\u30b3\u30f3\u30c6\u30ca\uff08:::{#id .class} \/ :::note info\uff09\u3092 <div> \u306b\u66f8\u304d\u63db\u3048\u308b\r\n      const fencedPreStore = [];\r\n      text = convertFencedDivs(text, fencedPreStore);\r\n\r\n      text = protectCodeBlocks(text, codeStore);\r\n      const shortcodeStore = [];\r\n      text = protectShortcodes(text, shortcodeStore);\r\n      \/\/ \u811a\u6ce8\u306e\u5b9a\u7fa9\u3092\u53d6\u308a\u51fa\u3057\u3001\u53c2\u7167 [^1] \u3092\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u3078\u9000\u907f\u3059\u308b\r\n      \/\/ \uff08marked \u304c [^1]: \u5185\u5bb9 \u3092\u30ea\u30f3\u30af\u306e\u53c2\u7167\u5b9a\u7fa9\u3068\u8aa4\u8a8d\u3057\u306a\u3044\u3088\u3046\u306b\uff09\u3002\r\n      const footnoteProtected = protectFootnotes(text);\r\n      text = footnoteProtected.text;\r\n      \/\/ \u30bb\u30eb\u7d50\u5408\u30de\u30fc\u30ab\u30fc\uff08< > ^\uff09\u3082 marked \u3092\u901a\u3059\u3068 &lt;\/&gt; \u306b\u5b9f\u4f53\u5316\u3055\u308c\u3066\r\n      \/\/ \u5224\u5b9a\u3067\u304d\u306a\u304f\u306a\u308b\u305f\u3081\u3001\u540c\u69d8\u306b marked \u306e\u524d\u306b\u4fdd\u8b77\u3059\u308b\u3002\r\n      text = protectMergeMarkers(text);\r\n      \/\/ \u30c6\u30fc\u30d6\u30eb\u306e\u30ad\u30e3\u30d7\u30b7\u30e7\u30f3\u30fb<tbody> \u306e\u533a\u5207\u308a\u30fb<tfoot> \u306e\u533a\u5207\u308a\u3092\u76ee\u5370\u306b\u7f6e\u304d\u63db\u3048\u308b\r\n      \/\/ \uff08marked \u304c\u672c\u6587\u306e\u9014\u4e2d\u306e\u533a\u5207\u308a\u884c\u3092\u30c6\u30fc\u30d6\u30eb\u306e\u59cb\u307e\u308a\u3068\u307f\u306a\u3057\u3066\u6bb5\u843d\u3092\u5206\u5272\u3057\u306a\u3044\u3088\u3046\u306b\uff09\u3002\r\n      const tableCellStore = [];\r\n      text = protectTableSections(text, tableCellStore);\r\n      \/\/ \u751f\u306e <br>\uff08\u30e6\u30fc\u30b6\u30fc\u304c\u5143\u304b\u3089\u66f8\u3044\u3066\u3044\u305f\u6539\u884c\u30bf\u30b0\uff09\u3082\u3001\u5f8c\u7d9a\u306e convertTagTables\r\n      \/\/ \u304c\u300cbreaks:true \u3067\u751f\u6210\u3055\u308c\u305f\u884c\u533a\u5207\u308a\u7528\u306e <br>\u300d\u3068\u533a\u5225\u3067\u304d\u308b\u3088\u3046\u3001\r\n      \/\/ marked \u306e\u524d\u306b\u4fdd\u8b77\u3057\u3066\u304a\u304f\uff08\u8a73\u7d30\u306f protectRawBr \u306e\u30b3\u30e1\u30f3\u30c8\u53c2\u7167\uff09\u3002\r\n      text = protectRawBr(text);\r\n      \/\/ \u30ea\u30b9\u30c8\u3082\u540c\u69d8\u306e\u7406\u7531\uff08marked \u5074\u3067tight\/loose\u60c5\u5831\u304c\u5931\u308f\u308c\u308b\u30fb\u6271\u3044\u304c\u975e\u5bfe\u79f0\uff09\u3067\u3001\r\n      \/\/ marked \u306b\u6e21\u3059\u524d\u306b raw \u30c6\u30ad\u30b9\u30c8\u306e\u6642\u70b9\u3067\u30ea\u30b9\u30c8\u69cb\u9020\u3092\u691c\u51fa\u3057\u3001\u72ec\u81ea\u306bHTML\u5316\u3057\u3066\r\n      \/\/ \u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u3078\u9000\u907f\u3059\u308b\uff08\u9805\u76ee\u5185\u306e\u30a4\u30f3\u30e9\u30a4\u30f3\u8a18\u6cd5\u306f marked.parseInline \u3067\u51e6\u7406\uff09\u3002\r\n      const listStore = [];\r\n      text = protectLists(text, listStore);\r\n\r\n\r\n      \/\/ \u2500\u2500 marked.js \u51e6\u7406 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n      text = convertMd2Html(text);\r\n\r\n\r\n      \/\/ \u2500\u2500 \u30c6\u30fc\u30d6\u30eb\u5909\u63db\uff08marked \u5f8c\uff09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n      \/\/ marked \u306f\u30c6\u30fc\u30d6\u30eb\u3092\u8a8d\u8b58\u3057\u306a\u3044\uff08tokenizer \u7121\u52b9\u5316\u6e08\u307f\uff09\u306e\u3067\u3001\r\n      \/\/ <p>...<\/p> \u306e\u307e\u307e\u6b8b\u3063\u305f\u300c\u5168\u884c\u306b | \u3092\u542b\u3080\u30d6\u30ed\u30c3\u30af\u300d\u3092\u72ec\u81ea\u306b\u30c6\u30fc\u30d6\u30eb\u5316\u3059\u308b\u3002\r\n      text = convertTagTables(text, document.getElementById('convertTagTd2Ths').checked);\r\n      \/\/ \u8907\u6570\u884c\u306e\u30bb\u30eb\uff08\u884c\u672b\u306e\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\uff09\u306e\u4e2d\u8eab\u3092\u623b\u3059\r\n      text = restoreTableCells(text, tableCellStore);\r\n\r\n      \/\/ \u2500\u2500 \u30ea\u30b9\u30c8\u5fa9\u5143\uff08marked\u30fb\u30c6\u30fc\u30d6\u30eb\u5909\u63db\u5f8c\uff09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n      \/\/ \u9000\u907f\u3057\u3066\u304a\u3044\u305f\u30ea\u30b9\u30c8HTML\u3092\u672c\u6587\u306b\u623b\u3059\u3002\u4e2d\u306b\u306f\u672a\u5fa9\u5143\u306e XCBPX\/XSCPX \u7b49\u306e\r\n      \/\/ \u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u5834\u5408\u304c\u3042\u308b\u306e\u3067\u3001\u30b3\u30fc\u30c9\uff0f\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u306e\r\n      \/\/ \u5fa9\u5143\u3088\u308a\u5fc5\u305a\u5148\u306b\u884c\u3046\uff08\u623b\u3057\u305f\u5148\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u3001\u5f8c\u7d9a\u306e\u5fa9\u5143\u51e6\u7406\u304c\u62fe\u3046\uff09\u3002\r\n      text = restoreLists(text, listStore);\r\n      \/\/ \u30ea\u30b9\u30c8\u9805\u76ee\u306e\u4e2d\u306e\u8868\u306e\u3001\u8907\u6570\u884c\u306e\u30bb\u30eb\u3092\u623b\u3059\uff08\u30ea\u30b9\u30c8\u3092\u623b\u3057\u305f\u5f8c\u3067\u306a\u3044\u3068\u5c4a\u304b\u306a\u3044\uff09\r\n      text = restoreTableCells(text, tableCellStore);\r\n\r\n      \/\/ \u2500\u2500 \u811a\u6ce8\u306e\u5fa9\u5143\uff08\u30b3\u30fc\u30c9\u306e\u5fa9\u5143\u3088\u308a\u524d\u3002\u811a\u6ce8\u306e\u4e2d\u306e\u30b3\u30fc\u30c9\u3082\u3001\u7d9a\u304f\u5fa9\u5143\u51e6\u7406\u304c\u62fe\u3046\uff09\u2500\u2500\r\n      text = restoreFootnotes(text, footnoteProtected.store);\r\n\r\n      \/\/ \u2500\u2500 \u5fa9\u5143\uff08marked \u5f8c\uff09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n      \/\/ \u9000\u907f\u3057\u305f\u5185\u5bb9\u3092\u623b\u3059\u3002\u30b3\u30fc\u30c9\u306f <pre><code> \/ <code> \u306bHTML\u30a8\u30b9\u30b1\u30fc\u30d7\u3057\u3066\u5fa9\u5143\u3001\r\n      \/\/ \u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u306f\u539f\u6587\u306e\u307e\u307e\u5fa9\u5143\u3059\u308b\u3002\r\n      text = restoreCodeBlocks(text, codeStore);\r\n      text = restoreShortcodes(text, shortcodeStore);\r\n      \/\/ :::pre \u306e\u4e2d\u8eab\uff08Markdown \u3068\u3057\u3066\u5909\u63db\u3057\u306a\u3044\u3082\u306e\uff09\u3092\u623b\u3059\r\n      text = restoreFencedPres(text, fencedPreStore);\r\n      \/\/ \u4fdd\u8b77\u3057\u3066\u304a\u3044\u305f\u751f\u306e <br> \u3092\u5fa9\u5143\uff08convertTagTables \u306e\u884c\u533a\u5207\u308a\u5224\u5b9a\u304c\r\n      \/\/ \u7d42\u308f\u3063\u305f\u3042\u3068\u306a\u306e\u3067\u3001\u610f\u56f3\u3057\u305f <br> \u304c\u305d\u306e\u307e\u307e\u6b8b\u3063\u3066\u3044\u308b\uff09\u3002\r\n      text = restoreRawBr(text);\r\n\r\n      \/\/ \u2500\u2500 \u898b\u51fa\u3057\u306b id \u3092\u4ed8\u3051\u308b\uff08GitHub \u3068\u540c\u3058\u898f\u5247\u3002\u30b3\u30fc\u30c9\u30fb\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u306e\u5fa9\u5143\u5f8c\uff09\u2500\u2500\r\n      \/\/ \u30aa\u30d7\u30b7\u30e7\u30f3\uff08convertMd2HeadingIds\uff09\u304c\u30aa\u30f3\u306e\u3068\u304d\u3060\u3051\r\n      const headingIdsOption = document.getElementById('convertMd2HeadingIds');\r\n      if (headingIdsOption && headingIdsOption.checked) {\r\n        text = addHeadingIds(text);\r\n      }\r\n\r\n      \/\/ \u2500\u2500 \u30ea\u30f3\u30af\u30ab\u30fc\u30c9\u30fb\u5916\u90e8\u30ea\u30f3\u30af\uff08\u81ea\u30b5\u30a4\u30c8\u306e\u30c9\u30e1\u30a4\u30f3\u3067\u5224\u5b9a\uff09\u2500\u2500\r\n      const siteDomainInput = document.getElementById('convertMd2SiteDomain');\r\n      const siteDomain = siteDomainInput ? siteDomainInput.value.trim() : '';\r\n      const linkCardsOption = document.getElementById('convertMd2LinkCards');\r\n      if (siteDomain && linkCardsOption && linkCardsOption.checked) {\r\n        text = convertSiteUrlLinesToLinkbox(text, siteDomain);\r\n      }\r\n      const externalLinksOption = document.getElementById('convertMd2ExternalLinks');\r\n      if (externalLinksOption && externalLinksOption.checked) {\r\n        text = decorateExternalLinks(text, siteDomain);\r\n      }\r\n\r\n      \/\/ \u2500\u2500 \u30d6\u30ed\u30c3\u30af\u8981\u7d20\uff08\u898b\u51fa\u3057\u30fbhr\u30fb\u30ea\u30b9\u30c8\u30fb\u8868\u30fbpre\u30fb\u5f15\u7528\u30fbdetails\uff09\u306e\u524d\u306b\u7a7a\u884c\u3092\u5165\u308c\u308b \u2500\u2500\r\n      const blankLinesOption = document.getElementById('convertMd2BlankLines');\r\n      if (blankLinesOption && blankLinesOption.checked) {\r\n        text = addBlankLinesBeforeBlocks(text);\r\n      }\r\n    }\r\n\r\n\r\n\r\n\r\n    \/\/ ============================================================================\r\n    \/\/ Markdown \u2192 HTML \u306b\u5909\u63db\u4ee5\u964d\u306e\u51e6\u7406\uff1a\r\n    \/\/ ============================================================================\r\n    \/\/ \u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u5185\u30a4\u30f3\u30c7\u30f3\u30c8\u6574\u5f62\u306f\u3001\u3053\u3053\uff08\u300cMarkdown \u2192 HTML \u306b\u5909\u63db\u300d\u306e\r\n    \/\/ \u30c1\u30a7\u30c3\u30af\u306b\u95a2\u4fc2\u306a\u304f\u5fc5\u305a\u901a\u308b\u5834\u6240\uff09\u3067\u884c\u3046\u3002\r\n    \/\/   \u30fbMarkdown\u5165\u529b\uff0b\u5909\u63dbON\uff1a\u4e0a\u306eprotectCodeBlocks\uff5erestoreCodeBlocks\u3092\u7d4c\u3066\r\n    \/\/     \u3061\u3087\u3046\u3069 <pre><code class=\"language-xxx\">\u2026<\/code><\/pre> \u306e\u5f62\u306b\u306a\u3063\u3066\u3044\u308b\r\n    \/\/   \u30fb\u3059\u3067\u306bHTML\u5316\u6e08\u307f\u306e\u5165\u529b\uff0b\u5909\u63dbOFF\uff1a\u5165\u529b\u306b\u3082\u3068\u304b\u3089 <pre><code>\u2026<\/code><\/pre> \u304c\r\n    \/\/     \u542b\u307e\u308c\u3066\u3044\u308b\r\n    \/\/   \u306e\u3069\u3061\u3089\u3082\u3001\u3053\u306e\u6642\u70b9\u3067\u306f\u540c\u3058 <pre><code> \u306e\u5f62\u306b\u63c3\u3063\u3066\u3044\u308b\u306e\u3067\u3001\u3053\u3053\u3067\r\n    \/\/   1\u7b87\u6240\u306b\u307e\u3068\u3081\u3066\u51e6\u7406\u3059\u308c\u3070\u4e21\u65b9\u306e\u30b1\u30fc\u30b9\u306b\u52b9\u304f\uff08\u300c\u5909\u63db\u300d\u30c1\u30a7\u30c3\u30af\u304c\u5165\u3063\u3066\r\n    \/\/   \u3044\u306a\u3044\u3068\u52d5\u304b\u306a\u3044\u3001\u3068\u3044\u3046\u554f\u984c\u3092\u89e3\u6d88\uff09\u3002\r\n    text = reindentExistingCodeBlocks(text);\r\n\r\n    \/\/ \u8868\u306e\u51fa\u529b\u30aa\u30d7\u30b7\u30e7\u30f3\uff08\u80cc\u666f\u8272\u306e bgcolor\u30fbborder \u5c5e\u6027\u30fb\u30c6\u30fc\u30d6\u30eb\u8868\u73fe\uff09\u3002\r\n    \/\/ \u30af\u30e9\u30b9\u306e\u8ffd\u52a0\uff08processAllTagClasses\uff09\u3088\u308a\u524d\u306b\u884c\u3046\uff08<dl> \u306b\u3082\u30af\u30e9\u30b9\u304c\u4ed8\u304f\u3088\u3046\u306b\uff09\r\n    text = applyTableOutputOptions(text);\r\n\r\n    if (document.getElementById('encloseTagImgPictures').checked) { text = encloseTagImgPictures(text); }\r\n    if (document.getElementById('convertUListStyles').checked ||\r\n      document.getElementById('convertOListStyles').checked) {\r\n      text = convertListStyles(text);\r\n    }\r\n\r\n    \/\/\u6307\u5b9a\u306e\u30bf\u30b0\u3092 \u2192 \u4efb\u610f\u306e\u30bf\u30b0 \u306b\u5909\u63db\r\n    if (document.getElementById('convertUpdateTag1s').checked ||\r\n      document.getElementById('convertUpdateTag2s').checked ||\r\n      document.getElementById('convertUpdateTag3s').checked ||\r\n      document.getElementById('convertUpdateTag4s').checked ||\r\n      document.getElementById('convertUpdateTag5s').checked) {\r\n      text = processAllTagUpdates(text);\r\n    }\r\n\r\n    \/\/\u6307\u5b9a\u306e\u30bf\u30b0\u306b\u3001\u4efb\u610f\u306e\u30af\u30e9\u30b9\u3092\u8ffd\u52a0\r\n    if (document.getElementById('convertAddClase1s').checked ||\r\n      document.getElementById('convertAddClase2s').checked ||\r\n      document.getElementById('convertAddClase3s').checked ||\r\n      document.getElementById('convertAddClase4s').checked ||\r\n      document.getElementById('convertAddClase5s').checked ||\r\n      document.getElementById('convertAddClase6s').checked ||\r\n      document.getElementById('convertAddClase7s').checked ||\r\n      document.getElementById('convertAddClase8s').checked ||\r\n      document.getElementById('convertAddClase9s').checked ||\r\n      document.getElementById('convertAddClase10s').checked ||\r\n      document.getElementById('convertAddClase11s').checked ||\r\n      document.getElementById('convertAddClase12s').checked ||\r\n      document.getElementById('convertAddClase13s').checked ||\r\n      document.getElementById('convertAddClase14s').checked ||\r\n      document.getElementById('convertAddClase15s').checked ||\r\n      document.getElementById('convertAddClase16s').checked ||\r\n      document.getElementById('convertAddClase17s').checked ||\r\n      document.getElementById('convertAddClase18s').checked ||\r\n      document.getElementById('convertAddClase19s').checked ||\r\n      document.getElementById('convertAddClase20s').checked ||\r\n      document.getElementById('convertAddClase21s').checked ||\r\n      document.getElementById('convertAddClase22s').checked ||\r\n      document.getElementById('convertAddClase23s').checked) {\r\n      text = processAllTagClasses(text);\r\n    }\r\n\r\n    \/\/ \u305d\u306e\u4ed6\uff1a\r\n    if (document.getElementById('removeTags').checked) { text = removeTags(text); }\r\n    if (document.getElementById('removeLineBreaks').checked) { text = removeLineBreaks(text); }\r\n    if (document.getElementById('adjustLineBreaks').checked) { text = adjustLineBreaks(text); }\r\n    if (document.getElementById('convertTagBreaks').checked) { text = convertTagBreaks(text); }\r\n    if (document.getElementById('convertNspacesTabs').checked) { text = convertNspacesTabs(text); }\r\n    if (document.getElementById('convertNthBreak2Tabs').checked) { text = convertNthBreak2Tabs(text); }\r\n    if (document.getElementById('convertEntityAmps').checked) { text = convertEntityAmps(text); }\r\n    if (document.getElementById('convertEntityNewLines').checked) { text = convertEntityNewLines(text); }\r\n    if (document.getElementById('convertEntityTabs').checked) { text = convertEntityTabs(text); }\r\n    if (document.getElementById('convertEntityLtGts').checked) { text = convertEntityLtGts(text); }\r\n    if (document.getElementById('convertEntitySqbs').checked) { text = convertEntitySqbs(text); }\r\n    if (document.getElementById('convertEntityPars').checked) { text = convertEntityPars(text); }\r\n    if (document.getElementById('convertEntityCubs').checked) { text = convertEntityCubs(text); }\r\n    if (document.getElementById('convertEntityQuots').checked) { text = convertEntityQuots(text); }\r\n    if (document.getElementById('convertEntityAposs').checked) { text = convertEntityAposs(text); }\r\n    if (document.getElementById('convertEntityGraves').checked) { text = convertEntityGraves(text); }\r\n    if (document.getElementById('convertFullWidths').checked) { text = convertFullWidths(text); }\r\n    if (document.getElementById('convertAlphaUppers').checked) { text = convertAlphaUppers(text); }\r\n    if (document.getElementById('convertAlphaLowers').checked) { text = convertAlphaLowers(text); }\r\n    if (document.getElementById('convertNumber0s').checked) { text = convertNumber0s(text); }\r\n    if (document.getElementById('convertNumberRandoms').checked) { text = convertNumberRandoms(text); }\r\n    if (document.getElementById('convertFullParenthesis').checked) { text = convertFullParenthesis(text); }\r\n    if (document.getElementById('convertHalfParenthesis').checked) { text = convertHalfParenthesis(text); }\r\n    if (document.getElementById('convertHalfNumbers').checked) { text = convertHalfNumbers(text); }\r\n    if (document.getElementById('convertFullNumbers').checked) { text = convertFullNumbers(text); }\r\n    if (document.getElementById('convertHalfAlphabets').checked) { text = convertHalfAlphabets(text); }\r\n    if (document.getElementById('convertFullAlphabets').checked) { text = convertFullAlphabets(text); }\r\n    if (document.getElementById('convertRenumbers').checked) { text = convertRenumbers(text); }\r\n    if (document.getElementById('removeMultiWords').checked) { text = removeMultiWords(text); }\r\n    if (document.getElementById('convertMultiWords').checked) { text = convertMultiWords(text); }\r\n\r\n\r\n    decode_area.value = text;\r\n    copyToClipboard(text, false);  \/\/ isDecode = false\r\n  }\r\n\r\n\r\n  \/\/\u53f3\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2 \u2192 \u5de6\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u3078\u306e\u5909\u63db\uff08HTML \u2192 Markdown\uff09\r\n  \/\/ \u2605\u30a8\u30e9\u30fc\u53ef\u8996\u5316\u30e9\u30c3\u30d1\u30fc\u2605 \u4f8b\u5916\u6642\u3082\u7121\u53cd\u5fdc\u306b\u305b\u305a\u5de6\u30a8\u30ea\u30a2\u306b\u5185\u5bb9\u8868\u793a\r\n  function decodeText() {\r\n    try {\r\n      return _decodeTextImpl();\r\n    } catch (e) {\r\n      const out = document.getElementById('encodeArea');\r\n      if (out) {\r\n        out.value = '\u26a0 \u5909\u63db\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f' + NL + NL +\r\n          (e && e.message ? e.message : e) + NL + NL +\r\n          (e && e.stack ? e.stack : '');\r\n      }\r\n      if (typeof console !== 'undefined' && console.error) console.error(e);\r\n    }\r\n  }\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u3010STEP6.2-3\u3011\u30c7\u30b3\u30fc\u30c9\uff08HTML \u2192 Markdown\uff09\uff1a\u30c7\u30d5\u30a9\u30eb\u30c8\u51fa\u529b\u5f62\u5f0f\u306e\u8abf\u6574\r\n  \/\/   \uff0b\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u5909\u63db\u3059\u308b\u30bf\u30b0\u306e\u8ffd\u52a0\r\n  \/\/   \u30fb\u898b\u51fa\u3057\u306f # \u5f62\u5f0f\uff08headingStyle: atx\uff09\r\n  \/\/   \u30fb<hr> \u306f --- \u5f62\u5f0f\uff08hr: '---'\uff09\r\n  \/\/   \u30fb<em> \u306f * \u5f62\u5f0f\uff08emDelimiter: '*'\uff09\r\n  \/\/   \u30fb\u30ea\u30b9\u30c8\u306f - \u5f62\u5f0f\uff08bulletListMarker: '-'\u3002\u30ea\u30b9\u30c8\u81ea\u4f53\u306f\u72ec\u81ea\u5b9f\u88c5\u306e\u305f\u3081\r\n  \/\/     \u3053\u306e\u30c4\u30fc\u30eb\u306e\u51fa\u529b\u306b\u306f\u73fe\u72b6\u5f71\u97ff\u3057\u306a\u3044\u304c\u3001\u5ff5\u306e\u305f\u3081\u8a2d\u5b9a\uff09\r\n  \/\/   \u30fb<s>\u30fb<strike>\u30fb<del> \u306f turndown \u6a19\u6e96\u3067\u306f\u5909\u63db\u5bfe\u8c61\u5916\u306e\u305f\u3081\u3001\r\n  \/\/     addRule \u3067 ~~text~~\uff08\u6253\u3061\u6d88\u3057\u7dda\uff09\u306b\u5909\u63db\u3055\u308c\u308b\u3088\u3046\u306b\u3059\u308b\r\n  \/\/ ============================================================================\r\n  function _decodeTextImpl() {\r\n    const encode_area = document.getElementById('encodeArea');\r\n    const decode_area = document.getElementById('decodeArea');\r\n    let html = decode_area.value;\r\n\r\n    \/\/ \u2500\u2500 MathJax\u88c5\u98fe\u3078\u306e\u5909\u63db\uff08\u4ed6\u306e\u4fdd\u8b77\u3088\u308a\u5148\u306b\u884c\u3046\u3002\u6307\u5b9a\u30bf\u30b0\u3092\u660e\u793a\u7684\u306b\r\n    \/\/   MathJax\u8a18\u6cd5\u3078\u7f6e\u304d\u63db\u3048\u308b\u3068\u3044\u3046\u3001\u3088\u308a\u5177\u4f53\u7684\u306a\u6307\u5b9a\u306a\u306e\u3067\u512a\u5148\u3059\u308b\uff09\u2500\u2500\r\n    const mathJaxProtected = protectMathJaxDecoration(html);\r\n    html = mathJaxProtected.html;\r\n\r\n    \/\/ \u2500\u2500 \u300cHTML\u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u300d\u30bf\u30b0\u306e\u4fdd\u8b77\uff08marked...\u3067\u306f\u306a\u304fturndown\u306e\u524d\uff09\u2500\u2500\r\n    \/\/ turndown\u81ea\u8eab\u306e\u30eb\u30fc\u30eb\u512a\u5148\u9806\u4f4d\u306f\u300c\u8ffd\u52a0\u30eb\u30fc\u30eb\uff0f\u6a19\u6e96\u30eb\u30fc\u30eb \u2192 keep \u2192 remove\r\n    \/\/ \u2192 \u65e2\u5b9a\u30eb\u30fc\u30eb\u300d\u306e\u9806\u3067\u3001\u8ffd\u52a0\u30fb\u6a19\u6e96\u30eb\u30fc\u30eb\u304c\u5e38\u306bkeep\u3088\u308a\u5148\u306b\u8a55\u4fa1\u3055\u308c\u308b\u3002\r\n    \/\/ \u3064\u307e\u308a img\uff08\u6a19\u6e96\u30eb\u30fc\u30eb\u3042\u308a\uff09\u3084 table\u30fbdl\u30fbs\/strike\/del\uff08\u672c\u30c4\u30fc\u30eb\u306e\r\n    \/\/ \u8ffd\u52a0\u30eb\u30fc\u30eb\u3042\u308a\uff09\u306f turndownService.keep(...) \u3060\u3051\u3067\u306f\u52b9\u304b\u306a\u3044\u3002\r\n    \/\/ \u3053\u3053\u3067\u306f\u3001\u5bfe\u8c61\u30bf\u30b0\u3092turndown\u306b\u6e21\u3059\u201c\u524d\u201d\u306eHTML\u6587\u5b57\u5217\u306e\u6642\u70b9\u3067\u4e38\u3054\u3068\r\n    \/\/ \u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u306b\u9000\u907f\u3057\u3066\u3057\u307e\u3046\u3053\u3068\u3067\u3001\u30eb\u30fc\u30eb\u306e\u512a\u5148\u9806\u4f4d\u306b\u95a2\u4fc2\u306a\u304f\r\n    \/\/ \u78ba\u5b9f\u306b\u300c\u624b\u3064\u304b\u305a\u306e\u307e\u307e\u300d\u6b8b\u3059\uff08\u30c6\u30fc\u30d6\u30eb\u30bb\u30eb\u3084<dl>\u306e\u4e2d\u306b\u3001\u7dad\u6301\u3057\u305f\u3044\r\n    \/\/ <ul>\u7b49\u304c\u5165\u308c\u5b50\u306b\u306a\u3063\u3066\u3044\u308b\u5834\u5408\u3082\u3001\u305d\u306e\u90e8\u5206\u3060\u3051\u3092\u5148\u306b\u9000\u907f\u3067\u304d\u308b\u306e\u3067\r\n    \/\/ \u6b63\u3057\u304f\u6a5f\u80fd\u3059\u308b\uff09\u3002\r\n    const keepProtected = protectKeepAsHtmlTags(html);\r\n    html = keepProtected.html;\r\n\r\n    \/\/ \u2500\u2500 HTML\u30b3\u30e1\u30f3\u30c8\u306e\u4fdd\u8b77\uff08\u4e0a\u306e\u300cHTML\u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u30bf\u30b0\u300d\u306e\u201c\u5f8c\u201d\u306b\u884c\u3046\u3053\u3068\u3067\u3001\r\n    \/\/   \u7dad\u6301\u30bf\u30b0\u306e\u4e2d\u306b\u5143\u304b\u3089\u3042\u3063\u305f\u30b3\u30e1\u30f3\u30c8\u306f\u3001\u305d\u306e\u30bf\u30b0\u306e\u751fHTML\u306e\u4e00\u90e8\u3068\u3057\u3066\r\n    \/\/   \u81ea\u52d5\u7684\u306b\u305d\u306e\u307e\u307e\u6b8b\u308b\u3002\u3053\u3053\u3067\u5225\u9014\u4fdd\u8b77\u3059\u308b\u306e\u306f\u3001\u305d\u308c\u4ee5\u5916\u306e\u30fb\u5b9f\u969b\u306b\r\n    \/\/   Markdown\u3078\u5909\u63db\u3055\u308c\u308b\u5074\u306b\u6b8b\u3063\u3066\u3044\u308b\u30b3\u30e1\u30f3\u30c8\u3060\u3051\u3067\u3088\u3044\uff09\u2500\u2500\r\n    const commentProtected = protectHtmlComments(html);\r\n    html = commentProtected.html;\r\n\r\n    const turndownService = new TurndownService({\r\n      headingStyle: 'atx',\r\n      hr: '---',\r\n      bulletListMarker: '-',\r\n      emDelimiter: '*',\r\n      codeBlockStyle: 'fenced'\r\n    });\r\n\r\n    turndownService.addRule('strikethrough', {\r\n      filter: ['s', 'strike'],\r\n      replacement: function (content) {\r\n        if (!content.trim()) return '';\r\n        return '~~' + content + '~~';\r\n      }\r\n    });\r\n\r\n    \/\/ \u4e0a\u4ed8\u304d\u30fb\u4e0b\u4ed8\u304d\u30fb\u30cf\u30a4\u30e9\u30a4\u30c8\u30fb\u633f\u5165\u30fb\u524a\u9664\uff08encode \u5074\u306e marked \u62e1\u5f35\u3068\u5bfe\u79f0\uff09\r\n    \/\/   <sub> \u2192 ~x~\u3001<sup> \u2192 ^x^\uff08\u4e2d\u306e\u7a7a\u767d\u306f\u300c\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\uff0b\u7a7a\u767d\u300d\uff09\r\n    \/\/   <mark> \u2192 ==x==\u3001<ins> \u2192 ++x++\u3001<del> \u2192 --x--\u3001<small> \u2192 \u2022x\u2022\r\n    \/\/   \u811a\u6ce8\u306e\u53c2\u7167\uff08<sup><a href=\"#fn-1\">\uff09\u306f\u3001\u5f8c\u3067\u8ffd\u52a0\u3059\u308b\u811a\u6ce8\u306e\u30eb\u30fc\u30eb\u304c\u512a\u5148\u3055\u308c\u308b\r\n    const escapeScriptSpaces = function (s) { return s.split(' ').join(BS + ' '); };\r\n    [\r\n      { key: 'subscript', tag: 'sub', open: '~', close: '~', script: true },\r\n      { key: 'superscript', tag: 'sup', open: '^', close: '^', script: true },\r\n      { key: 'highlight', tag: 'mark', open: '==', close: '==' },\r\n      { key: 'insertion', tag: 'ins', open: '++', close: '++' },\r\n      { key: 'deletion', tag: 'del', open: '--', close: '--' },\r\n      { key: 'small', tag: 'small', open: '\u2022', close: '\u2022' }\r\n    ].forEach(function (r) {\r\n      turndownService.addRule(r.key, {\r\n        filter: r.tag,\r\n        replacement: function (content) {\r\n          if (!content.trim()) return '';\r\n          return r.open + (r.script ? escapeScriptSpaces(content) : content) + r.close;\r\n        }\r\n      });\r\n    });\r\n\r\n    turndownService.addRule('table', {\r\n      filter: 'table',\r\n      replacement: function (content, node) {\r\n        const table = decodeTableToPipeText(node, turndownService);\r\n        return table ? (NL + NL + table + NL + NL) : '';\r\n      }\r\n    });\r\n\r\n    \/\/ <br> \u306f\u30011\u9805\u76ee\uff1d1\u884c\u304c\u524d\u63d0\u306e\u3068\u3053\u308d\uff08\u30ea\u30b9\u30c8\u9805\u76ee\u30fb\u5b9a\u7fa9\u8a9e\u30fb\u5b9a\u7fa9\u8aac\u660e\u30fb\u8868\u30bb\u30eb\uff09\u306e\r\n    \/\/ \u4e2d\u306b\u3042\u308b\u3068\u304d\u3060\u3051\u3001\u6539\u884c\u3067\u306f\u306a\u304f <br> \u306e\u6587\u5b57\u305d\u306e\u3082\u306e\u3068\u3057\u3066\u6b8b\u3059\u3002\r\n    \/\/ \u305d\u308c\u4ee5\u5916\uff08\u901a\u5e38\u306e\u6bb5\u843d\u306a\u3069\uff09\u306f turndown \u6a19\u6e96\u3069\u304a\u308a\u306e\u30cf\u30fc\u30c9\u30d6\u30ec\u30a4\u30af\uff08\u534a\u89d2\u30b9\u30da\u30fc\u30b92\u3064\uff0b\u6539\u884c\uff09\u3002\r\n    \/\/ \u3053\u308c\u3067\u3001\u9805\u76ee\u306e\u4e2d\u8eab\u306b\u6539\u884c\u304c\u5165\u3063\u3066\u3044\u3066\u3082\u6539\u884c\u30d9\u30fc\u30b9\u306e\u884c\u5224\u5b9a\uff08\u30c6\u30fc\u30d6\u30eb\u30fb\u30ea\u30b9\u30c8\r\n    \/\/ \u5171\u901a\uff09\u304c\u8aa4\u3063\u3066\u4f59\u8a08\u306a\u884c\u306b\u5272\u3063\u3066\u3057\u307e\u3046\u3053\u3068\u304c\u306a\u304f\u306a\u308b\uff08\u30c6\u30fc\u30d6\u30eb\u306e\u6642\u3068\u540c\u3058\u5bfe\u51e6\uff09\u3002\r\n    turndownService.addRule('lineBreakInSingleLineContext', {\r\n      filter: 'br',\r\n      replacement: function (content, node, options) {\r\n        if (node.closest && node.closest('li, dt, dd, td, th')) {\r\n          return '<br>';\r\n        }\r\n        return options.br + NL;\r\n      }\r\n    });\r\n\r\n    \/\/ turndown\u6a19\u6e96\u306f\u7b87\u6761\u66f8\u304d\u8a18\u53f7\u306e\u5f8c\u308d\u306b3\u500b\uff08\u9806\u5e8f\u30ea\u30b9\u30c8\u306f2\u500b\uff09\u306e\u534a\u89d2\u30b9\u30da\u30fc\u30b9\u3092\r\n    \/\/ \u7f6e\u304f\u3002CommonMark\u4ed5\u69d8\u4e0a\u306f1\u500b\u3067\u5341\u5206\u306a\u4e0a\u30014\u500b\u4ee5\u4e0a\u3060\u3068\u300c\u30a4\u30f3\u30c7\u30f3\u30c8\u3055\u308c\u305f\r\n    \/\/ \u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u300d\u3068\u89e3\u91c8\u3055\u308c\u308b\u6050\u308c\u304c\u3042\u308b\u305f\u3081\u3001\u6700\u3082\u5b89\u5168\u306a1\u500b\u306b\u7d71\u4e00\u3059\u308b\r\n    \/\/ \uff08turndown\u306b\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u7121\u3044\u305f\u3081 rules.listItem \u3092\u4e38\u3054\u3068\u5dee\u3057\u66ff\u3048\u308b\u3002\r\n    \/\/ \u30ed\u30b8\u30c3\u30af\u81ea\u4f53\u306fturndown\u672c\u4f53\u306e\u5b9f\u88c5\u3068\u540c\u3058\u3067\u3001prefix\u306e\u7a7a\u767d\u6570\u3060\u3051\u3092\u5909\u66f4\uff09\u3002\r\n    function trimNLBoth(str) {\r\n      let start = 0, end = str.length;\r\n      while (start < end && str.charAt(start) === NL) { start++; }\r\n      while (end > start && str.charAt(end - 1) === NL) { end--; }\r\n      return str.slice(start, end);\r\n    }\r\n    \/\/ \u30ea\u30f3\u30af\u30ab\u30fc\u30c9\uff08encode \u5074\u306e convertSiteUrlLinesToLinkbox \u3068\u5bfe\u79f0\uff09\r\n    \/\/   <p>\uff3blinkbox href=\"URL\"\uff3d<\/p> \u2192 URL \u3060\u3051\u306e\u884c\r\n    const linkboxRe = new RegExp('^' + BS + OB + 'linkbox' + BS + 's+href=\"(' + OB + '^\"' + CB + '+)\"' + BS + 's*' + BS + CB + '$');\r\n    turndownService.addRule('linkboxShortcode', {\r\n      filter: function (node) {\r\n        return node.nodeName === 'P' && linkboxRe.test(node.textContent.trim());\r\n      },\r\n      replacement: function (content, node) {\r\n        return NL + NL + node.textContent.trim().match(linkboxRe)[1] + NL + NL;\r\n      }\r\n    });\r\n\r\n    \/\/ \u30bf\u30b9\u30af\u30ea\u30b9\u30c8\u306e\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\uff08<li> \u306e\u4e2d\u306e <input type=\"checkbox\">\uff09\u2192 [ ] \/ [x]\r\n    turndownService.addRule('taskListCheckbox', {\r\n      filter: function (node) {\r\n        return node.nodeName === 'INPUT' && (node.getAttribute('type') || '').toLowerCase() === 'checkbox' &&\r\n          node.parentNode && node.parentNode.nodeName === 'LI';\r\n      },\r\n      replacement: function (content, node) {\r\n        \/\/\u76f4\u5f8c\u306e\u6587\u5b57\u5217\u304c\u7a7a\u767d\u3067\u59cb\u307e\u308b\u5834\u5408\u306f\u3001\u7a7a\u767d\u3092\u91cd\u306d\u306a\u3044\r\n        const next = node.nextSibling;\r\n        const nextText = next && next.nodeType === 3 ? next.nodeValue : '';\r\n        const c0 = nextText.charAt(0);\r\n        const space = (c0 === ' ' || c0 === TAB || c0 === NL) ? '' : ' ';\r\n        return (node.hasAttribute('checked') ? OB + 'x' + CB : OB + ' ' + CB) + space;\r\n      }\r\n    });\r\n\r\n    turndownService.addRule('listItemSingleSpace', {\r\n      filter: 'li',\r\n      replacement: function (content, node, options) {\r\n        let prefix = options.bulletListMarker + ' ';\r\n        const parent = node.parentNode;\r\n        if (parent && parent.nodeName === 'OL') {\r\n          const start = parent.getAttribute('start');\r\n          const index = Array.prototype.indexOf.call(parent.children, node);\r\n          prefix = (start ? Number(start) + index : index + 1) + '. ';\r\n        }\r\n        const isParagraph = content.charAt(content.length - 1) === NL;\r\n        content = trimNLBoth(content) + (isParagraph ? NL : '');\r\n        const nlRe = new RegExp(NL, 'g');\r\n        content = content.replace(nlRe, NL + ' '.repeat(prefix.length));\r\n        \/\/\u7a7a\u884c\u306b\u6b8b\u3063\u305f\u5b57\u4e0b\u3052\u306e\u7a7a\u767d\u306f\u53d6\u308a\u9664\u304f\uff08\u9805\u76ee\u306e\u4e2d\u306e\u8868\u306a\u3069\u306e\u524d\u5f8c\uff09\r\n        content = content.split(NL).map(function (l) { return l.trim() === '' ? '' : l; }).join(NL);\r\n        return prefix + content + (node.nextSibling ? NL : '');\r\n      }\r\n    });\r\n\r\n    \/\/ <dl> \u306fturndown\u6a19\u6e96\u3067\u306f\u975e\u5bfe\u5fdc\uff08\u4e2d\u8eab\u306e\u30c6\u30ad\u30b9\u30c8\u3060\u3051\u304c\u6b8b\u308a\u69cb\u9020\u304c\u6d88\u3048\u308b\uff09\u306e\u305f\u3081\u3001\r\n    \/\/ encode\u5074\uff08buildListTree \u306e dl \u5224\u5b9a\uff09\u3068\u5bfe\u79f0\u306a\u8a18\u6cd5\u306b\u5909\u63db\u3059\u308b\uff1a\r\n    \/\/   <dt>\u7528\u8a9e<\/dt>      \u2192 - \u7528\u8a9e\r\n    \/\/   <dd>\u8aac\u660e<\/dd>      \u2192 : \u8aac\u660e\r\n    \/\/ \u540c\u3058\u968e\u5c64\u306b <dd> \u304c\u8907\u6570\u7d9a\u304f\u5f62\u3082\u305d\u306e\u307e\u307e\u9023\u7d9a\u3059\u308b\u884c\u3068\u3057\u3066\u51fa\u529b\u3059\u308b\u3002\r\n    const DL_NESTED_BLOCK_TAGS = ['TABLE', 'PRE', 'BLOCKQUOTE', 'P', 'DIV', 'DETAILS', 'SECTION', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR'];\r\n    turndownService.addRule('definitionList', {\r\n      filter: 'dl',\r\n      replacement: function (content, node) {\r\n        const wsRunRe = new RegExp(OB + ' ' + NL + CB + '*' + NL + OB + ' ' + NL + CB + '*', 'g');\r\n        const lines = [];\r\n        \/\/ <div> \u3067\u56f2\u3093\u3060 dt\u30fbdd\uff08<dl><div><dt>\u2026<\/dt><dd>\u2026<\/dd><\/div><\/dl>\uff09\u3082\u3001\u4e2d\u306e dt\u30fbdd \u3092\u9806\u306b\u6271\u3046\r\n        const dlItems = [];\r\n        Array.from(node.children).forEach(function (child) {\r\n          if (child.tagName === 'DIV') Array.prototype.push.apply(dlItems, Array.from(child.children));\r\n          else dlItems.push(child);\r\n        });\r\n        dlItems.forEach(function (child) {\r\n          if (child.tagName !== 'DT' && child.tagName !== 'DD') return;\r\n          \/\/ dt\u30fbdd \u306e\u4e2d\u306e\u5165\u308c\u5b50\uff08<ul> <ol> <dl>\uff09\u306f\u53d6\u308a\u51fa\u3057\u3066\u3001\u6b21\u306e\u884c\u304b\u3089 2 \u6587\u5b57\u5b57\u4e0b\u3052\u3057\u3066\u51fa\u529b\u3059\u308b\r\n          \/\/ \uff08encode \u5074\u306e buildListTree \u306f\u3001\u5b57\u4e0b\u3052\u3057\u305f\u884c\u3092\u76f4\u524d\u306e dt\u30fbdd \u306e\u5165\u308c\u5b50\u3068\u3057\u3066\u6271\u3046\uff09\r\n          \/\/ \u8868\u30fb\u30b3\u30fc\u30c9\u30fb\u5f15\u7528\u30fb\u6bb5\u843d\u306a\u3069\u306e\u30d6\u30ed\u30c3\u30af\u3082\u540c\u3058\u304f\u53d6\u308a\u51fa\u3057\u3001\u7a7a\u884c\u3092\u631f\u3093\u3067 2 \u6587\u5b57\u5b57\u4e0b\u3052\u3057\u3066\u51fa\u529b\u3059\u308b\r\n          \/\/ \uff08encode \u5074\u306e protectLists \u306f\u3001\u9805\u76ee\u306e\u4e0b\u306b\u5b57\u4e0b\u3052\u3057\u305f\u884c\u3092\u3001\u305d\u306e\u9805\u76ee\u306e\u4e2d\u306e\u30d6\u30ed\u30c3\u30af\u3068\u3057\u3066\u6271\u3046\uff09\r\n          const clone = child.cloneNode(true);\r\n          const nested = [];\r\n          let hasLeadingContent = false;\r\n          Array.from(clone.childNodes).forEach(function (el) {\r\n            if (el.nodeType === 3) {\r\n              if (el.nodeValue.trim() !== '') hasLeadingContent = true;\r\n              return;\r\n            }\r\n            if (el.nodeType !== 1) return;\r\n            const isList = (el.tagName === 'UL' || el.tagName === 'OL' || el.tagName === 'DL');\r\n            const isBlock = DL_NESTED_BLOCK_TAGS.indexOf(el.tagName) !== -1;\r\n            \/\/\u5148\u982d\u306e\u6bb5\u843d\u306f\u3001dt\u30fbdd \u306e\u672c\u6587\u3068\u3057\u3066\u6271\u3046\r\n            if (isList || (isBlock && !(el.tagName === 'P' && !hasLeadingContent))) {\r\n              nested.push({ el: el, isList: isList });\r\n              clone.removeChild(el);\r\n              return;\r\n            }\r\n            hasLeadingContent = true;\r\n          });\r\n          let md = turndownService.turndown(clone).trim();\r\n          md = md.replace(wsRunRe, '<br>');\r\n          const prefix = (child.tagName === 'DT') ? '- ' : ': ';\r\n          lines.push(prefix + md);\r\n          nested.forEach(function (item) {\r\n            \/\/\u8981\u7d20\u305d\u306e\u3082\u306e\u3092\u5909\u63db\u3059\u308b\u305f\u3081\u3001outerHTML \u3067\u6e21\u3059\uff08\u8981\u7d20\u3092\u6e21\u3059\u3068\u4e2d\u8eab\u3060\u3051\u304c\u5909\u63db\u3055\u308c\u308b\uff09\r\n            const nestedLines = turndownService.turndown(item.el.outerHTML).trim().split(NL);\r\n            if (!item.isList) lines.push('');\r\n            nestedLines.forEach(function (line) {\r\n              if (line.trim() === '') {\r\n                \/\/\u30ea\u30b9\u30c8\u306e\u4e2d\u306e\u7a7a\u884c\u306f\u30ea\u30b9\u30c8\u306e\u533a\u5207\u308a\u306b\u306a\u3063\u3066\u3057\u307e\u3046\u306e\u3067\u51fa\u529b\u3057\u306a\u3044\uff08\u30d6\u30ed\u30c3\u30af\u306e\u4e2d\u306e\u7a7a\u884c\u306f\u6b8b\u3059\uff09\r\n                if (!item.isList) lines.push('');\r\n                return;\r\n              }\r\n              lines.push('  ' + line);\r\n            });\r\n          });\r\n        });\r\n        if (lines.length === 0) return '';\r\n        const joined = lines.join(NL);\r\n        \/\/ <li> \u306e\u6700\u5f8c\u306e\u5b50\u3068\u3057\u3066 <dl> \u304c\u5165\u308c\u5b50\u306b\u306a\u3063\u3066\u3044\u308b\u5834\u5408\u306f\u3001turndown \u6a19\u6e96\u306e\r\n        \/\/ <ul>\/<ol>\uff08rules.list\uff09\u3068\u540c\u3058\u6d41\u5100\u3067\u3001\u524d\u5f8c\u306b\u7a7a\u884c\u3092\u5165\u308c\u305a\u5358\u306b\u6539\u884c1\u3064\u3067\r\n        \/\/ \u3064\u306a\u3052\u308b\uff08\u7a7a\u884c\u3092\u631f\u3080\u3068\u3001\u30ea\u30b9\u30c8\u884c\u306e\u9023\u7d9a\u3068\u307f\u306a\u3059encode\u5074\u306e\u30d1\u30fc\u30b5\u30fc\u304c\r\n        \/\/ \u305d\u3053\u3067\u533a\u5207\u3063\u3066\u3057\u307e\u3044\u3001\u5165\u308c\u5b50\u3067\u306f\u306a\u304f\u5225\u30d6\u30ed\u30c3\u30af\u6271\u3044\u306b\u306a\u3063\u3066\u3057\u307e\u3046\u305f\u3081\uff09\u3002\r\n        const parent = node.parentNode;\r\n        if (parent && parent.nodeName === 'LI' && parent.lastElementChild === node) {\r\n          return NL + joined;\r\n        }\r\n        return NL + NL + joined + NL + NL;\r\n      }\r\n    });\r\n\r\n\r\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30b3\u30f3\u30c6\u30ca\uff08encode \u5074\u306e convertFencedDivs \u3068\u5bfe\u79f0\uff09\r\n    \/\/   id\u30fb\u5c5e\u6027\u304c\u3042\u308b <div>  \u2192 :::{#id .class1 .class2 key=\"value\"} \u2026 :::\r\n    \/\/   \u30af\u30e9\u30b9\u3060\u3051\u306e <div>    \u2192 :::class1 class2 \u2026 :::\r\n    \/\/   \u5c5e\u6027\u306e\u306a\u3044 <div> \u306f\u3001\u3053\u308c\u307e\u3067\u3069\u304a\u308a\u4e2d\u8eab\u3060\u3051\u306b\u3059\u308b\r\n    \/\/   <div> \u4ee5\u5916\u306e\u30bf\u30b0      \u2192 :::section{#id .class} \u2026 :::\uff08\u5c5e\u6027\u304c\u306a\u3051\u308c\u3070 :::section\uff09\r\n    \/\/   <pre>\uff08<code> \u306e\u306a\u3044\u3082\u306e\uff09\u2192 :::pre \u2026 :::\uff08\u4e2d\u8eab\u306f HTML \u306e\u307e\u307e\uff09\r\n    \/\/ \u300c:::\uff08\u30ab\u30b9\u30bf\u30e0\u30b3\u30f3\u30c6\u30ca\uff09\u306b\u5909\u63db\u3059\u308b\u30bf\u30b0\u300d\uff08decodeFencedDivTags\uff09\u306b\u66f8\u3044\u305f\u30bf\u30b0\u3060\u3051\u3002\r\n    \/\/ \u300cHTML \u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u30bf\u30b0\u300d\u306b\u3082\u66f8\u3044\u305f\u30bf\u30b0\u306f\u3001\u305d\u3061\u3089\u3092\u512a\u5148\u3059\u308b\uff08\u5148\u306b\u9000\u907f\u3055\u308c\u308b\u305f\u3081\u3001\u3053\u3053\u306b\u306f\u6765\u306a\u3044\uff09\r\n    const fencedTagSet = {};\r\n    const fencedTagsInput = document.getElementById('decodeFencedDivTags');\r\n    (fencedTagsInput ? fencedTagsInput.value : '').split(',').forEach(function (t) {\r\n      const name = t.trim().toLowerCase();\r\n      if (name) fencedTagSet[name] = true;\r\n    });\r\n    const isFencedContainer = function (node) {\r\n      if (!node || node.nodeType !== 1) return false;\r\n      const tag = node.nodeName.toLowerCase();\r\n      if (!fencedTagSet[tag]) return false;\r\n      if (tag === 'div') return node.attributes.length > 0;\r\n      if (tag === 'pre') {\r\n        \/\/<pre><code> \u306f\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u3068\u3057\u3066\u5909\u63db\u3059\u308b\r\n        const first = node.firstElementChild;\r\n        return !(first && first.nodeName === 'CODE' && node.children.length === 1);\r\n      }\r\n      return true;\r\n    };\r\n    turndownService.addRule('fencedDiv', {\r\n      filter: function (node) {\r\n        return isFencedContainer(node);\r\n      },\r\n      replacement: function (content, node) {\r\n        const tagName = node.nodeName.toLowerCase();\r\n        let id = '';\r\n        let classes = [];\r\n        const others = [];\r\n        Array.prototype.forEach.call(node.attributes, function (a) {\r\n          if (a.name === 'id') id = a.value;\r\n          else if (a.name === 'class') classes = a.value.split(' ').filter(Boolean);\r\n          else others.push(a.name + '=\"' + a.value.split('\"').join('&quot;') + '\"');\r\n        });\r\n\r\n        let spec;\r\n        if (tagName === 'div' && !id && others.length === 0) {\r\n          spec = classes.join(' ');\r\n        } else {\r\n          const parts = [];\r\n          if (id) parts.push('#' + id);\r\n          classes.forEach(function (c) { parts.push('.' + c); });\r\n          spec = (parts.length || others.length) ? '{' + parts.concat(others).join(' ') + '}' : '';\r\n        }\r\n        if (tagName !== 'div') spec = tagName + spec;\r\n\r\n        \/\/\u5165\u308c\u5b50\u306e\u3068\u304d\u306f\u3001\u5916\u5074\u307b\u3069 : \u3092\u591a\u304f\u3057\u3066\u898b\u5206\u3051\u3084\u3059\u304f\u3059\u308b\r\n        const nestDepth = function (el) {\r\n          let max = 0;\r\n          Array.prototype.forEach.call(el.children, function (child) {\r\n            const d = nestDepth(child) + (isFencedContainer(child) ? 1 : 0);\r\n            if (d > max) max = d;\r\n          });\r\n          return max;\r\n        };\r\n        const colons = new Array(3 + (tagName === 'pre' ? 0 : nestDepth(node)) + 1).join(':');\r\n\r\n        \/\/<pre> \u306e\u4e2d\u8eab\u306f HTML \u306e\u307e\u307e\uff08encode \u5074\u3082\u3001:::pre \u306e\u4e2d\u8eab\u306f\u5909\u63db\u3057\u306a\u3044\uff09\r\n        const body = (tagName === 'pre') ? node.innerHTML.replace(new RegExp('^' + NL + '|' + NL + '$', 'g'), '') : content.trim();\r\n        return NL + NL + colons + spec + NL + (body ? body + NL : '') + colons + NL + NL;\r\n      }\r\n    });\r\n\r\n    \/\/ \u6298\u308a\u305f\u305f\u307f\u306e\u30a2\u30e9\u30fc\u30c8\uff08encode \u5074\u306e convertCalloutsToDetails \u3068\u5bfe\u79f0\uff09\r\n    \/\/   <summary> \u304c [!\u7a2e\u985e] \u3067\u59cb\u307e\u308b <details> \u2192 > [!\u7a2e\u985e]- \u30bf\u30a4\u30c8\u30eb\uff08open \u3042\u308a\u306a\u3089 +\uff09\r\n    \/\/   \u305d\u308c\u4ee5\u5916\u306e <details> \u306f\u3001\u3053\u308c\u307e\u3067\u3069\u304a\u308a\r\n    const calloutSummaryRe = new RegExp('^(?:' + BS + BS + ')?' + BS + OB + '!(' + OB + 'A-Za-z' + CB + '+)(?:' + BS + BS + ')?' + BS + CB + OB + ' ' + TAB + CB + '*');\r\n    const calloutSummaryOf = function (node) {\r\n      const first = node.firstElementChild;\r\n      if (!first || first.nodeName !== 'SUMMARY') return null;\r\n      return new RegExp('^' + BS + OB + '!').test(first.textContent.trim()) ? first : null;\r\n    };\r\n    turndownService.addRule('calloutDetails', {\r\n      filter: function (node) {\r\n        return node.nodeName === 'DETAILS' && !!calloutSummaryOf(node);\r\n      },\r\n      replacement: function (content, node) {\r\n        const summary = calloutSummaryOf(node);\r\n        const summaryMd = turndownService.turndown(summary.innerHTML).trim();\r\n        const m = summaryMd.match(calloutSummaryRe);\r\n        const type = m ? m[1] : 'NOTE';\r\n        const title = m ? summaryMd.slice(m[0].length).trim() : summaryMd;\r\n\r\n        const clone = node.cloneNode(true);\r\n        clone.removeChild(clone.firstElementChild);\r\n        const bodyMd = turndownService.turndown(clone.innerHTML).trim();\r\n\r\n        const head = '> ' + OB + '!' + type + CB + (node.hasAttribute('open') ? '+' : '-') + (title ? ' ' + title : '');\r\n        const body = bodyMd ? bodyMd.split(NL).map(function (line) { return line === '' ? '>' : '> ' + line; }) : [];\r\n        return NL + NL + [head].concat(body).join(NL) + NL + NL;\r\n      }\r\n    });\r\n\r\n    \/\/ \u811a\u6ce8\uff08encode \u5074\u306e restoreFootnotes \u3068\u5bfe\u79f0\u3002GitHub\u30fbQiita \u306e HTML \u306b\u3082\u5bfe\u5fdc\uff09\r\n    \/\/   <sup><a href=\"#fn-1\">1<\/a><\/sup> \u2192 [^1]\r\n    \/\/   <section class=\"footnotes\"> \u306e\u5404 <li id=\"fn-1\"> \u2192 [^1]: \u5185\u5bb9\r\n    const isFootnoteHref = function (href) {\r\n      const h = String(href || '');\r\n      return h.indexOf('#fn-') === 0 || h.indexOf('#user-content-fn-') === 0;\r\n    };\r\n    const isFootnoteBackHref = function (href) {\r\n      const h = String(href || '');\r\n      return h.indexOf('#fnref-') === 0 || h.indexOf('#user-content-fnref-') === 0;\r\n    };\r\n    turndownService.addRule('footnoteRef', {\r\n      filter: function (node) {\r\n        if (node.nodeName !== 'SUP') return false;\r\n        const a = node.querySelector('a');\r\n        return !!a && isFootnoteHref(a.getAttribute('href'));\r\n      },\r\n      replacement: function (content, node) {\r\n        return OB + '^' + footnoteLabelFrom(node.querySelector('a').getAttribute('href')) + CB;\r\n      }\r\n    });\r\n    turndownService.addRule('footnoteSection', {\r\n      filter: function (node) {\r\n        return node.nodeName === 'SECTION' && (' ' + (node.getAttribute('class') || '') + ' ').indexOf(' footnotes ') !== -1;\r\n      },\r\n      replacement: function (content, node) {\r\n        const defs = [];\r\n        Array.prototype.forEach.call(node.querySelectorAll('li'), function (li) {\r\n          const id = li.getAttribute('id') || '';\r\n          if (id.indexOf('fn-') !== 0 && id.indexOf('user-content-fn-') !== 0) return;\r\n          const clone = li.cloneNode(true);\r\n          Array.prototype.forEach.call(clone.querySelectorAll('a'), function (a) {\r\n            if (isFootnoteBackHref(a.getAttribute('href')) || a.hasAttribute('data-footnote-backref')) {\r\n              a.parentNode.removeChild(a);\r\n            }\r\n          });\r\n          const md = turndownService.turndown(clone.innerHTML).trim();\r\n          \/\/ 2 \u884c\u76ee\u4ee5\u964d\u306f\u5b57\u4e0b\u3052\uff08\u7a7a\u884c\u306f\u305d\u306e\u307e\u307e\uff09\r\n          const body = md.split(NL).map(function (line, i) {\r\n            return (i === 0 || line === '') ? line : '    ' + line;\r\n          }).join(NL);\r\n          defs.push(OB + '^' + footnoteLabelFrom(id) + CB + ': ' + body);\r\n        });\r\n        return defs.length ? NL + NL + defs.join(NL + NL) + NL + NL : '';\r\n      }\r\n    });\r\n\r\n    let text = turndownService.turndown(html);\r\n    text = stripPuaChars(text);\r\n    text = padEmphasisForCjk(text);\r\n    text = stripLeftoverHtmlTags(text);\r\n    \/\/ \u9000\u907f\u3057\u3066\u304a\u3044\u305f\u300cHTML\u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u300d\u30bf\u30b0\u3092\u6700\u5f8c\u306b\u5fa9\u5143\u3059\u308b\u3002\r\n    \/\/ stripLeftoverHtmlTags \u3088\u308a\u5fc5\u305a\u5f8c\uff08\u305d\u3061\u3089\u306b\u307e\u3060\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u306e\r\n    \/\/ \u72b6\u614b\u3067\u898b\u305b\u308b\u3053\u3068\u3067\u3001\u7dad\u6301\u3057\u305f\u3044\u30bf\u30b0\u81ea\u8eab\u304c\u9664\u53bb\u5bfe\u8c61\u306b\u5dfb\u304d\u8fbc\u307e\u308c\u306a\u3044\r\n    \/\/ \u3088\u3046\u306b\u3059\u308b\u305f\u3081\uff09\u3002\r\n    text = restoreKeepAsHtmlTags(text, keepProtected.store);\r\n    \/\/ HTML\u30b3\u30e1\u30f3\u30c8\u3082\u540c\u69d8\u306b\u6700\u5f8c\u306b\u5fa9\u5143\u3059\u308b\u3002\r\n    text = restoreHtmlComments(text, commentProtected.store);\r\n    \/\/ MathJax\u88c5\u98fe\u3082\u540c\u69d8\u306b\u6700\u5f8c\u306b\u5fa9\u5143\u3059\u308b\uff08stripLeftoverHtmlTags\u3067<font>\u3054\u3068\r\n    \/\/ \u9664\u53bb\u3055\u308c\u3066\u3057\u307e\u308f\u306a\u3044\u3088\u3046\u306b\uff09\u3002\r\n    text = restoreMathJaxDecoration(text, mathJaxProtected.store);\r\n\r\n    encode_area.value = text;\r\n    copyToClipboard(text, true);  \/\/ isDecode = true\r\n  }\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u3010STEP6.8\u3011\u30c7\u30b3\u30fc\u30c9\uff08HTML \u2192 Markdown\uff09\uff1a\u300cHTML\u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u300d\u30bf\u30b0\r\n  \/\/   \u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u306b\u66f8\u304b\u308c\u305f\u30bf\u30b0\u540d\uff08\u30ab\u30f3\u30de\u533a\u5207\u308a\uff09\u3092\u5bfe\u8c61\u306b\u3001\u305d\u306e\u30bf\u30b0\r\n  \/\/   \uff08\u5b50\u8981\u7d20\u3054\u3068\uff09\u3092turndown\u306b\u6e21\u3059\u524d\u306eHTML\u6587\u5b57\u5217\u306e\u6642\u70b9\u3067\u4e38\u3054\u3068\u30d7\u30ec\u30fc\u30b9\r\n  \/\/   \u30db\u30eb\u30c0\u30fc\u3078\u9000\u907f\u3057\u3001\u5909\u63db\u5b8c\u4e86\u5f8c\u306b\u5143\u306eHTML\uff08outerHTML\uff09\u3078\u5fa9\u5143\u3059\u308b\u3002\r\n  \/\/   \u30fb\u5165\u308c\u5b50\u306e\u5185\u5074\u306b\u3082\u5bfe\u8c61\u30bf\u30b0\u304c\u3042\u308b\u5834\u5408\u3001\u5916\u5074\u304c\u5bfe\u8c61\u306a\u3089\u305d\u3053\u3067\u6b62\u3081\u3001\r\n  \/\/     \u5916\u5074\u304c\u5bfe\u8c61\u3067\u306a\u3051\u308c\u3070\u5185\u5074\u3092\u518d\u5e30\u7684\u306b\u63a2\u3059\uff08\u4e00\u756a\u5916\u5074\u306e\u5bfe\u8c61\u30bf\u30b0\u5358\u4f4d\u3067\r\n  \/\/     \u4e38\u3054\u3068\u7dad\u6301\u3059\u308b\u3002\u4f8b\uff1a<table>\u306f\u7dad\u6301\u3057\u306a\u3044\u304c\u4e2d\u306e<ul>\u3060\u3051\u7dad\u6301\u3001\u3082\u53ef\u80fd\uff09\u3002\r\n  \/\/   \u30fb\u30d6\u30ed\u30c3\u30af\u8981\u7d20\uff08table\/dl\/ul\/ol\/div\/p\/blockquote\/details\/pre\/hr\uff09\u306f\u3001\r\n  \/\/     \u524d\u5f8c\u306b\u7a7a\u884c\u3092\u5165\u308c\u3066\u72ec\u7acb\u3057\u305f\u6bb5\u843d\u306b\u306a\u308b\u3088\u3046\u306b\u3059\u308b\uff08<p>\u3067\u5305\u3093\u3067\u304a\u304d\u3001\r\n  \/\/     turndown\u306e\u6bb5\u843d\u30eb\u30fc\u30eb\u306b\u4efb\u305b\u308b\uff09\u3002\u305d\u308c\u4ee5\u5916\u306f\u30a4\u30f3\u30e9\u30a4\u30f3\u306e\u307e\u307e\u3002\r\n  \/\/ ============================================================================\r\n  \/\/   \u30fb\u300c\u30bf\u30b0\u3060\u3051 HTML \u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u30bf\u30b0\u300d\uff08decodeKeepTagOnlyTags\uff09\u306f\u3001\u958b\u304d\u30bf\u30b0\u3068\r\n  \/\/     \u9589\u3058\u30bf\u30b0\u3060\u3051\u3092\u9000\u907f\u3057\u3001\u4e2d\u8eab\u306f\u901a\u5e38\u3069\u304a\u308a Markdown \u306b\u5909\u63db\u3059\u308b\r\n  \/\/     \uff08\u4f8b\uff1a<section> \u306e\u4e2d\u306e\u898b\u51fa\u3057\u3084\u6bb5\u843d\u306f Markdown \u306b\u3057\u305f\u3044\u3068\u304d\uff09\u3002\r\n  \/\/     \u4e21\u65b9\u306e\u6b04\u306b\u66f8\u3044\u305f\u30bf\u30b0\u306f\u3001\u4e38\u3054\u3068\u7dad\u6301\u3059\u308b\u5074\u3092\u512a\u5148\u3059\u308b\u3002\r\n  function protectKeepAsHtmlTags(html) {\r\n    function readTagSet(id) {\r\n      const ta = document.getElementById(id);\r\n      const set = {};\r\n      (ta ? ta.value : '').split(',').forEach(function (t) {\r\n        const name = t.trim().toLowerCase();\r\n        if (name) set[name] = true;\r\n      });\r\n      return set;\r\n    }\r\n    \/\/ \u300c\u30bf\u30b0\u3092\u4e2d\u8eab\u3054\u3068\u7dad\u6301\u3059\u308b\u300d\u6b04\uff08decodeKeepAsHtmlTags\uff09\u306f\u5ec3\u6b62\u3002\u30bf\u30b0\u3060\u3051\u3092\u7dad\u6301\u3059\u308b\u6b04\u306e\u307f\r\n    const keepSet = {};\r\n    const tagOnlySet = readTagSet('decodeKeepTagOnlyTags');\r\n    if (Object.keys(tagOnlySet).length === 0) {\r\n      return { html: html, store: [] };\r\n    }\r\n\r\n    \/\/ \u7a7a\u8981\u7d20\uff08\u9589\u3058\u30bf\u30b0\u306e\u306a\u3044\u30bf\u30b0\uff09\u306f\u3001\u958b\u304d\u30bf\u30b0\u3060\u3051\u3092\u7dad\u6301\u3059\u308b\r\n    const VOID_TAGS = {\r\n      area: true, br: true, col: true, embed: true, hr: true, img: true, input: true,\r\n      link: true, meta: true, source: true, track: true, wbr: true\r\n    };\r\n\r\n    \/\/ \u30bf\u30b0\u3060\u3051\u3092\u7dad\u6301\u3059\u308b\u3068\u304d\u306b\u3001\u76ee\u5370\u3092\u30a4\u30f3\u30e9\u30a4\u30f3\u306e\u307e\u307e\u7f6e\u304f\u30bf\u30b0\uff08\u305d\u308c\u4ee5\u5916\u306f\u6bb5\u843d\u3068\u3057\u3066\u7f6e\u304f\uff09\r\n    const INLINE_TAGS = {\r\n      a: true, abbr: true, b: true, cite: true, code: true, em: true, font: true, i: true,\r\n      kbd: true, label: true, mark: true, q: true, s: true, samp: true, small: true,\r\n      span: true, strong: true, sub: true, sup: true, u: true, var: true, img: true, br: true, wbr: true\r\n    };\r\n\r\n    const BLOCK_TAGS = {\r\n      table: true, dl: true, ul: true, ol: true, div: true,\r\n      p: true, blockquote: true, details: true, pre: true, hr: true\r\n    };\r\n\r\n    const container = document.createElement('div');\r\n    container.innerHTML = html;\r\n    const store = [];\r\n\r\n    function walk(el) {\r\n      Array.prototype.slice.call(el.children).forEach(function (child) {\r\n        const tag = child.tagName.toLowerCase();\r\n        if (keepSet[tag]) {\r\n          const idx = store.length;\r\n          store.push(child.outerHTML);\r\n          const token = 'XKEEPX' + idx + 'XKEEPX';\r\n          let replacementNode;\r\n          if (BLOCK_TAGS[tag]) {\r\n            replacementNode = document.createElement('p');\r\n            replacementNode.textContent = token;\r\n          } else {\r\n            replacementNode = document.createTextNode(token);\r\n          }\r\n          child.parentNode.replaceChild(replacementNode, child);\r\n        } else if (tagOnlySet[tag]) {\r\n          \/\/ \u958b\u304d\u30bf\u30b0\uff08\u5c5e\u6027\u3092\u542b\u3080\uff09\u3068\u9589\u3058\u30bf\u30b0\u3060\u3051\u3092\u76ee\u5370\u306b\u7f6e\u304d\u63db\u3048\u3001\u4e2d\u8eab\u306f\u305d\u306e\u307e\u307e\u6b8b\u3059\r\n          let openTag = '<' + tag;\r\n          Array.prototype.forEach.call(child.attributes, function (a) {\r\n            openTag += ' ' + a.name + '=\"' + a.value.split('\"').join('&quot;') + '\"';\r\n          });\r\n          openTag += '>';\r\n          const makeToken = function (str) {\r\n            const idx = store.length;\r\n            store.push(str);\r\n            const token = 'XKEEPX' + idx + 'XKEEPX';\r\n            if (INLINE_TAGS[tag]) return document.createTextNode(token);\r\n            const p = document.createElement('p');\r\n            p.textContent = token;\r\n            return p;\r\n          };\r\n          \/\/ \u4e2d\u8eab\u306e\u4e2d\u306e\u5bfe\u8c61\u30bf\u30b0\u3082\u63a2\u3057\u3066\u304b\u3089\u3001\u89aa\u306e\u5b50\u8981\u7d20\u3068\u3057\u3066\u4e26\u3079\u76f4\u3059\r\n          walk(child);\r\n          const parent = child.parentNode;\r\n          parent.insertBefore(makeToken(openTag), child);\r\n          while (child.firstChild) parent.insertBefore(child.firstChild, child);\r\n          if (!VOID_TAGS[tag]) parent.insertBefore(makeToken('<\/' + tag + '>'), child);\r\n          parent.removeChild(child);\r\n        } else {\r\n          walk(child);\r\n        }\r\n      });\r\n    }\r\n    walk(container);\r\n\r\n    return { html: container.innerHTML, store: store };\r\n  }\r\n\r\n  function restoreKeepAsHtmlTags(text, store) {\r\n    if (!store || !store.length) return text;\r\n    const re = new RegExp('XKEEPX(' + BS + 'd+)XKEEPX', 'g');\r\n    return text.replace(re, function (m, idxStr) {\r\n      return store[parseInt(idxStr, 10)];\r\n    });\r\n  }\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u3010STEP6.9\u3011\u30c7\u30b3\u30fc\u30c9\uff08HTML \u2192 Markdown\uff09\uff1a\u30b3\u30e1\u30f3\u30c8\u306e\u7dad\u6301\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\r\n  \/\/   turndown\u306f\u30b3\u30e1\u30f3\u30c8\u30ce\u30fc\u30c9\uff08<!-- ... -->\uff09\u3092\u7d20\u901a\u308a\u3067\u304d\u305a\u3001\u65e2\u5b9a\u3067\u306f\r\n  \/\/   \u307e\u308b\u3054\u3068\u6d88\u3048\u308b\u3002\u30a8\u30f3\u30b3\u30fc\u30c9\u5074\uff08Markdown\u2192HTML\uff09\u306f\u30b3\u30e1\u30f3\u30c8\u3092\u305d\u306e\u307e\u307e\r\n  \/\/   \u7dad\u6301\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u65b9\u5411\u306b\u3088\u3063\u3066\u6319\u52d5\u304c\u975e\u5bfe\u79f0\u306b\u306a\u3063\u3066\u3044\u305f\u306e\u3092\u3001\r\n  \/\/   \u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3067\u3069\u3061\u3089\u306e\u6319\u52d5\u3082\u9078\u3079\u308b\u3088\u3046\u306b\u3059\u308b\u3002\r\n  \/\/   \u30fb\u300cHTML\u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u30bf\u30b0\u300d\u306e\u201c\u5f8c\u201d\u306b\u51e6\u7406\u3059\u308b\u306e\u3067\u3001\u7dad\u6301\u30bf\u30b0\u306e\u4e2d\u306b\r\n  \/\/     \u5143\u304b\u3089\u3042\u3063\u305f\u30b3\u30e1\u30f3\u30c8\u306f\u3001\u305d\u306e\u30bf\u30b0\u306e\u751fHTML\u306e\u4e00\u90e8\u3068\u3057\u3066\u81ea\u52d5\u7684\u306b\r\n  \/\/     \u305d\u306e\u307e\u307e\u6b8b\u308b\uff08\u3053\u3053\u3067\u5225\u9014\u4fdd\u8b77\u3059\u308b\u5fc5\u8981\u304c\u7121\u3044\uff09\u3002\r\n  \/\/   \u30fb\u3053\u3053\u3067\u4fdd\u8b77\u3059\u308b\u306e\u306f\u3001\u5b9f\u969b\u306bMarkdown\u3078\u5909\u63db\u3055\u308c\u308b\u5074\u306b\u6b8b\u3063\u3066\u3044\u308b\r\n  \/\/     \u30b3\u30e1\u30f3\u30c8\u3060\u3051\u3002\r\n  \/\/ ============================================================================\r\n  function protectHtmlComments(html) {\r\n    const btn = document.getElementById('decodeKeepComments');\r\n    if (!btn || !btn.checked) return { html: html, store: [] };\r\n\r\n    const container = document.createElement('div');\r\n    container.innerHTML = html;\r\n    const store = [];\r\n\r\n    function walk(node) {\r\n      Array.prototype.slice.call(node.childNodes).forEach(function (child) {\r\n        if (child.nodeType === 8) { \/\/ Comment\r\n          const idx = store.length;\r\n          store.push('<!--' + child.data + '-->');\r\n          const token = document.createTextNode('XCMNTX' + idx + 'XCMNTX');\r\n          child.parentNode.replaceChild(token, child);\r\n        } else if (child.nodeType === 1) { \/\/ Element\r\n          walk(child);\r\n        }\r\n      });\r\n    }\r\n    walk(container);\r\n\r\n    return { html: container.innerHTML, store: store };\r\n  }\r\n\r\n  function restoreHtmlComments(text, store) {\r\n    if (!store || !store.length) return text;\r\n    const re = new RegExp('XCMNTX(' + BS + 'd+)XCMNTX', 'g');\r\n    return text.replace(re, function (m, idxStr) {\r\n      return store[parseInt(idxStr, 10)];\r\n    });\r\n  }\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u3010STEP6.10\u3011\u30c7\u30b3\u30fc\u30c9\uff08HTML \u2192 Markdown\uff09\uff1aMathJax\u88c5\u98fe\u3078\u306e\u5909\u63db\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\r\n  \/\/   \u6307\u5b9a\u3057\u305f\u30bf\u30b0\uff08\u4f8b\uff1a<small>\u30fb<mark>\uff09\u3092\u3001Qiita\u3067\u5b89\u5b9a\u3057\u3066\u52b9\u304fMathJax\u88c5\u98fe\u306b\r\n  \/\/   \u7f6e\u304d\u63db\u3048\u308b\uff1a\r\n  \/\/     <small>\u4e2d\u8eab<\/small>  \u2192  <font>$\\small{\\mathsf{ \u4e2d\u8eab }}$<\/font>\r\n  \/\/     <mark>\u4e2d\u8eab<\/mark>    \u2192  <font>$\\bbox[yellow]{\\mathsf{ \u4e2d\u8eab }}$<\/font>\r\n  \/\/   \u30fb\u56f2\u3080\u30bf\u30b0\u306f<font>\u56fa\u5b9a\uff08color\u304c\u5b89\u5b9a\u3057\u3066\u52b9\u304f\u305f\u3081\uff09\u3002\r\n  \/\/   \u30fb\\mathsf{} \u3067\u5185\u5074\u3092\u5305\u3080\u306e\u306f\u3001\u65e2\u5b9a\u306e\u30a4\u30bf\u30ea\u30c3\u30af\u4f53\u3060\u3068\u62ec\u5f27\u30fb\u6570\u5b57\u304c\r\n  \/\/     \u5d29\u308c\u308b\uff0f\u30d5\u30a9\u30f3\u30c8\u7cfb\u30b3\u30de\u30f3\u30c9\u306f\u5185\u5074\u306b\u5165\u308c\u306a\u3044\u3068\u52b9\u304b\u306a\u3044\u305f\u3081\u3002\r\n  \/\/   \u30fb\u4e2d\u8eab\u306f\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u53d6\u308a\u51fa\u3059\uff08MathJax\u306e\u6570\u5f0f\u30e2\u30fc\u30c9\u4e2d\u306b\r\n  \/\/     Markdown\/HTML\u306e\u5165\u308c\u5b50\u88c5\u98fe\u306f\u57fa\u672c\u7684\u306b\u52b9\u304b\u306a\u3044\u305f\u3081\uff09\u3002\r\n  \/\/   \u30fb\u4ed6\u306e\u4fdd\u8b77\uff08\u300cHTML\u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u30bf\u30b0\u300d\u7b49\uff09\u3088\u308a\u5148\u306b\u51e6\u7406\u3059\u308b\r\n  \/\/     \uff08\uff1d\u3088\u308a\u5177\u4f53\u7684\u306a\u6307\u5b9a\u3068\u3057\u3066\u512a\u5148\u3059\u308b\uff09\u3002\r\n  \/\/ ============================================================================\r\n  function protectMathJaxDecoration(html) {\r\n    const rules = [\r\n      { checkboxId: 'decodeMathJax1s', tagId: 'decodeMathJaxTag1', cmdId: 'decodeMathJaxCmd1' },\r\n      { checkboxId: 'decodeMathJax2s', tagId: 'decodeMathJaxTag2', cmdId: 'decodeMathJaxCmd2' }\r\n    ];\r\n\r\n    const activeRules = {};\r\n    rules.forEach(function (r) {\r\n      const cb = document.getElementById(r.checkboxId);\r\n      if (!cb || !cb.checked) return;\r\n      const tagEl = document.getElementById(r.tagId);\r\n      const cmdEl = document.getElementById(r.cmdId);\r\n      const tagName = tagEl ? tagEl.value.trim().toLowerCase() : '';\r\n      const cmd = cmdEl ? cmdEl.value.trim() : '';\r\n      if (!tagName || !cmd) return;\r\n      activeRules[tagName] = cmd;\r\n    });\r\n\r\n    if (Object.keys(activeRules).length === 0) {\r\n      return { html: html, store: [] };\r\n    }\r\n\r\n    const container = document.createElement('div');\r\n    container.innerHTML = html;\r\n    const store = [];\r\n\r\n    function walk(el) {\r\n      Array.prototype.slice.call(el.children).forEach(function (child) {\r\n        const tag = child.tagName.toLowerCase();\r\n        const cmd = activeRules[tag];\r\n        if (cmd) {\r\n          const content = child.textContent.trim();\r\n          const replacement = '<font>$' + cmd + '{' + BS + 'mathsf{ ' + content + ' }}$<\/font>';\r\n          const idx = store.length;\r\n          store.push(replacement);\r\n          const token = document.createTextNode('XMJAXX' + idx + 'XMJAXX');\r\n          child.parentNode.replaceChild(token, child);\r\n        } else {\r\n          walk(child);\r\n        }\r\n      });\r\n    }\r\n    walk(container);\r\n\r\n    return { html: container.innerHTML, store: store };\r\n  }\r\n\r\n  function restoreMathJaxDecoration(text, store) {\r\n    if (!store || !store.length) return text;\r\n    const re = new RegExp('XMJAXX(' + BS + 'd+)XMJAXX', 'g');\r\n    return text.replace(re, function (m, idxStr) {\r\n      return store[parseInt(idxStr, 10)];\r\n    });\r\n  }\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u3010STEP6.6-3\u3011\u30c7\u30b3\u30fc\u30c9\uff08HTML \u2192 Markdown\uff09\uff1aUnicode \u79c1\u7528\u9818\u57df\uff08PUA\uff09\u6587\u5b57\u306e\u524a\u9664\r\n  \/\/   \u30a2\u30a4\u30b3\u30f3\u30d5\u30a9\u30f3\u30c8\uff08<i class=\"icon ...\">\u7b49\uff09\u304c\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066PUA\u6587\u5b57\u3092\r\n  \/\/   \u57cb\u3081\u8fbc\u3093\u3067\u3044\u308b\u5834\u5408\u3001turndown\u306e\u65e2\u5b9a\u30eb\u30fc\u30eb\u306f\u305d\u308c\u3082\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u62fe\u3063\u3066\r\n  \/\/   \u3057\u307e\u3044\u3001\u610f\u5473\u306e\u7121\u3044\uff08\u8868\u793a\u3082\u3055\u308c\u306a\u3044\uff09\u6587\u5b57\u304c\u51fa\u529b\u306b\u6df7\u5165\u3059\u308b\u3002\u6700\u7d42\u51fa\u529b\u304b\u3089\r\n  \/\/   \u307e\u3068\u3081\u3066\u53d6\u308a\u9664\u304f\u3002\r\n  \/\/   \u5bfe\u8c61\u7bc4\u56f2\uff1a\u57fa\u672c\u79c1\u7528\u9818\u57df\uff08U+E000-U+F8FF\uff09\u3001\u88dc\u52a9\u79c1\u7528\u9818\u57dfA\u30fbB\r\n  \/\/   \uff08U+F0000-U+FFFFD\u3001U+100000-U+10FFFD\uff09\r\n  \/\/ ============================================================================\r\n  function stripPuaChars(text) {\r\n    const cc = String.fromCharCode;\r\n    const cp = String.fromCodePoint;\r\n    const puaRanges =\r\n      cc(0xe000) + '-' + cc(0xf8ff) +\r\n      cp(0xf0000) + '-' + cp(0xffffd) +\r\n      cp(0x100000) + '-' + cp(0x10fffd);\r\n    const re = new RegExp(OB + puaRanges + CB, 'gu');\r\n    return text.replace(re, '');\r\n  }\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u3010STEP6.6-4\u3011\u30c7\u30b3\u30fc\u30c9\uff08HTML \u2192 Markdown\uff09\uff1aZenn\/Qiita\u5bfe\u7b56\r\n  \/\/   \u592a\u5b57\uff08**\uff09\u30fb\u659c\u4f53\uff08*\uff09\u306e\u5916\u5074\u304cCJK\u6587\u5b57\uff08\u65e5\u672c\u8a9e\u7b49\uff09\u306b\u76f4\u63a5\u96a3\u63a5\u3057\u3066\u3044\u308b\u5834\u5408\u3060\u3051\u3001\r\n  \/\/   \u305d\u306e\u5074\u306b\u534a\u89d2\u30b9\u30da\u30fc\u30b9\u30921\u500b\u5165\u308c\u308b\u3002CJK\u62e1\u5f35\u4ed5\u69d8\u3092\u6301\u305f\u306a\u3044\u30d1\u30fc\u30b5\u30fc\u3067\u3082\u592a\u5b57\u30fb\r\n  \/\/   \u659c\u4f53\u304c\u78ba\u5b9f\u306b\u8a8d\u8b58\u3055\u308c\u308b\u3088\u3046\u306b\u3059\u308b\u305f\u3081\u306e\u5b89\u5168\u30de\u30fc\u30b8\u30f3\u3002\r\n  \/\/   \u30fb\u5916\u5074\u304c\u65e2\u306b\u7a7a\u767d\uff0f\u884c\u982d\uff0f\u884c\u672b\uff0f\u7d04\u7269\uff08\u30b3\u30ed\u30f3\u7b49\uff09\u306e\u5834\u5408\u306f\u4f55\u3082\u3057\u306a\u3044\r\n  \/\/     \uff08\u4e0d\u8981\u306a\u30b9\u30da\u30fc\u30b9\u3092\u5165\u308c\u3066\u8868\u793a\u3092\u5909\u3048\u3066\u3057\u307e\u308f\u306a\u3044\u305f\u3081\uff09\r\n  \/\/   \u30fb\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u30fb\u30a4\u30f3\u30e9\u30a4\u30f3\u30b3\u30fc\u30c9\u306e\u4e2d\u8eab\u306f\u5bfe\u8c61\u5916\uff08\u9000\u907f\u3057\u3066\u304b\u3089\u51e6\u7406\u3059\u308b\uff09\r\n  \/\/   \u30fb\u5165\u308c\u5b50\u306e\u5f37\u8abf\uff08**\u592a\u5b57 *\u659c\u4f53* \u592a\u5b57**\uff09\u306f\u3001\u5916\u5074\u306e\u5f37\u8abf1\u7d44\u5206\u3060\u3051\u3092\u5bfe\u8c61\u3068\u3059\u308b\r\n  \/\/     \uff08\u5185\u5074\u306e\u5f37\u8abf\u8a18\u53f7\u307e\u3067\u306f\u8e0f\u307f\u8fbc\u307e\u306a\u3044\u3002\u307e\u308c\u306a\u30b1\u30fc\u30b9\u306e\u305f\u3081\u7c21\u6613\u5bfe\u5fdc\uff09\r\n  \/\/ ============================================================================\r\n  function padEmphasisForCjk(text) {\r\n    const store = [];\r\n    const TOKEN_PREFIX = 'XEMPADX';\r\n    const TOKEN_SUFFIX = 'XEMPADX';\r\n\r\n    function stash(s) {\r\n      const idx = store.length;\r\n      store.push(s);\r\n      return TOKEN_PREFIX + idx + TOKEN_SUFFIX;\r\n    }\r\n\r\n    \/\/ \u30d5\u30a7\u30f3\u30b9\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\uff083\u500b\u4ee5\u4e0a\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3067\u958b\u304d\u3001\u540c\u6570\u306e\u30d0\u30c3\u30af\r\n    \/\/ \u30af\u30a9\u30fc\u30c8\u306e\u307f\u306e\u884c\u3067\u9589\u3058\u308b\uff09\u3092\u9000\u907f\u3059\u308b\u3002\r\n    const fenceRe = new RegExp(\r\n      '^(`{3,})[^' + NL + ']*' + NL + '[^]*?' + NL + BS + '1[ ' + TAB + ']*$',\r\n      'gm'\r\n    );\r\n    text = text.replace(fenceRe, function (m) { return stash(m); });\r\n\r\n    \/\/ \u30a4\u30f3\u30e9\u30a4\u30f3\u30b3\u30fc\u30c9\u30b9\u30d1\u30f3\uff08`code` \u3084 ``code` \u3092\u542b\u3080code`` \u7b49\uff09\u3092\u9000\u907f\u3059\u308b\u3002\r\n    \/\/ \u958b\u304d\u30fb\u9589\u3058\u3068\u3082\u3001\u524d\u5f8c\u306b\u5225\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u304c\u7d9a\u304b\u306a\u3044\u300c\u540c\u3058\u500b\u6570\u300d\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3060\u3051\u3092\u5bfe\u306b\u3059\u308b\r\n    \/\/ \uff08` ``` ` \u306e\u3088\u3046\u306b\u4e2d\u306b\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3092\u542b\u3080\u30b3\u30fc\u30c9\u3067\u3001\u9014\u4e2d\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3092\u9589\u3058\u3068\u8aa4\u8a8d\u3057\u306a\u3044\u305f\u3081\uff09\u3002\r\n    \/\/ \u7a7a\u884c\u306f\u307e\u305f\u304c\u306a\u3044\uff08\u9589\u3058\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306b\u3001\u6bb5\u843d\u3092\u8d8a\u3048\u3066\u5148\u307e\u3067\u5dfb\u304d\u8fbc\u307e\u306a\u3044\u305f\u3081\uff09\u3002\r\n    const inlineCodeRe = new RegExp('(?<!`)(`+)(?!`)(?:(?!' + NL + '[ ' + TAB + ']*' + NL + ')[^])*?(?<!`)' + BS + '1(?!`)', 'g');\r\n    text = text.replace(inlineCodeRe, function (m) { return stash(m); });\r\n\r\n    \/\/ CJK\u6587\u5b57\u306e\u7bc4\u56f2\uff08Step5.4\u306e\u5f37\u8abf\u8a18\u53f7\u4fee\u6b63\u3068\u540c\u3058\u7bc4\u56f2\uff09\r\n    const cc = String.fromCharCode;\r\n    const cp = String.fromCodePoint;\r\n    const CJK_CLASS =\r\n      cc(0x3000) + '-' + cc(0x303f) +\r\n      cc(0x3041) + '-' + cc(0x3096) +\r\n      cc(0x30a0) + '-' + cc(0x30ff) +\r\n      cc(0x3400) + '-' + cc(0x4dbf) +\r\n      cc(0x4e00) + '-' + cc(0x9fff) +\r\n      cc(0xf900) + '-' + cc(0xfaff) +\r\n      cc(0xff00) + '-' + cc(0xffef) +\r\n      cc(0xac00) + '-' + cc(0xd7a3) +\r\n      cc(0x1100) + '-' + cc(0x11ff) +\r\n      cc(0x2018) + cc(0x2019) + cc(0x201c) + cc(0x201d) +\r\n      cp(0x20000) + '-' + cp(0x2ffff);\r\n    const cjkTestRe = new RegExp('^[' + CJK_CLASS + ']$', 'u');\r\n\r\n    \/\/ \u30b5\u30ed\u30b2\u30fc\u30c8\u30da\u30a2\uff08\u8ffd\u52a0\u6f22\u5b57\u9762\u306a\u3069\u306e1\u6587\u5b57\u304c2\u30b3\u30fc\u30c9\u30e6\u30cb\u30c3\u30c8\u306e\u5834\u5408\uff09\u3092\r\n    \/\/ \u8003\u616e\u3057\u3066\u3001\u6307\u5b9a\u4f4d\u7f6e\u306e\u524d\u5f8c\u306e\u300c1\u6587\u5b57\u5206\u300d\u3092\u6b63\u3057\u304f\u53d6\u308a\u51fa\u3059\u3002\r\n    function codePointBefore(str, index) {\r\n      if (index <= 0) return '';\r\n      const low = str.charCodeAt(index - 1);\r\n      if (index >= 2 && low >= 0xdc00 && low <= 0xdfff) {\r\n        const high = str.charCodeAt(index - 2);\r\n        if (high >= 0xd800 && high <= 0xdbff) return str.slice(index - 2, index);\r\n      }\r\n      return str.slice(index - 1, index);\r\n    }\r\n    function codePointAfter(str, index) {\r\n      if (index >= str.length) return '';\r\n      const high = str.charCodeAt(index);\r\n      if (high >= 0xd800 && high <= 0xdbff && index + 1 < str.length) {\r\n        const low = str.charCodeAt(index + 1);\r\n        if (low >= 0xdc00 && low <= 0xdfff) return str.slice(index, index + 2);\r\n      }\r\n      return str.slice(index, index + 1);\r\n    }\r\n\r\n    \/\/ ***\u592a\u5b57\u659c\u4f53***\uff083\u9023\u7d9a\uff09\u3092\u5148\u306b\u8a66\u3059\uff082\u9023\u7d9a \"**\" \u3060\u3051\u3092\u5148\u306b\u53d6\u3063\u3066\u3057\u307e\u3046\u3068\u3001\r\n    \/\/ 3\u500b\u76ee\u306e * \u304c\u5b64\u7acb\u3057\u3066\u96e2\u308c\u305f\u5834\u6240\u306e * \u3068\u8aa4\u3063\u3066\u30da\u30a2\u306b\u306a\u308a\u3001\u9593\u306e\u6587\u7ae0\u304c\r\n    \/\/ \u4e38\u3054\u3068\u5dfb\u304d\u8fbc\u307e\u308c\u3066\u58ca\u308c\u308b\u305f\u3081\u3001\u9577\u3044\u65b9\u304b\u3089\u9806\u306b\u8a66\u3059\uff09\u3002\r\n    \/\/ \u4e2d\u8eab\u5074\u306f\u300c\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\uff0b\u4efb\u610f\u306e1\u6587\u5b57\u300d\u3092\u3072\u3068\u304b\u305f\u307e\u308a\u3068\u3057\u3066\u6271\u3046\r\n    \/\/ \uff08\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u3067\u30a8\u30b9\u30b1\u30fc\u30d7\u6e08\u307f\u306e\u30a2\u30b9\u30bf\u30ea\u30b9\u30af\u304c\u3001\u5358\u72ec\u306e * \u3068\u3057\u3066\r\n    \/\/ \u9589\u3058\u8a18\u53f7\u306b\u8aa4\u3063\u3066\u4f7f\u308f\u308c\u3066\u3057\u307e\u3046\u306e\u3092\u9632\u3050\u305f\u3081\uff09\u3002\r\n    const escapedPair = BS + BS + '[^]';\r\n    const emphasisRe = new RegExp(\r\n      '(' + BS + '*' + BS + '*' + BS + '*' + '|' + BS + '*' + BS + '*' + '|' + BS + '*' + ')' +\r\n      '((?:' + escapedPair + '|[^*])+?)' +\r\n      BS + '1',\r\n      'g'\r\n    );\r\n    text = text.replace(emphasisRe, function (match, delim, content, offset, whole) {\r\n      const before = codePointBefore(whole, offset);\r\n      const after = codePointAfter(whole, offset + match.length);\r\n      const leadSpace = (before && cjkTestRe.test(before)) ? ' ' : '';\r\n      const trailSpace = (after && cjkTestRe.test(after)) ? ' ' : '';\r\n      return leadSpace + delim + content + delim + trailSpace;\r\n    });\r\n\r\n    \/\/ \u9000\u907f\u3057\u3066\u304a\u3044\u305f\u30b3\u30fc\u30c9\u3092\u5fa9\u5143\u3059\u308b\u3002\r\n    const restoreRe = new RegExp(TOKEN_PREFIX + '(' + BS + 'd+)' + TOKEN_SUFFIX, 'g');\r\n    \/\/ \u9000\u907f\u3057\u305f\u4e2d\u8eab\u306b\u5225\u306e\u9000\u907f\u30c8\u30fc\u30af\u30f3\u304c\u5165\u3063\u3066\u3044\u308b\u5834\u5408\u3082\u3042\u308b\u306e\u3067\u3001\u30c8\u30fc\u30af\u30f3\u304c\u306a\u304f\u306a\u308b\u307e\u3067\u7e70\u308a\u8fd4\u3059\r\n    \/\/ \uff08\u56de\u6570\u306e\u4e0a\u9650\u306f\u3001\u9000\u907f\u3057\u305f\u6570\u3092\u8d85\u3048\u308b\u3053\u3068\u306f\u306a\u3044\u306e\u3067 store.length + 1 \u56de\uff09\u3002\r\n    for (let n = 0; n <= store.length && text.indexOf(TOKEN_PREFIX) !== -1; n++) {\r\n      text = text.replace(restoreRe, function (m, idxStr) {\r\n        return store[parseInt(idxStr, 10)];\r\n      });\r\n    }\r\n\r\n    return text;\r\n  }\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u3010STEP6.7\u3011\u30c7\u30b3\u30fc\u30c9\uff08HTML \u2192 Markdown\uff09\uff1a\u5909\u63db\u5f8c\u306b\u6b8b\u3063\u305fHTML\u30bf\u30b0\u306e\u9664\u53bb\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\r\n  \/\/   turndown\u304c\u8a8d\u8b58\u3057\u306a\u3044\u30bf\u30b0\u306f\u65e2\u5b9a\u3067\u3082\u4e2d\u8eab\u306e\u30c6\u30ad\u30b9\u30c8\u3060\u3051\u304c\u6b8b\u308b\uff08\u30bf\u30b0\u81ea\u4f53\u306f\r\n  \/\/   \u81ea\u7136\u306b\u6d88\u3048\u308b\uff09\u304c\u3001\u4eca\u5f8c\uff08img\/dl\/table\/font\u7b49\uff09\"HTML\u306e\u307e\u307e\u7dad\u6301\u3059\u308b\"\r\n  \/\/   \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\u3057\u3066\u3044\u304f\u3068\u3001\u610f\u56f3\u7684\u306b\u6b8b\u3057\u305f\u30bf\u30b0\u4ee5\u5916\u306e\u201c\u60f3\u5b9a\u5916\u306e\u6b8b\u9ab8\u201d\u3092\r\n  \/\/   \u307e\u3068\u3081\u3066\u7247\u4ed8\u3051\u305f\u3044\u5834\u9762\u304c\u51fa\u3066\u304f\u308b\u3002\u305d\u306e\u305f\u3081\u306e\u5b89\u5168\u5f01\u3002\r\n  \/\/   \u30fb\u65e2\u5b9a\u306f\u30aa\u30d5\uff08\u30c1\u30a7\u30c3\u30af\u3092\u5165\u308c\u305f\u3068\u304d\u3060\u3051\u52d5\u304f\uff09\u3002\u7406\u7531\uff1a\u958b\u59cb\u30bf\u30b0\u301c\u7d42\u4e86\u30bf\u30b0\u3092\r\n  \/\/     \u3072\u3068\u307e\u3068\u307e\u308a\u3068\u3057\u3066\u4e38\u3054\u3068\u6d88\u3059\u3088\u3046\u306a\u5b9f\u88c5\u3060\u3068\u3001\u4e2d\u8eab\u306e\u6587\u7ae0\u3054\u3068\u6d88\u3048\u3066\u3057\u307e\u3046\r\n  \/\/     \u4e8b\u6545\u304c\u8d77\u304d\u3084\u3059\u3044\u305f\u3081\u3002\u3053\u3053\u3067\u306f\u958b\u59cb\uff0f\u7d42\u4e86\u30bf\u30b0\u305d\u308c\u305e\u308c\u3092\u500b\u5225\u306b\u53d6\u308a\u9664\u304f\r\n  \/\/     \u3060\u3051\u3067\u3001\u306f\u3055\u307e\u308c\u3066\u3044\u305f\u6587\u7ae0\u306f\u305d\u306e\u307e\u307e\u6b8b\u3059\u3002\r\n  \/\/   \u30fb<br> \u306f\u672c\u30c4\u30fc\u30eb\u81ea\u8eab\u304c\u30bb\u30eb\u5185\u30fb\u30ea\u30b9\u30c8\u9805\u76ee\u5185\u306e\u6539\u884c\u3068\u3057\u3066\u610f\u56f3\u7684\u306b\u51fa\u529b\u3057\u3066\r\n  \/\/     \u3044\u308b\u3082\u306e\u306a\u306e\u3067\u5bfe\u8c61\u5916\u3002\r\n  \/\/   \u30fb\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u30fb\u30a4\u30f3\u30e9\u30a4\u30f3\u30b3\u30fc\u30c9\u306e\u4e2d\u8eab\u306f\u5bfe\u8c61\u5916\uff08\u9000\u907f\u3057\u3066\u304b\u3089\u51e6\u7406\u3059\u308b\uff09\u3002\r\n  \/\/   \u203b \u5c06\u6765\u3001img\/dl\/table\/font\u7b49\u3092\u300cHTML\u306e\u307e\u307e\u7dad\u6301\u3059\u308b\u300d\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\u3057\u305f\r\n  \/\/     \u5834\u5408\u3001\u305d\u308c\u3089\u306e\u30bf\u30b0\u3082\u3053\u306e\u9664\u53bb\u5bfe\u8c61\u304b\u3089\u9664\u5916\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3002\r\n  \/\/ ============================================================================\r\n  function stripLeftoverHtmlTags(text) {\r\n    const btn = document.getElementById('decodeRemoveHtmlTags');\r\n    if (!btn || !btn.checked) return text;\r\n\r\n    const store = [];\r\n    const TOKEN_PREFIX = 'XTAGRMX';\r\n    const TOKEN_SUFFIX = 'XTAGRMX';\r\n    function stash(s) {\r\n      const idx = store.length;\r\n      store.push(s);\r\n      return TOKEN_PREFIX + idx + TOKEN_SUFFIX;\r\n    }\r\n\r\n    const fenceRe = new RegExp(\r\n      '^(`{3,})[^' + NL + ']*' + NL + '[^]*?' + NL + BS + '1[ ' + TAB + ']*$',\r\n      'gm'\r\n    );\r\n    text = text.replace(fenceRe, function (m) { return stash(m); });\r\n\r\n    \/\/ \u958b\u304d\u30fb\u9589\u3058\u3068\u3082\u3001\u524d\u5f8c\u306b\u5225\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u304c\u7d9a\u304b\u306a\u3044\u300c\u540c\u3058\u500b\u6570\u300d\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3060\u3051\u3092\u5bfe\u306b\u3059\u308b\r\n    \/\/ \uff08` ``` ` \u306e\u3088\u3046\u306b\u4e2d\u306b\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3092\u542b\u3080\u30b3\u30fc\u30c9\u3067\u3001\u9014\u4e2d\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3092\u9589\u3058\u3068\u8aa4\u8a8d\u3057\u306a\u3044\u305f\u3081\uff09\u3002\r\n    \/\/ \u7a7a\u884c\u306f\u307e\u305f\u304c\u306a\u3044\uff08\u9589\u3058\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306b\u3001\u6bb5\u843d\u3092\u8d8a\u3048\u3066\u5148\u307e\u3067\u5dfb\u304d\u8fbc\u307e\u306a\u3044\u305f\u3081\uff09\u3002\r\n    const inlineCodeRe = new RegExp('(?<!`)(`+)(?!`)(?:(?!' + NL + '[ ' + TAB + ']*' + NL + ')[^])*?(?<!`)' + BS + '1(?!`)', 'g');\r\n    text = text.replace(inlineCodeRe, function (m) { return stash(m); });\r\n\r\n    \/\/ \u958b\u59cb\u30bf\u30b0\u30fb\u7d42\u4e86\u30bf\u30b0\u3092\u3001\u305d\u308c\u305e\u308c\u500b\u5225\u306b\uff08\u4e2d\u8eab\u306f\u5dfb\u304d\u8fbc\u307e\u305a\uff09\u53d6\u308a\u9664\u304f\u3002\r\n    \/\/ <br> \u3060\u3051\u306f\u5bfe\u8c61\u5916\u306b\u3059\u308b\uff08\u5426\u5b9a\u5148\u8aad\u307f\u3067\u9664\u5916\uff09\u3002\r\n    const tagRe = new RegExp(\r\n      '<' + BS + '\/?(?!br' + BS + 'b)[a-zA-Z][a-zA-Z0-9]*(?:' + BS + 's[^<>]*)?' + BS + '\/?>',\r\n      'g'\r\n    );\r\n    text = text.replace(tagRe, '');\r\n\r\n    const restoreRe = new RegExp(TOKEN_PREFIX + '(' + BS + 'd+)' + TOKEN_SUFFIX, 'g');\r\n    \/\/ \u9000\u907f\u3057\u305f\u4e2d\u8eab\u306b\u5225\u306e\u9000\u907f\u30c8\u30fc\u30af\u30f3\u304c\u5165\u3063\u3066\u3044\u308b\u5834\u5408\u3082\u3042\u308b\u306e\u3067\u3001\u30c8\u30fc\u30af\u30f3\u304c\u306a\u304f\u306a\u308b\u307e\u3067\u7e70\u308a\u8fd4\u3059\r\n    \/\/ \uff08\u56de\u6570\u306e\u4e0a\u9650\u306f\u3001\u9000\u907f\u3057\u305f\u6570\u3092\u8d85\u3048\u308b\u3053\u3068\u306f\u306a\u3044\u306e\u3067 store.length + 1 \u56de\uff09\u3002\r\n    for (let n = 0; n <= store.length && text.indexOf(TOKEN_PREFIX) !== -1; n++) {\r\n      text = text.replace(restoreRe, function (m, idxStr) {\r\n        return store[parseInt(idxStr, 10)];\r\n      });\r\n    }\r\n\r\n    return text;\r\n  }\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u3010STEP6.4-6\u3011\u30c7\u30b3\u30fc\u30c9\uff08HTML \u2192 Markdown\uff09\uff1a\u30c6\u30fc\u30d6\u30eb\u306e\u5fa9\u5143\r\n  \/\/   encode \u5074\uff08convertTagTables\/buildTableHtml\uff09\u306e\u8a18\u6cd5\u306b\u3042\u308f\u305b\u3066\u3001<table> \u3092\r\n  \/\/   \u30d1\u30a4\u30d7\u533a\u5207\u308a\uff0b\u30bb\u30eb\u7d50\u5408\u8a18\u6cd5\uff08< > ^\uff09\u306eMarkdown\u306b\u5909\u63db\u3059\u308b\u3002\r\n  \/\/   \u30fb<thead> \u306e\u6709\u7121 \uff1d \u533a\u5207\u308a\u884c\uff08|---|---|\uff09\u306e\u6709\u7121\uff08encode\u5074\u3068\u5bfe\u79f0\uff09\r\n  \/\/   \u30fb<thead>\u30fb<tbody> \u3069\u3061\u3089\u3082 colspan\/rowspan \u3092\u30b0\u30ea\u30c3\u30c9\u5fa9\u5143\u3057\u3001\r\n  \/\/       colspan=\"N\" \u2192 \u5b9f\u30bb\u30eb\uff0b\u53f3\u306b < \u3092(N-1)\u500b\r\n  \/\/       rowspan=\"N\" \u2192 \u5b9f\u30bb\u30eb\u306f\u3053\u306e\u884c\u3001\u540c\u3058\u5217\u4f4d\u7f6e\u306b ^ \u3092\u6b21\u306e(N-1)\u884c\u5206\r\n  \/\/     \u3068\u3044\u3046\u3001encode\u5074\u306e applyCellMerges \u304c\u305d\u306e\u307e\u307e\u89e3\u91c8\u3067\u304d\u308b\u5f62\u306b\u5909\u63db\u3059\u308b\r\n  \/\/     \uff08\u7d50\u5408\u306f\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u307e\u305f\u304c\u306a\u3044\u3002thead\u3068tbody\u306f\u5225\u3005\u306b\u5fa9\u5143\u3059\u308b\uff09\u3002\r\n  \/\/   \u30fbrowspan \u3068 colspan \u3092\u540c\u6642\u306b\u6301\u3064\u30bb\u30eb\uff082\u00d72\u7b49\u306e\u30d6\u30ed\u30c3\u30af\u7d50\u5408\uff09\u306f\u3001\u3053\u306e\r\n  \/\/     \u5358\u65b9\u5411\u30de\u30fc\u30ab\u30fc\u65b9\u5f0f\u3067\u306f\u6b63\u3057\u304f\u5f80\u5fa9\u3067\u304d\u306a\u3044\u305f\u3081\u975e\u5bfe\u5fdc\uff08\u7d50\u5408\u304c\u5d29\u308c\u3066\u51fa\u529b\r\n  \/\/     \u3055\u308c\u308b\uff09\u3002\u307e\u308c\u306a\u30b1\u30fc\u30b9\u306a\u306e\u3067\u8a31\u5bb9\u3057\u3001\u5fc5\u8981\u306a\u3089\u300cHTML\u3092\u7dad\u6301\u3059\u308b\u30aa\u30d7\u30b7\u30e7\u30f3\u300d\r\n  \/\/     \uff08Step6-8\u4e88\u5b9a\uff09\u5074\u3067\u5bfe\u5fdc\u3059\u308b\u65b9\u91dd\u3002\r\n  \/\/   \u30fb\u30bb\u30eb\u5185\u306e\u6539\u884c\uff0f<br> \u306f\u3001\u30bb\u30eb\u5883\u754c\u306f\u5b9fDOM\uff08table.rows\/tr.cells\uff09\u3092\u76f4\u63a5\r\n  \/\/     \u8aad\u3093\u3067\u3044\u3066<br>\u306e\u30c6\u30ad\u30b9\u30c8\u5206\u5272\u306b\u306f\u4f9d\u5b58\u3057\u3066\u3044\u306a\u3044\u305f\u3081\u3001\u305d\u306e\u307e\u307e<br>\u306e\r\n  \/\/     \u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066Markdown\u4e2d\u306b\u6b8b\u3059\uff08\u533a\u5207\u308a\u884c\u3068\u306e\u8aa4\u8a8d\u306f\u767a\u751f\u3057\u306a\u3044\uff09\u3002\r\n  \/\/     \u30bb\u30eb\u5185\u306e | \u306f\u30d1\u30a4\u30d7\u533a\u5207\u308a\u3068\u885d\u7a81\u3057\u306a\u3044\u3088\u3046\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u3067\r\n  \/\/     \u30a8\u30b9\u30b1\u30fc\u30d7\u3059\u308b\u3002\r\n  \/\/ ============================================================================\r\n  function decodeTableToPipeText(table, turndownService) {\r\n    const pipeRe = new RegExp(BS + '|', 'g');\r\n\r\n    \/\/ \u30ea\u30b9\u30c8\u30fb\u8907\u6570\u306e\u6bb5\u843d\u306a\u3069\u306e\u30d6\u30ed\u30c3\u30af\u3092\u542b\u3080\u30bb\u30eb\u306f\u3001\u8907\u6570\u884c\u306e\u30bb\u30eb\uff08\u884c\u306e\u914d\u5217\uff09\u306b\u3059\u308b\r\n    function cellHasBlocks(cell) {\r\n      return !!cell.querySelector('ul, ol, blockquote, pre') || cell.querySelectorAll('p').length > 1;\r\n    }\r\n\r\n    function cellToPipeSafeMd(cell) {\r\n      if (cellHasBlocks(cell)) {\r\n        const blockMd = turndownService.turndown(cell).trim();\r\n        \/\/\u6587\u306e\u76f4\u5f8c\u306e\u30ea\u30b9\u30c8\u306f\u3001\u9593\u306e\u7a7a\u884c\u3092\u7701\u304f\uff08\u306a\u304f\u3066\u3082 encode \u5074\u3067\u30ea\u30b9\u30c8\u3068\u3057\u3066\u6271\u3048\u308b\uff09\r\n        const placeholderLineRe = new RegExp('^X[A-Z]+X[0-9]');\r\n        const blockLines = blockMd.split(NL).filter(function (line, idx, arr) {\r\n          if (line.trim() !== '' || idx === 0 || idx === arr.length - 1) return true;\r\n          const prev = arr[idx - 1];\r\n          const next = arr[idx + 1];\r\n          \/\/\u524d\u306e\u884c\u304c HTML \u306e\u30bf\u30b0\uff08\u7dad\u6301\u3059\u308b\u30bf\u30b0\u306e\u76ee\u5370 XKEEPX\u2026 \u3092\u542b\u3080\uff09\u306e\u3068\u304d\u306f\u6b8b\u3059\r\n          \/\/\uff08\u7a7a\u884c\u304c\u306a\u3044\u3068\u3001\u7d9a\u304f\u884c\u307e\u3067 HTML \u306e\u30d6\u30ed\u30c3\u30af\u3068\u307f\u306a\u3055\u308c\u308b\uff09\r\n          const p0 = prev.trim();\r\n          if (p0 === '' || p0.charAt(0) === '<' || placeholderLineRe.test(p0)) return true;\r\n          return !(!parseListLine(prev) && parseListLine(next));\r\n        });\r\n        return blockLines.map(function (line) { return line.replace(pipeRe, BS + '|'); });\r\n      }\r\n      let md = turndownService.turndown(cell);\r\n      \/\/ \u524d\u5f8c\u306e\u4f59\u5206\u306a\u7a7a\u767d\u30fb\u6539\u884c\u3092\u5148\u306b\u53d6\u308a\u9664\u3044\u3066\u304b\u3089\u3001\u30bb\u30eb\u5185\u90e8\u306b\u6b8b\u308b\u6539\u884c\r\n      \/\/ \uff08<br>\u7531\u6765\u306e\u30cf\u30fc\u30c9\u30d6\u30ec\u30a4\u30af\u300c  +\u6539\u884c\u300d\u3084\u3001\u30d6\u30ed\u30c3\u30af\u8981\u7d20\u9593\u306e\u7a7a\u884c\uff09\u3092\r\n      \/\/ \u898b\u305f\u76ee\u305d\u306e\u307e\u307e\u306e <br> \u306b\u5909\u63db\u3059\u308b\uff08\u30b9\u30da\u30fc\u30b9\u3078\u7573\u3093\u3067\u6d88\u3057\u3066\u3057\u307e\u308f\u306a\u3044\uff09\u3002\r\n      md = md.trim();\r\n      \/\/ \u7a7a\u767d\u30fb\u6539\u884c\u306e\u300c\u307e\u3068\u307e\u308a\u300d\u306e\u3046\u3061\u3001\u6539\u884c\u3092\u542b\u3080\u3082\u306e\u3060\u3051\u3092 <br> \u306b\u5909\u63db\u3059\u308b\r\n      \/\/ \uff08\u5358\u306a\u308b\u5358\u8a9e\u9593\u306e\u534a\u89d2\u30b9\u30da\u30fc\u30b91\u500b\u306f\u305d\u306e\u307e\u307e\u6b8b\u3059\uff09\u3002\r\n      const wsRunRe = new RegExp(OB + ' ' + NL + CB + '*' + NL + OB + ' ' + NL + CB + '*', 'g');\r\n      md = md.replace(wsRunRe, '<br>');\r\n      md = md.replace(pipeRe, BS + '|');\r\n      return md;\r\n    }\r\n\r\n    \/\/ rowspan\/colspan \u3092\u30b0\u30ea\u30c3\u30c9\u5fa9\u5143\u3057\u306a\u304c\u3089\u3001\u884c\u30b0\u30eb\u30fc\u30d7\uff08thead\u307e\u305f\u306ftbody\uff09\r\n    \/\/ \u5358\u4f4d\u3067\u30b0\u30ea\u30c3\u30c9\u884c\uff081\u884c=\u6587\u5b57\u5217\u307e\u305f\u306f\u30de\u30fc\u30ab\u30fc\u306e\u914d\u5217\uff09\u306e\u914d\u5217\u3092\u4f5c\u308b\u3002\r\n    \/\/ rowspan\u306f\u3053\u306e\u884c\u30b0\u30eb\u30fc\u30d7\u5185\u3060\u3051\u3067\u7e26\u65b9\u5411\u306b\u52b9\u304f\uff08\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u307e\u305f\u304c\u306a\u3044\uff09\u3002\r\n    function buildGridRows(trs) {\r\n      const gridRows = [];\r\n      const pendingRowspan = {}; \/\/ \u5217\u756a\u53f7 \u2192 \u3042\u3068\u4f55\u884c ^ \u3067\u57cb\u3081\u308b\u304b\r\n      trs.forEach(function (tr) {\r\n        const cells = Array.from(tr.cells);\r\n        const gridRow = [];\r\n        let cellIdx = 0;\r\n        let col = 0;\r\n\r\n        while (cellIdx < cells.length || pendingRowspan[col]) {\r\n          if (pendingRowspan[col] > 0) {\r\n            gridRow[col] = '^';\r\n            pendingRowspan[col]--;\r\n            col++;\r\n            continue;\r\n          }\r\n\r\n          const cell = cells[cellIdx++];\r\n          if (!cell) break;\r\n\r\n          const colspan = parseInt(cell.getAttribute('colspan') || '1', 10) || 1;\r\n          const rowspan = parseInt(cell.getAttribute('rowspan') || '1', 10) || 1;\r\n          const startCol = col;\r\n\r\n          gridRow[col] = cellToPipeSafeMd(cell);\r\n          col++;\r\n          for (let k = 1; k < colspan; k++) {\r\n            gridRow[col] = '<';\r\n            col++;\r\n          }\r\n\r\n          if (rowspan > 1) {\r\n            for (let c = startCol; c < col; c++) {\r\n              pendingRowspan[c] = (pendingRowspan[c] || 0) + (rowspan - 1);\r\n            }\r\n          }\r\n        }\r\n        gridRows.push(gridRow);\r\n      });\r\n      return gridRows;\r\n    }\r\n\r\n    const allRows = Array.from(table.rows);\r\n    if (allRows.length === 0) return '';\r\n\r\n    const headerTrs = table.tHead ? Array.from(table.tHead.rows) : [];\r\n    const bodyGroups = Array.from(table.tBodies).map(function (tb) { return Array.from(tb.rows); })\r\n      .filter(function (trs) { return trs.length > 0; });\r\n    const footTrs = table.tFoot ? Array.from(table.tFoot.rows) : [];\r\n\r\n    const lines = [];\r\n\r\n    \/\/ 1 \u884c\u5206\u3092\u51fa\u529b\u3059\u308b\uff08\u8907\u6570\u884c\u306e\u30bb\u30eb\u304c\u3042\u308b\u3068\u304d\u306f\u3001\u884c\u672b\u306b\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u3092\u4ed8\u3051\u3066\u8907\u6570\u884c\u306b\u3059\u308b\uff09\r\n    function pushRow(gridRow) {\r\n      let height = 1;\r\n      gridRow.forEach(function (c) { if (Array.isArray(c)) height = Math.max(height, c.length); });\r\n      for (let h = 0; h < height; h++) {\r\n        const cells = [];\r\n        for (let c = 0; c < gridRow.length; c++) {\r\n          const v = gridRow[c];\r\n          if (Array.isArray(v)) cells.push(v[h] || '');\r\n          else cells.push(h === 0 ? (v === undefined ? '' : v) : '');\r\n        }\r\n        lines.push('| ' + cells.join(' | ') + ' |' + (h < height - 1 ? ' ' + BS : ''));\r\n      }\r\n    }\r\n\r\n\r\n    \/\/ \u30ad\u30e3\u30d7\u30b7\u30e7\u30f3\uff08\u30c6\u30fc\u30d6\u30eb\u306e 1 \u884c\u76ee\u306b |: \u30ad\u30e3\u30d7\u30b7\u30e7\u30f3 |\uff09\r\n    if (table.caption) {\r\n      const captionMd = turndownService.turndown(table.caption.innerHTML).trim().replace(pipeRe, BS + '|');\r\n      if (captionMd) lines.push('|: ' + captionMd + ' |');\r\n    }\r\n\r\n    const headerGrid = buildGridRows(headerTrs);\r\n    headerGrid.forEach(function (gridRow) { pushRow(gridRow); });\r\n\r\n    \/\/ \u533a\u5207\u308a\u884c\uff08thead \u304c\u3042\u308b\u3068\u304d\u3060\u3051\u51fa\u529b\u3002\u5217\u6570\u306f\u30d8\u30c3\u30c0\u30fc\u884c\u306e\u6700\u5927\u30b0\u30ea\u30c3\u30c9\u5e45\uff09\r\n    let colCount = 0;\r\n    if (headerGrid.length > 0) {\r\n      headerGrid.forEach(function (gridRow) { colCount = Math.max(colCount, gridRow.length); });\r\n      const sep = new Array(colCount).fill('---');\r\n      lines.push('| ' + sep.join(' | ') + ' |');\r\n    }\r\n\r\n    \/\/ <tbody> \u306e\u533a\u5207\u308a\uff08|-----|\uff09\u30fb<tfoot> \u306e\u533a\u5207\u308a\uff08|=====|\uff09\u306e\u9577\u3055\u306f\u3001\u898b\u51fa\u3057\u884c\u306b\u305d\u308d\u3048\u308b\r\n    const ruleWidth = Math.max(3, (lines.length ? lines[lines.length - 1].length : 5) - 2);\r\n    const ruleLine = function (ch) { return '|' + new Array(ruleWidth + 1).join(ch) + '|'; };\r\n\r\n    bodyGroups.forEach(function (trs, idx) {\r\n      if (idx > 0) lines.push(ruleLine('-'));\r\n      buildGridRows(trs).forEach(function (gridRow) { pushRow(gridRow); });\r\n    });\r\n\r\n    if (footTrs.length > 0) {\r\n      lines.push(ruleLine('='));\r\n      buildGridRows(footTrs).forEach(function (gridRow) { pushRow(gridRow); });\r\n    }\r\n\r\n    return lines.join(NL);\r\n  }\r\n\r\n\r\n\r\n\r\n  \/\/ \u2501\u2501 \u25bcfunctions \uff70\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\r\n\r\n  \/\/ \u30d6\u30ed\u30c3\u30af\u8981\u7d20\u306e\u524d\u306b\u7a7a\u884c\u3092\u5165\u308c\u308b\uff08HTML \u3092\u8aad\u307f\u3084\u3059\u304f\u3059\u308b\u305f\u3081\uff09\r\n  \/\/   \u30fb\u5bfe\u8c61\uff1a\u884c\u982d\uff08\u5b57\u4e0b\u3052\u306a\u3057\uff09\u304b\u3089\u59cb\u307e\u308b <h1>\u301c<h6> <hr> <ul> <ol> <dl> <table> <pre> <blockquote> <details>\r\n  \/\/   \u30fb\u5b57\u4e0b\u3052\u3057\u305f\u884c\uff08<li> \u306e\u4e2d\u306e\u5165\u308c\u5b50\u306e\u30ea\u30b9\u30c8\u30fb\u8868\u306a\u3069\uff09\u306f\u5bfe\u8c61\u5916\r\n  \/\/   \u30fb<pre> <textarea> <script> <style> \u306e\u4e2d\uff08\u30b3\u30fc\u30c9\u30fb:::pre \u306e\u4e2d\u8eab\u306a\u3069\uff09\u306f\u5909\u3048\u306a\u3044\r\n  \/\/   \u30fb\u3059\u3067\u306b\u7a7a\u884c\u304c\u3042\u308b\u3068\u304d\u3001\u5148\u982d\u306e\u884c\u306e\u3068\u304d\u306f\u5165\u308c\u306a\u3044\r\n  function addBlankLinesBeforeBlocks(text) {\r\n    const lines = text.split(NL);\r\n    const out = [];\r\n    const blockRe = new RegExp('^<(h[1-6]|hr|ul|ol|dl|table|pre|blockquote|details)(?=[ >\/]|$)', 'i');\r\n    const rawOpenRe = new RegExp('<(pre|textarea|script|style)(?=[ >])', 'gi');\r\n    let rawTag = null;  \/\/\u4e2d\u8eab\u3092\u5909\u3048\u306a\u3044\u30bf\u30b0\u306e\u4e2d\u306b\u3044\u308b\u3068\u304d\u3001\u305d\u306e\u30bf\u30b0\u540d\r\n    lines.forEach(function (line) {\r\n      if (!rawTag && blockRe.test(line) && out.length > 0 && out[out.length - 1].trim() !== '') {\r\n        out.push('');\r\n      }\r\n      out.push(line);\r\n      \/\/\u3053\u306e\u884c\u3067\u3001\u4e2d\u8eab\u3092\u5909\u3048\u306a\u3044\u30bf\u30b0\u306b\u5165\u308b\u30fb\u51fa\u308b\u304b\u3092\u8abf\u3079\u308b\uff081 \u884c\u306e\u4e2d\u3067\u9589\u3058\u308b\u5834\u5408\u3082\u8003\u3048\u308b\uff09\r\n      let pos = 0;\r\n      while (true) {\r\n        if (rawTag) {\r\n          const close = line.toLowerCase().indexOf('<\/' + rawTag, pos);\r\n          if (close === -1) break;\r\n          pos = close + rawTag.length + 2;\r\n          rawTag = null;\r\n        } else {\r\n          rawOpenRe.lastIndex = pos;\r\n          const m = rawOpenRe.exec(line);\r\n          if (!m) break;\r\n          rawTag = m[1].toLowerCase();\r\n          pos = m.index + m[0].length;\r\n        }\r\n      }\r\n    });\r\n    return out.join(NL);\r\n  }\r\n\r\n  \/\/Markdown \u2192 HTML \u306b\u5909\u63db\uff08marked \u306e\u307f\uff09\r\n  function convertMd2Html(text) {\r\n    return marked.parse(text, getMarkedOptions());\r\n  }\r\n\r\n\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u2605\u30ea\u30b9\u30c8\u51e6\u7406\uff08\u72ec\u81ea\u5b9f\u88c5\uff09\u2605\r\n  \/\/   marked \u306e\u30ea\u30b9\u30c8\u8a8d\u8b58\u3092\u7121\u52b9\u5316\u3057\u3066\u3044\u308b\u305f\u3081\u3001tight\/loose \u306e\u5224\u5b9a\u306f\u884c\u308f\u306a\u3044\u3002\r\n  \/\/   \u4ee3\u308f\u308a\u306b\u3001\u751f\u30c6\u30ad\u30b9\u30c8\u306e\u6642\u70b9\u3067\u30a4\u30f3\u30c7\u30f3\u30c8\u5e45\u304b\u3089\u968e\u5c64\u69cb\u9020\u3092\u5224\u5b9a\u3057\u3001\r\n  \/\/   \u76f4\u63a5 <ul>\/<ol> \u306e HTML \u3092\u7d44\u307f\u7acb\u3066\u3066\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u3078\u9000\u907f\u3059\u308b\uff08\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u5909\u63db\u3088\u308a\u524d\uff09\u3002\r\n  \/\/   \u30fb\u7a7a\u884c\u3001\u307e\u305f\u306f\uff08\u540c\u3058\u968e\u5c64\u5185\u3067\u306e\uff09\u8a18\u53f7\u306e\u5207\u308a\u66ff\u308f\u308a\u3067 <ul>\/<ol> \u3092\u5206\u5272\u3059\u308b\r\n  \/\/   \u30fb<li> \u306b <p> \u306f\u4ed8\u3051\u306a\u3044\uff08\u4ed8\u3051\u305f\u3044\u5834\u5408\u306f\u672c\u6587\u4e2d\u306b\u76f4\u63a5 <p> \u3092\u66f8\u304f\uff09\r\n  \/\/   \u30fb\u9805\u76ee\u5185\u306e\u30a4\u30f3\u30e9\u30a4\u30f3\u8a18\u6cd5\uff08\u592a\u5b57\u30fb\u30ea\u30f3\u30af\u30fb\u30a4\u30f3\u30e9\u30a4\u30f3\u30b3\u30fc\u30c9\u7b49\uff09\u306f\r\n  \/\/     marked.parseInline() \u3067\u500b\u5225\u306b\u51e6\u7406\u3059\u308b\u306e\u3067\u3001\u901a\u5e38\u3069\u304a\u308a\u52b9\u304f\r\n  \/\/   \u30fb\u30cd\u30b9\u30c8\uff08\u5165\u308c\u5b50\uff09\u306b\u5bfe\u5fdc\u3002\u30a4\u30f3\u30c7\u30f3\u30c8\u5e45\u306f\u534a\u89d2\u30b9\u30da\u30fc\u30b9\u30fb\u30bf\u30d6\uff08\u30bf\u30d6\u306f4\u6841\u30b9\u30c8\u30c3\u30d7\uff09\u3069\u3061\u3089\u3082\u53ef\r\n  \/\/ ============================================================================\r\n\r\n  \/\/ \u884c\u982d\u306e\u7b87\u6761\u66f8\u304d\u8a18\u53f7\uff08- * +\uff09\u3092\u5224\u5b9a\u3002\u30de\u30c3\u30c1\u3059\u308c\u3070 { marker, content } \u3092\u8fd4\u3059\r\n  function matchBulletLine(line) {\r\n    const re = new RegExp('^[-*+]' + BS + 's+(.*)$');\r\n    const m = line.match(re);\r\n    if (!m) return null;\r\n    return { marker: line.charAt(0), content: m[1] };\r\n  }\r\n\r\n  \/\/ \u884c\u982d\u306e\u756a\u53f7\u4ed8\u304d\u30ea\u30b9\u30c8\u8a18\u53f7\uff081. \u3084 1) \uff09\u3092\u5224\u5b9a\u3002\u30de\u30c3\u30c1\u3059\u308c\u3070 { num, delim, content } \u3092\u8fd4\u3059\r\n  function matchOrderedLine(line) {\r\n    const re = new RegExp('^(' + BS + 'd+)([.)])' + BS + 's+(.*)$');\r\n    const m = line.match(re);\r\n    if (!m) return null;\r\n    return { num: parseInt(m[1], 10), delim: m[2], content: m[3] };\r\n  }\r\n\r\n  \/\/ \u884c\u982d\u306e \": \" \uff08\u5b9a\u7fa9\u30ea\u30b9\u30c8\u306e\u8aac\u660e\u884c\uff09\u3092\u5224\u5b9a\u3002\u30de\u30c3\u30c1\u3059\u308c\u3070 { content } \u3092\u8fd4\u3059\r\n  function matchDescLine(line) {\r\n    const re = new RegExp('^:' + BS + 's+(.*)$');\r\n    const m = line.match(re);\r\n    if (!m) return null;\r\n    return { content: m[1] };\r\n  }\r\n\r\n  \/\/ \u884c\u982d\u306e\u7a7a\u767d\u5e45\u3092\u6e2c\u308b\uff08\u30bf\u30d6\u306f\u6b21\u306e4\u6841\u5883\u754c\u307e\u3067\u9032\u3081\u308b\uff1d4\u6841\u30bf\u30d6\u30b9\u30c8\u30c3\u30d7\uff09\r\n  function getIndentWidth(line) {\r\n    let width = 0;\r\n    for (let i = 0; i < line.length; i++) {\r\n      const ch = line.charAt(i);\r\n      if (ch === ' ') { width += 1; }\r\n      else if (ch === TAB) { width += 4 - (width % 4); }\r\n      else { break; }\r\n    }\r\n    return width;\r\n  }\r\n\r\n  \/\/ \u884c\u982d\u306e\u7a7a\u767d\uff08\u534a\u89d2\u30b9\u30da\u30fc\u30b9\u30fb\u30bf\u30d6\uff09\u3092\u53d6\u308a\u9664\u304f\r\n  function stripLeadingWhitespace(line) {\r\n    let i = 0;\r\n    while (i < line.length && (line.charAt(i) === ' ' || line.charAt(i) === TAB)) { i++; }\r\n    return line.slice(i);\r\n  }\r\n\r\n  \/\/ \u6c34\u5e73\u7dda\uff08*** \/ --- \/ ___ \u7b49\u3001\u7a7a\u767d\u3092\u631f\u3093\u3067\u3082\u3088\u3044\uff09\u304b\u3069\u3046\u304b\u3092\u5224\u5b9a\u3059\u308b\u3002\r\n  \/\/ CommonMark \u3067\u306f\u300c\u540c\u3058\u6587\u5b57\u304c3\u3064\u4ee5\u4e0a\uff08\u7a7a\u767d\u533a\u5207\u308a\u53ef\uff09\u3060\u3051\u306e\u884c\u300d\u306f\u6c34\u5e73\u7dda\u3068\u3057\u3066\u6271\u308f\u308c\u3001\r\n  \/\/ \u30ea\u30b9\u30c8\u8a18\u53f7\uff08- * +\uff09\u3068\u885d\u7a81\u3057\u3046\u308b\u305f\u3081\u3001\u30ea\u30b9\u30c8\u5224\u5b9a\u3088\u308a\u5148\u306b\u30c1\u30a7\u30c3\u30af\u3059\u308b\u3002\r\n  function isThematicBreak(line) {\r\n    let stripped = '';\r\n    for (let i = 0; i < line.length; i++) {\r\n      const ch = line.charAt(i);\r\n      if (ch !== ' ' && ch !== TAB) { stripped += ch; }\r\n    }\r\n    if (stripped.length < 3) return false;\r\n    const first = stripped.charAt(0);\r\n    if (first !== '-' && first !== '*' && first !== '_') return false;\r\n    for (let i = 1; i < stripped.length; i++) {\r\n      if (stripped.charAt(i) !== first) return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  \/\/ 1\u884c\u3092\u89e3\u6790\u3057\u3001{ type, marker, content, indent, num? } \u307e\u305f\u306f null\uff08\u30ea\u30b9\u30c8\u884c\u3067\u306a\u3044\uff09\u3092\u8fd4\u3059\r\n  \/\/ type \u306f 'ul' \/ 'ol' \/ 'dd'\uff08\u5b9a\u7fa9\u30ea\u30b9\u30c8\u306e\u8aac\u660e\u884c\uff09\u306e\u3044\u305a\u308c\u304b\r\n  function parseListLine(line) {\r\n    const indent = getIndentWidth(line);\r\n    const stripped = stripLeadingWhitespace(line);\r\n    if (isThematicBreak(stripped)) return null; \/\/ \u6c34\u5e73\u7dda\u306f\u30ea\u30b9\u30c8\u5316\u3057\u306a\u3044\uff08marked \u5074\u306e hr \u306b\u4efb\u305b\u308b\uff09\r\n    const bullet = matchBulletLine(stripped);\r\n    if (bullet) return { type: 'ul', marker: bullet.marker, content: bullet.content, indent: indent };\r\n    const ordered = matchOrderedLine(stripped);\r\n    if (ordered) return { type: 'ol', marker: ordered.delim, num: ordered.num, content: ordered.content, indent: indent };\r\n    const desc = matchDescLine(stripped);\r\n    if (desc) return { type: 'dd', content: desc.content, indent: indent };\r\n    return null;\r\n  }\r\n\r\n  function indentLine(str, level) {\r\n    let pad = '';\r\n    for (let k = 0; k < level; k++) { pad += '  '; }\r\n    return pad + str;\r\n  }\r\n\r\n  \/\/ records \u306e [startIdx..] \u3092 baseIndent \u306e\u5144\u5f1f\u5217\u3068\u3057\u3066\u89e3\u91c8\u3057\u3001\r\n  \/\/ { htmlBlocks: [...], nextIdx } \u3092\u8fd4\u3059\uff08\u540c\u4e00\u968e\u5c64\u5185\u3067\u8a18\u53f7\u304c\u5207\u308a\u66ff\u308f\u308b\u3068 htmlBlocks \u306f\u8907\u6570\u306b\u306a\u308b\uff09\r\n  \/\/ depth \u306f\u898b\u305f\u76ee\u306e\u30a4\u30f3\u30c7\u30f3\u30c8\u7528\uff080\u59cb\u307e\u308a\uff09\r\n  \/\/ \u30bf\u30b9\u30af\u30ea\u30b9\u30c8\u306e\u9805\u76ee\u306e\u5148\u982d\uff08[ ] \/ [x] \/ [X] \uff0b\u7a7a\u767d\uff09\u3002GitHub \u3068\u540c\u3058\u304f\u3001\r\n  \/\/ <li class=\"tasklist-item\"><input type=\"checkbox\" disabled> \u3068\u3001\u89aa\u306e <ul>\/<ol> \u306b class=\"tasklist\" \u3092\u4ed8\u3051\u308b\r\n  const TASK_ITEM_RE = new RegExp('^' + BS + OB + '( |x|X)' + BS + CB + '(?:' + OB + ' ' + TAB + CB + '+|$)');\r\n\r\n  function buildListTree(records, startIdx, baseIndent, depth) {\r\n    const blocks = [];\r\n    let i = startIdx;\r\n    while (i < records.length && records[i].indent === baseIndent) {\r\n      \/\/ \u9805\u76ee\u306e\u4e0b\u306b\u5b57\u4e0b\u3052\u3057\u3066\u66f8\u3044\u305f\u30d6\u30ed\u30c3\u30af\uff08\u8868\u30fb\u30b3\u30fc\u30c9\u30fb\u5f15\u7528\u30fb\u6bb5\u843d\u306a\u3069\uff09\r\n      \/\/ \u2192 \u901a\u5e38\u306e Markdown \u3068\u3057\u3066\u5909\u63db\u3057\u3001\u76f4\u524d\u306e\u9805\u76ee\uff08li\u30fbdt\u30fbdd\uff09\u306e\u4e2d\u306b\u5165\u308c\u308b\r\n      if (records[i].type === 'block') {\r\n        const blockHtml = renderListItemBlock(records[i].lines.join(NL));\r\n        \/\/\u898b\u3084\u3059\u3044\u3088\u3046\u5b57\u4e0b\u3052\u3059\u308b\uff08<pre> \u304c\u3042\u308b\u3068\u304d\u306f\u3001\u4e2d\u8eab\u306e\u7a7a\u767d\u304c\u5909\u308f\u308b\u306e\u3067\u5b57\u4e0b\u3052\u3057\u306a\u3044\uff09\r\n        blocks.push(blockHtml.indexOf('<pre') !== -1 ? blockHtml : blockHtml.split(NL).map(function (l) {\r\n          return l === '' ? l : indentLine(l, depth);\r\n        }).join(NL));\r\n        i++;\r\n        continue;\r\n      }\r\n\r\n      const type = records[i].type;\r\n      const marker = records[i].marker;\r\n      const startNum = records[i].num;\r\n\r\n      \/\/ \u5b9a\u7fa9\u30ea\u30b9\u30c8\uff08<dl>\uff09\uff1a\u540c\u3058\u968e\u5c64\u306b\u300c- \u300d\uff08dt\uff09\u3068\u300c: \u300d\uff08dd\uff09\u306e\u884c\u304c\u4e26\u3073\u3001dd \u304c 1 \u3064\u3067\u3082\u3042\u308c\u3070 <dl> \u306b\u3059\u308b\u3002\r\n      \/\/ dd \u304c\u306a\u3051\u308c\u3070\u4f55\u3082\u6d88\u8cbb\u305b\u305a\u3001\u4e0b\u306e\u901a\u5e38\u306e <ul> \u306e\u51e6\u7406\u3078\u9032\u3080\u3002\r\n      \/\/ \u30fbdt\u30fbdd \u306e\u4e0b\u306b\u3001\u3088\u308a\u6df1\u304f\u5b57\u4e0b\u3052\u3057\u305f\u884c\u304c\u3042\u308c\u3070\u3001\u305d\u306e dt\u30fbdd \u306e\u4e2d\u306b\u5165\u308c\u5b50\u306b\u3059\u308b\r\n      \/\/   \uff08\u30ea\u30b9\u30c8\u30fb\u756a\u53f7\u4ed8\u304d\u30ea\u30b9\u30c8\u30fb\u5b9a\u7fa9\u30ea\u30b9\u30c8\u306e\u3069\u308c\u3067\u3082\u3088\u3044\uff09\r\n      \/\/ \u30fbdd\uff08: \u884c\uff09\u304b\u3089\u59cb\u307e\u3063\u3066\u3057\u307e\u3063\u305f\u5834\u5408\u3082\u3001dd \u3060\u3051\u306e <dl> \u306b\u3059\u308b\uff08\u4fdd\u967a\uff09\r\n      if ((type === 'ul' && marker === '-') || type === 'dd') {\r\n        let k = i;\r\n        let hasDd = false;\r\n        while (k < records.length) {\r\n          const r = records[k];\r\n          if (r.indent > baseIndent) { k++; continue; }  \/\/\u5165\u308c\u5b50\u306e\u884c\u306f\u3001\u7bc4\u56f2\u306b\u542b\u3081\u3066\u8aad\u307f\u98db\u3070\u3059\r\n          if (r.indent === baseIndent && ((r.type === 'ul' && r.marker === '-') || r.type === 'dd')) {\r\n            if (r.type === 'dd') { hasDd = true; }\r\n            k++;\r\n            continue;\r\n          }\r\n          break;\r\n        }\r\n\r\n        if (hasDd) {\r\n          const items = [];\r\n          let m = i;\r\n          while (m < k) {\r\n            const r = records[m];\r\n            if (r.indent > baseIndent) {\r\n              \/\/\u76f4\u524d\u306e dt\u30fbdd \u306e\u5165\u308c\u5b50\r\n              const child = buildListTree(records, m, r.indent, depth + 2);\r\n              if (items.length > 0) {\r\n                Array.prototype.push.apply(items[items.length - 1].children, child.htmlBlocks);\r\n              }\r\n              m = (child.nextIdx > m) ? child.nextIdx : m + 1;\r\n              continue;\r\n            }\r\n            items.push({ tag: (r.type === 'dd') ? 'dd' : 'dt', content: r.content, children: [] });\r\n            m++;\r\n          }\r\n\r\n          const dlLines = [];\r\n          items.forEach(function (item) {\r\n            const inlineContent = marked.parseInline(item.content, getMarkedOptions());\r\n            if (item.children.length > 0) {\r\n              dlLines.push(indentLine('<' + item.tag + '>' + inlineContent, depth + 1));\r\n              item.children.forEach(function (cb) { dlLines.push(cb); });\r\n              dlLines.push(indentLine('<\/' + item.tag + '>', depth + 1));\r\n            } else {\r\n              dlLines.push(indentLine('<' + item.tag + '>' + inlineContent + '<\/' + item.tag + '>', depth + 1));\r\n            }\r\n          });\r\n          blocks.push(indentLine('<dl>', depth) + NL + dlLines.join(NL) + NL + indentLine('<\/dl>', depth));\r\n          i = k;\r\n          continue;\r\n        }\r\n      }\r\n\r\n      const itemLines = [];\r\n      let hasTask = false;\r\n\r\n      while (i < records.length && records[i].indent === baseIndent && records[i].type === type && records[i].marker === marker) {\r\n        let content = records[i].content;\r\n        i++;\r\n\r\n        \/\/ \u30bf\u30b9\u30af\u30ea\u30b9\u30c8\uff08GFM\uff09\uff1a\u5148\u982d\u306e [ ] \/ [x] \u3092\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u306b\u3059\u308b\r\n        let liOpen = '<li>';\r\n        const task = content.match(TASK_ITEM_RE);\r\n        if (task) {\r\n          hasTask = true;\r\n          content = content.slice(task[0].length);\r\n          liOpen = '<li class=\"tasklist-item\"><input type=\"checkbox\" disabled' + (task[1] === ' ' ? '' : ' checked') + '> ';\r\n        }\r\n\r\n        let childBlocks = [];\r\n        \/\/\u5b57\u4e0b\u3052\u306e\u6df1\u3055\u304c\u305d\u308d\u3063\u3066\u3044\u306a\u3044\u5165\u308c\u5b50\uff08\u4f8b\uff1a4 \u5b57\u4e0b\u3052\u306e\u5f8c\u306b 2 \u5b57\u4e0b\u3052\uff09\u3082\u3001\u307e\u3068\u3081\u3066\u3053\u306e\u9805\u76ee\u306e\u4e2d\u306b\u5165\u308c\u308b\r\n        while (i < records.length && records[i].indent > baseIndent) {\r\n          const child = buildListTree(records, i, records[i].indent, depth + 2);\r\n          Array.prototype.push.apply(childBlocks, child.htmlBlocks);\r\n          i = (child.nextIdx > i) ? child.nextIdx : i + 1;\r\n        }\r\n\r\n        const inlineContent = marked.parseInline(content, getMarkedOptions());\r\n        if (childBlocks.length > 0) {\r\n          itemLines.push(indentLine(liOpen + inlineContent, depth + 1));\r\n          childBlocks.forEach(function (cb) { itemLines.push(cb); });\r\n          itemLines.push(indentLine('<\/li>', depth + 1));\r\n        } else {\r\n          itemLines.push(indentLine(liOpen + inlineContent + '<\/li>', depth + 1));\r\n        }\r\n      }\r\n\r\n      const taskClass = hasTask ? ' class=\"tasklist\"' : '';\r\n      const openTag = (type === 'ul') ? ('<ul' + taskClass + '>') : ('<ol' + taskClass + ((startNum !== 1) ? (' start=\"' + startNum + '\"') : '') + '>');\r\n      const closeTag = (type === 'ul') ? '<\/ul>' : '<\/ol>';\r\n      const html = indentLine(openTag, depth) + NL + itemLines.join(NL) + NL + indentLine(closeTag, depth);\r\n      blocks.push(html);\r\n    }\r\n    return { htmlBlocks: blocks, nextIdx: i };\r\n  }\r\n\r\n  \/\/ \u30ea\u30b9\u30c8\u9805\u76ee\u306e\u7d9a\u304d\u3068\u3057\u3066\u6271\u3048\u308b\u884c\u304b\uff08\u7a7a\u884c\u3068\u3001\u5225\u306e\u30d6\u30ed\u30c3\u30af\u3092\u59cb\u3081\u308b\u884c\u306f\u5bfe\u8c61\u5916\uff09\r\n  function isLazyContinuationLine(line) {\r\n    const t = line.trim();\r\n    if (t === '') return false;\r\n    const c = t.charAt(0);\r\n    \/\/\u898b\u51fa\u3057\u30fb\u5f15\u7528\u30fb\u8868\u30fbHTML\uff08<details> <div> \u306a\u3069\uff09\u30fb\u30b3\u30fc\u30c9\u3084\u5404\u7a2e\u306e\u76ee\u5370\r\n    if (c === '#' || c === '>' || c === '|' || c === '<') return false;\r\n    if (t.indexOf('XCBPX') === 0 || t.indexOf('XLSTPX') === 0) return false;\r\n    \/\/\u30d5\u30a7\u30f3\u30b9\uff08``` ~~~\uff09\u30fb\u30ab\u30b9\u30bf\u30e0\u30b3\u30f3\u30c6\u30ca\uff08:::\uff09\r\n    if (t.indexOf('```') === 0 || t.indexOf('~~~') === 0 || t.indexOf(':::') === 0) return false;\r\n    \/\/\u6c34\u5e73\u7dda\uff08--- *** ___\uff09\r\n    if (new RegExp('^(?:(?:-' + BS + 's*){3,}|(?:' + BS + '*' + BS + 's*){3,}|(?:_' + BS + 's*){3,})$').test(t)) return false;\r\n    return true;\r\n  }\r\n\r\n  \/\/ \u884c\u982d\u306e\u7a7a\u767d\u3092\u3001\u5e45 width \u306e\u5206\u3060\u3051\u53d6\u308a\u9664\u304f\uff08\u30bf\u30d6\u306f4\u6841\u30b9\u30c8\u30c3\u30d7\uff09\r\n  function removeIndentWidth(line, width) {\r\n    let w = 0;\r\n    let i = 0;\r\n    while (i < line.length && w < width) {\r\n      const ch = line.charAt(i);\r\n      if (ch === ' ') { w += 1; }\r\n      else if (ch === TAB) { w += 4 - (w % 4); }\r\n      else { break; }\r\n      i++;\r\n    }\r\n    return line.slice(i);\r\n  }\r\n\r\n  \/\/ \u30ea\u30b9\u30c8\u9805\u76ee\u306e\u4e2d\u306e\u30d6\u30ed\u30c3\u30af\uff08\u9805\u76ee\u306e\u4e0b\u306b\u5b57\u4e0b\u3052\u3057\u3066\u66f8\u3044\u305f\u8868\u30fb\u30b3\u30fc\u30c9\u30fb\u5f15\u7528\u30fb\u6bb5\u843d\u306a\u3069\uff09\u3092 HTML \u306b\u3059\u308b\r\n  \/\/   \u30fb\u4e2d\u306e\u30ea\u30b9\u30c8\u30fb\u8868\u3082\u3001\u672c\u6587\u3068\u540c\u3058\u3088\u3046\u306b\u5909\u63db\u3059\u308b\r\n  \/\/   \u30fb\u8868\u306e\u8907\u6570\u884c\u306e\u30bb\u30eb\uff08XTCELLX\uff09\u30fb\u30b3\u30fc\u30c9\u30fb\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u306a\u3069\u306e\u76ee\u5370\u306f\u3001\u672c\u6587\u306e\u5fa9\u5143\u51e6\u7406\u3067\u623b\u3059\r\n  function renderListItemBlock(md) {\r\n    const listStore = [];\r\n    let html = protectLists(md, listStore);\r\n    html = convertMd2Html(html);\r\n    const td2th = document.getElementById('convertTagTd2Ths');\r\n    html = convertTagTables(html, !!(td2th && td2th.checked));\r\n    html = restoreLists(html, listStore);\r\n    return html.trim();\r\n  }\r\n\r\n  function protectLists(text, store) {\r\n    const lines = text.split(NL);\r\n    const outLines = [];\r\n    let i = 0;\r\n\r\n    while (i < lines.length) {\r\n      const rec = parseListLine(lines[i]);\r\n      if (rec) {\r\n        \/\/ \u7a7a\u884c\u30fb\u975e\u30ea\u30b9\u30c8\u884c\u306b\u5f53\u305f\u308b\u307e\u3067\u3001\u30a4\u30f3\u30c7\u30f3\u30c8\u5e45\u3092\u554f\u308f\u305a\u9023\u7d9a\u3059\u308b\u30ea\u30b9\u30c8\u884c\u3092\r\n        \/\/ \u307e\u3068\u3081\u30661\u3064\u306e\u300c\u304b\u305f\u307e\u308a\u300d\u3068\u3057\u3066\u53d6\u308a\u8fbc\u307f\u3001\u968e\u5c64\u69cb\u9020\u306f buildListTree \u5074\u3067\u5224\u5b9a\u3059\u308b\u3002\r\n        const records = [];\r\n        const baseIndent = rec.indent;\r\n        let j = i;\r\n        while (j < lines.length) {\r\n          const r = parseListLine(lines[j]);\r\n          if (r) {\r\n            records.push(r);\r\n            j++;\r\n            continue;\r\n          }\r\n          const last = records[records.length - 1];\r\n          \/\/ \u9045\u5ef6\u7d99\u7d9a\u884c\uff08CommonMark \u306e lazy continuation line\uff09\uff1a\r\n          \/\/ \u30ea\u30b9\u30c8\u9805\u76ee\u306e\u76f4\u5f8c\u306e\u3001\u30ea\u30b9\u30c8\u306e\u8a18\u53f7\u306e\u306a\u3044\u884c\u306f\u3001\u76f4\u524d\u306e\u9805\u76ee\u306e\u7d9a\u304d\u3068\u3057\u3066\u6271\u3046\r\n          \/\/ \uff08\u7a7a\u884c\u3084\u3001\u898b\u51fa\u3057\u30fb\u5f15\u7528\u30fb\u30b3\u30fc\u30c9\u306a\u3069\u5225\u306e\u30d6\u30ed\u30c3\u30af\u306e\u59cb\u307e\u308a\u306e\u884c\u3067\u3001\u30ea\u30b9\u30c8\u306f\u7d42\u308f\u308b\uff09\r\n          if (last.type !== 'block' && isLazyContinuationLine(lines[j])) {\r\n            last.content += NL + lines[j].trim();\r\n            j++;\r\n            continue;\r\n          }\r\n          \/\/ \u7a7a\u884c\u306e\u5f8c\u306f\u3001\u6b21\u306e\u7a7a\u884c\u3067\u306a\u3044\u884c\u3067\u5224\u65ad\u3059\u308b\r\n          let k = j;\r\n          while (k < lines.length && lines[k].trim() === '') k++;\r\n          if (k >= lines.length) break;\r\n          const nextRec = parseListLine(lines[k]);\r\n          if (nextRec) {\r\n            \/\/ \u7a7a\u884c\u306e\u5f8c\u306e\u30ea\u30b9\u30c8\u884c\uff1a\r\n            \/\/ \u30fb\u3088\u308a\u6df1\u304f\u5b57\u4e0b\u3052\u3057\u305f\u884c \u2192 \u5165\u308c\u5b50\u3068\u3057\u3066\u7d9a\u3051\u308b\r\n            \/\/ \u30fb\u5b57\u4e0b\u3052\u3057\u305f\u30d6\u30ed\u30c3\u30af\u306e\u5f8c \u2192 \u540c\u3058\u30ea\u30b9\u30c8\u306e\u7d9a\u304d\uff08\u540c\u3058\u968e\u5c64\u3067\u3082\u5206\u3051\u306a\u3044\uff09\r\n            \/\/ \u30fb\u305d\u308c\u4ee5\u5916\uff08\u9805\u76ee\u3069\u3046\u3057\u306e\u9593\u306e\u7a7a\u884c\uff09\u2192 \u3053\u308c\u307e\u3067\u3069\u304a\u308a\u3001\u3053\u3053\u3067\u30ea\u30b9\u30c8\u3092\u5206\u3051\u308b\r\n            if (nextRec.indent > baseIndent || (last.type === 'block' && nextRec.indent >= baseIndent)) {\r\n              j = k;\r\n              continue;\r\n            }\r\n            break;\r\n          }\r\n          \/\/ \u9805\u76ee\u3088\u308a\u6df1\u304f\u5b57\u4e0b\u3052\u3057\u305f\u884c\uff08\u7a7a\u884c\u3092\u631f\u3093\u3067\u3082\u3088\u3044\uff09\u2192 \u9805\u76ee\u306e\u4e2d\u306e\u30d6\u30ed\u30c3\u30af\r\n          \/\/ \uff08\u8868\u30fb\u30b3\u30fc\u30c9\u30fb\u5f15\u7528\u30fb\u6bb5\u843d\u306a\u3069\u3002\u6b21\u306e\u30ea\u30b9\u30c8\u884c\u304b\u3001\u5b57\u4e0b\u3052\u306e\u623b\u3063\u305f\u884c\u307e\u3067\uff09\r\n          if (last.type === 'block' || getIndentWidth(lines[k]) <= baseIndent) break;\r\n          const blockLines = [];\r\n          let m = k;\r\n          while (m < lines.length) {\r\n            if (lines[m].trim() === '') {\r\n              let p = m;\r\n              while (p < lines.length && lines[p].trim() === '') p++;\r\n              if (p < lines.length && !parseListLine(lines[p]) && getIndentWidth(lines[p]) > baseIndent) {\r\n                for (let q = m; q < p; q++) blockLines.push('');\r\n                m = p;\r\n                continue;\r\n              }\r\n              break;\r\n            }\r\n            if (parseListLine(lines[m]) || getIndentWidth(lines[m]) <= baseIndent) break;\r\n            blockLines.push(lines[m]);\r\n            m++;\r\n          }\r\n          let minIndent = -1;\r\n          blockLines.forEach(function (l) {\r\n            if (l === '') return;\r\n            const w = getIndentWidth(l);\r\n            if (minIndent === -1 || w < minIndent) minIndent = w;\r\n          });\r\n          records.push({\r\n            type: 'block',\r\n            indent: minIndent,\r\n            lines: blockLines.map(function (l) { return removeIndentWidth(l, minIndent); })\r\n          });\r\n          j = m;\r\n        }\r\n        \/\/ 1 \u3064\u76ee\u306e\u9805\u76ee\u3088\u308a\u6d45\u3044\u9805\u76ee\u304c\u3042\u3063\u3066\u3082\u53d6\u308a\u3053\u307c\u3055\u306a\u3044\u3088\u3046\u3001\u6700\u5f8c\u307e\u3067\u7d44\u307f\u7acb\u3066\u308b\r\n        let start = 0;\r\n        while (start < records.length) {\r\n          const result = buildListTree(records, start, records[start].indent, 0);\r\n          result.htmlBlocks.forEach(function (html) {\r\n            const idx = store.length;\r\n            store.push(html);\r\n            \/\/ \u524d\u5f8c\u306b\u7a7a\u884c\u3092\u631f\u307f\u3001marked \u304c\u72ec\u7acb\u30d6\u30ed\u30c3\u30af\u3068\u3057\u3066\u6271\u3048\u308b\u3088\u3046\u306b\u3059\u308b\r\n            outLines.push('');\r\n            outLines.push('XLSTPX' + idx + 'XLSTPX');\r\n            outLines.push('');\r\n          });\r\n          start = (result.nextIdx > start) ? result.nextIdx : start + 1;\r\n        }\r\n        i = j;\r\n      } else {\r\n        outLines.push(lines[i]);\r\n        i++;\r\n      }\r\n    }\r\n\r\n    return outLines.join(NL);\r\n  }\r\n\r\n  function restoreLists(text, store) {\r\n    for (let i = store.length - 1; i >= 0; i--) {\r\n      const placeholder = 'XLSTPX' + i + 'XLSTPX';\r\n      \/\/ marked \u304c\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u3092 <p>\u2026<\/p> \u3067\u5305\u3080\u5834\u5408\u304c\u3042\u308b\u306e\u3067\u9664\u53bb\r\n      const wrapped = new RegExp('<p>' + BS + 's*' + placeholder + BS + 's*<\/p>', 'g');\r\n      text = text.replace(wrapped, function () { return store[i]; });\r\n      text = text.split(placeholder).join(store[i]);\r\n    }\r\n    return text;\r\n  }\r\n\r\n\r\n\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u2605\u30c6\u30fc\u30d6\u30eb\u51e6\u7406\uff08\u72ec\u81ea\u5b9f\u88c5\uff09\u2605\r\n  \/\/   marked \u306e\u30c6\u30fc\u30d6\u30eb\u8a8d\u8b58\u3092\u7121\u52b9\u5316\u3057\u3066\u3044\u308b\u305f\u3081\u3001\u30c6\u30fc\u30d6\u30eb\u3089\u3057\u304d\u884c\u306f\r\n  \/\/   <p>...<\/p> \u306e\u307e\u307e\u51fa\u529b\u3055\u308c\u308b\uff081\u3064\u306e\u6bb5\u843d\u5185\u306b\u6539\u884c\u533a\u5207\u308a\u3067\u6b8b\u308b\uff09\u3002\r\n  \/\/   \u3053\u306e <p> \u30d6\u30ed\u30c3\u30af\u306e\u3046\u3061\u300c\u5168\u884c\u306b | \u3092\u542b\u3080\u300d\u3082\u306e\u3060\u3051\u3092 <table> \u306b\u5909\u63db\u3059\u308b\u3002\r\n  \/\/   \u30fb\u5148\u982d\uff0f\u672b\u5c3e\u306e | \u306f\u7701\u7565\u53ef\r\n  \/\/   \u30fb\u533a\u5207\u308a\u884c\uff08|---|---|\uff09\u306f\u7701\u7565\u53ef\r\n  \/\/     - \u533a\u5207\u308a\u884c\u3042\u308a \u2192 \u533a\u5207\u308a\u884c\u3088\u308a\u4e0a\u3092 <thead>\u3001\u4e0b\u3092 <tbody> \u306b\u5206\u5272\r\n  \/\/     - \u533a\u5207\u308a\u884c\u306a\u3057 \u2192 \u5168\u884c <tbody>\uff08\u898b\u51fa\u3057\u884c\u306a\u3057\uff09\r\n  \/\/   \u30fb\u533a\u5207\u308a\u884c\u306e\u6709\u7121\u306b\u304b\u304b\u308f\u3089\u305a\u3001\u533a\u5207\u308a\u884c\u3042\u308a\u306e\u3068\u304d\u3060\u3051\u5404\u884c\u306e\u5148\u982d\u30bb\u30eb\uff08\u7d50\u5408\u3067\r\n  \/\/     \u6d88\u3048\u3066\u3044\u308b\u5834\u5408\u306f\u305d\u306e\u884c\u3067\u6700\u521d\u306b\u8868\u793a\u3055\u308c\u308b\u30bb\u30eb\uff09\u3092 <th> \u306b\u3059\u308b\r\n  \/\/   \u30fb\u30bb\u30eb\u7d50\u5408\uff08< > ^\uff09\u306f <thead>\u30fb<tbody> \u3069\u3061\u3089\u3067\u3082\u6709\u52b9\uff08\u7d50\u5408\u306f\u30bb\u30af\u30b7\u30e7\u30f3\u3092\r\n  \/\/     \u307e\u305f\u304c\u306a\u3044\u3002thead\u3068tbody\u306f\u305d\u308c\u305e\u308c\u72ec\u7acb\u3057\u3066\u51e6\u7406\u3059\u308b\uff09\r\n  \/\/ ============================================================================\r\n\r\n  \/\/ 1\u884c\u3092 | \u3067\u5206\u5272\u3057\u3066\u30bb\u30eb\u914d\u5217\u306b\u3059\u308b\uff08\u5148\u982d\u30fb\u672b\u5c3e\u306e | \u306f\u6709\u7121\u3069\u3061\u3089\u3067\u3082\u53ef\uff09\r\n  function splitTableRow(line) {\r\n    let l = line.trim();\r\n    if (l.startsWith('|')) l = l.slice(1);\r\n    if (l.endsWith('|')) l = l.slice(0, -1);\r\n    return l.split('|').map(c => c.trim());\r\n  }\r\n\r\n  \/\/ \u30bb\u30d1\u30ec\u30fc\u30bf\u30fc\u884c\u5224\u5b9a\uff08\u30bb\u30eb\u5168\u3066\u304c - \u3068 : \u306e\u307f\u3067\u69cb\u6210\uff09\r\n  function isSeparatorRow(cells) {\r\n    return cells.length >= 1 && cells.every(c => \/^:?-+:?$\/.test(c));\r\n  }\r\n\r\n  \/\/ \u30bb\u30eb\u7d50\u5408\u30de\u30fc\u30ab\u30fc\uff08< > ^\uff09\u306f marked \u3092\u901a\u3059\u3068 &lt;\/&gt; \u306b\u5b9f\u4f53\u5316\u3055\u308c\u3066\u3057\u307e\u3046\u305f\u3081\u3001\r\n  \/\/ marked \u306b\u6e21\u3059\u524d\u306b\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u5316\u3057\u3066\u304a\u304f\uff08\u30b3\u30fc\u30c9\/\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u4fdd\u8b77\u3068\u540c\u3058\u8003\u3048\u65b9\uff09\u3002\r\n  const MERGE_LEFT_TOKEN = 'XMRGLTX';\r\n  const MERGE_RIGHT_TOKEN = 'XMRGRTX';\r\n  const MERGE_UP_TOKEN = 'XMRGUPX';\r\n\r\n  function protectMergeMarkers(text) {\r\n    const re = new RegExp('(^|' + BS + '|)(' + BS + 's*)(<|>|' + BS + '^)(' + BS + 's*)(?=' + BS + '|' + '|$)', 'gm');\r\n    return text.replace(re, function (m, lead, sp1, marker, sp2) {\r\n      const token = marker === '<' ? MERGE_LEFT_TOKEN : (marker === '>' ? MERGE_RIGHT_TOKEN : MERGE_UP_TOKEN);\r\n      return lead + sp1 + token + sp2;\r\n    });\r\n  }\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  \u30c6\u30fc\u30d6\u30eb\u306e\u30ad\u30e3\u30d7\u30b7\u30e7\u30f3\u30fb\u8907\u6570 <tbody>\u30fb<tfoot>\r\n  \/\/    |: \u30ad\u30e3\u30d7\u30b7\u30e7\u30f3                |   \u2190 \u30c6\u30fc\u30d6\u30eb\u306e 1 \u884c\u76ee\uff081 \u30bb\u30eb\u3067 : \uff0b\u7a7a\u767d\u304b\u3089\u59cb\u307e\u308b\uff09\u2192 <caption>\r\n  \/\/    | Header1 | Header2 |\r\n  \/\/    |:--------|--------:|\r\n  \/\/    | cellA1  | cellB1  |\r\n  \/\/    |------------------|   \u2190 \u672c\u6587\u306e\u9014\u4e2d\u306e\u300c- \u3060\u3051\u306e 1 \u30bb\u30eb\u300d\u306e\u884c \u2192 <tbody> \u306e\u533a\u5207\u308a\uff08kramdown \u3068\u540c\u3058\uff09\r\n  \/\/    | cellA2  | cellB2  |\r\n  \/\/    |==================|   \u2190 \u300c= \u3060\u3051\u306e 1 \u30bb\u30eb\u300d\u306e\u884c \u2192 \u3053\u308c\u3088\u308a\u4e0b\u304c <tfoot>\uff08kramdown \u3068\u540c\u3058\uff09\r\n  \/\/    | Foot1   | Foot2   |\r\n  \/\/  marked \u306f\u672c\u6587\u306e\u9014\u4e2d\u306e\u533a\u5207\u308a\u884c\uff08|---|\uff09\u3092\u30c6\u30fc\u30d6\u30eb\u306e\u59cb\u307e\u308a\u3068\u307f\u306a\u3057\u3066\u6bb5\u843d\u3092\u5206\u5272\r\n  \/\/  \u3057\u3066\u3057\u307e\u3046\u305f\u3081\u3001marked \u306e\u524d\u306b\u76ee\u5370\u3078\u7f6e\u304d\u63db\u3048\u3066\u304a\u304f\u3002\u30ad\u30e3\u30d7\u30b7\u30e7\u30f3\u306f\u3001marked \u306e\r\n  \/\/  \u30a4\u30f3\u30e9\u30a4\u30f3\u5909\u63db\uff08\u592a\u5b57\u306a\u3069\uff09\u3092\u53d7\u3051\u3089\u308c\u308b\u3088\u3046\u3001\u898b\u51fa\u3057\u884c\u306e\u5148\u982d\u306b\u76ee\u5370\u3067\u631f\u3093\u3067\u4ed8\u3051\u308b\u3002\r\n  \/\/ ----------------------------------------------------------------------------\r\n  const TABLE_TBODY_TOKEN = 'XTBODYX';\r\n  const TABLE_TFOOT_TOKEN = 'XTFOOTX';\r\n  const TABLE_CAPTION_START = 'XCAPSX';\r\n  const TABLE_CAPTION_END = 'XCAPEX';\r\n\r\n  function protectTableSections(text, cellStore) {\r\n    const lines = text.split(NL);\r\n    const out = [];\r\n    const isPipeLine = function (l) { return l.trim().charAt(0) === '|'; };\r\n\r\n    let i = 0;\r\n    while (i < lines.length) {\r\n      if (!isPipeLine(lines[i])) {\r\n        out.push(lines[i]);\r\n        i++;\r\n        continue;\r\n      }\r\n      let j = i;\r\n      while (j < lines.length && isPipeLine(lines[j])) j++;\r\n      \/\/ \u30bb\u30eb\u306e\u4e2d\u306e\u30a8\u30b9\u30b1\u30fc\u30d7\u3057\u305f |\uff08\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\uff0b|\uff09\u306f\u3001\u533a\u5207\u308a\u3068\u898b\u5206\u3051\u3089\u308c\u308b\u3088\u3046\u6587\u5b57\u53c2\u7167\u306b\u3059\u308b\uff08GFM \u3068\u540c\u3058\uff09\r\n      const block = lines.slice(i, j).map(function (l) { return l.split(BS + '|').join('&#124;'); });\r\n      \/\/ \u884c\u982d\u306e\u5b57\u4e0b\u3052\uff08\u30ea\u30b9\u30c8\u9805\u76ee\u306e\u4e2d\u306e\u8868\uff09\u306f\u3001\u66f8\u304d\u63db\u3048\u305f\u884c\u306b\u3082\u4ed8\u3051\u76f4\u3059\r\n      const leadIndent = lines[i].slice(0, lines[i].length - stripLeadingWhitespace(lines[i]).length);\r\n\r\n      \/\/ \u30ad\u30e3\u30d7\u30b7\u30e7\u30f3\uff082 \u884c\u76ee\u304c\u533a\u5207\u308a\u884c\u306e\u3068\u304d\u306f\u30011 \u884c\u76ee\u306f 1 \u5217\u306e\u30c6\u30fc\u30d6\u30eb\u306e\u898b\u51fa\u3057\u306a\u306e\u3067\u5bfe\u8c61\u5916\uff09\r\n      if (block.length >= 2) {\r\n        const first = splitTableRow(block[0]);\r\n        if (first.length === 1 && first[0].charAt(0) === ':' && first[0].length > 1 &&\r\n          first[0].charAt(1) !== '-' && !isSeparatorRow(splitTableRow(block[1]))) {\r\n          const caption = first[0].slice(1).trim();\r\n          block.splice(0, 2, leadIndent + TABLE_CAPTION_START + caption + TABLE_CAPTION_END + block[1].trim());\r\n        }\r\n      }\r\n\r\n      \/\/ \u898b\u51fa\u3057\u306e\u533a\u5207\u308a\u884c\u3088\u308a\u4e0b\u306e\u300c- \u3060\u3051\u300d\u300c= \u3060\u3051\u300d\u306e 1 \u30bb\u30eb\u306e\u884c\r\n      let headSep = -1;\r\n      for (let k = 1; k < block.length; k++) {\r\n        if (isSeparatorRow(splitTableRow(block[k]))) { headSep = k; break; }\r\n      }\r\n      if (headSep !== -1) {\r\n        for (let k = headSep + 1; k < block.length; k++) {\r\n          const cells = splitTableRow(block[k]);\r\n          \/\/1 \u30bb\u30eb\u306e |-----| \u3067\u3082\u3001\u5217\u3054\u3068\u306e |-----|-----| \u3067\u3082\u3088\u3044\r\n          if (cells.every(function (c) { return \/^-{3,}$\/.test(c); })) block[k] = leadIndent + '|' + TABLE_TBODY_TOKEN + '|';\r\n          else if (cells.every(function (c) { return \/^={3,}$\/.test(c); })) block[k] = leadIndent + '|' + TABLE_TFOOT_TOKEN + '|';\r\n        }\r\n      }\r\n\r\n      Array.prototype.push.apply(out, mergeTableContinuationRows(block, cellStore, leadIndent));\r\n      i = j;\r\n    }\r\n    return out.join(NL);\r\n  }\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  \u8907\u6570\u884c\u306e\u30bb\u30eb\uff08markdown-it-multimd-table \u3068\u540c\u3058\u66f8\u304d\u65b9\uff09\r\n  \/\/    | cellA3 | cellB3 | - List Item 3 | \u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5   \u2190 \u884c\u672b\uff08\u6700\u5f8c\u306e | \u306e\u5f8c\uff09\u306e\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\r\n  \/\/    |        |        | - List Item 4 |                  \u2190 \u6b21\u306e\u884c\u3068 1 \u3064\u306e\u884c\u306b\u307e\u3068\u3081\u308b\r\n  \/\/  \u30fb\u307e\u3068\u3081\u305f\u884c\u306e\u5404\u30bb\u30eb\u306f\u3001\u4e2d\u8eab\u3092\u6539\u884c\u3067\u3064\u306a\u304e\u30012 \u884c\u4ee5\u4e0a\u306b\u306a\u3063\u305f\u30bb\u30eb\u3060\u3051\u3092\r\n  \/\/    \u30d6\u30ed\u30c3\u30af\u306e Markdown\uff08\u30ea\u30b9\u30c8\u30fb\u8907\u6570\u306e\u6bb5\u843d\u306a\u3069\uff09\u3068\u3057\u3066\u5909\u63db\u3059\u308b\r\n  \/\/  \u30fb\u5909\u63db\u3057\u305f HTML \u306f\u76ee\u5370\uff08XTCELLX\uff09\u3067\u9000\u907f\u3057\u3001\u30c6\u30fc\u30d6\u30eb\u3092\u7d44\u307f\u7acb\u3066\u305f\u5f8c\u306b\u623b\u3059\r\n  \/\/  \u30fb\u7a7a\u306e\u30bb\u30eb\u306e\u884c\u306f\u7a7a\u884c\u306b\u306a\u308b\u306e\u3067\u3001\u6bb5\u843d\u3092\u5206\u3051\u305f\u3044\u3068\u304d\u306b\u4f7f\u3048\u308b\r\n  \/\/ ----------------------------------------------------------------------------\r\n  const TABLE_CELL_TOKEN = 'XTCELLX';\r\n\r\n  function isContinuationRow(line) {\r\n    const t = line.trim();\r\n    if (t.charAt(t.length - 1) !== BS) return false;\r\n    return t.slice(0, -1).trim().charAt(t.slice(0, -1).trim().length - 1) === '|';\r\n  }\r\n\r\n  function renderTableCellBlock(md) {\r\n    const listStore = [];\r\n    let html = protectLists(md, listStore);\r\n    html = convertMd2Html(html);\r\n    html = restoreLists(html, listStore).trim();\r\n    \/\/\u6700\u521d\u306e\u6bb5\u843d\u306f <p> \u3092\u5916\u3059\uff081 \u884c\u306e\u30bb\u30eb\u3068\u540c\u3058\u304f\u30a4\u30f3\u30e9\u30a4\u30f3\u306b\u3059\u308b\uff09\r\n    \/\/  \u4e2d\u8eab \uff0b \u30ea\u30b9\u30c8 \u2192 \u4e2d\u8eab<ul>\u2026<\/ul>\r\n    if (html.indexOf('<p>') === 0) {\r\n      const end = html.indexOf('<\/p>');\r\n      if (end !== -1) html = html.slice(3, end) + html.slice(end + 4);\r\n    }\r\n    return html.split(NL).join('');\r\n  }\r\n\r\n  function mergeTableContinuationRows(block, cellStore, leadIndent) {\r\n    const out = [];\r\n    let i = 0;\r\n    while (i < block.length) {\r\n      if (!isContinuationRow(block[i])) {\r\n        out.push(block[i]);\r\n        i++;\r\n        continue;\r\n      }\r\n      \/\/\u884c\u672b\u306b\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u306e\u3042\u308b\u884c\u3068\u3001\u305d\u306e\u6b21\u306e\u884c\u307e\u3067\u3092 1 \u3064\u306e\u884c\u306b\u307e\u3068\u3081\u308b\r\n      const group = [];\r\n      while (i < block.length && isContinuationRow(block[i])) {\r\n        const t = block[i].trim();\r\n        group.push(t.slice(0, -1).trim());\r\n        i++;\r\n      }\r\n      if (i < block.length) {\r\n        group.push(block[i]);\r\n        i++;\r\n      }\r\n\r\n      const rows = group.map(splitTableRow);\r\n      let colCount = 0;\r\n      rows.forEach(function (r) { colCount = Math.max(colCount, r.length); });\r\n\r\n      const merged = [];\r\n      for (let c = 0; c < colCount; c++) {\r\n        const parts = rows.map(function (r) { return r[c] || ''; });\r\n        \/\/\u672b\u5c3e\u306e\u7a7a\u306e\u884c\u306f\u53d6\u308a\u9664\u304f\r\n        while (parts.length > 1 && parts[parts.length - 1] === '') parts.pop();\r\n        const content = parts.join(NL).trim();\r\n        if (content.indexOf(NL) === -1) {\r\n          merged.push(content);\r\n        } else {\r\n          const idx = cellStore.length;\r\n          cellStore.push(renderTableCellBlock(content));\r\n          merged.push(TABLE_CELL_TOKEN + idx + TABLE_CELL_TOKEN);\r\n        }\r\n      }\r\n      out.push((leadIndent || '') + '| ' + merged.join(' | ') + ' |');\r\n    }\r\n    return out;\r\n  }\r\n\r\n  function restoreTableCells(text, cellStore) {\r\n    for (let i = cellStore.length - 1; i >= 0; i--) {\r\n      text = text.split(TABLE_CELL_TOKEN + i + TABLE_CELL_TOKEN).join(cellStore[i]);\r\n    }\r\n    return text;\r\n  }\r\n\r\n  \/\/ \u751f\u306e <br>\uff08\u30e6\u30fc\u30b6\u30fc\u304c\u5143\u3005\u66f8\u3044\u3066\u3044\u305f\u6539\u884c\u30bf\u30b0\u3002\u30c6\u30fc\u30d6\u30eb\u306e\u30c7\u30b3\u30fc\u30c9\u7d50\u679c\u306b\u542b\u307e\u308c\u308b\r\n  \/\/ \u30bb\u30eb\u5185\u6539\u884c\u3082\u3053\u308c\u306b\u3042\u305f\u308b\uff09\u3092\u3001marked \u306b\u6e21\u3059\u524d\u306b\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u5316\u3057\u3066\u304a\u304f\u3002\r\n  \/\/   \u30fb\u76ee\u7684\uff1aconvertTagTables \u306e\u300c<br> \u3092\u884c\u533a\u5207\u308a\u3068\u307f\u306a\u3059\u300d\u6b63\u898f\u5316\r\n  \/\/     \uff08breaks:true \u306e\u3068\u304d\u3001marked \u304c\u884c\u533a\u5207\u308a\u7528\u306e\u6539\u884c\u3092 <br> \u306b\u5909\u63db\u3057\u3066\u3057\u307e\u3046\r\n  \/\/     \u3053\u3068\u3078\u306e\u5bfe\u51e6\uff09\u304c\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u610f\u56f3\u7684\u306b\u30bb\u30eb\u5185\u3078\u66f8\u3044\u305f <br> \u307e\u3067\u884c\u533a\u5207\u308a\u3068\r\n  \/\/     \u8aa4\u8a8d\u3057\u3066\u4f59\u8a08\u306a\u884c\u306b\u5206\u5272\u3057\u3066\u3057\u307e\u3046\u554f\u984c\u3092\u9632\u3050\u3002\r\n  \/\/   \u30fb\u533a\u5225\u306e\u4ed8\u3051\u65b9\uff1amarked \u3092\u901a\u3059\u201c\u524d\u201d\u306e\u751f\u30c6\u30ad\u30b9\u30c8\u306e\u6642\u70b9\u3067\u4fdd\u8b77\u3059\u308b\u305f\u3081\u3001\u3053\u3053\u3067\r\n  \/\/     \u4fdd\u8b77\u3055\u308c\u308b <br> \u306f\u5fc5\u305a\u300c\u5143\u304b\u3089\u30e6\u30fc\u30b6\u30fc\u304c\u66f8\u3044\u3066\u3044\u305f\u3082\u306e\u300d\u3002breaks:true \u306b\r\n  \/\/     \u3088\u3063\u3066\u884c\u533a\u5207\u308a\u306e\u6539\u884c\u304c\u5909\u63db\u3055\u308c\u3066\u751f\u307e\u308c\u308b <br> \u306f\u3001\u3053\u306e\u51e6\u7406\u3088\u308a\u5f8c\r\n  \/\/     \uff08convertMd2Html \u306e\u4e2d\uff09\u3067\u767a\u751f\u3059\u308b\u306e\u3067\u4fdd\u8b77\u306e\u5bfe\u8c61\u306b\u306a\u3089\u305a\u3001\r\n  \/\/     convertTagTables \u306e\u6b63\u898f\u5316\u306b\u306f\u305d\u306e\u307e\u307e\u5f93\u6765\u901a\u308a\u5f93\u3046\u3002\r\n  \/\/   \u30fbconvertTagTables \u304c\u7d42\u308f\u3063\u305f\u3042\u3068\u306b\u5143\u306e <br> \u3078\u5fa9\u5143\u3059\u308b\u3002\r\n  const RAW_BR_TOKEN = 'XRAWBRX';\r\n\r\n  function protectRawBr(text) {\r\n    const re = new RegExp('<br[^>]*>', 'g');\r\n    return text.replace(re, RAW_BR_TOKEN);\r\n  }\r\n\r\n  function restoreRawBr(text) {\r\n    const re = new RegExp(RAW_BR_TOKEN, 'g');\r\n    return text.replace(re, '<br>');\r\n  }\r\n\r\n  \/\/ \u30bb\u30eb\u6587\u5b57\u5217\u914d\u5217 \u2192 \u30bb\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u914d\u5217\uff08\u7d50\u5408\u51e6\u7406\u306e\u4f5c\u696d\u7528\uff09\r\n  function toCellObjects(cellStrings) {\r\n    return cellStrings.map(content => ({ content: content, colspan: 1, rowspan: 1, merged: false }));\r\n  }\r\n\r\n  \/\/ \u30bb\u30eb\u7d50\u5408\uff1a\r\n  \/\/ \u30fb< \u2026 \u5de6\u306e\u30bb\u30eb\u306b\u5438\u53ce\u3055\u308c\u308b\uff08colspan\uff09\r\n  \/\/ \u30fb> \u2026 \u53f3\u306e\u30bb\u30eb\u306b\u5438\u53ce\u3055\u308c\u308b\uff08colspan\uff09\r\n  \/\/ \u30fb^ \u2026 \u4e0a\u306e\u30bb\u30eb\u306b\u5438\u53ce\u3055\u308c\u308b\uff08rowspan\uff09\r\n  \/\/ rows \u306f\u300c\u30bb\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u914d\u5217\u300d\u306e\u914d\u5217\uff081\u884c=1\u914d\u5217\uff09\u3002\u540c\u4e00 rows \u5185\u3067\u306e\u307f\u51e6\u7406\u3059\u308b\r\n  \/\/ \uff08thead \/ tbody \u3092\u307e\u305f\u3044\u3067\u306f\u4f1d\u64ad\u3057\u306a\u3044\u3002\u547c\u3073\u51fa\u3057\u5074\u3067\u884c\u30b0\u30eb\u30fc\u30d7\u3054\u3068\u306b\u6e21\u3059\uff09\r\n  function applyCellMerges(rows) {\r\n    \/\/ \u6a2a\u7d50\u5408\uff08\u5de6\u65b9\u5411\uff09\uff1a< \u306f\u5de6\u306e\u30bb\u30eb\u306b\u5438\u53ce\u3055\u308c\u308b\r\n    for (let r = 0; r < rows.length; r++) {\r\n      for (let c = 1; c < rows[r].length; c++) {\r\n        if (rows[r][c].content === MERGE_LEFT_TOKEN) {\r\n          let target = c - 1;\r\n          while (target >= 0 && rows[r][target].merged) { target--; }\r\n          if (target >= 0) {\r\n            rows[r][target].colspan++;\r\n            rows[r][c].merged = true;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    \/\/ \u6a2a\u7d50\u5408\uff08\u53f3\u65b9\u5411\uff09\uff1a> \u306f\u53f3\u306e\u30bb\u30eb\u306b\u5438\u53ce\u3055\u308c\u308b\r\n    for (let r = 0; r < rows.length; r++) {\r\n      for (let c = rows[r].length - 2; c >= 0; c--) {\r\n        if (rows[r][c].content === MERGE_RIGHT_TOKEN) {\r\n          let target = c + 1;\r\n          while (target < rows[r].length && rows[r][target].merged) { target++; }\r\n          if (target < rows[r].length) {\r\n            rows[r][target].colspan++;\r\n            rows[r][c].merged = true;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    \/\/ \u7e26\u7d50\u5408\uff1a^ \u306f\u4e0a\u306e\u30bb\u30eb\u306b\u5438\u53ce\u3055\u308c\u308b\r\n    for (let r = 1; r < rows.length; r++) {\r\n      for (let c = 0; c < rows[r].length; c++) {\r\n        if (rows[r][c].content === MERGE_UP_TOKEN) {\r\n          let target = r - 1;\r\n          let horizontal = false;\r\n          while (target >= 0 && rows[target][c] && rows[target][c].merged) {\r\n            const above = rows[target][c].content;\r\n            if (above === MERGE_LEFT_TOKEN || above === MERGE_RIGHT_TOKEN) horizontal = true;\r\n            target--;\r\n          }\r\n          \/\/\u7e26\u6a2a\u306b\u7d50\u5408\u3057\u305f\u7bc4\u56f2\uff082\u00d72 \u306a\u3069\uff09\u306e\u53f3\u5074\u306e\u5217\u306f\u3001\u4e0a\u306e\u884c\u3067\u6a2a\u306b\u7d50\u5408\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001\r\n          \/\/\u5de6\u306e\u5217\u306e ^ \u304c\u4f38\u3070\u3057\u305f rowspan \u306b\u542b\u307e\u308c\u308b\uff08\u3053\u3053\u3067\u306f\u6d88\u3059\u3060\u3051\uff09\r\n          if (horizontal) {\r\n            rows[r][c].merged = true;\r\n          } else if (target >= 0 && rows[target][c]) {\r\n            rows[target][c].rowspan++;\r\n            rows[r][c].merged = true;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  \/\/ \u7d50\u5408\u5148\u304c\u898b\u3064\u304b\u3089\u306a\u304b\u3063\u305f\u30de\u30fc\u30ab\u30fc\u30c8\u30fc\u30af\u30f3\uff08\u4f8b\uff1a\u53f3\u7aef\u306e > \u306a\u3069\uff09\u306b\u6b8b\u3063\u305f\u3082\u306e\u3092\u3001\r\n  \/\/ \u5143\u306e\u8a18\u53f7\u8868\u793a\u306b\u623b\u3059\u3002\r\n  const MERGE_TOKEN_TO_GLYPH = {};\r\n  MERGE_TOKEN_TO_GLYPH[MERGE_LEFT_TOKEN] = '<';\r\n  MERGE_TOKEN_TO_GLYPH[MERGE_RIGHT_TOKEN] = '>';\r\n  MERGE_TOKEN_TO_GLYPH[MERGE_UP_TOKEN] = '^';\r\n  function displayGlyph(content) {\r\n    return MERGE_TOKEN_TO_GLYPH[content] !== undefined ? MERGE_TOKEN_TO_GLYPH[content] : content;\r\n  }\r\n\r\n  \/\/ cells \u306f\u30bb\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u914d\u5217\u3002firstCellIsTh \u306e\u3068\u304d\u3001\u884c\u5185\u3067\u6700\u521d\u306b\u8868\u793a\u3055\u308c\u308b\r\n  \/\/ \uff08\uff1d\u7d50\u5408\u3067\u6d88\u3048\u3066\u3044\u306a\u3044\uff09\u30bb\u30eb\u3092 <th> \u306b\u3059\u308b\r\n  function rowToHtml(cells, firstCellIsTh) {\r\n    let html = '    <tr>' + NL;\r\n    let isFirstVisible = true;\r\n    \/\/1 \u5217\u76ee\u304c\u4e0a\u306e\u30bb\u30eb\u306b\u7e26\u306b\u7d50\u5408\u3055\u308c\u3066\u3044\u308b\u884c\uff08rowspan \u306e\u4e0b\u306e\u884c\uff09\u306f\u3001<th> \u306b\u3057\u306a\u3044\r\n    let startsAtFirstColumn = true;\r\n    cells.forEach((cell) => {\r\n      if (cell.merged) {\r\n        if (isFirstVisible && cell.content !== MERGE_RIGHT_TOKEN) startsAtFirstColumn = false;\r\n        return;\r\n      }\r\n      const tag = (firstCellIsTh && isFirstVisible && startsAtFirstColumn) ? 'th' : 'td';\r\n      isFirstVisible = false;\r\n      let attrs = '';\r\n      if (cell.colspan > 1) attrs += ' colspan=\"' + cell.colspan + '\"';\r\n      if (cell.rowspan > 1) attrs += ' rowspan=\"' + cell.rowspan + '\"';\r\n      html += '      <' + tag + attrs + '>' + displayGlyph(cell.content) + '<\/' + tag + '>' + NL;\r\n    });\r\n    html += '    <\/tr>' + NL;\r\n    return html;\r\n  }\r\n\r\n  \/\/ useTd2Th: \u300c\u5404\u884c\u6700\u521d\u306e\u30bb\u30eb\u3092 <th> \u306b\u5909\u63db\u300d\u30aa\u30d7\u30b7\u30e7\u30f3\u306eON\/OFF\uff08\u533a\u5207\u308a\u884c\u304c\u3042\u308b\u3068\u304d\u306e\u307f\u610f\u5473\u3092\u6301\u3064\uff09\r\n  function buildTableHtml(lines, useTd2Th) {\r\n    \/\/ \u30ad\u30e3\u30d7\u30b7\u30e7\u30f3\uff08protectTableSections \u304c\u898b\u51fa\u3057\u884c\u306e\u5148\u982d\u306b\u76ee\u5370\u3067\u631f\u3093\u3067\u4ed8\u3051\u305f\u3082\u306e\uff09\r\n    let captionHtml = '';\r\n    if (lines.length && lines[0].indexOf(TABLE_CAPTION_START) === 0) {\r\n      const end = lines[0].indexOf(TABLE_CAPTION_END);\r\n      if (end !== -1) {\r\n        captionHtml = lines[0].slice(TABLE_CAPTION_START.length, end).trim();\r\n        lines = [lines[0].slice(end + TABLE_CAPTION_END.length)].concat(lines.slice(1));\r\n      }\r\n    }\r\n\r\n    const rawRows = lines.map(splitTableRow);\r\n\r\n    let separatorIndex = -1;\r\n    for (let i = 0; i < rawRows.length; i++) {\r\n      if (isSeparatorRow(rawRows[i])) { separatorIndex = i; break; }\r\n    }\r\n\r\n    let html = '<table>' + NL;\r\n    if (captionHtml) html += '  <caption>' + captionHtml + '<\/caption>' + NL;\r\n\r\n    \/\/ \u884c\u30b0\u30eb\u30fc\u30d7\uff08thead \/ \u5404 tbody \/ tfoot\uff09\u3054\u3068\u306b\u3001\u305d\u306e\u5185\u90e8\u3060\u3051\u3067\u30bb\u30eb\u7d50\u5408\u3092\u9069\u7528\u3059\u308b\r\n    \/\/ \uff08\u7d50\u5408\u306f\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u307e\u305f\u304c\u306a\u3044\uff09\r\n    function section(tag, rows) {\r\n      const cellRows = rows.map(toCellObjects);\r\n      applyCellMerges(cellRows);\r\n      let h = '  <' + tag + '>' + NL;\r\n      cellRows.forEach(cells => { h += rowToHtml(cells, useTd2Th); });\r\n      return h + '  <\/' + tag + '>' + NL;\r\n    }\r\n\r\n    if (separatorIndex !== -1) {\r\n      html += section('thead', rawRows.slice(0, separatorIndex));\r\n    }\r\n\r\n    \/\/ \u672c\u6587\uff1a<tbody> \u306e\u533a\u5207\u308a\u306e\u76ee\u5370\u3067\u5206\u5272\u3057\u3001<tfoot> \u306e\u76ee\u5370\u3088\u308a\u4e0b\u306f\u30d5\u30c3\u30bf\u30fc\u306b\u3059\u308b\r\n    const bodies = [[]];\r\n    let foot = null;\r\n    rawRows.slice(separatorIndex + 1).forEach(function (cells) {\r\n      if (cells.length === 1 && cells[0] === TABLE_TBODY_TOKEN) {\r\n        if (!foot) bodies.push([]);\r\n        return;\r\n      }\r\n      if (cells.length === 1 && cells[0] === TABLE_TFOOT_TOKEN) {\r\n        if (!foot) foot = [];\r\n        return;\r\n      }\r\n      (foot || bodies[bodies.length - 1]).push(cells);\r\n    });\r\n\r\n    const nonEmptyBodies = bodies.filter(rows => rows.length > 0);\r\n    (nonEmptyBodies.length ? nonEmptyBodies : [[]]).forEach(function (rows) {\r\n      html += section('tbody', rows);\r\n    });\r\n    if (foot && foot.length) html += section('tfoot', foot);\r\n\r\n    html += '<\/table>';\r\n    return html;\r\n  }\r\n\r\n  \/\/ marked \u51fa\u529b\uff08<p>...<\/p>\uff09\u306e\u4e2d\u304b\u3089\u300c\u5168\u884c\u304c | \u3092\u542b\u3080\u300d\u30d6\u30ed\u30c3\u30af\u3060\u3051\u3092\u30c6\u30fc\u30d6\u30eb\u5316\u3059\u308b\r\n  \/\/ \u30fbs \u30d5\u30e9\u30b0\uff08dotall\uff09\u3067 . \u304c\u6539\u884c\u306b\u3082\u30de\u30c3\u30c1\u3059\u308b\u3088\u3046\u306b\u3057\u3001\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u3092\u4f7f\u3046\u6587\u5b57\u30af\u30e9\u30b9\u8868\u8a18\u3092\u56de\u907f\r\n  \/\/ \u30fbbreaks:true \u306e\u3068\u304d\u306f marked \u304c\u6539\u884c\u306e\u4ee3\u308f\u308a\u306b <br> \u3092\u51fa\u529b\u3059\u308b\u305f\u3081\u3001\r\n  \/\/   <br> \u3082\u6539\u884c\u3068\u3057\u3066\u6271\u3063\u3066\u304b\u3089\u884c\u5206\u5272\u3059\u308b\uff08\u305d\u3046\u3057\u306a\u3044\u3068\u884c\u304c1\u3064\u306b\u7e4b\u304c\u3063\u3066\u30c6\u30fc\u30d6\u30eb\u5224\u5b9a\u3067\u304d\u306a\u3044\uff09\r\n  function convertTagTables(html, useTd2Th) {\r\n    const brRe = new RegExp('<br' + BS + 's*\/?>', 'g');\r\n    return html.replace(new RegExp('<p>(.*?)<\/p>', 'gs'), function (match, inner) {\r\n      const normalized = inner.replace(brRe, NL);\r\n      const lines = normalized.split(NL).map(l => l.trim()).filter(l => l !== '');\r\n      if (lines.length < 2) return match;                    \/\/ \u6700\u4f4e2\u884c\uff08\u30c7\u30fc\u30bf1\u884c\u4ee5\u4e0a\uff09\u5fc5\u8981\r\n      if (!lines.every(l => l.includes('|'))) return match;   \/\/ \u5168\u884c\u306b | \u304c\u7121\u3051\u308c\u3070\u5bfe\u8c61\u5916\r\n      return buildTableHtml(lines, useTd2Th);\r\n    });\r\n  }\r\n\r\n\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u2605\u4fdd\u8b77\uff0f\u5fa9\u5143\u30e9\u30c3\u30d1\u30fc\u2605\r\n  \/\/   marked \u5909\u63db\u306e\u524d\u5f8c\u3067\u3001\u58ca\u308c\u3066\u306f\u56f0\u308b\u3082\u306e\u3092\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u3078\u9000\u907f\u30fb\u5fa9\u5143\u3059\u308b\u3002\r\n  \/\/   \u30fbXCBPX{n}XCBPX \u2026 \u30b3\u30fc\u30c9\uff08\u30d5\u30a7\u30f3\u30b9\uff0b\u30a4\u30f3\u30e9\u30a4\u30f3\uff09\u3002store \u306e type \u3067\u533a\u5225\r\n  \/\/   \u30fbXSCPX{n}XSCPX \u2026 \u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\uff08\uff3bamazon ...\uff3d \u7b49\uff09\r\n  \/\/   \u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u306f\u82f1\u5927\u6587\u5b57\uff0b\u6570\u5b57\u306e\u307f\u3002marked \u304c\u659c\u4f53(_x_)\u3084\u5f37\u8abf(**x**)\u3001\r\n  \/\/   \u81ea\u52d5\u30ea\u30f3\u30af\u7b49\u306b\u5dfb\u304d\u8fbc\u307e\u306a\u3044\u3088\u3046\u3001\u8a18\u53f7\u3092\u542b\u3081\u3066\u3044\u306a\u3044\u3002\r\n  \/\/ ============================================================================\r\n\r\n  \/\/ ============================================================\r\n  \/\/ \u2605\u65e2\u5b58\u306e <pre><code> \u306b\u5bfe\u3059\u308b\u30a4\u30f3\u30c7\u30f3\u30c8\u6574\u5f62\u306e\u547c\u3073\u51fa\u3057\u53e3\u2605\r\n  \/\/   \u300cMarkdown \u2192 HTML \u306b\u5909\u63db\u300d\u30c1\u30a7\u30c3\u30af\u306e\u5916\u5074\u304b\u3089\u547c\u3070\u308c\u308b\u305f\u3081\u3001\u3053\u306e\u6642\u70b9\u3067\u306f\r\n  \/\/   \u30de\u30fc\u30ab\u30fc\u4fdd\u8b77\u7b49\u306e\u4ed5\u7d44\u307f\u306b\u306f\u983c\u308c\u306a\u3044\u3002<pre><code class=\"language-xxx\">\r\n  \/\/   \u2026\u30a8\u30b9\u30b1\u30fc\u30d7\u6e08\u307f\u4e2d\u8eab\u2026<\/code><\/pre> \u306e\u5f62\u3092\u76f4\u63a5\u691c\u51fa\u3057\u3001\u4e2d\u8eab\u3092\u3044\u3063\u305f\u3093\r\n  \/\/   HTML\u30a8\u30b9\u30b1\u30fc\u30d7\u524d\u306e\u751f\u30c6\u30ad\u30b9\u30c8\u306b\u623b\u3057\u3066\u304b\u3089 reindentCodeBlock \u306b\u6e21\u3057\u3001\r\n  \/\/   \u7d50\u679c\u3092\u518d\u5ea6\u30a8\u30b9\u30b1\u30fc\u30d7\u3057\u3066\u623b\u3059\uff08restoreCodeBlocks \u306e escapeHtml \u3068\u5bfe\u306b\u306a\u308b\r\n  \/\/   \u51e6\u7406\u3092\u3053\u3053\u3067\u3082\u6301\u3064\u3002\u95a2\u6570\u3092\u5171\u6709\u3059\u308b\u3068 restoreCodeBlocks \u5074\u306e\u5909\u66f4\u306b\u5dfb\u304d\u8fbc\u3080\r\n  \/\/   \u30ea\u30b9\u30af\u304c\u3042\u308b\u305f\u3081\u3001\u3042\u3048\u3066\u72ec\u7acb\u3055\u305b\u3066\u3044\u308b\uff09\u3002\r\n  \/\/ ============================================================\r\n  function unescapeCodeHtml(s) {\r\n    const lsqbRe = new RegExp('&lsqb;', 'g');\r\n    const rsqbRe = new RegExp('&rsqb;', 'g');\r\n    const ltRe = new RegExp('&lt;', 'g');\r\n    const gtRe = new RegExp('&gt;', 'g');\r\n    const ampRe = new RegExp('&amp;', 'g');\r\n    return s\r\n      .replace(lsqbRe, OB)\r\n      .replace(rsqbRe, CB)\r\n      .replace(ltRe, '<')\r\n      .replace(gtRe, '>')\r\n      .replace(ampRe, '&');\r\n  }\r\n\r\n  function escapeCodeHtml(s) {\r\n    const openBracketRe = new RegExp(BS + OB, 'g');\r\n    const closeBracketRe = new RegExp(BS + CB, 'g');\r\n    const ampRe = new RegExp('&', 'g');\r\n    const ltRe = new RegExp('<', 'g');\r\n    const gtRe = new RegExp('>', 'g');\r\n    return s\r\n      .replace(ampRe, '&amp;')\r\n      .replace(ltRe, '&lt;')\r\n      .replace(gtRe, '&gt;')\r\n      .replace(openBracketRe, '&lsqb;')\r\n      .replace(closeBracketRe, '&rsqb;');\r\n  }\r\n\r\n  function reindentExistingCodeBlocks(text) {\r\n    const btn = document.getElementById('convertReindentCode');\r\n    if (!btn || !btn.checked) return text;\r\n    const preCodeRe = new RegExp('<pre><code class=\"language-([^\"]*)\">([^]*?)<\/code><\/pre>', 'g');\r\n    return text.replace(preCodeRe, function (match, lang, escapedContent) {\r\n      const rawContent = unescapeCodeHtml(escapedContent);\r\n      const reindented = reindentCodeBlock(rawContent, lang);\r\n      const langClass = lang ? ('language-' + lang) : 'language-';\r\n      return '<pre><code class=\"' + langClass + '\">' + escapeCodeHtml(reindented) + '<\/code><\/pre>';\r\n    });\r\n  }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ \u2605\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u5185\u30a4\u30f3\u30c7\u30f3\u30c8\u6574\u5f62\uff08\u69cb\u9020\u30d9\u30fc\u30b9\u30fb\u8a00\u8a9e\u975e\u4f9d\u5b58\uff09\u2605\r\n  \/\/   {} \/ [] \/ HTML\u30bf\u30b0 \/ PHP\u5236\u5fa1\u69cb\u9020\uff08: ?> \u2026 <?php end\uff09\u306e\r\n  \/\/   \u958b\u9589\u3092\u898b\u3066\u3001\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u306e\u4e2d\u8eab\u3092\u30bf\u30d6\u3067\u5b57\u4e0b\u3052\u3057\u76f4\u3059\u3002\r\n  \/\/   \u30d1\u30fc\u30b5\u30fc\u3092\u4f7f\u308f\u305a\u69cb\u9020\u3060\u3051\u3067\u5224\u5b9a\u3059\u308b\u305f\u3081\u3001PHP\u30fbHTML\u30fbCSS\u30fbJS\u304c\r\n  \/\/   \u6df7\u5728\u3057\u3066\u3044\u3066\u3082\u5d29\u308c\u306a\u3044\uff08VS Code\u7b49\u3067\u306e\u6574\u5f62\u3067\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u5185\u306e\r\n  \/\/   \u30a4\u30f3\u30c7\u30f3\u30c8\u304c\u6f70\u308c\u3066\u3057\u307e\u3063\u305f\u5834\u5408\u306e\u5fa9\u65e7\u306b\u4fbf\u5229\uff09\u3002\r\n  \/\/   \u203b \u30a4\u30f3\u30c7\u30f3\u30c8\u304c\u610f\u5473\u3092\u6301\u3064\u8a00\u8a9e\uff08python\/yaml\uff09\u306f\u5bfe\u8c61\u5916\u3002\r\n  \/\/   \u203b ( ) \u306f\u8aa4\u7206\u56de\u907f\u306e\u305f\u3081\u5bfe\u8c61\u5916\u3002\r\n  \/\/   \u203b \u65e7\u30c4\u30fc\u30eb\uff08markdown-converter_2609151001.html\uff09\u304b\u3089\u79fb\u690d\u3002\r\n  \/\/     \u6b63\u898f\u8868\u73fe\u306f\u5168\u3066\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u3092\u76f4\u66f8\u304d\u305b\u305a\u3001BS\/OB\/CB\/TAB\u5b9a\u6570\u304b\u3089\r\n  \/\/     new RegExp() \u3067\u7d44\u307f\u7acb\u3066\u308b\uff08\u3053\u306e\u30b5\u30a4\u30c8\u7d4c\u7531\u306e\u914d\u4fe1\u3067\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\r\n  \/\/     \u6587\u5b57\u304c\u5931\u308f\u308c\u308b\u554f\u984c\u3078\u306e\u5bfe\u7b56\u3002\u65e2\u5b58\u30b3\u30fc\u30c9\u3068\u540c\u3058\u65b9\u91dd\uff09\u3002\r\n  \/\/ ============================================================\r\n  function reindentCodeBlock(code, lang) {\r\n    const skipLangRe = new RegExp('^(python|py|yaml|yml)$', 'i');\r\n    if (skipLangRe.test((lang || '').trim())) return code;\r\n\r\n    const leadingWsRe = new RegExp('^[ ' + TAB + ']+');\r\n\r\n    \/\/ PHP\u30bf\u30b0\u30fbHTML\u30b3\u30e1\u30f3\u30c8\u3092\u9664\u3044\u305f\u7248\u3067\u62ec\u5f27\uff0f\u30bf\u30b0\u3092\u30ab\u30a6\u30f3\u30c8\u3059\u308b\uff08\u8aa4\u30ab\u30a6\u30f3\u30c8\u9632\u6b62\uff09\r\n    const phpBlockRe = new RegExp('<' + BS + '?php[' + BS + 's' + BS + 'S]*?' + BS + '?>', 'g');\r\n    const phpEchoRe = new RegExp('<' + BS + '?=[' + BS + 's' + BS + 'S]*?' + BS + '?>', 'g');\r\n    const phpUnclosedRe = new RegExp('<' + BS + '?php[' + BS + 's' + BS + 'S]*$', 'g');\r\n    const htmlCommentRe = new RegExp('<!--[' + BS + 's' + BS + 'S]*?-->', 'g');\r\n\r\n    \/\/ PHP\/C\u7cfb\u306e\u30d6\u30ed\u30c3\u30af\u30b3\u30e1\u30f3\u30c8\uff08\/* ... *\/\uff09\u306f\u8907\u6570\u884c\u306b\u307e\u305f\u304c\u308b\u3053\u3068\u304c\u3042\u308b\r\n    \/\/ \uff08PHPDoc\u7b49\uff09\u305f\u3081\u3001\u884c\u3092\u307e\u305f\u3044\u3060\u300c\u4eca\u30b3\u30e1\u30f3\u30c8\u306e\u4e2d\u306b\u3044\u308b\u304b\u300d\u3092\u72b6\u614b\u3068\u3057\u3066\r\n    \/\/ \u6301\u3061\u56de\u308a\u306a\u304c\u3089\u3001\u30ab\u30a6\u30f3\u30c8\u5bfe\u8c61\u304b\u3089\u3060\u3051\u53d6\u308a\u9664\u304f\uff08\u51fa\u529b\u3059\u308b\u884c\u306e\u4e2d\u8eab\u81ea\u4f53\u306f\r\n    \/\/ \u5909\u3048\u306a\u3044\uff09\u3002\u30b3\u30e1\u30f3\u30c8\u672c\u6587\u306b <img> \u7b49\u306e\u30bf\u30b0\u3063\u307d\u3044\u6587\u5b57\u5217\u3084\u5bfe\u5fdc\u3057\u306a\u3044\r\n    \/\/ \u62ec\u5f27\u304c\u51fa\u3066\u304d\u3066\u3082\u3001\u5b57\u4e0b\u3052\u306e\u6df1\u3055\u304c\u305d\u308c\u306b\u3064\u3089\u308c\u3066\u30ba\u30ec\u3066\u3044\u304f\u306e\u3092\u9632\u3050\u3002\r\n    let insideBlockComment = false;\r\n    function stripBlockComments(text) {\r\n      let result = '';\r\n      let i = 0;\r\n      while (i < text.length) {\r\n        if (insideBlockComment) {\r\n          const closeIdx = text.indexOf('*\/', i);\r\n          if (closeIdx === -1) { i = text.length; }\r\n          else { i = closeIdx + 2; insideBlockComment = false; }\r\n        } else {\r\n          const openIdx = text.indexOf('\/*', i);\r\n          if (openIdx === -1) { result += text.slice(i); i = text.length; }\r\n          else {\r\n            result += text.slice(i, openIdx);\r\n            const closeIdx = text.indexOf('*\/', openIdx + 2);\r\n            if (closeIdx === -1) { i = text.length; insideBlockComment = true; }\r\n            else { i = closeIdx + 2; }\r\n          }\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    \/\/ PHP\u5236\u5fa1\u69cb\u9020\r\n    const isEndRe = new RegExp('^<' + BS + '?php' + BS + 's+end', 'i');\r\n    const isElseRe = new RegExp('^<' + BS + '?php' + BS + 's+(else|elseif)' + BS + 'b', 'i');\r\n    \/\/ \u4ee3\u66ff\u69cb\u6587\u306e\u958b\u59cb\uff1aif\/for\/foreach\/while\/switch \u3067\u59cb\u307e\u308a\u3001?> \u306e\u524d\u306b : \u304c\u3042\u308b\r\n    const isCtrlOpenHeadRe = new RegExp('^<' + BS + '?php' + BS + 's+(if|for|foreach|while|switch)' + BS + 'b', 'i');\r\n    const isCtrlOpenTailRe = new RegExp(':' + BS + 's*[^?]*' + BS + '?>' + BS + 's*$');\r\n\r\n    \/\/ \u884c\u982d\u304c\u9589\u3058\u8a18\u53f7\uff08\u3053\u306e\u884c\u3060\u30511\u6bb5\u4e0b\u3052\u308b\uff09\r\n    const startsCloserBraceRe = new RegExp('^[}' + BS + CB + ']');\r\n    const startsClosingTagRe = new RegExp('^<\/');\r\n\r\n    const openBraceRe = new RegExp(BS + '{', 'g');\r\n    const closeBraceRe = new RegExp(BS + '}', 'g');\r\n    const openSqBracketRe = new RegExp(BS + OB, 'g');\r\n    const closeSqBracketRe = new RegExp(BS + CB, 'g');\r\n    const openTagRe = new RegExp('<[a-zA-Z][^>]*>', 'g');\r\n    const selfCloseTagRe = new RegExp('\/>$');\r\n    const closeTagRe = new RegExp('<\/[a-zA-Z][^>]*>', 'g');\r\n\r\n    const lines = code.split(NL);\r\n    let depth = 0;\r\n    const out = [];\r\n\r\n    for (const raw of lines) {\r\n      const line = raw.replace(leadingWsRe, ''); \/\/ \u884c\u982d\u306e\u5b57\u4e0b\u3052\u3092\u9664\u53bb\u3057\u3066\u632f\u308a\u76f4\u3059\uff08\u672c\u6587\u4e2d\u306e\u9023\u7d9a\u30b9\u30da\u30fc\u30b9\u63c3\u3048\u306f\u4fdd\u6301\uff09\r\n\r\n      if (line === '') { out.push(''); continue; }\r\n\r\n      const stripped = stripBlockComments(\r\n        line\r\n          .replace(phpBlockRe, '')\r\n          .replace(phpEchoRe, '')\r\n          .replace(phpUnclosedRe, '')\r\n          .replace(htmlCommentRe, '')\r\n      );\r\n\r\n      const isEnd = isEndRe.test(line);\r\n      const isElse = isElseRe.test(line);\r\n      const isCtrlOpen = isCtrlOpenHeadRe.test(line) && isCtrlOpenTailRe.test(line);\r\n\r\n      const startsCloser = startsCloserBraceRe.test(line) || startsClosingTagRe.test(line) || isEnd || isElse;\r\n\r\n      const indent = Math.max(0, depth - (startsCloser ? 1 : 0));\r\n      out.push(indent > 0 ? TAB.repeat(indent) + line : line);\r\n\r\n      \/\/ \u6b21\u884c\u306b\u5411\u3051\u305f\u30cd\u30c3\u30c8\u5897\u6e1b\r\n      let net = 0;\r\n      net += (stripped.match(openBraceRe) || []).length - (stripped.match(closeBraceRe) || []).length;\r\n      net += (stripped.match(openSqBracketRe) || []).length - (stripped.match(closeSqBracketRe) || []).length;\r\n      const openTags = (stripped.match(openTagRe) || []).filter(function (t) { return !selfCloseTagRe.test(t); });\r\n      const closeTags = (stripped.match(closeTagRe) || []);\r\n      net += openTags.length - closeTags.length;\r\n      if (isEnd) net -= 1;\r\n      else if (isCtrlOpen) net += 1;\r\n      \/\/ isElse \u306f net 0\uff08\u4e0b\u3052\u3066\u307e\u305f\u540c\u3058\u6df1\u3055\u306b\u623b\u308b\uff09\r\n\r\n      depth = Math.max(0, depth + net);\r\n    }\r\n    return out.join(NL);\r\n  }\r\n\r\n  \/\/ --- \u30b3\u30fc\u30c9\u4fdd\u8b77\uff08\u30d5\u30a7\u30f3\u30b9\uff0b\u30a4\u30f3\u30e9\u30a4\u30f3\uff09---\r\n  \/\/ GFM\/CommonMark \u6e96\u62e0\u306e\u624b\u52d5\u30d1\u30fc\u30b5\u30fc\uff1a\r\n  \/\/   \u30fb\u884c\u982d\u306e3\u9023\u4ee5\u4e0a\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3067\u30d5\u30a7\u30f3\u30b9\u958b\u59cb\r\n  \/\/   \u30fb\u958b\u59cb\u3068\u540c\u6570\u4ee5\u4e0a\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\uff0b(\u6539\u884c or \u672b\u5c3e)\u3067\u9589\u3058\u308b\r\n  \/\/   \u30fb\u9589\u3058\u304c\u7121\u3051\u308c\u3070\u672b\u5c3e\u307e\u3067\u30921\u30d6\u30ed\u30c3\u30af\u3068\u3057\u3066\u4fdd\u8b77\r\n  \/\/   \u2192 \u5916\u5074```` (4\u9023) \u306e\u4e2d\u306b ``` (3\u9023) \u3092\u542b\u3080\u30cd\u30b9\u30c8\u30821\u30d6\u30ed\u30c3\u30af\u3068\u3057\u3066\u6b63\u3057\u304f\u4fdd\u8b77\u3067\u304d\u308b\r\n\r\n  function protectCodeBlocks(text, store) {\r\n    let result = '';\r\n    let pos = 0;\r\n    const len = text.length;\r\n\r\n    \/\/ \u884c\u982d\u306e\u5b57\u4e0b\u3052\u3082\u53ef\uff08\u30ea\u30b9\u30c8\u9805\u76ee\u306e\u4e2d\u306e\u30b3\u30fc\u30c9\uff09\u3002\u5b57\u4e0b\u3052\u306e\u5206\u306f\u3001\u4e2d\u8eab\u306e\u5404\u884c\u304b\u3089\u3082\u53d6\u308a\u9664\u304f\r\n    const fenceOpenRe = new RegExp('^( *)(`{3,})([^' + NL + '`]*)' + NL);\r\n    const fenceCloseRe = new RegExp('^ *(`{3,})' + BS + 's*$');\r\n\r\n    while (pos < len) {\r\n      const atLineStart = (pos === 0) || (text.charAt(pos - 1) === NL);\r\n\r\n      if (atLineStart) {\r\n        const rest = text.substring(pos);\r\n        const fenceMatch = rest.match(fenceOpenRe);\r\n\r\n        if (fenceMatch) {\r\n          const fenceIndent = fenceMatch[1];\r\n          const fenceLen = fenceMatch[2].length;\r\n          const lang = fenceMatch[3].trim();\r\n          const contentStart = pos + fenceMatch[0].length;\r\n\r\n          let contentEnd = len;\r\n          let blockEnd = len;\r\n          let scanPos = contentStart;\r\n\r\n          while (scanPos < len) {\r\n            const nextNl = text.indexOf(NL, scanPos);\r\n            const lineEnd = (nextNl === -1) ? len : nextNl;\r\n            const line = text.substring(scanPos, lineEnd);\r\n\r\n            const closeMatch = line.match(fenceCloseRe);\r\n            if (closeMatch && closeMatch[1].length >= fenceLen) {\r\n              contentEnd = scanPos - 1;                       \/\/ \u76f4\u524d\u306e\u6539\u884c\u306f\u4e2d\u8eab\u306b\u542b\u3081\u306a\u3044\r\n              blockEnd = (nextNl === -1) ? len : (nextNl + 1); \/\/ \u6539\u884c\u3082\u542b\u3081\u3066\u30d6\u30ed\u30c3\u30af\u7d42\u4e86\r\n              break;\r\n            }\r\n            if (nextNl === -1) { contentEnd = len; blockEnd = len; break; }\r\n            scanPos = nextNl + 1;\r\n          }\r\n\r\n          if (contentEnd < contentStart) contentEnd = contentStart;\r\n\r\n          let fenceContent = text.substring(contentStart, contentEnd);\r\n          if (fenceIndent) {\r\n            fenceContent = fenceContent.split(NL).map(function (l) {\r\n              return removeIndentWidth(l, fenceIndent.length);\r\n            }).join(NL);\r\n          }\r\n\r\n          const idx = store.length;\r\n          store.push({ type: 'fence', lang: lang, content: fenceContent });\r\n          \/\/ \u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u306e\u524d\u5f8c\u306b\u7a7a\u884c\u3092\u631f\u307f\u3001marked \u304c\u72ec\u7acb\u30d6\u30ed\u30c3\u30af\u3068\u3057\u3066\u6271\u3048\u308b\u3088\u3046\u306b\u3059\u308b\r\n          \/\/ \uff08\u5b57\u4e0b\u3052\u306f\u6b8b\u3059\u3002\u30ea\u30b9\u30c8\u9805\u76ee\u306e\u4e2d\u306e\u30b3\u30fc\u30c9\u3068\u3057\u3066\u6271\u3048\u308b\u3088\u3046\u306b\uff09\r\n          result += NL + NL + fenceIndent + 'XCBPX' + idx + 'XCBPX' + NL + NL;\r\n          pos = blockEnd;\r\n          continue;\r\n        }\r\n      }\r\n\r\n      \/\/ \u30d5\u30a7\u30f3\u30b9\u3067\u306a\u3044\u884c\u306f\u305d\u306e\u307e\u307e\u9001\u308b\uff08\u30a4\u30f3\u30e9\u30a4\u30f3\u30b3\u30fc\u30c9\u306f\u5f8c\u6bb5\u3067\u51e6\u7406\uff09\r\n      const nextNl = text.indexOf(NL, pos);\r\n      if (nextNl === -1) { result += text.substring(pos); break; }\r\n      result += text.substring(pos, nextNl + 1);\r\n      pos = nextNl + 1;\r\n    }\r\n\r\n    \/\/ \u30a4\u30f3\u30e9\u30a4\u30f3\u30b3\u30fc\u30c9\uff08`\uff5e`\uff09\u3092\u4fdd\u8b77\u3002\u30d5\u30a7\u30f3\u30b9\u306f\u9000\u907f\u6e08\u307f\u306a\u306e\u3067\u6b8b\u308b\u306e\u306f\u30a4\u30f3\u30e9\u30a4\u30f3\u306e\u307f\u3002\r\n    \/\/ \u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u30a8\u30b9\u30b1\u30fc\u30d7\u3055\u308c\u305f\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u306f\u5bfe\u8c61\u5916\u3002\r\n    \/\/ CommonMark \u3068\u540c\u3058\u304f\u3001\u958b\u304d\u3068\u540c\u3058\u500b\u6570\u306e\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3067\u9589\u3058\u308b\uff08`` `code` `` \u306e\u3088\u3046\u306b\u4e2d\u306b\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\u3092\u542b\u3081\u3089\u308c\u308b\uff09\u3002\r\n    const inlineCodeRe = new RegExp('(^|[^' + BS + BS + '`])(`+)(?!`)([^' + NL + ']+?)(?<!`)' + BS + '2(?!`)', 'g');\r\n    result = result.replace(inlineCodeRe, function (m, prefix, ticks, content) {\r\n      \/\/ \u4e21\u7aef\u304c\u30b9\u30da\u30fc\u30b9\u3067\u3001\u30b9\u30da\u30fc\u30b9\u3060\u3051\u3067\u306f\u306a\u3044\u5834\u5408\u306f\u3001\u4e21\u7aef\u306e\u30b9\u30da\u30fc\u30b9\u3092 1 \u500b\u305a\u3064\u53d6\u308a\u9664\u304f\r\n      if (content.length >= 2 && content.charAt(0) === ' ' && content.charAt(content.length - 1) === ' ' && content.trim() !== '') {\r\n        content = content.slice(1, -1);\r\n      }\r\n      const idx = store.length;\r\n      store.push({ type: 'inline', content: content });\r\n      return prefix + 'XCBPX' + idx + 'XCBPX';\r\n    });\r\n\r\n    return result;\r\n  }\r\n\r\n  \/\/ --- \u30b3\u30fc\u30c9\u5fa9\u5143 ---\r\n  function restoreCodeBlocks(text, store) {\r\n    \/\/ pre\/code \u5185\u306fHTML\u30a8\u30b9\u30b1\u30fc\u30d7\u3002[ ] \u306f WordPress \u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u8aa4\u52d5\u4f5c\u9632\u6b62\u3067\u5b9f\u4f53\u53c2\u7167\u5316\u3002\r\n    const openBracketRe = new RegExp(BS + OB, 'g');\r\n    const closeBracketRe = new RegExp(BS + CB, 'g');\r\n    const escapeHtml = function (s) {\r\n      return s\r\n        .replace(\/&\/g, '&amp;')\r\n        .replace(\/<\/g, '&lt;')\r\n        .replace(\/>\/g, '&gt;')\r\n        .replace(openBracketRe, '&lsqb;')\r\n        .replace(closeBracketRe, '&rsqb;');\r\n    };\r\n\r\n    \/\/ \u5f8c\u308d\u304b\u3089\u623b\u3059\uff08\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u885d\u7a81\u9632\u6b62\uff09\r\n    for (let i = store.length - 1; i >= 0; i--) {\r\n      const item = store[i];\r\n      const placeholder = 'XCBPX' + i + 'XCBPX';\r\n      let replacement;\r\n\r\n      if (item.type === 'fence') {\r\n        const langClass = item.lang ? ('language-' + item.lang) : 'language-';\r\n        replacement = '<pre><code class=\"' + langClass + '\">' + escapeHtml(item.content) + '<\/code><\/pre>';\r\n        \/\/ marked \u304c\u30d5\u30a7\u30f3\u30b9\u306e\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u3092 <p>\u2026<\/p> \u3067\u5305\u3080\u5834\u5408\u304c\u3042\u308b\u306e\u3067\u9664\u53bb\r\n        const wrapped = new RegExp('<p>' + BS + 's*' + placeholder + BS + 's*<\/p>', 'g');\r\n        text = text.replace(wrapped, function () { return replacement; });\r\n      } else {\r\n        replacement = '<code>' + escapeHtml(item.content) + '<\/code>';\r\n      }\r\n\r\n      text = text.split(placeholder).join(replacement);\r\n    }\r\n\r\n    return text;\r\n  }\r\n\r\n  \/\/ --- \u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u4fdd\u8b77 ---\r\n  \/\/ \u751f\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9 \uff3bname ...\uff3d \u3092\u9000\u907f\uff08marked \u306e \" \u2192 &quot; \u5909\u63db\u30fbURL\u81ea\u52d5\u30ea\u30f3\u30af\u5316\u304b\u3089\u5b88\u308b\uff09\u3002\r\n  \/\/ \u2605\u4fdd\u8b77\u5bfe\u8c61\u306e\u540d\u524d\u306f\u3053\u306e\u914d\u5217\u3092\u7de8\u96c6\u3057\u3066\u5897\u6e1b\u3067\u304d\u308b\u3002\r\n  const SHORTCODE_NAMES = ['amazon', 'rakuten', 'yshopping', 'linkbox'];\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  \u30ea\u30f3\u30af\u30ab\u30fc\u30c9\u30fb\u5916\u90e8\u30ea\u30f3\u30af\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u300c\u81ea\u30b5\u30a4\u30c8\u306e\u30c9\u30e1\u30a4\u30f3\u300d\u3067\u5224\u5b9a\uff09\r\n  \/\/  \u30fb\u81ea\u30b5\u30a4\u30c8\u306e URL \u3060\u3051\u306e\u6bb5\u843d \u2192 \uff3blinkbox href=\"URL\"\uff3d\uff08WordPress \u306e\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\uff09\r\n  \/\/      <p><a href=\"https:\/\/code-plus.jp\/gp\/xxx\/\">https:\/\/code-plus.jp\/gp\/xxx\/<\/a><\/p>\r\n  \/\/      \u2192 <p>\uff3blinkbox href=\"https:\/\/code-plus.jp\/gp\/xxx\/\"\uff3d<\/p>\r\n  \/\/  \u30fb\u81ea\u30b5\u30a4\u30c8\u4ee5\u5916\u306e http(s) \u306e\u30ea\u30f3\u30af \u2192 <cite> \u3067\u56f2\u307f\u3001target=\"_blank\" \u3092\u4ed8\u3051\u308b\r\n  \/\/      \uff08\u3059\u3067\u306b target \u304c\u3042\u308b\u30fb\u3059\u3067\u306b <cite> \u306e\u4e2d\u306b\u3042\u308b\u3082\u306e\u306f\u305d\u306e\u307e\u307e\uff09\r\n  \/\/  \u30b3\u30fc\u30c9\u306e\u4e2d\u306e <a>\uff08&lt;a&gt;\uff09\u306f\u3001\u30a8\u30b9\u30b1\u30fc\u30d7\u6e08\u307f\u306a\u306e\u3067\u5bfe\u8c61\u306b\u306a\u3089\u306a\u3044\u3002\r\n  \/\/ ----------------------------------------------------------------------------\r\n  function isSiteUrl(url, siteDomain) {\r\n    if (!siteDomain) return false;\r\n    const m = String(url).match(new RegExp('^https?:\/\/(' + OB + '^\/?#:' + CB + '+)', 'i'));\r\n    if (!m) return false;\r\n    const host = m[1].toLowerCase();\r\n    const domain = siteDomain.toLowerCase();\r\n    return host === domain || host.slice(-(domain.length + 1)) === '.' + domain;\r\n  }\r\n\r\n  function convertSiteUrlLinesToLinkbox(text, siteDomain) {\r\n    \/\/\u6bb5\u843d\u306e\u4e2d\u8eab\u304c\u300cURL \u3068\u540c\u3058\u6587\u5b57\u306e\u30ea\u30f3\u30af\u300d1 \u3064\u3060\u3051\u306e\u3082\u306e\r\n    const re = new RegExp('<p(' + OB + '^>' + CB + '*)>' + BS + 's*<a href=\"(https?:\/\/' + OB + '^\"' + CB + '+)\"' + OB + '^>' + CB + '*>(' + OB + '^<' + CB + '+)<\/a>' + BS + 's*<\/p>', 'g');\r\n    return text.replace(re, function (m, pAttrs, href, label) {\r\n      if (label.trim() !== href || !isSiteUrl(href, siteDomain)) return m;\r\n      return '<p' + pAttrs + '>' + OB + 'linkbox href=\"' + href + '\"' + CB + '<\/p>';\r\n    });\r\n  }\r\n\r\n  function decorateExternalLinks(text, siteDomain) {\r\n    const re = new RegExp('<a' + BS + 's(' + OB + '^>' + CB + '*?)href=\"(https?:\/\/' + OB + '^\"' + CB + '+)\"(' + OB + '^>' + CB + '*)>(' + OB + BS + 's' + BS + 'S' + CB + '*?)<\/a>', 'g');\r\n    const targetRe = new RegExp(BS + 'starget' + BS + 's*=', 'i');\r\n    return text.replace(re, function (m, before, href, after, inner, offset, whole) {\r\n      if (isSiteUrl(href, siteDomain)) return m;\r\n      let tag = '<a ' + before + 'href=\"' + href + '\"' + after;\r\n      if (!targetRe.test(' ' + before + after)) tag += ' target=\"_blank\"';\r\n      const link = tag + '>' + inner + '<\/a>';\r\n      const alreadyCited = whole.slice(Math.max(0, offset - 6), offset) === '<cite>';\r\n      return alreadyCited ? link : '<cite>' + link + '<\/cite>';\r\n    });\r\n  }\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  \u30ab\u30b9\u30bf\u30e0\u30b3\u30f3\u30c6\u30ca\uff08fenced div\uff09\r\n  \/\/    :::{#id .class1 .class2 key=\"value\"}   \u2192 <div id=\"id\" class=\"class1 class2\" key=\"value\">\r\n  \/\/    :::note info                           \u2192 <div class=\"note info\">\uff08{ } \u306a\u3057\u306f\u3001\u5358\u8a9e\u3092\u30af\u30e9\u30b9\u3068\u3057\u3066\u6271\u3046\uff09\r\n  \/\/    \u672c\u6587\r\n  \/\/    :::\r\n  \/\/  \u30fbPandoc \u306e fenced div \u3068\u540c\u3058\u66f8\u304d\u65b9\u3067\u3001Qiita\uff08:::note\uff09\u30fbZenn\uff08:::message\uff09\u306e\u66f8\u304d\u65b9\u3082\u901a\u308b\r\n  \/\/  \u30fb: \u306f 3 \u500b\u4ee5\u4e0a\u3002\u958b\u304d\u306e\u884c\u306b\u306f { } \u304b\u30af\u30e9\u30b9\u540d\u304c\u5fc5\u8981\u3067\u3001: \u3060\u3051\u306e\u884c\u306f\u9589\u3058\r\n  \/\/  \u30fb\u5165\u308c\u5b50\u306b\u3067\u304d\u308b\uff08\u9589\u3058\u306f\u3001\u3044\u3061\u3070\u3093\u5185\u5074\u306e\u958b\u304d\u306b\u5bfe\u5fdc\u3059\u308b\uff09\r\n  \/\/  \u30fb\u9589\u3058\u306e\u306a\u3044\u958b\u304d\u306e\u884c\u3001\u958b\u304d\u306e\u306a\u3044\u9589\u3058\u306e\u884c\u306f\u3001\u6587\u5b57\u306e\u307e\u307e\u6b8b\u3059\r\n  \/\/  \u30fb\u672c\u6587\u306f\u3001\u958b\u304d\u306e\u884c\u306e\u5f8c\u3068\u9589\u3058\u306e\u884c\u306e\u524d\u306b\u7a7a\u884c\u3092\u5165\u308c\u3066\u3001\u901a\u5e38\u306e Markdown \u3068\u3057\u3066\u5909\u63db\u3055\u305b\u308b\r\n  \/\/  \u30fb\u30d5\u30a7\u30f3\u30b9\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u306e\u4e2d\uff08\u8a18\u6cd5\u306e\u8aac\u660e\u306e\u4f8b\u306a\u3069\uff09\u306f\u5bfe\u8c61\u306b\u3057\u306a\u3044\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/ :::\u30bf\u30b0\u540d \u3067\u3001<div> \u4ee5\u5916\u306e\u30bf\u30b0\u306b\u3067\u304d\u308b\u3082\u306e\uff08\u30bb\u30af\u30b7\u30e7\u30cb\u30f3\u30b0\u30fb\u30b0\u30eb\u30fc\u30d4\u30f3\u30b0\u306e\u30bf\u30b0\uff09\r\n  \/\/   \u305d\u308c\u4ee5\u5916\u306e\u540d\u524d\uff08:::note info \u306a\u3069\uff09\u306f\u3001\u3053\u308c\u307e\u3067\u3069\u304a\u308a\u30af\u30e9\u30b9\u540d\u3068\u3057\u3066\u6271\u3046\uff08Qiita\u30fbZenn \u3068\u540c\u3058\uff09\r\n  const FENCED_CONTAINER_TAGS = ['article', 'section', 'nav', 'aside', 'header', 'footer', 'address',\r\n    'pre', 'figure', 'figcaption', 'div', 'main'];\r\n\r\n  function parseFencedDivSpec(spec) {\r\n    let s = spec.trim();\r\n    \/\/\u672b\u5c3e\u306e : \u306e\u4e26\u3073\uff08Pandoc \u306e ::: warning ::: \u306e\u5f62\uff09\u3092\u53d6\u308a\u9664\u304f\r\n    while (s.length && s.charAt(s.length - 1) === ':') s = s.slice(0, -1);\r\n    s = s.trim();\r\n    if (!s) return null;\r\n\r\n    const attrs = { tag: 'div', id: '', classes: [], others: [] };\r\n\r\n    \/\/ :::section{#id .class} \/ :::section class1 class2 \/ :::section\r\n    \/\/  \uff08\u30bf\u30b0\u540d\u306e\u76f4\u5f8c\u304c\u3001\u884c\u672b\u30fb\u7a7a\u767d\u30fb{ \u306e\u3068\u304d\u3060\u3051\u3002:::section__interior \u306f\u30af\u30e9\u30b9\u540d\u306e\u307e\u307e\uff09\r\n    const nameM = s.match(new RegExp('^(' + OB + 'A-Za-z' + CB + OB + 'A-Za-z0-9' + CB + '*)(?=$|' + OB + ' ' + TAB + '{' + CB + ')'));\r\n    if (nameM && FENCED_CONTAINER_TAGS.indexOf(nameM[1].toLowerCase()) !== -1) {\r\n      attrs.tag = nameM[1].toLowerCase();\r\n      s = s.slice(nameM[1].length).trim();\r\n      if (!s) return attrs;\r\n    }\r\n\r\n    if (s.charAt(0) === '{' && s.charAt(s.length - 1) === '}') {\r\n      const inner = s.slice(1, -1);\r\n      const tokenRe = new RegExp(\r\n        '#(' + OB + '^' + BS + 's}' + CB + '+)' +\r\n        '|' + BS + '.(' + OB + '^' + BS + 's}' + CB + '+)' +\r\n        '|(' + OB + 'A-Za-z_:' + CB + OB + '-A-Za-z0-9_:.' + CB + '*)=(?:\"(' + OB + '^\"' + CB + '*)\"|' + \"'(\" + OB + \"^'\" + CB + \"*)'\" + '|(' + OB + '^' + BS + 's}' + CB + '+))',\r\n        'g');\r\n      let m;\r\n      while ((m = tokenRe.exec(inner)) !== null) {\r\n        if (m[1]) attrs.id = m[1];\r\n        else if (m[2]) attrs.classes.push(m[2]);\r\n        else if (m[3]) {\r\n          const val = m[4] !== undefined ? m[4] : (m[5] !== undefined ? m[5] : (m[6] || ''));\r\n          if (m[3] === 'class') Array.prototype.push.apply(attrs.classes, val.split(' ').filter(Boolean));\r\n          else if (m[3] === 'id') attrs.id = val;\r\n          else attrs.others.push({ name: m[3], value: val });\r\n        }\r\n      }\r\n    } else {\r\n      \/\/{ } \u306a\u3057\uff1a\u7a7a\u767d\u533a\u5207\u308a\u306e\u5358\u8a9e\u3092\u3001\u3059\u3079\u3066\u30af\u30e9\u30b9\u3068\u3057\u3066\u6271\u3046\r\n      attrs.classes = s.split(new RegExp(BS + 's+')).filter(Boolean);\r\n    }\r\n    return attrs;\r\n  }\r\n\r\n  function fencedDivOpenTag(attrs) {\r\n    let tag = '<' + (attrs.tag || 'div');\r\n    if (attrs.id) tag += ' id=\"' + footnoteEscapeAttr(attrs.id) + '\"';\r\n    if (attrs.classes.length) tag += ' class=\"' + footnoteEscapeAttr(attrs.classes.join(' ')) + '\"';\r\n    attrs.others.forEach(function (a) { tag += ' ' + a.name + '=\"' + footnoteEscapeAttr(a.value) + '\"'; });\r\n    return tag + '>';\r\n  }\r\n\r\n  \/\/ :::pre \u306e\u4e2d\u8eab\u306f Markdown \u3068\u3057\u3066\u5909\u63db\u305b\u305a\u3001\u305d\u306e\u307e\u307e <pre> \u306e\u4e2d\u306b\u5165\u308c\u308b\uff08\u76ee\u5370\u3067\u9000\u907f\u3057\u3001\u6700\u5f8c\u306b\u623b\u3059\uff09\r\n  const FENCED_PRE_TOKEN = 'XPREBLKX';\r\n  function restoreFencedPres(text, preStore) {\r\n    for (let i = preStore.length - 1; i >= 0; i--) {\r\n      const token = FENCED_PRE_TOKEN + i + FENCED_PRE_TOKEN;\r\n      text = text.replace(new RegExp('<p>' + BS + 's*' + token + BS + 's*<\/p>', 'g'), function () { return preStore[i]; });\r\n      text = text.split(token).join(preStore[i]);\r\n    }\r\n    return text;\r\n  }\r\n\r\n  function convertFencedDivs(text, preStore) {\r\n    const lines = text.split(NL);\r\n    const divRe = new RegExp('^ {0,3}(:{3,})(.*)$');\r\n    const codeFenceRe = new RegExp('^ {0,3}(`{3,}|~{3,})');\r\n\r\n    \/\/\u958b\u304d\u30fb\u9589\u3058\u306e\u884c\u3092\u5bfe\u5fdc\u3065\u3051\u308b\uff08\u30d5\u30a7\u30f3\u30b9\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u306e\u4e2d\u306f\u9664\u304f\uff09\r\n    const openAt = {};   \/\/\u958b\u304d\u306e\u884c\u756a\u53f7 \u2192 \u5c5e\u6027\r\n    const closeAt = {};  \/\/\u9589\u3058\u306e\u884c\u756a\u53f7 \u2192 true\r\n    const stack = [];\r\n    let fence = null;\r\n\r\n    for (let i = 0; i < lines.length; i++) {\r\n      const f = lines[i].match(codeFenceRe);\r\n      if (fence) {\r\n        if (f && f[1].charAt(0) === fence.charAt(0) && f[1].length >= fence.length) fence = null;\r\n        continue;\r\n      }\r\n      if (f) {\r\n        fence = f[1];\r\n        continue;\r\n      }\r\n\r\n      const m = lines[i].match(divRe);\r\n      if (!m) continue;\r\n      const attrs = parseFencedDivSpec(m[2]);\r\n      if (attrs) {\r\n        stack.push({ line: i, attrs: attrs });\r\n      } else if (stack.length) {\r\n        const open = stack.pop();\r\n        openAt[open.line] = open.attrs;\r\n        closeAt[i] = true;\r\n      }\r\n    }\r\n\r\n    const out = [];\r\n    const closeTagStack = [];\r\n    for (let i = 0; i < lines.length; i++) {\r\n      if (openAt[i] && openAt[i].tag === 'pre' && preStore) {\r\n        \/\/\u9589\u3058\u306e\u884c\u307e\u3067\u3092\u3001\u305d\u306e\u307e\u307e <pre> \u306e\u4e2d\u8eab\u306b\u3059\u308b\r\n        let j = i + 1;\r\n        while (j < lines.length && !closeAt[j]) j++;\r\n        const idx = preStore.length;\r\n        preStore.push(fencedDivOpenTag(openAt[i]) + lines.slice(i + 1, j).join(NL) + '<\/pre>');\r\n        out.push('');\r\n        out.push(FENCED_PRE_TOKEN + idx + FENCED_PRE_TOKEN);\r\n        out.push('');\r\n        \/\/\u4e2d\u306b\u3042\u3063\u305f\u958b\u304d\u30fb\u9589\u3058\uff08\u5165\u308c\u5b50\u306e :::\uff09\u306f\u3001\u5909\u63db\u3057\u306a\u3044\r\n        for (let k = i + 1; k <= j; k++) { delete openAt[k]; delete closeAt[k]; }\r\n        i = j;\r\n        continue;\r\n      }\r\n      if (openAt[i]) {\r\n        closeTagStack.push(openAt[i].tag || 'div');\r\n        out.push(fencedDivOpenTag(openAt[i]));\r\n        out.push('');\r\n      } else if (closeAt[i]) {\r\n        out.push('');\r\n        out.push('<\/' + (closeTagStack.pop() || 'div') + '>');\r\n      } else {\r\n        out.push(lines[i]);\r\n      }\r\n    }\r\n    return out.join(NL);\r\n  }\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  \u6298\u308a\u305f\u305f\u307f\u306e\u30a2\u30e9\u30fc\u30c8\uff08Obsidian \u306e\u30b3\u30fc\u30eb\u30a2\u30a6\u30c8\u3068\u540c\u3058\u66f8\u304d\u65b9\uff09\r\n  \/\/    > \uff3b!NOTE\uff3d- \u30bf\u30a4\u30c8\u30eb   \u2192 <details>\uff08\u9589\u3058\u305f\u72b6\u614b\uff09\r\n  \/\/    > \uff3b!NOTE\uff3d+ \u30bf\u30a4\u30c8\u30eb   \u2192 <details open>\uff08\u958b\u3044\u305f\u72b6\u614b\uff09\r\n  \/\/    > \u672c\u6587\r\n  \/\/  \u30fb<summary> \u306b\u306f \uff3b!NOTE\uff3d \u30bf\u30a4\u30c8\u30eb \u3092\u5165\u308c\u308b\uff08WordPress \u306e\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u3067\u30a2\u30a4\u30b3\u30f3\u8868\u793a\uff09\r\n  \/\/  \u30fb\u30bf\u30a4\u30c8\u30eb\u3092\u7701\u7565\u3057\u305f\u5834\u5408\u306f\u3001\u7a2e\u985e\u540d\uff08Note\uff09\u3092\u30bf\u30a4\u30c8\u30eb\u306b\u3059\u308b\r\n  \/\/  \u30fb\u672c\u6587\u306f\u3001<summary> \u306e\u5f8c\u3068 <\/details> \u306e\u524d\u306b\u7a7a\u884c\u3092\u5165\u308c\u3066\u3001\u901a\u5e38\u306e Markdown \u3068\u3057\u3066\u5909\u63db\u3055\u305b\u308b\r\n  \/\/  \u30fb\u672c\u6587\u306e\u4e2d\u306e\u6298\u308a\u305f\u305f\u307f\u306e\u30a2\u30e9\u30fc\u30c8\uff08\u5165\u308c\u5b50\uff09\u3082\u5909\u63db\u3059\u308b\r\n  \/\/  \u30fb\u30d5\u30a7\u30f3\u30b9\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u306e\u4e2d\uff08\u8a18\u6cd5\u306e\u8aac\u660e\u306e\u4f8b\u306a\u3069\uff09\u306f\u5bfe\u8c61\u306b\u3057\u306a\u3044\r\n  \/\/  \u30fb+ \u3082 - \u3082\u4ed8\u3044\u3066\u3044\u306a\u3044 > \uff3b!NOTE\uff3d \u306f\u3001\u3053\u308c\u307e\u3067\u3069\u304a\u308a\u666e\u901a\u306e\u5f15\u7528\u306e\u307e\u307e\r\n  \/\/ ----------------------------------------------------------------------------\r\n  function convertCalloutsToDetails(text) {\r\n    const quoteRe = new RegExp('^ {0,3}> ?');\r\n    const headRe = new RegExp('^ {0,3}> ?' + BS + OB + '!(' + OB + 'A-Za-z' + CB + '+)' + BS + CB + '(' + OB + '+' + BS + '-' + CB + ')(?:' + OB + ' ' + TAB + CB + '+(.*?))?' + OB + ' ' + TAB + CB + '*$');\r\n    const fenceRe = new RegExp('^ {0,3}(`{3,}|~{3,})');\r\n\r\n    const lines = text.split(NL);\r\n    const out = [];\r\n    let fence = null;\r\n\r\n    for (let i = 0; i < lines.length; i++) {\r\n      const line = lines[i];\r\n\r\n      \/\/\u30d5\u30a7\u30f3\u30b9\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u306e\u4e2d\u306f\u305d\u306e\u307e\u307e\r\n      const f = line.match(fenceRe);\r\n      if (fence) {\r\n        if (f && f[1].charAt(0) === fence.charAt(0) && f[1].length >= fence.length) fence = null;\r\n        out.push(line);\r\n        continue;\r\n      }\r\n      if (f) {\r\n        fence = f[1];\r\n        out.push(line);\r\n        continue;\r\n      }\r\n\r\n      const m = line.match(headRe);\r\n      if (!m) {\r\n        out.push(line);\r\n        continue;\r\n      }\r\n\r\n      \/\/\u5f15\u7528\u30d6\u30ed\u30c3\u30af\u306e\u7d9a\u304d\u306e\u884c\uff08> \u3067\u59cb\u307e\u308b\u884c\uff09\u3092\u672c\u6587\u3068\u3057\u3066\u96c6\u3081\u308b\r\n      const body = [];\r\n      let j = i + 1;\r\n      while (j < lines.length && quoteRe.test(lines[j])) {\r\n        body.push(lines[j].replace(quoteRe, ''));\r\n        j++;\r\n      }\r\n\r\n      const type = m[1];\r\n      const open = m[2] === '+';\r\n      const title = (m[3] || '').trim() || (type.charAt(0).toUpperCase() + type.slice(1).toLowerCase());\r\n\r\n      out.push('<details' + (open ? ' open' : '') + '>');\r\n      out.push('<summary>' + OB + '!' + type + CB + ' ' + marked.parseInline(title) + '<\/summary>');\r\n      out.push('');\r\n      out.push(convertCalloutsToDetails(body.join(NL)));\r\n      out.push('');\r\n      out.push('<\/details>');\r\n\r\n      i = j - 1;\r\n    }\r\n\r\n    return out.join(NL);\r\n  }\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  \u898b\u51fa\u3057\u306b id \u3092\u4ed8\u3051\u308b\uff08GitHub \u3068\u540c\u3058\u898f\u5247\uff09\r\n  \/\/    \u30fb\u82f1\u5b57\u306f\u5c0f\u6587\u5b57\u306b\u3059\u308b\r\n  \/\/    \u30fb\u7a7a\u767d\u306f - \u306b\u3059\u308b\r\n  \/\/    \u30fb\u8a18\u53f7\uff08. ( ) \uff08 \uff09 \uff1a \u306a\u3069\uff09\u306f\u53d6\u308a\u9664\u304f\uff08- \u3068 _ \u306f\u6b8b\u3059\uff09\r\n  \/\/    \u30fb\u65e5\u672c\u8a9e\u306f\u305d\u306e\u307e\u307e\u6b8b\u3059\r\n  \/\/    \u30fb\u540c\u3058 id \u304c 2 \u3064\u76ee\u4ee5\u964d\u306b\u51fa\u3066\u304d\u305f\u3089 -1 -2 \u3092\u4ed8\u3051\u308b\r\n  \/\/  \u898b\u51fa\u3057\u306e\u4e2d\u306e\u30b3\u30fc\u30c9\u3084\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u3092\u5fa9\u5143\u3057\u305f\u5f8c\u306b\u3001\u5b8c\u6210\u3057\u305f HTML \u306e\u898b\u51fa\u3057\u306e\r\n  \/\/  \u6587\u5b57\u5217\u304b\u3089\u4f5c\u308b\u3002\u3059\u3067\u306b id \u304c\u3042\u308b\u898b\u51fa\u3057\u306f\u3001\u305d\u306e\u307e\u307e\u306b\u3059\u308b\u3002\r\n  \/\/  \u30b3\u30fc\u30c9\u5185\u306e\u898b\u51fa\u3057\uff08&lt;h2&gt;\uff09\u306f\u3001\u30a8\u30b9\u30b1\u30fc\u30d7\u6e08\u307f\u306a\u306e\u3067\u5bfe\u8c61\u306b\u306a\u3089\u306a\u3044\u3002\r\n  \/\/ ----------------------------------------------------------------------------\r\n  function headingSlug(textContent) {\r\n    const punctRe = new RegExp(OB + BS + 'p{P}' + BS + 'p{S}' + CB, 'gu');\r\n    const spaceRe = new RegExp(BS + 's', 'g');\r\n    return String(textContent).trim().toLowerCase()\r\n      .replace(punctRe, function (ch) { return (ch === '-' || ch === '_') ? ch : ''; })\r\n      .replace(spaceRe, '-');\r\n  }\r\n\r\n  function addHeadingIds(text) {\r\n    const headRe = new RegExp('<h(' + OB + '1-6' + CB + ')((?:' + BS + 's' + OB + '^>' + CB + '*)?)>(' + OB + BS + 's' + BS + 'S' + CB + '*?)<\/h' + BS + '1>', 'g');\r\n    const idAttrRe = new RegExp(BS + 'sid' + BS + 's*=', 'i');\r\n    const used = {};\r\n    const tmp = document.createElement('div');\r\n    return text.replace(headRe, function (m, level, attrs, inner) {\r\n      if (idAttrRe.test(attrs)) return m;\r\n      tmp.innerHTML = inner;\r\n      const base = headingSlug(tmp.textContent);\r\n      if (!base) return m;\r\n      let id = base;\r\n      let n = 0;\r\n      while (Object.prototype.hasOwnProperty.call(used, id)) {\r\n        n++;\r\n        id = base + '-' + n;\r\n      }\r\n      used[id] = true;\r\n      return '<h' + level + attrs + ' id=\"' + footnoteEscapeAttr(id) + '\">' + inner + '<\/h' + level + '>';\r\n    });\r\n  }\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  \u811a\u6ce8\uff08[^1] \u3068 [^1]: \u5185\u5bb9\uff09\r\n  \/\/  marked \u306f\u811a\u6ce8\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u306a\u3044\uff08[^1]: \u5185\u5bb9 \u304c\u30ea\u30f3\u30af\u306e\u53c2\u7167\u5b9a\u7fa9\u3068\u8aa4\u8a8d\u3055\u308c\u308b\uff09\u305f\u3081\u3001\r\n  \/\/  marked \u306e\u524d\u306b\u5b9a\u7fa9\u3092\u53d6\u308a\u51fa\u3057\u3066\u53c2\u7167\u3092\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u306b\u7f6e\u304d\u63db\u3048\u3001marked \u306e\u5f8c\u306b\r\n  \/\/  GitHub\u30fbQiita \u3068\u540c\u3058\u5f62\u306e HTML \u306b\u623b\u3059\u3002\r\n  \/\/    \u53c2\u7167\uff1a<sup><a href=\"#fn-1\" id=\"fnref-1\">1<\/a><\/sup>\r\n  \/\/    \u5b9a\u7fa9\uff1a<section class=\"footnotes\"><ol><li id=\"fn-1\"><p>\u5185\u5bb9 <a href=\"#fnref-1\">\u21a9<\/a><\/p><\/li><\/ol><\/section>\r\n  \/\/  \u30fbid \u306b\u306f\u30e9\u30d9\u30eb\uff08[^note] \u306a\u3089 fn-note\uff09\u3092\u4f7f\u3044\u3001\u8868\u793a\u3059\u308b\u756a\u53f7\u306f\u672c\u6587\u306b\u51fa\u3066\u304d\u305f\u9806\u306b\u632f\u308b\r\n  \/\/  \u30fb\u5b9a\u7fa9\u306e 2 \u884c\u76ee\u4ee5\u964d\u306f\u3001\u884c\u982d\u3092\u5b57\u4e0b\u3052\uff08\u30b9\u30da\u30fc\u30b9 2 \u500b\u4ee5\u4e0a\u307e\u305f\u306f\u30bf\u30d6\uff09\u3057\u3066\u66f8\u304f\r\n  \/\/  \u30fb\u30b3\u30fc\u30c9\u306f\u5148\u306b\u9000\u907f\u6e08\u307f\u306a\u306e\u3067\u3001\u30b3\u30fc\u30c9\u5185\u306e [^1] \u306f\u5bfe\u8c61\u306b\u306a\u3089\u306a\u3044\r\n  \/\/ ----------------------------------------------------------------------------\r\n  function footnoteEscapeAttr(s) {\r\n    return String(s).split('&').join('&amp;').split('\"').join('&quot;')\r\n      .split('<').join('&lt;').split('>').join('&gt;');\r\n  }\r\n\r\n  function protectFootnotes(text) {\r\n    const store = { notes: [], refs: [] };\r\n    \/\/ [^\u30e9\u30d9\u30eb]: \u5185\u5bb9\uff08\u30e9\u30d9\u30eb\u306f\u7a7a\u767d\u3068 ] \u4ee5\u5916\uff09\r\n    const defRe = new RegExp('^' + BS + OB + BS + '^([^' + BS + CB + BS + 's]+)' + BS + CB + ':(?:[ ' + TAB + ']+(.*))?$');\r\n    const indentRe = new RegExp('^(?:' + TAB + '|  )');\r\n    const indentStripRe = new RegExp('^(?:' + TAB + '| {1,4})');\r\n\r\n    const lines = text.split(NL);\r\n    const out = [];\r\n    const defs = {};\r\n    const defOrder = [];\r\n\r\n    for (let i = 0; i < lines.length; i++) {\r\n      const m = lines[i].match(defRe);\r\n      if (!m) {\r\n        out.push(lines[i]);\r\n        continue;\r\n      }\r\n      const label = m[1];\r\n      const body = [m[2] || ''];\r\n      \/\/ \u5b57\u4e0b\u3052\u3055\u308c\u305f\u7d9a\u304d\u306e\u884c\uff08\u9593\u306e\u7a7a\u884c\u3082\u542b\u3080\uff09\u3092\u3001\u540c\u3058\u5b9a\u7fa9\u3068\u3057\u3066\u53d6\u308a\u8fbc\u3080\r\n      let j = i + 1;\r\n      while (j < lines.length) {\r\n        if (indentRe.test(lines[j])) {\r\n          body.push(lines[j].replace(indentStripRe, ''));\r\n          j++;\r\n        } else if (lines[j].trim() === '' && j + 1 < lines.length && indentRe.test(lines[j + 1])) {\r\n          body.push('');\r\n          j++;\r\n        } else {\r\n          break;\r\n        }\r\n      }\r\n      if (!Object.prototype.hasOwnProperty.call(defs, label)) {\r\n        defs[label] = body.join(NL);\r\n        defOrder.push(label);\r\n      }\r\n      i = j - 1;\r\n    }\r\n\r\n    \/\/ \u672c\u6587\u306e [^\u30e9\u30d9\u30eb]\uff08\u5b9a\u7fa9\u304c\u3042\u308b\u3082\u306e\u3060\u3051\uff09\u3092\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u306b\u7f6e\u304d\u63db\u3048\u308b\r\n    const refRe = new RegExp(BS + OB + BS + '^([^' + BS + CB + BS + 's]+)' + BS + CB, 'g');\r\n    const numbers = {};\r\n    const counts = {};\r\n    let result = out.join(NL).replace(refRe, function (match, label) {\r\n      if (!Object.prototype.hasOwnProperty.call(defs, label)) return match;\r\n      if (!numbers[label]) {\r\n        numbers[label] = store.notes.length + 1;\r\n        store.notes.push({ label: label, content: defs[label], refCount: 0 });\r\n      }\r\n      counts[label] = (counts[label] || 0) + 1;\r\n      const note = store.notes[numbers[label] - 1];\r\n      note.refCount = counts[label];\r\n      const idx = store.refs.length;\r\n      store.refs.push({ label: label, number: numbers[label], n: counts[label] });\r\n      return 'XFNREFX' + idx + 'XFNREFX';\r\n    });\r\n\r\n    \/\/ \u672c\u6587\u304b\u3089\u53c2\u7167\u3055\u308c\u3066\u3044\u306a\u3044\u5b9a\u7fa9\u3082\u3001\u5185\u5bb9\u304c\u6d88\u3048\u306a\u3044\u3088\u3046\u306b\u672b\u5c3e\u306b\u6b8b\u3059\r\n    defOrder.forEach(function (label) {\r\n      if (!numbers[label]) {\r\n        numbers[label] = store.notes.length + 1;\r\n        store.notes.push({ label: label, content: defs[label], refCount: 0 });\r\n      }\r\n    });\r\n\r\n    return { text: result, store: store };\r\n  }\r\n\r\n  function restoreFootnotes(text, store) {\r\n    if (!store || store.notes.length === 0) return text;\r\n\r\n    const refId = function (label, n) {\r\n      return 'fnref-' + label + (n > 1 ? '-' + n : '');\r\n    };\r\n\r\n    \/\/ \u53c2\u7167\r\n    store.refs.forEach(function (r, idx) {\r\n      const html = '<sup><a href=\"#fn-' + footnoteEscapeAttr(r.label) + '\" id=\"' +\r\n        footnoteEscapeAttr(refId(r.label, r.n)) + '\">' + r.number + '<\/a><\/sup>';\r\n      text = text.split('XFNREFX' + idx + 'XFNREFX').join(html);\r\n    });\r\n\r\n    \/\/ \u5b9a\u7fa9\uff08\u6587\u66f8\u306e\u672b\u5c3e\u306b\u307e\u3068\u3081\u308b\uff09\r\n    const items = store.notes.map(function (note) {\r\n      let body = convertMd2Html(note.content).trim();\r\n      const backrefs = [];\r\n      for (let n = 1; n <= note.refCount; n++) {\r\n        backrefs.push('<a href=\"#' + footnoteEscapeAttr(refId(note.label, n)) + '\">\u21a9<\/a>');\r\n      }\r\n      if (backrefs.length > 0) {\r\n        const back = ' ' + backrefs.join(' ');\r\n        const lastP = body.lastIndexOf('<\/p>');\r\n        body = (lastP !== -1) ? body.slice(0, lastP) + back + body.slice(lastP) : body + back;\r\n      }\r\n      return '<li id=\"fn-' + footnoteEscapeAttr(note.label) + '\">' + NL + body + NL + '<\/li>';\r\n    });\r\n\r\n    return text.replace(new RegExp('(?:' + NL + ')*$'), '') + NL + NL +\r\n      '<section class=\"footnotes\">' + NL + '<ol>' + NL + items.join(NL) + NL + '<\/ol>' + NL + '<\/section>' + NL;\r\n  }\r\n\r\n  \/\/ \u30c7\u30b3\u30fc\u30c9\u7528\uff1aid\u30fbhref\uff08fn-1\u3001fnref-1-2\u3001user-content-fn-1 \u306a\u3069\uff09\u304b\u3089\u30e9\u30d9\u30eb\u3092\u53d6\u308a\u51fa\u3059\r\n  function footnoteLabelFrom(id) {\r\n    let s = String(id || '');\r\n    if (s.charAt(0) === '#') s = s.slice(1);\r\n    if (s.indexOf('user-content-') === 0) s = s.slice('user-content-'.length);\r\n    if (s.indexOf('fnref-') === 0) s = s.slice(6);\r\n    else if (s.indexOf('fn-') === 0) s = s.slice(3);\r\n    try { s = decodeURIComponent(s); } catch (e) { \/* \u305d\u306e\u307e\u307e *\/ }\r\n    return s;\r\n  }\r\n\r\n\r\n  function protectShortcodes(text, store) {\r\n    const re = new RegExp(BS + OB + '(?:' + SHORTCODE_NAMES.join('|') + ')' + BS + 'b[^' + BS + CB + NL + ']*' + BS + CB, 'g');\r\n    return text.replace(re, function (match) {\r\n      const idx = store.length;\r\n      store.push(match);   \/\/ \u539f\u6587\u3092\u305d\u306e\u307e\u307e\u4fdd\u7ba1\r\n      return 'XSCPX' + idx + 'XSCPX';\r\n    });\r\n  }\r\n\r\n  \/\/ --- \u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u5fa9\u5143\uff08\u539f\u6587\u306e\u307e\u307e\u3002\u30a8\u30b9\u30b1\u30fc\u30d7\u30fb\u81ea\u52d5\u30ea\u30f3\u30af\u4e00\u5207\u306a\u3057\uff09---\r\n  function restoreShortcodes(text, store) {\r\n    for (let i = store.length - 1; i >= 0; i--) {\r\n      text = text.split('XSCPX' + i + 'XSCPX').join(store[i]);\r\n    }\r\n    return text;\r\n  }\r\n\r\n\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  <img \/> \u3092 \u2192 <picture> \u3067\u56f2\u3080\r\n  \/\/ ----------------------------------------------------------------------------\r\n  function encloseTagImgPictures(text) {\r\n    try {\r\n      \/\/\u3059\u3067\u306bpicture\u30bf\u30b0\u3067\u56f2\u307e\u308c\u3066\u3044\u308bimg\u30bf\u30b0\u3092\u4e00\u6642\u7684\u306b\u30de\u30fc\u30af\r\n      let markedText = text;\r\n      let markerIndex = 0;\r\n      const markers = {};\r\n\r\n      \/\/picture\u30bf\u30b0\u3067\u56f2\u307e\u308c\u3066\u3044\u308bimg\u30bf\u30b0\u3092\u4e00\u6642\u7684\u306b\u7f6e\u63db\r\n      markedText = markedText.replace(\/<picture[^>]*>[\\s\\S]*?<img[^>]*>[\\s\\S]*?<\\\/picture>\/gi, function (match) {\r\n        const marker = `___PICTURE_MARKER_${markerIndex}___`;\r\n        markers[marker] = match;\r\n        markerIndex++;\r\n        return marker;\r\n      });\r\n\r\n      \/\/picture\u30bf\u30b0\u3067\u56f2\u307e\u308c\u3066\u3044\u306a\u3044img\u30bf\u30b0\u3092picture\u30bf\u30b0\u3067\u56f2\u3080\r\n      markedText = markedText.replace(\/<img([^>]*)>\/gi, function (match, attributes) {\r\n        \/\/\u81ea\u5df1\u9589\u3058\u30bf\u30b0\u306e\u5834\u5408\u306e\u51e6\u7406\r\n        if (attributes.endsWith('\/')) {\r\n          \/\/\u6700\u5f8c\u306e\/\u3092\u524a\u9664\u3057\u3066\u304b\u3089\u51e6\u7406\r\n          const cleanAttrs = attributes.slice(0, -1).trim();\r\n          return `<picture><img${cleanAttrs ? ' ' + cleanAttrs : ''} \/><\/picture>`;\r\n        } else {\r\n          return `<picture><img${attributes}><\/picture>`;\r\n        }\r\n      });\r\n\r\n      \/\/\u30de\u30fc\u30ab\u30fc\u3092\u5143\u306epicture\u30bf\u30b0\u306b\u623b\u3059\r\n      Object.keys(markers).forEach(marker => {\r\n        markedText = markedText.replace(marker, function () { return markers[marker]; });\r\n      });\r\n\r\n      return markedText;\r\n    } catch (error) {\r\n      console.error('img\u2192picture\u5909\u63db\u30a8\u30e9\u30fc:', error);\r\n      showMessage('img\u30bf\u30b0\u306epicture\u56f2\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002', false);\r\n      return text;\r\n    }\r\n  }\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  list-style-type\u306e\u5909\u63db\r\n  \/\/ ----------------------------------------------------------------------------\r\n  function convertListStyles(text) {\r\n    const convertUList = document.getElementById('convertUListStyles').checked;\r\n    const convertOList = document.getElementById('convertOListStyles').checked;\r\n    const uListStyle = document.querySelector('#convertUListStyles + select').value;\r\n    const oListStyle = document.querySelector('#convertOListStyles + select').value;\r\n\r\n    if (convertUList) {\r\n      \/\/<ul>\u30bf\u30b0\u306e\u51e6\u7406\r\n      text = text.replace(\/<ul((?:[^>](?!style))*?)>\/gi, `<ul$1 style=\"list-style-type:${uListStyle};\">`);\r\n      text = text.replace(\/<ul([^>]*?)style=\"([^\"]*?)\"\/gi, function (match, p1, p2) {\r\n        if (p2.includes('list-style-type')) {\r\n          return `<ul${p1}style=\"${p2.replace(\/list-style-type:[^;]+;?\/, `list-style-type:${uListStyle};`)}\"`;\r\n        } else {\r\n          return `<ul${p1}style=\"${p2}list-style-type:${uListStyle};\"`;\r\n        }\r\n      });\r\n    }\r\n\r\n    if (convertOList) {\r\n      \/\/<ol>\u30bf\u30b0\u306e\u51e6\u7406\uff08<ul>\u3068\u540c\u69d8\uff09\r\n      text = text.replace(\/<ol((?:[^>](?!style))*?)>\/gi, `<ol$1 style=\"list-style-type:${oListStyle};\">`);\r\n      text = text.replace(\/<ol([^>]*?)style=\"([^\"]*?)\"\/gi, function (match, p1, p2) {\r\n        if (p2.includes('list-style-type')) {\r\n          return `<ol${p1}style=\"${p2.replace(\/list-style-type:[^;]+;?\/, `list-style-type:${oListStyle};`)}\"`;\r\n        } else {\r\n          return `<ol${p1}style=\"${p2}list-style-type:${oListStyle};\"`;\r\n        }\r\n      });\r\n    }\r\n\r\n    return text;\r\n  }\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/ \u6307\u5b9a\u306e\u30bf\u30b0\u3092 \u2192 \u4efb\u610f\u306e\u30bf\u30b0 \u306b\u5909\u63db\r\n  \/\/ ----------------------------------------------------------------------------\r\n  function processAllTagUpdates(text) {\r\n    try {\r\n      \/\/\u51e6\u7406\u5bfe\u8c61\u306e\u5404\u30a4\u30f3\u30d7\u30c3\u30c8\u8981\u7d20\u306e\u30bb\u30c3\u30c8\r\n      const updateSets = [\r\n        { targetId: 'targetUpdateTag1', afterId: 'afterUpdateTag1', checkboxId: 'convertUpdateTag1s' },\r\n        { targetId: 'targetUpdateTag2', afterId: 'afterUpdateTag2', checkboxId: 'convertUpdateTag2s' },\r\n        { targetId: 'targetUpdateTag3', afterId: 'afterUpdateTag3', checkboxId: 'convertUpdateTag3s' },\r\n        { targetId: 'targetUpdateTag4', afterId: 'afterUpdateTag4', checkboxId: 'convertUpdateTag4s' },\r\n        { targetId: 'targetUpdateTag5', afterId: 'afterUpdateTag5', checkboxId: 'convertUpdateTag5s' }\r\n      ];\r\n\r\n      \/\/\u5404\u30bb\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u51e6\u7406\u3092\u5b9f\u884c\r\n      for (const set of updateSets) {\r\n        \/\/\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u304c\u30c1\u30a7\u30c3\u30af\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\r\n        if (document.getElementById(set.checkboxId).checked) {\r\n          const targetTag = document.getElementById(set.targetId).value.trim();\r\n          const afterTag = document.getElementById(set.afterId).value.trim();\r\n\r\n          \/\/\u7a7a\u306e\u5165\u529b\u30c1\u30a7\u30c3\u30af\r\n          if (!targetTag || !afterTag) {\r\n            console.warn(`${set.targetId}\u307e\u305f\u306f${set.afterId}\u304c\u7a7a\u3067\u3059`);\r\n            continue; \/\/\u3053\u306e\u51e6\u7406\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u6b21\u3078\r\n          }\r\n\r\n          \/\/\u30bf\u30b0\u540d\u3068\u5c5e\u6027\u3092\u62bd\u51fa\r\n          const targetMatch = targetTag.match(\/^<([^\\s>]+)([^>]*)>\/);\r\n          const afterMatch = afterTag.match(\/^<([^\\s>]+)([^>]*)>\/);\r\n\r\n          if (!targetMatch || !afterMatch) {\r\n            console.warn(`${set.targetId}\u307e\u305f\u306f${set.afterId}\u306e\u30bf\u30b0\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093`);\r\n            continue;\r\n          }\r\n\r\n          const [fullTargetTag, targetTagName, targetAttrs] = targetMatch;\r\n          const [fullAfterTag, afterTagName, afterAttrs] = afterMatch;\r\n\r\n          \/\/\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3067\u30bf\u30b0\u3092\u30a8\u30b9\u30b1\u30fc\u30d7\r\n          const escapedTargetTag = escapeRegExp(fullTargetTag);\r\n\r\n          \/\/\u958b\u59cb\u30bf\u30b0\u3068\u7d42\u4e86\u30bf\u30b0\u306e\u7f6e\u63db\u3092\u76f4\u63a5\u884c\u3046\uff08\u30de\u30fc\u30ab\u30fc\u3092\u4f7f\u308f\u306a\u3044\uff09\r\n          const openRegex = new RegExp(escapedTargetTag, 'g');\r\n          const closeRegex = new RegExp(`<\/${targetTagName}>`, 'g');\r\n\r\n          \/\/\u958b\u59cb\u30bf\u30b0\u3092\u7f6e\u63db\r\n          text = text.replace(openRegex, function () { return fullAfterTag; });\r\n\r\n          \/\/\u7d42\u4e86\u30bf\u30b0\u3092\u7f6e\u63db\r\n          text = text.replace(closeRegex, `<\/${afterTagName}>`);\r\n        }\r\n      }\r\n\r\n      return text;\r\n    } catch (error) {\r\n      console.error('\u30bf\u30b0\u66f4\u65b0\u30a8\u30e9\u30fc:', error);\r\n      showMessage('\u30bf\u30b0\u306e\u66f4\u65b0\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002', false);\r\n      return text;\r\n    }\r\n  }\r\n\r\n  \/\/\u6b63\u898f\u8868\u73fe\u306e\u30a8\u30b9\u30b1\u30fc\u30d7\u7528\u30d8\u30eb\u30d1\u30fc\u95a2\u6570\r\n  function escapeRegExp(string) {\r\n    return string.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&');\r\n  }\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/ \u6307\u5b9a\u306e\u30bf\u30b0\u306b\u3001\u4efb\u610f\u306e\u30af\u30e9\u30b9\u3092\u8ffd\u52a0\r\n  \/\/ ----------------------------------------------------------------------------\r\n  function processAllTagClasses(text) {\r\n    try {\r\n      \/\/\u51e6\u7406\u5bfe\u8c61\u306e\u5404\u30a4\u30f3\u30d7\u30c3\u30c8\u8981\u7d20\u306e\u30bb\u30c3\u30c8\r\n      const inputSets = [\r\n        { tagId: 'targetAddClase1', classId: 'afterAddClase1', checkboxId: 'convertAddClase1s' },\r\n        { tagId: 'targetAddClase2', classId: 'afterAddClase2', checkboxId: 'convertAddClase2s' },\r\n        { tagId: 'targetAddClase3', classId: 'afterAddClase3', checkboxId: 'convertAddClase3s' },\r\n        { tagId: 'targetAddClase4', classId: 'afterAddClase4', checkboxId: 'convertAddClase4s' },\r\n        { tagId: 'targetAddClase5', classId: 'afterAddClase5', checkboxId: 'convertAddClase5s' },\r\n        { tagId: 'targetAddClase6', classId: 'afterAddClase6', checkboxId: 'convertAddClase6s' },\r\n        { tagId: 'targetAddClase7', classId: 'afterAddClase7', checkboxId: 'convertAddClase7s' },\r\n        { tagId: 'targetAddClase8', classId: 'afterAddClase8', checkboxId: 'convertAddClase8s' },\r\n        { tagId: 'targetAddClase9', classId: 'afterAddClase9', checkboxId: 'convertAddClase9s' },\r\n        { tagId: 'targetAddClase10', classId: 'afterAddClase10', checkboxId: 'convertAddClase10s' },\r\n        { tagId: 'targetAddClase11', classId: 'afterAddClase11', checkboxId: 'convertAddClase11s' },\r\n        { tagId: 'targetAddClase12', classId: 'afterAddClase12', checkboxId: 'convertAddClase12s' },\r\n        { tagId: 'targetAddClase13', classId: 'afterAddClase13', checkboxId: 'convertAddClase13s' },\r\n        { tagId: 'targetAddClase14', classId: 'afterAddClase14', checkboxId: 'convertAddClase14s' },\r\n        { tagId: 'targetAddClase15', classId: 'afterAddClase15', checkboxId: 'convertAddClase15s' },\r\n        { tagId: 'targetAddClase16', classId: 'afterAddClase16', checkboxId: 'convertAddClase16s' },\r\n        { tagId: 'targetAddClase17', classId: 'afterAddClase17', checkboxId: 'convertAddClase17s' },\r\n        { tagId: 'targetAddClase18', classId: 'afterAddClase18', checkboxId: 'convertAddClase18s' },\r\n        { tagId: 'targetAddClase19', classId: 'afterAddClase19', checkboxId: 'convertAddClase19s' },\r\n        { tagId: 'targetAddClase20', classId: 'afterAddClase20', checkboxId: 'convertAddClase20s' },\r\n        { tagId: 'targetAddClase21', classId: 'afterAddClase21', checkboxId: 'convertAddClase21s' },\r\n        { tagId: 'targetAddClase22', classId: 'afterAddClase22', checkboxId: 'convertAddClase22s' },\r\n        { tagId: 'targetAddClase23', classId: 'afterAddClase23', checkboxId: 'convertAddClase23s' }\r\n      ];\r\n      \/\/\u5404\u30bb\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u51e6\u7406\u3092\u5b9f\u884c\r\n      for (const set of inputSets) {\r\n        \/\/\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u304c\u30c1\u30a7\u30c3\u30af\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\r\n        if (document.getElementById(set.checkboxId).checked) {\r\n          const targetTag = document.getElementById(set.tagId).value.trim();\r\n          const addClass = document.getElementById(set.classId).value.trim();\r\n\r\n          \/\/\u7a7a\u306e\u5165\u529b\u30c1\u30a7\u30c3\u30af\r\n          if (!targetTag || !addClass) {\r\n            console.warn(`${set.tagId}\u307e\u305f\u306f${set.classId}\u304c\u7a7a\u3067\u3059`);\r\n            continue; \/\/\u3053\u306e\u51e6\u7406\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u6b21\u3078\r\n          }\r\n\r\n          \/\/\u30bf\u30b0\u540d\u306f\u30b3\u30f3\u30de\u533a\u5207\u308a\u3067\u8907\u6570\u6307\u5b9a\u3067\u304d\u308b\uff08\u4f8b\uff1ablockquote, details\uff09\r\n          const tagNames = targetTag.split(',').map(function (t) { return t.trim(); }).filter(Boolean);\r\n          \/\/\u8ffd\u52a0\u3059\u308b\u30af\u30e9\u30b9\u3082\u3001\u7a7a\u767d\u533a\u5207\u308a\u3067 1 \u3064\u305a\u3064\u6271\u3046\uff08\u65e2\u306b\u3042\u308b\u30af\u30e9\u30b9\u306f\u91cd\u8907\u3055\u305b\u306a\u3044\uff09\r\n          const addClasses = addClass.split(' ').filter(Boolean);\r\n\r\n          tagNames.forEach(function (tagName) {\r\n            \/\/\u30bf\u30b0\u306f <\u30bf\u30b0\u540d> \u307e\u305f\u306f <\u30bf\u30b0\u540d \u5c5e\u6027...> \u306e\u5f62\u5f0f\u306b\u30de\u30c3\u30c1\u3059\u308b\r\n            const regex = new RegExp('<' + tagName + '(>|' + BS + 's' + OB + '^>' + CB + '*>)', 'g');\r\n\r\n            text = text.replace(regex, function (match) {\r\n              \/\/\u9589\u3058\u62ec\u5f27\u306e\u76f4\u524d\u306e\u4f4d\u7f6e\u3092\u898b\u3064\u3051\u308b\r\n              const closeBracketPos = match.lastIndexOf('>');\r\n              const beforeCloseBracket = match.substring(0, closeBracketPos);\r\n\r\n              if (beforeCloseBracket.includes('class=\"')) {\r\n                \/\/\u65e2\u5b58\u306e class \u5c5e\u6027\u304c\u3042\u308b\u5834\u5408\uff1a\u306a\u3044\u30af\u30e9\u30b9\u3060\u3051\u3092\u8ffd\u52a0\r\n                return match.replace(new RegExp('class=\"(' + OB + '^\"' + CB + '*)\"'), function (m, existingClasses) {\r\n                  const classArray = existingClasses.split(' ').filter(Boolean);\r\n                  const missing = addClasses.filter(function (c) { return !classArray.includes(c); });\r\n                  if (missing.length === 0) return m;\r\n                  return 'class=\"' + classArray.concat(missing).join(' ') + '\"';\r\n                });\r\n              }\r\n              \/\/class \u5c5e\u6027\u304c\u306a\u3044\u5834\u5408\u3001\u9589\u3058\u62ec\u5f27\u306e\u76f4\u524d\u306b class \u5c5e\u6027\u3092\u8ffd\u52a0\r\n              return beforeCloseBracket + ' class=\"' + addClasses.join(' ') + '\">';\r\n            });\r\n          });\r\n        }\r\n      }\r\n\r\n      return text;\r\n    } catch (error) {\r\n      console.error('\u30af\u30e9\u30b9\u8ffd\u52a0\u30a8\u30e9\u30fc:', error);\r\n      showMessage('\u30af\u30e9\u30b9\u8ffd\u52a0\u51e6\u7406\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002', false);\r\n      return text;\r\n    }\r\n  }\r\n\r\n\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  Markdown\u5909\u63db\u4ee5\u5916\uff1a\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/\u3059\u3079\u3066\u306e\u30bf\u30b0\u3092\u9664\u53bb\r\n  function removeTags(text) {\r\n    text = text.replace(\/<style\\b[^<]*(?:(?!<\\\/style>)<[^<]*)*<\\\/style>\/gi, '');  \/\/<style> \u30bf\u30b0\u3068\u305d\u306e\u5185\u5bb9\u3092\u524a\u9664\r\n    text = text.split('\\n').map(line => line.trim()).join('\\n');\r\n    text = text.replace(\/<[^>]*>\/g, '');\r\n    text = text.trim(); \/\/\u6700\u5f8c\u306b\u5148\u982d\u3068\u672b\u5c3e\u306e\u7a7a\u767d\u3092\u524a\u9664\r\n    return text;\r\n  }\r\n\r\n  \/\/\u5168\u3066\u306e\u6539\u884c\u3092\u524a\u9664\r\n  function removeLineBreaks(text) { return text.replace(\/\\n\/g, ''); }\r\n\r\n  \/\/\u5358\u4e00\u6539\u884c\u3092\u524a\u9664\u3001\u9023\u7d9a\u6539\u884c\u306f\uff11\u3064\u6e1b\u3089\u3059\r\n  function adjustLineBreaks(text) {\r\n    text = text.replace(\/\\n\\n\\n\\n\/g, '<QuadrupleNewLine>');\r\n    text = text.replace(\/\\n\\n\\n\/g, '<TripleNewLine>');\r\n    text = text.replace(\/\\n\\n\/g, '<DoubleNewLine>');\r\n    text = text.replace(\/\\n\/g, '');\r\n    text = text.replace(\/<QuadrupleNewLine>\/g, '\\n\\n\\n');\r\n    text = text.replace(\/<TripleNewLine>\/g, '\\n\\n');\r\n    text = text.replace(\/<DoubleNewLine>\/g, '\\n');\r\n    return text;\r\n  }\r\n\r\n  \/\/\u6539\u884c\u3092 \u2192 <br> \u306b\u5909\u63db\r\n  function convertTagBreaks(text) { return text.replace(\/\\n\/g, '<br>\\n'); }\r\n\r\n  \/\/N\u500b\u4ee5\u4e0a\u306e\u9023\u7d9a\u3059\u308b\u30b9\u30da\u30fc\u30b9\uff08\\s{X,}\uff09\u3092\u3001\u30bf\u30d6\uff08\\t\uff09 \u306b\u5909\u63db\r\n  function convertNspacesTabs(text, count) {\r\n    const regex = new RegExp(`\\\\s{${count},}`, 'g');\r\n    return text.replace(regex, '\\t');\r\n  }\r\n\r\n  \/\/n+1\u756a\u76ee\u306e\u6539\u884c\u3092\u30bf\u30d6\u306b\u5909\u63db\r\n  function convertNthBreak2Tabs(text) {\r\n    const pattern = document.getElementById('nthBreakCount').value.trim();\r\n\r\n    \/\/\u30d1\u30bf\u30fc\u30f3\u306e\u89e3\u6790\r\n    let nth = 2; \/\/\u30c7\u30d5\u30a9\u30eb\u30c8\u306f2\u756a\u76ee\uff08\u5076\u6570\u756a\u76ee\uff09\r\n\r\n    if (pattern === 'n+1' || pattern === 'odd') {\r\n      \/\/\u5947\u6570\u756a\u76ee\uff081, 3, 5...\uff09\u306e\u6539\u884c\r\n      nth = 'odd';\r\n    } else if (pattern === 'n' || pattern === 'even') {\r\n      \/\/\u5076\u6570\u756a\u76ee\uff082, 4, 6...\uff09\u306e\u6539\u884c\r\n      nth = 'even';\r\n    } else if (pattern.match(\/^\\d+$\/)) {\r\n      \/\/\u7279\u5b9a\u306e\u756a\u53f7\u6307\u5b9a\uff082, 3, 4...\uff09\r\n      nth = parseInt(pattern);\r\n    }\r\n\r\n    \/\/\u884c\u3054\u3068\u306b\u5206\u5272\r\n    const lines = text.split('\\n');\r\n\r\n    if (nth === 'odd') {\r\n      \/\/\u5947\u6570\u756a\u76ee\u306e\u6539\u884c\u3092\u30bf\u30d6\u306b\u5909\u63db\uff082\u884c\u305a\u3064\u30da\u30a2\u306b\u3059\u308b\uff09\r\n      const result = [];\r\n      for (let i = 0; i < lines.length; i += 2) {\r\n        if (i + 1 < lines.length) {\r\n          result.push(lines[i] + '\\t' + lines[i + 1]);\r\n        } else {\r\n          result.push(lines[i]);\r\n        }\r\n      }\r\n      return result.join('\\n');\r\n    } else if (nth === 'even') {\r\n      \/\/\u5076\u6570\u756a\u76ee\u306e\u6539\u884c\u3092\u30bf\u30d6\u306b\u5909\u63db\r\n      const result = [];\r\n      for (let i = 0; i < lines.length; i++) {\r\n        if (i % 2 === 0 && i + 1 < lines.length) {\r\n          \/\/\u6b21\u306e\u884c\u3092\u8ffd\u52a0\u3057\u306a\u3044\uff08\u6b21\u306e\u30eb\u30fc\u30d7\u3067\u51e6\u7406\uff09\r\n          continue;\r\n        } else if (i % 2 === 1) {\r\n          \/\/\u524d\u306e\u884c\u3068\u30bf\u30d6\u3067\u7d50\u5408\r\n          result.push(lines[i - 1] + '\\t' + lines[i]);\r\n        } else {\r\n          \/\/\u6700\u5f8c\u306e\u884c\u304c\u5947\u6570\u756a\u76ee\u306e\u5834\u5408\r\n          result.push(lines[i]);\r\n        }\r\n      }\r\n      return result.join('\\n');\r\n    } else if (typeof nth === 'number' && nth > 0) {\r\n      \/\/\u7279\u5b9a\u756a\u53f7\u3054\u3068\u306e\u6539\u884c\u3092\u30bf\u30d6\u306b\u5909\u63db\r\n      const result = [];\r\n      let currentGroup = [];\r\n\r\n      for (let i = 0; i < lines.length; i++) {\r\n        currentGroup.push(lines[i]);\r\n\r\n        if (currentGroup.length === nth || i === lines.length - 1) {\r\n          result.push(currentGroup.join('\\t'));\r\n          currentGroup = [];\r\n        }\r\n      }\r\n      return result.join('\\n');\r\n    }\r\n\r\n    return text;\r\n  }\r\n\r\n  \/\/&\u3092 \u2192 &amp; \u306b\u5909\u63db\r\n  function convertEntityAmps(text) { return text.replace(\/&\/g, '&amp;'); }\r\n\r\n  \/\/\u6539\u884c\u3092 \u2192 &#13;&#10; \u306b\u5909\u63db\r\n  function convertEntityNewLines(text) { return text.replace(\/\\n\/g, '&#13;&#10;'); }\r\n\r\n  \/\/\u30bf\u30d6\uff08\\t\uff09\u3092 \u2192 &#9; \u306b\u5909\u63db\r\n  function convertEntityTabs(text) { return text.replace(\/\\t\/g, '&#9;'); }\r\n\r\n  \/\/< >\u3092 \u2192 &lt; &gt; \u306b\u5909\u63db\r\n  function convertEntityLtGts(text) { return text.replace(\/<\/g, '&lt;').replace(\/>\/g, '&gt;'); }\r\n\r\n  \/\/[ ]\u3092 \u2192 &lsqb; &rsqb; \u306b\u5909\u63db\r\n  function convertEntitySqbs(text) { return text.replace(\/\\[\/g, '&lsqb;').replace(\/\\]\/g, '&rsqb;'); }\r\n\r\n  \/\/( )\u3092 \u2192 &lpar; &rpar; \u306b\u5909\u63db\r\n  function convertEntityPars(text) { return text.replace(\/\\(\/g, '&lpar;').replace(\/\\)\/g, '&rpar;'); }\r\n\r\n  \/\/{ }\u3092 \u2192 &lcub; &rcub; \u306b\u5909\u63db\r\n  function convertEntityCubs(text) { return text.replace(\/\\{\/g, '&lcub;').replace(\/\\}\/g, '&rcub;'); }\r\n\r\n  \/\/\"\u3092 \u2192 &quot; \u306b\u5909\u63db\r\n  function convertEntityQuots(text) { return text.replace(\/\"\/g, '&quot;'); }\r\n\r\n  \/\/'\u3092 \u2192 &apos; \u306b\u5909\u63db\r\n  function convertEntityAposs(text) { return text.replace(\/'\/g, '&apos;'); }\r\n\r\n  \/\/`\u3092 \u2192 &grave; \u306b\u5909\u63db\r\n  function convertEntityGraves(text) { return text.replace(\/`\/g, '&grave;'); }\r\n\r\n  \/\/\u5168\u89d2\u6587\u5b57\uff08\\x01-\\x7E\uff09\u3092 \u2192 \u303c \u306b\u5909\u63db\uff08\u3000|\u3001|\u3002|\u8a18\u53f7 \u306f\u9664\u5916\uff09\r\n  function convertFullWidths(text) {\r\n    return text\r\n      .replace(\/\u3000\/g, '\u2b1a')  \/\/\u5168\u89d2\u30b9\u30da\u30fc\u30b9\u3092 \u2192 \u2b1a \u306b\u5909\u63db\r\n      .replace(\/[^(?!.*(\u3000|\uff3f|\u2b1a|\u303c|\u3001|\u3002|\u30fb|\u2025|\u2026|\uff5e|\u203b|\u3012|\u25cf|\u25ef|\u25cc|\u25ce|\u25c9|\u29bf|\u25a0|\u25a1|\u25a3|\u25c6|\u25c7|\u25c8|\u25b2|\u25b3|\u25bc|\u25bd|\u25c0|\u25c1|\u25b6|\u25b7|\u2606|\u2605)).\\x01-\\x7E]\/g, '\u303c');\r\n  }\r\n\r\n  \/\/\u82f1\u5927\u6587\u5b57\u3092 \u2192 \u2341 \u306b\u5909\u63db\r\n  function convertAlphaUppers(text) { return text.replace(\/[A-Z]\/g, '\u2341'); }\r\n\r\n  \/\/\u82f1\u5c0f\u6587\u5b57\u3092 \u2192 \u29c4 \u306b\u5909\u63db\r\n  function convertAlphaLowers(text) { return text.replace(\/[a-z]\/g, '\u29c4'); }\r\n\r\n  \/\/\u6570\u5b57\u3092 \u2192 \ud835\udf03 \u306b\u5909\u63db\r\n  function convertNumber0s(text) { return text.replace(\/[0-9]\/g, '\ud835\udf03'); }\r\n\r\n  \/\/\u6570\u5b57\u3092 \u2192 \u30e9\u30f3\u30c0\u30e0\u306a\u6570\u5b57 \u306b\u5909\u63db\uff080\u306f0\u306e\u307e\u307e\uff09\r\n  function convertNumberRandoms(text) { return text.replace(\/[1-9]\/g, () => Math.floor(Math.random() * 9) + 1); }\r\n\r\n  \/\/\u534a\u89d2\u62ec\u5f27()\u3092 \u2192 \u5168\u89d2\u62ec\u5f27\uff08\uff09 \u306b\u5909\u63db\r\n  function convertFullParenthesis(text) { return text.replace(\/\\(\/g, '\uff08').replace(\/\\)\/g, '\uff09'); }\r\n\r\n  \/\/\u5168\u89d2\u62ec\u5f27\uff08\uff09\u3092 \u2192 \u534a\u89d2\u62ec\u5f27() \u306b\u5909\u63db\r\n  function convertHalfParenthesis(text) { return text.replace(\/\uff08\/g, '(').replace(\/\uff09\/g, ')'); }\r\n\r\n\r\n  \/\/ ============================================================================\r\n  \/\/  \u5168\u89d2\u21d4\u534a\u89d2\uff08\u6570\u5b57\u30fb\u82f1\u5b57\uff09\r\n  \/\/   \u30fb\u534a\u89d2\u5316\uff08\u5168\u89d2\u2192\u534a\u89d2\uff09\uff1a\u5168\u89d2\u306e\u6570\u5b57\/\u82f1\u5b57\u3092\u3059\u3079\u3066\u534a\u89d2\u3078\r\n  \/\/   \u30fb\u5168\u89d2\u5316\uff08\u534a\u89d2\u2192\u5168\u89d2\uff09\uff1a\u300c\u5358\u72ec\u306e\u300d\u534a\u89d2\u6570\u5b57\/\u82f1\u5b57\u306e\u307f\u5168\u89d2\u3078\r\n  \/\/     \u5358\u72ec = \u524d\u5f8c\u306b\u534a\u89d2\u6587\u5b57\uff08\u4e0b\u8a18\u30bb\u30c3\u30c8\uff09\u304c\u96a3\u63a5\u3057\u306a\u30441\u6587\u5b57\u3002\r\n  \/\/     \u9023\u7d9a\u3059\u308b\u534a\u89d2\u82f1\u6570\u5b57\u8a18\u53f7\uff08iPhone 15 \/ H2O \/ v2 \/ URL \u7b49\uff09\u306f\u5bfe\u8c61\u5916\u3002\r\n  \/\/   \u203b protectCodeBlocks \u5f8c\u306b\u5b9f\u884c\u3059\u308b\u306e\u3067\u30b3\u30fc\u30c9\u306f\u4fdd\u8b77\u6e08\u307f\u3002\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\r\n  \/\/     \uff08XCBPX\u2026\uff09\u306f\u524d\u5f8c\u304cX\u3067\u56f2\u307e\u308c\u308b\u305f\u3081\u5358\u72ec\u5224\u5b9a\u306b\u639b\u304b\u3089\u305a\u7121\u50b7\u3002\r\n  \/\/ ============================================================================\r\n  \/\/ \u534a\u89d2\u6587\u5b57\u30af\u30e9\u30b9\uff1aASCII\u53ef\u8996\u6587\u5b57(0x21-0x7E) + \u00a5(0x00A5) + \u534a\u89d2\u30ab\u30ca(0xFF61-0xFF9F)\r\n  var HALF_CHAR = '[\\\\u0021-\\\\u007E\\\\u00A5\\\\uFF61-\\\\uFF9F]';\r\n  var RE_SOLO_NUM = new RegExp('(?<!' + HALF_CHAR + ')([0-9])(?!' + HALF_CHAR + ')', 'g');\r\n  var RE_SOLO_ALPHA = new RegExp('(?<!' + HALF_CHAR + ')([A-Za-z])(?!' + HALF_CHAR + ')', 'g');\r\n\r\n  \/\/\u5168\u89d2\u6570\u5b57\u3092 \u2192 \u534a\u89d2\u6570\u5b57\u306b\u5909\u63db\r\n  function convertHalfNumbers(text) {\r\n    return text.replace(\/[\uff10-\uff19]\/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - 0xFF10 + 0x30); });\r\n  }\r\n  \/\/\u5358\u72ec\u534a\u89d2\u6570\u5b57\u3092 \u2192 \u5168\u89d2\u6570\u5b57 \u306b\u5909\u63db\r\n  function convertFullNumbers(text) {\r\n    return text.replace(RE_SOLO_NUM, function (c) { return String.fromCharCode(c.charCodeAt(0) - 0x30 + 0xFF10); });\r\n  }\r\n  \/\/\u5168\u89d2\u82f1\u5b57\u3092 \u2192 \u534a\u89d2\u82f1\u5b57\u306b\u5909\u63db\r\n  function convertHalfAlphabets(text) {\r\n    return text\r\n      .replace(\/[\uff21-\uff3a]\/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - 0xFF21 + 0x41); })\r\n      .replace(\/[\uff41-\uff5a]\/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - 0xFF41 + 0x61); });\r\n  }\r\n  \/\/\u5358\u72ec\u534a\u89d2\u82f1\u5b57\u3092 \u2192 \u5168\u89d2\u82f1\u5b57 \u306b\u5909\u63db\r\n  function convertFullAlphabets(text) {\r\n    return text.replace(RE_SOLO_ALPHA, function (c) {\r\n      return c <= 'Z'\r\n        ? String.fromCharCode(c.charCodeAt(0) - 0x41 + 0xFF21)\r\n        : String.fromCharCode(c.charCodeAt(0) - 0x61 + 0xFF41);\r\n    });\r\n  }\r\n\r\n  \/\/Markdown\u5f62\u5f0f\u306e\u756a\u53f7\uff08*. \uff09\u3092 \u2192 \u4e0a\u304b\u3089\u9023\u756a\u3067\u4ed8\u3051\u76f4\u3059\r\n  function convertRenumbers(text) {\r\n    \/\/\u884c\u3054\u3068\u306b\u5206\u5272\r\n    let lines = text.split('\\n');\r\n    let firstNumber = null;  \/\/\u6700\u521d\u306b\u898b\u3064\u3051\u305f\u756a\u53f7\u3092\u4fdd\u5b58\r\n    let currentNumber = null;  \/\/\u73fe\u5728\u306e\u9023\u756a\r\n    let hasNumberedLine = false;  \/\/\u756a\u53f7\u4ed8\u304d\u306e\u884c\u304c\u5b58\u5728\u3059\u308b\u304b\r\n\r\n    \/\/\u6700\u521d\u306e\u6709\u52b9\u306a\u756a\u53f7\u3092\u898b\u3064\u3051\u308b\r\n    for (let line of lines) {\r\n      const match = line.match(\/^(\\d+)\\.\\s+\/);\r\n      if (match) {\r\n        firstNumber = parseInt(match[1]);\r\n        currentNumber = firstNumber;\r\n        hasNumberedLine = true;\r\n        break;\r\n      }\r\n    }\r\n\r\n    \/\/\u756a\u53f7\u4ed8\u304d\u306e\u884c\u304c\u5b58\u5728\u3057\u306a\u3044\u5834\u5408\u306f\u51e6\u7406\u3057\u306a\u3044\r\n    if (!hasNumberedLine) {\r\n      return text;\r\n    }\r\n\r\n    \/\/\u5404\u884c\u3092\u51e6\u7406\r\n    const processedLines = lines.map(line => {\r\n      \/\/Markdown\u5f62\u5f0f\u306e\u756a\u53f7\u4ed8\u304d\u30ea\u30b9\u30c8\u306b\u30de\u30c3\u30c1\u3059\u308b\u6b63\u898f\u8868\u73fe\r\n      const match = line.match(\/^(\\d+)\\.\\s+(.+)$\/);\r\n\r\n      if (match) {\r\n        \/\/\u756a\u53f7\u306e\u90e8\u5206\u3092\u73fe\u5728\u306e\u9023\u756a\u3067\u7f6e\u63db\r\n        \/\/\u5143\u306e\u6570\u5b57\u306e\u6841\u6570\u306b\u5fdc\u3058\u3066\u30b9\u30da\u30fc\u30b9\u306e\u6570\u3092\u8abf\u6574\r\n        const originalNumLength = match[1].length;\r\n        const newNumLength = currentNumber.toString().length;\r\n        const spaceDiff = originalNumLength - newNumLength;\r\n        const extraSpaces = spaceDiff > 0 ? ' '.repeat(spaceDiff) : '';\r\n\r\n        const newLine = `${currentNumber}.${extraSpaces} ${match[2]}`;\r\n        currentNumber++;\r\n        return newLine;\r\n      }\r\n      return line;\r\n    });\r\n\r\n    return processedLines.join('\\n');\r\n  }\r\n\r\n\r\n  \/\/JSON\u5f62\u5f0f\u3067\u8907\u6570\u306e\u8a9e\u53e5\u3092\u307e\u3068\u3081\u3066\u524a\u9664\r\n  function removeMultiWords(text) {\r\n    try {\r\n      \/\/\u5165\u529b\u5024\u3092\u53d6\u5f97\u3057\u3066\u6574\u5f62\r\n      let removeTxts = document.getElementById('removeTxts').value;\r\n\r\n      \/\/\u5165\u529b\u5024\u3092\u6574\u5f62\u3059\u308b\u95a2\u6570\r\n      function formatToJSON(input) {\r\n        \/\/\u65e2\u306bJSON\u5f62\u5f0f\u306e\u5834\u5408\u306f\u305d\u306e\u307e\u307e\u8fd4\u3059\r\n        try {\r\n          JSON.parse(input);\r\n          return input;\r\n        } catch {\r\n          \/\/[] \u3067\u56f2\u307e\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u306f\u8ffd\u52a0\r\n          if (!input.startsWith('[') && !input.endsWith(']')) {\r\n            input = '[' + input + ']';\r\n          }\r\n\r\n          \/\/\u30ab\u30f3\u30de\u533a\u5207\u308a\u306e\u5404\u8981\u7d20\u3092\u51e6\u7406\r\n          const words = input.slice(1, -1).split(',').map(word => {\r\n            \/\/\u30b9\u30da\u30fc\u30b9\u3092\u4fdd\u6301\u3057\u305f\u307e\u307e\u3001\u30c0\u30d6\u30eb\u30af\u30a9\u30fc\u30c8\u306e\u307f\u3092\u8ffd\u52a0\r\n            if (!word.startsWith('\"') && !word.endsWith('\"')) {\r\n              word = '\"' + word + '\"';\r\n            }\r\n            return word;\r\n          });\r\n\r\n          return '[' + words.join(',') + ']';\r\n        }\r\n      }\r\n\r\n      \/\/\u5165\u529b\u5024\u3092\u6574\u5f62\r\n      removeTxts = formatToJSON(removeTxts);\r\n\r\n      \/\/\u6574\u5f62\u3057\u305f\u5024\u3092\u5165\u529b\u6b04\u306b\u53cd\u6620\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\r\n      document.getElementById('removeTxts').value = removeTxts;\r\n\r\n      \/\/JSON\u3068\u3057\u3066\u30d1\u30fc\u30b9\r\n      const removeTxtsArray = JSON.parse(removeTxts);\r\n\r\n      \/\/\u5404\u8a9e\u53e5\u3092\u524a\u9664\r\n      removeTxtsArray.forEach(word => {\r\n        const escapedWord = word.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&');\r\n        const regex = new RegExp(escapedWord, 'g');\r\n        text = text.replace(regex, '');\r\n      });\r\n\r\n      return text;\r\n    } catch (error) {\r\n      console.error('\u524a\u9664\u30a8\u30e9\u30fc:', error);\r\n      showMessage('\u8a9e\u53e5\u306e\u6307\u5b9a\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002', false);\r\n      return text;\r\n    }\r\n  }\r\n\r\n  \/\/JSON\u5f62\u5f0f\u3067\u8907\u6570\u306e\u8a9e\u53e5\u3092\u307e\u3068\u3081\u3066\u5909\u63db\r\n  function convertMultiWords(text) {\r\n    try {\r\n      \/\/\u5165\u529b\u5024\u3092\u53d6\u5f97\u3057\u3066\u6574\u5f62\r\n      let beforeTxts = document.getElementById('beforeTxts').value;\r\n      let afterTxts = document.getElementById('afterTxts').value;\r\n\r\n      \/\/\u5165\u529b\u5024\u3092\u6574\u5f62\u3059\u308b\u95a2\u6570\r\n      function formatToJSON(input) {\r\n        \/\/\u65e2\u306bJSON\u5f62\u5f0f\u306e\u5834\u5408\u306f\u305d\u306e\u307e\u307e\u8fd4\u3059\r\n        try {\r\n          JSON.parse(input);\r\n          return input;\r\n        } catch {\r\n          \/\/[] \u3067\u56f2\u307e\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u306f\u8ffd\u52a0\r\n          if (!input.startsWith('[') && !input.endsWith(']')) {\r\n            input = '[' + input + ']';\r\n          }\r\n\r\n          \/\/\u30ab\u30f3\u30de\u533a\u5207\u308a\u306e\u5404\u8981\u7d20\u3092\u51e6\u7406\r\n          const words = input.slice(1, -1).split(',').map(word => {\r\n            \/\/\u30b9\u30da\u30fc\u30b9\u3092\u4fdd\u6301\u3057\u305f\u307e\u307e\u3001\u30c0\u30d6\u30eb\u30af\u30a9\u30fc\u30c8\u306e\u307f\u3092\u8ffd\u52a0\r\n            if (!word.startsWith('\"') && !word.endsWith('\"')) {\r\n              word = '\"' + word + '\"';\r\n            }\r\n            return word;\r\n          });\r\n\r\n          return '[' + words.join(',') + ']';\r\n        }\r\n      }\r\n\r\n      \/\/\u5165\u529b\u5024\u3092\u6574\u5f62\r\n      beforeTxts = formatToJSON(beforeTxts);\r\n      afterTxts = formatToJSON(afterTxts);\r\n\r\n      \/\/\u6574\u5f62\u3057\u305f\u5024\u3092\u5165\u529b\u6b04\u306b\u53cd\u6620\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\r\n      document.getElementById('beforeTxts').value = beforeTxts;\r\n      document.getElementById('afterTxts').value = afterTxts;\r\n\r\n      \/\/JSON\u3068\u3057\u3066\u30d1\u30fc\u30b9\r\n      const beforeTxtsArray = JSON.parse(beforeTxts);\r\n      const afterTxtsArray = JSON.parse(afterTxts);\r\n\r\n      \/\/\u4ee5\u964d\u306f\u65e2\u5b58\u306e\u30b3\u30fc\u30c9\r\n      if (beforeTxtsArray.length !== afterTxtsArray.length) {\r\n        throw new Error('\u5909\u63db\u524d\u3068\u5909\u63db\u5f8c\u306e\u8a9e\u53e5\u306e\u6570\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093');\r\n      }\r\n\r\n      beforeTxtsArray.forEach((beforeTxt, index) => {\r\n        const escapedFromWord = beforeTxt.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&');\r\n        const regex = new RegExp(escapedFromWord, 'g');\r\n        text = text.replace(regex, afterTxtsArray[index]);\r\n      });\r\n\r\n      return text;\r\n    } catch (error) {\r\n      console.error('\u5909\u63db\u30a8\u30e9\u30fc:', error);\r\n      showMessage('\u8a9e\u53e5\u306e\u6307\u5b9a\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002', false);\r\n      return text;\r\n    }\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  \u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u30b3\u30d4\u30fc \uff06 \u30e1\u30c3\u30bb\u30fc\u30b8\u8868\u793a\r\n  \/\/ ----------------------------------------------------------------------------\r\n  function copyToClipboard(text, isDecode = false) {\r\n    navigator.clipboard.writeText(text).then(function () {\r\n      showMessage(\"\u30c6\u30ad\u30b9\u30c8\u304c\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3055\u308c\u307e\u3057\u305f\uff01\", true,\r\n        isDecode ? 'decodedMessage' : 'encodedMessage');\r\n    }, function (err) {\r\n      showMessage(\"\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u3078\u306e\u30b3\u30d4\u30fc\u306b\u5931\u6557\u3057\u307e\u3057\u305f: \" + err, false,\r\n        isDecode ? 'decodedMessage' : 'encodedMessage');\r\n    });\r\n  }\r\n\r\n  \/\/\u30e1\u30c3\u30bb\u30fc\u30b8\u8868\u793a\r\n  function showMessage(msg, isSuccess, messageAreaId) {\r\n    const messageArea = document.getElementById(messageAreaId);\r\n    if (!messageArea) return;\r\n    const messageHTML = isSuccess ?\r\n      `<p class=\"alert is-ghosted is-primary mt-0.5r\">\r\n<i class=\"icon mas ma-check_circle c-primary mr-0.5r\"><\/i>\r\n<span>${msg}<\/span>\r\n<\/p>` :\r\n      `<p class=\"alert is-ghosted is-error mt-0.5r\">\r\n<i class=\"icon mas ma-error c-error mr-0.5r\"><\/i>\r\n<span>${msg}<\/span>\r\n<\/p>`;\r\n    messageArea.innerHTML = '';\r\n    messageArea.insertAdjacentHTML('beforeend', messageHTML);\r\n    setTimeout(() => { messageArea.innerHTML = ''; }, 3000);\r\n  }\r\n\r\n\r\n\r\n\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/  \u3059\u3079\u3066\u306e\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3092\u5916\u3059\uff0f\u30c7\u30d5\u30a9\u30eb\u30c8\u72b6\u614b\u306b\u623b\u3059\r\n  \/\/ ----------------------------------------------------------------------------\r\n  \/\/\u3059\u3079\u3066\u306e\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3092\u5916\u3059\r\n  function uncheckAllOptions() {\r\n    const checkboxes = document.querySelectorAll('input[type=\"checkbox\"]');\r\n    checkboxes.forEach(checkbox => {\r\n      checkbox.checked = false;\r\n    });\r\n    saveOptions();\r\n    showMessage('\u3059\u3079\u3066\u306e\u30c1\u30a7\u30c3\u30af\u304c\u5916\u308c\u307e\u3057\u305f', true, 'decodedMessage');\r\n  }\r\n\r\n\r\n  \/\/\u30c7\u30d5\u30a9\u30eb\u30c8\u72b6\u614b\u306b\u623b\u3059\uff08HTML \u306e defaultChecked \/ defaultSelected \u3092\u4f7f\u7528\uff09\r\n  function resetDefaultOptions() {\r\n    OPTION_SELECTORS.forEach(sel => {\r\n      document.querySelectorAll(sel).forEach(el => {\r\n        if (el.type === 'checkbox') {\r\n          el.checked = el.defaultChecked;\r\n        } else if (el.tagName === 'SELECT') {\r\n          el.value = el.querySelector('option[selected]')?.value ?? el.options[0]?.value;\r\n        } else if (el.id === 'decodeMathJaxCmd1') {\r\n          \/\/ \u751f\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u3092\u542b\u3080\u305f\u3081 defaultValue\uff08\u7a7a\uff09\u306b\u306f\u623b\u305b\u306a\u3044\u3002\r\n          el.value = BS + 'small';\r\n        } else if (el.id === 'decodeMathJaxCmd2') {\r\n          el.value = BS + 'bbox[yellow]';\r\n        } else {\r\n          el.value = el.defaultValue;\r\n        }\r\n      });\r\n    });\r\n    saveOptions();\r\n    showMessage('\u30c7\u30d5\u30a9\u30eb\u30c8\u8a2d\u5b9a\u306b\u623b\u3057\u307e\u3057\u305f', true, 'decodedMessage');\r\n  }\r\n\r\n\r\n\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u2605Excel\u30fb\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306e\u8cbc\u308a\u4ed8\u3051 \u2192 Markdown \u306e\u8868\u2605\r\n  \/\/   Excel \/ Google \u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8 \/ Numbers \u306a\u3069\u306e\u7bc4\u56f2\u3092\u30b3\u30d4\u30fc\u3057\u3066\u5de6\u306e\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u306b\r\n  \/\/   \u8cbc\u308a\u4ed8\u3051\u308b\u3068\u3001\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306e HTML\uff08\u7121\u3051\u308c\u3070\u30bf\u30d6\u533a\u5207\u308a\u306e\u30c6\u30ad\u30b9\u30c8\uff09\u304b\u3089\u3001\r\n  \/\/   \u3053\u306e\u30c4\u30fc\u30eb\u306e\u8868\u306e\u66f8\u304d\u65b9\uff08| \u30bb\u30eb | \u2026 |\uff09\u306b\u5909\u63db\u3057\u3066\u8cbc\u308a\u4ed8\u3051\u308b\u3002\r\n  \/\/   \u30fb\u7d50\u5408\u30bb\u30eb\uff1a\u6a2a\u306e\u7d50\u5408\u306f\u300c<\u300d\u3001\u7e26\u306e\u7d50\u5408\u306f\u300c^\u300d\uff08\u3053\u306e\u30c4\u30fc\u30eb\u306e\u30bb\u30eb\u7d50\u5408\u306e\u66f8\u304d\u65b9\uff09\r\n  \/\/   \u30fb\u30bb\u30eb\u5185\u306e\u6539\u884c\uff08Alt+Enter\uff09\u306f <br>\r\n  \/\/   \u30fb1 \u884c\u76ee\u3092\u898b\u51fa\u3057\u884c\u306b\u3059\u308b\u30aa\u30d7\u30b7\u30e7\u30f3\uff08\u30aa\u30f3\u306a\u3089 2 \u884c\u76ee\u306b |---| \u3092\u5165\u308c\u308b\uff09\r\n  \/\/   \u30fb\u30bb\u30eb\u306e\u80cc\u666f\u8272\u306f\u3001\u8cbc\u308a\u4ed8\u3051\u305f\u8868\u3054\u3068\u306b\u899a\u3048\u3066\u304a\u304d\u3001\u5909\u63db\u6642\u306b bgcolor \u5c5e\u6027\u3067\u4ed8\u3051\u308b\r\n  \/\/     \uff08\u30aa\u30d7\u30b7\u30e7\u30f3\u3002\u884c\u30fb\u5217\u306e\u6570\u304c\u540c\u3058\u8868\u306b\u3060\u3051\u4ed8\u304f\uff09\r\n  \/\/ ============================================================================\r\n  const CR = String.fromCharCode(13);\r\n  const LS_KEY_EXCEL_COLORS = 'excel2table_colors';\r\n  let excelPasteModels = [];\r\n\r\n  \/\/ CSS \u306e\u30c6\u30ad\u30b9\u30c8\u3092\u3001\u5358\u7d14\u306a\u30eb\u30fc\u30eb\u306e\u914d\u5217\u306b\u3059\u308b\uff08Excel \u306e\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306e <style> \u7528\uff09\r\n  function parseSimpleCssRules(cssText) {\r\n    let css = cssText.split('<!--').join(' ').split('-->').join(' ');\r\n    \/\/\u30b3\u30e1\u30f3\u30c8\uff08\/* *\/\uff09\u3092\u53d6\u308a\u9664\u304f\r\n    let out = '';\r\n    let pos = 0;\r\n    while (pos < css.length) {\r\n      const s = css.indexOf('\/*', pos);\r\n      if (s === -1) { out += css.slice(pos); break; }\r\n      out += css.slice(pos, s);\r\n      const e = css.indexOf('*\/', s + 2);\r\n      if (e === -1) break;\r\n      pos = e + 2;\r\n    }\r\n    css = out;\r\n\r\n    const rules = [];\r\n    pos = 0;\r\n    while (pos < css.length) {\r\n      const open = css.indexOf('{', pos);\r\n      if (open === -1) break;\r\n      const close = css.indexOf('}', open);\r\n      if (close === -1) break;\r\n      const selectorText = css.slice(pos, open).trim();\r\n      const body = css.slice(open + 1, close);\r\n      pos = close + 1;\r\n      if (selectorText.charAt(0) === '@') continue;  \/\/@page \u306a\u3069\r\n      const decls = parseCssDeclarations(body);\r\n      selectorText.split(',').forEach(function (sel) {\r\n        sel = sel.trim();\r\n        if (!sel) return;\r\n        let spec = 0;\r\n        sel.split('.').forEach(function (part, idx) { if (idx > 0 && part) spec += 10; else if (idx === 0 && part) spec += 1; });\r\n        rules.push({ sel: sel, spec: spec, order: rules.length, decls: decls });\r\n      });\r\n    }\r\n    rules.sort(function (a, b) { return (a.spec - b.spec) || (a.order - b.order); });\r\n    return rules;\r\n  }\r\n\r\n  function parseCssDeclarations(body) {\r\n    const decls = {};\r\n    String(body || '').split(';').forEach(function (d) {\r\n      const idx = d.indexOf(':');\r\n      if (idx === -1) return;\r\n      const prop = d.slice(0, idx).trim().toLowerCase();\r\n      const val = d.slice(idx + 1).trim();\r\n      if (prop) decls[prop] = val;\r\n    });\r\n    return decls;\r\n  }\r\n\r\n  \/\/ \u5358\u7d14\u306a\u30bb\u30ec\u30af\u30bf\u30fc\uff08td \/ .xl65 \/ td.xl65\uff09\u3060\u3051\u3092\u5224\u5b9a\u3059\u308b\uff08\u305d\u308c\u4ee5\u5916\u306f\u5bfe\u8c61\u5916\uff09\r\n  function matchSimpleSelector(el, sel) {\r\n    if (\/[ >+~:#]\/.test(sel) || sel.indexOf(OB) !== -1) return false;\r\n    const parts = sel.split('.');\r\n    const tag = parts[0].toLowerCase();\r\n    if (tag && tag !== '*' && tag !== el.tagName.toLowerCase()) return false;\r\n    for (let i = 1; i < parts.length; i++) {\r\n      if (!parts[i] || !el.classList.contains(parts[i])) return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  const NAMED_COLORS = {\r\n    white: '#FFFFFF', black: '#000000', red: '#FF0000', yellow: '#FFFF00', blue: '#0000FF', green: '#008000',\r\n    gray: '#808080', grey: '#808080', silver: '#C0C0C0', maroon: '#800000', navy: '#000080', purple: '#800080',\r\n    olive: '#808000', teal: '#008080', aqua: '#00FFFF', fuchsia: '#FF00FF', lime: '#00FF00', orange: '#FFA500'\r\n  };\r\n\r\n  \/\/ \u8272\u306e\u5024\uff08#rgb \/ #rrggbb \/ rgb() \/ \u8272\u540d\uff09\u3092\u53d6\u308a\u51fa\u3059\u3002\u7121\u3051\u308c\u3070 ''\r\n  function extractCssColor(value) {\r\n    const v = String(value || '').trim().toLowerCase();\r\n    if (!v) return '';\r\n    const hash = v.indexOf('#');\r\n    if (hash !== -1) {\r\n      let hex = '';\r\n      for (let i = hash + 1; i < v.length && hex.length < 6; i++) {\r\n        const ch = v.charAt(i);\r\n        if ('0123456789abcdef'.indexOf(ch) === -1) break;\r\n        hex += ch;\r\n      }\r\n      if (hex.length === 3) hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);\r\n      return hex.length === 6 ? '#' + hex.toUpperCase() : '';\r\n    }\r\n    const rgb = v.indexOf('rgb');\r\n    if (rgb !== -1) {\r\n      const open = v.indexOf('(', rgb);\r\n      const close = v.indexOf(')', open);\r\n      if (open === -1 || close === -1) return '';\r\n      const nums = v.slice(open + 1, close).split(new RegExp('[ ,\/]+')).filter(Boolean);\r\n      if (nums.length < 3) return '';\r\n      if (nums.length >= 4 && parseFloat(nums[3]) === 0) return '';  \/\/\u900f\u660e\r\n      return '#' + nums.slice(0, 3).map(function (n) {\r\n        const x = Math.max(0, Math.min(255, Math.round(parseFloat(n))));\r\n        return (x < 16 ? '0' : '') + x.toString(16).toUpperCase();\r\n      }).join('');\r\n    }\r\n    const word = v.split(' ')[0];\r\n    return Object.prototype.hasOwnProperty.call(NAMED_COLORS, word) ? NAMED_COLORS[word] : '';\r\n  }\r\n\r\n  \/\/ \u30bb\u30eb\u306e\u80cc\u666f\u8272\uff08bgcolor \u5c5e\u6027 \u2192 <style> \u306e\u30eb\u30fc\u30eb \u2192 style \u5c5e\u6027\u306e\u9806\u306b\u4e0a\u66f8\u304d\uff09\r\n  function cellBackgroundColor(cell, rules) {\r\n    let color = extractCssColor(cell.getAttribute('bgcolor'));\r\n    const fromDecls = function (decls) {\r\n      const c = extractCssColor(decls['background-color'] || decls['background'] || '');\r\n      if (c) color = c;\r\n      else if (\/^(none|transparent)\/.test(String(decls['background-color'] || decls['background'] || '').trim())) color = '';\r\n    };\r\n    rules.forEach(function (rule) {\r\n      if (('background-color' in rule.decls || 'background' in rule.decls) && matchSimpleSelector(cell, rule.sel)) fromDecls(rule.decls);\r\n    });\r\n    const inline = parseCssDeclarations(cell.getAttribute('style'));\r\n    if ('background-color' in inline || 'background' in inline) fromDecls(inline);\r\n    return color;\r\n  }\r\n\r\n  \/\/ \u30bb\u30eb\u306e\u6587\u5b57\uff08\u7a7a\u767d\u3092\u307e\u3068\u3081\u3001<br> \u306f\u30bb\u30eb\u5185\u306e\u6539\u884c\u3068\u3057\u3066\u6b8b\u3059\uff09\r\n  const EXCEL_BR_TOKEN = 'XXLBRX';\r\n  function excelCellText(cell) {\r\n    let raw = '';\r\n    (function walk(node) {\r\n      Array.prototype.forEach.call(node.childNodes, function (child) {\r\n        if (child.nodeType === 3) raw += child.nodeValue;\r\n        else if (child.nodeType === 1) {\r\n          const tag = child.tagName.toLowerCase();\r\n          if (tag === 'br') raw += EXCEL_BR_TOKEN;\r\n          else if (tag !== 'style' && tag !== 'script') walk(child);\r\n        }\r\n      });\r\n    })(cell);\r\n    const wsRe = new RegExp('[ ' + TAB + NL + CR + String.fromCharCode(160) + ']+', 'g');\r\n    return raw.split(EXCEL_BR_TOKEN).map(function (part) {\r\n      return escapeExcelCellText(part.replace(wsRe, ' ').trim());\r\n    }).join('<br>').trim();\r\n  }\r\n\r\n  \/\/ \u8868\u306e\u66f8\u304d\u65b9\u3068\u885d\u7a81\u3059\u308b\u6587\u5b57\u3092\u3001\u6587\u5b57\u53c2\u7167\u306b\u3059\u308b\uff08| < > \u3068\u3001\u30bb\u30eb\u7d50\u5408\u306e\u8a18\u53f7\u3060\u3051\u306e\u30bb\u30eb\uff09\r\n  function escapeExcelCellText(s) {\r\n    s = s.split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;').split('|').join('&#124;');\r\n    if (s === '^') s = '&#94;';\r\n    return s;\r\n  }\r\n\r\n  function isHiddenByStyle(el) {\r\n    const decls = parseCssDeclarations(el.getAttribute('style'));\r\n    return String(decls['display'] || '').trim().toLowerCase() === 'none';\r\n  }\r\n\r\n  \/\/ \u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306e HTML \u306e <table> \u2192 \u30b0\u30ea\u30c3\u30c9\uff08null \u306a\u3089\u8868\u3067\u306f\u306a\u3044\uff09\r\n  function excelHtmlToGrid(html) {\r\n    const doc = new DOMParser().parseFromString(html, 'text\/html');\r\n    const tables = doc.querySelectorAll('table');\r\n    if (tables.length !== 1) return null;\r\n    const table = tables[0];\r\n    if (table.querySelector('table')) return null;\r\n\r\n    \/\/\u8868\u306e\u5916\u306b\u6587\u7ae0\u304c\u3042\u308b\uff08Web \u30da\u30fc\u30b8\u306e\u4e00\u90e8\u3092\u30b3\u30d4\u30fc\u3057\u305f\uff09\u3068\u304d\u306f\u3001\u666e\u901a\u306e\u8cbc\u308a\u4ed8\u3051\u306b\u3059\u308b\r\n    \/\/\uff08<style> \u306f\u3001Google \u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306a\u3069\u3067\u306f\u672c\u6587\u306e\u4e2d\u306b\u3042\u308b\u306e\u3067\u3001\u5148\u306b\u6570\u3048\u3066\u304a\u3044\u3066\u9664\u304f\uff09\r\n    let cssText = '';\r\n    doc.querySelectorAll('style, script').forEach(function (st) {\r\n      if (st.tagName.toLowerCase() === 'style') cssText += st.textContent + NL;\r\n      st.parentNode.removeChild(st);\r\n    });\r\n    const bodyText = (doc.body ? doc.body.textContent : '').split(table.textContent).join('');\r\n    if (bodyText.trim() !== '') return null;\r\n\r\n    const rules = parseSimpleCssRules(cssText);\r\n\r\n    const grid = [];\r\n    let r = 0;\r\n    Array.prototype.forEach.call(table.rows, function (tr) {\r\n      if (isHiddenByStyle(tr)) return;\r\n      grid[r] = grid[r] || [];\r\n      let c = 0;\r\n      Array.prototype.forEach.call(tr.cells, function (td) {\r\n        if (isHiddenByStyle(td)) return;\r\n        while (grid[r][c] !== undefined) c++;\r\n        const cs = Math.max(1, parseInt(td.getAttribute('colspan') || '1', 10) || 1);\r\n        const rs = Math.max(1, parseInt(td.getAttribute('rowspan') || '1', 10) || 1);\r\n        grid[r][c] = { text: excelCellText(td), bg: cellBackgroundColor(td, rules) };\r\n        for (let dc = 1; dc < cs; dc++) grid[r][c + dc] = '<';\r\n        for (let dr = 1; dr < rs; dr++) {\r\n          grid[r + dr] = grid[r + dr] || [];\r\n          for (let dc = 0; dc < cs; dc++) grid[r + dr][c + dc] = '^';\r\n        }\r\n        c += cs;\r\n      });\r\n      r++;\r\n    });\r\n    \/\/\u8868\u306e\u5916\u307e\u3067\u306f\u307f\u51fa\u3057\u305f\u7e26\u306e\u7d50\u5408\u306f\u5207\u308a\u6368\u3066\u308b\r\n    grid.length = r;\r\n    return normalizeExcelGrid(grid);\r\n  }\r\n\r\n  \/\/ \u30bf\u30d6\u533a\u5207\u308a\u306e\u30c6\u30ad\u30b9\u30c8 \u2192 \u30b0\u30ea\u30c3\u30c9\uff08\"\u2026\" \u3067\u56f2\u3093\u3060\u30bb\u30eb\u306e\u4e2d\u306e\u6539\u884c\u30fb\"\" \u306b\u3082\u5bfe\u5fdc\uff09\r\n  function excelTsvToGrid(text) {\r\n    const rows = [];\r\n    let row = [];\r\n    let cell = '';\r\n    let i = 0;\r\n    let quoted = false;\r\n    const src = text.split(CR + NL).join(NL).split(CR).join(NL);\r\n    while (i < src.length) {\r\n      const ch = src.charAt(i);\r\n      if (quoted) {\r\n        if (ch === '\"') {\r\n          if (src.charAt(i + 1) === '\"') { cell += '\"'; i += 2; continue; }\r\n          quoted = false; i++; continue;\r\n        }\r\n        cell += ch; i++; continue;\r\n      }\r\n      if (ch === '\"' && cell === '') { quoted = true; i++; continue; }\r\n      if (ch === TAB) { row.push(cell); cell = ''; i++; continue; }\r\n      if (ch === NL) { row.push(cell); rows.push(row); row = []; cell = ''; i++; continue; }\r\n      cell += ch; i++;\r\n    }\r\n    if (cell !== '' || row.length) { row.push(cell); rows.push(row); }\r\n    while (rows.length && rows[rows.length - 1].join('') === '' && rows[rows.length - 1].length <= 1) rows.pop();\r\n    if (rows.length === 0) return null;\r\n    \/\/\u3059\u3079\u3066\u306e\u884c\u304c\u540c\u3058\u5217\u6570\uff082 \u5217\u4ee5\u4e0a\uff09\u306e\u3068\u304d\u3060\u3051\u8868\u3068\u307f\u306a\u3059\uff08\u30bf\u30d6\u3067\u5b57\u4e0b\u3052\u3057\u305f\u30b3\u30fc\u30c9\u306a\u3069\u3092\u8aa4\u5909\u63db\u3057\u306a\u3044\uff09\r\n    const cols = rows[0].length;\r\n    if (cols < 2 || !rows.every(function (r2) { return r2.length === cols; })) return null;\r\n    return normalizeExcelGrid(rows.map(function (r2) {\r\n      return r2.map(function (t) {\r\n        return { text: t.split(NL).map(function (p) { return escapeExcelCellText(p.trim()); }).join('<br>'), bg: '' };\r\n      });\r\n    }));\r\n  }\r\n\r\n  function normalizeExcelGrid(grid) {\r\n    if (!grid || grid.length === 0) return null;\r\n    let cols = 0;\r\n    grid.forEach(function (row) { cols = Math.max(cols, row.length); });\r\n    if (cols === 0) return null;\r\n    grid.forEach(function (row) {\r\n      for (let c = 0; c < cols; c++) if (row[c] === undefined) row[c] = { text: '', bg: '' };\r\n    });\r\n    return grid;\r\n  }\r\n\r\n  \/\/ \u30b0\u30ea\u30c3\u30c9 \u2192 \u3053\u306e\u30c4\u30fc\u30eb\u306e\u8868\u306e\u66f8\u304d\u65b9\r\n  function excelGridToMarkdown(grid, headerRow) {\r\n    const lines = grid.map(function (row) {\r\n      return '| ' + row.map(function (cell) { return (typeof cell === 'string') ? cell : cell.text; }).join(' | ') + ' |';\r\n    });\r\n    if (headerRow && lines.length >= 2) {\r\n      lines.splice(1, 0, '| ' + grid[0].map(function () { return '---'; }).join(' | ') + ' |');\r\n    }\r\n    return lines.join(NL);\r\n  }\r\n\r\n  \/\/ \u8cbc\u308a\u4ed8\u3051\u305f\u8868\u306e\u3001\u30bb\u30eb\u3054\u3068\u306e\u80cc\u666f\u8272\u30fb\u6587\u5b57\u3092\u899a\u3048\u3066\u304a\u304f\uff08\u5909\u63db\u6642\u306b bgcolor \u3092\u4ed8\u3051\u308b\u305f\u3081\uff09\r\n  function rememberExcelPaste(grid) {\r\n    const model = {\r\n      rows: grid.length,\r\n      cols: grid[0].length,\r\n      colors: grid.map(function (row) { return row.map(function (cell) { return (typeof cell === 'string') ? '' : cell.bg; }); }),\r\n      texts: grid.map(function (row) { return row.map(function (cell) { return (typeof cell === 'string') ? '' : cell.text; }); })\r\n    };\r\n    const hasColor = model.colors.some(function (row) { return row.some(Boolean); });\r\n    if (!hasColor) return;\r\n    excelPasteModels.unshift(model);\r\n    excelPasteModels = excelPasteModels.slice(0, 20);\r\n    try { localStorage.setItem(LS_KEY_EXCEL_COLORS, JSON.stringify(excelPasteModels)); } catch (e) { \/* \u5bb9\u91cf\u8d85\u904e\u306a\u3069\u306f\u7121\u8996 *\/ }\r\n  }\r\n\r\n  function loadExcelPasteModels() {\r\n    try {\r\n      const saved = JSON.parse(localStorage.getItem(LS_KEY_EXCEL_COLORS) || '[]');\r\n      if (Array.isArray(saved)) excelPasteModels = saved;\r\n    } catch (e) { excelPasteModels = []; }\r\n  }\r\n\r\n  \/\/ \u8cbc\u308a\u4ed8\u3051\u306e\u30a4\u30d9\u30f3\u30c8\uff1a\u8868\u306a\u3089 Markdown \u306e\u8868\u306b\u5909\u63db\u3057\u3066\u5165\u308c\u3001\u305d\u306e\u307e\u307e HTML \u306b\u3082\u5909\u63db\u3059\u308b\r\n  function handleExcelPaste(e) {\r\n    const option = document.getElementById('convertExcelPaste');\r\n    if (!option || !option.checked) return;\r\n    const cd = e.clipboardData || window.clipboardData;\r\n    if (!cd) return;\r\n    const html = cd.getData('text\/html') || '';\r\n    const plain = cd.getData('text\/plain') || '';\r\n\r\n    let grid = null;\r\n    if (html.toLowerCase().indexOf('<table') !== -1) grid = excelHtmlToGrid(html);\r\n    if (!grid && plain.indexOf(TAB) !== -1) grid = excelTsvToGrid(plain);\r\n    if (!grid) return;\r\n\r\n    e.preventDefault();\r\n    const headerOption = document.getElementById('excelHeaderRow');\r\n    const md = excelGridToMarkdown(grid, !!(headerOption && headerOption.checked));\r\n    rememberExcelPaste(grid);\r\n\r\n    const ta = e.target;\r\n    const before = ta.value.slice(0, ta.selectionStart);\r\n    const after = ta.value.slice(ta.selectionEnd);\r\n    \/\/\u524d\u5f8c\u306e\u6587\u7ae0\u3068\u3064\u306a\u304c\u3089\u306a\u3044\u3088\u3046\u3001\u7a7a\u884c\u3092\u631f\u3080\r\n    const lead = (before === '' || before.slice(-2) === NL + NL) ? '' : (before.slice(-1) === NL ? NL : NL + NL);\r\n    const trail = (after === '' || after.slice(0, 2) === NL + NL) ? '' : (after.charAt(0) === NL ? NL : NL + NL);\r\n    const insert = lead + md + trail;\r\n    ta.value = before + insert + after;\r\n    const caret = before.length + insert.length;\r\n    ta.setSelectionRange(caret, caret);\r\n    ta.dispatchEvent(new Event('input', { bubbles: true }));\r\n\r\n    const autoOption = document.getElementById('excelAutoConvert');\r\n    if (!autoOption || autoOption.checked) encodeText();\r\n  }\r\n\r\n\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ \u2605\u8868\u306e\u51fa\u529b\u30aa\u30d7\u30b7\u30e7\u30f3\uff08Markdown \u2192 HTML \u306e\u5909\u63db\u5f8c\uff09\u2605\r\n  \/\/   \u30fbExcel \u304b\u3089\u8cbc\u308a\u4ed8\u3051\u305f\u8868\u306b\u3001\u30bb\u30eb\u306e\u80cc\u666f\u8272\u3092 bgcolor \u5c5e\u6027\u3067\u4ed8\u3051\u308b\r\n  \/\/   \u30fb<table> \u306b border \u5c5e\u6027\u3092\u4ed8\u3051\u308b\uff08HTML \u30e1\u30fc\u30eb\u7528\uff09\r\n  \/\/   \u30fb\u30c6\u30fc\u30d6\u30eb\u8868\u73fe\uff1a<table> \u3092 \u2192 <dl><div><dt>\u2026<\/dt><dd>\u2026<\/dd><\/div><\/dl> \u306b\u3059\u308b\r\n  \/\/   \u3069\u308c\u3082\u6587\u5b57\u5217\u306e\u307e\u307e\u51e6\u7406\u3059\u308b\uff08DOM \u3067\u7d44\u307f\u7acb\u3066\u76f4\u3059\u3068\u3001\u30b3\u30fc\u30c9\u306e\u4e2d\u306e &lsqb; \u306a\u3069\u304c\r\n  \/\/   [ \u306b\u623b\u3063\u3066\u3057\u307e\u3044\u3001WordPress \u306e\u30b7\u30e7\u30fc\u30c8\u30b3\u30fc\u30c9\u3068\u3057\u3066\u52d5\u3044\u3066\u3057\u307e\u3046\u305f\u3081\uff09\r\n  \/\/ ============================================================================\r\n  const TABLE_BLOCK_RE_SRC = '<table(?=[ >])[^>]*>[^]*?<\/table>';\r\n\r\n  \/\/ <table>\u2026<\/table> \u306e\u6587\u5b57\u5217\u304b\u3089\u3001\u884c\u3054\u3068\u306e\u30bb\u30eb\uff08\u958b\u304d\u30bf\u30b0\u306e\u4f4d\u7f6e\u30fb\u5c5e\u6027\u30fb\u4e2d\u8eab\uff09\u3068\u30b0\u30ea\u30c3\u30c9\u4e0a\u306e\u4f4d\u7f6e\u3092\u53d6\u308a\u51fa\u3059\r\n  function parseTableCells(tableHtml) {\r\n    const tagRe = new RegExp('<(\/?)(tr|td|th)(?=[ >\/])([^>]*)>', 'gi');\r\n    const rows = [];\r\n    let cur = null;\r\n    let cellStart = null;\r\n    let m;\r\n    while ((m = tagRe.exec(tableHtml)) !== null) {\r\n      const closing = m[1] === '\/';\r\n      const tag = m[2].toLowerCase();\r\n      if (tag === 'tr') {\r\n        if (!closing) { cur = []; rows.push(cur); }\r\n        continue;\r\n      }\r\n      if (!cur) continue;\r\n      if (!closing) {\r\n        cellStart = { tag: tag, attrs: m[3], openStart: m.index, openEnd: m.index + m[0].length };\r\n      } else if (cellStart) {\r\n        cellStart.content = tableHtml.slice(cellStart.openEnd, m.index);\r\n        cellStart.closeEnd = m.index + m[0].length;\r\n        cur.push(cellStart);\r\n        cellStart = null;\r\n      }\r\n    }\r\n    \/\/\u30b0\u30ea\u30c3\u30c9\u4e0a\u306e\u4f4d\u7f6e\uff08colspan \/ rowspan \u3092\u8003\u616e\uff09\r\n    const occupied = [];\r\n    let cols = 0;\r\n    rows.forEach(function (cells, r) {\r\n      occupied[r] = occupied[r] || [];\r\n      let c = 0;\r\n      cells.forEach(function (cell) {\r\n        while (occupied[r][c]) c++;\r\n        const cs = Math.max(1, parseInt(attrValue(cell.attrs, 'colspan') || '1', 10) || 1);\r\n        const rs = Math.max(1, parseInt(attrValue(cell.attrs, 'rowspan') || '1', 10) || 1);\r\n        cell.row = r; cell.col = c; cell.colspan = cs; cell.rowspan = rs;\r\n        for (let dr = 0; dr < rs; dr++) {\r\n          occupied[r + dr] = occupied[r + dr] || [];\r\n          for (let dc = 0; dc < cs; dc++) occupied[r + dr][c + dc] = (dr === 0 && dc === 0) ? cell : { coveredBy: cell, fromAbove: dr > 0 };\r\n        }\r\n        c += cs;\r\n        cols = Math.max(cols, c);\r\n      });\r\n    });\r\n    return { rows: rows, occupied: occupied, rowCount: rows.length, colCount: cols };\r\n  }\r\n\r\n  function attrValue(attrs, name) {\r\n    const m = String(attrs || '').match(new RegExp('(?:^|[ ])' + name + '=\"([^\"]*)\"', 'i'));\r\n    return m ? m[1] : '';\r\n  }\r\n\r\n  function plainCellText(html) {\r\n    return String(html || '').replace(new RegExp('<[^>]*>', 'g'), '').trim();\r\n  }\r\n\r\n  \/\/ \u8cbc\u308a\u4ed8\u3051\u305f\u8868\uff08\u884c\u30fb\u5217\u306e\u6570\u304c\u540c\u3058\u3067\u3001\u6587\u5b57\u304c\u3044\u3061\u3070\u3093\u591a\u304f\u4e00\u81f4\u3059\u308b\u3082\u306e\uff09\u3092\u63a2\u3059\r\n  function findExcelPasteModel(parsed) {\r\n    let best = null;\r\n    let bestScore = -1;\r\n    excelPasteModels.forEach(function (model) {\r\n      if (model.rows !== parsed.rowCount || model.cols !== parsed.colCount) return;\r\n      let score = 0;\r\n      parsed.rows.forEach(function (cells) {\r\n        cells.forEach(function (cell) {\r\n          const t = (model.texts[cell.row] || [])[cell.col];\r\n          if (t !== undefined && plainCellText(t) === plainCellText(cell.content)) score++;\r\n        });\r\n      });\r\n      if (score > bestScore) { best = model; bestScore = score; }\r\n    });\r\n    return best;\r\n  }\r\n\r\n  function applyExcelBgcolors(tableHtml) {\r\n    const parsed = parseTableCells(tableHtml);\r\n    const model = findExcelPasteModel(parsed);\r\n    if (!model) return tableHtml;\r\n    \/\/\u5f8c\u308d\u306e\u30bb\u30eb\u304b\u3089\u66f8\u304d\u63db\u3048\u308b\uff08\u4f4d\u7f6e\u304c\u305a\u308c\u306a\u3044\u3088\u3046\u306b\uff09\r\n    const cells = [];\r\n    parsed.rows.forEach(function (row) { Array.prototype.push.apply(cells, row); });\r\n    cells.sort(function (a, b) { return b.openStart - a.openStart; });\r\n    cells.forEach(function (cell) {\r\n      const color = (model.colors[cell.row] || [])[cell.col];\r\n      if (!color || attrValue(cell.attrs, 'bgcolor')) return;\r\n      const at = cell.openStart + 1 + cell.tag.length;\r\n      tableHtml = tableHtml.slice(0, at) + ' bgcolor=\"' + color + '\"' + tableHtml.slice(at);\r\n    });\r\n    return tableHtml;\r\n  }\r\n\r\n  function addTableBorderAttr(tableHtml, value) {\r\n    const open = tableHtml.slice(0, tableHtml.indexOf('>') + 1);\r\n    if (attrValue(open, 'border')) return tableHtml;\r\n    return '<table border=\"' + value + '\"' + tableHtml.slice('<table'.length);\r\n  }\r\n\r\n  \/\/ <table> \u2192 <dl><div><dt>1 \u5217\u76ee<\/dt><dd>2 \u5217\u76ee<\/dd>\u2026<\/div><\/dl>\r\n  \/\/   \u30fb\u884c\u3054\u3068\u306b <div> \u3067\u56f2\u3080\u3002\u5404\u884c\u306e\u6700\u521d\u306e\u30bb\u30eb\u304c <dt>\u3001\u6b8b\u308a\u304c <dd>\r\n  \/\/   \u30fb\u7e26\u306b\u7d50\u5408\u3057\u305f\u30bb\u30eb\u304c 1 \u5217\u76ee\u306b\u3042\u308b\u3068\u304d\u306f\u3001\u4e0b\u306e\u884c\u306b\u3082\u540c\u3058 <dt> \u3092\u51fa\u3059\r\n  \/\/   \u30fb<caption> \u306f <dl> \u306e\u524d\u306b\u6bb5\u843d\u3068\u3057\u3066\u51fa\u3059\r\n  function tableToDefinitionList(tableHtml) {\r\n    const parsed = parseTableCells(tableHtml);\r\n    if (parsed.rowCount === 0) return tableHtml;\r\n    const out = [];\r\n    const capM = tableHtml.match(new RegExp('<caption[^>]*>([^]*?)<\/caption>', 'i'));\r\n    if (capM && capM[1].trim()) out.push('<p>' + capM[1].trim() + '<\/p>');\r\n    out.push('<dl>');\r\n    for (let r = 0; r < parsed.rowCount; r++) {\r\n      const items = [];\r\n      for (let c = 0; c < parsed.colCount; c++) {\r\n        const slot = (parsed.occupied[r] || [])[c];\r\n        if (!slot) continue;\r\n        if (slot.coveredBy) {\r\n          \/\/1 \u5217\u76ee\u306e\u7e26\u306e\u7d50\u5408\u3060\u3051\u3001\u898b\u51fa\u3057\uff08dt\uff09\u3068\u3057\u3066\u7e70\u308a\u8fd4\u3059\r\n          if (c === 0 && slot.fromAbove && slot.coveredBy.col === 0) items.push(slot.coveredBy.content.trim());\r\n          continue;\r\n        }\r\n        items.push(slot.content.trim());\r\n      }\r\n      if (items.length === 0) continue;\r\n      out.push('  <div>');\r\n      items.forEach(function (content, idx) {\r\n        const tag = idx === 0 ? 'dt' : 'dd';\r\n        out.push('    <' + tag + '>' + content + '<\/' + tag + '>');\r\n      });\r\n      out.push('  <\/div>');\r\n    }\r\n    out.push('<\/dl>');\r\n    return out.join(NL);\r\n  }\r\n\r\n  function applyTableOutputOptions(text) {\r\n    const styleSelect = document.getElementById('convertTableStyle');\r\n    const toDl = !!(styleSelect && styleSelect.value === 'dl');\r\n    const bgOption = document.getElementById('excelBgcolor');\r\n    const useBg = !toDl && !!(bgOption && bgOption.checked) && excelPasteModels.length > 0;\r\n    const borderOption = document.getElementById('convertTableBorder');\r\n    const borderValueInput = document.getElementById('tableBorderValue');\r\n    const borderValue = borderValueInput ? borderValueInput.value.trim() : '';\r\n    const useBorder = !toDl && !!(borderOption && borderOption.checked) && borderValue !== '';\r\n    if (!toDl && !useBg && !useBorder) return text;\r\n\r\n    return text.replace(new RegExp(TABLE_BLOCK_RE_SRC, 'gi'), function (tableHtml) {\r\n      if (toDl) return tableToDefinitionList(tableHtml);\r\n      if (useBg) tableHtml = applyExcelBgcolors(tableHtml);\r\n      if (useBorder) tableHtml = addTableBorderAttr(tableHtml, borderValue);\r\n      return tableHtml;\r\n    });\r\n  }\r\n\r\n\r\n\r\n\r\n  \/\/ ============================================================================\r\n  \/\/ localStorage\uff1a\u30c6\u30ad\u30b9\u30c8\uff0b\u30aa\u30d7\u30b7\u30e7\u30f3\u72b6\u614b\u306e\u4fdd\u5b58\u30fb\u5fa9\u5143\r\n  \/\/ ============================================================================\r\n\r\n  \/\/ markdown-converter \u3068\u5225\u306e\u30ad\u30fc\u306b\u3059\u308b\uff08\u540c\u3058\u30b5\u30a4\u30c8\u3067\u8a2d\u5b9a\u30fb\u30c6\u30ad\u30b9\u30c8\u304c\u6df7\u3056\u3089\u306a\u3044\u3088\u3046\u306b\uff09\r\n  const LS_KEY_TEXT = 'excel2tableText';\r\n  const LS_KEY_OPTIONS = 'excel2table_options';\r\n\r\n  \/\/ \u4fdd\u5b58\u5bfe\u8c61\u30bb\u30ec\u30af\u30bf\u30fc\uff08id\u5c5e\u6027\u306e\u3042\u308b\u8981\u7d20\u306e\u307f\u5bfe\u8c61\uff09\r\n  const OPTION_SELECTORS = [\r\n    'input[type=\"checkbox\"]',\r\n    'input[type=\"text\"]',\r\n    'input[type=\"number\"]',\r\n    'select',\r\n    '#decodeKeepTagOnlyTags',\r\n    '#decodeFencedDivTags',\r\n  ];\r\n\r\n  \/\/ \u30aa\u30d7\u30b7\u30e7\u30f3\u72b6\u614b\u3092\u4fdd\u5b58\r\n  function saveOptions() {\r\n    const state = {};\r\n    OPTION_SELECTORS.forEach(sel => {\r\n      document.querySelectorAll(sel).forEach(el => {\r\n        if (!el.id) return;\r\n        state[el.id] = (el.type === 'checkbox') ? el.checked : el.value;\r\n      });\r\n    });\r\n    localStorage.setItem(LS_KEY_OPTIONS, JSON.stringify(state));\r\n  }\r\n\r\n  \/\/ \u30aa\u30d7\u30b7\u30e7\u30f3\u72b6\u614b\u3092\u5fa9\u5143\r\n  function loadOptions() {\r\n    const saved = localStorage.getItem(LS_KEY_OPTIONS);\r\n    if (!saved) return;\r\n    let state;\r\n    try { state = JSON.parse(saved); } catch (e) { return; }\r\n    Object.entries(state).forEach(([id, val]) => {\r\n      const el = document.getElementById(id);\r\n      if (!el) return;\r\n      if (el.type === 'checkbox') el.checked = val;\r\n      else el.value = val;\r\n    });\r\n  }\r\n\r\n  \/\/ \u30da\u30fc\u30b8\u8aad\u307f\u8fbc\u307f\u6642\u306b\u5fa9\u5143\r\n  window.addEventListener('load', function () {\r\n\r\n    \/\/ \u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u3092\u5fa9\u5143\r\n    const savedText = localStorage.getItem(LS_KEY_TEXT);\r\n    if (savedText) {\r\n      document.getElementById('encodeArea').value = savedText;\r\n    }\r\n\r\n    \/\/ \u30aa\u30d7\u30b7\u30e7\u30f3\u72b6\u614b\u3092\u5fa9\u5143\r\n    loadOptions();\r\n    \/\/ Excel \u304b\u3089\u8cbc\u308a\u4ed8\u3051\u305f\u8868\u306e\u80cc\u666f\u8272\u3092\u5fa9\u5143\r\n    loadExcelPasteModels();\r\n\r\n    \/\/ MathJax\u30b3\u30de\u30f3\u30c9\u306e\u521d\u671f\u5024\uff08\u751f\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u3092\u542b\u3080\u305f\u3081\u3001\u9759\u7684HTML\u5074\u306e\r\n    \/\/ value\u5c5e\u6027\u306b\u306f\u66f8\u3051\u306a\u3044\u3002\u7a7a\u306e\u307e\u307e\u306a\u3089\u3053\u3053\u3067JS\u5074\u304b\u3089\u8a2d\u5b9a\u3059\u308b\uff09\u3002\r\n    const mathJaxCmd1 = document.getElementById('decodeMathJaxCmd1');\r\n    if (mathJaxCmd1 && !mathJaxCmd1.value) mathJaxCmd1.value = BS + 'small';\r\n    const mathJaxCmd2 = document.getElementById('decodeMathJaxCmd2');\r\n    if (mathJaxCmd2 && !mathJaxCmd2.value) mathJaxCmd2.value = BS + 'bbox[yellow]';\r\n\r\n    \/\/ \u5fa9\u5143\u5f8c\u3001\u30aa\u30d7\u30b7\u30e7\u30f3\u5909\u66f4\u30a4\u30d9\u30f3\u30c8\u3092\u4e00\u62ec\u767b\u9332\r\n    OPTION_SELECTORS.forEach(sel => {\r\n      document.querySelectorAll(sel).forEach(el => {\r\n        const evType = (el.tagName === 'SELECT' || el.type === 'checkbox') ? 'change' : 'input';\r\n        el.addEventListener(evType, saveOptions);\r\n      });\r\n    });\r\n  });\r\n\r\n  \/\/ Excel\u30fb\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306e\u7bc4\u56f2\u306e\u8cbc\u308a\u4ed8\u3051 \u2192 Markdown \u306e\u8868\r\n  document.getElementById('encodeArea').addEventListener('paste', handleExcelPaste);\r\n\r\n  \/\/ \u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u306e\u5185\u5bb9\u304c\u5909\u66f4\u3055\u308c\u305f\u3089\u4fdd\u5b58\r\n  document.getElementById('encodeArea').addEventListener('input', function () {\r\n    localStorage.setItem(LS_KEY_TEXT, this.value);\r\n  });\r\n<\/script>","protected":false},"excerpt":{"rendered":"Excel\u30fbGoogle\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306e\u8868\u3092\u3001\u30b3\u30d4\u30fc\u3057\u3066\u8cbc\u308a\u4ed8\u3051\u308b\u3060\u3051\u3067HTML\u306etable\u30bf\u30b0\u306b\u5909\u63db\u3002\u7d50\u5408\u30bb\u30eb\u306fcolspan\u30fbrowspan\u306b\u3001\u80cc\u666f\u8272\u306fbgcolor\u5c5e\u6027\u306b\u3082\u5bfe\u5fdc\u3057\u3001HTML\u30e1\u30fc\u30eb\u306b\u3082\u4f7f\u3048\u307e\u3059\u3002Markdown\u306e\u8868\u3068\u3057\u3066\u7de8\u96c6\u3067\u304d\u3001HTML\u2192Markdown\u306e\u9006\u5909\u63db\u3082\u53ef\u80fd\u3002\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e0d\u8981\u306e\u7121\u6599\u30c4\u30fc\u30eb\u3002","protected":false},"author":1,"featured_media":0,"parent":173,"menu_order":8,"comment_status":"closed","ping_status":"closed","template":"templates\/page-converter.php","meta":{"_acf_changed":false,"_exclude_from_list_pages":"","footnotes":"","vk-ltc-link":"","vk-ltc-target":"0"},"categories":[21,11],"tags":[1247,1240,1241,1242,1246,1245,1243,1244,1029,1013,322,297,180,128,102],"group":[],"pg":[],"class_list":["post-15197","page","type-page","status-publish","category-tool","category-html-css","tag-rowspan","tag-1240","tag-table","tag-1242","tag-colspan","tag-1245","tag-1243","tag-google","tag-1029","tag-1013","tag-html","tag-excel","tag-markdown","tag-wordpress"],"acf":[],"_links":{"self":[{"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/pages\/15197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/comments?post=15197"}],"version-history":[{"count":11,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/pages\/15197\/revisions"}],"predecessor-version":[{"id":15287,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/pages\/15197\/revisions\/15287"}],"up":[{"embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/pages\/173"}],"wp:attachment":[{"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/media?parent=15197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/categories?post=15197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/tags?post=15197"},{"taxonomy":"group","embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/group?post=15197"},{"taxonomy":"pg","embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/pg?post=15197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}