??xml version="1.0" encoding="utf-8" standalone="yes"?> 我们l常会有q种需求,是译一段看不太懂的外语。Google提供了翻译服务,但是如果每次都要打开Google那个译面Q倒也挺麻烦。于是我把翻译功能也做成了JustType的命令,现在在JustType中就可以通过translate命o来翻译Q何语a的文字了。想体验的话Q?a >http://justtype.cloudapp.net 整个translate命o的脚本代码很单,先用正则表达式分析了命ol构Q然后向|页写入javascript代码Q在javascript中引用google函数库,调用对应函数卛_Q?/p> import System from System.Text.RegularExpressions import * def OnCommand(command): 在JustType中,一个命令对应一个执行脚本,我们可以自己写新脚本Q同时可以允许其他h调用自己写的E序。大家互相分享自己智慧的同时Q也在利用编E技术增加自己和他h的工作效率。更多的信息请到http://justtype.cloudapp.net 获取?Q) 有。很单,wؓE序员的我们Qؓ每种固定的操作写个小E序好了。但q样一来会带来几个问题Q?/p> 1. 程序写多了Q很隄一理。而且有些带参数的E序Q例如按照一定股编号去查询h的程序)Q用v来ƈ不一定方ѝ?/p> 2. 我们可能l常使用不同的电脑,那么要同步这些小E序会非常头疹{?/p> 3. 你也写,我也写,大家写了大量重复的小E序Q很费资源?/p> Z应对q些问题Q我提出了一个叫JustType的框Ӟ我们可以?a >http://justtype.cloudapp.net 讉K它?/p> JustType的界面就是一个文本框Q一切都在这个文本框中进行。在JustType框架中,每个程序都对应一个命令,命o可带参数。写好的程序会保存在服务器Q每一个h都可以选择是否要公开自己的小E序。这样大家可以很方便地共享自q成果?/p> 让我们来逐一看看JustType拥有的功能?/p> 首先Q最基本的,你可以在JustType中输入一个网址Q一按回车就会访问该|址?/p> 当然Q仅仅是q样的话Q很傅R因为浏览器的地址栏更好用多了。但是,JustTypeq远不止q点?/p> 我们可以Z个命令设|一个别名,例如Q?/p> l过q样的设|后Q下ơ我只要打cppblog׃自动q入http://www.shnenglu.com 了?/p> q有很多时候,我们会遇C些小的计算问题。Windows那个计算器实在很不好用,让我们看看JustTypeQ?/p> q个calc命o会将后面的表辑ּ求值ƈ昄出来。实际上Q这里这个表辑ּ是Python的表辑ּQJustType中所有的程序都q行在IronPython?q且可以使用.net frameworkcd中的大多数功能?/p> 当然Q除了简单的表达式以外,我们q可以执行更复杂的脚本: 输入q个命o之后Q界面就会变成下面的样子Q?/p> MultiLineTextMode是一个预定义函数Q功能是主界面上的文本框变成多行模式,q样我们可以输入更复杂的脚本了。下面我们试试用一?net framework中的功能Q?/p> 输出l果如下Q?/p> SetTextBoxText也是一个预定义函数Q可以改变主界面中文本框内的文本。更多的预定义函数描q可以在http://justtype.cloudapp.net/Help.aspx 中看到?/p> 除了临时执行脚本以外Q我们也可以脚本写成小E序保存h。输入newcommand命oQ就会进入创建命令的面。我们将q个程序命名ؓtranslateQ然后输入以下代码: import System def OnCommand(command): E序依然是用IronPython写,其实Python语法很简单?a >http://www.python.org 感兴的用户可以ȝ看。这个OnCommand函数是用来接收消息的。当JustType收到命o后,会找到这个命令对应的脚本Qƈ参Cl脚本的OnCommand函数来执行。我们看刎ͼq里E序调用了GoToURL函数Q{向了有道词典的页面。在创徏了这个程序后Q我们就可以在JustType的文本框中输入下面的命oQ?/p> 一按回车,׃转向译l果Q?/p> cM圎ͼ我们可以写出很多很多方便实用的小E序。在我们创徏E序Ӟ我们可以选择是否要公开。如果公开的话Q别的用户就可以通过“你的用户名.E序名”来调用你的E序。例如我的用户名是ckQ那么其他用户就可以输入ck.translate来调用我的程序,当然他喜Ƣ的话也可以用setalias来设|一个方便的别名。如果所有公开的程序中Q只有我q个E序叫做translateQ那么其他用户不打ck.translate而直接打translate也可以成功调用?/p> 另外QJustType提供一U简单的数据存储。每一个程序在一个用L账户中会有一个独立的存储I间Q可以存?000行数据。例如我利用q个Ҏ开发了一个叫做note的小E序Q可以时记录一些小W记Q?/p> 那么之后我就可以看到我的W记Q?/p> 所有的E序和数据,都存攑֜服务器端Q用户不用担心不同机器的问题。无Z走到哪里Q都可以像在一台机器上一栯问所有服务和数据?/p> 新服务刚刚搭建好Q欢q大家试用和提供意见喔。网址?a >http://justtype.cloudapp.net
import System.Text
import System.Text.RegularExpressions
import System.Web
sourceLang = "en"
targetLang = "zh"
text = command
chkAdvancedUsage = Regex("(?<text>(.|\n)+?)\\s+from (?<from>[a-zA-Z]+) to (?<to>[a-zA-Z]+)")
m = chkAdvancedUsage.Match(command)
if m.Success:
sourceLang = m.Groups["from"].Value
targetLang = m.Groups["to"].Value
text = m.Groups["text"].Value
render = "<div id=\"divTranslation\" style=\"background-color:#f0f8ff; border:dotted 1px gray; padding:5px; width:500px; \"></div>\n"
render += "<script type=\"text/javascript\" src=\"http://www.google.com/jsapi\"></script>\n"
render += "<script type=\"text/javascript\">\n"
render += "google.load(\"language\", \"1\");\n"
render += "function initializeTranslation() { google.language.translate(\"" + System.Web.HttpUtility.HtmlEncode(text.Replace("\n", " ").Replace("\r", "")) + "\",\"" + sourceLang + "\", \"" + targetLang + "\", function(result) {\n"
render += "if (!result.error) { document.getElementById(\"divTranslation\").innerHTML = result.translation; } else { document.getElementById(\"divTranslation\").innerHTML = \"error!\" }\n"
render += "}); }"
render += "google.setOnLoadCallback(initializeTranslation);"
render += "</script>"
SetTipText(render)
return True
]]>
import System.Web
GoToURL("http://dict.youdao.com/search?q=" + System.Web.HttpUtility.UrlEncode(command))
return True
]]>
BoxSharp 最新进展!
输入盘地址时的自动提示Q另外还有按TAB键即可切换目录,行ؓ与cmd命o行里面输入地址栏时cM
Note功能Q可以随时记下一下小事情。命令ؓ/note something。输?note会打开当前所有notes列表?/p>
工具栏自定义按钮功能Q输?toolbutton add "button name" command卛_自定义一个按钮,按下即会执行指定的command命oQ效果与在文本框中输入command然后按回车一栗?/p>
之前一位朋友提到的/define功能Q我觉得如果需要参敎ͼ应该写成新插gQ而不是定义成另外一个命令;如果不需要参敎ͼ那就可以通过现在q个toolbutton实现。所以暂时不做了?/p>
全局热键在WPF下面貌似很有问题。。。至我q没扑ֈ解决ҎQ这几天太忙了,有空我还要l想办法?/p>
最新版q里下蝲 http://code.google.com/p/boxsharp/downloads/list
功能可以看下面几个图Q?/p>
总而言之,BoxSharp提供一U可扩展的方式让你在一个TextBox中干M事情?/p>
此项目已l正式作为开源项目放在Google Code上啦Q大家可以在q里讉K目主页Q?a >http://boxsharp.googlecode.com/
那啥Subversion搞了我一个小时。。。真是感叹现在的高科技啊?/p>
在这里可以下载最新的可执行文Ӟ只能q行在Win32q_上,需?net framework 3.5支持Q?/p>
http://code.google.com/p/boxsharp/downloads/list
在这里可以查看最新的文档Q?/p>
http://code.google.com/p/boxsharp/w/list
在这里可以查看源代码Q(要有Subversion才能下蝲C码)
http://code.google.com/p/boxsharp/source/checkout
q一ơ我做了一个可以自定RSS源的新闻滚动播放器插Ӟ滚动新闻放在TextBox的旁边,鼠标放过L新闻介,点击可以打开览器浏览新闅R这样在工作之余Q抬起头p看看当时最新的新闻Q不亦乐乎!
除了新闻播放器,q两天主要做的就是一个智能提C框。就像Firefox那个“棒极了的地址栏”一P我希望这个框框能的提C我一些操作和命o。大多数时候,我们想通过一些熟悉的名字来启动一些程序,比如输入QQQ就l我启动QQQ输入IEQ就l我打开IE。有时候我们也希望通过一些简U来讉K一些网站,比如输入baiduQ就l我打开癑ֺQ输入googleq我打开googleQ而不需要输入完整的http://www.baidu.com 。当Ӟ如果让我们手动添加所有的命oQ比如我亲自告诉E序Q“如果我输入baiduq我打开http://www.baidu.com”,q当然很LQ但是我很懒Q我不想每次都亲自添加这U命令,我需要他自动帮我扑և来?/p>
W一个我能想到的地方Q就是开始菜单的“程序”目录里了。遍历里面所有的快捷方式Q把名字分析一下,加入待选列表,搞定。不q这个名字分析的q程比较ȝQ因为比如QQ他的快捷方式默认是叫“腾讯QQ2009”,但是我只惌入QQ打开它。另外比如Microsoft Visual Studio 2008Q我只想输入MVSq个U来讉K它。这个就是一些特征的提取了,也不会太难?/p>
除了E序目录QProgram Files也是一个好地方Q里面的exe一般都是有用的E序Q提取出来,一hq来Q它p提示我更多东西了?/p>
W二个主要地方,是收藏夹和览器历史了。遍历里面所有的目Q分析一下,也加入待选列表。同h分析q程比较重要Q决定了能否得到正确的提C?/p>
选到需要的目上,按回车就行了。这里我准备对用次数做排名Q用得多的目会Q到最上面去,也就是直接按回R׃启动的位|?/p>
OKQ现在这个框框可以干的所有事情,ȝ一下:
1.可以输入/exitQ退出。(别扔砖头。。。)
2.可以输入/baiduQ?google{搜索引擎对一个词q行搜烦。搜索引擎可以通过配置文g指定?/p>
3.可以输入一个完整的路径名,或者一个完整的URLQ打开讉K?/p>
4.可以输入C#代码Q立x行。(可以q行表达式运等操作Q可以保存代码段Q以后通过一个名字来直接执行它?/p>
5.可以随时看到最新的新闻滚动播放Q点d可在览器中打开。RSS新闻来源可以自定?/p>
6.自动索引常用E序和网,可以通过输入它们的简Uͼ或Q何你惛_到的代表词语来运行它们?/p>
下一步准备做的,桌面搜烦?/p>
实习的日子实在是挺忙QCNScriptq停留在语法分析的阶D,一直没旉L开那个大工E(其实是有旉的,可惜零碎的时间都被我拿来写这文章要讲的q些东西了Q?/p>
我们在浏览网|Q或怼H然x开某个E序Q比如计器Q算点东西;又可能想打开PhotoshopQ处理一下网上的某个图片;又可能想打开C本,摘抄一些文字。这时我们不得不回到桌面Q或者打开那个大的开始菜单,在程序里面去找我们想要的东西?/p>
有的时候,我们q会重复做一些机械的动作Q比如读一个文Ӟ查是否有变动Q比如检查某个文件夹Q看是否有新文g。当Ӟ你可以写一个程序来完成q个操作Q但是有时候这U操作你觉得最多就重复个两三次Q你不会愿意L开Visual Studio创徏一个工E?/p>
归结本质Q我们就是想要一个随叫随到的Q可以有一定能力帮我们做事情的东西。但是如果这个东西太大,会挡住我们正在浏览的|页或者正在处理的文档Q那׃好了。所以我想C一个Topmost的TextBoxQ放在屏q的端Q也是一般窗口的标题栏那里,q样子不会挡住你要做的事情,而且在需要的时?只要鼠标一U过d可以用了?/p>
OKQ有了这样一个TextBoxQ“随叫随到”已l完成了。但是我们需要这个TextBox有一定能力,比如我想q行一个程序,它能帮我q行Q我x索一个词语,他能帮我搜烦Q我x开一个URLQ他能帮我打开Q我惌一个表辑ּQ他能帮我计。但是h的需求是无限的,我们随时会有新的需要,他不可能拥有所有的功能Q那么如何让他有能力做到M事情呢?我们需要一U很强悍的可扩展性。玩q魔兽世界的朋友们一定知道,兽世界提供一个插件机Ӟ玩家可以为游戏写插gQ来丰富游戏的功能,现在已经有千千万万的兽世界插g在各大网站上提供下蝲了,正是因ؓ如此Q魔兽世界才拥有着q么强的可扩展性。所以,我们q个TextBox也要用插件机制来驱动。在C#的Microsoft.CSharp名字I间中有一个C#的编译器Q可以将C#代码~译成托组Ӟ直接生成在内存中Q以反射的方式来q行Q这个机制ؓ我们快速实C个插件系l提供了可能。因此我选用?net framework 3.5Q用Windows Presentation Foundation来做界面Q用C#来当我的脚本语言?/p>
俗话_一不做Q二不休Q既然提供了插gQ那我主E序除了q行插g以外׃么都不做了。运行了插g之后Q将界面所有控件的控制权都交给插gQ插件爱q啥干啥去。主E序是一个WindowQWindow上是一个StackPanelQPanel里面是一个TextBoxQ仅此而已。当Ӟ插g可以向StackPanel里面加东西,以丰富这个条条的外观内容?/p>
可执行程序的环境如下所C:QBoxSharp是这个程序的名字Q?/p>
其中BoxSharpCoreQBoxSharpRunPathQBoxSharpScriptingQBoxSharpSearch是我刚写好的几个插g?/p>
BoxSharpCore插g提供了最基本?exit命oQ用于退出程序。此插gq控制了一些外观方面的l节Q包括自动记住TextBox上次退出时的位|,大小Q用于下ơ启动时恢复外观。当输入在文本框内的命o是一个正命令时Q会出现功能提示?/p>
BoxSharpRunPath插g提供了打开文g夹,打开|址Q运行命令的功能?/p>
BoxSharpScripting插g提供了直接运行C#E序的功能。这个功能可以顺便当作表辑ּ计算器用Q有时候有些运(其是带N个括L复杂表达式)想立d出结果的Q就不用打开计算器了。Print函数是用于将参数值直接写在TextBox里面的?/p>
也可以直接用/script命o打开一个窗口进行复杂的~程?/p>
BoxSharpSearch插g是提供Web搜烦功能的,我们可以通过配置文g来配|搜索引擎,插g启动时会自动配|项的?/p>
我有旉的话Q完全可以写更多的插Ӟ比如自动电子邮Ӟ收发邮gQ比如滚动播放新闻,比如自动搜新歌下载试听,比如日历Q日E安排,U会提示Q闹钟,q些都可以作为插件写到里面去。而且Q如果,我是说如果,如果很多用户在用q个TextBox的话Q他们可以共享他们自己写的插Ӟ彼此的BoxSharp功能丰富?/p>
好吧Q说到底了,.net framework 3.5能办到的Q这个TextBoxp办到Q但是你估计不会Z计算一个表辑ּ而打开Visual Studio建工E的。这是TextBox的魅力所在了QHOHO?/p>
例如刚才ȝint a=100Q?br>我们一开始是在编号ؓ0的状态,现在输入iQ因为i属于a-zA-Z的范_所以通过最后一q图我们看到Q我们将q向~号?4的状态。再输入nQ因为n属于a-zA-Z0-9_的范_所以我们l走在编?4的状态,t也如此,但是输入I格Ӟ我们发现44L态没有接受空格字W的出口Q也是无法l箋CMQ而且44L态是一个可接受状态,所以我们接受已l输入了?#8220;int”?br>在这里我们的44L态,接受意义是一个nameQ可以是IdentifierQ也可以是KeywordQ也可以是TypeQ当我们取得nameQ?#8220;int”Ӟ我们再判断发现这是一个TypeQ所以我们得出TokenQTypeQ?#8220;int”。然后状态回?Pl箋输入刚才的空根{以此类推?br>
所以我们只要按q个状态图去遍历字W串Q我们就会不断的在各个状态中辗{反复Qƈ不断的得出Tokens。这是我们词法分析的基本原理?br>下一我会写个DFA的代码和具体使用Ҏ?/p>
Functionality:
Procedure Oriented, No Custom Data Structures, No Closures, Strong Typed, Array Supported.
Keywords:
int,double,char,string,bool,void,if,else,for,do,while,return
Statements:
Single Expression:
expression;
Chunk:
{
Statement1
Statement2
}
Array Declaration:
type name[size];
Variable Declaration:
type name [= expression];
Function definition:
type FunctionName(type paramName1, type paramName2)
Chunk
IF-ELSE:
if(expression)
Statement1
else
Statement2
FOR-LOOP:
for(statement1 expression2;expression3)
Statement
WHILE-LOOP:
while(expression)
Statement
DO-WHILE-LOOP:
do
Statement
while(expression);
Expressions:
Values:
true
false
number
string
char
Variable Name
Array Name[index]
Assign:
name = expression
Function Call:
name(expression1,expression2)
Compares:
expression1 == expression2
expression1 != expression2
expression1 < expression2
expression1 > expression2
expression1 <= expression2
expression1 >= expression2
Boolean Operations:
!expression
expression1 && expression2
expression1 || expression2
Calculating:
expression++
expression?/font>
++expression
--expression
expression1 + expression2
expression1 – expression2
expression1 * expression2
expression1 / expression2
expression1 % expression2
expression1 ^ expression2
(expression)
Lexical Tokens:
Spaces:
Space: (space_bar+)|(\n+) (\r+)|(\t+)
TypeNames:
Type: (int)|(double)|(char)|(string)|(bool)|(void)
Keywords:
Keyword_if: if
Keyword_else: else
Keyword_for: for
Keyword_do: do
Keyword_while: while
Keyword_return: return
Brackets:
BigLeftBracket: {
BigRightBracket: }
MidLeftBracket: [
MidRightBracket: ]
SmallLeftBracket: \(
SmallRightBracket: \)
Identifier:
Identifier: (_+[a-zA-Z0-9_]+)|([a-zA-Z][a-zA-Z0-9_]*)
Number Value:
Integer: 0|[1-9][0-9]*
Double: (0|[1-9][0-9]*)\.[0-9]+
Bool Value:
BoolValue: true|false
Char:
CharValue: ‘(\\[^\r\n\t])|([^’\r\n\t])’
String:
StringValue: “((\\”)|[^\r\n])*”
Operators:
Operator: =|\+|-|\*|/|%|^|(++)|(--)|(&&)|(\|\|)|(!)|<|>|(<=)|(>=)|(==)|(!=)
Seprators:
Seprator: ;
Variable Declaration:
type name [= expression];
才能建立赯法树来?br>Lexical Tokens中是每种Token对应的正则表辑ּ?/p>