Jak zjistit hodnotu href atributu ve vlastním makru? bug/feature
- ic
- Člen | 430
Zdravíčko, snažím se vytvořit vlastní makro atribut
n:integrity
, který by podobně jako n:nonce
(přidávající nonce) spočítal a přidal subresource integrity check.
Narazil jsem tam ale na problém, kde si nejsem jistý jestli jde o bug nebo feature, případně jestli dělám něco špatně… totiž:
public static function install(Compiler $compiler)
{
$me = new static($compiler);
$me->addMacro('integrity', null, null, [$me, 'generateSubresourceIntegrity']);
}
public function generateSubresourceIntegrity(MacroNode $node, PhpWriter $writer)
{
$href = $node->htmlNode->attrs['href'];
// …
}
Takhle nějak vypadá kód, při
<link rel="stylesheet" href="/css/min.css" n:integrity>
je
v proměnné $href
očekávaně /css/min.css
jenže
při
<link rel="stylesheet" href="{$basePath}/css/min.css" n:integrity>
tam je 1
, prostě číslo 1, je možné je to to true, a převodem
na string se z toho stane 1, ale tak jak tak je to něco co jsem nechtěl.
Takže co s tím? je to bug? případně jak získat hodnotu
href
spolehlivě?
Editoval ic (13. 3. 2020 15:45)
- David Matějka
- Moderator | 6445
ahoj,
spolehlivě získáš hodnotu atributu pouze v runtime. makra se zpracovávají
v compile time a jejich úkolem je vygenerovat php kód, který zpracuje tu
runtime hodnotu. to má v tomto případě zase tu nevýhodu, že to bude
dělat IO
v tomhle případě by asi bylo nejvhodnější, aby se v šabloně to psalo bez $basePath (respketive zcela bez promennych, abys podporoval jen statický string) a to makro tu proměnnou doplnilo $basePath
- ic
- Člen | 430
@DavidMatějka díky, asi tedy budu postupovat podle doporučení a psát to jako string.
Ještě mě napadlo něco jako
<link rel="stylesheet" href="{$basePath}/css/min.css" n:integrity="$basePath/css/min.css">
a brát to přes $node->tokenizer->fetchWord();
tam už
všechno funguje podle očekávání a v mám stejnou hodnotu jako v href
s dosazeným $basePath. Ale zase zbytečně je tam duplicitní zápis, což se
mi taky nelíbí… asi jsem náročný :D
Kdyby mi to $node->htmlNode->attrs['href'];
vracel
alespoň jako řetězec bez dosazeného hodnoty proměnné, bylo by to pořád
lepší než 1
, to mi tam vrtá hlavou asi nejvíce.
Asi ale žádné řešení není prostě dokonalé :(