From c063a564f65508badef748233de408c62cc5fca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vitor=20Brand=C3=A3o?= <82619724+VitBrandao@users.noreply.github.com> Date: Mon, 2 Dec 2024 16:18:12 -0300 Subject: [PATCH] =?UTF-8?q?Pseudoclasses=20com=20par=C3=A2metros=20e=20aum?= =?UTF-8?q?enta=20cobertura=20geral=20de=20testes=20(#147)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Testes unitários de validação de valores comuns atribuídos aos modificadores * Testes unitários de validação de valores com condição extra * Testes unitários de validação de valores numéricos, cobrindo casos de erro * Ajustando método de validação de cor após revisões * Testes unitários de validação de cores e hexadecimais * Ajusta arquivo de validação de valor cor * Testes unitários dos métodos de validação de quantificadores * Ajusta testes de valor numérico após alterações na validação de quantificadores * Testes unitários do método de proibir quantificador * Correção pontual nos testes de validação de quantificadores * Testes unitários para Seletores de Classe * Testes unitários de Seletor Classe com pseudoclasse * Apagando console.log extra na bateria de testes * Testes unitários para Seletores Id * Testes unitários de Seletores Espaço Reservado * Testando estrutura do Serializador Reverso * Corrige e atualiza listagem de estruturas LMHT * Implementa primeiros testes unitários do Seletor Reverso * Apaga console.log extra na bateria de testes * Ajustes nos testes unitários do Serializador Reverso * Implementa testes de tradução reversa de modificadores * Testando tradução reversa de modificadores * Limpa trechos de debug do Lexador e Av. Sintatico Reverso * Permite que Lexador Reverso consiga mapear métodos CSS * Prepara testes de serializar métodos css * Conserta testes do serializador reverso * Ajusta Lexador Reverso para mapear Quantificadores * Conserta testes do Lexador Reverso * Ajusta testes do Serializador Reverso após alterações no Lexador Reverso * Apaga console.log extra da bateria de testes * Implementa testes do Lexador Reverso após novas alterações * Organiza métodos FolEs para novas implementações da tradução reversa * Comenta trechos que quebram os testes unitários * Inicia ajustes do processo de tradução reversa de métodos * Adaptando Av. Sintatico e Serializador Reverso para comportar métodos * Implementando método brightness no processo de tradução reversa --- exemplos/exemplo.foles | 16 - exemplos/exemplo3.foles | 1 + exemplos/exemplo4.foles | 8 + exemplos/reverso/exemplo-codigo.css | 7 + exemplos/reverso/exemplo-liquido.css | 4 + .../avaliador-sintatico-reverso.ts | 46 +- .../avaliador-sintatico.ts | 1 - fontes/foles.ts | 19 +- fontes/lexador/lexador-reverso.ts | 34 +- fontes/lexador/palavras-reservadas/css.ts | 84 +++ .../cor-inicio-borda-em-linha.ts | 2 - .../dicionario-reverso-modificadores.ts | 6 + fontes/modificadores/imagem-fundo.ts | 2 +- .../modificadores/superclasse/modificador.ts | 2 +- .../seletor-reverso-modificador.ts | 4 +- fontes/modificadores/validacoes/comum.ts | 34 +- .../validacoes/condicao-extra.ts | 6 +- fontes/modificadores/validacoes/cor.ts | 57 +-- fontes/modificadores/validacoes/numerica.ts | 5 +- .../validacoes/proibir-quantificador.ts | 5 +- .../modificadores/validacoes/quantificador.ts | 7 +- fontes/serializadores/serializador-reverso.ts | 15 +- fontes/serializadores/serializador.ts | 2 +- fontes/tipos-de-simbolos/css.ts | 3 + fontes/tradutores/estruturas-lmht.ts | 6 +- fontes/tradutores/tradutor-reverso.ts | 2 +- fontes/tradutores/tradutor.ts | 2 +- fontes/valores/dicionario-valores.ts | 86 ++-- fontes/valores/metodos/css/blur.ts | 24 + fontes/valores/metodos/css/brightness.ts | 24 + fontes/valores/metodos/css/metodo-css.ts | 5 + fontes/valores/metodos/{ => foles}/borrar.ts | 4 +- fontes/valores/metodos/{ => foles}/brilho.ts | 2 +- .../valores/metodos/{ => foles}/calcular.ts | 2 +- .../valores/metodos/{ => foles}/contraste.ts | 2 +- .../metodos/{ => foles}/curva-cubica.ts | 2 +- .../metodos/{ => foles}/encaixar-conteudo.ts | 2 +- .../metodos/{ => foles}/escala-cinza.ts | 2 +- .../metodos/{ => foles}/escalamento-3d.ts | 2 +- .../metodos/{ => foles}/escalamento-eixo-z.ts | 2 +- .../{ => foles}/escalamento-horizontal.ts | 2 +- .../{ => foles}/escalamento-vertical.ts | 2 +- .../metodos/{ => foles}/escalamento.ts | 2 +- .../metodos/{ => foles}/gradiente-linear.ts | 4 +- .../metodos/{ => foles}/hexadecimal-cor.ts | 0 fontes/valores/metodos/{ => foles}/hsl.ts | 2 +- fontes/valores/metodos/{ => foles}/hsla.ts | 2 +- .../{ => foles}/inclinar-horizontal.ts | 2 +- .../metodos/{ => foles}/inclinar-vertical.ts | 2 +- .../valores/metodos/{ => foles}/inclinar.ts | 2 +- .../valores/metodos/{ => foles}/inverter.ts | 2 +- fontes/valores/metodos/{ => foles}/limitar.ts | 2 +- fontes/valores/metodos/{ => foles}/linear.ts | 2 +- fontes/valores/metodos/{ => foles}/metodo.ts | 2 +- fontes/valores/metodos/{ => foles}/minmax.ts | 0 fontes/valores/metodos/{ => foles}/opacar.ts | 2 +- fontes/valores/metodos/{ => foles}/passos.ts | 2 +- .../metodos/{ => foles}/perspectivar.ts | 2 +- .../metodos/{ => foles}/projetar-sombra.ts | 4 +- fontes/valores/metodos/{ => foles}/raio.ts | 4 +- fontes/valores/metodos/{ => foles}/rgb.ts | 2 +- fontes/valores/metodos/{ => foles}/rgba.ts | 2 +- .../metodos/{ => foles}/rotacionar-eixo-z.ts | 2 +- .../{ => foles}/rotacionar-horizontal.ts | 2 +- .../metodos/{ => foles}/rotacionar-matiz.ts | 2 +- .../{ => foles}/rotacionar-vertical.ts | 2 +- .../valores/metodos/{ => foles}/rotacionar.ts | 2 +- fontes/valores/metodos/{ => foles}/saturar.ts | 2 +- fontes/valores/metodos/{ => foles}/sepia.ts | 2 +- .../metodos/{ => foles}/translacao-3d.ts | 2 +- .../metodos/{ => foles}/translacao-eixo-z.ts | 2 +- .../{ => foles}/translacao-horizontal.ts | 2 +- .../{ => foles}/translacao-vertical.ts | 2 +- .../valores/metodos/{ => foles}/translacao.ts | 2 +- fontes/valores/metodos/{ => foles}/url.ts | 0 testes/lexador-reverso.test.ts | 101 +++- testes/listas/traducao-reversa.ts | 58 +++ .../validacoes-modificadores.test.ts | 477 ++++++++++++++++++ testes/modificadores/valor-numerico.test.ts | 4 +- testes/seletores-estruturas.test.ts | 259 ++++++++++ testes/serializador-reverso.test.ts | 66 ++- 81 files changed, 1348 insertions(+), 226 deletions(-) create mode 100644 exemplos/reverso/exemplo-codigo.css create mode 100644 fontes/valores/metodos/css/blur.ts create mode 100644 fontes/valores/metodos/css/brightness.ts create mode 100644 fontes/valores/metodos/css/metodo-css.ts rename fontes/valores/metodos/{ => foles}/borrar.ts (88%) rename fontes/valores/metodos/{ => foles}/brilho.ts (92%) rename fontes/valores/metodos/{ => foles}/calcular.ts (94%) rename fontes/valores/metodos/{ => foles}/contraste.ts (92%) rename fontes/valores/metodos/{ => foles}/curva-cubica.ts (93%) rename fontes/valores/metodos/{ => foles}/encaixar-conteudo.ts (90%) rename fontes/valores/metodos/{ => foles}/escala-cinza.ts (92%) rename fontes/valores/metodos/{ => foles}/escalamento-3d.ts (92%) rename fontes/valores/metodos/{ => foles}/escalamento-eixo-z.ts (89%) rename fontes/valores/metodos/{ => foles}/escalamento-horizontal.ts (89%) rename fontes/valores/metodos/{ => foles}/escalamento-vertical.ts (89%) rename fontes/valores/metodos/{ => foles}/escalamento.ts (92%) rename fontes/valores/metodos/{ => foles}/gradiente-linear.ts (88%) rename fontes/valores/metodos/{ => foles}/hexadecimal-cor.ts (100%) rename fontes/valores/metodos/{ => foles}/hsl.ts (92%) rename fontes/valores/metodos/{ => foles}/hsla.ts (95%) rename fontes/valores/metodos/{ => foles}/inclinar-horizontal.ts (93%) rename fontes/valores/metodos/{ => foles}/inclinar-vertical.ts (93%) rename fontes/valores/metodos/{ => foles}/inclinar.ts (96%) rename fontes/valores/metodos/{ => foles}/inverter.ts (92%) rename fontes/valores/metodos/{ => foles}/limitar.ts (95%) rename fontes/valores/metodos/{ => foles}/linear.ts (91%) rename fontes/valores/metodos/{ => foles}/metodo.ts (68%) rename fontes/valores/metodos/{ => foles}/minmax.ts (100%) rename fontes/valores/metodos/{ => foles}/opacar.ts (92%) rename fontes/valores/metodos/{ => foles}/passos.ts (94%) rename fontes/valores/metodos/{ => foles}/perspectivar.ts (93%) rename fontes/valores/metodos/{ => foles}/projetar-sombra.ts (94%) rename fontes/valores/metodos/{ => foles}/raio.ts (86%) rename fontes/valores/metodos/{ => foles}/rgb.ts (91%) rename fontes/valores/metodos/{ => foles}/rgba.ts (91%) rename fontes/valores/metodos/{ => foles}/rotacionar-eixo-z.ts (93%) rename fontes/valores/metodos/{ => foles}/rotacionar-horizontal.ts (93%) rename fontes/valores/metodos/{ => foles}/rotacionar-matiz.ts (93%) rename fontes/valores/metodos/{ => foles}/rotacionar-vertical.ts (93%) rename fontes/valores/metodos/{ => foles}/rotacionar.ts (93%) rename fontes/valores/metodos/{ => foles}/saturar.ts (92%) rename fontes/valores/metodos/{ => foles}/sepia.ts (92%) rename fontes/valores/metodos/{ => foles}/translacao-3d.ts (98%) rename fontes/valores/metodos/{ => foles}/translacao-eixo-z.ts (92%) rename fontes/valores/metodos/{ => foles}/translacao-horizontal.ts (92%) rename fontes/valores/metodos/{ => foles}/translacao-vertical.ts (92%) rename fontes/valores/metodos/{ => foles}/translacao.ts (96%) rename fontes/valores/metodos/{ => foles}/url.ts (100%) create mode 100644 testes/listas/traducao-reversa.ts create mode 100644 testes/modificadores/validacoes-modificadores.test.ts create mode 100644 testes/seletores-estruturas.test.ts diff --git a/exemplos/exemplo.foles b/exemplos/exemplo.foles index 8fd43cc8..55486887 100644 --- a/exemplos/exemplo.foles +++ b/exemplos/exemplo.foles @@ -1,19 +1,3 @@ -lmht { - largura-borda-direita: 130mm; -} - -corpo { - imagem-fundo: url(https://teste.com/teste.png); -} - -aspas { - contém: nenhum; - recortar: auto; - fluxo: nenhum; - conteudo: normal; - citações: nenhum; -} - .minha-classe { alinhar-conteudo: inseguro; estilo-contorno: herdar; diff --git a/exemplos/exemplo3.foles b/exemplos/exemplo3.foles index 240a7e2d..00788242 100644 --- a/exemplos/exemplo3.foles +++ b/exemplos/exemplo3.foles @@ -7,6 +7,7 @@ lmht { indice-z: 5; transformar: translação(15graus); deslocamento: raio(conter 200graus); + filtro-fundo: borrar(10px); } lmht { diff --git a/exemplos/exemplo4.foles b/exemplos/exemplo4.foles index f27ff299..27448906 100644 --- a/exemplos/exemplo4.foles +++ b/exemplos/exemplo4.foles @@ -8,4 +8,12 @@ divisao:foco { paragrafo:futuro { tamanho-fonte: 20px; +} + +divisão:direcao-texto { + altura: 20px; +} + +lmht { + filtro-fundo: borrar(10px); } \ No newline at end of file diff --git a/exemplos/reverso/exemplo-codigo.css b/exemplos/reverso/exemplo-codigo.css new file mode 100644 index 00000000..caf8310d --- /dev/null +++ b/exemplos/reverso/exemplo-codigo.css @@ -0,0 +1,7 @@ +div { + margin-top: 12px; +} + +p { + border: 50px; +} \ No newline at end of file diff --git a/exemplos/reverso/exemplo-liquido.css b/exemplos/reverso/exemplo-liquido.css index 4a3fb169..18de1502 100644 --- a/exemplos/reverso/exemplo-liquido.css +++ b/exemplos/reverso/exemplo-liquido.css @@ -19,3 +19,7 @@ html { #meu-segundo-id { width: 400mm; } + +div { + backdrop-filter: brightness(10px); +} diff --git a/fontes/avaliador-sintatico/avaliador-sintatico-reverso.ts b/fontes/avaliador-sintatico/avaliador-sintatico-reverso.ts index 60ab5962..d24da566 100644 --- a/fontes/avaliador-sintatico/avaliador-sintatico-reverso.ts +++ b/fontes/avaliador-sintatico/avaliador-sintatico-reverso.ts @@ -9,8 +9,9 @@ import { SeletorEstruturasHtml } from "../estruturas/seletor-estruturas-html"; import tiposDeSimbolos from "../tipos-de-simbolos/css"; import { Seletor, SeletorClasse, SeletorEstrutura, SeletorId } from "../seletores"; import { AvaliadorSintaticoInterface, ImportadorInterface } from "../interfaces"; -import { HexadecimalCor } from "../valores/metodos/hexadecimal-cor"; +import { HexadecimalCor } from "../valores/metodos/foles/hexadecimal-cor"; import { Estrutura } from "../estruturas/estrutura"; +import { Valor } from "../valores/valor"; /** * O avaliador sintático reverso avalia símbolos de arquivos CSS, @@ -153,12 +154,51 @@ export class AvaliadorSintaticoReverso implements AvaliadorSintaticoInterface { return new HexadecimalCor(codigoCor.lexema); } + // TODO: Implementar lógica para resolver método + private resolverMetodo(lexema: string): Valor { + switch (lexema) { + case "blur": + this.consumir(tiposDeSimbolos.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'blur'."); + const valorBorrar = this.avancarEDevolverAnterior(); + let quantificadorBorrar; + if (this.simbolos[this.atual].tipo === 'QUANTIFICADOR') { + quantificadorBorrar = this.avancarEDevolverAnterior(); + } else { + quantificadorBorrar = null; + } + this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado parêntese direito após método 'blur'."); + return new SeletorReversoModificador( + lexema, + valorBorrar, + quantificadorBorrar.length !== 0 ? quantificadorBorrar : null, + ); + + case "brightness": + this.consumir(tiposDeSimbolos.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'brightness'."); + const valorBrilho = this.avancarEDevolverAnterior(); + let quantificadorBrilho; + if (this.simbolos[this.atual].tipo === 'QUANTIFICADOR') { + quantificadorBrilho = this.avancarEDevolverAnterior(); + } else { + quantificadorBrilho = null; + } + this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado parêntese direito após método 'brightness'."); + return new SeletorReversoModificador( + lexema, + valorBrilho, + quantificadorBrilho.length !== 0 ? quantificadorBrilho : null, + ); + } + } + private valorModificador() { const valorModificador = this.avancarEDevolverAnterior(); - + switch (valorModificador.tipo) { case tiposDeSimbolos.CERQUILHA: return this.resolverCor(); + case tiposDeSimbolos.METODO: + return this.resolverMetodo(valorModificador.lexema); default: return valorModificador; } @@ -185,7 +225,7 @@ export class AvaliadorSintaticoReverso implements AvaliadorSintaticoInterface { tiposDeSimbolos.PONTO_E_VIRGULA, `Esperado ';' após declaração de valor de modificador '${modificador.lexema}'.` ); - + const classeModificadora = new SeletorReversoModificador( modificador.lexema, valorModificador instanceof Simbolo ? valorModificador.lexema : valorModificador, diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts index 113f2e6c..de0529e3 100644 --- a/fontes/avaliador-sintatico/avaliador-sintatico.ts +++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts @@ -15,7 +15,6 @@ import { Estrutura } from "../estruturas/estrutura"; import { SeletorEspacoReservado } from "../seletores/seletor-espaco-reservado"; import { AvaliadorSintaticoInterface, ImportadorInterface, SimboloInterface } from "../interfaces"; import { ValorNumerico, ValorNumericoComQuantificador } from "../../testes/listas/valor-numerico"; -import { log } from "console"; /** diff --git a/fontes/foles.ts b/fontes/foles.ts index 47402cca..53c2f3ff 100644 --- a/fontes/foles.ts +++ b/fontes/foles.ts @@ -50,7 +50,7 @@ export class FolEs { */ private converterParaCssInterno(simbolos: SimboloInterface[]): string { const resultadoAvaliadorSintatico = this.avaliadorSintatico.analisar(simbolos); - + const traducao = this.serializador.serializar(resultadoAvaliadorSintatico); return traducao; } @@ -60,16 +60,16 @@ export class FolEs { const traducaoReversa = this.serializadorReverso.serializar(resultadoAvaliadorSintaticoReverso); return traducaoReversa; } - + converterParaCss(nomeArquivo: string): string { - const resultadoLexador: [string[], ResultadoLexadorInterface] = + const resultadoLexador: [string[], ResultadoLexadorInterface] = this.importador.importar(nomeArquivo, true); - + return this.converterParaCssInterno(resultadoLexador[1].simbolos); } converterParaCssComMapas(nomeArquivo: string): [string, string] { - const resultadoLexador: [string[], ResultadoLexadorInterface] = + const resultadoLexador: [string[], ResultadoLexadorInterface] = this.importador.importar(nomeArquivo, true); const resultadoAvaliadorSintatico = this.avaliadorSintatico.analisar(resultadoLexador[1].simbolos); const traducao = this.serializador.serializar(resultadoAvaliadorSintatico); @@ -77,15 +77,15 @@ export class FolEs { const mapa = this.geradorMapaCss.gerarMapaFontes(resultadoTraducao, resultadoLexador[0].join('\n')); return [ - traducao, + traducao, new Base64().encode(JSON.stringify(mapa)) ]; } converterParaFolEs(nomeArquivo: string): string { - const resultadoLexador: [string[], ResultadoLexadorInterface] = + const resultadoLexador: [string[], ResultadoLexadorInterface] = this.importadorReverso.importar(nomeArquivo); - + return this.converterParaFolEsInterno(resultadoLexador[1].simbolos); } @@ -102,4 +102,5 @@ export class FolEs { // const a = new FolEs(false); // console.log(a.converterParaCss('../exemplos/exemplo4.foles')); -// console.log(a.converterParaFolEs('../exemplos/reverso/exemplo-liquido.css')); \ No newline at end of file +// console.log(a.converterParaFolEs('../exemplos/reverso/exemplo-liquido.css'));/ +// console.log(a.converterParaFolEs('../exemplos/reverso/exemplo-codigo.css')); \ No newline at end of file diff --git a/fontes/lexador/lexador-reverso.ts b/fontes/lexador/lexador-reverso.ts index 07a85300..9af85e92 100644 --- a/fontes/lexador/lexador-reverso.ts +++ b/fontes/lexador/lexador-reverso.ts @@ -30,7 +30,7 @@ export class LexadorReverso implements LexadorInterface { * @returns Verdadeiro se contador de linhas está na última linha. * Falso caso contrário. */ - eUltimaLinha(): boolean { + eUltimaLinha(): boolean { return this.linha >= this.codigo.length - 1; } @@ -133,13 +133,13 @@ export class LexadorReverso implements LexadorInterface { this.inicioSimbolo, this.atual ); - + this.simbolos.push( new Simbolo( - tipo, - texto || lexema, - literal, - this.linha + 1, + tipo, + texto || lexema, + literal, + this.linha + 1, this.inicioSimbolo + 1, this.atual ) @@ -181,6 +181,14 @@ export class LexadorReverso implements LexadorInterface { this.adicionarSimbolo(tiposDeSimbolos.CHAVE_DIREITA); this.avancar(); break; + case "(": + this.adicionarSimbolo(tiposDeSimbolos.PARENTESE_ESQUERDO); + this.avancar(); + break; + case ")": + this.adicionarSimbolo(tiposDeSimbolos.PARENTESE_DIREITO); + this.avancar(); + break; case ':': this.adicionarSimbolo(tiposDeSimbolos.DOIS_PONTOS); this.avancar(); @@ -202,12 +210,12 @@ export class LexadorReverso implements LexadorInterface { this.avancar(); break; case ' ': - case '\0': - case '\r': - case '\t': - case ';': - this.avancar(); - break; + case '\0': + case '\r': + case '\t': + case ';': + this.avancar(); + break; default: if (this.eDigito(caractere)) this.analisarNumero(); else if (this.eAlfabeto(caractere)) @@ -238,7 +246,7 @@ export class LexadorReverso implements LexadorInterface { this.analisarToken(); } - return { + return { simbolos: this.simbolos, erros: this.erros } diff --git a/fontes/lexador/palavras-reservadas/css.ts b/fontes/lexador/palavras-reservadas/css.ts index 75fd44c6..bc84560b 100644 --- a/fontes/lexador/palavras-reservadas/css.ts +++ b/fontes/lexador/palavras-reservadas/css.ts @@ -1,6 +1,7 @@ import tiposDeSimbolos from "../../tipos-de-simbolos/css"; export default { + // TAG 'body': tiposDeSimbolos.TAG, 'head': tiposDeSimbolos.TAG, 'html': tiposDeSimbolos.TAG, @@ -84,4 +85,87 @@ export default { 'h5': tiposDeSimbolos.TAG, 'h6': tiposDeSimbolos.TAG, 'var': tiposDeSimbolos.TAG, + + // MÉTODOS + 'blur': tiposDeSimbolos.METODO, + 'brightness': tiposDeSimbolos.METODO, + 'calc': tiposDeSimbolos.METODO, + 'contrast': tiposDeSimbolos.METODO, + 'cubic-bezier': tiposDeSimbolos.METODO, + 'fit-content': tiposDeSimbolos.METODO, + 'grayscale': tiposDeSimbolos.METODO, + 'scale3d': tiposDeSimbolos.METODO, + 'scaleZ': tiposDeSimbolos.METODO, + 'scaleX': tiposDeSimbolos.METODO, + 'scaleY': tiposDeSimbolos.METODO, + 'scale': tiposDeSimbolos.METODO, + 'linear-gradient': tiposDeSimbolos.METODO, + 'hsl': tiposDeSimbolos.METODO, + 'hsla': tiposDeSimbolos.METODO, + 'skewX': tiposDeSimbolos.METODO, + 'skewY': tiposDeSimbolos.METODO, + 'skew': tiposDeSimbolos.METODO, + 'invert': tiposDeSimbolos.METODO, + 'clamp': tiposDeSimbolos.METODO, + 'linear': tiposDeSimbolos.METODO, + 'minmax': tiposDeSimbolos.METODO, + 'opacity': tiposDeSimbolos.METODO, + 'steps': tiposDeSimbolos.METODO, + // AVALIAR: perspective é a tradução tanto de um modificador quanto de um método + // 'perspective': tiposDeSimbolos.METODO, + 'drop-shadow': tiposDeSimbolos.METODO, + 'rgb': tiposDeSimbolos.METODO, + 'rgba': tiposDeSimbolos.METODO, + 'rotateZ': tiposDeSimbolos.METODO, + 'rotateY': tiposDeSimbolos.METODO, + 'hue-rotate': tiposDeSimbolos.METODO, + 'rotateX': tiposDeSimbolos.METODO, + 'rotate': tiposDeSimbolos.METODO, + 'saturate': tiposDeSimbolos.METODO, + 'sepia': tiposDeSimbolos.METODO, + 'translate3d': tiposDeSimbolos.METODO, + 'translateZ': tiposDeSimbolos.METODO, + 'translateY': tiposDeSimbolos.METODO, + 'translateX': tiposDeSimbolos.METODO, + 'translate': tiposDeSimbolos.METODO, + 'url': tiposDeSimbolos.METODO, + + // QUANTIFICADORES + "cm": tiposDeSimbolos.QUANTIFICADOR, + "mm": tiposDeSimbolos.QUANTIFICADOR, + "in": tiposDeSimbolos.QUANTIFICADOR, + "px": tiposDeSimbolos.QUANTIFICADOR, + "pt": tiposDeSimbolos.QUANTIFICADOR, + "pc": tiposDeSimbolos.QUANTIFICADOR, + "ex": tiposDeSimbolos.QUANTIFICADOR, + "ch": tiposDeSimbolos.QUANTIFICADOR, + "rem": tiposDeSimbolos.QUANTIFICADOR, + "vw": tiposDeSimbolos.QUANTIFICADOR, + "vh": tiposDeSimbolos.QUANTIFICADOR, + "vmin": tiposDeSimbolos.QUANTIFICADOR, + "vmax": tiposDeSimbolos.QUANTIFICADOR, + "vb": tiposDeSimbolos.QUANTIFICADOR, + "vi": tiposDeSimbolos.QUANTIFICADOR, + "cqw": tiposDeSimbolos.QUANTIFICADOR, + "cqh": tiposDeSimbolos.QUANTIFICADOR, + "cqi": tiposDeSimbolos.QUANTIFICADOR, + "cqb": tiposDeSimbolos.QUANTIFICADOR, + "cqmin": tiposDeSimbolos.QUANTIFICADOR, + "cqmax": tiposDeSimbolos.QUANTIFICADOR, + "cap": tiposDeSimbolos.QUANTIFICADOR, + "ic": tiposDeSimbolos.QUANTIFICADOR, + "lh": tiposDeSimbolos.QUANTIFICADOR, + "rlh": tiposDeSimbolos.QUANTIFICADOR, + "Q": tiposDeSimbolos.QUANTIFICADOR, + "fr": tiposDeSimbolos.QUANTIFICADOR, + "deg": tiposDeSimbolos.QUANTIFICADOR, + "grad": tiposDeSimbolos.QUANTIFICADOR, + "graus": tiposDeSimbolos.QUANTIFICADOR, + "rad": tiposDeSimbolos.QUANTIFICADOR, + "turn": tiposDeSimbolos.QUANTIFICADOR, + "ms": tiposDeSimbolos.QUANTIFICADOR, + "%": tiposDeSimbolos.QUANTIFICADOR, + // AVALIAR + // "s": tiposDeSimbolos.QUANTIFICADOR, + // "em": tiposDeSimbolos.QUANTIFICADOR, } \ No newline at end of file diff --git a/fontes/modificadores/cor-inicio-borda-em-linha.ts b/fontes/modificadores/cor-inicio-borda-em-linha.ts index cdc84cb7..e72f3bbf 100644 --- a/fontes/modificadores/cor-inicio-borda-em-linha.ts +++ b/fontes/modificadores/cor-inicio-borda-em-linha.ts @@ -1,5 +1,3 @@ -import { cores } from "./atributos/cores"; -import { valoresGlobais } from "./atributos/globais"; import { Modificador, PragmasModificador } from "./superclasse"; import { validarValorCor } from "./validacoes/cor"; diff --git a/fontes/modificadores/dicionario/dicionario-reverso-modificadores.ts b/fontes/modificadores/dicionario/dicionario-reverso-modificadores.ts index 339b281c..302f510b 100644 --- a/fontes/modificadores/dicionario/dicionario-reverso-modificadores.ts +++ b/fontes/modificadores/dicionario/dicionario-reverso-modificadores.ts @@ -361,6 +361,8 @@ import { VelocidadeAnimacao } from "../velocidade-animacao"; import { Visibilidade } from "../visibilidade"; import { VisibilidadeConteudo } from "../visibilidade-conteudo"; import { VisibilidadeFundo } from "../visibilidade-fundo"; +import { Blur } from "../../valores/metodos/css/blur"; +import { Brightness } from "../../valores/metodos/css/brightness"; export const DicionarioReversoModificadores: { [nomeCss: string]: any } = { "word-wrap": AgruparPalavra, @@ -726,4 +728,8 @@ export const DicionarioReversoModificadores: { [nomeCss: string]: any } = { "visibility": Visibilidade, "content-visibility": VisibilidadeConteudo, "backface-visibility": VisibilidadeFundo, + + // METODOS + "blur": Blur, + "brightness": Brightness, } diff --git a/fontes/modificadores/imagem-fundo.ts b/fontes/modificadores/imagem-fundo.ts index 0b42fe3d..d4bd66dd 100644 --- a/fontes/modificadores/imagem-fundo.ts +++ b/fontes/modificadores/imagem-fundo.ts @@ -1,4 +1,4 @@ -import { Metodo } from "../valores/metodos/metodo"; +import { Metodo } from "../valores/metodos/foles/metodo"; import { Modificador, PragmasModificador } from "./superclasse"; import { validarValores } from "./validacoes/comum"; diff --git a/fontes/modificadores/superclasse/modificador.ts b/fontes/modificadores/superclasse/modificador.ts index 00d85319..3167cb3a 100644 --- a/fontes/modificadores/superclasse/modificador.ts +++ b/fontes/modificadores/superclasse/modificador.ts @@ -1,4 +1,4 @@ -import { Metodo } from "../../valores/metodos/metodo"; +import { Metodo } from "../../valores/metodos/foles/metodo"; import { PragmasModificador } from "./pragmas-modificador"; export class Modificador { diff --git a/fontes/modificadores/superclasse/seletor-reverso-modificador.ts b/fontes/modificadores/superclasse/seletor-reverso-modificador.ts index 09a4a864..b0dfb13a 100644 --- a/fontes/modificadores/superclasse/seletor-reverso-modificador.ts +++ b/fontes/modificadores/superclasse/seletor-reverso-modificador.ts @@ -1,9 +1,9 @@ -import { Metodo } from "../../valores/metodos/metodo"; +import { Valor } from "../../valores/valor"; import { DicionarioReversoModificadores } from "../dicionario/dicionario-reverso-modificadores"; import { PragmasModificador } from "./pragmas-modificador"; export class SeletorReversoModificador { - constructor(nomeCss: string, valor: string | Metodo, quantificador: string, pragmas?: PragmasModificador) { + constructor(nomeCss: string, valor: string | Valor, quantificador?: string, pragmas?: PragmasModificador) { if ( DicionarioReversoModificadores[nomeCss] === undefined || DicionarioReversoModificadores[nomeCss] === null diff --git a/fontes/modificadores/validacoes/comum.ts b/fontes/modificadores/validacoes/comum.ts index e04559b1..b7ac4440 100644 --- a/fontes/modificadores/validacoes/comum.ts +++ b/fontes/modificadores/validacoes/comum.ts @@ -1,38 +1,36 @@ import { valoresGlobais } from "../atributos/globais"; export function validarValores( - nomePropriedade: string, - valor: any, + nomePropriedade: string, + valor: any, valoresAceitos: { [valorFoles: string]: string }, - valoresExtra?: any,) - -{ + valoresExtra?: any,) { if (valoresExtra === undefined) { if (!(valor in valoresAceitos) && - !(valor in valoresGlobais) - ) { - throw new Error(`Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: + !(valor in valoresGlobais) + ) { + throw new Error(`Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: ${Object.keys(valoresAceitos).reduce((final, atual) => final += `, ${atual}`)}, ${Object.keys(valoresGlobais).reduce((final, atual) => final += `, ${atual}`)}.`) - } + } } else { let metodoValido = false; for (let index = 0; index < valoresExtra.length; index++) { - if(metodoValido === false) { + if (metodoValido === false) { metodoValido = valor['traducao'] === valoresExtra[index]; } } - + if ( - !(valor in valoresAceitos) && - !metodoValido && - !(valor in valoresGlobais) - ) { - throw new Error(`Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: + !(valor in valoresAceitos) && + !metodoValido && + !(valor in valoresGlobais) + ) { + throw new Error(`Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: ${Object.keys(valoresAceitos).reduce((final, atual) => final += `, ${atual}`)}, ${valoresExtra.reduce((final, atual) => final += `, ${atual}`)}, ${Object.keys(valoresGlobais).reduce((final, atual) => final += `, ${atual}`)}.`) + } } - } - + } \ No newline at end of file diff --git a/fontes/modificadores/validacoes/condicao-extra.ts b/fontes/modificadores/validacoes/condicao-extra.ts index 307b1d83..c606c527 100644 --- a/fontes/modificadores/validacoes/condicao-extra.ts +++ b/fontes/modificadores/validacoes/condicao-extra.ts @@ -1,9 +1,9 @@ import { valoresGlobais } from "../atributos/globais"; export function validarValoresAdicionais( - nomePropriedade: string, - valor: any, - valoresAdicionais: { [valorFoles: string]: string }, + nomePropriedade: string, + valor: any, + valoresAdicionais: { [valorFoles: string]: string }, valoresAceitos?: { [valorFoles: string]: string }) { if (valoresAceitos !== undefined) { if (!(valor in valoresAdicionais) && diff --git a/fontes/modificadores/validacoes/cor.ts b/fontes/modificadores/validacoes/cor.ts index f9b45496..ea6f1ff5 100644 --- a/fontes/modificadores/validacoes/cor.ts +++ b/fontes/modificadores/validacoes/cor.ts @@ -1,5 +1,5 @@ -import { HexadecimalCor } from "../../valores/metodos/hexadecimal-cor"; -import { Metodo } from "../../valores/metodos/metodo"; +import { HexadecimalCor } from "../../valores/metodos/foles/hexadecimal-cor"; +import { Metodo } from "../../valores/metodos/foles/metodo"; import { cores } from "../atributos/cores"; import { valoresGlobais } from "../atributos/globais"; @@ -11,46 +11,35 @@ export function validarValorCor( if (valor instanceof Metodo) { 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.`); + 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.` + ); } } else if (!['rgb', 'rgba', 'hsl', 'hsla'].includes(valor.constructor.name.toLowerCase())) { - throw new Error(`Propriedade '${nomePropriedade}' com método '${valor.constructor.name}' inválido. Valores aceitos: - rgb(), rgba(), hsl(), hsla().`); + throw new Error( + `Propriedade '${nomePropriedade}' com método '${valor.constructor.name}' inválido. Valores aceitos: + rgb(), rgba(), hsl(), hsla().` + ); } } else { // Cores pelo nome. if (valoresAceitos === undefined) { - if (valoresExtra === undefined) { - if (!(valor in cores) && !(valor in valoresGlobais)) { - throw new Error(`Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: - ${Object.keys(cores).reduce((final, atual) => final += `, ${atual}`)}, - ${Object.keys(valoresGlobais).reduce((final, atual) => final += `, ${atual}`)}.`) - } - } else { - if (!(valor in cores) && !(valor in valoresExtra) && !(valor in valoresGlobais)) { - throw new Error(`Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: - ${Object.keys(cores).reduce((final, atual) => final += `, ${atual}`)}, - ${Object.keys(valoresExtra).reduce((final, atual) => final += `, ${atual}`)}, - ${Object.keys(valoresGlobais).reduce((final, atual) => final += `, ${atual}`)}.`); - } + if (!(valor in cores) && !(valor in valoresGlobais)) { + throw new Error( + `Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: + ${Object.keys(cores).reduce((final, atual) => final += `, ${atual}`)}, + ${Object.keys(valoresGlobais).reduce((final, atual) => final += `, ${atual}`)}.` + ) } } else { - if (valoresExtra === undefined) { - if (!(valor in cores) && !(valor in valoresAceitos) && !(valor in valoresGlobais)) { - throw new Error(`Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: - ${Object.keys(cores).reduce((final, atual) => final += `, ${atual}`)}, - ${Object.keys(valoresAceitos).reduce((final, atual) => final += `, ${atual}`)}, - ${Object.keys(valoresGlobais).reduce((final, atual) => final += `, ${atual}`)}.`); - } - } else { - if (!(valor in cores) && !(valor in valoresAceitos) && !(valor in valoresExtra) && !(valor in valoresGlobais)) { - throw new Error(`Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: - ${Object.keys(cores).reduce((final, atual) => final += `, ${atual}`)}, - ${Object.keys(valoresAceitos).reduce((final, atual) => final += `, ${atual}`)}, - ${Object.keys(valoresExtra).reduce((final, atual) => final += `, ${atual}`)}, - ${Object.keys(valoresGlobais).reduce((final, atual) => final += `, ${atual}`)}.`); - } + if (!(valor in cores) && !(valor in valoresAceitos) && !(valor in valoresGlobais)) { + throw new Error( + `Propriedade '${nomePropriedade}' com valor ${valor} inválido. Valores aceitos: + ${Object.keys(cores).reduce((final, atual) => final += `, ${atual}`)}, + ${Object.keys(valoresAceitos).reduce((final, atual) => final += `, ${atual}`)}, + ${Object.keys(valoresGlobais).reduce((final, atual) => final += `, ${atual}`)}.` + ); } } } diff --git a/fontes/modificadores/validacoes/numerica.ts b/fontes/modificadores/validacoes/numerica.ts index 703978cf..5835de0a 100644 --- a/fontes/modificadores/validacoes/numerica.ts +++ b/fontes/modificadores/validacoes/numerica.ts @@ -4,8 +4,7 @@ export function validarValorNumerico( nomePropriedade: string, valor: any, valoresAceitos?: { [valorFoles: string]: string }, - valoresExtra?: any) -{ + valoresExtra?: any) { if (valoresAceitos === undefined && valoresExtra === undefined) { if (Number.isNaN(parseInt(valor)) && !(valor in valoresGlobais) @@ -31,7 +30,7 @@ export function validarValorNumerico( if (valoresAceitos !== undefined && valoresExtra !== undefined) { let metodoValido = false; for (let index = 0; index < valoresExtra.length; index++) { - if(metodoValido === false) { + if (metodoValido === false) { metodoValido = valor['traducao'] === valoresExtra[index]; } } diff --git a/fontes/modificadores/validacoes/proibir-quantificador.ts b/fontes/modificadores/validacoes/proibir-quantificador.ts index 7f0900a7..9d887b17 100644 --- a/fontes/modificadores/validacoes/proibir-quantificador.ts +++ b/fontes/modificadores/validacoes/proibir-quantificador.ts @@ -1,9 +1,8 @@ export function proibirQuantificador( nomePropriedade: string, - quantificador: string) -{ + quantificador: string) { if (quantificador !== undefined) { throw new Error( - `A propriedade ${nomePropriedade} aceita somente valores numéricos. O quantificador ${quantificador} é inválido para esta operação.`); + `A propriedade '${nomePropriedade}' aceita somente valores numéricos. O quantificador '${quantificador}' é inválido para esta operação.`); } } diff --git a/fontes/modificadores/validacoes/quantificador.ts b/fontes/modificadores/validacoes/quantificador.ts index b01e29bb..b4132ff9 100644 --- a/fontes/modificadores/validacoes/quantificador.ts +++ b/fontes/modificadores/validacoes/quantificador.ts @@ -2,13 +2,12 @@ export function validarQuantificador( nomePropriedade: string, quantificador: string, quantificadoresAceitos: { [valorFoles: string]: string }, - quantificadoresAceitos2?: any) -{ + quantificadoresAceitos2?: any) { if (quantificadoresAceitos2 === undefined) { if (!(quantificador in quantificadoresAceitos) || quantificador === undefined ) { - throw new Error(`Propriedade ${nomePropriedade} com quantificador inválido. Valores aceitos: + throw new Error(`Propriedade '${nomePropriedade}' com quantificador inválido. Valores aceitos: ${Object.keys(quantificadoresAceitos).reduce((final, atual) => final += `, ${atual}`)}.`); } } else { @@ -16,7 +15,7 @@ export function validarQuantificador( !(quantificador in quantificadoresAceitos2) || quantificador === undefined ) { - throw new Error(`Propriedade ${nomePropriedade} com quantificador inválido. Valores aceitos: + throw new Error(`Propriedade '${nomePropriedade}' com quantificador inválido. Valores aceitos: ${Object.keys(quantificadoresAceitos).reduce((final, atual) => final += `, ${atual}`)}, ${Object.keys(quantificadoresAceitos2).reduce((final, atual) => final += `, ${atual}`)}.`); } diff --git a/fontes/serializadores/serializador-reverso.ts b/fontes/serializadores/serializador-reverso.ts index 65d5052f..9862ce71 100644 --- a/fontes/serializadores/serializador-reverso.ts +++ b/fontes/serializadores/serializador-reverso.ts @@ -1,6 +1,7 @@ import { Declaracao } from "../declaracoes"; import { Modificador } from "../modificadores"; -import { Metodo } from "../valores/metodos/metodo"; +import { MetodoCss } from "../valores/metodos/css/metodo-css"; +import { Metodo } from "../valores/metodos/foles/metodo"; /** * O serializador reverso traduz de CSS para FolEs. Pode traduzir tanto FolEs @@ -18,15 +19,17 @@ export class SerializadorReverso { if (modificador.hasOwnProperty("quantificador")) { quantificador = modificador.quantificador; } - + let valor = ""; - if (modificador.valor instanceof Metodo) { + if (modificador.valor instanceof MetodoCss) { + valor = (modificador.valor).paraTexto(); + } else if (modificador.valor instanceof Metodo) { valor = (modificador.valor).paraTexto(); } else { valor = modificador.valor; } - return " ".repeat(indentacao) + + return " ".repeat(indentacao) + `${Array.isArray(modificador.nomeFoles) ? modificador.nomeFoles[0] : modificador.nomeFoles}: ${valor}${quantificador};\n`; } @@ -39,7 +42,7 @@ export class SerializadorReverso { for (const declaracao of declaracoes) { const prefixos = []; - + for (const seletor of declaracao.seletores) { const prefixo = (textoSeletorAnterior + " " + seletor.paraTexto()).trimStart(); prefixos.push(prefixo); @@ -48,7 +51,7 @@ export class SerializadorReverso { resultado = resultado.slice(0, -2); resultado += ' {\n'; - + for (const modificador of declaracao.modificadores) { resultado += this.serializarModificador(modificador, indentacao + 4); } diff --git a/fontes/serializadores/serializador.ts b/fontes/serializadores/serializador.ts index e6d3560f..73558e9b 100644 --- a/fontes/serializadores/serializador.ts +++ b/fontes/serializadores/serializador.ts @@ -3,7 +3,7 @@ import { Modificador } from "../modificadores"; import { valoresGerais } from "../modificadores/atributos/gerais"; import { SeletorEstrutura } from "../seletores"; import { SeletorEspacoReservado } from "../seletores/seletor-espaco-reservado"; -import { Metodo } from "../valores/metodos/metodo"; +import { Metodo } from "../valores/metodos/foles/metodo"; import estruturasHtml from "../tradutores/estruturas-html"; diff --git a/fontes/tipos-de-simbolos/css.ts b/fontes/tipos-de-simbolos/css.ts index 17789da0..68d4f7b1 100644 --- a/fontes/tipos-de-simbolos/css.ts +++ b/fontes/tipos-de-simbolos/css.ts @@ -10,7 +10,10 @@ export default { TAG: "TAG", IDENTIFICADOR: "IDENTIFICADOR", MAIOR: "MAIOR", + METODO: "METODO", NUMERO: "NUMERO", + PARENTESE_ESQUERDO: "PARENTESE_ESQUERDO", + PARENTESE_DIREITO: "PARENTESE_DIREITO", PERCENTUAL: "PERCENTUAL", PONTO: "PONTO", PONTO_E_VIRGULA: "PONTO_E_VIRGULA", diff --git a/fontes/tradutores/estruturas-lmht.ts b/fontes/tradutores/estruturas-lmht.ts index ed8b4971..af8b123f 100644 --- a/fontes/tradutores/estruturas-lmht.ts +++ b/fontes/tradutores/estruturas-lmht.ts @@ -13,7 +13,6 @@ export default { "canvas": ["canvas"], "td": ["celula", "célula"], "blockquote": ["citacao", "citação"], - "cite": ["citar"], "code": ["codigo", "código"], "col": ["coluna"], "body": ["corpo"], @@ -30,22 +29,19 @@ export default { "colgroup": ["grupo-colunas", "grupo-opcoes"], "optgroup": ["grupo-opcoes", "grupo-opções"], "img": ["imagem"], - "ins": ["inserido"], - "template": ["invisivel", "invisível"], + "ins": ["invisivel", "invisível"], "em": ["italico", "itálico"], "li": ["item-lista"], "a": ["ligacao", "ligação"], "tr": ["linha"], "hr": ["linha-horizontal"], "dl": ["lista-definicoes", "lista-definições"], - "dd": ["definicao", "definição"], "ol": ["lista-numerada"], "datalist": ["lista-pesquisavel", "lista-pesquisável"], "ul": ["lista-simples"], "html": ["lmht"], "mark": ["marca"], "meter": ["medidor"], - "dialog": ["modal"], "nav": ["navegacao", "navegação"], "strong": ["negrito"], "object": ["objeto"], diff --git a/fontes/tradutores/tradutor-reverso.ts b/fontes/tradutores/tradutor-reverso.ts index 47421440..0cd24afa 100644 --- a/fontes/tradutores/tradutor-reverso.ts +++ b/fontes/tradutores/tradutor-reverso.ts @@ -5,7 +5,7 @@ import { SeletorEstruturasLmht } from "../estruturas/seletor-estruturas-lmht"; import { Modificador } from "../modificadores"; import { PragmasModificador, SeletorModificador } from "../modificadores/superclasse"; import { PragmasSeletor, Seletor, SeletorEstrutura } from "../seletores"; -import { Metodo } from "../valores/metodos/metodo"; +import { Metodo } from "../valores/metodos/foles/metodo"; import estruturasLmht from "./estruturas-lmht"; diff --git a/fontes/tradutores/tradutor.ts b/fontes/tradutores/tradutor.ts index 83fb152e..311c8668 100644 --- a/fontes/tradutores/tradutor.ts +++ b/fontes/tradutores/tradutor.ts @@ -5,7 +5,7 @@ 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 { Metodo } from "../valores/metodos/foles/metodo"; import estruturasHtml from "./estruturas-html"; diff --git a/fontes/valores/dicionario-valores.ts b/fontes/valores/dicionario-valores.ts index c9ca7d09..a06e1628 100644 --- a/fontes/valores/dicionario-valores.ts +++ b/fontes/valores/dicionario-valores.ts @@ -1,46 +1,46 @@ -import { Borrar } from "./metodos/borrar"; -import { Brilho } from "./metodos/brilho"; -import { Calcular } from "./metodos/calcular"; -import { Contraste } from "./metodos/contraste"; -import { CurvaCubica } from "./metodos/curva-cubica"; -import { EncaixarConteudo } from "./metodos/encaixar-conteudo"; -import { EscalaCinza } from "./metodos/escala-cinza"; -import { Escalamento } from "./metodos/escalamento"; -import { Escalamento3d } from "./metodos/escalamento-3d"; -import { EscalamentoEixoZ } from "./metodos/escalamento-eixo-z"; -import { EscalamentoHorizontal } from "./metodos/escalamento-horizontal"; -import { EscalamentoVertical } from "./metodos/escalamento-vertical"; -import { GradienteLinear } from "./metodos/gradiente-linear"; -import { HexadecimalCor } from "./metodos/hexadecimal-cor"; -import { Hsl } from "./metodos/hsl"; -import { Hsla } from "./metodos/hsla"; -import { Inclinar } from "./metodos/inclinar"; -import { InclinarHorizontal } from "./metodos/inclinar-horizontal"; -import { InclinarVertical } from "./metodos/inclinar-vertical"; -import { Inverter } from "./metodos/inverter"; -import { Limitar } from "./metodos/limitar"; -import { Linear } from "./metodos/linear"; -import { MinMax } from "./metodos/minmax"; -import { Opacar } from "./metodos/opacar"; -import { Passos } from "./metodos/passos"; -import { Perspectivar } from "./metodos/perspectivar"; -import { ProjetarSombra } from "./metodos/projetar-sombra"; -import { Raio } from "./metodos/raio"; -import { Rgb } from "./metodos/rgb"; -import { Rgba } from "./metodos/rgba"; -import { Rotacionar } from "./metodos/rotacionar"; -import { RotacionarEixoZ } from "./metodos/rotacionar-eixo-z"; -import { RotacionarHorizontal } from "./metodos/rotacionar-horizontal"; -import { RotacionarMatiz } from "./metodos/rotacionar-matiz"; -import { RotacionarVertical } from "./metodos/rotacionar-vertical"; -import { Saturar } from "./metodos/saturar"; -import { Sepia } from "./metodos/sepia"; -import { Translacao } from "./metodos/translacao"; -import { Translacao3d } from "./metodos/translacao-3d"; -import { TranslacaoEixoZ } from "./metodos/translacao-eixo-z"; -import { TranslacaoHorizontal } from "./metodos/translacao-horizontal"; -import { TranslacaoVertical } from "./metodos/translacao-vertical"; -import { Url } from "./metodos/url"; +import { Borrar } from "./metodos/foles/borrar"; +import { Brilho } from "./metodos/foles/brilho"; +import { Calcular } from "./metodos/foles/calcular"; +import { Contraste } from "./metodos/foles/contraste"; +import { CurvaCubica } from "./metodos/foles/curva-cubica"; +import { EncaixarConteudo } from "./metodos/foles/encaixar-conteudo"; +import { EscalaCinza } from "./metodos/foles/escala-cinza"; +import { Escalamento } from "./metodos/foles/escalamento"; +import { Escalamento3d } from "./metodos/foles/escalamento-3d"; +import { EscalamentoEixoZ } from "./metodos/foles/escalamento-eixo-z"; +import { EscalamentoHorizontal } from "./metodos/foles/escalamento-horizontal"; +import { EscalamentoVertical } from "./metodos/foles/escalamento-vertical"; +import { GradienteLinear } from "./metodos/foles/gradiente-linear"; +import { HexadecimalCor } from "./metodos/foles/hexadecimal-cor"; +import { Hsl } from "./metodos/foles/hsl"; +import { Hsla } from "./metodos/foles/hsla"; +import { Inclinar } from "./metodos/foles/inclinar"; +import { InclinarHorizontal } from "./metodos/foles/inclinar-horizontal"; +import { InclinarVertical } from "./metodos/foles/inclinar-vertical"; +import { Inverter } from "./metodos/foles/inverter"; +import { Limitar } from "./metodos/foles/limitar"; +import { Linear } from "./metodos/foles/linear"; +import { MinMax } from "./metodos/foles/minmax"; +import { Opacar } from "./metodos/foles/opacar"; +import { Passos } from "./metodos/foles/passos"; +import { Perspectivar } from "./metodos/foles/perspectivar"; +import { ProjetarSombra } from "./metodos/foles/projetar-sombra"; +import { Raio } from "./metodos/foles/raio"; +import { Rgb } from "./metodos/foles/rgb"; +import { Rgba } from "./metodos/foles/rgba"; +import { Rotacionar } from "./metodos/foles/rotacionar"; +import { RotacionarEixoZ } from "./metodos/foles/rotacionar-eixo-z"; +import { RotacionarHorizontal } from "./metodos/foles/rotacionar-horizontal"; +import { RotacionarMatiz } from "./metodos/foles/rotacionar-matiz"; +import { RotacionarVertical } from "./metodos/foles/rotacionar-vertical"; +import { Saturar } from "./metodos/foles/saturar"; +import { Sepia } from "./metodos/foles/sepia"; +import { Translacao } from "./metodos/foles/translacao"; +import { Translacao3d } from "./metodos/foles/translacao-3d"; +import { TranslacaoEixoZ } from "./metodos/foles/translacao-eixo-z"; +import { TranslacaoHorizontal } from "./metodos/foles/translacao-horizontal"; +import { TranslacaoVertical } from "./metodos/foles/translacao-vertical"; +import { Url } from "./metodos/foles/url"; export const DicionarioValores: { [nomeFolEs: string]: any } = { "borrar": Borrar, diff --git a/fontes/valores/metodos/css/blur.ts b/fontes/valores/metodos/css/blur.ts new file mode 100644 index 00000000..7cbb236c --- /dev/null +++ b/fontes/valores/metodos/css/blur.ts @@ -0,0 +1,24 @@ +import { Simbolo } from "../../../lexador"; +import { MetodoCss } from "./metodo-css"; + +export class Blur extends MetodoCss { + valor: number; + quantificador: string; + traducao: string; + + constructor(valor: Simbolo, quantificador: Simbolo) { + super(); + this.valor = Number(valor.lexema); + + this.quantificador = quantificador ? quantificador.lexema : null; + this.traducao = 'blur'; + } + + paraTexto() { + if (this.quantificador) { + return `borrar(${this.valor}${this.quantificador})` + } + + return `borrar(${this.valor})` + } +} diff --git a/fontes/valores/metodos/css/brightness.ts b/fontes/valores/metodos/css/brightness.ts new file mode 100644 index 00000000..33a7a1b0 --- /dev/null +++ b/fontes/valores/metodos/css/brightness.ts @@ -0,0 +1,24 @@ +import { Simbolo } from "../../../lexador"; +import { MetodoCss } from "./metodo-css"; + +export class Brightness extends MetodoCss { + valor: number; + quantificador: string; + traducao: string; + + constructor(valor: Simbolo, quantificador: Simbolo) { + super(); + this.valor = Number(valor.lexema); + + this.quantificador = quantificador ? quantificador.lexema : null; + this.traducao = 'brightness'; + } + + paraTexto() { + if (this.quantificador) { + return `brilho(${this.valor}${this.quantificador})` + } + + return `brilho(${this.valor})` + } +} diff --git a/fontes/valores/metodos/css/metodo-css.ts b/fontes/valores/metodos/css/metodo-css.ts new file mode 100644 index 00000000..42e2ba53 --- /dev/null +++ b/fontes/valores/metodos/css/metodo-css.ts @@ -0,0 +1,5 @@ +import { Valor } from "../../valor"; + +export abstract class MetodoCss extends Valor { + abstract paraTexto(): string; +} diff --git a/fontes/valores/metodos/borrar.ts b/fontes/valores/metodos/foles/borrar.ts similarity index 88% rename from fontes/valores/metodos/borrar.ts rename to fontes/valores/metodos/foles/borrar.ts index 1d71b7e0..c5b58a63 100644 --- a/fontes/valores/metodos/borrar.ts +++ b/fontes/valores/metodos/foles/borrar.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Borrar extends Metodo { @@ -14,7 +14,7 @@ export class Borrar extends Metodo { this.traducao = 'blur'; } - paraTexto() { + paraTexto() { if (this.quantificador) { return `blur(${this.valor}${this.quantificador})` } diff --git a/fontes/valores/metodos/brilho.ts b/fontes/valores/metodos/foles/brilho.ts similarity index 92% rename from fontes/valores/metodos/brilho.ts rename to fontes/valores/metodos/foles/brilho.ts index 920a5763..7ed7f3e8 100644 --- a/fontes/valores/metodos/brilho.ts +++ b/fontes/valores/metodos/foles/brilho.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Brilho extends Metodo { diff --git a/fontes/valores/metodos/calcular.ts b/fontes/valores/metodos/foles/calcular.ts similarity index 94% rename from fontes/valores/metodos/calcular.ts rename to fontes/valores/metodos/foles/calcular.ts index 63225254..c2744395 100644 --- a/fontes/valores/metodos/calcular.ts +++ b/fontes/valores/metodos/foles/calcular.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Calcular extends Metodo { diff --git a/fontes/valores/metodos/contraste.ts b/fontes/valores/metodos/foles/contraste.ts similarity index 92% rename from fontes/valores/metodos/contraste.ts rename to fontes/valores/metodos/foles/contraste.ts index 00c1ad89..9f6df86e 100644 --- a/fontes/valores/metodos/contraste.ts +++ b/fontes/valores/metodos/foles/contraste.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Contraste extends Metodo { diff --git a/fontes/valores/metodos/curva-cubica.ts b/fontes/valores/metodos/foles/curva-cubica.ts similarity index 93% rename from fontes/valores/metodos/curva-cubica.ts rename to fontes/valores/metodos/foles/curva-cubica.ts index e56f953e..fdd9b898 100644 --- a/fontes/valores/metodos/curva-cubica.ts +++ b/fontes/valores/metodos/foles/curva-cubica.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class CurvaCubica extends Metodo { diff --git a/fontes/valores/metodos/encaixar-conteudo.ts b/fontes/valores/metodos/foles/encaixar-conteudo.ts similarity index 90% rename from fontes/valores/metodos/encaixar-conteudo.ts rename to fontes/valores/metodos/foles/encaixar-conteudo.ts index dab310d3..c22acb63 100644 --- a/fontes/valores/metodos/encaixar-conteudo.ts +++ b/fontes/valores/metodos/foles/encaixar-conteudo.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class EncaixarConteudo extends Metodo { diff --git a/fontes/valores/metodos/escala-cinza.ts b/fontes/valores/metodos/foles/escala-cinza.ts similarity index 92% rename from fontes/valores/metodos/escala-cinza.ts rename to fontes/valores/metodos/foles/escala-cinza.ts index c0418f78..fbc7762b 100644 --- a/fontes/valores/metodos/escala-cinza.ts +++ b/fontes/valores/metodos/foles/escala-cinza.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class EscalaCinza extends Metodo { diff --git a/fontes/valores/metodos/escalamento-3d.ts b/fontes/valores/metodos/foles/escalamento-3d.ts similarity index 92% rename from fontes/valores/metodos/escalamento-3d.ts rename to fontes/valores/metodos/foles/escalamento-3d.ts index 49626395..7c72a3e1 100644 --- a/fontes/valores/metodos/escalamento-3d.ts +++ b/fontes/valores/metodos/foles/escalamento-3d.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Escalamento3d extends Metodo { diff --git a/fontes/valores/metodos/escalamento-eixo-z.ts b/fontes/valores/metodos/foles/escalamento-eixo-z.ts similarity index 89% rename from fontes/valores/metodos/escalamento-eixo-z.ts rename to fontes/valores/metodos/foles/escalamento-eixo-z.ts index f9b359d4..1a8ebed4 100644 --- a/fontes/valores/metodos/escalamento-eixo-z.ts +++ b/fontes/valores/metodos/foles/escalamento-eixo-z.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class EscalamentoEixoZ extends Metodo { diff --git a/fontes/valores/metodos/escalamento-horizontal.ts b/fontes/valores/metodos/foles/escalamento-horizontal.ts similarity index 89% rename from fontes/valores/metodos/escalamento-horizontal.ts rename to fontes/valores/metodos/foles/escalamento-horizontal.ts index 90522fc4..680c318a 100644 --- a/fontes/valores/metodos/escalamento-horizontal.ts +++ b/fontes/valores/metodos/foles/escalamento-horizontal.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class EscalamentoHorizontal extends Metodo { diff --git a/fontes/valores/metodos/escalamento-vertical.ts b/fontes/valores/metodos/foles/escalamento-vertical.ts similarity index 89% rename from fontes/valores/metodos/escalamento-vertical.ts rename to fontes/valores/metodos/foles/escalamento-vertical.ts index f5a7456d..bfae81af 100644 --- a/fontes/valores/metodos/escalamento-vertical.ts +++ b/fontes/valores/metodos/foles/escalamento-vertical.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class EscalamentoVertical extends Metodo { diff --git a/fontes/valores/metodos/escalamento.ts b/fontes/valores/metodos/foles/escalamento.ts similarity index 92% rename from fontes/valores/metodos/escalamento.ts rename to fontes/valores/metodos/foles/escalamento.ts index b224e323..971f3534 100644 --- a/fontes/valores/metodos/escalamento.ts +++ b/fontes/valores/metodos/foles/escalamento.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Escalamento extends Metodo { diff --git a/fontes/valores/metodos/gradiente-linear.ts b/fontes/valores/metodos/foles/gradiente-linear.ts similarity index 88% rename from fontes/valores/metodos/gradiente-linear.ts rename to fontes/valores/metodos/foles/gradiente-linear.ts index afc5484e..a8b99490 100644 --- a/fontes/valores/metodos/gradiente-linear.ts +++ b/fontes/valores/metodos/foles/gradiente-linear.ts @@ -1,6 +1,6 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; -import { cores } from "../../modificadores/atributos/cores"; +import { cores } from "../../../modificadores/atributos/cores"; export class GradienteLinear extends Metodo { valorAngulo: number; diff --git a/fontes/valores/metodos/hexadecimal-cor.ts b/fontes/valores/metodos/foles/hexadecimal-cor.ts similarity index 100% rename from fontes/valores/metodos/hexadecimal-cor.ts rename to fontes/valores/metodos/foles/hexadecimal-cor.ts diff --git a/fontes/valores/metodos/hsl.ts b/fontes/valores/metodos/foles/hsl.ts similarity index 92% rename from fontes/valores/metodos/hsl.ts rename to fontes/valores/metodos/foles/hsl.ts index 87f87210..471db643 100644 --- a/fontes/valores/metodos/hsl.ts +++ b/fontes/valores/metodos/foles/hsl.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Hsl extends Metodo { diff --git a/fontes/valores/metodos/hsla.ts b/fontes/valores/metodos/foles/hsla.ts similarity index 95% rename from fontes/valores/metodos/hsla.ts rename to fontes/valores/metodos/foles/hsla.ts index 419c466a..bc01a874 100644 --- a/fontes/valores/metodos/hsla.ts +++ b/fontes/valores/metodos/foles/hsla.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Hsla extends Metodo { diff --git a/fontes/valores/metodos/inclinar-horizontal.ts b/fontes/valores/metodos/foles/inclinar-horizontal.ts similarity index 93% rename from fontes/valores/metodos/inclinar-horizontal.ts rename to fontes/valores/metodos/foles/inclinar-horizontal.ts index 7dbaf78c..6f10639b 100644 --- a/fontes/valores/metodos/inclinar-horizontal.ts +++ b/fontes/valores/metodos/foles/inclinar-horizontal.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class InclinarHorizontal extends Metodo { diff --git a/fontes/valores/metodos/inclinar-vertical.ts b/fontes/valores/metodos/foles/inclinar-vertical.ts similarity index 93% rename from fontes/valores/metodos/inclinar-vertical.ts rename to fontes/valores/metodos/foles/inclinar-vertical.ts index cbe2d0ae..98b9ea00 100644 --- a/fontes/valores/metodos/inclinar-vertical.ts +++ b/fontes/valores/metodos/foles/inclinar-vertical.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class InclinarVertical extends Metodo { diff --git a/fontes/valores/metodos/inclinar.ts b/fontes/valores/metodos/foles/inclinar.ts similarity index 96% rename from fontes/valores/metodos/inclinar.ts rename to fontes/valores/metodos/foles/inclinar.ts index 9bea6046..91421573 100644 --- a/fontes/valores/metodos/inclinar.ts +++ b/fontes/valores/metodos/foles/inclinar.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Inclinar extends Metodo { diff --git a/fontes/valores/metodos/inverter.ts b/fontes/valores/metodos/foles/inverter.ts similarity index 92% rename from fontes/valores/metodos/inverter.ts rename to fontes/valores/metodos/foles/inverter.ts index cf05ef8f..c5dd63e2 100644 --- a/fontes/valores/metodos/inverter.ts +++ b/fontes/valores/metodos/foles/inverter.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Inverter extends Metodo { diff --git a/fontes/valores/metodos/limitar.ts b/fontes/valores/metodos/foles/limitar.ts similarity index 95% rename from fontes/valores/metodos/limitar.ts rename to fontes/valores/metodos/foles/limitar.ts index fa950ed3..5c5d660b 100644 --- a/fontes/valores/metodos/limitar.ts +++ b/fontes/valores/metodos/foles/limitar.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Limitar extends Metodo { diff --git a/fontes/valores/metodos/linear.ts b/fontes/valores/metodos/foles/linear.ts similarity index 91% rename from fontes/valores/metodos/linear.ts rename to fontes/valores/metodos/foles/linear.ts index 19947cdf..dcb38251 100644 --- a/fontes/valores/metodos/linear.ts +++ b/fontes/valores/metodos/foles/linear.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Linear extends Metodo { diff --git a/fontes/valores/metodos/metodo.ts b/fontes/valores/metodos/foles/metodo.ts similarity index 68% rename from fontes/valores/metodos/metodo.ts rename to fontes/valores/metodos/foles/metodo.ts index 6dbc394b..d6373030 100644 --- a/fontes/valores/metodos/metodo.ts +++ b/fontes/valores/metodos/foles/metodo.ts @@ -1,4 +1,4 @@ -import { Valor } from "../valor"; +import { Valor } from "../../valor"; export abstract class Metodo extends Valor { abstract paraTexto(): string; diff --git a/fontes/valores/metodos/minmax.ts b/fontes/valores/metodos/foles/minmax.ts similarity index 100% rename from fontes/valores/metodos/minmax.ts rename to fontes/valores/metodos/foles/minmax.ts diff --git a/fontes/valores/metodos/opacar.ts b/fontes/valores/metodos/foles/opacar.ts similarity index 92% rename from fontes/valores/metodos/opacar.ts rename to fontes/valores/metodos/foles/opacar.ts index 64dbf088..84c021da 100644 --- a/fontes/valores/metodos/opacar.ts +++ b/fontes/valores/metodos/foles/opacar.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Opacar extends Metodo { diff --git a/fontes/valores/metodos/passos.ts b/fontes/valores/metodos/foles/passos.ts similarity index 94% rename from fontes/valores/metodos/passos.ts rename to fontes/valores/metodos/foles/passos.ts index f19192f9..51f29654 100644 --- a/fontes/valores/metodos/passos.ts +++ b/fontes/valores/metodos/foles/passos.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Passos extends Metodo { diff --git a/fontes/valores/metodos/perspectivar.ts b/fontes/valores/metodos/foles/perspectivar.ts similarity index 93% rename from fontes/valores/metodos/perspectivar.ts rename to fontes/valores/metodos/foles/perspectivar.ts index 5a2da1f5..6f00b4dc 100644 --- a/fontes/valores/metodos/perspectivar.ts +++ b/fontes/valores/metodos/foles/perspectivar.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Perspectivar extends Metodo { diff --git a/fontes/valores/metodos/projetar-sombra.ts b/fontes/valores/metodos/foles/projetar-sombra.ts similarity index 94% rename from fontes/valores/metodos/projetar-sombra.ts rename to fontes/valores/metodos/foles/projetar-sombra.ts index f7470e4a..e9689248 100644 --- a/fontes/valores/metodos/projetar-sombra.ts +++ b/fontes/valores/metodos/foles/projetar-sombra.ts @@ -1,6 +1,6 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; -import { cores } from "../../modificadores/atributos/cores"; +import { cores } from "../../../modificadores/atributos/cores"; export class ProjetarSombra extends Metodo { valor1: number; diff --git a/fontes/valores/metodos/raio.ts b/fontes/valores/metodos/foles/raio.ts similarity index 86% rename from fontes/valores/metodos/raio.ts rename to fontes/valores/metodos/foles/raio.ts index b93c337d..d31b1143 100644 --- a/fontes/valores/metodos/raio.ts +++ b/fontes/valores/metodos/foles/raio.ts @@ -1,6 +1,6 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; -import { posicoesRaio } from "../../modificadores/atributos/posicoes"; +import { posicoesRaio } from "../../../modificadores/atributos/posicoes"; export class Raio extends Metodo { posicao: string; diff --git a/fontes/valores/metodos/rgb.ts b/fontes/valores/metodos/foles/rgb.ts similarity index 91% rename from fontes/valores/metodos/rgb.ts rename to fontes/valores/metodos/foles/rgb.ts index a4e5412b..14097ff4 100644 --- a/fontes/valores/metodos/rgb.ts +++ b/fontes/valores/metodos/foles/rgb.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Rgb extends Metodo { diff --git a/fontes/valores/metodos/rgba.ts b/fontes/valores/metodos/foles/rgba.ts similarity index 91% rename from fontes/valores/metodos/rgba.ts rename to fontes/valores/metodos/foles/rgba.ts index 47ef9ecf..e111cbfa 100644 --- a/fontes/valores/metodos/rgba.ts +++ b/fontes/valores/metodos/foles/rgba.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Rgba extends Metodo { diff --git a/fontes/valores/metodos/rotacionar-eixo-z.ts b/fontes/valores/metodos/foles/rotacionar-eixo-z.ts similarity index 93% rename from fontes/valores/metodos/rotacionar-eixo-z.ts rename to fontes/valores/metodos/foles/rotacionar-eixo-z.ts index 987f0de5..f2623cea 100644 --- a/fontes/valores/metodos/rotacionar-eixo-z.ts +++ b/fontes/valores/metodos/foles/rotacionar-eixo-z.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class RotacionarEixoZ extends Metodo { diff --git a/fontes/valores/metodos/rotacionar-horizontal.ts b/fontes/valores/metodos/foles/rotacionar-horizontal.ts similarity index 93% rename from fontes/valores/metodos/rotacionar-horizontal.ts rename to fontes/valores/metodos/foles/rotacionar-horizontal.ts index a158eef5..f56ee229 100644 --- a/fontes/valores/metodos/rotacionar-horizontal.ts +++ b/fontes/valores/metodos/foles/rotacionar-horizontal.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class RotacionarHorizontal extends Metodo { diff --git a/fontes/valores/metodos/rotacionar-matiz.ts b/fontes/valores/metodos/foles/rotacionar-matiz.ts similarity index 93% rename from fontes/valores/metodos/rotacionar-matiz.ts rename to fontes/valores/metodos/foles/rotacionar-matiz.ts index 09c43290..acc574fc 100644 --- a/fontes/valores/metodos/rotacionar-matiz.ts +++ b/fontes/valores/metodos/foles/rotacionar-matiz.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class RotacionarMatiz extends Metodo { diff --git a/fontes/valores/metodos/rotacionar-vertical.ts b/fontes/valores/metodos/foles/rotacionar-vertical.ts similarity index 93% rename from fontes/valores/metodos/rotacionar-vertical.ts rename to fontes/valores/metodos/foles/rotacionar-vertical.ts index 2ce9dbe8..29c5f140 100644 --- a/fontes/valores/metodos/rotacionar-vertical.ts +++ b/fontes/valores/metodos/foles/rotacionar-vertical.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class RotacionarVertical extends Metodo { diff --git a/fontes/valores/metodos/rotacionar.ts b/fontes/valores/metodos/foles/rotacionar.ts similarity index 93% rename from fontes/valores/metodos/rotacionar.ts rename to fontes/valores/metodos/foles/rotacionar.ts index 0a2e680f..33d6c491 100644 --- a/fontes/valores/metodos/rotacionar.ts +++ b/fontes/valores/metodos/foles/rotacionar.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Rotacionar extends Metodo { diff --git a/fontes/valores/metodos/saturar.ts b/fontes/valores/metodos/foles/saturar.ts similarity index 92% rename from fontes/valores/metodos/saturar.ts rename to fontes/valores/metodos/foles/saturar.ts index 38581a3e..fe918a08 100644 --- a/fontes/valores/metodos/saturar.ts +++ b/fontes/valores/metodos/foles/saturar.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Saturar extends Metodo { diff --git a/fontes/valores/metodos/sepia.ts b/fontes/valores/metodos/foles/sepia.ts similarity index 92% rename from fontes/valores/metodos/sepia.ts rename to fontes/valores/metodos/foles/sepia.ts index 5734ab0a..d177d028 100644 --- a/fontes/valores/metodos/sepia.ts +++ b/fontes/valores/metodos/foles/sepia.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Sepia extends Metodo { diff --git a/fontes/valores/metodos/translacao-3d.ts b/fontes/valores/metodos/foles/translacao-3d.ts similarity index 98% rename from fontes/valores/metodos/translacao-3d.ts rename to fontes/valores/metodos/foles/translacao-3d.ts index afe59feb..92be9998 100644 --- a/fontes/valores/metodos/translacao-3d.ts +++ b/fontes/valores/metodos/foles/translacao-3d.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Translacao3d extends Metodo { diff --git a/fontes/valores/metodos/translacao-eixo-z.ts b/fontes/valores/metodos/foles/translacao-eixo-z.ts similarity index 92% rename from fontes/valores/metodos/translacao-eixo-z.ts rename to fontes/valores/metodos/foles/translacao-eixo-z.ts index d47604f1..406b24bb 100644 --- a/fontes/valores/metodos/translacao-eixo-z.ts +++ b/fontes/valores/metodos/foles/translacao-eixo-z.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class TranslacaoEixoZ extends Metodo { diff --git a/fontes/valores/metodos/translacao-horizontal.ts b/fontes/valores/metodos/foles/translacao-horizontal.ts similarity index 92% rename from fontes/valores/metodos/translacao-horizontal.ts rename to fontes/valores/metodos/foles/translacao-horizontal.ts index 4975d412..fb17bc5b 100644 --- a/fontes/valores/metodos/translacao-horizontal.ts +++ b/fontes/valores/metodos/foles/translacao-horizontal.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class TranslacaoHorizontal extends Metodo { diff --git a/fontes/valores/metodos/translacao-vertical.ts b/fontes/valores/metodos/foles/translacao-vertical.ts similarity index 92% rename from fontes/valores/metodos/translacao-vertical.ts rename to fontes/valores/metodos/foles/translacao-vertical.ts index 6e47dfbd..15bf5418 100644 --- a/fontes/valores/metodos/translacao-vertical.ts +++ b/fontes/valores/metodos/foles/translacao-vertical.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class TranslacaoVertical extends Metodo { diff --git a/fontes/valores/metodos/translacao.ts b/fontes/valores/metodos/foles/translacao.ts similarity index 96% rename from fontes/valores/metodos/translacao.ts rename to fontes/valores/metodos/foles/translacao.ts index 6814d38e..1ad060b6 100644 --- a/fontes/valores/metodos/translacao.ts +++ b/fontes/valores/metodos/foles/translacao.ts @@ -1,4 +1,4 @@ -import { Simbolo } from "../../lexador"; +import { Simbolo } from "../../../lexador"; import { Metodo } from "./metodo"; export class Translacao extends Metodo { diff --git a/fontes/valores/metodos/url.ts b/fontes/valores/metodos/foles/url.ts similarity index 100% rename from fontes/valores/metodos/url.ts rename to fontes/valores/metodos/foles/url.ts diff --git a/testes/lexador-reverso.test.ts b/testes/lexador-reverso.test.ts index 96651dc1..17eef4bb 100644 --- a/testes/lexador-reverso.test.ts +++ b/testes/lexador-reverso.test.ts @@ -1,5 +1,4 @@ import { LexadorReverso } from "../fontes/lexador/lexador-reverso"; - import tiposDeSimbolos from "../fontes/tipos-de-simbolos/css"; describe('Lexador Reverso', () => { @@ -18,6 +17,7 @@ describe('Lexador Reverso', () => { expect(resultadoLexador).toBeTruthy(); expect(resultadoLexador.simbolos).toHaveLength(8); + expect(resultadoLexador.erros).toHaveLength(0); // Tipos devem estar mapeados expect(resultadoLexador.simbolos).toEqual( @@ -27,7 +27,7 @@ describe('Lexador Reverso', () => { expect.objectContaining({ tipo: tiposDeSimbolos.IDENTIFICADOR }), expect.objectContaining({ tipo: tiposDeSimbolos.DOIS_PONTOS }), expect.objectContaining({ tipo: tiposDeSimbolos.NUMERO }), - // expect.objectContaining({ tipo: tiposDeSimbolos.QUANTIFICADOR }), + expect.objectContaining({ tipo: tiposDeSimbolos.QUANTIFICADOR }), expect.objectContaining({ tipo: tiposDeSimbolos.PONTO_E_VIRGULA }), expect.objectContaining({ tipo: tiposDeSimbolos.CHAVE_DIREITA }), ]) @@ -41,4 +41,101 @@ describe('Lexador Reverso', () => { ]) ); }); + + + it('Caso de sucesso - função analisarNumero() mapeia números com denotação pontual', () => { + const resultadoLexador = lexadorReverso.mapear([ + "html {", + " font-size: 1.5;", + "}" + ]); + + expect(resultadoLexador).toBeTruthy(); + expect(resultadoLexador.simbolos).toHaveLength(7); + expect(resultadoLexador.erros).toHaveLength(0); + + // Tipos devem estar mapeados + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.TAG }), + expect.objectContaining({ tipo: tiposDeSimbolos.CHAVE_ESQUERDA }), + expect.objectContaining({ tipo: tiposDeSimbolos.IDENTIFICADOR }), + expect.objectContaining({ tipo: tiposDeSimbolos.DOIS_PONTOS }), + expect.objectContaining({ tipo: tiposDeSimbolos.NUMERO }), + expect.objectContaining({ tipo: tiposDeSimbolos.PONTO_E_VIRGULA }), + expect.objectContaining({ tipo: tiposDeSimbolos.CHAVE_DIREITA }), + ]) + ); + + // Lexemas devem estar mapeados + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ lexema: '1.5' }), + ]) + ); + }); + + it('Caso de sucesso - mapeamento de classes e IDs', () => { + const classeId = ['.', '#']; + + for (let index = 0; index < classeId.length; index += 1) { + const resultadoLexador = lexadorReverso.mapear([ + `${classeId[index]}meu-seletor {`, + " padding: 10px;", + "}" + ]); + + expect(resultadoLexador).toBeTruthy(); + expect(resultadoLexador.simbolos).toHaveLength(9); + expect(resultadoLexador.erros).toHaveLength(0); + + // Deve mapear PONTO ou CERQUILHA corretamente + if (index === 0) { + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.PONTO }), + ]) + ); + } else { + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.CERQUILHA }), + ]) + ); + } + + // Todos os demais tipos devem estar mapeados + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.CHAVE_ESQUERDA }), + expect.objectContaining({ tipo: tiposDeSimbolos.IDENTIFICADOR }), + expect.objectContaining({ tipo: tiposDeSimbolos.DOIS_PONTOS }), + expect.objectContaining({ tipo: tiposDeSimbolos.NUMERO }), + expect.objectContaining({ tipo: tiposDeSimbolos.QUANTIFICADOR }), + expect.objectContaining({ tipo: tiposDeSimbolos.PONTO_E_VIRGULA }), + expect.objectContaining({ tipo: tiposDeSimbolos.CHAVE_DIREITA }), + ]) + ); + + // Lexemas devem estar mapeados + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ lexema: 'meu-seletor' }), + ]) + ); + } + }); + + it('Caso de falha - caractere inesperado', () => { + const resultadoLexador = lexadorReverso.mapear([ + `html {`, + " padding: 10px&;", + "}" + ]); + + expect(resultadoLexador.erros).toHaveLength(1); + expect(resultadoLexador.erros).toEqual( + [{"caractere": "&", "linha": 2, "mensagem": "Caractere inesperado."}] + ); + }); }); diff --git a/testes/listas/traducao-reversa.ts b/testes/listas/traducao-reversa.ts new file mode 100644 index 00000000..cff694c9 --- /dev/null +++ b/testes/listas/traducao-reversa.ts @@ -0,0 +1,58 @@ +export const TraducaoReversa: Array = [ + { + foles: 'estender-borda-imagem', + css: 'border-image-outset', + }, + { + foles: 'deslocar-contorno', + css: 'outline-offset', + }, + { + foles: 'largura-contorno', + css: 'outline-width', + }, + { + foles: 'recortar-margem-vazada', + css: 'overflow-clip-margin', + }, + { + foles: 'perspectiva', + css: 'perspective', + }, + { + foles: 'margem-inferior-rolagem-mouse', + css: 'scroll-margin-bottom', + }, + { + foles: 'margem-esquerda-rolagem-mouse', + css: 'scroll-margin-left', + }, + { + foles: 'margem-direita-rolagem-mouse', + css: 'scroll-margin-right', + }, + { + foles: 'margem-superior-rolagem-mouse', + css: 'scroll-margin-top', + }, + { + foles: 'tabulacao', + css: 'tab-size', + }, + { + foles: 'espacamento-palavras', + css: 'word-spacing', + }, + { + foles: 'raio-borda', + css: 'border-radius', + }, + { + foles: 'recuo', + css: 'padding', + }, + { + foles: 'regras-coluna', + css: 'column-rule', + }, +]; \ No newline at end of file diff --git a/testes/modificadores/validacoes-modificadores.test.ts b/testes/modificadores/validacoes-modificadores.test.ts new file mode 100644 index 00000000..2e9dfbf3 --- /dev/null +++ b/testes/modificadores/validacoes-modificadores.test.ts @@ -0,0 +1,477 @@ +import { AvaliadorSintatico } from "../../fontes/avaliador-sintatico"; +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 { Serializador } from "../../fontes/serializadores"; + +describe('Testando Validações de Valores e Quantificadores dos Seletores', () => { + describe('Validação comum de valores', () => { + let lexador: LexadorInterface; + let importador: ImportadorInterface; + let avaliador: AvaliadorSintaticoInterface; + let tradutor: Serializador; + + beforeEach(() => { + lexador = new Lexador(); + importador = new Importador(lexador); + avaliador = new AvaliadorSintatico(importador); + tradutor = new Serializador(); + }); + + it('Caso de sucesso - Validações não retornam erros', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'agrupar-palavra: normal;', + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 7 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(7); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear o tipo de símbolo Qualitativo + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.QUALITATIVO }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); + + // Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + + // O Serializador deve traduzir devidamente os termos + expect(resultadoTradutor).toContain('div'); + expect(resultadoTradutor).toContain('word-break'); + expect(resultadoTradutor).toContain('normal;'); + }); + + it('Caso de falha - Validação retorna erro de valor inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'agrupar-palavra: nomal;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'agrupar-palavra' com valor nomal inválido.`); + }); + + it('Caso de falha - Validação retorna erro de valor extra inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'conteúdo: linear-gradiente;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'conteúdo' com valor linear-gradiente inválido.`); + }); + }); + + describe('Validação de valores com condição extra', () => { + let lexador: LexadorInterface; + let importador: ImportadorInterface; + let avaliador: AvaliadorSintaticoInterface; + let tradutor: Serializador; + + beforeEach(() => { + lexador = new Lexador(); + importador = new Importador(lexador); + avaliador = new AvaliadorSintatico(importador); + tradutor = new Serializador(); + }); + + it('Caso de sucesso - Validações não retornam erros', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'alinhar-itens: seguro;', + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 7 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(7); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear o tipo de símbolo Qualitativo + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.QUALITATIVO }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); + + // Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + + // O Serializador deve traduzir devidamente os termos + expect(resultadoTradutor).toContain('div'); + expect(resultadoTradutor).toContain('align-items'); + expect(resultadoTradutor).toContain('safe;'); + }); + + it('Caso de falha - Validação retorna erro de valor inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'alinhar-itens: seuro;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'alinhar-itens' com valor seuro inválido.`); + }); + + it('Caso de falha - Validação retorna erro de valor extra inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'estilo-borda-direita: desconhecido;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'estilo-borda-direita' com valor desconhecido inválido.`); + }); + }); + + describe('Validação de valores numéricos', () => { + let lexador: LexadorInterface; + let importador: ImportadorInterface; + let avaliador: AvaliadorSintaticoInterface; + let tradutor: Serializador; + + beforeEach(() => { + lexador = new Lexador(); + importador = new Importador(lexador); + avaliador = new AvaliadorSintatico(importador); + tradutor = new Serializador(); + }); + + it('Caso de sucesso - Validações não retornam erros', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'alinhar-vertical: 20px;', + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 7 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(8); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear os tipos de símbolo Número e Quantificador + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.NUMERO }), + expect.objectContaining({ tipo: tiposDeSimbolos.QUANTIFICADOR }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); + + // Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + + // O Serializador deve traduzir devidamente os termos + expect(resultadoTradutor).toContain('div'); + expect(resultadoTradutor).toContain('vertical-align'); + expect(resultadoTradutor).toContain('20px;'); + }); + + it('Caso de falha - Validação retorna erro de valor inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'alinhar-vertical: desconhecido;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'alinhar-vertical' com valor desconhecido inválido.`); + }); + + it('Caso de falha - Validação retorna erro de valor extra inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'atraso-animação: desconhecido;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'atraso-animação' com valor desconhecido inválido.`); + }); + + it('Caso de falha - Validação retorna erro de valor aceito, mas inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'altura-máxima: desconhecido;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'altura-máxima' com valor desconhecido inválido.`); + }); + }); + + describe('Validação de cores e hexadecimais', () => { + let lexador: LexadorInterface; + let importador: ImportadorInterface; + let avaliador: AvaliadorSintaticoInterface; + let tradutor: Serializador; + + beforeEach(() => { + lexador = new Lexador(); + importador = new Importador(lexador); + avaliador = new AvaliadorSintatico(importador); + tradutor = new Serializador(); + }); + + it('Caso de sucesso - Validações não retornam erros ao atribuir nome de cor', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'cor-barra-rolagem: azul;', + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 7 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(7); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear o tipo de símbolo Qualitativo + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.QUALITATIVO }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); + + // Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + + // O Serializador deve traduzir devidamente os termos + expect(resultadoTradutor).toContain('div'); + expect(resultadoTradutor).toContain('scrollbar-color'); + expect(resultadoTradutor).toContain('blue;'); + }); + + it('Caso de sucesso - Validações não retornam erros ao atribuir código hexadecimal', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'cor-barra-rolagem: #ffffff;', + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 8 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(8); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear o tipo de símbolo Método + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.METODO }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); + + // Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + + // O Serializador deve traduzir devidamente os termos + expect(resultadoTradutor).toContain('div'); + expect(resultadoTradutor).toContain('scrollbar-color'); + expect(resultadoTradutor).toContain('#ffffff;'); + }); + + it('Caso de falha - Validação retorna erro de código hexadecimal inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'cor-barra-rolagem: #f;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'cor-barra-rolagem' com hexadecimal inválido`); + }); + + it('Caso de falha - Validação retorna erro de método inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'cor-barra-rolagem: minmax(auto, 10px);', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'cor-barra-rolagem' com método 'MinMax' inválido.`); + }); + + it('Caso de falha - Validação retorna erro de valor inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'cor-borda-direita: desconhecido;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'cor-borda-direita' com valor desconhecido inválido.`); + }); + + it('Caso de falha - Validação retorna erro de valor aceito, mas inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'cor-barra-rolagem: desconhecido;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'cor-barra-rolagem' com valor desconhecido inválido.`); + }); + }); + + describe('Validação de quantificadores', () => { + let lexador: LexadorInterface; + let importador: ImportadorInterface; + let avaliador: AvaliadorSintaticoInterface; + let tradutor: Serializador; + + beforeEach(() => { + lexador = new Lexador(); + importador = new Importador(lexador); + avaliador = new AvaliadorSintatico(importador); + tradutor = new Serializador(); + }); + + it('Caso de sucesso - Validações não retornam erros', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'deslocamento: 90deg;', + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 8 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(8); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear os tipos de símbolo Número e Quantificador + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.NUMERO }), + expect.objectContaining({ tipo: tiposDeSimbolos.QUANTIFICADOR }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos); + + // Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + + // O Serializador deve traduzir devidamente os termos + expect(resultadoTradutor).toContain('div'); + expect(resultadoTradutor).toContain('offset'); + expect(resultadoTradutor).toContain('90deg;'); + }); + + it('Caso de falha - Validação retorna erro de quantificador inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'alinhar-vertical: 10ab;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'alinhar-vertical' com quantificador inválido.`); + }); + + it('Caso de falha - Validação retorna erro de quantificador extra inválido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'deslocamento: 10a;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`Propriedade 'deslocamento' com quantificador inválido.`); + }); + }); + + describe('Testando método de proibir quantificadores', () => { + let lexador: LexadorInterface; + let importador: ImportadorInterface; + let avaliador: AvaliadorSintaticoInterface; + let tradutor: Serializador; + + beforeEach(() => { + lexador = new Lexador(); + importador = new Importador(lexador); + avaliador = new AvaliadorSintatico(importador); + tradutor = new Serializador(); + }); + + it('Caso de falha - Validação retorna erro de quantificador proibido', () => { + // Lexador + const resultadoLexador = lexador.mapear([ + 'divisão {', + 'ajustar-tamanho-fonte: 10px;', + "}" + ]); + + // Avaliador Sintático + expect(() => { + avaliador.analisar(resultadoLexador.simbolos); + }).toThrow(`A propriedade 'ajustar-tamanho-fonte' aceita somente valores numéricos. O quantificador 'px' é inválido para esta operação.`); + }); + }); +}); + diff --git a/testes/modificadores/valor-numerico.test.ts b/testes/modificadores/valor-numerico.test.ts index 1d5e0ca1..891452c1 100644 --- a/testes/modificadores/valor-numerico.test.ts +++ b/testes/modificadores/valor-numerico.test.ts @@ -86,11 +86,11 @@ describe('Testando Seletores que recebem VALOR NUMÉRICO sem quantificador', () if (!regex.test(ValorNumericoApenas[index]) && regex.test(ValorNumericoApenas[index + 1])){ expect(() => { avaliador.analisar(novoLexador.simbolos); - }).toThrow(`A propriedade ${ValorNumericoApenas[index + 1]} aceita somente valores numéricos. O quantificador px é inválido para esta operação.`); + }).toThrow(`A propriedade '${ValorNumericoApenas[index + 1]}' aceita somente valores numéricos. O quantificador 'px' é inválido para esta operação.`); } else { expect(() => { avaliador.analisar(novoLexador.simbolos); - }).toThrow(`A propriedade ${ValorNumericoApenas[index]} aceita somente valores numéricos. O quantificador px é inválido para esta operação.`); + }).toThrow(`A propriedade '${ValorNumericoApenas[index]}' aceita somente valores numéricos. O quantificador 'px' é inválido para esta operação.`); } // Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático diff --git a/testes/seletores-estruturas.test.ts b/testes/seletores-estruturas.test.ts new file mode 100644 index 00000000..5df43901 --- /dev/null +++ b/testes/seletores-estruturas.test.ts @@ -0,0 +1,259 @@ +import { AvaliadorSintatico } from "../fontes/avaliador-sintatico" +import { Importador } from "../fontes/importador"; +import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface, ResultadoLexadorInterface } from "../fontes/interfaces"; +import { Lexador } from "../fontes/lexador" +import { Serializador } from "../fontes/serializadores"; +import tiposDeSimbolos from "../fontes/tipos-de-simbolos/foles"; +import { SeletorClasse, SeletorId } from "../fontes/seletores"; +import { SeletorEspacoReservado } from "../fontes/seletores/seletor-espaco-reservado"; + + +describe('Testando seletores e estruturas', () => { + let lexador: LexadorInterface; + let importador: ImportadorInterface; + let avaliadorSintatico: AvaliadorSintaticoInterface; + let tradutor: Serializador; + + beforeEach(() => { + lexador = new Lexador(); + importador = new Importador(lexador); + avaliadorSintatico = new AvaliadorSintatico(importador); + tradutor = new Serializador(); + }); + + it('Seletor Classe - caso de sucesso', () => { + // Lexador + const resultadoLexador: ResultadoLexadorInterface = lexador.mapear([ + ".minha-classe {", + "margem-superior: 13mm;", + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 9 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(9); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear os tipos de símbolo Ponto e Identificador que compõem o nome da classe + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.PONTO }), + expect.objectContaining({ tipo: tiposDeSimbolos.IDENTIFICADOR }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliadorSintatico.analisar(resultadoLexador.simbolos); + + // O Avaliador Sintático deve executar as operações normalmente, sem retornar erros + expect(resultadoAvaliadorSintatico).toBeTruthy(); + expect(resultadoAvaliadorSintatico).toHaveLength(1); + + // O Avaliador deve mapear uma instância da classe SeletorClasse + expect(resultadoAvaliadorSintatico[0].seletores[0]).toBeInstanceOf(SeletorClasse); + + // A classe mapeada deve ter o nome 'minha-classe' + expect(resultadoAvaliadorSintatico[0].seletores[0]['nomeClasse']).toBe('minha-classe'); + + // O resultado do Avaliador deve ser recebido em um formato aceito pelo Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + expect(resultadoTradutor).toBeTruthy(); + }); + + it('Seletor Classe - caso de falha', () => { + // Lexador - nome de classe escrito sem o ponto como prefixo + const resultadoLexador: ResultadoLexadorInterface = lexador.mapear([ + "minha-classe {", + "margem-superior: 13mm;", + "}" + ]); + + // Avaliador Sintático deve retornar um erro por não reconhecer o identificador como nome de classe + expect(() => { + avaliadorSintatico.analisar(resultadoLexador.simbolos); + }).toThrow(`Esperado '{' após declaração de seletor.`); + }); + + it('Seletor Classe com pseudoclasse', () => { + // Lexador + const resultadoLexador: ResultadoLexadorInterface = lexador.mapear([ + ".classe-personalizada:foco {", + "margem-superior: 13mm;", + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 11 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(11); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear os tipos de símbolo Ponto e Identificador que compõem o nome da classe + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.PONTO }), + expect.objectContaining({ tipo: tiposDeSimbolos.IDENTIFICADOR }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliadorSintatico.analisar(resultadoLexador.simbolos); + + // O Avaliador deve mapear uma instância da classe SeletorClasse e com o nome 'classe-personalizada' + expect(resultadoAvaliadorSintatico[0].seletores[0]).toBeInstanceOf(SeletorClasse); + expect(resultadoAvaliadorSintatico[0].seletores[0]['nomeClasse']).toBe('classe-personalizada'); + + // O Avaliador deve mapear devidamente a pseudoclasse + expect(resultadoAvaliadorSintatico[0].seletores[0].pseudoclasse).toBeTruthy(); + expect(resultadoAvaliadorSintatico[0].seletores[0].pseudoclasse['nomeFoles']).toBe('foco'); + + // O resultado do Avaliador deve ser recebido em um formato aceito pelo Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + expect(resultadoTradutor).toBeTruthy(); + }); + + it('Seletor Id - caso de sucesso', () => { + // Lexador + const resultadoLexador: ResultadoLexadorInterface = lexador.mapear([ + "#meu-id {", + "margem-superior: 13mm;", + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 9 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(9); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear os tipos de símbolo Cerquilha e Identificador que compõem a nomenclatura de um Id + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.CERQUILHA }), + expect.objectContaining({ tipo: tiposDeSimbolos.IDENTIFICADOR }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliadorSintatico.analisar(resultadoLexador.simbolos); + + // O Avaliador Sintático deve executar as operações normalmente, sem retornar erros + expect(resultadoAvaliadorSintatico).toBeTruthy(); + expect(resultadoAvaliadorSintatico).toHaveLength(1); + + // O Avaliador deve mapear uma instância da classe SeletorClasse + expect(resultadoAvaliadorSintatico[0].seletores[0]).toBeInstanceOf(SeletorId); + + // O id mapeado deve ter o nome 'meu-id' + expect(resultadoAvaliadorSintatico[0].seletores[0]['id']).toBe('meu-id'); + + // O resultado do Avaliador deve ser recebido em um formato aceito pelo Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + expect(resultadoTradutor).toBeTruthy(); + }); + + it('Seletor Id - caso de falha', () => { + // Lexador - nome de classe escrito sem o ponto como prefixo + const resultadoLexador: ResultadoLexadorInterface = lexador.mapear([ + "meu-id {", + "margem-superior: 13mm;", + "}" + ]); + + // Avaliador Sintático deve retornar um erro por não reconhecer o identificador como nome de classe + expect(() => { + avaliadorSintatico.analisar(resultadoLexador.simbolos); + }).toThrow(`Esperado '{' após declaração de seletor.`); + }); + + it('Seletor Id com pseudoclasse', () => { + // Lexador + const resultadoLexador: ResultadoLexadorInterface = lexador.mapear([ + "#id-personalizado:escopo {", + "margem-superior: 13mm;", + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 11 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(11); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear os tipos de símbolo Cerquilha e Identificador que compõem o id + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.CERQUILHA }), + expect.objectContaining({ tipo: tiposDeSimbolos.IDENTIFICADOR }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliadorSintatico.analisar(resultadoLexador.simbolos); + + // O Avaliador deve mapear uma instância de SeletorId e com o nome 'id-personalizado' + expect(resultadoAvaliadorSintatico[0].seletores[0]).toBeInstanceOf(SeletorId); + expect(resultadoAvaliadorSintatico[0].seletores[0]['id']).toBe('id-personalizado'); + + // O Avaliador deve mapear devidamente a pseudoclasse + expect(resultadoAvaliadorSintatico[0].seletores[0].pseudoclasse).toBeTruthy(); + expect(resultadoAvaliadorSintatico[0].seletores[0].pseudoclasse['nomeFoles']).toBe('escopo'); + + // O resultado do Avaliador deve ser recebido em um formato aceito pelo Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + expect(resultadoTradutor).toBeTruthy(); + }); + + it('Seletor Espaço Reservado - caso de sucesso', () => { + // Lexador + const resultadoLexador: ResultadoLexadorInterface = lexador.mapear([ + "%meu-seletor {", + "borda: 13mm;", + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 9 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(9); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear os tipos de símbolo Percentual e Identificador que compõem a estrutura de espaço reservado + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.PERCENTUAL }), + expect.objectContaining({ tipo: tiposDeSimbolos.IDENTIFICADOR }), + ]) + ); + + // Avaliador Sintático + const resultadoAvaliadorSintatico = avaliadorSintatico.analisar(resultadoLexador.simbolos); + + // O Avaliador Sintático deve executar as operações normalmente, sem retornar erros + expect(resultadoAvaliadorSintatico).toBeTruthy(); + expect(resultadoAvaliadorSintatico).toHaveLength(1); + + // O Avaliador deve mapear uma instância da classe SeletorEspaçoReservado + expect(resultadoAvaliadorSintatico[0].seletores[0]).toBeInstanceOf(SeletorEspacoReservado); + + // O resultado do Avaliador deve ser recebido em um formato aceito pelo Serializador + const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico); + expect(resultadoTradutor).toHaveLength(0); + }); + + it('Seletor Espaço Reservado - caso de falha', () => { + // Lexador + const resultadoLexador: ResultadoLexadorInterface = lexador.mapear([ + "% {", + ": 13mm;", + "}" + ]); + + // O Lexador deve montar um objeto de comprimento 7 sem retornar nenhum erro + expect(resultadoLexador.simbolos).toHaveLength(7); + expect(resultadoLexador.erros).toHaveLength(0); + + // O Lexador deve mapear o tipo de símbolo Percentual + expect(resultadoLexador.simbolos).toEqual( + expect.arrayContaining([ + expect.objectContaining({ tipo: tiposDeSimbolos.PERCENTUAL }), + ]) + ); + + // Avaliador Sintático deve retornar um erro por não reconhecer o identificador + expect(() => { + avaliadorSintatico.analisar(resultadoLexador.simbolos); + }).toThrow('Esperado identificador válido para espaço reservado.'); + }); +}); diff --git a/testes/serializador-reverso.test.ts b/testes/serializador-reverso.test.ts index 660dd908..65a30f24 100644 --- a/testes/serializador-reverso.test.ts +++ b/testes/serializador-reverso.test.ts @@ -1,26 +1,25 @@ import { AvaliadorSintaticoReverso } from "../fontes/avaliador-sintatico/avaliador-sintatico-reverso"; import { LexadorReverso } from "../fontes/lexador/lexador-reverso"; import { SerializadorReverso } from "../fontes/serializadores/serializador-reverso"; - import estruturasLmht from "../fontes/tradutores/estruturas-lmht"; import { AvaliadorSintaticoInterface, ImportadorInterface, LexadorInterface } from "../fontes/interfaces"; import { Importador } from "../fontes/importador"; +import { TraducaoReversa } from "./listas/traducao-reversa"; describe('Serializador Reverso', () => { let lexadorReverso: LexadorInterface; let importador: ImportadorInterface; let avaliadorReverso: AvaliadorSintaticoInterface; - let tradutorReverso: SerializadorReverso; + let serializadorReverso: SerializadorReverso; beforeEach(() => { lexadorReverso = new LexadorReverso(); importador = new Importador(lexadorReverso); avaliadorReverso = new AvaliadorSintaticoReverso(importador); - tradutorReverso = new SerializadorReverso(); + serializadorReverso = new SerializadorReverso(); }); - // TODO: Finalizar a lógica em `declaracaoPorSeletor()` (avaliador sintático reverso) - it.skip('Testando tradução das estruturas HTML', () => { + it.only('Testando tradução das estruturas HTML', () => { for (let index = 0; index < Object.keys(estruturasLmht).length; index += 1) { // Lexador recebe as estruturas FolEs @@ -34,8 +33,61 @@ describe('Serializador Reverso', () => { const resultadoAvaliadorSintatico = avaliadorReverso.analisar(resultadoLexador.simbolos); // Tradutor deve retornar a estrutura HTML correspondente - const resultadoTradutor = tradutorReverso.serializar(resultadoAvaliadorSintatico); - expect(resultadoTradutor).toContain(Object.values(estruturasLmht)[index]); + const resultadoSerializador = serializadorReverso.serializar(resultadoAvaliadorSintatico); + + if (Object.values(estruturasLmht)[index].length > 1) { + const estruturaLmhtString = Object.values(estruturasLmht)[index][0].toString(); + expect(resultadoSerializador).toContain(estruturaLmhtString); + } else { + const estruturaLmhtString = Object.values(estruturasLmht)[index].toString(); + expect(resultadoSerializador).toContain(estruturaLmhtString); + } } }); + + // TODO: Finalizar a lógica em `declaracaoPorSeletor()` (avaliador sintático reverso) para testes abaixo funcionarem + it('Testando tradução reversa de modificadores', () => { + for (let index = 0; index < Object.keys(TraducaoReversa).length; index += 1) { + + // Lexador Reverso recebe as estruturas FolEs + const resultadoLexador = lexadorReverso.mapear([ + `html {`, + ` ${TraducaoReversa[index]['css']}: 60px;`, + "}" + ]) + + // Avaliador Sintático Reverso + const resultadoAvaliadorSintatico = avaliadorReverso.analisar(resultadoLexador.simbolos); + + // Serializador reverso + const resultadoSerializador = serializadorReverso.serializar(resultadoAvaliadorSintatico); + + // Serializador reverso deve retornar a estrutura HTML correspondente + expect(resultadoSerializador).toContain('lmht'); + expect(resultadoSerializador).toContain(TraducaoReversa[index]['foles']); + expect(resultadoSerializador).toContain('60px;'); + } + }); + + // OBS.: Teste genérico, precisa de implementações no Av. Sintático Reverso antes de funcionar + // TODO: Implementar lista de métodos quando estiver funcionando + it.skip('Testando tradução reversa de métodos', () => { + // Lexador Reverso recebe as estruturas FolEs + const resultadoLexador = lexadorReverso.mapear([ + `html {`, + ` filter: blur(4px);`, + "}" + ]) + + // Avaliador Sintático Reverso + const resultadoAvaliadorSintatico = avaliadorReverso.analisar(resultadoLexador.simbolos); + + // Serializador reverso + const resultadoSerializador = serializadorReverso.serializar(resultadoAvaliadorSintatico); + + // Serializador reverso deve retornar a estrutura HTML correspondente + expect(resultadoSerializador).toContain('lmht'); + expect(resultadoSerializador).toContain('borrar'); + expect(resultadoSerializador).toContain('4px;'); + }); }); \ No newline at end of file