diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-05-28 13:18:50 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-05-30 11:32:55 +0200 |
commit | d2cfaede5be420c7d8b701d97b98bc61b87e46d5 (patch) | |
tree | db0926a42c3b53df10b87671d1733391b831b517 /hugolib/shortcode.go | |
parent | 322d19a81fedbf423a047bdf286499d2e25d14be (diff) |
Improve shortcode indentation handling
* Record the leading whitespace (tabs, spaces) before the shortcode when parsing the page.
* Apply that indentation to the rendered result of shortcodes without inner content (where the user will apply indentation).
Fixes #9946
Diffstat (limited to 'hugolib/shortcode.go')
-rw-r--r-- | hugolib/shortcode.go | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index e718d861a..b822ecfe3 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -170,6 +170,8 @@ type shortcode struct { ordinal int err error + indentation string // indentation from source. + info tpl.Info // One of the output formats (arbitrary) templs []tpl.Template // All output formats @@ -398,6 +400,22 @@ func renderShortcode( return "", false, fe } + if len(sc.inner) == 0 && len(sc.indentation) > 0 { + b := bp.GetBuffer() + i := 0 + text.VisitLinesAfter(result, func(line string) { + // The first line is correctly indented. + if i > 0 { + b.WriteString(sc.indentation) + } + i++ + b.WriteString(line) + }) + + result = b.String() + bp.PutBuffer(b) + } + return result, hasVariants, err } @@ -447,6 +465,15 @@ func (s *shortcodeHandler) extractShortcode(ordinal, level int, pt *pageparser.I } sc := &shortcode{ordinal: ordinal} + // Back up one to identify any indentation. + if pt.Pos() > 0 { + pt.Backup() + item := pt.Next() + if item.IsIndentation() { + sc.indentation = string(item.Val) + } + } + cnt := 0 nestedOrdinal := 0 nextLevel := level + 1 |