Skip to content

Biblioteca de transformação de documentos LMHT para HTML para JavaScript.

License

Notifications You must be signed in to change notification settings

DesignLiquido/lmht-js

Repository files navigation

lmht-js

Biblioteca de transformação de documentos LMHT para HTML, para JavaScript e TypeScript.

Formas de uso

Versão 0.5.0 ou superiores

import { ConversorLmht } from "@designliquido/lmht-js";

const conversorLmht = new ConversorLmht();
// Ou
const resultado = await conversorLmht.converterPorArquivo("meu-arquivo.lmht");
console.log(resultado);

// Ou
conversorLmht.converterPorArquivo("meu-arquivo.lmht").then(resultado => {
    console.log(resultado);
});
import { ConversorLmht } from "@designliquido/lmht-js";

const conversorLmht = new ConversorLmht();
// Ou
const resultado = await conversorLmht.converterPorTexto("<lmht><cabeca><titulo>Teste</titulo></cabeca><corpo>Teste</corpo></lmht>");
console.log(resultado); // Resultado: <html><head><title>Teste</title></head><body>Teste</body></html>

// Ou
conversorLmht.converterPorTexto("<lmht><cabeca><titulo>Teste</titulo></cabeca><corpo>Teste</corpo></lmht>").then(resultado => {
    console.log(resultado); // Resultado: <html><head><title>Teste</title></head><body>Teste</body></html>
});
import { ConversorHtml } from "@designliquido/lmht-js";

const conversorHtml = new ConversorHtml();
// Ou
const resultado = await conversorHtml.converterPorArquivo("meu-arquivo.html");
console.log(resultado);

// Ou
conversorHtml.converterPorArquivo("meu-arquivo.html").then(resultado => {
    console.log(resultado);
});
import { ConversorHtml } from "@designliquido/lmht-js";

const conversorHtml = new ConversorHtml();
// Ou
const resultado = await conversorHtml.converterPorTexto("<html><head><title>Teste</title></head><body>Teste</body></html>");
console.log(resultado); // Resultado: <lmht><cabeca><titulo>Teste</titulo></cabeca><corpo>Teste</corpo></lmht>

// Ou
conversorHtml.converterPorTexto("<html><head><title>Teste</title></head><body>Teste</body></html>").then(resultado => {
    console.log(resultado); // Resultado: <lmht><cabeca><titulo>Teste</titulo></cabeca><corpo>Teste</corpo></lmht>
});

Versão 0.3.0 até versão 0.4.9

Os métodos de conversão são síncronos:

import { ConversorLmht } from "@designliquido/lmht-js";

const conversorLmht = new ConversorLmht();
const resultado = conversorLmht.converterPorArquivo("meu-arquivo.lmht");
console.log(resultado);
import { ConversorLmht } from "@designliquido/lmht-js";

const conversorLmht = new ConversorLmht();
const resultado = conversorLmht.converterPorTexto("<lmht><cabeca><titulo>Teste</titulo></cabeca><corpo>Teste</corpo></lmht>");
console.log(resultado); // Resultado: <html><head><title>Teste</title></head><body>Teste</body></html>
import { ConversorHtml } from "@designliquido/lmht-js";

const conversorHtml = new ConversorHtml();
const resultado = conversorHtml.converterPorArquivo("meu-arquivo.html");
console.log(resultado);
import { ConversorHtml } from "@designliquido/lmht-js";

const conversorHtml = new ConversorHtml();
const resultado = conversorHtml.converterPorTexto("<html><head><title>Teste</title></head><body>Teste</body></html>");
console.log(resultado); // Resultado: <lmht><cabeca><titulo>Teste</titulo></cabeca><corpo>Teste</corpo></lmht>

Até a versão 0.2.0

Os métodos de conversão são assíncronos.

import { ConversorLmht } from "@designliquido/lmht-js";

const conversorLmht = new ConversorLmht();
conversorLmht.converterPorArquivo("meu-arquivo.lmht").then(resultado => {
    console.log(resultado);
});
import { ConversorHtml } from "@designliquido/lmht-js";

const conversorHtml = new ConversorHtml();
conversorHtml.converterPorArquivo("meu-arquivo.lmht").then(resultado => {
    console.log(resultado);
});

Conformidade com especificação

lmht-js segue a especificação mais recente de LMHT. O projeto da especificação é referenciado aqui como um submódulo git. Para sincronizar a especificação, use o comando:

git submodule update --init --recursive --remote

Versões 0.3.0 até 0.4.9, usando xslt-processor, e mudanças na versão 0.5.0

Na versão 0.3.0, tomamos a decisão de mudar para a biblioteca xslt-processor, 100% em código aberto, licença MIT, e mantida pela Design Líquido. Não apenas os bugs que tínhamos com a biblioteca anterior, saxon-js, são totalmente evitados como também a implementação de xslt-processor privilegia o projeto de LMHT.

Isso fez com que os métodos se tornassem síncronos. Depois da versão 3.0.0 de xslt-processor, em que o comando <xsl:include> foi implementado, o processamento de transformações XSLT passou a ser novamente assíncrono. O comando <xsl:include> exige um acesso a um sistema de arquivos ou um recurso na internet, o que pede para que todo o processo seja assíncrono. Para esta biblioteca, os comandos de conversão voltam a ser assíncronos na versão 0.5.0.

Versão 0.2.0 e saxon-js

Até a versão 0.2.0, usávamos a biblioteca saxon-js. Essa biblioteca tornou-se um problema por alguns motivos:

Mantemos o suporte a versões anteriores por questões de retrocompatibilidade.

Especificação e arquivos .sef.json

saxon-js pede por arquivos .sef.json, que podem ser gerados pelos comandos abaixo:

PowerShell:

xslt3 -t "-xsl:especificacao/lmht.xslt" "-export:lmht.sef.json" -nogo -relocate
xslt3 -t "-xsl:especificacao/lmht-reverso-xml10.xslt" "-export:lmht-reverso-xml10.sef.json" -nogo -relocate

bash, zsh:

xslt3 -t -xsl:especificacao/lmht.xslt -export:lmht.sef.json -nogo -relocate
xslt3 -t -xsl:especificacao/lmht-reverso.xslt -export:lmht-reverso.sef.json -nogo -relocate

O arquivo XSLT da especificação ou da especificação reversa também podem ser usados, mas isso causa um atraso na carga de pelo menos 2 segundos por arquivo, que é o tempo que leva para compilar a especificação de XSLT para .sef.json. Para entender como isso funciona, verifique o fonte objeto-especificacao.ts.

Assim sendo, os arquivos .sef.json correspondentes ao commit apontado pelo submódulo são versionados neste diretório raiz, e distribuídos juntamente com o pacote NPM.

Compatibilidade com XML

SaxonJS não trabalha com XML 1.1, e por isso a especificação com XML 1.0 é usada aqui.