Skip to content

Commit

Permalink
Pseudoclasses com parâmetros e aumenta cobertura geral de testes (#147)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
VitBrandao authored Dec 2, 2024
1 parent bdc6588 commit c063a56
Show file tree
Hide file tree
Showing 81 changed files with 1,348 additions and 226 deletions.
16 changes: 0 additions & 16 deletions exemplos/exemplo.foles
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
1 change: 1 addition & 0 deletions exemplos/exemplo3.foles
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ lmht {
indice-z: 5;
transformar: translação(15graus);
deslocamento: raio(conter 200graus);
filtro-fundo: borrar(10px);
}

lmht {
Expand Down
8 changes: 8 additions & 0 deletions exemplos/exemplo4.foles
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,12 @@ divisao:foco {

paragrafo:futuro {
tamanho-fonte: 20px;
}

divisão:direcao-texto {
altura: 20px;
}

lmht {
filtro-fundo: borrar(10px);
}
7 changes: 7 additions & 0 deletions exemplos/reverso/exemplo-codigo.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
div {
margin-top: 12px;
}

p {
border: 50px;
}
4 changes: 4 additions & 0 deletions exemplos/reverso/exemplo-liquido.css
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,7 @@ html {
#meu-segundo-id {
width: 400mm;
}

div {
backdrop-filter: brightness(10px);
}
46 changes: 43 additions & 3 deletions fontes/avaliador-sintatico/avaliador-sintatico-reverso.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}
Expand All @@ -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,
Expand Down
1 change: 0 additions & 1 deletion fontes/avaliador-sintatico/avaliador-sintatico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";


/**
Expand Down
19 changes: 10 additions & 9 deletions fontes/foles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -60,32 +60,32 @@ 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);
const resultadoTraducao = this.tradutor.traduzir(resultadoAvaliadorSintatico);
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);
}

Expand All @@ -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'));
// console.log(a.converterParaFolEs('../exemplos/reverso/exemplo-liquido.css'));/
// console.log(a.converterParaFolEs('../exemplos/reverso/exemplo-codigo.css'));
34 changes: 21 additions & 13 deletions fontes/lexador/lexador-reverso.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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
)
Expand Down Expand Up @@ -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();
Expand All @@ -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))
Expand Down Expand Up @@ -238,7 +246,7 @@ export class LexadorReverso implements LexadorInterface {
this.analisarToken();
}

return {
return {
simbolos: this.simbolos,
erros: this.erros
}
Expand Down
84 changes: 84 additions & 0 deletions fontes/lexador/palavras-reservadas/css.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import tiposDeSimbolos from "../../tipos-de-simbolos/css";

export default {
// TAG
'body': tiposDeSimbolos.TAG,
'head': tiposDeSimbolos.TAG,
'html': tiposDeSimbolos.TAG,
Expand Down Expand Up @@ -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,
}
2 changes: 0 additions & 2 deletions fontes/modificadores/cor-inicio-borda-em-linha.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { cores } from "./atributos/cores";
import { valoresGlobais } from "./atributos/globais";
import { Modificador, PragmasModificador } from "./superclasse";
import { validarValorCor } from "./validacoes/cor";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -726,4 +728,8 @@ export const DicionarioReversoModificadores: { [nomeCss: string]: any } = {
"visibility": Visibilidade,
"content-visibility": VisibilidadeConteudo,
"backface-visibility": VisibilidadeFundo,

// METODOS
"blur": Blur,
"brightness": Brightness,
}
2 changes: 1 addition & 1 deletion fontes/modificadores/imagem-fundo.ts
Original file line number Diff line number Diff line change
@@ -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";

Expand Down
Loading

0 comments on commit c063a56

Please sign in to comment.