{"id":26227,"date":"2025-12-01T15:45:10","date_gmt":"2025-12-01T06:45:10","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=26227"},"modified":"2025-12-01T15:45:11","modified_gmt":"2025-12-01T06:45:11","slug":"%e4%ba%8c%e6%ac%a1%e8%a3%8f%e3%81%ae%e3%82%af%e3%83%ad%e3%83%bc%e3%83%b3%e3%82%b5%e3%82%a4%e3%83%88","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=26227","title":{"rendered":"\u4e8c\u6b21\u88cf\u306e\u30af\u30ed\u30fc\u30f3\u30b5\u30a4\u30c8"},"content":{"rendered":"\n<p>tyosuke20xx.com\/nijiura.html<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n&lt;!DOCTYPE html>\n&lt;html lang=\"ja\">\n&lt;head>\n    &lt;meta charset=\"UTF-8\">\n    &lt;title>\u4e8c\u6b21\u88cf\u30af\u30ed\u30fc\u30f3\uff08\u30ed\u30fc\u30ab\u30ebHTML\u7248\u30fb\u5f37\u5316\uff09&lt;\/title>\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    &lt;style>\n        \/* ------------------------------\n           \u5168\u4f53\u30ec\u30a4\u30a2\u30a6\u30c8 \/ \u30d9\u30fc\u30b9\u30b9\u30bf\u30a4\u30eb\n        ------------------------------ *\/\n        body {\n            background: #f2f2e9;\n            color: #333;\n            font-family: \"YuGothic\", \"Hiragino Kaku Gothic ProN\", Meiryo, sans-serif;\n            font-size: 14px;\n            margin: 0;\n            padding: 0;\n        }\n        header {\n            background: #d8d8c0;\n            padding: 10px;\n            border-bottom: 1px solid #b0b08f;\n        }\n        header h1 {\n            margin: 0;\n            font-size: 18px;\n        }\n        header small {\n            display: block;\n            font-size: 11px;\n            color: #555;\n        }\n        .container {\n            width: 95%;\n            max-width: 900px;\n            margin: 10px auto 40px auto;\n            background: #fff;\n            border: 1px solid #ccc;\n            padding: 10px 15px 20px 15px;\n            box-sizing: border-box;\n        }\n        a {\n            color: #0044cc;\n            text-decoration: none;\n            cursor: pointer;\n        }\n        a:hover {\n            text-decoration: underline;\n        }\n        .hidden {\n            display: none;\n        }\n\n        \/* ------------------------------\n           \u4e0a\u90e8\u30ca\u30d3\u30fb\u30b9\u30c6\u30fc\u30bf\u30b9\n        ------------------------------ *\/\n        .board-nav {\n            font-size: 12px;\n            padding: 5px 0 8px 0;\n            border-bottom: 1px solid #ddd;\n            margin-bottom: 10px;\n            display: flex;\n            flex-wrap: wrap;\n            gap: 8px;\n            align-items: center;\n        }\n        .board-nav .nav-left {\n            flex: 1 1 auto;\n        }\n        .board-nav .nav-right {\n            flex: 1 1 auto;\n            text-align: right;\n        }\n        .board-nav label {\n            font-size: 12px;\n            margin-left: 6px;\n        }\n        .board-nav select,\n        .board-nav input&#91;type=\"text\"] {\n            font-size: 12px;\n            padding: 2px 4px;\n        }\n        .board-nav input&#91;type=\"checkbox\"] {\n            vertical-align: middle;\n        }\n        .stats {\n            font-size: 11px;\n            color: #555;\n        }\n\n        \/* ------------------------------\n           \u30b9\u30ec\u30c3\u30c9\u4e00\u89a7\n        ------------------------------ *\/\n        .thread-list {\n            margin-bottom: 20px;\n        }\n        .thread-item {\n            border-bottom: 1px dotted #ccc;\n            padding: 5px 0;\n            display: flex;\n            align-items: flex-start;\n            gap: 4px;\n        }\n        .thread-main {\n            flex: 1 1 auto;\n        }\n        .thread-item:last-child {\n            border-bottom: none;\n        }\n        .thread-title {\n            font-weight: bold;\n        }\n        .thread-category {\n            font-size: 11px;\n            color: #444;\n            background: #f0f0d8;\n            padding: 1px 4px;\n            border-radius: 3px;\n            margin-right: 4px;\n        }\n        .meta {\n            font-size: 11px;\n            color: #666;\n        }\n\n        \/* \u304a\u6c17\u306b\u5165\u308a\u30b9\u30bf\u30fc *\/\n        .fav-toggle {\n            font-size: 16px;\n            cursor: pointer;\n            user-select: none;\n            padding: 0 2px;\n        }\n        .fav-true {\n            color: #d89a00;\n        }\n        .fav-false {\n            color: #ccc;\n        }\n\n        \/* ------------------------------\n           \u30d5\u30a9\u30fc\u30e0\u5171\u901a\n        ------------------------------ *\/\n        .form-block {\n            margin: 20px 0;\n            padding: 10px;\n            background: #f7f7ee;\n            border: 1px solid #ddd;\n        }\n        .form-block h2 {\n            margin: 0 0 5px 0;\n            font-size: 14px;\n        }\n        .form-row {\n            margin-bottom: 5px;\n        }\n        label {\n            font-size: 12px;\n            display: inline-block;\n            width: 70px;\n        }\n        input&#91;type=\"text\"],\n        textarea,\n        select {\n            width: 90%;\n            max-width: 500px;\n            box-sizing: border-box;\n            font-size: 13px;\n        }\n        textarea {\n            height: 80px;\n        }\n        input&#91;type=\"submit\"],\n        button {\n            font-size: 12px;\n            padding: 3px 10px;\n            margin-right: 4px;\n        }\n        .notice {\n            font-size: 11px;\n            color: #999;\n            margin-top: 5px;\n        }\n\n        \/* ------------------------------\n           \u30ec\u30b9\u8868\u793a\n        ------------------------------ *\/\n        .posts {\n            margin-top: 10px;\n        }\n        .post {\n            border-top: 1px dotted #ccc;\n            padding: 5px 0;\n        }\n        .post:first-child {\n            border-top: none;\n        }\n        .post-header {\n            font-size: 12px;\n            margin-bottom: 3px;\n        }\n        .post-body {\n            font-size: 13px;\n            white-space: pre-wrap;\n            word-wrap: break-word;\n        }\n        .post-id {\n            font-family: \"Consolas\", \"Menlo\", monospace;\n            font-size: 11px;\n            color: #666;\n        }\n        .post-no-link {\n            font-weight: bold;\n        }\n\n        \/* ------------------------------\n           \u30b9\u30ec\u30c3\u30c9\u30d3\u30e5\u30fc\u306e\u30ca\u30d3\n        ------------------------------ *\/\n        .nav-top {\n            margin-bottom: 10px;\n            font-size: 12px;\n        }\n\n        \/* ------------------------------\n           \u30c7\u30fc\u30bf\u30c4\u30fc\u30eb\u7528\u30a8\u30ea\u30a2\n        ------------------------------ *\/\n        #backup-text {\n            width: 100%;\n            max-width: 100%;\n            box-sizing: border-box;\n            font-size: 12px;\n        }\n\n        \/* ------------------------------\n           \u8a2d\u5b9a\u30d6\u30ed\u30c3\u30af\n        ------------------------------ *\/\n        #settings-block label {\n            width: auto;\n        }\n        #settings-block input&#91;type=\"checkbox\"] {\n            width: auto;\n        }\n        #setting-last-name {\n            width: 200px;\n        }\n\n        \/* ------------------------------\n           \u30ec\u30b9\u30dd\u30f3\u30b7\u30d6\u8abf\u6574\n        ------------------------------ *\/\n        @media (max-width: 600px) {\n            label {\n                display: block;\n                width: auto;\n                margin-bottom: 2px;\n            }\n            input&#91;type=\"text\"],\n            textarea,\n            select {\n                width: 100%;\n            }\n            .board-nav {\n                flex-direction: column;\n                align-items: flex-start;\n            }\n            .board-nav .nav-right {\n                text-align: left;\n            }\n            .thread-item {\n                flex-direction: row;\n            }\n        }\n    &lt;\/style>\n&lt;\/head>\n&lt;body>\n&lt;header>\n    &lt;h1>\u4e8c\u6b21\u88cf\u30af\u30ed\u30fc\u30f3\uff08\u30ed\u30fc\u30ab\u30ebHTML\u7248\u30fb\u5f37\u5316\uff09&lt;\/h1>\n    &lt;small>\u203b\u30d6\u30e9\u30a6\u30b6\u306e localStorage \u306b\u4fdd\u5b58 \/ \u672c\u5bb6\u3068\u306f\u4e00\u5207\u95a2\u4fc2\u3042\u308a\u307e\u305b\u3093&lt;\/small>\n&lt;\/header>\n\n&lt;div class=\"container\" id=\"top\">\n    &lt;!-- \u30b9\u30ec\u4e00\u89a7\u30d3\u30e5\u30fc -->\n    &lt;div id=\"view-list\">\n        &lt;div class=\"board-nav\">\n            &lt;div class=\"nav-left\">\n                &lt;span class=\"stats\">\n                    \u30b9\u30ec\u6570\uff1a&lt;span id=\"stat-threads\">0&lt;\/span> \/\n                    \u7dcf\u30ec\u30b9\u6570\uff1a&lt;span id=\"stat-posts\">0&lt;\/span>\n                &lt;\/span>\n                &lt;label>\n                    \u30ab\u30c6\u30b4\u30ea\n                    &lt;select id=\"category-filter\">\n                        &lt;option value=\"\">\u5168\u30ab\u30c6\u30b4\u30ea&lt;\/option>\n                        &lt;option value=\"\u96d1\u8ac7\">\u96d1\u8ac7&lt;\/option>\n                        &lt;option value=\"\u30b2\u30fc\u30e0\">\u30b2\u30fc\u30e0&lt;\/option>\n                        &lt;option value=\"\u30a2\u30cb\u30e1\">\u30a2\u30cb\u30e1&lt;\/option>\n                        &lt;option value=\"\u30cb\u30e5\u30fc\u30b9\">\u30cb\u30e5\u30fc\u30b9&lt;\/option>\n                        &lt;option value=\"\u305d\u306e\u4ed6\">\u305d\u306e\u4ed6&lt;\/option>\n                    &lt;\/select>\n                &lt;\/label>\n                &lt;label>\n                    &lt;input type=\"checkbox\" id=\"fav-only\">\n                    \u304a\u6c17\u306b\u5165\u308a\u306e\u307f\n                &lt;\/label>\n            &lt;\/div>\n            &lt;div class=\"nav-right\">\n                &lt;label>\n                    \u4e26\u3073\u66ff\u3048\n                    &lt;select id=\"sort-select\">\n                        &lt;option value=\"updated\">\u66f4\u65b0\u9806&lt;\/option>\n                        &lt;option value=\"created\">\u4f5c\u6210\u9806&lt;\/option>\n                        &lt;option value=\"id\">\u30b9\u30ec\u756a\u53f7\u9806&lt;\/option>\n                    &lt;\/select>\n                &lt;\/label>\n                &lt;label>\n                    \u691c\u7d22\n                    &lt;input type=\"text\" id=\"search-input\" placeholder=\"\u30bf\u30a4\u30c8\u30eb\u30fb\u672c\u6587\u304b\u3089\u691c\u7d22\">\n                &lt;\/label>\n            &lt;\/div>\n        &lt;\/div>\n\n        &lt;h2>\u30b9\u30ec\u30c3\u30c9\u4e00\u89a7&lt;\/h2>\n        &lt;div id=\"thread-list\" class=\"thread-list\">\n            &lt;!-- JS\u3067\u4e00\u89a7\u3092\u63cf\u753b -->\n        &lt;\/div>\n\n        &lt;div class=\"form-block\">\n            &lt;h2>\u65b0\u898f\u30b9\u30ec\u30c3\u30c9\u4f5c\u6210&lt;\/h2>\n            &lt;form id=\"new-thread-form\">\n                &lt;div class=\"form-row\">\n                    &lt;label>\u540d\u524d&lt;\/label>\n                    &lt;input type=\"text\" name=\"name\" id=\"new-name\" placeholder=\"\u540d\u7121\u3057\">\n                &lt;\/div>\n                &lt;div class=\"form-row\">\n                    &lt;label>\u30ab\u30c6\u30b4\u30ea&lt;\/label>\n                    &lt;select name=\"category\" id=\"new-category\">\n                        &lt;option value=\"\u96d1\u8ac7\">\u96d1\u8ac7&lt;\/option>\n                        &lt;option value=\"\u30b2\u30fc\u30e0\">\u30b2\u30fc\u30e0&lt;\/option>\n                        &lt;option value=\"\u30a2\u30cb\u30e1\">\u30a2\u30cb\u30e1&lt;\/option>\n                        &lt;option value=\"\u30cb\u30e5\u30fc\u30b9\">\u30cb\u30e5\u30fc\u30b9&lt;\/option>\n                        &lt;option value=\"\u305d\u306e\u4ed6\">\u305d\u306e\u4ed6&lt;\/option>\n                    &lt;\/select>\n                &lt;\/div>\n                &lt;div class=\"form-row\">\n                    &lt;label>\u30bf\u30a4\u30c8\u30eb&lt;\/label>\n                    &lt;input type=\"text\" name=\"title\" required>\n                &lt;\/div>\n                &lt;div class=\"form-row\">\n                    &lt;label>\u672c\u6587&lt;\/label>\n                    &lt;textarea name=\"body\" required>&lt;\/textarea>\n                &lt;\/div>\n                &lt;div class=\"form-row\">\n                    &lt;input type=\"submit\" value=\"\u30b9\u30ec\u7acb\u3066\">\n                &lt;\/div>\n                &lt;div class=\"notice\">\n                    \u203b\u8d85\u30b7\u30f3\u30d7\u30eb\u30ed\u30fc\u30ab\u30eb\u5b9f\u88c5\u3002\u30c7\u30fc\u30bf\u306f\u3053\u306e\u30d6\u30e9\u30a6\u30b6\u5185\u3060\u3051\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002&lt;br>\n                    \u203b\u5225\u30d6\u30e9\u30a6\u30b6\u30fb\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30e2\u30fc\u30c9\u3067\u306f\u5171\u6709\u3055\u308c\u307e\u305b\u3093\u3002\n                &lt;\/div>\n            &lt;\/form>\n        &lt;\/div>\n\n        &lt;!-- \u30ed\u30fc\u30ab\u30eb\u30c7\u30fc\u30bf\u7ba1\u7406\u30c4\u30fc\u30eb -->\n        &lt;div class=\"form-block\" id=\"data-tools\">\n            &lt;h2>\u30ed\u30fc\u30ab\u30eb\u30c7\u30fc\u30bf\u7ba1\u7406&lt;\/h2>\n            &lt;p class=\"notice\">\n                \u3053\u306ePC \/ \u30d6\u30e9\u30a6\u30b6\u3060\u3051\u3067\u4f7f\u3046\u7c21\u6613\u30c4\u30fc\u30eb\u3067\u3059\u3002&lt;br>\n                \u5225\u74b0\u5883\u3078\u79fb\u3057\u305f\u3044\u5834\u5408\u306f JSON \u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3057\u3066\u4fdd\u5b58\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n            &lt;\/p>\n            &lt;div class=\"form-row\">\n                &lt;button type=\"button\" id=\"btn-export\">\u30a8\u30af\u30b9\u30dd\u30fc\u30c8&lt;\/button>\n                &lt;button type=\"button\" id=\"btn-import\">\u30a4\u30f3\u30dd\u30fc\u30c8&lt;\/button>\n                &lt;button type=\"button\" id=\"btn-clear\">\u5168\u6d88\u53bb&lt;\/button>\n            &lt;\/div>\n            &lt;div class=\"form-row\">\n                &lt;textarea id=\"backup-text\" rows=\"4\" placeholder=\"\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3057\u305fJSON\u304c\u3053\u3053\u306b\u51fa\u529b\u3055\u308c\u307e\u3059\u3002\u3053\u3053\u306b\u8cbc\u308a\u4ed8\u3051\u3066\u30a4\u30f3\u30dd\u30fc\u30c8\u3082\u3067\u304d\u307e\u3059\u3002\">&lt;\/textarea>\n            &lt;\/div>\n        &lt;\/div>\n\n        &lt;!-- \u7c21\u6613\u8a2d\u5b9a -->\n        &lt;div class=\"form-block\" id=\"settings-block\">\n            &lt;h2>\u30df\u30cb\u8a2d\u5b9a&lt;\/h2>\n            &lt;div class=\"form-row\">\n                &lt;label>\n                    &lt;input type=\"checkbox\" id=\"opt-autoname\">\n                    \u540d\u524d\u3092\u8a18\u61b6\u3057\u3066\u81ea\u52d5\u3067\u5165\u308c\u308b\n                &lt;\/label>\n            &lt;\/div>\n            &lt;div class=\"form-row\">\n                &lt;label>\u524d\u56de\u306e\u540d\u524d&lt;\/label>\n                &lt;input type=\"text\" id=\"setting-last-name\" placeholder=\"\u540d\u7121\u3057\">\n            &lt;\/div>\n            &lt;div class=\"form-row\">\n                &lt;button type=\"button\" id=\"btn-save-settings\">\u8a2d\u5b9a\u3092\u4fdd\u5b58&lt;\/button>\n            &lt;\/div>\n            &lt;div class=\"notice\">\n                \u203b\u540d\u524d\u3092\u8a18\u61b6\u3057\u3066\u304a\u304f\u3068\u3001\u65b0\u898f\u30b9\u30ec\u30fb\u30ec\u30b9\u6295\u7a3f\u6642\u306e\u540d\u524d\u6b04\u306b\u81ea\u52d5\u3067\u53cd\u6620\u3055\u308c\u307e\u3059\u3002&lt;br>\n                \u203b\u3053\u308c\u3089\u3082 localStorage \u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002\n            &lt;\/div>\n        &lt;\/div>\n    &lt;\/div>\n\n    &lt;!-- \u500b\u5225\u30b9\u30ec\u30c3\u30c9\u30d3\u30e5\u30fc -->\n    &lt;div id=\"view-thread\" class=\"hidden\">\n        &lt;div class=\"nav-top\">\n            &lt;a id=\"back-to-list\">&amp;lt;&amp;lt; \u30b9\u30ec\u4e00\u89a7\u306b\u623b\u308b&lt;\/a> |\n            &lt;a href=\"#bottom\">\u25bc \u4e00\u756a\u4e0b\u3078&lt;\/a> |\n            &lt;a href=\"#top\">\u25b2 \u30da\u30fc\u30b8\u5148\u982d\u3078&lt;\/a>\n        &lt;\/div>\n\n        &lt;h2 id=\"thread-title\">&lt;\/h2>\n        &lt;div class=\"meta\" id=\"thread-meta\">&lt;\/div>\n\n        &lt;div id=\"posts\" class=\"posts\">\n            &lt;!-- JS\u3067\u30ec\u30b9\u3092\u63cf\u753b -->\n        &lt;\/div>\n\n        &lt;div class=\"form-block\">\n            &lt;h2>\u30ec\u30b9\u3092\u66f8\u304f&lt;\/h2>\n            &lt;form id=\"reply-form\">\n                &lt;div class=\"form-row\">\n                    &lt;label>\u540d\u524d&lt;\/label>\n                    &lt;input type=\"text\" name=\"name\" id=\"reply-name\" placeholder=\"\u540d\u7121\u3057\">\n                &lt;\/div>\n                &lt;div class=\"form-row\">\n                    &lt;label>\u672c\u6587&lt;\/label>\n                    &lt;textarea name=\"body\" id=\"reply-body\" required>&lt;\/textarea>\n                &lt;\/div>\n                &lt;div class=\"form-row\">\n                    &lt;input type=\"submit\" value=\"\u30ec\u30b9\u6295\u7a3f\">\n                &lt;\/div>\n                &lt;div class=\"notice\">\n                    \u203b\u30ec\u30b9\u756a\u53f7\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u672c\u6587\u306b\u300c>>\u756a\u53f7\u300d\u304c\u5165\u308a\u307e\u3059\u3002&lt;br>\n                    \u203b\u753b\u50cf\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u6a5f\u80fd\u306f\u3053\u306eHTML\u7248\u306b\u306f\u5165\u308c\u3066\u3044\u307e\u305b\u3093\u3002&lt;br>\n                    \u203b\u672c\u683c\u904b\u7528\u3057\u305f\u3044\u5834\u5408\u306fPHP\u3084DB\u7248\u3067\u5b9f\u88c5\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n                &lt;\/div>\n            &lt;\/form>\n        &lt;\/div>\n    &lt;\/div>\n&lt;\/div>\n\n&lt;div id=\"bottom\">&lt;\/div>\n\n&lt;script>\n(function() {\n    \"use strict\";\n\n    const STORAGE_KEY = \"nijiura_clone_threads_v1\";\n    const SETTINGS_KEY = \"nijiura_clone_settings_v1\";\n\n    \/\/ --------------------\n    \/\/ \u30c7\u30fc\u30bf\u69cb\u9020\n    \/\/ --------------------\n    \/\/ threads = &#91;\n    \/\/   {\n    \/\/     id: number,\n    \/\/     title: string,\n    \/\/     category: string,\n    \/\/     favorite: boolean,\n    \/\/     createdAt: string,\n    \/\/     updatedAt: string,\n    \/\/     posts: &#91;\n    \/\/       { id, name, body, createdAt, uid }\n    \/\/     ]\n    \/\/   }, ...\n    \/\/ ]\n    \/\/\n    \/\/ settings = {\n    \/\/   autoName: boolean,\n    \/\/   lastName: string\n    \/\/ }\n\n    let threads = loadThreads();\n    let settings = loadSettings();\n    let currentThreadId = null;\n    let currentSort = \"updated\"; \/\/ updated \/ created \/ id\n\n    const viewList = document.getElementById(\"view-list\");\n    const viewThread = document.getElementById(\"view-thread\");\n\n    const threadListEl = document.getElementById(\"thread-list\");\n    const threadTitleEl = document.getElementById(\"thread-title\");\n    const threadMetaEl = document.getElementById(\"thread-meta\");\n    const postsEl = document.getElementById(\"posts\");\n\n    const newThreadForm = document.getElementById(\"new-thread-form\");\n    const replyForm = document.getElementById(\"reply-form\");\n    const backToListBtn = document.getElementById(\"back-to-list\");\n\n    const searchInput = document.getElementById(\"search-input\");\n    const sortSelect = document.getElementById(\"sort-select\");\n    const categoryFilter = document.getElementById(\"category-filter\");\n    const favOnlyCheckbox = document.getElementById(\"fav-only\");\n\n    const statThreadsEl = document.getElementById(\"stat-threads\");\n    const statPostsEl = document.getElementById(\"stat-posts\");\n\n    const btnExport = document.getElementById(\"btn-export\");\n    const btnImport = document.getElementById(\"btn-import\");\n    const btnClear = document.getElementById(\"btn-clear\");\n    const backupText = document.getElementById(\"backup-text\");\n\n    const optAutoname = document.getElementById(\"opt-autoname\");\n    const settingLastName = document.getElementById(\"setting-last-name\");\n    const btnSaveSettings = document.getElementById(\"btn-save-settings\");\n\n    const newNameInput = document.getElementById(\"new-name\");\n    const newCategorySelect = document.getElementById(\"new-category\");\n    const replyNameInput = document.getElementById(\"reply-name\");\n    const replyBodyTextarea = document.getElementById(\"reply-body\");\n\n    \/\/ \u65e2\u5b58\u30c7\u30fc\u30bf\u306b\u30ab\u30c6\u30b4\u30ea\u30fb\u304a\u6c17\u306b\u5165\u308a\u30fbUID\u304c\u306a\u3051\u308c\u3070\u88dc\u5b8c\n    migrateThreads();\n\n    \/\/ \u521d\u671f\u30bd\u30fc\u30c8\uff06\u63cf\u753b\n    sortThreadsByUpdated();\n    applySettingsToUI();\n    renderThreadList();\n    showListView();\n\n    \/\/ --------------------\n    \/\/ \u30a4\u30d9\u30f3\u30c8: \u30b9\u30ec\u7acb\u3066\n    \/\/ --------------------\n    newThreadForm.addEventListener(\"submit\", function(e) {\n        e.preventDefault();\n        const formData = new FormData(newThreadForm);\n        let name = (formData.get(\"name\") || \"\").toString().trim();\n        const category = (formData.get(\"category\") || \"\u96d1\u8ac7\").toString();\n        const title = (formData.get(\"title\") || \"\").toString().trim();\n        const body = (formData.get(\"body\") || \"\").toString().trim();\n\n        if (!name) {\n            name = \"\u540d\u7121\u3057\";\n        }\n\n        if (!title || !body) {\n            alert(\"\u30bf\u30a4\u30c8\u30eb\u3068\u672c\u6587\u306f\u5fc5\u9808\u3067\u3059\u3002\");\n            return;\n        }\n\n        const now = getNowStr();\n        const newId = getNewThreadId();\n\n        const newThread = {\n            id: newId,\n            title: title,\n            category: category || \"\u96d1\u8ac7\",\n            favorite: false,\n            createdAt: now,\n            updatedAt: now,\n            posts: &#91;\n                {\n                    id: 1,\n                    name: name,\n                    body: body,\n                    createdAt: now,\n                    uid: generateUid(newId, 1, name, body, now)\n                }\n            ]\n        };\n\n        threads.push(newThread);\n        sortThreadsByUpdated();\n        saveThreads(threads);\n\n        \/\/ \u540d\u524d\u3092\u8a2d\u5b9a\u306b\u53cd\u6620\n        updateLastNameSetting(name);\n\n        newThreadForm.reset();\n        currentSort = \"updated\";\n        sortSelect.value = \"updated\";\n\n        openThread(newId);\n    });\n\n    \/\/ --------------------\n    \/\/ \u30a4\u30d9\u30f3\u30c8: \u30ec\u30b9\u6295\u7a3f\n    \/\/ --------------------\n    replyForm.addEventListener(\"submit\", function(e) {\n        e.preventDefault();\n        if (currentThreadId === null) return;\n\n        const formData = new FormData(replyForm);\n        let name = (formData.get(\"name\") || \"\").toString().trim();\n        const body = (formData.get(\"body\") || \"\").toString().trim();\n\n        if (!name) {\n            name = \"\u540d\u7121\u3057\";\n        }\n        if (!body) {\n            alert(\"\u672c\u6587\u306f\u5fc5\u9808\u3067\u3059\u3002\");\n            return;\n        }\n\n        const thread = threads.find(t => t.id === currentThreadId);\n        if (!thread) {\n            alert(\"\u30b9\u30ec\u30c3\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\");\n            return;\n        }\n\n        const now = getNowStr();\n        const newPostId = getNewPostId(thread);\n\n        thread.posts.push({\n            id: newPostId,\n            name: name,\n            body: body,\n            createdAt: now,\n            uid: generateUid(thread.id, newPostId, name, body, now)\n        });\n        thread.updatedAt = now;\n\n        sortThreadsByUpdated();\n        saveThreads(threads);\n\n        \/\/ \u540d\u524d\u3092\u8a2d\u5b9a\u306b\u53cd\u6620\n        updateLastNameSetting(name);\n\n        replyForm.reset();\n\n        renderThread(thread);\n        renderThreadList(); \/\/ \u66f4\u65b0\u65e5\u6642\u304c\u5909\u308f\u308b\u306e\u3067\u4e00\u89a7\u3082\u66f4\u65b0\n    });\n\n    \/\/ --------------------\n    \/\/ \u30a4\u30d9\u30f3\u30c8: \u4e00\u89a7\u306b\u623b\u308b\n    \/\/ --------------------\n    backToListBtn.addEventListener(\"click\", function() {\n        currentThreadId = null;\n        showListView();\n    });\n\n    \/\/ --------------------\n    \/\/ \u30a4\u30d9\u30f3\u30c8: \u4e26\u3073\u66ff\u3048\uff06\u691c\u7d22\uff06\u30d5\u30a3\u30eb\u30bf\n    \/\/ --------------------\n    sortSelect.addEventListener(\"change\", function() {\n        currentSort = this.value;\n        renderThreadList();\n    });\n\n    searchInput.addEventListener(\"input\", function() {\n        renderThreadList();\n    });\n\n    categoryFilter.addEventListener(\"change\", function() {\n        renderThreadList();\n    });\n\n    favOnlyCheckbox.addEventListener(\"change\", function() {\n        renderThreadList();\n    });\n\n    \/\/ --------------------\n    \/\/ \u30a4\u30d9\u30f3\u30c8: \u30c7\u30fc\u30bf\u30c4\u30fc\u30eb\n    \/\/ --------------------\n    btnExport.addEventListener(\"click\", function() {\n        try {\n            const json = JSON.stringify(threads, null, 2);\n            backupText.value = json;\n            alert(\"\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u3092JSON\u3068\u3057\u3066\u51fa\u529b\u3057\u307e\u3057\u305f\u3002\u5fc5\u8981\u306a\u3089\u30b3\u30d4\u30fc\u3057\u3066\u4fdd\u5b58\u3057\u3066\u304f\u3060\u3055\u3044\u3002\");\n        } catch (e) {\n            console.warn(\"export failed:\", e);\n            alert(\"\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\");\n        }\n    });\n\n    btnImport.addEventListener(\"click\", function() {\n        const text = backupText.value.trim();\n        if (!text) {\n            alert(\"\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308bJSON\u304c\u5165\u529b\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\");\n            return;\n        }\n        if (!confirm(\"\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u306eJSON\u3067\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u3092\u4e0a\u66f8\u304d\u3057\u307e\u3059\u3002\u3088\u308d\u3057\u3044\u3067\u3059\u304b\uff1f\")) {\n            return;\n        }\n        try {\n            const data = JSON.parse(text);\n            if (!Array.isArray(data)) {\n                alert(\"JSON\u306e\u5f62\u5f0f\u304c\u4e0d\u6b63\u3067\u3059\u3002\uff08\u914d\u5217\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff09\");\n                return;\n            }\n            threads = data;\n            migrateThreads(); \/\/ \u65b0\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u88dc\u5b8c\n            sortThreadsByUpdated();\n            saveThreads(threads);\n            currentThreadId = null;\n            showListView();\n            alert(\"\u30a4\u30f3\u30dd\u30fc\u30c8\u306b\u6210\u529f\u3057\u307e\u3057\u305f\u3002\");\n        } catch (e) {\n            console.warn(\"import failed:\", e);\n            alert(\"JSON\u306e\u89e3\u6790\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u5f62\u5f0f\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\");\n        }\n    });\n\n    btnClear.addEventListener(\"click\", function() {\n        if (!confirm(\"\u672c\u5f53\u306b\u5168\u30c7\u30fc\u30bf\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f\uff08\u53d6\u308a\u6d88\u3057\u3067\u304d\u307e\u305b\u3093\uff09\")) {\n            return;\n        }\n        try {\n            localStorage.removeItem(STORAGE_KEY);\n        } catch (e) {\n            console.warn(\"clear failed:\", e);\n        }\n        threads = &#91;];\n        currentThreadId = null;\n        renderThreadList();\n        showListView();\n        alert(\"\u5168\u30c7\u30fc\u30bf\u3092\u524a\u9664\u3057\u307e\u3057\u305f\u3002\");\n    });\n\n    \/\/ --------------------\n    \/\/ \u30a4\u30d9\u30f3\u30c8: \u8a2d\u5b9a\n    \/\/ --------------------\n    btnSaveSettings.addEventListener(\"click\", function() {\n        const autoName = !!optAutoname.checked;\n        const lastName = (settingLastName.value || \"\").toString().trim() || \"\u540d\u7121\u3057\";\n        settings.autoName = autoName;\n        settings.lastName = lastName;\n        saveSettings(settings);\n        applySettingsToUI();\n        alert(\"\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3057\u307e\u3057\u305f\u3002\");\n    });\n\n    \/\/ --------------------\n    \/\/ \u30a4\u30d9\u30f3\u30c8: \u30ec\u30b9\u756a\u30af\u30ea\u30c3\u30af\uff08>>\u30a2\u30f3\u30ab\u30fc\u633f\u5165\uff09\n    \/\/ --------------------\n    postsEl.addEventListener(\"click\", function(e) {\n        const target = e.target;\n        if (target &amp;&amp; target.classList.contains(\"post-no-link\")) {\n            e.preventDefault();\n            const no = target.getAttribute(\"data-no\");\n            if (!no) return;\n            insertAnchorToReply(\">>\" + no + \"\\n\");\n        }\n    });\n\n    \/\/ --------------------\n    \/\/ \u30d3\u30e5\u30fc\u5207\u66ff\n    \/\/ --------------------\n    function showListView() {\n        viewList.classList.remove(\"hidden\");\n        viewThread.classList.add(\"hidden\");\n        renderThreadList();\n    }\n\n    function showThreadView() {\n        viewList.classList.add(\"hidden\");\n        viewThread.classList.remove(\"hidden\");\n    }\n\n    \/\/ --------------------\n    \/\/ \u30ec\u30f3\u30c0\u30ea\u30f3\u30b0: \u4e00\u89a7\n    \/\/ --------------------\n    function renderThreadList() {\n        updateStats();\n\n        if (!threads.length) {\n            threadListEl.innerHTML = \"&lt;p>\u307e\u3060\u30b9\u30ec\u30c3\u30c9\u306f\u3042\u308a\u307e\u305b\u3093\u3002&lt;\/p>\";\n            return;\n        }\n\n        const query = (searchInput.value || \"\").toString().trim();\n        const filterCategory = (categoryFilter.value || \"\").toString();\n        const favOnly = !!favOnlyCheckbox.checked;\n\n        let list = threads.slice();\n\n        \/\/ \u691c\u7d22\n        if (query) {\n            list = list.filter(function(t) {\n                const q = query;\n                if (t.title &amp;&amp; t.title.indexOf(q) !== -1) return true;\n                if (Array.isArray(t.posts)) {\n                    return t.posts.some(function(p) {\n                        return p.body &amp;&amp; p.body.indexOf(q) !== -1;\n                    });\n                }\n                return false;\n            });\n        }\n\n        \/\/ \u30ab\u30c6\u30b4\u30ea\u30d5\u30a3\u30eb\u30bf\n        if (filterCategory) {\n            list = list.filter(function(t) {\n                return (t.category || \"\u96d1\u8ac7\") === filterCategory;\n            });\n        }\n\n        \/\/ \u304a\u6c17\u306b\u5165\u308a\u306e\u307f\n        if (favOnly) {\n            list = list.filter(function(t) {\n                return !!t.favorite;\n            });\n        }\n\n        \/\/ \u4e26\u3073\u66ff\u3048\n        if (currentSort === \"created\") {\n            list.sort(function(a, b) {\n                if (a.createdAt &lt; b.createdAt) return 1;\n                if (a.createdAt > b.createdAt) return -1;\n                return 0;\n            });\n        } else if (currentSort === \"id\") {\n            list.sort(function(a, b) {\n                return b.id - a.id; \/\/ \u65b0\u3057\u3044\u756a\u53f7\u304c\u4e0a\n            });\n        } else {\n            \/\/ \u66f4\u65b0\u9806\u306f threads \u81ea\u4f53\u3092 sortThreadsByUpdated \u3067\u7ba1\u7406\u3057\u3066\u3044\u308b\u306e\u3067\u305d\u306e\u307e\u307e\n            \/\/ \u305f\u3060\u3057\u30d5\u30a3\u30eb\u30bf\u30fb\u691c\u7d22\u5f8c\u3082\u9806\u5e8f\u3092\u7dad\u6301\u3059\u308b\u3060\u3051\n            list.sort(function(a, b) {\n                if (a.updatedAt &lt; b.updatedAt) return 1;\n                if (a.updatedAt > b.updatedAt) return -1;\n                return 0;\n            });\n        }\n\n        if (!list.length) {\n            threadListEl.innerHTML = \"&lt;p>\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30b9\u30ec\u30c3\u30c9\u306f\u3042\u308a\u307e\u305b\u3093\u3002&lt;\/p>\";\n            return;\n        }\n\n        let html = \"\";\n        list.forEach(function(t) {\n            const cat = t.category || \"\u96d1\u8ac7\";\n            const fav = !!t.favorite;\n            const favClass = fav ? \"fav-true\" : \"fav-false\";\n            const favSymbol = fav ? \"\u2605\" : \"\u2606\";\n\n            html += `\n                &lt;div class=\"thread-item\">\n                    &lt;span class=\"fav-toggle ${favClass}\" data-thread-id=\"${t.id}\" title=\"\u304a\u6c17\u306b\u5165\u308a\u5207\u308a\u66ff\u3048\">${favSymbol}&lt;\/span>\n                    &lt;div class=\"thread-main\">\n                        &lt;span class=\"thread-title\">\n                            &lt;span class=\"thread-category\">&#91;${escapeHtml(cat)}]&lt;\/span>\n                            &lt;a data-thread-id=\"${t.id}\" class=\"thread-link\">\n                                ${escapeHtml(t.title)}\n                            &lt;\/a>\n                        &lt;\/span>&lt;br>\n                        &lt;span class=\"meta\">\n                            No.${t.id} \/ \u4f5c\u6210\uff1a${escapeHtml(t.createdAt)} \/\n                            \u6700\u7d42\u66f4\u65b0\uff1a${escapeHtml(t.updatedAt)} \/\n                            \u30ec\u30b9\uff1a${t.posts ? t.posts.length : 0}\n                        &lt;\/span>\n                    &lt;\/div>\n                &lt;\/div>\n            `;\n        });\n        threadListEl.innerHTML = html;\n\n        \/\/ \u30b9\u30ec\u30c3\u30c9\u30ea\u30f3\u30af\u30a4\u30d9\u30f3\u30c8\n        const links = threadListEl.querySelectorAll(\".thread-link\");\n        links.forEach(function(link) {\n            link.addEventListener(\"click\", function() {\n                const id = parseInt(this.getAttribute(\"data-thread-id\"), 10);\n                openThread(id);\n            });\n        });\n\n        \/\/ \u304a\u6c17\u306b\u5165\u308a\u5207\u308a\u66ff\u3048\u30a4\u30d9\u30f3\u30c8\n        const favToggles = threadListEl.querySelectorAll(\".fav-toggle\");\n        favToggles.forEach(function(btn) {\n            btn.addEventListener(\"click\", function() {\n                const id = parseInt(this.getAttribute(\"data-thread-id\"), 10);\n                toggleFavorite(id, this);\n            });\n        });\n    }\n\n    \/\/ --------------------\n    \/\/ \u30ec\u30f3\u30c0\u30ea\u30f3\u30b0: \u500b\u5225\u30b9\u30ec\n    \/\/ --------------------\n    function renderThread(thread) {\n        currentThreadId = thread.id;\n\n        const cat = thread.category || \"\u96d1\u8ac7\";\n        threadTitleEl.textContent = \"&#91;\" + cat + \"] \" + thread.title;\n        threadMetaEl.textContent =\n            \"\u30b9\u30ec\u756a\u53f7\uff1a\" + thread.id +\n            \"\u3000\u4f5c\u6210\uff1a\" + thread.createdAt +\n            \"\u3000\u6700\u7d42\u66f4\u65b0\uff1a\" + thread.updatedAt +\n            \"\u3000\u30ec\u30b9\u6570\uff1a\" + (thread.posts ? thread.posts.length : 0);\n\n        if (!thread.posts || !thread.posts.length) {\n            postsEl.innerHTML = \"&lt;p>\u307e\u3060\u30ec\u30b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002&lt;\/p>\";\n            return;\n        }\n\n        let html = \"\";\n        thread.posts.forEach(function(p) {\n            const uid = p.uid || generateUid(thread.id, p.id, p.name, p.body, p.createdAt);\n            html += `\n                &lt;div class=\"post\">\n                    &lt;div class=\"post-header\">\n                        &lt;a href=\"#\" class=\"post-no-link\" data-no=\"${p.id}\">No.${p.id}&lt;\/a>\n                        \u540d\u524d\uff1a${escapeHtml(p.name)}\u3000\n                        \u6295\u7a3f\u65e5\uff1a${escapeHtml(p.createdAt)}\u3000\n                        ID\uff1a&lt;span class=\"post-id\">${escapeHtml(uid)}&lt;\/span>\n                    &lt;\/div>\n                    &lt;div class=\"post-body\">\n                        ${escapeHtml(p.body).replace(\/\\n\/g, \"&lt;br>\")}\n                    &lt;\/div>\n                &lt;\/div>\n            `;\n        });\n        postsEl.innerHTML = html;\n\n        \/\/ \u81ea\u52d5\u540d\u524d\u53cd\u6620\n        applyAutoNameToReply();\n    }\n\n    function openThread(id) {\n        const thread = threads.find(t => t.id === id);\n        if (!thread) {\n            alert(\"\u30b9\u30ec\u30c3\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\");\n            return;\n        }\n        renderThread(thread);\n        showThreadView();\n    }\n\n    \/\/ --------------------\n    \/\/ \u304a\u6c17\u306b\u5165\u308a\u5207\u308a\u66ff\u3048\n    \/\/ --------------------\n    function toggleFavorite(threadId, element) {\n        const thread = threads.find(t => t.id === threadId);\n        if (!thread) return;\n        thread.favorite = !thread.favorite;\n        saveThreads(threads);\n\n        const fav = !!thread.favorite;\n        element.textContent = fav ? \"\u2605\" : \"\u2606\";\n        element.classList.toggle(\"fav-true\", fav);\n        element.classList.toggle(\"fav-false\", !fav);\n    }\n\n    \/\/ --------------------\n    \/\/ \u30b9\u30c8\u30ec\u30fc\u30b8\u64cd\u4f5c\n    \/\/ --------------------\n    function loadThreads() {\n        try {\n            const raw = localStorage.getItem(STORAGE_KEY);\n            if (!raw) return &#91;];\n            const data = JSON.parse(raw);\n            if (!Array.isArray(data)) return &#91;];\n            return data;\n        } catch (e) {\n            console.warn(\"failed to load threads:\", e);\n            return &#91;];\n        }\n    }\n\n    function saveThreads(data) {\n        try {\n            localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n        } catch (e) {\n            console.warn(\"failed to save threads:\", e);\n            alert(\"\u4fdd\u5b58\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002localStorage\u5bb9\u91cf\u30aa\u30fc\u30d0\u30fc\u306e\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\");\n        }\n    }\n\n    function loadSettings() {\n        try {\n            const raw = localStorage.getItem(SETTINGS_KEY);\n            if (!raw) {\n                return {\n                    autoName: false,\n                    lastName: \"\u540d\u7121\u3057\"\n                };\n            }\n            const data = JSON.parse(raw);\n            if (!data || typeof data !== \"object\") {\n                return {\n                    autoName: false,\n                    lastName: \"\u540d\u7121\u3057\"\n                };\n            }\n            if (typeof data.autoName !== \"boolean\") {\n                data.autoName = false;\n            }\n            if (typeof data.lastName !== \"string\") {\n                data.lastName = \"\u540d\u7121\u3057\";\n            }\n            return data;\n        } catch (e) {\n            console.warn(\"failed to load settings:\", e);\n            return {\n                autoName: false,\n                lastName: \"\u540d\u7121\u3057\"\n            };\n        }\n    }\n\n    function saveSettings(data) {\n        try {\n            localStorage.setItem(SETTINGS_KEY, JSON.stringify(data));\n        } catch (e) {\n            console.warn(\"failed to save settings:\", e);\n        }\n    }\n\n    \/\/ --------------------\n    \/\/ \u7d71\u8a08\u66f4\u65b0\n    \/\/ --------------------\n    function updateStats() {\n        statThreadsEl.textContent = threads.length;\n        let totalPosts = 0;\n        threads.forEach(function(t) {\n            if (Array.isArray(t.posts)) {\n                totalPosts += t.posts.length;\n            }\n        });\n        statPostsEl.textContent = totalPosts;\n    }\n\n    \/\/ --------------------\n    \/\/ ID\u30fb\u65e5\u4ed8\u30fb\u30a8\u30b9\u30b1\u30fc\u30d7\n    \/\/ --------------------\n    function getNewThreadId() {\n        if (!threads.length) return 1;\n        const ids = threads.map(function(t) { return t.id; });\n        return Math.max.apply(null, ids) + 1;\n    }\n\n    function getNewPostId(thread) {\n        if (!thread.posts || !thread.posts.length) return 1;\n        const ids = thread.posts.map(function(p) { return p.id; });\n        return Math.max.apply(null, ids) + 1;\n    }\n\n    function getNowStr() {\n        const d = new Date();\n        const y = d.getFullYear();\n        const m = (\"0\" + (d.getMonth() + 1)).slice(-2);\n        const day = (\"0\" + d.getDate()).slice(-2);\n        const h = (\"0\" + d.getHours()).slice(-2);\n        const min = (\"0\" + d.getMinutes()).slice(-2);\n        const s = (\"0\" + d.getSeconds()).slice(-2);\n        return y + \"\/\" + m + \"\/\" + day + \" \" + h + \":\" + min + \":\" + s;\n    }\n\n    function escapeHtml(str) {\n        return String(str)\n            .replace(\/&amp;\/g, \"&amp;amp;\")\n            .replace(\/&lt;\/g, \"&amp;lt;\")\n            .replace(\/>\/g, \"&amp;gt;\")\n            .replace(\/\"\/g, \"&amp;quot;\")\n            .replace(\/'\/g, \"&amp;#39;\");\n    }\n\n    \/\/ \u7c21\u6613\u30cf\u30c3\u30b7\u30e5\u3067UID\u3092\u751f\u6210\uff088\u684116\u9032\uff09\n    function generateUid(threadId, postId, name, body, createdAt) {\n        const src = String(threadId) + \":\" + String(postId) + \":\" +\n                    String(name) + \":\" + String(body) + \":\" + String(createdAt);\n        let hash = 0;\n        for (let i = 0; i &lt; src.length; i++) {\n            hash = ((hash &lt;&lt; 5) - hash) + src.charCodeAt(i);\n            hash |= 0; \/\/ 32bit\n        }\n        \/\/ \u7b26\u53f7\u3092\u5916\u3059\n        if (hash &lt; 0) {\n            hash = ~hash + 1;\n        }\n        let hex = hash.toString(16);\n        if (hex.length &lt; 8) {\n            hex = (\"00000000\" + hex).slice(-8);\n        } else if (hex.length > 8) {\n            hex = hex.slice(-8);\n        }\n        return hex;\n    }\n\n    \/\/ --------------------\n    \/\/ \u30bd\u30fc\u30c8\n    \/\/ --------------------\n    function sortThreadsByUpdated() {\n        threads.sort(function(a, b) {\n            if (a.updatedAt &lt; b.updatedAt) return 1;\n            if (a.updatedAt > b.updatedAt) return -1;\n            return 0;\n        });\n    }\n\n    \/\/ --------------------\n    \/\/ \u8a2d\u5b9a\u9069\u7528\n    \/\/ --------------------\n    function applySettingsToUI() {\n        optAutoname.checked = !!settings.autoName;\n        settingLastName.value = settings.lastName || \"\u540d\u7121\u3057\";\n\n        if (settings.autoName) {\n            if (newNameInput) newNameInput.value = settings.lastName || \"\u540d\u7121\u3057\";\n            if (replyNameInput) replyNameInput.value = settings.lastName || \"\u540d\u7121\u3057\";\n        }\n    }\n\n    function applyAutoNameToReply() {\n        if (settings.autoName) {\n            replyNameInput.value = settings.lastName || \"\u540d\u7121\u3057\";\n        }\n    }\n\n    function updateLastNameSetting(name) {\n        settings.lastName = name || \"\u540d\u7121\u3057\";\n        if (settings.autoName) {\n            \/\/ UI\u3078\u5373\u6642\u53cd\u6620\n            settingLastName.value = settings.lastName;\n            if (newNameInput) newNameInput.value = settings.lastName;\n            if (replyNameInput) replyNameInput.value = settings.lastName;\n        }\n        saveSettings(settings);\n    }\n\n    \/\/ --------------------\n    \/\/ \u30ec\u30b9\u756a\u30a2\u30f3\u30ab\u30fc\u633f\u5165\n    \/\/ --------------------\n    function insertAnchorToReply(text) {\n        replyBodyTextarea.focus();\n        const start = replyBodyTextarea.selectionStart;\n        const end = replyBodyTextarea.selectionEnd;\n        const value = replyBodyTextarea.value;\n        replyBodyTextarea.value = value.slice(0, start) + text + value.slice(end);\n        \/\/ \u30ad\u30e3\u30ec\u30c3\u30c8\u4f4d\u7f6e\u3092\u633f\u5165\u3057\u305f\u30c6\u30ad\u30b9\u30c8\u306e\u5f8c\u308d\u306b\n        const pos = start + text.length;\n        replyBodyTextarea.selectionStart = replyBodyTextarea.selectionEnd = pos;\n    }\n\n    \/\/ --------------------\n    \/\/ \u65e2\u5b58\u30c7\u30fc\u30bf\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\n    \/\/ --------------------\n    function migrateThreads() {\n        threads.forEach(function(t) {\n            if (!t.category) {\n                t.category = \"\u96d1\u8ac7\";\n            }\n            if (typeof t.favorite !== \"boolean\") {\n                t.favorite = false;\n            }\n            if (!Array.isArray(t.posts)) {\n                t.posts = &#91;];\n            }\n            t.posts.forEach(function(p) {\n                if (!p.uid) {\n                    p.uid = generateUid(t.id, p.id, p.name || \"\u540d\u7121\u3057\", p.body || \"\", p.createdAt || \"\");\n                }\n            });\n        });\n        saveThreads(threads);\n    }\n})();\n&lt;\/script>\n&lt;\/body>\n&lt;\/html><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>tyosuke20xx.com\/nijiura.html<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[87],"tags":[],"class_list":["post-26227","post","type-post","status-publish","format-standard","hentry","category-web"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/26227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=26227"}],"version-history":[{"count":1,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/26227\/revisions"}],"predecessor-version":[{"id":26228,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/26227\/revisions\/26228"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=26227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=26227"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=26227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}