From a9c88b9fd40bd0631f8f92afcae9cb923dee61f0 Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Thu, 26 Oct 2023 15:16:57 -0700 Subject: [PATCH 01/13] =?UTF-8?q?Atualiza=C3=A7=C3=B5es=20no=20Tradutor=20?= =?UTF-8?q?Reverso=20para=20aceitar=20declara=C3=A7=C3=B5es=20aninhadas.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exemplos/reverso/exemplo.css | 14 ++- .../avaliador-sintatico-reverso.ts | 102 ++++++++++++------ fontes/lexador/lexador-reverso.ts | 4 + fontes/lexador/palavras-reservadas/css.ts | 4 +- .../seletor-reverso-modificador.ts | 4 +- fontes/modificadores/validacoes/cor.ts | 4 +- fontes/tradutor/tradutor-reverso.ts | 32 ++++-- fontes/valores/dicionario-valores.ts | 4 +- .../metodos/{hex.ts => hexadecimal-cor.ts} | 2 +- 9 files changed, 123 insertions(+), 47 deletions(-) rename fontes/valores/metodos/{hex.ts => hexadecimal-cor.ts} (81%) diff --git a/exemplos/reverso/exemplo.css b/exemplos/reverso/exemplo.css index eee7c796..50245b72 100644 --- a/exemplos/reverso/exemplo.css +++ b/exemplos/reverso/exemplo.css @@ -1,2 +1,12 @@ -html{font-size:12px;} -body{font-size:16px;max-width:20cm;} \ No newline at end of file +html { + font-size:12px; +} + +body { + font-size:16px; + max-width:20cm; + + p { + color: #999; + } +} diff --git a/fontes/avaliador-sintatico/avaliador-sintatico-reverso.ts b/fontes/avaliador-sintatico/avaliador-sintatico-reverso.ts index ef501345..730ea83e 100644 --- a/fontes/avaliador-sintatico/avaliador-sintatico-reverso.ts +++ b/fontes/avaliador-sintatico/avaliador-sintatico-reverso.ts @@ -9,6 +9,7 @@ import { SeletorEstruturasHtml } from "../estruturas/seletor-estruturas-html"; import tiposDeSimbolos from "../tipos-de-simbolos/css"; import { Seletor } from "../seletores"; import { AvaliadorSintaticoInterface, ImportadorInterface } from "../interfaces"; +import { HexadecimalCor } from "../valores/metodos/hexadecimal-cor"; export class AvaliadorSintaticoReverso implements AvaliadorSintaticoInterface { simbolos: Simbolo[]; @@ -121,59 +122,96 @@ export class AvaliadorSintaticoReverso implements AvaliadorSintaticoInterface { return seletores; } - resolverModificadores(): Modificador[] { - // const simboloSeletor = this.avancarEDevolverAnterior(); + private resolverCor() { + const codigoCor = this.avancarEDevolverAnterior(); + return new HexadecimalCor(codigoCor.lexema); + } + + private valorModificador() { + const valorModificador = this.avancarEDevolverAnterior(); + + switch (valorModificador.tipo) { + case tiposDeSimbolos.CERQUILHA: + return this.resolverCor(); + default: + return valorModificador; + } + } + + private resolverModificador(): Modificador { + const modificador = this.consumir( + tiposDeSimbolos.IDENTIFICADOR, + "Esperado nome do atributo de identificação." + ); this.consumir( - tiposDeSimbolos.CHAVE_ESQUERDA, - "Esperado '{' após declaração de seletor." + tiposDeSimbolos.DOIS_PONTOS, + `Esperado ':' após declaração de modificador '${modificador.lexema}'.` ); - const modificadores: Modificador[] = []; - while (!this.verificarTipoSimboloAtual(tiposDeSimbolos.CHAVE_DIREITA)) { - const modificador = this.consumir( - tiposDeSimbolos.IDENTIFICADOR, - "Esperado nome do atributo de identificação." - ); + const valorModificador = this.valorModificador(); + let quantificador; + if (valorModificador instanceof Simbolo && valorModificador.tipo === tiposDeSimbolos.NUMERO) { + quantificador = this.avancarEDevolverAnterior(); + } - this.consumir( - tiposDeSimbolos.DOIS_PONTOS, - `Esperado ':' após declaração de modificador '${modificador.lexema}'.` - ); + this.consumir( + tiposDeSimbolos.PONTO_E_VIRGULA, + `Esperado ';' após declaração de valor de modificador '${modificador.lexema}'.` + ); - const valorModificador = this.avancarEDevolverAnterior(); - const quantificador = this.avancarEDevolverAnterior(); + const classeModificadora = new SeletorReversoModificador( + modificador.lexema, + valorModificador instanceof Simbolo ? valorModificador.lexema : valorModificador, + quantificador && quantificador.hasOwnProperty('lexema') ? + quantificador.lexema : + quantificador + ); + + return classeModificadora as Modificador; + } - this.consumir( - tiposDeSimbolos.PONTO_E_VIRGULA, - `Esperado ';' após declaração de valor de modificador '${modificador.lexema}'.` - ); + resolverModificadorEDeclaracoesAninhadas(): { modificadores: Modificador[], declaracoesAninhadas: Declaracao[] } { + this.consumir( + tiposDeSimbolos.CHAVE_ESQUERDA, + "Esperado '{' após declaração de seletor." + ); - const classeModificadora = new SeletorReversoModificador( - modificador.lexema, - valorModificador.lexema, - quantificador.lexema - ); - modificadores.push(classeModificadora as Modificador); + const modificadores: Modificador[] = []; + const declaracoesAninhadas: Declaracao[] = []; + while (!this.verificarTipoSimboloAtual(tiposDeSimbolos.CHAVE_DIREITA)) { + switch (this.simbolos[this.atual].tipo) { + case tiposDeSimbolos.IDENTIFICADOR: + const modificador = this.resolverModificador(); + modificadores.push(modificador); + break; + default: + const declaracaoAninhada = this.declaracao(); + declaracoesAninhadas.push(declaracaoAninhada); + break; + } } this.avancarEDevolverAnterior(); // chave direita - return modificadores; + return { + modificadores, + declaracoesAninhadas + }; } - declaracao(): any { + declaracao(): Declaracao | null { if (this.estaNoFinal()) return null; const seletores = this.resolverSeletores(); - const modificadores = this.resolverModificadores(); + const modificadorEDeclaracoesAninhadas = this.resolverModificadorEDeclaracoesAninhadas(); return new Declaracao( seletores, - modificadores, - [] + modificadorEDeclaracoesAninhadas.modificadores, + modificadorEDeclaracoesAninhadas.declaracoesAninhadas ); } - analisar(simbolos: Simbolo[]) { + analisar(simbolos: Simbolo[]): Declaracao[] { this.simbolos = simbolos; this.erros = []; this.atual = 0; diff --git a/fontes/lexador/lexador-reverso.ts b/fontes/lexador/lexador-reverso.ts index 0f4ed4d7..017fecf5 100644 --- a/fontes/lexador/lexador-reverso.ts +++ b/fontes/lexador/lexador-reverso.ts @@ -189,6 +189,10 @@ export class LexadorReverso implements LexadorInterface { this.adicionarSimbolo(tiposDeSimbolos.PONTO_E_VIRGULA); this.avancar(); break; + case '#': + this.adicionarSimbolo(tiposDeSimbolos.CERQUILHA); + this.avancar(); + break; case ' ': case '\0': case '\r': diff --git a/fontes/lexador/palavras-reservadas/css.ts b/fontes/lexador/palavras-reservadas/css.ts index 70d14a7f..29ff94d5 100644 --- a/fontes/lexador/palavras-reservadas/css.ts +++ b/fontes/lexador/palavras-reservadas/css.ts @@ -1,6 +1,8 @@ import tiposDeSimbolos from "../../tipos-de-simbolos/css"; export default { + 'body': tiposDeSimbolos.TAG, + 'head': tiposDeSimbolos.TAG, 'html': tiposDeSimbolos.TAG, - 'body': tiposDeSimbolos.TAG + 'p': tiposDeSimbolos.TAG } \ No newline at end of file diff --git a/fontes/modificadores/superclasse/seletor-reverso-modificador.ts b/fontes/modificadores/superclasse/seletor-reverso-modificador.ts index 8d86e173..c0a399c5 100644 --- a/fontes/modificadores/superclasse/seletor-reverso-modificador.ts +++ b/fontes/modificadores/superclasse/seletor-reverso-modificador.ts @@ -1,7 +1,9 @@ +import { Metodo } from "../../valores/metodos/metodo"; import { DicionarioReversoModificadores } from "../dicionario/dicionario-reverso-modificadores"; +import { PragmasModificador } from "./pragmas-modificador"; export class SeletorReversoModificador { - constructor(nomeCss: string, valor: string, quantificador: string) { + constructor(nomeCss: string, valor: string | Metodo, quantificador: string, pragmas?: PragmasModificador) { if ( DicionarioReversoModificadores[nomeCss] === undefined || DicionarioReversoModificadores[nomeCss] === null diff --git a/fontes/modificadores/validacoes/cor.ts b/fontes/modificadores/validacoes/cor.ts index c63b077a..f9b45496 100644 --- a/fontes/modificadores/validacoes/cor.ts +++ b/fontes/modificadores/validacoes/cor.ts @@ -1,4 +1,4 @@ -import { Hex } from "../../valores/metodos/hex"; +import { HexadecimalCor } from "../../valores/metodos/hexadecimal-cor"; import { Metodo } from "../../valores/metodos/metodo"; import { cores } from "../atributos/cores"; import { valoresGlobais } from "../atributos/globais"; @@ -9,7 +9,7 @@ export function validarValorCor( valoresAceitos?: { [valorFoles: string]: string }, valoresExtra?: { [valorFoles: string]: string }) { if (valor instanceof Metodo) { - if (valor instanceof Hex) { + if (valor instanceof HexadecimalCor) { if (valor['codigo'].length !== 3 && valor['codigo'].length !== 6) { throw new Error(`Propriedade '${nomePropriedade}' com hexadecimal inválido: '${valor['codigo']}'. Hexadecimais devem ter 3 ou 6 caracteres após a cerquilha, sendo cada caracter de 0 até 9 ou de A até F.`); diff --git a/fontes/tradutor/tradutor-reverso.ts b/fontes/tradutor/tradutor-reverso.ts index 6fc3e010..1b25d844 100644 --- a/fontes/tradutor/tradutor-reverso.ts +++ b/fontes/tradutor/tradutor-reverso.ts @@ -1,28 +1,48 @@ import { Declaracao } from "../declaracoes"; import { Modificador } from "../modificadores"; +import { Metodo } from "../valores/metodos/metodo"; import estruturasLmht from "./estruturas-lmht"; export class TradutorReverso { - traduzirModificador(modificador: Modificador): string { - return `\t${Array.isArray(modificador.nomeFoles) ? modificador.nomeFoles[0] : modificador.nomeFoles}: ${modificador.valor}${modificador.quantificador};\n`; + traduzirModificador(modificador: Modificador, indentacao: number = 0): string { + let quantificador = ""; + if (modificador.hasOwnProperty("quantificador")) { + quantificador = modificador.quantificador; + } + + let valor = ""; + if (modificador.valor instanceof Metodo) { + valor = (modificador.valor).paraTexto(); + } else { + valor = modificador.valor; + } + + return " ".repeat(indentacao) + + `${Array.isArray(modificador.nomeFoles) ? modificador.nomeFoles[0] : modificador.nomeFoles}: ${valor}${quantificador};\n`; } - traduzir(declaracoes: Declaracao[]) { + traduzir(declaracoes: Declaracao[], indentacao: number = 0) { let resultado = ""; for (const declaracao of declaracoes) { for (const seletor of declaracao.seletores) { - resultado += seletor.constructor.name.toLowerCase() + ', '; + resultado += " ".repeat(indentacao) + seletor.constructor.name.toLowerCase() + ', '; } resultado = resultado.slice(0, -2); resultado += ' {\n'; for (const modificador of declaracao.modificadores) { - resultado += this.traduzirModificador(modificador); + resultado += this.traduzirModificador(modificador, indentacao + 2); } - resultado += `}\n` + + resultado += this.traduzir( + declaracao.declaracoesAninhadas, + indentacao + 2 + ); + + resultado += `${" ".repeat(indentacao)}}\n\n`; } return resultado; diff --git a/fontes/valores/dicionario-valores.ts b/fontes/valores/dicionario-valores.ts index c443cb96..3570b060 100644 --- a/fontes/valores/dicionario-valores.ts +++ b/fontes/valores/dicionario-valores.ts @@ -1,6 +1,6 @@ import { CurvaCubica } from "./metodos/curva-cubica"; import { EncaixarConteudo } from "./metodos/encaixar-conteudo"; -import { Hex } from "./metodos/hex"; +import { HexadecimalCor } from "./metodos/hexadecimal-cor"; import { Hsl } from "./metodos/hsl"; import { Hsla } from "./metodos/hsla"; import { Limitar } from "./metodos/limitar"; @@ -18,7 +18,7 @@ export const DicionarioValores: { [nomeFolEs: string]: any } = { "encaixar-conteúdo": EncaixarConteudo, "hsl": Hsl, "hsla": Hsla, - "hex": Hex, + "hex": HexadecimalCor, "limitar": Limitar, "linear": Linear, "minmax": MinMax, diff --git a/fontes/valores/metodos/hex.ts b/fontes/valores/metodos/hexadecimal-cor.ts similarity index 81% rename from fontes/valores/metodos/hex.ts rename to fontes/valores/metodos/hexadecimal-cor.ts index dc426ebf..30aeba6a 100644 --- a/fontes/valores/metodos/hex.ts +++ b/fontes/valores/metodos/hexadecimal-cor.ts @@ -1,6 +1,6 @@ import { Metodo } from "./metodo"; -export class Hex extends Metodo { +export class HexadecimalCor extends Metodo { codigo: string; constructor(codigo: string) { From 38e22604e61340e3a650163030a7c6e570a5ad19 Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 04:51:18 -0700 Subject: [PATCH 02/13] =?UTF-8?q?Tradutor=20reverso=20suportando=20gera?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20FolEs=20aninhado=20e=20n=C3=A3o-aninhado.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- execucao.ts | 9 ++++- fontes/tradutor/tradutor-reverso.ts | 51 +++++++++++++++++++++++------ fontes/tradutor/tradutor.ts | 10 ++++++ 3 files changed, 59 insertions(+), 11 deletions(-) diff --git a/execucao.ts b/execucao.ts index 03a991e9..6b626d96 100644 --- a/execucao.ts +++ b/execucao.ts @@ -7,6 +7,11 @@ const principal = () => { analisadorArgumentos .argument('[arquivos...]', 'Nomes dos arquivos (opcional)') + .option( + '-a, --aninhamento', + 'Gera CSS com aninhamento. Não recomendado usar se o CSS executar em navegadores antigos.', + false + ) .action((arquivos) => { if (arquivos.length > 0) { nomeArquivo = arquivos[0]; @@ -26,7 +31,9 @@ const principal = () => { if (nomeArquivo.endsWith("foles")) { console.log(foles.converterParaCss(nomeArquivo)); return; - } else if (nomeArquivo.endsWith("css")) { + } + + if (nomeArquivo.endsWith("css")) { const retorno = foles.converterParaFolEs(nomeArquivo); console.log(retorno); return; diff --git a/fontes/tradutor/tradutor-reverso.ts b/fontes/tradutor/tradutor-reverso.ts index 1b25d844..02ef1386 100644 --- a/fontes/tradutor/tradutor-reverso.ts +++ b/fontes/tradutor/tradutor-reverso.ts @@ -2,9 +2,17 @@ import { Declaracao } from "../declaracoes"; import { Modificador } from "../modificadores"; import { Metodo } from "../valores/metodos/metodo"; -import estruturasLmht from "./estruturas-lmht"; - +/** + * O tradutor reverso traduz de CSS para FolEs. Pode traduzir tanto FolEs + * aninhado quanto desaninhado. + */ export class TradutorReverso { + traduzirComAninhamentos: boolean; + + constructor(traduzirComAninhamentos: boolean = true) { + this.traduzirComAninhamentos = traduzirComAninhamentos; + } + traduzirModificador(modificador: Modificador, indentacao: number = 0): string { let quantificador = ""; if (modificador.hasOwnProperty("quantificador")) { @@ -22,12 +30,20 @@ export class TradutorReverso { `${Array.isArray(modificador.nomeFoles) ? modificador.nomeFoles[0] : modificador.nomeFoles}: ${valor}${quantificador};\n`; } - traduzir(declaracoes: Declaracao[], indentacao: number = 0) { + traduzir(declaracoes: Declaracao[], indentacao: number = 0, seletorAnterior: string = undefined) { let resultado = ""; + let textoSeletorAnterior = ""; + if (seletorAnterior !== undefined) { + textoSeletorAnterior = seletorAnterior; + } for (const declaracao of declaracoes) { + const prefixos = []; + for (const seletor of declaracao.seletores) { - resultado += " ".repeat(indentacao) + seletor.constructor.name.toLowerCase() + ', '; + const prefixo = (textoSeletorAnterior + " " + seletor.constructor.name.toLowerCase()).trimStart(); + prefixos.push(prefixo); + resultado += " ".repeat(indentacao) + prefixo + ', '; } resultado = resultado.slice(0, -2); @@ -36,13 +52,28 @@ export class TradutorReverso { for (const modificador of declaracao.modificadores) { resultado += this.traduzirModificador(modificador, indentacao + 2); } - - resultado += this.traduzir( - declaracao.declaracoesAninhadas, - indentacao + 2 - ); - resultado += `${" ".repeat(indentacao)}}\n\n`; + if (this.traduzirComAninhamentos) { + for (const prefixo of prefixos) { + resultado += this.traduzir( + declaracao.declaracoesAninhadas, + indentacao + 2, + prefixo + ); + } + + resultado += `${" ".repeat(indentacao)}}\n\n`; + } else { + resultado += `${" ".repeat(indentacao)}}\n\n`; + + for (const prefixo of prefixos) { + resultado += this.traduzir( + declaracao.declaracoesAninhadas, + indentacao, + prefixo + ); + } + } } return resultado; diff --git a/fontes/tradutor/tradutor.ts b/fontes/tradutor/tradutor.ts index bad316b9..96f9d602 100644 --- a/fontes/tradutor/tradutor.ts +++ b/fontes/tradutor/tradutor.ts @@ -9,8 +9,18 @@ import estruturasHtml from "./estruturas-html"; /** * A classe que traduz FolEs para CSS. + * + * Normalmente o CSS traduzido é desaninhado por uma questão de compatibilidade + * entre navegadores. Até então, CSS aninhado é uma funcionalidade nova, e + * apenas navegadores mais recentes a implementam. */ export class Tradutor { + traduzirComAninhamentos: boolean; + + constructor(traduzirComAninhamentos: boolean = false) { + this.traduzirComAninhamentos = traduzirComAninhamentos; + } + private traduzirModificador( modificador: Modificador, indentacao: number = 0 From 166874450f9a8f23c6b2e7da7a44843131364f15 Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 05:35:14 -0700 Subject: [PATCH 03/13] =?UTF-8?q?Trazendo=20l=C3=B3gica=20de=20aninhamento?= =?UTF-8?q?=20do=20tradutor=20reverso=20para=20o=20tradutor.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontes/tradutor/tradutor-reverso.ts | 11 ++++----- fontes/tradutor/tradutor.ts | 37 ++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/fontes/tradutor/tradutor-reverso.ts b/fontes/tradutor/tradutor-reverso.ts index 02ef1386..598b571a 100644 --- a/fontes/tradutor/tradutor-reverso.ts +++ b/fontes/tradutor/tradutor-reverso.ts @@ -54,13 +54,10 @@ export class TradutorReverso { } if (this.traduzirComAninhamentos) { - for (const prefixo of prefixos) { - resultado += this.traduzir( - declaracao.declaracoesAninhadas, - indentacao + 2, - prefixo - ); - } + resultado += this.traduzir( + declaracao.declaracoesAninhadas, + indentacao + 2 + ); resultado += `${" ".repeat(indentacao)}}\n\n`; } else { diff --git a/fontes/tradutor/tradutor.ts b/fontes/tradutor/tradutor.ts index 96f9d602..2ca200d6 100644 --- a/fontes/tradutor/tradutor.ts +++ b/fontes/tradutor/tradutor.ts @@ -63,10 +63,15 @@ export class Tradutor { * @param declaracoes As declaracoes. * @returns Uma string com o resultado da tradução. */ - traduzir(declaracoes: Declaracao[], indentacao: number = 0) { + traduzir(declaracoes: Declaracao[], indentacao: number = 0, seletorAnterior: string = undefined) { let resultado = ""; + let textoSeletorAnterior = ""; + if (seletorAnterior !== undefined) { + textoSeletorAnterior = seletorAnterior; + } for (const declaracao of declaracoes) { + const prefixos = []; let deveImprimir = true; for (const seletor of declaracao.seletores) { @@ -76,13 +81,17 @@ export class Tradutor { continue; } + let prefixo: string; if (seletor instanceof SeletorEstrutura) { const seletorLmht = seletor.paraTexto(); const traducaoSeletor = estruturasHtml[seletorLmht]; - resultado += " ".repeat(indentacao) + traducaoSeletor + ", "; + prefixo = (textoSeletorAnterior + " " + traducaoSeletor).trimStart(); } else { - resultado += " ".repeat(indentacao) + seletor.paraTexto() + ", "; + prefixo = (textoSeletorAnterior + " " + seletor.paraTexto()).trimStart(); } + + prefixos.push(prefixo); + resultado += " ".repeat(indentacao) + prefixo + ", "; } if (!deveImprimir) { @@ -99,11 +108,23 @@ export class Tradutor { ); } - resultado += this.traduzir( - declaracao.declaracoesAninhadas, - indentacao + 2 - ); - resultado += `${" ".repeat(indentacao)}}\n\n`; + if (this.traduzirComAninhamentos) { + resultado += this.traduzir( + declaracao.declaracoesAninhadas, + indentacao + 2 + ); + resultado += `${" ".repeat(indentacao)}}\n\n`; + } else { + resultado += `${" ".repeat(indentacao)}}\n\n`; + + for (const prefixo of prefixos) { + resultado += this.traduzir( + declaracao.declaracoesAninhadas, + indentacao, + prefixo + ); + } + } } return resultado; From 88f446a930fbdd65454177156c9a2c498fe5332e Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 05:40:50 -0700 Subject: [PATCH 04/13] =?UTF-8?q?Adicionando=20par=C3=A2metro=20de=20aninh?= =?UTF-8?q?amento.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- execucao.ts | 2 +- fontes/foles.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/execucao.ts b/execucao.ts index 6b626d96..0eed363c 100644 --- a/execucao.ts +++ b/execucao.ts @@ -26,7 +26,7 @@ const principal = () => { return; } - const foles = new FolEs(); + const foles = new FolEs(opcoes.aninhamento); if (nomeArquivo.endsWith("foles")) { console.log(foles.converterParaCss(nomeArquivo)); diff --git a/fontes/foles.ts b/fontes/foles.ts index 421db205..05d933e3 100644 --- a/fontes/foles.ts +++ b/fontes/foles.ts @@ -20,7 +20,7 @@ export class FolEs { tradutor: Tradutor; tradutorReverso: TradutorReverso; - constructor() { + constructor(traduzirComAninhamentos: boolean) { this.lexador = new Lexador(); this.lexadorReverso = new LexadorReverso(); this.importador = new Importador(this.lexador); @@ -28,8 +28,8 @@ export class FolEs { this.importadorReverso.extensaoPadrao = ".css"; this.avaliadorSintatico = new AvaliadorSintatico(this.importador); this.avaliadorSintaticoReverso = new AvaliadorSintaticoReverso(this.importadorReverso); - this.tradutor = new Tradutor(); - this.tradutorReverso = new TradutorReverso(); + this.tradutor = new Tradutor(traduzirComAninhamentos); + this.tradutorReverso = new TradutorReverso(traduzirComAninhamentos); } /** From 63ea2a3eb16a4f420244063021edce30f1faff5f Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 05:49:57 -0700 Subject: [PATCH 05/13] =?UTF-8?q?Iniciando=20migra=C3=A7=C3=A3o=20de=20tra?= =?UTF-8?q?dutores=20para=20serializadores.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontes/foles.ts | 4 ++-- fontes/serializadores/README.md | 5 +++++ fontes/{tradutor => serializadores}/index.ts | 0 fontes/{tradutor => serializadores}/tradutor-reverso.ts | 0 fontes/{tradutor => serializadores}/tradutor.ts | 2 +- index.ts | 2 +- testes/avaliador-sintatico.test.ts | 2 +- testes/modificadores/atribuicao-abreviada.test.ts | 2 +- testes/modificadores/cores.test.ts | 2 +- testes/modificadores/estilo.test.ts | 2 +- testes/modificadores/metodos.test.ts | 2 +- testes/modificadores/palavras-reservadas.test.ts | 2 +- testes/modificadores/posicao.test.ts | 2 +- testes/modificadores/status.test.ts | 2 +- testes/modificadores/url.test.ts | 2 +- testes/modificadores/valor-global.test.ts | 2 +- testes/modificadores/valor-numerico.test.ts | 2 +- testes/modificadores/valor-quantificador.test.ts | 2 +- testes/tradutor-reverso.test.ts | 2 +- testes/tradutor.test.ts | 2 +- 20 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 fontes/serializadores/README.md rename fontes/{tradutor => serializadores}/index.ts (100%) rename fontes/{tradutor => serializadores}/tradutor-reverso.ts (100%) rename fontes/{tradutor => serializadores}/tradutor.ts (98%) diff --git a/fontes/foles.ts b/fontes/foles.ts index 05d933e3..5df965b3 100644 --- a/fontes/foles.ts +++ b/fontes/foles.ts @@ -2,8 +2,8 @@ import { AvaliadorSintatico } from "./avaliador-sintatico"; import { AvaliadorSintaticoReverso } from './avaliador-sintatico/avaliador-sintatico-reverso'; import { Lexador } from "./lexador"; import { LexadorReverso } from './lexador/lexador-reverso'; -import { Tradutor } from "./tradutor"; -import { TradutorReverso } from './tradutor/tradutor-reverso'; +import { Tradutor } from "./serializadores"; +import { TradutorReverso } from './serializadores/tradutor-reverso'; import { Importador } from './importador'; import { ResultadoLexadorInterface, SimboloInterface } from './interfaces'; diff --git a/fontes/serializadores/README.md b/fontes/serializadores/README.md new file mode 100644 index 00000000..f893d8b6 --- /dev/null +++ b/fontes/serializadores/README.md @@ -0,0 +1,5 @@ +# Serializadores + +Serializadores são classes que efetivamente escrevem os arquivos de saída. + +Nas primeiras implementações de FolEs, os tradutores faziam este papel. Com a inclusão da funcionalidade de geração de mapas de código, os tradutores passaram a gerar uma estrutura de dados intermediária, muito semelhante ao que é gerado pela análise sintática. Essas estruturas possuem todos os pragmas (linha, coluna inicial e coluna final de cada símbolo) recalculados pela tradução. \ No newline at end of file diff --git a/fontes/tradutor/index.ts b/fontes/serializadores/index.ts similarity index 100% rename from fontes/tradutor/index.ts rename to fontes/serializadores/index.ts diff --git a/fontes/tradutor/tradutor-reverso.ts b/fontes/serializadores/tradutor-reverso.ts similarity index 100% rename from fontes/tradutor/tradutor-reverso.ts rename to fontes/serializadores/tradutor-reverso.ts diff --git a/fontes/tradutor/tradutor.ts b/fontes/serializadores/tradutor.ts similarity index 98% rename from fontes/tradutor/tradutor.ts rename to fontes/serializadores/tradutor.ts index 2ca200d6..0a14b251 100644 --- a/fontes/tradutor/tradutor.ts +++ b/fontes/serializadores/tradutor.ts @@ -5,7 +5,7 @@ import { SeletorEstrutura } from "../seletores"; import { SeletorEspacoReservado } from "../seletores/seletor-espaco-reservado"; import { Metodo } from "../valores/metodos/metodo"; -import estruturasHtml from "./estruturas-html"; +import estruturasHtml from "../tradutor/estruturas-html"; /** * A classe que traduz FolEs para CSS. diff --git a/index.ts b/index.ts index ffff7e03..058026b7 100644 --- a/index.ts +++ b/index.ts @@ -1,4 +1,4 @@ export * from './fontes/foles'; export * from './fontes/lexador'; export * from './fontes/avaliador-sintatico'; -export * from './fontes/tradutor'; +export * from './fontes/serializadores'; diff --git a/testes/avaliador-sintatico.test.ts b/testes/avaliador-sintatico.test.ts index 78fb5a9f..420024cd 100644 --- a/testes/avaliador-sintatico.test.ts +++ b/testes/avaliador-sintatico.test.ts @@ -3,7 +3,7 @@ import { Importador } from "../fontes/importador"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface, ResultadoLexadorInterface } from "../fontes/interfaces"; import { Lexador } from "../fontes/lexador" import { SeletorModificador } from "../fontes/modificadores/superclasse" -import { Tradutor } from "../fontes/tradutor"; +import { Tradutor } from "../fontes/serializadores"; import { ValorQuantificador } from "./listas/valor-quantificador" describe('Avaliador Sintático', () => { diff --git a/testes/modificadores/atribuicao-abreviada.test.ts b/testes/modificadores/atribuicao-abreviada.test.ts index b56af756..a7431666 100644 --- a/testes/modificadores/atribuicao-abreviada.test.ts +++ b/testes/modificadores/atribuicao-abreviada.test.ts @@ -2,7 +2,7 @@ import { AvaliadorSintatico } from "../../fontes/avaliador-sintatico"; import { Importador } from "../../fontes/importador"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../../fontes/interfaces"; import { Lexador } from "../../fontes/lexador"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; describe.skip('Testando Seletores AtribuiçãoAbreviada (de atribuição abreviada), que recebem dois ou mais atributos', () => { describe('Testes Unitários', () => { diff --git a/testes/modificadores/cores.test.ts b/testes/modificadores/cores.test.ts index 32a8e15c..242e3978 100644 --- a/testes/modificadores/cores.test.ts +++ b/testes/modificadores/cores.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { Cores, CoresNomeFolEs } from "../listas/cores"; describe('Testando Seletores que recebem COR como atributo', () => { diff --git a/testes/modificadores/estilo.test.ts b/testes/modificadores/estilo.test.ts index af196d70..351b5d86 100644 --- a/testes/modificadores/estilo.test.ts +++ b/testes/modificadores/estilo.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { Estilo } from "../listas/estilo"; describe('Testando Seletores com ESTILO como atributo', () => { diff --git a/testes/modificadores/metodos.test.ts b/testes/modificadores/metodos.test.ts index 0ce1d4f1..88bc2ea0 100644 --- a/testes/modificadores/metodos.test.ts +++ b/testes/modificadores/metodos.test.ts @@ -3,7 +3,7 @@ import { Importador } from "../../fontes/importador"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../../fontes/interfaces"; import { Lexador } from "../../fontes/lexador"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { MetodoCurvaCubica, MetodoEncaixarConteudo, MetodoLimitar, MetodoLinear, MetodoMinMax, MetodoPassos, TraducaoValoresMetodos } from "../listas/metodos"; describe('Testando Seletores que recebem MÉTODOS como valor', () => { diff --git a/testes/modificadores/palavras-reservadas.test.ts b/testes/modificadores/palavras-reservadas.test.ts index bccd1f3e..69233a91 100644 --- a/testes/modificadores/palavras-reservadas.test.ts +++ b/testes/modificadores/palavras-reservadas.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { PalavrasReservadas } from "../listas/palavras-reservadas"; describe('Testando Seletores que recebem PALAVRAS RESERVADAS como atributo', () => { diff --git a/testes/modificadores/posicao.test.ts b/testes/modificadores/posicao.test.ts index 06afc11d..17358c1f 100644 --- a/testes/modificadores/posicao.test.ts +++ b/testes/modificadores/posicao.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { Posição } from "../listas/posição"; describe('Testando Seletores de POSIÇÃO', () => { diff --git a/testes/modificadores/status.test.ts b/testes/modificadores/status.test.ts index cbbab852..766e3089 100644 --- a/testes/modificadores/status.test.ts +++ b/testes/modificadores/status.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { StatusAuto, StatusNenhum, StatusNormal } from "../listas/status"; describe('Testando Seletores com STATUS como atributo', () => { diff --git a/testes/modificadores/url.test.ts b/testes/modificadores/url.test.ts index 3f7b07d6..ed69c94c 100644 --- a/testes/modificadores/url.test.ts +++ b/testes/modificadores/url.test.ts @@ -4,7 +4,7 @@ import { ImportadorInterface, LexadorInterface } from "../../fontes/interfaces"; import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { TraducaoUrl, Url } from "../listas/url"; describe('Testando Seletores que recebem URL como atributo', () => { diff --git a/testes/modificadores/valor-global.test.ts b/testes/modificadores/valor-global.test.ts index 525b955e..ef88d3c5 100644 --- a/testes/modificadores/valor-global.test.ts +++ b/testes/modificadores/valor-global.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { Valor } from "../../fontes/valores/valor"; import { ValorGlobal } from "../listas/valor-global"; diff --git a/testes/modificadores/valor-numerico.test.ts b/testes/modificadores/valor-numerico.test.ts index e0721c2a..b1b1fe5d 100644 --- a/testes/modificadores/valor-numerico.test.ts +++ b/testes/modificadores/valor-numerico.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { ValorNumerico } from "../listas/valor-numerico"; describe('Testando Seletores que recebem VALOR NUMÉRICO como atributo', () => { diff --git a/testes/modificadores/valor-quantificador.test.ts b/testes/modificadores/valor-quantificador.test.ts index b671f6ed..195aa24d 100644 --- a/testes/modificadores/valor-quantificador.test.ts +++ b/testes/modificadores/valor-quantificador.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/tradutor"; +import { Tradutor } from "../../fontes/serializadores"; import { ValorComprimento, ValorPercentual, ValorQuantificador, ValorTempo } from "../listas/valor-quantificador"; describe('Testes: Valor-Quantificador', () => { diff --git a/testes/tradutor-reverso.test.ts b/testes/tradutor-reverso.test.ts index ffd7f82d..1994f5b1 100644 --- a/testes/tradutor-reverso.test.ts +++ b/testes/tradutor-reverso.test.ts @@ -1,6 +1,6 @@ import { AvaliadorSintaticoReverso } from "../fontes/avaliador-sintatico/avaliador-sintatico-reverso"; import { LexadorReverso } from "../fontes/lexador/lexador-reverso"; -import { TradutorReverso } from "../fontes/tradutor/tradutor-reverso"; +import { TradutorReverso } from "../fontes/serializadores/tradutor-reverso"; import estruturasLmht from "../fontes/tradutor/estruturas-lmht"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../fontes/interfaces"; diff --git a/testes/tradutor.test.ts b/testes/tradutor.test.ts index 9813b9f7..a3d36964 100644 --- a/testes/tradutor.test.ts +++ b/testes/tradutor.test.ts @@ -1,7 +1,7 @@ import { AvaliadorSintatico } from "../fontes/avaliador-sintatico" import { Lexador } from "../fontes/lexador" import { SeletorModificador } from "../fontes/modificadores/superclasse" -import { Tradutor } from "../fontes/tradutor"; +import { Tradutor } from "../fontes/serializadores"; import { ValorQuantificador } from "./listas/valor-quantificador" import estruturasHtml from "../fontes/tradutor/estruturas-html"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../fontes/interfaces"; From 64bb827160f1f04549e230dddf988b280544df40 Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 05:56:34 -0700 Subject: [PATCH 06/13] =?UTF-8?q?Renomeando=20tradutores=20para=20serializ?= =?UTF-8?q?adores.=20Tradutores=20ser=C3=A3o=20reimplementados=20na=20sequ?= =?UTF-8?q?=C3=AAncia.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontes/foles.ts | 16 ++++++------- fontes/serializadores/index.ts | 4 ++-- ...tor-reverso.ts => serializador-reverso.ts} | 24 +++++++++---------- .../{tradutor.ts => serializador.ts} | 22 ++++++++--------- testes/avaliador-sintatico.test.ts | 8 +++---- .../atribuicao-abreviada.test.ts | 6 ++--- testes/modificadores/cores.test.ts | 20 ++++++++-------- testes/modificadores/estilo.test.ts | 10 ++++---- testes/modificadores/metodos.test.ts | 18 +++++++------- .../modificadores/palavras-reservadas.test.ts | 10 ++++---- testes/modificadores/posicao.test.ts | 10 ++++---- testes/modificadores/status.test.ts | 14 +++++------ testes/modificadores/url.test.ts | 10 ++++---- testes/modificadores/valor-global.test.ts | 12 +++++----- testes/modificadores/valor-numerico.test.ts | 6 ++--- .../modificadores/valor-quantificador.test.ts | 20 ++++++++-------- ...o.test.ts => serializador-reverso.test.ts} | 10 ++++---- ...{tradutor.test.ts => serializador.test.ts} | 18 +++++++------- 18 files changed, 119 insertions(+), 119 deletions(-) rename fontes/serializadores/{tradutor-reverso.ts => serializador-reverso.ts} (73%) rename fontes/serializadores/{tradutor.ts => serializador.ts} (87%) rename testes/{tradutor-reverso.test.ts => serializador-reverso.test.ts} (82%) rename testes/{tradutor.test.ts => serializador.test.ts} (86%) diff --git a/fontes/foles.ts b/fontes/foles.ts index 5df965b3..2d2f6409 100644 --- a/fontes/foles.ts +++ b/fontes/foles.ts @@ -2,8 +2,8 @@ import { AvaliadorSintatico } from "./avaliador-sintatico"; import { AvaliadorSintaticoReverso } from './avaliador-sintatico/avaliador-sintatico-reverso'; import { Lexador } from "./lexador"; import { LexadorReverso } from './lexador/lexador-reverso'; -import { Tradutor } from "./serializadores"; -import { TradutorReverso } from './serializadores/tradutor-reverso'; +import { Serializador } from "./serializadores"; +import { SerializadorReverso } from './serializadores/serializador-reverso'; import { Importador } from './importador'; import { ResultadoLexadorInterface, SimboloInterface } from './interfaces'; @@ -17,8 +17,8 @@ export class FolEs { avaliadorSintaticoReverso: AvaliadorSintaticoReverso; importador: Importador; importadorReverso: Importador; - tradutor: Tradutor; - tradutorReverso: TradutorReverso; + tradutor: Serializador; + tradutorReverso: SerializadorReverso; constructor(traduzirComAninhamentos: boolean) { this.lexador = new Lexador(); @@ -28,8 +28,8 @@ export class FolEs { this.importadorReverso.extensaoPadrao = ".css"; this.avaliadorSintatico = new AvaliadorSintatico(this.importador); this.avaliadorSintaticoReverso = new AvaliadorSintaticoReverso(this.importadorReverso); - this.tradutor = new Tradutor(traduzirComAninhamentos); - this.tradutorReverso = new TradutorReverso(traduzirComAninhamentos); + this.tradutor = new Serializador(traduzirComAninhamentos); + this.tradutorReverso = new SerializadorReverso(traduzirComAninhamentos); } /** @@ -39,13 +39,13 @@ export class FolEs { */ private converterParaCssInterno(simbolos: SimboloInterface[]): string { const resultadoAvaliadorSintatico = this.avaliadorSintatico.analisar(simbolos); - const traducao = this.tradutor.traduzir(resultadoAvaliadorSintatico); + const traducao = this.tradutor.serializar(resultadoAvaliadorSintatico); return traducao; } private converterParaFolEsInterno(simbolos: SimboloInterface[]): string { const resultadoAvaliadorSintaticoReverso = this.avaliadorSintaticoReverso.analisar(simbolos); - const traducaoReversa = this.tradutorReverso.traduzir(resultadoAvaliadorSintaticoReverso); + const traducaoReversa = this.tradutorReverso.serializar(resultadoAvaliadorSintaticoReverso); return traducaoReversa; } diff --git a/fontes/serializadores/index.ts b/fontes/serializadores/index.ts index 2b53fb9a..6ed18c46 100644 --- a/fontes/serializadores/index.ts +++ b/fontes/serializadores/index.ts @@ -1,2 +1,2 @@ -export * from './tradutor'; -export * from './tradutor-reverso'; +export * from './serializador'; +export * from './serializador-reverso'; diff --git a/fontes/serializadores/tradutor-reverso.ts b/fontes/serializadores/serializador-reverso.ts similarity index 73% rename from fontes/serializadores/tradutor-reverso.ts rename to fontes/serializadores/serializador-reverso.ts index 598b571a..37b170d7 100644 --- a/fontes/serializadores/tradutor-reverso.ts +++ b/fontes/serializadores/serializador-reverso.ts @@ -3,17 +3,17 @@ import { Modificador } from "../modificadores"; import { Metodo } from "../valores/metodos/metodo"; /** - * O tradutor reverso traduz de CSS para FolEs. Pode traduzir tanto FolEs + * O serializador reverso traduz de CSS para FolEs. Pode traduzir tanto FolEs * aninhado quanto desaninhado. */ -export class TradutorReverso { - traduzirComAninhamentos: boolean; +export class SerializadorReverso { + serializarComAninhamentos: boolean; - constructor(traduzirComAninhamentos: boolean = true) { - this.traduzirComAninhamentos = traduzirComAninhamentos; + constructor(serializarComAninhamentos: boolean = true) { + this.serializarComAninhamentos = serializarComAninhamentos; } - traduzirModificador(modificador: Modificador, indentacao: number = 0): string { + serializarModificador(modificador: Modificador, indentacao: number = 0): string { let quantificador = ""; if (modificador.hasOwnProperty("quantificador")) { quantificador = modificador.quantificador; @@ -30,7 +30,7 @@ export class TradutorReverso { `${Array.isArray(modificador.nomeFoles) ? modificador.nomeFoles[0] : modificador.nomeFoles}: ${valor}${quantificador};\n`; } - traduzir(declaracoes: Declaracao[], indentacao: number = 0, seletorAnterior: string = undefined) { + serializar(declaracoes: Declaracao[], indentacao: number = 0, seletorAnterior: string = undefined) { let resultado = ""; let textoSeletorAnterior = ""; if (seletorAnterior !== undefined) { @@ -50,11 +50,11 @@ export class TradutorReverso { resultado += ' {\n'; for (const modificador of declaracao.modificadores) { - resultado += this.traduzirModificador(modificador, indentacao + 2); + resultado += this.serializarModificador(modificador, indentacao + 2); } - if (this.traduzirComAninhamentos) { - resultado += this.traduzir( + if (this.serializarComAninhamentos) { + resultado += this.serializar( declaracao.declaracoesAninhadas, indentacao + 2 ); @@ -64,7 +64,7 @@ export class TradutorReverso { resultado += `${" ".repeat(indentacao)}}\n\n`; for (const prefixo of prefixos) { - resultado += this.traduzir( + resultado += this.serializar( declaracao.declaracoesAninhadas, indentacao, prefixo @@ -75,4 +75,4 @@ export class TradutorReverso { return resultado; } -} \ No newline at end of file +} diff --git a/fontes/serializadores/tradutor.ts b/fontes/serializadores/serializador.ts similarity index 87% rename from fontes/serializadores/tradutor.ts rename to fontes/serializadores/serializador.ts index 0a14b251..fb53ab95 100644 --- a/fontes/serializadores/tradutor.ts +++ b/fontes/serializadores/serializador.ts @@ -8,20 +8,20 @@ import { Metodo } from "../valores/metodos/metodo"; import estruturasHtml from "../tradutor/estruturas-html"; /** - * A classe que traduz FolEs para CSS. + * A classe que efetivamente traduz FolEs para CSS. * * Normalmente o CSS traduzido é desaninhado por uma questão de compatibilidade * entre navegadores. Até então, CSS aninhado é uma funcionalidade nova, e * apenas navegadores mais recentes a implementam. */ -export class Tradutor { - traduzirComAninhamentos: boolean; +export class Serializador { + serializarComAninhamentos: boolean; - constructor(traduzirComAninhamentos: boolean = false) { - this.traduzirComAninhamentos = traduzirComAninhamentos; + constructor(serializarComAninhamentos: boolean = false) { + this.serializarComAninhamentos = serializarComAninhamentos; } - private traduzirModificador( + private serializarModificador( modificador: Modificador, indentacao: number = 0 ): string { @@ -63,7 +63,7 @@ export class Tradutor { * @param declaracoes As declaracoes. * @returns Uma string com o resultado da tradução. */ - traduzir(declaracoes: Declaracao[], indentacao: number = 0, seletorAnterior: string = undefined) { + serializar(declaracoes: Declaracao[], indentacao: number = 0, seletorAnterior: string = undefined) { let resultado = ""; let textoSeletorAnterior = ""; if (seletorAnterior !== undefined) { @@ -102,14 +102,14 @@ export class Tradutor { resultado += " {\n"; for (const modificador of declaracao.modificadores) { - resultado += this.traduzirModificador( + resultado += this.serializarModificador( modificador, indentacao + 2 ); } - if (this.traduzirComAninhamentos) { - resultado += this.traduzir( + if (this.serializarComAninhamentos) { + resultado += this.serializar( declaracao.declaracoesAninhadas, indentacao + 2 ); @@ -118,7 +118,7 @@ export class Tradutor { resultado += `${" ".repeat(indentacao)}}\n\n`; for (const prefixo of prefixos) { - resultado += this.traduzir( + resultado += this.serializar( declaracao.declaracoesAninhadas, indentacao, prefixo diff --git a/testes/avaliador-sintatico.test.ts b/testes/avaliador-sintatico.test.ts index 420024cd..90aa723c 100644 --- a/testes/avaliador-sintatico.test.ts +++ b/testes/avaliador-sintatico.test.ts @@ -3,20 +3,20 @@ import { Importador } from "../fontes/importador"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface, ResultadoLexadorInterface } from "../fontes/interfaces"; import { Lexador } from "../fontes/lexador" import { SeletorModificador } from "../fontes/modificadores/superclasse" -import { Tradutor } from "../fontes/serializadores"; +import { Serializador } from "../fontes/serializadores"; import { ValorQuantificador } from "./listas/valor-quantificador" describe('Avaliador Sintático', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliadorSintatico: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliadorSintatico = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); @@ -54,7 +54,7 @@ describe('Avaliador Sintático', () => { ); // O resultado do Avaliador deve ser recebido corretamente pelo Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toBeTruthy(); } diff --git a/testes/modificadores/atribuicao-abreviada.test.ts b/testes/modificadores/atribuicao-abreviada.test.ts index a7431666..3d2159e6 100644 --- a/testes/modificadores/atribuicao-abreviada.test.ts +++ b/testes/modificadores/atribuicao-abreviada.test.ts @@ -2,20 +2,20 @@ import { AvaliadorSintatico } from "../../fontes/avaliador-sintatico"; import { Importador } from "../../fontes/importador"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../../fontes/interfaces"; import { Lexador } from "../../fontes/lexador"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; describe.skip('Testando Seletores AtribuiçãoAbreviada (de atribuição abreviada), que recebem dois ou mais atributos', () => { describe('Testes Unitários', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Trivial', () => { diff --git a/testes/modificadores/cores.test.ts b/testes/modificadores/cores.test.ts index 242e3978..8202f3ec 100644 --- a/testes/modificadores/cores.test.ts +++ b/testes/modificadores/cores.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { Cores, CoresNomeFolEs } from "../listas/cores"; describe('Testando Seletores que recebem COR como atributo', () => { @@ -12,13 +12,13 @@ describe('Testando Seletores que recebem COR como atributo', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Caso de Sucesso - Cor válida', () => { @@ -50,7 +50,7 @@ describe('Testando Seletores que recebem COR como atributo', () => { ); // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); expect(resultadoTradutor).toContain("brown;"); @@ -82,7 +82,7 @@ describe('Testando Seletores que recebem COR como atributo', () => { ); // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(CoresNomeFolEs[Cores[index]]); expect(resultadoTradutor).toContain("#f015ca;"); @@ -114,7 +114,7 @@ describe('Testando Seletores que recebem COR como atributo', () => { ); // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(CoresNomeFolEs[Cores[index]]); expect(resultadoTradutor).toContain("rgb(34, 12, 64);"); @@ -147,7 +147,7 @@ describe('Testando Seletores que recebem COR como atributo', () => { ); // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(CoresNomeFolEs[Cores[index]]); expect(resultadoTradutor).toContain("rgba(34, 64, 300);"); @@ -187,7 +187,7 @@ describe('Testando Seletores que recebem COR como atributo', () => { // Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático expect(() => { - tradutor.traduzir(avaliador.analisar(novoLexador.simbolos)); + tradutor.serializar(avaliador.analisar(novoLexador.simbolos)); }).toHaveLength(0); } }); @@ -216,7 +216,7 @@ describe('Testando Seletores que recebem COR como atributo', () => { ); // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(CoresNomeFolEs[Cores[index]]); expect(resultadoTradutor).toContain("hsl(34, 50%, 120%);"); @@ -247,7 +247,7 @@ describe('Testando Seletores que recebem COR como atributo', () => { ); // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(CoresNomeFolEs[Cores[index]]); expect(resultadoTradutor).toContain("hsla(34, 50%, 120%);"); diff --git a/testes/modificadores/estilo.test.ts b/testes/modificadores/estilo.test.ts index 351b5d86..53a3df8a 100644 --- a/testes/modificadores/estilo.test.ts +++ b/testes/modificadores/estilo.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { Estilo } from "../listas/estilo"; describe('Testando Seletores com ESTILO como atributo', () => { @@ -12,13 +12,13 @@ describe('Testando Seletores com ESTILO como atributo', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Valor válido', () => { @@ -62,7 +62,7 @@ describe('Testando Seletores com ESTILO como atributo', () => { // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain('body'); @@ -113,7 +113,7 @@ describe('Testando Seletores com ESTILO como atributo', () => { // Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático expect(() => { - tradutor.traduzir(avaliador.analisar(resultadoLexador.simbolos)); + tradutor.serializar(avaliador.analisar(resultadoLexador.simbolos)); }).toHaveLength(0); } }); diff --git a/testes/modificadores/metodos.test.ts b/testes/modificadores/metodos.test.ts index 88bc2ea0..c1c21633 100644 --- a/testes/modificadores/metodos.test.ts +++ b/testes/modificadores/metodos.test.ts @@ -3,7 +3,7 @@ import { Importador } from "../../fontes/importador"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../../fontes/interfaces"; import { Lexador } from "../../fontes/lexador"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { MetodoCurvaCubica, MetodoEncaixarConteudo, MetodoLimitar, MetodoLinear, MetodoMinMax, MetodoPassos, TraducaoValoresMetodos } from "../listas/metodos"; describe('Testando Seletores que recebem MÉTODOS como valor', () => { @@ -11,13 +11,13 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Atribuindo Método "encaixar-conteúdo" (fit-content)', () => { @@ -57,7 +57,7 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => { ); // // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(TraducaoValoresMetodos[MetodoEncaixarConteudo[index]]); expect(resultadoTradutor).toContain('fit-content(200px)'); @@ -102,7 +102,7 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => { ); // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(TraducaoValoresMetodos[MetodoLimitar[index]]); expect(resultadoTradutor).toContain('clamp(10vw, 20em, 100vw);'); @@ -147,7 +147,7 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => { ); // // // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain( TraducaoValoresMetodos[MetodoMinMax[index]]); expect(resultadoTradutor).toContain('minmax(100px, max-content);'); @@ -191,7 +191,7 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => { ); // // // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain( TraducaoValoresMetodos[MetodoPassos[index]]); expect(resultadoTradutor).toContain('steps(2, jump-start);'); @@ -234,7 +234,7 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => { ); // // // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain( TraducaoValoresMetodos[MetodoCurvaCubica[index]]); expect(resultadoTradutor).toContain('cubic-bezier(0.42, 0, 1, 1);'); @@ -278,7 +278,7 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => { ); // // // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(TraducaoValoresMetodos[MetodoLinear[index]]); expect(resultadoTradutor).toContain('linear(0, 0.25, 1);'); diff --git a/testes/modificadores/palavras-reservadas.test.ts b/testes/modificadores/palavras-reservadas.test.ts index 69233a91..0e959a2a 100644 --- a/testes/modificadores/palavras-reservadas.test.ts +++ b/testes/modificadores/palavras-reservadas.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { PalavrasReservadas } from "../listas/palavras-reservadas"; describe('Testando Seletores que recebem PALAVRAS RESERVADAS como atributo', () => { @@ -12,13 +12,13 @@ describe('Testando Seletores que recebem PALAVRAS RESERVADAS como atributo', () let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Caso de sucesso - Valores globais válidos', () => { @@ -66,7 +66,7 @@ describe('Testando Seletores que recebem PALAVRAS RESERVADAS como atributo', () // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain('body'); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); @@ -127,7 +127,7 @@ describe('Testando Seletores que recebem PALAVRAS RESERVADAS como atributo', () // Tradutor deve tranformar o código corretamente em CSS - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain('body'); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); diff --git a/testes/modificadores/posicao.test.ts b/testes/modificadores/posicao.test.ts index 17358c1f..c978212b 100644 --- a/testes/modificadores/posicao.test.ts +++ b/testes/modificadores/posicao.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { Posição } from "../listas/posição"; describe('Testando Seletores de POSIÇÃO', () => { @@ -12,13 +12,13 @@ describe('Testando Seletores de POSIÇÃO', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Lexador, Avaliador e Tradutor', () => { @@ -66,7 +66,7 @@ describe('Testando Seletores de POSIÇÃO', () => { // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain('body'); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); @@ -118,7 +118,7 @@ describe('Testando Seletores de POSIÇÃO', () => { // Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático expect(() => { - tradutor.traduzir(avaliador.analisar(resultadoLexador.simbolos)); + tradutor.serializar(avaliador.analisar(resultadoLexador.simbolos)); }).toHaveLength(0); } }); diff --git a/testes/modificadores/status.test.ts b/testes/modificadores/status.test.ts index 766e3089..5c56edf5 100644 --- a/testes/modificadores/status.test.ts +++ b/testes/modificadores/status.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { StatusAuto, StatusNenhum, StatusNormal } from "../listas/status"; describe('Testando Seletores com STATUS como atributo', () => { @@ -12,13 +12,13 @@ describe('Testando Seletores com STATUS como atributo', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Valor válido (auto)', () => { @@ -67,7 +67,7 @@ describe('Testando Seletores com STATUS como atributo', () => { ); // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); expect(resultadoTradutor).toContain('auto'); @@ -109,7 +109,7 @@ describe('Testando Seletores com STATUS como atributo', () => { // Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático expect(() => { - tradutor.traduzir(avaliador.analisar(novoLexador.simbolos)); + tradutor.serializar(avaliador.analisar(novoLexador.simbolos)); }).toHaveLength(0); } }); @@ -151,7 +151,7 @@ describe('Testando Seletores com STATUS como atributo', () => { ); // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); expect(resultadoTradutor).toContain('none'); @@ -195,7 +195,7 @@ describe('Testando Seletores com STATUS como atributo', () => { ); // // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); expect(resultadoTradutor).toContain('normal'); diff --git a/testes/modificadores/url.test.ts b/testes/modificadores/url.test.ts index ed69c94c..0454323c 100644 --- a/testes/modificadores/url.test.ts +++ b/testes/modificadores/url.test.ts @@ -4,7 +4,7 @@ import { ImportadorInterface, LexadorInterface } from "../../fontes/interfaces"; import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { TraducaoUrl, Url } from "../listas/url"; describe('Testando Seletores que recebem URL como atributo', () => { @@ -12,13 +12,13 @@ describe('Testando Seletores que recebem URL como atributo', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintatico; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Lexador, Avaliador e Tradutor', () => { @@ -48,7 +48,7 @@ describe('Testando Seletores que recebem URL como atributo', () => { // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(TraducaoUrl[Url[index]]); expect(resultadoTradutor).toContain('url'); @@ -87,7 +87,7 @@ describe('Testando Seletores que recebem URL como atributo', () => { // Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático expect(() => { - tradutor.traduzir(avaliador.analisar(novoLexador.simbolos)); + tradutor.serializar(avaliador.analisar(novoLexador.simbolos)); }).toHaveLength(0); } }); diff --git a/testes/modificadores/valor-global.test.ts b/testes/modificadores/valor-global.test.ts index ef88d3c5..11b42f3a 100644 --- a/testes/modificadores/valor-global.test.ts +++ b/testes/modificadores/valor-global.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { Valor } from "../../fontes/valores/valor"; import { ValorGlobal } from "../listas/valor-global"; @@ -13,13 +13,13 @@ describe('Testando Seletores com VALORES GLOBAIS', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliadorSintatico: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliadorSintatico = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Lexador, Avaliador e Tradutor', () => { @@ -52,7 +52,7 @@ describe('Testando Seletores com VALORES GLOBAIS', () => { // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); expect(resultadoTradutor).toContain('inherit'); @@ -78,7 +78,7 @@ describe('Testando Seletores com VALORES GLOBAIS', () => { // Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático expect(() => { - tradutor.traduzir(avaliadorSintatico.analisar(resultadoLexador.simbolos)); + tradutor.serializar(avaliadorSintatico.analisar(resultadoLexador.simbolos)); }).toHaveLength(0); } }); @@ -117,7 +117,7 @@ describe('Testando Seletores com VALORES GLOBAIS', () => { // Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático expect(() => { - tradutor.traduzir(avaliadorSintatico.analisar(novoLexador.simbolos)); + tradutor.serializar(avaliadorSintatico.analisar(novoLexador.simbolos)); }).toHaveLength(0); } }); diff --git a/testes/modificadores/valor-numerico.test.ts b/testes/modificadores/valor-numerico.test.ts index b1b1fe5d..6b34210f 100644 --- a/testes/modificadores/valor-numerico.test.ts +++ b/testes/modificadores/valor-numerico.test.ts @@ -4,7 +4,7 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { ValorNumerico } from "../listas/valor-numerico"; describe('Testando Seletores que recebem VALOR NUMÉRICO como atributo', () => { @@ -16,13 +16,13 @@ describe('Testando Seletores que recebem VALOR NUMÉRICO como atributo', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Lexador, Avaliador e Tradutor', () => { diff --git a/testes/modificadores/valor-quantificador.test.ts b/testes/modificadores/valor-quantificador.test.ts index 195aa24d..8d25f4ea 100644 --- a/testes/modificadores/valor-quantificador.test.ts +++ b/testes/modificadores/valor-quantificador.test.ts @@ -4,21 +4,21 @@ import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } fr import { Lexador } from "../../fontes/lexador"; import { SeletorModificador } from "../../fontes/modificadores/superclasse"; import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles"; -import { Tradutor } from "../../fontes/serializadores"; +import { Serializador } from "../../fontes/serializadores"; import { ValorComprimento, ValorPercentual, ValorQuantificador, ValorTempo } from "../listas/valor-quantificador"; describe('Testes: Valor-Quantificador', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; describe('Testando Seletores que aceitam QUALQUER Valor e Quantificador', () => { beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Lexador, Avaliador e Tradutor', () => { @@ -52,7 +52,7 @@ describe('Testes: Valor-Quantificador', () => { // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain('html'); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); @@ -91,7 +91,7 @@ describe('Testes: Valor-Quantificador', () => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Lexador, Avaliador e Tradutor', () => { @@ -125,7 +125,7 @@ describe('Testes: Valor-Quantificador', () => { // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); } @@ -137,7 +137,7 @@ describe('Testes: Valor-Quantificador', () => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Lexador, Avaliador e Tradutor', () => { @@ -171,7 +171,7 @@ describe('Testes: Valor-Quantificador', () => { // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); } @@ -183,7 +183,7 @@ describe('Testes: Valor-Quantificador', () => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); it('Casos de sucesso - Lexador, Avaliador e Tradutor', () => { @@ -217,7 +217,7 @@ describe('Testes: Valor-Quantificador', () => { // Tradutor - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(seletor['propriedadeCss']); } diff --git a/testes/tradutor-reverso.test.ts b/testes/serializador-reverso.test.ts similarity index 82% rename from testes/tradutor-reverso.test.ts rename to testes/serializador-reverso.test.ts index 1994f5b1..a0221a55 100644 --- a/testes/tradutor-reverso.test.ts +++ b/testes/serializador-reverso.test.ts @@ -1,22 +1,22 @@ import { AvaliadorSintaticoReverso } from "../fontes/avaliador-sintatico/avaliador-sintatico-reverso"; import { LexadorReverso } from "../fontes/lexador/lexador-reverso"; -import { TradutorReverso } from "../fontes/serializadores/tradutor-reverso"; +import { SerializadorReverso } from "../fontes/serializadores/serializador-reverso"; import estruturasLmht from "../fontes/tradutor/estruturas-lmht"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../fontes/interfaces"; import { Importador } from "../fontes/importador"; -describe('Tradutor Reverso', () => { +describe('Serializador Reverso', () => { let lexadorReverso: LexadorInterface; let importador: ImportadorInterface; let avaliadorReverso: AvaliadorSintaticoInterface; - let tradutorReverso: TradutorReverso; + let tradutorReverso: SerializadorReverso; beforeEach(() => { lexadorReverso = new LexadorReverso(); importador = new Importador(lexadorReverso); avaliadorReverso = new AvaliadorSintaticoReverso(importador); - tradutorReverso = new TradutorReverso(); + tradutorReverso = new SerializadorReverso(); }); // TODO: Finalizar a lógica em `declaracaoPorSeletor()` (avaliador sintático reverso) @@ -34,7 +34,7 @@ describe('Tradutor Reverso', () => { const resultadoAvaliadorSintatico = avaliadorReverso.analisar(resultadoLexador.simbolos); // Tradutor deve retornar a estrutura HTML correspondente - const resultadoTradutor = tradutorReverso.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutorReverso.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(Object.values(estruturasLmht)[index]); } }); diff --git a/testes/tradutor.test.ts b/testes/serializador.test.ts similarity index 86% rename from testes/tradutor.test.ts rename to testes/serializador.test.ts index a3d36964..90cb0db2 100644 --- a/testes/tradutor.test.ts +++ b/testes/serializador.test.ts @@ -1,23 +1,23 @@ import { AvaliadorSintatico } from "../fontes/avaliador-sintatico" import { Lexador } from "../fontes/lexador" import { SeletorModificador } from "../fontes/modificadores/superclasse" -import { Tradutor } from "../fontes/serializadores"; +import { Serializador } from "../fontes/serializadores"; import { ValorQuantificador } from "./listas/valor-quantificador" import estruturasHtml from "../fontes/tradutor/estruturas-html"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../fontes/interfaces"; import { Importador } from "../fontes/importador"; -describe('Tradutor', () => { +describe('Serializador', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Tradutor; + let tradutor: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Tradutor(); + tradutor = new Serializador(); }); describe('Casos de Sucesso', () => { @@ -35,7 +35,7 @@ describe('Tradutor', () => { // console.log(resultadoAvaliadorSintatico); // Tradutor deve retornar a estrutura HTML correspondente - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(Object.values(estruturasHtml)[index]); } }); @@ -55,7 +55,7 @@ describe('Tradutor', () => { const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); // Tradutor deve funcionar de acordo - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toBeTruthy(); expect(resultadoTradutor).toContain("html"); @@ -76,7 +76,7 @@ describe('Tradutor', () => { const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); // Tradutor deve funcionar de acordo - const resultadoTradutor = tradutor.traduzir(resultadoAvaliadorSintatico); + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toBeTruthy(); expect(resultadoTradutor).toContain("html"); @@ -98,11 +98,11 @@ describe('Tradutor', () => { // Tradutor - Não deve ser executado, dado o erro gerado no Avaliador Sintático expect(() => { - tradutor.traduzir(avaliador.analisar(resultadoLexador.simbolos)); + tradutor.serializar(avaliador.analisar(resultadoLexador.simbolos)); }).not.toBeTruthy; expect(() => { - tradutor.traduzir(avaliador.analisar(resultadoLexador.simbolos)); + tradutor.serializar(avaliador.analisar(resultadoLexador.simbolos)); }).toHaveLength(0); } }); From deaa0970f22790057d27b4ca1b4d03551aaa1538 Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 05:59:43 -0700 Subject: [PATCH 07/13] =?UTF-8?q?Corre=C3=A7=C3=A3o=20dos=20testes=20unit?= =?UTF-8?q?=C3=A1rios.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testes/foles.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testes/foles.test.ts b/testes/foles.test.ts index 09b9cf2b..48227f28 100644 --- a/testes/foles.test.ts +++ b/testes/foles.test.ts @@ -5,7 +5,7 @@ describe('Classe FolEs - Tradução de Textos', () => { let foles: FolEs; beforeEach(() => { - foles = new FolEs(); + foles = new FolEs(false); }); it('converterTextoParaCss - caso de sucesso', () => { @@ -28,7 +28,7 @@ describe('Classe FolEs - Tradução de Textos', () => { let foles: FolEs; beforeEach(() => { - foles = new FolEs(); + foles = new FolEs(false); }); it('converterTextoParaFolEs - caso de sucesso', () => { @@ -53,7 +53,7 @@ describe('Classe FolEs - Tradução de Arquivos', () => { let foles: FolEs; beforeEach(() => { - foles = new FolEs(); + foles = new FolEs(false); }); it('converterParaCss - caso de sucesso', () => { @@ -70,7 +70,7 @@ describe('Classe FolEs - Tradução de Arquivos', () => { let foles: FolEs; beforeEach(() => { - foles = new FolEs(); + foles = new FolEs(false); }); it('converterParaFolEs - caso de sucesso', () => { From 8b102d40d06b5260dfbb3fdad24e0793ed43f845 Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 06:00:57 -0700 Subject: [PATCH 08/13] =?UTF-8?q?Removendo=20`.skip`=20de=20teste=20que=20?= =?UTF-8?q?est=C3=A1=20funcional.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testes/foles.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testes/foles.test.ts b/testes/foles.test.ts index 48227f28..868e2db3 100644 --- a/testes/foles.test.ts +++ b/testes/foles.test.ts @@ -66,7 +66,7 @@ describe('Classe FolEs - Tradução de Arquivos', () => { }); }); - describe.skip('CSS para FolEs', () => { + describe('CSS para FolEs', () => { let foles: FolEs; beforeEach(() => { From 65c7f427ba299e4754d3de73a2c40c14d89f80bf Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 06:29:47 -0700 Subject: [PATCH 09/13] Seletores passam a ter pragmas na classse abstrata. --- fontes/seletores/seletor-classe.ts | 3 +-- fontes/seletores/seletor-espaco-reservado.ts | 4 +--- fontes/seletores/seletor-estrutura.ts | 5 +++-- fontes/seletores/seletor.ts | 7 +++++-- fontes/serializadores/serializador.ts | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/fontes/seletores/seletor-classe.ts b/fontes/seletores/seletor-classe.ts index 016b0e54..bb301f13 100644 --- a/fontes/seletores/seletor-classe.ts +++ b/fontes/seletores/seletor-classe.ts @@ -7,9 +7,8 @@ export class SeletorClasse extends Seletor { pragmas?: PragmasSeletor; constructor(nomeClasse: string, pseudoclasse?: Pseudoclasse, pragmas?: PragmasSeletor) { - super(pseudoclasse); + super(pseudoclasse, pragmas); this.nomeClasse = nomeClasse; - this.pragmas = pragmas; } paraTexto() { diff --git a/fontes/seletores/seletor-espaco-reservado.ts b/fontes/seletores/seletor-espaco-reservado.ts index efeae0be..4598b58d 100644 --- a/fontes/seletores/seletor-espaco-reservado.ts +++ b/fontes/seletores/seletor-espaco-reservado.ts @@ -6,12 +6,10 @@ import { Seletor } from "./seletor"; */ export class SeletorEspacoReservado extends Seletor { nome: string; - pragmas?: PragmasSeletor; constructor(nome: string, pragmas?: PragmasSeletor) { - super(undefined); + super(undefined, pragmas); this.nome = nome; - this.pragmas = pragmas; } paraTexto() { diff --git a/fontes/seletores/seletor-estrutura.ts b/fontes/seletores/seletor-estrutura.ts index 820611e9..1e24455b 100644 --- a/fontes/seletores/seletor-estrutura.ts +++ b/fontes/seletores/seletor-estrutura.ts @@ -1,12 +1,13 @@ import { Estrutura } from "../estruturas/estrutura"; import { Pseudoclasse } from "../pseudoclasses/pseudoclasse"; +import { PragmasSeletor } from "./pragmas-seletor"; import { Seletor } from "./seletor"; export class SeletorEstrutura extends Seletor { estrutura: Estrutura; - constructor(estrutura: Estrutura, pseudoclasse?: Pseudoclasse) { - super(pseudoclasse); + constructor(estrutura: Estrutura, pseudoclasse?: Pseudoclasse, pragmas?: PragmasSeletor) { + super(pseudoclasse, pragmas); this.estrutura = estrutura; } diff --git a/fontes/seletores/seletor.ts b/fontes/seletores/seletor.ts index 41d2e7b1..56a37fae 100644 --- a/fontes/seletores/seletor.ts +++ b/fontes/seletores/seletor.ts @@ -1,11 +1,14 @@ import { Pseudoclasse } from "../pseudoclasses/pseudoclasse"; +import { PragmasSeletor } from "./pragmas-seletor"; export abstract class Seletor { pseudoclasse?: Pseudoclasse; + pragmas?: PragmasSeletor; - constructor(pseudoclasse?: Pseudoclasse) { + constructor(pseudoclasse?: Pseudoclasse, pragmas?: PragmasSeletor) { this.pseudoclasse = pseudoclasse; + this.pragmas = pragmas; } abstract paraTexto(); -} \ No newline at end of file +} diff --git a/fontes/serializadores/serializador.ts b/fontes/serializadores/serializador.ts index fb53ab95..70df0a99 100644 --- a/fontes/serializadores/serializador.ts +++ b/fontes/serializadores/serializador.ts @@ -5,7 +5,7 @@ import { SeletorEstrutura } from "../seletores"; import { SeletorEspacoReservado } from "../seletores/seletor-espaco-reservado"; import { Metodo } from "../valores/metodos/metodo"; -import estruturasHtml from "../tradutor/estruturas-html"; +import estruturasHtml from "../tradutores/estruturas-html"; /** * A classe que efetivamente traduz FolEs para CSS. From 3cdb4ddc7e276130ea8118c4d11a9afe3ed7ffb6 Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 06:31:09 -0700 Subject: [PATCH 10/13] =?UTF-8?q?Esbo=C3=A7o=20dos=20novos=20tradutores.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontes/tradutores/README.md | 3 ++ .../estruturas-html.ts | 0 .../estruturas-lmht.ts | 0 fontes/tradutores/tradutor-reverso.ts | 0 fontes/tradutores/tradutor.ts | 35 +++++++++++++++++++ testes/serializador-reverso.test.ts | 2 +- testes/serializador.test.ts | 2 +- 7 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 fontes/tradutores/README.md rename fontes/{tradutor => tradutores}/estruturas-html.ts (100%) rename fontes/{tradutor => tradutores}/estruturas-lmht.ts (100%) create mode 100644 fontes/tradutores/tradutor-reverso.ts create mode 100644 fontes/tradutores/tradutor.ts diff --git a/fontes/tradutores/README.md b/fontes/tradutores/README.md new file mode 100644 index 00000000..816e3d4f --- /dev/null +++ b/fontes/tradutores/README.md @@ -0,0 +1,3 @@ +# Tradutores + +Inicialmente implementados como classes que montavam _strings_ de saída, os tradutores de FolEs recebem estruturas de dados do avaliador sintático e geram outras, com o recálculo dos pragmas (linha, coluna inicial e coluna final de cada símbolo). A ideia com isso é de gerar não apenas o arquivo de saída com a tradução como também seu respectivo mapa de símbolos, que pode ser usado em navegadores de internet (inspetor) para entender como cada símbolo foi transformado. \ No newline at end of file diff --git a/fontes/tradutor/estruturas-html.ts b/fontes/tradutores/estruturas-html.ts similarity index 100% rename from fontes/tradutor/estruturas-html.ts rename to fontes/tradutores/estruturas-html.ts diff --git a/fontes/tradutor/estruturas-lmht.ts b/fontes/tradutores/estruturas-lmht.ts similarity index 100% rename from fontes/tradutor/estruturas-lmht.ts rename to fontes/tradutores/estruturas-lmht.ts diff --git a/fontes/tradutores/tradutor-reverso.ts b/fontes/tradutores/tradutor-reverso.ts new file mode 100644 index 00000000..e69de29b diff --git a/fontes/tradutores/tradutor.ts b/fontes/tradutores/tradutor.ts new file mode 100644 index 00000000..d68bd4ee --- /dev/null +++ b/fontes/tradutores/tradutor.ts @@ -0,0 +1,35 @@ +import { Declaracao } from "../declaracoes"; +import { Seletor, SeletorEstrutura } from "../seletores"; + +import estruturasHtml from "./estruturas-html"; + +export class Tradutor { + linha: number; + atual: number; + + constructor() { + this.linha = 1; + this.atual = 1; + } + + traduzir(declaracoes: Declaracao[]): Declaracao[] { + this.linha = 1; + this.atual = 1; + + for (const declaracao of declaracoes) { + const seletoresTraduzidos: Seletor[] = []; + + for (const seletor of declaracao.seletores) { + if (seletor instanceof SeletorEstrutura) { + const seletorLmht = seletor.paraTexto(); + const traducaoSeletor = estruturasHtml[seletorLmht]; + // prefixo = (textoSeletorAnterior + " " + traducaoSeletor).trimStart(); + } else { + // prefixo = (textoSeletorAnterior + " " + seletor.paraTexto()).trimStart(); + } + } + } + + return []; + } +} \ No newline at end of file diff --git a/testes/serializador-reverso.test.ts b/testes/serializador-reverso.test.ts index a0221a55..660dd908 100644 --- a/testes/serializador-reverso.test.ts +++ b/testes/serializador-reverso.test.ts @@ -2,7 +2,7 @@ import { AvaliadorSintaticoReverso } from "../fontes/avaliador-sintatico/avaliad import { LexadorReverso } from "../fontes/lexador/lexador-reverso"; import { SerializadorReverso } from "../fontes/serializadores/serializador-reverso"; -import estruturasLmht from "../fontes/tradutor/estruturas-lmht"; +import estruturasLmht from "../fontes/tradutores/estruturas-lmht"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../fontes/interfaces"; import { Importador } from "../fontes/importador"; diff --git a/testes/serializador.test.ts b/testes/serializador.test.ts index 90cb0db2..88cc2410 100644 --- a/testes/serializador.test.ts +++ b/testes/serializador.test.ts @@ -3,7 +3,7 @@ import { Lexador } from "../fontes/lexador" import { SeletorModificador } from "../fontes/modificadores/superclasse" import { Serializador } from "../fontes/serializadores"; import { ValorQuantificador } from "./listas/valor-quantificador" -import estruturasHtml from "../fontes/tradutor/estruturas-html"; +import estruturasHtml from "../fontes/tradutores/estruturas-html"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../fontes/interfaces"; import { Importador } from "../fontes/importador"; From 534cc51a91756112a23ed71e97028624b01a16bc Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 07:38:25 -0700 Subject: [PATCH 11/13] =?UTF-8?q?Esbo=C3=A7o=20da=20tradu=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20um=20seletor.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontes/seletores/seletor-estrutura.ts | 8 +++-- fontes/tradutores/tradutor.ts | 48 ++++++++++++++++++++++----- testes/serializador.test.ts | 19 ++++++----- testes/tradutor.test.ts | 34 +++++++++++++++++++ 4 files changed, 90 insertions(+), 19 deletions(-) create mode 100644 testes/tradutor.test.ts diff --git a/fontes/seletores/seletor-estrutura.ts b/fontes/seletores/seletor-estrutura.ts index 1e24455b..d57aadcc 100644 --- a/fontes/seletores/seletor-estrutura.ts +++ b/fontes/seletores/seletor-estrutura.ts @@ -6,8 +6,12 @@ import { Seletor } from "./seletor"; export class SeletorEstrutura extends Seletor { estrutura: Estrutura; - constructor(estrutura: Estrutura, pseudoclasse?: Pseudoclasse, pragmas?: PragmasSeletor) { - super(pseudoclasse, pragmas); + constructor(estrutura: Estrutura, pseudoclasse?: Pseudoclasse) { + super(pseudoclasse, { + linha: estrutura.pragmas.linha, + colunaInicial: estrutura.pragmas.colunaInicial, + colunaFinal: estrutura.pragmas.colunaFinal + }); this.estrutura = estrutura; } diff --git a/fontes/tradutores/tradutor.ts b/fontes/tradutores/tradutor.ts index d68bd4ee..d7bd4f1e 100644 --- a/fontes/tradutores/tradutor.ts +++ b/fontes/tradutores/tradutor.ts @@ -1,5 +1,6 @@ import { Declaracao } from "../declaracoes"; -import { Seletor, SeletorEstrutura } from "../seletores"; +import { SeletorEstruturasHtml } from "../estruturas/seletor-estruturas-html"; +import { PragmasSeletor, Seletor, SeletorEstrutura } from "../seletores"; import estruturasHtml from "./estruturas-html"; @@ -12,24 +13,55 @@ export class Tradutor { this.atual = 1; } + private calcularPragmasSeletor(traducaoSeletor: string) { + const novosPragmasSeletor: PragmasSeletor = { + linha: this.linha, + colunaInicial: this.atual, + colunaFinal: this.atual + } + + this.atual += traducaoSeletor.length; + novosPragmasSeletor.colunaFinal = this.atual; + return novosPragmasSeletor; + } + + private traduzirSeletorEstrutura(seletor: SeletorEstrutura): Seletor { + const seletorLmht = seletor.paraTexto(); + const traducaoSeletor = estruturasHtml[seletorLmht]; + const novosPragmasSeletor = this.calcularPragmasSeletor(traducaoSeletor); + return new SeletorEstruturasHtml( + traducaoSeletor, + novosPragmasSeletor + ) as Seletor; + } + traduzir(declaracoes: Declaracao[]): Declaracao[] { this.linha = 1; this.atual = 1; + const declaracoesTraduzidas = []; + for (const declaracao of declaracoes) { const seletoresTraduzidos: Seletor[] = []; for (const seletor of declaracao.seletores) { + this.linha = seletor.pragmas.linha; + if (seletor instanceof SeletorEstrutura) { - const seletorLmht = seletor.paraTexto(); - const traducaoSeletor = estruturasHtml[seletorLmht]; - // prefixo = (textoSeletorAnterior + " " + traducaoSeletor).trimStart(); - } else { - // prefixo = (textoSeletorAnterior + " " + seletor.paraTexto()).trimStart(); - } + seletoresTraduzidos.push(this.traduzirSeletorEstrutura(seletor)); + continue; + } } + + declaracoesTraduzidas.push( + new Declaracao( + seletoresTraduzidos, + [], + [] + ) + ) } - return []; + return declaracoesTraduzidas; } } \ No newline at end of file diff --git a/testes/serializador.test.ts b/testes/serializador.test.ts index 88cc2410..40e8d736 100644 --- a/testes/serializador.test.ts +++ b/testes/serializador.test.ts @@ -3,21 +3,23 @@ import { Lexador } from "../fontes/lexador" import { SeletorModificador } from "../fontes/modificadores/superclasse" import { Serializador } from "../fontes/serializadores"; import { ValorQuantificador } from "./listas/valor-quantificador" -import estruturasHtml from "../fontes/tradutores/estruturas-html"; + import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../fontes/interfaces"; import { Importador } from "../fontes/importador"; +import estruturasHtml from "../fontes/tradutores/estruturas-html"; + describe('Serializador', () => { let lexador: LexadorInterface; let importador: ImportadorInterface; let avaliador: AvaliadorSintaticoInterface; - let tradutor: Serializador; + let serializador: Serializador; beforeEach(() => { lexador = new Lexador(); importador = new Importador(lexador); avaliador = new AvaliadorSintatico(importador); - tradutor = new Serializador(); + serializador = new Serializador(); }); describe('Casos de Sucesso', () => { @@ -32,10 +34,9 @@ describe('Serializador', () => { // Avaliador Sintático const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); - // console.log(resultadoAvaliadorSintatico); // Tradutor deve retornar a estrutura HTML correspondente - const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + const resultadoTradutor = serializador.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toContain(Object.values(estruturasHtml)[index]); } }); @@ -55,7 +56,7 @@ describe('Serializador', () => { const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); // Tradutor deve funcionar de acordo - const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + const resultadoTradutor = serializador.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toBeTruthy(); expect(resultadoTradutor).toContain("html"); @@ -76,7 +77,7 @@ describe('Serializador', () => { const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); // Tradutor deve funcionar de acordo - const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + const resultadoTradutor = serializador.serializar(resultadoAvaliadorSintatico); expect(resultadoTradutor).toBeTruthy(); expect(resultadoTradutor).toContain("html"); @@ -98,11 +99,11 @@ describe('Serializador', () => { // Tradutor - Não deve ser executado, dado o erro gerado no Avaliador Sintático expect(() => { - tradutor.serializar(avaliador.analisar(resultadoLexador.simbolos)); + serializador.serializar(avaliador.analisar(resultadoLexador.simbolos)); }).not.toBeTruthy; expect(() => { - tradutor.serializar(avaliador.analisar(resultadoLexador.simbolos)); + serializador.serializar(avaliador.analisar(resultadoLexador.simbolos)); }).toHaveLength(0); } }); diff --git a/testes/tradutor.test.ts b/testes/tradutor.test.ts new file mode 100644 index 00000000..eff0a6d4 --- /dev/null +++ b/testes/tradutor.test.ts @@ -0,0 +1,34 @@ +import { AvaliadorSintatico } from "../fontes/avaliador-sintatico"; +import { Importador } from "../fontes/importador"; +import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../fontes/interfaces"; +import { Lexador } from "../fontes/lexador"; +import { Tradutor } from "../fontes/tradutores/tradutor"; + +describe('Tradutor', () => { + let lexador: LexadorInterface; + let importador: ImportadorInterface; + let avaliador: AvaliadorSintaticoInterface; + let tradutor: Tradutor; + + beforeEach(() => { + lexador = new Lexador(); + importador = new Importador(lexador); + avaliador = new AvaliadorSintatico(importador); + tradutor = new Tradutor(); + }); + + describe('Casos de Sucesso', () => { + it('Trivial', () => { + const resultadoLexador = lexador.mapear([ + 'lmht {', + ' largura-borda-direita: 130mm;', + '}' + ]); + + const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); + const resultado = tradutor.traduzir(resultadoAvaliadorSintatico); + + expect(resultado).toBeTruthy(); + }); + }); +}); From 929d145aeaa2404431cad6255790b1c28090334e Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 08:10:07 -0700 Subject: [PATCH 12/13] =?UTF-8?q?Esbo=C3=A7o=20de=20tradu=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20modificadores.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontes/modificadores/largura-borda-direita.ts | 2 +- fontes/tradutores/tradutor.ts | 30 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/fontes/modificadores/largura-borda-direita.ts b/fontes/modificadores/largura-borda-direita.ts index 68a0f398..db4831eb 100644 --- a/fontes/modificadores/largura-borda-direita.ts +++ b/fontes/modificadores/largura-borda-direita.ts @@ -12,7 +12,7 @@ export class LarguraBordaDireita extends Modificador { } constructor(valor: string, quantificador?: string, pragmas?: PragmasModificador) { - super("largura-borda-direita", "border-right-width"); + super("largura-borda-direita", "border-right-width", pragmas); validarValorNumerico('largura-borda-direita', valor, this.valoresAceitos); diff --git a/fontes/tradutores/tradutor.ts b/fontes/tradutores/tradutor.ts index d7bd4f1e..5b8d207d 100644 --- a/fontes/tradutores/tradutor.ts +++ b/fontes/tradutores/tradutor.ts @@ -1,6 +1,9 @@ import { Declaracao } from "../declaracoes"; import { SeletorEstruturasHtml } from "../estruturas/seletor-estruturas-html"; +import { Modificador } from "../modificadores"; +import { PragmasModificador, SeletorModificador } from "../modificadores/superclasse"; import { PragmasSeletor, Seletor, SeletorEstrutura } from "../seletores"; +import { Metodo } from "../valores/metodos/metodo"; import estruturasHtml from "./estruturas-html"; @@ -25,6 +28,18 @@ export class Tradutor { return novosPragmasSeletor; } + private calcularPragmasModificador(modificador: Modificador) { + const novosPragmasModificador: PragmasModificador = { + linha: this.linha, + colunaInicial: this.atual, + colunaFinal: this.atual + } + + this.atual += modificador.propriedadeCss.length; + novosPragmasModificador.colunaFinal = this.atual; + return novosPragmasModificador; + } + private traduzirSeletorEstrutura(seletor: SeletorEstrutura): Seletor { const seletorLmht = seletor.paraTexto(); const traducaoSeletor = estruturasHtml[seletorLmht]; @@ -43,6 +58,7 @@ export class Tradutor { for (const declaracao of declaracoes) { const seletoresTraduzidos: Seletor[] = []; + const modificadoresTraduzidos: Modificador[] = []; for (const seletor of declaracao.seletores) { this.linha = seletor.pragmas.linha; @@ -53,10 +69,22 @@ export class Tradutor { } } + for (const modificador of declaracao.modificadores) { + this.linha = modificador.pragmas.linha; + modificadoresTraduzidos.push( + new SeletorModificador( + Array.isArray(modificador.nomeFoles) ? modificador.nomeFoles[0] : modificador.nomeFoles, + modificador.valor instanceof Metodo ? modificador.valor.paraTexto() : modificador.valor, + modificador.quantificador, + this.calcularPragmasModificador(modificador) + ) as Modificador + ); + } + declaracoesTraduzidas.push( new Declaracao( seletoresTraduzidos, - [], + modificadoresTraduzidos, [] ) ) From cca316204e72dd4fb5a877fc17eea957d9746d1b Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva Date: Fri, 27 Oct 2023 09:08:21 -0700 Subject: [PATCH 13/13] =?UTF-8?q?Esbo=C3=A7o=20do=20tradutor=20reverso.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontes/tradutores/tradutor-reverso.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fontes/tradutores/tradutor-reverso.ts b/fontes/tradutores/tradutor-reverso.ts index e69de29b..1e891215 100644 --- a/fontes/tradutores/tradutor-reverso.ts +++ b/fontes/tradutores/tradutor-reverso.ts @@ -0,0 +1,11 @@ +import { Declaracao } from "../declaracoes"; + +export class TradutorReverso { + traduzir(declaracoes: Declaracao[]): Declaracao[] { + for (const declaracao of declaracoes) { + + } + + return []; + } +} \ No newline at end of file