]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
images: Add option for vertical alignment to images.Text
authorPranshu Gaba <pranshugaba@gmail.com>
Mon, 17 Feb 2025 23:51:42 +0000 (05:21 +0530)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 24 Apr 2025 12:09:13 +0000 (14:09 +0200)
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

docs/content/en/functions/images/Text.md
resources/images/filters.go
resources/images/text.go

index 94cdb4e9de5f75d2503f6c5ac25ebf8070e666af..8f7e730baf9d0d08cce5e109ea4bc3184d99fcd5 100644 (file)
@@ -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).
 
index 9c2b9b46f9ec7586773d6449830d1092c5e356e1..1e44f11841f51d00eb5bc7d652c89963ce59ecaf 100644 (file)
@@ -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)
index 324878839872c59e5b14a3f1eacd6dc982a9d821..f3943a475b19469c2288714c77cdc5d184f257eb 100644 (file)
@@ -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 {