Jak zjistit hodnotu href atributu ve vlastním makru? bug/feature

ic
Člen | 430
+
0
-

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
+
+1
-

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
+
0
-

@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é :(