Files
plugins/Ckeditor4Typecho/Plugin.php
chorblack e75f275ef4
Some checks failed
定时更新GitHub源插件 / 自动更新GitHub插件 (push) Has been cancelled
Initial commit
2026-03-07 11:19:25 +08:00

268 lines
7.8 KiB
PHP

<?php
/**
* 集成CkEditor编辑器,支持上传图片功能
*
* @package Ckeditor4Typecho
* @author zhulin3141
* @version 1.0.0
* @link http://zhulin31410.blog.163.com/
*/
class Ckeditor4Typecho_Plugin implements Typecho_Plugin_Interface
{
const CONTACT_CHAR = 'x';
/**
* 默认设置的值
*
* @access private
* @static var
*/
private static $_defaultConfig = array(
'width' => 'auto',
'height' => 'auto',
'toolbar' => 'SIMPLE',
'toolbarCanCollapse' => 'false',
'enterMode' => 'CKEDITOR.ENTER_P',
'skin' => 'moono',
'extraPlugins' => '',
);
/**
* 获取默认的配置
*
* @access private
* @return mixed
*/
private static function getDefaultConfig($key = null)
{
if( isset($key) )
return self::$_defaultConfig[$key];
return (object)self::$_defaultConfig;
}
/**
* 获取编辑器长和宽的数组
*
* @access private
* @return array
*/
private static function getLayoutArr($savedWidthAndHeight)
{
$widthAndHeight = explode(self::CONTACT_CHAR, $savedWidthAndHeight);
@list($width, $height) = $widthAndHeight;
if( self::validWidthAndHeight($width, $height) ) {
return $widthAndHeight;
}else{
return array(self::getDefaultConfig('width'), self::getDefaultConfig('height'));
}
}
/**
* 验证宽度和高度的有效性
*
* @param mixed $expression [, mixed $... ]
* @return boolean
*/
private static function validWidthAndHeight()
{
$params = func_get_args ();
$pass = false;
if( count($params) > 0 ){
foreach ($params as $val) {
$pass = ( is_numeric($val) || in_array($val, array('auto')) ) ? true : false;
if( ! $pass ){
return $pass;
}
}
}
return $pass;
}
/**
* 获取目录下的文件夹
*
* @access private
* @return array
*/
private static function getDir($targetDir)
{
$dirs = array();
$files = scandir($targetDir);
foreach($files as $file){
if( is_dir($targetDir . '/' . $file) && !in_array($file, array('.', '..')) ){
$dirs[] = $file;
}
}
return $dirs;
}
/**
* 激活插件方法,如果激活失败,直接抛出异常
*
* @access public
* @return void
* @throws Typecho_Plugin_Exception
*/
public static function activate()
{
Typecho_Plugin::factory('admin/write-post.php')->richEditor = array('Ckeditor4Typecho_Plugin', 'render');
Typecho_Plugin::factory('admin/write-page.php')->richEditor = array('Ckeditor4Typecho_Plugin', 'render');
//去除段落
Typecho_Plugin::factory('Widget_Contents_Post_Edit')->write = array('Ckeditor4Typecho_Plugin', 'filter');
Typecho_Plugin::factory('Widget_Contents_Page_Edit')->write = array('Ckeditor4Typecho_Plugin', 'filter');
}
/**
* 禁用插件方法,如果禁用失败,直接抛出异常
*
* @static
* @access public
* @return void
* @throws Typecho_Plugin_Exception
*/
public static function deactivate()
{
}
/**
* 获取插件配置面板
*
* @access public
* @param Typecho_Widget_Helper_Form $form 配置面板
* @return void
*/
public static function config(Typecho_Widget_Helper_Form $form){
$defaultConfig = self::getDefaultConfig();
$widthAndHeight = new Typecho_Widget_Helper_Form_Element_Text(
'widthAndHeight',
NULL,
$defaultConfig->width . self::CONTACT_CHAR . $defaultConfig->height,
_t('设置宽度和高度'));
$form->addInput($widthAndHeight);
//*工具栏按钮样式
$toolbar = new Typecho_Widget_Helper_Form_Element_Select(
'toolbar' ,
array(
'STANDARD' => '标准模式' ,
'SIMPLE' => '简单模式' ,
'MINI' => '迷你模式' ,
) ,
$defaultConfig->toolbar ,
_t('工具按钮'),
_t('工具栏按钮设置')
);
$form->addInput($toolbar);
$enterMode = new Typecho_Widget_Helper_Form_Element_Select(
'enterMode' ,
array(
'CKEDITOR.ENTER_P' => 'P' ,
'CKEDITOR.ENTER_BR' => 'BR' ,
'CKEDITOR.ENTER_DIV' => 'DIV' ,) ,
$defaultConfig->enterMode ,
_t('回车产生的标签'),
NULL
);
$form->addInput($enterMode);
//皮肤
$skins = self::getDir(dirname(__FILE__) . '/ckeditor/skins');
$skins = array_combine($skins, $skins);
$skin = new Typecho_Widget_Helper_Form_Element_Select(
'skin' ,
$skins ,
in_array($defaultConfig->skin, $skins) ? $defaultConfig->skin : $skins[0] ,
_t('皮肤'),
null
);
$form->addInput($skin);
$toolbarCanCollapse = new Typecho_Widget_Helper_Form_Element_Radio(
'toolbarCanCollapse' ,
array(
'true' => '是',
'false' => '否',
),
$defaultConfig->toolbarCanCollapse ,
_t('是否可收缩')
);
$form->addInput($toolbarCanCollapse);
$extraPlugins = new Typecho_Widget_Helper_Form_Element_Textarea(
'extraPlugins',
NULL,
$defaultConfig->extraPlugins,
_t('需要加载的插件'));
$extraPlugins->input->setAttribute('style', 'height: 60px;');
$form->addInput($extraPlugins);
}
/**
* 个人用户的配置面板
*
* @access public
* @param Typecho_Widget_Helper_Form $form
* @return void
*/
public static function personalConfig(Typecho_Widget_Helper_Form $form){}
/**
* 去除段落
*
* @access public
* @param array $post 数据结构体
* @return array
*/
public static function filter($post)
{
$post['text'] = str_replace("\n", '', $post['text']);
return $post;
}
/**
* 插件实现方法
*
* @access public
* @return void
*/
public static function render($post)
{
$options = Helper::options();
$plugin_options = $options->plugin('Ckeditor4Typecho');
$pluginRoot = Typecho_Common::url('Ckeditor4Typecho/ckeditor', $options->pluginUrl);
list($width, $height) = self::getLayoutArr($plugin_options->widthAndHeight);
$isEdit = isset($_GET['cid']) && $_GET['cid'] > 0 ? 'false' : 'true';
//调用编辑器
echo <<<CODE
<script type="text/javascript" src="{$pluginRoot}/ckeditor.js"></script>
<script type="text/javascript">
var ckeditors = CKEDITOR.replace( 'text', {
toolbar : '{$plugin_options->toolbar}',
filebrowserUploadUrl : '{$pluginRoot}/upload.php?no_db=1&no_thumb=1&return=ckeditor',
filebrowserImageUploadUrl : '{$pluginRoot}/upload.php?type=images&no_db=1&no_thumb=1&return=ckeditor',
extraPlugins : '{$plugin_options->extraPlugins}',
width: '{$width}',
height: '{$height}',
enterMode : {$plugin_options->enterMode},
skin: '{$plugin_options->skin}',
toolbarCanCollapse: {$plugin_options->toolbarCanCollapse},
autoGrow_minHeight : 400
});
window.onbeforeunload = function(event){
if(ckeditors.getData() != '' && {$isEdit}){
event.returnValue = '即将离开页面,是否确认编辑的内容已使用?';
}
}
</script>
CODE;
}
}