Best practice: generování obsahu z Texy (TOC)?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Aurielle
Člen | 1281
+
0
-

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

Toto patří spíše do Texy! fóra, dokonce se tam něco podobného řešilo, ale ne moc úspěšně…

https://forum.texy.info/…rovani-obsah

Aurielle
Člen | 1281
+
0
-

Zmíněné téma jsem viděl, ale píšu to sem i z toho důvodu, že David ten obsah používá tady…

Kdyby někdo věděl jak na to, prosím ozvěte se :)

Aurielle
Člen | 1281
+
0
-

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)