From 7b9ada65ac962f79f716a40f824690e0ce2192b0 Mon Sep 17 00:00:00 2001 From: harveyshao Date: Fri, 4 Nov 2022 16:25:39 +0800 Subject: [PATCH] opt chart.go --- base/lex/split.go | 5 +++ core/wiki/chart.go | 61 ++++++++++--------------- core/wiki/chart/block.go | 22 +++++---- core/wiki/chart/chain.go | 90 ++++++++++++++++--------------------- core/wiki/chart/label.go | 89 +++++++++++++++--------------------- core/wiki/chart/sequence.go | 3 -- core/wiki/data.go | 2 +- core/wiki/draw.go | 5 +-- core/wiki/parse.go | 2 + core/wiki/wiki.go | 19 +++++++- core/wiki/wiki.shy | 14 +++--- 11 files changed, 144 insertions(+), 168 deletions(-) diff --git a/base/lex/split.go b/base/lex/split.go index 0b35be19..8b27aa10 100644 --- a/base/lex/split.go +++ b/base/lex/split.go @@ -55,6 +55,11 @@ func _split_list(m *ice.Message, file string, arg ...string) ice.Map { switch cb := m.OptionCB(SPLIT).(type) { case func(int, []string) []string: ls = cb(deep, ls) + case func(int, []string, ice.Map, ice.List): + + case func(int, []string, ice.Map, ice.Map): + root, _ := kit.Value(list[0], "list.0").(ice.Map) + cb(deep, ls, data, root) case func(int, []string, ice.Map) []string: ls = cb(deep, ls, data) case func([]string, ice.Map) []string: diff --git a/core/wiki/chart.go b/core/wiki/chart.go index 4336e416..e0a98ce1 100644 --- a/core/wiki/chart.go +++ b/core/wiki/chart.go @@ -4,8 +4,6 @@ import ( "strings" ice "shylinux.com/x/icebergs" - "shylinux.com/x/icebergs/base/cli" - "shylinux.com/x/icebergs/base/nfs" kit "shylinux.com/x/toolkits" ) @@ -36,14 +34,10 @@ func (item *Item) Push(str string, arg ice.Any) *Item { return item } func (item *Item) Dump(m *ice.Message) *ice.Message { - m.Echo(kit.Join(item.list, ice.SP), item.args...) - m.Echo(ice.NL) - return m + return m.Echo(kit.Join(item.list, ice.SP), item.args...).Echo(ice.NL) } -type Group struct { - list ice.Messages -} +type Group struct{ list ice.Messages } func NewGroup(m *ice.Message, arg ...string) *Group { g := &Group{list: ice.Messages{}} @@ -75,12 +69,15 @@ func (g *Group) Join(arg ...string) string { func (g *Group) Echo(group string, str string, arg ...ice.Any) *ice.Message { return g.Get(group).Echo(str, arg...) } -func (g *Group) EchoRect(group string, height, width, x, y int, arg ...string) *ice.Message { // rx ry - return g.Echo(group, ``, height, width, kit.Select("4", arg, 0), kit.Select("4", arg, 1), x, y, g.Join(kit.Slice(arg, 2)...)) +func (g *Group) EchoPath(group string, str string, arg ...ice.Any) *ice.Message { + return g.Echo(group, ``, kit.Format(str, arg...)) } func (g *Group) EchoLine(group string, x1, y1, x2, y2 int) *ice.Message { return g.Echo(group, "", x1, y1, x2, y2) } +func (g *Group) EchoRect(group string, height, width, x, y int, arg ...string) *ice.Message { // rx ry + return g.Echo(group, ``, height, width, kit.Select("4", arg, 0), kit.Select("4", arg, 1), x, y, g.Join(kit.Slice(arg, 2)...)) +} func (g *Group) EchoText(group string, x, y int, text string, arg ...string) *ice.Message { if text == "" { return g.Get(group) @@ -115,12 +112,17 @@ func (g *Group) Dump(m *ice.Message, group string, arg ...string) *Group { item.Echo(">").Dump(m).Copy(g.Get(group)).Echo("") return g } +func (g *Group) DumpAll(m *ice.Message, group ...string) *Group { + for _, grp := range group { + g.Dump(m, grp) + } + return g +} type Chart interface { Init(*ice.Message, ...string) Chart - Data(*ice.Message, ice.Any) Chart Draw(*ice.Message, int, int) Chart - + Data(*ice.Message, ice.Any) Chart GetHeight(...string) int GetWidth(...string) int } @@ -130,37 +132,23 @@ var chart_list = map[string]func(m *ice.Message) Chart{} func AddChart(name string, hand func(m *ice.Message) Chart) { chart_list[name] = hand } func _chart_show(m *ice.Message, kind, text string, arg ...string) { - // 默认参数 - m.Option(STROKE_WIDTH, "2") - switch m.Option("topic") { - case "black": - m.Option(STROKE, cli.YELLOW) - m.Option(FILL, cli.YELLOW) - default: - m.Option(STROKE, cli.BLUE) - m.Option(FILL, cli.YELLOW) - } m.Option(FONT_SIZE, "24") - m.Option(FONT_FAMILY, "monospace") + m.Option(STROKE_WIDTH, "2") chart := chart_list[kind](m) - - // 解析参数 for i := 0; i < len(arg)-1; i++ { m.Option(arg[i], arg[i+1]) } m.Option(FILL, kit.Select(m.Option(FILL), m.Option(BG))) m.Option(STROKE, kit.Select(m.Option(STROKE), m.Option(FG))) - // 计算尺寸 chart.Init(m, text) m.Option(WIDTH, chart.GetWidth()) m.Option(HEIGHT, chart.GetHeight()) - // 渲染引擎 _wiki_template(m, "", text, arg...) defer m.Echo("") + defer m.RenderResult() chart.Draw(m, 0, 0) - m.RenderResult() } const ( @@ -188,18 +176,15 @@ const ( const CHART = "chart" func init() { - Index.Merge(&ice.Context{Commands: ice.Commands{ - CHART: {Name: "chart type=label,chain,sequence auto text", Help: "图表", Hand: func(m *ice.Message, arg ...string) { + Index.MergeCommands(ice.Commands{ + CHART: {Name: "chart type=label,chain,sequence auto text", Help: "图表", Actions: WordAction( + ``, + ), Hand: func(m *ice.Message, arg ...string) { if len(arg) > 1 { _chart_show(m, arg[0], strings.TrimSpace(arg[1]), arg[2:]...) } }}, - }, Configs: ice.Configs{ - CHART: {Name: CHART, Help: "图表", Value: kit.Data( - nfs.TEMPLATE, ``, - )}, - }}) + }) } diff --git a/core/wiki/chart/block.go b/core/wiki/chart/block.go index 199597d4..a18e911d 100644 --- a/core/wiki/chart/block.go +++ b/core/wiki/chart/block.go @@ -10,21 +10,22 @@ import ( ) type Block struct { - Text string - FontSize int - FontColor string - BackGround string + Text string TextData string RectData string - Padding int - MarginX int - MarginY int + FontSize int + Padding int + MarginX int + MarginY int Height int Width int x, y int + + FontColor string + BackGround string } func (b *Block) Init(m *ice.Message, arg ...string) wiki.Chart { @@ -48,7 +49,7 @@ func (b *Block) Data(m *ice.Message, meta ice.Any) wiki.Chart { b.RectData += kit.Format("%s='%s' ", wiki.FILL, value) } }) - kit.Fetch(kit.Value(meta, "data"), func(key string, value string) { + kit.Fetch(kit.Value(meta, "text"), func(key string, value string) { b.TextData += kit.Format("%s='%s' ", key, value) }) kit.Fetch(kit.Value(meta, "rect"), func(key string, value string) { @@ -58,7 +59,7 @@ func (b *Block) Data(m *ice.Message, meta ice.Any) wiki.Chart { } func (b *Block) Draw(m *ice.Message, x, y int) wiki.Chart { float := kit.Int(kit.Select("2", "7", strings.Contains(m.Option(ice.MSG_USERUA), "iPhone"))) - if m.Option(SHOW_BLOCK) == ice.TRUE { + if m.Option(HIDE_BLOCK) != ice.TRUE { item := wiki.NewItem([]string{`").Dump(m) } @@ -68,6 +69,9 @@ func (b *Block) Draw(m *ice.Message, x, y int) wiki.Chart { item.Push(`stroke="%s"`, b.FontColor).Push(`fill="%s"`, b.FontColor).Push("%v", b.TextData).Push(`>%v`, b.Text).Dump(m) return b } +func (b *Block) Fork(m *ice.Message, arg ...string) *Block { + return &Block{Text: kit.Select("", arg, 0), FontSize: b.FontSize, Padding: b.Padding, MarginX: b.MarginX, MarginY: b.MarginY} +} func (b *Block) GetHeight(str ...string) int { if b.Height != 0 { diff --git a/core/wiki/chart/chain.go b/core/wiki/chart/chain.go index 7812dc51..bde907a6 100644 --- a/core/wiki/chart/chain.go +++ b/core/wiki/chart/chain.go @@ -12,105 +12,93 @@ import ( type Chain struct { data ice.Map - gs *wiki.Group Block } func (c *Chain) Init(m *ice.Message, arg ...string) wiki.Chart { (&c.Block).Init(m) - - m.Option(nfs.CAT_CONTENT, arg[0]) - m.Option(lex.SPLIT_BLOCK, ice.SP) - max, stack := 0, kit.List(kit.Dict("_deep", -1, "width", "0")) - m.OptionCB(lex.SPLIT, func(deep int, ls []string, data ice.Map) []string { - for deep <= kit.Int(kit.Value(stack[len(stack)-1], "_deep")) { + const _DEEP = "_deep" + stack, max := kit.List(kit.Dict(_DEEP, -1, wiki.WIDTH, "0")), 0 + last := func(key string) int { return kit.Int(kit.Value(stack[len(stack)-1], key)) } + m.Cmd(lex.SPLIT, "", mdb.TEXT, kit.Dict(lex.SPLIT_BLOCK, ice.SP, nfs.CAT_CONTENT, arg[0]), func(deep int, ls []string, data, root ice.Map) { + for deep <= last(_DEEP) { stack = stack[:len(stack)-1] } - width := kit.Int(kit.Value(stack[len(stack)-1], "width")) + c.GetWidths(ls[0]) - stack = append(stack, kit.Dict("_deep", deep, "width", width)) - if width > max { + width := last(wiki.WIDTH) + c.GetWidths(ls[0]) + if stack = append(stack, kit.Dict(_DEEP, deep, wiki.WIDTH, width)); width > max { max = width } - return ls + c.data = root }) - c.data = lex.Split(m, "", mdb.TEXT) - - c.Height, c.Width = c.size(m, c.data)*c.GetHeights(), max + c.Height, c.Width = c.height(m, c.data)*c.GetHeights(), max return c } func (c *Chain) Draw(m *ice.Message, x, y int) wiki.Chart { - c.gs = wiki.NewGroup(m, SHIP, RECT, LINE, TEXT) - wiki.AddGroupOption(m, LINE, wiki.STROKE, c.gs.Option(SHIP, wiki.STROKE)) - wiki.AddGroupOption(m, TEXT, wiki.FILL, m.Option(wiki.STROKE), wiki.STROKE_WIDTH, "1") - defer func() { c.gs.Dump(m, SHIP).Dump(m, RECT).Dump(m, LINE).Dump(m, TEXT) }() + gs := wiki.NewGroup(m, SHIP, LINE, RECT, TEXT) + wiki.AddGroupOption(m, LINE, wiki.STROKE, gs.Option(SHIP, wiki.STROKE)) + wiki.AddGroupOption(m, TEXT, wiki.FILL, m.Option(wiki.STROKE)) + defer gs.DumpAll(m, SHIP, LINE, RECT, TEXT) c.Height, c.Width = 0, 0 - c.draw(m, c.data, x, y, &c.Block) + c.draw(m, c.data, x, y, &c.Block, gs) return c } - -func (c *Chain) size(m *ice.Message, root ice.Map) (height int) { +func (c *Chain) height(m *ice.Message, root ice.Map) (height int) { meta := kit.GetMeta(root) if list, ok := root[mdb.LIST].([]ice.Any); ok && len(list) > 0 { - kit.Fetch(root[mdb.LIST], func(index int, value ice.Map) { height += c.size(m, value) }) + kit.Fetch(root[mdb.LIST], func(index int, value ice.Map) { height += c.height(m, value) }) } else { height = 1 } meta[wiki.HEIGHT] = height return height } -func (c *Chain) draw(m *ice.Message, root ice.Map, x, y int, p *Block) int { +func (c *Chain) draw(m *ice.Message, root ice.Map, x, y int, p *Block, gs *wiki.Group) int { meta := kit.GetMeta(root) - - item := &Block{FontSize: p.FontSize, Padding: p.Padding, MarginX: p.MarginX, MarginY: p.MarginY} + item := p.Fork(m, kit.Format(meta[mdb.TEXT])) item.x, item.y = x, y+(kit.Int(meta[wiki.HEIGHT])-1)*c.GetHeights()/2 - item.Text = kit.Format(meta[mdb.TEXT]) - if m.Option(SHOW_BLOCK) == ice.TRUE { // 方框 - c.gs.EchoRect(RECT, item.GetHeight(), item.GetWidth(), item.x+item.MarginX/2, item.y+item.MarginY/2) - } else { // 横线 - c.gs.EchoLine(LINE, item.x+item.MarginX/2, item.y+item.GetHeight()+item.Padding/2, item.x+item.GetWidths()-item.MarginX/2, item.y+item.GetHeight()+item.Padding/2) - } - // 文本 - c.gs.EchoTexts(TEXT, item.x+item.GetWidths()/2, item.y+item.GetHeights()/2, kit.Format(meta[mdb.TEXT])) - - if p != nil && p.y != 0 { // 连线 + if p != nil && p.y != 0 { + padding := item.GetHeights() / 2 if m.Option(SHOW_BLOCK) == ice.TRUE { - x1, y1 := p.x+p.GetWidths()-(p.MarginX+item.MarginX)/4, p.y+p.GetHeights()/2 - x4, y4 := item.x+(p.MarginX+item.MarginX)/4, item.y+item.GetHeights()/2 - c.gs.Echo(SHIP, ``, x1, y1, x1+(x4-x1)/4, y1, x1+(x4-x1)/2, y1+(y4-y1)/2, x4, y4) - } else { - x1, y1 := p.x+p.GetWidths()-(p.MarginX+item.MarginX)/4, p.y+p.GetHeight()+item.Padding/2 - x4, y4 := item.x+(p.MarginX+item.MarginX)/4, item.y+item.GetHeight()+item.Padding/2 - c.gs.Echo(SHIP, ``, x1, y1, x1+(x4-x1)/4, y1, x1+(x4-x1)/2, y1+(y4-y1)/2, x4, y4) + padding = 0 } + x4, y4 := item.x+(p.MarginX+item.MarginX)/4, item.y+item.GetHeights()/2+padding + x1, y1 := p.x+p.GetWidths()-(p.MarginX+item.MarginX)/4, p.y+p.GetHeights()/2+padding + gs.EchoPath(SHIP, "M %d,%d Q %d,%d %d,%d T %d %d", x1, y1, x1+(x4-x1)/4, y1, x1+(x4-x1)/2, y1+(y4-y1)/2, x4, y4) } + if m.Option(SHOW_BLOCK) == ice.TRUE { + gs.EchoRect(RECT, item.GetHeight(), item.GetWidth(), item.x+item.MarginX/2, item.y+item.MarginY/2) + } else { + gs.EchoLine(LINE, item.x+item.MarginX/2, item.y+item.GetHeights(), item.x+item.GetWidths()-item.MarginX/2, item.y+item.GetHeights()) + } + gs.EchoTexts(TEXT, item.x+item.GetWidths()/2, item.y+item.GetHeights()/2, item.Text) - // 递归 h, x := 0, x+item.GetWidths() - if kit.Fetch(root[mdb.LIST], func(index int, value ice.Map) { - h += c.draw(m, value, x, y+h, item) - }); h == 0 { + if kit.Fetch(root[mdb.LIST], func(value ice.Map) { h += c.draw(m, value, x, y+h, item, gs) }); h == 0 { return item.GetHeights() } return h } const ( + SHOW_BLOCK = "show-block" + SHIP = "ship" + LINE = "line" + RECT = "rect" + TEXT = "text" ) const CHAIN = "chain" func init() { wiki.AddChart(CHAIN, func(m *ice.Message) wiki.Chart { - m.Option(wiki.FILL, "") - m.Option(wiki.STROKE, "") m.Option(wiki.FONT_SIZE, "16") - m.Option(wiki.STROKE_WIDTH, "2") - m.Option(wiki.PADDING, "6") - m.Option(wiki.MARGINY, "4") m.Option(wiki.MARGINX, "40") + m.Option(wiki.MARGINY, "4") + m.Option(wiki.PADDING, "6") wiki.AddGroupOption(m, SHIP, wiki.FILL, cli.GLASS) + wiki.AddGroupOption(m, TEXT, wiki.STROKE_WIDTH, "1") return &Chain{} }) } diff --git a/core/wiki/chart/label.go b/core/wiki/chart/label.go index 0d7aef96..94706ba8 100644 --- a/core/wiki/chart/label.go +++ b/core/wiki/chart/label.go @@ -5,88 +5,74 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/lex" - "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/core/wiki" kit "shylinux.com/x/toolkits" ) type Label struct { - data [][]string max map[int]int + data [][]string Block } -func (l *Label) Init(m *ice.Message, arg ...string) wiki.Chart { - (&l.Block).Init(m) - - // 解析数据 - l.max = map[int]int{} - m.Option(lex.SPLIT_BLOCK, ice.SP) - m.Cmd(lex.SPLIT, "", kit.Dict(nfs.CAT_CONTENT, arg[0]), func(ls []string, data ice.Map) []string { - l.data = append(l.data, ls) - +func (s *Label) Init(m *ice.Message, arg ...string) wiki.Chart { + (&s.Block).Init(m) + s.max = map[int]int{} + m.Cmd(lex.SPLIT, "", kit.Dict(lex.SPLIT_BLOCK, ice.SP, nfs.CAT_CONTENT, arg[0]), func(ls []string) { + s.data = append(s.data, ls) for i, v := range ls { - switch data := kit.Parse(nil, "", kit.Split(v)...).(type) { - case ice.Map: - v = kit.Select("", data[mdb.TEXT]) - } - if w := l.GetWidth(v); w > l.max[i] { - l.max[i] = w + if w := s.GetWidth(kit.SplitWord(v)[0]); w > s.max[i] { + s.max[i] = w } } - return ls }) - - // 计算尺寸 - l.Height = len(l.data) * l.GetHeights() - for _, v := range l.max { - l.Width += v + l.MarginX + s.Height = len(s.data) * s.GetHeights() + for _, v := range s.max { + s.Width += v + s.MarginX } - return l + return s } -func (l *Label) Draw(m *ice.Message, x, y int) wiki.Chart { +func (s *Label) Draw(m *ice.Message, x, y int) wiki.Chart { gs := wiki.NewGroup(m, RECT, TEXT) wiki.AddGroupOption(m, TEXT, wiki.FILL, m.Option(wiki.STROKE)) - defer func() { gs.Dump(m, RECT).Dump(m, TEXT) }() + defer gs.DumpAll(m, RECT, TEXT) - var item *Block top := y - for _, line := range l.data { - left := x + for _, line := range s.data { + left, height := x, 0 for i, text := range line { + item := s.Fork(m) - // 数据 - item = &Block{FontSize: l.FontSize, Padding: l.Padding, MarginX: l.MarginX, MarginY: l.MarginY} - switch data := kit.Parse(nil, "", kit.Split(text)...).(type) { - case ice.Map: - item.Init(m, kit.Select(text, data[mdb.TEXT])).Data(m, data) - default: - item.Init(m, text) + ls := kit.SplitWord(text) + if item.Init(m, ls[0]); len(ls) > 1 { + data := kit.Dict() + for i := 1; i < len(ls)-1; i += 2 { + kit.Value(data, ls[i], ls[i+1]) + } + item.Data(m, data) } - // 尺寸 switch m.Option(COMPACT) { - case "max": - item.Width = l.Width/len(line) - l.MarginX case ice.TRUE: + case "max": + item.Width = s.Width/len(line) - s.MarginX default: - item.Width = l.max[i] + item.Width = s.max[i] } - // 输出 - if m.Option(SHOW_BLOCK) == ice.TRUE { + if m.Option(HIDE_BLOCK) != ice.TRUE { args := []string{"4", "4"} if mod := kit.Int(m.Option("order.mod")); mod != 0 && i%mod == 0 { - args = append(args, "fill", m.Option("order.bg")) + args = append(args, wiki.FILL, m.Option("order.bg")) } gs.EchoRect(RECT, item.GetHeight(), item.GetWidth(), left+item.MarginX/2, top+item.MarginY/2, args...) } args := []string{} if mod := kit.Int(m.Option("order.mod")); mod != 0 && i%mod == 0 { - args = append(args, "stroke", m.Option("order.fg")) - args = append(args, "fill", m.Option("order.fg")) + args = append(args, wiki.STROKE, m.Option("order.fg")) + args = append(args, wiki.FILL, m.Option("order.fg")) } if strings.Contains(m.Option(ice.MSG_USERUA), "Chrome") || strings.Contains(m.Option(ice.MSG_USERUA), "Mobile") { gs.EchoTexts(TEXT, left+item.GetWidths()/2, top+item.GetHeights()/2, item.Text, args...) @@ -94,25 +80,24 @@ func (l *Label) Draw(m *ice.Message, x, y int) wiki.Chart { gs.EchoTexts(TEXT, left+item.GetWidths()/2, top+item.GetHeights()/2+4, item.Text, args...) } - left += item.GetWidths() + if left += item.GetWidths(); item.GetHeights() > height { + height = item.GetHeights() + } } - top += item.GetHeights() + top += height } - return l + return s } const ( - SHOW_BLOCK = "show-block" + HIDE_BLOCK = "hide-block" COMPACT = "compact" ) const LABEL = "label" func init() { wiki.AddChart(LABEL, func(m *ice.Message) wiki.Chart { - m.Option(SHOW_BLOCK, ice.TRUE) - wiki.AddGroupOption(m, TEXT, wiki.FILL, m.Option(wiki.STROKE)) wiki.AddGroupOption(m, TEXT, wiki.STROKE_WIDTH, "1") - wiki.AddGroupOption(m, TEXT, wiki.FONT_FAMILY, m.Option(wiki.FONT_FAMILY)) return &Label{} }) } diff --git a/core/wiki/chart/sequence.go b/core/wiki/chart/sequence.go index fb9072fc..115a0563 100644 --- a/core/wiki/chart/sequence.go +++ b/core/wiki/chart/sequence.go @@ -147,11 +147,8 @@ const ( const ( HEAD = "head" TITLE = "title" - LINE = "line" - RECT = "rect" NEXT = "next" PREV = "prev" - TEXT = "text" ECHO = "echo" ARROW = "arrow" ) diff --git a/core/wiki/data.go b/core/wiki/data.go index d16c6800..c89ebcf5 100644 --- a/core/wiki/data.go +++ b/core/wiki/data.go @@ -23,7 +23,7 @@ func init() { } }}, mdb.CREATE: {Name: "create path fields value", Hand: func(m *ice.Message, arg ...string) { - m.Cmd("", nfs.SAVE, m.Option(nfs.PATH), kit.Join(kit.Split(m.Option("fields")), ice.FS)+ice.NL+kit.Join(kit.Split(m.Option("value")))+ice.NL) + m.Cmd("", nfs.SAVE, m.Option(nfs.PATH), kit.Join(kit.Split(m.Option("fields")), ice.FS)+ice.NL+kit.Join(kit.Split(m.Option(mdb.VALUE)))+ice.NL) }}, nfs.PUSH: {Name: "push path record", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Cmd(nfs.PUSH, path.Join(m.Config(nfs.PATH), arg[0]), kit.Join(arg[1:], ice.FS)+ice.NL) diff --git a/core/wiki/draw.go b/core/wiki/draw.go index dadb1961..b7312297 100644 --- a/core/wiki/draw.go +++ b/core/wiki/draw.go @@ -18,14 +18,11 @@ func init() { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(mdb.RENDER, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, m.PrefixKey()) }}, - mdb.RENDER: {Name: "render", Help: "渲染", Hand: func(m *ice.Message, arg ...string) { + mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { m.Echo("") defer m.Echo("") m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) }}, - nfs.SAVE: {Name: "save", Help: "保存", Hand: func(m *ice.Message, arg ...string) { - _wiki_save(m, arg[0], m.Option(nfs.CONTENT)) - }}, }, WikiAction("", nfs.SVG), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { if !_wiki_list(m, kit.Select(nfs.PWD, arg, 0)) { _wiki_show(m, arg[0]) diff --git a/core/wiki/parse.go b/core/wiki/parse.go index 8b81e7f9..448afc61 100644 --- a/core/wiki/parse.go +++ b/core/wiki/parse.go @@ -9,6 +9,7 @@ import ( "time" ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/tcp" @@ -46,6 +47,7 @@ func init() { } case nfs.JSON: m.Echo(kit.Formats(kit.UnMarshal(arg[1]))) + ctx.DisplayStoryJSON(m) case web.HTTP: u, _ := url.Parse(arg[1]) m.Push(tcp.PROTO, u.Scheme) diff --git a/core/wiki/wiki.go b/core/wiki/wiki.go index 9448fe33..f0bd2620 100644 --- a/core/wiki/wiki.go +++ b/core/wiki/wiki.go @@ -73,7 +73,7 @@ func init() { web.Index.Register(Index, &web.Frame{}, TITLE, BRIEF, REFER, SPARK, FIELD, PARSE, ORDER, TABLE, CHART, IMAGE, VIDEO, AUDIO, - FEEL, DRAW, WORD, DATA, + FEEL, DRAW, DATA, WORD, ) } @@ -101,10 +101,25 @@ func (m *Message) OptionTemplate() string { add("data-", key) } kit.Fetch(m.Optionv(mdb.EXTRA), func(key string, value string) { - add("data-", key) + switch key { + case PADDING: + return + } + if !strings.Contains(key, "-") { + add("data-", key) + } }) for _, key := range kit.Split(ctx.STYLE) { add("", key) } return kit.Join(res, ice.SP) } +func (m *Message) OptionKV(key ...string) string { + res := []string{} + for _, k := range kit.Split(kit.Join(key)) { + if m.Option(k) != "" { + res = append(res, kit.Format("%s='%s'", k, m.Option(k))) + } + } + return kit.Join(res, ice.SP) +} diff --git a/core/wiki/wiki.shy b/core/wiki/wiki.shy index 67697971..b478b794 100644 --- a/core/wiki/wiki.shy +++ b/core/wiki/wiki.shy @@ -1,5 +1,8 @@ wiki.shy wiki.go +feel.go +draw.go +data.go word.go title.go @@ -9,14 +12,9 @@ spark.go field.go parse.go -order.go -table.go -chart.go image.go video.go audio.go - -feel.go -draw.go -data.go - +order.go +table.go +chart.go