From: Dan Brown Date: Tue, 22 Jun 2021 18:12:24 +0000 (+0100) Subject: Merge branch 'markdown-export' of https://github.com/nikhiljha/BookStack-1 into nikhi... X-Git-Tag: v21.08~1^2~38 X-Git-Url: http://source.bookstackapp.com/bookstack/commitdiff_plain/9af636bd48f5c7cec7f73746307800b9572d2644 Merge branch 'markdown-export' of https://github.com/nikhiljha/BookStack-1 into nikhiljha-markdown-export --- 9af636bd48f5c7cec7f73746307800b9572d2644 diff --cc app/Entities/Tools/ExportFormatter.php index eb8f6862f,b0e88b18b..b462abec5 --- a/app/Entities/Tools/ExportFormatter.php +++ b/app/Entities/Tools/ExportFormatter.php @@@ -7,9 -6,11 +7,11 @@@ use BookStack\Uploads\ImageService use DomPDF; use Exception; use SnappyPDF; + use League\HTMLToMarkdown\HtmlConverter; use Throwable; + use ZipArchive; -class ExportService +class ExportFormatter { protected $imageService; diff --cc app/Http/Controllers/BookExportController.php index 1c1f12442,a92d94cc9..58868fa5c --- a/app/Http/Controllers/BookExportController.php +++ b/app/Http/Controllers/BookExportController.php @@@ -49,7 -51,27 +49,27 @@@ class BookExportController extends Cont public function plainText(string $bookSlug) { $book = $this->bookRepo->getBySlug($bookSlug); - $textContent = $this->exportService->bookToPlainText($book); + $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); + } } diff --cc app/Http/Controllers/ChapterExportController.php index 52d087442,c0fa9fad9..bc709771b --- a/app/Http/Controllers/ChapterExportController.php +++ b/app/Http/Controllers/ChapterExportController.php @@@ -51,7 -52,19 +51,19 @@@ class ChapterExportController extends C public function plainText(string $bookSlug, string $chapterSlug) { $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); - $chapterText = $this->exportService->chapterToPlainText($chapter); + $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'); + } } diff --cc app/Http/Controllers/PageExportController.php index e5e027fe7,037f84e3b..d9cc5ba48 --- a/app/Http/Controllers/PageExportController.php +++ b/app/Http/Controllers/PageExportController.php @@@ -57,7 -60,18 +57,18 @@@ class PageExportController extends Cont public function plainText(string $bookSlug, string $pageSlug) { $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); - $pageText = $this->exportService->pageToPlainText($page); + $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'); + } } diff --cc composer.json index 8450a2f92,68802e935..8124ccbca --- a/composer.json +++ b/composer.json @@@ -12,36 -11,39 +12,37 @@@ "ext-gd": "*", "ext-json": "*", "ext-mbstring": "*", - "ext-tidy": "*", "ext-xml": "*", - "barryvdh/laravel-dompdf": "^0.8.5", - "barryvdh/laravel-snappy": "^0.4.5", - "doctrine/dbal": "^2.9", - "facade/ignition": "^1.4", - "fideloper/proxy": "^4.0", - "gathercontent/htmldiff": "^0.2.1", - "intervention/image": "^2.5", - "laravel/framework": "^6.12", - "laravel/socialite": "^4.3.2", - "league/commonmark": "^1.4", - "league/flysystem-aws-s3-v3": "^1.0", + "barryvdh/laravel-dompdf": "^0.9.0", + "barryvdh/laravel-snappy": "^0.4.8", + "doctrine/dbal": "^2.12.1", + "facade/ignition": "^1.16.4", + "fideloper/proxy": "^4.4.1", + "intervention/image": "^2.5.1", + "laravel/framework": "^6.20.16", + "laravel/socialite": "^5.1", + "league/commonmark": "^1.5", + "league/flysystem-aws-s3-v3": "^1.0.29", + "league/html-to-markdown": "^4.9", - "nunomaduro/collision": "^3.0", - "onelogin/php-saml": "^3.3", - "predis/predis": "^1.1", - "socialiteproviders/discord": "^2.0", - "socialiteproviders/gitlab": "^3.0", - "socialiteproviders/microsoft-azure": "^3.0", - "socialiteproviders/okta": "^1.0", - "socialiteproviders/slack": "^3.0", - "socialiteproviders/twitch": "^5.0" + "nunomaduro/collision": "^3.1", + "onelogin/php-saml": "^4.0", + "predis/predis": "^1.1.6", + "socialiteproviders/discord": "^4.1", + "socialiteproviders/gitlab": "^4.1", + "socialiteproviders/microsoft-azure": "^4.1", + "socialiteproviders/okta": "^4.1", + "socialiteproviders/slack": "^4.1", + "socialiteproviders/twitch": "^5.3", + "ssddanbrown/htmldiff": "^v1.0.1" }, "require-dev": { - "barryvdh/laravel-debugbar": "^3.2.8", - "barryvdh/laravel-ide-helper": "^2.6.4", - "fzaninotto/faker": "^1.4", - "laravel/browser-kit-testing": "^5.1", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^8.0", - "squizlabs/php_codesniffer": "^3.4", - "wnx/laravel-stats": "^2.0" + "barryvdh/laravel-debugbar": "^3.5.1", + "barryvdh/laravel-ide-helper": "^2.8.2", + "fakerphp/faker": "^1.13.0", + "laravel/browser-kit-testing": "^5.2", + "mockery/mockery": "^1.3.3", + "phpunit/phpunit": "^9.5.3", + "squizlabs/php_codesniffer": "^3.5.8" }, "autoload": { "classmap": [ diff --cc dev/docker/Dockerfile index 895ad595a,be5af9ed9..178ea9a6c --- a/dev/docker/Dockerfile +++ b/dev/docker/Dockerfile @@@ -3,21 -3,14 +3,21 @@@ FROM php:7.4-apach ENV APACHE_DOCUMENT_ROOT /app/public WORKDIR /app +# Install additional dependacnies and configure apache RUN apt-get update -y \ - && apt-get install -y git zip unzip libpng-dev libldap2-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 \ ++ && apt-get install -y git zip unzip libpng-dev libldap2-dev libzip-dev wait-for-it \ && docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu \ - && docker-php-ext-install pdo_mysql gd ldap \ - && docker-php-ext-install pdo pdo_mysql tidy dom xml mbstring gd ldap zip \ ++ && docker-php-ext-install pdo_mysql 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 \ - && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ + && sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf + +# Install composer +RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ && php composer-setup.php \ && mv composer.phar /usr/bin/composer \ && php -r "unlink('composer-setup.php');" + +# Use the default production configuration and update it as required +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \ - && sed -i 's/memory_limit = 128M/memory_limit = 512M/g' "$PHP_INI_DIR/php.ini" ++ && sed -i 's/memory_limit = 128M/memory_limit = 512M/g' "$PHP_INI_DIR/php.ini" diff --cc resources/views/partials/entity-export-menu.blade.php index 6d23af07c,42c2eb79a..2b0f5c19d --- a/resources/views/partials/entity-export-menu.blade.php +++ b/resources/views/partials/entity-export-menu.blade.php @@@ -4,9 -4,10 +4,10 @@@ @icon('export') {{ trans('entities.export') }} -