├── 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 |
6 |
7 |
8 |
9 |
10 |
11 |
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 |
--------------------------------------------------------------------------------