LT21) * * @package Smilies * @author 羽中, Willin Kan * @version 1.1.3 * @dependence 14.5.26-* * @link http://www.yzmb.me/archives/net/smilies-for-typecho */ class Smilies_Plugin implements Typecho_Plugin_Interface { /** * 激活插件方法,如果激活失败,直接抛出异常 * * @access public * @return void * @throws Typecho_Plugin_Exception */ public static function activate() { Typecho_Plugin::factory('Widget_Abstract_Comments')->contentEx = array('Smilies_Plugin','showsmilies'); Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('Smilies_Plugin','showsmilies'); Typecho_Plugin::factory('Widget_Abstract_Contents')->excerptEx = array('Smilies_Plugin','showsmilies'); Typecho_Plugin::factory('Widget_Archive')->footer = array('Smilies_Plugin','insertjs'); Typecho_Plugin::factory('admin/write-post.php')->bottom = array('Smilies_Plugin','smbutton'); Typecho_Plugin::factory('admin/write-page.php')->bottom = array('Smilies_Plugin','smbutton'); //模版调用钩子 Typecho_Plugin::factory('Widget_Comments_Archive')->callSmilies = array('Smilies_Plugin', 'output'); Helper::addAction('smilies', 'Smilies_Action'); } /** * 禁用插件方法,如果禁用失败,直接抛出异常 * * @static * @access public * @return void * @throws Typecho_Plugin_Exception */ public static function deactivate() { Helper::removeAction('smilies'); } /** * 获取插件配置面板 * * @access public * @param Typecho_Widget_Helper_Form $form 配置面板 * @return void */ public static function config(Typecho_Widget_Helper_Form $form) { $no22 = new Typecho_Widget_Helper_Form_Element_Checkbox('no22', array(1=>_t('不使用标准组%s(仅输出下方的扩展表情项, 不影响标准代码解析)%s',' ','')),NULL,''); $no22->label->setAttribute('style','font-weight:normal;'); $form->addInput($no22); $replacetxt = new Typecho_Widget_Helper_Form_Element_Checkbox('replacetxt', array(1=>_t('替换字符表情%s(或干扰文本)%s',' ','')),NULL,''); $replacetxt->label->setAttribute('style','font-weight:normal;'); $form->addInput($replacetxt); $smiliesset = new Typecho_Widget_Helper_Form_Element_Select('smiliesset', array('qq'=>_t('扫描中...')),'qq',_t('选择表情包'),_t('预览插件目录下的表情文件夹进行排序或自定义扩展')); $form->addInput($smiliesset); $customset = new Typecho_Widget_Helper_Form_Element_Textarea('customset',NULL,'',_t('扩展表情组'),_t('以"表情代码%s(半角竖线)表情图片地址"的形式填写, 每行一组
例: %s可覆盖此标准代码解析','|',':smile:|http://image.com/smile.gif ')); $customset->input->setAttribute('style','max-width:440px;height:180px;'); $customset->addRule(array(new Smilies_Plugin,'notag'),_t('请勿使用符号<|>作为表情代码, 以免造成解析错误')); $form->addInput($customset); $omax = new Typecho_Widget_Helper_Form_Element_Text('omax', NULL,'21',_t('限制表情尺寸'),_t('设置表情在前台显示的最大宽度, 单位: px(不用填写)')); $omax->input->setAttribute('class','text-s'); $omax->input->setAttribute('style','width:40px;'); $form->addInput($omax->addRule('isFloat')); $cmax = new Typecho_Widget_Helper_Form_Element_Text('cmax',NULL,'28','⇐ '._t('选框按钮 | 评论内').' ⇒'); $cmax->input->setAttribute('class','text-s'); $cmax->label->setAttribute('style','position:absolute;color:#999;font-weight:normal;bottom:38px;left:42px;'); $cmax->input->setAttribute('style','position:absolute;width:40px;bottom:40px;left:186px;'); $cmax->setAttribute('style','position:relative'); $form->addInput($cmax->addRule('isFloat')); $amax = new Typecho_Widget_Helper_Form_Element_Text('amax',NULL,'32',_t('正文内').' ⇒'); $amax->input->setAttribute('class','text-s'); $amax->label->setAttribute('style','position:absolute;color:#999;font-weight:normal;bottom:38px;left:230px;'); $amax->input->setAttribute('style','position:absolute;width:40px;bottom:40px;left:290px;'); $amax->setAttribute('style','position:relative'); $form->addInput($amax->addRule('isFloat')); $textareaid = new Typecho_Widget_Helper_Form_Element_Text('textareaid', NULL,_t('一般无需填写'),_t('指定评论框ID'),_t('若识别有误可在此手动指定主题的评论框(textarea)id')); $textareaid->input->setAttribute('style','width:100px;'); $form->addInput($textareaid); $allowpop = new Typecho_Widget_Helper_Form_Element_Radio('allowpop', array(1=>_t('开启'),0=>_t('关闭')),0,_t('按钮弹窗效果')); $form->addInput($allowpop); $width = new Typecho_Widget_Helper_Form_Element_Text('width',NULL,'240',_t('弹窗宽度:')); $width->input->setAttribute('class','text-s'); $width->label->setAttribute('style','color:#999;font-weight:normal;'); $width->input->setAttribute('style','position:absolute;width:45px;top:-4px;left:60px;'); $width->setAttribute('style','position:relative'); $form->addInput($width->addRule('isFloat')); $radius = new Typecho_Widget_Helper_Form_Element_Text('radius',NULL,'11','px'._t('圆角度:').''); $radius->input->setAttribute('class','text-s'); $radius->label->setAttribute('style','position:absolute;color:#999;font-weight:normal;bottom:7px;left:105px;'); $radius->input->setAttribute('style','position:absolute;width:40px;bottom:10px;left:174px;'); $radius->setAttribute('style','position:relative'); $form->addInput($radius->addRule('isFloat')); $bcolor = new Typecho_Widget_Helper_Form_Element_Text('bcolor',NULL,'#bbb','px'._t('边框颜色:').''); $bcolor->input->setAttribute('class','text-s'); $bcolor->label->setAttribute('style','position:absolute;color:#999;font-weight:normal;bottom:7px;left:214px;'); $bcolor->input->setAttribute('style','position:absolute;width:75px;bottom:10px;left:297px;'); $bcolor->setAttribute('style','position:relative'); $bcolor->addRule(array(new Smilies_Plugin,'colorformat')); $form->addInput($bcolor); $shadow = new Typecho_Widget_Helper_Form_Element_Select('shadow', array(1=>_t('有'),0=>_t('无')),1,_t('边框阴影:'),''); $shadow->label->setAttribute('style','position:absolute;color:#999;font-weight:normal;bottom:7px;left:380px;'); $shadow->input->setAttribute('style','position:absolute;bottom:11px;right:271px;'); $shadow->setAttribute('style','position:relative;'); $form->addInput($shadow); $jqmode = new Typecho_Widget_Helper_Form_Element_Radio('jqmode', array(1=>_t('jQuery'),0=>_t('原生js')),0,_t('功能脚本模式'),_t('仅兼容性表现略有差异, jQuery自动判断加载CDN源')); $form->addInput($jqmode); $postmode = new Typecho_Widget_Helper_Form_Element_Radio('postmode', array(1=>_t('开启'),0=>_t('关闭')),0,_t('正文使用表情'),_t('编辑文章或页面时也可选择插入表情图片并发布显示')); $form->addInput($postmode); //排序保存隐藏域 $smsort = new Typecho_Widget_Helper_Form_Element_Hidden('smsort', NULL,'icon_mrgreen.gif|icon_neutral.gif|icon_twisted.gif|icon_arrow.gif|icon_eek.gif|icon_smile.gif|icon_confused.gif|icon_cool.gif|icon_evil.gif|icon_biggrin.gif|icon_idea.gif|icon_redface.gif|icon_razz.gif|icon_rolleyes.gif|icon_wink.gif|icon_cry.gif|icon_surprised.gif|icon_lol.gif|icon_mad.gif|icon_sad.gif|icon_exclaim.gif|icon_question.gif'); $form->addInput($smsort); $option = Helper::options(); $security = Helper::security(); //输出面板效果 ?>

