diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index aa9a099c0..5c8734fd6 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -35,6 +35,15 @@ body:
description: Provide any additional context and screenshots here to help us solve this issue
validations:
required: false
+ - type: input
+ id: browserdetails
+ attributes:
+ label: Browser Details
+ description: |
+ If this is an issue that occurs when using the BookStack interface, please provide details of the browser used which presents the reported issue.
+ placeholder: (eg. Firefox 97 (64-bit) on Windows 11)
+ validations:
+ required: false
- type: input
id: bsversion
attributes:
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index 4826cc5ea..fb1e0b3b0 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -33,8 +33,7 @@ body:
attributes:
label: Have you searched for an existing open/closed issue?
description: |
- To help us keep these issues under control, please ensure you have first [searched our issue list](https://github.com/BookStackApp/BookStack/issues?q=is%3Aissue)
- for any existing issues that cover the fundemental benefit/goal of your request.
+ To help us keep these issues under control, please ensure you have first [searched our issue list](https://github.com/BookStackApp/BookStack/issues?q=is%3Aissue) for any existing issues that cover the fundemental benefit/goal of your request.
options:
- label: I have searched for existing issues and none cover my fundemental request
required: true
diff --git a/readme.md b/readme.md
index 6bc34256a..25c840a62 100644
--- a/readme.md
+++ b/readme.md
@@ -63,7 +63,7 @@ Below is a high-level road map view for BookStack to provide a sense of directio
- **Platform REST API** - *(Most actions implemented, maturing)*
- *A REST API covering, at minimum, control of core content models (Books, Chapters, Pages) for automation and platform extension.*
-- **Editor Alignment & Review** - *(Started)*
+- **Editor Alignment & Review** - *(In Progress)*
- *Review the page editors with goal of achieving increased interoperability & feature parity while also considering collaborative editing potential.*
- **Permission System Review**
- *Improvement in how permissions are applied and a review of the efficiency of the permission & roles system.*
diff --git a/resources/js/components/code-editor.js b/resources/js/components/code-editor.js
index a8a2c0c6f..f44de813d 100644
--- a/resources/js/components/code-editor.js
+++ b/resources/js/components/code-editor.js
@@ -59,12 +59,10 @@ class CodeEditor {
this.languageInput.value = language;
this.callback = callback;
- this.show();
- this.updateEditorMode(language);
-
- window.importVersioned('code').then(Code => {
- Code.setContent(this.editor, code);
- });
+ this.show()
+ .then(() => this.updateEditorMode(language))
+ .then(() => window.importVersioned('code'))
+ .then(Code => Code.setContent(this.editor, code));
}
async show() {
diff --git a/resources/js/wysiwyg/plugin-codeeditor.js b/resources/js/wysiwyg/plugin-codeeditor.js
index 12b2c25fb..b0640a450 100644
--- a/resources/js/wysiwyg/plugin-codeeditor.js
+++ b/resources/js/wysiwyg/plugin-codeeditor.js
@@ -91,15 +91,35 @@ function defineCodeBlockCustomElement(editor) {
}
connectedCallback() {
+ const connectedTime = Date.now();
if (this.cm) {
return;
}
+ this.cleanChildContent();
+
const container = this.shadowRoot.querySelector('.CodeMirrorContainer');
- importVersioned('code').then(Code => {
+ const renderCodeMirror = (Code) => {
this.cm = Code.wysiwygView(container, this.getContent(), this.getLanguage());
+ Code.updateLayout(this.cm);
+ };
+
+ window.importVersioned('code').then((Code) => {
+ const timeout = (Date.now() - connectedTime < 20) ? 20 : 0;
+ setTimeout(() => renderCodeMirror(Code), timeout);
});
}
+
+ cleanChildContent() {
+ const pre = this.querySelector('pre');
+ if (!pre) return;
+
+ for (const preChild of pre.childNodes) {
+ if (preChild.nodeName === '#text' && preChild.textContent === '') {
+ preChild.remove();
+ }
+ }
+ }
}
win.customElements.define('code-block', CodeBlockElement);
@@ -130,15 +150,13 @@ function register(editor, url) {
} else {
const textContent = editor.selection.getContent({format: 'text'});
showPopup(editor, textContent, '', (newCode, newLang) => {
- const wrap = doc.createElement('code-block');
const pre = doc.createElement('pre');
const code = doc.createElement('code');
code.classList.add(`language-${newLang}`);
code.innerText = newCode;
pre.append(code);
- wrap.append(pre);
- editor.insertContent(wrap.outerHTML);
+ editor.insertContent(pre.outerHTML);
});
}
});
@@ -168,7 +186,7 @@ function register(editor, url) {
editor.parser.addNodeFilter('code-block', function(elms) {
for (const el of elms) {
- el.attr('content-editable', 'false');
+ el.attr('contenteditable', 'false');
}
});
diff --git a/resources/lang/zh_CN/editor.php b/resources/lang/zh_CN/editor.php
index 4fefa3f1a..5a6fbc708 100644
--- a/resources/lang/zh_CN/editor.php
+++ b/resources/lang/zh_CN/editor.php
@@ -57,7 +57,7 @@ return [
'list_numbered' => '有序列表',
'indent_increase' => '增加缩进',
'indent_decrease' => '减少缩进',
- 'table' => '表',
+ 'table' => '表格',
'insert_image' => '插入图片',
'insert_image_title' => '插入/编辑图片',
'insert_link' => '插入/编辑链接',
diff --git a/resources/views/pages/edit.blade.php b/resources/views/pages/edit.blade.php
index 6d2c3d484..30158e852 100644
--- a/resources/views/pages/edit.blade.php
+++ b/resources/views/pages/edit.blade.php
@@ -1,7 +1,7 @@
@extends('layouts.base')
@section('head')
-
+
@stop
@section('body-class', 'flexbox')