use SnappyPDF;
use League\HTMLToMarkdown\HtmlConverter;
use Throwable;
+use ZipArchive;
class ExportService
{
}
return $text;
}
+
+ /**
+ * Convert a book into a zip file.
+ */
+ public function bookToZip(Book $book): string
+ {
+ // TODO: Is not unlinking the file a security risk?
+ $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) {
+ $filename = $bookChild->name . "/" . $page->name . ".md";
+ $z->addFromString($filename, $this->pageToMarkdown($page));
+ }
+ } else {
+ $z->addFromString($bookChild->name . ".md", $this->pageToMarkdown($bookChild));
+ }
+ }
+ return "book.zip";
+ }
}
use BookStack\Entities\ExportService;
use BookStack\Entities\Repos\BookRepo;
use Throwable;
-use ZipArchive;
class BookExportController extends Controller
{
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?
+ $filename = $this->exportService->bookToZip($book);
+ return response()->download($filename);
}
}