标签:插件

浏览模式: 标准 | 列表 | 图文
typecho 插件开发(三)

typecho 插件开发(三)

在typecho开发插件的时候,很有可能会用到关联插件(即,部分信息需要从其他插件里来读取)因此,在插件激活的时候就得先判断是否关联插件已经启用。

最初我的代码是:

$mailOptions = Typecho_Widget::widget('Widget_Options')->plugin('CommentToMail');
if(emptyempty($mailOptions)){//这里会出现两个empty,这是编辑器的关系,代码中只有一个
throw new Typecho_Plugin_Exception(_t('对不起,数据库备份插件需启用CommentToMail插件。'));
}
但是在这样处理的时候,会提示“找不到CommentToMail插件的配置信息”,直接就抛出异常

于是代码改成:

try{
$mailOptions = Typecho_Widget::widget('Widget_Options')->plugin('CommentToMail');
}catch(Exception $e){
throw new Typecho_Plugin_Exception(_t('对不起,数据库备份插件需启用CommentToMail插件。'));
}

于是这样的出错提示信息就较为友好了。

由于关联了其他插件,因此在处理的时候,还要再判断这个$mailOption是否存在,因此我把它设为了protected static $mailOptions,然后在要处理的页面会判断这个变量是否为empty。如果是后台处理就抛出异常,前台处理则直接return;不作继续

typecho SVN更新

typecho SVN更新

这样typecho的SVN源代码更新对我来说,有几个比较重要的地方。其中有一点就是我向70提出来的(我无法改源码)
1、需要能够对插件变量直接修改值,而不是通过config方法的form方式提交(其实我是想用在数据库备份插件中的,记录上次备份时间,以前的话,恐怕只能到option表里找到这个key,并且update这个key对应的value了),该方法目前存在于Helper类中。
2、修正附件的所有权(r1449)

多看看project页面的source中的change,可以看到更多修改记录。好象你有意见也可以去issues里面提(一个人更新。太慢了。。。)

typecho 插件开发(二)

typecho 插件开发(二)

纠结在写typecho的dbbackup这个插件上很久了,主要是为了两件事:
1、不想让用户设置的变量,无法自由设定(关于这点,我其实很能理解,不需要用户设置的变量,如果不在config类里被定义,那么在deactitave的时候,是否能够被正常删除?)

2、Db config 无法获取(本来我以为备份sqlite是最简单的事情,只要把db文件打个包,当成附件发送一下就完事了。但事实上,我无法通过程序获取到这个Db文件,因为_config变量是protected的,也没有任何函数可以重新获取这个$_config变量)

所以现在,我还是决定

1、设置变量,但要求用户不要修改。或者允许他们置为空(置为空的时候,直接就是相当于执行备份操作)

2、不管是sqlite 还是 mysql 都采用PHP导出成sql文件的方式,然后再打包发送

当然,还只是构思,并没有实现,尚在慢慢实现中。。。因为要期末考试了,时间也不多,还得带孩子。oh oh oh ....

顺便,sluke说的页面关键字高亮,我以为是有这个插件的,看了一下是Tag高亮,其实也差不多。其实,也就是在搜索的时候,我支持一下Referer就可以实现了。

typecho 插件:搜索来源关键字高亮

typecho 插件:搜索来源关键字高亮

这个typecho插件也是前两天我发布的,我因为没办法测试,所以一直不知道原来我犯了一个最大的错误(单词写错了,我把highlight我写成了hightlight),所以。。。一直无法显示成功,羽中提出了这个问题后,我好好的看了一下源码,才发现这个不是bug,但是是错误的代码。

郁闷啊。太丢人了。

最后再说明一下插件的功能:

0.1.2 増加网站内部搜索关键字高亮

0.1.1

对于从百度、google、yahoo搜索来的链接中的关键字进行高亮,仅有一种黄色背景。因为他本来也是我作为一个试手的作品。

不过,如果真要使用,请还需要手动在您的CSS中加上:

<style type="text/css">.searchword { background-color: yellow; }</style>

也就是说,你可以自己修改searchword这个CSS。如果您不愿意添加这个样式,你可以把我的代码中关于style的注释去掉就可以了。

