Regular Labs (Peter van Westen): Advanced Module Manager 7.7.1 + Sourcerer 7.4.0 + Modals 9.13.0 + RegularLabs library 18.12.3953; commercial (regularlabs.com) -> deployed files. Signed-off-by: LÁZÁR Imre <imre@illusion.hu> Assisted-by: claude-code@claude-opus-4-8
381 lines
12 KiB
JavaScript
381 lines
12 KiB
JavaScript
/**
|
|
* @package Sourcerer
|
|
* @version 7.4.0
|
|
*
|
|
* @author Peter van Westen <info@regularlabs.com>
|
|
* @link http://www.regularlabs.com
|
|
* @copyright Copyright © 2018 Regular Labs All Rights Reserved
|
|
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
|
|
*/
|
|
|
|
var RegularLabsSourcererPopup = null;
|
|
|
|
(function($) {
|
|
var $editor = null;
|
|
|
|
RegularLabsSourcererPopup = {
|
|
init: function() {
|
|
$editor = Joomla.editors.instances['source'];
|
|
|
|
try {
|
|
var string = $editor.getValue();
|
|
} catch (err) {
|
|
setTimeout("RegularLabsSourcererPopup.init();", 100);
|
|
return;
|
|
}
|
|
|
|
var editor_textarea = window.parent.document.getElementById(sourcerer_editorname);
|
|
if (editor_textarea) {
|
|
var iframes = editor_textarea.parentNode.getElementsByTagName('iframe');
|
|
if (!iframes.length) {
|
|
return;
|
|
}
|
|
|
|
var editor_frame = iframes[0];
|
|
var contentWindow = editor_frame.contentWindow;
|
|
var selection = '';
|
|
|
|
if (typeof contentWindow.getSelection !== 'undefined') {
|
|
var sel = contentWindow.getSelection();
|
|
if (sel.rangeCount) {
|
|
var container = contentWindow.document.createElement("div");
|
|
for (var i = 0, len = sel.rangeCount; i < len; ++i) {
|
|
container.appendChild(sel.getRangeAt(i).cloneContents());
|
|
}
|
|
selection = container.innerHTML;
|
|
}
|
|
} else if (typeof contentWindow.document.selection !== 'undefined') {
|
|
if (contentWindow.document.selection.type == "Text") {
|
|
selection = contentWindow.document.selection.createRange().htmlText;
|
|
}
|
|
}
|
|
|
|
selection = this.cleanRange(selection);
|
|
|
|
if (selection != '') {
|
|
$editor.setValue(selection);
|
|
}
|
|
|
|
this.resizeEditorHeight();
|
|
}
|
|
|
|
string = $editor.getValue();
|
|
|
|
// Handle indentation
|
|
string = string.replace(/^\t/gm, ' ');
|
|
$editor.setValue(string);
|
|
|
|
var icon = $('span.icon-src_sourcetags');
|
|
if (string.search(this.preg_quote(sourcerer_tag_characters[0] + sourcerer_syntax_word)) != -1) {
|
|
icon.addClass('icon-src_nosourcetags');
|
|
}
|
|
|
|
if (sourcerer_default_addsourcetags) {
|
|
this.toggleSourceTags(1);
|
|
}
|
|
|
|
icon = $('span.icon-src_tagstyle');
|
|
if (string.search(/\[\[/g) != -1 && string.search(/\]\]/g) != -1) {
|
|
icon.addClass('icon-src_tagstyle_brackets');
|
|
}
|
|
},
|
|
|
|
resizeEditorHeight: function() {
|
|
var min_height = 220;
|
|
var html_height = $('html').height();
|
|
var new_height = Math.max(html_height, min_height);
|
|
|
|
// Start by setting the editor to the height of the html page
|
|
// which we know is too large to fit inside the modal
|
|
$('.CodeMirror-wrap').css('min-height', 0).height(new_height);
|
|
|
|
// Then decrease the size is steps of 5px till the body is no longer larger than the html
|
|
while ($('body').height() > html_height && new_height > min_height) {
|
|
new_height = new_height - 5;
|
|
|
|
$('.CodeMirror-wrap').height(new_height);
|
|
}
|
|
|
|
// Also set the sizer element to this new height
|
|
$('.CodeMirror-sizer').height(new_height);
|
|
},
|
|
|
|
insertText: function() {
|
|
var string = $editor.getValue();
|
|
|
|
// convert to html entities
|
|
string = this.htmlentities(string, 'ENT_NOQUOTES');
|
|
|
|
var t_word = sourcerer_syntax_word;
|
|
var t_start = sourcerer_tag_characters[0];
|
|
var t_end = sourcerer_tag_characters[1];
|
|
|
|
var start_tag = this.preg_quote(t_start + t_word) + '.*?' + this.preg_quote(t_end);
|
|
var end_tag = this.preg_quote(t_start + '/' + t_word + t_end);
|
|
|
|
// Set all code (with {source} tags) in courier
|
|
var regex = new RegExp('(' + start_tag + ')((?:.|[\n\r])*?)(' + end_tag + ')', 'gim');
|
|
string = string.replace(regex, '$1<span style="font-family: courier new, courier, monospace;">$2</span>$3');
|
|
|
|
// replace linebreaks with br tags
|
|
regex = new RegExp('\n\r?', 'gm');
|
|
string = string.replace(regex, '<br>');
|
|
|
|
regex = new RegExp('((^|<br>)( |\t)*)( ? ?|\t)', 'gm');
|
|
while (regex.test(string)) {
|
|
string = string.replace(regex, '$1<img src="' + sourcerer_root + '/media/sourcerer/images/tab.png">');
|
|
}
|
|
|
|
window.parent.jInsertEditorText(string, sourcerer_editorname);
|
|
},
|
|
|
|
toggleSourceTags: function(add) {
|
|
var icon = $('span.icon-src_sourcetags');
|
|
var string = $editor.getValue();
|
|
|
|
var t_word = sourcerer_syntax_word;
|
|
var t_start = sourcerer_tag_characters[0];
|
|
var t_end = sourcerer_tag_characters[1];
|
|
|
|
var start_tag = this.preg_quote(t_start + t_word) + '.*?' + this.preg_quote(t_end);
|
|
var end_tag = this.preg_quote(t_start + '/' + t_word + t_end);
|
|
|
|
var regex = new RegExp('(' + start_tag + ')\\s*', 'gim');
|
|
start_tag = t_start + t_word + t_end;
|
|
if (string.match(regex)) {
|
|
start_tag = regex.exec(string)[1];
|
|
string = string.replace(regex, '');
|
|
}
|
|
|
|
regex = new RegExp('\\s*' + end_tag, 'gim');
|
|
end_tag = t_start + '/' + t_word + t_end;
|
|
string = string.replace(regex, '');
|
|
|
|
if (!add && !icon.hasClass('icon-src_nosourcetags')) {
|
|
icon.addClass('icon-src_nosourcetags');
|
|
} else {
|
|
string = string.trim();
|
|
|
|
if (string.trim() != '' && (string.substr(0, 5) != '<?php' || string.substr(-2) != '?>')) {
|
|
string = '\n' + string + '\n';
|
|
}
|
|
|
|
string = start_tag + string + end_tag;
|
|
icon.removeClass('icon-src_nosourcetags');
|
|
}
|
|
|
|
$editor.setValue(string);
|
|
},
|
|
|
|
toggleTagStyle: function() {
|
|
var icon = $('span.icon-src_tagstyle');
|
|
var string = $editor.getValue();
|
|
|
|
string = string.replace(/\[\[/g, '<');
|
|
string = string.replace(/\]\]/g, '>');
|
|
|
|
if (!icon.hasClass('icon-src_tagstylebrackets')) {
|
|
string = string.replace(/<(\/?\w+((\s+\w+(\s*=\s*(?:"[\s\S.]*?"|'[\s\S.]*?'|[^'">\s]+))?)+\s*|\s*)\/?(--)?)>/gm, '[[$1]]');
|
|
string = string.replace(/<(!--[\s\S.]*?--)>/gm, '[[$1]]');
|
|
string = string.replace(/<\?(?:php)?([^a-z0-9])/gim, '[[?php$1');
|
|
string = string.replace(/( *)\?>/g, '$1?]]');
|
|
icon.addClass('icon-src_tagstylebrackets');
|
|
} else {
|
|
icon.removeClass('icon-src_tagstylebrackets');
|
|
}
|
|
|
|
$editor.setValue(string);
|
|
},
|
|
|
|
cleanRange: function(string) {
|
|
var regex = new RegExp('[\n\r]', 'gim');
|
|
string = string.replace(regex, '');
|
|
regex = new RegExp('(</p><p>|<p>|</p>|<br>|<br>)', 'gim');
|
|
string = string.replace(regex, '\n');
|
|
string = string.replace(/^\s+/, '').replace(/\s+$/, '');
|
|
regex = new RegExp('<img[^>]*src="[^"]*/tab.png"[^>]*>', 'gim');
|
|
string = string.replace(regex, '\t');
|
|
regex = new RegExp('</?[^>]*>', 'gim');
|
|
string = string.replace(regex, '');
|
|
regex = new RegExp('( | )', 'gim');
|
|
string = string.replace(regex, ' ');
|
|
regex = new RegExp('<', 'gim');
|
|
string = string.replace(regex, '<');
|
|
regex = new RegExp('>', 'gim');
|
|
string = string.replace(regex, '>');
|
|
regex = new RegExp('&', 'gim');
|
|
string = string.replace(regex, '&');
|
|
return string;
|
|
},
|
|
|
|
htmlentities: function(string, quote_style) {
|
|
tmp_str = string.toString();
|
|
|
|
if (false === (histogram = this.get_html_translation_table('HTML_ENTITIES', quote_style))) {
|
|
return false;
|
|
}
|
|
|
|
for (symbol in histogram) {
|
|
entity = histogram[symbol];
|
|
tmp_str = tmp_str.split(symbol).join(entity);
|
|
}
|
|
|
|
return tmp_str;
|
|
},
|
|
|
|
get_html_translation_table: function(table, quote_style) {
|
|
var entities = {}, histogram = {}, decimal = 0, symbol = '';
|
|
var constMappingTable = {}, constMappingQuoteStyle = {};
|
|
var useTable = {}, useQuoteStyle = {};
|
|
|
|
// Translate arguments
|
|
constMappingTable[0] = 'HTML_SPECIALCHARS';
|
|
constMappingTable[1] = 'HTML_ENTITIES';
|
|
constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
|
|
constMappingQuoteStyle[2] = 'ENT_COMPAT';
|
|
constMappingQuoteStyle[3] = 'ENT_QUOTES';
|
|
|
|
useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';
|
|
useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT';
|
|
|
|
if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') {
|
|
throw Error('Table: ' + useTable + ' not supported');
|
|
// return false;
|
|
}
|
|
|
|
// ascii decimals for better compatibility
|
|
entities['38'] = '&';
|
|
if (useQuoteStyle !== 'ENT_NOQUOTES') {
|
|
entities['34'] = '"';
|
|
}
|
|
if (useQuoteStyle === 'ENT_QUOTES') {
|
|
entities['39'] = ''';
|
|
}
|
|
entities['60'] = '<';
|
|
entities['62'] = '>';
|
|
|
|
if (useTable === 'HTML_ENTITIES') {
|
|
entities['160'] = ' ';
|
|
entities['161'] = '¡';
|
|
entities['162'] = '¢';
|
|
entities['163'] = '£';
|
|
entities['164'] = '¤';
|
|
entities['165'] = '¥';
|
|
entities['166'] = '¦';
|
|
entities['167'] = '§';
|
|
entities['168'] = '¨';
|
|
entities['169'] = '©';
|
|
entities['170'] = 'ª';
|
|
entities['171'] = '«';
|
|
entities['172'] = '¬';
|
|
entities['173'] = '­';
|
|
entities['174'] = '®';
|
|
entities['175'] = '¯';
|
|
entities['176'] = '°';
|
|
entities['177'] = '±';
|
|
entities['178'] = '²';
|
|
entities['179'] = '³';
|
|
entities['180'] = '´';
|
|
entities['181'] = 'µ';
|
|
entities['182'] = '¶';
|
|
entities['183'] = '·';
|
|
entities['184'] = '¸';
|
|
entities['185'] = '¹';
|
|
entities['186'] = 'º';
|
|
entities['187'] = '»';
|
|
entities['188'] = '¼';
|
|
entities['189'] = '½';
|
|
entities['190'] = '¾';
|
|
entities['191'] = '¿';
|
|
entities['192'] = 'À';
|
|
entities['193'] = 'Á';
|
|
entities['194'] = 'Â';
|
|
entities['195'] = 'Ã';
|
|
entities['196'] = 'Ä';
|
|
entities['197'] = 'Å';
|
|
entities['198'] = 'Æ';
|
|
entities['199'] = 'Ç';
|
|
entities['200'] = 'È';
|
|
entities['201'] = 'É';
|
|
entities['202'] = 'Ê';
|
|
entities['203'] = 'Ë';
|
|
entities['204'] = 'Ì';
|
|
entities['205'] = 'Í';
|
|
entities['206'] = 'Î';
|
|
entities['207'] = 'Ï';
|
|
entities['208'] = 'Ð';
|
|
entities['209'] = 'Ñ';
|
|
entities['210'] = 'Ò';
|
|
entities['211'] = 'Ó';
|
|
entities['212'] = 'Ô';
|
|
entities['213'] = 'Õ';
|
|
entities['214'] = 'Ö';
|
|
entities['215'] = '×';
|
|
entities['216'] = 'Ø';
|
|
entities['217'] = 'Ù';
|
|
entities['218'] = 'Ú';
|
|
entities['219'] = 'Û';
|
|
entities['220'] = 'Ü';
|
|
entities['221'] = 'Ý';
|
|
entities['222'] = 'Þ';
|
|
entities['223'] = 'ß';
|
|
entities['224'] = 'à';
|
|
entities['225'] = 'á';
|
|
entities['226'] = 'â';
|
|
entities['227'] = 'ã';
|
|
entities['228'] = 'ä';
|
|
entities['229'] = 'å';
|
|
entities['230'] = 'æ';
|
|
entities['231'] = 'ç';
|
|
entities['232'] = 'è';
|
|
entities['233'] = 'é';
|
|
entities['234'] = 'ê';
|
|
entities['235'] = 'ë';
|
|
entities['236'] = 'ì';
|
|
entities['237'] = 'í';
|
|
entities['238'] = 'î';
|
|
entities['239'] = 'ï';
|
|
entities['240'] = 'ð';
|
|
entities['241'] = 'ñ';
|
|
entities['242'] = 'ò';
|
|
entities['243'] = 'ó';
|
|
entities['244'] = 'ô';
|
|
entities['245'] = 'õ';
|
|
entities['246'] = 'ö';
|
|
entities['247'] = '÷';
|
|
entities['248'] = 'ø';
|
|
entities['249'] = 'ù';
|
|
entities['250'] = 'ú';
|
|
entities['251'] = 'û';
|
|
entities['252'] = 'ü';
|
|
entities['253'] = 'ý';
|
|
entities['254'] = 'þ';
|
|
entities['255'] = 'ÿ';
|
|
}
|
|
|
|
// ascii decimals to real symbols
|
|
for (decimal in entities) {
|
|
symbol = String.fromCharCode(decimal);
|
|
histogram[symbol] = entities[decimal];
|
|
}
|
|
|
|
return histogram;
|
|
},
|
|
|
|
preg_quote: function(str) {
|
|
return (str + '').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!<>\|\:])/g, '\\$1');
|
|
}
|
|
};
|
|
|
|
String.prototype.ltrim = function() {
|
|
return this.replace(/^ */, "");
|
|
};
|
|
String.prototype.rtrim = function() {
|
|
return this.replace(/ *$/, "");
|
|
};
|
|
String.prototype.trim = function() {
|
|
return this.ltrim().rtrim();
|
|
};
|
|
|
|
})(jQuery);
|