Example #1
0
 /**
  * Print the main page content
  *
  * @param object $subwiki For details of user/group and ID so that
  *   we can make links
  * @param object $cm Course-module object (again for making links)
  * @param object $pageversion Data from page and version tables.
  * @param bool $hideannotations If true, adds extra class to hide annotations
  * @return string HTML content for page
  */
 public function ouwiki_print_page($subwiki, $cm, $pageversion, $gewgaws = null, $page = 'history', $showwordcount = 0, $hideannotations = false)
 {
     $output = '';
     $modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
     global $CFG, $ouwikiinternalre;
     require_once $CFG->libdir . '/filelib.php';
     // Get annotations - only if using annotation system. prevents unnecessary db access
     if ($subwiki->annotation) {
         $annotations = ouwiki_get_annotations($pageversion);
     } else {
         $annotations = '';
     }
     // Title
     $title = $pageversion->title === '' ? get_string('startpage', 'ouwiki') : htmlspecialchars($pageversion->title);
     // setup annotations according to the page we are on
     if ($page == 'view') {
         // create the annotations
         if ($subwiki->annotation && count($annotations)) {
             ouwiki_highlight_existing_annotations(&$pageversion->xhtml, $annotations, 'view');
         }
     } else {
         if ($page == 'annotate') {
             // call function for the annotate page
             ouwiki_setup_annotation_markers(&$pageversion->xhtml);
             ouwiki_highlight_existing_annotations(&$pageversion->xhtml, $annotations, 'annotate');
         }
     }
     // Must rewrite plugin urls AFTER doing annotations because they depend on byte
     // position in unmolested data from db
     $pageversion->xhtml = file_rewrite_pluginfile_urls($pageversion->xhtml, 'pluginfile.php', $modcontext->id, 'mod_ouwiki', 'content', $pageversion->versionid);
     // get files up here so we have them for the portfolio button addition as well
     $fs = get_file_storage();
     $files = $fs->get_area_files($modcontext->id, 'mod_ouwiki', 'attachment', $pageversion->versionid, "timemodified", false);
     $output .= html_writer::start_tag('div', array('class' => 'ouwiki-content' . ($hideannotations ? ' ouwiki-hide-annotations' : '')));
     $output .= html_writer::start_tag('div', array('class' => 'ouw_topheading'));
     $output .= html_writer::start_tag('div', array('class' => 'ouw_heading'));
     $output .= html_writer::tag('h1', format_string($title), array('class' => 'ouw_topheading'));
     if ($gewgaws) {
         $output .= $this->render_heading_bit(1, $pageversion->title, $subwiki, $cm, null, $annotations, $pageversion->locked, $files, $pageversion->pageid);
     } else {
         $output .= html_writer::end_tag('div');
     }
     // List of recent changes
     if ($gewgaws && $pageversion->recentversions) {
         $output .= html_writer::start_tag('div', array('class' => 'ouw_recentchanges'));
         $output .= get_string('recentchanges', 'ouwiki') . ': ';
         $output .= html_writer::start_tag('span', array('class' => 'ouw_recentchanges_list'));
         $first = true;
         foreach ($pageversion->recentversions as $recentversion) {
             if ($first) {
                 $first = false;
             } else {
                 $output .= '; ';
             }
             $output .= ouwiki_recent_span($recentversion->timecreated);
             $output .= ouwiki_nice_date($recentversion->timecreated);
             $output .= html_writer::end_tag('span');
             $output .= ' (';
             $recentversion->id = $recentversion->userid;
             // so it looks like a user object
             $output .= ouwiki_display_user($recentversion, $cm->course, false);
             $output .= ')';
         }
         $output .= '; ';
         $pagestr = '';
         if (strtolower(trim($title)) !== strtolower(get_string('startpage', 'ouwiki'))) {
             $pagestr = '&page=' . $title;
         }
         $output .= html_writer::tag('a', get_string('seedetails', 'ouwiki'), array('href' => $CFG->wwwroot . '/mod/ouwiki/history.php?id=' . $cm->id . $pagestr));
         $output .= html_writer::end_tag('span');
         $output .= html_writer::end_tag('div');
     }
     $output .= html_writer::end_tag('div');
     $output .= html_writer::start_tag('div', array('class' => 'ouw_belowmainhead'));
     // spacer
     $output .= html_writer::start_tag('div', array('class' => 'ouw_topspacer'));
     $output .= html_writer::end_tag('div');
     // Content of page
     $output .= ouwiki_convert_content($pageversion->xhtml, $subwiki, $cm, null, $pageversion->xhtmlformat);
     if ($gewgaws) {
         // Add in links/etc. around headings
         $ouwikiinternalre->pagename = $pageversion->title;
         $ouwikiinternalre->subwiki = $subwiki;
         $ouwikiinternalre->cm = $cm;
         $ouwikiinternalre->annotations = $annotations;
         $ouwikiinternalre->locked = $pageversion->locked;
         $ouwikiinternalre->pageversion = $pageversion;
         $ouwikiinternalre->files = $files;
         $output = preg_replace_callback('|<h([1-9]) id="ouw_s([0-9]+_[0-9]+)">(.*?)(<br\\s*/>)?</h[1-9]>|s', 'ouwiki_internal_re_heading', $output);
     }
     $output .= html_writer::start_tag('div', array('class' => 'clearer'));
     $output .= html_writer::end_tag('div');
     $output .= html_writer::end_tag('div');
     // Render wordcount
     if ($showwordcount) {
         $output .= $this->ouwiki_render_wordcount($pageversion->wordcount);
     }
     $output .= html_writer::end_tag('div');
     // attached files
     if ($files) {
         $output .= html_writer::start_tag('div', array('class' => 'ouwiki-post-attachments'));
         $output .= html_writer::tag('h3', get_string('attachments', 'ouwiki'), array('class' => 'ouw_topheading'));
         $output .= html_writer::start_tag('ul');
         foreach ($files as $file) {
             $output .= html_writer::start_tag('li');
             $filename = $file->get_filename();
             $mimetype = $file->get_mimetype();
             $iconimage = html_writer::empty_tag('img', array('src' => $this->output->pix_url(file_mimetype_icon($mimetype)), 'alt' => $mimetype, 'class' => 'icon'));
             $path = file_encode_url($CFG->wwwroot . '/pluginfile.php', '/' . $modcontext->id . '/mod_ouwiki/attachment/' . $pageversion->versionid . '/' . $filename);
             $output .= html_writer::tag('a', $iconimage, array('href' => $path));
             $output .= html_writer::tag('a', s($filename), array('href' => $path));
             $output .= html_writer::end_tag('li');
         }
         $output .= html_writer::end_tag('ul');
         $output .= html_writer::end_tag('div');
     }
     // pages that link to this page
     if ($gewgaws) {
         $links = ouwiki_get_links_to($pageversion->pageid);
         if (count($links) > 0) {
             $output .= html_writer::start_tag('div', array('class' => 'ouw_linkedfrom'));
             $output .= html_writer::tag('h3', get_string(count($links) == 1 ? 'linkedfromsingle' : 'linkedfrom', 'ouwiki'), array('class' => 'ouw_topheading'));
             $output .= html_writer::start_tag('ul');
             $first = true;
             foreach ($links as $link) {
                 $output .= html_writer::start_tag('li');
                 if ($first) {
                     $first = false;
                 } else {
                     $output .= '&#8226; ';
                 }
                 $linktitle = $link->title ? htmlspecialchars($link->title) : get_string('startpage', 'ouwiki');
                 $output .= html_writer::tag('a', $linktitle, array('href' => $CFG->wwwroot . '/mod/ouwiki/view.php?' . ouwiki_display_wiki_parameters($link->title, $subwiki, $cm, OUWIKI_PARAMS_URL)));
                 $output .= html_writer::end_tag('li');
             }
             $output .= html_writer::end_tag('ul');
             $output .= html_writer::end_tag('div');
         }
     }
     // disply the orphaned annotations
     if ($subwiki->annotation && $annotations && $page != 'history') {
         $orphaned = '';
         foreach ($annotations as $annotation) {
             if ($annotation->orphaned) {
                 $orphaned .= $this->ouwiki_print_hidden_annotation($annotation);
             }
         }
         if ($orphaned !== '') {
             $output .= html_writer::tag('h3', get_string('orphanedannotations', 'ouwiki'));
             $output .= $orphaned;
         } else {
             $output = $output;
         }
     }
     return array($output, $annotations);
 }
