package code import ( "fmt" "path" ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) func _volcanos(m *ice.Message, file ...string) string { return path.Join(m.Conf(web.SERVE, kit.Keym(ice.VOLCANOS, nfs.PATH)), path.Join(file...)) } func _publish(m *ice.Message, file ...string) string { return path.Join(m.Conf(PUBLISH, kit.Keym(nfs.PATH)), path.Join(file...)) } func _webpack_cache(m *ice.Message, dir string) { if len(ice.Info.Pack) > 0 { return } css, _, e := kit.Create(path.Join(dir, PAGE_CACHE_CSS)) m.Assert(e) defer css.Close() js, _, e := kit.Create(path.Join(dir, PAGE_CACHE_JS)) m.Assert(e) defer js.Close() m.Option(nfs.DIR_ROOT, dir) m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_PACK, true) m.Option(nfs.DIR_TYPE, nfs.CAT) for _, k := range []string{LIB, PANEL, PLUGIN} { m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) { if kit.Ext(value[nfs.PATH]) == CSS { js.WriteString(`Volcanos.meta.cache["` + path.Join(ice.PS, value[nfs.PATH]) + "\"] = []\n") css.WriteString(m.Cmdx(nfs.CAT, value[nfs.PATH])) } }) } js.WriteString(ice.NL) for _, k := range []string{LIB, PANEL, PLUGIN} { m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) { if kit.Ext(value[nfs.PATH]) == JS { js.WriteString(`_can_name = "` + path.Join(ice.PS, value[nfs.PATH]) + "\";\n") js.WriteString(m.Cmdx(nfs.CAT, value[nfs.PATH])) } }) } for _, k := range []string{PUBLISH_ORDER_JS, ice.FRAME_JS} { js.WriteString(`_can_name = "` + path.Join(ice.PS, k) + "\"\n") js.WriteString(m.Cmdx(nfs.CAT, k)) } } func _webpack_build(m *ice.Message, file string) { if f, _, e := kit.Create(kit.Keys(file, JS)); m.Assert(e) { defer f.Close() f.WriteString(ice.NL) f.WriteString(kit.Format(`Volcanos.meta.args = %s`, kit.Formats(kit.Dict(m.OptionSimple(kit.Split(m.Option(ctx.ARGS))...))))) f.WriteString(ice.NL) f.WriteString(`Volcanos.meta.webpack = true`) f.WriteString(ice.NL) f.WriteString(`Volcanos.meta.pack = ` + kit.Formats(kit.UnMarshal(kit.Select("{}", m.Option(nfs.CONTENT))))) } if f, p, e := kit.Create(kit.Keys(file, HTML)); m.Assert(e) { defer f.Close() defer m.Echo(p) f.WriteString(fmt.Sprintf(` `, m.Cmdx(nfs.CAT, _volcanos(m, PAGE_INDEX_CSS)), m.Cmdx(nfs.CAT, _volcanos(m, PAGE_CACHE_CSS)), m.Cmdx(nfs.CAT, _volcanos(m, ice.PROTO_JS)), m.Cmdx(nfs.CAT, kit.Keys(file, JS)), m.Cmdx(nfs.CAT, _volcanos(m, PAGE_CACHE_JS)), m.Cmdx(nfs.CAT, _volcanos(m, PAGE_INDEX_JS)), )) } } const ( LIB = "lib" PAGE = "page" PANEL = "panel" PLUGIN = "plugin" ) const ( PUBLISH_ORDER_JS = "publish/order.js" PAGE_CACHE_CSS = "page/cache.css" PAGE_INDEX_CSS = "page/index.css" PAGE_CACHE_JS = "page/cache.js" PAGE_INDEX_JS = "page/index.js" PAGE_CAN_CSS = "page/can.css" PAGE_CAN_JS = "page/can.js" ) const DEVPACK = "devpack" const WEBPACK = "webpack" func init() { Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ WEBPACK: {Name: "webpack path auto create remove", Help: "打包", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) { _webpack_cache(m.Spawn(), _volcanos(m)) m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS)) m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS)) m.Cmdy(nfs.DIR, _volcanos(m, PAGE)) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { m.Cmd(nfs.SAVE, _volcanos(m, PAGE_CACHE_JS)) m.Cmd(nfs.SAVE, _volcanos(m, PAGE_CACHE_CSS)) m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS)) m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS)) m.Cmdy(nfs.DIR, _volcanos(m, PAGE)) }}, nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) { m.Cmd(nfs.TRASH, _publish(m, m.Option(nfs.PATH))) }}, cli.BUILD: {Name: "build name=hi", Help: "构建", Hand: func(m *ice.Message, arg ...string) { _webpack_cache(m.Spawn(), _volcanos(m)) _webpack_build(m, _publish(m, WEBPACK, m.Option(mdb.NAME))) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_TYPE, nfs.CAT) m.Cmdy(nfs.DIR, _volcanos(m, PAGE), nfs.DIR_WEB_FIELDS) m.Cmdy(nfs.DIR, _publish(m, WEBPACK), nfs.DIR_WEB_FIELDS) }}, }}) }