diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index c8c6bb40..ca3bc6ee 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -140,6 +140,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{ } m.Options("scan_end", false) + m.Optionv("ps_target", cli.target) m.Option("prompt", m.Conf("prompt")) m.Cap("stream", m.Spawn(yac.Target()).Call(func(cmd *ctx.Message) *ctx.Message { if !m.Caps("parse") { @@ -160,6 +161,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{ m.Options("scan_end", true) m.Target().Close(m.Spawn()) } + m.Optionv("ps_target", cli.target) return nil }, "parse", arg[1]).Target().Name) @@ -235,6 +237,10 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", }}, "target": &ctx.Command{Name: "target module", Help: "设置当前模块, module: 模块全名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{ + if len(arg) == 0 { + m.Echo("%s", m.Cap("ps_target")) + return + } if msg := m.Find(arg[0]); msg != nil { cli.target = msg.Target() m.Cap("ps_target", cli.target.Name) @@ -726,10 +732,6 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", } // }}} }}, - "demo": &ctx.Command{Name: "demo word", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { - m.Append("hi", "hello", "world") - m.Echo("nice") - }}, }, } diff --git a/src/contexts/lex/lex.go b/src/contexts/lex/lex.go index 9b21ca4a..e894c137 100644 --- a/src/contexts/lex/lex.go +++ b/src/contexts/lex/lex.go @@ -225,50 +225,7 @@ func (lex *LEX) train(page int, hash int, seed []byte) int { // {{{ } // }}} -func (lex *LEX) parse(page int, line []byte) (hash int, rest []byte, word []byte) { // {{{ - - pos := 0 - for star, s := 0, page; s != 0 && pos < len(line); pos++ { - - c := line[pos] - if c == '\\' && pos < len(line)-1 { //跳过转义 - pos++ - c = lex.charset(line[pos])[0] - } - if c > 127 { //跳过中文 - word = append(word, c) - continue - } - - state := lex.mat[s][c] - lex.Log("debug", nil, "(%d,%d): %v", s, c, state) - if state == nil { - s, star, pos = star, 0, pos-1 - continue - } - - word = append(word, c) - - if state.star { - star = s - } else if x, ok := lex.mat[star][c]; !ok || !x.star { - star = 0 - } - - if s, hash = state.next, state.hash; s == 0 { - s, star = star, 0 - } - } - - if hash == 0 { - pos, word = 0, word[:0] - } - rest = line[pos:] - return -} - -// }}} -func (lex *LEX) scan(m *ctx.Message, page int, line []byte) (hash int, rest []byte, word []byte) { // {{{ +func (lex *LEX) parse(m *ctx.Message, page int, line []byte) (hash int, rest []byte, word []byte) { // {{{ pos := 0 for star, s := 0, page; s != 0 && pos < len(line); pos++ { @@ -378,7 +335,6 @@ func (lex *LEX) Close(m *ctx.Message, arg ...string) bool { // {{{ case m.Target(): case m.Source(): } - return false return true } @@ -415,19 +371,7 @@ var Index = &ctx.Context{Name: "lex", Help: "词法中心", page = lex.index("npage", arg[1]) } - hash, rest, word := lex.parse(page, []byte(arg[0])) - m.Result(0, hash, string(rest), string(word)) - lex.Log("debug", nil, "\033[31m[%v]\033[0m %d [%v]", string(word), hash, string(rest)) - } // }}} - }}, - "scan": &ctx.Command{Name: "scan line [page]", Help: "解析单词", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { - if lex, ok := m.Target().Server.(*LEX); m.Assert(ok) { // {{{ - page := 1 - if len(arg) > 1 { - page = lex.index("npage", arg[1]) - } - - hash, rest, word := lex.scan(m, page, []byte(arg[0])) + hash, rest, word := lex.parse(m, page, []byte(arg[0])) m.Result(0, hash, string(rest), string(word)) } // }}} }}, @@ -449,9 +393,9 @@ var Index = &ctx.Context{Name: "lex", Help: "词法中心", } rest := []byte(arg[0]) - _, _, rest = lex.parse(help, []byte(rest)) - _, _, rest = lex.parse(void, []byte(rest)) - hash, word, rest := lex.parse(page, []byte(rest)) + _, _, rest = lex.parse(m, help, []byte(rest)) + _, _, rest = lex.parse(m, void, []byte(rest)) + hash, word, rest := lex.parse(m, page, []byte(rest)) m.Add("result", fmt.Sprintf("%d", hash), string(word), string(rest)) } // }}} }}, @@ -502,11 +446,6 @@ var Index = &ctx.Context{Name: "lex", Help: "词法中心", } // }}} }}, }, - Index: map[string]*ctx.Context{ - "void": &ctx.Context{Name: "void", Help: "void", - Commands: map[string]*ctx.Command{"parse": &ctx.Command{}}, - }, - }, } func init() { diff --git a/src/contexts/nfs/nfs.go b/src/contexts/nfs/nfs.go index bd534e2e..b902967e 100644 --- a/src/contexts/nfs/nfs.go +++ b/src/contexts/nfs/nfs.go @@ -3,11 +3,11 @@ package nfs // {{{ import ( // {{{ "contexts" "encoding/json" - "errors" "github.com/nsf/termbox-go" "github.com/skip2/go-qrcode" "bufio" + "errors" "fmt" "io" "io/ioutil" @@ -25,11 +25,12 @@ import ( // {{{ var FileNotExist = errors.New("file not exist") type NFS struct { - in *os.File - out *os.File - history []string - pages []string - width, height int + in *os.File + out *os.File + history []string + pages []string + width int + height int paths []string @@ -470,8 +471,7 @@ func (nfs *NFS) Read(p []byte) (n int, err error) { // {{{ case termbox.KeyCtrlK: if len(rest) > 0 { - back = back[:0] - back = append(back, rest...) + back = append([]rune{}, rest...) } rest = rest[:0] @@ -487,16 +487,17 @@ func (nfs *NFS) Read(p []byte) (n int, err error) { // {{{ if len(tab) == 0 { tabi = 0 prefix := string(buf) - msg := nfs.Message.Spawn(nfs.cli.Target()) - target := msg.Cmd("target").Data["target"].(*ctx.Context) - msg.Spawn(target).BackTrace(func(msg *ctx.Message) bool { - for k, _ := range msg.Target().Commands { + target := nfs.Message.Target() + nfs.Message.Target(nfs.Optionv("ps_target").(*ctx.Context)) + nfs.Message.BackTrace(func(m *ctx.Message) bool { + for k, _ := range m.Target().Commands { if strings.HasPrefix(k, prefix) { tab = append(tab, k[len(prefix):]) } } return true }) + nfs.Message.Target(target) } if tabi >= 0 && tabi < len(tab) { @@ -619,8 +620,7 @@ func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool { // {{{ nfs.print(v) } if msg.Append("file_pos0") != "" { - i = msg.Appendi("file_pos0") - i-- + i = msg.Appendi("file_pos0") - 1 } } line = "" @@ -1401,18 +1401,6 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心", } // }}} }}, }, - Index: map[string]*ctx.Context{ - "void": &ctx.Context{Name: "void", - Commands: map[string]*ctx.Command{ - "scan": &ctx.Command{}, - "open": &ctx.Command{}, - "save": &ctx.Command{}, - "load": &ctx.Command{}, - "genqr": &ctx.Command{}, - "write": &ctx.Command{}, - }, - }, - }, } func init() { diff --git a/src/contexts/yac/yac.go b/src/contexts/yac/yac.go index 2f6ad7f9..ed5b54a6 100644 --- a/src/contexts/yac/yac.go +++ b/src/contexts/yac/yac.go @@ -192,7 +192,7 @@ func (yac *YAC) parse(m *ctx.Message, out *ctx.Message, page int, void int, line for star, s := 0, page; s != 0 && len(line) > 0; { //解析空白 lex := m.Sesss("lex") - lex.Cmd("scan", line, yac.name(void)) + lex.Cmd("parse", line, yac.name(void)) if lex.Result(0) == "-1" { break } @@ -200,7 +200,7 @@ func (yac *YAC) parse(m *ctx.Message, out *ctx.Message, page int, void int, line //解析单词 line = lex.Result(1) lex = m.Sesss("lex") - lex.Cmd("scan", line, yac.name(s)) + lex.Cmd("parse", line, yac.name(s)) if lex.Result(0) == "-1" { break } @@ -257,7 +257,6 @@ func (yac *YAC) parse(m *ctx.Message, out *ctx.Message, page int, void int, line func (yac *YAC) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server { // {{{ yac.Message = m - c.Caches = map[string]*ctx.Cache{} c.Configs = map[string]*ctx.Config{} @@ -357,9 +356,7 @@ func (yac *YAC) Start(m *ctx.Message, arg ...string) (close bool) { // {{{ func (yac *YAC) Close(m *ctx.Message, arg ...string) bool { // {{{ switch yac.Context { case m.Target(): - return true case m.Source(): - return false } return true } @@ -373,15 +370,15 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", Configs: map[string]*ctx.Config{ "ncell": &ctx.Config{Name: "词法上限", Value: "128", Help: "词法集合的最大数量"}, "nlang": &ctx.Config{Name: "语法上限", Value: "32", Help: "语法集合的最大数量"}, - "name": &ctx.Config{Name: "name", Value: "parse", Help: "模块名", Hand: func(m *ctx.Message, x *ctx.Config, arg ...string) string { + "label": &ctx.Config{Name: "嵌套标记", Value: "####################", Help: "嵌套层级日志的标记"}, + "yac_name": &ctx.Config{Name: "yac_name", Value: "parse", Help: "模块名", Hand: func(m *ctx.Message, x *ctx.Config, arg ...string) string { if len(arg) > 0 { // {{{ return arg[0] } return fmt.Sprintf("%s%d", x.Value, m.Capi("nparse", 1)) // }}} }}, - "help": &ctx.Config{Name: "help", Value: "解析模块", Help: "模块帮助"}, - "label": &ctx.Config{Name: "嵌套标记", Value: "####################", Help: "嵌套层级日志的标记"}, + "yac_help": &ctx.Config{Name: "yac_help", Value: "解析模块", Help: "模块帮助"}, }, Commands: map[string]*ctx.Command{ "init": &ctx.Command{Name: "init [ncell [nlang]]", Help: "初始化语法矩阵", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { @@ -455,22 +452,17 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", // }}} }}, "parse": &ctx.Command{ - Name: "parse filename [name [help]] [line line] [void void]", - Help: "解析文件, filename: name:模块名, help:模块帮助, 文件名, line: 默认语法, void: 默认空白", + Name: "parse filename [yac_name [help]] [line line] [void void]", + Help: "解析文件, filename: yac_name:模块名, yac_help:模块帮助, 文件名, line: 默认语法, void: 默认空白", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { if yac, ok := m.Target().Server.(*YAC); m.Assert(ok) { // {{{ m.Optioni("page", yac.page["line"]) m.Optioni("void", yac.page["void"]) - m.Start(m.Confx("name", arg, 1), m.Confx("help", arg, 2), key, arg[0]) + m.Start(m.Confx("yac_name", arg, 1), m.Confx("yac_help", arg, 2), key, arg[0]) } // }}} }}, }, - Index: map[string]*ctx.Context{ - "void": &ctx.Context{Name: "void", Help: "void", - Commands: map[string]*ctx.Command{"parse": &ctx.Command{}}, - }, - }, } func init() {