Skip to content

Commit

Permalink
Throw an error when shortcode is expected to be closed
Browse files Browse the repository at this point in the history
Fixes #10675
  • Loading branch information
bep committed Feb 23, 2023
1 parent 0dbeac8 commit 7d78a49
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
13 changes: 12 additions & 1 deletion hugolib/shortcode.go
Expand Up @@ -224,6 +224,10 @@ func (s shortcode) insertPlaceholder() bool {
return !s.doMarkup || s.configVersion() == 1
}

func (s shortcode) needsInner() bool {
return s.info != nil && s.info.ParseInfo().IsInner
}

func (s shortcode) configVersion() int {
if s.info == nil {
// Not set for inline shortcodes.
Expand Down Expand Up @@ -557,6 +561,7 @@ func (s *shortcodeHandler) extractShortcode(ordinal, level int, source []byte, p
cnt := 0
nestedOrdinal := 0
nextLevel := level + 1
closed := false
const errorPrefix = "failed to extract shortcode"

fail := func(err error, i pageparser.Item) error {
Expand Down Expand Up @@ -612,9 +617,10 @@ Loop:
}

case currItem.IsShortcodeClose():
closed = true
next := pt.Peek()
if !sc.isInline {
if sc.info == nil || !sc.info.ParseInfo().IsInner {
if !sc.needsInner() {
if next.IsError() {
// return that error, more specific
continue
Expand Down Expand Up @@ -689,6 +695,11 @@ Loop:
}
}
case currItem.IsDone():
if !currItem.IsError() {
if !closed && sc.needsInner() {
return sc, fmt.Errorf("%s: unclosed shortcode %q", errorPrefix, sc.name)
}
}
// handled by caller
pt.Backup()
break Loop
Expand Down
35 changes: 35 additions & 0 deletions hugolib/shortcode_test.go
Expand Up @@ -1241,3 +1241,38 @@ InnerDeindent: closing-no-newline: 0
`)
}

// Issue 10675.
func TestShortcodeErrorWhenItShouldBeClosed(t *testing.T) {
t.Parallel()

files := `
-- config.toml --
disableKinds = ["home", "taxonomy", "term"]
-- content/p1.md --
---
title: "p1"
---
{{< sc >}}
Text.
-- layouts/shortcodes/sc.html --
Inner: {{ .Get 0 }}: {{ len .Inner }}
-- layouts/_default/single.html --
{{ .Content }}
`

b, err := NewIntegrationTestBuilder(
IntegrationTestConfig{
T: t,
TxtarString: files,
Running: true,
Verbose: true,
},
).BuildE()

b.Assert(err, qt.Not(qt.IsNil))
b.Assert(err.Error(), qt.Contains, `p1.md:5:1": failed to extract shortcode: unclosed shortcode "sc"`)
}

0 comments on commit 7d78a49

Please sign in to comment.