[ Content | Sidebar ]

Posts tagged wordpress

why mail2blog

这阵子一直用email更新这个blog,很爽。

优点:
1. 客户端变得很多,比如我现在吃饭的空用e71码这篇blog,blog变得可以随时随地。
2. 更稳定得编辑器,worpress自带得编辑器给我特不稳定得感觉,而且添加附件不方便。
3. 不用再备份blog,全在已发邮件里了,包括附件。

从我的e71发送
superscreenshot0029.jpg
———–
post by gmail~

wordpress api的js实现版本

上次提到的一个想法的实现版本,正在应用到偶开发的项目当中~
比wordpress的action和filter增加两个特性

  • 能够添加一个只运行一次的action或者filter
  • 可以通过返回{end:true}这种特殊对象来结束一个action或者filter

这两个特性在web开发里灰常有用

<html>
<script>
//2010.4.10 第一版
(function(ns)
{
    var filters = {};
    var max_priority = 10;
    var default_priority = 10;
 
    var array_include = function(a, v)
    {
        for ( var i = 0, j = a.length; i < j; i ++ )
        {
            if ( a[i] == v ) return true;
        }
        return false;
    };
 
    var to_array = function(a)
    {
        var rt = [];
        for ( var i = 0, j = a.length; i < j; i ++ )
        {
           rt.push(a[i]); 
        }
        return rt;
    };
 
    function _set(func, tag, priority, key, value)
    {
        func['__filter_' + tag + '_' + priority + '_' + key] = value; 
    }
 
    function _get(func, tag, priority, key)
    {
        return func['__filter_' + tag + '_' + priority + '_' + key]; 
    }
 
    ns.add_filter = ns.add_action = function(tag, func, priority, run_once) 
    {
        run_once = run_once === undefined ? false : run_once;
        priority = priority || default_priority; 
        if ( !filters[tag] ) filters[tag] = {};   
        if ( !filters[tag][priority] ) filters[tag][priority] = [];
        if ( !array_include(filters[tag][priority], func) )
        {
            filters[tag][priority].push(func);
        }
 
        _set(func, tag, priority, 'run_once', run_once);
    };
 
    ns.add_once_filter = ns.add_once_action = function(tag, func, priority)
    {
        ns.add_filter(tag, func, priority, true);
    };
 
    function filter_or_action(ac, tag, value)
    {
        if (!filters[tag]) return value;
        if ( ac == 'action' )
        {
            var args = to_array(arguments);
            args.shift();
            args.shift();
        }
        var _cfs = filters[tag];
        var i = 1, func; 
        var rt = value;
        while ( i <= max_priority )
        {
            if ( !_cfs[i] || _cfs[i].length === 0 ) 
            {
                i ++;
                continue;
            }
 
            for ( var j = 0, length = _cfs[i].length; j < length; j ++ )
            {
                func = _cfs[i][j];
 
                if ( ac == 'action' )
                {
                    rt = func.apply(null, args);
                }
                else
                {
                    rt = func.call(null, rt);
                }
 
                if ( _get(func, tag, i, 'run_once') ) 
                {
                    _cfs[i].splice(j, 1);
                    j --;
                    length --;
                }
                if ( rt && rt['end'] ) return rt['value'] || null;
            }
 
            i ++;
        }
        return rt;
    };
 
    ns.apply_filters = function(tag, value)
    {
        return filter_or_action('fitler', tag, value)
    };
 
    ns.do_action = function(tag)
    {
        var args = to_array(arguments);
        filter_or_action.apply(null, ['action'].concat(args));
    };
})(window)
 
function log(str)
{
    document.write('<p>' + str + '</p>');
}
 
//普通的filter
add_filter('status', function(text)
{
    return text.replace(/orz/g, '超人');
});
log(apply_filters('status', 'orzorz'));
//再添加一个filter
add_filter('status', function(text)
{
    return text.replace('超人', '动感');
});
log(apply_filters('status', 'orzorz'));
 
//添加一个优先级较高的filter,并通过返回包含end字段的对象结束过滤器
add_filter('status', function(text)
{
    return {end:true, value:text};
}, 5);
log(apply_filters('status', 'orzorz'));
 
//但是下面这个优先级较高的会执行
add_filter('status', function(text)
{
    return text + '管不着我';
}, 1);
log(apply_filters('status', 'orzorz'));
 
log('-----------------------------');
log('action测试');
log('-----------------------------');
 
//下面是action
add_action('ac_success', function(a, b, c)
{
    log('返回数据:' +  a + b + c); 
});
 
