-- | 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]) (spanLanguage, spanText) >| suffix = (newText, newSpans) where newSpans = [newSpan] newSpan = Span (lengthWord8 packedSpanText) spanLanguage newText = append packedSpanText packedSuffix packedSpanText = pack spanText packedSuffix = pack suffix -- | Create next span. infixr 5 >|< (>|<) :: (String, String) -> (Text, [Span]) -> (Text, [Span]) (spanLanguage, spanText) >|< (oldText, oldSpans) = (newText, newSpans) where newSpans = newSpan:oldSpans newSpan = Span (lengthWord8 packedSpanText) spanLanguage newText = append packedSpanText oldText packedSpanText = pack spanText -- | Add optional ignored prefix and wrap in a `Paragraph`. infixr 5 |< (|<) :: String -> (Text, [Span]) -> ParagraphOptions -> Paragraph prefix |< (oldText, spans) = Paragraph arr afterPrefix spans where (Text arr beforePrefix _) = append packedPrefix oldText afterPrefix = beforePrefix + lengthWord8 packedPrefix packedPrefix = pack prefix -- | Create a `Paragraph` with no spans, just two ignored texts. infixr 5 |<>| (|<>|) :: String -> String -> ParagraphOptions -> Paragraph prefix |<>| suffix = prefix |< (pack suffix, []) -- | Combine language with text. infix 6 ~ (~) :: String -> String -> (String, String) lang ~ txt = (lang, txt)