From a478e17d3cfef36548eb0b1253c3b4c94dff107a Mon Sep 17 00:00:00 2001 From: shaoying Date: Mon, 12 Oct 2020 15:53:10 +0800 Subject: [PATCH] add domain --- base/mdb/mdb.go | 43 ++++++++------- conf.go | 1 + core/chat/action.go | 100 +++++++++++++++++++++++---------- core/chat/chat.go | 12 +++- core/chat/location.go | 22 +++----- core/chat/meet.go | 125 ++++++------------------------------------ core/chat/paste.go | 14 ++--- core/chat/river.go | 24 ++++---- core/chat/scan.go | 14 ++--- core/chat/study.go | 14 ++--- core/code/compile.go | 12 +++- core/wiki/feel.go | 9 +-- core/wiki/wiki.go | 10 ++-- meta.go | 19 ++++++- 14 files changed, 198 insertions(+), 221 deletions(-) diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 5a4bc4a9..51ed20bd 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -13,7 +13,10 @@ import ( ) func _file_name(m *ice.Message, arg ...string) string { - return kit.Select(path.Join("usr/export", path.Join(arg[:2]...)), arg, 3) + return kit.Select(path.Join(m.Option(ice.MSG_LOCAL), "usr/export", path.Join(arg[:2]...), arg[2]), arg, 3) +} +func _domain_chain(m *ice.Message, chain string) string { + return kit.Keys(m.Option(ice.MSG_DOMAIN), chain) } func _hash_fields(m *ice.Message) []string { @@ -415,71 +418,71 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]* INSERT: {Name: "insert conf key type arg...", Help: "添加", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { case HASH: - _hash_insert(m, arg[0], arg[1], arg[3:]...) + _hash_insert(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...) case LIST: - _list_insert(m, arg[0], arg[1], arg[3:]...) + _list_insert(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...) } }}, DELETE: {Name: "delete conf key type field value", Help: "删除", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { case HASH: - _hash_delete(m, arg[0], arg[1], arg[3], arg[4]) + _hash_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4]) case LIST: - _list_delete(m, arg[0], arg[1], arg[3], arg[4]) + _list_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4]) } }}, MODIFY: {Name: "modify conf key type field value arg...", Help: "编辑", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { case HASH: - _hash_modify(m, arg[0], arg[1], arg[3], arg[4], arg[5:]...) + _hash_modify(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4], arg[5:]...) case LIST: - _list_modify(m, arg[0], arg[1], arg[3], arg[4], arg[5:]...) + _list_modify(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4], arg[5:]...) } }}, SELECT: {Name: "select conf key type field value", Help: "查询", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { case HASH: - _hash_select(m, arg[0], arg[1], kit.Select("", arg, 3), kit.Select(kit.MDB_FOREACH, arg, 4)) + _hash_select(m, arg[0], _domain_chain(m, arg[1]), kit.Select("", arg, 3), kit.Select(kit.MDB_FOREACH, arg, 4)) case LIST: - _list_select(m, arg[0], arg[1], kit.Select("", arg, 3), kit.Select("", arg, 4)) + _list_select(m, arg[0], _domain_chain(m, arg[1]), kit.Select("", arg, 3), kit.Select("", arg, 4)) case ZONE: - _zone_select(m, arg[0], arg[1], kit.Select("", arg, 3), kit.Select("", arg, 4)) + _zone_select(m, arg[0], _domain_chain(m, arg[1]), kit.Select("", arg, 3), kit.Select("", arg, 4)) } }}, EXPORT: {Name: "export conf key type file", Help: "导出", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch file := _file_name(m, arg...); arg[2] { case HASH: - _hash_export(m, arg[0], arg[1], file) + _hash_export(m, arg[0], _domain_chain(m, arg[1]), file) case LIST: - _list_export(m, arg[0], arg[1], file) + _list_export(m, arg[0], _domain_chain(m, arg[1]), file) case ZONE: - _zone_export(m, arg[0], arg[1], file) + _zone_export(m, arg[0], _domain_chain(m, arg[1]), file) } }}, IMPORT: {Name: "import conf key type file", Help: "导入", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch file := _file_name(m, arg...); arg[2] { case HASH: - _hash_import(m, arg[0], arg[1], file) + _hash_import(m, arg[0], _domain_chain(m, arg[1]), file) case LIST: - _list_import(m, arg[0], arg[1], file) + _list_import(m, arg[0], _domain_chain(m, arg[1]), file) case ZONE: - _zone_import(m, arg[0], arg[1], file) + _zone_import(m, arg[0], _domain_chain(m, arg[1]), file) } }}, PRUNES: {Name: "prunes conf key type [field value]...", Help: "清理", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { case HASH: - _hash_prunes(m, arg[0], arg[1], arg[3:]...) + _hash_prunes(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...) case LIST: - _list_prunes(m, arg[0], arg[1], arg[3:]...) + _list_prunes(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...) } }}, INPUTS: {Name: "inputs conf key type field value", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { case HASH: - _hash_inputs(m, arg[0], arg[1], kit.Select("name", arg, 3), kit.Select("", arg, 4)) + _hash_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select("name", arg, 3), kit.Select("", arg, 4)) case LIST: - _hash_inputs(m, arg[0], arg[1], kit.Select("name", arg, 3), kit.Select("", arg, 4)) + _hash_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select("name", arg, 3), kit.Select("", arg, 4)) } }}, }} diff --git a/conf.go b/conf.go index 30a50e18..e79f32d6 100644 --- a/conf.go +++ b/conf.go @@ -43,6 +43,7 @@ const ( // MSG MSG_USERDATA = "user.data" MSG_USERADDR = "user.addr" + MSG_LOCAL = "sess.path" MSG_RIVER = "sess.river" MSG_STORM = "sess.storm" MSG_ACTIVE = "sess.active" diff --git a/core/chat/action.go b/core/chat/action.go index 3ba89781..8b6f2f8b 100644 --- a/core/chat/action.go +++ b/core/chat/action.go @@ -6,10 +6,48 @@ import ( "github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" + + "path" ) -func _action_domain(m *ice.Message, arg ...string) string { - return m.Option(ice.MSG_DOMAIN, kit.Keys("R"+kit.Select(m.Option(ice.MSG_RIVER), arg, 1), "S"+kit.Select(m.Option(ice.MSG_STORM), arg, 0))) +const ( + DOMAIN = "domain" + PUBLIC = "public" + PROTECTED = "protected" + PRIVATE = "private" +) + +func _action_domain(m *ice.Message, cmd string, arg ...string) (domain string) { + m.Option(ice.MSG_LOCAL, "") + m.Option(ice.MSG_DOMAIN, "") + if m.Conf(ACTION, kit.Keys(kit.MDB_META, DOMAIN, cmd)) != "true" { + return "" + } + + storm := kit.Select(m.Option(ice.MSG_STORM), arg, 0) + river := kit.Select(m.Option(ice.MSG_RIVER), arg, 1) + m.Richs(RIVER, "", river, func(key string, value map[string]interface{}) { + switch kit.Value(kit.GetMeta(value), kit.MDB_TYPE) { + case PUBLIC: + return + case PROTECTED: + m.Richs(RIVER, kit.Keys(kit.MDB_HASH, river, TOOL), storm, func(key string, value map[string]interface{}) { + switch kit.Value(kit.GetMeta(value), kit.MDB_TYPE) { + case PUBLIC: + domain = m.Option(ice.MSG_DOMAIN, kit.Keys("R"+river)) + case PROTECTED: + domain = m.Option(ice.MSG_DOMAIN, kit.Keys("R"+river, "S"+storm)) + case PRIVATE: + domain = m.Option(ice.MSG_DOMAIN, kit.Keys("R"+river, "U"+m.Option(ice.MSG_USERNAME))) + } + }) + case PRIVATE: + domain = m.Option(ice.MSG_DOMAIN, kit.Keys("U"+m.Option(ice.MSG_USERNAME))) + } + m.Option(ice.MSG_LOCAL, path.Join(m.Conf(RIVER, kit.META_PATH), domain)) + }) + m.Log_AUTH(RIVER, river, STORM, storm, DOMAIN, domain) + return } func _action_right(m *ice.Message, river string, storm string) (ok bool) { if ok = true; m.Option(ice.MSG_USERROLE) == aaa.VOID { @@ -24,7 +62,7 @@ func _action_right(m *ice.Message, river string, storm string) (ok bool) { func _action_list(m *ice.Message, river, storm string) { m.Option(ice.MSG_RIVER, river) m.Cmdy(TOOL, storm).Table(func(index int, value map[string]string, head []string) { - m.Cmdy(m.Space(value[POD]), ctx.COMMAND, kit.Keys(value[CTX], value[CMD])) + m.Cmdy(m.Space(kit.Select(m.Option(POD), value[POD])), ctx.COMMAND, kit.Keys(value[CTX], value[CMD])) }) } func _action_show(m *ice.Message, river, storm, index string, arg ...string) { @@ -37,6 +75,10 @@ func _action_show(m *ice.Message, river, storm, index string, arg ...string) { }) == nil && m.Warn(!m.Right(cmds), ice.ErrNotAuth) { return } + + if _action_domain(m, cmds[0]); m.Option(ice.MSG_UPLOAD) != "" { + _action_upload(m) // 上传文件 + } m.Cmdy(_action_proxy(m), cmds, arg) } func _action_proxy(m *ice.Message) (proxy []string) { @@ -54,31 +96,33 @@ func _action_upload(m *ice.Message, arg ...string) { const ACTION = "action" func init() { - Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ - "/action": {Name: "/action river storm action arg...", Help: "工作台", Action: map[string]*ice.Action{ - ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - for _, k := range arg { - m.Cmdy(ctx.COMMAND, k) + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + ACTION: {Name: ACTION, Help: "应用", Value: kit.Data( + DOMAIN, kit.Dict(), + )}, + }, + Commands: map[string]*ice.Command{ + "/action": {Name: "/action river storm action arg...", Help: "工作台", Action: map[string]*ice.Action{ + ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { + for _, k := range arg { + m.Cmdy(ctx.COMMAND, k) + } + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { + return // 没有登录 } + if m.Warn(!_action_right(m, m.Option(ice.MSG_RIVER, arg[0]), m.Option(ice.MSG_STORM, arg[1])), ice.ErrNotAuth) { + return // 没有授权 + } + + if len(arg) == 2 { + _action_list(m, arg[0], arg[1]) + return //命令列表 + } + + _action_show(m, arg[0], arg[1], arg[2], arg[3:]...) }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { - return // 没有登录 - } - if m.Warn(!_action_right(m, m.Option(ice.MSG_RIVER, arg[0]), m.Option(ice.MSG_STORM, arg[1])), ice.ErrNotAuth) { - return // 没有授权 - } - - if len(arg) == 2 { - _action_list(m, arg[0], arg[1]) - return //命令列表 - } - - _action_domain(m) - if m.Option(ice.MSG_UPLOAD) != "" { - _action_upload(m) // 上传文件 - } - _action_show(m, arg[0], arg[1], arg[2], arg[3:]...) - }}, - }}, nil) + }}, nil) } diff --git a/core/chat/chat.go b/core/chat/chat.go index 9d2cab42..ed4e6df2 100644 --- a/core/chat/chat.go +++ b/core/chat/chat.go @@ -15,6 +15,11 @@ var Index = &ice.Context{Name: CHAT, Help: "聊天中心", m.Load() m.Cmd(web.SERVE, aaa.WHITE, "header", "river", "action", "footer") + m.Conf(ACTION, "meta.domain.web.chat.location", "true") + m.Conf(ACTION, "meta.domain.web.chat.paste", "true") + m.Conf(ACTION, "meta.domain.web.chat.scan", "true") + m.Conf(ACTION, "meta.domain.web.wiki.feel", "true") + m.Conf(RIVER, "meta.template", kit.Dict( "base", kit.Dict( "info", []interface{}{ @@ -32,12 +37,13 @@ var Index = &ice.Context{Name: CHAT, Help: "聊天中心", "miss", []interface{}{ "web.team.task", "web.team.plan", - "web.wiki.word", - }, - "wiki", []interface{}{ "web.wiki.draw", "web.wiki.data", + "web.wiki.word", + }, + "meet", []interface{}{ "web.wiki.feel", + "web.chat.meet.miss", "web.wiki.word", }, ), diff --git a/core/chat/location.go b/core/chat/location.go index e1ff3c9e..ea6d3359 100644 --- a/core/chat/location.go +++ b/core/chat/location.go @@ -39,32 +39,26 @@ func init() { mdb.CREATE: {Name: "insert type=text name address latitude longitude", Help: "添加", Hand: func(m *ice.Message, arg ...string) { _trans(arg, map[string]string{"address": "text"}) m.Conf(LOCATION, kit.Keys(m.Option(ice.MSG_DOMAIN), kit.MDB_META, kit.MDB_SHORT), kit.MDB_TEXT) - m.Cmdy(mdb.INSERT, LOCATION, m.Option(ice.MSG_DOMAIN), mdb.HASH, arg) + m.Cmdy(mdb.INSERT, LOCATION, "", mdb.HASH, arg) }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, LOCATION, m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) + m.Cmdy(mdb.MODIFY, LOCATION, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, LOCATION, m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_TEXT, m.Option(kit.MDB_TEXT)) + m.Cmdy(mdb.DELETE, LOCATION, "", mdb.HASH, kit.MDB_TEXT, m.Option(kit.MDB_TEXT)) }}, mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.EXPORT, m.Prefix(LOCATION), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.EXPORT, m.Prefix(LOCATION), "", mdb.HASH) }}, mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.IMPORT, m.Prefix(LOCATION), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.IMPORT, m.Prefix(LOCATION), "", mdb.HASH) }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INPUTS, LOCATION, m.Option(ice.MSG_DOMAIN), mdb.HASH, arg) - }}, - - mdb.RENDER: {Name: "render type name text", Help: "渲染", Hand: func(m *ice.Message, arg ...string) { - // m.Cmdy(mdb.RENDER, web.RENDER.Frame, kit.Format( - // "https://map.baidu.com/search/%s/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd=%s", - // arg[2], arg[2])) + m.Cmdy(mdb.INPUTS, LOCATION, "", mdb.HASH, arg) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(mdb.FIELDS, "time,type,name,text,longitude,latitude") - m.Cmdy(mdb.SELECT, LOCATION, m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_HASH, arg) + m.Option(mdb.FIELDS, kit.Select("time,type,name,text,longitude,latitude", mdb.DETAIL, len(arg) > 0)) + m.Cmdy(mdb.SELECT, LOCATION, "", mdb.HASH, kit.MDB_TEXT, arg) m.Table(func(index int, value map[string]string, head []string) { m.PushRender(kit.MDB_LINK, "a", "百度地图", kit.Format( "https://map.baidu.com/search/%s/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd=%s", diff --git a/core/chat/meet.go b/core/chat/meet.go index 4c5ab056..72f53d5c 100644 --- a/core/chat/meet.go +++ b/core/chat/meet.go @@ -6,137 +6,46 @@ import ( kit "github.com/shylinux/toolkits" ) -const MEET = "meet" +var _miss_select = "time,name,照片,性别,年龄,身高,籍贯,户口,学历,职业,公司,年薪,资产,家境" + const ( MISS = "miss" - DATE = "date" ) -var _miss_select = "time,name,照片,性别,年龄,身高,籍贯,户口,学历,职业,公司,年薪,资产,家境" -var _miss_insert = kit.List( - "_input", "text", "name", "name", - "_input", "text", "name", "性别", - "_input", "text", "name", "年龄", - "_input", "text", "name", "身高", - "_input", "text", "name", "体重", - - "_input", "text", "name", "星座", - "_input", "text", "name", "生日", - "_input", "text", "name", "性格", - "_input", "text", "name", "爱好", - - "_input", "text", "name", "籍贯", - "_input", "text", "name", "户口", - "_input", "text", "name", "学历", - "_input", "text", "name", "学校", - "_input", "text", "name", "职业", - "_input", "text", "name", "公司", - - "_input", "text", "name", "年薪", - "_input", "text", "name", "资产", - "_input", "text", "name", "家境", - "_input", "text", "name", "照片", -) - -var _date_select = "time,id,name,地点,主题" -var _date_insert = kit.List( - "_input", "text", "name", "name", - "_input", "text", "name", "地点", - "_input", "text", "name", "主题", -) +const MEET = "meet" func init() { Index.Register(&ice.Context{Name: MEET, Help: "遇见", Configs: map[string]*ice.Config{ MISS: {Name: MISS, Help: "miss", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, - DATE: {Name: DATE, Help: "date", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, }, Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Load(MISS, DATE) - }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save(MISS, DATE) - }}, + ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }}, - MISS: {Name: "miss name=auto auto 添加:button 导出:button 导入:button", Help: "信息", Meta: kit.Dict( - "display", "", "添加", _miss_insert, - ), Action: map[string]*ice.Action{ - mdb.INSERT: {Name: "insert [key value]...", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + MISS: {Name: "miss name auto create", Help: "资料", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, m.Prefix(MISS), m.Option(ice.MSG_DOMAIN), mdb.HASH, arg) }}, mdb.MODIFY: {Name: "modify key value", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(MISS), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_NAME, m.Option("name"), arg[0], arg[1]) + m.Cmdy(mdb.MODIFY, m.Prefix(MISS), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME), arg[0], arg[1]) }}, mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.Prefix(MISS), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_NAME, m.Option("name")) + m.Cmdy(mdb.DELETE, m.Prefix(MISS), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME)) }}, - mdb.EXPORT: {Name: "export file", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.EXPORT, m.Prefix(MISS), m.Option(ice.MSG_DOMAIN), mdb.HASH) }}, - mdb.IMPORT: {Name: "import file", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.IMPORT, m.Prefix(MISS), m.Option(ice.MSG_DOMAIN), mdb.HASH) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option("fields", _miss_select) - if msg := m.Cmd(mdb.SELECT, m.Prefix(MISS), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_NAME, kit.Select(kit.MDB_FOREACH, arg, 0)); len(arg) == 0 { - msg.Table(func(index int, value map[string]string, head []string) { - for _, k := range head { - if k == "照片" { - if m.Option(ice.MSG_USERUA) == "" { - continue - } - if value["照片"] == "" { - m.Push("照片", "") - continue - } - // m.Push("照片", m.Cmdx(mdb.RENDER, web.RENDER.IMG, path.Join("/share/local/usr/image/local/", m.Option(ice.MSG_DOMAIN), value["照片"]))) - } else { - m.Push(k, value[k]) - } - } - }) - if m.Option(ice.MSG_USERUA) == "" { - return - } - m.PushAction("喜欢", "约会") - m.Sort("time", "time_r") - } else { - msg.Table(func(index int, value map[string]string, head []string) { - if value["key"] == "照片" { - // value["value"] = m.Cmdx(mdb.RENDER, web.RENDER.IMG, path.Join("/share/local/usr/image/local/", m.Option(ice.MSG_DOMAIN), value["value"]), "640") - } - m.Push("key", value["key"]) - m.Push("value", value["value"]) - }) - } - }}, - - DATE: {Name: "date id=auto auto 添加:button 导出:button 导入:button", Help: "约会", Meta: kit.Dict( - "display", "", "添加", _date_insert, - ), Action: map[string]*ice.Action{ - mdb.INSERT: {Name: "insert [key value]...", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(DATE), m.Option(ice.MSG_DOMAIN), mdb.LIST, arg) - }}, - mdb.MODIFY: {Name: "modify key value", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(DATE), m.Option(ice.MSG_DOMAIN), mdb.LIST, kit.MDB_ID, m.Option("id"), arg[0], arg[1]) - }}, - mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - // m.Cmdy(mdb.DELETE, m.Prefix(DATE), m.Option(ice.MSG_DOMAIN), mdb.LIST, kit.MDB_NAME, m.Option("name")) - }}, - mdb.EXPORT: {Name: "export file", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.EXPORT, m.Prefix(DATE), m.Option(ice.MSG_DOMAIN), mdb.LIST) - }}, - mdb.IMPORT: {Name: "import file", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.IMPORT, m.Prefix(DATE), m.Option(ice.MSG_DOMAIN), mdb.LIST) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) == 0 { - m.Option("fields", _date_select) - m.Cmdy(mdb.SELECT, m.Prefix(DATE), m.Option(ice.MSG_DOMAIN), mdb.LIST) - return - } - m.Cmdy(mdb.SELECT, m.Prefix(DATE), m.Option(ice.MSG_DOMAIN), mdb.LIST, kit.MDB_ID, arg[0]) + m.Option(mdb.FIELDS, kit.Select("time,name,照片,性别,年龄,身高,籍贯,户口,学历,职业,公司,年薪,资产,家境", mdb.DETAIL, len(arg) > 0)) + msg := m.Cmd(mdb.SELECT, m.Prefix(MISS), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_NAME, arg) + msg.Table(func(index int, value map[string]string, head []string) { + value["照片"] = kit.Format(``, value["照片"], kit.Select("100", "400", m.Option(mdb.FIELDS) == mdb.DETAIL)) + m.Push("", value, kit.Split(m.Option(mdb.FIELDS))) + }) }}, }, }, nil) diff --git a/core/chat/paste.go b/core/chat/paste.go index 44d10535..75944309 100644 --- a/core/chat/paste.go +++ b/core/chat/paste.go @@ -19,30 +19,30 @@ func init() { mdb.CREATE: {Name: "create type=text name=hi data:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) { _trans(arg, map[string]string{"data": "text"}) m.Conf(PASTE, kit.Keys(m.Option(ice.MSG_DOMAIN), kit.MDB_META, kit.MDB_SHORT), kit.MDB_TEXT) - m.Cmdy(mdb.INSERT, m.Prefix(PASTE), m.Option(ice.MSG_DOMAIN), mdb.HASH, arg) + m.Cmdy(mdb.INSERT, m.Prefix(PASTE), "", mdb.HASH, arg) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.Prefix(PASTE), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_TEXT, m.Option(kit.MDB_TEXT)) + m.Cmdy(mdb.DELETE, m.Prefix(PASTE), "", mdb.HASH, kit.MDB_TEXT, m.Option(kit.MDB_TEXT)) }}, mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.EXPORT, m.Prefix(PASTE), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.EXPORT, m.Prefix(PASTE), "", mdb.HASH) }}, mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.IMPORT, m.Prefix(PASTE), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.IMPORT, m.Prefix(PASTE), "", mdb.HASH) }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INPUTS, m.Prefix(PASTE), m.Option(ice.MSG_DOMAIN), mdb.HASH, arg) + m.Cmdy(mdb.INPUTS, m.Prefix(PASTE), "", mdb.HASH, arg) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 0 { - text := m.Cmd(mdb.SELECT, m.Prefix(PASTE), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_HASH, arg[0]).Append(kit.MDB_TEXT) + text := m.Cmd(mdb.SELECT, m.Prefix(PASTE), "", mdb.HASH, kit.MDB_HASH, arg[0]).Append(kit.MDB_TEXT) m.Cmdy(wiki.SPARK, "inner", text) m.Cmdy(wiki.IMAGE, "qrcode", text) m.Render("") return } - m.Cmdy(mdb.SELECT, m.Prefix(PASTE), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.SELECT, m.Prefix(PASTE), "", mdb.HASH) m.Sort(kit.MDB_TIME, "time_r") m.PushAction(mdb.REMOVE) }}, diff --git a/core/chat/river.go b/core/chat/river.go index 8fd4526b..b4b25170 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -25,12 +25,6 @@ func _river_list(m *ice.Message) { m.Set(ice.MSG_OPTION, kit.MDB_HASH) m.Set(ice.MSG_OPTION, kit.MDB_NAME) - if p := m.Option(POD); p != "" { - m.Option(POD, "") - m.Cmdy(web.SPACE, p, "web.chat./river") - // 代理列表 - } - m.Richs(RIVER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USER), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) { m.Push(key, kit.GetMeta(value), []string{kit.MDB_HASH, kit.MDB_NAME}, kit.GetMeta(val)) @@ -63,7 +57,9 @@ const RIVER = "river" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - RIVER: {Name: RIVER, Help: "群组", Value: kit.Data()}, + RIVER: {Name: RIVER, Help: "群组", Value: kit.Data( + kit.MDB_PATH, "usr/local/river", + )}, }, Commands: map[string]*ice.Command{ INFO: {Name: "info auto", Help: "信息", Action: map[string]*ice.Action{ @@ -161,18 +157,22 @@ func init() { }}, mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { if m.Option(kit.MDB_ID) != "" { - _action_domain(m, m.Option(kit.MDB_HASH)) m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,arg") msg := m.Cmd(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(kit.MDB_HASH)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID)) - m.Cmdy(_river_proxy(msg, msg.Append(POD)), kit.Keys(msg.Append(CTX), msg.Append(CMD)), mdb.EXPORT) + + cmd := kit.Keys(msg.Append(CTX), msg.Append(CMD)) + _action_domain(m, cmd, m.Option(kit.MDB_HASH)) + m.Cmdy(_river_proxy(msg, msg.Append(POD)), cmd, mdb.EXPORT) } }}, mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { if m.Option(kit.MDB_ID) != "" { - _action_domain(m, m.Option(kit.MDB_HASH)) m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,arg") msg := m.Cmd(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(kit.MDB_HASH)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID)) - m.Cmdy(_river_proxy(msg, msg.Append(POD)), kit.Keys(msg.Append(CTX), msg.Append(CMD)), mdb.IMPORT) + + cmd := kit.Keys(msg.Append(CTX), msg.Append(CMD)) + _action_domain(m, cmd, m.Option(kit.MDB_HASH)) + m.Cmdy(_river_proxy(msg, msg.Append(POD)), cmd, mdb.IMPORT) } }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { @@ -199,7 +199,7 @@ func init() { }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { - m.Option(mdb.FIELDS, "time,hash,name,count") + m.Option(mdb.FIELDS, "time,hash,type,name,count") m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH) m.PushAction(mdb.REMOVE) return // 应用列表 diff --git a/core/chat/scan.go b/core/chat/scan.go index 40d1c828..56c6cf67 100644 --- a/core/chat/scan.go +++ b/core/chat/scan.go @@ -18,30 +18,30 @@ func init() { SCAN: {Name: "scan hash auto create@scan", Help: "扫码", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Conf(SCAN, kit.Keys(m.Option(ice.MSG_DOMAIN), kit.MDB_META, kit.MDB_SHORT), kit.MDB_TEXT) - m.Cmdy(mdb.INSERT, m.Prefix(SCAN), m.Option(ice.MSG_DOMAIN), mdb.HASH, arg) + m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.Prefix(SCAN), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_TEXT, m.Option(kit.MDB_TEXT)) + m.Cmdy(mdb.DELETE, m.Prefix(SCAN), "", mdb.HASH, kit.MDB_TEXT, m.Option(kit.MDB_TEXT)) }}, mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.EXPORT, m.Prefix(SCAN), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.EXPORT, m.Prefix(SCAN), "", mdb.HASH) }}, mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.IMPORT, m.Prefix(SCAN), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.IMPORT, m.Prefix(SCAN), "", mdb.HASH) }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INPUTS, m.Prefix(SCAN), m.Option(ice.MSG_DOMAIN), mdb.HASH, arg) + m.Cmdy(mdb.INPUTS, m.Prefix(SCAN), "", mdb.HASH, arg) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 0 { - text := m.Cmd(mdb.SELECT, m.Prefix(SCAN), m.Option(ice.MSG_DOMAIN), mdb.HASH, kit.MDB_HASH, arg[0]).Append(kit.MDB_TEXT) + text := m.Cmd(mdb.SELECT, m.Prefix(SCAN), "", mdb.HASH, kit.MDB_HASH, arg[0]).Append(kit.MDB_TEXT) m.Cmdy(wiki.SPARK, "inner", text) m.Cmdy(wiki.IMAGE, "qrcode", text) m.Render("") return } - m.Cmdy(mdb.SELECT, m.Prefix(SCAN), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.SELECT, m.Prefix(SCAN), "", mdb.HASH) m.Sort(kit.MDB_TIME, "time_r") m.PushAction(mdb.REMOVE) }}, diff --git a/core/chat/study.go b/core/chat/study.go index 61e04f9c..af58f43b 100644 --- a/core/chat/study.go +++ b/core/chat/study.go @@ -34,27 +34,27 @@ func init() { "添加", _target_insert, ), Action: map[string]*ice.Action{ mdb.INSERT: {Name: "insert [key value]...", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(TARGET), m.Option(ice.MSG_DOMAIN), mdb.HASH, arg) + m.Cmdy(mdb.INSERT, m.Prefix(TARGET), "", mdb.HASH, arg) }}, mdb.MODIFY: {Name: "modify key value", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(TARGET), m.Option(ice.MSG_DOMAIN), mdb.HASH, "", m.Option("hash"), arg[0], arg[1]) + m.Cmdy(mdb.MODIFY, m.Prefix(TARGET), "", mdb.HASH, "", m.Option("hash"), arg[0], arg[1]) }}, mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.Prefix(TARGET), m.Option(ice.MSG_DOMAIN), mdb.HASH, "", m.Option("hash")) + m.Cmdy(mdb.DELETE, m.Prefix(TARGET), "", mdb.HASH, "", m.Option("hash")) }}, mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.EXPORT, m.Prefix(TARGET), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.EXPORT, m.Prefix(TARGET), "", mdb.HASH) }}, mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.IMPORT, m.Prefix(TARGET), m.Option(ice.MSG_DOMAIN), mdb.HASH) + m.Cmdy(mdb.IMPORT, m.Prefix(TARGET), "", mdb.HASH) }}, mdb.INPUTS: {Name: "inputs key value", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INPUTS, m.Prefix(TARGET), m.Option(ice.MSG_DOMAIN), mdb.HASH, arg) + m.Cmdy(mdb.INPUTS, m.Prefix(TARGET), "", mdb.HASH, arg) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option("fields", "time,hash,type,name,text") - m.Cmdy(mdb.SELECT, m.Prefix(TARGET), m.Option(ice.MSG_DOMAIN), mdb.HASH, "", kit.Select(kit.MDB_FOREACH, arg, 0)) + m.Cmdy(mdb.SELECT, m.Prefix(TARGET), "", mdb.HASH, "", kit.Select(kit.MDB_FOREACH, arg, 0)) if len(arg) == 0 { m.PushAction("备课", "学习", "测试", "删除") } diff --git a/core/code/compile.go b/core/code/compile.go index a97613f6..10a0ef75 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -1,6 +1,7 @@ package code import ( + "fmt" "strings" ice "github.com/shylinux/icebergs" @@ -25,7 +26,7 @@ func init() { "GOPROXY", "https://goproxy.cn,direct", "GOPRIVATE", "github.com", "CGO_ENABLED", "0", - ), "go", []interface{}{"go", "build", "-o"}, + ), "go", []interface{}{"go", "build"}, )}, }, Commands: map[string]*ice.Command{ @@ -52,10 +53,17 @@ func init() { // 编译目标 file := path.Join(m.Conf(cmd, "meta.path"), kit.Keys(kit.Select("ice", path.Base(strings.TrimSuffix(main, ".go")), main != "src/main.go"), goos, arch)) + args := []string{"-ldflags"} + list := []string{ + fmt.Sprintf(`-X main.Time="%s"`, m.Time()), + fmt.Sprintf(`-X main.Version="%s"`, m.Cmdx(cli.SYSTEM, "git", "describe", "--tags")), + fmt.Sprintf(`-X main.HostName="%s"`, m.Conf(cli.RUNTIME, "boot.hostname")), + fmt.Sprintf(`-X main.UserName="%s"`, m.Conf(cli.RUNTIME, "boot.username")), + } // 编译参数 m.Optionv(cli.CMD_ENV, kit.Simple(m.Confv(COMPILE, "meta.env"), "GOARCH", arch, "GOOS", goos)) - if msg := m.Cmd(cli.SYSTEM, m.Confv(COMPILE, "meta.go"), file, main); msg.Append(cli.CMD_CODE) != "0" { + if msg := m.Cmd(cli.SYSTEM, m.Confv(COMPILE, "meta.go"), args, "'"+strings.Join(list, " ")+"'", "-o", file, main); msg.Append(cli.CMD_CODE) != "0" { m.Copy(msg) } else { m.Log_EXPORT("source", main, "target", file) diff --git a/core/wiki/feel.go b/core/wiki/feel.go index b371d0d4..7a76635b 100644 --- a/core/wiki/feel.go +++ b/core/wiki/feel.go @@ -4,8 +4,6 @@ import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" - - "path" ) const FEEL = "feel" @@ -25,12 +23,7 @@ func init() { _wiki_upload(m, FEEL) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option("prefix", m.Conf(FEEL, "meta.path")) - if m.Option(ice.MSG_DOMAIN) == "" { - _wiki_list(m, FEEL, kit.Select("./", arg, 0)) - } else { - _wiki_list(m, FEEL, path.Join("local", m.Option(ice.MSG_DOMAIN), kit.Select(".", arg, 0))+"/") - } + _wiki_list(m, FEEL, kit.Select("./", arg, 0)) m.Sort(kit.MDB_TIME, "time_r") m.Option("_display", "") }}, diff --git a/core/wiki/wiki.go b/core/wiki/wiki.go index d7ba7b0a..64b407ad 100644 --- a/core/wiki/wiki.go +++ b/core/wiki/wiki.go @@ -11,7 +11,8 @@ import ( ) func _wiki_list(m *ice.Message, cmd string, arg ...string) bool { - m.Option(nfs.DIR_ROOT, m.Conf(cmd, "meta.path")) + m.Option("prefix", path.Join(m.Option(ice.MSG_LOCAL), m.Conf(cmd, kit.META_PATH))) + m.Option(nfs.DIR_ROOT, path.Join(m.Option(ice.MSG_LOCAL), m.Conf(cmd, kit.META_PATH))) if len(arg) == 0 || strings.HasSuffix(arg[0], "/") { m.Option("_display", "table") if m.Option(nfs.DIR_DEEP) != "true" { @@ -36,10 +37,11 @@ func _wiki_save(m *ice.Message, cmd, name, text string, arg ...string) { m.Cmd(nfs.SAVE, path.Join(m.Conf(cmd, "meta.path"), name), text) } func _wiki_upload(m *ice.Message, cmd string) { - if up := kit.Simple(m.Optionv("_upload")); m.Option(ice.MSG_USERPOD) == "" { - m.Cmdy(web.CACHE, web.WATCH, up[0], path.Join(m.Conf(cmd, "meta.path"), m.Option("path"), up[1])) + up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) + if p := path.Join(m.Option(ice.MSG_LOCAL), m.Conf(cmd, kit.META_PATH), m.Option(kit.MDB_PATH), up[1]); m.Option(ice.MSG_USERPOD) == "" { + m.Cmdy(web.CACHE, web.WATCH, up[0], p) } else { - m.Cmdy(web.SPIDE, web.SPIDE_DEV, web.SPIDE_SAVE, path.Join(m.Conf(cmd, "meta.path"), m.Option("path"), up[1]), web.SPIDE_GET, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/cache/"+up[0])) + m.Cmdy(web.SPIDE, web.SPIDE_DEV, web.SPIDE_SAVE, p, web.SPIDE_GET, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/cache/"+up[0])) } } diff --git a/meta.go b/meta.go index a7739f9c..8a1127a9 100644 --- a/meta.go +++ b/meta.go @@ -54,7 +54,8 @@ func (m *Message) Push(key string, value interface{}, arg ...interface{}) *Messa switch value := value.(type) { case map[string]string: head := kit.Simple(arg) - if len(head) == 0 { + if len(head) == 0 || (len(head) == 1 && head[0] == "detail") { + head = head[:0] for k := range value { head = append(head, k) } @@ -113,6 +114,13 @@ func (m *Message) Push(key string, value interface{}, arg ...interface{}) *Messa } default: + if m.Option("fields") == "detail" || (len(m.meta[MSG_APPEND]) == 2 && m.meta[MSG_APPEND][0] == kit.MDB_KEY && m.meta[MSG_APPEND][1] == kit.MDB_VALUE) { + if key != kit.MDB_KEY || key != kit.MDB_VALUE { + m.Add(MSG_APPEND, kit.MDB_KEY, key) + m.Add(MSG_APPEND, kit.MDB_VALUE, kit.Format(value)) + break + } + } for _, v := range kit.Simple(value) { m.Add(MSG_APPEND, key, v) } @@ -245,6 +253,15 @@ func (m *Message) Sort(key string, arg ...string) *Message { } func (m *Message) Table(cbs ...func(index int, value map[string]string, head []string)) *Message { if len(cbs) > 0 && cbs[0] != nil { + if len(m.meta[MSG_APPEND]) == 2 && m.meta[MSG_APPEND][0] == kit.MDB_KEY { + line := map[string]string{} + for i, k := range m.meta[kit.MDB_KEY] { + line[k] = kit.Select("", m.meta[kit.MDB_VALUE], i) + } + cbs[0](0, line, m.meta[kit.MDB_KEY]) + return m + } + nrow := 0 for _, k := range m.meta[MSG_APPEND] { if len(m.meta[k]) > nrow {