New module 'CKEditor'

This commit is contained in:
Manuel Cillero 2017-07-26 22:23:15 +02:00
parent 217854206c
commit 84eeb009be
163 changed files with 18401 additions and 0 deletions

View file

@ -0,0 +1,560 @@
/*
Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/
Drupal.ckeditor = (typeof(CKEDITOR) != 'undefined');
Drupal.ckeditor_ver = false;
// this object will store teaser information
Drupal.ckeditorTeaser = {
lookup: {},
lookupSetup: false,
cache: {}
};
Drupal.ckeditorToggle = function(textarea_id, TextTextarea, TextRTE, xss_check){
if (!CKEDITOR.env.isCompatible) {
return;
}
if (typeof(CKEDITOR.instances) != 'undefined' && typeof(CKEDITOR.instances[textarea_id]) != 'undefined') {
Drupal.ckeditorOff(textarea_id);
$('#switch_' + textarea_id).text(TextRTE);
}
else {
$("#" + textarea_id).val(Drupal.ckeditorLinebreakConvert(textarea_id, $("#" + textarea_id).val()));
Drupal.ckeditorOn(textarea_id);
$('#switch_' + textarea_id).text(TextTextarea);
}
};
/**
* CKEditor starting function
*
* @param string textarea_id
*/
Drupal.ckeditorInit = function(textarea_id) {
$("#" + textarea_id).next(".grippie").css("display", "none");
$("#" + textarea_id).addClass("ckeditor-processed");
var textarea_settings = false;
Drupal.settings.ckeditor.settings[textarea_id].toolbar = eval(Drupal.settings.ckeditor.settings[textarea_id].toolbar);
textarea_settings = Drupal.settings.ckeditor.settings[textarea_id];
textarea_settings['on'] =
{
configLoaded : function(ev)
{
Drupal.ckeditor_ver = CKEDITOR.version.split('.')[0];
if (Drupal.ckeditor_ver == 3) {
ev.editor.addCss(ev.editor.config.extraCss);
}
else {
CKEDITOR.addCss(ev.editor.config.extraCss);
}
},
instanceReady : function(ev)
{
var body = $(ev.editor.document.$.body);
// Don't enter line breaks after paragraph so we can be friendly to drupal's line break filter.
if (typeof(ev.editor.dataProcessor.writer.setRules) != 'undefined') {
ev.editor.dataProcessor.writer.setRules('p', {
breakAfterOpen: false
});
if (typeof(textarea_settings.custom_formatting) != 'undefined') {
var dtd = CKEDITOR.dtd;
for ( var e in CKEDITOR.tools.extend( {}, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {
ev.editor.dataProcessor.writer.setRules( e, textarea_settings.custom_formatting);
}
ev.editor.dataProcessor.writer.setRules( 'pre',
{
indent: textarea_settings.output_pre_indent
});
}
}
if (ev.editor.config.bodyClass)
body.addClass(ev.editor.config.bodyClass);
if (ev.editor.config.bodyId)
body.attr('id', ev.editor.config.bodyId);
if (typeof(Drupal.smileysAttach) != 'undefined' && typeof(ev.editor.dataProcessor.writer) != 'undefined')
ev.editor.dataProcessor.writer.indentationChars = ' ';
},
focus : function(ev)
{
Drupal.ckeditorInstance = ev.editor;
Drupal.ckeditorActiveId = ev.editor.name;
}
};
if (typeof textarea_settings['js_conf'] != 'undefined'){
for (var add_conf in textarea_settings['js_conf']){
textarea_settings[add_conf] = eval(textarea_settings['js_conf'][add_conf]);
}
}
if (CKEDITOR.loadFullCore) {
CKEDITOR.on('loaded', function() {
textarea_settings = Drupal.ckeditorLoadPlugins(textarea_settings);
if (CKEDITOR.instances[textarea_id]) {
CKEDITOR.instances[textarea_id].destroy(true);
}
Drupal.ckeditorInstance = CKEDITOR.replace(textarea_id, textarea_settings);
});
CKEDITOR.loadFullCore();
}
else {
textarea_settings = Drupal.ckeditorLoadPlugins(textarea_settings);
if (CKEDITOR.instances[textarea_id]) {
CKEDITOR.instances[textarea_id].destroy(true);
}
Drupal.ckeditorInstance = CKEDITOR.replace(textarea_id, textarea_settings);
}
};
Drupal.ckeditorOn = function(textarea_id) {
if ((typeof(Drupal.settings.ckeditor.load_timeout) == 'undefined') && (typeof(CKEDITOR.instances[textarea_id]) != 'undefined')) {
return;
}
if (typeof(Drupal.settings.ckeditor.settings[textarea_id]) == 'undefined') {
return;
}
if (!CKEDITOR.env.isCompatible) {
return;
}
var teaser = Drupal.ckeditorTeaserInfo(textarea_id);
if (teaser) {
var ch_checked = teaser.checkbox.attr('checked');
var tv = teaser.textarea.val();
if (teaser.textarea.attr("disabled") !== true && teaser.textarea.attr("disabled") !== 'disabled') {
$("#" + textarea_id).val(tv + '\n<!--break-->\n' + $("#" + textarea_id).val());
teaser.textarea.val('');
}
// [#653498]
if (teaser.button.attr('value') != Drupal.t('Split summary at cursor')) {
try {
teaser.button.click();
}
catch (e) {
teaser.button.val(Drupal.t('Split summary at cursor'));
}
}
teaser.buttonContainer.hide();
teaser.textareaContainer.hide();
teaser.checkboxContainer.show();
teaser.checkbox.attr('checked', ch_checked);
}
if (( $("#" + textarea_id).length > 0 && $("#" + textarea_id).val().length > 0) && ($("#" + textarea_id).attr('class').indexOf("filterxss1") != -1 || $("#" + textarea_id).attr('class').indexOf("filterxss2") != -1)) {
if (typeof Drupal.settings.ckeditor.settings[textarea_id].input_format == 'undefined') {
Drupal.settings.ckeditor.settings[textarea_id].input_format = Drupal.settings.ckeditor.default_input_format;
}
else if (typeof Drupal.settings.ckeditor.settings[textarea_id].input_format == 'object') {
Drupal.settings.ckeditor.settings[textarea_id].input_format = Drupal.settings.ckeditor.settings[textarea_id].input_format.pop();
}
$.post(Drupal.settings.ckeditor.xss_url, {
'text': $('#' + textarea_id).val(),
'token': Drupal.settings.ckeditor.ajaxToken,
'textarea_id': textarea_id,
'query': Drupal.settings.ckeditor.query,
'theme': Drupal.settings.ckeditor.theme,
'input_format': Drupal.settings.ckeditor.settings[textarea_id].input_format
}, function(text){
$("#" + textarea_id).val(text);
Drupal.ckeditorInit(textarea_id);
});
}
else {
Drupal.ckeditorInit(textarea_id);
}
};
/**
* CKEditor destroy function
*
* @param string textarea_id
*/
Drupal.ckeditorOff = function(textarea_id) {
if (typeof(CKEDITOR.instances[textarea_id]) == 'undefined') {
return;
}
if (!CKEDITOR.env.isCompatible) {
return;
}
if (Drupal.ckeditorInstance && Drupal.ckeditorInstance.name == textarea_id)
delete Drupal.ckeditorInstance;
var data = CKEDITOR.instances[textarea_id].getData();
CKEDITOR.instances[textarea_id].destroy();
var teaser = Drupal.ckeditorTeaserInfo(textarea_id);
if (teaser) {
var brcode = /<!--break-->/;
data = data.split(brcode);
if (data.length > 1) {
teaser.textareaContainer.show();
teaser.textarea.attr('disabled', '');
if (teaser.button.attr('value') != Drupal.t('Join summary')) {
try {
teaser.button.click();
}
catch (e) {
teaser.button.val(Drupal.t('Join summary'));
}
}
teaser.textarea.val(data[0]);
$("#" + textarea_id).val(data[1]);
}
else {
$("#" + textarea_id).val(data[0]);
teaser.textarea.attr('disabled', 'disabled');
teaser.checkboxContainer.hide();
if (teaser.button.attr('value') != Drupal.t('Split summary at cursor')) {
try {
teaser.button.click();
}
catch (e) {
teaser.button.val(Drupal.t('Split summary at cursor'));
}
}
}
teaser.buttonContainer.show();
}
$("#" + textarea_id).next(".grippie").css("display", "block");
$("#" + textarea_id).removeClass("ckeditor-processed");
};
/**
* Loading selected CKEditor plugins
*
* @param object textarea_settings
*/
Drupal.ckeditorLoadPlugins = function(textarea_settings) {
if (typeof(textarea_settings.extraPlugins) == 'undefined') {
textarea_settings.extraPlugins = '';
}
if (typeof CKEDITOR.plugins != 'undefined') {
for (var plugin in textarea_settings['loadPlugins']) {
if (typeof(textarea_settings['loadPlugins'][plugin]['active']) == 'undefined' || textarea_settings['loadPlugins'][plugin]['active'] == 1) {
textarea_settings.extraPlugins += (textarea_settings.extraPlugins) ? ',' + textarea_settings['loadPlugins'][plugin]['name'] : textarea_settings['loadPlugins'][plugin]['name'];
CKEDITOR.plugins.addExternal(textarea_settings['loadPlugins'][plugin]['name'], textarea_settings['loadPlugins'][plugin]['path']);
}
}
}
return textarea_settings;
}
/**
* CKEditor popup mode function
*/
function ckeditorOpenPopup(jsID, textareaID, width){
popupUrl = Drupal.settings.ckeditor.module_path + '/includes/ckeditor.popup.html?var=' + jsID + '&el=' + textareaID;
var percentPos = width.indexOf('%');
if (percentPos != -1) {
width = width.substr(0, percentPos);
width = width / 100 * screen.width;
}
window.open(popupUrl, null, 'width=' + width + ',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=1,dependent=yes');
return false;
};
/**
* Returns true if CKEDITOR.version >= version
*/
Drupal.ckeditorCompareVersion = function (version){
var ckver = CKEDITOR.version;
ckver = ckver.match(/(([\d]\.)+[\d]+)/i);
version = version.match(/((\d+\.)+[\d]+)/i);
ckver = ckver[0].split('.');
version = version[0].split('.');
for (var x in ckver) {
if (ckver[x]<version[x]) {
return false;
}
else if (ckver[x]>version[x]) {
return true;
}
}
return true;
};
/**
* This function retrieves information about a possible teaser field associated
* with the mentioned field.
*
* @param taid
* string HTML id of the main text area
*/
Drupal.ckeditorTeaserInfo = function(taid) {
// if the result is cached, return it
if (Drupal.ckeditorTeaser.cache[taid]) {
return Drupal.ckeditorTeaser.cache[taid];
}
// build a lookup table
if (!Drupal.ckeditorTeaser.lookupSetup) {
Drupal.ckeditorTeaser.lookupSetup = true;
for (var x in Drupal.settings.teaser) {
Drupal.ckeditorTeaser.lookup[Drupal.settings.teaser[x]] = x;
}
}
// find the elements
if (Drupal.ckeditorTeaser.lookup[taid]) {
var obj;
if (window.opener && window.ckeditor_was_opened_in_popup_window) {
obj = {
textarea: window.opener.$('#' + Drupal.ckeditorTeaser.lookup[taid]),
checkbox: window.opener.$('#' + Drupal.settings.teaserCheckbox[Drupal.ckeditorTeaser.lookup[taid]])
};
} else {
obj = {
textarea: $('#' + Drupal.ckeditorTeaser.lookup[taid]),
checkbox: $('#' + Drupal.settings.teaserCheckbox[Drupal.ckeditorTeaser.lookup[taid]])
};
}
obj.textareaContainer = obj.textarea.parent();
obj.checkboxContainer = obj.checkbox.parent();
obj.button = $('input.teaser-button', obj.checkbox.parents('div.teaser-checkbox').get(0));
obj.buttonContainer = obj.button.parent();
Drupal.ckeditorTeaser.cache[taid] = obj;
}
else {
Drupal.ckeditorTeaser.cache[taid] = null;
}
return Drupal.ckeditorTeaser.cache[taid];
};
Drupal.ckeditorInsertHtml = function(html) {
if (!Drupal.ckeditorInstance)
return false;
if (Drupal.ckeditorInstance.mode == 'wysiwyg') {
Drupal.ckeditorInstance.insertHtml(html);
return true;
}
else {
alert(Drupal.t('Content can only be inserted into CKEditor in the WYSIWYG mode.'));
return false;
}
};
/**
* Converts \n to <br />
* It in no way tries to compete with Line break converter filter
*/
Drupal.ckeditorEnterModeConvert = function(enterMode){
if (enterMode == 1)
return {startTag: '<p>', endTag: '</p>'};
if (enterMode == 2)
return {startTag: '', endTag: '<br/>'};
if (enterMode == 3)
return {startTag: '<div>', endTag: '</div>'};
return {startTag: '', endTag: ''}
}
Drupal.ckeditorLinebreakConvert = function(textarea_id, text) {
var enterMode = Drupal.ckeditorEnterModeConvert(Drupal.settings.ckeditor.settings[textarea_id].enterMode);
if (!text.match(/<(div|p|br).*\/?>/i) && text) {
text = enterMode.startTag + text.replace(/\r\n|\n\r/g, '\n').replace(/\n\n/g, enterMode.endTag+enterMode.startTag).replace(/\n/g, '<br />') + enterMode.endTag;
}
return text;
}
/**
* Ajax support [#741572]
*/
if (typeof(Drupal.Ajax) != 'undefined' && typeof(Drupal.Ajax.plugins) != 'undefined') {
Drupal.Ajax.plugins.CKEditor = function(hook, args) {
if (hook === 'submit' && typeof(CKEDITOR.instances) != 'undefined') {
for (var i in CKEDITOR.instances)
CKEDITOR.instances[i].updateElement();
}
return true;
};
}
/**
* IMCE support
*/
function ckeditor_fileUrl(file, win){
var cfunc = win.location.href.split('&');
for (var x in cfunc) {
if (cfunc[x].match(/^CKEditorFuncNum=\d+$/)) {
cfunc = cfunc[x].split('=');
break;
}
}
CKEDITOR.tools.callFunction(cfunc[1], file.url);
win.close();
}
//Support for Panels [#679976]
Drupal.ckeditorSubmitAjaxForm = function () {
if (typeof(CKEDITOR.instances) != 'undefined' && typeof(CKEDITOR.instances['edit-body']) != 'undefined') {
Drupal.ckeditorOff('edit-body');
}
};
/**
* Drupal behaviors
*/
var imagefield_data = new Object();
Drupal.behaviors.ckeditor = function (context) {
if ((typeof(CKEDITOR) == 'undefined') || !CKEDITOR.env.isCompatible) {
return;
}
if (typeof CKEDITOR.instances != 'undefined')
{
$.each(CKEDITOR.instances, function(index, value){
if ($('#'+index).length == 0)
{
delete CKEDITOR.instances[index];
}
});
}
$('.ckeditor_links').show();
// make sure the textarea behavior is run first, to get a correctly sized grippie
// the textarea behavior requires the teaser behavior, so load that one as well
if (Drupal.behaviors.teaser) {
Drupal.behaviors.teaser(context);
}
if (Drupal.behaviors.textarea) {
Drupal.behaviors.textarea(context);
}
//Support for imageField [#1286192]
if (Drupal.behaviors.filefieldButtons) {
$('input[id$="-add-more"]:submit').each(function(){
$(this).mousedown(function(){
$('.form-item textarea.ckeditor-mod', $(this).parent().prev().html()).each(function(){
if (typeof CKEDITOR.instances[$(this).attr('id')] != 'undefined') {
imagefield_data[$(this).attr('id')] = CKEDITOR.instances[$(this).attr('id')].getData();
}
Drupal.ckeditorOff($(this).attr('id'));
});
});
});
if ($('.form-item textarea', $(context)).length == 1) {
var url = document.location.pathname;
if (url.indexOf('/') == 0 ) url = url.substr(1);
var path = Drupal.settings.basePath;
var imagefield_id = $('textarea', $(context)).attr('id');
if (!CKEDITOR.instances[imagefield_id]){
$.ajax({
url: path + 'admin/ckeditor/get_settings',
dataType: 'json',
data: {'id': imagefield_id, 'url': url, 'token': Drupal.settings.ckeditor.ajaxToken},
type: 'POST',
success: function( data ) {
Drupal.settings.ckeditor.settings[imagefield_id] = data;
if ($(data).length > 0) {
Drupal.settings.ckeditor.autostart[imagefield_id] = true;
Drupal.ckeditorOn(imagefield_id);
}
}
});
$('input[id$="-filefield-remove"]', $(context)).mousedown(function(){
$('textarea.ckeditor-mod', $(context)).each(function(){
if (CKEDITOR.instances[$(this).attr('id')]){
Drupal.ckeditorOff($(this).attr('id'));
imagefield_data[$(this).attr('id')] = "";
}
})
});
}
}
}
//Added for support [#1288664] Views
if ($(context).attr('id') === 'views-ajax-pad'){
$("div.form-buttons input#edit-submit").click(function(){
if (typeof CKEDITOR.instances['edit-header'] != 'undefined' )$('#edit-header').attr('value',CKEDITOR.instances['edit-header'].document.getBody().getHtml());
if (typeof CKEDITOR.instances['edit-footer'] != 'undefined' )$('#edit-footer').attr('value',CKEDITOR.instances['edit-footer'].document.getBody().getHtml());
if (typeof CKEDITOR.instances['edit-empty'] != 'undefined' )$('#edit-empty').attr('value',CKEDITOR.instances['edit-empty'].document.getBody().getHtml());
});
var views_textarea_id = $("textarea", $(context)).attr('id');
if (typeof views_textarea_id != 'undefined' && views_textarea_id != 'edit-options-alter-text'){
path = Drupal.settings.basePath;
views_path = $("form", $(context)).attr('action');
if (views_path.indexOf('/') == 0) {
views_path = views_path.substr(1)
}
$.ajax({
url: path + 'admin/ckeditor/get_settings',
dataType: 'json',
data: {'id': views_textarea_id, 'url': views_path, 'token': Drupal.settings.ckeditor.ajaxToken},
type: 'POST',
success: function( data ) {
if ($(data).length > 0 && typeof CKEDITOR.instances[views_textarea_id] == 'undefined'){
Drupal.settings.ckeditor.settings[views_textarea_id] = data;
Drupal.ckeditorOn(views_textarea_id);
}
}
});
}
}
// Support for Panels [#679976]
if ($(context).attr('id') == 'modal-content') {
if (CKEDITOR.instances['edit-body'] != 'undefined') {
Drupal.ckeditorOff('edit-body');
}
$('input#edit-return', context).bind('mouseup', Drupal.ckeditorSubmitAjaxForm);
$('.close').bind('mouseup', Drupal.ckeditorSubmitAjaxForm);
CKEDITOR.on('dialogDefinition', function (ev) {
var dialogDefinition = ev.data.definition;
var _onShow = dialogDefinition.onShow;
dialogDefinition.onShow = function () {
if ( _onShow ) {
_onShow.apply( this );
}
$('body').unbind('keypress');
};
});
}
$("textarea.ckeditor-mod:not(.ckeditor-processed)").each(function () {
var ta_id=$(this).attr("id");
if ((typeof(Drupal.settings.ckeditor.autostart) != 'undefined') && (typeof(Drupal.settings.ckeditor.autostart[ta_id]) != 'undefined') ) {
if(typeof imagefield_data[ta_id] == "string") {
$("#"+ta_id).attr('value', imagefield_data[ta_id]);
}
Drupal.ckeditorOn(ta_id);
}
});
$("form").bind('submit', function() {
$(this).find('textarea.ckeditor-processed').each(function() {
$(this).val(Drupal.ckeditorLinebreakConvert($(this).attr("id"), $(this).val()));
});
});
};
if (Drupal.tableDrag) {
Drupal.tableDrag.prototype.onDrag = function() {
$(this.rowObject.element).find('textarea.ckeditor-processed').each(
function() {
if (typeof(CKEDITOR.instances) != 'undefined' && typeof(CKEDITOR.instances[$(this).attr('id')]) != 'undefined') {
data = CKEDITOR.instances[$(this).attr('id')].document.getBody().getHtml();
$("#"+$(this).attr('id')).attr('value',data);
Drupal.ckeditorOff($(this).attr('id'));
}
}
);
};
Drupal.tableDrag.prototype.onDrop = function() {
$(this.rowObject.element).find('textarea.ckeditor-mod:not(.ckeditor-processed)').each(
function() {
if ((typeof(Drupal.settings.ckeditor.autostart) != 'undefined') && (typeof(Drupal.settings.ckeditor.autostart[$(this).attr('id')]) != 'undefined')) {
Drupal.ckeditorOn($(this).attr('id'));
}
}
);
};
}