- Fixed issues with new code blocks breaking or acting odd due to
misnamed contenteditable attribute.
- Helped fix issue where code blocks may show in a strage blank state
due to timing within shadow dom loading.
- Fixed some function timing issues where some functions required their
async predecessor to have finished.
Tested rather heavily in firefox and brave.
Fixes #3292
this.languageInput.value = language;
this.callback = callback;
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));
+ const connectedTime = Date.now();
+ this.cleanChildContent();
+
const container = this.shadowRoot.querySelector('.CodeMirrorContainer');
const container = this.shadowRoot.querySelector('.CodeMirrorContainer');
- importVersioned('code').then(Code => {
+ const renderCodeMirror = (Code) => {
this.cm = Code.wysiwygView(container, this.getContent(), this.getLanguage());
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);
}
win.customElements.define('code-block', CodeBlockElement);
} else {
const textContent = editor.selection.getContent({format: 'text'});
showPopup(editor, textContent, '', (newCode, newLang) => {
} 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);
const pre = doc.createElement('pre');
const code = doc.createElement('code');
code.classList.add(`language-${newLang}`);
code.innerText = newCode;
pre.append(code);
- editor.insertContent(wrap.outerHTML);
+ editor.insertContent(pre.outerHTML);
editor.parser.addNodeFilter('code-block', function(elms) {
for (const el of elms) {
editor.parser.addNodeFilter('code-block', function(elms) {
for (const el of elms) {
- el.attr('content-editable', 'false');
+ el.attr('contenteditable', 'false');