soo_toc Page 3 of 3

soo_toc source code

 1 : if(class_exists('\Textpattern\Tag\Registry')) {
 2 :     Txp::get('\Textpattern\Tag\Registry')
 3 :         ->register('soo_toc');
 4 : }
 5 : 
 6 : function soo_toc$atts ) {
 7 : 
 8 :     global $thisarticle;
 9 :     assert_article();
10 : 
11 :     extract(lAtts(array(
12 :         'label'         => '',
13 :         'labeltag'      => '',
14 :         'break'         => 'li',
15 :         'wraptag'       => 'ul',
16 :         'class'         => 'toc',
17 :         'level'         => 6,
18 :         'full_url'      => '',
19 :     ), $atts));
20 : 
21 :     $full_url $full_url permlinkurl($thisarticle) : '';
22 : 
23 :     $pattern '/<h(\d)[^>]+?id\s*=\s*"([\w-]+)"[^>]*>(.+?)<\\/h\\1/';
24 :     preg_match_all($pattern$thisarticle['body'], $headingsPREG_SET_ORDER);
25 : 
26 :     $items = array();
27 : 
28 :     foreach ( $headings as $h )
29 :         if ( $h[1] <= $level ) {
30 :             $filtered[] = $h;
31 :             $items[] = '<a href="' $full_url '#' $h[2] . '">' $h[3] . '</a>';
32 :         }
33 : 
34 :     if ( !$items )
35 :         return;
36 : 
37 :     if ( $wraptag != 'ul' && $wraptag != 'ol' )
38 :         return doLabel($label$labeltag) . doWrap($items$wraptag$break$class);
39 : 
40 :     $nest_level 1;
41 :     $lines[] = soo_toc_prepend('<li>' $items[0], t$nest_level);
42 : 
43 :     for ($i 1$i count($items); $i++) {
44 :         $level_change $filtered[$i][1] - $filtered[$i-1][1];
45 :         if ($level_change 0)
46 :             for ($j 1$j <= $level_change$j++) {
47 :                 $lines[] = soo_toc_prepend("<$wraptag>"t$nest_level).
48 :                     ($level_change $j '<li>' '');
49 :                 $nest_level ++;
50 :             }
51 :         elseif ($level_change 0)
52 :             for ($j 1$j <= -$level_change$j++) {
53 :                 $nest_level --;
54 :                 $lines[] = soo_toc_prepend("</$wraptag></li>"t$nest_level);
55 :             }
56 :         $lines[] = soo_toc_prepend('<li>' $items[$i], t$nest_level);
57 :     }
58 : 
59 :     while ($nest_level 1) {
60 :         $nest_level --;
61 :         $lines[] = soo_toc_prepend("</$wraptag></li>"t$nest_level);
62 :     }
63 : 
64 :     for ($i 0$i count($lines)-1$i++)
65 :         if ( preg_match('/<li>/'$lines[$i])
66 :             && !preg_match("/<$wraptag>/"$lines[$i+1]) )
67 :                 $lines[$i] .= '</li>';
68 : 
69 :     if ( !preg_match("/<\/$wraptag>/"$lines[count($lines)-1]) )
70 :         $lines[count($lines)-1] .= '</li>';
71 : 
72 :     $out '<' $wraptag . ( $class ' class="' $class '">' '>' )
73 :         . join(n$lines) . "</$wraptag>" n;
74 : 
75 :     return doLabel($label$labeltag) . $out;
76 : }
77 : 
78 : function soo_toc_prepend($base$add$times) {
79 :     for ( $i 1$i <= $times$i++ )
80 :         $base $add $base;
81 :     return $base;
82 : }