]> BookStack Code Mirror - bookstack/commitdiff
support exporting books as zip files
authorNikhil Jha <redacted>
Thu, 14 May 2020 02:57:59 +0000 (19:57 -0700)
committerNikhil Jha <redacted>
Thu, 14 May 2020 02:57:59 +0000 (19:57 -0700)
app/Http/Controllers/BookExportController.php
dev/docker/Dockerfile
routes/web.php

index 40eec69fe9e90e01b1e5029d0fc8c09b76ec6a16..0414b725070c0e95d142d1ff9c018679a88507bc 100644 (file)
@@ -2,9 +2,11 @@
 
 namespace BookStack\Http\Controllers;
 
+use BookStack\Entities\Managers\BookContents;
 use BookStack\Entities\ExportService;
 use BookStack\Entities\Repos\BookRepo;
 use Throwable;
+use ZipArchive;
 
 class BookExportController extends Controller
 {
@@ -59,9 +61,31 @@ class BookExportController extends Controller
      */
     public function markdown(string $bookSlug)
     {
-        // TODO: This should probably export to a zip file.
         $book = $this->bookRepo->getBySlug($bookSlug);
         $textContent = $this->exportService->bookToMarkdown($book);
         return $this->downloadResponse($textContent, $bookSlug . '.md');
     }
+
+    /**
+     * Export a book as a zip file, made of markdown files.
+     */
+    public function zip(string $bookSlug)
+    {
+        $book = $this->bookRepo->getBySlug($bookSlug);
+        $z = new ZipArchive();
+        $z->open("book.zip", \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
+        $bookTree = (new BookContents($book))->getTree(false, true);
+        foreach ($bookTree as $bookChild) {
+            if ($bookChild->isA('chapter')) {
+                $z->addEmptyDir($bookChild->name);
+                foreach ($bookChild->pages as $page) {
+                    $z->addFromString($bookChild->name . "/" . $page->name . ".md", $this->exportService->pageToMarkdown($page));
+                }
+            } else {
+                $z->addFromString($bookChild->name . ".md", $this->exportService->pageToMarkdown($bookChild));
+            }
+        }
+        return response()->download('book.zip');
+        // TODO: Is not unlinking it a security issue?
+    }
 }
index 8816615cf69986b75a3713d02e80b5a283221d13..be5af9ed9359cc24e6a6799d8308e3106fa8bd22 100644 (file)
@@ -4,9 +4,9 @@ ENV APACHE_DOCUMENT_ROOT /app/public
 WORKDIR /app
 
 RUN apt-get update -y \
-    && apt-get install -y git zip unzip libtidy-dev libpng-dev libldap2-dev libxml++2.6-dev wait-for-it \
+    && apt-get install -y git zip unzip libtidy-dev libpng-dev libldap2-dev libxml++2.6-dev wait-for-it libzip-dev \
     && docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu \
-    && docker-php-ext-install pdo pdo_mysql tidy dom xml mbstring gd ldap \
+    && docker-php-ext-install pdo pdo_mysql tidy dom xml mbstring gd ldap zip \
     && a2enmod rewrite \
     && sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \
     && sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf \
index f2c4f432eec352930479309cb6b6062e7051069c..4d00b5ff6191aa93b3e381a89c1389b9c0e8af54 100644 (file)
@@ -48,6 +48,7 @@ Route::group(['middleware' => 'auth'], function () {
         Route::get('/{bookSlug}/export/html', 'BookExportController@html');
         Route::get('/{bookSlug}/export/pdf', 'BookExportController@pdf');
         Route::get('/{bookSlug}/export/markdown', 'BookExportController@markdown');
+        Route::get('/{bookSlug}/export/zip', 'BookExportController@zip');
         Route::get('/{bookSlug}/export/plaintext', 'BookExportController@plainText');
 
         // Pages