mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-07-28 17:02:04 +03:00
Merge branch 'markdown-export' of https://github.com/nikhiljha/BookStack-1 into nikhiljha-markdown-export
This commit is contained in:
@ -7,7 +7,9 @@ use BookStack\Uploads\ImageService;
|
||||
use DomPDF;
|
||||
use Exception;
|
||||
use SnappyPDF;
|
||||
use League\HTMLToMarkdown\HtmlConverter;
|
||||
use Throwable;
|
||||
use ZipArchive;
|
||||
|
||||
class ExportFormatter
|
||||
{
|
||||
@ -226,4 +228,72 @@ class ExportFormatter
|
||||
}
|
||||
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";
|
||||
}
|
||||
}
|
||||
|
@ -52,4 +52,24 @@ class BookExportController extends Controller
|
||||
$textContent = $this->exportFormatter->bookToPlainText($book);
|
||||
return $this->downloadResponse($textContent, $bookSlug . '.txt');
|
||||
}
|
||||
|
||||
/**
|
||||
* Export a book as a markdown file.
|
||||
*/
|
||||
public function markdown(string $bookSlug)
|
||||
{
|
||||
$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);
|
||||
$filename = $this->exportService->bookToZip($book);
|
||||
return response()->download($filename);
|
||||
}
|
||||
}
|
||||
|
@ -54,4 +54,16 @@ class ChapterExportController extends Controller
|
||||
$chapterText = $this->exportFormatter->chapterToPlainText($chapter);
|
||||
return $this->downloadResponse($chapterText, $chapterSlug . '.txt');
|
||||
}
|
||||
|
||||
/**
|
||||
* Export a chapter to a simple markdown file.
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
public function markdown(string $bookSlug, string $chapterSlug)
|
||||
{
|
||||
// TODO: This should probably export to a zip file.
|
||||
$chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug);
|
||||
$chapterText = $this->exportService->chapterToMarkdown($chapter);
|
||||
return $this->downloadResponse($chapterText, $chapterSlug . '.md');
|
||||
}
|
||||
}
|
||||
|
@ -60,4 +60,15 @@ class PageExportController extends Controller
|
||||
$pageText = $this->exportFormatter->pageToPlainText($page);
|
||||
return $this->downloadResponse($pageText, $pageSlug . '.txt');
|
||||
}
|
||||
|
||||
/**
|
||||
* Export a page to a simple markdown .md file.
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
public function markdown(string $bookSlug, string $pageSlug)
|
||||
{
|
||||
$page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
|
||||
$pageText = $this->exportService->pageToMarkdown($page);
|
||||
return $this->downloadResponse($pageText, $pageSlug . '.md');
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user