-- | Infix operators for readable construction of paragraphs as testing input.
--
-- Example construction:
-- @"ignored prefix" |< "en"~"one two " >|< "ja"~"δΈε" >| "ignored suffix"@
--
-- Special syntax for paragraphs with no contents:
-- @"ignored prefix" |<>| "ignored suffix"@
--
-- Please note that this form of construction is inefficient for longer text.
module Data.Text.ParagraphLayout.ParagraphConstruction
((>|)
,(>|<)
,(|<)
,(|<>|)
,(~)
)
where
import Data.Text (append, pack)
import Data.Text.Foreign (lengthWord8)
import Data.Text.Internal (Text(Text))
import Data.Text.ParagraphLayout.Plain
(Paragraph(Paragraph)
,ParagraphOptions()
,Span(Span)
)
-- | Create first span with optional ignored suffix.
infixr 5 >|
(>|) :: (String, String) -> String -> (Text, [Span])
(spanText, spanLanguage) >| ignoredSuffix = (newText, newSpans)
where
newSpans = [Span (fromIntegral $ lengthWord8 packedSpanText) spanLanguage]
newText = append packedSpanText packedSuffix
packedSpanText = pack spanText
packedSuffix = pack ignoredSuffix
-- Create next span.
infixr 5 >|<
(>|<) :: (String, String) -> (Text, [Span]) -> (Text, [Span])
(spanText, spanLanguage) >|< (oldText, oldSpans) = (newText, newSpans)
where
newSpans = Span (fromIntegral $ lengthWord8 packedText) spanLanguage : oldSpans
newText = append packedText oldText
packedText = pack spanText
-- Add optional ignored prefix and wrap in a `Paragraph`.
infixr 5 |<
(|<) :: String -> (Text, [Span]) -> ParagraphOptions -> Paragraph
ignoredPrefix |< (oldText, spans) = Paragraph arr (fromIntegral off) spans
where
(Text arr offPrefix _) = append packedPrefix oldText
off = offPrefix + (lengthWord8 packedPrefix)
packedPrefix = pack ignoredPrefix
-- Create a `Paragraph` with no spans, just two ignored texts.
infixr 5 |<>|
(|<>|) :: String -> String -> ParagraphOptions -> Paragraph
ignoredPrefix |<>| ignoredSuffix = ignoredPrefix |< (pack ignoredSuffix, [])
-- Combine language with text.
infix 6 ~
(~) :: String -> String -> (String, String)
lang ~ txt = (txt, lang)