{"id":2800,"date":"2025-11-03T13:45:13","date_gmt":"2025-11-03T13:45:13","guid":{"rendered":"https:\/\/ecchotag.com\/?page_id=2800"},"modified":"2025-11-03T15:30:27","modified_gmt":"2025-11-03T15:30:27","slug":"test-qr","status":"publish","type":"page","link":"https:\/\/ecchotag.com\/ja\/test-qr\/","title":{"rendered":"test QR"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"2800\" class=\"elementor elementor-2800\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f3a335f e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"f3a335f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-512f59f elementor-widget elementor-widget-html\" data-id=\"512f59f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"grape-qr-widget\"><\/div>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/qrcode-generator\/1.4.4\/qrcode.min.js\"><\/script>\n<script>\n(function () {\n  var root = document.getElementById(\"grape-qr-widget\");\n  if (!root || !window.qrcode) return;\n\n  root.innerHTML = `\n    <style>\n      #grape-qr-widget .gqr-card {\n        font-family: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n        max-width: 540px;\n        padding: 16px;\n        border-radius: 16px;\n        background: #ffffff;\n        box-shadow: 0 6px 18px rgba(0,0,0,0.08);\n      }\n      #grape-qr-widget .gqr-row { margin-bottom: 10px; }\n      #grape-qr-widget label { display: block; font-size: 13px; margin-bottom: 4px; }\n      #grape-qr-widget input[type=\"text\"],\n      #grape-qr-widget input[type=\"number\"],\n      #grape-qr-widget select {\n        width: 100%;\n        box-sizing: border-box;\n        padding: 6px 8px;\n        border-radius: 6px;\n        border: 1px solid #d0d0d0;\n        font-size: 14px;\n      }\n      #grape-qr-widget button {\n        padding: 6px 12px;\n        border-radius: 6px;\n        border: 1px solid #111827;\n        background: #111827;\n        color: #ffffff;\n        font-size: 14px;\n        cursor: pointer;\n      }\n      #grape-qr-widget button.gqr-secondary {\n        background: #ffffff;\n        color: #111827;\n      }\n      #grape-qr-widget button:disabled { opacity: 0.6; cursor: default; }\n      #grape-qr-widget .gqr-actions {\n        display: flex;\n        gap: 8px;\n        flex-wrap: wrap;\n        margin-top: 8px;\n      }\n      #grape-qr-widget #gqr-preview {\n        margin-top: 16px;\n        padding: 12px;\n        background: #f3f4f6;\n        border-radius: 12px;\n        display: inline-block;\n      }\n      #grape-qr-widget #gqr-preview svg { display: block; }\n      #grape-qr-widget .gqr-tip {\n        font-size: 11px;\n        color: #6b7280;\n        margin-top: 6px;\n      }\n      #grape-qr-widget .gqr-saved-list {\n        margin-top: 16px;\n        font-size: 12px;\n        max-height: 180px;\n        overflow-y: auto;\n        border-top: 1px solid #e5e7eb;\n        padding-top: 10px;\n      }\n      #grape-qr-widget .gqr-saved-item {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 4px 0;\n      }\n      #grape-qr-widget .gqr-saved-thumb {\n        width: 40px;\n        height: 40px;\n        background: #f3f4f6;\n        border-radius: 6px;\n        overflow: hidden;\n        flex-shrink: 0;\n      }\n      #grape-qr-widget .gqr-saved-thumb svg { width: 100%; height: 100%; }\n      #grape-qr-widget .gqr-saved-main { flex: 1; min-width: 0; }\n      #grape-qr-widget .gqr-saved-title {\n        font-size: 12px;\n        font-weight: 600;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        overflow: hidden;\n      }\n      #grape-qr-widget .gqr-saved-url {\n        font-size: 11px;\n        color: #6b7280;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        overflow: hidden;\n      }\n      #grape-qr-widget .gqr-saved-buttons {\n        display: flex;\n        gap: 4px;\n      }\n      #grape-qr-widget .gqr-saved-buttons button {\n        font-size: 11px;\n        padding: 2px 6px;\n      }\n    <\/style>\n\n    <div class=\"gqr-card\">\n      <div class=\"gqr-row\">\n        <label for=\"gqr-url\">URL or text<\/label>\n        <input id=\"gqr-url\" type=\"text\" value=\"https:\/\/ecchotag.com\/grape\/saperavi\" \/>\n      <\/div>\n\n      <div class=\"gqr-row\">\n        <label for=\"gqr-name\">QR name (for downloads and saved list)<\/label>\n        <input id=\"gqr-name\" type=\"text\" value=\"grape-saperavi\" \/>\n      <\/div>\n\n      <div class=\"gqr-row\" style=\"display:flex; gap:8px;\">\n        <div style=\"flex:1;\">\n          <label for=\"gqr-size\">Size (pixels)<\/label>\n          <input id=\"gqr-size\" type=\"number\" value=\"512\" min=\"128\" max=\"1024\" step=\"16\" \/>\n        <\/div>\n        <div style=\"flex:1;\">\n          <label for=\"gqr-margin\">Quiet zone (modules)<\/label>\n          <input id=\"gqr-margin\" type=\"number\" value=\"4\" min=\"0\" max=\"16\" \/>\n        <\/div>\n      <\/div>\n\n      <div class=\"gqr-row\" style=\"display:flex; gap:8px;\">\n        <div style=\"flex:1;\">\n          <label for=\"gqr-ecc\">Error correction<\/label>\n          <select id=\"gqr-ecc\">\n            <option value=\"L\">L<\/option>\n            <option value=\"M\">M<\/option>\n            <option value=\"Q\">Q<\/option>\n            <option value=\"H\" selected>H (recommended)<\/option>\n          <\/select>\n        <\/div>\n        <div style=\"flex:1;\">\n          <label for=\"gqr-pattern\">Pattern<\/label>\n          <select id=\"gqr-pattern\">\n            <option value=\"square\" selected>Squares<\/option>\n            <option value=\"rounded\">Rounded squares<\/option>\n            <option value=\"small-squares\">Small squares<\/option>\n            <option value=\"dots\">Circle-like dots<\/option>\n          <\/select>\n        <\/div>\n      <\/div>\n\n      <div class=\"gqr-row\" style=\"display:flex; gap:8px;\">\n        <div style=\"flex:1;\">\n          <label for=\"gqr-eye-style\">Eye style<\/label>\n          <select id=\"gqr-eye-style\">\n            <option value=\"square\" selected>Square eyes<\/option>\n            <option value=\"circle\">Circle eyes<\/option>\n          <\/select>\n        <\/div>\n        <div style=\"flex:1;\">\n          <label for=\"gqr-eye-stroke\">Eye outer stroke (px)<\/label>\n          <input id=\"gqr-eye-stroke\" type=\"number\" value=\"3\" min=\"0\" max=\"20\" \/>\n        <\/div>\n      <\/div>\n\n      <div class=\"gqr-row\" style=\"display:flex; gap:8px; align-items:center;\">\n        <div style=\"flex:0 0 auto; display:flex; align-items:center; gap:6px;\">\n          <input id=\"gqr-logo-enabled\" type=\"checkbox\" \/>\n          <label for=\"gqr-logo-enabled\" style=\"margin:0;\">Center logo seat<\/label>\n        <\/div>\n        <div style=\"flex:1;\">\n          <label for=\"gqr-logo-size\">Logo seat size (% of QR)<\/label>\n          <input id=\"gqr-logo-size\" type=\"number\" value=\"18\" min=\"8\" max=\"25\" \/>\n        <\/div>\n      <\/div>\n\n      <div class=\"gqr-actions\">\n        <button id=\"gqr-generate\">Generate<\/button>\n        <button id=\"gqr-download\">Download SVG<\/button>\n        <button id=\"gqr-save\" class=\"gqr-secondary\">Save<\/button>\n      <\/div>\n\n      <div id=\"gqr-preview\"><\/div>\n      <div class=\"gqr-tip\">\n        Matrix is standard. Pattern only affects body modules. Eyes are drawn separately.\n        Keep quiet zone \u2265 4 modules and logo seat \u2264 20% for safe scanning.\n      <\/div>\n\n      <div id=\"gqr-saved\" class=\"gqr-saved-list\"><\/div>\n    <\/div>\n  `;\n\n  var storageKey = \"gqr_saved_items_v5\";\n\n  function loadSaved() {\n    try {\n      var raw = window.localStorage.getItem(storageKey);\n      var parsed = raw ? JSON.parse(raw) : [];\n      return Array.isArray(parsed) ? parsed : [];\n    } catch (e) {\n      return [];\n    }\n  }\n\n  function saveSaved(list) {\n    try {\n      window.localStorage.setItem(storageKey, JSON.stringify(list));\n    } catch (e) {}\n  }\n\n  function renderSaved() {\n    var list = loadSaved();\n    var container = root.querySelector(\"#gqr-saved\");\n    if (!container) return;\n    if (!list.length) {\n      container.innerHTML = \"\";\n      return;\n    }\n    var html = \"\";\n    list.forEach(function (item, idx) {\n      var thumbSvg = (item.svg || \"\")\n        .replace(\/width=\"(.*?)\"\/, 'width=\"40\"')\n        .replace(\/height=\"(.*?)\"\/, 'height=\"40\"');\n      html += `\n        <div class=\"gqr-saved-item\">\n          <div class=\"gqr-saved-thumb\">${thumbSvg}<\/div>\n          <div class=\"gqr-saved-main\">\n            <div class=\"gqr-saved-title\">${item.name || \"Untitled\"}<\/div>\n            <div class=\"gqr-saved-url\">${item.text || \"\"}<\/div>\n          <\/div>\n          <div class=\"gqr-saved-buttons\">\n            <button data-idx=\"${idx}\" data-action=\"load\">Load<\/button>\n            <button data-idx=\"${idx}\" data-action=\"download\">SVG<\/button>\n            <button data-idx=\"${idx}\" data-action=\"delete\">X<\/button>\n          <\/div>\n        <\/div>\n      `;\n    });\n    container.innerHTML = html;\n  }\n\n  \/\/ Build SVG directly from matrix with separate pattern + eyes\n  function buildSvg(text, ecc, marginModules, size, pattern, eyeStyle, eyeStroke, logoEnabled, logoPct) {\n    var margin = parseInt(marginModules, 10);\n    if (!Number.isFinite(margin)) margin = 4;\n    if (margin < 4) margin = 4;\n\n    var qr = qrcode(0, ecc || \"H\");\n    qr.addData(text || \" \");\n    qr.make();\n\n    var count = qr.getModuleCount();\n\n    var quiet = margin;\n    var totalModules = count + 2 * quiet;\n    var cell = size \/ totalModules;\n    var offset = cell * quiet;\n    var bodySize = count * cell;\n\n    var cells = [];\n\n    \/\/ mark eye regions (finder patterns)\n    var eyeRegion = {};\n    function markEye(r0, c0) {\n      for (var r = r0; r < r0 + 7; r++) {\n        for (var c = c0; c < c0 + 7; c++) {\n          eyeRegion[r + \",\" + c] = true;\n        }\n      }\n    }\n    markEye(0, 0);              \/\/ top left\n    markEye(0, count - 7);      \/\/ top right\n    markEye(count - 7, 0);      \/\/ bottom left\n\n    for (var r = 0; r < count; r++) {\n      for (var c = 0; c < count; c++) {\n        if (!qr.isDark(r, c)) continue;\n        if (eyeRegion[r + \",\" + c]) continue; \/\/ eyes drawn separately\n\n        var x = offset + c * cell;\n        var y = offset + r * cell;\n        var w = cell;\n        var h = cell;\n\n        var cx = x + cell \/ 2;\n        var cy = y + cell \/ 2;\n\n        if (pattern === \"dots\") {\n          var rd = cell * 0.4;\n          cells.push('<circle cx=\"' + cx + '\" cy=\"' + cy + '\" r=\"' + rd + '\" \/>');\n        } else {\n          var pad = 0;\n          if (pattern === \"small-squares\" || pattern === \"rounded\") {\n            pad = cell * 0.2;\n          }\n          x += pad;\n          y += pad;\n          w = cell - pad * 2;\n          h = cell - pad * 2;\n          if (pattern === \"rounded\") {\n            var rxy = w * 0.35;\n            cells.push(\n              '<rect x=\"' + x + '\" y=\"' + y + '\" width=\"' + w + '\" height=\"' + h +\n              '\" rx=\"' + rxy + '\" ry=\"' + rxy + '\" \/>'\n            );\n          } else {\n            \/\/ squares and small-squares\n            cells.push(\n              '<rect x=\"' + x + '\" y=\"' + y + '\" width=\"' + w + '\" height=\"' + h + '\" \/>'\n            );\n          }\n        }\n      }\n    }\n\n    \/\/ custom eyes\n    var eyes = [];\n    var safeStroke = Math.max(0, Math.min(parseFloat(eyeStroke) || 0, cell * 1.8));\n\n    function squareEye(r0, c0) {\n      var x = offset + c0 * cell;\n      var y = offset + r0 * cell;\n      var s7 = cell * 7;\n      var s5 = cell * 5;\n      var s3 = cell * 3;\n      var rxOuter = cell * 0.8;\n      var rxInner = cell * 0.6;\n      var rxPupil = cell * 0.4;\n      eyes.push(\n        '<rect x=\"' + x + '\" y=\"' + y + '\" width=\"' + s7 + '\" height=\"' + s7 +\n        '\" fill=\"none\" stroke=\"black\" stroke-width=\"' + safeStroke + '\" rx=\"' + rxOuter + '\" ry=\"' + rxOuter + '\" \/>'\n      );\n      eyes.push(\n        '<rect x=\"' + (x + cell) + '\" y=\"' + (y + cell) + '\" width=\"' + s5 + '\" height=\"' + s5 +\n        '\" fill=\"white\" rx=\"' + rxInner + '\" ry=\"' + rxInner + '\" \/>'\n      );\n      eyes.push(\n        '<rect x=\"' + (x + cell * 2) + '\" y=\"' + (y + cell * 2) + '\" width=\"' + s3 + '\" height=\"' + s3 +\n        '\" fill=\"black\" rx=\"' + rxPupil + '\" ry=\"' + rxPupil + '\" \/>'\n      );\n    }\n\n    function circleEye(r0, c0) {\n      var x = offset + c0 * cell;\n      var y = offset + r0 * cell;\n      var cx = x + cell * 3.5;\n      var cy = y + cell * 3.5;\n      var rOuter = cell * 3.5;\n      var rInner = cell * 2.5;\n      var rPupil = cell * 1.5;\n      eyes.push(\n        '<circle cx=\"' + cx + '\" cy=\"' + cy + '\" r=\"' + rOuter +\n        '\" fill=\"none\" stroke=\"black\" stroke-width=\"' + safeStroke + '\" \/>'\n      );\n      eyes.push('<circle cx=\"' + cx + '\" cy=\"' + cy + '\" r=\"' + rInner + '\" fill=\"white\" \/>');\n      eyes.push('<circle cx=\"' + cx + '\" cy=\"' + cy + '\" r=\"' + rPupil + '\" fill=\"black\" \/>');\n    }\n\n    var eyeFn = eyeStyle === \"circle\" ? circleEye : squareEye;\n    eyeFn(0, 0);\n    eyeFn(0, count - 7);\n    eyeFn(count - 7, 0);\n\n    \/\/ logo seat\n    var logoOverlay = \"\";\n    if (logoEnabled) {\n      var frac = parseFloat(logoPct) \/ 100;\n      if (frac > 0.08) {\n        if (frac > 0.25) frac = 0.25;\n        var seatSize = bodySize * frac;\n        var seatX = offset + (bodySize - seatSize) \/ 2;\n        var seatY = seatX;\n        var radius = seatSize * 0.18;\n        logoOverlay =\n          '<rect x=\"' + seatX + '\" y=\"' + seatY +\n          '\" width=\"' + seatSize + '\" height=\"' + seatSize +\n          '\" rx=\"' + radius + '\" fill=\"white\" fill-opacity=\"0.94\"\/>';\n      }\n    }\n\n    var svg =\n      '<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 ' + size + ' ' + size +\n      '\" width=\"' + size + '\" height=\"' + size + '\" shape-rendering=\"crispEdges\">' +\n      '<rect x=\"0\" y=\"0\" width=\"' + size + '\" height=\"' + size + '\" fill=\"white\"\/>' +\n      '<g fill=\"black\">' + cells.join(\"\") + eyes.join(\"\") + '<\/g>' +\n      logoOverlay +\n      '<\/svg>';\n\n    return svg;\n  }\n\n  function getConfigFromInputs() {\n    return {\n      text: root.querySelector(\"#gqr-url\").value.trim(),\n      name: root.querySelector(\"#gqr-name\").value.trim(),\n      size: parseInt(root.querySelector(\"#gqr-size\").value, 10) || 512,\n      margin: parseInt(root.querySelector(\"#gqr-margin\").value, 10) || 4,\n      ecc: root.querySelector(\"#gqr-ecc\").value || \"H\",\n      pattern: root.querySelector(\"#gqr-pattern\").value,\n      eyeStyle: root.querySelector(\"#gqr-eye-style\").value,\n      eyeStroke: parseFloat(root.querySelector(\"#gqr-eye-stroke\").value) || 0,\n      logoEnabled: root.querySelector(\"#gqr-logo-enabled\").checked,\n      logoPct: parseInt(root.querySelector(\"#gqr-logo-size\").value, 10) || 0\n    };\n  }\n\n  function setInputsFromConfig(c) {\n    if (!c) return;\n    root.querySelector(\"#gqr-url\").value = c.text || \"\";\n    root.querySelector(\"#gqr-name\").value = c.name || \"\";\n    root.querySelector(\"#gqr-size\").value = c.size || 512;\n    root.querySelector(\"#gqr-margin\").value = c.margin != null ? c.margin : 4;\n    root.querySelector(\"#gqr-ecc\").value = c.ecc || \"H\";\n    root.querySelector(\"#gqr-pattern\").value = c.pattern || \"square\";\n    root.querySelector(\"#gqr-eye-style\").value = c.eyeStyle || \"square\";\n    root.querySelector(\"#gqr-eye-stroke\").value = c.eyeStroke != null ? c.eyeStroke : 3;\n    root.querySelector(\"#gqr-logo-enabled\").checked = !!c.logoEnabled;\n    root.querySelector(\"#gqr-logo-size\").value = c.logoPct != null ? c.logoPct : 18;\n  }\n\n  function generate() {\n    var cfg = getConfigFromInputs();\n    if (cfg.size < 128) cfg.size = 128;\n    if (cfg.size > 2048) cfg.size = 2048;\n    var svg = buildSvg(\n      cfg.text,\n      cfg.ecc,\n      cfg.margin,\n      cfg.size,\n      cfg.pattern,\n      cfg.eyeStyle,\n      cfg.eyeStroke,\n      cfg.logoEnabled,\n      cfg.logoPct\n    );\n    var preview = root.querySelector(\"#gqr-preview\");\n    if (preview) preview.innerHTML = svg;\n    return svg;\n  }\n\n  function downloadCurrent() {\n    var preview = root.querySelector(\"#gqr-preview\");\n    if (!preview) return;\n    var svgEl = preview.querySelector(\"svg\");\n    if (!svgEl) {\n      alert(\"Generate a QR first\");\n      return;\n    }\n    var fileName = (root.querySelector(\"#gqr-name\").value || \"qr-code\").trim() + \".svg\";\n    var svgText = svgEl.outerHTML;\n    var blob = new Blob([svgText], { type: \"image\/svg+xml;charset=utf-8\" });\n    var url = URL.createObjectURL(blob);\n    var a = document.createElement(\"a\");\n    a.href = url;\n    a.download = fileName;\n    document.body.appendChild(a);\n    a.click();\n    a.remove();\n    URL.revokeObjectURL(url);\n  }\n\n  function saveCurrent() {\n    var preview = root.querySelector(\"#gqr-preview\");\n    var svgEl = preview ? preview.querySelector(\"svg\") : null;\n    if (!svgEl) {\n      alert(\"Generate a QR first\");\n      return;\n    }\n    var svgText = svgEl.outerHTML;\n    var cfg = getConfigFromInputs();\n    var list = loadSaved();\n    list.unshift({\n      id: Date.now(),\n      name: cfg.name || \"Untitled\",\n      text: cfg.text,\n      svg: svgText,\n      config: cfg\n    });\n    list = list.slice(0, 100);\n    saveSaved(list);\n    renderSaved();\n  }\n\n  root.querySelector(\"#gqr-generate\").addEventListener(\"click\", function (e) {\n    e.preventDefault();\n    generate();\n  });\n\n  root.querySelector(\"#gqr-download\").addEventListener(\"click\", function (e) {\n    e.preventDefault();\n    downloadCurrent();\n  });\n\n  root.querySelector(\"#gqr-save\").addEventListener(\"click\", function (e) {\n    e.preventDefault();\n    saveCurrent();\n  });\n\n  [\n    \"#gqr-url\",\n    \"#gqr-size\",\n    \"#gqr-margin\",\n    \"#gqr-ecc\",\n    \"#gqr-pattern\",\n    \"#gqr-eye-style\",\n    \"#gqr-eye-stroke\",\n    \"#gqr-logo-enabled\",\n    \"#gqr-logo-size\"\n  ].forEach(function (sel) {\n    var el = root.querySelector(sel);\n    if (!el) return;\n    var evt = sel === \"#gqr-url\" ? \"input\" : \"change\";\n    el.addEventListener(evt, function () { generate(); });\n  });\n\n  root.querySelector(\"#gqr-saved\").addEventListener(\"click\", function (e) {\n    var btn = e.target.closest(\"button\");\n    if (!btn) return;\n    var idx = parseInt(btn.getAttribute(\"data-idx\"), 10);\n    var action = btn.getAttribute(\"data-action\");\n    var list = loadSaved();\n    if (!list[idx]) return;\n\n    if (action === \"load\") {\n      var item = list[idx];\n      if (item.config) setInputsFromConfig(item.config);\n      generate();\n    } else if (action === \"download\") {\n      var item = list[idx];\n      if (!item.svg) return;\n      var blob = new Blob([item.svg], { type: \"image\/svg+xml;charset=utf-8\" });\n      var url = URL.createObjectURL(blob);\n      var a = document.createElement(\"a\");\n      a.href = url;\n      a.download = (item.name || \"qr-code\") + \".svg\";\n      document.body.appendChild(a);\n      a.click();\n      a.remove();\n      URL.revokeObjectURL(url);\n    } else if (action === \"delete\") {\n      list.splice(idx, 1);\n      saveSaved(list);\n      renderSaved();\n    }\n  });\n\n  renderSaved();\n  generate();\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_surecart_dashboard_logo_width":"180px","_surecart_dashboard_show_logo":true,"_surecart_dashboard_navigation_orders":true,"_surecart_dashboard_navigation_invoices":true,"_surecart_dashboard_navigation_subscriptions":true,"_surecart_dashboard_navigation_downloads":true,"_surecart_dashboard_navigation_billing":true,"_surecart_dashboard_navigation_account":true,"footnotes":""},"class_list":["post-2800","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/ecchotag.com\/ja\/wp-json\/wp\/v2\/pages\/2800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ecchotag.com\/ja\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ecchotag.com\/ja\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ecchotag.com\/ja\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ecchotag.com\/ja\/wp-json\/wp\/v2\/comments?post=2800"}],"version-history":[{"count":28,"href":"https:\/\/ecchotag.com\/ja\/wp-json\/wp\/v2\/pages\/2800\/revisions"}],"predecessor-version":[{"id":2829,"href":"https:\/\/ecchotag.com\/ja\/wp-json\/wp\/v2\/pages\/2800\/revisions\/2829"}],"wp:attachment":[{"href":"https:\/\/ecchotag.com\/ja\/wp-json\/wp\/v2\/media?parent=2800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}