Oznámení
Meta informace v Texy textu
před 11 lety
- pekarna
- Člen | 46
Zdravím,
je možné do Texy textu zadat metainformace? Podobně, jako můžu
vytáhnout $texy->headingModule->title
, chtěl bych
něco jako
$texy->metainfoModule->data['Priority'];
A v samotném kódu bych to viděl podobně jako HTTP hlavičky,
případně uvozené např. @@metainfo
nebo vložené do
/--meta
nebo tak něco:
@@metainfo
Priority: 1
Comments: allowed
Link-base: https://texy.info/
Texy tutorial
*************
Je už něco takového možné?
Díky, Ondra
před 11 lety
- David Grudl
- Nette Core | 6806
Je to možné například via scriptModule:
Pak by takové metainformace měly podobu např.:
{{Priority: 1}}
{{Comments: allowed}}
{{Link-base: https://texy.info/}}
Texy tutorial
*************
před 11 lety
- pekarna
- Člen | 46
Takové řešení ale vyžaduje jakousi callback-funkci a předávání jejího kontextu s vycucnutými daty spolu s objektem texy (potřebuji vygenerovaný HTML kód + ty informace).
Jestli to tedy dobře chápu, modul, který by sám při parsování texy
zdroje tyto informace detekoval a zpřístupnil podobně jako
$texy->headingModule->title
v Texy není, je to tak?
před 11 lety
- David Grudl
- Nette Core | 6806
Přesně tak. Implementace je zcela triviální. Elegantně to lze řešit třeba děděním třídy:
class WikiTexy extends Texy
{
public $directives = array();
public function __construct()
{
parent::__construct();
$this->addHandler('script', array($this, 'scriptHandler'));
}
/**
* @param TexyHandlerInvocation handler invocation
* @param string command
* @param array arguments
* @param string arguments in raw format
* @return TexyHtml|string|FALSE
*/
public function scriptHandler($invocation, $cmd, $args, $raw)
{
$this->directives[$cmd] = $raw;
return '';
}
}
$texy = new WikiTexy;
$html = $texy->process($text);
// direktivy jsou v $texy->directives
Nebo některé direktivy můžou ovlivňovat další zpracování textu.
Například {{nofollow:yes}}
a {{nofollow:no}}
bude
měnit atribut $texy->linkModule->forceNoFollow
:
public function scriptHandler($invocation, $cmd, $args, $raw)
{
switch ($cmd) {
case 'nofollow':
$this->linkModule->forceNoFollow = ($args[0] === 'yes');
break;
default:
$this->directives[$cmd] = $raw;
}
return '';
}
Možnosti jsou neomezené :-)
před 11 lety
- pekarna
- Člen | 46
Zdravím,
píšu na to modul, ale potřeboval bych postrčit… nevím přesně, jak vevnitř texy funguje.
Chci na začátku souboru (textu) chytit data z takovéhoto bloku:
@meta<\n>
Metainfo1: value<\n>
Metainfo2: value<\n>
<\n>
Zkoušel jsem block pattern '#^@meta\n(.*)\n\n$#mU',
, ale ten
nejde.
Jediné, co mi ještě obsah chytne, je '#^@meta(.*)$#mU',
.
Mohl byste prosím releasnout trochu svého know-how? ;-)
Díky, Ondra
před 11 lety
- pekarna
- Člen | 46
Už to asi mám. Texy sám hledá bloky podle entrů a do textu pro
preg_match už okolní entry nedává. Takže řešení je nejspíš
'#^@meta\n(.*)$#mU',
.
Edit: Tak není – vezme jen první řádku. Koumám dál :-)
Edit: Ha! '#^@meta\n(.*)\n\n$#ms',
Ještě by mě zajímalo, jestli si parser vede vnitřní informace o tom, kolikátý blok parsuje, případně pozici od začátku – abych mohl chtít zpracovat blok jen na úplném začátku souboru. $parser->offset je jednak private a jednak se vztahuje k začátku bloku.
Editoval pekarna (7. 3. 2008 20:09)
před 11 lety
- pekarna
- Člen | 46
Takže jsem napsal modul přesně podle zadání na začátku tohoto vlákna.
Nechcete ho začlenit do Texy?
před 11 lety
- David Grudl
- Nette Core | 6806
Do Texy se snažím začlenit jen funkce, které využije velké procento uživatelů. Ale přidal jsem do fóra nové téma Vaše tipy a rozšíření a budu rád, pokud tam své řešení popíšeš.
před 11 lety
- pekarna
- Člen | 46
IMHO tohle je celkem využitelná funkce pro ty, kdož neukládají texy texty do databáze, ale na disku. Lze tak do nich uložit to, co by jinak bylo v ostatních sloupcích. Krom toho by se mohlo jednat o vhodný doplněk k funkci skriptů – v podstatě opačná funkce: Získávání dat Z texy dokumentu, nikoliv jejich vkládání do něj.
Editoval pekarna (9. 3. 2008 7:56)