API HTTP local
Gere EPS, SVG e PNG, converta LaTeX e MathML, reconheça imagens e acompanhe vínculos pela API HTTP do NeoMath, que só atende no próprio computador e exige token.
Nesta página
A API HTTP local é um servidor que só atende no próprio computador (127.0.0.1). É ela que o plugin do InDesign usa, e serve também para scripts e outros programas em qualquer linguagem. A referência de cada rota está em Referência da API HTTP.
Iniciar#
Há dois servidores com a mesma API:
| Comando | Para quem | Rotas extras |
|---|---|---|
NeoMath --servidor |
o aplicativo instalado; é o que o InDesign usa | /v1/ocr, /v1/quimica, /v1/editar, /v1/vinculos |
neomath servidor |
a linha de comando (sem as rotas do aplicativo) | /v1/vinculos; as demais respondem 501 |
NeoMath --servidor
neomath servidor --porta 8790O instalador pode deixar o NeoMath --servidor iniciando com o sistema (ligado por padrão no Windows e no Linux). Ele não abre janela e usa a pasta do usuário como raiz.
| Opção | Padrão | O que faz |
|---|---|---|
--porta N |
8790 | porta |
--token T |
gerado | token fixo; sem a opção, um token aleatório de 64 caracteres a cada início |
--sem-token |
desliga o token (só para testes) | |
--origem URL |
nenhuma | origem de página web autorizada (repetível) |
--raiz PASTA |
desligado (neomath), pasta do usuário (NeoMath) |
libera /v1/lote, /v1/editar e /v1/vinculos só dentro dessa pasta |
--threads N |
4 | pedidos atendidos ao mesmo tempo (1 a 16) |
--sessao ARQ |
pasta de dados | onde gravar o servidor.json |
Porta e token: servidor.json#
Ao iniciar, o servidor grava o servidor.json, com permissão só do usuário:
| Sistema | Caminho |
|---|---|
| Windows | %LOCALAPPDATA%\NeoMath\servidor.json |
| macOS | ~/Library/Application Support/NeoMath/servidor.json |
| Linux | $XDG_STATE_HOME/neomath/servidor.json ou ~/.local/state/neomath/servidor.json |
{ "porta": 8790, "token": "9f2c…", "url": "http://127.0.0.1:8790", "pid": 4242, "versao": "0.2.0" }Os clientes leem a porta e o token desse arquivo.
Autenticação#
Todo pedido, menos GET /v1/saude, leva o token:
Authorization: Bearer <token>Também valem X-NeoMath-Token: <token> e ?token=<token> na URL, para quem não consegue mandar cabeçalhos.
Exemplos#
curl
TOKEN=$(python3 -c "import json,os;print(json.load(open(os.path.expanduser('~/.local/state/neomath/servidor.json')))['token'])")
curl -s http://127.0.0.1:8790/v1/saude
curl -s -H "Authorization: Bearer $TOKEN" -X POST http://127.0.0.1:8790/v1/svg -d '{"mathml":"\\frac{a}{b}"}' -o eq.svg
curl -s -H "Authorization: Bearer $TOKEN" -X POST "http://127.0.0.1:8790/v1/eps?bruto=1" -d '{"mathml":"\\ce{2 H2 + O2 -> 2 H2O}","opcoes":{"cor":[0,100,100,0]}}' -o reacao.epsJavaScript
const r = await fetch("http://127.0.0.1:8790/v1/eps", {
method: "POST",
headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
body: JSON.stringify({ mathml: "x^2 + y^2 = r^2", opcoes: { cor: "#1F4E79" } }),
});
const g = await r.json();
console.log(g.largura_pt, g.altura_pt, g.linha_base_pt);Python
import json, os, urllib.request
s = json.load(open(os.path.expandvars(r"%LOCALAPPDATA%\NeoMath\servidor.json")))
pedido = urllib.request.Request(s["url"] + "/v1/png?dpi=600", data=json.dumps({"mathml": r"\sqrt{2}"}).encode(),
headers={"Authorization": "Bearer " + s["token"], "Content-Type": "application/json"})
open("raiz.png", "wb").write(urllib.request.urlopen(pedido).read())O campo mathml aceita MathML ou LaTeX: o NeoMath reconhece sozinho.
Opções de saída#
| Chave | Exemplo | Efeito |
|---|---|---|
neqp |
texto do estilo | estilo (fontes, tamanhos, espaçamentos) |
cor |
"#1F4E79", "red", [0,100,100,0], [31,78,121] |
cor da equação (lista de 4 é CMYK) |
cor_em_tudo |
true |
pinta também traços e frações |
tamanho |
18 |
tamanho do corpo em pt (1 a 1000) |
fonte |
"Arial" |
fonte do texto, das variáveis e dos números |
Respostas e erros#
| Código | Quando |
|---|---|
| 200 | sucesso |
| 400 | JSON ou opções inválidas |
| 401 | sem token ou token errado |
| 403 | origem de navegador não autorizada, ou pasta fora de --raiz |
| 404 | rota desconhecida |
| 413 | corpo maior que 16 MB (64 MB em /v1/lote-zip) |
| 421 | Host diferente de 127.0.0.1:<porta> ou localhost:<porta> (proteção contra DNS rebinding) |
| 422 | construção não suportada, ou imagem do OCR não reconhecida |
| 501 | rota que só existe no servidor do aplicativo |
{ "status": "erro", "codigo": "token", "erro": "token ausente ou inválido …" }Fluxo de edição#
É assim que o InDesign mantém as equações em dia:
- O cliente gera o EPS com
"formato": "neof"e grava no documento. - Chama
POST /v1/editarcom o caminho; o aplicativo abre o arquivo e devolvemodificado_msetamanho. - Consulta
POST /v1/vinculosa cada 2 segundos. - Quando a data ou o tamanho mudam, o arquivo foi salvo no NeoMath: o cliente atualiza o vínculo e recupera o código novo com
/v1/abrire/v1/para-latex.
Segurança#
- Escuta só em
127.0.0.1e recusa outroHost. - Pedidos de navegador só são aceitos das origens passadas em
--origem. - Rotas que tocam o disco ficam presas à pasta
--raiz(com links simbólicos resolvidos). - As rotas antigas sem
/v1continuam funcionando para clientes antigos, também com token.