Files
2026-03-20 17:13:38 +01:00

308 lines
11 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* globals Prism */
(function ($, Prism) {
'use strict';
// My plugin default options
var defaultOptions = {
enableLineHighlight: true,
languageNames: {
// For updated list of languages
// see https://github.com/PrismJS/prism/blob/master/plugins/show-language/prism-show-language.js
'html': 'HTML',
'xml': 'XML',
'svg': 'SVG',
'mathml': 'MathML',
'ssml': 'SSML',
'css': 'CSS',
'clike': 'C-like',
'js': 'JavaScript',
'abap': 'ABAP',
'abnf': 'Augmented BackusNaur form',
'al': 'AL',
'antlr4': 'ANTLR4',
'g4': 'ANTLR4',
'apacheconf': 'Apache Configuration',
'apl': 'APL',
'aql': 'AQL',
'arff': 'ARFF',
'asciidoc': 'AsciiDoc',
'adoc': 'AsciiDoc',
'asm6502': '6502 Assembly',
'aspnet': 'ASP.NET (C#)',
'autohotkey': 'AutoHotkey',
'autoit': 'AutoIt',
'basic': 'BASIC',
'bbcode': 'BBcode',
'bnf': 'BackusNaur form',
'rbnf': 'Routing BackusNaur form',
'conc': 'Concurnas',
'csharp': 'C#',
'cs': 'C#',
'dotnet': 'C#',
'cpp': 'C++',
'cil': 'CIL',
'coffee': 'CoffeeScript',
'cmake': 'CMake',
'csp': 'Content-Security-Policy',
'css-extras': 'CSS Extras',
'dax': 'DAX',
'django': 'Django/Jinja2',
'jinja2': 'Django/Jinja2',
'dns-zone-file': 'DNS zone file',
'dns-zone': 'DNS zone file',
'dockerfile': 'Docker',
'ebnf': 'Extended BackusNaur form',
'ejs': 'EJS',
'etlua': 'Embedded Lua templating',
'erb': 'ERB',
'excel-formula': 'Excel Formula',
'xlsx': 'Excel Formula',
'xls': 'Excel Formula',
'fsharp': 'F#',
'firestore-security-rules': 'Firestore security rules',
'ftl': 'FreeMarker Template Language',
'gcode': 'G-code',
'gdscript': 'GDScript',
'gedcom': 'GEDCOM',
'glsl': 'GLSL',
'gml': 'GameMaker Language',
'gamemakerlanguage': 'GameMaker Language',
'graphql': 'GraphQL',
'hs': 'Haskell',
'hcl': 'HCL',
'hlsl': 'HLSL',
'http': 'HTTP',
'hpkp': 'HTTP Public-Key-Pins',
'hsts': 'HTTP Strict-Transport-Security',
'ichigojam': 'IchigoJam',
'iecst': 'Structured Text (IEC 61131-3)',
'inform7': 'Inform 7',
'javadoc': 'JavaDoc',
'javadoclike': 'JavaDoc-like',
'javastacktrace': 'Java stack trace',
'jq': 'JQ',
'jsdoc': 'JSDoc',
'js-extras': 'JS Extras',
'js-templates': 'JS Templates',
'json': 'JSON',
'jsonp': 'JSONP',
'json5': 'JSON5',
'latex': 'LaTeX',
'tex': 'TeX',
'context': 'ConTeXt',
'lilypond': 'LilyPond',
'ly': 'LilyPond',
'emacs': 'Lisp',
'elisp': 'Lisp',
'emacs-lisp': 'Lisp',
'llvm': 'LLVM IR',
'lolcode': 'LOLCODE',
'md': 'Markdown',
'markup-templating': 'Markup templating',
'matlab': 'MATLAB',
'mel': 'MEL',
'moon': 'MoonScript',
'n1ql': 'N1QL',
'n4js': 'N4JS',
'n4jsd': 'N4JS',
'nand2tetris-hdl': 'Nand To Tetris HDL',
'nasm': 'NASM',
'neon': 'NEON',
'nginx': 'nginx',
'nsis': 'NSIS',
'objectivec': 'Objective-C',
'objc': 'Objective-C',
'ocaml': 'OCaml',
'opencl': 'OpenCL',
'parigp': 'PARI/GP',
'objectpascal': 'Object Pascal',
'pcaxis': 'PC-Axis',
'px': 'PC-Axis',
'peoplecode': 'PeopleCode',
'pcode': 'PeopleCode',
'php': 'PHP',
'phpdoc': 'PHPDoc',
'php-extras': 'PHP Extras',
'plsql': 'PL/SQL',
'powerquery': 'PowerQuery',
'pq': 'PowerQuery',
'mscript': 'PowerQuery',
'powershell': 'PowerShell',
'properties': '.properties',
'protobuf': 'Protocol Buffers',
'py': 'Python',
'q': 'Q (kdb+ database)',
'qml': 'QML',
'rkt': 'Racket',
'jsx': 'React JSX',
'tsx': 'React TSX',
'renpy': 'Ren\'py',
'rest': 'reST (reStructuredText)',
'robotframework': 'Robot Framework',
'robot': 'Robot Framework',
'rb': 'Ruby',
'sas': 'SAS',
'sass': 'Sass (Sass)',
'scss': 'Sass (Scss)',
'shell-session': 'Shell session',
'solidity': 'Solidity (Ethereum)',
'solution-file': 'Solution file',
'sln': 'Solution file',
'soy': 'Soy (Closure Template)',
'sparql': 'SPARQL',
'rq': 'SPARQL',
'splunk-spl': 'Splunk SPL',
'sqf': 'SQF: Status Quo Function (Arma 3)',
'sql': 'SQL',
'tap': 'TAP',
'toml': 'TOML',
'tt2': 'Template Toolkit 2',
'trig': 'TriG',
'ts': 'TypeScript',
't4-cs': 'T4 Text Templates (C#)',
't4': 'T4 Text Templates (C#)',
't4-vb': 'T4 Text Templates (VB)',
't4-templating': 'T4 templating',
'uscript': 'UnrealScript',
'uc': 'UnrealScript',
'vbnet': 'VB.Net',
'vhdl': 'VHDL',
'vim': 'vim',
'visual-basic': 'Visual Basic',
'vb': 'Visual Basic',
'wasm': 'WebAssembly',
'wiki': 'Wiki markup',
'xeoracube': 'XeoraCube',
'xojo': 'Xojo (REALbasic)',
'xquery': 'XQuery',
'yaml': 'YAML',
'yml': 'YAML'
}
};
function highlightIt(text, language, lineHighlight) {
return [
'<pre class="language-' + language + '" ' + (lineHighlight ? 'data-line="' + lineHighlight + '"' : '') + '>',
'<code class="language-' + language + '">' + Prism.highlight(text, Prism.languages[language]) + '</code>',
'</pre>',
].join('');
}
function escapeHtml(html) {
return $('<div/>').text(html).html();
}
function buildHighlightOptions(trumbowyg) {
var languageNames = trumbowyg.o.plugins.highlight.languageNames;
var languageNameKeys = Object.keys(languageNames);
var prismLanguageKeys = Object.keys(Prism.languages);
var options = prismLanguageKeys.filter(function (languageKey) {
return languageNameKeys.indexOf(languageKey) >= 0;
}).map(function (languageKey) {
return {
id: languageKey,
name: languageNames[languageKey]
};
}).sort(function(a, b){
// Sort languages by name
return a.name.localeCompare(b.name);
}).map(function( language){
// Generate a list of options
return '<option value="' + escapeHtml(language.id) + '">' + escapeHtml(language.name) + '</option>';
}).join('');
return options;
}
function buildLineHighlightFieldIfEnabled(trumbowyg) {
if (trumbowyg.o.plugins.highlight.enableLineHighlight === false) {
return '';
}
return '<div class="' + trumbowyg.o.prefix + 'highlight-form-group">' +
' <input placeholder="' + trumbowyg.lang.highlightLine +
'" class="' + trumbowyg.o.prefix + 'highlight-form-control trumbowyg-line-highlight"/>' +
'</div>';
}
// If my plugin is a button
function buildButtonDef(trumbowyg) {
return {
fn: function () {
var $modal = trumbowyg.openModal('Code', [
'<div class="' + trumbowyg.o.prefix + 'highlight-form-group">',
' <select class="' + trumbowyg.o.prefix + 'highlight-form-control language" autofocus>',
buildHighlightOptions(trumbowyg),
' </select>',
'</div>',
'<div class="' + trumbowyg.o.prefix + 'highlight-form-group">',
' <textarea class="' + trumbowyg.o.prefix + 'highlight-form-control code"></textarea>',
'</div>',
buildLineHighlightFieldIfEnabled(trumbowyg),
].join('\n')),
$language = $modal.find('.language'),
$code = $modal.find('.code'),
$lineHighlight = $modal.find('.trumbowyg-line-highlight');
// Listen clicks on modal box buttons
$modal.on('tbwconfirm', function () {
trumbowyg.restoreRange();
trumbowyg.execCmd('insertHTML', highlightIt($code.val(), $language.val(), $lineHighlight.val()));
trumbowyg.execCmd('insertHTML', '<p><br></p>');
trumbowyg.closeModal();
});
$modal.on('tbwcancel', function () {
trumbowyg.closeModal();
});
}
};
}
$.extend(true, $.trumbowyg, {
// Add some translations
langs: {
// jshint camelcase:false
en: {
highlight: 'Code syntax highlight',
highlightLine: 'Highlight lines, e.g.: 1,3-5'
},
es: {
highlight: 'Resaltado de sintaxis de código',
highlightLine: 'Resaltar lineas, ej: 1,3-5'
},
et: {
highlight: 'Koodi esiletoomine',
highlightLine: 'Koodiread, näiteks: 1,3-5'
},
hu: {
highlight: 'Kód kiemelés'
},
ko: {
highlight: '코드 문법 하이라이트'
},
pt_br: {
highlight: 'Realçar sintaxe de código'
},
// jshint camelcase:true
},
// Add our plugin to Trumbowyg registered plugins
plugins: {
highlight: {
init: function (trumbowyg) {
// Fill current Trumbowyg instance with my plugin default options
trumbowyg.o.plugins.highlight = $.extend(true, {},
defaultOptions,
trumbowyg.o.plugins.highlight || {}
);
// If my plugin is a button
trumbowyg.addBtnDef('highlight', buildButtonDef(trumbowyg));
}
}
}
});
})(jQuery, Prism);