]> BookStack Code Mirror - bookstack/blob - resources/assets/js/code.js
020c38365dd79b02a96aeecf51edbd85e073cdd0
[bookstack] / resources / assets / js / code.js
1 require('codemirror/mode/css/css');
2 require('codemirror/mode/clike/clike');
3 require('codemirror/mode/go/go');
4 require('codemirror/mode/htmlmixed/htmlmixed');
5 require('codemirror/mode/javascript/javascript');
6 require('codemirror/mode/markdown/markdown');
7 require('codemirror/mode/nginx/nginx');
8 require('codemirror/mode/php/php');
9 require('codemirror/mode/powershell/powershell');
10 require('codemirror/mode/python/python');
11 require('codemirror/mode/ruby/ruby');
12 require('codemirror/mode/shell/shell');
13 require('codemirror/mode/sql/sql');
14 require('codemirror/mode/toml/toml');
15 require('codemirror/mode/xml/xml');
16 require('codemirror/mode/yaml/yaml');
17
18 const CodeMirror = require('codemirror');
19
20 const modeMap = {
21     css: 'css',
22     c: 'clike',
23     java: 'clike',
24     scala: 'clike',
25     kotlin: 'clike',
26     'c++': 'clike',
27     'c#': 'clike',
28     csharp: 'clike',
29     go: 'go',
30     html: 'htmlmixed',
31     javascript: 'javascript',
32     json: {name: 'javascript', json: true},
33     js: 'javascript',
34     php: 'php',
35     md: 'markdown',
36     mdown: 'markdown',
37     markdown: 'markdown',
38     nginx: 'nginx',
39     powershell: 'powershell',
40     py: 'python',
41     python: 'python',
42     ruby: 'ruby',
43     rb: 'ruby',
44     shell: 'shell',
45     bash: 'shell',
46     toml: 'toml',
47     sql: 'sql',
48     xml: 'xml',
49     yaml: 'yaml',
50     yml: 'yaml',
51 };
52
53 module.exports.highlight = function() {
54     let codeBlocks = document.querySelectorAll('.page-content pre');
55
56     for (let i = 0; i < codeBlocks.length; i++) {
57         let innerCodeElem = codeBlocks[i].querySelector('code[class^=language-]');
58         let mode = '';
59         if (innerCodeElem !== null) {
60             let langName = innerCodeElem.className.replace('language-', '');
61             if (typeof modeMap[langName] !== 'undefined') mode = modeMap[langName];
62         }
63         codeBlocks[i].innerHTML = codeBlocks[i].innerHTML.replace(/<br\s*[\/]?>/gi ,'\n');
64         let content = codeBlocks[i].textContent;
65         console.log('MODE', mode);
66
67         CodeMirror(function(elt) {
68             codeBlocks[i].parentNode.replaceChild(elt, codeBlocks[i]);
69         }, {
70             value: content,
71             mode:  mode,
72             lineNumbers: true,
73             theme: 'base16-light',
74             readOnly: true
75         });
76     }
77
78 };
79
80 module.exports.markdownEditor = function(elem) {
81     let content = elem.textContent;
82
83     let cm = CodeMirror(function(elt) {
84         elem.parentNode.insertBefore(elt, elem);
85         elem.style.display = 'none';
86     }, {
87         value: content,
88         mode:  "markdown",
89         lineNumbers: true,
90         theme: 'base16-light',
91         lineWrapping: true
92     });
93     return cm;
94
95 };
96