{"id":25869,"date":"2025-02-22T18:30:39","date_gmt":"2025-02-22T09:30:39","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25869"},"modified":"2025-02-22T18:30:40","modified_gmt":"2025-02-22T09:30:40","slug":"minisns-html","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25869","title":{"rendered":"minisns.html"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html><br>&lt;html lang=\"ja\"><br>&lt;head><br>  &lt;meta charset=\"UTF-8\"><br>  &lt;title>\u30b9\u30d5\u30a3\u30a2&lt;\/title><br>  &lt;style><br>    \/* ======= \u57fa\u672c\u30ea\u30bb\u30c3\u30c8 ======= *\/<br>    * { margin: 0; padding: 0; box-sizing: border-box; }<br>    body { font-family: Arial, sans-serif; background: #f7f9fc; color: #333; line-height: 1.5; }<br>    header { background: #4a90e2; color: #fff; padding: 15px; text-align: center; }<br>    header h1 { font-size: 28px; }<br>    main { width: 90%; max-width: 800px; margin: 20px auto; }<br>    \/* ======= \u30e6\u30fc\u30b6\u30fc\u30a2\u30a4\u30b3\u30f3 ======= *\/<br>    .user-icon { width: 40px; height: 40px; border-radius: 50%; margin-right: 10px; vertical-align: middle; }<br>    \/* ======= \u8a8d\u8a3c\u30bb\u30af\u30b7\u30e7\u30f3 ======= *\/<br>    .auth-section { background: #fff; padding: 15px; border-radius: 8px; margin-bottom: 20px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }<br>    .auth-section h2 { margin-bottom: 10px; }<br>    .auth-section input { width: 100%; padding: 8px; margin-bottom: 10px; border: 1px solid #ccc; border-radius: 4px; }<br>    .auth-section button { background: #4a90e2; color: #fff; border: none; padding: 8px 12px; border-radius: 4px; cursor: pointer; }<br>    .auth-section button:hover { background: #357ab8; }<br>    .toggle-auth { margin-top: 10px; font-size: 14px; color: #4a90e2; cursor: pointer; text-decoration: underline; }<br>    \/* ======= \u6295\u7a3f\u30d5\u30a9\u30fc\u30e0 ======= *\/<br>    .post-form { background: #fff; padding: 15px; margin-bottom: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }<br>    .post-form textarea { width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 4px; resize: vertical; font-size: 14px; }<br>    .post-form button { background: #4a90e2; color: #fff; border: none; padding: 8px 12px; border-radius: 4px; cursor: pointer; margin-top: 10px; }<br>    .post-form button:hover { background: #357ab8; }<br>    \/* ======= \u691c\u7d22\u30bb\u30af\u30b7\u30e7\u30f3 ======= *\/<br>    .search-section { background: #fff; padding: 10px; margin-bottom: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }<br>    .search-section input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; font-size: 14px; }<br>    \/* ======= \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3 ======= *\/<br>    .timeline { display: flex; flex-direction: column; gap: 15px; }<br>    .post-item { background: #fff; padding: 15px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); position: relative; }<br>    .post-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }<br>    .post-username { font-weight: bold; }<br>    .post-meta { font-size: 12px; color: #777; }<br>    .post-content { font-size: 16px; margin-bottom: 10px; }<br>    .post-actions { margin-top: 10px; }<br>    .post-actions button { background: transparent; border: none; color: #4a90e2; cursor: pointer; margin-right: 10px; font-size: 14px; }<br>    .post-actions button:hover { text-decoration: underline; }<br>    .replies { margin-top: 15px; border-top: 1px solid #eee; padding-top: 10px; }<br>    .reply-item { background: #f2f2f2; padding: 10px; border-radius: 6px; margin-bottom: 10px; }<br>    .reply-header { font-size: 13px; font-weight: bold; margin-bottom: 5px; }<br>    .reply-meta { font-size: 11px; color: #555; text-align: right; }<br>    .edit-area { margin-top: 10px; }<br>    .edit-area textarea { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; }<br>    .edit-area button { background: #4a90e2; color: #fff; border: none; padding: 6px 10px; border-radius: 4px; cursor: pointer; margin-top: 5px; }<br>    .edit-area button:hover { background: #357ab8; }<br>    \/* ======= \u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\uff08\u30ed\u30b0\uff0fRSS\uff09\u30bb\u30af\u30b7\u30e7\u30f3 ======= *\/<br>    .utility-section { margin-top: 20px; text-align: center; }<br>    .logs-section { background: #fff; padding: 15px; margin-top: 10px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); font-size: 12px; color: #555; max-height: 200px; overflow-y: auto; }<br>    .log-entry { border-bottom: 1px solid #eee; padding: 5px 0; }<br>    footer { text-align: center; padding: 15px; font-size: 14px; color: #777; margin-top: 20px; }<br>  &lt;\/style><br>&lt;\/head><br>&lt;body><br>  &lt;header><br>    &lt;h1>\u30b9\u30d5\u30a3\u30a2&lt;\/h1><br>  &lt;\/header><br>  &lt;main><br>    &lt;!-- \u8a8d\u8a3c\u30bb\u30af\u30b7\u30e7\u30f3\uff08\u30ed\u30b0\u30a4\u30f3\uff0f\u767b\u9332 or \u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u8868\u793a\uff09 --><br>    &lt;section id=\"authSection\" class=\"auth-section\">&lt;\/section><br>    &lt;!-- \u6295\u7a3f\u30d5\u30a9\u30fc\u30e0\uff08\u30ed\u30b0\u30a4\u30f3\u4e2d\u306e\u307f\u8868\u793a\uff09 --><br>    &lt;section id=\"postFormSection\" class=\"post-form\" style=\"display: none;\"><br>      &lt;textarea id=\"postContent\" placeholder=\"\u3044\u307e\u3069\u3046\u3057\u3066\u308b\uff1f\">&lt;\/textarea><br>      &lt;button id=\"postButton\">\u6295\u7a3f\u3059\u308b&lt;\/button><br>    &lt;\/section><br>    &lt;!-- \u691c\u7d22\u30bb\u30af\u30b7\u30e7\u30f3 --><br>    &lt;section class=\"search-section\"><br>      &lt;input type=\"text\" id=\"searchInput\" placeholder=\"\u6295\u7a3f\u3092\u691c\u7d22\"><br>    &lt;\/section><br>    &lt;!-- \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3 --><br>    &lt;section id=\"timeline\" class=\"timeline\">&lt;\/section><br>    &lt;!-- \u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\uff1a\u30ed\u30b0\u8868\u793a\uff0fRSS\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 --><br>    &lt;section class=\"utility-section\"><br>      &lt;button id=\"toggleLogsButton\">\u30ed\u30b0\u3092\u8868\u793a&lt;\/button><br>      &lt;button id=\"downloadRSSButton\">RSS\u30d5\u30a3\u30fc\u30c9\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9&lt;\/button><br>    &lt;\/section><br>    &lt;!-- \u30ed\u30b0\u8868\u793a\u30bb\u30af\u30b7\u30e7\u30f3\uff08\u521d\u671f\u306f\u975e\u8868\u793a\uff09 --><br>    &lt;section id=\"logsSection\" class=\"logs-section\" style=\"display: none;\">&lt;\/section><br>  &lt;\/main><br>  &lt;footer><br>    &lt;p>&amp;copy; 2023 \u30b9\u30d5\u30a3\u30a2&lt;\/p><br>  &lt;\/footer><br>  &lt;script><br>    (function(){<br>      'use strict';<br><br>      \/\/ === \u5b9a\u6570\uff06\u30ad\u30fc\u5b9a\u7fa9 ===<br>      const POSTS_KEY = 'posts';<br>      const USERS_KEY = 'users';<br>      const CURRENT_USER_KEY = 'currentUser';<br>      const LOGS_KEY = 'logs';<br><br>      \/\/ === \u30c7\u30fc\u30bf\u7ba1\u7406\u5909\u6570 ===<br>      let posts = &#91;];<br>      let users = &#91;];<br>      let currentUser = null;<br>      let logs = &#91;];<br><br>      \/\/ === \u30b9\u30c8\u30ec\u30fc\u30b8\u95a2\u9023\u95a2\u6570 ===<br>      const saveToStorage = (key, data) => localStorage.setItem(key, JSON.stringify(data));<br>      const loadFromStorage = (key) => {<br>        const stored = localStorage.getItem(key);<br>        return stored ? JSON.parse(stored) : null;<br>      };<br><br>      const loadData = () => {<br>        posts = loadFromStorage(POSTS_KEY) || &#91;];<br>        users = loadFromStorage(USERS_KEY) || &#91;];<br>        currentUser = loadFromStorage(CURRENT_USER_KEY) || null;<br>        logs = loadFromStorage(LOGS_KEY) || &#91;];<br>      };<br><br>      const saveData = () => {<br>        saveToStorage(POSTS_KEY, posts);<br>        saveToStorage(USERS_KEY, users);<br>        saveToStorage(CURRENT_USER_KEY, currentUser);<br>        saveToStorage(LOGS_KEY, logs);<br>      };<br><br>      \/\/ === \u30ed\u30b0\u51e6\u7406 ===<br>      const addLog = (message) => {<br>        const entry = { timestamp: new Date(), message };<br>        logs.push(entry);<br>        saveToStorage(LOGS_KEY, logs);<br>      };<br><br>      const renderLogs = () => {<br>        const logsSection = document.getElementById('logsSection');<br>        logsSection.innerHTML = '';<br>        logs.forEach(log => {<br>          const div = document.createElement('div');<br>          div.className = 'log-entry';<br>          div.textContent = `&#91;${formatDate(log.timestamp)}] ${log.message}`;<br>          logsSection.appendChild(div);<br>        });<br>      };<br><br>      \/\/ === \u65e5\u4ed8\u30d5\u30a9\u30fc\u30de\u30c3\u30c8 ===<br>      const formatDate = (date) => {<br>        const d = new Date(date);<br>        const y = d.getFullYear();<br>        const m = String(d.getMonth() + 1).padStart(2, '0');<br>        const day = String(d.getDate()).padStart(2, '0');<br>        const h = String(d.getHours()).padStart(2, '0');<br>        const min = String(d.getMinutes()).padStart(2, '0');<br>        return `${y}-${m}-${day} ${h}:${min}`;<br>      };<br><br>      \/\/ === RSS\u751f\u6210 ===<br>      const generateRSS = () => {<br>        const now = new Date();<br>        let rss = `&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n`;<br>        rss += `&lt;rss version=\"2.0\">\\n&lt;channel>\\n`;<br>        rss += `&lt;title>Advanced Mini SNS RSS Feed&lt;\/title>\\n`;<br>        rss += `&lt;link>${location.origin + location.pathname}&lt;\/link>\\n`;<br>        rss += `&lt;description>RSS Feed of posts from Advanced Mini SNS&lt;\/description>\\n`;<br>        rss += `&lt;lastBuildDate>${now.toUTCString()}&lt;\/lastBuildDate>\\n`;<br>        rss += `&lt;language>ja&lt;\/language>\\n`;<br>        posts.forEach(post => {<br>          const postUrl = `${location.origin + location.pathname}?post=${post.id}`;<br>          const title = `Post by ${post.username}: ${post.content.substring(0,20)}...`;<br>          rss += `&lt;item>\\n`;<br>          rss += `&lt;title>${title}&lt;\/title>\\n`;<br>          rss += `&lt;link>${postUrl}&lt;\/link>\\n`;<br>          rss += `&lt;description>&lt;!&#91;CDATA&#91;${post.content}]]>&lt;\/description>\\n`;<br>          rss += `&lt;pubDate>${new Date(post.timestamp).toUTCString()}&lt;\/pubDate>\\n`;<br>          rss += `&lt;guid>${post.id}&lt;\/guid>\\n`;<br>          rss += `&lt;\/item>\\n`;<br>        });<br>        rss += `&lt;\/channel>\\n&lt;\/rss>`;<br>        return rss;<br>      };<br><br>      const downloadRSS = () => {<br>        const rssContent = generateRSS();<br>        const blob = new Blob(&#91;rssContent], { type: 'application\/rss+xml' });<br>        const url = URL.createObjectURL(blob);<br>        const a = document.createElement('a');<br>        a.href = url;<br>        a.download = 'feed.xml';<br>        a.click();<br>        URL.revokeObjectURL(url);<br>        addLog('RSS\u30d5\u30a3\u30fc\u30c9\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9');<br>      };<br><br>      \/\/ === \u8a8d\u8a3c\u51e6\u7406 ===<br>      const renderAuthSection = () => {<br>        const authSection = document.getElementById('authSection');<br>        authSection.innerHTML = '';<br>        if (currentUser) {<br>          \/\/ \u30ed\u30b0\u30a4\u30f3\u6e08\u307f\uff1a\u30a2\u30a4\u30b3\u30f3\u3068\u30a6\u30a7\u30eb\u30ab\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u3001\u30ed\u30b0\u30a2\u30a6\u30c8\u30dc\u30bf\u30f3<br>          const container = document.createElement('div');<br>          if (currentUser.icon) {<br>            const img = document.createElement('img');<br>            img.src = currentUser.icon;<br>            img.className = 'user-icon';<br>            container.appendChild(img);<br>          }<br>          const welcomeDiv = document.createElement('span');<br>          welcomeDiv.textContent = `\u3088\u3046\u3053\u305d\u3001${currentUser.username} \u3055\u3093\uff01`;<br>          container.appendChild(welcomeDiv);<br>          const logoutBtn = document.createElement('button');<br>          logoutBtn.textContent = '\u30ed\u30b0\u30a2\u30a6\u30c8';<br>          logoutBtn.onclick = () => {<br>            addLog(`\u30e6\u30fc\u30b6\u30fc ${currentUser.username} \u30ed\u30b0\u30a2\u30a6\u30c8`);<br>            currentUser = null;<br>            saveData();<br>            renderAuthSection();<br>            togglePostForm();<br>            renderTimeline();<br>          };<br>          authSection.appendChild(container);<br>          authSection.appendChild(logoutBtn);<br>        } else {<br>          \/\/ \u672a\u30ed\u30b0\u30a4\u30f3\uff1a\u30ed\u30b0\u30a4\u30f3\u30d5\u30a9\u30fc\u30e0\u3092\u8868\u793a<br>          renderLoginForm(authSection);<br>        }<br>      };<br><br>      const renderLoginForm = (container) => {<br>        container.innerHTML = '&lt;h2>\u30ed\u30b0\u30a4\u30f3&lt;\/h2>';<br>        const usernameInput = document.createElement('input');<br>        usernameInput.type = 'text';<br>        usernameInput.placeholder = '\u30e6\u30fc\u30b6\u30fc\u540d';<br>        const passwordInput = document.createElement('input');<br>        passwordInput.type = 'password';<br>        passwordInput.placeholder = '\u30d1\u30b9\u30ef\u30fc\u30c9';<br>        const loginBtn = document.createElement('button');<br>        loginBtn.textContent = '\u30ed\u30b0\u30a4\u30f3';<br>        loginBtn.onclick = () => {<br>          const username = usernameInput.value.trim();<br>          const password = passwordInput.value;<br>          if (!username || !password) { alert('\u30e6\u30fc\u30b6\u30fc\u540d\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002'); return; }<br>          const user = users.find(u => u.username === username &amp;&amp; u.password === password);<br>          if (user) {<br>            currentUser = user;<br>            saveData();<br>            addLog(`\u30e6\u30fc\u30b6\u30fc ${username} \u30ed\u30b0\u30a4\u30f3\u6210\u529f`);<br>            renderAuthSection();<br>            togglePostForm();<br>            renderTimeline();<br>          } else {<br>            alert('\u30e6\u30fc\u30b6\u30fc\u540d\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002');<br>          }<br>        };<br>        container.appendChild(usernameInput);<br>        container.appendChild(passwordInput);<br>        container.appendChild(loginBtn);<br>        const toggleLink = document.createElement('div');<br>        toggleLink.className = 'toggle-auth';<br>        toggleLink.textContent = '\u65b0\u898f\u767b\u9332\u306f\u3053\u3061\u3089';<br>        toggleLink.onclick = () => renderRegisterForm(container);<br>        container.appendChild(toggleLink);<br>      };<br><br>      const renderRegisterForm = (container) => {<br>        container.innerHTML = '&lt;h2>\u65b0\u898f\u767b\u9332&lt;\/h2>';<br>        const usernameInput = document.createElement('input');<br>        usernameInput.type = 'text';<br>        usernameInput.placeholder = '\u30e6\u30fc\u30b6\u30fc\u540d';<br>        const passwordInput = document.createElement('input');<br>        passwordInput.type = 'password';<br>        passwordInput.placeholder = '\u30d1\u30b9\u30ef\u30fc\u30c9';<br>        const confirmInput = document.createElement('input');<br>        confirmInput.type = 'password';<br>        confirmInput.placeholder = '\u30d1\u30b9\u30ef\u30fc\u30c9\u78ba\u8a8d';<br>        \/\/ \u30a2\u30a4\u30b3\u30f3\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u7528\u30d5\u30a3\u30fc\u30eb\u30c9<br>        const iconInput = document.createElement('input');<br>        iconInput.type = 'file';<br>        iconInput.accept = 'image\/*';<br>        iconInput.style.marginBottom = '10px';<br>        const registerBtn = document.createElement('button');<br>        registerBtn.textContent = '\u767b\u9332';<br>        registerBtn.onclick = () => {<br>          const username = usernameInput.value.trim();<br>          const password = passwordInput.value;<br>          const confirmPassword = confirmInput.value;<br>          if (!username || !password || !confirmPassword) { alert('\u5168\u3066\u306e\u9805\u76ee\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002'); return; }<br>          if (password !== confirmPassword) { alert('\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002'); return; }<br>          if (users.some(u => u.username === username)) { alert('\u305d\u306e\u30e6\u30fc\u30b6\u30fc\u540d\u306f\u65e2\u306b\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002'); return; }<br>          \/\/ \u30a2\u30a4\u30b3\u30f3\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u3001FileReader \u3067 Data URL \u306b\u5909\u63db<br>          if (iconInput.files &amp;&amp; iconInput.files&#91;0]) {<br>            const reader = new FileReader();<br>            reader.onload = function(e) {<br>              const iconData = e.target.result;<br>              const newUser = { username, password, icon: iconData };<br>              users.push(newUser);<br>              saveData();<br>              addLog(`\u30e6\u30fc\u30b6\u30fc ${username} \u767b\u9332\u5b8c\u4e86\uff08\u30a2\u30a4\u30b3\u30f3\u8a2d\u5b9a\u6e08\u307f\uff09`);<br>              alert('\u767b\u9332\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044\u3002');<br>              renderLoginForm(container);<br>            };<br>            reader.readAsDataURL(iconInput.files&#91;0]);<br>          } else {<br>            const newUser = { username, password, icon: '' };<br>            users.push(newUser);<br>            saveData();<br>            addLog(`\u30e6\u30fc\u30b6\u30fc ${username} \u767b\u9332\u5b8c\u4e86\uff08\u30a2\u30a4\u30b3\u30f3\u672a\u8a2d\u5b9a\uff09`);<br>            alert('\u767b\u9332\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044\u3002');<br>            renderLoginForm(container);<br>          }<br>        };<br>        container.appendChild(usernameInput);<br>        container.appendChild(passwordInput);<br>        container.appendChild(confirmInput);<br>        container.appendChild(iconInput);<br>        container.appendChild(registerBtn);<br>        const toggleLink = document.createElement('div');<br>        toggleLink.className = 'toggle-auth';<br>        toggleLink.textContent = '\u30ed\u30b0\u30a4\u30f3\u306f\u3053\u3061\u3089';<br>        toggleLink.onclick = () => renderLoginForm(container);<br>        container.appendChild(toggleLink);<br>      };<br><br>      const togglePostForm = () => {<br>        const postFormSection = document.getElementById('postFormSection');<br>        postFormSection.style.display = currentUser ? 'block' : 'none';<br>      };<br><br>      \/\/ === \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\uff06\u6295\u7a3f\u8868\u793a ===<br>      const renderTimeline = () => {<br>        const timeline = document.getElementById('timeline');<br>        timeline.innerHTML = '';<br>        let filteredPosts = posts.slice();<br>        const searchValue = document.getElementById('searchInput').value.trim().toLowerCase();<br>        if (searchValue) {<br>          filteredPosts = filteredPosts.filter(post =><br>            post.content.toLowerCase().includes(searchValue) ||<br>            post.username.toLowerCase().includes(searchValue)<br>          );<br>        }<br>        \/\/ \u65b0\u3057\u3044\u6295\u7a3f\u9806\u306b\u30bd\u30fc\u30c8<br>        filteredPosts.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp));<br>        filteredPosts.forEach(post => {<br>          timeline.appendChild(renderPost(post));<br>        });<br>      };<br><br>      const renderPost = (post) => {<br>        const postDiv = document.createElement('div');<br>        postDiv.className = 'post-item';<br>        postDiv.setAttribute('data-id', post.id);<br><br>        \/\/ \u30d8\u30c3\u30c0\u30fc\uff08\u6295\u7a3f\u8005\u540d\uff06\u65e5\u6642\uff09<br>        const headerDiv = document.createElement('div');<br>        headerDiv.className = 'post-header';<br>        const usernameSpan = document.createElement('span');<br>        usernameSpan.className = 'post-username';<br>        usernameSpan.textContent = post.username;<br>        const metaSpan = document.createElement('span');<br>        metaSpan.className = 'post-meta';<br>        metaSpan.textContent = formatDate(post.timestamp);<br>        headerDiv.appendChild(usernameSpan);<br>        headerDiv.appendChild(metaSpan);<br>        postDiv.appendChild(headerDiv);<br><br>        \/\/ \u6295\u7a3f\u5185\u5bb9\uff08\u7de8\u96c6\u30e2\u30fc\u30c9\u304b\u901a\u5e38\u8868\u793a\u304b\uff09<br>        const contentDiv = document.createElement('div');<br>        contentDiv.className = 'post-content';<br>        if (post.editing) {<br>          const editArea = document.createElement('div');<br>          editArea.className = 'edit-area';<br>          const editTextarea = document.createElement('textarea');<br>          editTextarea.value = post.content;<br>          editArea.appendChild(editTextarea);<br>          const saveBtn = document.createElement('button');<br>          saveBtn.textContent = '\u4fdd\u5b58';<br>          saveBtn.onclick = () => {<br>            const newContent = editTextarea.value.trim();<br>            if (!newContent) { alert('\u6295\u7a3f\u5185\u5bb9\u304c\u7a7a\u3067\u3059\u3002'); return; }<br>            post.content = newContent;<br>            post.editing = false;<br>            saveData();<br>            addLog(`\u6295\u7a3f ${post.id} \u7de8\u96c6\u5b8c\u4e86`);<br>            renderTimeline();<br>          };<br>          const cancelBtn = document.createElement('button');<br>          cancelBtn.textContent = '\u30ad\u30e3\u30f3\u30bb\u30eb';<br>          cancelBtn.style.marginLeft = '5px';<br>          cancelBtn.onclick = () => { post.editing = false; renderTimeline(); };<br>          editArea.appendChild(saveBtn);<br>          editArea.appendChild(cancelBtn);<br>          contentDiv.appendChild(editArea);<br>        } else {<br>          contentDiv.textContent = post.content;<br>        }<br>        postDiv.appendChild(contentDiv);<br><br>        \/\/ \u30a2\u30af\u30b7\u30e7\u30f3\u30dc\u30bf\u30f3\uff08\u3044\u3044\u306d\u3001\u7de8\u96c6\u3001\u524a\u9664\u3001\u8fd4\u4fe1\uff09<br>        const actionsDiv = document.createElement('div');<br>        actionsDiv.className = 'post-actions';<br>        const likeBtn = document.createElement('button');<br>        likeBtn.textContent = `\u3044\u3044\u306d (${post.likes || 0})`;<br>        likeBtn.onclick = () => {<br>          post.likes = (post.likes || 0) + 1;<br>          saveData();<br>          addLog(`\u6295\u7a3f ${post.id} \u306b\u3044\u3044\u306d`);<br>          renderTimeline();<br>        };<br>        actionsDiv.appendChild(likeBtn);<br><br>        if (currentUser &amp;&amp; currentUser.username === post.username) {<br>          const editBtn = document.createElement('button');<br>          editBtn.textContent = '\u7de8\u96c6';<br>          editBtn.onclick = () => { post.editing = true; renderTimeline(); };<br>          const deleteBtn = document.createElement('button');<br>          deleteBtn.textContent = '\u524a\u9664';<br>          deleteBtn.onclick = () => {<br>            if (confirm('\u672c\u5f53\u306b\u524a\u9664\u3057\u307e\u3059\u304b\uff1f')) {<br>              posts = posts.filter(p => p.id !== post.id);<br>              saveData();<br>              addLog(`\u6295\u7a3f ${post.id} \u524a\u9664`);<br>              renderTimeline();<br>            }<br>          };<br>          actionsDiv.appendChild(editBtn);<br>          actionsDiv.appendChild(deleteBtn);<br>        }<br><br>        if (currentUser) {<br>          const replyBtn = document.createElement('button');<br>          replyBtn.textContent = '\u8fd4\u4fe1';<br>          replyBtn.onclick = () => toggleReplyForm(post.id);<br>          actionsDiv.appendChild(replyBtn);<br>        }<br>        postDiv.appendChild(actionsDiv);<br><br>        \/\/ \u8fd4\u4fe1\u4e00\u89a7\u8868\u793a<br>        const repliesDiv = document.createElement('div');<br>        repliesDiv.className = 'replies';<br>        if (post.replies &amp;&amp; post.replies.length > 0) {<br>          post.replies.forEach(reply => {<br>            repliesDiv.appendChild(renderReply(reply));<br>          });<br>        }<br>        postDiv.appendChild(repliesDiv);<br><br>        \/\/ \u8fd4\u4fe1\u30d5\u30a9\u30fc\u30e0\uff08\u521d\u671f\u306f\u975e\u8868\u793a\uff09<br>        const replyFormDiv = document.createElement('div');<br>        replyFormDiv.className = 'reply-form';<br>        replyFormDiv.style.display = 'none';<br>        const replyTextarea = document.createElement('textarea');<br>        replyTextarea.placeholder = '\u8fd4\u4fe1\u5185\u5bb9\u3092\u5165\u529b';<br>        const submitReplyBtn = document.createElement('button');<br>        submitReplyBtn.textContent = '\u8fd4\u4fe1\u3059\u308b';<br>        submitReplyBtn.onclick = () => {<br>          const replyContent = replyTextarea.value.trim();<br>          if (!replyContent) { alert('\u8fd4\u4fe1\u5185\u5bb9\u304c\u7a7a\u3067\u3059\u3002'); return; }<br>          addReply(post.id, replyContent);<br>          replyTextarea.value = '';<br>          toggleReplyForm(post.id, true);<br>        };<br>        replyFormDiv.appendChild(replyTextarea);<br>        replyFormDiv.appendChild(submitReplyBtn);<br>        postDiv.appendChild(replyFormDiv);<br><br>        return postDiv;<br>      };<br><br>      const renderReply = (reply) => {<br>        const replyDiv = document.createElement('div');<br>        replyDiv.className = 'reply-item';<br>        const replyHeader = document.createElement('div');<br>        replyHeader.className = 'reply-header';<br>        replyHeader.textContent = reply.username;<br>        const replyContent = document.createElement('div');<br>        replyContent.textContent = reply.content;<br>        const replyMeta = document.createElement('div');<br>        replyMeta.className = 'reply-meta';<br>        replyMeta.textContent = formatDate(reply.timestamp);<br>        replyDiv.appendChild(replyHeader);<br>        replyDiv.appendChild(replyContent);<br>        replyDiv.appendChild(replyMeta);<br>        return replyDiv;<br>      };<br><br>      const toggleReplyForm = (postId, forceHide = false) => {<br>        const postDiv = document.querySelector(`.post-item&#91;data-id=\"${postId}\"]`);<br>        if (!postDiv) return;<br>        const replyForm = postDiv.querySelector('.reply-form');<br>        replyForm.style.display = (forceHide || replyForm.style.display === 'block') ? 'none' : 'block';<br>      };<br><br>      const addReply = (postId, replyContent) => {<br>        const post = posts.find(p => p.id === postId);<br>        if (!post) return;<br>        if (!post.replies) { post.replies = &#91;]; }<br>        post.replies.push({<br>          id: Date.now(),<br>          username: currentUser.username,<br>          content: replyContent,<br>          timestamp: new Date()<br>        });<br>        saveData();<br>        addLog(`\u6295\u7a3f ${post.id} \u306b\u8fd4\u4fe1\u8ffd\u52a0`);<br>        renderTimeline();<br>      };<br><br>      \/\/ === \u6295\u7a3f\u4f5c\u6210\u51e6\u7406 ===<br>      const initPostButton = () => {<br>        document.getElementById('postButton').addEventListener('click', () => {<br>          const postContentElem = document.getElementById('postContent');<br>          const content = postContentElem.value.trim();<br>          if (!content) { alert('\u6295\u7a3f\u5185\u5bb9\u304c\u7a7a\u3067\u3059\u3002'); return; }<br>          const newPost = {<br>            id: Date.now(),<br>            username: currentUser.username,<br>            content: content,<br>            timestamp: new Date(),<br>            likes: 0,<br>            replies: &#91;]<br>          };<br>          posts.push(newPost);<br>          saveData();<br>          addLog(`\u6295\u7a3f ${newPost.id} \u8ffd\u52a0`);<br>          renderTimeline();<br>          postContentElem.value = '';<br>        });<br>      };<br><br>      \/\/ === \u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u51e6\u7406\uff1a\u30ed\u30b0\uff0fRSS ===<br>      const initUtilityButtons = () => {<br>        document.getElementById('toggleLogsButton').addEventListener('click', () => {<br>          const logsSection = document.getElementById('logsSection');<br>          if (logsSection.style.display === 'none' || logsSection.style.display === '') {<br>            renderLogs();<br>            logsSection.style.display = 'block';<br>            document.getElementById('toggleLogsButton').textContent = '\u30ed\u30b0\u3092\u975e\u8868\u793a';<br>          } else {<br>            logsSection.style.display = 'none';<br>            document.getElementById('toggleLogsButton').textContent = '\u30ed\u30b0\u3092\u8868\u793a';<br>          }<br>        });<br>        document.getElementById('downloadRSSButton').addEventListener('click', downloadRSS);<br>      };<br><br>      \/\/ === \u521d\u671f\u5316\u51e6\u7406 ===<br>      const init = () => {<br>        loadData();<br>        renderAuthSection();<br>        togglePostForm();<br>        renderTimeline();<br>        initPostButton();<br>        initUtilityButtons();<br>        document.getElementById('searchInput').addEventListener('input', renderTimeline);<br>      };<br><br>      document.addEventListener('DOMContentLoaded', init);<br>    })();<br>  &lt;\/script><br>&lt;\/body><br>&lt;\/html><br><br><br><\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","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":[80],"tags":[3],"class_list":["post-25869","post","type-post","status-publish","format-standard","hentry","category-html","tag-programming"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25869","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=25869"}],"version-history":[{"count":1,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25869\/revisions"}],"predecessor-version":[{"id":25870,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25869\/revisions\/25870"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25869"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}