URI: 
       images: Add option for vertical alignment to images.Text - hugo - [fork] hugo port for 9front
  HTML git clone git@git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit 2fce0bac033d8b7e98046f85f669ba813d862788
   DIR parent 179aea11ac2ce80a38b211e11fd513cead63b17e
  HTML Author: Pranshu Gaba <pranshugaba@gmail.com>
       Date:   Tue, 18 Feb 2025 05:21:42 +0530
       
       images: Add option for vertical alignment to images.Text
       
       Add option ``aligny`` to specify the vertical alignment of the text
       with respect to the ``y`` offset from the top of the image. Possible
       values of ``aligny`` are ``top`` (default), ``center``, and ``bottom``.
       
       The height of the block of text is measured from the top of the first
       line to the baseline of the last line.
       
       - ``top``: (Current behaviour) The top of the first line of the block of
         text is at an offset of ``y`` from the top of the image.
       
       - ``center``: The vertical center of the block of text is at an offset of
         ``y`` from the top of the image.
       
       - ``bottom``: The baseline of the last line of the text is at an offset
         of ``y`` from the top of the image.
       
       Resolves #13414
       
       Diffstat:
         M docs/content/en/functions/images/T… |       3 +++
         M resources/images/filters.go         |       6 ++++++
         M resources/images/text.go            |      16 ++++++++++++----
       
       3 files changed, 21 insertions(+), 4 deletions(-)
       ---
   DIR diff --git a/docs/content/en/functions/images/Text.md b/docs/content/en/functions/images/Text.md
       @@ -18,6 +18,9 @@ alignx
        : {{< new-in 0.141.0 />}}
        : (`string`) The horizontal alignment of the text relative to the horizontal offset, one of `left`, `center`, or `right`. Default is `left`.
        
       +aligny
       +: (`string`) The vertical alignment of the text relative to the vertical offset, one of `top`, `center`, or `bottom`. Default is `top`.
       +
        color
        : (`string`) The font color, either a 3-digit or 6-digit hexadecimal color code. Default is `#ffffff` (white).
        
   DIR diff --git a/resources/images/filters.go b/resources/images/filters.go
       @@ -79,6 +79,7 @@ func (*Filters) Text(text string, options ...any) gift.Filter {
                        x:           10,
                        y:           10,
                        alignx:      "left",
       +                aligny:      "top",
                        linespacing: 2,
                }
        
       @@ -102,6 +103,11 @@ func (*Filters) Text(text string, options ...any) gift.Filter {
                                        if tf.alignx != "left" && tf.alignx != "center" && tf.alignx != "right" {
                                                panic("alignx must be one of left, center, right")
                                        }
       +                        case "aligny":
       +                                tf.aligny = cast.ToString(v)
       +                                if tf.aligny != "top" && tf.aligny != "center" && tf.aligny != "bottom" {
       +                                        panic("aligny must be one of top, center, bottom")
       +                                }
        
                                case "linespacing":
                                        tf.linespacing = cast.ToInt(v)
   DIR diff --git a/resources/images/text.go b/resources/images/text.go
       @@ -36,6 +36,7 @@ type textFilter struct {
                color       color.Color
                x, y        int
                alignx      string
       +        aligny      string
                size        float64
                linespacing int
                fontSource  hugio.ReadSeekCloserProvider
       @@ -110,12 +111,19 @@ func (f textFilter) Draw(dst draw.Image, src image.Image, options *gift.Options)
                        }
                        finalLines = append(finalLines, currentLine)
                }
       +        // Total height of the text from the top of the first line to the baseline of the last line
       +        totalHeight := len(finalLines)*fontHeight + (len(finalLines)-1)*f.linespacing
        
                // Correct y position based on font and size
       -        f.y = f.y + fontHeight
       -
       -        // Start position
       -        y := f.y
       +        y := f.y + fontHeight
       +        switch f.aligny {
       +        case "top":
       +                // Do nothing
       +        case "center":
       +                y = y - totalHeight/2
       +        case "bottom":
       +                y = y - totalHeight
       +        }
        
                // Draw text line by line
                for _, line := range finalLines {