});
}
+/**
+ * @param {HTMLElement} codeElem
+ * @returns {String}
+ */
+function getDirectionFromCodeBlock(codeElem) {
+ let dir = '';
+ const innerCodeElem = codeElem.querySelector('code');
+
+ if (innerCodeElem && innerCodeElem.hasAttribute('dir')) {
+ dir = innerCodeElem.getAttribute('dir');
+ } else if (codeElem.hasAttribute('dir')) {
+ dir = codeElem.getAttribute('dir');
+ }
+
+ return dir;
+}
+
/**
* Add code highlighting to a single element.
* @param {HTMLElement} elem
const content = elem.textContent.trimEnd();
let langName = '';
- let innerCodeDirection = '';
if (innerCodeElem !== null) {
langName = innerCodeElem.className.replace('language-', '');
- innerCodeDirection = innerCodeElem.getAttribute('dir');
}
const wrapper = document.createElement('div');
elem.parentNode.insertBefore(wrapper, elem);
- const direction = innerCodeDirection || elem.getAttribute('dir') || '';
+ const direction = getDirectionFromCodeBlock(elem);
if (direction) {
wrapper.setAttribute('dir', direction);
}
this.hide();
}
- async open(code, language, saveCallback, cancelCallback) {
+ async open(code, language, direction, saveCallback, cancelCallback) {
this.languageInput.value = language;
this.saveCallback = saveCallback;
this.cancelCallback = cancelCallback;
await this.show();
this.languageInputChange(language);
this.editor.setContent(code);
+ this.setDirection(direction);
}
async show() {
});
}
+ setDirection(direction) {
+ const target = this.editorInput.parentElement;
+ if (direction) {
+ target.setAttribute('dir', direction);
+ } else {
+ target.removeAttribute('dir');
+ }
+ }
+
hide() {
this.getPopup().hide();
this.addHistory();
* @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) {
+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, (newCode, newLang) => {
+ codeEditor.open(code, language, direction, (newCode, newLang) => {
callback(newCode, newLang);
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);
});
}
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 direction = el.attr('dir');
+ 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);
}