一段简单的Lua脚本程序就可以构成一个最基本的输入法扩展模块。下面是Hello,World!程序示例:
functionHelloWorld()return"Hello,World!"endime.register_command("hw","HelloWorld","test")这一段代码由一个自定义的Lua函数和一行ime.register_command函数调用组成。自定义的Lua函数HelloWorld()简单地返回一个Lua字符串"Hello,World!",这表明该输入法扩展函数被调用后,显示给最终用户的候选项为"Hello,World!"。ime.register_command函数调用将自定义函数注册为谷歌拼音输入法的一个命令扩展。其中,第一个参数"hw"表示该命令扩展在i扩展模式中对应的命令是"hw",第二个参数表示该命令扩展对应的入口函数(自定义的Lua函数)是"HelloWorld",第三个参数是显示在i扩展模式命令列表内的简短说明文字。
除了显式用"ihw"这样的命令来激活扩展函数以外,扩展函数还可以由用户在使用拼音输入法时输入的特定内容或特定候选词激活。例如,在上述helloworld.lua最后添加一行:
ime.register_trigger("HelloWorld","test",{"hello"},{})这一行的作用是将函数"HelloWorld"注册为谷歌拼音输入法的一个整合扩展。第一个参数是扩展对应的入口函数"HelloWorld",第二个参数是简短说明文字,第三个参数给出希望将扩展关联到哪个或哪几个用户输入串(这里是字符串"hello"),第四个参数给出希望将扩展关联到哪个或哪几个特定的候选词(这里是空表,表示不关联)。
本指南的后续内容详细介绍了开发输入法扩展所需要的各种知识。我们也鼓励开发者直接参考已有的示例程序。例如,i扩展模式的缺省功能是由安装在以下位置的Lua脚本程序实现的:
XP:C:\DocumentsandSettings\AllUsers\ApplicationData\Google\GooglePinyin2\Extensions\base.luaVista/Windows7:C:\ProgramData\Google\GooglePinyin2\Extensions\base.lua三种不同的扩展方式谷歌拼音输入法扩展API提供了三种扩展拼音输入法的方式:命令扩展、整合扩展与转换器扩展。
下表对不同的扩展方式进行简单的对比:
在Lua脚本中,向谷歌拼音输入法注册一个命令扩展的基本语法是:
ime.register_command(command_name,lua_function_name,description,leading,help)ime是提供给Lua脚本使用的,与输入法内核交互的专用模块。register_command是向谷歌拼音输入法注册新的i扩展模式命令扩展所使用的函数。函数的各参数含义如下:
lua_function_name给出的命令入口函数可以接收一个或零个参数,例如:
functionmy_entry_function()--做某些处理并返回结果end当入口函数接收一个参数时,输入法会把用户在i扩展模式中i+两字母命令名输完后继续输入的所有内容作为一个字符串参数,传给入口函数。例如,用户先后键入ihw123,则,用户激活的命令名是hw,输入法调用该命令对应入口函数时,以字符串方式传入参数123。入口函数可以对参数进行运算处理,并返回对应的结果。例如:
在Lua脚本中,向谷歌拼音输入法注册一个整合扩展的基本语法是:
ime.register_trigger(lua_function_name,description,input_trigger_strings,candidate_trigger_strings)ime是提供给Lua脚本使用的,与输入法内核交互的专用模块。register_trigger是向谷歌拼音输入法注册新的整合扩展所使用的函数。函数的各参数含义如下:
关于通配符匹配:input_trigger_strings和candidate_trigger_strings中的字符串可以在开头或结尾包含通配符*,表示前缀匹配或后缀匹配。例如:
使用ime.register_trigger注册整合扩展时,请注意以下几点:
整合扩展的入口函数一般应接收一个参数。在激活整合扩展函数时,输入法会把激活整合扩展函数的字符串(或者是用户输入的内容,或者是某个特定的候选项)作为唯一的参数传递给入口函数。这样,注册了多个匹配字符串的整合扩展函数就可以在被调用时通过参数知道究竟是哪个字符查激活了自己。当然,在不需要时,入口函数也可以简单地忽略这个参数。
在Lua脚本中,向谷歌拼音输入法注册一个转换器扩展的基本语法是:
ime.register_converter(lua_function_name,description)ime是提供给Lua脚本使用的,与输入法内核交互的专用模块。register_converter是向谷歌拼音输入法注册新的转换器扩展所使用的函数。函数的各参数含义如下:
用户开启转换器时,输入法会依次将每个候选项作为参数调用转换器对应的Lua入口函数。也就是说,对于每个候选项,Lua入口函数都被调用一次。
转换器扩展对应的Lua入口函数应当返回且只返回一个结果,即返回对原候选项进行变换后的新候选项。如果不希望变换某个候选项,可以将输入参数的值直接返回。如果没有返回任何结果,或返回的结果数目多于一个,则输入法认为该扩展函数没有对候选项做任何变换。
一般的,扩展对应的入口函数可以返回一个或多个候选字符串。命令扩展会显示所有返回的候选项,整合扩展目前只会将第一个候选项结果插入到输入法的候选项列表中,而转换器扩展则只接受返回一个候选字符串的入口函数。
返回的参数类型可以是Lua字符串类型,也可以是Lua数字类型,还可以是Lua布尔类型。但这些返回值返回输入法内核后,都会被转换成字符串显示给最终用户,以便用户选择输入。
要返回唯一的候选字符串,只要直接使用return语句返回字符串、数字或布尔值即可,例如:
functionTestString(argument)--做某些处理return"astring"endfunctionTestNumber(argument)--做某些处理return1234.56789endfunctionTestBoolean(argument)--做某些处理returntrueendfunctionTestAnotherBoolean(argument)--做某些处理return3>2end要返回两个或更多结果,只要返回一个Lua的列表对象即可,例如:
除了单行字符串结果外,命令扩展的入口函数还可以返回一个或多个包含换行符的多行结果(其他扩展方式,如整合扩展和转换器扩展,目前不建议返回多行的结果)。换行符在Lua程序的字符串常量中用"\n"表示。例如下面的函数:
对于命令扩展,当用户刚输入完i扩展模式的命令名称,尚未输入命令参数时,入口函数将被调用,此时传给入口函数的参数为空字符串。这时,入口函数可以通过返回一个提示信息表,来提示用户有几种预定义的候选参数,并在输入法的候选窗口中,允许用户直接选择某个预定义参数。例如:
这时,用户可以试用上下键,翻页键和鼠标选择自己要输入的参数,也可以直接用键盘输入。
其他扩展方式,如整合扩展和转换器扩展,不支持提示选择参数功能,它们将忽略入口函数返回的此类提示信息。
例如,可以使用ime模块的get_last_commit()函数获得用户上一次键入的字符串,并根据字符串的内容进行相应的计算,返回特定结果。比如,用户键入了你好,然后使用i扩展模式中的某个功能,该功能看到你好后,自动返回hello。实现这一简单逻辑的代码如下:
Lua入口函数接收无法处理的参数,或者发生其他内部错误时,可以简单地不返回任何参数,或者使用Lua语言内置的error()函数向输入法报告错误信息,例如:
输入法扩展脚本程序可以使用任何源代码/文本编辑器创建。在将输入法扩展包安装到谷歌拼音输入法之前,可以使用控制台工具测试扩展程序,以确保程序功能正确。请从以下链接下载用于开发调试谷歌拼音输入法扩展脚本的控制台工具:
在命令行运行控制台工具GooglePinyinApiConsole.exe时,需要给出的命令行参数是一个或多个待测试的脚本文件路径,控制台工具会加载所有指定的输入法扩展脚本,并启动一个交互式界面,供开发者测试执行扩展模式。例如:
GooglePinyinApiConsole.exeext1.luaext2.luaext3.lua在控制台工具的交互式界面中,键入"help",可以查看帮助信息:
i-列出所有已注册的命令扩展i[COMMAND]-无参数执行某命令扩展i[COMMAND][ARGUMENT]-有参数执行某命令扩展g[TRIGGER_STRING]-尝试利用某字符串参数激活整合扩展c-列出所有已注册的转换器扩展c[FUNCTION][STRING]-测试转换器函数quit-退出控制台工具help-显示帮助信息当脚本加载或执行过程中发生错误时,控制台工具会打印显示错误信息。错误信息包括发生错误的脚本文件名,错误行号,错误内容等。
目前,谷歌拼音输入法扩展API只提供了Lua一种开发语言。Lua是一种体积小巧却功能强大的动态脚本编程语言,广泛用于网络游戏等应用的插件或扩展功能的开发。对于一个有JavaScript语言、VBScript语言或者Python语言开发经验的开发者来说,学习Lua语言并不困难。请参考以下网址获得关于Lua语言的各种信息:
Lua程序设计语言
使用Lua语言编写的输入法扩展程序保存在磁盘上时,推荐使用UTF-8编码的文本文件。文本文件可以包含也可以不包含BOM文件头。没有BOM文件头时,IME缺省认为按UTF-8编码加载。
以下凡属于Lua标准运行环境的函数,均只给出简要的功能说明。详细用法请参见Lua语言标准函数库的说明。