| 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 '&';	}}
 |