forked from x/ContextOS
add Message.Sort
This commit is contained in:
parent
d2e150dac7
commit
590466c835
@ -1156,6 +1156,64 @@ func (m *Message) Table(cb func(map[string]string) bool) *Message { // {{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
func (m *Message) Sort(key string, arg ...string) {
|
||||||
|
table := []map[string]string{}
|
||||||
|
m.Table(func(line map[string]string) bool {
|
||||||
|
table = append(table, line)
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
cmp := "string"
|
||||||
|
if len(arg) > 0 {
|
||||||
|
cmp = arg[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(table)-1; i++ {
|
||||||
|
for j := i + 1; j < len(table); j++ {
|
||||||
|
result := false
|
||||||
|
switch cmp {
|
||||||
|
case "int":
|
||||||
|
a, e := strconv.Atoi(table[i][key])
|
||||||
|
m.Assert(e)
|
||||||
|
b, e := strconv.Atoi(table[j][key])
|
||||||
|
m.Assert(e)
|
||||||
|
if a > b {
|
||||||
|
result = true
|
||||||
|
}
|
||||||
|
case "int_r":
|
||||||
|
a, e := strconv.Atoi(table[i][key])
|
||||||
|
m.Assert(e)
|
||||||
|
b, e := strconv.Atoi(table[j][key])
|
||||||
|
m.Assert(e)
|
||||||
|
if a < b {
|
||||||
|
result = true
|
||||||
|
}
|
||||||
|
case "string":
|
||||||
|
if table[i][key] > table[j][key] {
|
||||||
|
result = true
|
||||||
|
}
|
||||||
|
case "string_r":
|
||||||
|
if table[i][key] < table[j][key] {
|
||||||
|
result = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if result {
|
||||||
|
table[i], table[j] = table[j], table[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, k := range m.Meta["append"] {
|
||||||
|
delete(m.Meta, k)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range table {
|
||||||
|
for _, k := range m.Meta["append"] {
|
||||||
|
m.Add("append", k, v[k])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Message) Insert(meta string, index int, arg ...interface{}) string { // {{{
|
func (m *Message) Insert(meta string, index int, arg ...interface{}) string { // {{{
|
||||||
if m.Meta == nil {
|
if m.Meta == nil {
|
||||||
@ -2965,6 +3023,13 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
}
|
}
|
||||||
} // }}}
|
} // }}}
|
||||||
}},
|
}},
|
||||||
|
"sort": &Command{Name: "sort", Help: "服务启动停止切换", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
|
m.Append("name", "shy", "yun")
|
||||||
|
m.Append("page", "10", "20")
|
||||||
|
m.Log("fuck", nil, "before %v", m.Meta)
|
||||||
|
m.Sort(arg[0], arg[1:]...)
|
||||||
|
m.Log("fuck", nil, "after %v", m.Meta)
|
||||||
|
}},
|
||||||
},
|
},
|
||||||
Index: map[string]*Context{
|
Index: map[string]*Context{
|
||||||
"void": &Context{Name: "void",
|
"void": &Context{Name: "void",
|
||||||
|
@ -16,7 +16,6 @@ import ( // {{{
|
|||||||
"bytes"
|
"bytes"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
|
||||||
|
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -29,42 +28,6 @@ import ( // {{{
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
type listtime []os.FileInfo
|
|
||||||
|
|
||||||
func (l listtime) Len() int {
|
|
||||||
return len(l)
|
|
||||||
}
|
|
||||||
func (l listtime) Swap(i, j int) {
|
|
||||||
l[i], l[j] = l[j], l[i]
|
|
||||||
}
|
|
||||||
func (l listtime) Less(i, j int) bool {
|
|
||||||
return l[i].ModTime().After(l[j].ModTime())
|
|
||||||
}
|
|
||||||
|
|
||||||
type listsize []os.FileInfo
|
|
||||||
|
|
||||||
func (l listsize) Len() int {
|
|
||||||
return len(l)
|
|
||||||
}
|
|
||||||
func (l listsize) Swap(i, j int) {
|
|
||||||
l[i], l[j] = l[j], l[i]
|
|
||||||
}
|
|
||||||
func (l listsize) Less(i, j int) bool {
|
|
||||||
return l[i].Size() > (l[j].Size())
|
|
||||||
}
|
|
||||||
|
|
||||||
type listname []os.FileInfo
|
|
||||||
|
|
||||||
func (l listname) Len() int {
|
|
||||||
return len(l)
|
|
||||||
}
|
|
||||||
func (l listname) Swap(i, j int) {
|
|
||||||
l[i], l[j] = l[j], l[i]
|
|
||||||
}
|
|
||||||
func (l listname) Less(i, j int) bool {
|
|
||||||
return l[i].Name() < (l[j].Name())
|
|
||||||
}
|
|
||||||
|
|
||||||
type MUX interface {
|
type MUX interface {
|
||||||
Handle(string, http.Handler)
|
Handle(string, http.Handler)
|
||||||
HandleFunc(string, func(http.ResponseWriter, *http.Request))
|
HandleFunc(string, func(http.ResponseWriter, *http.Request))
|
||||||
@ -152,47 +115,6 @@ func (web *WEB) generate(m *ctx.Message, uri string, arg ...string) string { //
|
|||||||
return strings.Join(adds, "")
|
return strings.Join(adds, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
|
||||||
func (web *WEB) AppendJson(msg *ctx.Message) string { // {{{
|
|
||||||
meta := map[string][]string{}
|
|
||||||
if !msg.Has("result") && !msg.Has("append") {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(msg.Meta["result"]) > 0 {
|
|
||||||
meta["result"] = msg.Meta["result"]
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(msg.Meta["append"]) > 0 {
|
|
||||||
meta["append"] = msg.Meta["append"]
|
|
||||||
for _, v := range msg.Meta["append"] {
|
|
||||||
meta[v] = msg.Meta[v]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
b, e := json.Marshal(meta)
|
|
||||||
msg.Assert(e)
|
|
||||||
return string(b)
|
|
||||||
|
|
||||||
result := []string{"{"}
|
|
||||||
for i, k := range msg.Meta["append"] {
|
|
||||||
result = append(result, fmt.Sprintf("\"%s\": [", k))
|
|
||||||
for j, v := range msg.Meta[k] {
|
|
||||||
result = append(result, fmt.Sprintf("\"%s\"", url.QueryEscape(v)))
|
|
||||||
if j < len(msg.Meta[k])-1 {
|
|
||||||
result = append(result, ",")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = append(result, "]")
|
|
||||||
if i < len(msg.Meta["append"])-1 {
|
|
||||||
result = append(result, ", ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = append(result, "}")
|
|
||||||
|
|
||||||
return strings.Join(result, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (web *WEB) Trans(m *ctx.Message, key string, hand func(*ctx.Message, *ctx.Context, string, ...string)) { // {{{
|
func (web *WEB) Trans(m *ctx.Message, key string, hand func(*ctx.Message, *ctx.Context, string, ...string)) { // {{{
|
||||||
web.HandleFunc(key, func(w http.ResponseWriter, r *http.Request) {
|
web.HandleFunc(key, func(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -233,7 +155,7 @@ func (web *WEB) ServeHTTP(w http.ResponseWriter, r *http.Request) { // {{{
|
|||||||
if web.Message != nil {
|
if web.Message != nil {
|
||||||
web.Log("cmd", nil, "%v %s %s", r.RemoteAddr, r.Method, r.URL)
|
web.Log("cmd", nil, "%v %s %s", r.RemoteAddr, r.Method, r.URL)
|
||||||
|
|
||||||
if web.Conf("logheaders") == "yes" {
|
if web.Confs("logheaders") {
|
||||||
for k, v := range r.Header {
|
for k, v := range r.Header {
|
||||||
web.Log("info", nil, "%s: %v", k, v)
|
web.Log("info", nil, "%s: %v", k, v)
|
||||||
}
|
}
|
||||||
@ -250,7 +172,7 @@ func (web *WEB) ServeHTTP(w http.ResponseWriter, r *http.Request) { // {{{
|
|||||||
|
|
||||||
web.ServeMux.ServeHTTP(w, r)
|
web.ServeMux.ServeHTTP(w, r)
|
||||||
|
|
||||||
if web.Message != nil && web.Conf("logheaders") == "yes" {
|
if web.Message != nil && web.Confs("logheaders") {
|
||||||
for k, v := range w.Header() {
|
for k, v := range w.Header() {
|
||||||
web.Log("info", nil, "%s: %v", k, v)
|
web.Log("info", nil, "%s: %v", k, v)
|
||||||
}
|
}
|
||||||
@ -714,7 +636,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"/upload": &ctx.Command{Name: "/upload", Help: "文件上传", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"/upload": &ctx.Command{Name: "/upload", Help: "文件上传", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
r := m.Optionv("request").(*http.Request)
|
r := m.Optionv("request").(*http.Request) // {{{
|
||||||
w := m.Optionv("response").(http.ResponseWriter)
|
w := m.Optionv("response").(http.ResponseWriter)
|
||||||
|
|
||||||
if !m.Options("dir") {
|
if !m.Options("dir") {
|
||||||
@ -740,13 +662,11 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
index := share.Target().Index
|
index := share.Target().Index
|
||||||
if index != nil && index[aaa.Append("userrole")] != nil {
|
if index != nil && index[aaa.Append("userrole")] != nil {
|
||||||
for k, v := range index[aaa.Append("userrole")].Index {
|
for k, v := range index[aaa.Append("userrole")].Index {
|
||||||
for i, j := range v.Commands {
|
for _, j := range v.Commands {
|
||||||
for v, n := range j.Shares {
|
for _, n := range j.Shares {
|
||||||
for _, nn := range n {
|
for _, nn := range n {
|
||||||
if match, e := regexp.MatchString(nn, m.Option("dir")); m.Assert(e) && match {
|
if match, e := regexp.MatchString(nn, m.Option("dir")); m.Assert(e) && match {
|
||||||
share.Add("append", "group", k)
|
share.Add("append", "group", k)
|
||||||
share.Add("append", "command", i)
|
|
||||||
share.Add("append", "argument", v)
|
|
||||||
share.Add("append", "value", nn)
|
share.Add("append", "value", nn)
|
||||||
share.Add("append", "delete", "delete")
|
share.Add("append", "delete", "delete")
|
||||||
}
|
}
|
||||||
@ -755,6 +675,8 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
share.Sort("value", "string")
|
||||||
|
share.Sort("argument", "string")
|
||||||
|
|
||||||
// 输出目录
|
// 输出目录
|
||||||
fs, e := ioutil.ReadDir(m.Option("dir"))
|
fs, e := ioutil.ReadDir(m.Option("dir"))
|
||||||
@ -763,40 +685,6 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
list := m.Sesss("list", m.Target())
|
list := m.Sesss("list", m.Target())
|
||||||
list.Option("dir", m.Option("dir"))
|
list.Option("dir", m.Option("dir"))
|
||||||
|
|
||||||
// 目录排序
|
|
||||||
max := true
|
|
||||||
if i, e := strconv.Atoi(m.Option("order")); e == nil {
|
|
||||||
max = i%2 == 1
|
|
||||||
}
|
|
||||||
list.Option("sort", "")
|
|
||||||
list.Option("reverse", "")
|
|
||||||
switch m.Option("list") {
|
|
||||||
case "time":
|
|
||||||
if max {
|
|
||||||
list.Option("sort", "time")
|
|
||||||
sort.Sort(listtime(fs))
|
|
||||||
} else {
|
|
||||||
list.Option("reverse", "time")
|
|
||||||
sort.Sort(sort.Reverse(listtime(fs)))
|
|
||||||
}
|
|
||||||
case "size":
|
|
||||||
if max {
|
|
||||||
list.Option("sort", "size")
|
|
||||||
sort.Sort(listsize(fs))
|
|
||||||
} else {
|
|
||||||
list.Option("reverse", "size")
|
|
||||||
sort.Sort(sort.Reverse(listsize(fs)))
|
|
||||||
}
|
|
||||||
case "name":
|
|
||||||
if max {
|
|
||||||
list.Option("sort", "name")
|
|
||||||
sort.Sort(listname(fs))
|
|
||||||
} else {
|
|
||||||
list.Option("reverse", "name")
|
|
||||||
sort.Sort(sort.Reverse(listname(fs)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, v := range fs {
|
for _, v := range fs {
|
||||||
name := v.Name()
|
name := v.Name()
|
||||||
if v == s {
|
if v == s {
|
||||||
@ -812,12 +700,37 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
name += "/"
|
name += "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list.Add("append", "time_i", fmt.Sprintf("%d", v.ModTime().Unix()))
|
||||||
|
list.Add("append", "size_i", fmt.Sprintf("%d", v.Size()))
|
||||||
list.Add("append", "time", v.ModTime().Format("2006-01-02 15:04:05"))
|
list.Add("append", "time", v.ModTime().Format("2006-01-02 15:04:05"))
|
||||||
list.Add("append", "size", kit.FmtSize(v.Size()))
|
list.Add("append", "size", kit.FmtSize(v.Size()))
|
||||||
list.Add("append", "name", name)
|
list.Add("append", "name", name)
|
||||||
list.Add("append", "path", path.Join(m.Option("dir"), name))
|
list.Add("append", "path", path.Join(m.Option("dir"), name))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 目录排序
|
||||||
|
max := true
|
||||||
|
if i, e := strconv.Atoi(m.Option("order")); e == nil {
|
||||||
|
max = i%2 == 1
|
||||||
|
}
|
||||||
|
switch m.Option("list") {
|
||||||
|
case "name":
|
||||||
|
if max {
|
||||||
|
list.Sort(m.Option("list"), "string")
|
||||||
|
} else {
|
||||||
|
list.Sort(m.Option("list"), "string_r")
|
||||||
|
}
|
||||||
|
case "size", "time":
|
||||||
|
if max {
|
||||||
|
list.Sort(m.Option("list")+"_i", "int")
|
||||||
|
} else {
|
||||||
|
list.Sort(m.Option("list")+"_i", "int_r")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list.Meta["append"] = list.Meta["append"][2:]
|
||||||
|
delete(list.Meta, "time_i")
|
||||||
|
delete(list.Meta, "size_i")
|
||||||
|
|
||||||
// 执行命令
|
// 执行命令
|
||||||
switch m.Option("cmd") {
|
switch m.Option("cmd") {
|
||||||
case "git":
|
case "git":
|
||||||
@ -833,6 +746,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
m.Append("title", "upload")
|
m.Append("title", "upload")
|
||||||
m.Append("tmpl", "userinfo", "share", "list", "git", "upload", "create")
|
m.Append("tmpl", "userinfo", "share", "list", "git", "upload", "create")
|
||||||
m.Append("template", m.Conf("upload_main"), m.Conf("upload_tmpl"))
|
m.Append("template", m.Conf("upload_main"), m.Conf("upload_tmpl"))
|
||||||
|
// }}}
|
||||||
}},
|
}},
|
||||||
"/create": &ctx.Command{Name: "/create", Help: "创建目录或文件", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"/create": &ctx.Command{Name: "/create", Help: "创建目录或文件", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
if check := m.Spawn().Cmd("/share"); !check.Results(0) { // {{{
|
if check := m.Spawn().Cmd("/share"); !check.Results(0) { // {{{
|
||||||
@ -858,7 +772,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
}
|
}
|
||||||
m.Append("message", name, " create success!")
|
m.Append("message", name, " create success!")
|
||||||
} else {
|
} else {
|
||||||
m.Append("message", name, "already exist!")
|
m.Append("message", name, " already exist!")
|
||||||
}
|
}
|
||||||
} else { //上传文件
|
} else { //上传文件
|
||||||
file, header, e := r.FormFile("file")
|
file, header, e := r.FormFile("file")
|
||||||
@ -873,9 +787,9 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
|
|
||||||
_, e = io.Copy(f, file)
|
_, e = io.Copy(f, file)
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
m.Append("message", name, "upload success!")
|
m.Append("message", name, " upload success!")
|
||||||
} else {
|
} else {
|
||||||
m.Append("message", name, "already exist!")
|
m.Append("message", name, " already exist!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -888,16 +802,13 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
m.Copy(check, "append")
|
m.Copy(check, "append")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
m.Log("fuck", nil, "wh")
|
|
||||||
|
|
||||||
msg := check.Appendv("aaa").(*ctx.Message).Spawn(m.Target())
|
msg := check.Appendv("aaa").(*ctx.Message).Spawn(m.Target())
|
||||||
if m.Options("shareto") {
|
if m.Options("shareto") {
|
||||||
msg.Cmd("right", "add", m.Option("shareto"), "command", "/share", "dir", m.Option("dir"))
|
msg.Cmd("right", "add", m.Option("shareto"), "command", "/share", "dir", m.Option("dir"))
|
||||||
}
|
}
|
||||||
if m.Options("notshareto") {
|
if m.Options("notshareto") {
|
||||||
m.Log("fuck", nil, "wh %v", msg)
|
|
||||||
msg.Cmd("right", "del", m.Option("notshareto"), "command", "/share", "dir", m.Option("dir"))
|
msg.Cmd("right", "del", m.Option("notshareto"), "command", "/share", "dir", m.Option("dir"))
|
||||||
m.Log("fuck", nil, "wh %v", msg.Meta["result"])
|
|
||||||
}
|
}
|
||||||
m.Echo("ok")
|
m.Echo("ok")
|
||||||
// }}}
|
// }}}
|
||||||
|
@ -96,7 +96,7 @@
|
|||||||
<form method="POST" action="/create?dir={{option . "dir"}}">
|
<form method="POST" action="/create?dir={{option . "dir"}}">
|
||||||
<table>
|
<table>
|
||||||
<tr><td>filename:</td><td><input type="text" name="filename" required><input type="submit"></td></tr>
|
<tr><td>filename:</td><td><input type="text" name="filename" required><input type="submit"></td></tr>
|
||||||
<tr><td>content:</td><td><textarea rows="5" cols="80" name="content"></textarea></td></tr>
|
<tr><td>content:</td><td><textarea rows="5" cols="60" name="content"></textarea></td></tr>
|
||||||
</table>
|
</table>
|
||||||
</form>
|
</form>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user