-- | Infix operators for construction of paragraphs with readable code. -- -- Example construction: -- @"ignored prefix" |< "en"~"one two " >|< "ja"~"三四" >| "ignored suffix"@ -- -- Special syntax for paragraphs with no contents: -- @"ignored prefix" |<>| "ignored suffix"@ module Data.Text.ParagraphLayout.ParagraphConstruction ((>|) ,(>|<) ,(|<) ,(|<>|) ,(~) ) where import Data.Text (pack) import Data.Text.Foreign (lengthWord8) import Data.Text.Internal (Text(Text)) import Data.Text.Internal.Lazy (chunk, empty) import qualified Data.Text.Internal.Lazy as Lazy import Data.Text.Lazy (toStrict) import Data.Text.ParagraphLayout (Paragraph(Paragraph) ,ParagraphOptions ,Span(Span) ) -- | Create first span with optional ignored suffix. infixr 5 >| (>|) :: (String, String) -> String -> (Lazy.Text, [Span]) (spanLanguage, spanText) >| suffix = (newText, newSpans) where newSpans = [newSpan] newSpan = Span (lengthWord8 packedSpanText) spanLanguage newText = chunk packedSpanText (chunk packedSuffix empty) packedSpanText = pack spanText packedSuffix = pack suffix -- | Create next span. infixr 5 >|< (>|<) :: (String, String) -> (Lazy.Text, [Span]) -> (Lazy.Text, [Span]) (spanLanguage, spanText) >|< (oldText, oldSpans) = (newText, newSpans) where newSpans = newSpan:oldSpans newSpan = Span (lengthWord8 packedSpanText) spanLanguage newText = chunk packedSpanText oldText packedSpanText = pack spanText -- | Add optional ignored prefix and wrap in a `Paragraph`. infixr 5 |< (|<) :: String -> (Lazy.Text, [Span]) -> ParagraphOptions -> Paragraph prefix |< (oldText, spans) = Paragraph arr afterPrefix spans where (Text arr beforePrefix _) = toStrict $ chunk 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 |< (chunk (pack suffix) empty, []) -- | Combine language with text. infix 6 ~ (~) :: String -> String -> (String, String) lang ~ txt = (lang, txt)