Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Issue #59] Atribuição Abreviada / Múltiplos Valores #124

Merged
merged 25 commits into from
Oct 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
487e4b6
Testando mudanças no Av Sintático para comportar múltiplos valores
VitBrandao Sep 23, 2024
b5f0f08
Adapta avaliador para seguir operando normalmente em casos de 1 valor
VitBrandao Sep 24, 2024
268d331
Adapta Av Sintatico para aceitar métodos em nova estrutura
VitBrandao Sep 24, 2024
9e2c39c
Corrige lógica para Av Sintatico aceitar casos de valores únicos com …
VitBrandao Sep 24, 2024
3926a48
Corrige validação do Av Sintatico após quebrar testes unitarios
VitBrandao Sep 24, 2024
e164927
Tratando casos de valores em branco no Av Sintatico
VitBrandao Sep 24, 2024
b7a2c3b
Adapta testes de valor numérico após novas implementações
VitBrandao Sep 24, 2024
9e14276
Organizando nova estrutura de resolverModificador()
VitBrandao Sep 25, 2024
3d09da1
Implementa trecho em resolverModificador() para atribuição abreviada
VitBrandao Sep 25, 2024
c0c3f52
Adaptando serializador para cobrir casos de atribuição abreviada
VitBrandao Sep 25, 2024
5285a9b
Inclui tipagem nas novas implementações
VitBrandao Sep 25, 2024
522a06a
Apaga trechos comentados no Avaliador Sintático
VitBrandao Sep 25, 2024
d46fbef
Aplicando ajustes solicitados
VitBrandao Sep 26, 2024
c9f3ce5
Otimiza operação de Atribuição Abreviada no Av Sintático
VitBrandao Sep 26, 2024
0e5e9e1
Organiza operação de Atribuição Abreviada em novo método
VitBrandao Sep 26, 2024
1c5cbae
Ajusta indentaçao e apaga comentários
VitBrandao Sep 26, 2024
c9945d8
Organiza e divide em listas os seletores de atribuicao abreviada
VitBrandao Oct 1, 2024
c0a2668
Testes de múltiplos valores-quantificadores na Atribuição Abrevida
VitBrandao Oct 2, 2024
4db6b8c
Atualiza listas de seletores AA
VitBrandao Oct 2, 2024
604c1c4
Testes de múltiplas Palavras Reservadas na Atribuição Abrevida
VitBrandao Oct 2, 2024
27d29ec
Otimiza método de atribuição abreviada no Av Sintático
VitBrandao Oct 2, 2024
91a82c3
Corrige valores extra do modificador animação
VitBrandao Oct 8, 2024
ad936d3
Montando objetos "modificador": "valor" para testes de Atribuição Abr…
VitBrandao Oct 8, 2024
0726ebe
Testes de valor-quantificador e palavras reservadas como múltiplo valor
VitBrandao Oct 8, 2024
9762106
Complementa testes de valor-quantificador e palavra reservada
VitBrandao Oct 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 3 additions & 13 deletions exemplos/exemplo2.foles
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
lmht {
tempo-transicao: curva-cúbica(0.42, 0.0, 1.0, 1.0);
cor-destaque: rgb(100, 200, 300);
opacidade: 80%;
recuo: 10px 10px auto 20px;
altura: 50%;
}

.classe {
tempo-transicao: passos(3, final);
tamanho-colunas-em-grade: minmax(200px, auto);
altura-máxima: encaixar-conteúdo(5cm);
altura: limitar(1px, 2vw, 2.5rem);

.outra-classe {
tamanho-fonte: 24px;
}
}
1 change: 1 addition & 0 deletions exemplos/exemplo3.foles
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lmht {
linhas-superiores: 2;
altura: 30px;
largura: herdar;
colunas: 2;
opacidade: 0.5;
indice-z: 5;
Expand Down
95 changes: 79 additions & 16 deletions fontes/avaliador-sintatico/avaliador-sintatico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -994,15 +994,44 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
return textoUrl;
}

