<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
				  >
<channel>
<title><![CDATA[Saturn's Weblog - 标签：stblog]]></title>
<link>http://www.cnsaturn.com/tag/stblog</link>
<description><![CDATA[Saturn's weblog, STBlog官方站点]]></description>
<language>zh-CN</language>
<pubDate>Mon, 06 Sep 2010 10:13:46 -0400</pubDate>
<item>
<title><![CDATA[在Stblog中定制你的代码高亮功能]]></title>
<link>http://www.cnsaturn.com/posts/55</link>
<pubDate>Tue, 25 May 2010 00:20:00 -0400</pubDate>
<description><![CDATA[<p>
 <strong>首先感谢目前正在使用stblog的朋友，正是你们的使用和批评才有了我不断改进-&gt;思考-&gt;改进的动力。当前版本还有诸多BUG和不完善的地方，我会在最近发布一个新的patch修正和完善这些功能。希望大家多提建议，感谢大家！<br />
 </strong></p>
<p>
 国内玩博客的人大部分都是Geek，他们的特点大多是：个性，最求完美，而且或多或少懂些编程的知识。这就是为什么我在开发stblog的第一个版本就引入了代码高亮功能。</p>
<p>
 <a href="http://code.google.com/p/stblog/">stblog</a>的代码高亮采用JavaScript渲染工具<a href="http://code.google.com/p/syntaxhighlighter/">SyntaxHighlighter</a>，使用和Hack方法也与其一致。</p>
<p>
 具体来说，要在stblog中定制和高亮你所需的代码，仅需要在模板中添加和删除对应高亮语法JS文件即可。</p>
<p>
 比如，朋友 <cite class="comment-author"><a href="http://www.rockics.com" rel="external nofollow">rockics</a></cite>提到，当他在后台编辑器中添加C++代码时出现如下弹窗错误：</p>
<p>
 <strong>&ldquo;can&#39;t find brush for ：cpp&rdquo;</strong></p>
<p>
 这是因为没有引入Cpp的高亮语法，解决方法很简单。</p>
<p>
 用支持代码编辑的文本编辑器（请勿使用windows自带的记事本）打开模板文件：</p>
<p>
 <strong>./themes/default/footer.php</strong></p>
<p>
 找到如下代码并修改：</p>
<pre class="brush:xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shCore.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushPhp.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushXml.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushCSharp.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushCss.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushJava.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushJScript.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushSql.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushBash.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushPython.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot;&gt;
  SyntaxHighlighter.config.clipboardSwf = &#39;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/clipboard.swf&#39;;
  SyntaxHighlighter.all();
 &lt;/script&gt;
</pre>
<p>
 加入你需要的高亮语法JS文件，比如这里是C++的，那么加入：</p>
<pre class="brush:xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;&lt;?php echo base_url(). ST_PLUGINS_DIR;?&gt;/editor/syntaxhighlighter/scripts/shBrushCpp.js&quot;&gt;&lt;/script&gt;
</pre>
<p>
 请注意以上<strong>shBrushCpp.js</strong>，这里是我们要引入的Cpp高亮语法JS文件。对应SyntaxHighlighter所支持的语法，请详见<a href="http://github.com/stblog/Stblog/tree/master/st_plugins/editor/syntaxhighlighter/scripts/">./st_plugins/editor/syntaxhighlighter/scripts目录</a>或<a href="http://code.google.com/p/stblog/">参考SyntaxHighilighter的说明</a>。</p>
<p>
 修改完成后，请上传至服务器并覆盖掉原文件。</p>
<p>
 <strong>Update：</strong>本来修改模板文件可以在后台进行，不过现在发现在后台修改模板会将部分代码转义，从而使模板功能失效。这里证实是一个BUG（下一个小版本中修正），请手动修改并上传服务器。</p>]]></description>
<author><![CDATA[Saturn]]></author>
<guid isPermaLink="true" >http://www.cnsaturn.com/posts/55</guid>
</item>
<item>
<title><![CDATA[Hello, Stblog]]></title>
<link>http://www.cnsaturn.com/posts/hello_stblog</link>
<pubDate>Mon, 19 Apr 2010 02:33:00 -0400</pubDate>
<description><![CDATA[<p>
 时间过的真快，来墨尔本已经一年多了，而距离我写的上一篇日志也有半年多了。这段时间感悟很多，有一堆东西想写下来，不过还是手懒了。</p>
<p>
 目前你所看到的这段文字，来自<a href="http://github.com/stblog/Stblog/network/members">我和CI中国其他几位成员</a>目前正在开发的基于<a href="http://codeigniter.org.cn">Codeigniter (PHP MVC框架)</a>开发的一套博客程序&mdash;&mdash;<a href="http://code.google.com/p/stblog/">Stblog</a>，目前的最新版为 v0.1.2。写这套程序的原因，<a href="http://codeigniter.org.cn/forums/thread-4968-1-1.html">我写在了这里</a>，就不转载过来了。</p>
<p>
 正在学习PHP和Codeigniter的朋友，我推荐你们下载和试用这套程序，但目前暂不推荐使用在真实的环境当中，因为它有诸多地方需要完善。待程序和相关文档成熟之后，在使用也不迟。</p>
<p>
 Stblog开发相关动态：</p>
<p>
 项目主页：<a href="http://code.google.com/p/stblog/">http://code.google.com/p/stblog/</a></p>
<p>
 程序下载：<a href="http://code.google.com/p/stblog/">http://code.google.com/p/stblog/downloads/list</a></p>
<p>
 Bug提交：<a href="http://code.google.com/p/stblog/">http://code.google.com/p/stblog/issues/list</a></p>
<p>
 安装方法/插件/主题开发教程：<a href="http://code.google.com/p/stblog/w/list">http://code.google.com/p/stblog/w/list</a></p>
<p>
 注意：STBlog的协作开发和版本控制工具为Git (没有使用SVN)，目前被托管在Github.com。请移步 <a href="http://github.com/stblog/Stblog">http://github.com/stblog/Stblog</a>&nbsp; 了解最新开发动态，以及checkout最新开发版本。</p>]]></description>
<author><![CDATA[Saturn]]></author>
<guid isPermaLink="true" >http://www.cnsaturn.com/posts/hello_stblog</guid>
</item>
<item>
<title><![CDATA[PHP中插件机制的一种实现方案]]></title>
<link>http://www.cnsaturn.com/posts/how-to-inplement-plugin-in-php</link>
<pubDate>Thu, 10 Sep 2009 12:05:00 -0400</pubDate>
<description><![CDATA[<p>
 这篇文章的出发点是我对插件机制的理解，及其在PHP中的实现。这套插件机制已经在你目前看到的这个博客程序中的重构代码中实现（我定名为STBlog），由于尚未开发完毕，所以目前暂不开发源代码。但文章会涉及到核心思想和部分实现代码。</p>
<p>
 插件，亦即Plug-in，是指一类特定的功能模块（通常由第三方开发者实现），它的特点是：当你需要它的时候激活它，不需要它的时候禁用/删除它；且无论是激活还是禁用都不影响系统核心模块的运行，也就是说插件是一种非侵入式的模块化设计，实现了核心程序与插件程序的松散耦合。一个典型的例子就是Wordpress中众多的第三方插件，比如Akimet插件用于对用户的评论进行Spam过滤。</p>
<p>
 一个健壮的插件机制，我认为必须具备以下特点：</p>
<ul>
 <li>
  插件的动态监听和加载（Lookup）</li>
 <li>
  插件的动态触发</li>
 <li>
  以上两点的实现均不影响核心程序的运行</li>
</ul>
<p>
 要在程序中实现插件，我们首先应该想到的就是定义不同的钩子（Hooks）；&ldquo;钩子&rdquo;是一个很形象的逻辑概念，你可以认为它是系统预留的插件触发条件。它的逻辑原理如下：当系统执行到某个钩子时，会判断这个钩子的条件是否满足；如果满足，会转而先去调用钩子所制定的功能，然后返回继续执行余下的程序；如果不满足，跳过即可。这有点像汇编中的&ldquo;中断保护&rdquo;逻辑。</p>
<p>
 某些钩子可能是系统事先就设计好的，比如之前我举的关于评论Spam过滤的钩子，通常它已经由核心系统开发人员设计进了评论的处理逻辑中；另外一类钩子则可能是由用户自行定制的（由第三方开发人员制定），通常存在于表现层，比如一个普通的PHP表单显示页面中。</p>
<p>
 可能你感觉上面的话比较无聊，让人昏昏欲睡；但是要看懂下面我写的代码，理解以上的原理是必不可少的。</p>
<p>
 下面进行PHP中插件机制的核心实现，整个机制核心分为三大块：</p>
<ul>
 <li>
  一个插件经理类：这是核心之核心。它是一个应用程序全局Global对象。它主要有三个职责：
  <ul>
   <li>
    负责监听已经注册了的所有插件，并实例化这些插件对象。</li>
   <li>
    负责注册所有插件。</li>
   <li>
    当钩子条件满足时，触发对应的对象方法。</li>
  </ul>
 </li>
 <li>
  插件的功能实现：这大多由第三方开发人员完成，但需要遵循一定的规则，这个规则是插件机制所规定的，因插件机制的不同而不同，下面的显示代码你会看到这个规则。</li>
 <li>
  插件的触发：也就是钩子的触发条件。具体来说这是一小段代码，放置在你需要插件实现的地方，用于触发这个钩子。</li>
</ul>
<p>
 原理讲了一大堆，下面看看我的实现方案：</p>
<p>
 </p>]]></description>
