高级使用手册2

Posted by Vove on September 24, 2018

高级使用手册(2)

  • 进阶教程,遇到问题时可再阅读
  • 阅读对象: 高级用户

文章不免有疏漏,欢迎在Issues中指出

更新日志

指令冲突

指令数量上去了,如果没有很好的利用正则,会很容易产生得不到期望的结果。

再以网易云举个鸡腿🍗:现在有三个指令(正则式)

  1. 播放% 匹配范围最大
  2. 播放%的歌 匹配范围最低
  3. 播放% 的% 匹配范围中等

会因为顺序问题,如果按1->3->2顺序匹配播放许嵩的歌则会在3处解析成功,没有匹配到期望的结果。若对指令按匹配范围低的优先于范围高的规则排序,如123操作排序后匹配顺序为231 ,可以解决此类问题,但操作非常麻烦,目前建议使用下面方式处理

解决指令冲突

使用一个正则播放%,在脚本中来完成各种情况的解析,如解析以下情景

  1. 播放本地音乐
  2. 播放晴天
  3. 播放许嵩的断桥残雪
  4. 播放周杰伦的歌
  • 新建应用内指令 正则式:播放% 参数位置:最后一个(第一个亦可)

逻辑图:

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手册

需要注意的地方

  1. 设置的变量名必须是settings
  2. 因在type在lua中是关键字,无法使用,可用t代替
  3. 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'])