Skip to main content

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 de npm install. Em Node 22.5–23.3 rode o gerar-json.js / gerar-attendance-csv.js com 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çãoPadrãoDescriçã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çãoPadrãoDescrição
--data <arquivo>./src/data/disciplinas.jsonConsolidado do planejamento.
--perm <arquivo>./src/data/permanencia.jsonMapa de permanências (opcional).
--salas <arquivo>./src/data/salas.jsonMapa por sala (opcional).
--out <dir>./docs/planejamentoPasta 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çãoPadrãoDescriçã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>todasFiltra uma disciplina.
--db <arquivo>./bancos/sincrona.dbBanco de origem.
--out <dir>.Pasta de saída (gera <CODIGO>.csv por disciplina).
--studentscanmark / --calendarevent / --earlyopen1 / 1 / 1200Constantes do Moodle.

npm scripts​

ScriptO que faz
npm run gerar:jsonbancos/*.db → src/data/*.json.
npm run gerar:mdxsrc/data/*.json → docs/planejamento/*.mdx.
npm run gerarExecuta os dois acima em sequência.
npm run gerar:csv -- --from 19:30 --to 23:00CSV do Moodle (o -- repassa os argumentos ao script).
npm run gerar:csv:noiteAtalho 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[] com codigo, disciplina, professor, slug e as listas sincronas, assincronas, procedimentos.
  • permanencia.json: professores[], periodos[], disciplinas[] e a lista plana tempos[] (a grade). Cada tempo traz codigo_slot e os derivados (dia_semana, turno, slot, horario), além de tipo, atividade, codigo, turma, codigoCompleto, sala, professor.
  • salas.json: salas[] (cada uma com sala, laboratorio, capacidade, periodo, slug, tempos[]) e a lista plana tempos[] com sala.

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 de TabelaSala e TabelaPermanencia). Mostra todos os slots M1…N6, agrupados por turno, com os intervalos indicados, e a semana completa (Segunda–Sábado por padrão; ajustável via prop dias/turnos). Recebe tempos, renderCelula e, opcionalmente, cabecalho/rodape.
  • TabelaPlanejamento — recebe uma disciplina do disciplinas.json e renderiza Síncrona / Assíncrona / Procedimentos.
  • TabelaSala — recebe uma sala do salas.json; wrapper fino do QuadroSemanal.
  • TabelaPermanencia — recebe o permanencia.json inteiro (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 em src/types/planejamento.ts (planejamento) e src/types/mapa.ts (Sala, PermanenciaData, TempoBase, TempoGrade, ...).
  • Importar .json requer resolveJsonModule: true — já incluso no @docusaurus/tsconfig que o tsconfig.json do Docusaurus estende.
  • Os scripts de geração (scripts/*.js) rodam com node, fora do build do site; podem permanecer em .js.

Integração no Docusaurus​

  1. Copie scripts/, src/components/, src/types/ e src/data/ para o seu projeto Docusaurus (mantendo os caminhos).
  2. Adicione os scripts do package.json ao do seu site (as dependências de geração são nulas).
  3. Rode npm run gerar sempre que reprocessar os HTML/.db.
  4. 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 usa node:sqlite e não o better-sqlite3.
  • JSON vazio — o .db correspondente 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 .mdx na mesma pasta.