2008年04月25日

New Features and Changes:

  1. Add php.acp thanks for 魏振 <etggy@163.com>
  2. Replace old snippet with new snippet, more details please see <Snippet Howto>
  3. Binding F5 to editor but not MainFrame, and add F5(Refresh) support in Directory Browser.
  4. Improve Python class browser, threading update, change some icons
  5. Add indent cursor move functionality see <Indent Moving Howto>
  6. Improve threading document modification process, so you can get better efficiency
  7. Introduce meide(http://code.google.com/p/meide) project to simplify the interface creation
  8. Add FNB.FNB_DROPDOWN_TABS_LIST style to EditorCtrl
  9. Change auto file check in Editor on_set_focus event handler
  10. Change DDE to asyncore and asynchat framework
  11. Change preference dialog from notebook to treebook
  12. Add icon set theme support
  13. Add strip line ending when saving functionality option in Preferences
  14. Strip leading space when doing "Run in Shell"
  15. Add auto detect python interpreter in windows platform
  16. Improve ReST document render, and fix the setfocus lost bug when auto modified the html output, thanks a lot to ygao
  17. Change setmenutext to use fix width to set the menu text, replace with ‘t’
  18. Chanage notebook left double click to right double click(enlarge notebook size)
  19. Add search text count in Find & Replace pane
  20. Add line ending mixture check when saving file feature
  21. Improve preference dialog input assistant checkbox process. When you check the first checkbox(Enable input assistant) it’ll automatically toggle other 5 checkboxes.
  22. Change new toolbutton to dropdown toolbutton, and it can remember the last new file type(select new type menu first), then when you select new menu, it’ll create a new file with the last new file type
  23. Improve command search and pairprog plugin caret display process
  24. Add auto new version of UliPad check
  25. Add slice language syntax support
  26. Add auto pop up project setting dialog when adding directory to directoy browser window
  27. Add Open Explorer Window Here menu to editoctrl tab context menu
  28. Add open snippet tool button, change open dirbrowser and open snippet toolbutton to check toolbutton
  29. Change explorer.exe %s as explorer.exe /e, %s in windows platform
  30. Add copy filename to clipboard menu on document area tab context menu
  31. Add wrap text feature, via [Edit]->[Format]->[Wrap Text...]

New Plugins:

  1. canvas_test_plugin, you can directly test DC api
  2. web2py_plugin, supply web2py shell

Bug fix:

  1. Fix webopen twice open bug
  2. Fix editor shortcuts key caption error
  3. Fix if set DROP_DOWN_TABS_LIST style, right arrow will disappear bug
  4. Fix utf-16 convertion bug
  5. Fix mako tag auto complete bug #issue 14
  6. Fix if lines are folded, when goto hiding lines will no effect bug
  7. Fix DDE bug, thanks to LP <liupengf12@gmail.com>
  8. Fix webopen bug, can’t correctly deal with ‘mailto:’
  9. Fix smart tabs bug
  10. Fix copy and paste lineending is not correct bug
  11. Fix tab invisible bug after changing size or changing the page title
  12. Fix template line-ending not match the default line-ending setting
  13. Fix password widget is not Password type widget bug
  14. Fix script filename cannot be unicode(chinese) bug
  15. Fix syntax check exception process bug
  16. Fix ruler bug

 UliPad has ported to code.google.com, so you can visit the new project site at:
http://code.google.com/p/ulipad, and also visit the new svn address. Recommends
using source version.

source version download: http://ulipad.googlecode.com/files/ulipad.3.9.zip
window exe version: http://ulipad.googlecode.com/files/ulipad.3.9.exe

maillist: http://groups.google.com/group/ulipad
ulipad snippets site: http://ulipad.appspot.com (hosted by GAE)

Hope you enjoy it.

2008年04月22日

1. 发送邮件的问题

sender不能为空,必须是创建应用的管理员的邮箱。

2. 如何在有代理的环境下使用appcfg.py来更新项目

先在命令行上设置代理,如:

set http_proxy=username:password@proxy_host:proxy_port

上面是带用户和口令的,如果没有,则形式为:

set http_proxy=proxy_host:proxy_port

3. 使用数据库时,不支持!=操作,没有like, match之类的

4. 打印调试信息,可以使用:

import logging
logging.error(xxx)

sys.stderr.write(str(xxx))
2008年04月21日

可以访问 http://ulipad.appspot.com
可以为ulipad写一些使用技巧之类的,当然也可以写其它的。这是我使用GAE(Google Application Engine)开发的一个小网站。

要求:

1. 必须是gmail用户,且要登录
2. 内容是使用rst格式,支持语法高亮,具体格式见: http://www.djangosnippets.org/snippets/42/
3. 写完后别人不会马上看到,需要由管理员(我)的审核,但自已还可以看到和修改

功能:

1. 一般用户可以添加,可以修改自已写的
2. 管理员可以添加,修改其它用户的,删除,修改发布,允许评论选项

Todo:

1. 完成分类,标签(虽然已经可以输入,但是没有显示,需要增加)

有兴趣可以将你平台积累的ulipad相关的技术,心得放上去让大家分享。

2008年04月18日

今天开发了一个wraptext模块,它可以对文本进行折行处理。详情:

 说明
    本程序用来进行文本的折行处理,支持中文和英文,可以处理Unicode和普通字符串

 参数说明
    text       待处理的文本,可以是unicode或str
    width      处理宽度
    encoding   字符串编码,只当text不是unicode时有效
    cr         换行符,如果为None则自动从文本中判断,自动设定为找到的第一个换
               行符,如果找不到缺省为’\n’,如果不为None,则使用设定的换行符
    indent     非首行缩近量
    firstindent首行缩近量
    skipchar   行首忽略字符,如果存在则在处理前会清除每前开始前有skipchar的文本

 功能描述
  1.支持unicode和非unicode文本,如果为非unicode文本,则会使用encoding指定的编
    码对文本转换为unicode,在返回时,会根据原文本是unicode还是非unicode进行转
    换并输出。
  2.支持段落概念。两个以上连续的回车为段落分隔,其中如果一行只包括空白(空格或
    制表符的行)将视为空行。最终的结果段落间只保存一个空行。如果只存在单个换行
    则相邻的行视为同一段落。支持’\n’, ‘\r\n’, ‘\r’三种形式的换行符。可以自动
    使用文本中的回车符或指定转换后的回车符。
  3.自动处理亚洲文字和半角字符,自动处理空白,多个空白(包括制表符)将自动合并
    成一个。亚洲文字和英文之间以空格分隔。对于亚洲文字中间的空白自动删除。
  4.支持缩近设置,首行缩近和非首行缩近。缩近量可以是数值,则为空格*数值,可以
    是字符串。如果firstindent没有设置将缺省为indent的值。
  5.可以设置每行行首要忽略的字符,如注释行的’#',在处理时将先删除匹配的行首字
    符。

 示例
  msg = ”’中文 中文hello, world”’
  wraptext(msg, 10)

现在代码放在 http://code.google.com/p/pyzh 中。原来它已经有一个模块,不过不满足我的要求,于是自已重新写了一个。

2008年04月11日

这里把我在google app engine中如何实现xml-rpc的处理描述一下:

import cgi
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp

def version():
    return ‘3.9′

class XMLRPC(webapp.RequestHandler):
    def post(self):
        import xmlrpclib
        p, m = xmlrpclib.loads(self.request.body)
        try:
            f = globals().get(m)
            if f and callable(f):
                result = f(*p)
                xml = xmlrpclib.dumps((result,), methodresponse=1)
            else:
                xml = xmlrpclib.dumps(xmlrpclib.Fault(-32400, ’system error: Cannot find or call %s’ % m), methodresponse=1)
        except Exception, e:
            xml = xmlrpclib.dumps(xmlrpclib.Fault(-32400, ’system error: %s’ % e), methodresponse=1)
        self.response.headers['Content-Type'] = ‘text/xml; charset=utf-8′
        self.response.out.write(xml)

def main():
    application = webapp.WSGIApplication(
                                       [('/XMLRPC', XMLRPC)],
                                       debug=True)
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
    main()

类XMLRPC对应/XMLRPC这个url。我的app的地址是: http://ulipad.appspot.com 因此你可以使用 http://ulipad.appspot.com/XMLRPC 来访问XMLRPC类。在XMLRPC类中定义了post方法,xml-rpc要求所有的请求都使用POST方法来传输。这个函数的处理还是挺简单的,首先要得到上传的xml报文,通过self.request.body_file.read()来得到。然后使用xmlrpclib的loads()方法得到对应的参数和方法名。然后在当前的作用域globals()中查找是否存在指定的函数(这块你可以按照需要自行修改),找到后进行执行。然后将结果再以xmlrpc的格式返回,通过使用xmlrpclib.dumps()来转换结果。

app.yaml中配置为:

- url: /XMLRPC
  script: handler_xmlrpc.py

这里文件名为handler_xmlrpc.py.

update: 2008/04/18

修改 self.request.body_file.read() 为 self.request.body

前几天Google APP Engin Preview版本发布了,我也注册了一个,不过当天没有收到确认信,以为没戏了。结果今天收到了,还不错。那么做些什么呢?我想做一个XML-RPC服务用于ulipad中,可以让ulipad通过xml-rpc来得到最新版本信息,同时还考虑是否可以做一个插件,把ulipad用户信息传到这个网站上,这样可以了解有多少人在使用ulipad。

为什么使用XML-RPC呢?因为使用方便,这样我可以将这个网站认为是一个服务器,开发方便。基本功能已经做好,你可以访问: http://ulipad.appspot.com/

上面已经提供了一个测试程序可以得到最新的ulipad版本。回头再开发新的插件,做些有意思的东西。

Dick在邮件列表中说当打开Shell窗口后,输入焦点如果移到其它的地方,光标还存在,这样造成一种错觉。仔细检查了代码,发现是由于我对KILL_FOCUS进行了处理,并且没有使用event.Skip(),所以事件被我屏蔽掉了。但这样为什么会引起光标不消失呢?我想是由于wxPython可能在KILL_FOCUS的缺省处理中会隐藏光标。这让我突然想起它还可以有其它的用处,特别是在协同编程插件中。当进入协同编程状态时,某一用户移动光标时,如果你的输入焦点在其它的窗口中,这样你会看不到变化,但截获KILL_FOCUS事件会使光标不消失,这一效果已经在ulipad中进行了改进。原来则有可能消失,因此让我感觉实用性有问题,这下多少让我感觉还可以用了。