2022-04-18 06:01:14 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace BookStack\Entities\Tools;
|
|
|
|
|
2023-06-16 20:08:04 +08:00
|
|
|
use BookStack\Activity\Tools\CommentTree;
|
2022-04-18 06:01:14 +08:00
|
|
|
use BookStack\Entities\Models\Page;
|
2024-02-06 01:35:49 +08:00
|
|
|
use BookStack\Entities\Queries\EntityQueries;
|
2022-04-19 00:39:28 +08:00
|
|
|
use BookStack\Entities\Tools\Markdown\HtmlToMarkdown;
|
|
|
|
use BookStack\Entities\Tools\Markdown\MarkdownToHtml;
|
2022-04-18 06:01:14 +08:00
|
|
|
|
|
|
|
class PageEditorData
|
|
|
|
{
|
|
|
|
protected array $viewData;
|
|
|
|
protected array $warnings;
|
|
|
|
|
2023-06-16 20:08:04 +08:00
|
|
|
public function __construct(
|
|
|
|
protected Page $page,
|
2024-02-06 01:35:49 +08:00
|
|
|
protected EntityQueries $queries,
|
2023-06-16 20:08:04 +08:00
|
|
|
protected string $requestedEditor
|
|
|
|
) {
|
2022-04-18 06:01:14 +08:00
|
|
|
$this->viewData = $this->build();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getViewData(): array
|
|
|
|
{
|
|
|
|
return $this->viewData;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getWarnings(): array
|
|
|
|
{
|
|
|
|
return $this->warnings;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function build(): array
|
|
|
|
{
|
|
|
|
$page = clone $this->page;
|
|
|
|
$isDraft = boolval($this->page->draft);
|
2024-02-06 01:35:49 +08:00
|
|
|
$templates = $this->queries->pages->visibleTemplates()
|
|
|
|
->orderBy('name', 'asc')
|
|
|
|
->take(10)
|
2024-02-09 01:18:03 +08:00
|
|
|
->paginate()
|
|
|
|
->withPath('/templates');
|
2024-02-06 01:35:49 +08:00
|
|
|
|
2022-04-18 06:01:14 +08:00
|
|
|
$draftsEnabled = auth()->check();
|
|
|
|
|
|
|
|
$isDraftRevision = false;
|
|
|
|
$this->warnings = [];
|
|
|
|
$editActivity = new PageEditActivity($page);
|
|
|
|
|
|
|
|
if ($editActivity->hasActiveEditing()) {
|
|
|
|
$this->warnings[] = $editActivity->activeEditingMessage();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check for a current draft version for this user
|
2024-02-09 01:18:03 +08:00
|
|
|
$userDraft = $this->queries->revisions->findLatestCurrentUserDraftsForPageId($page->id);
|
2024-02-06 01:35:49 +08:00
|
|
|
if (!is_null($userDraft)) {
|
2022-04-18 06:01:14 +08:00
|
|
|
$page->forceFill($userDraft->only(['name', 'html', 'markdown']));
|
|
|
|
$isDraftRevision = true;
|
|
|
|
$this->warnings[] = $editActivity->getEditingActiveDraftMessage($userDraft);
|
|
|
|
}
|
|
|
|
|
2022-04-19 00:39:28 +08:00
|
|
|
$editorType = $this->getEditorType($page);
|
|
|
|
$this->updateContentForEditor($page, $editorType);
|
|
|
|
|
2022-04-18 06:01:14 +08:00
|
|
|
return [
|
|
|
|
'page' => $page,
|
|
|
|
'book' => $page->book,
|
|
|
|
'isDraft' => $isDraft,
|
|
|
|
'isDraftRevision' => $isDraftRevision,
|
|
|
|
'draftsEnabled' => $draftsEnabled,
|
|
|
|
'templates' => $templates,
|
2022-04-19 00:39:28 +08:00
|
|
|
'editor' => $editorType,
|
2023-06-16 20:08:04 +08:00
|
|
|
'comments' => new CommentTree($page),
|
2022-04-18 06:01:14 +08:00
|
|
|
];
|
|
|
|
}
|
|
|
|
|
2024-09-23 03:06:55 +08:00
|
|
|
protected function updateContentForEditor(Page $page, PageEditorType $editorType): void
|
2022-04-19 00:39:28 +08:00
|
|
|
{
|
|
|
|
$isHtml = !empty($page->html) && empty($page->markdown);
|
|
|
|
|
|
|
|
// HTML to markdown-clean conversion
|
2024-09-23 03:06:55 +08:00
|
|
|
if ($editorType === PageEditorType::Markdown && $isHtml && $this->requestedEditor === 'markdown-clean') {
|
2022-04-19 00:39:28 +08:00
|
|
|
$page->markdown = (new HtmlToMarkdown($page->html))->convert();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Markdown to HTML conversion if we don't have HTML
|
2024-09-23 03:06:55 +08:00
|
|
|
if ($editorType->isHtmlBased() && !$isHtml) {
|
2022-04-19 00:39:28 +08:00
|
|
|
$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.
|
|
|
|
*/
|
2024-09-23 03:06:55 +08:00
|
|
|
protected function getEditorType(Page $page): PageEditorType
|
2022-04-19 00:39:28 +08:00
|
|
|
{
|
2024-09-23 03:06:55 +08:00
|
|
|
$editorType = PageEditorType::forPage($page) ?: PageEditorType::getSystemDefault();
|
2022-04-19 00:39:28 +08:00
|
|
|
|
|
|
|
// Use requested editor if valid and if we have permission
|
2024-09-23 03:06:55 +08:00
|
|
|
$requestedType = PageEditorType::fromRequestValue($this->requestedEditor);
|
|
|
|
if ($requestedType && userCan('editor-change')) {
|
2022-04-19 00:39:28 +08:00
|
|
|
$editorType = $requestedType;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $editorType;
|
|
|
|
}
|
2022-04-25 01:22:40 +08:00
|
|
|
}
|