Best practice: generování obsahu z Texy (TOC)?
- Aurielle
- Člen | 1281
Zdravím, máte nějaký „best practice“ na generování table of contents z Texy?
Potřeboval bych trochu nakopnout správným směrem, zatím se mi podařilo jen něco takovéhoto:
<div id="toc">
<h4>Obsah</h4>
<ul>
{foreach $texy->headingModule->TOC as $item}
<li{if $item['level'] > 3} style="margin-left: 1.5em;"{/if}><a href="#{$item['el']->attrs['id']}">{$item['title']}</a></li>
{/foreach}
</ul>
</div>
To, co bych potřeboval, je generování obsahu stejným způsobem jako je tady na wiki.
Předem díky za odpovědi.
Editoval gmvasek (7. 10. 2009 20:43)
- Tomik
- Nette Evangelist | 485
Toto patří spíše do Texy! fóra, dokonce se tam něco podobného řešilo, ale ne moc úspěšně…
- Aurielle
- Člen | 1281
Náhodným hledáním jsem našel toto, veškeré kredity k následujícímu kódu patří tedy Jiřímu Honovi:
Metoda do presenteru:
Kód předpokládá naplněnou proměnnou $this->texy instancí Texy a před
voláním této metody je nutné projet cílový text metodou
$texy->process(). $level jsem si změnil z 0 na 3, to je strop nadpisů
v Texy ($texy->headingModule->top).
/**
* Generates TOC
* @return string|FALSE
*/
final public function generateToc()
{
if(!$this->texy->headingModule->TOC)
{
return FALSE;
}
$toc = TexyHTML::el('ul');
$lists[0] = $toc;
$aList = 0;
$level = 3;
foreach ($this->texy->headingModule->TOC as $heading)
{
if ($heading['level'] > $level)
{
for ($level; $heading['level'] > $level; ++$level)
{
if ($lists[$aList]->count() != 0)
{
$ul = $lists[$aList][$lists[$aList]->count() - 1]->create('ul');
}
else
{
$li = $lists[$aList]->create('li');
$ul = $li->create('ul');
}
$lists[] = $ul;
}
$aList = count ($lists) - 1;
}
elseif ($heading['level'] < $level)
{
$diff = $level - $heading['level'];
$lists = array_slice ($lists, 0, - $diff);
$level = $heading['level'];
}
$aList = count ($lists) - 1;
$li = $lists[$aList]->create('li');
$a = $li->create('a')->href('#' . $heading['el']->attrs['id'])->setText($heading['title']);
}
return $toc->toHtml($this->texy);
}
Editoval gmvasek (8. 10. 2009 16:39)