{"id":11694,"date":"2017-12-30T05:38:15","date_gmt":"2017-12-30T04:38:15","guid":{"rendered":"http:\/\/csmiguel.pt\/web\/?page_id=11694"},"modified":"2026-08-27T04:57:27","modified_gmt":"2026-08-27T03:57:27","slug":"calendario-escolar","status":"publish","type":"page","link":"https:\/\/www.csmiguel.pt\/web\/calendario-escolar\/","title":{"rendered":"Calend\u00e1rio Escolar"},"content":{"rendered":"<h1 style=\"text-align: center;\">Calend\u00e1rio Escolar 2026\/2027<\/h1>\n<p>&nbsp;<\/p>\n\r\n    <div\r\n        id=\"csm_pdf_107857\"\r\n        class=\"csm-pdf-viewer\"\r\n    >\r\n        <div class=\"csm-pdf-container\"><\/div>\r\n    <\/div>\r\n\r\n\r\n    <style>\r\n\r\n        #csm_pdf_107857 {\r\n\r\n            width: 100%;\r\n            margin: 0;\r\n            padding: 0;\r\n\r\n            background: transparent;\r\n\r\n            box-sizing: border-box;\r\n        }\r\n\r\n\r\n        #csm_pdf_107857 .csm-pdf-container {\r\n\r\n            width: 100%;\r\n            margin: 0;\r\n            padding: 0;\r\n\r\n            background: transparent;\r\n\r\n            box-sizing: border-box;\r\n        }\r\n\r\n\r\n        \/*\r\n         * Contentor de cada folha.\r\n         *\r\n         * A linha \u00e9 colocada aqui e N\u00c3O no canvas,\r\n         * para n\u00e3o alterar as dimens\u00f5es do bitmap.\r\n         *\/\r\n        #csm_pdf_107857 .pdf-page-wrapper {\r\n\r\n            display: block;\r\n\r\n            width: fit-content;\r\n\r\n            max-width: 100%;\r\n\r\n            margin:\r\n                0\r\n                auto\r\n                14px\r\n                auto;\r\n\r\n            padding: 0;\r\n\r\n            background: #ffffff;\r\n\r\n            outline:\r\n                1px solid\r\n                #d5d5d5;\r\n        }\r\n\r\n\r\n        #csm_pdf_107857 .pdf-page-wrapper:last-child {\r\n\r\n            margin-bottom: 0;\r\n        }\r\n\r\n\r\n        \/*\r\n         * Muito importante:\r\n         *\r\n         * impedir CSS do WordPress\/tema de\r\n         * redimensionar o canvas posteriormente.\r\n         *\/\r\n        #csm_pdf_107857 canvas {\r\n\r\n            display: block !important;\r\n\r\n            margin: 0 !important;\r\n            padding: 0 !important;\r\n\r\n            border: 0 !important;\r\n\r\n            max-width: none !important;\r\n\r\n            background: #ffffff;\r\n\r\n            image-rendering: auto;\r\n        }\r\n\r\n\r\n        #csm_pdf_107857 .csm-pdf-loading,\r\n        #csm_pdf_107857 .csm-pdf-error {\r\n\r\n            width: 100%;\r\n\r\n            padding: 30px 15px;\r\n\r\n            box-sizing: border-box;\r\n\r\n            text-align: center;\r\n\r\n            font-family:\r\n                Arial,\r\n                sans-serif;\r\n\r\n            font-size: 14px;\r\n        }\r\n\r\n\r\n        @media (max-width: 768px) {\r\n\r\n            #csm_pdf_107857 .pdf-page-wrapper {\r\n\r\n                margin-bottom: 8px;\r\n            }\r\n\r\n        }\r\n\r\n    <\/style>\r\n\r\n\r\n    <script type=\"module\">\r\n\r\n        import * as pdfjsLib\r\n            from \"https:\/\/www.csmiguel.pt\/web\/wp-content\/plugins\/csm-pdf-viewer\/pdfjs\/build\/pdf.mjs\";\r\n\r\n\r\n        pdfjsLib.GlobalWorkerOptions.workerSrc =\r\n            \"https:\/\/www.csmiguel.pt\/web\/wp-content\/plugins\/csm-pdf-viewer\/pdfjs\/build\/pdf.worker.mjs\";\r\n\r\n\r\n        const viewer =\r\n            document.getElementById(\r\n                \"csm_pdf_107857\"\r\n            );\r\n\r\n\r\n        const container =\r\n            viewer.querySelector(\r\n                \".csm-pdf-container\"\r\n            );\r\n\r\n\r\n        let pdfDoc = null;\r\n\r\n        let rendering = false;\r\n\r\n        let renderAgain = false;\r\n\r\n        let lastContainerWidth = 0;\r\n\r\n\r\n\r\n        function showLoading() {\r\n\r\n            container.innerHTML =\r\n                '<div class=\"csm-pdf-loading\">' +\r\n                'A carregar documento...' +\r\n                '<\/div>';\r\n        }\r\n\r\n\r\n\r\n        function showError(message) {\r\n\r\n            container.innerHTML =\r\n                '<div class=\"csm-pdf-error\">' +\r\n                '<strong>Erro ao carregar o PDF.<\/strong>' +\r\n                '<br><br>' +\r\n                message +\r\n                '<\/div>';\r\n        }\r\n\r\n\r\n\r\n        async function renderAllPages() {\r\n\r\n            if (!pdfDoc) {\r\n                return;\r\n            }\r\n\r\n\r\n            if (rendering) {\r\n\r\n                renderAgain = true;\r\n\r\n                return;\r\n            }\r\n\r\n\r\n            rendering = true;\r\n            renderAgain = false;\r\n\r\n\r\n            \/*\r\n             * Largura dispon\u00edvel.\r\n             *\/\r\n            const rawContainerWidth =\r\n                container.getBoundingClientRect().width;\r\n\r\n\r\n            if (rawContainerWidth < 100) {\r\n\r\n                rendering = false;\r\n\r\n                return;\r\n            }\r\n\r\n\r\n            lastContainerWidth =\r\n                rawContainerWidth;\r\n\r\n\r\n            \/*\r\n             * Escala real do monitor\/browser.\r\n             *\r\n             * N\u00e3o for\u00e7amos 2x, 3x nem 4x.\r\n             *\/\r\n            const dpr =\r\n                window.devicePixelRatio || 1;\r\n\r\n\r\n            \/*\r\n             * PONTO IMPORTANTE:\r\n             *\r\n             * escolhemos uma largura CSS que corresponda\r\n             * exatamente a um n\u00famero inteiro de p\u00edxeis\r\n             * f\u00edsicos.\r\n             *\r\n             * Exemplo com DPR 1.25:\r\n             *\r\n             * 937 CSS px n\u00e3o \u00e9 bom:\r\n             * 937 \u00d7 1.25 = 1171.25 p\u00edxeis\r\n             *\r\n             * Vamos escolher uma largura que resulte\r\n             * exatamente num n\u00famero inteiro.\r\n             *\/\r\n            const physicalWidth =\r\n                Math.floor(\r\n                    rawContainerWidth * dpr\r\n                );\r\n\r\n\r\n            const alignedCssWidth =\r\n                physicalWidth \/ dpr;\r\n\r\n\r\n            container.innerHTML = \"\";\r\n\r\n\r\n            try {\r\n\r\n                for (\r\n                    let pageNum = 1;\r\n                    pageNum <= pdfDoc.numPages;\r\n                    pageNum++\r\n                ) {\r\n\r\n                    const page =\r\n                        await pdfDoc.getPage(\r\n                            pageNum\r\n                        );\r\n\r\n\r\n                    \/*\r\n                     * Dimens\u00e3o original da p\u00e1gina PDF.\r\n                     *\/\r\n                    const baseViewport =\r\n                        page.getViewport({\r\n                            scale: 1\r\n                        });\r\n\r\n\r\n                    \/*\r\n                     * Escala necess\u00e1ria para a p\u00e1gina\r\n                     * ocupar exatamente a largura\r\n                     * dispon\u00edvel.\r\n                     *\/\r\n                    const displayScale =\r\n                        alignedCssWidth \/\r\n                        baseViewport.width;\r\n\r\n\r\n                    const viewport =\r\n                        page.getViewport({\r\n                            scale: displayScale\r\n                        });\r\n\r\n\r\n                    \/*\r\n                     * Dimens\u00f5es em p\u00edxeis f\u00edsicos.\r\n                     *\/\r\n                    const pixelWidth =\r\n                        Math.round(\r\n                            viewport.width * dpr\r\n                        );\r\n\r\n\r\n                    const pixelHeight =\r\n                        Math.round(\r\n                            viewport.height * dpr\r\n                        );\r\n\r\n\r\n                    \/*\r\n                     * Recalculamos a dimens\u00e3o CSS\r\n                     * a partir dos p\u00edxeis reais.\r\n                     *\r\n                     * Desta forma a rela\u00e7\u00e3o \u00e9 EXATAMENTE\r\n                     * devicePixelRatio.\r\n                     *\/\r\n                    const cssWidth =\r\n                        pixelWidth \/ dpr;\r\n\r\n\r\n                    const cssHeight =\r\n                        pixelHeight \/ dpr;\r\n\r\n\r\n\r\n                    const wrapper =\r\n                        document.createElement(\r\n                            \"div\"\r\n                        );\r\n\r\n\r\n                    wrapper.className =\r\n                        \"pdf-page-wrapper\";\r\n\r\n\r\n\r\n                    const canvas =\r\n                        document.createElement(\r\n                            \"canvas\"\r\n                        );\r\n\r\n\r\n                    \/*\r\n                     * Resolu\u00e7\u00e3o REAL do canvas.\r\n                     *\/\r\n                    canvas.width =\r\n                        pixelWidth;\r\n\r\n\r\n                    canvas.height =\r\n                        pixelHeight;\r\n\r\n\r\n\r\n                    \/*\r\n                     * Dimens\u00e3o visual.\r\n                     *\r\n                     * Usamos !important para impedir\r\n                     * o tema WordPress de fazer\r\n                     * qualquer resize do canvas.\r\n                     *\/\r\n                    canvas.style.setProperty(\r\n                        \"width\",\r\n                        cssWidth + \"px\",\r\n                        \"important\"\r\n                    );\r\n\r\n\r\n                    canvas.style.setProperty(\r\n                        \"height\",\r\n                        cssHeight + \"px\",\r\n                        \"important\"\r\n                    );\r\n\r\n\r\n\r\n                    const context =\r\n                        canvas.getContext(\r\n                            \"2d\",\r\n                            {\r\n                                alpha: false\r\n                            }\r\n                        );\r\n\r\n\r\n\r\n                    wrapper.appendChild(\r\n                        canvas\r\n                    );\r\n\r\n\r\n                    container.appendChild(\r\n                        wrapper\r\n                    );\r\n\r\n\r\n\r\n                    \/*\r\n                     * M\u00e9todo recomendado pelo PDF.js\r\n                     * para HiDPI:\r\n                     *\r\n                     * viewport = dimens\u00e3o CSS\r\n                     * transform = devicePixelRatio\r\n                     *\/\r\n                    const transform =\r\n                        dpr !== 1\r\n                            ? [\r\n                                dpr,\r\n                                0,\r\n                                0,\r\n                                dpr,\r\n                                0,\r\n                                0\r\n                            ]\r\n                            : null;\r\n\r\n\r\n\r\n                    await page.render({\r\n\r\n                        canvasContext:\r\n                            context,\r\n\r\n                        viewport:\r\n                            viewport,\r\n\r\n                        transform:\r\n                            transform,\r\n\r\n                        intent:\r\n                            \"display\"\r\n\r\n                    }).promise;\r\n\r\n                }\r\n\r\n            } catch (error) {\r\n\r\n                console.error(\r\n                    \"CSM PDF Viewer:\",\r\n                    error\r\n                );\r\n\r\n\r\n                showError(\r\n                    error.message\r\n                );\r\n\r\n            } finally {\r\n\r\n                rendering = false;\r\n\r\n\r\n                if (renderAgain) {\r\n\r\n                    renderAgain = false;\r\n\r\n                    renderAllPages();\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n        showLoading();\r\n\r\n\r\n\r\n        try {\r\n\r\n            const pdfUrl =\r\n                \"https:\/\/www.csmiguel.pt\/web\/wp-content\/uploads\/documentos\/2026_2027\/CalendarioEscolar2627.pdf\";\r\n\r\n\r\n            pdfDoc =\r\n                await pdfjsLib\r\n                    .getDocument({\r\n                        url: pdfUrl\r\n                    })\r\n                    .promise;\r\n\r\n\r\n            await renderAllPages();\r\n\r\n\r\n        } catch (error) {\r\n\r\n            console.error(\r\n                \"CSM PDF Viewer:\",\r\n                error\r\n            );\r\n\r\n\r\n            showError(\r\n                error.message\r\n            );\r\n        }\r\n\r\n\r\n\r\n        \/*\r\n         * ResizeObserver \u00e9 melhor do que apenas\r\n         * window.resize porque deteta altera\u00e7\u00f5es\r\n         * reais na largura do contentor WordPress.\r\n         *\/\r\n        let resizeTimer;\r\n\r\n\r\n        const resizeObserver =\r\n            new ResizeObserver(\r\n                function(entries) {\r\n\r\n                    clearTimeout(\r\n                        resizeTimer\r\n                    );\r\n\r\n\r\n                    resizeTimer =\r\n                        setTimeout(\r\n                            function() {\r\n\r\n                                const newWidth =\r\n                                    container\r\n                                        .getBoundingClientRect()\r\n                                        .width;\r\n\r\n\r\n                                if (\r\n                                    pdfDoc &&\r\n                                    Math.abs(\r\n                                        newWidth -\r\n                                        lastContainerWidth\r\n                                    ) > 1\r\n                                ) {\r\n\r\n                                    renderAllPages();\r\n                                }\r\n\r\n                            },\r\n                            200\r\n                        );\r\n\r\n                }\r\n            );\r\n\r\n\r\n        resizeObserver.observe(\r\n            container\r\n        );\r\n\r\n    <\/script>\r\n\r\n\r\n    \n","protected":false},"excerpt":{"rendered":"<p>Calend\u00e1rio Escolar 2026\/2027<br \/>\n&nbsp;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-blank-canvas.php","meta":{"pgc_meta":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"iawp_total_views":15505,"footnotes":""},"class_list":["post-11694","page","type-page","status-publish","hentry"],"pgc_meta":"","_links":{"self":[{"href":"https:\/\/www.csmiguel.pt\/web\/wp-json\/wp\/v2\/pages\/11694"}],"collection":[{"href":"https:\/\/www.csmiguel.pt\/web\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csmiguel.pt\/web\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csmiguel.pt\/web\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csmiguel.pt\/web\/wp-json\/wp\/v2\/comments?post=11694"}],"version-history":[{"count":35,"href":"https:\/\/www.csmiguel.pt\/web\/wp-json\/wp\/v2\/pages\/11694\/revisions"}],"predecessor-version":[{"id":19727,"href":"https:\/\/www.csmiguel.pt\/web\/wp-json\/wp\/v2\/pages\/11694\/revisions\/19727"}],"wp:attachment":[{"href":"https:\/\/www.csmiguel.pt\/web\/wp-json\/wp\/v2\/media?parent=11694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}