diff options
author | n-peugnet <n.peugnet@free.fr> | 2019-11-04 23:31:31 +0100 |
---|---|---|
committer | n-peugnet <n.peugnet@free.fr> | 2019-11-05 19:06:40 +0100 |
commit | e802d5204b96d645ec3d40b81b4a8bdc6e0ee675 (patch) | |
tree | 8e6db5e36ad8f247b442583e1e9e5da2934f4b52 /app/class/modelrender.php | |
parent | f1f63f556c41c99d45cd610186b0982383eff375 (diff) | |
download | wcms-e802d5204b96d645ec3d40b81b4a8bdc6e0ee675.tar.gz wcms-e802d5204b96d645ec3d40b81b4a8bdc6e0ee675.zip |
refactor: switch to psr-4 autoloading
Diffstat (limited to 'app/class/modelrender.php')
-rw-r--r-- | app/class/modelrender.php | 691 |
1 files changed, 0 insertions, 691 deletions
diff --git a/app/class/modelrender.php b/app/class/modelrender.php deleted file mode 100644 index 237d9b5..0000000 --- a/app/class/modelrender.php +++ /dev/null @@ -1,691 +0,0 @@ -<?php - -class Modelrender extends Modelpage -{ - protected $router; - /** @var page2 */ - protected $page; - protected $pagelist; - protected $linkfrom = []; - protected $sum = []; - protected $internallinkblank = ''; - protected $externallinkblank = ''; - - const SUMMARY = '%SUMMARY%'; - - const RENDER_VERBOSE = 1; - - public function __construct($router) - { - parent::__construct(); - - $this->router = $router; - $this->pagelist = $this->getlister(); - - if(Config::internallinkblank()) { - $this->internallinkblank = ' target="_blank" '; - } - - if(Config::externallinkblank()) { - $this->externallinkblank = ' target="_blank" '; - } - } - - public function upage($id) - { - return $this->router->generate('pageread/', ['page' => $id]); - } - - - /** - * Main function - * - * @param Page $page page to render - */ - public function render(Page $page) - { - $this->page = $page; - - $this->write($this->gethmtl()); - } - - /** - * Combine body and head to create html file - * - * @return string html string - */ - public function gethmtl() - { - - $head = $this->gethead(); - $body = $this->getbody($this->readbody()); - $parsebody = $this->parser($body); - - $html = '<!DOCTYPE html>' . PHP_EOL . '<html>' . PHP_EOL . '<head>' . PHP_EOL . $head . PHP_EOL . '</head>' . PHP_EOL . $parsebody . PHP_EOL . '</html>'; - - return $html; - } - - - public function readbody() - { - if (!empty($this->page->templatebody())) { - $templateid = $this->page->templatebody(); - $templatepage = $this->get($templateid); - if($templatepage !== false) { - $body = $templatepage->body(); - } else { - $body = $this->page->body(); - $this->page->settemplatebody(''); - } - } else { - $body = $this->page->body(); - } - $body = $this->article($body); - $body = $this->automedialist($body); - $body = $this->autotaglistupdate($body); - return $body; - } - - - /** - * Analyse BODY, call the corresponding CONTENTs and render everything - * - * @param string $body as the string BODY of the page - * - * @return string as the full rendered BODY of the page - */ - public function getbody(string $body) : string - { - // Elements that can be detected - $types = ['HEADER', 'NAV', 'MAIN', 'ASIDE', 'FOOTER']; - - // First level regex - $regex = '~\%(' . implode("|", $types) . ')(\S*)\%~'; - - // Match the first level regex - preg_match_all($regex, $body, $out); - - // Create a list of all the elements that passed through the first level regex - foreach ($out[0] as $key => $match) { - $matches[$key] = ['fullmatch' => $match, 'type' => $out[1][$key], 'options' => $out[2][$key]]; - } - - - // First, analyse the synthax and call the corresponding methods - if(isset($matches)) { - foreach ($matches as $key => $match) { - $element = new Element($match, $this->page->id()); - $element->setcontent($this->getelementcontent($element)); - $element->setcontent($this->elementparser($element)); - $element->addtags(); - $body = str_replace($element->fullmatch(), $element->content(), $body); - - } - } - - - - return $body; - - } - - public function getelementcontent(Element $element) - { - $content = ''; - $subseparator = PHP_EOL . PHP_EOL; - foreach($element->sources() as $source) - { - if($source !== $this->page->id()) { - $subcontent = $this->getpageelement($source, $element->type()); - if($subcontent !== false) { - if(empty($subcontent && self::RENDER_VERBOSE > 0)) { - $subcontent = PHP_EOL . '<!-- The ' . strtoupper($element->type()) . ' from page "' . $source . '" is currently empty ! -->' . PHP_EOL; - } - } else { - $read = '<h2>Rendering error :</h2><p>The page <strong><code>' . $source . '</code></strong>, called in <strong><code>'. $element->fullmatch() . '</code></strong>, does not exist yet.</p>'; - //throw new Exception($read); - } - - } else { - $type = $element->type(); - $subcontent = $this->page->$type(); - } - $content .= $subseparator . $subcontent; - } - return $content . $subseparator; - } - - public function elementparser(Element $element) - { - $content = $this->article($element->content()); - $content = $this->automedialist($content); - $content = $this->pagelist($content); - $content = $this->autotaglistupdate($content); - $content = $this->date($content); - $content = $this->thumbnail($content); - if($element->autolink()) { - $content = str_replace('%LINK%', '' ,$content); - $content = $this->everylink($content, $element->autolink()); - } else { - $content = $this->taglink($content); - } - if($element->markdown()) { - $content = $this->markdown($content); - } - - return $content; - } - - - /** - * Write css javascript and html as files in the assets folder - */ - public function write(string $html) - { - file_put_contents(Model::HTML_RENDER_DIR . $this->page->id() . '.html', $html); - file_put_contents(Model::RENDER_DIR . $this->page->id() . '.css', $this->page->css()); - //file_put_contents(Model::RENDER_DIR . $this->page->id() . '.quick.css', $this->page->quickcss()); - file_put_contents(Model::RENDER_DIR . $this->page->id() . '.js', $this->page->javascript()); - } - - - - public function writetemplates() - { - if (array_key_exists('css', $this->page->template('array'))) { - $tempaltecsspage = $this->get($this->page->template('array')['css']); - file_put_contents(Model::RENDER_DIR . $tempaltecsspage->id() . '.css', $tempaltecsspage->css()); - } - if (array_key_exists('quickcss', $this->page->template('array'))) { - $tempaltequickcsspage = $this->get($this->page->template('array')['quickcss']); - file_put_contents(Model::RENDER_DIR . $tempaltequickcsspage->id() . '.quick.css', $tempaltequickcsspage->quickcss()); - } - if (array_key_exists('javascript', $this->page->template('array'))) { - $templatejspage = $this->get($this->page->template('array')['javascript']); - file_put_contents(Model::RENDER_DIR . $templatejspage->id() . '.js', $templatejspage->javascript()); - } - } - - - - - public function gethead() - { - - $head = ''; - - $head .= '<meta charset="utf8" />' . PHP_EOL; - $head .= '<title>' . $this->page->title() . '</title>' . PHP_EOL; - if (!empty($this->page->favicon())) { - $head .= '<link rel="shortcut icon" href="' . Model::faviconpath() . $this->page->favicon() . '" type="image/x-icon">'; - } elseif (!empty(Config::defaultfavicon())) { - $head .= '<link rel="shortcut icon" href="' . Model::faviconpath() . Config::defaultfavicon() . '" type="image/x-icon">'; - } - $head .= '<meta name="description" content="' . $this->page->description() . '" />' . PHP_EOL; - $head .= '<meta name="viewport" content="width=device-width" />' . PHP_EOL; - - - $head .= '<meta property="og:title" content="' . $this->page->title() . '">' . PHP_EOL; - $head .= '<meta property="og:description" content="' . $this->page->description() . '">' . PHP_EOL; - - if($this->page->thumbnailexist()) { - $head .= '<meta property="og:image" content="' . Config::domain() . self::thumbnailpath() . $this->page->id() . '.jpg">' . PHP_EOL; - } - - $head .= '<meta property="og:url" content="' . Config::url() . $this->page->id() . '/">' . PHP_EOL; - - - foreach ($this->page->externalcss() as $externalcss) { - $head .= '<link href="' . $externalcss . '" rel="stylesheet" />' . PHP_EOL; - } - - if (!empty($this->page->templatecss() && in_array('externalcss', $this->page->templateoptions()))) { - $templatecss = $this->get($this->page->templatecss()); - if($templatecss !== false) { - - foreach ($templatecss->externalcss() as $externalcss) { - $head .= '<link href="' . $externalcss . '" rel="stylesheet" />' . PHP_EOL; - } - } - } - - $head .= PHP_EOL . $this->page->customhead() . PHP_EOL; - - - $head .= '<link href="' . Model::globalpath() . 'fonts.css" rel="stylesheet" />' . PHP_EOL; - $head .= '<link href="' . Model::globalpath() . 'global.css" rel="stylesheet" />' . PHP_EOL; - - if (!empty($this->page->templatecss())) { - $tempaltecsspage = $this->page->templatecss(); - $head .= '<link href="' . Model::renderpath() . $tempaltecsspage . '.css" rel="stylesheet" />' . PHP_EOL; - } - $head .= '<link href="' . Model::renderpath() . $this->page->id() . '.css" rel="stylesheet" />' . PHP_EOL; - - if (!empty($this->page->templatejavascript())) { - $templatejspage = $this->page->templatejavascript(); - $head .= '<script src="' . Model::renderpath() . $templatejspage . '.js" async/></script>' . PHP_EOL; - } - if (!empty($this->page->javascript())) { - $head .= '<script src="' . Model::renderpath() . $this->page->id() . '.js" async/></script>' . PHP_EOL; - } - - if (!empty(Config::analytics())) { - - $head .= PHP_EOL . ' - <!-- Global site tag (gtag.js) - Google Analytics --> - <script async src="https://www.googletagmanager.com/gtag/js?id=' . Config::analytics() . '"></script> - <script> - window.dataLayer = window.dataLayer || []; - function gtag(){dataLayer.push(arguments);} - gtag(\'js\', new Date()); - - gtag(\'config\', \'' . Config::analytics() . '\'); - </script> - ' . PHP_EOL; - } - - - return $head; - } - - public function desctitle($text, $desc, $title) - { - $text = str_replace('%TITLE%', $title, $text); - $text = str_replace('%DESCRIPTION%', $desc, $text); - return $text; - } - - - public function parser(string $text) - { - $text = $this->media($text); - - $text = $this->headerid($text); - - $text = str_replace(self::SUMMARY, $this->sumparser($text), $text); - - $text = $this->wurl($text); - $text = $this->wikiurl($text); - - $text = $this->desctitle($text, $this->page->description(), $this->page->title()); - - - $text = str_replace('href="http', ' class="external" target="_blank" href="http', $text); - - $text = $this->autourl($text); - - $text = $this->authenticate($text); - - return $text; - } - - public function media(string $text) : string - { - $text = preg_replace('%(src|href)="([\w-_]+(\/([\w-_])+)*\.[a-z0-9]{1,5})"%', '$1="' . Model::mediapath() . '$2" target="_blank" class="media"', $text); - if (!is_string($text)) { - //throw new Exception('Rendering error -> media module'); - } - return $text; - } - - - public function autourl($text) - { - $text = preg_replace('#( |\R|>)(https?:\/\/((\S+)\.([^< ]+)))#', '$1<a href="$2" class="external" '. $this->externallinkblank .'>$3</a>', $text); - return $text; - } - - public function wurl(string $text) - { - $linkfrom = []; - $rend = $this; - $text = preg_replace_callback( - '%href="([\w-]+)\/?(#?[a-z-_]*)"%', - function ($matches) use ($rend, &$linkfrom) { - $matchpage = $rend->get($matches[1]); - if (!$matchpage) { - $link = 'href="' . $rend->upage($matches[1]) . '"" title="' . Config::existnot() . '" class="internal existnot"' . $this->internallinkblank; - } else { - $linkfrom[] = $matchpage->id(); - $link = 'href="' . $rend->upage($matches[1]) . $matches[2] . '" title="' . $matchpage->description() . '" class="internal exist '. $matchpage->secure('string') .'"' . $this->internallinkblank; - } - return $link; - }, - $text - ); - $this->linkfrom = array_unique(array_merge($this->linkfrom, $linkfrom)); - return $text; - } - - public function wikiurl(string $text) - { - $linkfrom = []; - $rend = $this; - $text = preg_replace_callback( - '%\[([\w-]+)\/?#?([a-z-_]*)\]%', - function ($matches) use ($rend, &$linkfrom) { - $matchpage = $rend->get($matches[1]); - if (!$matchpage) { - return '<a href="' . $rend->upage($matches[1]) . '"" title="' . Config::existnot() . '" class="internal existnot" '. $this->internallinkblank .' >' . $matches[1] . '</a>'; - } else { - $linkfrom[] = $matchpage->id(); - return '<a href="' . $rend->upage($matches[1]) . $matches[2] . '" title="' . $matchpage->description() . '" class="internal exist '. $matchpage->secure('string') .'" '. $this->internallinkblank .' >' . $matchpage->title() . '</a>'; - } - }, - $text - ); - $this->linkfrom = array_unique(array_merge($this->linkfrom, $linkfrom)); - return $text; - } - - public function headerid($text) - { - $sum = []; - $text = preg_replace_callback( - '/<h([1-6])(\s+(\s*\w+="\w+")*)?\s*>(.+)<\/h[1-6]>/mU', - function ($matches) use (&$sum) { - $cleanid = idclean($matches[4]); - $sum[$cleanid][$matches[1]] = $matches[4]; - return '<h' . $matches[1] . $matches[2] . ' id="' . $cleanid . '">' . $matches[4] . '</h' . $matches[1] . '>'; - }, - $text - ); - $this->sum = $sum; - return $text; - } - - public function markdown($text) - { - //use Michelf\MarkdownExtra; - $fortin = new Michelf\MarkdownExtra; - // id in headers - // $fortin->header_id_func = function ($header) { - // return preg_replace('/[^\w]/', '', strtolower($header)); - // }; - $fortin->hard_wrap = true; - $text = $fortin->transform($text); - return $text; - } - - - - public function article($text) - { - $pattern = '/(\R\R|^\R|^)[=]{3,}([\w-]*)\R\R(.*)(?=\R\R[=]{3,}[\w-]*\R)/sUm'; - $text = preg_replace_callback($pattern, function ($matches) { - if (!empty($matches[2])) { - $id = ' id="' . $matches[2] . '" '; - } else { - $id = ' '; - } - return '<article ' . $id . ' markdown="1" >' . PHP_EOL . PHP_EOL . $matches[3] . PHP_EOL . PHP_EOL . '</article>' . PHP_EOL . PHP_EOL; - }, $text); - $text = preg_replace('/\R\R[=]{3,}([\w-]*)\R/', '', $text); - return $text; - } - - /** - * Check for media list call in the text and insert media list - * @param string $text Text to scan and replace - * - * @return string Output text - */ - public function automedialist(string $text) - { - preg_match_all('~\%MEDIA\?([a-zA-Z0-9\&=\-\/\%]*)\%~', $text, $out); - - foreach ($out[0] as $key => $match) { - $matches[$key] = ['fullmatch' => $match, 'options' => $out[1][$key]]; - } - - if(isset($matches)) { - foreach ($matches as $match) { - $medialist = new Medialist($match); - $text = str_replace($medialist->fullmatch(), $medialist->content(), $text); - } - } - return $text; - } - - - function sumparser($text) - { - preg_match_all('#<h([1-6]) id="(\w+)">(.+)</h[1-6]>#iU', $text, $out); - - - $sum = $this->sum; - - - - $sumstring = ''; - $last = 0; - foreach ($sum as $title => $list) { - foreach ($list as $h => $link) { - if ($h > $last) { - for ($i = 1; $i <= ($h - $last); $i++) { - $sumstring .= '<ul>'; - } - $sumstring .= '<li><a href="#' . $title . '">' . $link . '</a></li>'; - } elseif ($h < $last) { - for ($i = 1; $i <= ($last - $h); $i++) { - $sumstring .= '</ul>'; - } - $sumstring .= '<li><a href="#' . $title . '">' . $link . '</a></li>'; - } elseif ($h = $last) { - $sumstring .= '<li><a href="#' . $title . '">' . $link . '</a></li>'; - } - $last = $h; - } - } - for ($i = 1; $i <= ($last); $i++) { - $sumstring .= '</ul>'; - } - return $sumstring; - } - - - - public function autotaglist($text) - { - $pattern = "/\%TAG:([a-z0-9_-]+)\%/"; - preg_match_all($pattern, $text, $out); - return $out[1]; - - } - - public function autotaglistupdate($text) - { - $taglist = $this->autotaglist($text); - foreach ($taglist as $tag) { - $li = []; - foreach ($this->pagelist as $item) { - if (in_array($tag, $item->tag('array'))) { - $li[] = $item; - } - - } - $ul = '<ul class="taglist" id="' . $tag . '">' . PHP_EOL; - $this->pagelistsort($li, 'date', -1); - foreach ($li as $item) { - if ($item->id() === $this->page->id()) { - $actual = ' actualpage'; - } else { - $actual = ''; - } - $ul .= '<li><a href="' . $this->router->generate('pageread/', ['page' => $item->id()]) . '" title="' . $item->description() . '" class="internal' . $actual . '" '. $this->internallinkblank .' >' . $item->title() . '</a></li>' . PHP_EOL; - } - $ul .= '</ul>' . PHP_EOL; - - - $text = str_replace('%TAG:' . $tag . '%', $ul, $text); - - $li = array_map(function ($item) { - return $item->id(); - }, $li); - $this->linkfrom = array_unique(array_merge($this->linkfrom, $li)); - } - return $text; - } - - - public function date(string $text) - { - $page = $this->page; - $text = preg_replace_callback('~\%DATE\%~', function ($matches) use ($page) { - return '<time datetime=' . $page->date('string') . '>' . $page->date('dmy') . '</time>'; - }, $text); - $text = preg_replace_callback('~\%TIME\%~', function ($matches) use ($page) { - return '<time datetime=' . $page->date('string') . '>' . $page->date('ptime') . '</time>'; - }, $text); - - return $text; - } - - /** - * Render thumbnail of the page - * - * @param string $text Text to analyse - * - * @return string The rendered output - */ - public function thumbnail(string $text) : string - { - $img = '<img class="thumbnail" src="' . Model::thumbnailpath() . $this->page->id() . '.jpg" alt="' . $this->page->title() . '">'; - $img = PHP_EOL . $img . PHP_EOL; - $text = str_replace('%THUMBNAIL%', $img, $text); - - return $text; - } - - public function taglink($text) - { - $rend = $this; - $text = preg_replace_callback('/\%LINK\%(.*)\%LINK\%/msU', function ($matches) use ($rend) { - return $rend->everylink($matches[1], 1); - }, $text); - return $text; - } - - /** - * Autolink Function : transform every word of more than $limit characters in internal link - * - * @param string $text The input text to be converted - * - * @return string Conversion output - */ - public function everylink(string $text, int $limit) : string - { - $regex = '~([\w-_éêèùïüîçà]{' . $limit . ',})(?![^<]*>|[^<>]*<\/)~'; - $text = preg_replace_callback($regex , function ($matches) { - return '<a href="' . idclean($matches[1]) . '">' . $matches[1] . '</a>'; - }, $text); - return $text; - } - - - - /** - * @param string $text content to analyse and replace - * - * @return string text ouput - */ - public function authenticate(string $text) - { - $id = $this->page->id(); - $regex = '~\%CONNECT(\?dir=([a-zA-Z0-9-_]+))?\%~'; - $text = preg_replace_callback($regex, function ($matches) use ($id) { - if(isset($matches[2])) { - $id = $matches[2]; - } - $form = '<form action="/!co" method="post"> - <input type="password" name="pass" id="loginpass" placeholder="password"> - <input type="hidden" name="route" value="pageread/"> - <input type="hidden" name="id" value="' . $id . '"> - <input type="submit" name="log" value="login" id="button"> - </form>'; - return $form; - - }, $text); - return $text; - } - - /** - * Render pages list - */ - public function pagelist(string $text) : string - { - preg_match_all('~\%LIST\?([a-zA-Z0-9\]\[\&=\-\/\%]*)\%~', $text, $out); - - foreach ($out[0] as $key => $match) { - $matches[$key] = ['fullmatch' => $match, 'options' => $out[1][$key]]; - } - - $modelhome = new Modelhome(); - - if(isset($matches)) { - foreach ($matches as $match) { - $optlist = $modelhome->Optlistinit($this->pagelist); - $optlist->parsehydrate($match['options']); - $table2 = $modelhome->table2($this->pagelist, $optlist); - - $content = '<ul>' . PHP_EOL ; - foreach ($table2 as $page ) { - $content .= '<li>' . PHP_EOL; - $content .= '<a href="' . $this->upage($page->id()) . '">' . $page->title() . '</a>' . PHP_EOL; - if($optlist->description()) { - $content .= '<em>' . $page->description() . '</em>' . PHP_EOL; - } - if($optlist->date()) { - $content .= '<code>' . $page->date('pdate') . '</code>' . PHP_EOL; - } - if($optlist->time()) { - $content .= '<code>' . $page->date('ptime') . '</code>' . PHP_EOL; - } - if($optlist->author()) { - $content .= $page->authors('string') . PHP_EOL; - } - $content .= '</li>'; - } - $content .= '</ul>'; - - $text = str_replace($match['fullmatch'], $content, $text); - } - } - return $text; - } - - - - - - - - - public function linkfrom() - { - sort($this->linkfrom); - $linkfrom = $this->linkfrom; - $this->linkfrom = []; - return $linkfrom; - } - - public function linkto() - { - $linkto = []; - foreach ($this->pagelist as $page) { - if (in_array($this->page->id(), $page->linkfrom())) { - $linkto[] = $page->id(); - } - } - return $linkto; - } - - - - -} - - - -?>
\ No newline at end of file |