-- | 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)