//添加一个只会执行一次的action回调
add_once_action('ac_success', function(a, b, c)
{
    log('我只会执行一次的');
});
 
add_action('ac_success', function(a, b, c)
{
    log('俺的优先级比较高');
}, 5);
 
log('----------第一次执行----------------');
do_action('ac_success', '1', '2', '3');
 
log('----------第二次执行----------------');
do_action('ac_success', '4', '5', '6');
 
add_action('ac_success', function(a, b, c)
{
    log('全部屏蔽');
    return {end:true}; 
}, 1);
 
log('----------第三次执行----------------');
do_action('ac_success', '1', '2', '3');
</script>
</html>
Copy Code | Run Code

准备做一个wordpress的离线编辑器

2010.3.6 更新
由于最近的学习充电计划,这个东西暂时搁置了,现在已经可以自动保存了~
———————————
linux平台上一直没有这样一个所见即所得的blog离线编辑器,昨天试着用pyqt4写了一个小脚本,发现原来python做客户端软件是如此容易.然后下定决心要利用n个周末的时间自己写一个.

开始打算用纯qt的ui控件实现,但是感觉没有wordpress的编辑器这么亲切,于是想到一个界面亲切,实现也方便的方案: ui部分直接用web,框在一个pyqt的webkit组件里,逻辑部分用python的cgihttpserver在本地开一个cgi.

这个东西搞到今天雏形已经有了,可以实现跟wordress完全相同的书写体验.

顺带发那个pyqt的练手之作 : emlreader.py 一个可以查看eml附件的脚本

wordpress的插件机制用于产品js代码的解耦

由于半路出家,设计模式几乎没有接触,一直为产品代码的耦合头疼,前两天忽然想到,wordpress区区数行代码便实现了强大的插件接口,何不借鉴一下呢,于是便有了下面的假想代码(不了解wordpress插件机制的同学可以先了解一下):

/*
* 以一个相册浏览的产品为例
* 该应用可以实现无刷新的图片浏览,附加功能:新用户引导,图片评论,对图片处理的第三方应用,圈人
*/
//产品引导开始
addAction('photo_browser_init',function()
{
     guideManager.init();
});
addAction('photo_load_sucess',function(photo)
{
    guideManager.step(3, photo);
});
addAction('photo_change',function(photo)
{
    guideManager.step(4);
});
//产品引导结束
 
//管理员ui开始
addAction('photo_browser_init',function()
{
    if ( !currentUser.isAdmin ) return;
    ......
});
//管理员ui结束
 
//相册圈人开始
addAction('photo_browser_init', function()
{
    photo_tag.init();
});
addAction('photo_load|photo_change', function(photo)
{
    photo_tag.update(photo);
});
//相册圈人结束
 
//相片app
addAction('photo_browser_init',function(photo)
{
    photo_apps.init(photo);
});
addAction('photo_load|photo_change',function(photo)
{
    photo_apps.update(photo);
});
//相片app结束
 
//相片评论开始
addAction('photo_browser_init',function(photo)
{
    photo_comment.init(photo);
});
addAction('photo_load|photo_change',function(photo)
{
    photo_comment.update(photo);
});
//相片评论结束
 
//相片浏览核心功能开始
var photo_browser = {...};
photo_browser.init();
//相片浏览核心功能结束
Copy Code 

其实跟自定义事件有点类似,但是比自定义事件更强大:

  • 自定义依赖于对象,对脚本的加载顺序会有要求,而wordpress里的addFilter和addAction可以完美解决这个缺点。
  • filter可以实现数据过滤,而自定义事件不能

经过解耦之后的产品更方便多人协作开发,代码块清晰,有效避免svn冲突,还有种种其他好处。。

仅仅是个想法,未经实践,实践ing~

WP-Syntax + ZeroClipboard增强版

上次发过一个增强版本,但是使用的复制脚本在flash升级到10版之后就失效了.

这次同样也是修改的0.9版的wp-syntax,跟上一个修改版本不同的就是

  • 删除了存在漏洞的test目录
  • 使用wp内置函数判断是否输出工具栏,使用url rewrite不会出问题
  • 代码复制使用ZeroClipboard,可以兼容所有主流浏览器

效果:

<html>
<script>
alert('ooxx~');
</script>
</html>
Copy Code | Run Code

使用方法跟上一个版本一样

<pre lang=”javascript” line=”1″ run=”1″>

把第三个参数设为1即可显示run Code的按钮.

下载点这里:wp-syntax-plus.zip

留言里有个叫whisperer 的同学问我用的啥插件,俺才想起来发一下,一大早起来发我也真不容易