UNPKG

@designliquido/foles

Version:

Linguagem de folhas de estilo para documentos em geral em português

171 lines 7.88 kB
"use strict"; 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