WP-Syntax代码编辑器插件

升级到WP3.3后,之前的那些插入代码按钮都没有用啦。。上去找插件没找到,自己改了一个syntanx-highlighter的。
感谢原作者leo108,http://leo108.com/

把下面的代码保存下来,放在一个文件夹里,打包成zip文件,然后就可以在插件处上传安装了。
或者下载这个文件:http://fatkun.googlecode.com/files/wp-syntax-editor.zip

<?php
/*
Plugin Name: WP-Syntax Code Editor
Plugin URI: http://fatkun.com/2012/01/wp-syntax-code-editor.html
Description: 在编辑框加入一个插入wp-syntax代码的按钮,修改自syntax-highlighter-with-add-button-in-editor(原作者leo108)
Version: 1.0.0
Original Author: leo108
Author URI: http://fatkun.com/
*/
function codebox_init(){
?>
<div id="codebox" class="meta-box-sortables ui-sortable" style="position: relative;"><div class="postbox">
<div class="handlediv" title="Click to toggle"></div>
<h3 class="hndle"><span>WP-Syntax</span></h3>
<div class="inside">
Language:
<select id="language">
	<option value="other">Other</option>
	<option value="bash">Bash</option>
	<option value="c">C</option>
	<option value="cpp">C++</option>
	<option value="csharp">C#</option>
	<option value="css">CSS</option>
	<option value="delphi">Delphi</option>
	<option value="diff">Diff</option>
	<option value="erl">Erlang</option>
	<option value="groovy">Groovy</option>
	<option value="html">HTML</option>
	<option value="java">Java</option>
	<option value="js">Javascript</option>
	<option value="perl">Perl</option>
	<option value="php">PHP</option>
    <option value="ps">PowerShell</option>
	<option value="python">Python</option>
	<option value="ruby">Ruby</option>
	<option value="sql">SQL</option>
	<option value="vb">VisualBasic</option>
	<option value="vb">VB.NET</option>
	<option value="xml">XML</option>
</select>
<br>
Code:<br><textarea id="code" rows="8" cols="70" style="width:97%;"></textarea><br>
<input type="button" value="INSERT" onclick="javascript:settext();">
 
<script>
function settext()
{ 
	var str='<pre escaped="true" lang="';
	var lang=document.getElementById("language").value;
	var code=document.getElementById("code").value;
	str=str+lang;
	str=str+'">';
	str=str+filter(code)+"</pre>";
	var win = window.dialogArguments ¦¦ opener ¦¦ parent ¦¦ top;
	win.send_to_editor(str);
	document.getElementById("code").value="";
}
function filter (str) {
	str = str.replace(/&/g, '&amp;');
	str = str.replace(/</g, '&lt;');
	str = str.replace(/>/g, '&gt;');
	str = str.replace(/'/g, '&#39;');
	str = str.replace(/"/g, '&quot;');
	str = str.replace(/\¦/g, '&brvbar;');
	return str;
}
</script>
</div></div></div>
<script>document.getElementById("postdivrich").appendChild(document.getElementById("codebox"));</script>
<?php
}
add_action('dbx_post_sidebar','codebox_init');
?>

Fatkun图片批量下载谷歌浏览器扩展0.5版更新了

0.5版插件地址:https://bath-image-download.googlecode.com/files/batch0_5.crx

 

主要是修复性更新。。最近都感觉很累,晚上回来就不想做什么了~很久没更新博客了。

0.5版更新

  1. 修复CHROMEV15点击图片不删除的问题
  2. 图片居中显示

在Extjs Grid扩展一个链接按钮列

问题

想要在Extjs grid每一行添加一个链接或者添加一个按钮,怎么办?

解决方法

实现方法一是用renderer,但是这个链接的方法必须调用全局的变量。
方法二就是我将要介绍的。

ActionColumn是显示一个图标按钮,而我需要一个链接按钮呢?改写ActionColumn代码即可。
代码如下,主要是修改了renderer,如果你想改成button也是可以的:

/*!
 * Ext JS Library 3.3.1
 * Copyright(c) 2006-2010 Sencha Inc.
 * licensing@sencha.com
 * http://www.sencha.com/license
 */
Ext.grid.LinkColumn = Ext.extend(Ext.grid.Column, {
    header: '&#160;',
    linkIdRe: /x-link-col-(\d+)/,
 
    constructor: function(cfg) {
        var me = this,
            items = cfg.items || (me.items = [me]),
            l = items.length,
            i,
            item;
 
        Ext.grid.LinkColumn.superclass.constructor.call(me, cfg);
 
        me.renderer = function(v, meta) {
//          Allow a configured renderer to create initial value (And set the other values in the "metadata" argument!)
            v = Ext.isFunction(cfg.renderer) ? cfg.renderer.apply(this, arguments)||'' : '';
 
            meta.css += ' x-link-col-cell';
            for (i = 0; i < l; i++) {
                item = items[i];
                v += '<a href="javascript:;" class="x-link-col-icon x-link-col-' + String(i) + ' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope||this.scope||this, arguments) : '') + '"' +
                    ((item.tooltip) ? ' ext:qtip="' + item.tooltip + '"' : '') + '>' + (item.text||'') + '</a>';
                if (i < l - 1) v += '&nbsp;&nbsp;&nbsp;&nbsp;';
            }
            return v;
        };
    },
 
    destroy: function() {
        delete this.items;
        delete this.renderer;
        return Ext.grid.LinkColumn.superclass.destroy.apply(this, arguments);
    },
 
    /**
     * @private
     * Process and refire events routed from the GridView's processEvent method.
     * Also fires any configured click handlers. By default, cancels the mousedown event to prevent selection.
     * Returns the event handler's status to allow cancelling of GridView's bubbling process.
     */
    processEvent : function(name, e, grid, rowIndex, colIndex){
        var m = e.getTarget().className.match(this.linkIdRe),
            item, fn;
        if (m && (item = this.items[parseInt(m[1], 10)])) {
            if (name == 'click') {
                (fn = item.handler || this.handler) && fn.call(item.scope||this.scope||this, grid, rowIndex, colIndex, item, e);
            } else if ((name == 'mousedown') && (item.stopSelection !== false)) {
                return false;
            }
        }
        return Ext.grid.LinkColumn.superclass.processEvent.apply(this, arguments);
    }
});
 
//register ptype
Ext.preg('linkcolumn', Ext.grid.LinkColumn);
 
// register Column xtype
Ext.grid.Column.types.linkcolumn = Ext.grid.LinkColumn;

使用方法

引用扩展的文件后,在grid columns加一个xtype: ‘linkcolumn’的列

    {
            xtype: 'linkcolumn',
            header: '操作',
            width: 100,
            sortable: true,
            items: [{
                text: '查看',
                handler: function(grid, rowIndex, colIndex) {
                    var record = grid.store.getAt(rowIndex);
                    new stat_task_his_win({
                        record: record
                    });
                }
            }]
    }

Extjs combobox下拉框模糊匹配

Tags: , ,

Ext中的combobox有属性typeAhead:true 可以实现模糊匹配,但是是从开始匹配的,如果需要自定的的匹配,则需要监听beforequery方法,实现自己的匹配查询方法:

// 判断某个值str是否存在store里,field是store的字段
var checkIfInStore = function(str, store, field, ignoreCase) {
    var count = store.getCount();
    for( var i = 0; i < count; i++) {
        var val = store.getAt(i).get(field);
        if (ignoreCase) {
            str = str.toUpperCase();
            val = val.toUpperCase();
        }
        if (str == val) {
            return true;
        }
    }
    return false;
};
 
var ComboSearchPlugin = {
    init: function(combo) {
        combo.addListener('blur', function(combo) {
            // 如果没有写完整则设置为空
            var isValid = checkIfInStore(combo.getRawValue(), combo.store, combo.displayField, false);
            if (!isValid) {
                combo.setValue('');
            }
        });
 
        combo.addListener('beforequery', function(qe) {
            var combo = qe.combo;
            var q = qe.query;
            var forceAll = qe.forceAll;
            if (forceAll === true || (q.length >= this.minChars)) {
                if (this.lastQuery !== q) {
                    this.lastQuery = q;
                    if (this.mode == 'local') {
                        this.selectedIndex = -1;
                        if (forceAll) {
                            this.store.clearFilter();
                        } else {
                            // 检索的正则
                            var regExp = new RegExp(".*" + q + ".*", "i");
                            // 执行检索
                            this.store.filterBy(function(record, id) {
                                // 得到每个record的项目名称值
                                var text = record.get(combo.displayField);
                                return regExp.test(text);
                            });
                        }
                        this.onLoad();
                    } else {
                        this.store.baseParams[this.queryParam] = q;
                        this.store.load({
                            params: this.getParams(q)
                        });
                        this.expand();
                    }
                } else {
                    this.selectedIndex = -1;
                    this.onLoad();
                }
            }
            return false;
        });
    }
};

参考文章:http://weibaojun.iteye.com/blog/1098731
原文我试了一下有问题,第一次输入时会不显示结果,主要差别在onLoad上


误删contacts.apk解决方法(不用刷机)

从完整的刷机包内,注意,版本最好是和你手机一致的。如果找不到,可以上网问别人要。

在压缩包目录下android2.3.6.zip\system\app找到Contacts.apk,Contacts.odex文件,如果你把其他文件也删了,也可以按照这个步骤。

连接手机U盘,复制到SD卡。

然后用ROOT Explor从SD卡把这两个文件复制到 手机的这个目录下/system/app/

最后一步!注意,一定要给这两个文件设置权限,在RE里按住文件,选permissions,都勾上read/write权限。

重启一下你的手机,就可以编辑联系人了。


Thrift入门篇-运行Tutorial

Tags:

本文假设你已经了解Thrift是什么了,如果还不了解,请借助强大的谷歌。

本文的开发环境是windows 7 + python2.6

Thrift官方主页:http://thrift.apache.org/

 

先来这里下载thrift-0.7.0.tar.gz 和Thrift compiler for Windows (thrift-0.7.0.exe) 。thrift-0.7.0.exe是帮你编译好的,可以在windows下运行。

解压thrift-0.7.0.tar.gz

 

学一样东西之前,当然是看Tutorial啦,不过文档还不完善啊。下面将以Python来举例子。

1.安装thrift库

先要安装thrift-0.7.0\lib\py里的库,setup.py install 注意,在windows下安装不成功,需要用VC编译,还要对代码做相应修改,很麻烦,就不说了,直接在这里下载已经编译好的版本。http://www.lfd.uci.edu/~gohlke/pythonlibs/ (这里真的是个好地方,感谢大神)

2.Thrift生成代码

Thrift能够帮你生成一部分代码,让你更关注你的业务部分,而不必关注它是怎么通信的。

在thrift-0.7.0\tutorial,就是一个官方教程了。可以先看看tutorial.thrift,这是thrift定义的语法,就是通过它来生成各种代码的了。

 

生成代码开始啦,使用之前下载的thrift-0.7.0.exe,在thrift-0.7.0\tutorial目录下执行命令

thrift-0.7.0.exe –r –gen py –gen java tutorial.thrift

搞定,在当前文件夹就产生两个文件夹了,分别是gen-java和gen-py。gen-java咱暂时用不着,生成来玩的:)如果你想生成更多其他类型的代码,–gen xxx就可以了。

3.运行

进入thrift-0.7.0\tutorial\py目录,在运行之前,先改一下PythonServer.py

不知道是我安装的thrift库有问题还是它的tutorial写错了,找到下面这行代码。

transport = TSocket.TServerSocket(9090)

把它改为

transport = TSocket.TServerSocket(port=9090)

好吧,双击运行服务端PythonServer.py。看到Starting the server就证明你成功运行服务端了!如果黑乎乎的窗口一闪而过,那看看哪一步做错了吧。用cmd运行看看。

 

接下来,再运行客户端PythonClient.py,这时就可以看到服务端有信息输出了~~成功!