]> BookStack Code Mirror - bookstack/blobdiff - resources/assets/js/code.js
Removes some unused code.
[bookstack] / resources / assets / js / code.js
index 83cb664a1ec1b942f4954319179a103baca9cbc6..014c4eb779674fc1234bd9b07aec90618e4afc10 100644 (file)
@@ -1,5 +1,6 @@
 require('codemirror/mode/css/css');
 require('codemirror/mode/clike/clike');
+require('codemirror/mode/diff/diff');
 require('codemirror/mode/go/go');
 require('codemirror/mode/htmlmixed/htmlmixed');
 require('codemirror/mode/javascript/javascript');
@@ -26,6 +27,7 @@ const modeMap = {
     'c++': 'clike',
     'c#': 'clike',
     csharp: 'clike',
+    diff: 'diff',
     go: 'go',
     html: 'htmlmixed',
     javascript: 'javascript',
@@ -42,6 +44,7 @@ const modeMap = {
     ruby: 'ruby',
     rb: 'ruby',
     shell: 'shell',
+    sh: 'shell',
     bash: 'shell',
     toml: 'toml',
     sql: 'sql',
@@ -62,7 +65,7 @@ function highlightElem(elem) {
     let mode = '';
     if (innerCodeElem !== null) {
         let langName = innerCodeElem.className.replace('language-', '');
-        if (typeof modeMap[langName] !== 'undefined') mode = modeMap[langName];
+        mode = getMode(langName);
     }
     elem.innerHTML = elem.innerHTML.replace(/<br\s*[\/]?>/gi ,'\n');
     let content = elem.textContent;
@@ -78,16 +81,34 @@ function highlightElem(elem) {
     });
 }
 
+/**
+ * Search for a codemirror code based off a user suggestion
+ * @param suggestion
+ * @returns {string}
+ */
+function getMode(suggestion) {
+    suggestion = suggestion.trim().replace(/^\./g, '').toLowerCase();
+    return (typeof modeMap[suggestion] !== 'undefined') ? modeMap[suggestion] : '';
+}
+
 module.exports.highlightElem = highlightElem;
 
 module.exports.wysiwygView = function(elem) {
     let doc = elem.ownerDocument;
+    let codeElem = elem.querySelector('code');
+
+    let lang = (elem.className || '').replace('language-', '');
+    if (lang === '' && codeElem) {
+        lang = (codeElem.className || '').replace('language-', '')
+    }
+
     elem.innerHTML = elem.innerHTML.replace(/<br\s*[\/]?>/gi ,'\n');
     let content = elem.textContent;
     let newWrap = doc.createElement('div');
     let newTextArea = doc.createElement('textarea');
 
     newWrap.className = 'CodeMirrorContainer';
+    newWrap.setAttribute('data-lang', lang);
     newTextArea.style.display = 'none';
     elem.parentNode.replaceChild(newWrap, elem);
 
@@ -99,7 +120,7 @@ module.exports.wysiwygView = function(elem) {
         newWrap.appendChild(elt);
     }, {
         value: content,
-        mode:  '',
+        mode:  getMode(lang),
         lineNumbers: true,
         theme: 'base16-light',
         readOnly: true
@@ -107,50 +128,51 @@ module.exports.wysiwygView = function(elem) {
     setTimeout(() => {
         cm.refresh();
     }, 300);
-    return newWrap;
+    return {wrap: newWrap, editor: cm};
+};
+
+module.exports.popupEditor = function(elem, modeSuggestion) {
+    let content = elem.textContent;
+
+    return CodeMirror(function(elt) {
+        elem.parentNode.insertBefore(elt, elem);
+        elem.style.display = 'none';
+    }, {
+        value: content,
+        mode:  getMode(modeSuggestion),
+        lineNumbers: true,
+        theme: 'base16-light',
+        lineWrapping: true
+    });
 };
 
-// module.exports.wysiwygEditor = function(elem) {
-//     let doc = elem.ownerDocument;
-//     let newWrap = doc.createElement('div');
-//     newWrap.className = 'CodeMirrorContainer';
-//     let newTextArea = doc.createElement('textarea');
-//     newTextArea.style.display = 'none';
-//     elem.innerHTML = elem.innerHTML.replace(/<br\s*[\/]?>/gi ,'\n');
-//     let content = elem.textContent;
-//     elem.parentNode.replaceChild(newWrap, elem);
-//     newWrap.appendChild(newTextArea);
-//     let cm = CodeMirror(function(elt) {
-//         newWrap.appendChild(elt);
-//     }, {
-//         value: content,
-//         mode:  '',
-//         lineNumbers: true,
-//         theme: 'base16-light',
-//         readOnly: true
-//     });
-//     cm.on('change', event => {
-//         newTextArea.innerText = cm.getValue();
-//     });
-//     setTimeout(() => {
-//         cm.refresh();
-//     }, 300);
-// };
+module.exports.setMode = function(cmInstance, modeSuggestion) {
+      cmInstance.setOption('mode', getMode(modeSuggestion));
+};
+module.exports.setContent = function(cmInstance, codeContent) {
+    cmInstance.setValue(codeContent);
+    setTimeout(() => {
+        cmInstance.refresh();
+    }, 10);
+};
 
 module.exports.markdownEditor = function(elem) {
     let content = elem.textContent;
 
-    let cm = CodeMirror(function(elt) {
+    return CodeMirror(function (elt) {
         elem.parentNode.insertBefore(elt, elem);
         elem.style.display = 'none';
     }, {
         value: content,
-        mode:  "markdown",
+        mode: "markdown",
         lineNumbers: true,
         theme: 'base16-light',
         lineWrapping: true
     });
-    return cm;
+};
 
+module.exports.getMetaKey = function() {
+    let mac = CodeMirror.keyMap["default"] == CodeMirror.keyMap.macDefault;
+    return mac ? "Cmd" : "Ctrl";
 };