123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- <?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\latex;
- use cebe\markdown\block\FencedCodeTrait;
- use cebe\markdown\block\TableTrait;
- use cebe\markdown\inline\StrikeoutTrait;
- use cebe\markdown\inline\UrlLinkTrait;
- /**
- * Markdown parser for github flavored markdown.
- *
- * - uses the [tabularx](http://www.ctan.org/pkg/tabularx) environment for tables.
- *
- * @author Carsten Brandt <mail@cebe.cc>
- */
- class GithubMarkdown extends Markdown
- {
- // include block element parsing using traits
- use TableTrait;
- use FencedCodeTrait;
- // include inline element parsing using traits
- use StrikeoutTrait;
- use UrlLinkTrait;
- /**
- * @var boolean whether to interpret newlines as `<br />`-tags.
- * This feature is useful for comments where newlines are often meant to be real new lines.
- */
- public $enableNewlines = false;
- /**
- * @inheritDoc
- */
- protected $escapeCharacters = [
- // from Markdown
- '\\', // backslash
- '`', // backtick
- '*', // asterisk
- '_', // underscore
- '{', '}', // curly braces
- '[', ']', // square brackets
- '(', ')', // parentheses
- '#', // hash mark
- '+', // plus sign
- '-', // minus sign (hyphen)
- '.', // dot
- '!', // exclamation mark
- '<', '>',
- // added by GithubMarkdown
- ':', // colon
- '|', // pipe
- ];
- /**
- * Consume lines for a paragraph
- *
- * Allow headlines, lists and code to break paragraphs
- */
- protected function consumeParagraph($lines, $current)
- {
- // consume until newline
- $content = [];
- for ($i = $current, $count = count($lines); $i < $count; $i++) {
- $line = $lines[$i];
- if (!empty($line) && ltrim($line) !== '' &&
- !($line[0] === "\t" || $line[0] === " " && strncmp($line, ' ', 4) === 0) &&
- !$this->identifyHeadline($line, $lines, $i) &&
- !$this->identifyUl($line, $lines, $i) &&
- !$this->identifyOl($line, $lines, $i))
- {
- $content[] = $line;
- } else {
- break;
- }
- }
- $block = [
- 'paragraph',
- 'content' => $this->parseInline(implode("\n", $content)),
- ];
- return [$block, --$i];
- }
- /**
- * @inheritdoc
- */
- protected function renderCode($block)
- {
- // make sure this is not replaced by the trait
- return parent::renderCode($block);
- }
- /**
- * @inheritdoc
- */
- protected function renderAutoUrl($block)
- {
- return '\url{' . $this->escapeUrl($block[1]) . '}';
- }
- /**
- * @inheritdoc
- */
- protected function renderStrike($block)
- {
- return '\sout{' . $this->renderAbsy($block[1]) . '}';
- }
- /**
- * @inheritdocs
- *
- * Parses a newline indicated by two spaces on the end of a markdown line.
- */
- protected function renderText($text)
- {
- if ($this->enableNewlines) {
- return preg_replace("/( \n|\n)/", "\\\\\\\\\n", $this->escapeLatex($text[1]));
- } else {
- return parent::renderText($text);
- }
- }
- private $_tableCellHead = false;
- private $_tds = 0;
- protected function renderTable($block)
- {
- $align = [];
- foreach($block['cols'] as $col) {
- if (empty($col)) {
- $align[] = 'X';
- } else {
- $align[] = $col[0];
- }
- }
- $align = implode('|', $align);
- $content = '';
- $first = true;
- $numThs = 0;
- foreach($block['rows'] as $row) {
- $this->_tableCellHead = $first;
- $this->_tds = 0;
- $content .= $this->renderAbsy($this->parseInline($row)); // TODO move this to the consume step
- if ($first) {
- $numThs = $this->_tds;
- } else {
- while ($this->_tds < $numThs) {
- $content .= ' & ';
- $this->_tds++;
- }
- }
- $content .= "\\\\ \\hline\n";
- $first = false;
- }
- return "\n\\noindent\\begin{tabularx}{\\textwidth}{|$align|}\\hline\n$content\\end{tabularx}\n\n";
- }
- /**
- * @marker |
- */
- protected function parseTd($markdown)
- {
- if (isset($this->context[1]) && $this->context[1] === 'table') {
- $this->_tds++;
- return [['tableSep'], 1];
- }
- return [['text', $markdown[0]], 1];
- }
- protected function renderTableSep($block)
- {
- return '&';
- }
- }
|