X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/956eb1308fe63b0d1b3cc3765a2f2b77d2dc8396..refs/pull/4467/head:/app/Entities/Tools/PageEditorData.php diff --git a/app/Entities/Tools/PageEditorData.php b/app/Entities/Tools/PageEditorData.php index a6818839d..3c7c9e2ea 100644 --- a/app/Entities/Tools/PageEditorData.php +++ b/app/Entities/Tools/PageEditorData.php @@ -2,21 +2,22 @@ namespace BookStack\Entities\Tools; +use BookStack\Activity\Tools\CommentTree; use BookStack\Entities\Models\Page; use BookStack\Entities\Repos\PageRepo; +use BookStack\Entities\Tools\Markdown\HtmlToMarkdown; +use BookStack\Entities\Tools\Markdown\MarkdownToHtml; class PageEditorData { - protected Page $page; - protected PageRepo $pageRepo; - protected array $viewData; protected array $warnings; - public function __construct(Page $page, PageRepo $pageRepo) - { - $this->page = $page; - $this->pageRepo = $pageRepo; + public function __construct( + protected Page $page, + protected PageRepo $pageRepo, + protected string $requestedEditor + ) { $this->viewData = $this->build(); } @@ -53,6 +54,9 @@ class PageEditorData $this->warnings[] = $editActivity->getEditingActiveDraftMessage($userDraft); } + $editorType = $this->getEditorType($page); + $this->updateContentForEditor($page, $editorType); + return [ 'page' => $page, 'book' => $page->book, @@ -60,8 +64,49 @@ class PageEditorData 'isDraftRevision' => $isDraftRevision, 'draftsEnabled' => $draftsEnabled, 'templates' => $templates, - 'editor' => setting('app-editor') === 'wysiwyg' ? 'wysiwyg' : 'markdown', + 'editor' => $editorType, + 'comments' => new CommentTree($page), ]; } -} \ No newline at end of file + protected function updateContentForEditor(Page $page, string $editorType): void + { + $isHtml = !empty($page->html) && empty($page->markdown); + + // HTML to markdown-clean conversion + if ($editorType === 'markdown' && $isHtml && $this->requestedEditor === 'markdown-clean') { + $page->markdown = (new HtmlToMarkdown($page->html))->convert(); + } + + // Markdown to HTML conversion if we don't have HTML + if ($editorType === 'wysiwyg' && !$isHtml) { + $page->html = (new MarkdownToHtml($page->markdown))->convert(); + } + } + + /** + * Get the type of editor to show for editing the given page. + * Defaults based upon the current content of the page otherwise will fall back + * to system default but will take a requested type (if provided) if permissions allow. + */ + protected function getEditorType(Page $page): string + { + $editorType = $page->editor ?: self::getSystemDefaultEditor(); + + // Use requested editor if valid and if we have permission + $requestedType = explode('-', $this->requestedEditor)[0]; + if (($requestedType === 'markdown' || $requestedType === 'wysiwyg') && userCan('editor-change')) { + $editorType = $requestedType; + } + + return $editorType; + } + + /** + * Get the configured system default editor. + */ + public static function getSystemDefaultEditor(): string + { + return setting('app-editor') === 'markdown' ? 'markdown' : 'wysiwyg'; + } +}