-
Notifications
You must be signed in to change notification settings - Fork 2
/
serializador-reverso.ts
78 lines (64 loc) · 2.63 KB
/
serializador-reverso.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { Declaracao } from "../declaracoes";
import { Modificador } from "../modificadores";
import { Metodo } from "../valores/metodos/metodo";
/**
* O serializador reverso traduz de CSS para FolEs. Pode traduzir tanto FolEs
* aninhado quanto desaninhado.
*/
export class SerializadorReverso {
serializarComAninhamentos: boolean;
constructor(serializarComAninhamentos: boolean = true) {
this.serializarComAninhamentos = serializarComAninhamentos;
}
serializarModificador(modificador: Modificador, indentacao: number = 0): string {
let quantificador = "";
if (modificador.hasOwnProperty("quantificador")) {
quantificador = modificador.quantificador;
}
let valor = "";
if (modificador.valor instanceof Metodo) {
valor = (<Metodo>modificador.valor).paraTexto();
} else {
valor = modificador.valor;
}
return " ".repeat(indentacao) +
`${Array.isArray(modificador.nomeFoles) ? modificador.nomeFoles[0] : modificador.nomeFoles}: ${valor}${quantificador};\n`;
}
serializar(declaracoes: Declaracao[], indentacao: number = 0, seletorAnterior: string = undefined) {
let resultado = "";
let textoSeletorAnterior = "";
if (seletorAnterior !== undefined) {
textoSeletorAnterior = seletorAnterior;
}
for (const declaracao of declaracoes) {
const prefixos = [];
for (const seletor of declaracao.seletores) {
const prefixo = (textoSeletorAnterior + " " + seletor.paraTexto()).trimStart();
prefixos.push(prefixo);
resultado += " ".repeat(indentacao) + prefixo + ', ';
}
resultado = resultado.slice(0, -2);
resultado += ' {\n';
for (const modificador of declaracao.modificadores) {
resultado += this.serializarModificador(modificador, indentacao + 4);
}
if (this.serializarComAninhamentos) {
resultado += this.serializar(
declaracao.declaracoesAninhadas,
indentacao + 4
);
resultado += `${" ".repeat(indentacao)}}\n\n`;
} else {
resultado += `${" ".repeat(indentacao)}}\n\n`;
for (const prefixo of prefixos) {
resultado += this.serializar(
declaracao.declaracoesAninhadas,
indentacao,
prefixo
);
}
}
}
return resultado;
}
}