<?php $comments->smilies(); ?>'); ?>

:mrgreen:
:neutral:
:twisted:
:arrow:
:shock:
:smile:
:???:
:cool:
:evil:
:grin:
:idea:
:oops:
:razz:
:roll:
:wink:
:cry:
:eek:
:lol:
:mad:
:sad:
:!:
:?:
标准代码)尽量保持一致 ⇕'); ?>
:|
:-|
8O
8-O
:)
:-)
:?
:-?
8)
8-)
:D
:-D
:P
:-P
;)
;-)
:o
:-o
:x
:-x
:(
:-(
plugin('Smilies'); $omax = $settings->omax; $omax = $omax ? 'max-width:'.$omax.'px;' : ''; $acmax = $archive ? $settings->amax : $settings->cmax; $acmax = $acmax ? 'max-width:'.$acmax.'px;' : ''; //构建标准数组 $smurl = Typecho_Common::url('Smilies/'.urlencode($settings->smiliesset).'/',$options->pluginUrl); $smsort = explode('|',$settings->smsort); $smimg = array(); foreach ($smsort as $imgname) { $smimg[] = $smurl.$imgname; } $pattern = array(':mrgreen:',':neutral:',':twisted:',':arrow:',':shock:',':smile:',':???:',':cool:',':evil:',':grin:',':idea:',':oops:',':razz:',':roll:',':wink:',':cry:',':eek:',':lol:',':mad:',':sad:',':!:',':?:'); $smtrans = array_combine($pattern,$smimg); //并入字符数组 $textsm = array( '8-)'=>$smtrans[':cool:'], '8-O'=>$smtrans[':shock:'], ':-('=>$smtrans[':sad:'], ':-)'=>$smtrans[':smile:'], ':-?'=>$smtrans[':???:'], ':-D'=>$smtrans[':grin:'], ':-P'=>$smtrans[':razz:'], ':-o'=>$smtrans[':eek:'], ':-x'=>$smtrans[':mad:'], ':-|'=>$smtrans[':neutral:'], ';-)'=>$smtrans[':wink:'], '8)'=>$smtrans[':cool:'], '8O'=>$smtrans[':shock:'], ':('=>$smtrans[':sad:'], ':)'=>$smtrans[':smile:'], ':?'=>$smtrans[':???:'], ':D'=>$smtrans[':grin:'], ':P'=>$smtrans[':razz:'], ':o'=>$smtrans[':eek:'], ':x'=>$smtrans[':mad:'], ':|'=>$smtrans[':neutral:'], ';)'=>$smtrans[':wink:'], ); $smtrans = $settings->replacetxt ? $smtrans+$textsm : $smtrans; //并入扩展数组 $customset = trim(Typecho_Common::stripTags($settings->customset)); $customsm = array(); if (strpos($customset,'|')) { $smsets = array_filter(preg_split("/(\r|\n|\r\n)/",$customset)); $smarray = array(); foreach ($smsets as $smset) { $smarray[] = explode('|',$smset); } foreach ($smarray as $row) { $customsm[trim($row['0'])] = trim($row['1']); } $smtrans = array_merge($smtrans,$customsm); } $smiliesicon1 = array(); $smiliesicon2 = array(); $smiliestag = array(); $smiliesimg = array(); $smiled = array(); foreach ($smtrans as $tag=>$grin) { $alt = basename($grin); //输出表情选项 if (!in_array($grin,$smiled) && !in_array($tag,array_keys($textsm))) { $smiled[] = $grin; //过滤重复值 $icons = 'jqmode ? '' : ($archive ? ' onclick="Smilies.grin("'.$tag.'");"' : ' onclick="Smilies.grin(\''.$tag.'\');"') //fix js bug ).' style="cursor:pointer;" data-tag=" '.$tag.' " title="'.$tag.'">'.$alt.''; if (in_array($tag,$pattern)) { $smiliesicon1[] = $settings->no22 ? ($customsm ? '' : _t('扩展表情为空!')) : $icons; } else { $smiliesicon2[] = $icons; $customsm[$tag] = $grin; } } $smiliestag[] = $tag; $smiliesimg[] = ''.$alt.''; } //弹窗模式按钮 $smilies = empty($customsm) && $settings->no22 ? _t('扩展表情为空!') : ''._t('选择表情').''; return array($smilies,implode('',array_merge(array_unique($smiliesicon1),$smiliesicon2)),$smiliestag,$smiliesimg); } /** * 输出编辑器按钮 * * @access public * @return void */ public static function smbutton() { if (Helper::options()->plugin('Smilies')->postmode) { $smilies = self::parsesmilies(true); ?> commentsHTMLTagAllowed .= ''; $archive = $widget instanceof Widget_Archive; if ($widget instanceof Widget_Abstract_Comments || $archive && $options->plugin('Smilies')->postmode) { $arrays = self::parsesmilies($archive); $content = str_replace($arrays['2'],$arrays['3'],$content); } return $content; } /** * 输出表情选框 * * @access public * @return void */ public static function output($widget='') { $options = Helper::options(); $settings = $options->plugin('Smilies'); $width = $settings->width; $width = $width ? $width : '240'; $radius = $settings->radius; $radius = false!==$radius ? $radius : '11'; $radius = 'border-radius:'.$radius.'px'; $radius = '-moz-'.$radius.';-webkit-'.$radius.';-khtml-'.$radius.';'.$radius.';'; $bcolor = $settings->bcolor; $bcolor = $bcolor ? $bcolor : '#bbb'; $shadow = 'box-shadow:1px 3px 15px '.$bcolor; $shadow = $settings->shadow ? '-moz-'.$shadow.';-webkit-'.$shadow.';-khtml-'.$shadow.';'.$shadow.';' : ''; //弹窗css样式 $smiliesdisplay = $settings->allowpop ? ' style="display:none;position:absolute;z-index:9999;width:'.$width.'px;margin-top:-70px;padding:5px;background-color:#fff;border:1px solid '.$bcolor.';'.$radius.$shadow.'"' : ' style="display:block;"'; //罗列表情图标 $smilies = self::parsesmilies(); $output = '
'; $output .= $smilies['1']; $output .= '
'; //弹窗风格按钮 if ($settings->allowpop) { $output .= ''.($settings->jqmode ? $smilies['0'] : ''.$smilies['0'].'').''; } echo $output; } /** * 输出js脚本 * * @access public * @return void */ public static function insertjs($widget) { $options = Helper::options(); $settings = $options->plugin('Smilies'); $textareaid = $settings->textareaid; $textareaid = $textareaid ? $textareaid : _t('一般无需填写'); $idset = $widget->is('single') ? $textareaid : 'text'; $txtid = $settings->jqmode ? '#'.$idset : $idset; $txtdom = 'domId("'.$txtid.'")'; if ($widget->is('single') && $idset==_t('一般无需填写')) { $txtid = 'textarea'; $txtdom = 'domTag("'.$txtid.'")'; } //jquery模式 if ($settings->jqmode) { $auto = ''; $js = ' '; //js模式 } else { $js = ' '; } if ($widget->is('single')) { echo ($settings->jqmode ? '' : '').$js; } if ($widget instanceof Widget_Contents_Post_Edit && $settings->postmode) { echo $js; } } /** * 检查禁用符号 * * @access public * @param string $input * @return boolean */ public static function notag($input) { return !preg_match('/[\>\<]|\|\|/',$input); } /** * 判断颜色格式 * * @access public * @param string $width * @return boolean */ public static function colorformat($input) { return preg_match('/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/',$input); } }