]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Throw an error when shortcode is expected to be closed
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 23 Feb 2023 07:08:17 +0000 (08:08 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 23 Feb 2023 08:36:14 +0000 (09:36 +0100)
Fixes #10675

hugolib/shortcode.go
hugolib/shortcode_test.go

index a82caff43cf5e73ab3e20276f5ab79f89577770b..d3430cb8170334f8a17a438a1f5a59686c5469f4 100644 (file)
@@ -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.
@@ -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 {
@@ -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
@@ -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
index 564d632e4d804858da83510ea3a1e37ea3ab7054..cd17e78749a6120049213b047edbeedc40d4a317 100644 (file)
@@ -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"`)
+}