├── .github ├── FUNDING.yml └── CODEOWNERS ├── customisation ├── preview │ └── color_scheme_keydo.png └── 极速跟打器 │ ├── CONFIG │ └── settings.ini │ └── skin │ └── SPHS.css ├── .vscode └── settings.json ├── .gitignore ├── keydo.shorthand_l1.dict.yaml ├── keydo.shortcuts.dict.yaml ├── default.custom.yaml ├── keydo.custom.yaml ├── keydo.shorthand_lsp.dict.yaml ├── keydo.dict.yaml ├── rime.lua ├── lua ├── keydo │ ├── filters │ │ ├── cand.lua │ │ └── pending_topup_migration.lua │ ├── processors │ │ └── select.lua │ └── translators │ │ └── date_time.lua ├── constants.lua ├── date.lua ├── helpers.lua ├── for_topup.lua ├── utils.lua └── xnumber.lua ├── squirrel.custom.yaml ├── weasel.custom.yaml ├── keydo.punct.yaml ├── keydo.shorthand_l2.dict.yaml ├── CODE_OF_CONDUCT.md ├── keydo.chars_extra.dict.yaml ├── keydo.schema.yaml ├── README.md ├── keydo.shorthand_sp.dict.yaml └── LICENSE /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [pingshunhuangalex] 4 | -------------------------------------------------------------------------------- /customisation/preview/color_scheme_keydo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingshunhuangalex/rime-keydo/HEAD/customisation/preview/color_scheme_keydo.png -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Lua.diagnostics.globals": [ 3 | "ReverseDb", 4 | "Candidate", 5 | "yield", 6 | "keydo_select_processor", 7 | "keydo_date_time_translator", 8 | "keydo_cand_filter" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # miscnpm 4 | .DS_Store 5 | 6 | # production 7 | build 8 | sync 9 | 10 | # user configs 11 | *.userdb 12 | installation.yaml 13 | default.yaml 14 | user.yaml 15 | weasel.yaml 16 | squirrel.yaml 17 | -------------------------------------------------------------------------------- /keydo.shorthand_l1.dict.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: keydo.shorthand_l1 3 | version: "1.0" 4 | sort: original 5 | ... 6 | 那 a 7 | 又 a 8 | 不 b 9 | 吧 b 10 | 才 c 11 | 此 c 12 | 的 d 13 | 都 d 14 | 是 e 15 | 识 e 16 | 这 f 17 | 之 f 18 | 个 g 19 | 和 h 20 | 好 h 21 | 上 i 22 | 打 i 23 | 就 j 24 | 及 j 25 | 可 k 26 | 了 l 27 | 啦 l 28 | 没 m 29 | 嘛 m 30 | 你 n 31 | 能 n 32 | 着 o 33 | 啊 o 34 | 平 p 35 | 去 q 36 | 其 q 37 | 人 r 38 | 三 s 39 | 他 t 40 | 得 u 41 | 有 v 42 | 我 w 43 | 玩 w 44 | 而 x 45 | 嗯 x 46 | 一 y 47 | 意 y 48 | 在 z 49 | 咋 z 50 | -------------------------------------------------------------------------------- /keydo.shortcuts.dict.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: keydo.shortcuts 3 | version: "1.0" 4 | sort: original 5 | ... 6 | / ;; 7 | ……” ;a 8 | 【 ;b 9 | ° ;c 10 | ℃ ;cc 11 | ℉ ;cf 12 | ⁈ ;d 13 | ↓ ;e 14 | 「 ;f 15 | !” ;g 16 | ⁇ ;h 17 | → ;i 18 | 】 ;j 19 | ‼ ;k 20 | § ;l 21 | ≈ ;m 22 | ← ;n 23 | — ;o 24 | 」 ;p 25 | :“ ;q 26 | 。” ;r 27 | ”, ;s 28 | ?” ;t 29 | ↑ ;u 30 | ⁉ ;v 31 | ‰ ;w 32 | © ;x 33 | ⑧ ;xbs 34 | ⑩ ;xek 35 | √ ;xgd 36 | ⑨ ;xjq 37 | ⓪ ;xlg 38 | ⑥ ;xlq 39 | ♂ ;xnf 40 | ♀ ;xnl 41 | ⑦ ;xqk 42 | ③ ;xsf 43 | ④ ;xsk 44 | ⑤ ;xwj 45 | × ;xws 46 | ② ;xxj 47 | ① ;xyk 48 | ____ ;y 49 | … ;z 50 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Lines starting with '#' are comments. 2 | # Each line is a file pattern followed by one or more owners. 3 | 4 | # More details are here: https://help.github.com/articles/about-codeowners/ 5 | 6 | # The '*' pattern is global owners. 7 | 8 | # Order is important. The last matching pattern has the most precedence. 9 | # The folders are ordered as follows: 10 | 11 | # In each subsection folders are ordered first by depth, then alphabetically. 12 | # This should make it easy to add new rules without breaking existing ones. 13 | 14 | # Global rule: 15 | * @pingshunhuangalex 16 | -------------------------------------------------------------------------------- /default.custom.yaml: -------------------------------------------------------------------------------- 1 | # Rime全局自定义设置 2 | # encoding: utf-8 3 | 4 | patch: 5 | ascii_composer: # 英文模式配置 6 | good_old_caps_lock: false # 用`Caps Lock`切换英文模式时,是否激活大写锁定(默认关闭) 7 | switch_key: # 英文模式切换键配置 8 | Shift_L: commit_text # 按下左`Shift`时(默认上屏候选项) 9 | Shift_R: commit_text # 按下右`Shift`时(默认上屏候选项) 10 | Control_L: commit_code # 按下左`Control`时(默认上屏编码) 11 | Control_R: commit_code # 按下右`Control`时(默认上屏编码) 12 | Caps_Lock: inline_ascii # 按下`Caps Lock`时(默认保留输入区) 13 | Eisu_toggle: clear # 按下英数键(日文键盘)时(默认清空输入区) 14 | menu/page_size: 6 # 候选项显示个数 15 | schema_list: # 方案列表 16 | - schema: keydo # 键道·我流 17 | switcher: # 方案切换开关 18 | caption: "「切换方案」" # 方案切换标识(在输入区会予以显示) 19 | hotkeys: # 方案切换快捷键 20 | - "Shift+space" 21 | -------------------------------------------------------------------------------- /keydo.custom.yaml: -------------------------------------------------------------------------------- 1 | # 键道·我流自定义设置 2 | # encoding: utf-8 3 | 4 | ###################### 5 | ## [Win] 辅助轮设置 ## 6 | ###################### 7 | 8 | # patch: 9 | # char_lookup/comment_format: 10 | # - xform/^~// # 显示逐码提示 11 | # menu/page_size: 6 # 尽可能显示关联候选项 12 | # style: 13 | # inline_preedit: false # 关闭输入区嵌入 14 | # label_format: " %s" # 显示候选项序号 15 | # layout: 16 | # margin_y: 8 # 显示候选区 17 | # preedit_type: composition # 编码所见即所得 18 | 19 | ###################### 20 | ## [Mac] 辅助轮设置 ## 21 | ###################### 22 | 23 | # patch: 24 | # char_lookup/comment_format: 25 | # - xform/^~// # 显示逐码提示 26 | # menu/page_size: 6 # 尽可能显示关联候选项 27 | # style: 28 | # alpha: 1.0 # 显示候选区 29 | # inline_candidate: false # 编码所见即所得 30 | # inline_preedit: false # 关闭输入区嵌入 31 | # candidate_format: "%c %@" # 显示候选项序号 32 | -------------------------------------------------------------------------------- /keydo.shorthand_lsp.dict.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: keydo.shorthand_lsp 3 | version: "1.0" 4 | sort: original 5 | ... 6 | 不知道 bfo 7 | 不坚持 bjiu 8 | 不出来 bjvo 9 | 不可以 bka 10 | 不开心 bkoa 11 | 不认识 broa 12 | 不喜欢 bxa 13 | 不应该 byoa 14 | 不一定 byoo 15 | 不一样 byv 16 | 都好了 dhl 17 | 都可以 dka 18 | 都没有 dmv 19 | 是什么 eeu 20 | 是可以 eka 21 | 这什么 feu 22 | 好东西 hdv 23 | 和很多 hhua 24 | 好很多 hhua 25 | 就开始 jkau 26 | 可不可以 kbka 27 | 可能的话 kndoa 28 | 没多少 mdi 29 | 没时间 meo 30 | 没什么 meu 31 | 没找到 mfva 32 | 没发现 mfvv 33 | 没关系 mgu 34 | 没空间 mkoi 35 | 没问题 mwo 36 | 没休息 mxui 37 | 没想到 mxva 38 | 你知道 nfo 39 | 你这样 nfv 40 | 你觉得 njuu 41 | 你可以 nka 42 | 你没有 nmv 43 | 你准备 nqu 44 | 你已经 nya 45 | 你也是 nyoi 46 | 你自己 nza 47 | 你怎么 nzu 48 | 去一下 qyvi 49 | 他知道 tfo 50 | 他这样 tfv 51 | 他觉得 tjuu 52 | 他可以 tka 53 | 他没有 tmv 54 | 他准备 tqu 55 | 他已经 tya 56 | 他也是 tyoi 57 | 他自己 tza 58 | 他怎么 tzu 59 | 我知道 wfo 60 | 我这样 wfv 61 | 我觉得 wjuu 62 | 我可以 wka 63 | 我没有 wmv 64 | 我准备 wqu 65 | 我已经 wya 66 | 我也是 wyoi 67 | 我自己 wza 68 | 我怎么 wzu 69 | 一开始 ykau 70 | -------------------------------------------------------------------------------- /keydo.dict.yaml: -------------------------------------------------------------------------------- 1 | # 键道·我流扩展词库 2 | # encoding: utf-8 3 | 4 | name: keydo 5 | version: "1.0" 6 | sort: original 7 | use_preset_vocabulary: false 8 | import_tables: 9 | # --------------------------------------- 10 | # 下列为键道·我流专属的扩展词库: 11 | # 说明:专属词库在当前目录下均含有"keydo"前缀 12 | # 若需要,请仅删除下列码表名前的“#”号,并重新部署 13 | # 示例码表状态: 14 | # # - keydo.example #关闭(前面有一个#号) 15 | # - keydo.example #开启(前面没有#号了) 16 | # ======================================= 17 | # --------------------------------------- 18 | # 扩展:特殊简码 19 | - keydo.shorthand_sp 20 | # --------------------------------------- 21 | # 扩展:简码连携 22 | - keydo.shorthand_lsp 23 | # --------------------------------------- 24 | # 扩展:二级简码 25 | - keydo.shorthand_l2 26 | # --------------------------------------- 27 | # 扩展:词组 28 | - keydo.phrases 29 | # --------------------------------------- 30 | # 扩展:一级简码 31 | - keydo.shorthand_l1 32 | # --------------------------------------- 33 | # 扩展:单字 34 | - keydo.chars 35 | # --------------------------------------- 36 | # 扩展:生僻单字 37 | - keydo.chars_extra 38 | # --------------------------------------- 39 | # 扩展:快捷输入 40 | - keydo.shortcuts 41 | # --------------------------------------- 42 | # ======================================= 43 | -------------------------------------------------------------------------------- /rime.lua: -------------------------------------------------------------------------------- 1 | ------------------ 2 | -- Rime全局函数 -- 3 | ------------------ 4 | 5 | -- `ReverseDb = (path: string) => void` 6 | -- - 根据路径获取编译后的词库 7 | -- - https://github.com/rime/librime/blob/master/src/rime/dict/reverse_lookup_dictionary.h#L41 8 | 9 | -- `Candidate = (type: string, start: string, end: string, text: string, comment: string) => Candidate` 10 | -- - 构建一个候选项 11 | -- - https://github.com/rime/librime/blob/master/src/rime/candidate.h#L63 12 | 13 | -- `yield = (cand: Candidate) => void` 14 | -- - 生成一个候选项至候选区(每次只能生成一个候选项,但可以多次使用) 15 | 16 | -- `processor = (key_event: KeyEvent, env) => void` 17 | -- - 处理器 -> 响应按键并按照预设的规则依次进行编码处理 18 | -- - https://github.com/rime/librime/blob/master/src/rime/processor.h 19 | 20 | -- `translator = (input: string, seg: Segment, env) => void` 21 | -- - 转换器 -> 将划分好的编码段转换为对应候选项 22 | -- - https://github.com/rime/librime/blob/master/src/rime/translator.h 23 | 24 | -- `filter = (cand_list: vector>, env) => void` 25 | -- - 过滤器 -> 将转换好的候选项进行过滤(增删改查) 26 | -- - https://github.com/rime/librime/blob/master/src/rime/filter.h 27 | 28 | --------------------- 29 | -- 键道·我流逻辑块 -- 30 | --------------------- 31 | 32 | -- 顶功处理器 33 | topup_processor = require("for_topup") 34 | 35 | -- 选择处理器 36 | keydo_select_processor = require("keydo.processors.select") 37 | 38 | -- 日期与时间转换器 39 | keydo_date_time_translator = require("keydo.translators.date_time") 40 | 41 | -- 数字转换器:将阿拉伯数字转换为对应汉字(由`=`引导) 42 | number_translator = require("xnumber") 43 | 44 | -- 候选过滤器 45 | keydo_cand_filter = require("keydo.filters.cand") 46 | -------------------------------------------------------------------------------- /lua/keydo/filters/cand.lua: -------------------------------------------------------------------------------- 1 | local utils = require("utils") 2 | 3 | local is_valid = utils.is_valid 4 | local starts_with = utils.starts_with 5 | local has_cn_chars = utils.has_cn_chars 6 | 7 | -- 候选过滤器 8 | -- - 历史模式候选项过滤(Rime历史模式允许记录所有输入字符,如标点、表情、英文字母等) 9 | -- - 历史模式候选项去重(Rime自带去重允许历史模式中相邻两项重复一次,即重复连续输入) 10 | local function filter(cand_list, env) 11 | local input = env.engine.context.input -- 输入区字符串 12 | local history_leader = env.history_leader -- 历史模式引导键 13 | 14 | local prev_cand_text = nil -- 上一个候选项字符串 15 | local is_history = starts_with(input, history_leader) -- 是否进入历史模式,即输入区是否由历史模式引导键引导 16 | 17 | -- 待遍历的候选项为vector类型,能否将所有过滤器逻辑压缩在用于生成候选项的一次遍历中对渲染速度至关重要 18 | -- https://github.com/rime/librime/blob/master/src/rime/candidate.h#L56 19 | for cand in cand_list:iter() do 20 | -- 若候选项为无效字符串,则跳过(不生成)该候选项 21 | if not is_valid(cand.text) then 22 | goto continue 23 | end 24 | 25 | if is_history then -- 历史模式 26 | -- 确保历史模式中的候选项不是重复项且含有中文字符,否则跳过(不生成)该候选项 27 | if cand.text ~= prev_cand_text and has_cn_chars(cand.text) then 28 | prev_cand_text = cand.text 29 | else 30 | goto continue 31 | end 32 | end 33 | 34 | yield(cand) -- 生成候选项 35 | 36 | ::continue:: 37 | end 38 | end 39 | 40 | -- 初始化 41 | local function init(env) 42 | local config = env.engine.schema.config 43 | 44 | env.history_leader = config:get_string("repeat_history/input") -- 从设置中读取历史模式引导键 45 | end 46 | 47 | return { init = init, func = filter } 48 | -------------------------------------------------------------------------------- /squirrel.custom.yaml: -------------------------------------------------------------------------------- 1 | # Rime主题自定义设置 2 | # encoding: utf-8 3 | 4 | patch: 5 | preset_color_schemes/keydo: # 主题识别名称(用于代码引用 - `0xBBGGRR`) 6 | author: SPHS # 主题作者 7 | back_color: 0x212121 # 主题背景颜色 8 | border_color: 0x373737 # 主题边框颜色 9 | candidate_text_color: 0xeeffff # 候选项字体颜色 10 | comment_text_color: 0x6bcbff # 候选项编码提示字体颜色 11 | hilited_back_color: 0x212121 # 输入区高亮部分(编码)背景颜色 12 | hilited_candidate_back_color: 0x373737 # 高亮候选项背景颜色 13 | hilited_candidate_label_color: 0x6a8cf7 # [Mac] 高亮候选项序号字体颜色 14 | hilited_candidate_text_color: 0xea92c7 # 高亮候选项字体颜色 15 | hilited_comment_text_color: 0x6bcbff # 高亮候选项编码提示字体颜色 16 | hilited_text_color: 0xea92c7 # 输入区高亮部分(编码)字体颜色 17 | label_color: 0x797979 # 候选项序号字体颜色 18 | name: 键道·我流/SPHS # 主题名称 19 | text_color: 0xffaa82 # 输入区字体颜色 20 | style: # 主题配置 21 | alpha: 0.0 # 主题透明度 22 | border_height: 2 # [Mac] 主题左右边框粗细(须与上下边框粗细同时使用) 23 | border_width: 2 # [Mac] 主题上下边框粗细(须与左右边框粗细同时使用) 24 | candidate_format: "" # [Mac] 候选项序号格式(`%c`为候选项序号,`%@`为候选项) 25 | color_scheme: keydo # 当前主题 26 | comment_font_point: 16 # [Mac] 候选项编码提示字体字号 27 | corner_radius: 8 # [Mac] 候选区圆角半径(同时影响候选区上下左右填充空间) 28 | font_face: "Sarasa Mono SC" # 主题字体样式(支持候补字体) 29 | font_point: 18 # 主题字体字号 30 | hilited_corner_radius: 2 # [Mac] 高亮候选项圆角半径 31 | horizontal: true # 候选项是否横排(默认横排) 32 | inline_candidate: true # [Mac] 是否预览编码(默认预览编码) 33 | inline_preedit: true # 是否开启输入区嵌入(默认开启) 34 | label_font_point: 14 # [Mac] 候选项序号字体字号 35 | line_spacing: 8 # [Mac] 候选项行距(仅在竖排模式中有效,且无法影响首/末选项) 36 | spacing: 8 # 输入区与候选区间距 37 | -------------------------------------------------------------------------------- /lua/constants.lua: -------------------------------------------------------------------------------- 1 | -- 处理结果序号 2 | -- https://github.com/rime/librime/blob/master/src/rime/processor.h 3 | local results = { 4 | rejected = 0, -- 拒绝:Rime不执行任何操作 -> 直接由系统进行默认按键操作 5 | accepted = 1, -- 接受:Rime执行当前逻辑块操作 -> 消耗按键 6 | noop = 2 -- 忽略:Rime不执行当前逻辑块操作 -> 传递给下个逻辑块 7 | } 8 | 9 | -- 不同字符所对应的中文变换 10 | local castings = { 11 | currency_digits = { [0] = "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }, -- 货币字符 12 | currency_units = { [0] = "元", "角", "分" }, -- 货币单位 13 | currency_separators_minor = { "拾", "佰", "仟" }, -- 货币分隔符 14 | currency_separators = { "萬", "億", "兆", "京", "垓", "杼", "穰", "溝", "澗", "正", "載", "極" }, -- 货币分隔符(万位) 15 | number_digits = { [0] = "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九" }, -- 数字字符 16 | number_separators_minor = { "十", "百", "千" }, -- 数字分隔符 17 | number_separators = { "万", "亿", "兆", "京", "垓", "秭", "壤", "沟", "涧", "正", "载", "极" }, -- 数字分隔符(万位) 18 | number_separators_decimal = { "分", "厘", "毫", "丝", "忽", "微", "纤", "沙", "尘", "埃", "渺", "漠" }, -- 数字分隔符(小数) 19 | number_symbols = { ["+"] = "正", ["-"] = "负", ["."] = "点" }, -- 数字符号 20 | number_digits_military = { [0] = "洞", "幺", "两", "三", "四", "五", "六", "拐", "八", "勾" }, -- 数字字符(军用) 21 | number_digits_verbal = { [0] = "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" }, -- 数字字符(口语) 22 | weekdays = { [0] = "星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }, -- 星期数 23 | weekdays_verbal = { [0] = "周日", "周一", "周二", "周三", "周四", "周五", "周六" } -- 星期数(口语) 24 | } 25 | 26 | -- 不同字符所对应的格式变换 27 | -- https://www.lua.org/pil/22.1.html 28 | local formatters = { 29 | date = "%s年%s月%s日", -- 中文日期格式 30 | date_simple = "%Y-%m-%d", -- 数字日期格式 31 | time12 = "%I:%M:%S %p", -- 12小时制格式 32 | time24 = "%H:%M:%S", -- 24小时制格式 33 | day = "%d", -- 天数格式 34 | month = "%m", -- 月份格式 35 | year = "%Y", -- 年份格式 36 | week = "%w" -- 星期数序号格式 37 | } 38 | 39 | return { 40 | results = results, 41 | castings = castings, 42 | formatters = formatters 43 | } 44 | -------------------------------------------------------------------------------- /weasel.custom.yaml: -------------------------------------------------------------------------------- 1 | # Rime主题自定义设置 2 | # encoding: utf-8 3 | 4 | patch: 5 | preset_color_schemes/keydo: # 主题识别名称(用于代码引用 - `0xBBGGRR`) 6 | author: SPHS # 主题作者 7 | back_color: 0x212121 # 主题背景颜色 8 | border_color: 0x373737 # 主题边框颜色 9 | candidate_text_color: 0xeeffff # 候选项字体颜色 10 | comment_text_color: 0x6bcbff # 候选项编码提示字体颜色 11 | hilited_back_color: 0x212121 # 输入区高亮部分(编码)背景颜色 12 | hilited_candidate_back_color: 0x373737 # 高亮候选项背景颜色 13 | hilited_candidate_text_color: 0xea92c7 # 高亮候选项字体颜色 14 | hilited_comment_text_color: 0x6bcbff # 高亮候选项编码提示字体颜色 15 | hilited_label_color: 0x6a8cf7 # 高亮候选项序号字体颜色 16 | hilited_mark_color: 0x6a8cf7 # 高亮候选项标记字体颜色 17 | hilited_text_color: 0xea92c7 # 输入区高亮部分(编码)字体颜色 18 | label_color: 0x797979 # 候选项序号字体颜色 19 | name: 键道·我流/SPHS # 主题名称 20 | text_color: 0xffaa82 # 输入区字体颜色 21 | style: # 主题配置 22 | color_scheme: keydo # 当前主题 23 | comment_font_point: 12 # 候选项编码提示字号 24 | display_tray_icon: false # [Win] 是否显示托盘图标(默认隐藏) 25 | font_face: "Sarasa Mono SC" # 主题字体样式 26 | font_point: 14 # 主题字体字号 27 | fullscreen: false # [Win] 是否在全屏显示输入窗口(默认隐藏) 28 | horizontal: true # 候选项是否横排(默认横排) 29 | inline_preedit: true # 是否开启输入区嵌入(默认开启) 30 | label_font_point: 12 # 候选项序号字号 31 | label_format: "" # 候选项序号格式(`%s`为候选项序号) 32 | layout: # [Win] 主题布局配置 33 | align_type: bottom # 候选区对齐方式 34 | border_height: 2 # 主题上下边框粗细(须与左右边框粗细同时使用) 35 | border_width: 2 # 主题左右边框粗细(须与上下边框粗细同时使用) 36 | candidate_spacing: 12 # 候选项间距 37 | corner_radius: 6 # 候选区圆角半径 38 | enhanced_position: true # 允许在光标位置获取失败时于窗口左上角绘制候选框(而不是桌面左上角) 39 | hilited_corner_radius: 6 # 候选项圆角半径 40 | hilite_padding: 6 # 高亮候选项填充空间 41 | hilite_spacing: 6 # 高亮候选项间距 42 | margin_x: 8 # 主题左右边距 43 | margin_y: -1 # 主题上下边距(边距为负值时隐藏候选区) 44 | min_height: 0 # 主题最小高度 45 | min_width: 0 # 主题最小宽度 46 | spacing: 8 # 输入区与候选区间距 47 | mark_text: "" # 高亮候选项标记 48 | preedit_type: preview_all # [Win] 输入区嵌入模式(默认预览编码) 49 | -------------------------------------------------------------------------------- /keydo.punct.yaml: -------------------------------------------------------------------------------- 1 | # 键道·我流标点符号 2 | # encoding: utf-8 3 | 4 | config_version: "1.0" 5 | punctuator: 6 | full_shape: 7 | ' ' : { commit: ' ' } 8 | ',' : { commit: , } 9 | '.' : { commit: 。 } 10 | '<' : [ '<', 《, 〈, «, ‹ ] 11 | '>' : [ '>', 》, 〉, », › ] 12 | '/' : [ '/', /, ÷ ] 13 | '?' : { commit: ? } 14 | ';' : { commit: ; } 15 | ':' : { commit: : } 16 | '''' : { pair: [ '‘', '’' ] } 17 | '"' : { pair: [ '“', '”' ] } 18 | '\' : [ '\', 、, \ ] 19 | '|' : [ '|', ·, ・, |, '§', '¦', '‖' ] 20 | '`' : [ '`', ‵, ‶, ‷, ′, ″, ‴, ⁗ ] 21 | '~' : [ '~', ~, ˜, ≈, ≋, ≃, ≅, ≇, ∽, ⋍, ≌, ﹏, ﹋, ﹌ ] 22 | '!' : { commit: ! } 23 | '@' : [ '@', @, ☯, ©, ®, ℗ ] 24 | '#' : [ '#', #, ⌘, № ] 25 | '%' : [ '%', %, '°', '℃', ℉, ‰, ‱ ] 26 | '$' : [ '$', ¥, '€', '£', '¥', '¢', '¤', ₩ ] 27 | '^' : { commit: …… } 28 | '&' : [ '&', & ] 29 | '*' : [ '*', *, ·, ・, ×, ※, ❂, ⁂, ☮, ❖, ☯, ☣ ] 30 | '(' : [ '(', ( ] 31 | ')' : [ ')', ) ] 32 | '-' : [ '-', - ] 33 | '_' : [ '_', —— ] 34 | '+' : [ '+', + ] 35 | '=' : [ '=', =, 々, 〃 ] 36 | '[' : [ '[', 「, 【, 〔, [ ] 37 | ']' : [ ']', 」, 】, 〕, ] ] 38 | '{' : [ '{', 『, 〖, { ] 39 | '}' : [ '}', 』, 〗, } ] 40 | half_shape: 41 | ',' : { commit: , } 42 | '.' : { commit: 。 } 43 | '<' : { commit: 《 } 44 | '>' : { commit: 》 } 45 | '/' : '/' 46 | '?' : { commit: ? } 47 | ';' : { commit: ; } 48 | ':' : { commit: : } 49 | '''' : { pair: [ '‘', '’' ] } 50 | '"' : { pair: [ '“', '”' ] } 51 | '\' : { commit: 、 } 52 | '|' : { commit: · } 53 | '`' : '`' 54 | '~' : { commit: ~ } 55 | '!' : { commit: ! } 56 | '@' : '@' 57 | '#' : '#' 58 | '%' : '%' 59 | '$' : { commit: ¥ } 60 | '^' : { commit: …… } 61 | '&' : '&' 62 | '*' : '*' 63 | '(' : ( 64 | ')' : ) 65 | '-' : '-' 66 | '_' : { commit: —— } 67 | '+' : '+' 68 | '=' : '=' 69 | '[' : { commit: '“' } 70 | ']' : { commit: '”' } 71 | '{' : { commit: '‘' } 72 | '}' : { commit: '’' } 73 | -------------------------------------------------------------------------------- /lua/keydo/processors/select.lua: -------------------------------------------------------------------------------- 1 | local constants = require("constants") 2 | local utils = require("utils") 3 | local helpers = require("helpers") 4 | 5 | local results = constants.results 6 | 7 | local starts_with = utils.starts_with 8 | 9 | local is_key = helpers.is_key 10 | local is_pressed = helpers.is_pressed 11 | local force_select = helpers.force_select 12 | 13 | local SELECT1_KEY = " " -- 首选键字符串 14 | local SELECT2_KEY = "'" -- 次选键字符串 15 | 16 | -- 选择处理器 17 | -- - 将指定按键用作次选键 18 | -- - 连按历史模式引导键将自动选择候选项首项 19 | local function processor(key_event, env) 20 | local input = env.engine.context.input -- 输入区字符串 21 | local history_leader = env.history_leader -- 历史模式引导键 22 | 23 | local is_history = starts_with(input, history_leader) -- 是否进入历史模式,即输入区是否由历史模式引导键引导 24 | 25 | -- 仅处理特定按键事件,其它事件将被传递给下个逻辑块 26 | -- - 仅处理“按下”事件 27 | -- - 忽略首选键 -> 空格键作为可以输出字符的选择键应由express_editor控制 28 | if not is_pressed(nil, key_event) or is_key(SELECT1_KEY, key_event) then 29 | return results.noop 30 | end 31 | 32 | -- 若按键为次选键 33 | -- - 尝试上屏次选项(消耗按键) 34 | -- - 尝试上屏高亮选项(消耗按键) 35 | -- - 清空输入区(不消耗按键 -> 传递给下个逻辑块) 36 | if is_key(SELECT2_KEY, key_event) then 37 | return force_select(1, results.accepted, results.noop, env) 38 | end 39 | 40 | -- 除次选键外,仅处理历史模式下的按键事件,其它模式下的按键事件将被传递给下个逻辑块 41 | if not is_history then 42 | return results.noop 43 | end 44 | 45 | -- 若在历史模式下按下历史模式引导键 46 | -- - 尝试上屏高亮选项(将历史候选项顶上屏 -> 不消耗按键 -> 再次开启历史模式) 47 | -- - 清空输入区(消耗按键 -> 关闭历史模式) 48 | if is_key(history_leader, key_event) then 49 | return force_select(nil, results.noop, results.accepted, env) 50 | end 51 | 52 | -- 若在历史模式下按下其它按键 53 | -- - 尝试上屏高亮选项(将历史候选项顶上屏 -> 不消耗按键 -> 传递给下个逻辑块) 54 | -- - 清空输入区(不消耗按键 -> 传递给下个逻辑块) 55 | return force_select(nil, results.noop, results.noop, env) 56 | end 57 | 58 | -- 初始化 59 | local function init(env) 60 | local config = env.engine.schema.config 61 | 62 | env.history_leader = config:get_string("repeat_history/input") -- 从设置中读取历史模式引导键 63 | end 64 | 65 | return { init = init, func = processor } 66 | -------------------------------------------------------------------------------- /lua/keydo/translators/date_time.lua: -------------------------------------------------------------------------------- 1 | local constants = require("constants") 2 | local utils = require("utils") 3 | 4 | local castings = constants.castings 5 | local formatters = constants.formatters 6 | 7 | local switch = utils.switch 8 | local to_cn_digits = utils.to_cn_digits 9 | local to_cn_number = utils.to_cn_number 10 | 11 | local DATE_TYPE = "date" -- 日期与时间所对应的候选项类型字符串 12 | 13 | -- 日期与时间转换器 14 | -- - 获取当前日期 15 | -- - 获取当前星期数 16 | -- - 获取当前时间 17 | local function translator(input, seg) 18 | local start = seg.start -- 高亮选项在输入区字符串中的起始位置 19 | local _end = seg._end -- 高亮选项在输入区字符串中的结束位置 20 | 21 | -- 日期与时间功能所对应的编码集 22 | local date_time_table = { 23 | [";xd"] = function() 24 | local year = to_cn_digits(tostring(os.date(formatters.year)), castings.number_digits) -- 当前年份 25 | local month = os.date(formatters.month) -- 当前月份 26 | local day = os.date(formatters.day) -- 当前天数 27 | local date = string.format(formatters.date, year, month, day) -- 当前日期(中文大写) 28 | local date_simple = os.date(formatters.date_simple) -- 当前日期(数字简写) 29 | 30 | yield(Candidate(DATE_TYPE, start, _end, date, "")) 31 | yield(Candidate(DATE_TYPE, start, _end, date_simple, "")) 32 | end, 33 | [";xt"] = function() 34 | local time24 = os.date(formatters.time24) -- 当前时间(24小时制) 35 | local time12 = os.date(formatters.time12) -- 当前时间(12小时制) 36 | 37 | yield(Candidate(DATE_TYPE, start, _end, time24, "")) 38 | yield(Candidate(DATE_TYPE, start, _end, time12, "")) 39 | end, 40 | [";xw"] = function() 41 | local weekday_index = tonumber(os.date(formatters.week)) -- 当前星期数序号 42 | local weekday = castings.weekdays[weekday_index] -- 当前星期数 43 | local weekday_verbal = castings.weekdays_verbal[weekday_index] -- 当前星期数(口语) 44 | 45 | yield(Candidate(DATE_TYPE, start, _end, weekday, "")) 46 | yield(Candidate(DATE_TYPE, start, _end, weekday_verbal, "")) 47 | end 48 | } 49 | 50 | switch(input, date_time_table) -- 生成候选项集合 51 | end 52 | 53 | return { func = translator } 54 | -------------------------------------------------------------------------------- /lua/date.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | date_translator: 将 `date` 翻译为当前日期 3 | 4 | translator 的功能是将分好段的输入串翻译为一系列候选项。 5 | 6 | 欲定义的 translator 包含三个输入参数: 7 | - input: 待翻译的字符串 8 | - seg: 包含 `start` 和 `_end` 两个属性,分别表示当前串在输入框中的起始和结束位置 9 | - env: 可选参数,表示 translator 所处的环境(本例没有体现) 10 | 11 | translator 的输出是若干候选项。 12 | 与通常的函数使用 `return` 返回不同,translator 要求您使用 `yield` 产生候选项。 13 | 14 | `yield` 每次只能产生一个候选项。有多个候选时,可以多次使用 `yield` 。 15 | 16 | 请看如下示例: 17 | --]] 18 | 19 | local conf = { 20 | number = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"}, 21 | } 22 | 23 | local function translateDateSuffix(text, type) 24 | for i = 1, string.len(text) do 25 | text = string.gsub(text, '〇', '', 1) 26 | if (type == 'day' and i == 1) then 27 | text = string.gsub(text, '^二', '二十', 1) 28 | text = string.gsub(text, '^三', '三十', 1) 29 | end 30 | if (type == 'month' or (type == 'day' and i == 2)) then 31 | text = string.gsub(text, '^一', '十', 1) 32 | end 33 | end 34 | return text 35 | end 36 | 37 | local function translateDate(text) 38 | local i = 0 39 | for key,value in ipairs(conf.number) do 40 | text = string.gsub(text, i, value) 41 | i = i + 1 42 | end 43 | return text 44 | end 45 | 46 | local function getUpDate() 47 | local h = os.date('%Y') 48 | local m = os.date('%m') 49 | local d = os.date('%d') 50 | 51 | local hour = translateDate(h) 52 | local month = translateDate(m) 53 | local month = translateDateSuffix(month, 'month') 54 | local day = translateDate(d) 55 | local day = translateDateSuffix(day, 'day') 56 | local res = string.format("%s年%s月%s日", hour, month, day) 57 | return res 58 | end 59 | 60 | local function translator(input, seg) 61 | if (input == ";xd") then 62 | --[[ 用 `yield` 产生一个候选项 63 | 候选项的构造函数是 `Candidate`,它有五个参数: 64 | - type: 字符串,表示候选项的类型 65 | - start: 候选项对应的输入串的起始位置 66 | - _end: 候选项对应的输入串的结束位置 67 | - text: 候选项的文本 68 | - comment: 候选项的注释 69 | --]] 70 | yield(Candidate("date", seg.start, seg._end, os.date("%Y年%m月%d日"), "")) 71 | yield(Candidate("date", seg.start, seg._end, getUpDate(), "")) 72 | end 73 | end 74 | 75 | -- 将上述定义导出 76 | return translator 77 | -------------------------------------------------------------------------------- /lua/helpers.lua: -------------------------------------------------------------------------------- 1 | local constants = require("constants") 2 | 3 | local results = constants.results 4 | 5 | -- [处理器]判断按键是否为目标键位 6 | --- @param key string | nil 7 | --- @param key_event unknown 8 | --- @return boolean 9 | local function is_key(key, key_event) 10 | local target_key = string.char(key_event.keycode) -- 当前按键对应字符 11 | 12 | -- 若无目标键位,则交由其它函数进行判断 13 | if not key then 14 | return true 15 | end 16 | 17 | return target_key == key 18 | end 19 | 20 | -- [处理器]判断按键是否被按下 -> “按下”的定义为按键尚未弹起,不包含修饰键且未激活大写锁定 21 | --- @param key string | nil 22 | --- @param key_event unknown 23 | --- @return boolean 24 | local function is_pressed(key, key_event) 25 | local is_released = key_event:release() -- 按键是否弹起 26 | -- 按键是否包含修饰键,大写锁定是否激活 27 | local is_modifier_pressed = key_event:alt() or 28 | key_event:ctrl() or 29 | key_event:shift() or 30 | key_event:super() or 31 | key_event:caps() 32 | 33 | return not is_released and not is_modifier_pressed and is_key(key, key_event) 34 | end 35 | 36 | -- [处理器]强制选择候选项(无视输入区与候选区状态) 37 | --- @param select_index integer | nil 38 | --- @param result_success integer 39 | --- @param result_failure integer 40 | --- @param env unknown 41 | --- @return integer 42 | local function force_select(select_index, result_success, result_failure, env) 43 | local context = env.engine.context 44 | 45 | -- 若指定候选项序号,则上屏待选项并消耗选择按键 46 | if select_index and context:select(select_index) then 47 | context:commit() 48 | 49 | return results.accepted 50 | end 51 | 52 | -- 若未指定候选项序号但候选区存在,则上屏当前处于高亮状态的候选项 53 | if context:get_selected_candidate() then 54 | context:commit() 55 | 56 | return result_success 57 | end 58 | 59 | -- 若不存在合适候选项,则清空输入区 60 | context:clear() 61 | 62 | return result_failure 63 | end 64 | 65 | -- [过滤器]强制上屏字符串(无视输入区与候选区状态) 66 | --- @param text string 67 | --- @param env unknown 68 | --- @return nil 69 | local function force_commit(text, env) 70 | local engine = env.engine 71 | 72 | local context = engine.context 73 | 74 | context:clear() 75 | engine:commit_text(text) 76 | end 77 | 78 | return { 79 | is_key = is_key, 80 | is_pressed = is_pressed, 81 | force_select = force_select, 82 | force_commit = force_commit 83 | } 84 | -------------------------------------------------------------------------------- /keydo.shorthand_l2.dict.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: keydo.shorthand_l2 3 | version: "1.0" 4 | sort: original 5 | ... 6 | 不都 bd 7 | 不是 be 8 | 不和 bh 9 | 不好 bh 10 | 不就 bj 11 | 不可 bk 12 | 不了 bl 13 | 不能 bn 14 | 吧你 bn 15 | 不去 bq 16 | 并且 bq 17 | 不同 bt 18 | 不行 bx 19 | 不要 by 20 | 不在 bz 21 | 从此 cc 22 | 才是 ce 23 | 错过 cg 24 | 才好 ch 25 | 聪明 cm 26 | 才能 cn 27 | 才去 cq 28 | 采取 cq 29 | 此人 cr 30 | 操心 cx 31 | 才在 cz 32 | 都不 db 33 | 的吧 db 34 | 的是 de 35 | 都是 de 36 | 的好 dh 37 | 都和 dh 38 | 的了 dl 39 | 都没 dm 40 | 的嘛 dm 41 | 的你 dn 42 | 都能 dn 43 | 都去 dq 44 | 的人 dr 45 | 的他 dt 46 | 的我 dw 47 | 大小 dx 48 | 都在 dz 49 | 是不 eb 50 | 是吧 eb 51 | 上次 ec 52 | 是的 ed 53 | 是都 ed 54 | 是这 ef 55 | 是个 eg 56 | 是和 eh 57 | 是了 el 58 | 是没 em 59 | 是嘛 em 60 | 是你 en 61 | 是能 en 62 | 是去 eq 63 | 使人 er 64 | 是他 et 65 | 是我 ew 66 | 使用 ey 67 | 是在 ez 68 | 这不 fb 69 | 这才 fc 70 | 服从 fc 71 | 这都 fd 72 | 这是 fe 73 | 这个 fg 74 | 中国 fg 75 | 这和 fh 76 | 符合 fh 77 | 这就 fj 78 | 这可 fk 79 | 这没 fm 80 | 父母 fm 81 | 这你 fn 82 | 这能 fn 83 | 这人 fr 84 | 这我 fw 85 | 这一 fy 86 | 之一 fy 87 | 刚才 gc 88 | 赶快 gk 89 | 光明 gm 90 | 个人 gr 91 | 好不 hb 92 | 好吧 hb 93 | 花草 hc 94 | 好的 hd 95 | 和好 hh 96 | 好好 hh 97 | 好了 hl 98 | 好没 hm 99 | 好嘛 hm 100 | 和你 hn 101 | 和能 hn 102 | 好人 hr 103 | 和他 ht 104 | 和我 hw 105 | 好在 hz 106 | 就都 jd 107 | 就是 je 108 | 就这 jf 109 | 就个 jg 110 | 就和 jh 111 | 就好 jh 112 | 就没 jm 113 | 就你 jn 114 | 就能 jn 115 | 就去 jq 116 | 就他 jt 117 | 就我 jw 118 | 就一 jy 119 | 就在 jz 120 | 可不 kb 121 | 快餐 kc 122 | 可是 ke 123 | 可靠 kk 124 | 开门 km 125 | 可能 kn 126 | 可去 kq 127 | 了不 lb 128 | 了吧 lb 129 | 了个 lg 130 | 了没 lm 131 | 了嘛 lm 132 | 了你 ln 133 | 两年 ln 134 | 没个 mg 135 | 没和 mh 136 | 没了 ml 137 | 没你 mn 138 | 没能 mn 139 | 没他 mt 140 | 明天 mt 141 | 没去 mq 142 | 没人 mr 143 | 没我 mw 144 | 梦想 mx 145 | 满意 my 146 | 没在 mz 147 | 你不 nb 148 | 能不 nb 149 | 你的 nd 150 | 你都 nd 151 | 你是 ne 152 | 你这 nf 153 | 你和 nh 154 | 你好 nh 155 | 能和 nh 156 | 你就 nj 157 | 你可 nk 158 | 你了 nl 159 | 你没 nm 160 | 你能 nn 161 | 哪怕 np 162 | 你去 nq 163 | 能去 nq 164 | 你人 nr 165 | 你我 nw 166 | 你在 nz 167 | 能在 nz 168 | 平时 pe 169 | 平和 ph 170 | 脾气 pq 171 | 平台 pt 172 | 平安 px 173 | 拼音 py 174 | 平在 pz 175 | 去不 qb 176 | 去吧 qb 177 | 去的 qd 178 | 去个 qg 179 | 去了 ql 180 | 去去 qq 181 | 其他 qt 182 | 人不 rb 183 | 人才 rc 184 | 如此 rc 185 | 人的 rd 186 | 人都 rd 187 | 人工 rg 188 | 如何 rh 189 | 人好 rh 190 | 人就 rj 191 | 人们 rm 192 | 人能 rn 193 | 日期 rq 194 | 人人 rr 195 | 热搜 rs 196 | 热线 rx 197 | 人在 rz 198 | 三次 sc 199 | 三个 sg 200 | 搜狗 sg 201 | 司马 sm 202 | 索取 sq 203 | 思想 sx 204 | 他不 tb 205 | 他的 td 206 | 他都 td 207 | 他是 te 208 | 他这 tf 209 | 他和 th 210 | 他就 tj 211 | 他没 tm 212 | 他能 tn 213 | 太难 tn 214 | 他去 tq 215 | 提前 tq 216 | 他人 tr 217 | 同学 tx 218 | 他在 tz 219 | 我不 wb 220 | 我吧 wb 221 | 我才 wc 222 | 为此 wc 223 | 我的 wd 224 | 我都 wd 225 | 我是 we 226 | 我这 wf 227 | 我和 wh 228 | 我好 wh 229 | 我就 wj 230 | 我可 wk 231 | 我了 wl 232 | 玩了 wl 233 | 我没 wm 234 | 我能 wn 235 | 我去 wq 236 | 完全 wq 237 | 我人 wr 238 | 我一 wy 239 | 我在 wz 240 | 而是 xe 241 | 而你 xn 242 | 而能 xn 243 | 而他 xt 244 | 因此 yc 245 | 有时 ye 246 | 一个 yg 247 | 以及 yj 248 | 郁闷 ym 249 | 一年 yn 250 | 要求 yq 251 | 一人 yr 252 | 以下 yx 253 | 因而 yx 254 | 字词 zc 255 | 在此 zc 256 | 在的 zd 257 | 在这 zf 258 | 做饭 zf 259 | 字根 zg 260 | 在和 zh 261 | 在了 zl 262 | 在吗 zm 263 | 在你 zn 264 | 组长 zq 265 | 昨天 zt 266 | 在我 zw 267 | 仔细 zx 268 | -------------------------------------------------------------------------------- /customisation/极速跟打器/CONFIG/settings.ini: -------------------------------------------------------------------------------- 1 | [AppConfig] 2 | ShuRuFa=\x952e\x9053\xb7\x6211\x6d41 3 | ShuRuFa2=true 4 | Jpname=Corne (Colemak-DH Matrix) 5 | Openjp=true 6 | QianMing=\x5927\x9053\x4e09\x5343\xff0c\x952e\x9053\x4e3a\x4e00\xff01 7 | QianMing2=false 8 | Czbj=true 9 | SymbolSelectRepeat=true 10 | BianMa=\x952e\x9053\xb7\x6211\x6d41.txt 11 | BianMa2=true 12 | Zdcm=true 13 | KongGe=0 14 | CuoZiSj=true 15 | Limitmz=60 16 | ManZiSj=true 17 | Fanye=500 18 | Yulanq=10 19 | Yulanh=10 20 | Sudu=true 21 | Jijian=true 22 | Machang=true 23 | Zishu=true 24 | Shijian=true 25 | Huigai=true 26 | Tuige=true 27 | Huiche=true 28 | Jianshu=true 29 | Xuanchong=true 30 | Jianzhun=true 31 | Jianfa=true 32 | Chongda=true 33 | Daci=true 34 | Cuozi=true 35 | Peakvalue=true 36 | Kjsz= 37 | Kjfw= 38 | Kjcd=Escape 39 | Kjlx= 40 | Kjzt=Return 41 | Kjzj= 42 | Kjfx= 43 | Kjtz= 44 | Kjzd= 45 | Kjsd= 46 | Kjhq= 47 | Kjcj=CTRL+Return 48 | Kjlb= 49 | Kjjy= 50 | Kjcf=CTRL+F 51 | Kjsh= 52 | Kjzw= 53 | Kjcz= 54 | Kjsw=SHIFT+F4 55 | Kjsj= 56 | Gdyw=true 57 | Gdsz=true 58 | Gdqs=false 59 | Gdcz=false 60 | Gdcdlim=20 61 | Gdcd=true 62 | Gdsdlim=200 63 | Gdsd=false 64 | Gdyslim=350 65 | Cypm=true 66 | Uploadcj=true 67 | Gdzw=\x6fc0\x6d3b\x8ddf\x6253\x5668 68 | Gdjs=\x6fc0\x6d3b\x8ddf\x6253\x5668 69 | Gdhq=\x8f7d\x5165\x8d5b\x6587 70 | Spd=5 71 | Pit=5 72 | Vol=5 73 | PlayDelay=1 74 | Per=\x5c0f\x6781 75 | Bgm=false 76 | ShiShi=true 77 | Quchu=true 78 | Tihuan=true 79 | Showcj=true 80 | BianSe=false 81 | TanChuang=false 82 | GbtanChuang=true 83 | Limit=false 84 | Limitsudu=200 85 | Fwjslx=false 86 | Jsmstime=300 87 | Jsms=false 88 | Opensrf=false 89 | Zchongfu=true 90 | Tishi=false 91 | Onlye=false 92 | Dingzi=true 93 | Fyxc=true 94 | Zdmc=4 95 | Dpmc=4 96 | Qpmc=4 97 | Hcaction=\x4e0a\x5c4f\x82f1\x6587 98 | Kgaction=\x6e05\x5c4f 99 | Position=\x8ddf\x968f\x5149\x6807 100 | Hxnum=10 101 | Mabiao=\x4e94\x7b14 102 | Style=SPHS 103 | Font1="\x7b49\x8ddd\x66f4\x7eb1\x9ed1\x4f53 SC,26,-1,5,50,0,0,0,0,0,Regular" 104 | GetWay=0 105 | Pattern=0 106 | X=450 107 | Y=200 108 | Width=950 109 | Height=650 110 | Ztcd=#eeffff 111 | Ztcg=#eeffff 112 | Dbj=#212121 113 | Gbj=#212121 114 | Tbj=#212121 115 | Rc=#4f6875 116 | Wc=#ff5370 117 | Zdname= 118 | Dheight=3 119 | Gheight=1 120 | Theight=6 121 | Bjone=#82aaff 122 | Bjtwo=#ffcb6b 123 | Bmcolor=#c792ea 124 | Zdhd=false 125 | Zdhd2=\x51fb\x952e 126 | Zdhd3=10 127 | Zdhd4=200 128 | Zdhd5=\x4e71\x5e8f 129 | Fwzs=100 130 | Fwmc=2 131 | Fwhg=0 132 | Fwtg=0 133 | Fwxc=0 134 | Fwjz=100 135 | FullScreenFlag=false 136 | Bb=86 137 | Dl=false 138 | Fw=\x8ddf\x6253\x7ed3\x675f\x81ea\x52a8\x53d1\x6587 139 | Fwtime=30 140 | ChallengeSuccessContent=\x751f\x304d\x3066\x3044\x308b\x306e\x306a\x3089\x3001\x795e\x69d8\x3060\x3063\x3066\x6bba\x3057\x3066\x307f\x305b\x308b\xff01 141 | ChallengeFailContent=\x541b\x3092\x6bba\x3059\x4e8b\x306a\x3093\x3066\x3001\x3067\x304d\x306a\x3044\x3002 142 | Pra=\x5168\x90e8\x5b57\x6839 143 | Zgver=86 144 | Wro= 145 | Sitem= 146 | Spra= 147 | Snum=0 148 | Bm=true 149 | OpenChartFlag=true 150 | OpenBackground=false 151 | FullScreenBackground=false 152 | StylePriorityFlag=true 153 | AutoChangeAnce=true 154 | RandomChangeSkinFlag=false 155 | SkinRotationFlag=false 156 | RandomSkinStyle= 157 | ImageRotationFlag=false 158 | SkinRotationTime=0 159 | -------------------------------------------------------------------------------- /lua/for_topup.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | 3 | https://github.com/xkjd27/rime_jd27c/blob/e38a8c5d010d5a3933e6d6d8265c0cf7b56bfcca/rime/lua/jd27_topup.lua 4 | 顶功处理器 by TsFreddie 5 | 6 | ------------ 7 | Schema配置 8 | ------------ 9 | 1. 将topup.lua添加至rime.lua 10 | topup_processor = require("topup") 11 | 12 | 2. 将topup_processor挂接在speller之前 13 | processors: 14 | ... 15 | - lua_processor@topup_processor 16 | - speller 17 | ... 18 | 19 | 3. 配置顶功处理器 20 | topup: 21 | topup_with: "aeiov" # 顶功集合码,通常为形码 22 | min_length: 4 # 无顶功码自动上屏的长度 23 | min_length_danzi: 2 # 单字模式无顶功码自动上屏的长度(开关:danzi_mode) 24 | max_length: 6 # 全码上屏的长度 25 | auto_clear: true # 顶功空码时是否清空输入 26 | topup_command: false # 为true时,首码为顶码时禁用顶功逻辑(如orq) 27 | ]] 28 | 29 | local function string2set(str) 30 | local t = {} 31 | for i = 1, #str do 32 | local c = str:sub(i,i) 33 | t[c] = true 34 | end 35 | return t 36 | end 37 | 38 | local function topup(env) 39 | if not env.engine.context:get_selected_candidate() then 40 | if env.auto_clear then 41 | env.engine.context:clear() 42 | end 43 | else 44 | env.engine.context:commit() 45 | end 46 | end 47 | 48 | local function processor(key_event, env) 49 | local engine = env.engine 50 | local schema = engine.schema 51 | local context = engine.context 52 | 53 | local input = context.input 54 | local input_len = #input 55 | 56 | local min_len = env.topup_min 57 | if context:get_option('danzi_mode') then 58 | min_len = env.topup_min_danzi 59 | end 60 | 61 | if key_event:release() or key_event:ctrl() or key_event:alt() then 62 | return 2 63 | end 64 | 65 | local ch = key_event.keycode 66 | 67 | if ch < 0x20 or ch >= 0x7f then 68 | return 2 69 | end 70 | 71 | local key = string.char(ch) 72 | local prev = string.sub(input, -1) 73 | local first = string.sub(input, 1, 1) 74 | if #first == 0 then 75 | first = key 76 | end 77 | 78 | local is_alphabet = env.alphabet[key] or false 79 | local is_topup = env.topup_set[key] or false 80 | local is_prev_topup = env.topup_set[prev] or false 81 | local is_first_topup = env.topup_set[first] or false 82 | 83 | 84 | if env.topup_command and is_first_topup then 85 | return 2 86 | end 87 | 88 | if not is_alphabet then 89 | return 2 90 | end 91 | 92 | if is_prev_topup and not is_topup then 93 | topup(env) 94 | elseif not is_prev_topup and not is_topup and input_len >= min_len then 95 | topup(env) 96 | elseif input_len >= env.topup_max then 97 | topup(env) 98 | end 99 | 100 | return 2 101 | end 102 | 103 | local function init(env) 104 | local config = env.engine.schema.config 105 | 106 | env.topup_set = string2set(config:get_string("topup/topup_with")) 107 | env.alphabet = string2set(config:get_string("speller/alphabet")) 108 | env.topup_min = config:get_int("topup/min_length") 109 | env.topup_min_danzi = config:get_int("topup/min_length_danzi") or env.topup_min 110 | env.topup_max = config:get_int("topup/max_length") 111 | env.auto_clear = config:get_bool("topup/auto_clear") or false 112 | env.topup_command = config:get_bool("topup/topup_command") or false 113 | env.enabled = true 114 | end 115 | 116 | return { init = init, func = processor } -------------------------------------------------------------------------------- /lua/keydo/filters/pending_topup_migration.lua: -------------------------------------------------------------------------------- 1 | local utils = require("utils") 2 | local helpers = require("helpers") 3 | 4 | local is_valid = utils.is_valid 5 | local starts_with = utils.starts_with 6 | local ends_with_code = utils.ends_with_code 7 | local has_cn_chars = utils.has_cn_chars 8 | local get_char = utils.get_char 9 | 10 | local force_commit = helpers.force_commit 11 | 12 | -- 候选过滤器 13 | -- - 历史模式候选项过滤(Rime历史模式允许记录所有输入字符,如标点、表情、英文字母等) 14 | -- - 历史模式候选项去重(Rime自带去重允许历史模式中相邻两项重复一次,即重复连续输入) 15 | -- - 候选项唯一时自动上屏(Rime自带自动上屏只在输入编码与词库编码吻合时才会触发) 16 | local function filter(cand_list, env) 17 | local input = env.engine.context.input -- 输入区字符串 18 | local reverse_dict = env.reverse_dict -- 反查词库 19 | local has_auto_select = env.has_auto_select -- 是否开启自动上屏 20 | local history_leader = env.history_leader -- 历史模式引导键 21 | local phonetics_code = env.phonetics_code -- 音码集合 22 | local stroke_code = env.stroke_code -- 形码集合 23 | 24 | local auto_commit_cand = nil -- 待自动上屏的候选项 25 | local prev_cand_text = nil -- 上一个候选项字符串 26 | local is_history = starts_with(input, history_leader) -- 是否进入历史模式,即输入区是否由历史模式引导键引导 27 | local should_auto_commit = has_auto_select -- 是否优化自动上屏(若自动上屏未开启,则不考虑进一步优化) 28 | local should_handle_key = ends_with_code(input, phonetics_code .. stroke_code) -- 是否为待处理按键(音码或形码) 29 | 30 | -- 判断是否应该自动上屏,即候选项是否唯一 31 | local function handle_auto_commit(cand) 32 | if auto_commit_cand then -- [获取上屏选项]首次有效循环 -> auto_commit_cand = nil,should_auto_commit = true 33 | if should_auto_commit then -- [取消自动上屏]二次有效循环 -> auto_commit_cand = cand,should_auto_commit = true 34 | should_auto_commit = false 35 | end 36 | 37 | return -- [无操作]多次有效循环 -> auto_commit_cand = cand,should_auto_commit = false 38 | end 39 | 40 | auto_commit_cand = cand 41 | 42 | local code = reverse_dict:lookup(auto_commit_cand.text) or "" -- 待自动上屏的候选项编码 43 | 44 | -- 若字词音码未完整输入(即下一位待输入编码仍为音码),则取消自动上屏 45 | if ends_with_code(get_char(code, #input + 1), phonetics_code) then 46 | should_auto_commit = false 47 | end 48 | end 49 | 50 | -- 待遍历的候选项为vector类型,能否将所有过滤器逻辑压缩在用于生成候选项的一次遍历中对渲染速度至关重要 51 | -- https://github.com/rime/librime/blob/master/src/rime/candidate.h#L56 52 | for cand in cand_list:iter() do 53 | -- 若候选项为无效字符串,则跳过(不生成)该候选项 54 | if not is_valid(cand.text) then 55 | goto continue 56 | end 57 | 58 | if is_history then -- 历史模式 59 | -- 确保历史模式中的候选项不是重复项且含有中文字符,否则跳过(不生成)该候选项 60 | if cand.text ~= prev_cand_text and has_cn_chars(cand.text) then 61 | handle_auto_commit(cand) 62 | 63 | prev_cand_text = cand.text 64 | else 65 | goto continue 66 | end 67 | else -- 输入模式 68 | handle_auto_commit(cand) 69 | end 70 | 71 | yield(cand) -- 生成候选项 72 | 73 | ::continue:: 74 | end 75 | 76 | -- 优化自动上屏条件 77 | -- - 当前按键为待处理按键 78 | -- - 优化自动上屏已开启 79 | -- - 待自动上屏的候选项存在 80 | if should_handle_key and should_auto_commit and auto_commit_cand then 81 | force_commit(auto_commit_cand.text, env) 82 | end -- 若按键不产生候选项(数字、标点等)或按键为引导键(等号、分号等),则传递给下个逻辑块 83 | end 84 | 85 | -- 初始化 86 | local function init(env) 87 | local config = env.engine.schema.config 88 | 89 | env.reverse_dict = ReverseDb("build/keydo.reverse.bin") -- 从编译文件中获取反查词库 90 | 91 | env.has_auto_select = config:get_bool("speller/auto_select") or false -- 从设置中读取自动上屏设置 92 | env.history_leader = config:get_string("repeat_history/input") -- 从设置中读取历史模式引导键 93 | env.phonetics_code = config:get_string("topup/phonetics_code") -- 从设置中读取音码集合 94 | env.stroke_code = config:get_string("topup/stroke_code") -- 从设置中读取形码集合 95 | end 96 | 97 | return { init = init, func = filter } 98 | -------------------------------------------------------------------------------- /lua/utils.lua: -------------------------------------------------------------------------------- 1 | local constants = require("constants") 2 | 3 | local castings = constants.castings 4 | 5 | -- 在特定的函数池中,根据函数识别名称运行对应函数 6 | --- @generic K, V 7 | --- @param case_id string 8 | --- @param case_table table 9 | --- @return V 10 | local function switch(case_id, case_table) 11 | local case = case_table[case_id] -- 获取识别名称所对应的函数 12 | 13 | -- 若函数存在,则运行该函数 14 | if case then 15 | return case() 16 | end 17 | 18 | local default_case = case_table['default'] -- 获取默认函数 19 | 20 | -- 若默认函数存在,则运行默认函数,否则不进行任何处理 21 | if default_case then 22 | return default_case() 23 | else 24 | return nil 25 | end 26 | end 27 | 28 | -- 判断字符串是否有效 -> “无效”的定义为“不存在”(`nil`)或者“空项”(`""`) 29 | --- @param text string | nil 30 | --- @return boolean 31 | local function is_valid(text) 32 | -- 若字符串存在,则进一步判断其是否为“空项”(`""`),否则就视为无效 33 | if text then 34 | return text ~= "" 35 | end 36 | 37 | return false 38 | end 39 | 40 | -- 判断字符串是否含有固定前缀 41 | --- @param text string 42 | --- @param prefix string 43 | --- @return boolean 44 | local function starts_with(text, prefix) 45 | return text:sub(1, #prefix) == prefix 46 | end 47 | 48 | -- 判断字符串是否含有固定后缀 49 | --- @param text string 50 | --- @param suffix string 51 | --- @return boolean 52 | local function ends_with(text, suffix) 53 | return text:sub(-#suffix) == suffix 54 | end 55 | 56 | -- 判断编码字符串是否由特定编码结尾 57 | --- @param code string 58 | --- @param code_set string 59 | --- @return boolean 60 | local function ends_with_code(code, code_set) 61 | return is_valid(code:match("[" .. code_set .. "]$")) 62 | end 63 | 64 | -- 判断字符串是否含有中文字符 65 | --- @param text string 66 | --- @return boolean 67 | local function has_cn_chars(text) 68 | -- 遍历字符串中的每一个字符,并在识别到首个中文字符后终止 69 | for pos, code in utf8.codes(text) do 70 | local char = utf8.char(code) -- 当前字符所对应的UTF-8编码 71 | local byte1 = char:byte(1) -- UTF-8编码第一位 72 | local byte2 = char:byte(2) -- UTF-8编码第二位 73 | local byte3 = char:byte(3) -- UTF-8编码第三位 74 | 75 | -- 若UTF-8编码获取失败,则忽略当前字符 76 | if not byte1 or not byte2 or not byte3 then 77 | goto continue 78 | end 79 | 80 | -- 中文字符在Unicode编码中的范围为[0x4E00, 0x9FA5],其在UTF-8编码中所对应的范围为[(228, 184, 128), (233, 190, 165)] 81 | -- 一般而言,任何处在([228, 233], [128, 191], [128, 191])范围内的字符都可以被当作中文字符 82 | -- https://titanwolf.org/Network/Articles/Article?AID=038ec1a2-6ed1-49ac-9bf2-e1b00c376d43 83 | if (byte1 >= 228 and byte1 <= 233) and 84 | (byte2 >= 128 and byte2 <= 191) and 85 | (byte3 >= 128 and byte3 <= 191) 86 | then 87 | return true 88 | end 89 | 90 | ::continue:: 91 | end 92 | 93 | return false 94 | end 95 | 96 | -- 获取字符串中序号位置的字符 97 | --- @param text string 98 | --- @param index number 99 | --- @return string 100 | local function get_char(text, index) 101 | return text:sub(index, index) 102 | end 103 | 104 | -- 获取由特定分隔符分割后的字符串字段集合 105 | --- @param text string 106 | --- @param delimiter string 107 | --- @return table 108 | local function split(text, delimiter) 109 | local result = {}; 110 | 111 | -- 若字符串以分隔符为开头,则将首字段定义为“空项”(`""`) 112 | if (starts_with(text, delimiter)) then 113 | table.insert(result, "") 114 | end 115 | 116 | -- 遍历字符串中的非分隔符字段并逐一将其插入表格 117 | for match in (text .. delimiter):gmatch("([^" .. delimiter .. "]+)") do 118 | table.insert(result, match) 119 | end 120 | 121 | -- 若字符串以分隔符为结尾,则将末字段定义为“空项”(`""`) 122 | if (ends_with(text, delimiter)) then 123 | table.insert(result, "") 124 | end 125 | 126 | return result; 127 | end 128 | 129 | -- 在特定的变换池中,根据映射规则将罗马数字替换为中文字符 130 | --- @param text string 131 | --- @param digits table 132 | --- @return string 133 | local function to_cn_digits(text, digits) 134 | -- 全局逐一获取并替换罗马数字为中文字符 135 | local cn_digits = text:gsub(".", function(char) 136 | -- 若对应中文字符不存在,则不进行替换 137 | return digits[tonumber(char)] or char 138 | end) 139 | 140 | return cn_digits 141 | end 142 | 143 | -- 在特定的变换池中,根据映射规则将罗马数字替换为中文数字 144 | --- @param text string 145 | --- @param is_formal? boolean 146 | --- @return string 147 | local function to_cn_number(text, is_formal) 148 | local delimiter = "." 149 | local number_segs = split(text, delimiter) 150 | local segs_size = #number_segs 151 | 152 | if (segs_size ~= 1 and segs_size ~= 2) then 153 | return text 154 | end 155 | 156 | local integral = number_segs[1] 157 | local integral_size = #integral 158 | local fractional = number_segs[2] 159 | 160 | local index = 1 161 | local digit_index = integral_size - index + 1 162 | 163 | local integral_cn = integral:gsub(".", function(digit) 164 | return digit 165 | end) 166 | 167 | return text .. castings.number_symbols[delimiter] .. to_cn_digits(fractional, castings.number_digits_verbal) 168 | end 169 | 170 | -- 在特定的变换池中,根据映射规则将罗马数字替换为中文货币 171 | --- @param text string 172 | --- @return string 173 | local function to_cn_currency(text) 174 | local number_segs = split(text, ".") 175 | 176 | return text 177 | end 178 | 179 | return { 180 | switch = switch, 181 | is_valid = is_valid, 182 | starts_with = starts_with, 183 | ends_with = ends_with, 184 | ends_with_code = ends_with_code, 185 | has_cn_chars = has_cn_chars, 186 | get_char = get_char, 187 | split = split, 188 | to_cn_digits = to_cn_digits, 189 | to_cn_number = to_cn_number, 190 | to_cn_currency = to_cn_currency 191 | } 192 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | alex.g.huang@gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /keydo.chars_extra.dict.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: keydo.chars_extra 3 | version: "1.0" 4 | sort: original 5 | ... 6 | 猋 bcvuv 7 | 嫑 bcvuvi 8 | 猋 bcvuvu 9 | 兡 bhkeuo 10 | 誧 bjovvi 11 | 𬷕 bjviu 12 | 𬷕 bjviua 13 | 夶 bkvuv 14 | 夶 bkvuvu 15 | 𬭛 blioa 16 | 𬭛 blioaa 17 | 𫚖 ckivu 18 | 𫚖 ckivua 19 | 壿 cwvo 20 | 壿 cwvoou 21 | 瑽 cyvvuu 22 | 弔 dcava 23 | 弔 dcavai 24 | 𫶇 ddiav 25 | 𫶇 ddiavi 26 | 𬘘 dfaa 27 | 𬘘 dfaaoa 28 | 𫢸 dfio 29 | 𫢸 dfioui 30 | 呾 dfooiv 31 | 𬊤 dfouo 32 | 𬊤 dfouou 33 | 𬭊 djiov 34 | 𬭊 djiovv 35 | 𬱖 dkiavu 36 | 𬤊 dkoaoi 37 | 𬍡 dpaa 38 | 𬍡 dpaavv 39 | 𫟼 dsiov 40 | 𫟼 dsiovu 41 | 呾 dsooiv 42 | 龘 dsovo 43 | 龘 dsovov 44 | 墫 dwvoo 45 | 墫 dwvoou 46 | 𬟽 dyiava 47 | 𪨶 eeiav 48 | 𪨶 eeiavu 49 | 𫮃 efvoou 50 | 𬬸 ejio 51 | 𬬸 ejiovo 52 | 兙 ekkeuo 53 | 𬤊 ekoaoi 54 | 𫚕 ekuaiu 55 | 𬳽 enaau 56 | 𬳽 enaauv 57 | 𬬹 enio 58 | 𬬹 enioia 59 | 𫔍 ffiou 60 | 𫔍 ffiouo 61 | 𬸪 ffuou 62 | 𬸪 ffuoua 63 | 蝜 fjiaua 64 | 𫓧 fjiov 65 | 𫓧 fjiovv 66 | 𫖯 fjuovu 67 | 𫄨 fkaauo 68 | 蹠 fkoiov 69 | 㩼 fkuauo 70 | 𬃊 fkvuuu 71 | 𬸦 flovu 72 | 𬸦 flovua 73 | 𮝷 fnva 74 | 𮝷 fnvauo 75 | 甴 fsia 76 | 𬬿 fzioa 77 | 𬬿 fzioau 78 | 𬶐 fzua 79 | 𬶐 fzuauo 80 | 佮 geiivo 81 | 𬕂 gfuvvi 82 | 𬮿 ghaii 83 | 𬮿 ghaiia 84 | 巭 gjviv 85 | 巭 gjvivv 86 | 𬇹 glai 87 | 𬇹 glaiav 88 | 菓 glii 89 | 菓 gliiia 90 | 㹴 grua 91 | 㹴 gruavi 92 | 𬒔 grvu 93 | 𬒔 grvuiv 94 | 兝 gyfnuo 95 | 𬕂 gyuvv 96 | 𬕂 gyuvvi 97 | 𬤝 hboavi 98 | 𬭤 hdio 99 | 𬭤 hdioia 100 | 𬌗 heva 101 | 𬌗 hevaiv 102 | 𬴃 hlaa 103 | 𬴃 hlaavv 104 | 𬣳 hnoaa 105 | 𬣳 hnoaav 106 | 椛 hqviii 107 | 𬘫 htaao 108 | 𬘫 htaaoo 109 | 𬭶 hwio 110 | 𬭶 hwioia 111 | 𫟹 hyio 112 | 𬭎 hyioo 113 | 𬭎 hyiooo 114 | 𫟹 hyiovi 115 | 兞 hzkeuo 116 | 䜰 hzuoui 117 | 𬬱 jbiouu 118 | 苂 jfiiou 119 | 𬊤 jfouo 120 | 𬊤 jfouou 121 | 丼 jgvvoo 122 | 𫘝 jhaa 123 | 𫘝 jhaaav 124 | 𫔎 jhioao 125 | 𬺓 jjiv 126 | 𬺓 jjivvv 127 | 𬯀 jkaio 128 | 𬯀 jkaiov 129 | 𬶨 jkavua 130 | 𫓯 jkiov 131 | 𫓹 jkiovi 132 | 𫓯 jkiovo 133 | 𫚖 jkivu 134 | 𫚖 jkivua 135 | 𫌀 jkoavv 136 | 𬶭 jkuaua 137 | 檵 jkvaao 138 | 𪟝 jkvva 139 | 𪟝 jkvvau 140 | 𬶋 jluau 141 | 𬶋 jluaua 142 | 𬣡 jmoavv 143 | 𬘭 jnaa 144 | 𬘭 jnaavv 145 | 𬬮 jpiouv 146 | 嗧 jslwau 147 | 𬂩 jsvvou 148 | 𫓶 jtioou 149 | 奆 jtvuva 150 | 𫖳 jwavv 151 | 𫖳 jwavvu 152 | 𬭚 jwioo 153 | 𬭚 jwioov 154 | 𬳶 jyaai 155 | 𬳶 jyaaia 156 | 𫠆 kbuo 157 | 𫠆 kbuovu 158 | 𫸩 kda 159 | 𫸩 kdavvu 160 | 𫛭 kxua 161 | 𫛭 kxuaua 162 | 𬘭 lbaa 163 | 𬴊 lbaao 164 | 𬴊 lbaaou 165 | 𬘭 lbaavv 166 | 𬭸 lbioo 167 | 𬭸 lbioou 168 | 𪤗 lcvo 169 | 𪤗 lcvoao 170 | 𫚭 ldua 171 | 𫚭 lduaaa 172 | 𪣻 ldvoo 173 | 𪣻 ldvoou 174 | 𬒗 lfvu 175 | 𬒗 lfvuii 176 | 𫵷 lhiavu 177 | 𫘧 ljaaa 178 | 𫘧 ljaaav 179 | 𬬻 ljioi 180 | 𬬻 ljioiv 181 | 𫵷 lkiavu 182 | 兣 lkkeuo 183 | 糎 lkmkou 184 | 𬍛 lkvvua 185 | 𬶠 lmuav 186 | 𬶠 lmuavi 187 | 瑠 lqvvua 188 | 𬶟 lsua 189 | 𬶟 lsuavi 190 | 𬬭 lwioi 191 | 𬬭 lwioiu 192 | 𫭢 lwvoi 193 | 𫭢 lwvoiu 194 | 𫟅 lxaao 195 | 𫟅 lxaaov 196 | 𬜯 lxiiv 197 | 𬜯 lxiivi 198 | 𬕂 lyuvv 199 | 𬕂 lyuvvi 200 | 䜮 lzuooo 201 | 𫭼 lzvo 202 | 𫭼 lzvoii 203 | 𬇕 mfav 204 | 𬇕 mfavau 205 | 𬜬 mfiio 206 | 𬜬 mfiioi 207 | 鿏 mhio 208 | 鿏 mhiovv 209 | 𬭁 mjioa 210 | 𬭁 mjioaa 211 | 𬙊 mlaa 212 | 𬙊 mlaaia 213 | 尛 mliuiu 214 | 𫞩 mnvv 215 | 𫞩 mnvvii 216 | 𫑡 mroa 217 | 𫑡 mroaii 218 | 槑 mwovo 219 | 槑 mwovov 220 | 冇 mzvuia 221 | 𫔶 ndoiu 222 | 𫔶 ndoiui 223 | 𫠜 nkiv 224 | 𫠜 nkivui 225 | 𫐐 nkva 226 | 𫐐 nkvaui 227 | 鲶 nmuaio 228 | 挊 nyiu 229 | 挊 nyiuiv 230 | 𬪩 nyvi 231 | 𬪩 nyvioa 232 | 𬞟 pbii 233 | 𬞟 pbiiiv 234 | 𬭯 pdio 235 | 𬭯 pdioou 236 | 𬳵 pkaav 237 | 𬳵 pkaavu 238 | 蚍 pkiava 239 | 𬇙 pwaao 240 | 𬇙 pwaaoo 241 | 骹 qciaov 242 | 𫗴 qfuao 243 | 𫗴 qfuaov 244 | 𬘬 qgaa 245 | 𬘬 qgaavv 246 | 𬒈 qhoovu 247 | 礐 qhuivu 248 | 𬣞 qjoao 249 | 𬣞 qjoaoo 250 | 𬮿 qkaii 251 | 𬮿 qkaiia 252 | 炁 qkvao 253 | 炁 qkvaoo 254 | 𬨂 qkvau 255 | 𬨂 qkvaua 256 | 𪨰 qliaia 257 | 𬘬 qmaav 258 | 𬘬 qmaavv 259 | 兛 qmkeuo 260 | 粁 qmmkou 261 | 瓩 qmwsva 262 | 姫 qnau 263 | 姫 qnauvi 264 | 𬘬 qraa 265 | 𬘬 qraavv 266 | 𬘯 qwaa 267 | 𬘯 qwaaov 268 | 𬬿 qzioa 269 | 𬬿 qzioau 270 | 𬶐 qzua 271 | 𬶐 qzuauo 272 | 𫐓 rdva 273 | 𫐓 rdvaao 274 | 叒 rlao 275 | 叒 rlaoao 276 | 𬭼 sbio 277 | 𬭼 sbioou 278 | 𫟦 sbva 279 | 𫟦 sbvaou 280 | 𫗧 sjuavi 281 | 亖 skvvv 282 | 亖 skvvvv 283 | 惢 sloaoa 284 | 𪨊 syav 285 | 𪨊 syavii 286 | 𬯎 tbai 287 | 𬯎 tbaiia 288 | 𬘩 tgaa 289 | 𬘩 tgaauv 290 | 𡘙 thvu 291 | 𡘙 thvuvu 292 | 𬳿 tjaa 293 | 𬳿 tjaaiv 294 | 𫘨 tkaaoi 295 | 薙 tkiiu 296 | 薙 tkiiuv 297 | 鼍 tloo 298 | 鼍 tloooi 299 | 𬶍 tluao 300 | 𬶍 tluaoo 301 | 𫍣 tyoai 302 | 𫍣 tyoaia 303 | 𫘦 tzaaua 304 | 𬘫 wfaao 305 | 𬘫 wfaaoo 306 | 卍 wfaivi 307 | 𬇕 wfav 308 | 𬇕 wfavau 309 | 卐 wfaviv 310 | 喎 whoiaa 311 | 𫄨 wkaau 312 | 𫄨 wkaauo 313 | 翄 wkao 314 | 翄 wkaouo 315 | 𫘜 wnaao 316 | 𫘜 wnaaov 317 | 歘 wqou 318 | 歘 wqouua 319 | 𬭩 wrio 320 | 𬭩 wriouo 321 | 𫇭 wwiio 322 | 𫇭 wwiiou 323 | 𬭬 wwiov 324 | 𬭬 wwiovv 325 | 𬀩 wwoivv 326 | 𬶏 wwuau 327 | 𬶏 wwuaua 328 | 𬱟 wwuavu 329 | 𫷷 xbovi 330 | 𫷷 xbovio 331 | 枔 xbvioa 332 | 𫍲 xcoau 333 | 𫍲 xcoaui 334 | 敩 xcoou 335 | 敩 xcoouv 336 | 𬹼 xdivi 337 | 𬹼 xdiviu 338 | 𬉼 xdouvu 339 | 𫭟 xdvo 340 | 𫭟 xdvovu 341 | 𫫇 xeovi 342 | 𫫇 xeovii 343 | 𫰛 xgaua 344 | 𫰛 xgauao 345 | 𬮿 xhai 346 | 𬮿 xhaiia 347 | 𫘬 xkaau 348 | 𫘬 xkaauo 349 | 𬭳 xkiov 350 | 𬭳 xkiovo 351 | 𬶮 xkuavo 352 | 卌 xkviii 353 | 𬣙 xloav 354 | 𬣙 xloavv 355 | 歘 xlouua 356 | 𫄧 xmaaui 357 | 𪾢 xmiaia 358 | 𫍯 xmoavu 359 | 𬀪 xmoii 360 | 𬀪 xmoiia 361 | 𬸣 xmooua 362 | 𫠊 xtaao 363 | 𫠊 xtaaov 364 | 𫓶 xtioou 365 | 𫍽 xtoaia 366 | 譞 xtovi 367 | 譞 xtovia 368 | 𬘓 xwaaui 369 | 𫄸 xwaauv 370 | 𬩽 xwava 371 | 𬩽 xwavai 372 | 𬊈 xwou 373 | 𬊈 xwouav 374 | 𬍤 xwvva 375 | 𬍤 xwvvav 376 | 𬙋 xxaaov 377 | 𬘡 ybaai 378 | 𬘡 ybaaia 379 | 苂 ybiiou 380 | 𬤇 yboavi 381 | 𬮱 yboiv 382 | 𬮱 yboivi 383 | 烎 ybvvou 384 | 甴 ydia 385 | 甴 ydiavi 386 | 𬨎 ydva 387 | 𬨎 ydvaou 388 | 嘢 yeoiav 389 | 鵺 yeovui 390 | 𬙂 yfaaoo 391 | 𫄧 yfaau 392 | 𫄧 yfaaui 393 | 𪩘 yfiauo 394 | 昖 yfoiuo 395 | 喦 yfooia 396 | 𬸘 yfvoua 397 | 桜 ygvo 398 | 桜 ygvoou 399 | 曱 yhia 400 | 曱 yhiavv 401 | 𬸚 yhua 402 | 𬸚 yhuaua 403 | 𫐄 yhva 404 | 𫐄 yhvavu 405 | 𫄷 ykaaov 406 | 𫖮 ykiavu 407 | 𬟁 ykiivo 408 | 𬬩 ykiova 409 | 𬺈 ykivv 410 | 𬺈 ykivvu 411 | 弌 ykvvao 412 | 犽 ysuava 413 | 𫘪 ytaav 414 | 𫘪 ytaavu 415 | 円 ytiaiv 416 | 橒 ywvvoa 417 | 垚 yzvvvv 418 | 囃 zsovii 419 | 墫 zwvo 420 | 墫 zwvoou 421 | 𭎂 zyvo 422 | 𭎂 zyvoii 423 | -------------------------------------------------------------------------------- /keydo.schema.yaml: -------------------------------------------------------------------------------- 1 | # 键道·我流默认设置 2 | # encoding: utf-8 3 | 4 | # 输入方案概要 5 | schema: 6 | schema_id: keydo # 方案识别名称(用于代码引用) 7 | name: 键道·我流 # 方案显示名称(用于方案切换) 8 | version: "1.0" # 版本号 9 | author: # 方案作者(在Rime中勾选方案时会予以显示) 10 | - 奠基者 - 大牛(吅吅大山) 11 | - 求道者 - SPHS 12 | description: | # 方案描述(在Rime中勾选方案时会予以显示) 13 | 「键道·我流」是一款脱胎于「星空键道」的音形码顶功输入方案。 14 | 15 | 该方案基于Colemak-DH Matrix布局,并对简码及词库进行了大幅优化。 16 | 17 | 18 | # 候选项菜单 19 | menu: 20 | page_size: 2 # 候选项显示个数 21 | 22 | 23 | # 模式切换开关 24 | switches: 25 | - name: ascii_mode # 中英文切换(默认中文) 26 | reset: 0 27 | states: ["中", "英"] 28 | - name: full_shape # 全角半角切换(默认半角) 29 | reset: 0 30 | states: ["半角", "全角"] 31 | - name: extended_charset # CJK字符集切换(默认全字符集) 32 | reset: 1 33 | states: ["常用", "扩展"] 34 | 35 | 36 | # 输入方案引擎 37 | engine: 38 | processors: # 处理器 -> 响应按键并按照预设的规则依次进行编码处理 39 | - ascii_composer # 与`ascii_segmentor`搭配,处理英文模式下的输入编码 40 | - recognizer # 与matcher搭配,处理特定结构的编码(计算器、编码反查等) 41 | - key_binder # 绑定按键并赋予功能(或重新定义按键本身) 42 | - lua_processor@topup_processor # 顶功处理器 -> 判断是否顶功与顶功的内容(顶功逻辑应优先于`speller`逻辑) 43 | - lua_processor@keydo_select_processor # 选择处理器 -> 使特定按键可以选择特定候选项(单引号、斜杠等) 44 | - speller # 将输入编码根据拼写运算规则编辑输入区 45 | - punctuator # 与`punct_segmentor`搭配,将特定按键映射为标点符号(逗号、句号等) 46 | - selector # 将特定按键映射为选择键(数字键、上/下方向键、`PageUp`/`PageDown`等) 47 | - navigator # 使特定按键可以移动输入区中的光标(左/右方向键等) 48 | - express_editor # 将特定按键映射为编辑键(空格、回车、回退键等) 49 | segmentors: # 分段器 -> 将输入编码根据结构进行段落划分与标记 50 | - ascii_segmentor # 标记英文段落,使字母在英文模式下直接上屛 51 | - matcher # 与`recognizer`搭配,标记符合特定规则的段落(计算器、编码反查等) 52 | - abc_segmentor # 标记常规的文字段落(默认标识为`abc`) 53 | - punct_segmentor # 标记标点符号等句读段落(默认标识为`punct`) 54 | - fallback_segmentor # 标记其他未识别段落 55 | translators: # 转换器 -> 将划分好的编码段转换为对应候选项 56 | - punct_translator # 句读转换器 -> 根据标点符号配置将特定按键映射为标点符号 57 | - history_translator@repeat_history # 历史转换器 -> 储存或调取历史输入候选项 58 | - table_translator@char_lookup # 码表转换器 -> 通过编码查询词库(基于输入方案本身) 59 | - lua_translator@keydo_date_time_translator # 日期与时间转换器 -> 获取当前日期与时间 60 | - lua_translator@number_translator # 数字转换器 -> 将阿拉伯数字转换为对应汉字或进行运算 61 | filters: # 过滤器 -> 将转换好的候选项进行过滤(增删改查) 62 | - uniquifier # 去重过滤器 -> 过滤重复的候选项(历史模式中相邻两项可重复一次,即重复连续输入) 63 | - lua_filter@keydo_cand_filter # 优化唯一项自动上屏以及历史模式中的候选项过滤与去重 64 | - reverse_lookup_filter@char_lookup # 反查过滤器 -> 用特定码表来反查词库中的编码 65 | 66 | 67 | # 布局配置,方便其它配置进行调取 68 | layout: 69 | topup: # 顶功规则 70 | phonetics_code: "bcdefghjklmnpqrstwxyz" # 音码集合 71 | stroke_code: "aiouv" # 形码集合 72 | topup_this: "bcdefghjklmnpqrstwxyz" # 顶功对象编码集,通常为音码 73 | topup_with: "aiouv;" # 顶功触发编码集合,通常为形码 74 | algebra: # 核心拼写运算规则 75 | - derive/^[bcdefghjklmnpqrstwxyz;]([bcdefghjklmnpqrstwxyz;][aiouv].*)$/`$1/ # ssb(...) -> `sb(...) 76 | - derive/^([bcdefghjklmnpqrstwxyz;])[bcdefghjklmnpqrstwxyz;]([aiouv].*)$/$1`$2/ # ssb(...) -> s`b(...) 77 | - derive/^([bcdefghjklmnpqrstwxyz;`]{2})[aiouv](.*)$/$1`$2/ # ssb(...) / `sb(...) / ``b(...) -> ss`(...) / `s`(...) / ```(...) 78 | - derive/^([bcdefghjklmnpqrstwxyz;`]{2}[aiouv`]).(.*)$/$1`$2/ # ssb?(...) / `sb?(...) / ``b?(...) / ```?(...) -> ssb`(...) / `sb`(...) / ``b`(...) / ````(...) 79 | - derive/^([bcdefghjklmnpqrstwxyz;`]{2}[aiouv`]{2}).(.*)$/$1`$2/ # ssbb?(...) / `sbb?(...) / ``bb?(...) / ```b?(...) / ````?(...) -> ssbb`(...) / `sbb`(...) / ``bb`(...) / ```b`(...) / `````(...) 80 | - derive/^([bcdefghjklmnpqrstwxyz;`]{2}[aiouv`]{3}).(.*)$/$1`$2/ # ssbbb?(...) / `sbbb?(...) / ``bbb?(...) / ```bb?(...) / ````b?(...) / `````?(...) -> ssbbb`(...) / `sbbb`(...) / ``bbb`(...) / ```bb`(...) / ````b`(...) / ``````(...) 81 | - derive/^([bcdefghjklmnpqrstwxyz;`]{2}[aiouv`]{4}).(.*)$/$1`$2/ # ssbbbb?(...) / `sbbbb?(...) / ``bbbb?(...) / ```bbb?(...) / ````bb?(...) / `````b?(...) / ``````?(...) -> ssbbbb`(...) / `sbbbb`(...) / ``bbbb`(...) / ```bbb`(...) / ````bb`(...) / `````b`(...) / ```````(...) 82 | - derive/^([bcdefghjklmnpqrstwxyz;`]{2}[aiouv`]{5}).$/$1`/ # ssbbbbb? / `sbbbbb? / ``bbbbb? / ```bbbb? / ````bbb? / `````bb? / ``````b? / ```````? -> ssbbbbb` / `sbbbbb` / ``bbbbb` / ```bbbb` / ````bbb` / `````bb` / ``````b` / ```````` 83 | - derive/^[bcdefghjklmnpqrstwxyz;]{2}([aiouv`]*)$/``$1/ # ss(b...) / ss(`...) -> ``(b...) / ``(`...) 84 | 85 | 86 | # 判断是否顶功与顶功的内容 87 | topup: 88 | __include: "layout/topup" # 导入顶功规则 89 | min_length: 4 # 编码自动上屏的最小长度(无顶功触发编码) 90 | max_length: 6 # 编码自动上屏的最大长度(全码) 91 | auto_clear: true # 顶功如遇空码时,是否清空输入区 92 | topup_command: true # 首码为顶功触发编码时,是否禁用顶功逻辑 93 | 94 | 95 | # 截取特定结构的编码传递给下个逻辑块(避免某些按键直接上屏/清空输入区字符串) 96 | recognizer: 97 | patterns: # 配合`segmentor`的`prefix`和`suffix`完成段落划分与标记 98 | calculator: "^=[^;']+$" # 计算器 99 | char_lookup: "[a-z`]*`+[a-z`]*" # 编码反查 100 | 101 | 102 | # 根据拼写运算规则编辑输入区 103 | speller: 104 | algebra: # 核心拼写运算规则(编译后会写入`build`文件夹中的`prism`文件) 105 | __include: "layout/algebra" # 导入拼写运算规则 106 | auto_select: true # 是否开启无重码时自动上屏(仅在编码吻合时判断) 107 | alphabet: "abcdefghijklmnopqrstuvwxyz;/=`" # 待监听的按键 108 | initials: "abcdefghijklmnopqrstuvwxyz;/=`" # 待监听的首位按键(引导键) 109 | 110 | 111 | # 将特定字符映射为标点符号或文字处理句读键、数字键 112 | punctuator: 113 | import_preset: keydo.punct # 导入标点符号配置 114 | 115 | 116 | # 将划分好的编码段转换为对应候选项 117 | translator: 118 | dictionary: keydo # 指定转换器所使用的词库 119 | enable_charset_filter: false # 是否开启字符集过滤 120 | enable_completion: true # 是否提前显示尚未输入完整编码的字 121 | enable_encoder: false # 是否开启自动造词 122 | enable_sentence: false # 是否开启自动造句 123 | enable_user_dict: false # 是否开启用户词库(用于记录动态字词频) 124 | encode_commit_history: false # 是否对已上屛的词进行自动成词 125 | max_phrase_length: 6 # 最大自动成词词长 126 | 127 | 128 | # 储存或调取历史输入候选项 129 | repeat_history: 130 | input: / # 历史模式引导键 131 | size: 100 # 历史输入候选项储存量 132 | initial_quality: 10000 # 转换结果优先级 133 | 134 | 135 | # 通过编码查询词库(基于输入方案本身) 136 | char_lookup: 137 | dictionary: keydo # 指定编码查询所使用的词库 138 | tags: [char_lookup] # 指定编码查询所对应的标识 139 | overwrite_comment: true # 是否允许覆写编码提示 140 | enable_charset_filter: false # 是否开启字符集过滤 141 | enable_completion: true # 是否提前显示尚未输入完整编码的字 142 | enable_encoder: false # 是否开启自动造词 143 | enable_sentence: false # 是否开启自动造句 144 | enable_user_dict: false # 是否开启用户词库(用于记录动态字词频) 145 | encode_commit_history: false # 是否对已上屛的词进行自动成词 146 | comment_format: # 指定编码提示格式 147 | - xform/^~[a-z;]+// # 移除以`~`为前缀的逐码提示 148 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 键道·我流 2 | 3 | 星空键道 4 | 5 | [![小狼毫(Win)](https://img.shields.io/badge/%E5%B0%8F%E7%8B%BC%E6%AF%AB%EF%BC%88Win%EF%BC%89-v0.16.3-blue)](https://github.com/rime/weasel/releases/tag/0.16.3) [![鼠须管(Mac)](https://img.shields.io/badge/%E9%BC%A0%E9%A1%BB%E7%AE%A1%EF%BC%88Mac%EF%BC%89-v0.17.2-orange)](https://github.com/LEOYoon-Tsaw/squirrel/releases/tag/0.17.2) 6 | 7 | `键道·我流`是一款脱胎于[星空键道]的音形码顶功输入方案。该方案基于[Colemak-DH Matrix布局]并通过[Rime开源输入平台]得以实现。 8 | 9 | ![Colemak-DH Matrix Layout](https://github.com/pingshunhuangalex/rime-xkjd-docs/blob/main/.gitbook/assets/xkjd-colemak-dh-matrix.png) 10 | 11 | 作为一款独立的输入方案,用户只需在[下载安装Rime]后将本仓库覆盖于`Rime用户文件夹`,便可无需配置立即使用`键道·我流`。 12 | 13 | 想要进一步了解这款优雅的中文输入方案?先看看我自制的[Rime键道输入法文档]吧! 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 | - 移除完全由简码字词(不包括完全由一级简码单字组成的二字与三字词组)组成的多字词组(无论码长是否增加) 42 | 43 | - 在多字词组本身不是成语或专有名词的情况下,移除完全由三字词组与任意简码组成的多字词组(无论码长是否增加) 44 | 45 | - 移除特殊简码词组所对应的声韵编码词组以节省声韵编码空间(关闭630提示) 46 | 47 | - 在码长没有缩短的情况下(含上屏用空格或次码编码),优先采用简码编码形式或直接拆分为单字进行输入以节省声韵编码空间 48 | 49 | - 如单字为一级简码,则在声韵编码空间只保留其所对应的声韵全码编码 50 | 51 | - 避免将衔接词(不包括完全由一级简码组成的词组)编入特殊简码(优先使用二级简码) 52 | 53 | - 避免将网络用语(例如烂梗,谐音和火星文等)和专有名词编入任意简码 54 | 55 | - 为特殊简码添加次选,且允许使用形码作为首码,从而将编码空间从630(`21 * 5 + 21 * 5 * 5 = 630`)扩充至1560(`(26 * 5 + 26 * 5 * 5) * 2 = 1560`) 56 | 57 | - 在简码后直接连接特殊简码情况下,可无需空格直接输入 58 | 59 | ## 词库删改逻辑 60 | 61 | - 审核改动字词是否为合理的汉语字词且具有复用性与时效性(应尽量避免网络用语,例如烂梗,谐音和火星文等),尊崇“少既是多”的原则而非盲目占用编码空间(怪词废词越多,顶功效率越差) 62 | 63 | - 将改动字词根据其性质与输入方式归类到相应词库 64 | 65 | - 尽可能在次选编码位置收录与首选相同结构的词组(无论码长是否增加) 66 | 67 | - 在码长没有明显降低(三字或多字词组)的情况下,避免将泛用型前后缀(如`不`,`的`等)编入词组以避免编码膨胀 68 | 69 | - 避免将数字、量词与名词同时编入词组来减少编码膨胀(不包括固定搭配或意义抽象) 70 | 71 | - 避免收录通过重复叠加形成的多字词组来减少编码膨胀(无论码长是否增加) 72 | 73 | - 在出现字词编码长度超出其默认编码长度两位以上时,尽可能利用编码次选位置来降低平均码长 74 | 75 | - 根据使用频率调整字词顺序 76 | - 优先提升高频字词在其所在区域的顺位(无论同区域低频字词的码长是否会膨胀) 77 | - 在四周字词具有相似使用频率的情况下,调整字词的顺序使该区域的平均码长尽可能降低 78 | - 在候选字词具有相似使用频率的情况下,应遵循`衔接词 > 常用动词 > 常用名词 > 含数量词 > 文书用词 > 专有名词`的规则来调整字词的顺序 79 | 80 | - 如衔接词由衔接字与独立二字词组(非衔接词)组成时,尽可能将其分配在首个形码的编码位置 81 | - 别(`bd`) 82 | - 并(`bg`) 83 | - 不(`bj`) 84 | - 但(`df`) 85 | - 还(`hh`) 86 | - 却(`qh`) 87 | - 所(`sl`) 88 | - 也(`ye`) 89 | - 越(`yh`) 90 | - 再(`zh`) 91 | 92 | - 如形容词由层级前缀与二字形容词(可含`的`后缀)组成时,尽可能将其分配在首个形码的编码位置 93 | - 怪(`gg`) 94 | - 过(`gl`) 95 | - 更(`gr`) 96 | - 很(`hn`) 97 | - 好(`hz`) 98 | - 超(`jz`) 99 | - 蛮(`mf`) 100 | - 真(`qn`) 101 | - 挺(`tg`) 102 | - 太(`th`) 103 | - 许(`xl`) 104 | - 最(`zb`) 105 | 106 | - 如名词由二字名词与特定前后缀组成时,尽可能将其分配在首个形码的编码位置 107 | - 度(`dj`) 108 | - 者(`fe`) 109 | - 工(`gy`) 110 | - 家(`js`) 111 | - 性(`xg`) 112 | 113 | - 如状语由二字动词或名词与介词组成时,尽可能将其分配在首个形码的编码位置 114 | - 中(`fy`) 115 | - 后(`hd`) 116 | - 里(`lk`) 117 | 118 | - 如俗语由二字动词与特定后缀组成时,尽可能将其分配在首个形码的编码位置 119 | - 点(`dm`) 120 | 121 | - 尽可能使词组中单字的首、次选位置与词组本身的首、次选位置相对应 122 | 123 | - 尽可能使相同结构的词拥有相同的编码长度(优先对应并分配在首个形码的编码位置) 124 | - 词组如能同时与`办`与`搬`搭配,则确保相应词组顺序为`办`,然后才是`搬` 125 | - 词组如能同时与`不`、`别`与`被`搭配,则确保相应词组顺序为`不`,`别`,最后才是`被` 126 | - 词组如能同时与`大`、`多`、`低`与`对`搭配,则确保相应词组顺序为`大`,`多`,`低`,最后才是`对` 127 | - 词组如能同时与`得`、`地`与`的`搭配,则确保相应词组顺序为`得`,`地`,最后才是`的` 128 | - 词组如能同时与`爽`、`少`与`深`搭配,则确保相应词组顺序为`爽`,`少`,最后才是`深` 129 | - 词组如能同时与`高`与`贵`搭配,则确保相应词组顺序为`高`,然后才是`贵` 130 | - 词组如能同时与`好`与`很`搭配,则确保相应词组顺序为`好`,然后才是`很` 131 | - 词组如能同时与`花`与`划`搭配,则确保相应词组顺序为`花`,然后才是`划` 132 | - 词组如能同时与`进`与`出`搭配,则确保相应词组顺序为`进`,然后才是`出` 133 | - 词组如能同时与`近`、`急`、`长`与`久`搭配,则确保相应词组顺序为`近`,`急`,`长`,最后才是`久` 134 | - 词组如能同时与`快`与`宽`搭配,则确保相应词组顺序为`快`,然后才是`宽` 135 | - 词组如能同时与`买`与`卖`搭配,则确保相应词组顺序为`买`,然后才是`卖` 136 | - 词组如能同时与`男`与`女`搭配,则确保相应词组顺序为`男`,然后才是`女` 137 | - 词组如能同时与`那`与`哪`搭配,则确保相应词组顺序为`那`,然后才是`哪` 138 | - 词组如能同时与`他`、`她`与`它`搭配,则确保相应词组顺序为`他`,`她`,最后才是`它` 139 | - 词组如能同时与`疼`、`痛`与`甜`搭配,则确保相应词组顺序为`疼`,`痛`,最后才是`甜` 140 | - 词组如能同时与`吃`与`玩`搭配,则确保相应词组顺序为`吃`,然后才是`玩` 141 | - 词组如能同时与`想`与`像`搭配,则确保相应词组顺序为`想`,然后才是`像` 142 | - 词组如能同时与`小`、`新`与`响`搭配,则确保相应词组顺序为`小`,`新`,最后才是`响` 143 | - 词组如能同时与`学`与`爱`搭配,则确保相应词组顺序为`学`,然后才是`爱` 144 | - 词组如能同时与`有`与`一`搭配,则确保相应词组顺序为`有`,然后才是`一` 145 | - 词组如能同时与`在`与`再`搭配,则确保相应词组顺序为`在`,然后才是`再` 146 | 147 | - 查看飞键的可行性,但在词库中只保留手感最佳的飞键方案(避免无名指、小指与同手) 148 | - `chao`(`jz`) 149 | - `che`(`we`) 150 | - `zhai`(`fh`) 151 | - `zhao`(`fz`) 152 | - `zhe`(`fe`) 153 | - `uang`(与声母不同手的`m`或`x`) 154 | 155 | - 查看词组中是否存在多音单字 156 | - 如读音变化不影响其含义(方言或口语读音),则在词库中只保留手感最佳的读音方案(避免无名指、小指与同手),但在单字中仍保留所有读音所对应的编码 157 | - 熟(`ed`) 158 | - 谁(`ew`) 159 | - 这(`fe`) 160 | - 尿(`nc`) 161 | - 那(`ns`) 162 | - 哪(`ns`) 163 | - 血(`xh`) 164 | - 如不同的读音对应的含义不同,则遵循并保留其正确读音所对应的编码 165 | - 地(`de`,`dk`) 166 | - 得(`de`,`dw`) 167 | - 说(`eb`,`el`) 168 | - 着(`fe`,`fl`) 169 | - 卡(`ks`,`qs`) 170 | 171 | - 确保单字与词组词库中不含有繁体字(无对应简体字的生僻字除外) 172 | 173 | - 确保所有单字(无论使用简码与否)均保留了其对应的全码编码 174 | 175 | - 测试编码的实际使用情况,确保编码无误且输入效率与可读性没有降低 176 | 177 | ## 极速跟打器 178 | 179 | 以新构建的词库为蓝本,本仓库将会同步更新「极速跟打器」所使用的[编码文件]以保证词库在实际应用中的有效性。编码生成的步骤为: 180 | 181 | - 将所需字词及其编码(不包含生僻单字、偏旁部首、符号等非必要词库)按词库优先级顺序进行集中 182 | 183 | - 在次选的字词编码后添加次选编码(`'`) 184 | 185 | - 在下列字词的编码后添加空格编码(`_`) 186 | - 所有简码字词(不包含特殊简码) 187 | - 编码的声码部分为奇数且无形码的词组 188 | - 编码的声码部分为声韵(`sy`)且无形码的单字 189 | 190 | - 保持含次选词组、简码词组与所有单字的默认编码排列顺序 191 | 192 | - 对多字词组按字数(含标点)进行倒序排列,使长度更大词组优先得到映射 193 | 194 | - 在词组字数相同的情况下,对该组词组按编码进行倒序排列,使词组映射组合更加准确(不包含简码词组) 195 | 196 | - 测试编码的实际使用情况,确保字词映射无误且理论码长结果理想 197 | 198 | [星空键道]: https://github.com/xkinput/Rime_JD 199 | [Colemak-DH Matrix布局]: https://colemakmods.github.io/mod-dh/keyboards.html#matrix-keyboards 200 | [Rime开源输入平台]: https://github.com/rime 201 | [Rime键道输入法文档]: https://pingshunhuangalex.gitbook.io/rime-xkjd/ 202 | [下载安装Rime]: https://rime.im/download/ 203 | [辅助轮设置]: https://github.com/pingshunhuangalex/rime-xkjd/blob/main/keydo.custom.yaml 204 | [词库结构]: https://github.com/pingshunhuangalex/rime-xkjd/blob/main/keydo.dict.yaml 205 | [编码文件]: https://github.com/pingshunhuangalex/rime-xkjd/blob/main/customisation/%E6%9E%81%E9%80%9F%E8%B7%9F%E6%89%93%E5%99%A8/%E7%BC%96%E7%A0%81%E6%96%87%E4%BB%B6/%E9%94%AE%E9%81%93%C2%B7%E6%88%91%E6%B5%81.txt 206 | -------------------------------------------------------------------------------- /lua/xnumber.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | xnumber.lua: realize a yong-style number typing experience in RIME 3 | usage: 4 | 0. this script is intended for xkjd6 but also work for other schemas (may need some custimizations) 5 | 1. place this script in `rime\lua` 6 | 2. modify `rime\rime.lua` by adding a line like `number_translator = require("numberx")` 7 | 3. modify your schema (like `xkjd6.schema.yaml`) by adding an item like `- lua_translator@number_translator` under the `engine/translators` section 8 | 4. re-deploy RIME and enjoy (the default trigger key is `=`) 9 | change log: 10 | v0.0.1(20201010) - initial version written by thXnder(别打脸) 11 | --]] 12 | 13 | local function speakLiterally(str, valMap) 14 | valMap = valMap or { 15 | [0]="零"; "一"; "二"; "三"; "四"; "五"; "六"; "七"; "八"; "九"; "十"; 16 | ["+"]="正"; ["-"]="负"; ["."]="点"; [""]="" 17 | } 18 | 19 | local tbOut = {} 20 | for k = 1, #str do 21 | local v = string.sub(str, k, k) 22 | v = tonumber(v) or v 23 | tbOut[k] = valMap[v] 24 | end 25 | return table.concat(tbOut) 26 | end 27 | 28 | local function speakMillitary(str) 29 | return speakLiterally(str, {[0]="洞"; "幺"; "两"; "三"; "四"; "五"; "六"; "拐"; "八"; "勾"; "十";["+"]="正"; ["-"]="负"; ["."]="点"; [""]=""}) 30 | end 31 | 32 | local function splitNumStr(str) 33 | --[[ 34 | split a number (or a string describing a number) into 4 parts: 35 | .sym: "+", "-" or "" 36 | .int: "0", "000", "123456", "", etc 37 | .dig: "." or "" 38 | .dec: "0", "10000", "00001", "", etc 39 | --]] 40 | local part = {} 41 | part.sym, part.int, part.dig, part.dec = string.match(str, "^([%+%-]?)(%d*)(%.?)(%d*)") 42 | return part 43 | end 44 | 45 | local function speakBar(str, posMap, valMap) 46 | posMap = posMap or {[1]="仟"; [2]="佰"; [3]="拾"; [4]=""} 47 | valMap = valMap or {[0]="零"; "一"; "二"; "三" ;"四"; "五"; "六"; "七"; "八"; "九"} -- the length of valMap[0] should not excess 1 48 | 49 | local out = "" 50 | local bar = string.sub("****" .. str, -4, -1) -- the integer part of a number string can be divided into bars; each bar has 4 bits 51 | for pos = 1, 4 do 52 | local val = tonumber(string.sub(bar, pos, pos)) 53 | -- case1: place holder 54 | if val == nil then 55 | goto continue 56 | end 57 | -- case2: number 1~9 58 | if val > 0 then 59 | out = out .. valMap[val] .. posMap[pos] 60 | goto continue 61 | end 62 | -- case3: number 0 63 | local valNext = tonumber(string.sub(bar, pos+1, pos+1)) 64 | if ( valNext==nil or valNext==0 )then 65 | goto continue 66 | else 67 | out = out .. valMap[0] 68 | goto continue 69 | end 70 | ::continue:: 71 | end 72 | if out == "" then out = valMap[0] end 73 | return out 74 | end 75 | 76 | local function speakIntOfficially(str, posMap, valMap) 77 | posMap = posMap or {[1]="千"; [2]="百"; [3]="十"; [4]=""} 78 | valMap = valMap or {[0]="零"; "一"; "二"; "三" ;"四"; "五"; "六"; "七"; "八"; "九"} -- the length of valMap[0] should not excess 1 79 | 80 | -- split the number string into bars, for example, in:str=123456789 → out:tbBar={1|2345|6789} 81 | local int = string.match(str, "^0*(%d+)$") 82 | if int=="" then int = "0" end 83 | local remain = #int % 4 84 | if remain==0 then remain = 4 end 85 | local tbBar = {[1] = string.sub(int, 1, remain)} 86 | for pos = remain+1, #int, 4 do 87 | local bar = string.sub(int, pos, pos+3) 88 | table.insert(tbBar, bar) 89 | end 90 | -- generate the suffixes of each bar, for example, tbSpeakBarSuffix={亿|万|""} 91 | local tbSpeakBarSuffix = {[1]=""} 92 | for iBar = 2, #tbBar do 93 | local suffix = (iBar % 2 == 0) and ("万"..tbSpeakBarSuffix[1]) or ("亿"..tbSpeakBarSuffix[2]) 94 | table.insert(tbSpeakBarSuffix, 1, suffix) 95 | end 96 | -- speak each bar 97 | local tbSpeakBar = {} 98 | for k = 1, #tbBar do 99 | tbSpeakBar[k] = speakBar(tbBar[k], posMap, valMap) 100 | end 101 | -- combine the results 102 | local out = "" 103 | for k = 1, #tbBar do 104 | local speakBar = tbSpeakBar[k] 105 | if speakBar ~= valMap[0] then 106 | out = out .. speakBar .. tbSpeakBarSuffix[k] 107 | end 108 | end 109 | if out == "" then out = valMap[0] end 110 | return out 111 | end 112 | 113 | local function speakDecMoney(str, posMap, valMap) 114 | posMap = posMap or {[1]="角"; [2]="分"; [3]="厘"; [4]="毫"} 115 | valMap = valMap or {[0]="零"; "壹"; "贰"; "叁" ;"肆"; "伍"; "陆"; "柒"; "捌"; "玖"} -- the length of valMap[0] should not excess 1 116 | 117 | local dec = string.sub(str, 1, 4) 118 | dec = string.gsub(dec, "0*$", "") 119 | if dec == "" then 120 | return "整" 121 | end 122 | 123 | local out = "" 124 | for pos = 1, #dec do 125 | local val = tonumber(string.sub(dec, pos, pos)) 126 | out = out .. valMap[val] .. posMap[pos] 127 | end 128 | return out 129 | end 130 | 131 | local function speakOfficially(str) 132 | local part = splitNumStr(str) 133 | local speakSym = speakLiterally(part.sym) 134 | local speakInt = speakIntOfficially(part.int) 135 | local speakDig = speakLiterally(part.dig) 136 | local speakDec = speakLiterally(part.dec) 137 | local out = speakSym .. speakInt .. speakDig .. speakDec 138 | return out 139 | end 140 | 141 | local function speakMoney(str) 142 | local part = splitNumStr(str) 143 | local speakSym = speakLiterally(part.sym) 144 | local speakInt = speakIntOfficially(part.int, {[1]="仟"; [2]="佰"; [3]="拾"; [4]=""}, {[0]="零"; "壹"; "贰"; "叁" ;"肆"; "伍"; "陆"; "柒"; "捌"; "玖"}) .. "元" 145 | local speakDec = speakDecMoney(part.dec) 146 | local out = speakSym .. speakInt .. speakDec 147 | return out 148 | end 149 | 150 | local function baseConverse(str, from, to) 151 | local str10 = str 152 | if from == 16 then 153 | str10 = string.format("%d", str) 154 | end 155 | local strout = str10 156 | if to == 16 then 157 | strout = string.format("%#x", str10) 158 | end 159 | return strout 160 | end 161 | 162 | local function translator(input, seg, env) 163 | -- env can be used for getting the state of a switch, e.g., `env.engine.context:get_option("jffh")` returns true/false (or nil if the switch does not exist) 164 | if string.sub(input, 1, 1) == "=" then 165 | local input2 = string.sub(input, 2) 166 | if string.match(input2, "^[%+%-]?%d*%.?%d*$") then -- sadly, lua does not support regex like {0,4} 167 | -- comment or reorder following lines to adjust the effects 168 | yield(Candidate("number", seg.start, seg._end, speakMoney(input2), " [金额]")) 169 | yield(Candidate("number", seg.start, seg._end, speakOfficially(input2), " [文读]")) 170 | yield(Candidate("number", seg.start, seg._end, speakLiterally(input2), " [冷读]")) 171 | yield(Candidate("number", seg.start, seg._end, speakMillitary(input2), " [军语]")) 172 | else 173 | local ok, ret = pcall(load, "return "..input2) -- from Lua 5.3, the `loadstring` function is replaced by `load` 174 | if ok then yield(Candidate("number", seg.start, seg._end, tostring(ret()), " [计算]")) end 175 | end 176 | if string.match(input2, "^[%+%-]?%d*$") then -- plz, i dont want to deal with base conversion with decimals 177 | yield(Candidate("number", seg.start, seg._end, baseConverse(input2, 10, 16), " [进制]")) 178 | end 179 | end 180 | end 181 | 182 | return translator 183 | -------------------------------------------------------------------------------- /keydo.shorthand_sp.dict.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: keydo.shorthand_sp 3 | version: "1.0" 4 | sort: original 5 | ... 6 | 那又 aa 7 | 又好 aa 8 | 那个 ai 9 | 那里 aia 10 | 那位 aio 11 | 那些 aiv 12 | 那是 ao 13 | 又是 ao 14 | 那么 au 15 | 又和 au 16 | 那种 auv 17 | 那有 av 18 | 又有 av 19 | 那样 avo 20 | 那天 avv 21 | 班级 baa 22 | 宝贝 bao 23 | 不敢 bav 24 | 不上 bi 25 | 不打 bi 26 | 不见 bia 27 | 别人 bii 28 | 不错 bio 29 | 不少 biu 30 | 不会 biv 31 | 不着 bo 32 | 不让 boa 33 | 便是 boi 34 | 表情 boo 35 | 不断 bou 36 | 毕竟 bov 37 | 不得 bu 38 | 必须 bu 39 | 不用 bua 40 | 别的 bui 41 | 爸爸 buo 42 | 变得 buu 43 | 不知 buv 44 | 不过 bv 45 | 不到 bva 46 | 不想 bvi 47 | 本来 bvo 48 | 变成 bvu 49 | 不禁 bvv 50 | 曾经 caa 51 | 村子 cai 52 | 沧桑 cao 53 | 参加 cau 54 | 村民 cav 55 | 操作 ci 56 | 村里 cia 57 | 催促 cio 58 | 从小 ciu 59 | 从此 civ 60 | 此时 co 61 | 测试 coa 62 | 匆忙 coo 63 | 从前 cou 64 | 此刻 cov 65 | 采用 cu 66 | 匆匆 cua 67 | 苍白 cui 68 | 苍老 cuo 69 | 厕所 cuu 70 | 村长 cuv 71 | 才有 cv 72 | 存在 cv 73 | 参与 cva 74 | 从事 cvi 75 | 从来 cvo 76 | 从未 cvv 77 | 到了 da 78 | 大约 daa 79 | 肚子 dai 80 | 打架 dau 81 | 当即 dav 82 | 多少 di 83 | 都上 di 84 | 当中 dia 85 | 大人 dii 86 | 短信 dio 87 | 动作 diu 88 | 地上 div 89 | 但是 do 90 | 的啊 do 91 | 的话 doa 92 | 大家 doo 93 | 弟弟 dou 94 | 地方 dov 95 | 当然 du 96 | 多么 dua 97 | 独自 dui 98 | 大爷 duo 99 | 等待 duu 100 | 打算 duv 101 | 东西 dv 102 | 都有 dv 103 | 得到 dva 104 | 底下 dvi 105 | 大哥 dvo 106 | 对面 dvu 107 | 对于 dvv 108 | 生活 ea 109 | 视线 eaa 110 | 身子 eai 111 | 深深 eao 112 | 身边 eau 113 | 手臂 eav 114 | 时候 ei 115 | 世界 eia 116 | 是从 eii 117 | 时光 eio 118 | 双手 eiu 119 | 身上 eiv 120 | 时间 eo 121 | 是啊 eo 122 | 说话 eoa 123 | 瞬间 eoi 124 | 事情 eoo 125 | 说着 eou 126 | 声音 eov 127 | 什么 eu 128 | 舒服 eua 129 | 似的 eui 130 | 十分 euo 131 | 身后 euu 132 | 少年 euv 133 | 是有 ev 134 | 上面 ev 135 | 甚至 eva 136 | 剩下 evi 137 | 手机 evu 138 | 属于 evv 139 | 只能 fa 140 | 纷纷 faa 141 | 房子 fai 142 | 否则 fao 143 | 只好 fau 144 | 发展 fav 145 | 这上 fi 146 | 这里 fia 147 | 专业 fii 148 | 非常 fio 149 | 直接 fiu 150 | 这些 fiv 151 | 知道 fo 152 | 放心 foa 153 | 只是 foi 154 | 放学 foo 155 | 之前 fou 156 | 放弃 fov 157 | 这么 fu 158 | 疯狂 fua 159 | 转身 fui 160 | 中考 fuo 161 | 之后 fuu 162 | 这种 fuv 163 | 这有 fv 164 | 这样 fv 165 | 找到 fva 166 | 只要 fvi 167 | 发起 fvo 168 | 只有 fvu 169 | 发现 fvv 170 | 更加 ga 171 | 高级 gaa 172 | 国际 gai 173 | 关注 gao 174 | 姑娘 gau 175 | 公司 gav 176 | 工作 gi 177 | 刚刚 gia 178 | 赶紧 gii 179 | 各位 gio 180 | 高手 giu 181 | 关上 giv 182 | 感觉 go 183 | 告诉 goa 184 | 更是 goi 185 | 国家 goo 186 | 跟着 gou 187 | 改变 gov 188 | 关系 gu 189 | 果然 gua 190 | 各自 gui 191 | 感受 guo 192 | 过后 guu 193 | 各种 guv 194 | 过去 gv 195 | 感到 gva 196 | 根本 gvi 197 | 过来 gvo 198 | 尴尬 gvu 199 | 关于 gvv 200 | 还没 ha 201 | 缓缓 haa 202 | 孩子 hai 203 | 还能 hao 204 | 还好 hau 205 | 喝酒 hav 206 | 好上 hi 207 | 好打 hi 208 | 后果 hia 209 | 黄金 hio 210 | 好像 hiu 211 | 好看 hiu 212 | 还会 hiv 213 | 还是 ho 214 | 好啊 ho 215 | 或许 hoa 216 | 哈哈 hoi 217 | 回家 hoo 218 | 火焰 hou 219 | 呵呵 hov 220 | 很多 hua 221 | 浑身 hui 222 | 或者 huo 223 | 获得 huu 224 | 回答 huv 225 | 还有 hv 226 | 好有 hv 227 | 回到 hva 228 | 还要 hvi 229 | 回来 hvo 230 | 后面 hvu 231 | 活动 hvv 232 | 上了 ia 233 | 打了 ia 234 | 上个 ii 235 | 打个 ii 236 | 上得 iu 237 | 打得 iu 238 | 上去 iv 239 | 上来 ivo 240 | 继续 ja 241 | 就又 ja 242 | 成绩 jaa 243 | 除了 jai 244 | 绝对 jao 245 | 姐姐 jau 246 | 渐渐 jav 247 | 就上 ji 248 | 几个 ji 249 | 结果 jia 250 | 紧紧 jii 251 | 经常 jio 252 | 坚持 jiu 253 | 机会 jiv 254 | 惊讶 joa 255 | 出门 joi 256 | 教室 joo 257 | 成为 jou 258 | 城市 jov 259 | 就得 ju 260 | 几乎 ju 261 | 竟然 jua 262 | 阶段 jui 263 | 进入 juo 264 | 觉得 juu 265 | 就算 juv 266 | 就有 jv 267 | 今天 jv 268 | 见到 jva 269 | 就要 jvi 270 | 出来 jvo 271 | 见面 jvu 272 | 出现 jvv 273 | 可以 ka 274 | 口水 kaa 275 | 看出 kai 276 | 开始 kau 277 | 夸张 kav 278 | 况且 ki 279 | 看见 kia 280 | 刻苦 kii 281 | 块钱 kio 282 | 科技 kiu 283 | 快点 kiv 284 | 开心 koa 285 | 空间 koi 286 | 肯定 koo 287 | 看着 kou 288 | 渴望 kov 289 | 可爱 ku 290 | 快乐 kua 291 | 空白 kui 292 | 开支 kuo 293 | 靠近 kuu 294 | 空气 kuv 295 | 可有 kv 296 | 开车 kv 297 | 看到 kva 298 | 快速 kvi 299 | 看来 kvo 300 | 客厅 kvu 301 | 苦于 kvv 302 | 例如 la 303 | 立马 laa 304 | 露出 lai 305 | 练习 lao 306 | 老妈 lau 307 | 立即 lav 308 | 两个 li 309 | 类似 lia 310 | 老人 lii 311 | 两位 lio 312 | 老师 liu 313 | 脸上 liv 314 | 老是 lo 315 | 了啊 lo 316 | 来说 loa 317 | 力量 loi 318 | 厉害 loo 319 | 两只 lou 320 | 立刻 lov 321 | 了得 lu 322 | 了解 lu 323 | 联系 lua 324 | 来自 lui 325 | 老爸 luo 326 | 懒得 luu 327 | 力气 luv 328 | 里面 lv 329 | 来到 lva 330 | 留下 lvi 331 | 离去 lvo 332 | 老板 lvu 333 | 离开 lvv 334 | 妈妈 ma 335 | 梦乡 maa 336 | 妹子 mai 337 | 面对 mao 338 | 美女 mau 339 | 勉强 mav 340 | 没上 mi 341 | 没打 mi 342 | 默默 mia 343 | 每个 mii 344 | 某个 mii 345 | 目光 mio 346 | 摸摸 miu 347 | 马上 miv 348 | 目前 mo 349 | 名叫 moa 350 | 明显 moi 351 | 慢慢 moo 352 | 面前 mou 353 | 母亲 mov 354 | 没得 mu 355 | 明白 mu 356 | 门外 mua 357 | 满脸 mui 358 | 摸索 muo 359 | 矛盾 muu 360 | 陌生 muv 361 | 没有 mv 362 | 密切 mva 363 | 没事 mvi 364 | 模样 mvo 365 | 忙碌 mvu 366 | 每天 mvv 367 | 你那 na 368 | 你又 na 369 | 年纪 naa 370 | 女孩 nai 371 | 难以 nao 372 | 能力 nau 373 | 农民 nav 374 | 能上 ni 375 | 能打 ni 376 | 哪里 nia 377 | 哪个 nii 378 | 你们 nio 379 | 难看 niu 380 | 哪些 niv 381 | 难道 no 382 | 内心 noa 383 | 内容 noo 384 | 怒火 nou 385 | 内部 nov 386 | 你得 nu 387 | 能够 nua 388 | 难的 nui 389 | 难受 nuo 390 | 难得 nuu 391 | 你有 nv 392 | 能有 nv 393 | 年轻 nva 394 | 难过 nvi 395 | 拿来 nvo 396 | 女友 nvu 397 | 着了 oa 398 | 普通 pa 399 | 婆婆 paa 400 | 胖子 pai 401 | 平淡 pao 402 | 旁边 pau 403 | 啤酒 pav 404 | 配合 pi 405 | 苹果 pia 406 | 评价 pii 407 | 平常 pio 408 | 拍拍 piu 409 | 拼命 piv 410 | 漂亮 po 411 | 评论 poa 412 | 平日 poi 413 | 凭空 poo 414 | 判断 pou 415 | 片刻 pov 416 | 品质 pu 417 | 平凡 pua 418 | 品牌 pui 419 | 平分 puo 420 | 屁股 puu 421 | 皮肤 puv 422 | 朋友 pv 423 | 跑到 pva 424 | 皮鞋 pvi 425 | 破坏 pvo 426 | 趴在 pvu 427 | 平静 pvv 428 | 正好 qa 429 | 情绪 qaa 430 | 妻子 qai 431 | 前台 qao 432 | 强忍 qau 433 | 逐渐 qav 434 | 其中 qia 435 | 整个 qii 436 | 正常 qio 437 | 主任 qiu 438 | 其余 qiv 439 | 其实 qo 440 | 注视 qoa 441 | 真是 qoi 442 | 确实 qoo 443 | 正义 qou 444 | 情况 qov 445 | 真的 qu 446 | 准备 qu 447 | 欺负 qua 448 | 全身 qui 449 | 全都 quo 450 | 期待 quu 451 | 青年 quv 452 | 起来 qv 453 | 轻轻 qva 454 | 真正 qvi 455 | 前来 qvo 456 | 正在 qvu 457 | 清楚 qvv 458 | 人民 ra 459 | 热水 raa 460 | 日子 rai 461 | 人流 rao 462 | 人潮 rau 463 | 人群 rav 464 | 如果 ri 465 | 如同 ria 466 | 如今 rio 467 | 软件 riu 468 | 任何 riv 469 | 认为 ro 470 | 认识 roa 471 | 容易 roi 472 | 人家 roo 473 | 人类 rou 474 | 如意 rov 475 | 然后 ru 476 | 仍然 rua 477 | 热血 rui 478 | 认真 ruo 479 | 日后 ruu 480 | 人生 ruv 481 | 然而 rv 482 | 柔软 rva 483 | 认可 rvo 484 | 偌大 rvu 485 | 让开 rvv 486 | 所以 sa 487 | 送给 saa 488 | 算了 sai 489 | 三流 sao 490 | 散发 sau 491 | 随即 sav 492 | 三岁 sia 493 | 四个 sii 494 | 思念 sio 495 | 随手 siu 496 | 宿舍 siv 497 | 随着 so 498 | 所谓 soa 499 | 算是 soi 500 | 索性 soo 501 | 岁数 sou 502 | 速度 sov 503 | 虽然 su 504 | 四周 sua 505 | 碎片 sui 506 | 似乎 suo 507 | 随后 suu 508 | 三年 suv 509 | 所有 sv 510 | 送到 sva 511 | 苏醒 svi 512 | 送来 svo 513 | 司机 svu 514 | 三天 svv 515 | 提出 ta 516 | 通红 taa 517 | 太阳 tai 518 | 天赋 tao 519 | 头发 tau 520 | 唾沫 tav 521 | 他们 ti 522 | 听见 tia 523 | 痛苦 tii 524 | 她们 tio 525 | 条件 tiu 526 | 停止 tiv 527 | 特别 to 528 | 听说 toa 529 | 同时 toi 530 | 天空 too 531 | 听着 tou 532 | 同意 tov 533 | 他得 tu 534 | 突然 tua 535 | 叹息 tui 536 | 头脑 tuo 537 | 体质 tuu 538 | 通知 tuv 539 | 天天 tv 540 | 听到 tva 541 | 通过 tvi 542 | 同样 tvo 543 | 讨厌 tvu 544 | 推开 tvv 545 | 得了 ua 546 | 得上 ui 547 | 得着 uo 548 | 得有 uv 549 | 有了 va 550 | 有个 vi 551 | 有些 viv 552 | 有着 vo 553 | 有啊 vo 554 | 有的 vu 555 | 有在 vv 556 | 我那 wa 557 | 我又 wa 558 | 网络 waa 559 | 为了 wai 560 | 充满 wai 561 | 温柔 wao 562 | 无力 wau 563 | 无法 wav 564 | 我上 wi 565 | 我打 wi 566 | 位置 wia 567 | 五个 wii 568 | 我们 wio 569 | 文化 wiu 570 | 晚上 wiv 571 | 问题 wo 572 | 忘记 woa 573 | 温暖 woi 574 | 晚安 woo 575 | 完美 wou 576 | 闻言 wov 577 | 我得 wu 578 | 吃饭 wua 579 | 冲向 wui 580 | 无辜 wuo 581 | 微微 wuu 582 | 微笑 wuv 583 | 我有 wv 584 | 完成 wv 585 | 无比 wva 586 | 无聊 wvi 587 | 未来 wvo 588 | 外面 wvu 589 | 唯一 wvv 590 | 而那 xa 591 | 喜欢 xa 592 | 系统 xaa 593 | 小子 xai 594 | 学习 xao 595 | 小姐 xau 596 | 而已 xav 597 | 而且 xi 598 | 心里 xia 599 | 二人 xii 600 | 相信 xio 601 | 选择 xiu 602 | 安全 xiv 603 | 谢谢 xoa 604 | 像是 xoi 605 | 心情 xoo 606 | 想着 xou 607 | 希望 xov 608 | 许多 xu 609 | 想象 xua 610 | 休息 xui 611 | 享受 xuo 612 | 显得 xuu 613 | 下午 xuv 614 | 现在 xv 615 | 想到 xva 616 | 需要 xvi 617 | 下来 xvo 618 | 兴奋 xvu 619 | 安静 xvv 620 | 已经 ya 621 | 一丝 yaa 622 | 样子 yai 623 | 游戏 yao 624 | 一边 yau 625 | 一张 yav 626 | 眼睛 yia 627 | 一幕 yii 628 | 一位 yio 629 | 一把 yiu 630 | 一些 yiv 631 | 因为 yo 632 | 应该 yoa 633 | 也是 yoi 634 | 一定 yoo 635 | 以前 you 636 | 一次 yov 637 | 以后 yu 638 | 一句 yua 639 | 一直 yuo 640 | 一般 yuu 641 | 一种 yuv 642 | 一有 yv 643 | 一样 yv 644 | 一切 yva 645 | 一下 yvi 646 | 一起 yvo 647 | 拥有 yvu 648 | 一天 yvv 649 | 在那 za 650 | 自己 za 651 | 最终 zaa 652 | 走出 zai 653 | 足以 zao 654 | 最好 zau 655 | 早已 zav 656 | 暂且 zi 657 | 再见 zia 658 | 自从 zii 659 | 咱们 zio 660 | 左手 ziu 661 | 早上 ziv 662 | 总是 zo 663 | 再说 zoa 664 | 暂时 zoi 665 | 在家 zoo 666 | 作为 zou 667 | 最新 zov 668 | 怎么 zu 669 | 自然 zua 670 | 走向 zui 671 | 作者 zuo 672 | 最后 zuu 673 | 总算 zuv 674 | 怎样 zv 675 | 做到 zva 676 | 坐下 zvi 677 | 走来 zvo 678 | 坐在 zvu 679 | 走进 zvv 680 | -------------------------------------------------------------------------------- /customisation/极速跟打器/skin/SPHS.css: -------------------------------------------------------------------------------- 1 | QPalette{background:#1a1a1a;} 2 | 3 | *{outline:0px;color:#eeffff;} 4 | 5 | QWidget[form="true"],QLabel[frameShape="1"]{ 6 | border:1px solid rgba(116,116,116,0.31); 7 | border-radius:0px; 8 | } 9 | 10 | QWidget[form="bottom"]{ 11 | background:#1a1a1a; 12 | } 13 | 14 | QWidget[form="bottom"] .QFrame{ 15 | border:1px solid rgba(116,116,116,0.31); 16 | } 17 | 18 | QWidget[form="bottom"] QLabel,QWidget[form="title"] QLabel{ 19 | border-radius:0px; 20 | color:#eeffff; 21 | background:none; 22 | border-style:none; 23 | } 24 | 25 | QWidget[form="title"],QWidget[nav="left"],QWidget[nav="top"] QAbstractButton{ 26 | border-style:none; 27 | border-radius:0px; 28 | padding:5px; 29 | color:#eeffff; 30 | background:rgba(97,97,97,0.31); 31 | } 32 | 33 | QWidget[nav="top"] QAbstractButton:hover,QWidget[nav="top"] QAbstractButton:pressed,QWidget[nav="top"] QAbstractButton:checked{ 34 | border-style:solid; 35 | border-width:0px 0px 2px 0px; 36 | padding:4px 4px 2px 4px; 37 | border-color:transparent; 38 | background:rgba(116,116,116,0.31); 39 | } 40 | 41 | QWidget[nav="left"] QAbstractButton{ 42 | border-radius:0px; 43 | color:#eeffff; 44 | background:none; 45 | border-style:none; 46 | } 47 | 48 | QWidget[nav="left"] QAbstractButton:hover{ 49 | color:#eeffff; 50 | background-color:rgba(116,116,116,0.31); 51 | } 52 | 53 | QWidget[nav="left"] QAbstractButton:checked,QWidget[nav="left"] QAbstractButton:pressed{ 54 | color:#eeffff; 55 | border-style:solid; 56 | border-width:0px 0px 0px 2px; 57 | padding:4px 4px 4px 2px; 58 | border-color:transparent; 59 | background-color:rgba(116,116,116,0.31); 60 | } 61 | 62 | QWidget[video="true"] QLabel{ 63 | color:#eeffff; 64 | border:1px solid transparent; 65 | background:rgba(97,97,97,0.31); 66 | } 67 | 68 | QWidget[video="true"] QLabel:focus{ 69 | border:1px solid transparent; 70 | background:rgba(116,116,116,0.31); 71 | } 72 | 73 | QLineEdit,QTextEdit,QPlainTextEdit,QSpinBox,QDoubleSpinBox,QComboBox,QDateEdit,QTimeEdit,QDateTimeEdit{ 74 | border:1px solid transparent; 75 | border-radius:3px; 76 | padding:2px; 77 | background:none; 78 | selection-background-color:rgba(199,146,234,0.5); 79 | selection-color:#eeffff; 80 | } 81 | 82 | QLineEdit:hover,QTextEdit:hover,QPlainTextEdit:hover,QSpinBox:hover,QDoubleSpinBox:hover,QComboBox:hover,QDateEdit:hover,QTimeEdit:hover,QDateTimeEdit:hover{ 83 | border:1px solid transparent; 84 | } 85 | 86 | QLineEdit:focus,QTextEdit:focus,QPlainTextEdit:focus,QSpinBox:focus,QDoubleSpinBox:focus,QDateEdit:focus,QTimeEdit:focus,QDateTimeEdit:focus{ 87 | border:1px solid rgba(116,116,116,0.31); 88 | } 89 | 90 | QComboBox:focus{ 91 | border:1px solid transparent; 92 | } 93 | 94 | QLineEdit[echoMode="2"]{ 95 | lineedit-password-character:9679; 96 | } 97 | 98 | .QFrame{ 99 | border:1px solid rgba(116,116,116,0.31); 100 | border-radius:3px; 101 | } 102 | 103 | .QGroupBox{ 104 | border:1px solid rgba(116,116,116,0.31); 105 | border-radius:5px; 106 | margin-top:3px; 107 | } 108 | 109 | .QGroupBox::title{ 110 | subcontrol-origin:margin; 111 | position:relative; 112 | left:10px; 113 | } 114 | 115 | .QPushButton,.QToolButton{ 116 | border-style:none; 117 | border:1px solid transparent; 118 | color:#eeffff; 119 | padding:5px; 120 | min-height:15px; 121 | border-radius:5px; 122 | background:rgba(97,97,97,0.31); 123 | } 124 | 125 | .QPushButton:hover,.QToolButton:hover{ 126 | background:rgba(116,116,116,0.31); 127 | } 128 | 129 | .QPushButton:pressed,.QToolButton:pressed{ 130 | background:rgba(116,116,116,0.31); 131 | } 132 | 133 | .QToolButton::menu-indicator{ 134 | image:None; 135 | } 136 | 137 | QToolButton#btnMenu,QPushButton#btnMenu_Min,QPushButton#btnMenu_Max,QPushButton#btnMenu_Close{ 138 | border-radius:3px; 139 | color:#eeffff; 140 | padding:3px; 141 | margin:0px; 142 | background:none; 143 | border-style:none; 144 | } 145 | 146 | QToolButton#btnMenu:hover,QPushButton#btnMenu_Min:hover,QPushButton#btnMenu_Max:hover{ 147 | color:#eeffff; 148 | margin:1px 1px 2px 1px; 149 | background-color:rgba(116,116,116,0.31); 150 | } 151 | 152 | QPushButton#btnMenu_Close:hover{ 153 | color:#eeffff; 154 | margin:1px 1px 2px 1px; 155 | background-color:#ef5350; 156 | } 157 | 158 | QRadioButton::indicator{ 159 | width:15px; 160 | height:15px; 161 | } 162 | 163 | QRadioButton::indicator::unchecked{ 164 | image:url(:/qss/common/radiobutton_unchecked.png); 165 | } 166 | 167 | QRadioButton::indicator::unchecked:disabled{ 168 | image:url(:/qss/common/radiobutton_unchecked_disable.png); 169 | } 170 | 171 | QRadioButton::indicator::checked{ 172 | image:url(:/qss/common/radiobutton_checked.png); 173 | } 174 | 175 | QRadioButton::indicator::checked:disabled{ 176 | image:url(:/qss/common/radiobutton_checked_disable.png); 177 | } 178 | 179 | QGroupBox::indicator,QTreeWidget::indicator,QListWidget::indicator{ 180 | padding:0px -3px 0px 0px; 181 | } 182 | 183 | QCheckBox::indicator,QGroupBox::indicator,QTreeWidget::indicator,QListWidget::indicator{ 184 | width:13px; 185 | height:13px; 186 | } 187 | 188 | QCheckBox::indicator:unchecked,QGroupBox::indicator:unchecked,QTreeWidget::indicator:unchecked,QListWidget::indicator:unchecked{ 189 | image:url(:/qss/common/checkbox_unchecked.png); 190 | } 191 | 192 | QCheckBox::indicator:unchecked:disabled,QGroupBox::indicator:unchecked:disabled,QTreeWidget::indicator:unchecked:disabled,QListWidget::indicator:disabled{ 193 | image:url(:/qss/common/checkbox_unchecked_disable.png); 194 | } 195 | 196 | QCheckBox::indicator:checked,QGroupBox::indicator:checked,QTreeWidget::indicator:checked,QListWidget::indicator:checked{ 197 | image:url(:/qss/common/checkbox_checked.png); 198 | } 199 | 200 | QCheckBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled,QTreeWidget::indicator:checked:disabled,QListWidget::indicator:checked:disabled{ 201 | image:url(:/qss/common/checkbox_checked_disable.png); 202 | } 203 | 204 | QCheckBox::indicator:indeterminate,QGroupBox::indicator:indeterminate,QTreeWidget::indicator:indeterminate,QListWidget::indicator:indeterminate{ 205 | image:url(:/qss/common/checkbox_parcial.png); 206 | } 207 | 208 | QCheckBox::indicator:indeterminate:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeWidget::indicator:indeterminate:disabled,QListWidget::indicator:indeterminate:disabled{ 209 | image:url(:/qss/common/checkbox_parcial_disable.png); 210 | } 211 | 212 | QTimeEdit::up-button,QDateEdit::up-button,QDateTimeEdit::up-button,QDoubleSpinBox::up-button,QSpinBox::up-button{ 213 | image:url(:/qss/common/add_top.png); 214 | width:10px; 215 | height:10px; 216 | padding:2px 5px 0px 0px; 217 | } 218 | 219 | QTimeEdit::down-button,QDateEdit::down-button,QDateTimeEdit::down-button,QDoubleSpinBox::down-button,QSpinBox::down-button{ 220 | image:url(:/qss/common/add_bottom.png); 221 | width:10px; 222 | height:10px; 223 | padding:0px 5px 2px 0px; 224 | } 225 | 226 | QTimeEdit::up-button:pressed,QDateEdit::up-button:pressed,QDateTimeEdit::up-button:pressed,QDoubleSpinBox::up-button:pressed,QSpinBox::up-button:pressed{ 227 | top:-2px; 228 | } 229 | 230 | QTimeEdit::down-button:pressed,QDateEdit::down-button:pressed,QDateTimeEdit::down-button:pressed,QDoubleSpinBox::down-button:pressed,QSpinBox::down-button:pressed,QSpinBox::down-button:pressed{ 231 | bottom:-2px; 232 | } 233 | 234 | QComboBox::down-arrow,QDateEdit[calendarPopup="true"]::down-arrow,QTimeEdit[calendarPopup="true"]::down-arrow,QDateTimeEdit[calendarPopup="true"]::down-arrow{ 235 | image:url(:/qss/common/add_bottom.png); 236 | width:10px; 237 | height:10px; 238 | right:2px; 239 | } 240 | 241 | QComboBox::drop-down,QDateEdit::drop-down,QTimeEdit::drop-down,QDateTimeEdit::drop-down{ 242 | subcontrol-origin:padding; 243 | subcontrol-position:top right; 244 | width:15px; 245 | border-left-width:0px; 246 | border-left-style:solid; 247 | border-top-right-radius:3px; 248 | border-bottom-right-radius:3px; 249 | border-left-color:rgba(116,116,116,0.31); 250 | } 251 | 252 | QComboBox::drop-down:on{ 253 | top:1px; 254 | } 255 | 256 | QMenuBar,QMenuBar:disabled{ 257 | color:#eeffff; 258 | background-color:transparent; 259 | border:0px solid transparent; 260 | margin:0px; 261 | } 262 | 263 | QMenuBar::item{ 264 | color:#eeffff; 265 | background-color:#1a1a1a; 266 | margin:0px; 267 | padding:3px 10px; 268 | } 269 | 270 | QMenuBar::item:selected,QMenu::item:selected{ 271 | color:#c792ea; 272 | border:0px solid transparent; 273 | background:rgba(116,116,116,0.31); 274 | } 275 | 276 | QMenu,QMenu:disabled{ 277 | color:#eeffff; 278 | background-color:#212121; 279 | border:1px solid rgba(116,116,116,0.31); 280 | margin:0px; 281 | } 282 | 283 | QMenu::item{ 284 | padding:3px 20px; 285 | } 286 | 287 | QMenu::indicator{ 288 | width:13px; 289 | height:13px; 290 | } 291 | 292 | QMenu::separator{ 293 | height:1px; 294 | background:rgba(116,116,116,0.31); 295 | } 296 | 297 | QProgressBar{ 298 | min-height:10px; 299 | background:rgba(97,97,97,0.31); 300 | border-radius:5px; 301 | text-align:center; 302 | border:1px solid transparent; 303 | } 304 | 305 | QProgressBar:chunk{ 306 | border-radius:5px; 307 | background-color:#c792ea; 308 | } 309 | 310 | QSlider::groove:horizontal{ 311 | background:#1a1a1a; 312 | height:8px; 313 | border-radius:4px; 314 | } 315 | 316 | QSlider::add-page:horizontal{ 317 | background:#1a1a1a; 318 | height:8px; 319 | border-radius:4px; 320 | } 321 | 322 | QSlider::sub-page:horizontal{ 323 | background:#1a1a1a; 324 | height:8px; 325 | border-radius:4px; 326 | } 327 | 328 | QSlider::handle:horizontal{ 329 | width:13px; 330 | margin-top:-3px; 331 | margin-bottom:-3px; 332 | border-radius:6px; 333 | background:rgba(97,97,97,0.31); 334 | } 335 | 336 | QSlider::groove:vertical{ 337 | width:8px; 338 | border-radius:4px; 339 | background:#1a1a1a; 340 | } 341 | 342 | QSlider::add-page:vertical{ 343 | width:8px; 344 | border-radius:4px; 345 | background:#1a1a1a; 346 | } 347 | 348 | QSlider::sub-page:vertical{ 349 | width:8px; 350 | border-radius:4px; 351 | background:#1a1a1a; 352 | } 353 | 354 | QSlider::handle:vertical{ 355 | height:14px; 356 | margin-left:-3px; 357 | margin-right:-3px; 358 | border-radius:6px; 359 | background:rgba(97,97,97,0.31); 360 | } 361 | 362 | QScrollBar:horizontal{ 363 | background:transparent; 364 | padding:0px; 365 | border-radius:6px; 366 | max-height:12px; 367 | } 368 | 369 | QScrollBar::handle:horizontal{ 370 | background:rgba(97,97,97,0.31); 371 | min-width:50px; 372 | border-radius:6px; 373 | } 374 | 375 | QScrollBar::handle:horizontal:hover{ 376 | background:rgba(199,146,234,0.5); 377 | } 378 | 379 | QScrollBar::handle:horizontal:pressed{ 380 | background:rgba(199,146,234,0.5); 381 | } 382 | 383 | QScrollBar::add-page:horizontal{ 384 | background:none; 385 | } 386 | 387 | QScrollBar::sub-page:horizontal{ 388 | background:none; 389 | } 390 | 391 | QScrollBar::add-line:horizontal{ 392 | background:none; 393 | } 394 | 395 | QScrollBar::sub-line:horizontal{ 396 | background:none; 397 | } 398 | 399 | QScrollBar:vertical{ 400 | background:transparent; 401 | padding:0px; 402 | border-radius:6px; 403 | max-width:12px; 404 | } 405 | 406 | QScrollBar::handle:vertical{ 407 | background:rgba(97,97,97,0.31); 408 | min-height:50px; 409 | border-radius:6px; 410 | } 411 | 412 | QScrollBar::handle:vertical:hover{ 413 | background:rgba(199,146,234,0.5); 414 | } 415 | 416 | QScrollBar::handle:vertical:pressed{ 417 | background:rgba(199,146,234,0.5); 418 | } 419 | 420 | QScrollBar::add-page:vertical{ 421 | background:none; 422 | } 423 | 424 | QScrollBar::sub-page:vertical{ 425 | background:none; 426 | } 427 | 428 | QScrollBar::add-line:vertical{ 429 | background:none; 430 | } 431 | 432 | QScrollBar::sub-line:vertical{ 433 | background:none; 434 | } 435 | 436 | QScrollArea{ 437 | border:0px; 438 | } 439 | 440 | QSplitter::handle{ 441 | background:#1a1a1a; 442 | } 443 | 444 | QTreeView,QTabWidget::pane{ 445 | border:1px solid transparent; 446 | selection-background-color:rgba(116,116,116,0.31); 447 | selection-color:#c792ea; 448 | alternate-background-color:rgba(116,116,116,0.31); 449 | gridline-color:rgba(116,116,116,0.31); 450 | } 451 | 452 | QTreeView:hover,QTabWidget::pane:hover{ 453 | border:1px solid transparent; 454 | } 455 | 456 | QTreeView:focus,QTabWidget::pane:focus{ 457 | border:1px solid rgba(116,116,116,0.31); 458 | } 459 | 460 | QTreeView::branch:closed:has-children{ 461 | margin:4px; 462 | border-image:url(:/qss/common/branch_open.png); 463 | } 464 | 465 | QTreeView::branch:open:has-children{ 466 | margin:4px; 467 | border-image:url(:/qss/common/branch_close.png); 468 | } 469 | 470 | QTreeView,QListView,QTableView,QTreeView::branch{ 471 | background:#212121; 472 | } 473 | 474 | QTableView,QListView{ 475 | border:0px solid transparent; 476 | selection-background-color:rgba(116,116,116,0.31); 477 | selection-color:#c792ea; 478 | alternate-background-color:rgba(116,116,116,0.31); 479 | gridline-color:rgba(116,116,116,0.31); 480 | } 481 | 482 | QTableView::item,QListView::item,QTreeView::item{ 483 | padding:1px; 484 | margin:0px; 485 | border:1px solid transparent; 486 | } 487 | 488 | QTableView::item:hover,QListView::item:hover,QTreeView::item:hover{ 489 | color:#eeffff; 490 | background:rgba(116,116,116,0.31); 491 | } 492 | 493 | QTableView::item:selected,QListView::item:selected,QTreeView::item:selected{ 494 | color:#c792ea; 495 | background:rgba(116,116,116,0.31); 496 | } 497 | 498 | QHeaderView{ 499 | color:#eeffff; 500 | background:#1a1a1a; 501 | } 502 | 503 | QHeaderView::section,QTableCornerButton:section{ 504 | padding:3px; 505 | margin:0px; 506 | color:#eeffff; 507 | border:1px solid #212121; 508 | border-left-width:0px; 509 | border-right-width:1px; 510 | border-top-width:0px; 511 | border-bottom-width:1px; 512 | background:#1a1a1a; 513 | } 514 | 515 | QTabBar::tab{ 516 | border:1px solid transparent; 517 | color:#eeffff; 518 | margin:0px; 519 | background:rgba(97,97,97,0.31); 520 | } 521 | 522 | QTabBar::tab:hover{ 523 | border-style:solid; 524 | border-color:transparent; 525 | background:rgba(116,116,116,0.31); 526 | } 527 | 528 | QTabBar::tab:selected{ 529 | border-style:solid; 530 | border-color:#c792ea; 531 | background:rgba(116,116,116,0.31); 532 | } 533 | 534 | QTabBar::tab:top,QTabBar::tab:bottom{ 535 | padding:3px 8px 3px 8px; 536 | } 537 | 538 | QTabBar::tab:left,QTabBar::tab:right{ 539 | padding:8px 3px 8px 3px; 540 | } 541 | 542 | QTabBar::tab:top:selected,QTabBar::tab:top:hover{ 543 | border-width:2px 0px 0px 0px; 544 | } 545 | 546 | QTabBar::tab:right:selected,QTabBar::tab:right:hover{ 547 | border-width:0px 0px 0px 2px; 548 | } 549 | 550 | QTabBar::tab:bottom:selected,QTabBar::tab:bottom:hover{ 551 | border-width:0px 0px 2px 0px; 552 | } 553 | 554 | QTabBar::tab:left:selected,QTabBar::tab:left:hover{ 555 | border-width:0px 2px 0px 0px; 556 | } 557 | 558 | QTabBar::tab:first:top:selected,QTabBar::tab:first:top:hover,QTabBar::tab:first:bottom:selected,QTabBar::tab:first:bottom:hover{ 559 | border-left-width:1px; 560 | border-left-color:transparent; 561 | } 562 | 563 | QTabBar::tab:first:left:selected,QTabBar::tab:first:left:hover,QTabBar::tab:first:right:selected,QTabBar::tab:first:right:hover{ 564 | border-top-width:1px; 565 | border-top-color:transparent; 566 | } 567 | 568 | QTabBar::tab:last:top:selected,QTabBar::tab:last:top:hover,QTabBar::tab:last:bottom:selected,QTabBar::tab:last:bottom:hover{ 569 | border-right-width:1px; 570 | border-right-color:transparent; 571 | } 572 | 573 | QTabBar::tab:last:left:selected,QTabBar::tab:last:left:hover,QTabBar::tab:last:right:selected,QTabBar::tab:last:right:hover{ 574 | border-bottom-width:1px; 575 | border-bottom-color:transparent; 576 | } 577 | 578 | QStatusBar::item{ 579 | border:0px solid transparent; 580 | border-radius:3px; 581 | } 582 | 583 | QToolBox::tab,QGroupBox#gboxDevicePanel,QGroupBox#gboxDeviceTitle,QFrame#gboxDevicePanel,QFrame#gboxDeviceTitle{ 584 | padding:3px; 585 | border-radius:5px; 586 | color:#eeffff; 587 | background:rgba(97,97,97,0.31); 588 | } 589 | 590 | QToolTip{ 591 | border:1px solid rgba(116,116,116,0.31); 592 | padding:1px; 593 | color:#eeffff; 594 | background:#212121; 595 | } 596 | 597 | QToolBox::tab:selected{ 598 | background:rgba(116,116,116,0.31); 599 | } 600 | 601 | QPrintPreviewDialog QToolButton{ 602 | border:0px solid transparent; 603 | border-radius:0px; 604 | margin:0px; 605 | padding:3px; 606 | background:rgba(97,97,97,0.31); 607 | } 608 | 609 | QColorDialog QPushButton,QFileDialog QPushButton{ 610 | min-width:80px; 611 | } 612 | 613 | QToolButton#qt_calendar_prevmonth{ 614 | icon-size:0px; 615 | min-width:20px; 616 | image:url(:/qss/common/calendar_prevmonth.png); 617 | } 618 | 619 | QToolButton#qt_calendar_nextmonth{ 620 | icon-size:0px; 621 | min-width:20px; 622 | image:url(:/qss/common/calendar_nextmonth.png); 623 | } 624 | 625 | QToolButton#qt_calendar_prevmonth,QToolButton#qt_calendar_nextmonth,QToolButton#qt_calendar_monthbutton,QToolButton#qt_calendar_yearbutton{ 626 | border:0px solid transparent; 627 | border-radius:3px; 628 | margin:3px 3px 3px 3px; 629 | padding:3px; 630 | background:none; 631 | } 632 | 633 | QToolButton#qt_calendar_prevmonth:hover,QToolButton#qt_calendar_nextmonth:hover,QToolButton#qt_calendar_monthbutton:hover,QToolButton#qt_calendar_yearbutton:hover,QToolButton#qt_calendar_prevmonth:pressed,QToolButton#qt_calendar_nextmonth:pressed,QToolButton#qt_calendar_monthbutton:pressed,QToolButton#qt_calendar_yearbutton:pressed{ 634 | border:0px solid transparent; 635 | } 636 | 637 | QCalendarWidget QSpinBox#qt_calendar_yearedit{ 638 | margin:2px; 639 | } 640 | 641 | QCalendarWidget QToolButton::menu-indicator{ 642 | image:None; 643 | } 644 | 645 | QCalendarWidget QTableView{ 646 | border-width:0px; 647 | } 648 | 649 | QCalendarWidget QWidget#qt_calendar_navigationbar{ 650 | border:1px solid rgba(116,116,116,0.31); 651 | border-width:1px 1px 0px 1px; 652 | background:#1a1a1a; 653 | } 654 | 655 | QComboBox QAbstractItemView::item{ 656 | min-height:20px; 657 | min-width:10px; 658 | } 659 | 660 | QTableView[model="true"]::item{ 661 | padding:0px; 662 | margin:0px; 663 | } 664 | 665 | QTableView QLineEdit,QTableView QComboBox,QTableView QSpinBox,QTableView QDoubleSpinBox,QTableView QDateEdit,QTableView QTimeEdit,QTableView QDateTimeEdit{ 666 | border-width:0px; 667 | border-radius:0px; 668 | } 669 | 670 | QTableView QLineEdit:focus,QTableView QComboBox:focus,QTableView QSpinBox:focus,QTableView QDoubleSpinBox:focus,QTableView QDateEdit:focus,QTableView QTimeEdit:focus,QTableView QDateTimeEdit:focus{ 671 | border-width:0px; 672 | border-radius:0px; 673 | } 674 | 675 | QLineEdit,QTextEdit,QPlainTextEdit,QSpinBox,QDoubleSpinBox,QComboBox,QDateEdit,QTimeEdit,QDateTimeEdit{ 676 | background:#212121; 677 | } 678 | 679 | QTabWidget::pane:top{top:-1px;} 680 | QTabWidget::pane:bottom{bottom:-1px;} 681 | QTabWidget::pane:left{right:-1px;} 682 | QTabWidget::pane:right{left:-1px;} 683 | 684 | #theoreticalCodeLengthBtn{ 685 | color:#c792ea; 686 | } 687 | 688 | *:disabled, #theoreticalCodeLengthBtn:disabled{ 689 | background:#212121; 690 | border-color:transparent; 691 | color:#4f6875; 692 | } 693 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | --------------------------------------------------------------------------------