osfans / trime

同文安卓輸入法平臺3.x/Android-rime/Rime Input Method Engine for Android
http://osfans.github.io/trime/
GNU General Public License v3.0
3.09k stars 372 forks source link

Expected a list, but got a scalar value #1279

Closed YuruiHong closed 7 months ago

YuruiHong commented 7 months ago

Describe the bug

To Reproduce Steps to reproduce the bug:

  1. 使用一个symbols键值对中值为scalar对象的(补充)词表,如https://github.com/wklchris/Rime-latex-symbols ,具体例如:
punctuator:
  symbols:
    '/angle': ∠
    # 改为'/angle': [∠]则正常
  1. 使用Trime,正常等待自动部署
  2. 连续弹窗报错,无法正常使用,甚至很难关闭

Expected behavior 能够识别scalar对象而不一定要求list,从而与一些之前的词表兼容,不发生部署连环报错。

Log com.osfans.trime-2024-03-04T18_40_32Z.txt

Smartphone (please complete the following information):

shitlime commented 7 months ago

https://github.com/osfans/trime/blob/e5c0d7a8cfe83676fcd8c429d2e1e3bb7ab48124/app/src/main/java/com/osfans/trime/data/schema/Schema.kt#L22-L24

此处解析要求yaml配置是 string: [ string ] 形式。

@WhiredPlanck 是否能从rime直接读取symbols?这个应该是由kaml解析导致的

WhiredPlanck commented 7 months ago

https://github.com/osfans/trime/blob/e5c0d7a8cfe83676fcd8c429d2e1e3bb7ab48124/app/src/main/java/com/osfans/trime/data/schema/Schema.kt#L22-L24

此处解析要求yaml配置是 string: [ string ] 形式。

@WhiredPlanck 是否能从rime直接读取symbols?这个应该是由kaml解析导致的

@shitlime 用 librime 读取方案文件那有点开倒车,毕竟从 C++ 将一堆 Map 和 List 转换进来还要各种 cast 显得更麻烦。其实更准确地说,这应该是 KotlinX Serialization 的“局限性”,默认提供的(基本类型)反序列化器只能整体解析而不能单点处理。最快的解决办法是套一层 try catch,这样遇到解析错误,整个就 symbols 就解析不到了,当然慢一点的话,要达到题主 @YuruiHong 想要的效果也是可以的。

不过我想说的是,我不知道之前的词表是哪些词表。按照规范,symbols 的每个条目都应该是 <key>: [ <value>, ... ] 形式,即便是官方提供的 symbols 表,单项值也是单项列表而不是字符串标量。遇到部署错误而崩溃是我没做好异常处理,但是本质上用户使用的 symbols 表没完全按照规范,也是不置可的。