Version 1
[yaffs-website] / vendor / cebe / markdown / block / TableTrait.php
diff --git a/vendor/cebe/markdown/block/TableTrait.php b/vendor/cebe/markdown/block/TableTrait.php
new file mode 100644 (file)
index 0000000..bd4d9fe
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+/**
+ * @copyright Copyright (c) 2014 Carsten Brandt
+ * @license https://github.com/cebe/markdown/blob/master/LICENSE
+ * @link https://github.com/cebe/markdown#readme
+ */
+
+namespace cebe\markdown\block;
+
+/**
+ * Adds the table blocks
+ */
+trait TableTrait
+{
+       private $_tableCellTag = 'td';
+       private $_tableCellCount = 0;
+       private $_tableCellAlign = [];
+
+       /**
+        * identify a line as the beginning of a table block.
+        */
+       protected function identifyTable($line, $lines, $current)
+       {
+               return strpos($line, '|') !== false && preg_match('~|.*|~', $line) && isset($lines[$current + 1]) && preg_match('~^[\s\|\:-]+$~', $lines[$current + 1]);
+       }
+
+       /**
+        * Consume lines for a table
+        */
+       protected function consumeTable($lines, $current)
+       {
+               // consume until newline
+
+               $block = [
+                       'table',
+                       'cols' => [],
+                       'rows' => [],
+               ];
+               $beginsWithPipe = $lines[$current][0] === '|';
+               for ($i = $current, $count = count($lines); $i < $count; $i++) {
+                       $line = $lines[$i];
+
+                       if ($i == $current+1) { // skip second line
+                               $cols = explode('|', trim($line, ' |'));
+                               foreach($cols as $col) {
+                                       $col = trim($col);
+                                       if (empty($col)) {
+                                               $block['cols'][] = '';
+                                               continue;
+                                       }
+                                       $l = ($col[0] === ':');
+                                       $r = (substr($col, -1, 1) === ':');
+                                       if ($l && $r) {
+                                               $block['cols'][] = 'center';
+                                       } elseif ($l) {
+                                               $block['cols'][] = 'left';
+                                       } elseif ($r) {
+                                               $block['cols'][] = 'right';
+                                       } else {
+                                               $block['cols'][] = '';
+                                       }
+                               }
+
+                               continue;
+                       }
+                       if (trim($line) === '' || $beginsWithPipe && $line[0] !== '|') {
+                               break;
+                       }
+                       if (substr($line, -2, 2) !== '\\|' || substr($line, -3, 3) === '\\\\|') {
+                               $block['rows'][] = trim($line, '| ');
+                       } else {
+                               $block['rows'][] = ltrim($line, '| ');
+                       }
+               }
+
+               return [$block, --$i];
+       }
+
+       /**
+        * render a table block
+        */
+       protected function renderTable($block)
+       {
+               $content = '';
+               $this->_tableCellAlign = $block['cols'];
+               $content .= "<thead>\n";
+               $first = true;
+               foreach($block['rows'] as $row) {
+                       $this->_tableCellTag = $first ? 'th' : 'td';
+                       $align = empty($this->_tableCellAlign[$this->_tableCellCount]) ? '' : ' align="' . $this->_tableCellAlign[$this->_tableCellCount++] . '"';
+                       $tds = "<$this->_tableCellTag$align>" . $this->renderAbsy($this->parseInline($row)) . "</$this->_tableCellTag>"; // TODO move this to the consume step
+                       $content .= "<tr>$tds</tr>\n";
+                       if ($first) {
+                               $content .= "</thead>\n<tbody>\n";
+                       }
+                       $first = false;
+                       $this->_tableCellCount = 0;
+               }
+               return "<table>\n$content</tbody>\n</table>\n";
+       }
+
+       /**
+        * @marker |
+        */
+       protected function parseTd($markdown)
+       {
+               if (isset($this->context[1]) && $this->context[1] === 'table') {
+                       $align = empty($this->_tableCellAlign[$this->_tableCellCount]) ? '' : ' align="' . $this->_tableCellAlign[$this->_tableCellCount++] . '"';
+                       return [['text', "</$this->_tableCellTag><$this->_tableCellTag$align>"], isset($markdown[1]) && $markdown[1] === ' ' ? 2 : 1]; // TODO make a absy node
+               }
+               return [['text', $markdown[0]], 1];
+       }
+
+       abstract protected function parseInline($text);
+       abstract protected function renderAbsy($absy);
+}