<?php
/**
* @brief dcCKEditor, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugins
*
* @copyright Olivier Meunier & Association Dotclear
* @copyright GPL-2.0-only
*/
if (!defined('DC_CONTEXT_ADMIN')) {
return;
}
header('Content-type: text/javascript');
if (!empty($_GET['context'])) {
$context = $_GET['context'];
} else {
$context = '';
}
$__extraPlugins = new ArrayObject();
$core->callBehavior('ckeditorExtraPlugins', $__extraPlugins, $context);
$extraPlugins = $__extraPlugins->getArrayCopy();
?>
(function($) {
$.toolbarPopup = function toolbarPopup(url) {
if (dotclear.admin_base_url != '') {
var pos = url.indexOf(dotclear.admin_base_url);
if (pos == -1) {
url = dotclear.admin_base_url + url;
}
}
var args = Array.prototype.slice.call(arguments);
var width = 520, height = 420;
if (args[1]!==undefined) {
width = args[1].width || width;
height = args[1].height || height;
}
var popup_params = 'alwaysRaised=yes,dependent=yes,toolbar=yes,';
popup_params += 'height='+height+',width='+width+',menubar=no,resizable=yes,scrollbars=yes,status=no';
var popup_link = window.open(url,'dc_popup', popup_params);
};
$.stripBaseURL = function stripBaseURL(url) {
if (dotclear.base_url != '') {
var pos = url.indexOf(dotclear.base_url);
if (pos == 0) {
url = url.substr(dotclear.base_url.length);
}
}
return url;
};
/* Retrieve editor from popup */
$.active_editor = null;
$.getEditorName = function getEditorName() {
return $.active_editor;
}
chainHandler(window,'onbeforeunload',function(e) {
if (e == undefined && window.event) {
e = window.event;
}
var editor = CKEDITOR.instances[$.getEditorName()];
if (editor !== undefined && !dotclear.confirmClosePage.form_submit && editor.checkDirty()) {
e.preventDefault(); // HTML5 specification
e.returnValue = ''; // Google Chrome requires returnValue to be set.
}
return false;
});
})(jQuery);
$(function() {
/* By default ckeditor load related resources with a timestamp to avoid cache problem when upgrading itself
* load_plugin_file.php does not allow other param that file to load (pf param), so remove timestamp
*/
CKEDITOR.timestamp = '';
<?php if (!isset($dcckeditor_disable_native_spellchecker) || $dcckeditor_disable_native_spellchecker): ?>
CKEDITOR.config.disableNativeSpellChecker = true;
<?php else: ?>
CKEDITOR.config.disableNativeSpellChecker = false;
<?php endif;?>
CKEDITOR.config.skin = 'dotclear,'+dotclear.dcckeditor_plugin_url+'/js/ckeditor-skins/dotclear/';
CKEDITOR.config.baseHref = dotclear.base_url;
CKEDITOR.config.height = '<?php echo $core->auth->getOption('edit_size') * 14; ?>px';
<?php if (!empty($dcckeditor_cancollapse_button)): ?>
CKEDITOR.config.toolbarCanCollapse = true;
<?php endif;?>
CKEDITOR.plugins.addExternal('entrylink',dotclear.dcckeditor_plugin_url+'/js/ckeditor-plugins/entrylink/');
CKEDITOR.plugins.addExternal('dclink',dotclear.dcckeditor_plugin_url+'/js/ckeditor-plugins/dclink/');
CKEDITOR.plugins.addExternal('media',dotclear.dcckeditor_plugin_url+'/js/ckeditor-plugins/media/');
CKEDITOR.plugins.addExternal('img',dotclear.dcckeditor_plugin_url+'/js/ckeditor-plugins/img/');
<?php if (!empty($dcckeditor_textcolor_button) || !empty($dcckeditor_background_textcolor_button)): ?>
// button add "More Colors..." can be added if colordialog plugin is enabled
CKEDITOR.config.colorButton_enableMore = true;
<?php if (!empty($dcckeditor_custom_color_list)) : ?>
CKEDITOR.config.colorButton_colors = '<?php echo $dcckeditor_custom_color_list; ?>';
<?php endif;?>
CKEDITOR.config.colorButton_colorsPerRow = <?php echo($dcckeditor_colors_per_row ?: 6); /* @phpstan-ignore-line */ ?>;
<?php endif;?>
CKEDITOR.config.defaultLanguage = dotclear.user_language;
CKEDITOR.config.language = dotclear.user_language;
CKEDITOR.config.contentsLanguage = dotclear.user_language;
<?php
if (!empty($extraPlugins)) {
foreach ($extraPlugins as $plugin) {
printf("\tCKEDITOR.plugins.addExternal('%s','%s');\n", $plugin['name'], $plugin['url']);
}
}
?>
if (dotclear.ckeditor_context === undefined || dotclear.ckeditor_tags_context[dotclear.ckeditor_context] === undefined) {
return;
}
$(dotclear.ckeditor_tags_context[dotclear.ckeditor_context].join(',')).ckeditor({
<?php
$defautExtraPlugins = 'entrylink,dclink,media,justify,colorbutton,format,img,footnotes';
if (!empty($extraPlugins)) {
foreach ($extraPlugins as $plugin) {
$defautExtraPlugins .= ',' . $plugin['name'];
}
}
?>
extraPlugins: '<?php echo $defautExtraPlugins; ?>',
keystrokes: [
[ CKEDITOR.CTRL + (CKEDITOR.env.mac ? CKEDITOR.ALT : CKEDITOR.SHIFT) +
dotclear.msg.link_accesskey.toUpperCase().charCodeAt(0),'dcLinkCommand' ], // Ctrl+Alt+l
[ CKEDITOR.CTRL + (CKEDITOR.env.mac ? CKEDITOR.ALT : CKEDITOR.SHIFT) +
dotclear.msg.img_select_accesskey.toUpperCase().charCodeAt(0),'mediaCommand' ], // Ctrl+Alt+m
],
<?php if (!empty($dcckeditor_format_select)): ?>
// format tags
<?php if (!empty($dcckeditor_format_tags)): ?>
format_tags: '<?php echo $dcckeditor_format_tags; ?>',
<?php else: ?>
format_tags: 'p;h1;h2;h3;h4;h5;h6;pre;address',
<?php endif;?>
// following definition are needed to be specialized
format_p: { element: 'p' },
format_h1: { element: 'h1' },
format_h2: { element: 'h2' },
format_h3: { element: 'h3' },
format_h4: { element: 'h4' },
format_h5: { element: 'h5' },
format_h6: { element: 'h6' },
format_pre: { element: 'pre' },
format_address: { element: 'address' },
<?php endif;?>
entities: false,
removeButtons: '',
allowedContent: true,
toolbar: [
{
name: 'basicstyles',
items: [
<?php if (!empty($dcckeditor_format_select)): ?>
'Format',
<?php endif;?>
'Bold','Italic','Underline','Strike','Subscript','Superscript','Code','Blockquote',
<?php if (!empty($dcckeditor_list_buttons)): ?>
'NumberedList','BulletedList',
<?php endif;?>
'RemoveFormat'
]
},
<?php if (!empty($dcckeditor_clipboard_buttons)): ?>
{
name: 'clipoard',
items: ['Cut','Copy','Paste','PasteText','PasteFromWord']
},
<?php endif;?>
<?php if (!empty($dcckeditor_action_buttons)): ?>
{
name: 'action',
items: ['Undo','Redo']
},
<?php endif;?>
<?php if (!empty($dcckeditor_alignment_buttons)): ?>
{
name: 'paragraph',
items: ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock']
},
<?php endif;?>
<?php if (!empty($dcckeditor_table_button)): ?>
{
name: 'table',
items: ['Table']
},
<?php endif;?>
{
name: 'custom',
items: [
'EntryLink','dcLink','Media','img','Footnotes','-',
'Source'
<?php if (!empty($dcckeditor_textcolor_button)): ?>
,'TextColor'
<?php endif;?>
<?php if (!empty($dcckeditor_background_textcolor_button)): ?>
,'BGColor'
<?php endif;?>
]
},
{
name: 'special',
items: [
'Maximize'
]
},
<?php // add extra buttons comming from dotclear plugins
if (!empty($extraPlugins)) {
$extraPlugins_str = "{name: 'extra', items: [%s]},\n";
$extra_icons = '';
foreach ($extraPlugins as $plugin) {
$extra_icons .= sprintf("'%s',", $plugin['button']);
}
printf($extraPlugins_str, $extra_icons);
}
?>
],
<?php // footnotes related
switch ($core->blog->settings->system->note_title_tag) {
case 1:
$tag = 'h3';
break;
case 2:
$tag = 'p';
break;
default:
$tag = 'h4';
break;
}
$notes_tag = sprintf("['<%s>', '</%s>']", $tag, $tag);
$notes_title = sprintf('"%s"', __('Note(s)'));
?>
footnotesHeaderEls: <?php printf($notes_tag); ?>,
footnotesTitle: <?php printf($notes_title); ?>
});
CKEDITOR.on('instanceLoaded',function(e) {
// Retrieve textarea element of the instance, then its line-height (in px) and rows values,
// then apply line-height * rows (min = 6) to the inner height of the instance.
var ta = document.getElementById(e.editor.name);
if (ta !== undefined) {
var ta_rows = ta.rows;
var ta_line_height = parseFloat(window.getComputedStyle(ta,null).getPropertyValue('line-height'));
if (ta_rows > 0 && ta_line_height > 0) {
var ta_height = String(Math.max(ta_rows,6) * ta_line_height);
e.editor.resize('100%',ta_height,true);
}
}
});
CKEDITOR.on('instanceReady',function(e) {
if (ff = $('body').css("font-family")) {
e.editor.document.$.querySelector('body').style.setProperty('font-family',ff);
}
if (dotclear?.data?.htmlFontSize) {
e.editor.document.$.documentElement.style.setProperty('--html-font-size',dotclear.data.htmlFontSize);
e.editor.document.$.querySelector('body').style.setProperty('font-size','calc(var(--html-font-size) * 1.4)');
}
if ($('label[for="post_excerpt"] button').attr('aria-label') == dotclear.img_minus_alt) {
$('#cke_post_excerpt').removeClass('hide');
} else {
$('#cke_post_excerpt').addClass('hide');
}
$('#excerpt-area label').on('click', function() {
$('#cke_post_excerpt').toggleClass('hide',$('#post_excerpt').hasClass('hide'));
});
const ta = document.getElementById(e.editor.name);
if (ta !== undefined) {
if (ta.lang && e.editor.config.contentsLanguage !== ta.lang) {
e.editor.config.contentsLanguage = ta.lang;
}
}
});
// @TODO: find a better way to retrieve active editor
for (var id in CKEDITOR.instances) {
CKEDITOR.instances[id].on('focus',function(e) {
$.active_editor = e.editor.name;
});
}
});