/** * Generate toc structure and titles * * @param array $chapters * @param stdClass $book * @param stdClass $cm * @return array */ function booktool_print_get_toc($chapters, $book, $cm) { $first = true; $titles = array(); $context = context_module::instance($cm->id); $toc = ''; // Representation of toc (HTML). switch ($book->numbering) { case BOOK_NUM_NONE: $toc .= '<div class="book_toc_none">'; break; case BOOK_NUM_NUMBERS: $toc .= '<div class="book_toc_numbered">'; break; case BOOK_NUM_BULLETS: $toc .= '<div class="book_toc_bullets">'; break; case BOOK_NUM_INDENTED: $toc .= '<div class="book_toc_indented">'; break; } $toc .= '<a name="toc"></a>'; // Representation of toc (HTML). if ($book->customtitles) { $toc .= '<h1>'.get_string('toc', 'mod_book').'</h1>'; } else { $toc .= '<p class="book_chapter_title">'.get_string('toc', 'mod_book').'</p>'; } $toc .= '<ul>'; foreach ($chapters as $ch) { if (!$ch->hidden) { $title = book_get_chapter_title($ch->id, $chapters, $book, $context); if (!$ch->subchapter) { $toc .= $first ? '<li>' : '</ul></li><li>'; } else { $toc .= $first ? '<li><ul><li>' : '<li>'; } $titles[$ch->id] = $title; $toc .= '<a title="'.s($title).'" href="#ch'.$ch->id.'">'.$title.'</a>'; $toc .= (!$ch->subchapter) ? '<ul>' : '</li>'; $first = false; } } $toc .= '</ul></li></ul>'; $toc .= '</div>'; $toc = str_replace('<ul></ul>', '', $toc); // Cleanup of invalid structures. return array($toc, $titles); }
/** * Serves the book attachments. Implements needed access control ;-) * * @param stdClass $course course object * @param cm_info $cm course module object * @param context $context context object * @param string $filearea file area * @param array $args extra arguments * @param bool $forcedownload whether or not force download * @param array $options additional options affecting the file serving * @return bool false if file not found, does not return if found - just send the file */ function book_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options = array()) { global $CFG, $DB; if ($context->contextlevel != CONTEXT_MODULE) { return false; } require_course_login($course, true, $cm); if ($filearea !== 'chapter') { return false; } if (!has_capability('mod/book:read', $context)) { return false; } $chid = (int) array_shift($args); if (!($book = $DB->get_record('book', array('id' => $cm->instance)))) { return false; } if (!($chapter = $DB->get_record('book_chapters', array('id' => $chid, 'bookid' => $book->id)))) { return false; } if ($chapter->hidden and !has_capability('mod/book:viewhiddenchapters', $context)) { return false; } // Download the contents of a chapter as an html file. if ($args[0] == 'index.html') { $filename = "index.html"; // We need to rewrite the pluginfile URLs so the media filters can work. $content = file_rewrite_pluginfile_urls($chapter->content, 'webservice/pluginfile.php', $context->id, 'mod_book', 'chapter', $chapter->id); $formatoptions = new stdClass(); $formatoptions->noclean = true; $formatoptions->overflowdiv = true; $formatoptions->context = $context; $content = format_text($content, $chapter->contentformat, $formatoptions); // Remove @@PLUGINFILE@@/. $options = array('reverse' => true); $content = file_rewrite_pluginfile_urls($content, 'webservice/pluginfile.php', $context->id, 'mod_book', 'chapter', $chapter->id, $options); $content = str_replace('@@PLUGINFILE@@/', '', $content); $titles = ""; // Format the chapter titles. if (!$book->customtitles) { require_once __DIR__ . '/locallib.php'; $chapters = book_preload_chapters($book); if (!$chapter->subchapter) { $currtitle = book_get_chapter_title($chapter->id, $chapters, $book, $context); // Note that we can't use the $OUTPUT->heading() in WS_SERVER mode. $titles = "<h3>{$currtitle}</h3>"; } else { $currtitle = book_get_chapter_title($chapters[$chapter->id]->parent, $chapters, $book, $context); $currsubtitle = book_get_chapter_title($chapter->id, $chapters, $book, $context); // Note that we can't use the $OUTPUT->heading() in WS_SERVER mode. $titles = "<h3>{$currtitle}</h3>"; $titles .= "<h4>{$currsubtitle}</h4>"; } } $content = $titles . $content; send_file($content, $filename, 0, 0, true, true); } else { $fs = get_file_storage(); $relativepath = implode('/', $args); $fullpath = "/{$context->id}/mod_book/chapter/{$chid}/{$relativepath}"; if (!($file = $fs->get_file_by_hash(sha1($fullpath))) or $file->is_directory()) { return false; } // Nasty hack because we do not have file revisions in book yet. $lifetime = $CFG->filelifetime; if ($lifetime > 60 * 10) { $lifetime = 60 * 10; } // Finally send the file. send_stored_file($file, $lifetime, 0, $forcedownload, $options); } }
// ===================================================== echo $OUTPUT->header(); // upper nav echo '<div class="navtop">'.$chnavigation.'</div>'; // chapter itself echo $OUTPUT->box_start('generalbox book_content'); if (!$book->customtitles) { $hidden = $chapter->hidden ? 'dimmed_text' : ''; if (!$chapter->subchapter) { $currtitle = book_get_chapter_title($chapter->id, $chapters, $book, $context); echo $OUTPUT->heading($currtitle, 2, array('class' => 'book_chapter_title '.$hidden)); } else { $currtitle = book_get_chapter_title($chapters[$chapter->id]->parent, $chapters, $book, $context); $currsubtitle = book_get_chapter_title($chapter->id, $chapters, $book, $context); echo $OUTPUT->heading($currtitle, 2, array('class' => 'book_chapter_title '.$hidden)); echo $OUTPUT->heading($currsubtitle, 3, array('class' => 'book_chapter_title '.$hidden)); } } $chaptertext = file_rewrite_pluginfile_urls($chapter->content, 'pluginfile.php', $context->id, 'mod_book', 'chapter', $chapter->id); echo format_text($chaptertext, $chapter->contentformat, array('noclean'=>true, 'context'=>$context)); echo $OUTPUT->box_end(); // lower navigation echo '<div class="navbottom">'.$chnavigation.'</div>'; echo $OUTPUT->footer();
/** * Generate toc structure and titles * * @param array $chapters * @param stdClass $book * @param stdClass $cm * @return array */ function booktool_print_get_toc($chapters, $book, $cm) { $first = true; $titles = array(); $context = context_module::instance($cm->id); $toc = ''; // Representation of toc (HTML). switch ($book->numbering) { case BOOK_NUM_NONE: $toc .= html_writer::start_tag('div', array('class' => 'book_toc_none')); break; case BOOK_NUM_NUMBERS: $toc .= html_writer::start_tag('div', array('class' => 'book_toc_numbered')); break; case BOOK_NUM_BULLETS: $toc .= html_writer::start_tag('div', array('class' => 'book_toc_bullets')); break; case BOOK_NUM_INDENTED: $toc .= html_writer::start_tag('div', array('class' => 'book_toc_indented')); break; } $toc .= html_writer::tag('a', '', array('name' => 'toc')); // Representation of toc (HTML). $toc .= html_writer::tag('h2', get_string('toc', 'mod_book'), array('class' => 'book_chapter_title')); $toc .= html_writer::start_tag('ul'); foreach ($chapters as $ch) { if (!$ch->hidden) { $title = book_get_chapter_title($ch->id, $chapters, $book, $context); if (!$ch->subchapter) { if ($first) { $toc .= html_writer::start_tag('li'); } else { $toc .= html_writer::end_tag('ul'); $toc .= html_writer::end_tag('li'); $toc .= html_writer::start_tag('li'); } } else { if ($first) { $toc .= html_writer::start_tag('li'); $toc .= html_writer::start_tag('ul'); $toc .= html_writer::start_tag('li'); } else { $toc .= html_writer::start_tag('li'); } } $titles[$ch->id] = $title; $toc .= html_writer::link(new moodle_url('#ch'.$ch->id), $title, array('title' => s($title))); if (!$ch->subchapter) { $toc .= html_writer::start_tag('ul'); } else { $toc .= html_writer::end_tag('li'); } $first = false; } } $toc .= html_writer::end_tag('ul'); $toc .= html_writer::end_tag('li'); $toc .= html_writer::end_tag('ul'); $toc .= html_writer::end_tag('div'); $toc = str_replace('<ul></ul>', '', $toc); // Cleanup of invalid structures. return array($toc, $titles); }
if ($ebooksettings['includeDescription']) { $text = format_text($book->intro, $book->introformat, array('noclean' => true, 'context' => $context)); $epub->add_spine_item($epub->get_html_wrap($book->intro, get_string('summary'), 'luci.css'), 'intro.html'); $epub->set_item_toc(get_string('summary')); } // Add chapters $chapters = book_preload_chapters($book); $allchapters = $DB->get_records('book_chapters', array('bookid' => $book->id), 'pagenum'); $fs = get_file_storage(); $first = true; foreach ($chapters as $cid => $ch) { $chapter = $allchapters[$ch->id]; if ($chapter->hidden) { continue; } $title = book_get_chapter_title($ch->id, $chapters, $book, $context); $text = ''; $text .= "<div id='ch" . $ch->id . "'>\n"; if (!$book->customtitles) { if ($chapter->subchapter) { $text .= '<h3 class="book_chapter_title">' . $title . "</h3>\n"; } else { $text .= '<h2 class="book_chapter_title">' . $title . "</h2>\n"; } } // Add images $mat = new match_saver(); $content = preg_replace_callback('~@@PLUGINFILE@@/(.+?)([\'"])~', array($mat, 'callback'), $chapter->content); foreach ($mat->matches as $match) { $fn = rawurldecode($match); $fullpath = '/' . $context->id . '/mod_book/chapter/' . $ch->id . '/' . $fn;