pkg/

directory
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 2, 2022 License: GPL-3.0

README

支持多码表一起赛,支持多种码表格式,支持多种匹配算法,可自定义码表格式和匹配算法。

开始之前

下载:go get -u github.com/cxcn/gosmq/pkg/smq

导入:import "github.com/cxcn/gosmq/pkg/smq"

使用

创建赛码器

你可以从字节流、字符串、文件路径创建赛码器

func main(){
    // 从字节流
    f := os.Open(`filepath`) // 实现了 io.Reader 的方法
    s1 := smq.New("文本名",f)
    // 从字符串
    s2:= smq.NewFromString("文本名","这里是文本内容")
    // 从文件路径
    // 第一个参数可以填空,这时的文本名从路径推断
    s3 := smq.NewFromPath("","这里填写路径")
}

创建一个码表

func main(){
    // 先定义一些基本参数
    dict := &smq.Dict{
        Name:         "", // 码表名
        Single:       false, /* 单字模式
        注意单字模式最好用多多格式的码表,
        因为其他码表带有 order 信息,转换后可以用本格式码表
        */
        Format:       "", /* 码表格式
        jisu:js 极速赛码表 词\t编码选重
        duoduo:dd 多多格式码表 词\t编码
        jidian:jd 极点格式 编码\t词1 词2 词3
        bingling:bl 冰凌格式码表 编码\t词
        */
        Transfer   Transfer // 自定义码表格式转换
        SelectKeys:   "", // 普通码表自定义选重键(默认为_;')
        PushStart:    4, // 普通码表起顶码长(码长大于等于此数,首选不会追加空格)
        Algorithm:    "trie", // 匹配算法 trie:前缀树 order:顺序匹配(极速跟打器) longest:最长匹配
        Matcher:      nil, // 自定义匹配算法
        PressSpaceBy: "both", // 空格按键方式 left|right|both
        Details      bool,   // 输出详细数据
    }

    // 载入码表,同样提供 3 种方式
    // 从字节流
    f := os.Open(`filepath`) // 实现了 io.Reader 的方法
    dict.Load(f)
    // 从字符串
    dict.LoadFromString("这里是码表内容")
    // 从文件路径
    dict.LoadFromPath("这里填写路径")
}

添加码表到赛码器

s.Add(dict)

开始比赛

func main() {
    s := smq.New(...)
    dict := &smq.Dict{...}
    dict.Load(...)
    s.Add(dict)
    res := s.Run() // 他返回一个 []*smq.Result 结构体指针数组,具体定义可查看 result.go 文件
    // 你可以输出为 json
    s.ResToJson(res)
    // 如果你不需要结构体
    s.ToJson()
}

自定义码表转换

// 需要从 dict 生成本赛码器格式码表的字节数组
type Transformer interface {
    Read(transformer.Dict) []transformer.Entry
}

一个例子:

type newFormat struct {}

func (n newFormat) Read(dict transformer.Dict) []transformer.Entry {
	ret := make([]Entry, 0, 1e5)
    // 逐行读取
    scan := bufio.NewScanner(dict.Reader)
    for scan.Scan() {
        // 转格式为
        // 本赛码器格式 word code order
		ret = append(ret, transformer.Entry{word, code, order})
    }
    return ret
}

自定义匹配算法

程序定义了一个接口,在创建 smq.Dict 时传入 Matcher,这时 Algorithm 失效

type Matcher interface {
    // 插入一个词条 word code order
    Insert(string, string, int)
    // 读取完码表后的操作
    Handle()
    // 匹配下一个词 text point -> 匹配到的词长,code,order
    Match([]rune, int) (int, string, int)
}

Directories

Path Synopsis
html module

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL