WordPress升级到3.1发现用来排除某些目录feed输出的代码不好用了,bug?,有空再整。。
function blue_feed_cat_exclude($query) { if ($query->is_feed) { $query->set('cat','-48,-179'); } return $query; } add_filter('pre_get_posts','blue_feed_cat_exclude');
———–
vim->email->wordpress
WordPress升级到3.1发现用来排除某些目录feed输出的代码不好用了,bug?,有空再整。。
function blue_feed_cat_exclude($query) { if ($query->is_feed) { $query->set('cat','-48,-179'); } return $query; } add_filter('pre_get_posts','blue_feed_cat_exclude');
———–
vim->email->wordpress
最终我还是给blogo2增加了一个不实用的通过邮件编辑日志的功能,需要加一个#edit:BLOGID的标记,但是因为邮件客户端跟本不知道已发blog的id,所以功能略显鸡肋。这绝对是我专用的功能,在bin目录又加了一个小命令,只需在vim里输入:r!wpblog bluehua.org 便可以把最新的blog拽回来,包括blogid
wpblog的内容
#!/usr/bin/env python import sys import xmlrpclib import getpass import os ''' A simple tool for dump blog powered by wordpress For example: in vim, dump the last webblog into current buffer :r!wpblog myblog.domain ''' #make sure the stderr is the control terminal if os.name == 'posix': sys.stderr = open('/dev/tty', 'a') if len(sys.argv) < 2: print >> sys.stderr,''' Usage: wpblog myblog.domain [blogid] ''' exit(1) rpc = 'http://%s/xmlrpc.php' % sys.argv[1] print >> sys.stderr, '\r\nUsername:' user = raw_input() passwd = getpass.getpass('Password:') api = xmlrpclib.ServerProxy(rpc) try: if len(sys.argv) > 2: blog = api.metaWeblog.getPost(sys.argv[2], user, passwd) else: blogs = api.metaWeblog.getRecentPosts('', user, passwd, 1) if not len(blogs): print >> sys.stderr, 'no blog returned~' exit(1) blog = blogs[0] except xmlrpclib.Fault, ex: print >> sys.stderr, ex.faultString.encode('utf-8') exit(1) print '#cats:%s' % u','.join(blog['categories']).encode('utf-8') print '#tags:%s' % blog['mt_keywords'].encode('utf-8') print '#edit:%s' % str(blog['postid']) print blog['description'].encode('utf-8')
———–
post by gmail~
这阵子一直用email更新这个blog,很爽。
优点:
1. 客户端变得很多,比如我现在吃饭的空用e71码这篇blog,blog变得可以随时随地。
2. 更稳定得编辑器,worpress自带得编辑器给我特不稳定得感觉,而且添加附件不方便。
3. 不用再备份blog,全在已发邮件里了,包括附件。
从我的e71发送
superscreenshot0029.jpg
———–
post by gmail~
上次提到的一个想法的实现版本,正在应用到偶开发的项目当中~
比wordpress的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>
2010.3.6 更新
由于最近的学习充电计划,这个东西暂时搁置了,现在已经可以自动保存了~
———————————
linux平台上一直没有这样一个所见即所得的blog离线编辑器,昨天试着用pyqt4写了一个小脚本,发现原来python做客户端软件是如此容易.然后下定决心要利用n个周末的时间自己写一个.
开始打算用纯qt的ui控件实现,但是感觉没有wordpress的编辑器这么亲切,于是想到一个界面亲切,实现也方便的方案: ui部分直接用web,框在一个pyqt的webkit组件里,逻辑部分用python的cgihttpserver在本地开一个cgi.
这个东西搞到今天雏形已经有了,可以实现跟wordress完全相同的书写体验.
顺带发那个pyqt的练手之作 : emlreader.py 一个可以查看eml附件的脚本