summaryrefslogtreecommitdiffstats
path: root/parser/pageparser/pagelexer_shortcode.go
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2019-09-29 14:51:51 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2019-09-29 23:22:41 +0200
commit329e88db1f6d043d32c7083570773dccfd4f11fc (patch)
treea4bab342aa28523be8c854ceb88fece17f634410 /parser/pageparser/pagelexer_shortcode.go
parente073f4efb1345f6408000ef3f389873f8cf7179e (diff)
downloadhugo-329e88db1f6d043d32c7083570773dccfd4f11fc.tar.gz
hugo-329e88db1f6d043d32c7083570773dccfd4f11fc.zip
Support typed bool, int and float in shortcode params
This means that you now can do: {{< vidur 9KvBeKu false true 32 3.14 >}} And the boolean and numeric values will be converted to `bool`, `int` and `float64`. If you want these to be strings, they must be quoted: {{< vidur 9KvBeKu "false" "true" "32" "3.14" >}} Fixes #6371
Diffstat (limited to 'parser/pageparser/pagelexer_shortcode.go')
-rw-r--r--parser/pageparser/pagelexer_shortcode.go19
1 files changed, 15 insertions, 4 deletions
diff --git a/parser/pageparser/pagelexer_shortcode.go b/parser/pageparser/pagelexer_shortcode.go
index d503d1797..dea1b317e 100644
--- a/parser/pageparser/pagelexer_shortcode.go
+++ b/parser/pageparser/pagelexer_shortcode.go
@@ -112,7 +112,7 @@ func lexShortcodeParam(l *pageLexer, escapedQuoteStart bool) stateFunc {
break
}
- if !isAlphaNumericOrHyphen(r) {
+ if !isAlphaNumericOrHyphen(r) && r != '.' { // Floats have period
l.backup()
break
}
@@ -137,6 +137,12 @@ func lexShortcodeParam(l *pageLexer, escapedQuoteStart bool) stateFunc {
}
+func lexShortcodeParamVal(l *pageLexer) stateFunc {
+ l.consumeToSpace()
+ l.emit(tScParamVal)
+ return lexInsideShortcode
+}
+
func lexShortcodeQuotedParamVal(l *pageLexer, escapedQuotedValuesAllowed bool, typ ItemType) stateFunc {
openQuoteFound := false
escapedInnerQuoteFound := false
@@ -176,9 +182,9 @@ Loop:
}
if escapedInnerQuoteFound {
- l.ignoreEscapesAndEmit(typ)
+ l.ignoreEscapesAndEmit(typ, true)
} else {
- l.emit(typ)
+ l.emitString(typ)
}
r := l.next()
@@ -273,8 +279,13 @@ func lexInsideShortcode(l *pageLexer) stateFunc {
case isSpace(r), isEndOfLine(r):
l.ignore()
case r == '=':
+ l.consumeSpace()
l.ignore()
- return lexShortcodeQuotedParamVal(l, l.peek() != '\\', tScParamVal)
+ peek := l.peek()
+ if peek == '"' || peek == '\\' {
+ return lexShortcodeQuotedParamVal(l, peek != '\\', tScParamVal)
+ }
+ return lexShortcodeParamVal
case r == '/':
if l.currShortcodeName == "" {
return l.errorf("got closing shortcode, but none is open")