* @param {Editor} editor
* @param {String} code
* @param {String} language
+ * @param {String} direction
* @param {function(string, string)} callback (Receives (code: string,language: string)
*/
-function showPopup(editor, code, language, callback) {
- window.$components.first('code-editor').open(code, language, (newCode, newLang) => {
+function showPopup(editor, code, language, direction, callback) {
+ /** @var {CodeEditor} codeEditor * */
+ const codeEditor = window.$components.first('code-editor');
+ const bookMark = editor.selection.getBookmark();
+ codeEditor.open(code, language, direction, (newCode, newLang) => {
callback(newCode, newLang);
editor.focus();
+ editor.selection.moveToBookmark(bookMark);
+ }, () => {
+ editor.focus();
+ editor.selection.moveToBookmark(bookMark);
});
}
* @param {CodeBlockElement} codeBlock
*/
function showPopupForCodeBlock(editor, codeBlock) {
- showPopup(editor, codeBlock.getContent(), codeBlock.getLanguage(), (newCode, newLang) => {
+ const direction = codeBlock.getAttribute('dir') || '';
+ showPopup(editor, codeBlock.getContent(), codeBlock.getLanguage(), direction, (newCode, newLang) => {
codeBlock.setContent(newCode, newLang);
});
}
super();
this.attachShadow({mode: 'open'});
- const stylesToCopy = document.querySelectorAll('link[rel="stylesheet"]:not([media="print"])');
- const copiedStyles = Array.from(stylesToCopy).map(styleEl => styleEl.cloneNode(false));
+ const stylesToCopy = document.head.querySelectorAll('link[rel="stylesheet"]:not([media="print"]),style');
+ const copiedStyles = Array.from(stylesToCopy).map(styleEl => styleEl.cloneNode(true));
const cmContainer = document.createElement('div');
cmContainer.style.pointerEvents = 'none';
showPopupForCodeBlock(editor, selectedNode);
} else {
const textContent = editor.selection.getContent({format: 'text'});
- showPopup(editor, textContent, '', (newCode, newLang) => {
+ const direction = document.dir === 'rtl' ? 'ltr' : '';
+ showPopup(editor, textContent, '', direction, (newCode, newLang) => {
const pre = doc.createElement('pre');
const code = doc.createElement('code');
code.classList.add(`language-${newLang}`);
code.innerText = newCode;
- pre.append(code);
+ if (direction) {
+ pre.setAttribute('dir', direction);
+ }
+ pre.append(code);
editor.insertContent(pre.outerHTML);
});
}
contenteditable: 'false',
});
+ const childCodeBlock = el.children().filter(child => child.name === 'code')[0] || null;
+ const direction = el.attr('dir') || (childCodeBlock && childCodeBlock.attr('dir')) || '';
+ if (direction) {
+ wrapper.attr('dir', direction);
+ }
+
const spans = el.getAll('span');
for (const span of spans) {
span.unwrap();
editor.serializer.addNodeFilter('code-block', elms => {
for (const el of elms) {
+ const direction = el.attr('dir');
+ if (direction && el.firstChild) {
+ el.firstChild.attr('dir', direction);
+ } else if (el.firstChild) {
+ el.firstChild.attr('dir', null);
+ }
+
el.unwrap();
}
});