@designliquido/foles
Version:
Linguagem de folhas de estilo para documentos em geral em português
171 lines • 7.88 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ResolvedorReverso = void 0;
const estrutura_1 = require("../estruturas/estrutura");
const gerais_1 = require("../modificadores/atributos/gerais");
const seletor_espaco_reservado_1 = require("../seletores/seletor-espaco-reservado");
const estruturas_lmht_1 = __importDefault(require("../tradutores/estruturas-lmht"));
const metodo_css_1 = require("../valores/metodos/css/metodo-css");
const metodo_1 = require("../valores/metodos/foles/metodo");
/**
* O resolvedor reverso traduz de CSS para FolEs. Pode traduzir tanto FolEs
* aninhado quanto desaninhado.
*/
class ResolvedorReverso {
constructor(resolverComAninhamentos = true) {
this.resolverComAninhamentos = resolverComAninhamentos;
this.variaveis = {};
}
resolverValor(valor, valoresAceitos) {
switch (valor.constructor.name) {
case 'ReferenciaVariavel':
const valorReferenciaVariavel = valor;
const valoresVariavelCorrespondente = this.variaveis[valorReferenciaVariavel.nomeVariavel];
if (valoresVariavelCorrespondente === undefined) {
throw new Error(`A variável '${valorReferenciaVariavel.nomeVariavel}' deve ser declarada antes da atribuição de valor.`);
}
let valoresVariavelResolvidos = "";
for (const valorVariavel of valoresVariavelCorrespondente) {
const valorResolvido = this.resolverValor(valorVariavel);
if (valorResolvido === ",") {
valoresVariavelResolvidos = valoresVariavelResolvidos.slice(0, -1);
}
valoresVariavelResolvidos += valorResolvido + " ";
}
valoresVariavelResolvidos = valoresVariavelResolvidos.slice(0, -1);
return valoresVariavelResolvidos;
case 'ValorAbreviacao':
return "/";
case 'ValorNumerico':
const valorNumerico = valor;
return `${valorNumerico.literalNumerico}${valorNumerico.quantificador || ''}`;
case 'ValorQualitativo':
const valorQualitativo = valor;
let traducaoQualitativo = undefined;
for (const [chave, valor] of Object.entries(gerais_1.valoresGerais)) {
if (valor === valorQualitativo.qualitativo) {
traducaoQualitativo = chave;
}
}
if (!traducaoQualitativo) {
for (const [chave, valor] of Object.entries(valoresAceitos)) {
if (valor === valorQualitativo.qualitativo) {
traducaoQualitativo = chave;
}
}
}
if (!traducaoQualitativo)
traducaoQualitativo = valorQualitativo.qualitativo;
return `${traducaoQualitativo}`;
case 'ValorTexto':
const valorTexto = valor;
return valorTexto.literalTexto;
case 'ValorVirgula':
return ",";
default:
// Valor é RGB, RGBA, HSL, HSLA ou HEX, ou seja, um método.
if (valor instanceof metodo_css_1.MetodoCss || valor instanceof metodo_1.Metodo) {
return valor.paraTexto();
}
throw new Error(JSON.stringify(valor) + " não é um valor válido para resolução.");
}
}
resolverModificador(modificador, indentacao = 0) {
let valoresTraduzidos = "";
for (const valor of modificador.valores) {
let valoresAceitos = null;
if (modificador.valoresAceitos)
valoresAceitos = modificador.valoresAceitos;
const valorResolvido = this.resolverValor(valor, valoresAceitos);
if (valorResolvido === ",") {
valoresTraduzidos = valoresTraduzidos.slice(0, -1);
}
valoresTraduzidos += valorResolvido + " ";
}
valoresTraduzidos = valoresTraduzidos.slice(0, -1);
return (" ".repeat(indentacao) +
`${Array.isArray(modificador.nomeFoles) ? modificador.nomeFoles[0] : modificador.nomeFoles}: ${valoresTraduzidos};\n`);
}
resolverDeclaracaoVariavel(declaracaoVariavel) {
this.variaveis[declaracaoVariavel.nome] = declaracaoVariavel.valores;
}
resolverBlocoDeclaracao(declaracao, indentacao, textoSeletorAnterior) {
let resultado = "";
const prefixos = [];
let deveImprimir = true;
for (const seletor of declaracao.seletores) {
if (seletor instanceof seletor_espaco_reservado_1.SeletorEspacoReservado) {
deveImprimir = false;
continue;
}
let prefixo;
if (seletor instanceof estrutura_1.Estrutura) {
if (seletor.pseudoclasse) {
const seletorHtml = seletor.tagHtml;
const seletorSemPseudoclasse = seletorHtml.split(":")[0];
const traducaoSeletor = estruturas_lmht_1.default[seletorSemPseudoclasse][0];
const traducaoPseudoclasse = seletor.pseudoclasse.pseudoclasseCss;
prefixo = (textoSeletorAnterior +
" " +
`${traducaoSeletor}:${traducaoPseudoclasse}`).trimStart();
}
else {
const seletorLmht = seletor.tagHtml;
const traducaoSeletor = estruturas_lmht_1.default[seletorLmht][0];
prefixo = (textoSeletorAnterior +
" " +
traducaoSeletor).trimStart();
}
}
else {
prefixo = (textoSeletorAnterior +
" " +
seletor.paraTexto()).trimStart();
}
prefixos.push(prefixo);
resultado += " ".repeat(indentacao) + prefixo + ", ";
}
if (!deveImprimir) {
return resultado;
}
resultado = resultado.slice(0, -2);
resultado += " {\n";
for (const modificador of declaracao.modificadores) {
resultado += this.resolverModificador(modificador, indentacao + 4);
}
if (this.resolverComAninhamentos) {
resultado += this.resolver(declaracao.declaracoesAninhadas, indentacao + 4);
resultado += `${" ".repeat(indentacao)}}\n\n`;
}
else {
resultado += `${" ".repeat(indentacao)}}\n\n`;
for (const prefixo of prefixos) {
resultado += this.resolver(declaracao.declaracoesAninhadas, indentacao, prefixo);
}
}
return resultado;
}
resolver(declaracoes, indentacao = 0, seletorAnterior = undefined) {
let resultado = "";
let textoSeletorAnterior = "";
if (seletorAnterior !== undefined) {
textoSeletorAnterior = seletorAnterior;
}
for (const declaracao of declaracoes) {
switch (declaracao.constructor.name) {
case "BlocoDeclaracao":
resultado += this.resolverBlocoDeclaracao(declaracao, indentacao, textoSeletorAnterior);
break;
case "DeclaracaoVariavel":
this.resolverDeclaracaoVariavel(declaracao);
break;
}
}
return resultado;
}
}
exports.ResolvedorReverso = ResolvedorReverso;
//# sourceMappingURL=resolvedor-reverso.js.map