1 require('codemirror/mode/css/css');
2 require('codemirror/mode/clike/clike');
3 require('codemirror/mode/diff/diff');
4 require('codemirror/mode/go/go');
5 require('codemirror/mode/htmlmixed/htmlmixed');
6 require('codemirror/mode/javascript/javascript');
7 require('codemirror/mode/markdown/markdown');
8 require('codemirror/mode/nginx/nginx');
9 require('codemirror/mode/php/php');
10 require('codemirror/mode/powershell/powershell');
11 require('codemirror/mode/python/python');
12 require('codemirror/mode/ruby/ruby');
13 require('codemirror/mode/shell/shell');
14 require('codemirror/mode/sql/sql');
15 require('codemirror/mode/toml/toml');
16 require('codemirror/mode/xml/xml');
17 require('codemirror/mode/yaml/yaml');
19 const CodeMirror = require('codemirror');
33 javascript: 'javascript',
34 json: {name: 'javascript', json: true},
41 powershell: 'powershell',
57 * Highlight pre elements on a page
59 function highlight() {
60 let codeBlocks = document.querySelectorAll('.page-content pre, .comment-box .content pre');
61 for (let i = 0; i < codeBlocks.length; i++) {
62 highlightElem(codeBlocks[i]);
67 * Add code highlighting to a single element.
68 * @param {HTMLElement} elem
70 function highlightElem(elem) {
71 let innerCodeElem = elem.querySelector('code[class^=language-]');
73 if (innerCodeElem !== null) {
74 let langName = innerCodeElem.className.replace('language-', '');
75 mode = getMode(langName);
77 elem.innerHTML = elem.innerHTML.replace(/<br\s*[\/]?>/gi ,'\n');
78 let content = elem.textContent.trim();
80 CodeMirror(function(elt) {
81 elem.parentNode.replaceChild(elt, elem);
92 * Search for a codemirror code based off a user suggestion
96 function getMode(suggestion) {
97 suggestion = suggestion.trim().replace(/^\./g, '').toLowerCase();
98 return (typeof modeMap[suggestion] !== 'undefined') ? modeMap[suggestion] : '';
102 * Ge the theme to use for CodeMirror instances.
103 * @returns {*|string}
105 function getTheme() {
106 return window.codeTheme || 'base16-light';
110 * Create a CodeMirror instance for showing inside the WYSIWYG editor.
111 * Manages a textarea element to hold code content.
112 * @param {HTMLElement} elem
113 * @returns {{wrap: Element, editor: *}}
115 function wysiwygView(elem) {
116 let doc = elem.ownerDocument;
117 let codeElem = elem.querySelector('code');
119 let lang = (elem.className || '').replace('language-', '');
120 if (lang === '' && codeElem) {
121 lang = (codeElem.className || '').replace('language-', '')
124 elem.innerHTML = elem.innerHTML.replace(/<br\s*[\/]?>/gi ,'\n');
125 let content = elem.textContent;
126 let newWrap = doc.createElement('div');
127 let newTextArea = doc.createElement('textarea');
129 newWrap.className = 'CodeMirrorContainer';
130 newWrap.setAttribute('data-lang', lang);
131 newTextArea.style.display = 'none';
132 elem.parentNode.replaceChild(newWrap, elem);
134 newWrap.appendChild(newTextArea);
135 newWrap.contentEditable = false;
136 newTextArea.textContent = content;
138 let cm = CodeMirror(function(elt) {
139 newWrap.appendChild(elt);
150 return {wrap: newWrap, editor: cm};
154 * Create a CodeMirror instance to show in the WYSIWYG pop-up editor
155 * @param {HTMLElement} elem
156 * @param {String} modeSuggestion
159 function popupEditor(elem, modeSuggestion) {
160 let content = elem.textContent;
162 return CodeMirror(function(elt) {
163 elem.parentNode.insertBefore(elt, elem);
164 elem.style.display = 'none';
167 mode: getMode(modeSuggestion),
175 * Set the mode of a codemirror instance.
177 * @param modeSuggestion
179 function setMode(cmInstance, modeSuggestion) {
180 cmInstance.setOption('mode', getMode(modeSuggestion));
184 * Set the content of a cm instance.
188 function setContent(cmInstance, codeContent) {
189 cmInstance.setValue(codeContent);
191 cmInstance.refresh();
196 * Get a CodeMirror instace to use for the markdown editor.
197 * @param {HTMLElement} elem
200 function markdownEditor(elem) {
201 let content = elem.textContent;
203 return CodeMirror(function (elt) {
204 elem.parentNode.insertBefore(elt, elem);
205 elem.style.display = 'none';
216 * Get the 'meta' key dependant on the user's system.
219 function getMetaKey() {
220 let mac = CodeMirror.keyMap["default"] == CodeMirror.keyMap.macDefault;
221 return mac ? "Cmd" : "Ctrl";
225 highlight: highlight,
226 highlightElem: highlightElem,
227 wysiwygView: wysiwygView,
228 popupEditor: popupEditor,
230 setContent: setContent,
231 markdownEditor: markdownEditor,
232 getMetaKey: getMetaKey,