请下载更新,谢谢:

0.1.2 263ac7179d09f990a87eaf7e7666106a 【注意,如果更新此插件,请务必更新内容分页SplitArchivePage 插件到0.1.5版本或以上】

0.1.1 100f4ef6300c1627493df742d6600494

typecho 插件开发(一)

typecho 插件开发(一)

看typecho第二天了,不过我还是没有仔细查看源码,只是根据一些其他插件的应用来写自己的应用。

比如,看了Akismet插件后,知道了 Typecho_Widget_Helper_Form 对象还有一个 addRule 方法,用来对数据进行验证。

昨天看了一下源码,并对应我昨天的方法了解Typecho页面中可以被注入对象的地方,在插件的activate中写了两个方法,可以让插件在全局被应用。

Typecho_Plugin::factory('index.php')->begin = array('DbBackup_Plugin', 'backup');
Typecho_Plugin::factory('admin/common.php')->begin = array('DbBackup_Plugin', 'backup');

嗯。是准备考虑备份的。前后台都有。正在尝试。如果并未按照我预想的情况运行的话,可能只考虑前台触发了。

加了三个参数:

$rate = new Typecho_Widget_Helper_Form_Element_Text('rate', NULL, '1', _t('备份频率'),_t('备份数据的频率(最小单位为天,请使用整数)'));
$form->addInput($rate->addRule('isInteger',_t('请输入整数')));
$email = new Typecho_Widget_Helper_Form_Element_Text('email', NULL, '', _t('备份发送到'),_t('发送邮件地址。'));
$form->addInput($email->addRule('email',_t('请输入正确的邮箱地址')));
$lastbackup = new Typecho_Widget_Helper_Form_Element_Text('lastbackup', NULL, '', _t('上次备份时间'),_t('无需设置,由程序自动生成'));
$form->addInput($lastbackup);

但是isInteger,这个验证方法是验证is_numeric,其实我是希望是一个正整数。现在,先将就一下下喽。离完成还早,顺便附上两个昨天写的垃圾插件,敬请测试(主要是官方论坛我注册后收不到邮件,所以无法登录。过会我再换个邮箱试试)

文章分页:已经删除,请移步typecho 插件:内容分页SplitArchivePage 进行下载 【演示地址】

高亮搜索引擎来源关键字:295c8a9efc10a0f0499ca6bca62048a8 【这个,在这现在这个博客上测试成功,但是在typecho上没有办法测试,因为没有数据,google搜索不到。。。】

TinEye插件

TinEye插件

搜索相似图片,你会怎么搜索?上传?分析?再搜索结果 ?
tineye.com就是这样的一个搜索相似图片的网站。yhustc在分析了tineye for firefox的插件后,写了下面的文章。
不过,我怎么感觉来感觉去,这种JS的注入,都象在学搜狗输入法?把某个链接加入到收藏夹,在你要搜索的页面,点击一下这个收藏的链接。然后再点击图片就可以搜索了。。

虽说JS注入方式有很多,但最近发扬光大的却是搜狗输入法。有记忆的朋友可能会记得几年前,所谓网上流传的一段神奇代码,在一个图片非常多的页面,在地址栏里键入代码,页面中的图片就会滚动起来。。。


好相象啊。不多说了,看原文吧。
原文地址:http://www.yhustc.com/Made_a_JS_plug-in_tineye_search.html

使用方法很简单,IE用户在下面的链接上右键选择添加到收藏夹,firefox用户直接将链接拖动到书签栏就行了

tineye搜索

然后打开任意网页,比如g.cn,比如现在要搜索与google的logo相似的图片,在收藏夹里点击这个tineye的收藏就行了,此时JS文件 已经加载到该网页并且处理过所有页面中的图片了。把鼠标移动google的logo上会有个黑框,然后title也变成了“Search in tineye”,左键单击图片,就会打开新窗口来搜索图片。

测试过了,firefox,opera,ie,webkit都能用。以后看到美女图要找套图就方便了,哈,直接用这个JS处理一下然后点击就行了。

