/**
     * Alternative rendering of front page news, called from layout/faux_site_index.php which
     * replaces the standard news output with this.
     *
     * @return string
     */
    public function site_frontpage_news()
    {
        global $CFG, $SITE;
        require_once $CFG->dirroot . '/mod/forum/lib.php';
        if (!($forum = forum_get_course_forum($SITE->id, 'news'))) {
            print_error('cannotfindorcreateforum', 'forum');
        }
        $cm = get_coursemodule_from_instance('forum', $forum->id, $SITE->id, false, MUST_EXIST);
        $context = \context_module::instance($cm->id, MUST_EXIST);
        $output = html_writer::start_tag('div', array('id' => 'site-news-forum', 'class' => 'clearfix'));
        $output .= $this->heading(format_string($forum->name, true, array('context' => $context)));
        $groupmode = groups_get_activity_groupmode($cm, $SITE);
        $currentgroup = groups_get_activity_group($cm);
        if (!($discussions = forum_get_discussions($cm, 'p.modified DESC', true, null, $SITE->newsitems, false, -1, $SITE->newsitems))) {
            $output .= html_writer::tag('div', '(' . get_string('nonews', 'forum') . ')', array('class' => 'forumnodiscuss'));
            if (forum_user_can_post_discussion($forum, $currentgroup, $groupmode, $cm, $context)) {
                $output .= html_writer::link(new moodle_url('/mod/forum/post.php', array('forum' => $forum->id)), get_string('addanewtopic', 'forum'), array('class' => 'btn btn-primary'));
            } else {
                // No news and user cannot edit, so return nothing.
                return '';
            }
            return $output . '</div>';
        }
        $output .= html_writer::start_div('', array('id' => 'news-articles'));
        foreach ($discussions as $discussion) {
            if (!forum_user_can_see_discussion($forum, $discussion, $context)) {
                continue;
            }
            $message = file_rewrite_pluginfile_urls($discussion->message, 'pluginfile.php', $context->id, 'mod_forum', 'post', $discussion->id);
            $imagestyle = '';
            $imgarr = \theme_snap\local::extract_first_image($message);
            if ($imgarr) {
                $imageurl = s($imgarr['src']);
                $imagestyle = " style=\"background-image:url('{$imageurl}')\"";
            }
            $name = format_string($discussion->name, true, array('context' => $context));
            $date = userdate($discussion->timemodified, get_string('strftimedatetime', 'langconfig'));
            $readmorebtn = "<a class='btn btn-default toggle' href='" . $CFG->wwwroot . "/mod/forum/discuss.php?d=" . $discussion->discussion . "'>" . get_string('readmore', 'theme_snap') . "</a>";
            $preview = '';
            $newsimage = '';
            if (!$imagestyle) {
                $preview = html_to_text($message, 0, false);
                $preview = "<div class='news-article-preview'><p>" . shorten_text($preview, 200) . "</p>\n                <p class='text-right'>" . $readmorebtn . "</p></div>";
            } else {
                $newsimage = '<div class="news-article-image toggle"' . $imagestyle . ' title="' . get_string('readmore', 'theme_snap') . '"></div>';
            }
            $close = get_string('close', 'theme_snap');
            $output .= <<<HTML
<div class="news-article clearfix">
    {$newsimage}
    <div class="news-article-inner">
        <div class="news-article-content">
            <h3 class='toggle'><a href="{$CFG->wwwroot}/mod/forum/discuss.php?d={$discussion->discussion}">{$name}</a></h3>
            <em class="news-article-date">{$date}</em>
        </div>
    </div>
    {$preview}
    <div class="news-article-message" tabindex="-1">
        {$message}
        <div><hr><a class="snap-action-icon toggle" href="#">
        <i class="icon icon-close"></i><small>{$close}</small></a></div>
    </div>
</div>
HTML;
        }
        $actionlinks = html_writer::link(new moodle_url('/mod/forum/view.php', array('id' => $cm->id)), get_string('morenews', 'theme_snap'), array('class' => 'btn btn-default'));
        if (forum_user_can_post_discussion($forum, $currentgroup, $groupmode, $cm, $context)) {
            $actionlinks .= html_writer::link(new moodle_url('/mod/forum/post.php', array('forum' => $forum->id)), get_string('addanewtopic', 'forum'), array('class' => 'btn btn-primary'));
        }
        $output .= html_writer::end_div();
        $output .= "<br><div class='text-center'>{$actionlinks}</div>";
        $output .= html_writer::end_tag('div');
        return $output;
    }
 /**
  * Get page module html
  * @param $mod
  * @return string
  */
 protected function mod_page_html($mod)
 {
     if (!$mod->uservisible) {
         return "";
     }
     global $DB;
     $sql = "SELECT * FROM {course_modules} cm\n                  JOIN {page} p ON p.id = cm.instance\n                WHERE cm.id = ?";
     $page = $DB->get_record_sql($sql, array($mod->id));
     $context = context_module::instance($mod->id);
     $formatoptions = new stdClass();
     $formatoptions->noclean = true;
     $formatoptions->overflowdiv = true;
     $formatoptions->context = $context;
     // Make sure we have some summary/extract text for the course page.
     if (!empty($page->intro)) {
         $page->summary = file_rewrite_pluginfile_urls($page->intro, 'pluginfile.php', $context->id, 'mod_page', 'intro', null);
         $page->summary = format_text($page->summary, $page->introformat, $formatoptions);
     } else {
         $preview = html_to_text($page->content, 0, false);
         $page->summary = shorten_text($preview, 200);
     }
     $content = file_rewrite_pluginfile_urls($page->content, 'pluginfile.php', $context->id, 'mod_page', 'content', $page->revision);
     $content = format_text($content, $page->contentformat, $formatoptions);
     $imgarr = \theme_snap\local::extract_first_image($content);
     $thumbnail = '';
     if ($imgarr) {
         $img = html_writer::img($imgarr['src'], $imgarr['alt']);
         $thumbnail = "<div class=summary-figure>{$img}</div>";
     }
     $readmore = get_string('readmore', 'theme_snap');
     $close = get_string('close', 'theme_snap');
     $o = "\n        {$thumbnail}\n        <div class='summary-text'>\n            {$page->summary}\n            <p><a class='pagemod-readmore' href='{$mod->url}'>{$readmore}</a></p>\n        </div>\n\n        <div class=pagemod-content tabindex='-1'>\n            {$content}\n            <div><hr><a  class='snap-action-icon' href='#'>\n            <i class='icon icon-office-52'></i><small>{$close}</small></a></div>\n        </div>";
     return $o;
 }
 public function test_extract_first_image()
 {
     $actual = local::extract_first_image('no image here');
     $this->assertFalse($actual);
     $html = '<img src="http://www.example.com/image.jpg" alt="example image">';
     $actual = local::extract_first_image($html);
     $this->assertSame('http://www.example.com/image.jpg', $actual['src']);
     $this->assertSame('example image', $actual['alt']);
 }
 /**
  * Get page module html
  * @param cm_info $mod
  * @return string
  */
 protected function mod_page_html(cm_info $mod)
 {
     if (!$mod->uservisible) {
         return "";
     }
     $page = \theme_snap\local::get_page_mod($mod);
     $imgarr = \theme_snap\local::extract_first_image($page->content);
     $thumbnail = '';
     if ($imgarr) {
         $img = html_writer::img($imgarr['src'], $imgarr['alt']);
         $thumbnail = "<div class=summary-figure>{$img}</div>";
     }
     $readmore = get_string('readmore', 'theme_snap');
     $close = get_string('close', 'theme_snap');
     // Identify content elements which should force an AJAX lazy load.
     $elcontentblist = ['iframe', 'video', 'object', 'embed'];
     $content = $page->content;
     $lazyload = false;
     foreach ($elcontentblist as $el) {
         if (stripos($content, '<' . $el) !== false) {
             $content = '';
             // Don't include the content as it is likely to slow the page load down considerably.
             $lazyload = true;
         }
     }
     $contentloaded = !$lazyload ? 1 : 0;
     $o = "\n        {$thumbnail}\n        <div class='summary-text'>\n            {$page->summary}\n            <p><a class='pagemod-readmore' href='{$mod->url}' data-pagemodcontext='{$mod->context->id}'>{$readmore}</a></p>\n        </div>\n\n        <div class=pagemod-content tabindex='-1' data-content-loaded={$contentloaded}>\n            {$content}\n            <div><hr><a  class='snap-action-icon' href='#'>\n            <i class='icon icon-office-52'></i><small>{$close}</small></a></div>\n        </div>";
     return $o;
 }