diff --git a/core/code/binpack.go b/core/code/binpack.go new file mode 100644 index 00000000..a40e933d --- /dev/null +++ b/core/code/binpack.go @@ -0,0 +1,116 @@ +package code + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/nfs" + kit "github.com/shylinux/toolkits" + + "fmt" + "io/ioutil" + "os" + "path" + "strings" +) + +func _pack_file(m *ice.Message, file string) string { + list := "" + if f, e := os.Open(file); e == nil { + defer f.Close() + + if b, e := ioutil.ReadAll(f); e == nil { + list = fmt.Sprintf("%v", b) + } + } + + if list = strings.ReplaceAll(list, " ", ","); len(list) > 0 { + return fmt.Sprintf(`[]byte{%v}`, list[1:len(list)-1]) + } + return "[]byte{}" +} +func _pack_dir(m *ice.Message, pack *os.File, dir string) { + m.Option(nfs.DIR_ROOT, dir) + m.Option(nfs.DIR_DEEP, "true") + m.Option(nfs.DIR_TYPE, nfs.FILE) + + m.Cmd(nfs.DIR, "./").Table(func(index int, value map[string]string, head []string) { + switch strings.Split(value[kit.MDB_PATH], "/")[0] { + case "pluged", "trash": + return + } + + pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n", + path.Join(dir, value[kit.MDB_PATH]), _pack_file(m, path.Join(dir, value[kit.MDB_PATH])))) + }) + pack.WriteString("\n") +} + +func _pack_volcanos(m *ice.Message, pack *os.File, dir string) { + m.Option(nfs.DIR_ROOT, dir) + m.Option(nfs.DIR_DEEP, "true") + m.Option(nfs.DIR_TYPE, nfs.FILE) + + for _, k := range []string{"favicon.ico", "proto.js", "frame.js", "index.html"} { + pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n", + kit.Select("", k, k != "index.html"), _pack_file(m, path.Join(dir, k)))) + } + for _, k := range []string{"lib", "page", "pane", "plugin"} { + m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) { + pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n", + value[kit.MDB_PATH], _pack_file(m, path.Join(dir, value[kit.MDB_PATH])))) + }) + } + pack.WriteString("\n") +} +func _pack_contexts(m *ice.Message, pack *os.File) { + _pack_dir(m, pack, "src") + pack.WriteString("\n") +} + +const BINPACK = "binpack" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + BINPACK: {Name: BINPACK, Help: "binpack", Value: kit.Data()}, + }, + Commands: map[string]*ice.Command{ + BINPACK: {Name: "binpack path auto create", Help: "打包", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create name=demo from=src/main.go", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + name := kit.Keys(m.Option(kit.MDB_NAME), "go") + if pack, p, e := kit.Create(path.Join(m.Conf(PUBLISH, kit.META_PATH), BINPACK, name)); m.Assert(e) { + defer pack.Close() + + pack.WriteString(m.Cmdx(nfs.CAT, m.Option("from"))) + + pack.WriteString("\n") + pack.WriteString(`func init() {` + "\n") + pack.WriteString(` ice.BinPack = map[string][]byte{` + "\n") + + _pack_volcanos(m, pack, "usr/volcanos") + _pack_dir(m, pack, "usr/learning") + _pack_dir(m, pack, "usr/icebergs") + _pack_dir(m, pack, "usr/toolkits") + _pack_dir(m, pack, "usr/intshell") + _pack_contexts(m, pack) + + pack.WriteString(` }` + "\n") + pack.WriteString(`}` + "\n") + m.Echo(p) + } + + m.Option(cli.CMD_DIR, path.Join(m.Conf(PUBLISH, kit.META_PATH), BINPACK)) + m.Cmd(COMPILE, name) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(nfs.DIR_ROOT, path.Join(m.Conf(PUBLISH, kit.META_PATH))) + m.Option(nfs.DIR_TYPE, nfs.FILE) + + m.Cmdy(nfs.DIR, BINPACK).Table(func(index int, value map[string]string, head []string) { + m.PushDownload(value[kit.MDB_PATH]) + }) + }}, + }, + }) +} diff --git a/core/code/webpack.go b/core/code/webpack.go new file mode 100644 index 00000000..86d4c96a --- /dev/null +++ b/core/code/webpack.go @@ -0,0 +1,106 @@ +package code + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/nfs" + kit "github.com/shylinux/toolkits" + + "fmt" + "path" + "strings" +) + +const WEBPACK = "webpack" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + WEBPACK: {Name: WEBPACK, Help: "webpack", Value: kit.Data(kit.MDB_PATH, "usr/volcanos")}, + }, + Commands: map[string]*ice.Command{ + WEBPACK: {Name: "webpack path auto create", Help: "打包", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create name=demo", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + css, _, e := kit.Create(path.Join(m.Conf(WEBPACK, kit.META_PATH), "page/cache.css")) + m.Assert(e) + defer css.Close() + + js, _, e := kit.Create(path.Join(m.Conf(WEBPACK, kit.META_PATH), "page/cache.js")) + m.Assert(e) + defer js.Close() + + m.Option(nfs.DIR_ROOT, m.Conf(WEBPACK, kit.META_PATH)) + m.Option(nfs.DIR_TYPE, nfs.FILE) + m.Option(nfs.DIR_DEEP, true) + + for _, k := range []string{"lib", "pane", "plugin"} { + m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) { + if strings.HasSuffix(value[kit.MDB_PATH], ".css") { + js.WriteString(`Volcanos.meta.cache["` + path.Join("/", value[kit.MDB_PATH]) + "\"] = []\n") + css.WriteString(m.Cmdx(nfs.CAT, value[kit.MDB_PATH])) + } + }) + + m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) { + if strings.HasSuffix(value[kit.MDB_PATH], ".js") { + js.WriteString(`_can_name = "` + path.Join("/", value[kit.MDB_PATH]) + "\";\n") + js.WriteString(m.Cmdx(nfs.CAT, value[kit.MDB_PATH])) + } + }) + } + + for _, k := range []string{"frame.js", "publish/order.js"} { + js.WriteString(`_can_name = "` + path.Join("/", k) + "\"\n") + js.WriteString(m.Cmdx(nfs.CAT, k)) + } + + if f, _, e := kit.Create("usr/publish/webpack/" + m.Option("name") + ".js"); m.Assert(e) { + defer f.Close() + + f.WriteString(`Volcanos.meta.pack = ` + kit.Formats(kit.UnMarshal(kit.Select("{}", m.Option("content"))))) + } + + m.Option(nfs.DIR_ROOT, "") + if f, p, e := kit.Create("usr/publish/webpack/" + m.Option("name") + ".html"); m.Assert(e) { + f.WriteString(fmt.Sprintf(_pack, + m.Cmdx(nfs.CAT, "usr/volcanos/page/cache.css"), + m.Cmdx(nfs.CAT, "usr/volcanos/page/index.css"), + + m.Cmdx(nfs.CAT, "usr/volcanos/proto.js"), + m.Cmdx(nfs.CAT, "usr/publish/webpack/"+m.Option("name")+".js"), + m.Cmdx(nfs.CAT, "usr/volcanos/page/cache.js"), + m.Cmdx(nfs.CAT, "usr/volcanos/page/index.js"), + )) + m.Echo(p) + } + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(nfs.DIR_ROOT, m.Conf(PUBLISH, kit.META_PATH)) + m.Option(nfs.DIR_TYPE, nfs.FILE) + m.Option(nfs.DIR_DEEP, true) + + m.Cmdy(nfs.DIR, WEBPACK).Table(func(index int, value map[string]string, head []string) { + m.PushDownload(path.Join(m.Option(nfs.DIR_ROOT), value[kit.MDB_PATH])) + }) + }}, + }, + }) +} + +const _pack = ` + + + + + volcanos + + + + + + + + + + +`