mirror of
https://github.com/gohugoio/hugo.git
synced 2025-05-10 20:59:48 +03:00
Fix indentation in highlight shortcode
This commit adds a new `.InnerDeindent` method to the shortcode context, which is `.Inner` with any indendation removed. This is then used in the built-in `highlight` shortcode to prevent the extra whitespace getting hightlighted. Fixes #4717
This commit is contained in:
parent
9e904d756b
commit
6f7bf3f2d7
5 changed files with 78 additions and 3 deletions
|
@ -62,6 +62,12 @@ type ShortcodeWithPage struct {
|
|||
// this ordinal will represent the position of this shortcode in the page content.
|
||||
Ordinal int
|
||||
|
||||
// Indentation before the opening shortcode in the source.
|
||||
indentation string
|
||||
|
||||
innerDeindentInit sync.Once
|
||||
innerDeindent template.HTML
|
||||
|
||||
// pos is the position in bytes in the source file. Used for error logging.
|
||||
posInit sync.Once
|
||||
posOffset int
|
||||
|
@ -70,6 +76,27 @@ type ShortcodeWithPage struct {
|
|||
scratch *maps.Scratch
|
||||
}
|
||||
|
||||
// InnerDeindent returns the (potentially de-indented) inner content of the shortcode.
|
||||
func (scp *ShortcodeWithPage) InnerDeindent() template.HTML {
|
||||
if scp.indentation == "" {
|
||||
return scp.Inner
|
||||
}
|
||||
scp.innerDeindentInit.Do(func() {
|
||||
b := bp.GetBuffer()
|
||||
text.VisitLinesAfter(string(scp.Inner), func(s string) {
|
||||
if strings.HasPrefix(s, scp.indentation) {
|
||||
b.WriteString(strings.TrimPrefix(s, scp.indentation))
|
||||
} else {
|
||||
b.WriteString(s)
|
||||
}
|
||||
})
|
||||
scp.innerDeindent = template.HTML(b.String())
|
||||
bp.PutBuffer(b)
|
||||
})
|
||||
|
||||
return scp.innerDeindent
|
||||
}
|
||||
|
||||
// Position returns this shortcode's detailed position. Note that this information
|
||||
// may be expensive to calculate, so only use this in error situations.
|
||||
func (scp *ShortcodeWithPage) Position() text.Position {
|
||||
|
@ -326,7 +353,7 @@ func renderShortcode(
|
|||
hasVariants = hasVariants || more
|
||||
}
|
||||
|
||||
data := &ShortcodeWithPage{Ordinal: sc.ordinal, posOffset: sc.pos, Params: sc.params, Page: newPageForShortcode(p), Parent: parent, Name: sc.name}
|
||||
data := &ShortcodeWithPage{Ordinal: sc.ordinal, posOffset: sc.pos, indentation: sc.indentation, Params: sc.params, Page: newPageForShortcode(p), Parent: parent, Name: sc.name}
|
||||
if sc.params != nil {
|
||||
data.IsNamedParams = reflect.TypeOf(sc.params).Kind() == reflect.Map
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue