Add WoltLabSuite/Core/Prism
authorTim Düsterhus <duesterhus@woltlab.com>
Tue, 20 Nov 2018 20:20:13 +0000 (21:20 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Thu, 29 Nov 2018 14:42:14 +0000 (15:42 +0100)
see #2752

wcfsetup/install/files/js/WoltLabSuite/Core/Prism.js [new file with mode: 0644]
wcfsetup/install/files/js/require.config.js

diff --git a/wcfsetup/install/files/js/WoltLabSuite/Core/Prism.js b/wcfsetup/install/files/js/WoltLabSuite/Core/Prism.js
new file mode 100644 (file)
index 0000000..76195f8
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ * Augments the Prism syntax highlighter with additional functions.
+ * 
+ * @author     Tim Duesterhus
+ * @copyright  2001-2018 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @module     WoltLabSuite/Core/Prism
+ */
+
+window.Prism = window.Prism || {}
+window.Prism.manual = true
+
+define(['prism/prism'], function () {
+       Prism.highlightSeparateLines = function (text, language) {
+               var     frag = new DocumentFragment(),
+                       lineNo = 1,
+                       it, node, line, grammar, container;
+               
+               function newLine() {
+                       var line = elCreate('span');
+                       elData(line, 'number', lineNo++);
+                       frag.appendChild(line);
+                       
+                       return line;
+               }
+               
+               function highlightStringIntoContainer() {
+                       var container = elCreate('div');
+                       container.innerHTML = Prism.highlight(text, grammar, language);
+                       return container;
+               }
+               
+               grammar = Prism.languages[language];
+               if (!grammar) {
+                       throw new Error('Invalid language ' + language + ' given.');
+               }
+               
+               container = highlightStringIntoContainer();
+               it = document.createNodeIterator(container, NodeFilter.SHOW_TEXT);
+               
+               line = newLine(lineNo);
+               while (node = it.nextNode()) {
+                       node.data.split(/\r?\n/).forEach(function (codeLine, index) {
+                               var current, parent;
+                               
+                               // We are behind a newline, insert \n and create new container.
+                               if (index >= 1) {
+                                       line.appendChild(document.createTextNode("\n"));
+                                       line = newLine(lineNo);
+                               }
+                               
+                               current = document.createTextNode(codeLine);
+                               
+                               // Copy hierarchy (to preserve CSS classes).
+                               parent = node.parentNode
+                               while (parent !== container) {
+                                       var clone = parent.cloneNode(false);
+                                       clone.appendChild(current);
+                                       current = clone;
+                                       parent = parent.parentNode;
+                               }
+                               
+                               line.appendChild(current);
+                       });
+               }
+               
+               return frag;
+       };
+
+       return Prism;
+})
index e9e544b71e14b50c0a80ea26ecb04f3d362f04bb..1986a377892f1ba612e9160e7c855b53c2837a4e 100644 (file)
@@ -3,7 +3,8 @@ requirejs.config({
        paths: {
                enquire: '3rdParty/enquire',
                favico: '3rdParty/favico',
-               'perfect-scrollbar': '3rdParty/perfect-scrollbar'
+               'perfect-scrollbar': '3rdParty/perfect-scrollbar',
+               prism: '3rdParty/prism',
        },
        shim: {
                enquire: { exports: 'enquire' },