]> BookStack Code Mirror - bookstack/commitdiff
Merge branch 'markdown-export' of https://github.com/nikhiljha/BookStack-1 into nikhi...
authorDan Brown <redacted>
Tue, 22 Jun 2021 18:12:24 +0000 (19:12 +0100)
committerDan Brown <redacted>
Tue, 22 Jun 2021 18:12:24 +0000 (19:12 +0100)
1  2 
app/Entities/Tools/ExportFormatter.php
app/Http/Controllers/BookExportController.php
app/Http/Controllers/ChapterExportController.php
app/Http/Controllers/PageExportController.php
composer.json
dev/docker/Dockerfile
resources/lang/en/entities.php
resources/views/partials/entity-export-menu.blade.php
routes/web.php

index eb8f6862f23fe76b703c8f0a2514b2f5d61acae9,b0e88b18bb7db42b9cfbd05242230740c15f48a9..b462abec5671666ebb806d953ab1dd34a7c3b558
@@@ -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;
index 1c1f124422f962020d31e4f35595b2e65d0f80cf,a92d94cc94f4f7a0b368dfb47b2a13f7009c8848..58868fa5c03036711d47a345cb00584954ab79bb
@@@ -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);
+     }
  }
index 52d087442ab287eb2d533365ed6cfd8cce5da642,c0fa9fad94fad64fb85df88416cc24750be2dafd..bc709771bd2f04e653fbad58c2562cec5632d18f
@@@ -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');
+     }
  }
index e5e027fe72cd2f5cec19418d9ea81901238e2eb7,037f84e3be80b2413faa54ad5949970104f5d4ae..d9cc5ba489afcb279aad905d36d3b275a764dadd
@@@ -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 8450a2f9250205109ecaeebdca2ac3538c86fc69,68802e935ce41c6e4b53d45e8985654e7d562184..8124ccbca3197e55a02c1b71418acb6831c84e4a
          "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": [
index 895ad595ae7b73cf4077a76bf717092c5146a2ff,be5af9ed9359cc24e6a6799d8308e3106fa8bd22..178ea9a6c865481f40d07529de0915d86553152e
@@@ -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');"
-     && sed -i 's/memory_limit = 128M/memory_limit = 512M/g' "$PHP_INI_DIR/php.ini"
 +
 +# 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"
Simple merge
index 6d23af07c24bc4ae046edf3ee9b4b3cd063783a3,42c2eb79a91b18f42ea2657cae4f31df808f1580..2b0f5c19dd84b9b88130afe5ee289545eae0100a
@@@ -4,9 -4,10 +4,10 @@@
          <span>@icon('export')</span>
          <span>{{ trans('entities.export') }}</span>
      </div>
 -    <ul class="wide dropdown-menu" role="menu">
 -        <li><a href="{{ $entity->getUrl('/export/html') }}" target="_blank">{{ trans('entities.export_html') }} <span class="text-muted float right">.html</span></a></li>
 -        <li><a href="{{ $entity->getUrl('/export/pdf') }}" target="_blank">{{ trans('entities.export_pdf') }} <span class="text-muted float right">.pdf</span></a></li>
 -        <li><a href="{{ $entity->getUrl('/export/plaintext') }}" target="_blank">{{ trans('entities.export_text') }} <span class="text-muted float right">.txt</span></a></li>
 -        <li><a href="{{ $entity->getUrl('/export/markdown') }}" target="_blank">{{ trans('entities.export_md') }} <span class="text-muted float right">.md</span></a></li>
 +    <ul refs="dropdown@menu" class="wide dropdown-menu" role="menu">
 +        <li><a href="{{ $entity->getUrl('/export/html') }}" target="_blank" rel="noopener">{{ trans('entities.export_html') }} <span class="text-muted float right">.html</span></a></li>
 +        <li><a href="{{ $entity->getUrl('/export/pdf') }}" target="_blank" rel="noopener">{{ trans('entities.export_pdf') }} <span class="text-muted float right">.pdf</span></a></li>
 +        <li><a href="{{ $entity->getUrl('/export/plaintext') }}" target="_blank" rel="noopener">{{ trans('entities.export_text') }} <span class="text-muted float right">.txt</span></a></li>
++        <li><a href="{{ $entity->getUrl('/export/markdown') }}" target="_blank" rel="noopener">{{ trans('entities.export_md') }} <span class="text-muted float right">.md</span></a></li>
      </ul>
--</div>
++</div>
diff --cc routes/web.php
Simple merge
Morty Proxy This is a proxified and sanitized view of the page, visit original site.