~jaro/balkon

e5196add6c88a4034109c516d6c338becfea7c6c — Jaro 10 months ago 367a43f
Add options for vertical alignment.
M lib/Data/Text/ParagraphLayout/Rich.hs => lib/Data/Text/ParagraphLayout/Rich.hs +6 -0
@@ 14,6 14,11 @@ module Data.Text.ParagraphLayout.Rich
        )
    , BoxCollapse (AllowBoxCollapse, AvoidBoxCollapse)
    , BoxSpacing (BoxSpacingLeftRight)
    , VerticalAlignment
        ( AlignLineTop
        , AlignLineBottom
        , AlignBaseline
        )
    , LineHeight (Absolute, Normal)
    , ParagraphOptions
    , defaultParagraphOptions


@@ 39,6 44,7 @@ module Data.Text.ParagraphLayout.Rich
    -- as well as updating specific option fields.
    , boxSpacing
    , boxCollapse
    , boxVerticalAlignment
    , activateBoxSpacing
    -- ** Text options
    -- | These are record selectors that can be used for reading

M src/Data/Text/ParagraphLayout/Internal/BoxOptions.hs => src/Data/Text/ParagraphLayout/Internal/BoxOptions.hs +56 -2
@@ 2,6 2,7 @@ module Data.Text.ParagraphLayout.Internal.BoxOptions
    ( BoxCollapse (..)
    , BoxOptions (..)
    , BoxSpacing (..)
    , VerticalAlignment (..)
    , activateBoxSpacing
    , defaultBoxOptions
    )


@@ 14,6 15,10 @@ import Data.Int (Int32)
-- This record type is likely to be extended in the future.
-- Use `defaultBoxOptions` and update it with specific record selectors
-- instead of constructing `BoxOptions` directly.
--
-- In order to get CSS defaults, use:
--
-- > defaultBoxOptions { boxVerticalAlignment = AlignBaseline 0 }
data BoxOptions = BoxOptions

    { boxSpacing :: BoxSpacing


@@ 30,7 35,8 @@ data BoxOptions = BoxOptions
    -- ^ Determines how this box affects the height of a line that would
    -- otherwise be empty.

    -- TODO: textVerticalAlign
    , boxVerticalAlignment :: VerticalAlignment
    -- ^ Determines how fragments are aligned vertically within a line.

    }
    deriving (Eq)


@@ 92,11 98,59 @@ data BoxCollapse

    deriving (Eq, Read, Show)

-- | `BoxOptions` with default values.
-- | Determines how the contents of a line should be aligned vertically,
-- that is, how fragments should fill (and possibly extend) the vertical space
-- inside a line.
--
-- Vertical alignment takes place after line breaking.
data VerticalAlignment

    = AlignLineTop
    -- ^ Align the top of this box with the top of the line.
    --
    -- The /top of this box/ is the topmost coordinate of any fragment
    -- descended from this box, except for fragments that are descended from
    -- another box with `AlignLineTop` or `AlignLineBottom` closer to them.
    --
    -- t`Data.Text.ParagraphLayout.Rich.LineHeight` is included
    -- when considering the /top/ coordinates of descended fragments,
    -- and thus, leading is included.
    --
    -- This behaviour is equivalent to @vertical-align: top@ in CSS.

    | AlignLineBottom
    -- ^ Align the bottom of this box with the bottom of the line.
    --
    -- The /bottom of this box/ is the bottommost coordinate of any fragment
    -- descended from this box, except for fragments that are descended from
    -- another box with `AlignLineTop` or `AlignLineBottom` closer to them.
    --
    -- t`Data.Text.ParagraphLayout.Rich.LineHeight` is included
    -- when considering the /bottom/ coordinates of descended fragments,
    -- and thus, leading is included.
    --
    -- This behaviour is equivalent to @vertical-align: bottom@ in CSS.

    | AlignBaseline Int32
    -- ^ Align the baseline of this box with the baseline of its parent box,
    -- optionally shifting it by a specified amount upwards.
    --
    -- @`AlignBaseline` 0@ is equivalent to @vertical-align: baseline@ in CSS.
    --
    -- @`AlignBaseline` x@ is equivalent to @vertical-align: \<length\>@ in CSS,
    -- after an appropriate unit conversion.

    deriving (Eq, Read, Show)

-- | `BoxOptions` with backwards-compatible values.
--
-- Note that this sets `boxVerticalAlignment` to `AlignLineTop`,
-- whereas the CSS default should be `AlignBaseline 0`.
defaultBoxOptions :: BoxOptions
defaultBoxOptions = BoxOptions
    { boxSpacing = BoxSpacingLeftRight 0 0
    , boxCollapse = AllowBoxCollapse
    , boxVerticalAlignment = AlignLineTop
    }

-- | Shorthand for updating `boxSpacing` and setting `boxCollapse`