---EOF--
如果你有特殊爱好,比如胆子小,又比如有点“钻”研精神,直接看:http://www.yhustc.com/tineye.js也可以了解一下yhustc的想法。HOHO

PHP反射API--利用反射技术实现的插件系统架构

纯COPY,没仔细看。。。。【先申明,我COPY对这段代码,主要是看他reflectionClass的应用,并非关注插件的应用。。。】

有爱好的人,可以学习一下。。

/**
* @name PHP反射API--利用反射技术实现的插件系统架构
* @author :PHPCQ.COM
*/
interface Iplugin{
public static function getName();
}
function findPlugins(){
$plugins = array();
foreach (get_declared_classes() as $class){
$reflectionClass = new ReflectionClass($class);
if ($reflectionClass->implementsInterface('Iplugin')) {
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
function computeMenu(){
$menu = array();
foreach (findPlugins() as $plugin){
if ($plugin->hasMethod('getMenuItems')) {
$reflectionMethod = $plugin->getMethod('getMenuItems');
if ($reflectionMethod->isStatic()) {
$items = $reflectionMethod->invoke(null);
} else {
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke($pluginInstance);
}
$menu = array_merge($menu,$items);
}
}
return $menu;
}
function computeArticles(){
$articles = array();
foreach (findPlugins() as $plugin){
if ($plugin->hasMethod('getArticles')) {
$reflectionMethod = $plugin->getMethod('getArticles');
if ($reflectionMethod->isStatic()) {
$items = $reflectionMethod->invoke(null);
} else {
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke($pluginInstance);
}
$articles = array_merge($articles,$items);
}
}
return $articles;
}
require_once('plugin.php');
$menu = computeMenu();
$articles = computeArticles();
print_r($menu);
print_r($articles);


//plugin.php 代码如下
<?php
class MycoolPugin implements Iplugin {
public static function getName(){
return 'MycoolPlugin';
}
public static function getMenuItems(){
return array(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin'));
}
public static function getArticles(){
return array(array('path'=>'/MycoolPlugin','title'=>'This is a really cool article','text'=>xxxxxxxxx));
}
}
推荐一款插件:ScribeFire

推荐一款插件:ScribeFire

这款插件的用途是可以让你快速发表博客。功能还算是挺强大。主要是方便啦

而且,它是firefox的插件,不需要你安装软件,有firefox的地方就能够使用,多方便啊。。。

当然,在使用它为wordpress发表文章的时候,还必须在后台开启XML-RPC应用。否则是不能发表的。

博客系统看来是需要更换了,sablog用了也将近2年了。最痛苦的就是输入的文章突然消失(不小心按了Backspace键,然后回来的时候内容就没有了),出现了好几次这样的事故。。

下载地址为:https://addons.mozilla.org/en-US/firefox/addon/1730

截图:ce1d2e7eb09abc37c7d580751b26075f

jQuery简单开发

jQuery简单开发

jQuery这种轻量级的框架大家使用的都比较多,1.3后效率据说又上升了不少,因此,开发基于jQuery的插件也就显得那么理所当然了。
一般来说,jQuery有两种插件模式,一种是:$.extends({}) ,另一种是:$.fn.extends({})
个人理解:前一种是属于全局性的调用,后一种是针对某个元件的绑定调用。这当然是简单的理解。但事实上,也基本上就是这么做的。

官方的例子也比较简单:

$.extend({
max: function(a, b) {
return a > b ? a : b;
},
min: function(a, b) {
return a > b ? b : a;
},
avg: function(a, b) {
return a / b;
}
});

看上去是不是容易?然后就可以直接调用了。 $.min(2,3) 返回2
一般情况下,为了在扩展中使用$,却又担心的页面使用了jQuery.noConflict()而取消了$指向jQuery的引用,则需要这样写

( function($){
$.fn.extend({
//....code in here
});
})(jQuery);

这样写不仅能够将$显式指向jQuery,而且将产生的变量封在function的作用范围内,不会污染window全局。
而基于$.fn.extends({})的扩展又如何开发呢?

在这里我引用Roby的译文:http://www.robysky.com/archives/171
英文原文:http://www.learningjquery.com/2007/10/a-plugin-development-pattern

我认为以下插件开发模式是必须应该掌握的:
1.在JQuery命名空间内声明一个特定的命名;
2.接收参数来控制插件的行为;
3.提供公有方法访问插件的配置项值;
4.提供公有方法来访问插件中其他的方法(如果可能的话);
5.保证私有方法是私有的;
6.支持元数据插件;

下面,我将逐一讲述上面的内容,并在同时给出相关的简单插件开发代码。
1.在JQuery命名空间内声明一个特定的命名

这意味着开发的是一个单一命名的插件脚本,如果你的脚本包含多个插件或者有补充性质的插件,比如$.fn.doSomething() 和$.fn.undoSomething(),那你得声明多个命名了。但是总体来说,当开发一个插件时,我们应该努力做到用一个单一的命名来搞定整个插件。

在例子中,我们将声明一个名为“hilight”的插件。

$.fn.hilight = function() {
// Our plugin implementation code goes here.
};

我们可以这样调用:
$(’#myDiv’).hilight();
但是假如我们需要打破这种单一的命名和调用方式呢?有很多理由支持我们这么做:设计上的需要;更加简单和可读的配置;而且那样将更加符合OO的要求。

在没有给命名空间来到麻烦的前提下,将插件的部署打破成为多个函数的形式将是十分繁琐的。我们通过认识并利用JavaScript中 functions是最高层的对象,和其他对象一样,functions可以被赋予属性,前面我们已经将hilight命名声明在了JQuery的原型对象上,那么,其实,其他的我们想扩展的属性或对象都能够在hilight上进行声明。稍后将详细讲述此点。
2.接收参数来控制插件的行为;

来为我们的hilight插件添加指定前景和背景色的功能,我们需要在函数中允许一个object类型的选项设置。如下所展示的那样:

$.fn.hilight = function(options) {
var defaults = {
foreground: 'red',
background: 'yellow'
};
// Extend our default options with those provided.
var opts = $.extend(defaults, options);
// Our plugin implementation code goes here.
};

现在,我们的插件可以这样来调用:

$(’#myDiv’).hilight({
foreground: ‘blue’
});
3.提供公有方法访问插件的配置项值;

上面的代码我们可以做一下改进,使得插件的默认值可以在插件之外被设置。这无疑是十分重要的,因为它使得插件用户可以使用最少的代码来修改插件配置,这其实是我们利用函数对象的开始。

// plugin definition
$.fn.hilight = function(options) {
// Extend our default options with those provided.
// Note that the first arg to extend is an empty object -
// this is to keep from overriding our "defaults" object.
var opts = $.extend({}, $.fn.hilight.defaults, options);
// Our plugin implementation code goes here.
};

// plugin defaults - added as a property on our plugin function
$.fn.hilight.defaults = {
foreground: 'red',
background: 'yellow'
};

4.提供公有方法来访问插件中其他的方法(如果可能的话)

这里要讲的方法和前面的讲解一脉相承,用此方法来扩展你的插件(而且能够让其他人进行扩展)是件很有意思的事情。例如,在扩展hilight插件时,我们可以定义一个format方法用来格式化高亮显示的文本,原来的hilight插件和扩展了format方法的插件代码如下:

$.fn.hilight = function(options) {
// iterate and reformat each matched element
return this.each(function() {
var $this = $(this);
...
var markup = $this.html();
// call our format function
markup = $.fn.hilight.format(markup);
$this.html(markup);
});
};

// define our format function
$.fn.hilight.format = function(txt) {'
return '<strong>' + txt + '</strong>';
};

如前面所述,我们已经很容易的通过设置options对象的属性来允许一个回调函数来覆写默认的格式设置。在这里有另外一个非常棒的方法来个性化你的插件,上面展示的方法实际上就是通过暴露format方法,使其可以被重新定义。这种做法使得其他人可以采用他们自己的习惯和方式来重写你的插件,这意味着他们可以为你的插件写额外的扩展插件。
仔细考量一下前面我们用到的插件例子程序,你可能会想“我们究竟应该在什么时候使用这种插件方式来实现需求”的问题。一个来自现实应用中的插件便是“ Cycle Plugin”,它是一个支持多种滑动显示特效的插件,特效包括滚动、滑动和渐变等等。但是,实际上,并没有办法来定义每一个可能会用在滑动变幻上的特效。这就是这种扩展方式的有用之处。“ Cycle Plugin”插件暴露了”transitions”对象,这使得用户只需要按照如下方式便可以添加自己的变幻定义:
$.fn.cycle.transitions = {
…
};
这种技巧使得用户可以定义或者采用自己习惯的方式来扩展“ Cycle Plugin”。
5.保证私有方法是私有的;

上面提到的暴露插件中的公有方法的技巧使得插件能够被覆写,这将使插件变得十分灵活而强大,但至于哪一部分,那些属性和方法应该被暴露出来,你得小心了。一旦使其能够被外界访问到,你就得注意到任何调用参数和语义化的变动都可能使其丧失向前的兼容性。作为一般准则,如果不确定是否应该暴露某个属性或对象的话,那就最好别那样做。
那么我们应该怎样来定义多个方法而不至于使命名空间混乱并且保证不被暴露再外呢?这就是闭包的工作,为了便于演示,我们给插件加入了一个叫做 “debug”的功能,它用来记录firebug控制台所选择的网页元素数目。为了创建一个闭包,我们将整个功能的定义放入在一个function中了(有关这方面的知识,可参见JQuery手册)。

// create closure
(function($) {
// plugin definition
$.fn.hilight = function(options) {
debug(this);
...
};
// private function for debugging
function debug($obj) {
if (window.console && window.console.log)
window.console.log('hilight selection count: ' + $obj.size());
};
...
// end of closure
})(jQuery);

debug方法在这里是无法被在插件以外访问到的,因此,我们称之为它是插件私有的。
6.支持元数据插件;

根据你所写的插件的类型,为你的插件加入元数据插件的支持将使其变得更强大。就我个人来说,喜欢采用元数据插件的重要原因便是它可以让你使用定义之外的标签来覆写你的插件属性设置(这在创建demo和例子时十分有用),而且支持它十分的简单。
更新:这部分内容可以在本文的评论中展开讨论(既然有争议的话)

// plugin definition
$.fn.hilight = function(options) {
...
// build main options before element iteration
var opts = $.extend({}, $.fn.hilight.defaults, options);
return this.each(function() {
var $this = $(this);
// build element specific options
var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
...

改动部分的代码会做如下的事情:
*测试metadata插件是否可用
*如果可以,将用metadata扩展options对象
这被加入到jQuery.extend,作为其最后一个参数,所以它可以覆写任何其他参数设置。现在我们可以通过下面的方式控制其行为:

<!-- markup -->
<div class="hilight { background: 'red', foreground: 'white' }">Have a nice day!</div>
<div class="hilight { foreground: 'orange' }">Have a nice day!</div>
<div class="hilight { background: 'green' }">Have a nice day!</div>

而在调用方面,我们通过一行简单的代码就可以实现预期的效果:
$(’.hilight’).hilight();

将上面所述内容涉及到的代码放在一起,完整的例子程序代码如下:

//
// create closure
//
(function($) {
//
// plugin definition
//
$.fn.hilight = function(options) {
debug(this);
// build main options before element iteration
var opts = $.extend({}, $.fn.hilight.defaults, options);
// iterate and reformat each matched element
return this.each(function() {
$this = $(this);
// build element specific options
var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
// update element styles
$this.css({
backgroundColor: o.background,
color: o.foreground
});
var markup = $this.html();
// call our format function
markup = $.fn.hilight.format(markup);
$this.html(markup);
});
};
//
// private function for debugging
//
function debug($obj) {
if (window.console && window.console.log)
window.console.log('hilight selection count: ' + $obj.size());
};
//
// define and expose our format function
//
$.fn.hilight.format = function(txt) {
return '<strong>' + txt + '</strong>';
};
//
// plugin defaults
//
$.fn.hilight.defaults = {
foreground: 'red',
background: 'yellow'
};
//
// end of closure
//
})(jQuery);

看完以上的内容,你是不是对jQuery的插件开发加深了一定的了解了呢?
顺便提一下,yhustc在自己的博客上写了一个基于jQuery的软键盘插件,你是不是又可以根据上面的教程来写一个基于$.fn.extends的扩展呢?让yhustc的插件可以绑定在某个元件上?

团队作品:[NEATSheepDog]法师的牧羊犬

想说的是,团队没在一起开发N年了,虽然大家都还保持着联系。。。

walkerlee卖机票去了,hihiyou北京泡妞去了,老戴广州去了,totododo电信去了,唯有我还在上海没挪过地方。

总以为Walkerlee不会再搞开发了,毕竟当boss了嘛,HOHO,不料今天QQ又骚扰我说是写了一个插件,想介绍我使用,被我义正言辞的拒绝了。wow,确实很多年没有玩了,从头至尾,我的人物就没有超过10级。

废话不说了,介绍一下窝窝的插件。

– ==========================================
– 插件说明
– ==========================================
英文:NEATSheepDog
中文:法师的牧羊犬
版本:1.0 BETA
作者:walkerlee
联系:walkerlee[at]yahoo(dot)cn www.walkerlee.net
简介:这个插件能使你设置一个目标作为监视目标,在不切换你”当前目标”的情况下可以监视目标的血条用图形和百分比表示.同时监视目标上的变形术剩余时间.
插件还支持对监视对象施放变形术的特性.如果玩家和监视目标之间距离超过变形术施法距离,插件会以半透明的形式提示玩家.
同时,在变形术到达剩余的指定时间时,施法时间到时和羊被打断时,屏幕会有相对应的提示.
– ==========================================
– 按键说明
– ==========================================
插件分为血量条和读秒条.其中鼠标操作:
鼠标左键单击血量条时,如果玩家当前目标不是监视目标并且监视目标已被设为焦点,则把监视目标设置为玩家当前目标.
鼠标中键单击血量条时,把玩家当前目标设置为焦点即监视目标.
鼠标右键单击血量条时,把玩家当前目标设置为焦点目标同时施放变形术.
鼠标左键单击读秒条时,如果监视目标已经被设置为焦点,则对监视目标施放变形术.
鼠标右键单击读秒条时,如果监视目标已经被设置为焦点,清除监视目标的焦点设置.
按住鼠标左键拖动血量条或者读秒条可以拖动插件界面,到你想要的位置上松开鼠标左键即可.
– ==========================================
– 监视目标说明
– ==========================================
监视目标显示的优先顺序为,在有焦点目标的情况下,优先显示焦点目标,在没有焦点目标的情况下,显示当前目标.
当前目标直接用目标的名字表示,焦点目标用*目标名字*表示.例如血量条上显示”风之步行者”,表示监视目标当前为玩家的当前目标.
血量条上显示”*风之步行者*”,表示监视目标为玩家设置的焦点目标.
– ==========================================
– 安装说明
– ==========================================
进入你魔兽世界的安装根目录,例如 “D:\游戏\魔兽世界\”,在这个目录下面你可以看到Launcher.exe,Wow.exe等文件.
在根目录下找到文件夹Interface,如果没有,请自行建立一个文件夹并将其命名为”Interface”.
进入Interface文件夹,找到Addons文件夹,如果没有该文件夹,请自行建立一个文件夹并将其命名为”Addons”.
把NEATSheepDog这个文件夹复制到Addons文件夹中,在登陆魔兽世界后,角色选择画面的左下角的插件选项中找到”法师的牧羊犬”,如果没有打钩,请打上.进入游戏即可使用本插件.
– ==========================================
– 截图说明
– ==========================================
截图\demo.jpg 插件界面以及特点演示
截图\alert1.jpg 变形术剩余10秒提示
截图\alert2.jpg 变形术打断提示
截图\alert3.jpg 变形术结束提示

Enjoy your World of Warcraft’s life!

walkerlee 2008-10-21

下载地址:http://www.walkerlee.net/wow/addons/NEATSheepDog/NEATSheepDog.rar

程序界面

变形术剩余10秒提示

变形术被打断提示

变形术结束提示