Aspas em atributos
Como escapar aspas em atributos sem quebrar parser.
Atributos HTML — incluindo os atributos :prop="..." dos componentes
mad-* — usam aspas como delimitador. Não existe sequência de
escape \" em HTML. Dentro de um atributo delimitado por
"...", o primeiro " encontrado termina o valor — qualquer
\" que você escrever é interpretado como o caractere \
literal seguido do fim do atributo.
Isso afeta diretamente o MadGridCompiler: quando você escreve
:prop="[...]" e o conteúdo da expressão precisa conter aspas duplas, o
compilador faz o parse do atributo como HTML puro e recebe o valor já truncado no
primeiro " — antes mesmo de a expressão PHP ser avaliada.
Sintoma
<!-- ERRADO: compila para algo como "'in', \," com o resto truncado -->
<mad-pivot-table :filters="[['regiao', 'in', \"('Sul', 'Sudeste')\"]]">
No .bladec compilado aparece algo como:
["filters"=>[['regiao', 'in', \,"pivot_fields"=>[...]]
O parser leu [['regiao', 'in', \ e parou no primeiro ". O
resto do array some, e o PHP quebra com ParseError: unexpected token "\",
expecting "]".
Solução — "
Use a entidade HTML " em vez de \" para
representar aspas duplas dentro de um atributo delimitado por ":
<!-- CERTO -->
<mad-pivot-table :filters="[['regiao', 'in', "('Sul', 'Sudeste')"]]">
Alternativa — trocar o delimitador do atributo
Se preferir aspas duplas no conteúdo, delimite o atributo com aspas simples:
<!-- CERTO -->
<mad-pivot-table :filters='[["regiao", "in", "(\'Sul\', \'Sudeste\')"]]'>
Ou ainda — preferencialmente, para expressões complexas — pré-computar a expressão
num bloco @php e passar pela variável:
@php
$filters = [['regiao', 'in', "('Sul', 'Sudeste')"]];
@endphp
<mad-pivot-table :filters="$filters" ... />
NUNCA fazer
<!-- ERRADO: \" não é escape válido em atributo HTML -->
<mad-pivot-table :filters="[['x', 'in', \"('a')\"]]" />
<!-- ERRADO: dupla camada de escape tentando compensar -->
<mad-pivot-table :filters="[['x', 'in', \\\"('a')\\\"]]" />
<!-- CERTO: " -->
<mad-pivot-table :filters="[['x', 'in', "('a')"]]" />
<!-- CERTO: @php pré-computa a expressão -->
@php $f = [['x', 'in', "('a')"]]; @endphp
<mad-pivot-table :filters="$f" />
Regra geral
Dentro de um atributo HTML/Blade, para incluir literalmente o mesmo caractere usado como delimitador, use a entidade HTML correspondente — nunca uma barra invertida:
| Delimitador | Incluir literalmente | Entidade |
|---|---|---|
"..." | " | " |
'...' | ' | ' ou ' |
| qualquer | < | < |
| qualquer | > | > |
| qualquer | & | & |
Não existe \", \', \n etc. em HTML. Sempre
entidades — ou, melhor ainda, pré-computar a expressão num bloco @php e
passar por variável, evitando o problema por completo.