Example #2
0
if ($pageversion1 >= $pageversion2) {
    print_error('Versions out of order');
}
// Print header
$tabhistparams = ouwiki_shared_url_params($pagename, $subwiki, $cm);
echo $ouwikioutput->ouwiki_print_start($ouwiki, $cm, $course, $subwiki, $pagename, $context, array(array('name' => get_string('tab_history', 'ouwiki'), 'link' => new moodle_url('/mod/ouwiki/history.php', $tabhistparams)), array('name' => get_string('changesnav', 'ouwiki'), 'link' => null)), true, true);
// Obtain difference between two versions
list($diff1, $diff2, $numchanges) = ouwiki_diff_html($pageversion1->xhtml, $pageversion2->xhtml);
$fs = get_file_storage();
$files1 = ($files1 = $fs->get_area_files($context->id, 'mod_ouwiki', 'attachment', $pageversion1->versionid, "timemodified", false)) ? $files1 : null;
$files2 = ($files2 = $fs->get_area_files($context->id, 'mod_ouwiki', 'attachment', $pageversion2->versionid, "timemodified", false)) ? $files2 : null;
list($attachdiff1, $attachdiff2, $attachnumchanges) = ouwiki_diff_attachments($files1, $files2, $context->id, $pageversion1->versionid, $pageversion2->versionid);
$numchanges = $numchanges + $attachnumchanges;
// if there are no changes then check if there are any annotations in the new version
if ($numchanges == 0) {
    $annotations = ouwiki_get_annotations($pageversion2);
    if (count($annotations) === 0) {
        $advice = get_string('diff_nochanges', 'ouwiki');
    } else {
        $advice = get_string('diff_someannotations', 'ouwiki');
    }
} else {
    $advice = get_string('advice_diff', 'ouwiki');
}
print '<p class="ouw_advice">' . $advice . ' ' . get_string('returntohistory', 'ouwiki', 'history.php?' . ouwiki_display_wiki_parameters($pagename, $subwiki, $cm)) . '</p>';
// Obtain pluginfile urls.
$pageversion1->xhtml = file_rewrite_pluginfile_urls($pageversion1->xhtml, 'pluginfile.php', $context->id, 'mod_ouwiki', 'content', $pageversion1->versionid);
$pageversion2->xhtml = file_rewrite_pluginfile_urls($pageversion2->xhtml, 'pluginfile.php', $context->id, 'mod_ouwiki', 'content', $pageversion2->versionid);
// Obtain difference between two versions
list($diff1, $diff2) = ouwiki_diff_html($pageversion1->xhtml, $pageversion2->xhtml);
// To make it look like a user object
Example #3
0
 $neednewversion = false;
 // get the form data
 $new_annotations = array();
 $edited_annotations = array();
 foreach ($_POST as $key => $value) {
     if (strpos($key, 'edit') === 0) {
         $edited_annotations[substr($key, 4)] = optional_param($key, null, PARAM_TEXT);
     } else {
         if (strpos($key, 'new') === 0) {
             $new_annotations[substr($key, 3)] = optional_param($key, null, PARAM_TEXT);
         }
     }
 }
 $transaction = $DB->start_delegated_transaction();
 // get the existing annotations to check for changes
 $stored = ouwiki_get_annotations($pageversion);
 $updated = $stored;
 // do we need to delete orphaned annotations
 $deleted_annotations = array();
 if ($deleteorphaned) {
     foreach ($stored as $annotation) {
         if ($annotation->orphaned) {
             $DB->delete_records('ouwiki_annotations', array('id' => $annotation->id));
             $deleted_annotations[$annotation->id] = '';
         }
     }
 }
 foreach ($edited_annotations as $key => $value) {
     if ($value == '') {
         $DB->delete_records('ouwiki_annotations', array('id' => $key));
         $deleted_annotations[$key] = '';
 /**
  * Obtains page html suitable for use in portfolio export.
  * @param object $pageversion Page and version data
  * @param array $attachments Attachments array indexed by versionid
  * @param object $context Moodle context object
  * @param object $ouwiki OU wiki object
  * @param object $subwiki Subwiki object
  * @param object $course Course object
  * @param bool $withannotations If true, includes annotations
  * @param portfolio_format $portfolioformat Portfolio format
  * @param string $plugin the portfolio plugin being used.
  * @return string HTML code
  */
 static function get_page_html($pageversion, $attachments, $context, $ouwiki, $subwiki, $course, $withannotations, portfolio_format $portfolioformat, $plugin)
 {
     global $DB;
     // Format the page body
     $options = portfolio_format_text_options();
     $formattedtext = format_text($pageversion->xhtml, $pageversion->xhtmlformat, $options, $course->id);
     $formattedtext = portfolio_rewrite_pluginfile_urls($formattedtext, $context->id, 'mod_ouwiki', 'content', $pageversion->versionid, $portfolioformat);
     // Get annotations - only if using annotation system. prevents unnecessary db access
     if ($ouwiki->annotation) {
         $annotations = ouwiki_get_annotations($pageversion);
     } else {
         $annotations = array();
     }
     // Convert or remove the annotations
     if ($ouwiki->annotation && count($annotations)) {
         ouwiki_highlight_existing_annotations($formattedtext, $annotations, $withannotations ? 'portfolio' : 'clear');
     }
     // Do overall page, starting with title
     $title = $pageversion->title;
     if ($title === null) {
         $title = get_string('startpage', 'ouwiki');
     }
     $output = html_writer::tag('h2', s($title));
     // Last change info
     $user = (object) array('id' => $pageversion->userid, 'firstname' => $pageversion->firstname, 'lastname' => $pageversion->lastname);
     $lastchange = get_string('lastchange', 'ouwiki', (object) array('date' => userdate($pageversion->timecreated), 'userlink' => ouwiki_display_user($user, $course->id)));
     $output .= html_writer::tag('p', html_writer::tag('small', html_writer::tag('i', $lastchange)));
     // Main text
     $output .= html_writer::tag('div', $formattedtext);
     // Word count
     if ($ouwiki->enablewordcount) {
         $wordcount = get_string('numwords', 'ouwiki', $pageversion->wordcount);
         $output .= html_writer::tag('div', html_writer::empty_tag('br'));
         $output .= html_writer::tag('p', html_writer::tag('small', $wordcount), array('class' => 'ouw_wordcount'));
     }
     // Attachments
     if ($attachments[$pageversion->versionid]) {
         $output .= html_writer::start_tag('div', array('class' => 'attachments'));
         $output .= html_writer::tag('h3', get_string('attachments', 'ouwiki'));
         $output .= html_writer::start_tag('ul');
         foreach ($attachments[$pageversion->versionid] as $file) {
             if ($plugin == 'rtf') {
                 $filename = $file->get_filename();
                 $path = moodle_url::make_pluginfile_url($context->id, 'mod_ouwiki', 'attachment', $pageversion->versionid, '/', $filename, true);
                 $atag = html_writer::tag('a', $filename, array('href' => $path));
             } else {
                 $atag = $portfolioformat->file_output($file);
             }
             $output .= html_writer::tag('li', $atag);
         }
         $output .= html_writer::end_tag('ul');
         $output .= html_writer::end_tag('div');
     }
     return $output;
 }
 /**
  * Print the main page content
  *
  * @param object $subwiki For details of user/group and ID so that
  *   we can make links
  * @param object $cm Course-module object (again for making links)
  * @param object $pageversion Data from page and version tables.
  * @param bool $gewgaws A decorator indicator.
  * @param string $page Page type
  * @param int $showwordcount
  * @param bool $hideannotations If true, adds extra class to hide annotations
  * @return string HTML content for page
  */
 public function ouwiki_print_page($subwiki, $cm, $pageversion, $gewgaws = null, $page = 'history', $showwordcount = 0, $hideannotations = false)
 {
     global $CFG, $ouwikiinternalre;
     require_once $CFG->libdir . '/filelib.php';
     $output = '';
     $modcontext = context_module::instance($cm->id);
     $title = $pageversion->title === '' ? get_string('startpage', 'ouwiki') : htmlspecialchars($pageversion->title);
     // Get annotations - only if using annotation system. Prevents unnecessary db access.
     if ($subwiki->annotation) {
         $annotations = ouwiki_get_annotations($pageversion);
     } else {
         $annotations = '';
     }
     // Setup annotations according to the page we are on.
     if ($page == 'view') {
         if ($subwiki->annotation && count($annotations)) {
             $pageversion->xhtml = ouwiki_highlight_existing_annotations($pageversion->xhtml, $annotations, 'view');
         }
     } else {
         if ($page == 'annotate') {
             $pageversion->xhtml = ouwiki_setup_annotation_markers($pageversion->xhtml);
             $pageversion->xhtml = ouwiki_highlight_existing_annotations($pageversion->xhtml, $annotations, 'annotate');
         }
     }
     // Must rewrite plugin urls AFTER doing annotations because they depend on byte position.
     $pageversion->xhtml = file_rewrite_pluginfile_urls($pageversion->xhtml, 'pluginfile.php', $modcontext->id, 'mod_ouwiki', 'content', $pageversion->versionid);
     $pageversion->xhtml = ouwiki_convert_content($pageversion->xhtml, $subwiki, $cm, null, $pageversion->xhtmlformat);
     // Get files here so we have them for the portfolio button addition as well.
     $fs = get_file_storage();
     $files = $fs->get_area_files($modcontext->id, 'mod_ouwiki', 'attachment', $pageversion->versionid, "timemodified", false);
     // Start gathering output.
     $output .= html_writer::start_tag('div', array('class' => 'ouwiki-content' . ($hideannotations ? ' ouwiki-hide-annotations' : '')));
     $output .= $this->get_topheading_section($title, $gewgaws, $pageversion, $annotations, $files);
     // List of recent changes.
     if ($gewgaws && $pageversion->recentversions) {
         $output .= html_writer::start_tag('div', array('class' => 'ouw_recentchanges'));
         $output .= get_string('recentchanges', 'ouwiki') . ': ';
         $output .= html_writer::start_tag('span', array('class' => 'ouw_recentchanges_list'));
         $first = true;
         foreach ($pageversion->recentversions as $recentversion) {
             if ($first) {
                 $first = false;
             } else {
                 $output .= '; ';
             }
             $output .= ouwiki_recent_span($recentversion->timecreated);
             $output .= ouwiki_nice_date($recentversion->timecreated);
             $output .= html_writer::end_tag('span');
             $output .= ' (';
             $recentversion->id = $recentversion->userid;
             // So it looks like a user object.
             $output .= ouwiki_display_user($recentversion, $cm->course, false);
             $output .= ')';
         }
         $output .= '; ';
         $pagestr = '';
         if (strtolower(trim($title)) !== strtolower(get_string('startpage', 'ouwiki'))) {
             $pagestr = '&page=' . $title;
         }
         $output .= html_writer::tag('a', get_string('seedetails', 'ouwiki'), array('href' => $CFG->wwwroot . '/mod/ouwiki/history.php?id=' . $cm->id . $pagestr));
         $output .= html_writer::end_tag('span');
         $output .= html_writer::end_tag('div');
     }
     $output .= $this->get_new_annotations_section($gewgaws, $pageversion, $annotations, $files);
     $output .= html_writer::end_tag('div');
     // Main content of page.
     $output .= html_writer::start_tag('div', array('class' => 'ouw_belowmainhead'));
     $output .= html_writer::start_tag('div', array('class' => 'ouw_topspacer'));
     $output .= html_writer::end_tag('div');
     $output .= $pageversion->xhtml;
     if ($gewgaws) {
         // Add in links around headings.
         $ouwikiinternalre = new stdClass();
         $ouwikiinternalre->pagename = $pageversion->title;
         $ouwikiinternalre->subwiki = $subwiki;
         $ouwikiinternalre->cm = $cm;
         $ouwikiinternalre->annotations = $annotations;
         $ouwikiinternalre->locked = $pageversion->locked;
         $ouwikiinternalre->pageversion = $pageversion;
         $ouwikiinternalre->files = $files;
         $output = preg_replace_callback('|<h([1-9]) id="ouw_s([0-9]+_[0-9]+)">(.*?)(<br\\s*/>)?</h[1-9]>|s', 'ouwiki_internal_re_heading', $output);
     }
     $output .= html_writer::tag('div', '', array('class' => 'clearer'));
     $output .= html_writer::end_tag('div');
     // End of ouw_belowmainhead.
     // Add wordcount.
     if ($showwordcount) {
         $output .= $this->ouwiki_render_wordcount($pageversion->wordcount);
     }
     $output .= html_writer::end_tag('div');
     // End of ouwiki-content.
     // Add attached files.
     $output .= $this->get_attached_files($files, $modcontext, $pageversion);
     // Pages that link to this page.
     if ($gewgaws) {
         $links = ouwiki_get_links_to($pageversion->pageid);
         if (count($links) > 0) {
             $output .= $this->get_links_to($links);
         }
     }
     // Display the orphaned annotations.
     if ($subwiki->annotation && $annotations && $page != 'history') {
         $orphaned = '';
         foreach ($annotations as $annotation) {
             if ($annotation->orphaned) {
                 $orphaned .= $this->ouwiki_print_hidden_annotation($annotation);
             }
         }
         if ($orphaned !== '') {
             $output .= html_writer::start_div('ouw-orphaned-annotations');
             $output .= html_writer::tag('h3', get_string('orphanedannotations', 'ouwiki'));
             $output .= $orphaned;
             $output .= html_writer::end_div();
         } else {
             $output = $output;
         }
     }
     $output .= $this->get_new_buttons_section($gewgaws, $pageversion);
     return array($output, $annotations);
 }
/**
 * @param object $subwiki For details of user/group and ID so that
 *   we can make links
 * @param object $cm Course-module object (again for making links)
 * @param object $pageversion Data from page and version tables.
 * @return string HTML content for page
 */
function ouwiki_display_page($subwiki, $cm, $pageversion, $gewgaws = false, $page = 'history')
{
    global $CFG;
    // Get comments - only if using per-section comment system. prevents unnecessary db access
    $comments = array();
    if (ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_PERSECTION || ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_BOTH) {
        if ($gewgaws) {
            $comments = ouwiki_get_recent_comments($pageversion->pageid, ouwiki_find_sections($pageversion->xhtml));
        }
    }
    // And params
    $params = ouwiki_display_wiki_parameters($pageversion->title, $subwiki, $cm);
    // Get annotations - only if using annotation comment system. prevents unnecessary db access
    if (ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_ANNOTATION || ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_BOTH) {
        $annotations = ouwiki_get_annotations($pageversion);
    } else {
        $annotations = '';
    }
    // Title
    $title = is_null($pageversion->title) ? get_string('startpage', 'ouwiki') : htmlspecialchars($pageversion->title);
    // setup annotations according to the page we are on
    if ($page == 'view') {
        // create the annotations
        if ((ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_ANNOTATION || ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_BOTH) && count($annotations)) {
            ouwiki_highlight_existing_annotations(&$pageversion->xhtml, $annotations, 'view');
        }
    } elseif ($page == 'annotate') {
        // call function for the annotate page
        ouwiki_setup_annotation_markers(&$pageversion->xhtml);
        ouwiki_highlight_existing_annotations(&$pageversion->xhtml, $annotations, 'annotate');
    }
    $result = '';
    $result .= '<div class="ouwiki_content"><div class="ouw_topheading">';
    $returncomments = true;
    $result .= '<div class="ouw_heading"><h1 id="ouw_topheading">' . $title . '</h1>' . ($gewgaws ? ouwiki_internal_display_heading_bit(1, $pageversion->title, $subwiki, $cm, $comments, null, $annotations, $pageversion->locked, $returncomments) : '</div>');
    // List of recent changes
    if ($gewgaws && $pageversion->recentversions) {
        $result .= '<div class="ouw_recentchanges">' . get_string('recentchanges', 'ouwiki') . ': <span class="ouw_recentchanges_list">';
        $first = true;
        foreach ($pageversion->recentversions as $recentversion) {
            if ($first) {
                $first = false;
            } else {
                $result .= '; ';
            }
            $result .= ouwiki_recent_span($recentversion->timecreated);
            $result .= ouwiki_nice_date($recentversion->timecreated) . '</span> (';
            $recentversion->id = $recentversion->userid;
            // so it looks like a user object
            $result .= ouwiki_display_user($recentversion, $cm->course, false) . ')';
        }
        if (class_exists('ouflags') && ou_get_is_mobile()) {
            $result .= '; </span></div>';
        } else {
            $result .= '; <br/><a class="seedetails" href="history.php?' . $params . '">' . get_string('seedetails', 'ouwiki') . '</a></span></div>';
        }
    }
    $result .= '</div><div class="ouw_belowmainhead">';
    if ($returncomments !== true) {
        $result .= $returncomments;
    }
    $result .= '<div class="ouw_topspacer"></div>';
    // Content of page
    $result .= ouwiki_convert_content($pageversion->xhtml, $subwiki, $cm);
    if ($gewgaws) {
        // Add in links/etc. around headings
        global $ouwiki_internal_re;
        $ouwiki_internal_re->comments = $comments;
        $ouwiki_internal_re->pagename = $pageversion->title;
        $ouwiki_internal_re->subwiki = $subwiki;
        $ouwiki_internal_re->cm = $cm;
        $ouwiki_internal_re->annotations = $annotations;
        $ouwiki_internal_re->locked = $pageversion->locked;
        $result = preg_replace_callback('|<h([1-9]) id="ouw_s([0-9]+_[0-9]+)">(.*?)(<br\\s*/>)?</h[1-9]>|s', 'ouwiki_internal_re_heading_bits', $result);
    }
    $result .= '<div class="clearer"></div></div></div>';
    if ($gewgaws) {
        $links = ouwiki_get_links_to($pageversion->pageid);
        if (count($links) > 0) {
            $result .= '<div class="ouw_linkedfrom"><h3>' . get_string(count($links) == 1 ? 'linkedfromsingle' : 'linkedfrom', 'ouwiki') . '</h3><ul>';
            $first = true;
            foreach ($links as $link) {
                $result .= ' <li>';
                if ($first) {
                    $first = false;
                } else {
                    $result .= '&#8226; ';
                }
                $result .= '<a href="view.php?' . ouwiki_display_wiki_parameters($link->title, $subwiki, $cm) . '">' . ($link->title ? htmlspecialchars($link->title) : get_string('startpage', 'ouwiki')) . '</a></li>';
            }
            $result .= '</ul></div>';
        }
        if ($subwiki->cancomment && (ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_PERSECTION || ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_BOTH)) {
            $result .= '<div id="ouw_ac_formcontainer" style="display:none">' . ouwiki_display_comment_form('view', null, null, $pageversion->title, $subwiki, $cm) . '</div>';
        }
    }
    // disply the orphaned annotations
    if ((ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_ANNOTATION || ouwiki_get_commenting($subwiki->commenting) == OUWIKI_COMMENTS_BOTH) && $annotations && $page != 'history') {
        $orphaned = '';
        foreach ($annotations as $annotation) {
            if ($annotation->orphaned) {
                $orphaned .= ouwiki_setup_hidden_annotation($annotation);
            }
        }
        $result = $orphaned !== '' ? $result . '<h3>' . get_string('orphanedannotations', 'ouwiki') . '</h3>' . $orphaned : $result;
    }
    return array($result, $annotations);
}
 /**
  * Obtains page html suitable for use in portfolio export.
  * @param object $pageversion Page and version data
  * @param array $attachments Attachments array indexed by versionid
  * @param object $context Moodle context object
  * @param object $ouwiki OU wiki object
  * @param object $subwiki Subwiki object
  * @param object $course Course object
  * @param bool $withannotations If true, includes annotations
  * @param portfolio_format $portfolioformat Portfolio format
  * @param string $plugin the portfolio plugin being used.
  * @return string HTML code
  */
 public static function get_page_html($pageversion, $attachments, $context, $ouwiki, $subwiki, $course, $withannotations, portfolio_format $portfolioformat, $plugin)
 {
     global $DB;
     // Format the page body.
     $options = portfolio_format_text_options();
     $options->filter = true;
     $formattedtext = portfolio_rewrite_pluginfile_urls($pageversion->xhtml, $context->id, 'mod_ouwiki', 'content', $pageversion->versionid, $portfolioformat);
     $formattedtext = format_text($formattedtext, $pageversion->xhtmlformat, $options, $course->id);
     // Get annotations - only if using annotation system. prevents unnecessary db access.
     if ($ouwiki->annotation) {
         $annotations = ouwiki_get_annotations($pageversion);
     } else {
         $annotations = array();
     }
     // Convert or remove the annotations.
     if ($ouwiki->annotation && count($annotations)) {
         ouwiki_highlight_existing_annotations($formattedtext, $annotations, $withannotations ? 'portfolio' : 'clear');
     }
     // Do overall page, starting with title.
     $title = $pageversion->title;
     if ($title === '') {
         $title = get_string('startpage', 'ouwiki');
     }
     $output = html_writer::tag('h2', s($title));
     // Last change info.
     $user = new stdClass();
     foreach (explode(',', user_picture::fields()) as $field) {
         if ($field == 'id') {
             $user->id = $pageversion->userid;
         } else {
             $user->{$field} = $pageversion->{$field};
         }
     }
     $lastchange = get_string('lastchange', 'ouwiki', (object) array('date' => userdate($pageversion->timecreated), 'userlink' => ouwiki_display_user($user, $course->id)));
     $output .= html_writer::tag('p', html_writer::tag('small', html_writer::tag('i', $lastchange)));
     // Main text.
     $output .= html_writer::tag('div', $formattedtext);
     // Word count.
     if ($ouwiki->enablewordcount) {
         $wordcount = get_string('numwords', 'ouwiki', $pageversion->wordcount);
         $output .= html_writer::tag('div', html_writer::empty_tag('br'));
         $output .= html_writer::tag('p', html_writer::tag('small', $wordcount), array('class' => 'ouw_wordcount'));
     }
     // Attachments.
     if ($attachments[$pageversion->versionid]) {
         $output .= html_writer::start_tag('div', array('class' => 'attachments'));
         $output .= html_writer::tag('h3', get_string('attachments', 'ouwiki'));
         $output .= html_writer::start_tag('ul');
         foreach ($attachments[$pageversion->versionid] as $file) {
             if ($plugin == 'rtf') {
                 $filename = $file->get_filename();
                 $path = moodle_url::make_pluginfile_url($context->id, 'mod_ouwiki', 'attachment', $pageversion->versionid, '/', $filename, true);
                 $atag = html_writer::tag('a', $filename, array('href' => $path));
             } else {
                 $atag = $portfolioformat->file_output($file);
             }
             $output .= html_writer::tag('li', $atag);
         }
         $output .= html_writer::end_tag('ul');
         $output .= html_writer::end_tag('div');
     }
     // Replace all user links with user name so that you can not access user links from within exported document.
     $output = preg_replace('~<a href="[^"]*/user/view.php[^"]*"\\s*>(.*?)</a>~', '$1', $output);
     return $output;
 }