Your IP : 216.73.216.240
/**
* @package Sourcerer
* @version 9.8.0
*
* @author Peter van Westen <info@regularlabs.com>
* @link https://regularlabs.com
* @copyright Copyright © 2023 Regular Labs All Rights Reserved
* @license GNU General Public License version 2 or later
*/
var RegularLabsSourcererPopup = null;
(function($) {
var $editor = null;
var $form = null;
RegularLabsSourcererPopup = {
init: function() {
$editor = Joomla.editors.instances['code'];
$form = document.getElementById('sourcererForm');
try {
var test = $editor.getValue();
} catch (err) {
setTimeout('RegularLabsSourcererPopup.init();', 100);
return;
}
var string = '';
var editor_textarea = window.parent.document.getElementById(sourcerer_editorname);
if (editor_textarea) {
var iframes = editor_textarea.parentNode.getElementsByTagName('iframe');
if ( ! iframes.length) {
$('.reglab-overlay').css('cursor', '').fadeOut();
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;
}
}
string = this.cleanRange(selection);
}
if ( ! string) {
$('.reglab-overlay').css('cursor', '').fadeOut();
return;
}
// Handle indentation
string = string.replace(/^\t/gm, ' ');
this.setAttributes(string);
var code = this.removeSourceTags(string);
$editor.setValue(code);
$('.reglab-overlay').css('cursor', '').fadeOut();
},
insertText: function() {
var t_word = sourcerer_syntax_word;
var t_start = sourcerer_tag_characters[0];
var t_end = sourcerer_tag_characters[1];
var code = $editor.getValue();
code = this.removeSourceTags(code);
var pre_php = [];
var codes = [];
if (code) {
codes.push(code);
}
string = codes.join('\n');
// convert to html entities
string = this.htmlentities(string, 'ENT_NOQUOTES');
// replace indentation with tab images
string = string.indent2Images();
// replace linebreaks with br tags
string = string.nl2br();
var attributes = [];
if ($form['raw'].value == '1') {
attributes.push('raw="true"');
}
if ($form['trim'].value == '1') {
attributes.push('trim="true"');
}
if (string) {
string = '<span style="font-family: courier new, courier, monospace;">'
+ string
+ '</span>';
}
string = t_start + (t_word + ' ' + attributes.join(' ')).trim() + t_end
+ string
+ t_start + '/' + t_word + t_end;
window.parent.jInsertEditorText(string, sourcerer_editorname);
return true;
},
setAttributes: function(string) {
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 regex = new RegExp(start_tag, 'gim');
if ( ! string.match(regex)) {
return;
}
var attributes = this.getAttributes(regex.exec(string)[1].trim());
if ('raw' in attributes) {
this.setRadioOption('raw', attributes.raw.toString().toBoolean());
}
if ('trim' in attributes) {
this.setRadioOption('trim', attributes.trim.toString().toBoolean());
}
},
setPhpField: function(value, method) {
this.setField('php_file', value);
this.setSelectOption('php_include_method', method);
},
getAttributes: function(string) {
var attributes = {};
var t_word = sourcerer_syntax_word;
var t_start = sourcerer_tag_characters[0];
var t_end = sourcerer_tag_characters[1];
var regex = new RegExp('^0 ?');
if (string.match(regex)) {
attributes.raw = true;
string = string.replace(/^0/, '').trim();
}
var start_tag = this.preg_quote(t_start + t_word) + '( .*?)' + this.preg_quote(t_end);
var regex = new RegExp('([a-z_-]+)="([^"]*)"', 'gim');
if ( ! string.match(regex)) {
return attributes;
}
while (match = regex.exec(string)) {
attributes[match[1]] = match[2];
}
return attributes;
},
removeSourceTags: function(string) {
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, '');
return string.trim();
},
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');
},
setField: function(name, value) {
$('input[name="' + name + '"]').val(value);
},
setRadioOption: function(name, value) {
var inputs = $('input[name="' + name + '"]');
var input = $('input[name="' + name + '"][value="' + value + '"]');
$('label[for="' + input.attr('id') + '"]').click();
inputs.attr('checked', false);
input.attr('checked', true).click();
},
setSelectOption: function(name, value) {
var self = this;
var select = $('select[name="' + name + '"]');
var option = $('select[name="' + name + '"] option[value="' + value + '"]');
if ( ! option.length) {
return;
}
select.find('option').attr('selected', false);
option.attr('selected', 'selected');
select.trigger('liszt:updated');
}
};
String.prototype.ltrim = function() {
return this.fixLineBreaks().replace(/^[\n ]*/, "");
};
String.prototype.rtrim = function() {
return this.fixLineBreaks().replace(/[\n ]*$/, "");
};
String.prototype.trim = function() {
return this.fixLineBreaks().ltrim().rtrim();
};
String.prototype.toBoolean = function() {
return this == 1 || this == '1' || this == 'true' ? 1 : 0;
};
String.prototype.fixLineBreaks = function() {
return this.replace(/\r/, "");
};
String.prototype.escapeQuotes = function() {
return this.replace(/'/g, '\\\'');
};
String.prototype.hasLineBreaks = function() {
var regex = new RegExp('\n', 'gm');
return regex.test(this);
};
String.prototype.indent = function() {
var regex = new RegExp('\n', 'gm');
return '\n ' + this.replace(regex, '\n ') + '\n';
};
String.prototype.nl2br = function() {
var regex = new RegExp('\n', 'gm');
return this.replace(regex, '<br>');
};
String.prototype.indent2Images = function() {
var string = this;
var regex = new RegExp('((^|\n)( |\t)*)( ? ?|\t)', 'gm');
while (regex.test(string)) {
string = string.replace(regex, '$1<img src="' + sourcerer_root + '/media/sourcerer/images/tab.png">');
}
return string.replace(regex, '<br>');
};
})(jQuery);