Jak implementovat Texy v nette/tutorial-quickstart?

- buffus
 - Člen | 101
 
PHP 8.0, Nette 3.1, Texy 3.1
Ahoj, prosím o radu.
1. V rozchozené aplikaci tutoriálu nette/tutorial-quickstart v3.1 (Píšeme první aplikaci) jsem si upravil v databázi content článku Article One do Texy syntaxe:
Vítejte!
--------
Můžete používat syntax Texy!, pokud Vám vyhovuje:
- třeba **tučné** písmo nebo *kurzíva*
- a takto se dělá "odkaz":https://texy.nette.org
- více najdete na stránce "syntax":[syntax]
2. upravil v Homepage/default.latte
{$post->content} na:
{$post->content|texy|noescape}
3. přidal do composer.json
"texy/texy": "^3.1":
composer require texy/texy
4. a přidal do common.neon :
services:
	nette.latteFactory:
		setup:
			- addFilter('texy', [\Texy(), process])
Nyní Texy funguje.
Chtěl bych však ještě Texy konfigurovat, např.:
$texy = new Texy\Texy;
$texy->headingModule->generateID = true;
Ale nevím, kam a jak to v tom quickstartu napsat?
Editoval buffus (6. 8. 2021 7:18)

- IJVo
 - Člen | 40
 
Ahoj, já mám v config.neon (tvůj common.neon):
services:
	texy:
		class: Texy\Texy
V BasePresenter.php mám injectnuté to Texy a pak ve funkci startup mám tu konfiguraci:
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
	/** @var \Texy\Texy @inject */
	public $texy;
	protected function startup()
	{
		parent::startup();
		$this->texy->allowed['table'] = true;
        $texy->headingModule->generateID = true;
	}
}
A tím mám Texy ve všech Presenterech. Pokud je potřebuji v komponentě, tak si je tam předávám přes constructor.
V Presenteeru, kde chci Texy použít, tak dávám do funkce createTemplate
to nastavení addFilter() -protože to nechci všude.
Ty to máš v common.neon – jen by tam asi mělo být taky Texy\Texy().
I když to má David asi ošetřené, protože to funguje i jen s Texy()
	protected function createTemplate(): \Nette\Application\UI\ITemplate
	{
		$template = parent::createTemplate();
		$template->addFilter('texy', [$this->texy, 'process']);
		return $template;
	}
				
- buffus
 - Člen | 101
 
Díky moc za odpověď.
Tvým způsobem, který výše popisuješ, mám implementované Texy dosud na vlastním projektu (na PHP 7.3). Teď přecházím na PHP 8.0 a aktuální knihovny uvedené v quickstartu pro Nette 3.1 a trochu refaktoruji.
(Implementaci Texy se snažím demonstrovat pro zjednodušení či pro ostatní na funkční aplikaci nette/tutorial-quickstart v3.1.)
Tebou popisované řešení (včetně konfigurace Texy) mi funguje i na PHP 8.0 a Nette v3.1, avšak IDE (VS Code) mi hlásí v:
protected function createTemplate(): Nette\Application\UI\ITemplate
{
	$template = parent::createTemplate();
	$template->addFilter('texy', [$this->texy, 'process']);
	return $template;
}
'Nette\Application\UI\ITemplate is deprecated.
To tedy přepisuji na doporučené Nette\Application\UI\Template
(To je OK.).
Ale stále mi IDE hlásí pro:
$template->addFilter('texy', [$this->texy, 'process']);
Undefined method ‚addFilter‘. (Ale přesto
mi tento způsob implementace Texy (filtru texy v Latte) funfuje, to moc
nechápu.)
IDE hlásí Undefined method ‚addFilter‘ asi proto, že
metoda ‚addFilter‘ je v Latte\Engine
a ne v Nette\Application\UI\Template.
To červeně podtržené Undefined method ‚addFilter‘ se mi ale v IDE nelíbí…
Já si pořád myslím, že ta konfigurace Texy by měla jít rovnou
i cestou v souboru common.neon a klíč k řešení zápisu je
někde dle vzoru (setup database) tady:
https://doc.nette.org/…ion/services#…
Ale pořád si mi tu konfiguraci nedaří napsat…

- Martk
 - Člen | 661
 
Nejlepší řešení je vytvořit si factory na texy (včetně interface, ale tady dám pro rychlost bez interface)
class TexyFactory {
	public function create() { return new Texy(); } // upravíš podle sebe
}
Zaregistruješ službu:
services:
	- TexyFactory
Uděláš filter loader:
class LatteFilterLoader {
	public function __construct(TexyFactory $texyFactory) {
		$this->texy = $texyFactory->create();
	}
	public function load(string $name): ?callable {
		return $name !== 'load' && method_exists($this, $name) ? [$this, $name] : null;
	}
	public function texy(string $content): string { ... }
}
a zaregistruješ do configu
services:
	filterLoader: LatteFilterLoader
	latte.latteFactory:
		setup:
			- addFilterLoader([@filterLoader, 'load'])
Filtr ti teď bude fungovat kdekoliv. Jinak k tvému Undefined method ‚addFilter‘ stačí udělat toto:
assert($template instanceof Nette\Bridges\ApplicationLatte\Template);