标签 Typecho 下的文章

enter image description here

本篇文章由@Rich提供 表情放在主题目录img/smilies下。 首先添加functions.php自定义评论回调部分的代码,自定义评论回调部分可以参考Typecho更简单的解决Gravatar被墙提到的方法。 然后再在functions.php将回调函数的content(); ?>修改为content); ?> 接着在functions.php下面加入代码:

/** 解析表情 */
function convertSmilies($widget)
{
    $smiliesTrans = array(
    ':?:'        => 'icon_question.gif',
    ':razz:'     => 'icon_razz.gif',
    ':sad:'      => 'icon_sad.gif',
    ':evil:'     => 'icon_evil.gif',
    ':!:'        => 'icon_exclaim.gif',
    ':smile:'    => 'icon_smile.gif',
    ':oops:'     => 'icon_redface.gif',
    ':grin:'     => 'icon_biggrin.gif',
    ':eek:'      => 'icon_surprised.gif',
    ':shock:'    => 'icon_eek.gif',
    ':???:'      => 'icon_confused.gif',
    ':cool:'     => 'icon_cool.gif',
    ':lol:'      => 'icon_lol.gif',
    ':mad:'      => 'icon_mad.gif',
    ':twisted:'  => 'icon_twisted.gif',
    ':roll:'     => 'icon_rolleyes.gif',
    ':wink:'     => 'icon_wink.gif',
    ':idea:'     => 'icon_idea.gif',
    ':arrow:'    => 'icon_arrow.gif',
    ':neutral:'  => 'icon_neutral.gif',
    ':cry:'      => 'icon_cry.gif',
    ':mrgreen:'  => 'icon_mrgreen.gif',
    '8-)'        => 'icon_cool.gif',
    '8-O'        => 'icon_eek.gif',
    ':-('        => 'icon_sad.gif',
    ':-)'        => 'icon_smile.gif',
    ':-?'        => 'icon_confused.gif',
    ':-D'        => 'icon_biggrin.gif',
    ':-P'        => 'icon_razz.gif',
    ':-o'        => 'icon_surprised.gif',
    ':-x'        => 'icon_mad.gif',
    ':-|'        => 'icon_neutral.gif',
    ';-)'        => 'icon_wink.gif',
    '8)'         => 'icon_cool.gif',
    '8O'         => 'icon_eek.gif',
    ':('         => 'icon_sad.gif',
    ':)'         => 'icon_smile.gif',
    ':?'         => 'icon_confused.gif',
    ':D'         => 'icon_biggrin.gif',
    ':P'         => 'icon_razz.gif',
    ':o'         => 'icon_surprised.gif',
    ':x'         => 'icon_mad.gif',
    ':|'         => 'icon_neutral.gif',
    ';)'         => 'icon_wink.gif',
    );
    $imgUrl = Typecho_Widget::widget('Widget_Options')->themeUrl . '/img/smilies/';
    foreach($smiliesTrans as $smiley => $img) {
        $smiliesTag[] = $smiley;
        $smiliesReplace[] = "<img src=\"$imgUrl$img\" alt=\"\" class=\"smiley\" />";
    }   
    $output = '';
    $textArr = preg_split("/(<.*>)/U", $widget, -1, PREG_SPLIT_DELIM_CAPTURE);
    $stop = count($textArr);
    for ($i = 0; $i < $stop; $i++) {
        $content = $textArr[$i];
        if ((strlen($content) > 0) && ('<' != $content{0})) {
            $content = str_replace($smiliesTag, $smiliesReplace, $content);
        }
        $output .= $content;
    }
    $output = preg_replace('/\[img=?\]*(.*?)(\[\/img)?\]/e', '"<img src=\"$1\" alt=\"" . basename("$1") . "\" />"', $output);
    echo $output;
}

接下来,在主题目录新建inc目录,然后新建smiley.php文件内容如下:

