Source of file DBMarkdown.php
Size: 4,738 Bytes - Last Modified: 2021-12-23T10:56:55+00:00
/var/www/docs.ssmods.com/process/src/src/Model/FieldTypes/DBMarkdown.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | <?php namespace UndefinedOffset\Markdown\Model\FieldTypes; use Psr\SimpleCache\CacheInterface; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Injector\Injector; use SilverStripe\ORM\FieldType\DBText; use UndefinedOffset\Markdown\Renderer\GithubMarkdownRenderer; use UndefinedOffset\Markdown\Renderer\IMarkdownRenderer; /** * Class Markdown * @package UndefinedOffset\Markdown\Model\FieldTypes */ class DBMarkdown extends DBText { /** * @var string */ private $cache_key; /** * @var int Cache length for field value in seconds */ private static $cache_seconds = 86400; /** * {@inheritDoc} */ private static $casting = [ 'AsHTML' => 'HTMLText', 'Markdown' => 'DBText', ]; /** * @var string */ private static $escape_type = 'xml'; /** * @var string */ private static $renderer = GithubMarkdownRenderer::class; /** * @var IMarkdownRenderer */ private $renderInst; /** * @var string */ protected $parsedHTML = false; /** * Checks cache to see if the contents of this field have already been loaded from github, if they haven't * then a request is made to the github api to render the markdown * @param bool $useGFM Use Github Flavored Markdown or render using plain markdown defaults to false just like * how readme files are rendered on github * @return string Markdown rendered as HTML */ public function AsHTML($useGFM = false) { if ($this->parsedHTML !== false) { return $this->parsedHTML; } //Setup renderer $renderer = $this->getRenderer(); $supported = $renderer->isSupported(); if ($supported !== true) { $class_name = get_class($renderer); user_error("Renderer $class_name is not supported on this system: $supported"); } if ($renderer instanceof GithubMarkdownRenderer) { $beforeUseGFM = GithubMarkdownRenderer::getUseGFM(); GithubMarkdownRenderer::setUseGFM($useGFM); } //Init cache stuff $cacheKey = $this->getCacheKey(); $cache = Injector::inst()->get(CacheInterface::class . '.dbMarkdownCache'); //Check cache, if it's good use it instead if ($cachedHTML = $cache->get($cacheKey)) { $this->parsedHTML = $cachedHTML; return $this->parsedHTML; } //If empty save time by not attempting to render if (empty($this->value)) { return $this->value; } //Get rendered HTML $response = $renderer->getRenderedHTML($this->value); //Store response in memory $this->parsedHTML = $response; //Cache response to file system $cache->set($cacheKey, $this->parsedHTML, $this->config()->get('cache_seconds')); //Reset GFM if ($renderer instanceof GithubMarkdownRenderer && isset($beforeUseGFM)) { GithubMarkdownRenderer::setUseGFM($beforeUseGFM); } //Return response return $this->parsedHTML; } /** * Renders the field used in the template * @return string HTML to be used in the template * * @see GISMarkdown::AsHTML() */ public function forTemplate() { return $this->AsHTML(); } /** * Sets the renderer for markdown fields to use * @param string $renderer Class Name of an implementation of IMarkdownRenderer */ public static function setRenderer($renderer) { if (ClassInfo::classImplements($renderer, IMarkdownRenderer::class)) { self::$renderer = $renderer; } else { user_error('The renderer ' . $renderer . ' does not implement IMarkdownRenderer', E_USER_ERROR); } } /** * Gets the active markdown renderer * @return IMarkdownRenderer An implementation of IMarkdownRenderer */ private function getRenderer() { if (!is_object($this->renderInst)) { $class = self::$renderer; $this->renderInst = new $class(); } return $this->renderInst; } /** * @return string */ public function getCacheKey() { if (!$this->cache_key) { $this->setCacheKey(); } return $this->cache_key; } /** * @param null $key * @return $this */ public function setCacheKey($key = null) { if ($key === null) { $key = md5('Markdown_' . $this->tableName . '_' . $this->name . '_' . $this->value); } $this->cache_key = $key; return $this; } } |