{"id":2388,"date":"2025-06-15T16:42:57","date_gmt":"2025-06-15T16:42:57","guid":{"rendered":"https:\/\/www.sdg.test.polimi.it\/?page_id=2388"},"modified":"2025-07-03T13:55:28","modified_gmt":"2025-07-03T13:55:28","slug":"mapper","status":"publish","type":"page","link":"https:\/\/www.sdg.test.polimi.it\/en\/mapper\/","title":{"rendered":"Mapper SDG"},"content":{"rendered":"\n\n\n\n<!-- Font Manrope -->\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@400;600;800&#038;display=swap\" rel=\"stylesheet\">\n\n<style>\n  .features-row {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 30px;\n    justify-content: center;\n    margin: 60px auto;\n    max-width: 1000px;\n    padding: 0 20px;\n    font-family: 'Manrope', sans-serif!important;\n  }\n\n  .feature-box {\n    background: #f7f9fb;\n    border-radius: 16px;\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);\n    width: 250px;\n    padding: 30px 20px;\n    text-align: center;\n    color: #102C53;\n    transform: translateY(40px);\n    opacity: 0;\n    transition: transform 0.6s ease, opacity 0.6s ease;\n  }\n\n  .feature-box.visible {\n    transform: translateY(0);\n    opacity: 1;\n  }\n\n  .feature-icon {\n    font-size: 36px;\n    margin-bottom: 10px;\n    color: #3544D6;\n  }\n\n  .feature-title {\n    font-size: 18px;\n    font-weight: 800;\n    margin-bottom: 10px;\n    color: #102C53;\n  }\n\n  .feature-desc {\n    font-size: 14px;\n    color: #102C53;\n    line-height: 1.5;\n  }\n\n  @media (max-width: 600px) {\n    .feature-box {\n      width: 100%;\n    }\n  }\n<\/style>\n\n<!-- CONTENUTO -->\n<div class=\"features-row\">\n  <div class=\"feature-box\">\n    <div class=\"feature-icon\">\n      <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" id=\"search\" width=\"36\" height=\"36\">\n        <path fill=\"#3544D6\" d=\"M21.71,20.29,18,16.61A9,9,0,1,0,16.61,18l3.68,3.68a1,1,0,0,0,1.42,0A1,1,0,0,0,21.71,20.29ZM11,18a7,7,0,1,1,7-7A7,7,0,0,1,11,18Z\"\/>\n      <\/svg>\n    <\/div>\n    <div class=\"feature-title\">Cosa analizza?<\/div>\n    <div class=\"feature-desc\">Abstract di paper, programmi di insegnamenti, tesi di dottorato, syllabi didattici, estratti da progetti di ricerca, e molto altro.<\/div>\n  <\/div>\n  <div class=\"feature-box\">\n    <div class=\"feature-icon\">\n      <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" id=\"globe\" width=\"36\" height=\"36\">\n        <path fill=\"#3544D6\" d=\"M21.41,8.64s0,0,0-.05a10,10,0,0,0-18.78,0s0,0,0,.05a9.86,9.86,0,0,0,0,6.72s0,0,0,.05a10,10,0,0,0,18.78,0s0,0,0-.05a9.86,9.86,0,0,0,0-6.72ZM4.26,14a7.82,7.82,0,0,1,0-4H6.12a16.73,16.73,0,0,0,0,4Zm.82,2h1.4a12.15,12.15,0,0,0,1,2.57A8,8,0,0,1,5.08,16Zm1.4-8H5.08A8,8,0,0,1,7.45,5.43,12.15,12.15,0,0,0,6.48,8ZM11,19.7A6.34,6.34,0,0,1,8.57,16H11ZM11,14H8.14a14.36,14.36,0,0,1,0-4H11Zm0-6H8.57A6.34,6.34,0,0,1,11,4.3Zm7.92,0h-1.4a12.15,12.15,0,0,0-1-2.57A8,8,0,0,1,18.92,8ZM13,4.3A6.34,6.34,0,0,1,15.43,8H13Zm0,15.4V16h2.43A6.34,6.34,0,0,1,13,19.7ZM15.86,14H13V10h2.86a14.36,14.36,0,0,1,0,4Zm.69,4.57a12.15,12.15,0,0,0,1-2.57h1.4A8,8,0,0,1,16.55,18.57ZM19.74,14H17.88A16.16,16.16,0,0,0,18,12a16.28,16.28,0,0,0-.12-2h1.86a7.82,7.82,0,0,1,0,4Z\"\/>\n      <\/svg>\n    <\/div>\n    <div class=\"feature-title\">In che lingua?<\/div>\n    <div class=\"feature-desc\">I risultati migliori si hanno con inglese e italiano, ma il mapper \u00e8 in grado di funzionare anche nelle altre lingue.<\/div>\n  <\/div>\n  <div class=\"feature-box\">\n    <div class=\"feature-icon\">\n      <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" id=\"edit\" width=\"36\" height=\"36\">\n        <path fill=\"#3544D6\" d=\"M21,12a1,1,0,0,0-1,1v6a1,1,0,0,1-1,1H5a1,1,0,0,1-1-1V5A1,1,0,0,1,5,4h6a1,1,0,0,0,0-2H5A3,3,0,0,0,2,5V19a3,3,0,0,0,3,3H19a3,3,0,0,0,3-3V13A1,1,0,0,0,21,12ZM6,12.76V17a1,1,0,0,0,1,1h4.24a1,1,0,0,0,.71-.29l6.92-6.93h0L21.71,8a1,1,0,0,0,0-1.42L17.47,2.29a1,1,0,0,0-1.42,0L13.23,5.12h0L6.29,12.05A1,1,0,0,0,6,12.76ZM16.76,4.41l2.83,2.83L18.17,8.66,15.34,5.83ZM8,13.17l5.93-5.93,2.83,2.83L10.83,16H8Z\"\/>\n      <\/svg>\n    <\/div>\n    <div class=\"feature-title\">Quanti caratteri?<\/div>\n    <div class=\"feature-desc\">Il mapper ha bisogno di almeno 150 caratteri per essere affidabile, ma si ottengono risultati ottimali con testi di almeno 400 caratteri. Non c&#8217;\u00e8 un limite massimo di caratteri, ma sopra ai 1000 caratteri il mapper restituisce risultati meno accurati.<\/div>\n  <\/div>\n<\/div>\n\n<!-- JS Animazione on scroll -->\n<script>\n  const boxes = document.querySelectorAll('.feature-box');\n\n  const observer = new IntersectionObserver((entries) => {\n    entries.forEach(entry => {\n      if (entry.isIntersecting) {\n        entry.target.classList.add('visible');\n        observer.unobserve(entry.target);\n      }\n    });\n  }, { threshold: 0.4 });\n\n  boxes.forEach(box => observer.observe(box));\n<\/script>\n\n\n\n<!-- Font e Chart.js -->\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@400;600;800&#038;display=swap\" rel=\"stylesheet\">\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n\n<style>\n  body {\n    margin: 0;\n    font-family: 'Manrope', sans-serif;\n    background-color: #FFFFFF;\n    color: #333;\n  }\n\n  .wrapper {\n    display: flex;\n    justify-content: center;\n    padding: 60px 30px;\n    background-color: #e6f0fa;\n    border-radius: 32px;\n    margin: 35px auto!important;\n    max-width: 1000px!important; \/* Limite massimo *\/\n    box-shadow: 0 8px 20px rgba(0, 0, 0, 0.05);\n    animation: fadeInWrapper 1s ease forwards;\n  }\n\n  @keyframes fadeInWrapper {\n    from { opacity: 0; transform: translateY(20px); }\n    to   { opacity: 1; transform: translateY(0); }\n  }\n\n  .card {\n    background-color: #fff;\n    border-radius: 24px;\n    box-shadow: 0 12px 32px rgba(0, 0, 0, 0.1);\n    padding: 60px 70px;\n    max-width: 900px;\n    width: 100%;\n    animation: fadeInCard 0.8s ease forwards;\n  }\n\n  @keyframes fadeInCard {\n    from { opacity: 0; transform: translateY(20px); }\n    to   { opacity: 1; transform: translateY(0); }\n  }\n\n  .card:hover {\n    transform: translateY(-4px);\n    box-shadow: 0 16px 40px rgba(0, 0, 0, 0.12);\n  }\n\n  .logo {\n    text-align: center;\n    margin-bottom: 35px;\n  }\n\n  .logo img {\n    max-height: 90px;\n  }\n\n  h1 {\n    font-size: 40px;\n    color: #003366!important;\n    text-align: center;\n    margin-bottom: 15px;\n    font-weight: 800;\n  }\n\n  .description {\n    text-align: center;\n    font-size: 16px;\n    color: #444;\n    margin-bottom: 40px;\n    line-height: 1.5;\n  }\n\n  textarea {\n    width: 100%;\n    height: 200px;\n    padding: 20px;\n    font-size: 17px;\n    border: 2px solid #ccc;\n    border-radius: 16px;\n    resize: vertical;\n    background-color: #f9fbfd;\n    font-family: 'Manrope', sans-serif;\n    line-height: 1.6;\n  }\n\n  textarea:focus {\n    border-color: #0055a5;\n    outline: none;\n    box-shadow: 0 0 0 4px rgba(0, 85, 165, 0.15);\n    background-color: white;\n  }\n\n  .buttons {\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: center;\n    margin: -10px;  \/* Compensa i margin interni *\/\n  }\n\n  .buttons button {\n    flex: 0 1 auto;\n    width: 350px;\n    margin: 10px;  \/* Usa margin invece di gap *\/\n    padding: 14px 0;\n    border: none;\n    border-radius: 8px;\n    background: #007BFF;\n    color: #fff;\n    cursor: pointer;\n    text-align: center;\n    transition: background 0.3s;\n    font-family: 'Manrope', sans-serif !important;\n    font-size: 18px;\n  }\n\n  .buttons button:hover {\n    background: #0056b3;\n  }\n  \n  #risultato {\n    margin-top: 28px;\n    font-size: 18px;\n    text-align: center;\n    font-weight: 600;\n  }\n\n  #immaginiSDG {\n    margin-top: 30px;\n  }\n\n  .sdg-row {\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: center;\n    gap: 25px;\n    margin-bottom: 25px;\n  }\n\n  .sdg-row-large {\n    margin-bottom: 40px;\n  }\n\n  .sdg-row-small {\n    justify-content: center;\n    gap: 10px;\n  }\n\n  #graficoContainer {\n    margin-top: 50px;\n    text-align: center;\n    display: none;\n  }\n\n  #graficoSDG {\n    max-width: 360px;\n    margin: 0 auto;\n  }\n\n  #resetBtn {\n    display: none;\n  }\n\n  \/* FLIP CARD STYLES *\/\n  .flip-card {\n    background-color: transparent;\n    perspective: 1000px;\n  }\n\n  .flip-card.large {\n    width: 160px;\n    height: 160px;\n  }\n\n  .flip-card.small {\n    width: 70px;\n    height: 70px;\n  }\n\n  .flip-card-inner {\n    position: relative;\n    width: 100%;\n    height: 100%;\n    text-align: center;\n    transition: transform 0.6s;\n    transform-style: preserve-3d;\n    cursor: pointer;\n  }\n\n  .flip-card:hover .flip-card-inner {\n    transform: rotateY(180deg);\n  }\n\n  .flip-card-front,\n  .flip-card-back {\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    border-radius: 10px;\n    backface-visibility: hidden;\n    overflow: hidden;\n    box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n  }\n\n  .flip-card-front img {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n  }\n\n  .flip-card-back {\n    background-color: #003366;\n    color: white;\n    transform: rotateY(180deg);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 10px;\n    font-size: 14px;\n  }\n\n  .sdg-secondary-title {\n    margin-top: 10px;\n    margin-bottom: 15px;\n    font-size: 0.9em;\n    text-align: center;\n    color: rgba(16, 44, 83, 0.85); \/* #102C53 leggermente trasparente *\/\n    font-weight: 600;\n  }\n<\/style>\n\n<div class=\"wrapper\">\n  <div class=\"card\">\n    <div class=\"logo\">\n      <img decoding=\"async\" src=\"http:\/\/www.sdg.test.polimi.it\/wp-content\/uploads\/2025\/05\/logopolimi.jpg\" alt=\"Politecnico di Milano\">\n    <\/div>\n    <h1>Mapper SDG<\/h1>\n    <p class=\"description\">Enter or paste a descriptive text to find out which SDGs it relates to<\/p>\n    <textarea id=\"inputTesto\" placeholder=\"Enter at least 150 characters of text for analysis...\"><\/textarea>\n\n    <div class=\"buttons\">\n      <button onclick=\"inviaTesto()\">Analyze the text<\/button>\n      <button id=\"resetBtn\" onclick=\"resetta()\">Reset<\/button>\n    <\/div>\n\n    <div id=\"risultato\"><\/div>\n    <div id=\"immaginiSDG\"><\/div>\n\n    <div id=\"graficoContainer\">\n      <canvas id=\"graficoSDG\"><\/canvas>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n\n  let chart;\n\n  console.log(\"Chiamate:\", dacnisChildData.numero_chiamate);\n  console.log(\"Risultati:\", dacnisChildData.numero_risultati);\n\n  \/\/ Inizializza i contatori leggendo dai dati passati da PHP tramite wp_localize_script\n  let numeroChiamate = parseInt(dacnisChildData.numero_chiamate) || 0;\n  let numeroRisultati = parseInt(dacnisChildData.numero_risultati) || 0;\n\n  \/\/ Quando il DOM \u00e8 pronto, mostra i contatori attuali\n  document.addEventListener(\"DOMContentLoaded\", () => {\n    document.getElementById(\"contatoreChiamate\").textContent = numeroChiamate;\n    document.getElementById(\"contatoreSDGTrovati\").textContent = numeroRisultati;\n  });\n\n  async function inviaTesto() {\n    const testo = document.getElementById(\"inputTesto\").value.trim();\n    const risultatoDiv = document.getElementById(\"risultato\");\n    const immaginiDiv = document.getElementById(\"immaginiSDG\");\n    const resetBtn = document.getElementById(\"resetBtn\");\n\n    \/\/ Incrementa contatore chiamate e aggiorna in pagina\n    numeroChiamate++;\n    document.getElementById(\"contatoreChiamate\").textContent = numeroChiamate;\n\n    \/\/ Invio aggiornamento al server per il contatore chiamate\n    fetch(dacnisChildData.ajax_url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application\/x-www-form-urlencoded'\n      },\n      body: new URLSearchParams({\n        action: 'dacnis_child_incrementa_contatori',\n        incremento_chiamate: 1,\n        incremento_risultati: 0\n      })\n    });\n\n    \/\/ Reset visuale risultati precedenti\n    immaginiDiv.innerHTML = `\n      <div class=\"sdg-row sdg-row-large\"><\/div>\n      <h3 class=\"sdg-secondary-title\" id=\"secondaryTitle\" style=\"display:none;\">Secondary results:<\/h3>\n      <div class=\"sdg-row sdg-row-small\"><\/div>\n    `;\n    const rowLarge = immaginiDiv.querySelector('.sdg-row-large');\n    const rowSmall = immaginiDiv.querySelector('.sdg-row-small');\n    const secondaryTitle = document.getElementById(\"secondaryTitle\");\n\n    risultatoDiv.textContent = '';\n    resetBtn.style.display = 'none';\n\n    if (testo.length < 150) {\n      risultatoDiv.textContent = \"Please enter at least 150 characters of text for analysis.\";\n      risultatoDiv.style.color = \"crimson\";\n      return;\n    }\n\n    risultatoDiv.textContent = \"Analysis in progress...\";\n    risultatoDiv.style.color = \"#333\";\n\n    try {\n      \/\/ Invio richiesta POST al server (ajax)\n      const response = await fetch(\"https:\/\/www.sdg-api.test.polimi.it\/elabora\", {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application\/json\" },\n        body: JSON.stringify({ testo })\n      });\n\n      const data = await response.json();\n\n      if (response.ok) {\n        const risultato = data.risultato;\n        risultatoDiv.textContent = \"Primary results:\";\n        risultatoDiv.style.color = \"darkblue\";\n        resetBtn.style.display = 'inline-block';\n\n        \/\/ Estraggo tutti i numeri SDG dal testo di risposta\n        let numeriSDG = (risultato.match(\/\\d+\/g) || []).map(Number);\n\n        \/\/ Tronco la lista a 6 elementi se pi\u00f9 lunga\n        if (numeriSDG.length > 6) {\n          numeriSDG = numeriSDG.slice(0, 6);\n        }\n\n        \/\/ Stampo nessun risultato, se non trovo risultati\n        if (numeriSDG.length < 1) {\n          risultatoDiv.textContent = \"No SDG found, try with another text\";\n          risultatoDiv.style.color = \"darkblue\";\n        }\n\n\n        \/\/ Incremento contatore risultati totali e aggiorno in pagina\n        numeroRisultati += numeriSDG.length;\n        document.getElementById(\"contatoreSDGTrovati\").textContent = numeroRisultati;\n\n        \/\/ Invio aggiornamento al server per il contatore risultati\n        fetch(dacnisChildData.ajax_url, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application\/x-www-form-urlencoded'\n          },\n          body: new URLSearchParams({\n            action: 'dacnis_child_incrementa_contatori',\n            incremento_chiamate: 0,\n            incremento_risultati: numeriSDG.length\n          })\n        });\n\n        \/\/ Conteggio frequenze SDG trovati\n        const counts = numeriSDG.reduce((acc, num) => {\n          acc[num] = (acc[num] || 0) + 1;\n          return acc;\n        }, {});\n\n        \/\/ Creo le flip card per gli SDG trovati\n        numeriSDG.forEach((num, index) => {\n          const flipCard = document.createElement('div');\n          flipCard.className = 'flip-card ' + (index < 3 ? 'large' : 'small');\n\n          const flipCardInner = document.createElement('div');\n          flipCardInner.className = 'flip-card-inner';\n\n          const front = document.createElement('div');\n          front.className = 'flip-card-front';\n          const img = document.createElement('img');\n          img.src = `http:\/\/www.sdg.test.polimi.it\/wp-content\/uploads\/2025\/06\/SDG${num}.webp`;\n          img.alt = `SDG ${num}`;\n          img.onerror = function () {\n            this.onerror = null;\n            this.src = `http:\/\/www.sdg.test.polimi.it\/wp-content\/uploads\/2025\/06\/SDG${num}.png`;\n          };\n          front.appendChild(img);\n\n          const back = document.createElement('div');\n          back.className = 'flip-card-back';\n          back.innerHTML = `Scopri di pi\u00f9`;\n          back.onclick = () => {\n            window.open(`https:\/\/sdgs.un.org\/goals\/goal${num}`, '_blank');\n          };\n\n          flipCardInner.appendChild(front);\n          flipCardInner.appendChild(back);\n          flipCard.appendChild(flipCardInner);\n\n          if (index < 3) {\n            rowLarge.appendChild(flipCard);\n          } else {\n            secondaryTitle.style.display = \"block\";\n            rowSmall.appendChild(flipCard);\n          }\n        });\n\n      } else {\n        risultatoDiv.textContent = \"Error: \" + data.errore;\n        risultatoDiv.style.color = \"crimson\";\n      }\n\n    } catch (error) {\n      risultatoDiv.textContent = \"Network error: \" + error.message;\n      risultatoDiv.style.color = \"crimson\";\n    }\n  }\n\n\n\n\n  function resetta() {\n    document.getElementById(\"inputTesto\").value = '';\n    document.getElementById(\"risultato\").textContent = '';\n    document.getElementById(\"immaginiSDG\").innerHTML = '';\n    if (chart) chart.destroy();\n    document.getElementById(\"graficoContainer\").style.display = 'none';\n    document.getElementById(\"resetBtn\").style.display = 'none';\n  }\n<\/script>\n\n\n<!-- SEZIONE BOX STATISTICHE -->\n\n<style>\n  body {\n    font-family: 'Manrope', sans-serif;\n    margin: 0;\n    background-color: #FFFFFF;\n  }\n\n  .stats-section {\n    max-width: 900px;\n    margin: 50px auto 20px;\n    padding: 0 20px;\n    display: flex;\n    justify-content: center;\n    flex-wrap: wrap;\n    margin-left: -20px; \/* Compensa i margin delle card *\/\n    margin-right: -20px;\n  }\n\n  .stat-card {\n    background: #f9f9f9;\n    border-radius: 16px;\n    box-shadow: 0 4px 12px rgba(0,0,0,0.08);\n    padding: 30px 20px;\n    text-align: center;\n    width: 260px;\n    margin: 0 20px 40px; \/* Usa margin al posto di gap *\/\n    transition: transform 0.3s ease;\n  }\n\n  .stat-card:hover {\n    transform: translateY(-5px);\n  }\n\n  .stat-number {\n    font-size: 38px;\n    font-weight: 800;\n    color: #3544d6;\n    margin-bottom: 10px;\n  }\n\n  .stat-label {\n    font-size: 16px;\n    font-weight: 600;\n    color: #333;\n  }\n\n  @media (max-width: 600px) {\n    .stat-card {\n      width: 100%;\n      margin: 0 0 20px; \/* Su mobile niente margine laterale *\/\n    }\n\n    .stats-section {\n      margin-left: 0;\n      margin-right: 0;\n    }\n  }\n<\/style>\n\n\n<div class=\"stats-section\">\n  <div class=\"stat-card\">\n    <div class=\"stat-number\" id=\"contatoreChiamate\">0<\/div>\n    <div class=\"stat-label\">Richieste analizzate<\/div>\n  <\/div>\n  <div class=\"stat-card\">\n    <div class=\"stat-number\" id=\"contatoreSDGTrovati\">0<\/div>\n    <div class=\"stat-label\">SDG restituiti<\/div>\n  <\/div>\n<\/div>\n\n\n\n\n\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Cosa analizza? Abstract di paper, programmi di insegnamenti, tesi di dottorato, syllabi didattici, estratti da progetti di ricerca, e molto altro. In che lingua? I risultati migliori si hanno con inglese e italiano, ma il mapper \u00e8 in grado di funzionare anche nelle altre lingue. Quanti caratteri? Il mapper ha bisogno di almeno 150 caratteri [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"saved_in_kubio":true,"footnotes":""},"class_list":["post-2388","page","type-page","status-publish","hentry"],"kubio_ai_page_context":{"short_desc":"","purpose":"general"},"_links":{"self":[{"href":"https:\/\/www.sdg.test.polimi.it\/en\/wp-json\/wp\/v2\/pages\/2388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sdg.test.polimi.it\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sdg.test.polimi.it\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sdg.test.polimi.it\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sdg.test.polimi.it\/en\/wp-json\/wp\/v2\/comments?post=2388"}],"version-history":[{"count":71,"href":"https:\/\/www.sdg.test.polimi.it\/en\/wp-json\/wp\/v2\/pages\/2388\/revisions"}],"predecessor-version":[{"id":3101,"href":"https:\/\/www.sdg.test.polimi.it\/en\/wp-json\/wp\/v2\/pages\/2388\/revisions\/3101"}],"wp:attachment":[{"href":"https:\/\/www.sdg.test.polimi.it\/en\/wp-json\/wp\/v2\/media?parent=2388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}