<?php $imgUrl = $this->options->themeUrl . '/img/smilies/'; ?>
<span id="smiley">
<a href="javascript:Smilies.grin(':?:')"      ><img src="<?php echo $imgUrl; ?>icon_question.gif"  alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':razz:')"   ><img src="<?php echo $imgUrl; ?>icon_razz.gif"      alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':sad:')"    ><img src="<?php echo $imgUrl; ?>icon_sad.gif"       alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':evil:')"   ><img src="<?php echo $imgUrl; ?>icon_evil.gif"      alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':!:')"      ><img src="<?php echo $imgUrl; ?>icon_exclaim.gif"   alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':smile:')"  ><img src="<?php echo $imgUrl; ?>icon_smile.gif"     alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':oops:')"   ><img src="<?php echo $imgUrl; ?>icon_redface.gif"   alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':grin:')"   ><img src="<?php echo $imgUrl; ?>icon_biggrin.gif"   alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':eek:')"    ><img src="<?php echo $imgUrl; ?>icon_surprised.gif" alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':shock:')"  ><img src="<?php echo $imgUrl; ?>icon_eek.gif"       alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':???:')"    ><img src="<?php echo $imgUrl; ?>icon_confused.gif"  alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':cool:')"   ><img src="<?php echo $imgUrl; ?>icon_cool.gif"      alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':lol:')"    ><img src="<?php echo $imgUrl; ?>icon_lol.gif"       alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':mad:')"    ><img src="<?php echo $imgUrl; ?>icon_mad.gif"       alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':twisted:')"><img src="<?php echo $imgUrl; ?>icon_twisted.gif"   alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':roll:')"   ><img src="<?php echo $imgUrl; ?>icon_rolleyes.gif"  alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':wink:')"   ><img src="<?php echo $imgUrl; ?>icon_wink.gif"      alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':idea:')"   ><img src="<?php echo $imgUrl; ?>icon_idea.gif"      alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':arrow:')"  ><img src="<?php echo $imgUrl; ?>icon_arrow.gif"     alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':neutral:')"><img src="<?php echo $imgUrl; ?>icon_neutral.gif"   alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':cry:')"    ><img src="<?php echo $imgUrl; ?>icon_cry.gif"       alt="" class="smiley" /></a>
<a href="javascript:Smilies.grin(':mrgreen:')"><img src="<?php echo $imgUrl; ?>icon_mrgreen.gif"   alt="" class="smiley" /></a>
</span>

然后编辑comments.php文件,在评论框<textarea>上面加入<p><?php include('inc/smiley.php'); ?></p> 最后是JS部分,直接丢进主题的JS里即可:

// Smilies v1.0.4 for Typecho Comments - by willin kan - URI: http://kan.willin.org/typecho/
Smilies = {
 dom : function(id) {
   return document.getElementById(id);
 },

 grin : function (tag) { // 表情
   tag = ' ' + tag + ' '; myField = this.dom('comment');
   document.selection ? (myField.focus(), sel = document.selection.createRange(), sel.text = tag, myField.focus()) : this.insertTag(tag);
 },

 insertTag : function (tag) { // 插入评论中
   myField = Smilies.dom('textarea');
   myField.selectionStart || myField.selectionStart == '0' ? (
     startPos = myField.selectionStart,
     endPos = myField.selectionEnd,
     cursorPos = startPos,
     myField.value = myField.value.substring(0, startPos)
                   + tag
                   + myField.value.substring(endPos, myField.value.length),
     cursorPos += tag.length,
     myField.focus(),
     myField.selectionStart = cursorPos,
     myField.selectionEnd = cursorPos
   ) : (
     myField.value += tag,
     myField.focus()
   );
 }
}

注:convertSmilies可以用再不同的地方上,如 或者是实现文章表情修改content(); ?>到content); ?>甚至是公告。侧边栏最新评论表情如此类推。 因为我的主题暂时并不打算加入评论表情功能,所以没有整理一套表情,请自行整理并修改文件名。  

enter image description here

其实这个想法很早之前就有了,只是一直没付诸行动,做N3、N4的时候用到了自定义字段,为文章添加缩略图,方法很简单,而本文中讲介绍一下怎样用同样的方法,为文章添加不同的文章样式。

说说形式

WordPress早在 3.1 版本中便引入的文章形式这个功能了,是文章的一种属性,可以被主题用来决定文章的显示方式。其设计目的是要提供一个特殊的方法来根据文章的特点选用显示“格式”。

wordpress的方法很简单,因为程序自带此功能,根据官方文档就可以快速修改主题;而Typecho因为其自身精简,则不会加入此选项,但是我们可以使用其他方法实现,比如@沐风的插件,而我向来不喜欢安装多余的插件,所以想到了使用自定义字段的方式。

首先贴出参考代码

<?php if(isset($this->fields->say)){ //自定义字段“say” ?>
此处为say字段的样式,说说形式
<?php }else{; //如果文章没有定义say字段则else。 ?>
此处为普通文章样式
<?php }; ?>

字段名称为“say”, 字段值 任意或留空 由此可以看出,实现的方法非常简单,我这里仅仅是提供了php,具体代码和样式还需自行修改,如果想实现多种文章样式,多添加几个else即可。

到这里,自定义文章形式的教学就结束了,那么如何为文章添加缩略图呢?

其实网上很多代码,都可以很简单的获取文章首图,但是这些通过正则获取的方法好像并不支持Markdown编辑器,也就是说无法获取使用Markdown撰写的文章的图片,那么怎样更优雅的为文章添加缩略图呢?自定义字段即可。

参考代码:

<?php if(isset($this->fields->post_img)){ //自定义字段“post_img” ?>
<img src="<?php echo $this->fields->post_img;?>"/>
<?php };?>

