]> BookStack Code Mirror - bookstack/blobdiff - app/Entities/Tools/PageEditorData.php
Fixed OIDC Logout
[bookstack] / app / Entities / Tools / PageEditorData.php
index a6818839dc27c9ed83491a3bfc3a10724a2f92d7..3c7c9e2eaf0954e04c73089d34ecea1202c942f0 100644 (file)
@@ -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';
+    }
+}