Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beego
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
beego
Commits
7131dec3
Commit
7131dec3
authored
Oct 29, 2013
by
slene
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add go1.2 template funcs eq, ge, gt, le, lt, ne to beego
parent
0ddde6fa
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
163 additions
and
3 deletions
+163
-3
template.go
template.go
+163
-3
No files found.
template.go
View file @
7131dec3
...
...
@@ -9,6 +9,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
"reflect"
"regexp"
"strings"
)
...
...
@@ -33,13 +34,19 @@ func init() {
beegoTplFuncMap
[
"htmlquote"
]
=
Htmlquote
beegoTplFuncMap
[
"htmlunquote"
]
=
Htmlunquote
beegoTplFuncMap
[
"renderform"
]
=
RenderForm
// go1.2 added template funcs
// Comparisons
beegoTplFuncMap
[
"eq"
]
=
eq
// ==
beegoTplFuncMap
[
"ge"
]
=
ge
// >=
beegoTplFuncMap
[
"gt"
]
=
gt
// >
beegoTplFuncMap
[
"le"
]
=
le
// <=
beegoTplFuncMap
[
"lt"
]
=
lt
// <
beegoTplFuncMap
[
"ne"
]
=
ne
// !=
}
// AddFuncMap let user to register a func in the template
func
AddFuncMap
(
key
string
,
funname
interface
{})
error
{
if
_
,
ok
:=
beegoTplFuncMap
[
key
];
ok
{
return
errors
.
New
(
"funcmap already has the key"
)
}
beegoTplFuncMap
[
key
]
=
funname
return
nil
}
...
...
@@ -219,3 +226,156 @@ func _getTemplate(t0 *template.Template, root string, submods [][]string, others
}
return
}
// go1.2 added template funcs. begin
var
(
errBadComparisonType
=
errors
.
New
(
"invalid type for comparison"
)
errBadComparison
=
errors
.
New
(
"incompatible types for comparison"
)
errNoComparison
=
errors
.
New
(
"missing argument for comparison"
)
)
type
kind
int
const
(
invalidKind
kind
=
iota
boolKind
complexKind
intKind
floatKind
integerKind
stringKind
uintKind
)
func
basicKind
(
v
reflect
.
Value
)
(
kind
,
error
)
{
switch
v
.
Kind
()
{
case
reflect
.
Bool
:
return
boolKind
,
nil
case
reflect
.
Int
,
reflect
.
Int8
,
reflect
.
Int16
,
reflect
.
Int32
,
reflect
.
Int64
:
return
intKind
,
nil
case
reflect
.
Uint
,
reflect
.
Uint8
,
reflect
.
Uint16
,
reflect
.
Uint32
,
reflect
.
Uint64
,
reflect
.
Uintptr
:
return
uintKind
,
nil
case
reflect
.
Float32
,
reflect
.
Float64
:
return
floatKind
,
nil
case
reflect
.
Complex64
,
reflect
.
Complex128
:
return
complexKind
,
nil
case
reflect
.
String
:
return
stringKind
,
nil
}
return
invalidKind
,
errBadComparisonType
}
// eq evaluates the comparison a == b || a == c || ...
func
eq
(
arg1
interface
{},
arg2
...
interface
{})
(
bool
,
error
)
{
v1
:=
reflect
.
ValueOf
(
arg1
)
k1
,
err
:=
basicKind
(
v1
)
if
err
!=
nil
{
return
false
,
err
}
if
len
(
arg2
)
==
0
{
return
false
,
errNoComparison
}
for
_
,
arg
:=
range
arg2
{
v2
:=
reflect
.
ValueOf
(
arg
)
k2
,
err
:=
basicKind
(
v2
)
if
err
!=
nil
{
return
false
,
err
}
if
k1
!=
k2
{
return
false
,
errBadComparison
}
truth
:=
false
switch
k1
{
case
boolKind
:
truth
=
v1
.
Bool
()
==
v2
.
Bool
()
case
complexKind
:
truth
=
v1
.
Complex
()
==
v2
.
Complex
()
case
floatKind
:
truth
=
v1
.
Float
()
==
v2
.
Float
()
case
intKind
:
truth
=
v1
.
Int
()
==
v2
.
Int
()
case
stringKind
:
truth
=
v1
.
String
()
==
v2
.
String
()
case
uintKind
:
truth
=
v1
.
Uint
()
==
v2
.
Uint
()
default
:
panic
(
"invalid kind"
)
}
if
truth
{
return
true
,
nil
}
}
return
false
,
nil
}
// ne evaluates the comparison a != b.
func
ne
(
arg1
,
arg2
interface
{})
(
bool
,
error
)
{
// != is the inverse of ==.
equal
,
err
:=
eq
(
arg1
,
arg2
)
return
!
equal
,
err
}
// lt evaluates the comparison a < b.
func
lt
(
arg1
,
arg2
interface
{})
(
bool
,
error
)
{
v1
:=
reflect
.
ValueOf
(
arg1
)
k1
,
err
:=
basicKind
(
v1
)
if
err
!=
nil
{
return
false
,
err
}
v2
:=
reflect
.
ValueOf
(
arg2
)
k2
,
err
:=
basicKind
(
v2
)
if
err
!=
nil
{
return
false
,
err
}
if
k1
!=
k2
{
return
false
,
errBadComparison
}
truth
:=
false
switch
k1
{
case
boolKind
,
complexKind
:
return
false
,
errBadComparisonType
case
floatKind
:
truth
=
v1
.
Float
()
<
v2
.
Float
()
case
intKind
:
truth
=
v1
.
Int
()
<
v2
.
Int
()
case
stringKind
:
truth
=
v1
.
String
()
<
v2
.
String
()
case
uintKind
:
truth
=
v1
.
Uint
()
<
v2
.
Uint
()
default
:
panic
(
"invalid kind"
)
}
return
truth
,
nil
}
// le evaluates the comparison <= b.
func
le
(
arg1
,
arg2
interface
{})
(
bool
,
error
)
{
// <= is < or ==.
lessThan
,
err
:=
lt
(
arg1
,
arg2
)
if
lessThan
||
err
!=
nil
{
return
lessThan
,
err
}
return
eq
(
arg1
,
arg2
)
}
// gt evaluates the comparison a > b.
func
gt
(
arg1
,
arg2
interface
{})
(
bool
,
error
)
{
// > is the inverse of <=.
lessOrEqual
,
err
:=
le
(
arg1
,
arg2
)
if
err
!=
nil
{
return
false
,
err
}
return
!
lessOrEqual
,
nil
}
// ge evaluates the comparison a >= b.
func
ge
(
arg1
,
arg2
interface
{})
(
bool
,
error
)
{
// >= is the inverse of <.
lessThan
,
err
:=
lt
(
arg1
,
arg2
)
if
err
!=
nil
{
return
false
,
err
}
return
!
lessThan
,
nil
}
// go1.2 added template funcs. end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment