# Formulix para WordPress / Gutenberg

Na raiz, execute `npm run build:integrations` e `node scripts/package-integrations.cjs wordpress`. Em Plugins → Adicionar plugin → Enviar plugin, instale `dist/formulix-wordpress-0.1.0.zip` e ative-o.

Configure URL HTTPS e chave pública por domínio em Configurações → Formulix. No editor de blocos insira **Formulix**, escolha fórmula, conta, gráfico ou química. Depois use **Editar item Formulix**. Os PNGs usam a biblioteca de mídia e a permissão normal `upload_files`; usuários sem essa permissão não podem enviar gráficos. A chave pública não deve permitir administração da API.

O bloco salva HTML estático; fórmulas, tabelas e imagens permanecem legíveis após desativar o plugin. A extensão do KSES permite somente elementos/atributos MathML necessários. Não concede `unfiltered_html` a autores. Testado em WordPress 6.8 e 7.1.3 (PHP 8.3), com usuário autor, quatro tipos de conteúdo, upload real, salvamento REST com KSES e reedição após recarregar.

O serviço externo recebe os dados dos campos **também nas prévias automáticas**, antes de confirmar a inserção. O `readme.txt` detalha endpoints, dados enviados, cotas e preços provisórios. O cliente é gratuito e GPL-3.0-or-later; processamento remoto depende da API, sem desbloqueio de código local por pagamento. Colar no bloco ou no texto do Gutenberg não passa pelo Formulix; colar do Word no campo de fórmula envia o HTML e o RTF da área de transferência a `/v1/calc`. Conta no plano só `POST /v1/inserir`, ao confirmar. O ZIP inclui fontes reconstruíveis em `source/` e licenças. Não foi submetido ao WordPress.org.

Sem URL e chave, o diálogo não é criado, inclusive na reedição. Ativar o plugin ou ler posts não faz pedidos à API. A Settings API usa `options.php`, `settings_fields` (nonce) e `manage_options`; entradas são sanitizadas, saídas escapadas. A URL exige HTTPS, exceto HTTP em loopback (`localhost`, `127.0.0.1`, `[::1]`) para desenvolvimento; não aceita credenciais, consulta ou fragmento. O nonce REST não substitui as permissões aplicadas pelo WordPress ao upload.

Os textos próprios do adaptador usam funções de tradução PHP, `wp.i18n`, `textdomain` no bloco e `wp_set_script_translations`, com domínio `formulix`. A interface comum conserva seu mecanismo existente de idiomas, fora do escopo desta pasta. `uninstall.php` remove as duas opções do site e preserva posts/mídia. Em multisite, a limpeza é apenas do site em cujo contexto ele é executado; revise os demais antes da exclusão em rede.

`https://formulix.com.br` é **placeholder**. Os links [termos](https://formulix.com.br/docs/termos.html) e [privacidade](https://formulix.com.br/docs/privacidade.html) foram consultados em 15/10/2026, mas sua disponibilidade/conteúdo não puderam ser verificados. Confirmar operador, suporte, contratação, retenção e política efetiva antes de submeter ou usar publicamente.

## Verificação para o diretório

- Referências oficiais consultadas em 15/10/2026: [Detailed Plugin Guidelines](https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/), [readme](https://developer.wordpress.org/plugins/wordpress-org/how-your-readme-txt-works/) e [Plugin Check (PCP)](https://wordpress.org/plugins/plugin-check/).
- O [arquivo oficial de releases](https://wordpress.org/download/releases/) informa **7.1.3** como atual. `npm run test:wordpress` executa a suíte real em 6.8 e 7.1.3 (PHP 8.3, autor comum); por isso `Tested up to: 7.1`. Repetir a suíte a cada nova versão maior antes de mudar o cabeçalho.
- `Stable tag: 0.1.0`, versão PHP e `block.json` estão alinhados. Não há usuário confirmado para `Contributors`; adicionar somente o identificador real. Confirmar slug final e manter `Text Domain` igual ao slug.
- O readme tem descrição curta, requisitos, licença, instalação, FAQ, Screenshots, Changelog, Upgrade Notice e External services. Screenshots não referencia arquivos inexistentes.
- Rodar `node scripts/test-php.cjs`, `php -d zend.assertions=1 -d assert.exception=1 integrations/wordpress/test-settings.php` e `node integrations/wordpress/test-editor.cjs`. Contratos não substituem homologação real.
- No WordPress de homologação, instalar o ZIP reconstruído e executar **Ferramentas → Plugin Check**, incluindo verificações de execução. Alternativa WP-CLI: `wp plugin check formulix --require=./wp-content/plugins/plugin-check/cli.php`. O PCP não garante aprovação manual.

## Assets do diretório (sem arte nesta entrega)

Conforme o [guia oficial](https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/), colocar no `/assets` do SVN, ao lado de `trunk`, separado dos assets de execução:

- Banner: `banner-772x250.png` ou `.jpg`, 772 × 250 px; retina opcional `banner-1544x500.png` ou `.jpg`, 1544 × 500 px, acompanhado do normal.
- Ícone: `icon-128x128.png` e/ou `icon-256x256.png`, 128 × 128 e 256 × 256 px. SVG opcional `icon.svg`, com PNG de fallback.
- Capturas reais opcionais: `screenshot-1.png`, `screenshot-2.png` etc., com legendas numeradas correspondentes em `readme.txt`. Não foram criadas imagens ou legendas de capturas inexistentes.

## Empacotamento

`scripts/build-integrations.cjs` copia esta pasta recursivamente; `scripts/package-integrations.cjs` inclui a entrega e fontes reconstruíveis. Portanto `uninstall.php` entra na raiz após **reconstruir antes de empacotar**; não é necessário alterar scripts para incluí-lo. Arquivos `test-*`, `REVIEW.md` e `review.php`/`review.cjs` são excluídos pelo empacotador, inclusive da cópia em `source/`; `tests/packages.test.cjs` confere a exclusão e a presença de `uninstall.php`.

O empacotador também inclui `formulix.php` com cabeçalho de plugin em `source/integrations/wordpress/`. O WordPress só procura cabeçalhos na raiz do plugin e um nível abaixo, então essa cópia (três níveis abaixo) não aparece como segundo plugin; ainda falta confirmar que o PCP não a acusa.

## Resultado desta revisão (15/10/2026)

Passaram: lint PHP de `integrations/`, contratos PHP existentes de Moodle/WordPress, `test-settings.php`, `test-editor.cjs` e compilação do editor pelo executável esbuild, com saída descartada. A execução direta de `uninstall.php`, sem a constante do WordPress, encerrou sem executar remoções.

`node scripts/test-php.cjs` foi tentado e bloqueado por `spawnSync php EPERM` neste ambiente. As mesmas verificações foram executadas diretamente pelo PowerShell/PHP, sem alterar scripts ou testes existentes. O build pelo executável esbuild evitou a mesma restrição de subprocessos do Node.

Pendências: PCP estático e de execução no ZIP final, acessibilidade no WordPress 7.1.3 (a suíte automatizada com autor comum já passa), identificação real do operador/Contributors/suporte, confirmação dos links e termos/privacidade, verificação no PCP da cópia de fontes com cabeçalho de plugin e limpeza dos demais sites no caso de exclusão em multisite. ZIP reconstruído com `npm run package:integrations` em 15/10/2026: `uninstall.php` presente na raiz, sem `test-*`.
