-
Notifications
You must be signed in to change notification settings - Fork 147
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
設計配方定義文件的格式 #4
Comments
听起来不错, 但是似乎破坏了现在的方案机制的简洁性,方案本身和包管理器耦合起来了。 |
我還考慮過一個加強版的無配方文件的簡易實現: 合併 或者不用文本操作實現。升級一下 Node.js 也可以用來執行文本編輯操作;調 YAML 組件需要研究除了 exe 以外得安裝多大的 node_modules。 |
@nameoverflow 集中管理有他的好處,查詢下載都方便;也有潛在問題,就是不夠自由。一些用家可能只想整理歸納自用的方案和配置。 我認爲沒有中心,才能實現用戶僅通過維護一份配方列表實現終極配置。 |
用bash吧,畢竟更靈活,要能自動改名,例如提供一個xxx.schema.custom.yaml,然後根據提供的參數來確定xxx |
草稿:(大體實現 https://github.com/rime-aca/OpenCC_Emoji ,加入了演示一些其他功能的代碼) # encoding: utf-8
---
recipe:
Rx: emoji-suggestion
args:
- schema=luna_pinyin
- opt_extra_argument
description: >-
Show emoji suggestion with OpenCC
# excludes:
# includes:
install_files: >-
*.schema.yaml
*.dict.yaml
*.txt
opencc/*.*
patch_files:
- recipe.yaml: ${schema:-luna_pinyin}.custom.yaml
- default.custom.yaml
patch:
switches/+:
- name: emoji_suggestion
reset: 1
states: [ "🈚️️\uFE0E", "🈶️️\uFE0F" ]
engine/filters/+:
- simplifier@emoji_suggestion
emoji_suggestion:
opencc_config: emoji.json
option_name: emoji_suggestion
tips: all
...
--- | # this is how to apply patch to multiple files
recipe:
patch_files:
- recipe.yaml: luna_pinyin.custom.yaml
- recipe.yaml: luna_pinyin_fluency.custom.yaml
- recipe.yaml: luna_quanpin.custom.yaml
... ① 一些解釋: 不想讓配方作者具有執行任意腳本的能力(儘管用 bash 實現解析仍會有漏洞可鑽)。 基於 bash 的實現,不會解析 YAML,肯定是當文本文件做字符串解析的。因此規定
② 再談 recipe 的用法 安裝口令語法爲 bash rime-install emoji-suggestion#schema=luna_pinyin 其中 這裏省略了配方名 bash rime-install emoji-suggestion:recipe#schema=luna_pinyin ③ 如果一個包提供多個配方文件,文件名反映配方的用途,會有(配方文件、口令):
④ 上文的配方文件樣例是爲了明確地定義參數及補靪的打法。如果不寫配方文件,還可以怎樣實現呢? 對於不需要參數化的補靪,可以直接根據文件名 ⑤ 還有一種實現比較快,但設計比較粗糙的實現: # encoding: utf-8
# Show emoji suggestion with OpenCC
# Rx: emoji-suggestion
#$ target=${schema:-luna_pinyin}.custom.yaml
patch:
# ... 這就是待合併的補靪文件,除了以上討論的格式要求之外,特殊註釋行 |
就 opencc emoji 這個例子來看,很可能需要一個專門打補靪用的配方,因爲需要給每個輸入方案都打上補靪,於是要分多次調用,每次給不同的 所用配方大概是這樣的(
|
有幾個問題:
|
|
先找人用 bash 腳本實現一個簡單的用用看。 |
稍稍細化 patch_files:
文件名甲:
- 補靪一
- 補靪二
文件名乙:
- 補靪三 補靪行及其下縮進行原樣(也考慮做字符串模板展開)追加到目標文件根節點的 示例: # emoji_suggestion.recipe.yaml
# encoding: utf-8
---
recipe:
Rx: emoji_suggestion
args:
- schema=luna_pinyin
description: >-
Customize input schema to show emoji suggestion with OpenCC
patch_files:
${schema:-luna_pinyin}.custom.yaml:
- patch/+:
__include: emoji_suggestion.recipe:/patch
patch:
switches/@next:
name: emoji_suggestion
reset: 1
states: [ "🈚️️\uFE0E", "🈶️️\uFE0F" ]
'engine/filters/@before 0':
simplifier@emoji_suggestion
emoji_suggestion:
opencc_config: emoji.json
option_name: emoji_suggestion
tips: all 配置管理器修改後的文件: # encoding: utf-8
__patch:
# Rx opencc-emoji:emoji_suggestion {
- patch/+:
__include: emoji_suggestion.recipe:/patch
# } 更多示例: patch_files:
# This is possible but as always we recommend
# putting user customization in luna_pinyin.custom.yaml, default.custom.yaml
${schema:-luna_pinyin}.schema.yaml:
- ${schema:-luna_pinyin}.custom:/patch
- emoji_suggestion.recipe:/patch
default.yaml:
- schema_list/=: []
- schema_list/+:
- schema: luna_pinyin
- schema_list/+:
- schema: combo_pinyin_kbcon
- menu/page_size: 9
default.custom.yaml:
- patch/+:
menu/page_size: 10 |
我用 golang 实现了一个 rime-plum-go,本来是准备给 openSUSE 发行版升级 brise 做一个类似脚本一样的东西,可以在本地去把 repo 都 clone 好,结果不知不觉就做成近似完全版本的 plum 了。 目前没有 --selector 的功能,另外由于对 recipe 新概念的不熟悉可能有 bug...但是看到您的帖子,我感觉它可能可以解决 windows 用不了 bash 的问题。 目前参数是这样的:
比起原来的 pattern,多了一个 prefix,可以支持除了 github 以外的网站比如 marguerite.su/marguerite/rime-custom:customize:key=value,key1=value1 但是由于加了参数的原因, selector 就不太好做了...在想别的办法比如自己实现参数的库。 另外准备看一下您在这里发的草案,检查一下对语法的处理有没有 bug... |
@marguerite 久仰 目前這個格式的設計,以及打補丁的方法都在遷就文本行編輯工具,因爲bash腳本沒有解析YAML文件的能力,只好按文本文件來編輯。如果有再複雜一些的操作,已經做不下去了。 rime-plum-go 正是今後需要的工具。 具體來說,配方對 理想中,補丁要直接修改 |
@lotem 不知道我说的对不对,翻看 recipe.sh 和自己跑那些 shell script 进行测试后,我感觉现在的 recipe 是这样的,第一行是要操作的文件 $(schema:-luna_pinyin}.schema.yaml ,针对这个文件做一个 .custom.yaml,然后把第二行开始的东西都原封不动的丢到 # Rx: xxx {} 这个 block 里去。plum 目前就做了这些事情。我的实现也就抄了这些... 看了下 config 的语法,不知道我的理解对不对。
现在已经采用 yaml 和 bash 结合的方式了,考虑到兼容性,再改纯 yaml 已经不太容易了。好比 install_files 下面可以直接写不带 - 的 opencc/**/*。所以这里不差再多一个 reserved word 表示覆盖行为了,比如:
反正这里肯定是要从 yaml 中提取出来单独 parse 的...至少我在 rime-plum-go 这边是这样做的。因为 golang 的在文件夹下 Glob 的函数是我自己写的(官方没有),只支持 re2 的 regexp。所以我这里需要转换比如 */ *.{txt,json} 这样的 shell script 为 regex。那就不差再多识别一个参数了... 另外感觉我这边可以尝试解析 yaml,直接写 custom.yaml 的。比如第一个 recipe 写 custom.yaml,我会读取 emoji_suggestion.yaml 直接把 patch: 内容写到 custom.yaml,反正 rime 是支持的。第二个 recipe 再写 custom.yaml,我也是读取 patch: 然后按 key 查找冲突。如果冲突则提示但不写入,只写入非冲突部分。至于怎么调整哪个 recipe 在先,目前没有这样的机制吧,毕竟用户安装顺序是乱序的。现在 recipe 可以嵌套吗? |
至於那個 我先說最後一個問題。安裝配方是講究順序的。 |
还需要研究一下 dependency 的问题. 比如说, 我们应该允许一个配方依赖另一些配方 (指定的方式可以是任何 git source 或者 tarball (#62)). 现有的一些配方直接把朙月拼音方案放进去, 这非常不好, 一方面这会造成资源浪费, 另一方面跟进朙月拼音的上游更新会很麻烦. 另外, 有了 dependency 就还要有 lockfile. 这些都是一个包管理工具必须的. 而且, 现在定制化 RIME 配置的方法也有些不好. 我建议把配置 RIME 等价于定义一个配方. 这有很多好处: 首先, 这会非常 portable, 因为我只要在不同的机器上用同一个配方配置 RIME 即可, 所以只要把配方 push 到 GitHub repo 就能轻松同步多台电脑的配置. 其次, 分享配置也会很方便, 因为这直接等价于让别人安装一个配方. 第三, 这会对新手也更加友好, 因为在确定好了用 YAML 定义配方的格式之后, 设计一个用于写这个 YAML 的 GUI 程序应该不难, 届时就能实现新手不用打开任何代码编辑器就能定制自己的输入法. 而且, 东风破的很多现有问题都能解决了, 例如 #18, #25, #27. |
「配方」用於定義一組配置及其他數據文件,指定其如何使用。
配方定義文件的格式有以下選擇:
無論哪種格式,都允許在代碼庫缺失配方定義文件的情況下,自動推導出默認的配方定義。
在 Windows 平臺 bash 不可用的情況下,只能忽略配方定義文件,做默認安裝。
無論哪種形式,都支持在未定義安裝動作的情況下,執行默認的安裝動作。
目前已實現的默認安裝動作爲:複製代碼庫中的
*.yaml, *.txt, opencc/*.{json,ocd,txt}
文件。一份代碼庫可以提供多份配方。
安裝時指定配方
user/repo:recipe
或安裝代碼庫默認的配方user/repo
。參數化配方,允許在安裝時定義一組變量以改變(具體化)安裝動作。
例如爲某項用補靪實現的定製動作設定目標輸入方案。
若選用 bash 安裝腳本,則實現參數化比較容易;
若選用 YAML 格式的補靪,則需要模板機制。
The text was updated successfully, but these errors were encountered: