* @since 2.0 */ class ApiMarkdown extends GithubMarkdown { use ApiMarkdownTrait; /** * @var BaseRenderer */ public static $renderer; /** * @var array translation for guide block types * @since 2.0.5 */ public static $blockTranslations = []; protected $renderingContext; protected $headings = []; /** * @return array the headlines of this document * @since 2.0.5 */ public function getHeadings() { return $this->headings; } /** * @inheritDoc */ protected function prepare() { parent::prepare(); $this->headings = []; } public function parse($text) { $markup = parent::parse($text); $markup = $this->applyToc($markup); return $markup; } /** * @since 2.0.5 */ protected function applyToc($content) { // generate TOC if (!empty($this->headings)) { $toc = []; foreach ($this->headings as $heading) $toc[] = '
language} language-{$block['language']}\">{$result->value}
\n";
} else {
$result = self::$highlighter->highlightAuto($block['content'] . "\n");
return "language}\">{$result->value}
\n";
}
} catch (DomainException $e) {
echo $e;
return parent::renderCode($block);
}
}
/**
* Highlights code
*
* @param string $code code to highlight
* @param string $language language of the code to highlight
* @return string HTML of highlighted code
* @deprecated since 2.0.5 this method is not used anymore, highlight.php is used for highlighting
*/
public static function highlight($code, $language)
{
if ($language !== 'php') {
return htmlspecialchars($code, ENT_NOQUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
if (strncmp($code, '\n and tags added by php
$text = substr(trim($text), 36, -16);
return $text;
}
/**
* @inheritDoc
*/
protected function renderHeadline($block)
{
$content = $this->renderAbsy($block['content']);
if (preg_match('~~', $content, $matches)) {
$hash = $matches[1];
$content = preg_replace('~~', '', $content);
} else {
$hash = Inflector::slug(strip_tags($content));
}
$hashLink = "¶";
if ($block['level'] == 2) {
$this->headings[] = [
'title' => trim($content),
'id' => $hash,
];
} elseif ($block['level'] > 2) {
if (end($this->headings)) {
$this->headings[key($this->headings)]['sub'][] = [
'title' => trim($content),
'id' => $hash,
];
}
}
$tag = 'h' . $block['level'];
return "<$tag>$content $hashLink$tag>";
}
/**
* @inheritdoc
*/
protected function renderLink($block)
{
$result = parent::renderLink($block);
// add special syntax for linking to the guide
$result = preg_replace_callback('/href="guide:([A-z0-9-.#]+)"/i', function($match) {
return 'href="' . static::$renderer->generateGuideUrl($match[1]) . '"';
}, $result, 1);
return $result;
}
/**
* @inheritdoc
* @since 2.0.5
*/
protected function translateBlockType($type)
{
$key = ucfirst($type) . ':';
if (isset(static::$blockTranslations[$key])) {
$translation = static::$blockTranslations[$key];
} else {
$translation = $key;
}
return "$translation ";
}
/**
* Converts markdown into HTML
*
* @param string $content
* @param TypeDoc $context
* @param bool $paragraph
* @return string
*/
public static function process($content, $context = null, $paragraph = false)
{
if (!isset(Markdown::$flavors['api'])) {
Markdown::$flavors['api'] = new static;
}
if (is_string($context)) {
$context = static::$renderer->apiContext->getType($context);
}
Markdown::$flavors['api']->renderingContext = $context;
if ($paragraph) {
return Markdown::processParagraph($content, 'api');
} else {
return Markdown::process($content, 'api');
}
}
/**
* Add bootstrap classes to tables.
* @inheritdoc
*/
public function renderTable($block)
{
return str_replace('