Ferramentas Node — JSON e páginas MDX
Ferramentas Node que transformam os bancos SQLite (gerados pelos extratores
Python) em JSON e em páginas MDX do Docusaurus, além de gerar o CSV de
sessões do Moodle. Não há dependência nativa: os scripts usam o SQLite
embutido do Node (node:sqlite).
HTML (UTFPR)
│ extrair_*.py (Python)
▼
bancos/*.db ──(gerar-json.js · node:sqlite)──► src/data/*.json ──(gerar-mdx.js)──► docs/planejamento/*.mdx
│ ▲
└────────────────(gerar-attendance-csv.js)──► csv/<CODIGO>.csv componentes React (.tsx)
Os .db são produzidos pela parte Python (extrair_planejamento.py,
extrair_permanencia.py, extrair_salas.py) — fora do escopo deste README.
Requisitos
- Node.js 22.5+ (recomendado 24). Os scripts usam
node:sqlite, que não precisa de compilação nem denpm install. Em Node 22.5–23.3 rode ogerar-json.js/gerar-attendance-csv.jscom a flag--experimental-sqlite(no Node 23.4+/24 não é necessária). - Para o site Docusaurus (renderizar os componentes): React 18+ e TypeScript, conforme o seu projeto Docusaurus.
Os scripts de geração não têm dependências externas — npm install só é
necessário para o site Docusaurus em si.
Estrutura
.
├── package.json
├── bancos/ # coloque aqui os .db (sincrona, assincrona,
│ # procedimentos, permanencia, salas)
├── scripts/
│ ├── gerar-json.js # SQLite -> JSON (node:sqlite)
│ ├── gerar-mdx.js # JSON -> páginas .mdx (usam os componentes)
│ └── gerar-attendance-csv.js # sincrona.db -> CSV de sessões do Moodle
├── src/
│ ├── data/ # JSON gerado (fonte de verdade do site)
│ │ ├── sincrona.json assincrona.json procedimentos.json
│ │ ├── disciplinas.json # consolidado (planejamento por disciplina)
│ │ ├── permanencia.json # mapa de aulas/permanências
│ │ └── salas.json # mapa de aula por sala
│ ├── components/
│ │ ├── QuadroSemanal.tsx # grade semanal genérica (compartilhada)
│ │ ├── TabelaPlanejamento.tsx
│ │ ├── TabelaPermanencia.tsx
│ │ └── TabelaSala.tsx
│ └── types/
│ ├── planejamento.ts
│ └── mapa.ts
└── docs/
└── planejamento/ # páginas .mdx geradas
Uso rápido
# 1) bancos/*.db -> src/data/*.json
npm run gerar:json
# 2) src/data/*.json -> docs/planejamento/*.mdx
npm run gerar:mdx
# ou os dois de uma vez
npm run gerar
Scripts
gerar-json.js
Lê todos os bancos de --db-dir e grava os JSON em --out. Bancos ausentes
são apenas avisados (o JSON correspondente sai vazio).
node scripts/gerar-json.js --db-dir ./bancos --out ./src/data
| Opção | Padrão | Descrição |
|---|---|---|
--db-dir <dir> | . | Pasta com sincrona.db, assincrona.db, procedimentos.db, permanencia.db, salas.db. |
--out <dir> | . | Pasta de saída dos .json. |
-h, --help | — | Ajuda. |
Saídas: sincrona.json, assincrona.json, procedimentos.json (por
disciplina), disciplinas.json (consolidado), permanencia.json e
salas.json.
gerar-mdx.js
Lê os JSON e gera páginas .mdx que importam os componentes React e
selecionam os dados pelo slug — o JSON continua sendo a única fonte de
verdade. As páginas não definem slug: no frontmatter (a URL vem do
caminho do arquivo); os links do índice são relativos.
node scripts/gerar-mdx.js \
--data ./src/data/disciplinas.json \
--perm ./src/data/permanencia.json \
--salas ./src/data/salas.json \
--out ./docs/planejamento
| Opção | Padrão | Descrição |
|---|---|---|
--data <arquivo> | ./src/data/disciplinas.json | Consolidado do planejamento. |
--perm <arquivo> | ./src/data/permanencia.json | Mapa de permanências (opcional). |
--salas <arquivo> | ./src/data/salas.json | Mapa por sala (opcional). |
--out <dir> | ./docs/planejamento | Pasta das páginas. |
Gera: index.mdx (índice), uma página por disciplina (<slug>.mdx →
<TabelaPlanejamento>), permanencias.mdx (→ <TabelaPermanencia>) e uma
página por sala (sala-<slug>.mdx → <TabelaSala>). Permanências e salas só
são geradas quando os respectivos JSON existem e têm conteúdo.
gerar-attendance-csv.js
Gera o arquivo de importação de sessões do módulo Attendance (Presença) do
Moodle a partir das atividades síncronas (sincrona.db). O arquivo é
separado por TAB (apesar da extensão .csv), com quebras CRLF e as 22 colunas
esperadas. Datas e descrições vêm do banco; os horários from/to são a
entrada.
node scripts/gerar-attendance-csv.js --from 19:30 --to 23:00
node scripts/gerar-attendance-csv.js --from 19:30 --to 23:00 --codigo ELT82E-N21
| Opção | Padrão | Descrição |
|---|---|---|
--from HH:MM | — (obrigatório) | Horário de início da sessão. |
--to HH:MM | — (obrigatório) | Horário de fim da sessão. |
--codigo <cod> | todas | Filtra uma disciplina. |
--db <arquivo> | ./bancos/sincrona.db | Banco de origem. |
--out <dir> | . | Pasta de saída (gera <CODIGO>.csv por disciplina). |
--studentscanmark / --calendarevent / --earlyopen | 1 / 1 / 1200 | Constantes do Moodle. |
npm scripts
| Script | O que faz |
|---|---|
npm run gerar:json | bancos/*.db → src/data/*.json. |
npm run gerar:mdx | src/data/*.json → docs/planejamento/*.mdx. |
npm run gerar | Executa os dois acima em sequência. |
npm run gerar:csv -- --from 19:30 --to 23:00 | CSV do Moodle (o -- repassa os argumentos ao script). |
npm run gerar:csv:noite | Atalho com --from 19:30 --to 23:00 já embutidos. |
No npm, argumentos do script vêm depois de
--. Ex.:npm run gerar:csv -- --from 14:00 --to 17:30 --codigo ELT82E-N21.
Formato dos JSON
Todos trazem geradoEm e contadores. Os agrupados por disciplina usam slug
(igual entre planejamento e mapas, para cruzar dados).
disciplinas.json:disciplinas[]comcodigo,disciplina,professor,sluge as listassincronas,assincronas,procedimentos.permanencia.json:professores[],periodos[],disciplinas[]e a lista planatempos[](a grade). Cada tempo trazcodigo_slote os derivados (dia_semana,turno,slot,horario), além detipo,atividade,codigo,turma,codigoCompleto,sala,professor.salas.json:salas[](cada uma comsala,laboratorio,capacidade,periodo,slug,tempos[]) e a lista planatempos[]comsala.
O campo codigo_slot (ex.: 2N3) codifica dia + turno + slot; os campos
de dia/turno/slot/horário são derivados dele.
Componentes React
Todos usam variáveis de tema do Docusaurus (Infima), funcionando em claro/escuro.
QuadroSemanal— grade semanal genérica (base deTabelaSalaeTabelaPermanencia). Mostra todos os slotsM1…N6, agrupados por turno, com os intervalos indicados, e a semana completa (Segunda–Sábado por padrão; ajustável via propdias/turnos). Recebetempos,renderCelulae, opcionalmente,cabecalho/rodape.TabelaPlanejamento— recebe umadisciplinadodisciplinas.jsone renderiza Síncrona / Assíncrona / Procedimentos.TabelaSala— recebe umasaladosalas.json; wrapper fino doQuadroSemanal.TabelaPermanencia— recebe opermanencia.jsoninteiro (dados); aulas mostram disciplina/sala e permanências mostram o tipo expandido pela legenda (ME— Manutenção de ensino,P— Permanência,Paluno— Atendimento ao aluno).
Uso em MDX (a parte import/export do MDX é JavaScript, sem import type
nem cast as):
import salas from '@site/src/data/salas.json';
import TabelaSala from '@site/src/components/TabelaSala';
export const sala = salas.salas.find((s) => s.slug === 'cd-106');
<TabelaSala sala={sala} />
Em página .tsx (aí sim com tipos):
import salas from '@site/src/data/salas.json';
import TabelaSala from '@site/src/components/TabelaSala';
import type { SalasData } from '@site/src/types/mapa';
const dados = salas as unknown as SalasData;
const sala = dados.salas.find((s) => s.slug === 'cd-106');
TypeScript
- Os componentes são
.tsx; os tipos estão emsrc/types/planejamento.ts(planejamento) esrc/types/mapa.ts(Sala,PermanenciaData,TempoBase,TempoGrade, ...). - Importar
.jsonrequerresolveJsonModule: true— já incluso no@docusaurus/tsconfigque otsconfig.jsondo Docusaurus estende. - Os scripts de geração (
scripts/*.js) rodam comnode, fora do build do site; podem permanecer em.js.
Integração no Docusaurus
- Copie
scripts/,src/components/,src/types/esrc/data/para o seu projeto Docusaurus (mantendo os caminhos). - Adicione os scripts do
package.jsonao do seu site (as dependências de geração são nulas). - Rode
npm run gerarsempre que reprocessar os HTML/.db. - As páginas ficam em
docs/planejamento/; o sidebar pode ser autogerado ou referenciar esses arquivos.
Solução de problemas
Cannot find module 'node:sqlite'/ erro de flag — use Node 22.5+; em 22.5–23.3 rode com--experimental-sqlite.Could not locate the bindings file(better-sqlite3) — não se aplica aqui: este projeto usanode:sqlitee não obetter-sqlite3.- JSON vazio — o
.dbcorrespondente não estava em--db-dir; confira os nomes dos arquivos. - Links quebrados no índice — as páginas não usam
slug:fixo; os links são relativos aos arquivos, então mantenha os.mdxna mesma pasta.