X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/b94b945fb03e21a1997cfe6e50148967586cb26d..refs/pull/2115/head:/app/Entities/ExportService.php diff --git a/app/Entities/ExportService.php b/app/Entities/ExportService.php index f945dfbe4..b0e88b18b 100644 --- a/app/Entities/ExportService.php +++ b/app/Entities/ExportService.php @@ -6,7 +6,9 @@ use BookStack\Uploads\ImageService; use DomPDF; use Exception; use SnappyPDF; +use League\HTMLToMarkdown\HtmlConverter; use Throwable; +use ZipArchive; class ExportService { @@ -225,4 +227,72 @@ class ExportService } return $text; } + + /** + * Convert a page to a Markdown file. + * @throws Throwable + */ + public function pageToMarkdown(Page $page) + { + if (property_exists($page, 'markdown') && $page->markdown != '') { + return "# " . $page->name . "\n\n" . $page->markdown; + } else { + $converter = new HtmlConverter(); + return "# " . $page->name . "\n\n" . $converter->convert($page->html); + } + } + + /** + * Convert a chapter to a Markdown file. + * @throws Throwable + */ + public function chapterToMarkdown(Chapter $chapter) + { + $text = "# " . $chapter->name . "\n\n"; + $text .= $chapter->description . "\n\n"; + foreach ($chapter->pages as $page) { + $text .= $this->pageToMarkdown($page); + } + return $text; + } + + /** + * Convert a book into a plain text string. + */ + public function bookToMarkdown(Book $book): string + { + $bookTree = (new BookContents($book))->getTree(false, true); + $text = "# " . $book->name . "\n\n"; + foreach ($bookTree as $bookChild) { + if ($bookChild->isA('chapter')) { + $text .= $this->chapterToMarkdown($bookChild); + } else { + $text .= $this->pageToMarkdown($bookChild); + } + } + 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"; + } }