valorModificador(): any {
const valorModificador = this.avancarEDevolverAnterior();
private valoresModificador(): Array<any> {
const modificadores = [];
while (this.simbolos[this.atual].hasOwnProperty('tipo') && this.simbolos[this.atual].tipo !== tiposDeSimbolos.PONTO_E_VIRGULA) {
VitBrandao marked this conversation as resolved.
Show resolved Hide resolved
const valorModificador = this.avancarEDevolverAnterior();

switch (valorModificador.tipo) {
case tiposDeSimbolos.METODO:
const metodo = this.resolverMetodo(valorModificador.lexema);
modificadores.push(metodo);
default:
const modificador = valorModificador;
modificadores.push(modificador);
}
}

switch (valorModificador.tipo) {
case tiposDeSimbolos.METODO:
return this.resolverMetodo(valorModificador.lexema);
default:
return valorModificador;
return modificadores;
}

private tratarAtribuicaoAbreviada(valoresModificador: Array<any>): string {
let atribuicaoAbreviada: string = '';

for (let i = 0; i < valoresModificador.length; i += 1) {
if (i === 0) {
atribuicaoAbreviada += `${valoresModificador[i].lexema}`;
} else {
switch (valoresModificador[i].tipo) {
case tiposDeSimbolos.QUANTIFICADOR:
atribuicaoAbreviada += `${valoresModificador[i].lexema}`;
break;
default:
atribuicaoAbreviada += ' ';
atribuicaoAbreviada += `${valoresModificador[i].lexema}`;
break;
}
}
}

return atribuicaoAbreviada;
}

private tratarValorNumerico(modificador: Simbolo): Boolean {
Expand Down Expand Up @@ -1152,29 +1181,63 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
"Esperado ':' após nome do modificador."
);

const valorModificador = this.valorModificador();
let quantificador;
const valoresModificador: Array<any> = this.valoresModificador();
let quantificador: any;
let quantificadores: Array<any> = [];

for (const [index, valorModificador] of valoresModificador.entries()) {
if (valorModificador.hasOwnProperty('tipo') && valorModificador.tipo === tiposDeSimbolos.NUMERO) {

const tratarValorNumerico = this.tratarValorNumerico(valorModificador);

if (tratarValorNumerico) {
quantificador = valoresModificador[index + 1];
quantificadores.push(valoresModificador[index + 1]);
}
}

if (valorModificador.hasOwnProperty('tipo') && valorModificador.tipo === tiposDeSimbolos.METODO) {
valoresModificador.splice(index, 1);
}
}

// TODO: Pensar num teste melhor pra isso.
VitBrandao marked this conversation as resolved.
Show resolved Hide resolved
/*if (!(valorModificador instanceof Metodo)) {
quantificador = this.avancarEDevolverAnterior();
}*/

if (valorModificador.hasOwnProperty('tipo') && valorModificador.tipo === tiposDeSimbolos.NUMERO) {
const tratarValorNumerico = this.tratarValorNumerico(modificador);

if (tratarValorNumerico) {
quantificador = this.avancarEDevolverAnterior();
}
if (valoresModificador.length === 0) {
const proximoSimbolo = this.avancarEDevolverAnterior();
valoresModificador.push(proximoSimbolo);
}

this.consumir(
tiposDeSimbolos.PONTO_E_VIRGULA,
`Esperado ';' após declaração de valor de modificador '${modificador.lexema}'.`
);

if (valoresModificador.length <= 2) {
const classeModificadora = new SeletorModificador(
modificador.lexema,
valoresModificador[0].hasOwnProperty('lexema') ? valoresModificador[0].lexema : valoresModificador[0],
quantificador && quantificador.hasOwnProperty('lexema') ?
quantificador.lexema :
quantificador,
{
linha: modificador.linha,
colunaInicial: modificador.colunaInicial,
colunaFinal: modificador.colunaFinal
}
);

return classeModificadora as Modificador;
}

const atribuicaoAbreviada = this.tratarAtribuicaoAbreviada(valoresModificador);

const classeModificadora = new SeletorModificador(
modificador.lexema,
valorModificador.hasOwnProperty('lexema') ? valorModificador.lexema : valorModificador,
atribuicaoAbreviada,
quantificador && quantificador.hasOwnProperty('lexema') ?
quantificador.lexema :
quantificador,
Expand Down
2 changes: 1 addition & 1 deletion fontes/modificadores/animacao.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export class Animacao extends Modificador {
"reverter": "reverse",
"alternar": "alternate",
"alternar-reverter": "alternate-reverse",
'infinite': 'infinito',
'infinito': 'infinite',
"nenhum": "none",
"para-frente": "forwards",
"para-tras": "backwards",
Expand Down
2 changes: 1 addition & 1 deletion fontes/modificadores/estilo-borda.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { validarValoresAdicionais } from "./validacoes/condicao-extra";
export class EstiloBorda extends Modificador {
// Seletor de Atribuição Abreviada (Shorthand).
// Pode receber de 1 a 4 valores.

valoresAceitos = estilos;
constructor(valor: string, quantificador: string, pragmas?: PragmasModificador) {
super("estilo-borda", "border-style", pragmas);

Expand Down
9 changes: 8 additions & 1 deletion fontes/serializadores/serializador.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,14 @@ export class Serializador {
};\n`;
}

// Caso 4: É um valor genérico, cuja tradução está na lista 'valoresGerais'.
// Caso 4: Atribuição Abreviada | Múltiplos valores
if (modificador.valor.includes(' ')) {
return `${" ".repeat(indentacao)}${modificador.propriedadeCss}: ${
modificador.valor
};\n`;
}

// Caso 5: É um valor genérico, cuja tradução está na lista 'valoresGerais'.
const valorTraduzido = valoresGerais[modificador.valor];
return `${" ".repeat(indentacao)}${
modificador.propriedadeCss
Expand Down
146 changes: 97 additions & 49 deletions testes/listas/atribuicao-abreviada.ts
Original file line number Diff line number Diff line change
@@ -1,68 +1,116 @@
export const AtribuiçãoAbreviada: Array<string> = [
'animacao',
'animação',
'borda',
'borda-em-bloco',
'fim-borda-em-bloco',
'inicio-borda-em-bloco',
'início-borda-em-bloco',
'borda-inferior',
'cor-borda',
'borda-em-linha',
'fim-borda-em-linha',
'inicio-borda-em-linha',
'início-borda-em-linha',
'borda-esquerda',
export const AtribuicaoAbreviadaVQePR: Array<object> = [
{
modificador: 'animacao',
valor: '3s alternar 1s deslizar',
},
{
modificador: 'animação',
valor: '3s alternar 1s deslizar',
},
{
modificador: 'borda',
valor: '2px pontilhado',
},
{
modificador: 'borda-direita',
valor: '2px pontilhado',
},
{
modificador: 'borda-em-bloco',
valor: '2px pontilhado',
},
{
modificador: 'borda-em-linha',
valor: '2px pontilhado',
},
{
modificador: 'borda-esquerda',
valor: '2px pontilhado',
},
{
modificador: 'borda-inferior',
valor: '2px pontilhado',
},
{
modificador: 'borda-superior',
valor: '2px pontilhado',
},
{
modificador: 'colunas',
valor: '6rem auto',
},
{
modificador: 'contorno',
valor: '1rem grossa',
},
{
modificador: 'fim-borda-em-bloco',
valor: '2px pontilhado',
},
{
modificador: 'fim-borda-em-linha',
valor: '2px pontilhado',
},
{
modificador: 'inicio-borda-em-bloco',
valor: '2px pontilhado',
},
{
modificador: 'início-borda-em-bloco',
valor: '2px pontilhado',
},
{
modificador: 'inicio-borda-em-linha',
valor: '2px pontilhado',
},
{
modificador: 'início-borda-em-linha',
valor: '2px pontilhado',
},
];

export const AtribuicaoAbreviadaPR: Array<string> = [
'contorno',
'borda-direita',
'borda-esquerda',
'borda-inferior',
'decoracao-texto',
'decoração-texto',
'estilo-borda',
'borda-superior',
'sombra-caixa',
'regras-coluna',
'posicionar-conteudo',
'posicionar-itens',
]

export const AtribuicaoAbreviadaVQ: Array<string> = [
'colunas',
'deslocamento',
'flex',
'fonte',
'insercao',
'inserção',
'estilo-lista',
'margem',
'mascara',
'máscara',
'borda-mascara',
'borda-máscara',
'contorno',
'recuo',
'recuo-em-linha',
'posicionar-itens',
'margem-rolagem-mouse',
'decoracao-texto',
'decoração-texto',
'transicao',
'transição',
'regras-coluna',
'posicionar-conteudo',
'posicionar-se',
'raio-borda',
'inserção-em-bloco',
'insercao-em-linha',
'margem',
'margem-em-bloco',
'margem-em-linha',
'recuo-em-bloco',
'margem-rolagem-mouse',
'margem-em-bloco-rolagem-mouse',
'margem-em-linha',
'margem-em-linha-rolagem-mouse',
'recuo-rolagem-mouse',
'margem-rolagem-mouse',
'raio-borda',
'recuo',
'recuo-em-bloco',
'recuo-em-bloco-rolagem-mouse',
'recuo-em-linha',
'recuo-em-linha-rolagem-mouse',
'linha-em-grade',
'coluna-em-grade',
'deslocamento',
'vazamento',
'modelo-em-grade',
'fundo',
];
'recuo-rolagem-mouse',
]

/*

QUANTOS ATRIBUTOS RECEBE CADA UM DESSES SELETORES?
PR = Palavras Reservadas
VQ = Valor-Quantificador

ATÉ QUANTOS ATRIBUTOS RECEBE CADA UM DESSES SELETORES?

animacao (8)
borda (3)
Expand Down
20 changes: 20 additions & 0 deletions testes/listas/valor-numerico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,26 @@ export const ValorNumerico: Array<string> = [
'coluna-em-grade',
];

export const ValorNumericoApenas: Array<string> = [
'linhas-superiores',
'repetir-animacao',
'repetir-animação',
'contar-coluna',
'flex-crescimento',
'flex-reduzir',
'ajustar-tamanho-fonte',
'espessura-fonte',
'fim-coluna-em-grade',
'inicio-coluna-em-grade',
'início-coluna-em-grade',
'fim-linha-em-grade',
'inicio-linha-em-grade',
'início-linha-em-grade',
'ordenar',
'linhas-inferiores',
];


// A lista abaixo inclui modificadores que aceitam tanto somente valores numéricos
// quanto valores numéricos c/ quantificador.
export const ValorNumericoComQuantificador = [
Expand Down
Loading
Loading