diff --git a/mod/book/lib.php b/mod/book/lib.php
index 6e3fabc6b39..8c3f1f761d0 100644
--- a/mod/book/lib.php
+++ b/mod/book/lib.php
@@ -425,21 +425,57 @@ function book_pluginfile($course, $cm, $context, $filearea, $args, $forcedownloa
return false;
}
- $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;
- }
+ // Download the contents of a chapter as an html file.
+ if ($args[0] == 'index.html') {
+ $filename = "index.html";
- // Nasty hack because we do not have file revisions in book yet.
- $lifetime = $CFG->filelifetime;
- if ($lifetime > 60*10) {
- $lifetime = 60*10;
- }
+ // Remove @@PLUGINFILE@@/.
+ $content = str_replace('@@PLUGINFILE@@/', '', $chapter->content);
- // finally send the file
- send_stored_file($file, $lifetime, 0, $forcedownload, $options);
+ $titles = "";
+ // Format the chapter titles.
+ if (!$book->customtitles) {
+ require_once(dirname(__FILE__).'/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 = "
$currtitle
";
+ } 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 = "$currtitle
";
+ $titles .= "$currsubtitle
";
+ }
+ }
+
+ $formatoptions = new stdClass;
+ $formatoptions->noclean = true;
+ $formatoptions->overflowdiv = true;
+ $formatoptions->context = $context;
+
+ $content = $titles . format_text($content, $chapter->contentformat, $formatoptions);
+
+ 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);
+ }
}
/**
@@ -454,3 +490,111 @@ function book_page_type_list($pagetype, $parentcontext, $currentcontext) {
$module_pagetype = array('mod-book-*'=>get_string('page-mod-book-x', 'mod_book'));
return $module_pagetype;
}
+
+/**
+ * Export book resource contents
+ *
+ * @param stdClass $cm Course module object
+ * @param string $baseurl Base URL for file downloads
+ * @return array of file content
+ */
+function book_export_contents($cm, $baseurl) {
+ global $DB;
+
+ $contents = array();
+ $context = context_module::instance($cm->id);
+
+ $book = $DB->get_record('book', array('id' => $cm->instance), '*', MUST_EXIST);
+
+ $fs = get_file_storage();
+
+ $chapters = $DB->get_records('book_chapters', array('bookid' => $book->id), 'pagenum');
+
+ $structure = array();
+ $currentchapter = 0;
+
+ foreach ($chapters as $chapter) {
+ if ($chapter->hidden) {
+ continue;
+ }
+
+ // Generate the book structure.
+ $thischapter = array(
+ "title" => format_string($chapter->title, true, array('context' => $context)),
+ "href" => $chapter->id . "/index.html",
+ "level" => 0,
+ "subitems" => array()
+ );
+
+ // Main chapter.
+ if (!$chapter->subchapter) {
+ $currentchapter = $chapter->pagenum;
+ $structure[$currentchapter] = $thischapter;
+ } else {
+ // Subchapter.
+ $thischapter['level'] = 1;
+ $structure[$currentchapter]["subitems"][] = $thischapter;
+ }
+
+ // Export the chapter contents.
+
+ // Main content (html).
+ $filename = 'index.html';
+ $chapterindexfile = array();
+ $chapterindexfile['type'] = 'file';
+ $chapterindexfile['filename'] = $filename;
+ // Each chapter in a subdirectory.
+ $chapterindexfile['filepath'] = "/{$chapter->id}/";
+ $chapterindexfile['filesize'] = 0;
+ $chapterindexfile['fileurl'] = moodle_url::make_webservice_pluginfile_url(
+ $context->id, 'mod_book', 'chapter', $chapter->id, '/', 'index.html')->out(false);
+ $chapterindexfile['timecreated'] = $book->timecreated;
+ $chapterindexfile['timemodified'] = $book->timemodified;
+ $chapterindexfile['content'] = format_string($chapter->title, true, array('context' => $context));
+ $chapterindexfile['sortorder'] = 0;
+ $chapterindexfile['userid'] = null;
+ $chapterindexfile['author'] = null;
+ $chapterindexfile['license'] = null;
+ $contents[] = $chapterindexfile;
+
+ // Chapter files (images usually).
+ $files = $fs->get_area_files($context->id, 'mod_book', 'chapter', $chapter->id, 'sortorder DESC, id ASC', false);
+ foreach ($files as $fileinfo) {
+ $file = array();
+ $file['type'] = 'file';
+ $file['filename'] = $fileinfo->get_filename();
+ $file['filepath'] = "/{$chapter->id}/";
+ $file['filesize'] = $fileinfo->get_filesize();
+ $file['fileurl'] = moodle_url::make_webservice_pluginfile_url(
+ $context->id, 'mod_book', 'chapter', $chapter->id,
+ $fileinfo->get_filepath(), $fileinfo->get_filename())->out(false);
+ $file['timecreated'] = $fileinfo->get_timecreated();
+ $file['timemodified'] = $fileinfo->get_timemodified();
+ $file['sortorder'] = $fileinfo->get_sortorder();
+ $file['userid'] = $fileinfo->get_userid();
+ $file['author'] = $fileinfo->get_author();
+ $file['license'] = $fileinfo->get_license();
+ $contents[] = $file;
+ }
+ }
+
+ // First content is the structure in encoded JSON format.
+ $structurefile = array();
+ $structurefile['type'] = 'content';
+ $structurefile['filename'] = 'structure';
+ $structurefile['filepath'] = "/";
+ $structurefile['filesize'] = 0;
+ $structurefile['fileurl'] = null;
+ $structurefile['timecreated'] = $book->timecreated;
+ $structurefile['timemodified'] = $book->timemodified;
+ $structurefile['content'] = json_encode(array_values($structure));
+ $structurefile['sortorder'] = 0;
+ $structurefile['userid'] = null;
+ $structurefile['author'] = null;
+ $structurefile['license'] = null;
+
+ // Add it as first element.
+ array_unshift($contents, $structurefile);
+
+ return $contents;
+}
\ No newline at end of file