├── docs └── support.md ├── pkg ├── filter │ └── filter.go ├── pinyin │ ├── sample │ │ ├── qq.qcel │ │ ├── qq.qpyd │ │ ├── baidu.bcd │ │ ├── music.uwl │ │ ├── sogou.scel │ │ ├── baidu.bdict │ │ ├── ChsPinyinUDL.dat │ │ ├── sogou_bak_v2.bin │ │ ├── sogou_bak_v3.bin │ │ ├── 拼音词库备份2023-08-19.dict │ │ ├── 拼音词库备份2023-08-29.dict │ │ └── dan.txt │ ├── util.go │ ├── pinyin.go │ ├── qq_qpyd.go │ ├── jiajia.go │ ├── sogou_bak_v3.go │ ├── ziguang_uwl.go │ ├── sogou_scel.go │ ├── baidu_bdict.go │ ├── custom.go │ ├── pinyin_test.go │ ├── kafan.go │ ├── mspy_udl.go │ └── sogou_bak_v2.go ├── wubi │ ├── data │ │ └── wubilex.txt │ ├── sample │ │ ├── baidu.def │ │ ├── daniu.dmg │ │ ├── jidian.mb │ │ ├── ChsWubi.lex │ │ ├── main.duodb │ │ ├── ChsPinyinUDP.lex │ │ ├── UserDefinedPhrase.dat │ │ ├── 五笔词库备份2023-08-29.dict │ │ └── duoduo.txt │ ├── util.go │ ├── fcitx4_mb.go │ ├── words.go │ ├── duodb.go │ ├── dddmg.go │ ├── jidian_mb.go │ ├── wubi.go │ ├── jidian.go │ ├── baidu_def.go │ ├── kafan.go │ ├── wubi_test.go │ ├── custom.go │ ├── mswb_lex.go │ └── msudp_dat.go ├── core │ ├── filter.go │ ├── core_test.go │ ├── sample │ │ └── words.txt │ ├── convert.go │ ├── format.go │ └── core.go ├── util │ ├── ms_time.go │ ├── util.go │ ├── bytes.go │ ├── reader.go │ └── encoding.go └── encoder │ ├── pinyin_test.go │ ├── pinyin.go │ ├── encoder.go │ └── wubi.go ├── frontend ├── src │ ├── vite-env.d.ts │ ├── style.css │ ├── main.ts │ ├── App.vue │ ├── assets │ │ └── vue.svg │ └── components │ │ └── Converter.vue ├── tsconfig.node.json ├── .gitignore ├── index.html ├── package.json ├── vite.config.ts ├── tsconfig.json ├── components.d.ts ├── public │ └── vite.svg ├── README.md ├── server.go └── auto-imports.d.ts ├── main.go ├── .gitmodules ├── .gitignore ├── go.mod ├── .chglog ├── config.yml └── CHANGELOG.tpl.md ├── cmd ├── dmg2txt │ └── main.go ├── duodb2txt │ └── main.go └── cmd.go ├── go.sum ├── .github └── workflows │ ├── commit.yml │ └── release.yml ├── README.md ├── CHANGELOG.md └── LICENSE /docs/support.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pkg/filter/filter.go: -------------------------------------------------------------------------------- 1 | package filter 2 | -------------------------------------------------------------------------------- /frontend/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /frontend/src/style.css: -------------------------------------------------------------------------------- 1 | #app { 2 | display: flex; 3 | justify-content: center; 4 | } -------------------------------------------------------------------------------- /pkg/pinyin/sample/qq.qcel: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/qq.qcel -------------------------------------------------------------------------------- /pkg/pinyin/sample/qq.qpyd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/qq.qpyd -------------------------------------------------------------------------------- /pkg/wubi/data/wubilex.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/wubi/data/wubilex.txt -------------------------------------------------------------------------------- /pkg/wubi/sample/baidu.def: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/wubi/sample/baidu.def -------------------------------------------------------------------------------- /pkg/wubi/sample/daniu.dmg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/wubi/sample/daniu.dmg -------------------------------------------------------------------------------- /pkg/wubi/sample/jidian.mb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/wubi/sample/jidian.mb -------------------------------------------------------------------------------- /pkg/pinyin/sample/baidu.bcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/baidu.bcd -------------------------------------------------------------------------------- /pkg/pinyin/sample/music.uwl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/music.uwl -------------------------------------------------------------------------------- /pkg/pinyin/sample/sogou.scel: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/sogou.scel -------------------------------------------------------------------------------- /pkg/wubi/sample/ChsWubi.lex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/wubi/sample/ChsWubi.lex -------------------------------------------------------------------------------- /pkg/wubi/sample/main.duodb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/wubi/sample/main.duodb -------------------------------------------------------------------------------- /pkg/pinyin/sample/baidu.bdict: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/baidu.bdict -------------------------------------------------------------------------------- /pkg/wubi/sample/ChsPinyinUDP.lex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/wubi/sample/ChsPinyinUDP.lex -------------------------------------------------------------------------------- /pkg/pinyin/sample/ChsPinyinUDL.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/ChsPinyinUDL.dat -------------------------------------------------------------------------------- /pkg/pinyin/sample/sogou_bak_v2.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/sogou_bak_v2.bin -------------------------------------------------------------------------------- /pkg/pinyin/sample/sogou_bak_v3.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/sogou_bak_v3.bin -------------------------------------------------------------------------------- /pkg/wubi/sample/UserDefinedPhrase.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/wubi/sample/UserDefinedPhrase.dat -------------------------------------------------------------------------------- /pkg/wubi/sample/五笔词库备份2023-08-29.dict: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/wubi/sample/五笔词库备份2023-08-29.dict -------------------------------------------------------------------------------- /pkg/pinyin/sample/拼音词库备份2023-08-19.dict: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/拼音词库备份2023-08-19.dict -------------------------------------------------------------------------------- /pkg/pinyin/sample/拼音词库备份2023-08-29.dict: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nopdan/rose/HEAD/pkg/pinyin/sample/拼音词库备份2023-08-29.dict -------------------------------------------------------------------------------- /frontend/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import './style.css' 3 | import App from './App.vue' 4 | 5 | createApp(App).mount('#app') 6 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright © 2023 nopdan 3 | */ 4 | package main 5 | 6 | import "github.com/nopdan/rose/cmd" 7 | 8 | func main() { 9 | cmd.Cmd() 10 | } 11 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "pinyin-data"] 2 | path = pinyin-data 3 | url = https://github.com/nopdan/pinyin-data 4 | [submodule "UnicodeCJK-WuBi"] 5 | path = UnicodeCJK-WuBi 6 | url = https://github.com/CNMan/UnicodeCJK-WuBi 7 | -------------------------------------------------------------------------------- /frontend/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /pkg/core/filter.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | type FilterConfig struct { 4 | WordLenMin int // 过滤小于这个长度的词 5 | WordLenMax int // 过滤大于这个长度的词 6 | FreqLenMin int // 过滤词频小于这个值的词 7 | FreqLenMax int // 过滤词频大于这个值的词 8 | // 根据词过滤 9 | HasAlphabet bool // 过滤含英文的词 10 | HasNumber bool // 过滤含数字的词 11 | } -------------------------------------------------------------------------------- /pkg/util/ms_time.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import "time" 4 | 5 | func MsToTime(stamp uint32) time.Time { 6 | return time.Unix(int64(stamp), 0).Add(946684800 * time.Second) 7 | } 8 | 9 | func MsTimeTo(t time.Time) []byte { 10 | return To4Bytes(t.Add(-946684800 * time.Second).Unix()) 11 | } 12 | -------------------------------------------------------------------------------- /pkg/encoder/pinyin_test.go: -------------------------------------------------------------------------------- 1 | package encoder 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | ) 7 | 8 | func TestMatch(t *testing.T) { 9 | 10 | enc := NewPinyin() 11 | 12 | fmt.Println(enc.Encode("会计师")) 13 | 14 | fmt.Println(enc.Encode("一个人参加了会议")) 15 | 16 | fmt.Println(enc.Encode("α")) 17 | } 18 | -------------------------------------------------------------------------------- /frontend/src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Vue + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | # Dependency directories (remove the comment below to include it) 15 | # vendor/ 16 | .vscode* 17 | 18 | *.zip 19 | build/ 20 | pkg/encoder/data/ 21 | pkg/pinyin/data/ 22 | test/ 23 | test.txt 24 | 25 | server/dist -------------------------------------------------------------------------------- /pkg/encoder/pinyin.go: -------------------------------------------------------------------------------- 1 | package encoder 2 | 3 | import ( 4 | "github.com/nopdan/pinyin" 5 | ) 6 | 7 | type Pinyin struct { 8 | py *pinyin.Pinyin 9 | } 10 | 11 | func NewPinyin() *Pinyin { 12 | py := pinyin.New() 13 | py.AddFile("./data/duoyin.txt") 14 | py.AddFile("./data/pinyin.txt") 15 | py.AddFile("./data/correct.txt") 16 | return &Pinyin{py: py} 17 | } 18 | 19 | // 自动注音 20 | func (p Pinyin) Encode(word string) []string { 21 | return p.py.Match(word) 22 | } 23 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/nopdan/rose 2 | 3 | go 1.21 4 | 5 | require ( 6 | github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f 7 | github.com/nopdan/pinyin v0.3.5 8 | github.com/olekukonko/tablewriter v0.0.5 9 | golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 10 | golang.org/x/net v0.14.0 11 | golang.org/x/text v0.12.0 12 | ) 13 | 14 | require ( 15 | github.com/mattn/go-runewidth v0.0.9 // indirect 16 | github.com/nopdan/ku v0.3.5 // indirect 17 | ) 18 | -------------------------------------------------------------------------------- /frontend/src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pkg/util/util.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "fmt" 5 | "io" 6 | "runtime" 7 | 8 | "golang.org/x/exp/constraints" 9 | ) 10 | 11 | func Info[T constraints.Integer](r io.Reader, size T, info string) { 12 | tmp := ReadN(r, size) 13 | fmt.Printf("%s%s\n", info, DecodeMust(tmp, "UTF-16LE")) 14 | } 15 | 16 | func PrintHex(b []byte) { 17 | for _, v := range b { 18 | fmt.Printf("%02x ", v) 19 | } 20 | fmt.Println() 21 | } 22 | 23 | var LineBreak string 24 | 25 | func init() { 26 | switch runtime.GOOS { 27 | case "windows": 28 | LineBreak = "\r\n" 29 | case "linux", "darwin": 30 | LineBreak = "\n" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /.chglog/config.yml: -------------------------------------------------------------------------------- 1 | style: github 2 | template: CHANGELOG.tpl.md 3 | info: 4 | title: CHANGELOG 5 | repository_url: https://github.com/nopdan/rose 6 | options: 7 | commits: 8 | # filters: 9 | # Type: 10 | # - feat 11 | # - fix 12 | # - perf 13 | # - refactor 14 | commit_groups: 15 | # title_maps: 16 | # feat: Features 17 | # fix: Bug Fixes 18 | # perf: Performance Improvements 19 | # refactor: Code Refactoring 20 | header: 21 | pattern: "^(\\w*)\\:\\s(.*)$" 22 | pattern_maps: 23 | - Type 24 | - Subject 25 | notes: 26 | keywords: 27 | - BREAKING CHANGE -------------------------------------------------------------------------------- /pkg/util/bytes.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "encoding/binary" 5 | 6 | "golang.org/x/exp/constraints" 7 | ) 8 | 9 | // 字节(小端)转为整数 10 | func BytesToInt(b []byte) int { 11 | var ret int 12 | for i, v := range b { 13 | ret |= int(v) << (i * 8) 14 | } 15 | return ret 16 | } 17 | 18 | // 转换为长度为 4 的字节切片 19 | func To4Bytes[T constraints.Integer](i T) []byte { 20 | ret := make([]byte, 4) 21 | binary.LittleEndian.PutUint32(ret, uint32(i)) 22 | return ret 23 | } 24 | 25 | // 转换为长度为 2 的字节切片 26 | func To2Bytes[T constraints.Integer](i T) []byte { 27 | ret := make([]byte, 2) 28 | binary.LittleEndian.PutUint16(ret, uint16(i)) 29 | return ret 30 | } 31 | -------------------------------------------------------------------------------- /pkg/wubi/util.go: -------------------------------------------------------------------------------- 1 | package wubi 2 | 3 | import ( 4 | "io" 5 | 6 | "github.com/nopdan/rose/pkg/util" 7 | "golang.org/x/exp/constraints" 8 | ) 9 | 10 | var ( 11 | ReadUint16 = util.ReadUint16 12 | ReadUint32 = util.ReadUint32 13 | ) 14 | 15 | func ReadN[T constraints.Integer](r io.Reader, size T) []byte { 16 | return util.ReadN(r, size) 17 | } 18 | 19 | func ReadIntN[T constraints.Integer](r io.Reader, size T) int { 20 | return util.ReadIntN(r, size) 21 | } 22 | 23 | func To2Bytes[T constraints.Integer](i T) []byte { 24 | return util.To2Bytes(i) 25 | } 26 | 27 | func To4Bytes[T constraints.Integer](i T) []byte { 28 | return util.To4Bytes(i) 29 | } 30 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "vue": "^3.3.4" 13 | }, 14 | "devDependencies": { 15 | "@vicons/ionicons5": "^0.12.0", 16 | "@vitejs/plugin-vue": "^4.3.3", 17 | "axios": "^1.5.0", 18 | "naive-ui": "^2.34.4", 19 | "typescript": "^5.2.2", 20 | "unplugin-auto-import": "^0.16.6", 21 | "unplugin-vue-components": "^0.25.1", 22 | "vite": "^4.4.9", 23 | "vue-tsc": "^1.8.8" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /pkg/core/core_test.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | "testing" 7 | ) 8 | 9 | func TestMain(t *testing.T) { 10 | c := &Config{ 11 | IName: "sample/words.txt", 12 | IFormat: "words", 13 | OFormat: "rime", 14 | OName: "test/to_rime.txt", 15 | } 16 | c.Marshal() 17 | } 18 | 19 | func TestFormatList(t *testing.T) { 20 | // 检查 id 是否有重复 21 | formatSet := make(map[string]struct{}) 22 | for _, f := range FormatList { 23 | ids := strings.Split(f.ID, ",") 24 | for _, id := range ids { 25 | if _, ok := formatSet[id]; ok { 26 | t.Fatalf("id %s 重复", id) 27 | } 28 | formatSet[id] = struct{}{} 29 | } 30 | } 31 | fmt.Println("id 无重复") 32 | PrintFormatList() 33 | } 34 | -------------------------------------------------------------------------------- /pkg/util/reader.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "encoding/binary" 5 | "io" 6 | 7 | "golang.org/x/exp/constraints" 8 | ) 9 | 10 | // 读取指定数量字节 11 | func ReadN[T constraints.Integer](r io.Reader, size T) []byte { 12 | tmp := make([]byte, size) 13 | r.Read(tmp) 14 | return tmp 15 | } 16 | 17 | func ReadIntN[T constraints.Integer](r io.Reader, size T) int { 18 | tmp := ReadN(r, size) 19 | return BytesToInt(tmp) 20 | } 21 | 22 | // 读取小端 uint16 23 | func ReadUint16(r io.Reader) uint16 { 24 | tmp := ReadN(r, 2) 25 | return binary.LittleEndian.Uint16(tmp) 26 | } 27 | 28 | // 读取小端 uint32 29 | func ReadUint32(r io.Reader) uint32 { 30 | tmp := ReadN(r, 4) 31 | return binary.LittleEndian.Uint32(tmp) 32 | } 33 | -------------------------------------------------------------------------------- /pkg/pinyin/util.go: -------------------------------------------------------------------------------- 1 | package pinyin 2 | 3 | import ( 4 | "io" 5 | 6 | "github.com/nopdan/rose/pkg/util" 7 | "golang.org/x/exp/constraints" 8 | ) 9 | 10 | const ( 11 | _u16 uint16 = 0 12 | _u32 uint32 = 0 13 | ) 14 | 15 | var ( 16 | ReadUint16 = util.ReadUint16 17 | ReadUint32 = util.ReadUint32 18 | BytesToInt = util.BytesToInt 19 | ) 20 | 21 | func ReadN[T constraints.Integer](r io.Reader, size T) []byte { 22 | return util.ReadN(r, size) 23 | } 24 | 25 | func ReadIntN[T constraints.Integer](r io.Reader, size T) int { 26 | return util.ReadIntN(r, size) 27 | } 28 | 29 | func To2Bytes[T constraints.Integer](i T) []byte { 30 | return util.To2Bytes(i) 31 | } 32 | 33 | func To4Bytes[T constraints.Integer](i T) []byte { 34 | return util.To4Bytes(i) 35 | } 36 | -------------------------------------------------------------------------------- /frontend/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import vue from "@vitejs/plugin-vue"; 3 | import AutoImport from "unplugin-auto-import/vite"; 4 | import Components from "unplugin-vue-components/vite"; 5 | import { NaiveUiResolver } from "unplugin-vue-components/resolvers"; 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | plugins: [ 10 | vue(), 11 | AutoImport({ 12 | imports: [ 13 | "vue", 14 | { 15 | "naive-ui": [ 16 | "useDialog", 17 | "useMessage", 18 | "useNotification", 19 | "useLoadingBar", 20 | ], 21 | }, 22 | ], 23 | }), 24 | Components({ 25 | resolvers: [NaiveUiResolver()], 26 | }), 27 | ], 28 | }); 29 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "preserve", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /.chglog/CHANGELOG.tpl.md: -------------------------------------------------------------------------------- 1 | {{ range .Versions }} 2 | ## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} ({{ datetime "2006-01-02" .Tag.Date }}) 3 | 4 | {{ range .CommitGroups -}} 5 | ### {{ .Title }} 6 | 7 | {{ range .Commits -}} 8 | * {{ .Subject }} 9 | {{ end }} 10 | {{ end -}} 11 | 12 | {{- if .RevertCommits -}} 13 | ### Reverts 14 | 15 | {{ range .RevertCommits -}} 16 | * {{ .Revert.Header }} 17 | {{ end }} 18 | {{ end -}} 19 | 20 | {{- if .MergeCommits -}} 21 | ### Pull Requests 22 | 23 | {{ range .MergeCommits -}} 24 | * {{ .Header }} 25 | {{ end }} 26 | {{ end -}} 27 | 28 | {{- if .NoteGroups -}} 29 | {{ range .NoteGroups -}} 30 | ### {{ .Title }} 31 | 32 | {{ range .Notes }} 33 | {{ .Body }} 34 | {{ end }} 35 | {{ end -}} 36 | {{ end -}} 37 | {{ end -}} -------------------------------------------------------------------------------- /cmd/dmg2txt/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "fmt" 6 | "os" 7 | "path/filepath" 8 | "strings" 9 | 10 | "github.com/nopdan/rose/pkg/wubi" 11 | ) 12 | 13 | func main() { 14 | fmt.Printf("多多.dmg 转纯文本\n作者:单单 q37389732\n\n") 15 | var input string 16 | if len(os.Args) != 2 { 17 | fmt.Println("输入词库路径:") 18 | fmt.Scanln(&input) 19 | } else { 20 | input = os.Args[1] 21 | } 22 | data, err := os.ReadFile(input) 23 | if err != nil { 24 | os.Exit(1) 25 | } 26 | r := bytes.NewReader(data) 27 | 28 | f := wubi.NewDDdmg() 29 | di := f.Unmarshal(r) 30 | var buf bytes.Buffer 31 | for _, v := range di { 32 | buf.WriteString(v.Word) 33 | buf.WriteByte('\t') 34 | buf.WriteString(v.Code) 35 | buf.WriteByte('\n') 36 | } 37 | ext := filepath.Ext(input) 38 | name := strings.TrimSuffix(input, ext) + ".txt" 39 | os.WriteFile(name, buf.Bytes(), 0644) 40 | } 41 | -------------------------------------------------------------------------------- /cmd/duodb2txt/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "fmt" 6 | "os" 7 | "path/filepath" 8 | "strings" 9 | 10 | "github.com/nopdan/rose/pkg/wubi" 11 | ) 12 | 13 | func main() { 14 | fmt.Printf("多多输入法.duodb 转纯文本\n作者:单单 q37389732\n\n") 15 | var input string 16 | if len(os.Args) != 2 { 17 | fmt.Println("输入词库路径:") 18 | fmt.Scanln(&input) 19 | } else { 20 | input = os.Args[1] 21 | } 22 | data, err := os.ReadFile(input) 23 | if err != nil { 24 | os.Exit(1) 25 | } 26 | r := bytes.NewReader(data) 27 | 28 | f := wubi.NewDuoDB() 29 | di := f.Unmarshal(r) 30 | var buf bytes.Buffer 31 | for _, v := range di { 32 | buf.WriteString(v.Word) 33 | buf.WriteByte('\t') 34 | buf.WriteString(v.Code) 35 | buf.WriteByte('\n') 36 | } 37 | ext := filepath.Ext(input) 38 | name := strings.TrimSuffix(input, ext) + ".txt" 39 | os.WriteFile(name, buf.Bytes(), 0644) 40 | } 41 | -------------------------------------------------------------------------------- /pkg/wubi/fcitx4_mb.go: -------------------------------------------------------------------------------- 1 | package wubi 2 | 3 | import ( 4 | "bytes" 5 | ) 6 | 7 | type Fcitx4Mb struct{ Template } 8 | 9 | func NewFcitx4Mb() *Fcitx4Mb { 10 | f := new(Fcitx4Mb) 11 | f.Name = "fcitx4.mb" 12 | f.ID = "fcitx4" 13 | return f 14 | } 15 | 16 | func (Fcitx4Mb) Unmarshal(r *bytes.Reader) []*Entry { 17 | r.Seek(0x55, 0) 18 | // 词条数 19 | count := ReadIntN(r, 4) 20 | di := make([]*Entry, 0, count) 21 | 22 | for i := 0; i < count; i++ { 23 | codeBytes := ReadN(r, 5) 24 | code := trimSufZero(codeBytes) 25 | 26 | wordSize := ReadIntN(r, 4) - 1 27 | wordBytes := ReadN(r, wordSize) 28 | word := string(wordBytes) 29 | 30 | di = append(di, &Entry{ 31 | Word: word, 32 | Code: code, 33 | }) 34 | r.Seek(10, 1) 35 | } 36 | return di 37 | } 38 | 39 | // 去掉末尾的 0 40 | func trimSufZero(b []byte) string { 41 | for i := len(b); i > 0; i-- { 42 | if b[i-1] != 0 { 43 | return string(b[:i]) 44 | } 45 | } 46 | return "" 47 | } 48 | -------------------------------------------------------------------------------- /pkg/wubi/words.go: -------------------------------------------------------------------------------- 1 | package wubi 2 | 3 | import ( 4 | "bufio" 5 | "bytes" 6 | ) 7 | 8 | const WORDS = 3 9 | 10 | type Words struct { 11 | Template 12 | } 13 | 14 | func init() { 15 | FormatList = append(FormatList, NewWords()) 16 | } 17 | func NewWords() *Words { 18 | f := new(Words) 19 | f.Name = "纯词组" 20 | f.ID = "words" 21 | f.CanMarshal = true 22 | return f 23 | } 24 | 25 | func (f *Words) GetKind() int { 26 | return WORDS 27 | } 28 | func (f *Words) Unmarshal(r *bytes.Reader) []*Entry { 29 | return nil 30 | } 31 | 32 | // 特殊 33 | func (f *Words) UnmarshalStr(r *bytes.Reader) []string { 34 | di := make([]string, 0, r.Size()>>8) 35 | scan := bufio.NewScanner(r) 36 | for scan.Scan() { 37 | di = append(di, scan.Text()) 38 | } 39 | return di 40 | } 41 | 42 | func (f *Words) MarshalStr(di []string) []byte { 43 | var buf bytes.Buffer 44 | for _, v := range di { 45 | buf.WriteString(v) 46 | buf.WriteString("\r\n") 47 | } 48 | return buf.Bytes() 49 | } 50 | -------------------------------------------------------------------------------- /pkg/wubi/duodb.go: -------------------------------------------------------------------------------- 1 | package wubi 2 | 3 | import ( 4 | "bytes" 5 | ) 6 | 7 | type DuoDB struct{ Template } 8 | 9 | func init() { 10 | FormatList = append(FormatList, NewDuoDB()) 11 | } 12 | func NewDuoDB() *DuoDB { 13 | f := new(DuoDB) 14 | f.Name = "多多v4.duodb" 15 | f.ID = "duoduo_duodb,duodb" 16 | return f 17 | } 18 | 19 | func (DuoDB) Unmarshal(r *bytes.Reader) []*Entry { 20 | di := make([]*Entry, 0, r.Size()>>8) 21 | 22 | r.Seek(0x4086C, 0) 23 | offsetList := make([]uint32, 0, 12) 24 | for { 25 | offset := ReadUint32(r) 26 | if offset == 0 { 27 | break 28 | } 29 | offsetList = append(offsetList, offset) 30 | } 31 | for _, offset := range offsetList { 32 | r.Seek(int64(offset), 0) 33 | r.Seek(4, 1) 34 | codeLen := ReadIntN(r, 1) 35 | code := string(ReadN(r, codeLen)) 36 | wordSize := ReadIntN(r, 2) 37 | word := string(ReadN(r, wordSize)) 38 | 39 | di = append(di, &Entry{ 40 | Word: word, 41 | Code: code, 42 | }) 43 | } 44 | return di 45 | } 46 | -------------------------------------------------------------------------------- /pkg/core/sample/words.txt: -------------------------------------------------------------------------------- 1 | 单于拜玉玺 2 | 单于北望拂云堆 3 | 单于不敢射 4 | 单于不向南牧马 5 | 单于城下关山曲 6 | 单于犯蓟壖 7 | 单于烽火动 8 | 单于鼓角雄 9 | 单于古台下 10 | 单于溅血染朱轮 11 | 单于骄爱猎 12 | 单于近突围 13 | 单于竟未灭 14 | 单于寇井陉 15 | 单于寇我垒 16 | 单于款关入 17 | 单于浪惊喜 18 | 单于泪沾臆 19 | 单于猎火照狼山 20 | 单于每近沙场猎 21 | 单于莫近塞 22 | 单于南去善阳关 23 | 单于陪武帐 24 | 单于破胆还 25 | 单于秋色来 26 | 单于若问君家世 27 | 单于送葬还垂泪 28 | 单于虽不战 29 | 单于台上望伊州 30 | 单于下阴山 31 | 单于夜遁逃 32 | 单于夜火奔 33 | 单于夜将奔 34 | 单于一平荡 35 | 单于已在金山西 36 | 单于玉塞振佳兵 37 | 单于骤款塞 38 | 单于作边氓 39 | 单于昨夜寇新秦 40 | 单车不可驻 41 | 单车曾出塞 42 | 单车触火云 43 | 单车动夙夜 44 | 单车渡殽渑 45 | 单车路萧条 46 | 单车入燕赵 47 | 单车我当前 48 | 单船近阶墀 49 | 单床独栖息 50 | 单床欢有馀 51 | 单辞忽受诬 52 | 单刀蓟北从军 53 | 单飞后片雪 54 | 单飞越鸟啼青霄 55 | 单父多鸣琴 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 | 单衫冲雪夜深来 82 | 单行愁路窄 83 | 单衣颇新绰 84 | 单衣染焙香 85 | 单已诣示入禅 86 | 单衣伫立 87 | 单舟戒轻装 88 | -------------------------------------------------------------------------------- /pkg/wubi/dddmg.go: -------------------------------------------------------------------------------- 1 | package wubi 2 | 3 | import ( 4 | "bytes" 5 | ) 6 | 7 | type DDdmg struct{ Template } 8 | 9 | func init() { 10 | FormatList = append(FormatList, NewDDdmg()) 11 | } 12 | func NewDDdmg() *DDdmg { 13 | f := new(DDdmg) 14 | f.Name = "多多v3.dmg" 15 | f.ID = "duoduo_dmg,dmg" 16 | return f 17 | } 18 | 19 | func (DDdmg) Unmarshal(r *bytes.Reader) []*Entry { 20 | di := make([]*Entry, 0, r.Size()>>8) 21 | r.Seek(0x4089C, 0) 22 | offsetList := make([]uint32, 0, 12) 23 | for { 24 | offset := ReadUint32(r) 25 | if offset == 0 { 26 | break 27 | } 28 | offsetList = append(offsetList, offset) 29 | } 30 | for _, offset := range offsetList { 31 | r.Seek(int64(offset), 0) 32 | rank := ReadIntN(r, 4) 33 | _ = rank 34 | codeLen := ReadIntN(r, 1) 35 | code := string(ReadN(r, codeLen)) 36 | wordSize := ReadIntN(r, 1) 37 | word := string(ReadN(r, wordSize)) 38 | 39 | di = append(di, &Entry{ 40 | Word: word, 41 | Code: code, 42 | }) 43 | } 44 | return di 45 | } 46 | -------------------------------------------------------------------------------- /frontend/components.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // Generated by unplugin-vue-components 5 | // Read more: https://github.com/vuejs/core/pull/3399 6 | export {} 7 | 8 | declare module 'vue' { 9 | export interface GlobalComponents { 10 | Converter: typeof import('./src/components/Converter.vue')['default'] 11 | NButton: typeof import('naive-ui')['NButton'] 12 | NCard: typeof import('naive-ui')['NCard'] 13 | NDialogProvider: typeof import('naive-ui')['NDialogProvider'] 14 | NForm: typeof import('naive-ui')['NForm'] 15 | NFormItem: typeof import('naive-ui')['NFormItem'] 16 | NIcon: typeof import('naive-ui')['NIcon'] 17 | NRadio: typeof import('naive-ui')['NRadio'] 18 | NRadioGroup: typeof import('naive-ui')['NRadioGroup'] 19 | NSelect: typeof import('naive-ui')['NSelect'] 20 | NText: typeof import('naive-ui')['NText'] 21 | NUpload: typeof import('naive-ui')['NUpload'] 22 | NUploadDragger: typeof import('naive-ui')['NUploadDragger'] 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /pkg/wubi/jidian_mb.go: -------------------------------------------------------------------------------- 1 | package wubi 2 | 3 | import ( 4 | "bytes" 5 | 6 | "github.com/nopdan/rose/pkg/util" 7 | ) 8 | 9 | type JidianMb struct{ Template } 10 | 11 | func init() { 12 | FormatList = append(FormatList, NewJidianMb()) 13 | } 14 | func NewJidianMb() *JidianMb { 15 | f := new(JidianMb) 16 | f.Name = "极点码表.mb" 17 | f.ID = "jidian_mb,jdmb,mb" 18 | return f 19 | } 20 | 21 | func (d *JidianMb) Unmarshal(r *bytes.Reader) []*Entry { 22 | di := make([]*Entry, 0, r.Size()>>8) 23 | r.Seek(0x17, 0) 24 | util.Info(r, 0x11F-0x17, "") 25 | 26 | r.Seek(0x1B620, 0) 27 | for r.Len() > 3 { 28 | codeLen, _ := r.ReadByte() 29 | if codeLen == 0xff { 30 | r.Seek(1, 1) 31 | continue 32 | } 33 | wordSize, _ := r.ReadByte() 34 | r.Seek(1, 1) 35 | 36 | // 读编码 37 | codeBytes := ReadN(r, codeLen) 38 | code := string(codeBytes) 39 | // 读词 40 | wordBytes := ReadN(r, wordSize) 41 | word := util.DecodeMust(wordBytes, "UTF-16LE") 42 | 43 | di = append(di, &Entry{ 44 | Word: word, 45 | Code: code, 46 | }) 47 | } 48 | return di 49 | } 50 | -------------------------------------------------------------------------------- /pkg/pinyin/pinyin.go: -------------------------------------------------------------------------------- 1 | package pinyin 2 | 3 | import ( 4 | "bytes" 5 | "slices" 6 | "strings" 7 | ) 8 | 9 | type Entry struct { 10 | Word string 11 | Pinyin []string 12 | Freq int 13 | } 14 | 15 | func (e *Entry) GetWord() string { return e.Word } 16 | 17 | type Format interface { 18 | GetName() string 19 | GetID() string 20 | GetCanMarshal() bool 21 | Marshal([]*Entry) []byte 22 | 23 | Unmarshal(*bytes.Reader) []*Entry 24 | GetKind() int 25 | } 26 | 27 | type Template struct { 28 | Name string // 名称 29 | ID string // 唯一 ID 30 | CanMarshal bool // 是否可以序列化 31 | } 32 | 33 | func (t *Template) GetName() string { return t.Name } 34 | func (t *Template) GetID() string { return t.ID } 35 | func (t *Template) GetCanMarshal() bool { return t.CanMarshal } 36 | func (t *Template) Marshal([]*Entry) []byte { return nil } 37 | func (t *Template) GetKind() int { return PINYIN } 38 | 39 | const PINYIN = 1 40 | 41 | var FormatList = make([]Format, 0, 20) 42 | 43 | func New(format string) Format { 44 | for _, v := range FormatList { 45 | if slices.Contains(strings.Split(v.GetID(), ","), format) { 46 | return v 47 | } 48 | } 49 | return nil 50 | } 51 | -------------------------------------------------------------------------------- /pkg/core/convert.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | import ( 4 | "github.com/nopdan/rose/pkg/encoder" 5 | "github.com/nopdan/rose/pkg/pinyin" 6 | "github.com/nopdan/rose/pkg/wubi" 7 | ) 8 | 9 | // 拼音转为五笔词库 10 | // 11 | // 形码方案,wubi86/wubi98/wubi08/phrase 12 | func (c *Config) ToWubi(di []string, hasRank bool) []byte { 13 | enc := encoder.New(c.Schema, c.MbData, c.AABC) 14 | new := make([]*wubi.Entry, 0, len(di)) 15 | for _, word := range di { 16 | code := enc.Encode(word) 17 | new = append(new, &wubi.Entry{ 18 | Word: word, 19 | Code: code, 20 | }) 21 | } 22 | return wubi.New(c.OFormat).Marshal(new, hasRank) 23 | } 24 | 25 | // 转换为拼音词库 26 | func (c *Config) ToPinyin(di []string) []byte { 27 | enc := encoder.NewPinyin() 28 | new := make([]*pinyin.Entry, 0, len(di)) 29 | for _, word := range di { 30 | new = append(new, &pinyin.Entry{ 31 | Word: word, 32 | Pinyin: enc.Encode(word), 33 | Freq: 1, 34 | }) 35 | } 36 | return pinyin.New(c.OFormat).Marshal(new) 37 | } 38 | 39 | func WubiToWords(di []*wubi.Entry) []string { 40 | new := make([]string, 0, len(di)) 41 | for _, e := range di { 42 | new = append(new, e.Word) 43 | } 44 | return new 45 | } 46 | 47 | func PinyinToWords(di []*pinyin.Entry) []string { 48 | new := make([]string, 0, len(di)) 49 | for _, e := range di { 50 | new = append(new, e.Word) 51 | } 52 | return new 53 | } 54 | -------------------------------------------------------------------------------- /pkg/core/format.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | import ( 4 | "cmp" 5 | "os" 6 | "slices" 7 | 8 | "github.com/nopdan/rose/pkg/pinyin" 9 | "github.com/nopdan/rose/pkg/wubi" 10 | "github.com/olekukonko/tablewriter" 11 | ) 12 | 13 | type Format struct { 14 | Name string `json:"name"` 15 | ID string `json:"id"` 16 | CanMarshal bool `json:"canMarshal"` 17 | Kind int `json:"kind"` 18 | } 19 | 20 | var FormatList = make([]*Format, 0, 20) 21 | 22 | func init() { 23 | for _, f := range pinyin.FormatList { 24 | FormatList = append(FormatList, &Format{ 25 | Name: f.GetName(), 26 | ID: f.GetID(), 27 | CanMarshal: f.GetCanMarshal(), 28 | Kind: f.GetKind(), 29 | }) 30 | } 31 | for _, f := range wubi.FormatList { 32 | FormatList = append(FormatList, &Format{ 33 | Name: f.GetName(), 34 | ID: f.GetID(), 35 | CanMarshal: f.GetCanMarshal(), 36 | Kind: f.GetKind(), 37 | }) 38 | } 39 | slices.SortStableFunc(FormatList, func(a, b *Format) int { 40 | return cmp.Compare(a.ID, b.ID) 41 | }) 42 | } 43 | 44 | func PrintFormatList() { 45 | table := tablewriter.NewWriter(os.Stdout) 46 | table.SetHeader([]string{"ID", "格式", "可导出"}) 47 | for _, f := range FormatList { 48 | canMarshal := "" 49 | if f.CanMarshal { 50 | canMarshal = "是" 51 | } 52 | table.Append([]string{f.ID, f.Name, canMarshal}) 53 | } 54 | table.Render() 55 | } 56 | -------------------------------------------------------------------------------- /pkg/encoder/encoder.go: -------------------------------------------------------------------------------- 1 | package encoder 2 | 3 | import ( 4 | "bufio" 5 | "bytes" 6 | "fmt" 7 | "io" 8 | "strings" 9 | 10 | "github.com/nopdan/rose/pkg/util" 11 | ) 12 | 13 | type Encoder interface { 14 | Encode(string) string // 编码一个词,可能有多个编码 15 | } 16 | 17 | func New(schema string, data []byte, isAABC bool) Encoder { 18 | if schema == "phrase" { 19 | return newPhrase() 20 | } 21 | if w := newWubi(schema, isAABC); w != nil { 22 | return w 23 | } 24 | 25 | var r io.Reader 26 | if data == nil { 27 | var err error 28 | r, err = util.Read(schema) 29 | if err != nil { 30 | fmt.Printf("读取文件失败:%s\n", schema) 31 | panic(err) 32 | } 33 | } else { 34 | rd := bytes.NewReader(data) 35 | r = util.NewReader(rd) 36 | } 37 | 38 | w := &Wubi{ 39 | Char: make(map[rune]string), 40 | IsAABC: isAABC, 41 | } 42 | scan := bufio.NewScanner(r) 43 | for scan.Scan() { 44 | fields := strings.Split(scan.Text(), "\t") 45 | if len(fields) < 2 { 46 | continue 47 | } 48 | word := []rune(fields[0]) 49 | // 跳过词组 50 | if len(word) != 1 { 51 | continue 52 | } 53 | char := word[0] 54 | w.Char[char] = fields[1] 55 | } 56 | return w 57 | } 58 | 59 | type Phrase struct { 60 | enc *Pinyin 61 | } 62 | 63 | func newPhrase() *Phrase { 64 | enc := NewPinyin() 65 | return &Phrase{enc: enc} 66 | } 67 | 68 | func (p Phrase) Encode(word string) string { 69 | return strings.Join(p.enc.Encode(word), "") 70 | } 71 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f h1:3BSP1Tbs2djlpprl7wCLuiqMaUh5SJkkzI2gDs+FgLs= 2 | github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14= 3 | github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= 4 | github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= 5 | github.com/nopdan/ku v0.3.5 h1:PqE0HesoaZO7NOuVH3Ou+G7lxwvunzc9PpiaCBeykeA= 6 | github.com/nopdan/ku v0.3.5/go.mod h1:0dizDuNKK7DMUYFBFS80+A1OWREchVvM/pNaQ6U4FP0= 7 | github.com/nopdan/pinyin v0.3.5 h1:N/96ZmlHcBSbL8184H2vBAyFTv4LSJiwRSGrfCDtzsk= 8 | github.com/nopdan/pinyin v0.3.5/go.mod h1:ocItCFlzfsgO3FVq4C1bDX1O0qDbMogu5eY+aXW4REk= 9 | github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= 10 | github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= 11 | golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= 12 | golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= 13 | golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= 14 | golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= 15 | golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= 16 | golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 17 | -------------------------------------------------------------------------------- /frontend/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pkg/wubi/wubi.go: -------------------------------------------------------------------------------- 1 | package wubi 2 | 3 | import ( 4 | "bytes" 5 | "slices" 6 | "strings" 7 | ) 8 | 9 | type Entry struct { 10 | Word string 11 | Code string 12 | Rank int 13 | } 14 | 15 | type Format interface { 16 | GetName() string 17 | GetID() string 18 | GetCanMarshal() bool 19 | Marshal([]*Entry, bool) []byte 20 | GetHasRank() bool 21 | 22 | Unmarshal(*bytes.Reader) []*Entry 23 | GetKind() int 24 | } 25 | 26 | type Template struct { 27 | Name string // 名称 28 | ID string // 唯一 ID 29 | CanMarshal bool // 是否可以序列化 30 | HasRank bool // 是否有 Rank 31 | } 32 | 33 | func (t *Template) GetName() string { return t.Name } 34 | func (t *Template) GetID() string { return t.ID } 35 | func (t *Template) GetCanMarshal() bool { return t.CanMarshal } 36 | func (t *Template) Marshal([]*Entry, bool) []byte { return nil } 37 | func (t *Template) GetHasRank() bool { return t.HasRank } 38 | func (t *Template) GetKind() int { return WUBI } 39 | 40 | const WUBI = 2 41 | 42 | var FormatList = make([]Format, 0, 20) 43 | 44 | func GenRank(di []*Entry) []*Entry { 45 | codeMap := make(map[string]int) 46 | for i := range di { 47 | codeMap[di[i].Code]++ 48 | di[i].Rank = codeMap[di[i].Code] 49 | } 50 | return di 51 | } 52 | 53 | func New(format string) Format { 54 | for _, v := range FormatList { 55 | if slices.Contains(strings.Split(v.GetID(), ","), format) { 56 | return v 57 | } 58 | } 59 | return nil 60 | } 61 | -------------------------------------------------------------------------------- /pkg/wubi/jidian.go: -------------------------------------------------------------------------------- 1 | package wubi 2 | 3 | import ( 4 | "bufio" 5 | "bytes" 6 | "sort" 7 | "strings" 8 | ) 9 | 10 | type Jidian struct{ Template } 11 | 12 | func init() { 13 | FormatList = append(FormatList, NewJidian()) 14 | } 15 | func NewJidian() *Jidian { 16 | f := new(Jidian) 17 | f.Name = "极点码表" 18 | f.ID = "jidian,jd" 19 | f.CanMarshal = true 20 | f.HasRank = true 21 | return f 22 | } 23 | 24 | func (Jidian) Unmarshal(r *bytes.Reader) []*Entry { 25 | di := make([]*Entry, 0, r.Size()>>8) 26 | 27 | scan := bufio.NewScanner(r) 28 | for scan.Scan() { 29 | entry := strings.Split(scan.Text(), " ") 30 | if len(entry) < 2 { 31 | continue 32 | } 33 | for i := 1; i < len(entry); i++ { 34 | di = append(di, &Entry{ 35 | Word: entry[i], 36 | Code: entry[0], 37 | Rank: i, 38 | }) 39 | } 40 | } 41 | return di 42 | } 43 | 44 | func (Jidian) Marshal(di []*Entry, hasRank bool) []byte { 45 | var buf bytes.Buffer 46 | buf.Grow(len(di)) 47 | 48 | sort.SliceStable(di, func(i, j int) bool { 49 | return di[i].Code < di[j].Code 50 | }) 51 | // 记录上一个编码 52 | lastCode := "" 53 | for i, v := range di { 54 | if lastCode != v.Code { 55 | if i != 0 { 56 | buf.WriteByte('\r') 57 | buf.WriteByte('\n') 58 | } 59 | buf.WriteString(v.Code) 60 | buf.WriteByte('\t') 61 | buf.WriteString(v.Word) 62 | lastCode = v.Code 63 | continue 64 | } 65 | buf.WriteByte(' ') 66 | buf.WriteString(v.Word) 67 | lastCode = v.Code 68 | } 69 | return buf.Bytes() 70 | } 71 | -------------------------------------------------------------------------------- /pkg/util/encoding.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "bufio" 5 | "io" 6 | "os" 7 | 8 | "github.com/gogs/chardet" 9 | "golang.org/x/net/html/charset" 10 | "golang.org/x/text/encoding" 11 | ) 12 | 13 | // 读取编码 14 | func LookupEnc(label string) encoding.Encoding { 15 | e, _ := charset.Lookup(label) 16 | return e 17 | } 18 | 19 | // 将 io.Reader 转换为 utf-8 编码 20 | func NewReader(r io.Reader) io.Reader { 21 | brd := bufio.NewReader(r) 22 | buf, _ := brd.Peek(1024) 23 | detector := chardet.NewTextDetector() 24 | cs, err := detector.DetectBest(buf) // 检测编码格式 25 | if err != nil { 26 | return brd 27 | } 28 | // fmt.Printf("cs: %+v\n", cs) 29 | if cs.Confidence < 95 && cs.Charset != "UTF-8" { 30 | cs.Charset = "GB18030" 31 | } 32 | e := LookupEnc(cs.Charset) 33 | return e.NewDecoder().Reader(brd) 34 | } 35 | 36 | // 读取文件,自动识别编码 37 | func Read(path string) (io.Reader, error) { 38 | f, err := os.Open(path) 39 | if err != nil { 40 | return f, err 41 | } 42 | return NewReader(f), nil 43 | } 44 | 45 | // 编码 46 | func Encode(str, label string) ([]byte, error) { 47 | e := LookupEnc(label) 48 | return e.NewEncoder().Bytes([]byte(str)) 49 | } 50 | func EncodeMust(str, label string) []byte { 51 | v, _ := Encode(str, label) 52 | return v 53 | } 54 | 55 | // 解码 56 | func Decode(src []byte, label string) (string, error) { 57 | e := LookupEnc(label) 58 | return e.NewDecoder().String(string(src)) 59 | } 60 | func DecodeMust(src []byte, label string) string { 61 | v, _ := Decode(src, label) 62 | return v 63 | } 64 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Vue 3 + TypeScript + Vite 2 | 3 | This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` 281 | -------------------------------------------------------------------------------- /pkg/pinyin/kafan.go: -------------------------------------------------------------------------------- 1 | package pinyin 2 | 3 | import ( 4 | "bytes" 5 | "fmt" 6 | "io" 7 | "strings" 8 | 9 | "github.com/nopdan/rose/pkg/encoder" 10 | ) 11 | 12 | type Kafan struct { 13 | Template 14 | pyList []string 15 | } 16 | 17 | func init() { 18 | FormatList = append(FormatList, NewKafan()) 19 | } 20 | 21 | func NewKafan() *Kafan { 22 | f := new(Kafan) 23 | f.Name = "卡饭拼音备份.dict" 24 | f.ID = "kfpybak,dict" 25 | 26 | f.pyList = []string{ 27 | " ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", 28 | "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 29 | "a", 30 | "ai", 31 | "an", 32 | "ang", 33 | "ao", 34 | "ba", 35 | "bai", 36 | "ban", 37 | "bang", 38 | "bao", 39 | "bei", 40 | "ben", 41 | "beng", 42 | "bi", 43 | "bian", 44 | "biao", 45 | "bie", 46 | "bin", 47 | "bing", 48 | "bo", 49 | "bu", 50 | "ca", 51 | "cai", 52 | "can", 53 | "cang", 54 | "cao", 55 | "ce", 56 | "cen", 57 | "ceng", 58 | "cha", 59 | "chai", 60 | "chan", 61 | "chang", 62 | "chao", 63 | "che", 64 | "chen", 65 | "cheng", 66 | "chi", 67 | "chong", 68 | "chou", 69 | "chu", 70 | "chua", 71 | "chuai", 72 | "chuan", 73 | "chuang", 74 | "chui", 75 | "chun", 76 | "chuo", 77 | "ci", 78 | "cong", 79 | "cou", 80 | "cu", 81 | "cuan", 82 | "cui", 83 | "cun", 84 | "cuo", 85 | "da", 86 | "dai", 87 | "dan", 88 | "dang", 89 | "dao", 90 | "de", 91 | "dei", 92 | "den", 93 | "deng", 94 | "di", 95 | "dia", 96 | "dian", 97 | "diao", 98 | "die", 99 | "ding", 100 | "diu", 101 | "dong", 102 | "dou", 103 | "du", 104 | "duan", 105 | "dui", 106 | "dun", 107 | "duo", 108 | "e", 109 | "ei", 110 | "en", 111 | "eng", 112 | "er", 113 | "fa", 114 | "fan", 115 | "fang", 116 | "fei", 117 | "fen", 118 | "feng", 119 | "fiao", 120 | "fo", 121 | "fou", 122 | "fu", 123 | "ga", 124 | "gai", 125 | "gan", 126 | "gang", 127 | "gao", 128 | "ge", 129 | "gei", 130 | "gen", 131 | "geng", 132 | "gong", 133 | "gou", 134 | "gu", 135 | "gua", 136 | "guai", 137 | "guan", 138 | "guang", 139 | "gui", 140 | "gun", 141 | "guo", 142 | "ha", 143 | "hai", 144 | "han", 145 | "hang", 146 | "hao", 147 | "he", 148 | "hei", 149 | "hen", 150 | "heng", 151 | "hong", 152 | "hou", 153 | "hu", 154 | "hua", 155 | "huai", 156 | "huan", 157 | "huang", 158 | "hui", 159 | "hun", 160 | "huo", 161 | "ji", 162 | "jia", 163 | "jian", 164 | "jiang", 165 | "jiao", 166 | "jie", 167 | "jin", 168 | "jing", 169 | "jiong", 170 | "jiu", 171 | "ju", 172 | "juan", 173 | "jue", 174 | "jun", 175 | "ka", 176 | "kai", 177 | "kan", 178 | "kang", 179 | "kao", 180 | "ke", 181 | "kei", 182 | "ken", 183 | "keng", 184 | "kong", 185 | "kou", 186 | "ku", 187 | "kua", 188 | "kuai", 189 | "kuan", 190 | "kuang", 191 | "kui", 192 | "kun", 193 | "kuo", 194 | "la", 195 | "lai", 196 | "lan", 197 | "lang", 198 | "lao", 199 | "le", 200 | "lei", 201 | "leng", 202 | "li", 203 | "lia", 204 | "lian", 205 | "liang", 206 | "liao", 207 | "lie", 208 | "lin", 209 | "ling", 210 | "liu", 211 | "lo", 212 | "long", 213 | "lou", 214 | "lu", 215 | "luan", 216 | "lun", 217 | "luo", 218 | "lv", 219 | "lve", // lue 220 | "ma", 221 | "mai", 222 | "man", 223 | "mang", 224 | "mao", 225 | "me", 226 | "mei", 227 | "men", 228 | "meng", 229 | "mi", 230 | "mian", 231 | "miao", 232 | "mie", 233 | "min", 234 | "ming", 235 | "miu", 236 | "mo", 237 | "mou", 238 | "mu", 239 | "na", 240 | "nai", 241 | "nan", 242 | "nang", 243 | "nao", 244 | "ne", 245 | "nei", 246 | "nen", 247 | "neng", 248 | "ni", 249 | "nia", 250 | "nian", 251 | "niang", 252 | "niao", 253 | "nie", 254 | "nin", 255 | "ning", 256 | "niu", 257 | "nong", 258 | "nou", 259 | "nu", 260 | "nuan", 261 | "nun", 262 | "nuo", 263 | "nv", 264 | "nve", 265 | "o", 266 | "ou", 267 | "pa", 268 | "pai", 269 | "pan", 270 | "pang", 271 | "pao", 272 | "pei", 273 | "pen", 274 | "peng", 275 | "pi", 276 | "pian", 277 | "piao", 278 | "pie", 279 | "pin", 280 | "ping", 281 | "po", 282 | "pou", 283 | "pu", 284 | "qi", 285 | "qia", 286 | "qian", 287 | "qiang", 288 | "qiao", 289 | "qie", 290 | "qin", 291 | "qing", 292 | "qiong", 293 | "qiu", 294 | "qu", 295 | "quan", 296 | "que", 297 | "qun", 298 | "ran", 299 | "rang", 300 | "rao", 301 | "re", 302 | "ren", 303 | "reng", 304 | "ri", 305 | "rong", 306 | "rou", 307 | "ru", 308 | "ruan", 309 | "rui", 310 | "run", 311 | "ruo", 312 | "sa", 313 | "sai", 314 | "san", 315 | "sang", 316 | "sao", 317 | "se", 318 | "sen", 319 | "seng", 320 | "sha", 321 | "shai", 322 | "shan", 323 | "shang", 324 | "shao", 325 | "she", 326 | "shei", 327 | "shen", 328 | "sheng", 329 | "shi", 330 | "shou", 331 | "shu", 332 | "shua", 333 | "shuai", 334 | "shuan", 335 | "shuang", 336 | "shui", 337 | "shun", 338 | "shuo", 339 | "si", 340 | "song", 341 | "sou", 342 | "su", 343 | "suan", 344 | "sui", 345 | "sun", 346 | "suo", 347 | "ta", 348 | "tai", 349 | "tan", 350 | "tang", 351 | "tao", 352 | "te", 353 | "tei", 354 | "teng", 355 | "ti", 356 | "tian", 357 | "tiao", 358 | "tie", 359 | "ting", 360 | "tong", 361 | "tou", 362 | "tu", 363 | "tuan", 364 | "tui", 365 | "tun", 366 | "tuo", 367 | "wa", 368 | "wai", 369 | "wan", 370 | "wang", 371 | "wei", 372 | "wen", 373 | "weng", 374 | "wo", 375 | "wu", 376 | "xi", 377 | "xia", 378 | "xian", 379 | "xiang", 380 | "xiao", 381 | "xie", 382 | "xin", 383 | "xing", 384 | "xiong", 385 | "xiu", 386 | "xu", 387 | "xuan", 388 | "xue", 389 | "xun", 390 | "ya", 391 | "yan", 392 | "yang", 393 | "yao", 394 | "ye", 395 | "yi", 396 | "yin", 397 | "ying", 398 | "yo", 399 | "yong", 400 | "you", 401 | "yu", 402 | "yuan", 403 | "yue", 404 | "yun", 405 | "za", 406 | "zai", 407 | "zan", 408 | "zang", 409 | "zao", 410 | "ze", 411 | "zei", 412 | "zen", 413 | "zeng", 414 | "zha", 415 | "zhai", 416 | "zhan", 417 | "zhang", 418 | "zhao", 419 | "zhe", 420 | "zhei", 421 | "zhen", 422 | "zheng", 423 | "zhi", 424 | "zhong", 425 | "zhou", 426 | "zhu", 427 | "zhua", 428 | "zhuai", 429 | "zhuan", 430 | "zhuang", 431 | "zhui", 432 | "zhun", 433 | "zhuo", 434 | "zi", 435 | "zong", 436 | "zou", 437 | "zu", 438 | "zuan", 439 | "zui", 440 | "zun", 441 | "zuo", 442 | } 443 | return f 444 | } 445 | 446 | func (f *Kafan) Unmarshal(r *bytes.Reader) []*Entry { 447 | 448 | // 0x48 or 0x68 449 | r.Seek(0x48, io.SeekStart) 450 | head := string(ReadN(r, 0x10)) 451 | // 版本不匹配 452 | if !strings.HasPrefix(head, "ProtoDict1") { 453 | // 有的词库是在 0x68 454 | r.Seek(0x68, io.SeekStart) 455 | head = string(ReadN(r, 0x10)) 456 | if !strings.HasPrefix(head, "ProtoDict1") { 457 | fmt.Println("卡饭拼音备份.dict格式错误") 458 | return nil 459 | } 460 | } 461 | 462 | di := make([]*Entry, 0, 0xff) 463 | // 读取一个词 464 | for r.Len() > 0x28 { 465 | // 词库中间可能夹杂这个 466 | dictType := ReadN(r, 0x10) 467 | if !bytes.HasPrefix(dictType, []byte("kf_pinyin")) { 468 | r.Seek(-0x10, io.SeekCurrent) 469 | } 470 | 471 | // 读取编码占用的字节 472 | codeBytes := make([]byte, 0, 0x28) 473 | for { 474 | // 每次读取 8 个字节 475 | tmp := ReadN[int](r, 8) 476 | // 判断结束 477 | if bytes.Equal(tmp, []byte{4, 0, 0, 0, 3, 0, 1, 0}) { 478 | r.Seek(0x20, io.SeekCurrent) 479 | break 480 | } else if bytes.Equal(tmp, []byte{0, 0, 0, 0, 3, 0, 1, 0}) { 481 | r.Seek(0x18, io.SeekCurrent) 482 | break 483 | } 484 | codeBytes = append(codeBytes, tmp...) 485 | } 486 | 487 | // 转换为拼音 488 | pinyin := make([]string, 0, 2) 489 | // 每 0x28 个字节为一个音 490 | for i := len(codeBytes) % 0x28; i < len(codeBytes); i += 0x28 { 491 | idx := BytesToInt(codeBytes[i : i+4]) 492 | py := f.lookup(idx, r) 493 | if py == "" { 494 | fmt.Printf("codeBytes: %v\n", codeBytes) 495 | } else if py != " " { 496 | pinyin = append(pinyin, py) 497 | } 498 | } 499 | 500 | // 跳过未知的4字节 501 | mark := ReadIntN(r, 4) 502 | if mark != 1 { 503 | r.Seek(8, io.SeekCurrent) 504 | } 505 | size := ReadIntN(r, 4) 506 | // 22 3 8 507 | // 2A 4 508 | // 32 5 509 | // 3A 6 8 510 | // 42 7 8 511 | // 4A 8 8 512 | // 52 9 16 513 | // 6A 12 16 514 | if size%0x10 == 2 { 515 | size = (size/0x10)*2 - 1 516 | } else if size%0x10 == 0xA { 517 | size = (size / 0x10) * 2 518 | } else { 519 | fmt.Printf("读取词组错误, size: 0x%x, offset: 0x%x\n", size, int(r.Size())-r.Len()) 520 | return nil 521 | } 522 | 523 | // 下面读取词,词是按照8字节对齐的 524 | wordBytes := ReadN(r, size) 525 | if len(wordBytes)%8 != 0 { 526 | r.Seek(int64(8-len(wordBytes)%8), io.SeekCurrent) 527 | } 528 | word := string(wordBytes) 529 | // di = append(di, &Entry{ 530 | // Word: word, 531 | // Pinyin: pinyin, 532 | // Freq: 1, 533 | // }) 534 | if py := f.filter(word, pinyin); len(py) > 0 { 535 | di = append(di, &Entry{ 536 | Word: word, 537 | Pinyin: py, 538 | Freq: 1, 539 | }) 540 | fmt.Printf("词组: %s, 拼音: %v\n", word, py) 541 | } 542 | } 543 | return di 544 | } 545 | 546 | func (k *Kafan) filter(word string, pinyin []string) []string { 547 | wordRunes := []rune(word) 548 | // 过滤单字 549 | if len(wordRunes) <= 1 { 550 | return nil 551 | } 552 | if len(wordRunes) == len(pinyin) { 553 | return pinyin 554 | } 555 | if len(wordRunes) < len(pinyin) { 556 | return pinyin[len(pinyin)-len(wordRunes):] 557 | } 558 | if len(wordRunes) > len(pinyin) { 559 | enc := encoder.NewPinyin() 560 | pre := string(wordRunes[:len(wordRunes)-len(pinyin)]) 561 | res := append(enc.Encode(pre), pinyin...) 562 | return res 563 | } 564 | return nil 565 | } 566 | 567 | func (k *Kafan) lookup(idx int, r *bytes.Reader) string { 568 | if len(k.pyList) <= idx { 569 | fmt.Printf("index out of range: %d > %d, offset: 0x%x\n", idx, len(k.pyList)-1, int(r.Size())-r.Len()) 570 | return "" 571 | } 572 | return k.pyList[idx] 573 | } 574 | -------------------------------------------------------------------------------- /pkg/pinyin/mspy_udl.go: -------------------------------------------------------------------------------- 1 | package pinyin 2 | 3 | import ( 4 | "bytes" 5 | "fmt" 6 | "slices" 7 | "time" 8 | "unicode" 9 | 10 | "github.com/nopdan/rose/pkg/util" 11 | ) 12 | 13 | type MspyUDL struct { 14 | Template 15 | pyList []string 16 | pyMap map[string]uint16 17 | } 18 | 19 | func init() { 20 | FormatList = append(FormatList, NewMspyUDL()) 21 | } 22 | func NewMspyUDL() *MspyUDL { 23 | f := new(MspyUDL) 24 | f.Name = "微软拼音自学习词汇.dat" 25 | f.ID = "mspy_udl,udl" 26 | f.CanMarshal = true 27 | 28 | f.pyList = []string{ 29 | "a", 30 | "ai", 31 | "an", 32 | "ang", 33 | "ao", 34 | "ba", 35 | "bai", 36 | "ban", 37 | "bang", 38 | "bao", 39 | "bei", 40 | "ben", 41 | "beng", 42 | "bi", 43 | "bian", 44 | "biao", 45 | "bie", 46 | "bin", 47 | "bing", 48 | "bo", 49 | "bu", 50 | "ca", 51 | "cai", 52 | "can", 53 | "cang", 54 | "cao", 55 | "ce", 56 | "cen", 57 | "ceng", 58 | "cha", 59 | "chai", 60 | "chan", 61 | "chang", 62 | "chao", 63 | "che", 64 | "chen", 65 | "cheng", 66 | "chi", 67 | "chong", 68 | "chou", 69 | "chu", 70 | "chua", 71 | "chuai", 72 | "chuan", 73 | "chuang", 74 | "chui", 75 | "chun", 76 | "chuo", 77 | "ci", 78 | "cong", 79 | "cou", 80 | "cu", 81 | "cuan", 82 | "cui", 83 | "cun", 84 | "cuo", 85 | "da", 86 | "dai", 87 | "dan", 88 | "dang", 89 | "dao", 90 | "de", 91 | "dei", 92 | "den", 93 | "deng", 94 | "di", 95 | "dia", 96 | "dian", 97 | "diao", 98 | "die", 99 | "ding", 100 | "diu", 101 | "dong", 102 | "dou", 103 | "du", 104 | "duan", 105 | "dui", 106 | "dun", 107 | "duo", 108 | "e", 109 | "ei", 110 | "en", 111 | "eng", 112 | "er", 113 | "fa", 114 | "fan", 115 | "fang", 116 | "fei", 117 | "fen", 118 | "feng", 119 | "fiao", 120 | "fo", 121 | "fou", 122 | "fu", 123 | "ga", 124 | "gai", 125 | "gan", 126 | "gang", 127 | "gao", 128 | "ge", 129 | "gei", 130 | "gen", 131 | "geng", 132 | "gong", 133 | "gou", 134 | "gu", 135 | "gua", 136 | "guai", 137 | "guan", 138 | "guang", 139 | "gui", 140 | "gun", 141 | "guo", 142 | "ha", 143 | "hai", 144 | "han", 145 | "hang", 146 | "hao", 147 | "he", 148 | "hei", 149 | "hen", 150 | "heng", 151 | "hong", 152 | "hou", 153 | "hu", 154 | "hua", 155 | "huai", 156 | "huan", 157 | "huang", 158 | "hui", 159 | "hun", 160 | "huo", 161 | "ji", 162 | "jia", 163 | "jian", 164 | "jiang", 165 | "jiao", 166 | "jie", 167 | "jin", 168 | "jing", 169 | "jiong", 170 | "jiu", 171 | "ju", 172 | "juan", 173 | "jue", 174 | "jun", 175 | "ka", 176 | "kai", 177 | "kan", 178 | "kang", 179 | "kao", 180 | "ke", 181 | "kei", 182 | "ken", 183 | "keng", 184 | "kong", 185 | "kou", 186 | "ku", 187 | "kua", 188 | "kuai", 189 | "kuan", 190 | "kuang", 191 | "kui", 192 | "kun", 193 | "kuo", 194 | "la", 195 | "lai", 196 | "lan", 197 | "lang", 198 | "lao", 199 | "le", 200 | "lei", 201 | "leng", 202 | "li", 203 | "lia", 204 | "lian", 205 | "liang", 206 | "liao", 207 | "lie", 208 | "lin", 209 | "ling", 210 | "liu", 211 | "lo", 212 | "long", 213 | "lou", 214 | "lu", 215 | "luan", 216 | "lve", // lue 217 | "lun", 218 | "luo", 219 | "lv", 220 | "ma", 221 | "mai", 222 | "man", 223 | "mang", 224 | "mao", 225 | "me", 226 | "mei", 227 | "men", 228 | "meng", 229 | "mi", 230 | "mian", 231 | "miao", 232 | "mie", 233 | "min", 234 | "ming", 235 | "miu", 236 | "mo", 237 | "mou", 238 | "mu", 239 | "na", 240 | "nai", 241 | "nan", 242 | "nang", 243 | "nao", 244 | "ne", 245 | "nei", 246 | "nen", 247 | "neng", 248 | "ni", 249 | "nian", 250 | "niang", 251 | "niao", 252 | "nie", 253 | "nin", 254 | "ning", 255 | "niu", 256 | "nong", 257 | "nou", 258 | "nu", 259 | "nuan", 260 | "nve", // nue 261 | "nun", 262 | "nuo", 263 | "nv", 264 | "o", 265 | "ou", 266 | "pa", 267 | "pai", 268 | "pan", 269 | "pang", 270 | "pao", 271 | "pei", 272 | "pen", 273 | "peng", 274 | "pi", 275 | "pian", 276 | "piao", 277 | "pie", 278 | "pin", 279 | "ping", 280 | "po", 281 | "pou", 282 | "pu", 283 | "qi", 284 | "qia", 285 | "qian", 286 | "qiang", 287 | "qiao", 288 | "qie", 289 | "qin", 290 | "qing", 291 | "qiong", 292 | "qiu", 293 | "qu", 294 | "quan", 295 | "que", 296 | "qun", 297 | "ran", 298 | "rang", 299 | "rao", 300 | "re", 301 | "ren", 302 | "reng", 303 | "ri", 304 | "rong", 305 | "rou", 306 | "ru", 307 | "rua", 308 | "ruan", 309 | "rui", 310 | "run", 311 | "ruo", 312 | "sa", 313 | "sai", 314 | "san", 315 | "sang", 316 | "sao", 317 | "se", 318 | "sen", 319 | "seng", 320 | "sha", 321 | "shai", 322 | "shan", 323 | "shang", 324 | "shao", 325 | "she", 326 | "shei", 327 | "shen", 328 | "sheng", 329 | "shi", 330 | "shou", 331 | "shu", 332 | "shua", 333 | "shuai", 334 | "shuan", 335 | "shuang", 336 | "shui", 337 | "shun", 338 | "shuo", 339 | "si", 340 | "song", 341 | "sou", 342 | "su", 343 | "suan", 344 | "sui", 345 | "sun", 346 | "suo", 347 | "ta", 348 | "tai", 349 | "tan", 350 | "tang", 351 | "tao", 352 | "te", 353 | "tei", 354 | "teng", 355 | "ti", 356 | "tian", 357 | "tiao", 358 | "tie", 359 | "ting", 360 | "tong", 361 | "tou", 362 | "tu", 363 | "tuan", 364 | "tui", 365 | "tun", 366 | "tuo", 367 | "wa", 368 | "wai", 369 | "wan", 370 | "wang", 371 | "wei", 372 | "wen", 373 | "weng", 374 | "wo", 375 | "wu", 376 | "xi", 377 | "xia", 378 | "xian", 379 | "xiang", 380 | "xiao", 381 | "xie", 382 | "xin", 383 | "xing", 384 | "xiong", 385 | "xiu", 386 | "xu", 387 | "xuan", 388 | "xue", 389 | "xun", 390 | "ya", 391 | "yan", 392 | "yang", 393 | "yao", 394 | "ye", 395 | "yi", 396 | "yin", 397 | "ying", 398 | "yo", 399 | "yong", 400 | "you", 401 | "yu", 402 | "yuan", 403 | "yue", 404 | "yun", 405 | "za", 406 | "zai", 407 | "zan", 408 | "zang", 409 | "zao", 410 | "ze", 411 | "zei", 412 | "zen", 413 | "zeng", 414 | "zha", 415 | "zhai", 416 | "zhan", 417 | "zhang", 418 | "zhao", 419 | "zhe", 420 | "zhei", 421 | "zhen", 422 | "zheng", 423 | "zhi", 424 | "zhong", 425 | "zhou", 426 | "zhu", 427 | "zhua", 428 | "zhuai", 429 | "zhuan", 430 | "zhuang", 431 | "zhui", 432 | "zhun", 433 | "zhuo", 434 | "zi", 435 | "zong", 436 | "zou", 437 | "zu", 438 | "zuan", 439 | "zui", 440 | "zun", 441 | "zuo", 442 | } 443 | f.pyMap = make(map[string]uint16) 444 | for idx, py := range f.pyList { 445 | f.pyMap[py] = uint16(idx) 446 | } 447 | return f 448 | } 449 | 450 | // 自学习词库,纯汉字 451 | func (f *MspyUDL) Unmarshal(r *bytes.Reader) []*Entry { 452 | r.Seek(0xC, 0) 453 | count := ReadIntN(r, 4) 454 | di := make([]*Entry, 0, count) 455 | 456 | r.Seek(4, 1) 457 | export_stamp := ReadUint32(r) 458 | export_time := util.MsToTime(export_stamp) 459 | fmt.Printf("时间: %v\n", export_time) 460 | 461 | for i := 0; i < count; i++ { 462 | r.Seek(0x2400+60*int64(i), 0) 463 | data := ReadN(r, 60) 464 | // insert_stamp := BytesToInt(data[:4]) 465 | // insert_time := MspyTime(uint32(insert_stamp)) 466 | // jianpin := data[4:7] 467 | wordLen := int(data[10]) 468 | p := 12 + wordLen*2 469 | if wordLen > 12 { 470 | fmt.Println(p, r.Size()-int64(r.Len()), data) 471 | continue 472 | } 473 | wordBytes := data[12:p] 474 | word := util.DecodeMust(wordBytes, "UTF-16LE") 475 | 476 | py := make([]string, 0, wordLen) 477 | for j := 0; j < wordLen; j++ { 478 | idx := BytesToInt(data[p+2*j : p+2*(j+1)]) 479 | if idx < len(f.pyList) { 480 | py = append(py, f.pyList[idx]) 481 | } else { 482 | fmt.Println("idx > len(mspy)", idx, len(f.pyList)) 483 | } 484 | } 485 | di = append(di, &Entry{word, py, 1}) 486 | // fmt.Printf("时间: %v, 简拼: %s, 词: %s, 拼音: %s\n", insert_time, string(jianpin), word, py) 487 | } 488 | return di 489 | } 490 | 491 | func (f *MspyUDL) Marshal(di []*Entry) []byte { 492 | di = slices.DeleteFunc(di, func(v *Entry) bool { 493 | for _, r := range v.Word { 494 | if !unicode.Is(unicode.Han, r) { 495 | return true 496 | } 497 | } 498 | return false 499 | }) 500 | 501 | var buf bytes.Buffer 502 | buf.Grow(0x2400 + 60*len(di)) 503 | 504 | now := time.Now() 505 | timeBytes := util.MsTimeTo(now) 506 | buf.Write([]byte{0x55, 0xAA, 0x88, 0x81, 0x02, 0x00, 0x60, 0x00, 0x55, 0xAA, 0x55, 0xAA}) 507 | count := len(di) 508 | buf.Write(make([]byte, 8)) 509 | buf.Write(timeBytes) 510 | buf.Write(make([]byte, 0x2400-0x18)) 511 | 512 | type udlEntry struct { 513 | Word string 514 | Pinyin []string 515 | Jianpin []byte 516 | } 517 | dict := make([]*udlEntry, 0, count) 518 | for i := range di { 519 | dict = append(dict, &udlEntry{Word: di[i].Word, 520 | Pinyin: di[i].Pinyin, 521 | Jianpin: f.jianpin(di[i].Pinyin), 522 | }) 523 | } 524 | // 按照简拼排序 525 | slices.SortStableFunc(dict, func(a, b *udlEntry) int { 526 | return bytes.Compare(a.Jianpin, b.Jianpin) 527 | }) 528 | for _, v := range dict { 529 | b := make([]byte, 60) 530 | copy(b[:4], timeBytes) 531 | copy(b[4:7], v.Jianpin) // 3 bytes jianpin 532 | copy(b[7:10], []byte{0, 0, 4}) 533 | wordBytes := util.EncodeMust(v.Word, "UTF-16LE") 534 | b[10] = byte(len(wordBytes) / 2) 535 | b[11] = 0x5A 536 | copy(b[12:], wordBytes) 537 | if len(wordBytes)/2 > 12 { 538 | fmt.Println("这个词太长了:", v.Word) 539 | count-- 540 | continue 541 | } else { 542 | copy(b[12+len(wordBytes):], f.GetIndex(v.Pinyin)) 543 | } 544 | buf.Write(b) 545 | } 546 | // 补 0 547 | size := 0x400 - len(buf.Bytes())%0x400 548 | buf.Write(make([]byte, size)) 549 | b := buf.Bytes() 550 | copy(b[12:16], To4Bytes(count)) 551 | b[0xE6C] = 1 552 | b[0xE98] = 2 553 | return b 554 | } 555 | 556 | func (f *MspyUDL) GetIndex(py []string) []byte { 557 | b := make([]byte, 0, len(py)/2) 558 | for _, v := range py { 559 | b = append(b, To2Bytes(f.pyMap[v])...) 560 | } 561 | return b 562 | } 563 | 564 | // 三位简拼 565 | func (f *MspyUDL) jianpin(py []string) []byte { 566 | ret := make([]byte, 3) 567 | for i := 0; i < 3; i++ { 568 | if i >= len(py) { 569 | break 570 | } 571 | ret[i] = py[i][0] 572 | } 573 | return ret 574 | } 575 | -------------------------------------------------------------------------------- /pkg/pinyin/sogou_bak_v2.go: -------------------------------------------------------------------------------- 1 | package pinyin 2 | 3 | import ( 4 | "bytes" 5 | "io" 6 | 7 | "github.com/nopdan/rose/pkg/util" 8 | ) 9 | 10 | type key struct { 11 | dictType uint16 12 | dataTypeLen uint16 13 | dataType []uint16 14 | attrIdx uint32 15 | keyDataIdx uint32 16 | dataIdx uint32 17 | v6 uint32 18 | } 19 | 20 | // 全是 4 字节 21 | type attr struct { 22 | count uint32 23 | a2 uint32 24 | dataId uint32 25 | b2 uint32 26 | } 27 | 28 | // 全是 4 字节 29 | type header struct { 30 | offset uint32 // 偏移量 31 | dataSize uint32 32 | usedDataSize uint32 33 | } 34 | 35 | func (h *header) parse(r *bytes.Reader) { 36 | h.offset = ReadUint32(r) 37 | h.dataSize = ReadUint32(r) 38 | h.usedDataSize = ReadUint32(r) 39 | } 40 | 41 | func (f *SogouBak) unmarshalV2(r *bytes.Reader) []*Entry { 42 | di := make([]*Entry, 0, r.Size()>>8) 43 | data, _ := io.ReadAll(r) 44 | r.Seek(0, 0) 45 | // fileChksum := ReadUint32(r) 46 | // size1 := ReadUint32(r) 47 | r.Seek(8, 1) 48 | keyLen := ReadUint32(r) 49 | attrLen := ReadUint32(r) 50 | aintLen := ReadUint32(r) 51 | // fmt.Println(fileChksum, size1, keyLen, attrLen, aintLen) 52 | 53 | keys := make([]key, 0, 1) 54 | for i := _u32; i < keyLen; i++ { 55 | var k key 56 | k.dictType = ReadUint16(r) 57 | k.dataTypeLen = ReadUint16(r) 58 | k.dataType = make([]uint16, 0, 1) 59 | for j := _u16; j < k.dataTypeLen; j++ { 60 | dataType := ReadUint16(r) 61 | k.dataType = append(k.dataType, dataType) 62 | } 63 | 64 | k.attrIdx = ReadUint32(r) 65 | k.keyDataIdx = ReadUint32(r) 66 | k.dataIdx = ReadUint32(r) 67 | k.v6 = ReadUint32(r) 68 | 69 | keys = append(keys, k) 70 | } 71 | 72 | attrs := make([]attr, 0, 1) 73 | for i := _u32; i < attrLen; i++ { 74 | var a attr 75 | a.count = ReadUint32(r) 76 | a.a2 = ReadUint32(r) 77 | a.dataId = ReadUint32(r) 78 | a.b2 = ReadUint32(r) 79 | attrs = append(attrs, a) 80 | } 81 | 82 | aints := make([]uint32, 0, 1) 83 | for i := _u32; i < aintLen; i++ { 84 | aint := ReadUint32(r) 85 | aints = append(aints, aint) 86 | } 87 | 88 | // fmt.Printf("keys %+v\n", keys) 89 | // fmt.Printf("attrs %+v\n", attrs) 90 | // fmt.Printf("aints %+v\n", aints) 91 | 92 | ud := newUsrDict() 93 | ud.keys = keys 94 | ud.attrs = attrs 95 | ud.aints = aints 96 | 97 | // b2Ver := ReadUint32(r) 98 | // b2Format := ReadUint32(r) 99 | // size2 := ReadUint32(r) 100 | r.Seek(12, 1) 101 | // fmt.Println(b2Ver, b2Format, size2) 102 | 103 | hiLen := ReadUint32(r) 104 | haLen := ReadUint32(r) 105 | hsLen := ReadUint32(r) 106 | // fmt.Println(hiLen, haLen, hsLen) 107 | 108 | for i := _u32; i < hiLen; i++ { 109 | var h header 110 | h.parse(r) 111 | ud.headerIdxs = append(ud.headerIdxs, h) 112 | } 113 | for i := _u32; i < haLen; i++ { 114 | var h header 115 | h.parse(r) 116 | ud.headerAttrs = append(ud.headerAttrs, h) 117 | } 118 | for i := _u32; i < hsLen; i++ { 119 | var h header 120 | h.parse(r) 121 | ud.dataStore = append(ud.dataStore, h) 122 | } 123 | // fmt.Printf("headerIdxs %+v\n", ud.headerIdxs) 124 | // fmt.Printf("headerAttrs %+v\n", ud.headerAttrs) 125 | // fmt.Printf("dataStore %+v\n", ud.dataStore) 126 | 127 | p2Idx := len(data) - 4*5 128 | p3Idx := len(data) - 4*4 129 | p2 := BytesToInt(data[p2Idx : p2Idx+4]) 130 | p3 := BytesToInt(data[p3Idx : p3Idx+4]) 131 | // fmt.Println(p2, p3) 132 | 133 | ud.init() 134 | preOffset := r.Size() - int64(r.Len()) 135 | d := ud.getData(r) 136 | for i := 0; i < len(d)/2; i++ { 137 | 138 | a, b := d[2*i], d[2*i+1] 139 | r.Seek(int64(a), 0) 140 | pos := ReadUint32(r) 141 | offset := uint32(preOffset) + ud.dataStore[ud.keys[0].keyDataIdx].offset + pos 142 | pys := f.decryptPinyin(r, offset) 143 | // fmt.Printf("a: %v, b: %v, offset: %v, pos: %v, py: %v\n", a, b, offset, pos, pys) 144 | 145 | var wordInfo attrWordData 146 | r.Seek(int64(b), 0) 147 | wordInfo.parse(r) 148 | // fmt.Printf("wordInfo: %v", wordInfo) 149 | // GetWordData 150 | attrId := ud.keys[0].attrIdx 151 | dataId := ud.attrs[attrId].dataId 152 | offset = uint32(preOffset) + ud.dataStore[dataId].offset + wordInfo.offset 153 | // fmt.Printf("offset: %v\n", offset) 154 | // DecryptWordsEx 155 | word := decryptWordsEx(r, offset, int(wordInfo.p1), p2, p3) 156 | di = append(di, &Entry{word, pys, int(wordInfo.freq)}) 157 | // fmt.Printf("word: %v\tcode: %v\tfreq: %v\n", word, codes, wordInfo.freq) 158 | } 159 | return di 160 | } 161 | 162 | func (f *SogouBak) decryptPinyin(r *bytes.Reader, offset uint32) []string { 163 | r.Seek(int64(offset), 0) 164 | n := ReadUint16(r) / 2 165 | ps := make([]string, 0) 166 | for i := _u16; i < n; i++ { 167 | p := ReadUint16(r) 168 | ps = append(ps, f.pyList[p]) 169 | } 170 | return ps 171 | } 172 | 173 | func decryptWordsEx(r *bytes.Reader, offset uint32, p1, p2, p3 int) string { 174 | k1 := (p1 + p2) << 2 175 | k2 := (p1 + p3) << 2 176 | xk := (k1 + k2) & 0xFFFF 177 | r.Seek(int64(offset), 0) 178 | n := ReadUint16(r) / 2 179 | decWords := make([]byte, 0, 1) 180 | for i := _u16; i < n; i++ { 181 | shift := p2 % 8 182 | ch := int(ReadUint16(r)) 183 | dch := (ch<<(16-(shift%8)) | (ch >> shift)) & 0xFFFF 184 | dch ^= xk 185 | if dch > 0x10000 { 186 | print(dch) 187 | } 188 | decWords = append(decWords, byte(dch%0x100), byte(dch>>8)) 189 | } 190 | ret := util.DecodeMust(decWords, "UTF-16LE") 191 | return ret 192 | } 193 | 194 | type attrWordData struct { 195 | offset uint32 196 | freq uint16 197 | aflag uint16 198 | i8 uint32 199 | p1 uint16 200 | iE uint32 201 | } 202 | 203 | func (a *attrWordData) parse(r *bytes.Reader) { 204 | a.offset = ReadUint32(r) 205 | a.freq = ReadUint16(r) 206 | a.aflag = ReadUint16(r) 207 | a.i8 = ReadUint32(r) 208 | a.p1 = ReadUint16(r) 209 | a.iE = ReadUint32(r) // always zero 210 | _ = ReadUint32(r) // next offset 211 | } 212 | 213 | type usrDict struct { 214 | keys []key 215 | attrs []attr 216 | aints []uint32 217 | headerIdxs []header 218 | headerAttrs []header 219 | dataStore []header 220 | 221 | dataTypeSize []uint32 222 | attrSize []uint32 223 | baseHashSize []int 224 | keyHashSize []int 225 | aflag bool 226 | } 227 | 228 | var keyDataTypeSize = []uint32{4, 1, 1, 2, 1, 2, 2, 4, 4, 8, 4, 4, 4, 0, 0, 0} 229 | var dataTypeHashSize = []int{0, 27, 414, 512, -1, -1, 512, 0} 230 | 231 | func newUsrDict() *usrDict { 232 | ud := new(usrDict) 233 | ud.headerIdxs = make([]header, 0, 1) 234 | ud.headerAttrs = make([]header, 0, 1) 235 | ud.dataStore = make([]header, 0, 1) 236 | 237 | ud.dataTypeSize = make([]uint32, 0, 1) 238 | // ud.attrSize = make([]int, 0, 1) 239 | ud.baseHashSize = make([]int, 0, 1) 240 | ud.keyHashSize = make([]int, 10) 241 | ud.keyHashSize[0] = 500 242 | // fmt.Printf("newUsrDict%+v\n", ud) 243 | return ud 244 | } 245 | 246 | func (ud *usrDict) init() { 247 | ud.attrSize = make([]uint32, len(ud.attrs)) 248 | 249 | for i, k := range ud.keys { 250 | size := (uint32(k.dictType) >> 2) & 4 251 | maskedType := int(k.dictType) & 0xFFFFFF8F 252 | // hash item 253 | if ud.keyHashSize[i] > 0 { 254 | ud.baseHashSize = append(ud.baseHashSize, ud.keyHashSize[i]) 255 | } else { 256 | ud.baseHashSize = append(ud.baseHashSize, dataTypeHashSize[maskedType]) 257 | } 258 | // dataType size 259 | attrCount := ud.attrs[k.attrIdx].count 260 | // non-attr data size 261 | nonAttrCount := len(k.dataType) - int(attrCount) 262 | for j := 0; j < nonAttrCount; j++ { 263 | if j > 0 || maskedType != 4 { 264 | size += keyDataTypeSize[k.dataType[i]] 265 | } 266 | } 267 | if k.dictType&0x60 > 0 { 268 | size += 4 269 | } 270 | size += 4 271 | ud.dataTypeSize = append(ud.dataTypeSize, size) 272 | // attr data size 273 | var attrSize uint32 274 | for j := nonAttrCount; j < len(k.dataType); j++ { 275 | attrSize += keyDataTypeSize[k.dataType[j]] 276 | } 277 | if (k.dictType & 0x40) == 0 { 278 | attrSize += 4 279 | } 280 | ud.attrSize[k.attrIdx] = attrSize 281 | // ??? 282 | if ud.attrs[k.attrIdx].b2 == 0 { 283 | ud.aflag = true 284 | } 285 | } 286 | // fmt.Printf("init UsrDict%+v\n", ud) 287 | } 288 | 289 | func (ud *usrDict) getData(r *bytes.Reader) []uint32 { 290 | 291 | ret := make([]uint32, 0, 0xff) 292 | keyId := 0 293 | theKey := ud.keys[keyId] 294 | 295 | // hashStoreBase := ud.getHashStore(keyId, theKey.dictType&0xFFFFFF8F) 296 | headerAttr := ud.headerAttrs[theKey.attrIdx] 297 | var attrCount uint32 298 | 299 | if headerAttr.usedDataSize == 0 { 300 | attrCount = headerAttr.dataSize 301 | } else { 302 | attrCount = headerAttr.usedDataSize 303 | } 304 | hashStoreCount := ud.baseHashSize[keyId] 305 | // fmt.Println("getData", hashStoreBase, hashStoreCount) 306 | 307 | preOffset := r.Size() - int64(r.Len()) 308 | for i := 0; i < hashStoreCount; i++ { 309 | r.Seek(preOffset+int64(8*i), 0) 310 | hashStoreOffset := ReadUint32(r) 311 | hashStoreCount := ReadUint32(r) 312 | 313 | // fmt.Printf("hashstore [ offset: {%v}, count: {%v} ]\n", hashStoreOffset, hashStoreCount) 314 | for j := _u32; j < hashStoreCount; j++ { 315 | 316 | attrOffset := uint32(preOffset) + ud.headerIdxs[keyId].offset + hashStoreOffset + ud.dataTypeSize[keyId]*j 317 | offset := attrOffset + uint32(ud.dataTypeSize[keyId]) - 4 318 | r.Seek(int64(offset), 0) 319 | offset = ReadUint32(r) 320 | // fmt.Printf("\tattrOffset, %d %d\n", attrOffset, offset) 321 | for k := _u32; k < attrCount; k++ { 322 | 323 | attr2Offset := uint32(preOffset) + ud.headerAttrs[ud.keys[keyId].attrIdx].offset + offset 324 | ret = append(ret, attrOffset, attr2Offset) 325 | 326 | offset = attr2Offset + ud.attrSize[theKey.attrIdx] - 4 327 | r.Seek(int64(offset), 0) 328 | offset = ReadUint32(r) 329 | // fmt.Printf("\tattr2Offset, %d ,newOffset, %d \n", attr2Offset, offset) 330 | if offset == 0xFFFFFFFF { 331 | break 332 | } 333 | } 334 | } 335 | } 336 | // fmt.Println(ret) 337 | return ret 338 | } 339 | 340 | // func (ud *usrDict) getHashStore(idx, dataType int) int { 341 | // if idx < 0 || dataType > 6 || idx > len(ud.headerIdxs) { 342 | // panic("getHashStore error") 343 | // } 344 | // offset := ud.headerIdxs[idx].offset 345 | // // assert index_offset >= 0 346 | // size := ud.baseHashSize[idx] 347 | // offset = offset - 8*size 348 | // // assert offset >= 0 349 | // return offset 350 | // } 351 | -------------------------------------------------------------------------------- /pkg/wubi/sample/duoduo.txt: -------------------------------------------------------------------------------- 1 | ---config@码表分类=主码-次显码表 2 | ---config@码表别名=圆满版 3 | hello! hell 4 | http:// http 5 | p图 pto 6 | A.B.C.D. abcd 7 | $ddcmd(config(),[系统设置]) exts 8 | $ddcmd(config(/do jianqiebanjiaci),[剪贴板加词]) ejc 9 | $ddcmd(config(/do shuchufancha),[编码反查]) efc 10 | $ddcmd(config(/do 剪贴板反查),[剪贴板反查]) efc 11 | $ddcmd(config(/do 输出反查),[输出反查]) efc 12 | $ddcmd(help(),[使用帮助]) ebi 13 | $ddcmd(help(),[使用帮助]) ebz 14 | $ddcmd(keyboard(<35>),[End]) eend 15 | $ddcmd(run(::{20D04FE0-3AEA-1069-A2D8-08002B30309D}),[我的电脑]) ewdd 16 | $ddcmd(run(calc.exe),[计算器]) ejsq 17 | $ddcmd(run(calc.exe),[计算器]) ejsu 18 | $ddcmd(run(control.exe),[控制面板]) ekzm 19 | $ddcmd(run(devmgmt.msc),[设备管理器]) esbg 20 | $ddcmd(run(excel.exe),[excel]) eexc 21 | $ddcmd(run(winword.exe),[word]) ewor 22 | $ddcmd(run(powerpnt.exe),[ppt]) eppt 23 | $ddcmd(run(http://fanyi.baidu.com/#auto/zh/),[翻译]) efy 24 | $ddcmd(run(mspaint.exe),[画图]) eht 25 | $ddcmd(run(notepad.exe),[记事本]) ejsb 26 | $ddcmd(run(shell:Personal),[我的文档]) ewdw 27 | $ddcmd(run(taskmgr.exe),[任务管理器]) erwg 28 | $ddcmd(run(wordpad.exe),[写字板]) exzb 29 | $ddcmd(run(wordpad.exe),[写字板]) exib 30 | $ddcmd(,[重复输入]) ec 31 | $ddcmd(,[重复输入]) ecf 32 | $ddcmd(日,日) erq 33 | $ddcmd(日,日) erqa 34 | $ddcmd(--,--) erqb 35 | $ddcmd(日,日) eru 36 | $ddcmd(日,日) erua 37 | $ddcmd(--,--) erub 38 | $ddcmd(,) exq 39 | $ddcmd(,) exu 40 | $ddcmd(秒,秒) esj 41 | $ddcmd(秒,秒) esja 42 | $ddcmd(::,::) esjb 43 | $ddcmd(run(http://www.zdic.net/sousuo/),[汉典搜索]) ehd 44 | $ddcmd(run(http://www.zdic.net/sousuo/),[汉典搜索]) ehds 45 | $ddcmd(run(http://www.baidu.com/),[百度搜索]) ebd 46 | $ddcmd(run(http://www.baidu.com/),[百度搜索]) ebds 47 | $ddcmd(run(http://zzdzzd.ys168.com/),[哲豆网盘]) eid 48 | $ddcmd(run(http://zzdzzd.ys168.com/),[哲豆网盘]) ezd 49 | $ddcmd(run(http://image.baidu.com/),[百度图片]) ebdt 50 | $ddcmd(run(https://map.baidu.com/),[百度地图]) ebdd 51 | $ddcmd(set([-IME设置-],隐藏候选窗口=切换),[显隐候选窗]) ehx 52 | $ddcmd(set([-IME设置-],隐藏候选窗口=切换),[显隐候选窗]) exy 53 | $ddcmd(keyboard(<173>),[静音]) ejy 54 | $ddcmd(help(keyboardmap.html,1050,800),[键盘图]) ejp 55 | $ddcmd(config(),[输入法设置]) esi 56 | $ddcmd(config(),[输入法设置]) esz 57 | 以 a 58 | 以后 a 59 | 以前 a 60 | 碍 aa 61 | 鹌 aa 62 | 皑皑白雪 aabx 63 | 鹌鹑蛋 aacd 64 | 鹌鹑 aach 65 | 暗暗吃惊 aacj 66 | 嗷嗷待哺 aadb 67 | 暗暗点头 aadt 68 | 砹 aae 69 | 砹 aaem 70 | 安安分分 aaff 71 | 暗暗高兴 aagx 72 | 安安静静 aajj 73 | 碍脚 aajv 74 | 碍口 aaki 75 | 暗暗佩服 aapf 76 | 矮矮胖胖 aapp 77 | 暗暗祈祷 aaqd 78 | 哀哀切切 aaqq 79 | 暗暗庆幸 aaqx 80 | 碍 aar 81 | 碍 aarg 82 | 暗暗思忖 aasc 83 | 碍事 aasf 84 | 碍手 aask 85 | 矮矮实实 aass 86 | 凹凹凸凸 aatt 87 | 暗暗祈祷 aaud 88 | 哀哀切切 aauu 89 | 暗暗庆幸 aaux 90 | 鹌 aaw 91 | 鹌 aawd 92 | 安安稳稳 aaww 93 | 安安心心 aaxx 94 | 碍于 aayg 95 | 哀哀欲绝 aayj 96 | 碍眼 aayo 97 | 按兵不动 abbd 98 | 哀兵必胜 abbs 99 | 安步当车 abdc 100 | 安邦定国 abdg 101 | 阿卜杜拉 abdl 102 | 按百分率 abfl 103 | 阿布扎比 abib 104 | 安邦治国 abig 105 | 按部就班 abjb 106 | 埃博拉病毒 abld 107 | 爱别离苦 ablk 108 | 阿巴拉契亚山脉 ablm 109 | 阿巴拉契亚山 abls 110 | 阿巴拉契亚 ably 111 | 爱不释手 abss 112 | 安不忘危 abww 113 | 安步以当车 abyc 114 | 阿布扎比 abzb 115 | 安邦治国 abzg 116 | 桉 ac 117 | 爱出风头 acft 118 | 桉 acn 119 | 桉 acns 120 | 爱厂如家 acrj 121 | 爱才若渴 acrk 122 | 爱财如命 acrm 123 | 桉树 acsc 124 | 暗藏杀机 acsj 125 | 暗潮涌动 acyd 126 | 澳 ad 127 | 爱答不理 adbl 128 | 暗渡陈仓 adcc 129 | 暗度陈仓 adcc 130 | 阿迪达斯 adds 131 | 阿多尔诺 aden 132 | 爱达荷州 adhi 133 | 安定和谐 adhx 134 | 爱达荷州 adhz 135 | 澳洲 adid 136 | 案牍之劳 adil 137 | 澳抗 adkk 138 | 澳柯玛 adkm 139 | 案牍劳形 adlx 140 | 澳大利亚 adly 141 | 澳门 admj 142 | 澳门元 admy 143 | 安东尼奥 adna 144 | ADP adp 145 | 澳 adr 146 | 澳 adra 147 | 安定人心 adrx 148 | 挨冻受饿 adse 149 | 安第斯山脉 adsm 150 | 安第斯山 adss 151 | 安定团结 adtj 152 | 暗淡无光 adwg 153 | 黯淡无光 adwg 154 | 安度晚年 adwn 155 | 澳网 adwo 156 | 澳元 adyg 157 | 澳洲 adzd 158 | 案牍之劳 adzl 159 | 艾 ae 160 | 菴 ae 161 | 菴 aea 162 | 菴 aeao 163 | 阿尔卑斯山脉 aebm 164 | 阿尔卑斯 aebs 165 | 阿尔卑斯山 aebs 166 | 阿尔伯特 aebt 167 | 阿尔巴尼亚 aeby 168 | 艾草 aece 169 | 阿尔都塞 aeds 170 | 阿尔弗雷德 aefd 171 | 艾蒿 aehe 172 | 阿恩海姆 aehm 173 | 艾滋病 aeib 174 | 艾滋 aeid 175 | 艾炷灸 aeij 176 | 艾炷 aeim 177 | 阿尔及尔 aeje 178 | 艾卷 aejm 179 | 艾灸 aejw 180 | 阿尔及利亚 aejy 181 | 蔼 ael 182 | 爱尔兰岛 aeld 183 | 艾伦 aelj 184 | 蔼 aelr 185 | 艾略特 aelt 186 | 艾 aem 187 | 艾玛 aemg 188 | 艾美奖 aemj 189 | 艾 aemm 190 | 艾青 aeqg 191 | 蔼然 aerv 192 | 蔼然 aerw 193 | 艾绒 aerx 194 | 挨饿受冻 aesd 195 | 阿尔泰山 aets 196 | 艾条 aetw 197 | 艾青 aeug 198 | 爱尔维修 aewx 199 | 艾叶 aeyi 200 | 艾滋病 aezb 201 | 艾滋 aezd 202 | 艾炷灸 aezj 203 | 艾炷 aezm 204 | 鞍 af 205 | 鞍部 afbh 206 | 案发地点 afdd 207 | 案发当天 afdt 208 | 埃菲尔铁塔 afet 209 | 艾菲尔铁塔 afet 210 | 鞍钢 afgy 211 | 鞍座 afih 212 | 鞍子 afiv 213 | 阿伏加德罗 afjl 214 | 阿伏加德罗常数 afjs 215 | 鞍马 afmx 216 | 鞍 afn 217 | 鞍 afns 218 | 鞍前 afqm 219 | 安抚人心 afrx 220 | 安分守己 afsj 221 | 鞍山 afso 222 | 艾发衰容 afsr 223 | 鞍山市 afss 224 | 鞍前 afum 225 | 案发现场 afxc 226 | 鞍座 afzh 227 | 鞍子 afzv 228 | 熬 ag 229 | 遨 ag 230 | 獒 aga 231 | 獒 agak 232 | 熬不过 agbg 233 | 敖包 agbw 234 | 熬成 agca 235 | 熬出头 agct 236 | 熬出 agcv 237 | 按规定办 agdb 238 | 熬得住 agdi 239 | 熬到 agds 240 | 按规定办事 agds 241 | 熬到头 agdt 242 | 熬得住 agdz 243 | 聱 agf 244 | 聱 agfd 245 | 熬过 aggf 246 | 熬过去 aggq 247 | 熬过去 aggu 248 | 敖汉 aghd 249 | 敖汉旗 aghq 250 | 爱国华侨 aghq 251 | 熬好 aghs 252 | 敖汉旗 aghu 253 | 爱国华侨 aghu 254 | 螯合物 aghw 255 | 熬粥 agib 256 | 熬煮 agif 257 | 爱国主义精神 agis 258 | 熬制 agit 259 | 爱国战线 agix 260 | 爱国主义 agiy 261 | 按国家有关规定 agjd 262 | 熬煎 agjm 263 | 爱国精神 agjs 264 | 爱岗敬业 agjy 265 | 爱国敬业 agjy 266 | 爱国力量 agll 267 | 瑷 agm 268 | 瑷 agma 269 | 熬 agmm 270 | 遨 agn 271 | 遨 agnn 272 | 熬年头 agnt 273 | 螯 ago 274 | 嶅 agoi 275 | 螯 agok 276 | 爱国侨胞 agqb 277 | 爱国青年 agqn 278 | 爱国如家 agrj 279 | 爱国热情 agrq 280 | 爱国人士 agrs 281 | 爱国热情 agru 282 | 奥古斯丁 agsd 283 | 爱国守法 agsf 284 | 熬更守夜 agsy 285 | 敖 agt 286 | 爱国同胞 agtb 287 | 熬汤 agtd 288 | 敖 agtk 289 | 敖 agtm 290 | 鳌头 agtn 291 | 爱国统一战线 agtx 292 | 爱国侨胞 agub 293 | 爱国青年 agun 294 | 鳌 agw 295 | 爱国卫生运动 agwd 296 | 鳌 agwo 297 | 爱国卫生 agws 298 | 骜 agx 299 | 爱国行动 agxd 300 | 爱管闲事 agxs 301 | 鏊 agy 302 | 遨游 agyd 303 | 爱国运动 agyd 304 | 熬药 agye 305 | 熬夜 agyh 306 | 鏊 agyy 307 | 熬粥 agzb 308 | 熬煮 agzf 309 | 爱国主义精神 agzs 310 | 熬制 agzt 311 | 爱国战线 agzx 312 | 爱国主义 agzy 313 | 哀 ah 314 | 癌 ah 315 | 庵 aha 316 | 庵 ahao 317 | 癌变 ahbh 318 | 爱护备至 ahbi 319 | 鏖兵 ahbr 320 | 哀鸿遍野 ahby 321 | 爱护备至 ahbz 322 | 哀愁 ahct 323 | 哀悼 ahdn 324 | 安徽大学 ahdx 325 | 廒 ahg 326 | 哀歌 ahgf 327 | 爱好广泛 ahgf 328 | 哀告 ahgt 329 | 爱护公物 ahgw 330 | 哀号 ahh 331 | 哀鸿 ahhd 332 | 哀嚎 ahhi 333 | 哀号 ahhi 334 | 爱好和平 ahhp 335 | 癌 ahi 336 | 哀哉 ahif 337 | 癌症 ahih 338 | 癌 ahio 339 | 癌肿 ahiv 340 | 哀 ahiw 341 | 鏖战 ahiy 342 | 哀叫 ahji 343 | 爱恨交织 ahji 344 | 爱恨交加 ahjj 345 | 哀矜 ahjl 346 | 癌基因 ahjy 347 | 爱恨交织 ahjz 348 | 霭 ahl 349 | 哀牢 ahl 350 | 癌瘤 ahlh 351 | 哀怜 ahln 352 | 哀牢 ahln 353 | 霭 ahlr 354 | 艾哈迈德 ahmd 355 | 癌魔 ahmh 356 | 哀鸣 ahmi 357 | 爱恨情仇 ahqc 358 | 哀泣 ahqd 359 | 哀求 ahqf 360 | 哀切 ahqs 361 | 安徽日报 ahrb 362 | 哀荣 ahre 363 | 哀伤 ahsj 364 | 哀思 ahso 365 | 哀痛 ahth 366 | 哀叹 ahti 367 | 哀恸 ahtn 368 | 爱恨情仇 ahuc 369 | 哀泣 ahud 370 | 哀求 ahuf 371 | 哀切 ahus 372 | 哀 ahw 373 | 哀 ahwk 374 | 哀婉 ahws 375 | 癌细胞 ahxb 376 | 癌性 ahxn 377 | 爱好学习 ahxx 378 | 鏖 ahy 379 | 哀乐 ahy 380 | 爱好运动 ahyd 381 | 哀艳 ahyg 382 | 哀怨 ahyw 383 | 哀乐 ahyw 384 | 鏖 ahyy 385 | 哀哉 ahzf 386 | 癌症 ahzh 387 | 癌肿 ahzv 388 | 鏖战 ahzy 389 | 啊 ai 390 | 唉 ai 391 | 嚣 aia 392 | 嗷嗷 aiai 393 | 嚣 aiai 394 | 嗷嗷叫 aiaj 395 | 唵 aiao 396 | 嗄 aiao 397 | 嗄 aiaw 398 | 安置补偿 aibc 399 | 艾滋病毒 aibd 400 | 呆 aic 401 | 呆 aicc 402 | 按照常规 aicg 403 | 安装次数 aics 404 | 按照传统 aict 405 | 暗中调查 aidc 406 | 按制度办事 aids 407 | 暗自得意 aidy 408 | 哎 aie 409 | 哎 aiem 410 | 呵 aif 411 | 安知非福 aiff 412 | 嗳腐 aifh 413 | 呵 aifi 414 | 爱憎分明 aifm 415 | 按照法律程序 aifx 416 | 嗷 aig 417 | 暗中观察 aigc 418 | 按照国际惯例 aigl 419 | 嗷 aigt 420 | 啊哈 aihi 421 | 爱咋咋的 aiid 422 | 唉 ail 423 | 按质论价 ailj 424 | 唉 ailt 425 | 嗳 aim 426 | 嗳 aima 427 | 吖 aimi 428 | 嗌 aimo 429 | 暗中摸索 aims 430 | 按资排辈 aipb 431 | 暗中盘算 aips 432 | 嗳气 aiqt 433 | 安之若素 airs 434 | 爱之深,痛之切 aisq 435 | 爱之深,责之切 aisq 436 | 爱之深,恨之切 aisq 437 | 爱之深,痛之切 aisu 438 | 爱之深,责之切 aisu 439 | 爱之深,恨之切 aisu 440 | 阿兹特克 aitk 441 | 嗳气 aiut 442 | 啊 aiv 443 | 啊 aivf 444 | 癌症晚期 aiwq 445 | 癌症晚期 aiwu 446 | 安枕无忧 aiwy 447 | 呆小病 aixb 448 | 暗中相助 aixi 449 | 哎哟 aiy 450 | 唉呀 aiy 451 | 哎呀 aiyi 452 | 唉呀 aiyi 453 | 哎哟 aiyi 454 | 哎哟喂 aiyw 455 | 俺 aj 456 | 傲 aj 457 | 俺 aja 458 | 挨家挨户 ajah 459 | 傲岸 ajao 460 | 俺 ajao 461 | 按揭贷款 ajdk 462 | 俺的 ajdr 463 | 傲 ajg 464 | 安居工程 ajgc 465 | 傲骨 ajgo 466 | 傲 ajgt 467 | 按揭合同 ajht 468 | 挨家逐户 ajih 469 | 俺家 ajjn 470 | 安家落户 ajlh 471 | 按揭利率 ajll 472 | 按揭利息 ajlx 473 | 安居乐业 ajly 474 | 安家立业 ajly 475 | 阿基米德 ajmd 476 | 俺们 ajmj 477 | 傲慢 ajmn 478 | 暗箭难防 ajnf 479 | 盦 ajod 480 | 傲气 ajqt 481 | 按经取穴 ajqx 482 | 傲人 ajrj 483 | 安静入睡 ajrs 484 | 傲然 ajrv 485 | 傲然 ajrw 486 | 傲世 ajsf 487 | 傲视 ajsl 488 | 暗箭伤人 ajsr 489 | 按揭手续 ajsx 490 | 傲气 ajut 491 | 按经取穴 ajux 492 | 傲物 ajwt 493 | 暗礁险滩 ajxt 494 | 挨家逐户 ajzh 495 | 按 ak 496 | 挨 ak 497 | 捱 aka 498 | 捱 akau 499 | 按部 akbh 500 | 挨边 akbn 501 | 按兵 akbr 502 | 挨边 akbz 503 | 挨次 akch 504 | 按此 akcy 505 | 挨斗 akd 506 | 按动 akdg 507 | 挨冻 akdh 508 | 按倒 akdj 509 | 挨打 akdk 510 | 拗断 akdm 511 | 挨刀 akdn 512 | 挨斗 akdn 513 | 挨到 akds 514 | 按钉 akdy 515 | 挨刀 akdz 516 | 挨饿 akew 517 | 挨罚 akfo 518 | 挨个儿 akge 519 | 挨过 akgf 520 | 挨个 akgj 521 | 揞 akh 522 | 挨户 akhl 523 | 按回 akho 524 | 揞 akhr 525 | 按在 akia 526 | 挨整 akif 527 | 按章 akih 528 | 按住 akij 529 | 挨揍 akik 530 | 挨着 akim 531 | 挨宰 akin 532 | 按质 akiq 533 | 按照 akir 534 | 挨浇 akjd 535 | 按件 akjj 536 | 按揭 akjk 537 | 挨家 akjn 538 | 挨近 akjq 539 | 按键式 akjs 540 | 按季 akjt 541 | 按级 akjx 542 | 按键 akjy 543 | 挨剋 akkf 544 | 拗口 akki 545 | 按扣 akkk 546 | 拗口令 akkl 547 | 挨 akl 548 | 按劳 akle 549 | 按理 aklg 550 | 阿喀琉斯之踵 akli 551 | 按例 aklj 552 | 奥克拉荷马 aklm 553 | 按量 aklr 554 | 阿喀琉斯 akls 555 | 挨 aklt 556 | 按铃 akly 557 | 阿喀琉斯之踵 aklz 558 | 按摩 akmh 559 | 挨骂 akmi 560 | 挨门 akmj 561 | 按摩器 akmq 562 | 按摩室 akms 563 | 按摩器 akmu 564 | 按脉 akmv 565 | 按 akn 566 | 按捺 aknk 567 | 按 akns 568 | 按年 aknt 569 | 按钮 akny 570 | 挨批 akpk 571 | 按期 akqf 572 | 按人 akrj 573 | 按入 akrm 574 | 按日 akrr 575 | 阿肯色州 aksi 576 | 按说 aksl 577 | 按时 aksr 578 | 碍口识羞 aksx 579 | 按上 aksy 580 | 阿肯色州 aksz 581 | 按天 aktg 582 | 按图 akto 583 | 按期 akuf 584 | 按蚊 akwo 585 | 拗 akx 586 | 按下 akxf 587 | 按需 akxh 588 | 按响 akxi 589 | 拗 akxn 590 | 拗 akxz 591 | 按压 akya 592 | 按语 akyl 593 | 按要求 akyq 594 | 按要求 akyu 595 | 按月 akyv 596 | 按在 akza 597 | 挨整 akzf 598 | 按章 akzh 599 | 按住 akzj 600 | 挨揍 akzk 601 | 挨着 akzm 602 | 挨宰 akzn 603 | 按质 akzq 604 | 按照 akzr 605 | 袄 al 606 | 谙 al 607 | 阿里巴巴 albb 608 | 阿拉伯半岛 albd 609 | 阿拉伯联合酋长国 albg 610 | 阿拉伯数字 albi 611 | 阿拉伯国家 albj 612 | 爱理不理 albl 613 | 阿拉伯人 albr 614 | 奥林巴斯 albs 615 | 阿拉伯语 alby 616 | 阿拉伯数字 albz 617 | 按劳付酬 alfc 618 | 按劳分配 alfp 619 | 阿拉法特 alft 620 | 案例分析 alfx 621 | 谙 alh 622 | 安理会常任理事国 alhg 623 | 谙 alhr 624 | 安老怀少 alhs 625 | 案例教学 aljx 626 | 阿拉木图 almt 627 | 奥里诺科河 alnh 628 | 奥里诺科 alnk 629 | 奥里诺科平原 alny 630 | 奥林匹克运动会 alph 631 | 奥林匹克 alpk 632 | 奥林匹斯 alps 633 | 奥林匹亚 alpy 634 | 按劳取酬 alqc 635 | 阿拉斯加半岛 alsd 636 | 阿留申群岛 alsd 637 | 谙熟 alsh 638 | 阿拉斯加 alsj 639 | 阿拉善盟 alsm 640 | 袄 alt 641 | 袄 altk 642 | 按劳取酬 aluc 643 | 谙习 alxl 644 | 爱 am 645 | 爱 ama 646 | 阿猫阿狗 amag 647 | 挨门挨户 amah 648 | 爱 amal 649 | 阿米巴痢疾 ambj 650 | 爱才 amcf 651 | 爱吃 amci 652 | 爱财 amco 653 | 爱车 amcs 654 | 爱称 amct 655 | 爱巢 amcx 656 | 爱丁堡 amdb 657 | 爱戴 amdf 658 | 爱德华 amdh 659 | 爱的 amdr 660 | 爱迪生 amds 661 | 哀莫大于心死 amds 662 | 爱打听 amdt 663 | 阿穆尔河 ameh 664 | 爱尔兰 amel 665 | 爱抚 amfk 666 | 爱妃 amfs 667 | 爱过 amgf 668 | 爱国者 amgi 669 | 爱国 amgo 670 | 安民告示 amgs 671 | 爱国心 amgx 672 | 爱国者 amgz 673 | 爱河 amhd 674 | 爱花 amhe 675 | 爱荷华 amhh 676 | 爱好者 amhi 677 | 爱护 amhk 678 | 爱火 amhm 679 | 爱恨 amhn 680 | 爱好 amhs 681 | 爱好者 amhz 682 | 爱滋病 amib 683 | 爱滋 amid 684 | 爱祖国 amig 685 | 挨门逐户 amih 686 | 爱美之心人皆有之 amii 687 | 爱做 amij 688 | 爱着 amim 689 | 爱憎 amin 690 | 爱子 amiv 691 | 爱美之心 amix 692 | 爱机 amjc 693 | 爱将 amjh 694 | 爱军 amjl 695 | 爱家 amjn 696 | 爱姬 amjs 697 | 爱哭 amki 698 | 爱看 amkk 699 | 鞍马劳顿 amld 700 | 爱聊 amlf 701 | 爱恋 amlh 702 | 爱侣 amlj 703 | 爱郎 amll 704 | 爱怜 amln 705 | 爱丽丝 amls 706 | 爱乐 amlw 707 | 爱立信 amlx 708 | 爱民 ammb 709 | 爱慕 amme 710 | 爱面子 ammi 711 | 爱美 ammm 712 | 爱民区 ammq 713 | 爱默生 amms 714 | 爱民区 ammu 715 | 爱面子 ammz 716 | 爱闹 amn 717 | 爱莫能助 amni 718 | 爱你 amnj 719 | 爱闹 amnj 720 | 爱女 amns 721 | 爱鸟 amnw 722 | 爱莫能助 amnz 723 | 爱拼 ampk 724 | 爱普生 amps 725 | 爱犬 amqa 726 | 爱琴海 amqh 727 | 爱情 amqn 728 | 爱情片 amqp 729 | 爱妻 amqs 730 | 爱去 amqu 731 | 爱卿 amqw 732 | 爱钱 amqy 733 | 爱民如子 amri 734 | 爱人 amrj 735 | 爱人民 amrm 736 | 爱热闹 amrn 737 | 爱民如子 amrz 738 | 阿姆斯特丹 amsd 739 | 爱思考 amsk 740 | 爱神 amsl 741 | 阿姆斯特朗 amsl 742 | 爱书 amsx 743 | 爱上 amsy 744 | 阿弥陀佛 amtf 745 | 爱听 amti 746 | 爱他 amtj 747 | 爱徒 amtk 748 | 澳门特别行政区 amtq 749 | 爱她 amts 750 | 澳门特别行政区 amtu 751 | 爱犬 amua 752 | 爱琴海 amuh 753 | 爱情 amun 754 | 爱情片 amup 755 | 爱妻 amus 756 | 爱去 amuu 757 | 爱卿 amuw 758 | 爱钱 amuy 759 | 爱玩 amwg 760 | 爱问 amwj 761 | 傲慢无礼 amwl 762 | 奥妙无穷 amwq 763 | 爱我 amwt 764 | 奥妙无穷 amwu 765 | 爱心 amxl 766 | 阿莫西林 amxl 767 | 爱惜 amxn 768 | 爱慕虚荣 amxr 769 | 爱笑 amxt 770 | 爱乡 amxx 771 | 爱意 amyh 772 | 傲慢与偏见 amyj 773 | 爱欲 amym 774 | 爱婴 amyo 775 | 爱与 amys 776 | 爱用 amyw 777 | 爱幼 amyx 778 | 爱滋病 amzb 779 | 爱滋 amzd 780 | 爱祖国 amzg 781 | 挨门逐户 amzh 782 | 爱做 amzj 783 | 爱着 amzm 784 | 爱憎 amzn 785 | 爱子 amzv 786 | 爱美之心 amzx 787 | 爱美之心人皆有之 amzz 788 | 安 an 789 | 案 an 790 | 案板 anbc 791 | 安邦 anbg 792 | 安瓿 anbh 793 | 按捺不住 anbi 794 | 安保 anbj 795 | 按捺不住 anbz 796 | 案 anc 797 | 案 ancc 798 | 安插 anck 799 | 案底 and 800 | 安东尼 and 801 | 安达 anda 802 | 安道尔 ande 803 | 安度 andh 804 | 案底 andh 805 | 安打 andk 806 | 安得 andk 807 | 安大略 andl 808 | 安定 andn 809 | 安东尼 andn 810 | 安迪 ando 811 | 安定区 andq 812 | 案牍 andr 813 | 安顿 ands 814 | 安德森 ands 815 | 安定区 andu 816 | 安达信 andx 817 | 安放 anfh 818 | 安抚 anfk 819 | 安福 anfl 820 | 安分 anfm 821 | 案发 anfn 822 | 安防 anfv 823 | 案犯 anfw 824 | 案发 anfz 825 | 安规 angg 826 | 安哥拉 angl 827 | 安国 ango 828 | 安国市 angs 829 | 安徽省 anh 830 | 安魂 anhg 831 | 安化 anhj 832 | 安徽 anhk 833 | 懊悔 anhn 834 | 安魂曲 anhq 835 | 安徽人 anhr 836 | 安徽省 anhs 837 | 安好 anhs 838 | 安魂曲 anhu 839 | 安在 ania 840 | 安装包 anib 841 | 安枕 anic 842 | 安葬 anie 843 | 安装 anih 844 | 安坐 anij 845 | 安置 anio 846 | 安装盘 anip 847 | 安知 anit 848 | 案子 aniv 849 | 安卓 aniy 850 | 安居 anjb 851 | 安检 anjc 852 | 安家费 anjf 853 | 安静 anjg 854 | 案件 anjj 855 | 案卷 anjm 856 | 安家 anjn 857 | 安监 anju 858 | 案几 anjw 859 | 阿那克西曼德 ankd 860 | 安可 ankf 861 | 安康 ankh 862 | 安卡拉 ankl 863 | 阿那克萨哥拉 ankl 864 | 安禄山 anl 865 | 安乐窝 anl 866 | 安龙 anla 867 | 安澜 anld 868 | 安理会 anlh 869 | 案例 anlj 870 | 安拉 anlk 871 | 安乐死 anls 872 | 安禄山 anls 873 | 安利 anlt 874 | 安陆 anlv 875 | 安乐 anlw 876 | 安乐窝 anlw 877 | 安乐椅 anly 878 | 安民 anmb 879 | 安谧 anml 880 | 安眠 anmo 881 | 安曼 anmr 882 | 安眠药 anmy 883 | 安宁 ann 884 | 安妮 ann 885 | 安南 annf 886 | 安能 annl 887 | 懊恼 annn 888 | 安宁 annn 889 | 安内 anno 890 | 安宁区 annq 891 | 安娜 anns 892 | 安妮 anns 893 | 安宁区 annu 894 | 安排表 anpb 895 | 安普敦 anpd 896 | 安平 anph 897 | 安培计 anpj 898 | 安排 anpk 899 | 安贫 anpm 900 | 安培 anpu 901 | 安排下 anpx 902 | 安全感 anq 903 | 安全局 anq 904 | 安全区 anq 905 | 安全部 anqb 906 | 安全带 anqd 907 | 安琪儿 anqe 908 | 安全阀 anqf 909 | 安琪 anqg 910 | 安全感 anqg 911 | 安庆 anqh 912 | 安全 anqj 913 | 安全局 anqj 914 | 安全帽 anqm 915 | 案情 anqn 916 | 安全期 anqq 917 | 安全区 anqq 918 | 安丘 anqr 919 | 安庆市 anqs 920 | 安全套 anqt 921 | 安全性 anqx 922 | 懊 anr 923 | 懊 anra 924 | 安然 anrv 925 | 安然 anrw 926 | 安内攘外 anrw 927 | 安 ans 928 | 安设 ans 929 | 安顺 ans 930 | 懊丧 ansf 931 | 安神 ansl 932 | 安设 ansl 933 | 案首 ansm 934 | 安塞 ansn 935 | 安睡 anso 936 | 安身 ansr 937 | 安顺 ansr 938 | 安顺市 anss 939 | 安 anss 940 | 安适 anst 941 | 安生 anst 942 | 安上 ansy 943 | 安泰 antg 944 | 安踏 anti 945 | 案头 antn 946 | 安图 anto 947 | 安徒生 ants 948 | 安胎 antv 949 | 安胎药 anty 950 | 安纳托利亚高原 anty 951 | 安全感 anu 952 | 安全局 anu 953 | 安全部 anub 954 | 安全带 anud 955 | 安琪儿 anue 956 | 安全阀 anuf 957 | 安琪 anug 958 | 安全感 anug 959 | 安庆 anuh 960 | 安全 anuj 961 | 安全局 anuj 962 | 安全帽 anum 963 | 案情 anun 964 | 安丘 anur 965 | 安庆市 anus 966 | 安全套 anut 967 | 安全期 anuu 968 | 安全区 anuu 969 | 安全性 anux 970 | 安慰 anwb 971 | 安卧 anwf 972 | 安委会 anwh 973 | 安慰剂 anwj 974 | 安稳 anwt 975 | 安危 anww 976 | 傲睨万物 anww 977 | 安慰性 anwx 978 | 安心 anx 979 | 安歇 anx 980 | 安溪 anxd 981 | 安西 anxf 982 | 安享 anxh 983 | 安闲 anxj 984 | 安祥 anxl 985 | 安心 anxl 986 | 安县 anxo 987 | 安息 anxr 988 | 安歇 anxr 989 | 安息香 anxx 990 | 安源 anyd 991 | 安营 anye 992 | 安于 anyg 993 | 案由 anyo 994 | 安源区 anyq 995 | 安阳市 anys 996 | 安源区 anyu 997 | 安阳 anyv 998 | 安逸 anyw 999 | 安在 anza 1000 | 安装包 anzb 1001 | 安枕 anzc 1002 | 安葬 anze 1003 | 安装 anzh 1004 | 安坐 anzj 1005 | 安置 anzo 1006 | 安装盘 anzp 1007 | 安知 anzt 1008 | 案子 anzv 1009 | 安卓 anzy 1010 | 岸 ao 1011 | 凹 ao 1012 | 黯 ao 1013 | 岸 aoa 1014 | 岸 aoag 1015 | 岸边 aobn 1016 | 凹版 aobr 1017 | 岸边 aobz 1018 | 凹槽 aocc 1019 | 凹处 aocw 1020 | 凹 aod 1021 | 黯淡 aodd 1022 | 凹 aodd 1023 | 凹地 aodu 1024 | 岸防 aofv 1025 | 盎格鲁 aogl 1026 | 岸谷 aogm 1027 | 黯 aoh 1028 | 凹痕 aohh 1029 | 黯 aohr 1030 | 岸基 aojf 1031 | 凹进 aojg 1032 | 凹镜 aojy 1033 | 凹坑 aoku 1034 | 凹面 aoma 1035 | 凹面镜 aomj 1036 | 盎 aoo 1037 | 盎 aood 1038 | 岸炮 aopm 1039 | 盎然 aor 1040 | 凹入 aorm 1041 | 黯然 aorv 1042 | 盎然 aorv 1043 | 黯然 aorw 1044 | 盎然 aorw 1045 | 盎司 aosb 1046 | 盎斯 aosf 1047 | 岸上 aosy 1048 | 岸滩 aotd 1049 | 凹透镜 aotj 1050 | 凹凸 aoty 1051 | 凹陷处 aoxc 1052 | 凹下 aoxf 1053 | 凹形 aoxg 1054 | 凹陷 aoxv 1055 | 凹印 aoyw 1056 | 安贫乐道 apld 1057 | 哀其不幸 aqbx 1058 | 安全出行 aqcx 1059 | 按期付款 aqfk 1060 | 按期归还 aqgh 1061 | 安全座椅 aqiy 1062 | 爱情价更高 aqjg 1063 | 安全驾驶 aqjs 1064 | 鞍前马后 aqmh 1065 | 按期完成 aqwc 1066 | 安全座椅 aqzy 1067 | 暗 ar 1068 | 昂 ar 1069 | 奥 ara 1070 | 皑皑 ara 1071 | 奥 arak 1072 | 暗暗 arar 1073 | 皑皑 arar 1074 | 暗堡 arbj 1075 | 暗补 arbl 1076 | 奥巴马 arbm 1077 | 暗沉沉 arcc 1078 | 暗潮 arcd 1079 | 暗藏 arce 1080 | 暗疮 arch 1081 | 暗忖 arcn 1082 | 暗娼 arcs 1083 | 暗处 arcw 1084 | 暗淡 ardd 1085 | 奥地利 ardl 1086 | 暗道 ardm 1087 | 暗斗 ardn 1088 | 奥迪 ardo 1089 | 奥德赛 ards 1090 | 暗地 ardu 1091 | 暗点 ardy 1092 | 奥尔良 arel 1093 | 暗讽 arf 1094 | 暗房 arf 1095 | 暗访 arfl 1096 | 暗讽 arfl 1097 | 暗房 arfl 1098 | 暗格 argc 1099 | 暗杠 argc 1100 | 暗沟 argd 1101 | 昂贵 argo 1102 | 暗 arh 1103 | 暗合 arh 1104 | 暗灰 arha 1105 | 暗河 arhd 1106 | 暗花 arhe 1107 | 暗黄 arhf 1108 | 暗号 arhi 1109 | 暗含 arhj 1110 | 暗合 arhj 1111 | 暗话 arhl 1112 | 暗害 arhn 1113 | 暗黑 arho 1114 | 暗 arhr 1115 | 暗红色 arhs 1116 | 暗红 arhx 1117 | 澳人治澳 aria 1118 | 爱如珍宝 arib 1119 | 暗指 arik 1120 | 暗中 ario 1121 | 暗自 arir 1122 | 奥组委 ariw 1123 | 暗紫 ariy 1124 | 暗礁 arja 1125 | 暗叫 arji 1126 | 暗箭 arjt 1127 | 暗亏 arkg 1128 | 暗扣 arkk 1129 | 奥卡姆 arkm 1130 | 翱 arl 1131 | 奥林 arlc 1132 | 暗流 arld 1133 | 暗恋 arlh 1134 | 翱 arll 1135 | 暗里 arlo 1136 | 暗绿 arlx 1137 | 黯然泪下 arlx 1138 | 暧 arm 1139 | 暗码 arm 1140 | 奥姆 arm 1141 | 暗码 arma 1142 | 暧 arma 1143 | 暗骂 armi 1144 | 暗门 armj 1145 | 暧昧 armr 1146 | 奥妙 arms 1147 | 奥姆 arms 1148 | 奥秘 armt 1149 | 奥尼尔 arne 1150 | 皑 aro 1151 | 皑 arob 1152 | 安如磐石 arps 1153 | 暗器 arqi 1154 | 昂起头 arqt 1155 | 昂起 arqu 1156 | 暗弱 arrb 1157 | 昂仁 arrj 1158 | 昂然 arrv 1159 | 昂然 arrw 1160 | 奥数 ars 1161 | 昂首 ars 1162 | 奥赛 ars 1163 | 暗沙 arsd 1164 | 暗事 arsf 1165 | 暗示 arsg 1166 | 暗哨 arsi 1167 | 暗伤 arsj 1168 | 奥斯卡 arsk 1169 | 奥斯陆 arsl 1170 | 昂然耸立 arsl 1171 | 暗杀 arsm 1172 | 昂首 arsm 1173 | 奥斯曼 arsm 1174 | 奥数 arsm 1175 | 暗室 arsn 1176 | 奥赛 arsn 1177 | 暗射 arsr 1178 | 黯然失色 arss 1179 | 黯然神伤 arss 1180 | 暗算 arst 1181 | 暗色 arsw 1182 | 暗锁 arsy 1183 | 奥拓 art 1184 | 暗滩 artd 1185 | 暗叹 arti 1186 | 奥陶纪 artj 1187 | 暗探 artk 1188 | 奥拓 artk 1189 | 奥特曼 artm 1190 | 昂头 artn 1191 | 安如泰山 arts 1192 | 暗器 arui 1193 | 昂起头 arut 1194 | 昂起 aruu 1195 | 昂 arw 1196 | 奥威尔 arwe 1197 | 奥委会 arwh 1198 | 暗物质 arwi 1199 | 安然无事 arws 1200 | 昂 arwv 1201 | 安然无恙 arwy 1202 | 暗物质 arwz 1203 | 暗笑 arx 1204 | 暗想 arxc 1205 | 黯然销魂 arxh 1206 | 暗许 arxl 1207 | 翱翔 arxm 1208 | 暗箱 arxt 1209 | 暗笑 arxt 1210 | 暗喜 arxu 1211 | 奥匈 arxw 1212 | 暗线 arxx 1213 | 奥运村 aryc 1214 | 暗涌 aryd 1215 | 矮人一等 aryd 1216 | 奥运 aryg 1217 | 奥运会 aryh 1218 | 暗喻 aryi 1219 | 昂扬 aryk 1220 | 暗语 aryl 1221 | 傲然屹立 aryl 1222 | 奥义 arym 1223 | 暗影 aryr 1224 | 暗月 aryv 1225 | 澳人治澳 arza 1226 | 爱如珍宝 arzb 1227 | 暗指 arzk 1228 | 暗中 arzo 1229 | 暗自 arzr 1230 | 奥组委 arzw 1231 | 暗紫 arzy 1232 | 嫒 as 1233 | 媪 as 1234 | 碍手碍脚 asaj 1235 | 阿塞拜疆 asbj 1236 | 安神补脑 asbn 1237 | 安神定志 asdi 1238 | 安神定惊 asdj 1239 | 安神定志 asdz 1240 | 埃塞俄比亚 asey 1241 | 艾森豪威尔 ashe 1242 | 安身之处 asic 1243 | 安身之地 asid 1244 | 安史之乱 asil 1245 | 爱斯基摩 asjm 1246 | 爱斯基摩人 asjr 1247 | 昂首阔步 askb 1248 | 安身立命 aslm 1249 | 嫒 asm 1250 | 嫒 asma 1251 | 爱沙尼亚 asny 1252 | 阿司匹林 aspl 1253 | 暗送秋波 asqb 1254 | 傲视群雄 asqx 1255 | 媪 asr 1256 | 媪 asro 1257 | 唉声叹气 astq 1258 | 唉声叹气 astu 1259 | 昂首挺胸 astx 1260 | 暗送秋波 asub 1261 | 傲视群雄 asux 1262 | 奥斯威辛 aswx 1263 | 奥斯维辛 aswx 1264 | 安身之处 aszc 1265 | 安身之地 aszd 1266 | 安史之乱 aszl 1267 | 矮 at 1268 | 氨 at 1269 | 矮矮 atat 1270 | 氨苄 atbe 1271 | 矮半截 atbj 1272 | 凹凸不平 atbp 1273 | 氨茶碱 atcj 1274 | 矮凳 atdl 1275 | 矮的 atdr 1276 | 矮个儿 atge 1277 | 矮个子 atgi 1278 | 矮个 atgj 1279 | 矮个子 atgz 1280 | 矮化 athj 1281 | 安土重迁 atiq 1282 | 安土重迁 atiu 1283 | 矮子 ativ 1284 | 奥体中心 atix 1285 | 氨基 atjf 1286 | 氨基酸 atjs 1287 | 暗通款曲 atkq 1288 | 暗通款曲 atku 1289 | 阿特拉斯山 atls 1290 | 氨纶 atlx 1291 | 氨 atn 1292 | 氨 atns 1293 | 岙 ato 1294 | 岙 atoi 1295 | ATP atp 1296 | 矮胖 atpv 1297 | 氨气 atqt 1298 | 矮墙 atqu 1299 | 矮人 atrj 1300 | 矮树 atsc 1301 | 氨水 atsd 1302 | 氨酸 atsf 1303 | 按图索骥 atsj 1304 | 矮 att 1305 | 氨糖 attm 1306 | 矮 atts 1307 | 昂头挺胸 attx 1308 | 氨气 atut 1309 | 矮墙 atuu 1310 | 安特卫普 atwp 1311 | 矮小 atxp 1312 | 矮一截 atyj 1313 | 哀痛欲绝 atyj 1314 | 安土重迁 atzq 1315 | 安土重迁 atzu 1316 | 矮子 atzv 1317 | 奥体中心 atzx 1318 | 埃 au 1319 | 坳 au 1320 | 埯 aua 1321 | 埯 auao 1322 | 埃博拉 aubl 1323 | 哀其不幸 aubx 1324 | 安全出行 aucx 1325 | 埃弗顿 aufd 1326 | 埃菲尔 aufe 1327 | 按期付款 aufk 1328 | 按期归还 augh 1329 | 安全座椅 auiy 1330 | 爱情价更高 aujg 1331 | 安全驾驶 aujs 1332 | 埃及 aujw 1333 | 埃 aul 1334 | 埃 ault 1335 | 埃米尔 aume 1336 | 鞍前马后 aumh 1337 | 垵 aun 1338 | 垵 auns 1339 | 按期完成 auwc 1340 | 坳 aux 1341 | 毐 auxd 1342 | 坳 auxn 1343 | 坳 auxz 1344 | 安全座椅 auzy 1345 | 阿 av 1346 | 隘 av 1347 | 腌 ava 1348 | 腌 avao 1349 | 阿伯 avbj 1350 | 阿波罗 avbl 1351 | 阿爸 avbm 1352 | 阿坝 avbu 1353 | 阿昌族 avci 1354 | 阿城 avcu 1355 | 阿昌族 avcz 1356 | 阿大 avda 1357 | 阿豆 avdd 1358 | 胺多酚 avdf 1359 | 阿道夫 avdf 1360 | 阿斗 avdn 1361 | 胺碘酮 avdt 1362 | 阿尔法 avef 1363 | 阿尔泰 avet 1364 | 阿 avf 1365 | 阿富汗 avfh 1366 | 阿 avfi 1367 | 阿飞 avfn 1368 | 阿凡提 avft 1369 | 阿飞 avfz 1370 | 阿哥 avgf 1371 | 阿公 avgm 1372 | 阿根廷 avgt 1373 | 肮 avh 1374 | 阿訇 avhw 1375 | 肮 avhw 1376 | 腌臜 avi 1377 | 肮脏 aviv 1378 | 腌臜 aviv 1379 | 阿姐 avjs 1380 | 阿肯色 avk 1381 | 隘口 avki 1382 | 阿克苏 avks 1383 | 阿肯色 avks 1384 | 阿留申 avl 1385 | 阿里山 avl 1386 | 阿拉伯 avlb 1387 | 阿罗汉 avlh 1388 | 阿拉 avlk 1389 | 阿兰 avlm 1390 | 阿里 avlo 1391 | 阿联酋 avlq 1392 | 阿拉善 avls 1393 | 阿里山 avls 1394 | 阿留申 avls 1395 | 阿勒泰 avlt 1396 | 阿联酋 avlu 1397 | 隘 avm 1398 | 阿盟 avm 1399 | 阿妹 avm 1400 | 阿米巴 avmb 1401 | 阿穆尔 avme 1402 | 阿门 avmj 1403 | 阿玛尼 avmn 1404 | 隘 avmo 1405 | 阿曼 avmr 1406 | 阿盟 avmr 1407 | 阿妈 avms 1408 | 阿妹 avms 1409 | 胺 avn 1410 | 阿诺 avnl 1411 | 阿囡 avno 1412 | 胺 avns 1413 | 阿婆 avpd 1414 | 阿帕奇 avpj 1415 | 阿片 avpr 1416 | 阿瑟 avsg 1417 | 阿诗玛 avsm 1418 | 阿是穴 avsx 1419 | 阿叔 avsy 1420 | 阿嚏 avti 1421 | 阿提拉 avtl 1422 | 阿托品 avtp 1423 | 阿修罗 avxl 1424 | 阿姨 avys 1425 | 阿育王 avyw 1426 | 腌臜 avz 1427 | 肮脏 avzv 1428 | 腌臜 avzv 1429 | 犴 aw 1430 | 安慰别人 awbr 1431 | 犴 awg 1432 | 犴 awgi 1433 | 安危祸福 awhf 1434 | 爱屋及乌 awjw 1435 | 安危冷暖 awln 1436 | 爱我所爱 awsa 1437 | 暗无天日 awtr 1438 | 安慰一下 awyx 1439 | 暗箱操作 axci 1440 | 暗箱操作 axcz 1441 | 奥匈帝国 axdg 1442 | 安心定志 axdi 1443 | 按需定制 axdi 1444 | 安心定志 axdz 1445 | 按需定制 axdz 1446 | 熬心费力 axfl 1447 | 按需分配 axfp 1448 | 安心工作 axgi 1449 | 爱惜公物 axgw 1450 | 安心工作 axgz 1451 | 按下葫芦浮起瓢 axhp 1452 | 安闲自得 axid 1453 | 安闲自在 axii 1454 | 爱惜自己 axij 1455 | 爱心助学 axix 1456 | 爱心捐款 axjk 1457 | 爱新觉罗 axjl 1458 | 暗下决心 axjx 1459 | 按下快门 axkm 1460 | 阿西莫夫 axmf 1461 | 爱惜人才 axrc 1462 | 爱惜生命 axsm 1463 | 暗香疏影 axsy 1464 | 安享天年 axtn 1465 | 安享晚年 axwn 1466 | 安下心来 axxl 1467 | 爱惜羽毛 axym 1468 | 安闲自得 axzd 1469 | 爱惜自己 axzj 1470 | 爱心助学 axzx 1471 | 安闲自在 axzz 1472 | 铵 ay 1473 | 锿 ay 1474 | 奥运比赛 aybs 1475 | 奥运场馆 aycg 1476 | 阿以冲突 ayct 1477 | 按月发放 ayff 1478 | 奥运冠军 aygj 1479 | 锿 ayh 1480 | 锿 ayhi 1481 | 锿 ayhw 1482 | 按月支付 ayif 1483 | 安营扎寨 ayii 1484 | 奥运精神 ayjs 1485 | 按月领取 aylq 1486 | 按月领取 aylu 1487 | 碍于面子 aymi 1488 | 奥伊米亚康 aymk 1489 | 哎呀妈呀 aymy 1490 | 碍于面子 aymz 1491 | 铵 ayn 1492 | 铵 ayns 1493 | 碍于情面 ayqm 1494 | 遨游四海 aysh 1495 | 爱因斯坦 ayst 1496 | 碍于情面 ayum 1497 | 锕 ayv 1498 | 锕 ayvf 1499 | 锕系 ayxe 1500 | 安于现状 ayxi 1501 | 奥运项目 ayxm 1502 | 昂扬向上 ayxs 1503 | 锕系 ayxw 1504 | 安于现状 ayxz 1505 | 爱乐乐团 ayyt 1506 | 铵盐 ayyu 1507 | 安于一隅 ayyy 1508 | 按月支付 ayzf 1509 | 安营扎寨 ayzz 1510 | 安置补偿 azbc 1511 | 艾滋病毒 azbd 1512 | 按照常规 azcg 1513 | 安装次数 azcs 1514 | 按照传统 azct 1515 | 暗中调查 azdc 1516 | 按制度办事 azds 1517 | 暗自得意 azdy 1518 | 安知非福 azff 1519 | 爱憎分明 azfm 1520 | 按照法律程序 azfx 1521 | 暗中观察 azgc 1522 | 按照国际惯例 azgl 1523 | 按质论价 azlj 1524 | 暗中摸索 azms 1525 | 按资排辈 azpb 1526 | 暗中盘算 azps 1527 | 安之若素 azrs 1528 | 爱之深,痛之切 azsq 1529 | 爱之深,责之切 azsq 1530 | 爱之深,恨之切 azsq 1531 | 爱之深,痛之切 azsu 1532 | 爱之深,责之切 azsu 1533 | 爱之深,恨之切 azsu 1534 | 阿兹特克 aztk 1535 | 癌症晚期 azwq 1536 | 癌症晚期 azwu 1537 | 安枕无忧 azwy 1538 | 暗中相助 azxz 1539 | 爱咋咋的 azzd 1540 | 不 b 1541 | 比如 b 1542 | 必须 b 1543 | 布 ba 1544 | 奔 baa 1545 | 不爱吃 baac 1546 | 奔 baai 1547 | 不按 baak 1548 | 不谙 baal 1549 | 不爱 baam 1550 | 不安 baan 1551 | 不爱听 baat 1552 | 不安稳 baaw 1553 | 不安心 baax 1554 | 不变量 bab 1555 | 不悖 bab 1556 | 不避 babb 1557 | 奔波 babd 1558 | 不薄 babe 1559 | 不变 babh 1560 | 不把 babk 1561 | 不必 babl 1562 | 不变量 babl 1563 | 保安部门 babm -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------