高级使用手册(2)
- 进阶教程,遇到问题时可再阅读
- 阅读对象: 高级用户
文章不免有疏漏,欢迎在Issues中指出
更新日志
无
指令冲突
指令数量上去了,如果没有很好的利用正则,会很容易产生得不到期望的结果。
再以网易云举个鸡腿🍗:现在有三个指令(正则式)
- 播放% 匹配范围最大
- 播放%的歌 匹配范围最低
- 播放% 的% 匹配范围中等
会因为顺序问题,如果按1->3->2顺序匹配播放许嵩的歌
则会在3处解析成功,没有匹配到期望的结果。若对指令按匹配范围低的优先于范围高
的规则排序,如123操作排序后匹配顺序为231 ,可以解决此类问题,但操作非常麻烦,目前建议使用下面方式处理
解决指令冲突
使用一个正则
播放%
,在脚本中来完成各种情况的解析,如解析以下情景
- 播放本地音乐
- 播放晴天
- 播放许嵩的断桥残雪
- 播放周杰伦的歌
- 新建应用内指令
正则式:
播放%
参数位置:最后一个(第一个亦可)
逻辑图:
graph TB
X[播放歌手s0]
Y[播放歌曲s1]
A[拿到参数arg]
A --> C{参数 is like %的%?}
C --> |是|D[拿到匹配结果数组s]
C --> |否|E[播放歌曲arg]
D --> F{s1 == '歌'}
F -->|是|X
F -->|否|Y
以lua示例 首先获取解析后%的具体值,在代码中使用
完整示例见VOSP/网易云
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
-- 播放本地音乐
function playLocal()
-- 操作
end
-- 搜索内容
function search(s)
-- 搜索动作
end
-- 搜索歌手 播放
function playSinger(s)
search(s)
--检查列表有此歌s
--若有
--点击play
--若无点击歌手页,播放
end
-- 搜索播放歌曲s
function playSong(s)
search(s)
-- 搜索
-- 播放
end
-- 获取参数
local arg = args[1]
if (arg == '本地音乐') then
playLocal()
else
-- 匹配 %的%
local s = matchValues(arg, '%的%')
if (s) then
if (s[1] == '歌') then
playSinger(arg)
else
playSong(s[1]) -- 直接搜索歌名,省去歌手
end
else
playSong(arg)
end
end
当然,执行效果(体验)和逻辑有很大关系
使用指令存储设置
用户可在指令详情中设置选项,只需要在脚本头处添加你需要的设置选项。
指令存储样例代码
- 基本格式:
1 2 3 4 5 6
//必须命名为settings settings = { //js key:{title:"设置标题",summary:"摘要",type:'string|int|checkbox|switch|single_choice',default:..[,range:[1,10],items:[...]] } ... }
1 2 3 4 5 6
--必须命名为settings settings = { --lua key={title="设置标题",summary="摘要",t='string|int|checkbox|switch|single_choice',default=..[,range=[1,10],items={...}] } ... }
注册设置
1
2
-- 注册设置选项
config = registerSettings("lua_sample", settings, 1)
registerSettings(name, settings,version)
其中name
务必唯一,否则可能与其他指令引起冲突导致无法读取使用配置。settings
固定。version
为版本号 int,用于更新配置
会返回一个指令设置对象,可以通过它获取、设置配置
指令存储设置类型
类型 | 说明 | 值类型 含义 | 额外必须参数 |
---|---|---|---|
string | 存储文本 | string | 无 |
int | 整形数 | int | 区间range |
checkbox | switch | 均是切换 | boolean | 无 |
single_choice | 单选 | string | 元素items |
其他参数:
- defalut :默认值 单选不需指定,默认第一个
代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--lua
settings = {
number = {title = "震动强度", t = "int", default = 123, range = {1, 10}},
text = {title = "文本测试", t = "string", default = "你好"},
bool = {title = "布尔变量", summary = "我是说明", t = "checkbox", default = false},
choice = {title = "单选", summary = "选择类型", t = "single_choice", items = {"一", "二"}}
}
-- 注册设置选项
config = registerSettings("lua_sample", settings, 2)
print(config.getInt("number"))
config.set("number", 11.1) -- 强制转换int
print(config.getInt("number"))
s = config.getString("text")
speak(s)
print(s)
print(config.getBoolean("bool"))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//js
settings = {
number: { title: "震动强度", type: 'int', default: 123, range: [1, 10] },
text: { title: "文本测试", type: 'string', default: '你好' },
bool: { title: "布尔变量", summary: '我是说明', type: 'checkbox', default: false },
choice: { title: "单选", summary: '选择类型', type: 'single_choice', items: ['一', '二'] }
}
// 注册设置选项
config = registerSettings("js_sample", settings, 0)
print(config.getInt('number'))
print(config.getInt('number'))
s = config.getString('text')
speak(s)
print(s)
print(config.getBoolean('bool'))
用此代码新建指令就可以在指令详情页菜单中看到设置选项
设置配置升级
在
registerSettings
中指定增加version
值,app可以自动升级配置(保留原key的值,新增新key,删除新key中旧key)
如 版本1 配置: a:1, b:"abc", c: false
(用户设置过的结果)
版本2 配置 a , b , d:true
(新key d默认值true )
升级后的配置 a:1, b:"abc", d:true
更多操作见Api手册
需要注意的地方
- 设置的变量名必须是
settings
- 因在
type
在lua中是关键字,无法使用,可用t
代替 - lua 和js的几个区别
Lua与js之间的语法对比
区别 | lua | js |
---|---|---|
键值 | key=value |
key:value |
数组表示 | s={1,2,'a'} |
s=[1,2,'a'] |
数组 | 从1开始args[1] |
从0开始args[0] |
函数参数(多参数) | ViewFinder().desc({ '搜索', 'Search' }) |
ViewFinder().desc(['搜索', 'Search']) |