{
+ const pageEditorComponent = window.$components.first('page-editor') as PageEditor;
+ const editor = pageEditorComponent.getEditorComponent() as (MarkdownEditor|WysiwygEditorTinymce|WysiwygEditor);
+ return (await editor.getContent()).html;
+ }
+
+ protected parseHeadersFromHtml(html: string): ToolboxContentHeader[] {
+ const parser = new DOMParser();
+ const doc = parser.parseFromString(html, 'text/html');
+ const headerNodes = doc.querySelectorAll('h1, h2, h3, h4, h5, h6');
+ const headers: ToolboxContentHeader[] = [];
+
+ for (let i = 0; i < headerNodes.length; i++) {
+ const headerNode = headerNodes[i];
+ const level = Number(headerNode.tagName.replace('H', ''));
+ headers.push({
+ text: headerNode.textContent,
+ level,
+ id: headerNode.id || '',
+ index: i,
+ });
+ }
+
+ return headers;
+ }
+
+ protected rebaseHeaders(headers: ToolboxContentHeader[]): void {
+ if (headers.length === 0) {
+ return;
+ }
+
+ do {
+ var minLevel = Math.min(...headers.map(h => h.level));
+ if (minLevel > 1) {
+ for (const header of headers) {
+ header.level--;
+ }
+ }
+ } while (minLevel > 1);
+ }
+
+ protected headersToDom(headers: ToolboxContentHeader[]): HTMLElement {
+ const headerItems = headers.map(header => {
+ return elem('li', {
+ 'data-level': String(header.level),
+ id: header.id,
+ class: `page-nav-item h${header.level}`,
+ }, [
+ elem('a', {class: 'text-limit-lines-1 block', href: `#${header.id}`}, [header.text]),
+ elem('div', {class: 'link-background sidebar-page-nav-bullet'}),
+ ]);
+ });
+ return elem('ul', {
+ class: 'sidebar-page-nav menu'
+ }, headerItems);
+ }
+}
\ No newline at end of file
diff --git a/resources/js/services/vdom.ts b/resources/js/services/vdom.ts
index c32f328f5..051b1a42a 100644
--- a/resources/js/services/vdom.ts
+++ b/resources/js/services/vdom.ts
@@ -24,3 +24,7 @@ export function patchDomFromHtmlString(domTarget: Element, html: string): void {
contentDom.innerHTML = html;
getPatcher()(toVNode(domTarget), toVNode(contentDom));
}
+
+export function patchDomFromDom(domTarget: Element, domSource: Element): void {
+ getPatcher()(toVNode(domTarget), toVNode(domSource));
+}
diff --git a/resources/sass/_lists.scss b/resources/sass/_lists.scss
index d9a1195aa..249dca0d5 100644
--- a/resources/sass/_lists.scss
+++ b/resources/sass/_lists.scss
@@ -93,6 +93,8 @@
list-style: none;
@include mixins.margin(vars.$s, 0, vars.$m, vars.$xs);
position: relative;
+ padding-inline: 0;
+ display: block;
&:after {
content: '';
display: block;
@@ -153,6 +155,14 @@
}
}
}
+.toolbox-tab-content .sidebar-page-nav {
+ .sidebar-page-nav-bullet {
+ box-shadow: 0 0 0 6px #FFFFFF;
+ }
+ li {
+ font-size: 1em;
+ }
+}
// Sidebar list
.book-tree .sidebar-page-list {
diff --git a/resources/views/pages/parts/editor-toolbox.blade.php b/resources/views/pages/parts/editor-toolbox.blade.php
index 8b7a68a9a..8ef259b91 100644
--- a/resources/views/pages/parts/editor-toolbox.blade.php
+++ b/resources/views/pages/parts/editor-toolbox.blade.php
@@ -11,6 +11,7 @@
@if($comments->enabled())
@endif
+
@@ -37,4 +38,6 @@
@include('pages.parts.toolbox-comments')
@endif
+ @include('pages.parts.toolbox-contents')
+
diff --git a/resources/views/pages/parts/show-sidebar-section-page-nav.blade.php b/resources/views/pages/parts/show-sidebar-section-page-nav.blade.php
index 88db87e64..d046a8ca1 100644
--- a/resources/views/pages/parts/show-sidebar-section-page-nav.blade.php
+++ b/resources/views/pages/parts/show-sidebar-section-page-nav.blade.php
@@ -2,14 +2,14 @@
@endif
\ No newline at end of file
diff --git a/resources/views/pages/parts/toolbox-contents.blade.php b/resources/views/pages/parts/toolbox-contents.blade.php
new file mode 100644
index 000000000..6234cdf43
--- /dev/null
+++ b/resources/views/pages/parts/toolbox-contents.blade.php
@@ -0,0 +1,9 @@
+
+
{{ trans('entities.page_contents') }}
+
+
+
\ No newline at end of file
{{ trans('entities.page_contents_info') }}
+{{ trans('entities.page_contents_none') }}
+ +