把上面代码放进index.php合适的位置,字段名称为“post_img”,只需要在 字段值 中添加一张图片的链接即可 自定义字段的强大之处并不局限于此,想法很重要,实现很简单。

enter image description here

前两天Gravatar突然被墙,本来也没怎么在意,但是网站速度被拖得实在是难以忍受的地步,无奈,只好想一下解决方法,于是昨晚睡觉前百度了下,发现那些解决方案都是Wordpress的,例如@大发最新的解决方案:

function get_ssl_avatar($avatar) {
$avatar = preg_replace('/.*/avatar/(.*)?s=([d]+)&.*/','<img src="https://secure.gravatar.com/avatar/$1?s=$2" class="avatar avatar-$2" height="$2" width="$2" />',$avatar); return $avatar; }
add_filter('get_avatar', 'get_ssl_avatar');

但是Typecho并没有相关的文档,本想把大发的代码修改到TE,但是我不会PHP,看了好半天,翻了下程序源文件,怎么改都不行,于是我只好苦逼的修改源文件去了,希望好基友们看到后帮我鼓捣下。 好了,修改源文件其实也超级简单,只需要一行就可以了,方法如下: 打开

varWidgetAbstractComments.php 文件 在第413行找到$url = $host . '/avatar/';修改为://$url = $host . '/avatar/'; $url = 'https://secure.gravatar.com/avatar/'; 然后保存就行了,就是把上面那个注释掉然后手动加一个链接。

最新版(1.0-14.10.10)的解决方法,同样是打开Comments.php,第397行,将下方代码:

$url = Typecho_Common::gravatarUrl($this->mail, $size, $rating, $default, $this->request->isSecure()); 修改为:

$mailHash = NULL; if (!empty($this->mail)) { $mailHash = md5(strtolower($this->mail)); }
$url = 'https://secure.gravatar.com/avatar/';
if (!empty($this->mail)) {$url .= $mailHash;}
$url .= '?s=' . $size; $url .= '&r=' . $rating;
$url .= '&d=' . $default; //$url = Typecho_Common::gravatarUrl($this->mail, $size, $rating, $default,$this->request->isSecure());

“https://secure.gravatar.com”可以改成其它源。

多说的源:http://gravatar.duoshuo.com

七牛镜像源:http://avacdn.qiniudn.com

七牛镜像SSL源:https://dn-avacdn.qbox.me

当然自己搭建七牛镜像,或者反向代理Gravatar也是比较简单的,就不再赘述。

另外,如果你正在使用“评论墙”功能,那么可以在插件或者主题的function.php中找到如下代码:

$mostactive .= '<img class="avatar" src="http://'.$my_array[rand(0,3)].'.gravatar.com/avatar/'.md5(strtolower($value['mail'])).'?s=40&d=&r=G" /></a></li>';

将其修改为如下:

//$mostactive .= '<img class="avatar" src="http://'.$my_array[rand(0,3)].'.gravatar.com/avatar/'.md5(strtolower($value['mail'])).'?s=40&d=&r=G"/></a></li>';
$mostactive .= '<img class="avatar" src="https://secure.gravatar.com/avatar/'.md5(strtolower($value['mail'])).'?s=40&d=&r=G"/></a></li>';

同样是将默认的注视,然后修改,源地址参考上面的自行修改即可。 另外,我的Wordpress的主题从GoodNice版本后就支持在设置中修改avatar的源了,方法如下:

one

主题兼容主流浏览器,支持IE8+浏览器,往有下没做测试,理论上可以勉强阅读,Chrome浏览效果最佳。

响应式设计,采用了双导航设计,手机浏览会有非常好玩的侧滑导航哟,电脑上能够阅读的内容都尽可能的做到不隐藏了。

侧边栏保留了3个,放置页面底部位置,既保证了更多的内容,又不占用阅读空间,广告同样放在了页脚部分,不影响阅读

上图预览

NewRealm 2
NewRealm 2下载

本方法依托jQuery

<script type="text/javascript">
    jQuery(document).ready(function(){jQuery("a[rel='external'],a[rel='external nofollow']").click(function(){window.open(this.href);return false})});
</script>

将上方代码丢进主题的任意部分(丢在页脚吧),然后刷新页面,就能很完美的体验了。

由于TE默认使用的是MD编辑器,添加链接的时候无法像WP用户一样选择让文章内的链接在新窗口打开,那么我们其实也可以用JS让文章内的链接在新窗口打开的。

<script type="text/javascript">
    jQuery(document).ready(function($){$('.post-content a').attr({ target:"_blank"})});
</script>

把上面代码一起丢进主题里就行了,Class一般不用修改,如果主题修改程度过大,那么就修改一下.post-content为你主题文章部分的Class吧 OK,愉快的使用吧。