{"id":352,"date":"2026-06-17T14:25:33","date_gmt":"2026-06-17T14:25:33","guid":{"rendered":"https:\/\/imo.udec.cl\/?page_id=352"},"modified":"2026-09-02T13:18:12","modified_gmt":"2026-09-02T13:18:12","slug":"publicaciones-cientificas","status":"publish","type":"page","link":"https:\/\/imo.udec.cl\/en\/publicaciones-cientificas\/","title":{"rendered":"Scientific Publications"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"352\" class=\"elementor elementor-352\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-01bd67b e-con e-atomic-element e-flexbox-base e-01bd67b-a2e68ad \" data-id=\"01bd67b\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"01bd67b\" data-e-type=\"e-flexbox\" data-id=\"01bd67b\">\n    \t\t<div class=\"elementor-element elementor-element-101cee6 elementor-widget elementor-widget-heading\" data-id=\"101cee6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Publicaciones Cient\u00edficas<\/h1>\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-9dd8d35 e-flex e-con-boxed e-con e-parent\" data-id=\"9dd8d35\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f4ed523 elementor-widget elementor-widget-html\" data-id=\"f4ed523\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"es\">\n\n<head>\n\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n<title>Buscar publicaciones<\/title>\n\n<style>\n\n:root {\n    --navy: #142440;\n    --title: #172033;\n    --text: #5c6b85;\n\n    --filter-bg: #f5f7fa;\n\n    --line-bg: #edfff4;\n    --line-border: #a5ebc0;\n    --line-text: #176b3b;\n\n    --year-bg: #eef8ff;\n    --year-border: #adddff;\n    --year-text: #075e9f;\n\n    --journal-bg: #fef3c7;\n    --journal-border: #fde68a;\n    --journal-text: #92400e;\n\n    --url-bg: #f0fdfa;\n    --url-border: #ccfbf1;\n    --url-text: #0d9488;\n\n    --active: #b5a77b;\n}\n\n\n\/* ============================================================\n   BASE\n   ============================================================ *\/\n\n* {\n    box-sizing: border-box;\n}\n\nhtml {\n    scroll-behavior: smooth;\n}\n\nbody {\n    margin: 0;\n    min-height: 100vh;\n\n    background: var(--navy);\n\n    font-family:\n        Inter,\n        ui-sans-serif,\n        system-ui,\n        -apple-system,\n        BlinkMacSystemFont,\n        \"Segoe UI\",\n        sans-serif;\n\n    color: var(--text);\n}\n\nbutton,\nselect,\na {\n    font: inherit;\n}\n\n\n\/* ============================================================\n   CONTENEDOR PRINCIPAL\n   ============================================================ *\/\n\n.papers-page {\n    width: 100%;\n    min-height: 100vh;\n\n    padding: 0 18px 38px;\n}\n\n\n\/* ============================================================\n   T\u00cdTULO\n   ============================================================ *\/\n\n.header {\n    padding: 14px 0 30px;\n\n    text-align: center;\n}\n\n.header h1 {\n    margin: 0;\n\n    color: #ffffff;\n\n    font-size: clamp(28px, 3vw, 36px);\n    font-weight: 850;\n\n    letter-spacing: -0.025em;\n}\n\n\n\/* ============================================================\n   FILTROS\n   ============================================================ *\/\n\n.filters {\n    width: 100%;\n\n    margin-bottom: 27px;\n    padding: 20px 21px;\n\n    background: #f7f8fa;\n\n    border-radius: 8px;\n\n    display: grid;\n\n    grid-template-columns:\n        minmax(180px, 1fr)\n        minmax(260px, 1fr)\n        minmax(260px, 1fr);\n\n    gap: 20px;\n}\n\n.filter {\n    min-width: 0;\n}\n\n.filter label {\n    display: block;\n\n    margin-bottom: 7px;\n\n    color: #26354d;\n\n    font-size: 14px;\n    font-weight: 700;\n}\n\n.filter select {\n    display: block;\n\n    width: 100%;\n    height: 36px;\n\n    padding: 5px 10px;\n\n    background: #ffffff;\n\n    border: 1px solid #cbd5e1;\n    border-radius: 5px;\n\n    color: #26354d;\n\n    font-size: 14px;\n}\n\n.filter select:focus {\n    outline: none;\n\n    border-color: #72b7ff;\n\n    box-shadow:\n        0 0 0 2px rgba(114,183,255,.18);\n}\n\n\n\/* ============================================================\n   CONTADOR\n   ============================================================ *\/\n\n.count {\n    margin-bottom: 17px;\n\n    color: rgba(255,255,255,.38);\n\n    font-size: 14px;\n}\n\n\n\/* ============================================================\n   LISTA\n   ============================================================ *\/\n\n.list {\n    display: grid;\n\n    gap: 19px;\n}\n\n\n\/* ============================================================\n   PAPER\n   ============================================================ *\/\n\n.paper {\n    width: 100%;\n\n    padding: 20px 21px 21px;\n\n    background: #ffffff;\n\n    border-radius: 7px;\n\n    transition:\n        transform .18s ease,\n        box-shadow .18s ease;\n}\n\n.paper:hover {\n    transform: translateY(-2px);\n\n    box-shadow:\n        0 6px 16px rgba(0,0,0,.08);\n}\n\n\n\/* ============================================================\n   T\u00cdTULO PAPER\n   ============================================================ *\/\n\n.paper-title {\n    margin: 0;\n\n    padding-bottom: 10px;\n\n    border-bottom: 1px solid #dce2e9;\n\n    color: var(--title);\n\n    font-size: clamp(17px, 1.35vw, 20px);\n    font-weight: 760;\n\n    line-height: 1.35;\n\n    letter-spacing: -0.018em;\n}\n\n\n\/* ============================================================\n   AUTORES\n   ============================================================ *\/\n\n.authors {\n    margin: 11px 0 0;\n\n    color: var(--text);\n\n    font-size: 13px;\n\n    line-height: 1.55;\n}\n\n\n\/* ============================================================\n   TAGS\n   ============================================================ *\/\n\n.footer {\n    display: flex;\n\n    flex-wrap: wrap;\n\n    align-items: center;\n\n    gap: 7px 9px;\n\n    margin-top: 13px;\n}\n\n.tag {\n    display: inline-flex;\n\n    align-items: center;\n\n    min-height: 25px;\n\n    max-width: 100%;\n\n    padding: 4px 11px;\n\n    border: 1px solid transparent;\n\n    border-radius: 999px;\n\n    font-size: 11px;\n    font-weight: 500;\n\n    line-height: 1.25;\n}\n\n\n\/* Revista *\/\n\n.tag.journal {\n    color: var(--journal-text);\n\n    background: var(--journal-bg);\n\n    border-color: var(--journal-border);\n}\n\n\n\/* A\u00f1o *\/\n\n.tag.year {\n    color: var(--year-text);\n\n    background: var(--year-bg);\n\n    border-color: var(--year-border);\n\n    white-space: nowrap;\n}\n\n\n\/* URL \/ DOI *\/\n\n.tag.url {\n    color: var(--url-text);\n\n    background: var(--url-bg);\n\n    border-color: var(--url-border);\n\n    text-decoration: none;\n}\n\n.tag.url:hover {\n    color: #ffffff;\n\n    background: var(--url-text);\n\n    border-color: var(--url-text);\n}\n\n\n\/* L\u00ednea *\/\n\n.tag.line {\n    color: var(--line-text);\n\n    background: var(--line-bg);\n\n    border-color: var(--line-border);\n}\n\n\n\/* ============================================================\n   ESTADOS\n   ============================================================ *\/\n\n.empty {\n    padding: 32px;\n\n    background: #ffffff;\n\n    border-radius: 7px;\n\n    color: var(--text);\n\n    text-align: center;\n\n    font-size: 14px;\n}\n\n\n\/* ============================================================\n   BOT\u00d3N HIST\u00d3RICO\n   ============================================================ *\/\n\n.history {\n    display: flex;\n\n    justify-content: center;\n\n    margin-top: 34px;\n}\n\n.history a {\n    display: inline-flex;\n\n    align-items: center;\n    justify-content: center;\n\n    min-height: 34px;\n\n    padding: 7px 21px;\n\n    background: var(--active);\n\n    border-radius: 3px;\n\n    color: #ffffff;\n\n    text-decoration: none;\n\n    font-size: 13px;\n\n    font-weight: 750;\n\n    transition:\n        background .18s ease,\n        transform .18s ease;\n}\n\n.history a:hover {\n    background: #a69769;\n\n    transform: translateY(-1px);\n}\n\n\n\/* ============================================================\n   RESPONSIVE\n   ============================================================ *\/\n\n@media (max-width: 850px) {\n\n    .filters {\n        grid-template-columns: 1fr;\n\n        gap: 13px;\n    }\n\n}\n\n\n@media (max-width: 620px) {\n\n    .papers-page {\n        padding-left: 12px;\n        padding-right: 12px;\n    }\n\n    .header {\n        padding-bottom: 22px;\n    }\n\n    .header h1 {\n        font-size: 27px;\n    }\n\n    .filters {\n        padding: 16px;\n    }\n\n    .paper {\n        padding: 17px;\n    }\n\n    .paper-title {\n        font-size: 17px;\n    }\n\n    .authors {\n        font-size: 13px;\n    }\n\n}\n\n\n@media (prefers-reduced-motion: reduce) {\n\n    .paper,\n    .history a {\n        transition: none;\n    }\n\n}\n\n<\/style>\n\n<\/head>\n\n\n<body>\n\n\n<div class=\"papers-page\">\n\n\n    <!-- ========================================================\n         T\u00cdTULO\n         ======================================================== -->\n\n    <header class=\"header\">\n\n        <h1>\n            BUSCAR PUBLICACIONES\n        <\/h1>\n\n    <\/header>\n\n\n    <!-- ========================================================\n         FILTROS\n         ======================================================== -->\n\n    <section class=\"filters\">\n\n\n        <div class=\"filter\">\n\n            <label for=\"year\">\n                A\u00f1o\n            <\/label>\n\n            <select id=\"year\">\n\n                <option value=\"\">\n                    Todos los a\u00f1os\n                <\/option>\n\n            <\/select>\n\n        <\/div>\n\n\n        <div class=\"filter\">\n\n            <label for=\"line\">\n                L\u00ednea de Investigaci\u00f3n\n            <\/label>\n\n            <select id=\"line\">\n\n                <option value=\"\">\n                    Todas las l\u00edneas\n                <\/option>\n\n            <\/select>\n\n        <\/div>\n\n\n        <div class=\"filter\">\n\n            <label for=\"researcher\">\n                Investigador IMO\n            <\/label>\n\n            <select id=\"researcher\">\n\n                <option value=\"\">\n                    Todos los investigadores\n                <\/option>\n\n            <\/select>\n\n        <\/div>\n\n\n    <\/section>\n\n\n    <!-- ========================================================\n         CONTADOR\n         ======================================================== -->\n\n    <div\n        id=\"count\"\n        class=\"count\">\n\n        Cargando publicaciones...\n\n    <\/div>\n\n\n    <!-- ========================================================\n         LISTA\n         ======================================================== -->\n\n    <section\n        id=\"list\"\n        class=\"list\">\n\n        <div class=\"empty\">\n            Cargando publicaciones...\n        <\/div>\n\n    <\/section>\n\n\n    <!-- ========================================================\n         HIST\u00d3RICAS\n         ======================================================== -->\n\n    <div class=\"history\">\n\n        <a href=\"https:\/\/imo.udec.cl\/repositorio\/\">\n            Publicaciones 2014\u20132015\n        <\/a>\n\n    <\/div>\n\n\n<\/div>\n\n\n<script>\n\n\n\/* ============================================================\n   CONFIGURACI\u00d3N\n   ============================================================ *\/\n\nconst API_URL =\n    \"\/intranet\/api\/publications\";\n\nconst currentYear =\n    String(new Date().getFullYear());\n\nlet publications = [];\n\n\n\/* ============================================================\n   ELEMENTOS\n   ============================================================ *\/\n\nconst yearSelect =\n    document.getElementById(\"year\");\n\nconst lineSelect =\n    document.getElementById(\"line\");\n\nconst researcherSelect =\n    document.getElementById(\"researcher\");\n\nconst list =\n    document.getElementById(\"list\");\n\nconst count =\n    document.getElementById(\"count\");\n\n\n\/* ============================================================\n   ESCAPE HTML\n   ============================================================ *\/\n\nfunction esc(value) {\n\n    return String(value ?? \"\")\n        .replaceAll(\"&\", \"&amp;\")\n        .replaceAll(\"<\", \"&lt;\")\n        .replaceAll(\">\", \"&gt;\")\n        .replaceAll('\"', \"&quot;\")\n        .replaceAll(\"'\", \"&#039;\");\n\n}\n\n\n\/* ============================================================\n   NORMALIZAR URL \/ DOI\n   ============================================================ *\/\n\nfunction normalizeUrl(value) {\n\n    if (typeof value !== \"string\") {\n        return \"\";\n    }\n\n    let u = value.trim();\n\n    if (!u) {\n        return \"\";\n    }\n\n    u = u\n        .replace(\n            \/^http:\\\/\\\/doi:(?=10\\.)\/i,\n            \"https:\/\/doi.org\/\"\n        )\n        .replace(\n            \/^https?:\\\/\\\/dx\\.doi\\.org\\\/\/i,\n            \"https:\/\/doi.org\/\"\n        );\n\n    if (\/^doi:\\s*10\\.\/i.test(u)) {\n\n        u =\n            \"https:\/\/doi.org\/\" +\n            u.replace(\/^doi:\\s*\/i, \"\");\n\n    }\n\n    if (\/^10\\.\\d{4,9}\\\/\/.test(u)) {\n\n        u =\n            \"https:\/\/doi.org\/\" + u;\n\n    }\n\n    return u;\n\n}\n\n\n\/* ============================================================\n   L\u00cdNEAS\n   ============================================================ *\/\n\nfunction getLines(value) {\n\n    if (Array.isArray(value)) {\n\n        return value\n\n            .map(item => {\n\n                if (\n                    item &&\n                    typeof item === \"object\"\n                ) {\n\n                    return (\n                        item.nombre ??\n                        item.linea ??\n                        item.name ??\n                        \"\"\n                    );\n\n                }\n\n                return String(item ?? \"\");\n\n            })\n\n            .map(x => x.trim())\n\n            .filter(Boolean);\n\n    }\n\n\n    if (\n        value &&\n        typeof value === \"object\"\n    ) {\n\n        const text =\n            value.nombre ??\n            value.linea ??\n            value.name ??\n            \"\";\n\n        return text\n            ? [String(text).trim()]\n            : [];\n\n    }\n\n\n    if (\n        typeof value !== \"string\" ||\n        !value.trim()\n    ) {\n\n        return [];\n\n    }\n\n\n    return value\n\n        .split(\/\\s*[|;]\\s*\/)\n\n        .map(x => x.trim())\n\n        .filter(Boolean);\n\n}\n\n\n\/* ============================================================\n   AUTORES\n   ============================================================ *\/\n\nfunction renderAuthors(authors) {\n\n    if (!Array.isArray(authors)) {\n\n        return esc(authors);\n\n    }\n\n\n    return authors\n\n        .map(author => {\n\n            \/*\n             * IMPORTANTE:\n             *\n             * Aqu\u00ed usamos nombre bibliogr\u00e1fico.\n             *\n             * NO usamos persona_nombre.\n             *\n             * Por eso:\n             *\n             * M. Urbina\n             *\n             * seguir\u00e1 apareciendo como:\n             *\n             * M. Urbina\n             *\/\n\n            const name =\n                String(\n                    author?.nombre ?? \"\"\n                ).trim();\n\n            if (!name) {\n                return \"\";\n            }\n\n\n            const text =\n                esc(name);\n\n\n            if (\n                Number(author?.autor_imo) === 1\n            ) {\n\n                return `<strong>${text}<\/strong>`;\n\n            }\n\n\n            return text;\n\n        })\n\n        .filter(Boolean)\n\n        .join(\"; \");\n\n}\n\n\n\/* ============================================================\n   OBTENER INVESTIGADORES IMO\n   ============================================================ *\/\nfunction getResearchers() {\n    const researchers = new Map();\n\n    publications.forEach(publication => {\n        if (!Array.isArray(publication.authors)) return;\n\n        publication.authors.forEach(author => {\n            if (Number(author?.autor_imo) !== 1) return;\n\n            const personId = author?.person_id;\n\n            if (\n                personId === null ||\n                personId === undefined ||\n                String(personId).trim() === \"\"\n            ) return;\n\n            const name = String(author?.persona_nombre ?? \"\").trim();\n\n            if (!name) return;\n\n            const key = String(personId);\n\n            if (!researchers.has(key)) {\n                researchers.set(key, name);\n            }\n        });\n    });\n\n    return [...researchers.entries()]\n        .map(([id, name]) => ({ id, name }))\n        .sort((a, b) => a.name.localeCompare(b.name, \"es\"));\n}\n\n\/* ============================================================\n   OBTENER L\u00cdNEAS DE INVESTIGACI\u00d3N\n   ============================================================ *\/\n\nfunction getAllLines() {\n\n    const lines =\n        new Set();\n\n\n    publications.forEach(publication => {\n\n        getLines(\n            publication.research_lines\n        )\n        .forEach(line => {\n\n            lines.add(line);\n\n        });\n\n    });\n\n\n    return [...lines]\n\n        .sort((a, b) =>\n            a.localeCompare(\n                b,\n                \"es\",\n                {\n                    sensitivity: \"base\"\n                }\n            )\n        );\n\n}\n\n\n\/* ============================================================\n   CREAR FILTROS\n   ============================================================ *\/\n\nfunction buildFilters() {\n\n\n    \/* --------------------------------------------------------\n       A\u00f1os\n       -------------------------------------------------------- *\/\n\n    const years =\n        [...new Set(\n\n            publications\n\n                .map(p =>\n                    String(\n                        p.year ?? \"\"\n                    )\n                )\n\n                .filter(Boolean)\n\n        )]\n\n        .sort(\n            (a, b) =>\n                Number(b) - Number(a)\n        );\n\n\n    yearSelect.innerHTML =\n\n        `<option value=\"\">\n            Todos los a\u00f1os\n         <\/option>`\n\n        +\n\n        years\n\n            .map(year =>\n\n                `<option value=\"${esc(year)}\">\n                    ${esc(year)}\n                 <\/option>`\n\n            )\n\n            .join(\"\");\n\n\n    \/* --------------------------------------------------------\n       L\u00edneas\n       -------------------------------------------------------- *\/\n\n    lineSelect.innerHTML =\n\n        `<option value=\"\">\n            Todas las l\u00edneas\n         <\/option>`\n\n        +\n\n        getAllLines()\n\n            .map(line =>\n\n                `<option value=\"${esc(line)}\">\n                    ${esc(line)}\n                 <\/option>`\n\n            )\n\n            .join(\"\");\n\n\n    \/* --------------------------------------------------------\n       Investigadores\n       -------------------------------------------------------- *\/\n\n    researcherSelect.innerHTML =\n\n        `<option value=\"\">\n            Todos los investigadores\n         <\/option>`\n\n        +\n\n        getResearchers()\n\n            .map(researcher =>\n\n                `<option value=\"${esc(researcher.id)}\">\n                    ${esc(researcher.name)}\n                 <\/option>`\n\n            )\n\n            .join(\"\");\n\n\n    \/* --------------------------------------------------------\n       A\u00f1o actual por defecto\n       -------------------------------------------------------- *\/\n\n    if (\n        years.includes(currentYear)\n    ) {\n\n        yearSelect.value =\n            currentYear;\n\n    }\n\n}\n\n\n\/* ============================================================\n   RENDER PAPER\n   ============================================================ *\/\n\nfunction renderPaper(publication) {\n\n\n    const url =\n        normalizeUrl(\n            publication.url ||\n            publication.doi ||\n            \"\"\n        );\n\n\n    \/* --------------------------------------------------------\n       Revista\n       -------------------------------------------------------- *\/\n\n    const journal =\n        publication.revista\n\n            ? `\n                <span class=\"tag journal\">\n                    ${esc(\n                        publication.revista\n                    )}\n                <\/span>\n              `\n\n            : \"\";\n\n\n    \/* --------------------------------------------------------\n       A\u00f1o\n       -------------------------------------------------------- *\/\n\n    const year =\n\n        `<span class=\"tag year\">\n            ${esc(\n                publication.year\n            )}\n         <\/span>`;\n\n\n    \/* --------------------------------------------------------\n       DOI \/ URL\n       -------------------------------------------------------- *\/\n\n    const urlTag =\n\n        url\n\n            ? `\n                <a\n                    class=\"tag url\"\n                    href=\"${esc(url)}\"\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\">\n\n                    ${esc(url)}\n\n                <\/a>\n              `\n\n            : \"\";\n\n\n    \/* --------------------------------------------------------\n       L\u00edneas\n       -------------------------------------------------------- *\/\n\n    const lineTags =\n\n        getLines(\n            publication.research_lines\n        )\n\n        .map(line =>\n\n            `<span class=\"tag line\">\n                ${esc(line)}\n             <\/span>`\n\n        )\n\n        .join(\"\");\n\n\n    \/* --------------------------------------------------------\n       Paper\n       -------------------------------------------------------- *\/\n\n    return `\n\n        <article class=\"paper\">\n\n\n            <h2 class=\"paper-title\">\n                ${esc(\n                    publication.title\n                )}\n            <\/h2>\n\n\n            <p class=\"authors\">\n                ${renderAuthors(\n                    publication.authors\n                )}\n            <\/p>\n\n\n            <div class=\"footer\">\n\n                ${journal}\n\n                ${year}\n\n                ${urlTag}\n\n                ${lineTags}\n\n            <\/div>\n\n\n        <\/article>\n\n    `;\n\n}\n\n\n\/* ============================================================\n   FILTRAR\n   ============================================================ *\/\n\nfunction filterPublications() {\n\n\n    const selectedYear =\n        yearSelect.value;\n\n    const selectedLine =\n        lineSelect.value;\n\n    const selectedResearcher =\n        researcherSelect.value;\n\n\n    const filtered =\n\n        publications.filter(\n            publication => {\n\n\n                \/* --------------------------------------------\n                   A\u00f1o\n                   -------------------------------------------- *\/\n\n                if (\n                    selectedYear &&\n                    String(\n                        publication.year\n                    ) !==\n                    selectedYear\n                ) {\n\n                    return false;\n\n                }\n\n\n                \/* --------------------------------------------\n                   L\u00ednea\n                   -------------------------------------------- *\/\n\n                if (selectedLine) {\n\n                    const lines =\n                        getLines(\n                            publication.research_lines\n                        );\n\n\n                    if (\n                        !lines.includes(\n                            selectedLine\n                        )\n                    ) {\n\n                        return false;\n\n                    }\n\n                }\n\n\n                \/* --------------------------------------------\n                   Investigador IMO\n                   -------------------------------------------- *\/\n\n                if (\n                    selectedResearcher\n                ) {\n\n                    const authors =\n                        Array.isArray(\n                            publication.authors\n                        )\n                            ? publication.authors\n                            : [];\n\n\n                    \/*\n                     * NO comparar nombre.\n                     *\n                     * M. Urbina\n                     * M.A. Urbina\n                     * Mauricio A. Urbina\n                     *\n                     * pueden ser la misma persona.\n                     *\n                     * La comparaci\u00f3n se hace\n                     * mediante person_id.\n                     *\/\n\n                    const found =\n                        authors.some(\n                            author =>\n\n                                Number(\n                                    author?.autor_imo\n                                ) === 1\n\n                                &&\n\n                                String(\n                                    author?.person_id ??\n                                    \"\"\n                                )\n                                ===\n                                String(\n                                    selectedResearcher\n                                )\n                        );\n\n\n                    if (!found) {\n\n                        return false;\n\n                    }\n\n                }\n\n\n                return true;\n\n            }\n        );\n\n\n    \/* --------------------------------------------------------\n       Contador\n       -------------------------------------------------------- *\/\n\n    if (\n        filtered.length === 1\n    ) {\n\n        count.textContent =\n            \"Mostrando 1 publicaci\u00f3n\";\n\n    }\n    else {\n\n        count.textContent =\n            `Mostrando ${filtered.length} publicaciones`;\n\n    }\n\n\n    \/* --------------------------------------------------------\n       Lista vac\u00eda\n       -------------------------------------------------------- *\/\n\n    if (\n        !filtered.length\n    ) {\n\n        list.innerHTML = `\n\n            <div class=\"empty\">\n\n                No hay publicaciones que coincidan\n                con los filtros seleccionados.\n\n            <\/div>\n\n        `;\n\n        return;\n\n    }\n\n\n    \/* --------------------------------------------------------\n       Render\n       -------------------------------------------------------- *\/\n\n    list.innerHTML =\n\n        filtered\n            .map(renderPaper)\n            .join(\"\");\n\n}\n\n\n\/* ============================================================\n   EVENTOS\n   ============================================================ *\/\n\nyearSelect.addEventListener(\n    \"change\",\n    filterPublications\n);\n\nlineSelect.addEventListener(\n    \"change\",\n    filterPublications\n);\n\nresearcherSelect.addEventListener(\n    \"change\",\n    filterPublications\n);\n\n\n\/* ============================================================\n   API\n   ============================================================ *\/\n\nasync function loadPublications() {\n\n\n    const response =\n\n        await fetch(\n            API_URL,\n            {\n                headers: {\n                    \"Accept\":\n                        \"application\/json\"\n                }\n            }\n        );\n\n\n    if (!response.ok) {\n\n        throw new Error(\n            `HTTP ${response.status}`\n        );\n\n    }\n\n\n    const data =\n        await response.json();\n    \n\n    if (\n        !data.ok ||\n        !Array.isArray(\n            data.publications\n        )\n    ) {\n\n        throw new Error(\n            \"Respuesta de API inesperada\"\n        );\n\n    }\n\n\n    publications =\n\n        data.publications.map(p => ({\n\n            title:\n                p.titulo,\n\n            authors:\n                p.autores,\n\n            year:\n                String(\n                    p.anio ?? \"\"\n                ),\n\n            research_lines:\n                p.lineas,\n\n            url:\n                p.url,\n\n            doi:\n                p.doi,\n\n            revista:\n                p.revista\n\n        }));\n\n}\n\n\n\/* ============================================================\n   INICIALIZACI\u00d3N\n   ============================================================ *\/\n\nasync function init() {\n\n    try {\n\n        await loadPublications();\n\n        buildFilters();\n\n        filterPublications();\n\n    }\n    catch (error) {\n\n        console.error(\n            \"Error cargando publicaciones:\",\n            error\n        );\n\n\n        count.textContent =\n            \"No fue posible cargar las publicaciones\";\n\n\n        list.innerHTML = `\n\n            <div class=\"empty\">\n\n                No fue posible cargar las publicaciones.\n\n            <\/div>\n\n        `;\n\n    }\n\n}\n\n\ninit();\n\n<\/script>\n\n\n<\/body>\n\n<\/html>\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":"<p>Publicaciones Cient\u00edficas Buscar publicaciones BUSCAR PUBLICACIONES A\u00f1o Todos los a\u00f1os L\u00ednea de Investigaci\u00f3n Todas las l\u00edneas Investigador IMO Todos los investigadores Cargando publicaciones&#8230; Cargando publicaciones&#8230; Publicaciones 2014\u20132015<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-352","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/pages\/352","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/comments?post=352"}],"version-history":[{"count":110,"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/pages\/352\/revisions"}],"predecessor-version":[{"id":4415,"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/pages\/352\/revisions\/4415"}],"wp:attachment":[{"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/media?parent=352"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}