use DomPDF;
use Exception;
use SnappyPDF;
+use League\HTMLToMarkdown\HtmlConverter;
use Throwable;
+use ZipArchive;
class ExportService
{
public function pageToContainedHtml(Page $page)
{
$page->html = (new PageContent($page))->render();
- $pageHtml = view('pages/export', [
- 'page' => $page
+ $pageHtml = view('pages.export', [
+ 'page' => $page,
+ 'format' => 'html',
])->render();
return $this->containHtml($pageHtml);
}
$pages->each(function ($page) {
$page->html = (new PageContent($page))->render();
});
- $html = view('chapters/export', [
+ $html = view('chapters.export', [
'chapter' => $chapter,
- 'pages' => $pages
+ 'pages' => $pages,
+ 'format' => 'html',
])->render();
return $this->containHtml($html);
}
public function bookToContainedHtml(Book $book)
{
$bookTree = (new BookContents($book))->getTree(false, true);
- $html = view('books/export', [
+ $html = view('books.export', [
'book' => $book,
- 'bookChildren' => $bookTree
+ 'bookChildren' => $bookTree,
+ 'format' => 'html',
])->render();
return $this->containHtml($html);
}
public function pageToPdf(Page $page)
{
$page->html = (new PageContent($page))->render();
- $html = view('pages/pdf', [
- 'page' => $page
+ $html = view('pages.export', [
+ 'page' => $page,
+ 'format' => 'pdf',
])->render();
return $this->htmlToPdf($html);
}
$page->html = (new PageContent($page))->render();
});
- $html = view('chapters/export', [
+ $html = view('chapters.export', [
'chapter' => $chapter,
- 'pages' => $pages
+ 'pages' => $pages,
+ 'format' => 'pdf',
])->render();
return $this->htmlToPdf($html);
public function bookToPdf(Book $book)
{
$bookTree = (new BookContents($book))->getTree(false, true);
- $html = view('books/export', [
+ $html = view('books.export', [
'book' => $book,
- 'bookChildren' => $bookTree
+ 'bookChildren' => $bookTree,
+ 'format' => 'pdf',
])->render();
return $this->htmlToPdf($html);
}
}
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";
+ }
}