From 69f40ad18afbfc03f58948d2101f4d01073f82c1 Mon Sep 17 00:00:00 2001 From: astaxie Date: Wed, 3 Apr 2013 23:37:59 +0800 Subject: [PATCH] add some useful function 1. Router 2. SetSession/GetSession/DelSession 3. RenderString 4. str2html/htmlquote/htmlunquote 5. move the template Function to util.go --- beego.go | 13 +++-- controller.go | 47 ++++++++------- template.go | 110 +---------------------------------- utils.go | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 197 insertions(+), 131 deletions(-) diff --git a/beego.go b/beego.go index 9c2eeb3c..36158a03 100644 --- a/beego.go +++ b/beego.go @@ -153,7 +153,7 @@ func (app *App) Run() { } } -func (app *App) RegisterController(path string, c ControllerInterface) *App { +func (app *App) Router(path string, c ControllerInterface) *App { app.Handlers.Add(path, c) return app } @@ -192,7 +192,12 @@ func (app *App) AccessLog(ctx *Context) { } func RegisterController(path string, c ControllerInterface) *App { - BeeApp.RegisterController(path, c) + BeeApp.Router(path, c) + return BeeApp +} + +func Router(path string, c ControllerInterface) *App { + BeeApp.Router(path, c) return BeeApp } @@ -213,8 +218,8 @@ func FilterPrefixPath(path string, filter http.HandlerFunc) *App { func Run() { if PprofOn { - BeeApp.RegisterController(`/debug/pprof`, &ProfController{}) - BeeApp.RegisterController(`/debug/pprof/:pp([\w]+)`, &ProfController{}) + BeeApp.Router(`/debug/pprof`, &ProfController{}) + BeeApp.Router(`/debug/pprof/:pp([\w]+)`, &ProfController{}) } if SessionOn { GlobalSessions, _ = session.NewManager(SessionProvider, SessionName, SessionGCMaxLifetime) diff --git a/controller.go b/controller.go index f90af6ee..f2ef3c31 100644 --- a/controller.go +++ b/controller.go @@ -82,6 +82,21 @@ func (c *Controller) Options() { http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", 405) } +func (c *Controller) SetSession(name string, value interface{}) { + ss := c.StartSession() + ss.Set(name, value) +} + +func (c *Controller) GetSession(name string) interface{} { + ss := c.StartSession() + return ss.Get(name) +} + +func (c *Controller) DelSession(name string) { + ss := c.StartSession() + ss.Delete(name) +} + func (c *Controller) Render() error { rb, err := c.RenderBytes() @@ -96,32 +111,29 @@ func (c *Controller) Render() error { return nil } +func (c *Controller) RenderString() (string, error) { + b, e := c.RenderBytes() + return string(b), e +} + func (c *Controller) RenderBytes() ([]byte, error) { //if the controller has set layout, then first get the tplname's content set the content to the layout - var t *template.Template - var err error if c.Layout != "" { if c.TplNames == "" { c.TplNames = c.ChildName + "/" + c.Ctx.Request.Method + "." + c.TplExt } if RunMode == "dev" { - t, err = template.New("beegoTemplate").Funcs(beegoTplFuncMap).ParseFiles(path.Join(ViewsPath, c.TplNames), path.Join(ViewsPath, c.Layout)) - if err != nil { - Trace("template ParseFiles err:", err) - } - } else { - subdir := path.Dir(c.TplNames) - t = BeeTemplates[subdir] + BuildTemplate(ViewsPath) } + subdir := path.Dir(c.TplNames) _, file := path.Split(c.TplNames) - newbytes := bytes.NewBufferString("") - t.ExecuteTemplate(newbytes, file, c.Data) + BeeTemplates[subdir].ExecuteTemplate(newbytes, file, c.Data) tplcontent, _ := ioutil.ReadAll(newbytes) c.Data["LayoutContent"] = template.HTML(string(tplcontent)) _, file = path.Split(c.Layout) ibytes := bytes.NewBufferString("") - err := t.ExecuteTemplate(ibytes, file, c.Data) + err := BeeTemplates[subdir].ExecuteTemplate(ibytes, file, c.Data) if err != nil { Trace("template Execute err:", err) } @@ -132,17 +144,12 @@ func (c *Controller) RenderBytes() ([]byte, error) { c.TplNames = c.ChildName + "/" + c.Ctx.Request.Method + "." + c.TplExt } if RunMode == "dev" { - t, err = template.New("beegoTemplate").Funcs(beegoTplFuncMap).ParseFiles(path.Join(ViewsPath, c.TplNames)) - if err != nil { - Trace("template ParseFiles err:", err) - } - } else { - subdir := path.Dir(c.TplNames) - t = BeeTemplates[subdir] + BuildTemplate(ViewsPath) } + subdir := path.Dir(c.TplNames) _, file := path.Split(c.TplNames) ibytes := bytes.NewBufferString("") - err := t.ExecuteTemplate(ibytes, file, c.Data) + err := BeeTemplates[subdir].ExecuteTemplate(ibytes, file, c.Data) if err != nil { Trace("template Execute err:", err) } diff --git a/template.go b/template.go index 56c94a30..582b4779 100644 --- a/template.go +++ b/template.go @@ -5,14 +5,11 @@ package beego import ( "errors" "fmt" - "github.com/russross/blackfriday" "html/template" "os" "path" "path/filepath" - "regexp" "strings" - "time" ) var ( @@ -32,110 +29,9 @@ func init() { beegoTplFuncMap["compare"] = Compare beegoTplFuncMap["substr"] = Substr beegoTplFuncMap["html2str"] = Html2str -} - -// MarkDown parses a string in MarkDown format and returns HTML. Used by the template parser as "markdown" -func MarkDown(raw string) (output template.HTML) { - input := []byte(raw) - bOutput := blackfriday.MarkdownBasic(input) - output = template.HTML(string(bOutput)) - return -} - -func Substr(s string, start, length int) string { - bt := []rune(s) - if start < 0 { - start = 0 - } - var end int - if (start + length) > (len(bt) - 1) { - end = len(bt) - 1 - } else { - end = start + length - } - return string(bt[start:end]) -} - -// Html2str() returns escaping text convert from html -func Html2str(html string) string { - src := string(html) - - //将HTML标签全转换成小写 - re, _ := regexp.Compile("\\<[\\S\\s]+?\\>") - src = re.ReplaceAllStringFunc(src, strings.ToLower) - - //去除STYLE - re, _ = regexp.Compile("\\") - src = re.ReplaceAllString(src, "") - - //去除SCRIPT - re, _ = regexp.Compile("\\") - src = re.ReplaceAllString(src, "") - - //去除所有尖括号内的HTML代码,并换成换行符 - re, _ = regexp.Compile("\\<[\\S\\s]+?\\>") - src = re.ReplaceAllString(src, "\n") - - //去除连续的换行符 - re, _ = regexp.Compile("\\s{2,}") - src = re.ReplaceAllString(src, "\n") - - return strings.TrimSpace(src) -} - -// DateFormat takes a time and a layout string and returns a string with the formatted date. Used by the template parser as "dateformat" -func DateFormat(t time.Time, layout string) (datestring string) { - datestring = t.Format(layout) - return -} - -// Date takes a PHP like date func to Go's time fomate -func Date(t time.Time, format string) (datestring string) { - patterns := []string{ - // year - "Y", "2006", // A full numeric representation of a year, 4 digits Examples: 1999 or 2003 - "y", "06", //A two digit representation of a year Examples: 99 or 03 - - // month - "m", "01", // Numeric representation of a month, with leading zeros 01 through 12 - "n", "1", // Numeric representation of a month, without leading zeros 1 through 12 - "M", "Jan", // A short textual representation of a month, three letters Jan through Dec - "F", "January", // A full textual representation of a month, such as January or March January through December - - // day - "d", "02", // Day of the month, 2 digits with leading zeros 01 to 31 - "j", "2", // Day of the month without leading zeros 1 to 31 - - // week - "D", "Mon", // A textual representation of a day, three letters Mon through Sun - "l", "Monday", // A full textual representation of the day of the week Sunday through Saturday - - // time - "g", "3", // 12-hour format of an hour without leading zeros 1 through 12 - "G", "15", // 24-hour format of an hour without leading zeros 0 through 23 - "h", "03", // 12-hour format of an hour with leading zeros 01 through 12 - "H", "15", // 24-hour format of an hour with leading zeros 00 through 23 - - "a", "pm", // Lowercase Ante meridiem and Post meridiem am or pm - "A", "PM", // Uppercase Ante meridiem and Post meridiem AM or PM - - "i", "04", // Minutes with leading zeros 00 to 59 - "s", "05", // Seconds, with leading zeros 00 through 59 - } - replacer := strings.NewReplacer(patterns...) - format = replacer.Replace(format) - datestring = t.Format(format) - return -} - -// Compare is a quick and dirty comparison function. It will convert whatever you give it to strings and see if the two values are equal. -// Whitespace is trimmed. Used by the template parser as "eq" -func Compare(a, b interface{}) (equal bool) { - equal = false - if strings.TrimSpace(fmt.Sprintf("%v", a)) == strings.TrimSpace(fmt.Sprintf("%v", b)) { - equal = true - } - return + beegoTplFuncMap["str2html"] = Str2html + beegoTplFuncMap["htmlquote"] = Htmlquote + beegoTplFuncMap["htmlunquote"] = Htmlunquote } // AddFuncMap let user to register a func in the template diff --git a/utils.go b/utils.go index a28bde57..d1afd44f 100644 --- a/utils.go +++ b/utils.go @@ -1,6 +1,10 @@ package beego import ( + "fmt" + "github.com/russross/blackfriday" + "html/template" + "regexp" "strings" "time" ) @@ -12,3 +16,157 @@ func webTime(t time.Time) string { } return ftime } + +// MarkDown parses a string in MarkDown format and returns HTML. Used by the template parser as "markdown" +func MarkDown(raw string) (output template.HTML) { + input := []byte(raw) + bOutput := blackfriday.MarkdownBasic(input) + output = template.HTML(string(bOutput)) + return +} + +func Substr(s string, start, length int) string { + bt := []rune(s) + if start < 0 { + start = 0 + } + var end int + if (start + length) > (len(bt) - 1) { + end = len(bt) - 1 + } else { + end = start + length + } + return string(bt[start:end]) +} + +// Html2str() returns escaping text convert from html +func Html2str(html string) string { + src := string(html) + + //将HTML标签全转换成小写 + re, _ := regexp.Compile("\\<[\\S\\s]+?\\>") + src = re.ReplaceAllStringFunc(src, strings.ToLower) + + //去除STYLE + re, _ = regexp.Compile("\\") + src = re.ReplaceAllString(src, "") + + //去除SCRIPT + re, _ = regexp.Compile("\\") + src = re.ReplaceAllString(src, "") + + //去除所有尖括号内的HTML代码,并换成换行符 + re, _ = regexp.Compile("\\<[\\S\\s]+?\\>") + src = re.ReplaceAllString(src, "\n") + + //去除连续的换行符 + re, _ = regexp.Compile("\\s{2,}") + src = re.ReplaceAllString(src, "\n") + + return strings.TrimSpace(src) +} + +// DateFormat takes a time and a layout string and returns a string with the formatted date. Used by the template parser as "dateformat" +func DateFormat(t time.Time, layout string) (datestring string) { + datestring = t.Format(layout) + return +} + +// Date takes a PHP like date func to Go's time fomate +func Date(t time.Time, format string) (datestring string) { + patterns := []string{ + // year + "Y", "2006", // A full numeric representation of a year, 4 digits Examples: 1999 or 2003 + "y", "06", //A two digit representation of a year Examples: 99 or 03 + + // month + "m", "01", // Numeric representation of a month, with leading zeros 01 through 12 + "n", "1", // Numeric representation of a month, without leading zeros 1 through 12 + "M", "Jan", // A short textual representation of a month, three letters Jan through Dec + "F", "January", // A full textual representation of a month, such as January or March January through December + + // day + "d", "02", // Day of the month, 2 digits with leading zeros 01 to 31 + "j", "2", // Day of the month without leading zeros 1 to 31 + + // week + "D", "Mon", // A textual representation of a day, three letters Mon through Sun + "l", "Monday", // A full textual representation of the day of the week Sunday through Saturday + + // time + "g", "3", // 12-hour format of an hour without leading zeros 1 through 12 + "G", "15", // 24-hour format of an hour without leading zeros 0 through 23 + "h", "03", // 12-hour format of an hour with leading zeros 01 through 12 + "H", "15", // 24-hour format of an hour with leading zeros 00 through 23 + + "a", "pm", // Lowercase Ante meridiem and Post meridiem am or pm + "A", "PM", // Uppercase Ante meridiem and Post meridiem AM or PM + + "i", "04", // Minutes with leading zeros 00 to 59 + "s", "05", // Seconds, with leading zeros 00 through 59 + } + replacer := strings.NewReplacer(patterns...) + format = replacer.Replace(format) + datestring = t.Format(format) + return +} + +// Compare is a quick and dirty comparison function. It will convert whatever you give it to strings and see if the two values are equal. +// Whitespace is trimmed. Used by the template parser as "eq" +func Compare(a, b interface{}) (equal bool) { + equal = false + if strings.TrimSpace(fmt.Sprintf("%v", a)) == strings.TrimSpace(fmt.Sprintf("%v", b)) { + equal = true + } + return +} + +func Str2html(raw string) template.HTML { + return template.HTML(raw) +} + +func Htmlquote(src string) string { + //HTML编码为实体符号 + /* + Encodes `text` for raw use in HTML. + >>> htmlquote("<'&\\">") + '<'&">' + */ + + text := string(src) + + text = strings.Replace(text, "&", "&", -1) // Must be done first! + text = strings.Replace(text, "<", "<", -1) + text = strings.Replace(text, ">", ">", -1) + text = strings.Replace(text, "'", "'", -1) + text = strings.Replace(text, "\"", """, -1) + text = strings.Replace(text, "“", "“", -1) + text = strings.Replace(text, "”", "”", -1) + text = strings.Replace(text, " ", " ", -1) + + return strings.TrimSpace(text) +} + +func Htmlunquote(src string) string { + //实体符号解释为HTML + /* + Decodes `text` that's HTML quoted. + >>> htmlunquote('<'&">') + '<\\'&">' + */ + + // strings.Replace(s, old, new, n) + // 在s字符串中,把old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换 + + text := string(src) + text = strings.Replace(text, " ", " ", -1) + text = strings.Replace(text, "”", "”", -1) + text = strings.Replace(text, "“", "“", -1) + text = strings.Replace(text, """, "\"", -1) + text = strings.Replace(text, "'", "'", -1) + text = strings.Replace(text, ">", ">", -1) + text = strings.Replace(text, "<", "<", -1) + text = strings.Replace(text, "&", "&", -1) // Must be done last! + + return strings.TrimSpace(text) +}