{"id":1788,"date":"2024-09-09T11:52:54","date_gmt":"2024-09-09T06:22:54","guid":{"rendered":"https:\/\/mysitedemo.in\/iitmech\/?page_id=1788"},"modified":"2025-11-24T16:10:13","modified_gmt":"2025-11-24T10:40:13","slug":"publications","status":"publish","type":"page","link":"https:\/\/iitrpr.ac.in\/mechanical\/publications\/","title":{"rendered":"Publications"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"1788\" class=\"elementor elementor-1788\" data-elementor-settings=\"{&quot;element_pack_global_tooltip_width&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;element_pack_global_tooltip_width_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;element_pack_global_tooltip_width_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;element_pack_global_tooltip_padding&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_padding_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_padding_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_border_radius&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_border_radius_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_border_radius_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true}}\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8ea1a5f e-flex e-con-boxed e-con e-parent\" data-id=\"8ea1a5f\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6b9fe72 e-flex e-con-boxed e-con e-parent\" data-id=\"6b9fe72\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a53cef elementor-widget elementor-widget-shortcode\" data-id=\"7a53cef\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- Faculty Publications \u2014 fixed: faculty links normalized to absolute Google Scholar profiles -->\r\n<div id=\"publications-section\" class=\"pub-container\">\r\n  <h2 class=\"pub-heading\">Faculty Publications<\/h2>\r\n  <p class=\"pub-sub\">Recent Publications of Faculty Members<\/p>\r\n\r\n  <!-- Controls -->\r\n  <div class=\"pub-controls\" style=\"text-align:center; margin-bottom:12px;\">\r\n    <input type=\"text\" id=\"searchBox\" class=\"search-box\" placeholder=\"Search by name, title, or journal...\">\r\n    <select id=\"yearFilter\" style=\"margin-left:8px; padding:8px; border-radius:6px; border:1px solid #ccc;\">\r\n      <option value=\"\">All Years<\/option>\r\n    <\/select>\r\n  <\/div>\r\n\r\n  <!-- Last Updated -->\r\n  <p id=\"last-updated\" class=\"updated-label\">Loading update date...<\/p>\r\n\r\n  <div id=\"loading\">Loading publications...<\/div>\r\n  <div id=\"publications-container\"><\/div>\r\n<\/div>\r\n\r\n<style>\r\n.pub-container { font-family: \"Nunito\", sans-serif; padding: 20px; background-color: #f7f9fb; }\r\n.pub-heading { text-align: center; color: #003366; margin-bottom: 5px; font-size: 1.8rem; font-weight:700; }\r\n.pub-sub { text-align: center; color: #666; margin-bottom: 10px; }\r\n.search-box { width: 62%; max-width: 420px; padding: 10px; border-radius: 6px; border: 1px solid #ccc; }\r\n.updated-label { text-align: center; color: #777; font-size: 0.9rem; font-style: italic; margin-bottom: 14px; }\r\n.faculty-card { background: #fff; padding: 18px; border-radius: 12px; border: 1px solid #ddd; margin-bottom: 20px; box-shadow: 0 2px 6px rgba(0,0,0,0.08); }\r\n.faculty-name { font-size: 1.2rem; color: #003d66; font-weight:700; display:inline-block; margin-bottom:10px; }\r\n.faculty-name a { color:#003d66; text-decoration:none; border-bottom:2px solid #003366; padding-bottom:4px; }\r\n.pub-list { list-style:none; padding-left:0; margin-top:8px; }\r\n.pub-item { margin-bottom:8px; line-height:1.45; }\r\n.pub-meta { color:#444; font-size:0.9rem; }\r\n<\/style>\r\n\r\n<script>\r\n(async function () {\r\n  \/\/ ---------- set this to your JSON URL ----------\r\n  const url = \"https:\/\/mechiitrpr.github.io\/faculty-publications\/faculty_publications.json\";\r\n  \/\/ For local\/deployment transformation use: const url = \"\/mnt\/data\/output\/faculty_publications.json\";\r\n\r\n  const container = document.getElementById(\"publications-container\");\r\n  const loading = document.getElementById(\"loading\");\r\n  const updatedLabel = document.getElementById(\"last-updated\");\r\n  const searchBox = document.getElementById(\"searchBox\");\r\n  const yearFilter = document.getElementById(\"yearFilter\");\r\n\r\n  let allData = [];\r\n\r\n  \/\/ normalize any stored link to a safe, absolute Google Scholar profile URL\r\n  function normalizeProfileLink(rawLink) {\r\n    if (!rawLink) return \"#\";\r\n    rawLink = String(rawLink).trim();\r\n\r\n    \/\/ If already absolute, return as-is\r\n    if (\/^https?:\\\/\\\/\/i.test(rawLink)) return rawLink;\r\n\r\n    \/\/ If starts with \/citations -> prepend domain\r\n    if (rawLink.startsWith(\"\/citations\")) {\r\n      return \"https:\/\/scholar.google.com\" + rawLink;\r\n    }\r\n\r\n    \/\/ If looks like query string: citations?user=...\r\n    if (rawLink.startsWith(\"citations\") || rawLink.startsWith(\"?\") || rawLink.includes(\"view_op=\")) {\r\n      \/\/ try to extract user=... param\r\n      const m = rawLink.match(\/user=([A-Za-z0-9_-]+)\/i);\r\n      if (m && m[1]) return `https:\/\/scholar.google.com\/citations?user=${m[1]}&hl=en`;\r\n      \/\/ fallback: attach to domain\r\n      return \"https:\/\/scholar.google.com\/\" + rawLink.replace(\/^\\\/\/, \"\");\r\n    }\r\n\r\n    \/\/ If it contains 'user=' anywhere (e.g. partial), extract user id\r\n    {\r\n      const m2 = rawLink.match(\/user=([A-Za-z0-9_-]+)\/i);\r\n      if (m2 && m2[1]) return `https:\/\/scholar.google.com\/citations?user=${m2[1]}&hl=en`;\r\n    }\r\n\r\n    \/\/ If someone stored 'user:ID' or 'ID' only, attempt to detect\r\n    const m3 = rawLink.match(\/([A-Za-z0-9_-]{10,})\/);\r\n    if (m3 && m3[1]) {\r\n      \/\/ best-effort: assume it's a user id\r\n      return `https:\/\/scholar.google.com\/citations?user=${m3[1]}&hl=en`;\r\n    }\r\n\r\n    \/\/ final fallback: ensure absolute by prefixing domain\r\n    return \"https:\/\/scholar.google.com\/\" + rawLink.replace(\/^\\\/\/, \"\");\r\n  }\r\n\r\n  async function fetchData() {\r\n    try {\r\n      const r = await fetch(url + \"?t=\" + Date.now());\r\n      if (!r.ok) throw new Error(\"JSON fetch failed: \" + r.status);\r\n      const data = await r.json();\r\n      allData = Array.isArray(data) ? data : [];\r\n\r\n      \/\/ Replace\/augment each record with normalized profile link (safe)\r\n      allData = allData.map(rec => {\r\n        const copy = Object.assign({}, rec);\r\n        copy._ProfileLink = normalizeProfileLink(copy.Link || copy.ProfileLink || \"\");\r\n        return copy;\r\n      });\r\n\r\n      loading.style.display = \"none\";\r\n\r\n      \/\/ Last updated label from header if possible\r\n      const lm = r.headers.get(\"Last-Modified\");\r\n      if (lm) {\r\n        updatedLabel.textContent = \"Last updated on: \" + new Date(lm).toLocaleDateString(\"en-IN\", { year:\"numeric\", month:\"long\", day:\"numeric\" });\r\n      }\r\n\r\n      buildFiltersAndRender();\r\n    } catch (e) {\r\n      console.error(e);\r\n      loading.textContent = \"\u26a0\ufe0f Unable to load publications. Check JSON URL and CORS.\";\r\n    }\r\n  }\r\n\r\n  function buildFiltersAndRender() {\r\n    const years = Array.from(new Set(allData.map(p => p.Year).filter(Boolean))).sort((a,b)=>b-a);\r\n    yearFilter.innerHTML = \"<option value=''>All Years<\/option>\";\r\n    years.forEach(y => {\r\n      const opt = document.createElement(\"option\");\r\n      opt.value = y; opt.textContent = y;\r\n      yearFilter.appendChild(opt);\r\n    });\r\n\r\n    renderGroup(groupByFaculty(allData));\r\n  }\r\n\r\n  \/\/ group uses normalized _ProfileLink and keeps pubs array\r\n  function groupByFaculty(data) {\r\n    const grouped = {};\r\n    data.forEach(pub => {\r\n      const faculty = pub[\"Faculty Name\"] || \"Unknown\";\r\n      if (!grouped[faculty]) grouped[faculty] = { profile: pub._ProfileLink || \"#\", pubs: [] };\r\n      grouped[faculty].pubs.push(pub);\r\n    });\r\n    Object.keys(grouped).forEach(k => {\r\n      grouped[k].pubs.sort((a,b) => (b.Year||0) - (a.Year||0));\r\n    });\r\n    return grouped;\r\n  }\r\n\r\n  function renderGroup(grouped) {\r\n    container.innerHTML = \"\"; \/\/ clear all cards\r\n\r\n    for (const [faculty, info] of Object.entries(grouped)) {\r\n      const profileLink = info.profile || \"#\";\r\n      const pubs = info.pubs;\r\n\r\n      const card = document.createElement(\"div\");\r\n      card.className = \"faculty-card\";\r\n\r\n      const nameDiv = document.createElement(\"div\");\r\n      nameDiv.className = \"faculty-name\";\r\n      nameDiv.innerHTML = `<a href=\"${escapeHTML(profileLink)}\" target=\"_blank\">${escapeHTML(faculty)}<\/a>`;\r\n      card.appendChild(nameDiv);\r\n\r\n      const ul = document.createElement(\"ul\");\r\n      ul.className = \"pub-list\";\r\n\r\n      pubs.slice(0,5).forEach(pub => {\r\n        const li = document.createElement(\"li\");\r\n        li.className = \"pub-item\";\r\n\r\n        \/\/ plain text title (no link)\r\n        li.innerHTML = `<strong>${escapeHTML(pub.Title || \"\u2014\")}<\/strong><br>\r\n                        <span class=\"pub-meta\"><em>${escapeHTML(pub.Journal || \"\u2014\")}<\/em> \u2022 ${escapeHTML(pub.Year || \"\u2014\")}<\/span>`;\r\n        ul.appendChild(li);\r\n      });\r\n\r\n      card.appendChild(ul);\r\n      container.appendChild(card);\r\n    }\r\n  }\r\n\r\n  function applyFilters() {\r\n    const q = (searchBox.value || \"\").trim().toLowerCase();\r\n    const y = yearFilter.value;\r\n    const filtered = allData.filter(pub => {\r\n      if (y && String(pub.Year) !== String(y)) return false;\r\n      if (!q) return true;\r\n      return [\r\n        pub[\"Faculty Name\"], pub.Title, pub.Journal, pub.Year\r\n      ].some(f => (String(f || \"\").toLowerCase().includes(q)));\r\n    });\r\n    renderGroup(groupByFaculty(filtered));\r\n  }\r\n\r\n  function escapeHTML(s) {\r\n    if (s === null || s === undefined) return \"\";\r\n    return String(s).replace(\/[&<>\"']\/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[m]));\r\n  }\r\n\r\n  \/\/ stable listeners\r\n  searchBox.addEventListener(\"input\", applyFilters);\r\n  yearFilter.addEventListener(\"change\", applyFilters);\r\n\r\n  \/\/ start\r\n  fetchData();\r\n\r\n})();\r\n<\/script>\r\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1788","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/iitrpr.ac.in\/mechanical\/wp-json\/wp\/v2\/pages\/1788","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/iitrpr.ac.in\/mechanical\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/iitrpr.ac.in\/mechanical\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/iitrpr.ac.in\/mechanical\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/iitrpr.ac.in\/mechanical\/wp-json\/wp\/v2\/comments?post=1788"}],"version-history":[{"count":53,"href":"https:\/\/iitrpr.ac.in\/mechanical\/wp-json\/wp\/v2\/pages\/1788\/revisions"}],"predecessor-version":[{"id":5791,"href":"https:\/\/iitrpr.ac.in\/mechanical\/wp-json\/wp\/v2\/pages\/1788\/revisions\/5791"}],"wp:attachment":[{"href":"https:\/\/iitrpr.ac.in\/mechanical\/wp-json\/wp\/v2\/media?parent=1788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}