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
{
*/
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?
+ }
}
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 \
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