Hoa central
Tableofcontents.php
Go to the documentation of this file.
1 <?php
2 
37 namespace Hoa\Xyl\Interpreter\Html;
38 
39 use Hoa\Stream;
40 
49 class Tableofcontents extends Generic
50 {
56  protected $_headings = [];
57 
58 
59 
66  protected function paint(Stream\IStream\Out $out)
67  {
68  $this->writeAttribute('class', 'toc');
69  $out->writeAll('<ol' . $this->readAttributesAsString() . '>');
70 
71  $links = $this->selectChildElements('a');
72 
73  if (!empty($links)) {
74  foreach ($links as $link) {
75  $out->writeAll('<li>');
76  $this->getConcreteElement($link)->render($out);
77  $out->writeAll('</li>');
78  }
79 
80  $out->writeAll('</ol>');
81 
82  return;
83  }
84 
85  if (empty($this->_headings)) {
86  $out->writeAll('</ol>');
87 
88  return;
89  }
90 
91  $n = 1;
92  $first = true;
93 
94  foreach ($this->_headings as $heading) {
95  $ni = $heading->getLevel();
96 
97  if (true === $first) {
98  $n = $ni;
99  }
100 
101  if ($n < $ni) {
102  for ($i = $ni - $n - 1; $i >= 0; --$i) {
103  $out->writeAll('<ol class="toc toc-depth-' . $ni . '">');
104  }
105  } elseif ($n > $ni) {
106  $out->writeAll('</li>');
107 
108  for ($i = $n - $ni - 1; $i >= 0; --$i) {
109  $out->writeAll('</ol></li>');
110  }
111  } elseif (false === $first) {
112  $out->writeAll('</li>');
113  } else {
114  $first = false;
115  }
116 
117  $n = $ni;
118 
119  $out->writeAll('<li>');
120 
121  if (true === $heading->attributeExists('id')) {
122  $out->writeAll('<a href="#' . $heading->readAttribute('id') . '">');
123  $heading->computeTransientValue($out);
124  $out->writeAll('</a>');
125  } else {
126  $heading->computeTransientValue($out);
127  }
128  }
129 
130  for ($i = $n - 2; $i >= 0; --$i) {
131  $out->writeAll('</li></ol>');
132  }
133 
134  return;
135  }
136 
143  public function addHeading(Heading $heading)
144  {
145  $this->_headings[] = $heading;
146 
147  return;
148  }
149 
155  public function getHeadings()
156  {
157  return $this->_headings;
158  }
159 }