From 034a323deb9c3858d2396406d7e22410984ba4e6 Mon Sep 17 00:00:00 2001 From: Jaro Date: Wed, 8 Mar 2023 16:22:26 +0100 Subject: [PATCH] Make SpanOptions a separate type. --- lib/Data/Text/ParagraphLayout.hs | 3 +- .../ParagraphLayout/ParagraphConstruction.hs | 2 +- .../Internal/ParagraphConstruction.hs | 10 ++--- .../Text/ParagraphLayout/Internal/Plain.hs | 8 ++-- .../Text/ParagraphLayout/Internal/Span.hs | 13 ++++++- .../Text/ParagraphLayout/ParagraphData.hs | 38 ++++++++++++++----- 6 files changed, 52 insertions(+), 22 deletions(-) diff --git a/lib/Data/Text/ParagraphLayout.hs b/lib/Data/Text/ParagraphLayout.hs index 2187497..dbc2de9 100644 --- a/lib/Data/Text/ParagraphLayout.hs +++ b/lib/Data/Text/ParagraphLayout.hs @@ -23,8 +23,9 @@ module Data.Text.ParagraphLayout ,paragraphLineHeight ,paragraphMaxWidth ) - ,Span(Span, spanLanguage, spanLength) + ,Span(Span, spanLength, spanOptions) ,SpanLayout(SpanLayout) + ,SpanOptions(SpanOptions, spanLanguage) ,layoutPlain ) where diff --git a/lib/Data/Text/ParagraphLayout/ParagraphConstruction.hs b/lib/Data/Text/ParagraphLayout/ParagraphConstruction.hs index d755dca..6960bd1 100644 --- a/lib/Data/Text/ParagraphLayout/ParagraphConstruction.hs +++ b/lib/Data/Text/ParagraphLayout/ParagraphConstruction.hs @@ -1,7 +1,7 @@ -- | Infix operators for construction of paragraphs with readable code. -- -- Example construction: --- @"ignored prefix" |\< "en"~"one two " \>|\< "ja"~"三四" \>| "ignored suffix"@ +-- @"ignored prefix" |\< en~"one two " \>|\< ja~"三四" \>| "ignored suffix"@ -- -- Special syntax for paragraphs with no contents: -- @"ignored prefix" |<>| "ignored suffix"@ diff --git a/src/Data/Text/ParagraphLayout/Internal/ParagraphConstruction.hs b/src/Data/Text/ParagraphLayout/Internal/ParagraphConstruction.hs index f586f0a..65e8844 100644 --- a/src/Data/Text/ParagraphLayout/Internal/ParagraphConstruction.hs +++ b/src/Data/Text/ParagraphLayout/Internal/ParagraphConstruction.hs @@ -17,11 +17,11 @@ import Data.Text.ParagraphLayout.Internal.Plain (Paragraph(Paragraph) ,ParagraphOptions ) -import Data.Text.ParagraphLayout.Internal.Span (Span(Span)) +import Data.Text.ParagraphLayout.Internal.Span (Span(Span), SpanOptions) -- | Create first span with optional ignored suffix. infixr 5 >| -(>|) :: (String, String) -> String -> (Lazy.Text, [Span]) +(>|) :: (SpanOptions, String) -> String -> (Lazy.Text, [Span]) (spanLanguage, spanText) >| suffix = (newText, newSpans) where newSpans = [newSpan] @@ -32,7 +32,7 @@ infixr 5 >| -- | Create next span. infixr 5 >|< -(>|<) :: (String, String) -> (Lazy.Text, [Span]) -> (Lazy.Text, [Span]) +(>|<) :: (SpanOptions, String) -> (Lazy.Text, [Span]) -> (Lazy.Text, [Span]) (spanLanguage, spanText) >|< (oldText, oldSpans) = (newText, newSpans) where newSpans = newSpan:oldSpans @@ -56,5 +56,5 @@ prefix |<>| suffix = prefix |< (chunk (pack suffix) empty, []) -- | Combine language with text. infix 6 ~ -(~) :: String -> String -> (String, String) -lang ~ txt = (lang, txt) +(~) :: SpanOptions -> String -> (SpanOptions, String) +opts ~ txt = (opts, txt) diff --git a/src/Data/Text/ParagraphLayout/Internal/Plain.hs b/src/Data/Text/ParagraphLayout/Internal/Plain.hs index fc90af1..6c6cd1c 100644 --- a/src/Data/Text/ParagraphLayout/Internal/Plain.hs +++ b/src/Data/Text/ParagraphLayout/Internal/Plain.hs @@ -214,7 +214,7 @@ shapeRun (WithSpan rs run) = shape font buffer features features = [] resolveSpans :: Paragraph -> [RS.ResolvedSpan] -resolveSpans p@(Paragraph arr pStart spans opts) = do +resolveSpans p@(Paragraph arr pStart spans pOpts) = do let sBounds = paragraphSpanBounds p let pEnd = NonEmpty.last sBounds let sStarts = NonEmpty.init sBounds @@ -225,15 +225,15 @@ resolveSpans p@(Paragraph arr pStart spans opts) = do <*> ZipList spans <*> ZipList sStarts <*> ZipList sLengths - let lang = spanLanguage s + let lang = spanLanguage $ spanOptions s let breaks = paragraphLineBreaks p pEnd lang return RS.ResolvedSpan { RS.spanIndex = i , RS.spanOffsetInParagraph = sStart - pStart -- TODO: Consider adding checks for array bounds. , RS.spanText = Text arr sStart sLen - , RS.spanFont = paragraphFont opts - , RS.spanLineHeight = paragraphLineHeight opts + , RS.spanFont = paragraphFont pOpts + , RS.spanLineHeight = paragraphLineHeight pOpts , RS.spanLanguage = lang , RS.spanLineBreaks = subOffsetsDesc (sStart - pStart) breaks } diff --git a/src/Data/Text/ParagraphLayout/Internal/Span.hs b/src/Data/Text/ParagraphLayout/Internal/Span.hs index d7c0684..438e025 100644 --- a/src/Data/Text/ParagraphLayout/Internal/Span.hs +++ b/src/Data/Text/ParagraphLayout/Internal/Span.hs @@ -1,6 +1,7 @@ module Data.Text.ParagraphLayout.Internal.Span (Span(..) ,SpanLayout(..) + ,SpanOptions(..) ,spanRects ) where @@ -15,12 +16,20 @@ import Data.Text.ParagraphLayout.Internal.Rect -- Each span could have a different font family, size, style, text decoration, -- colour, language, etc. data Span = Span --- TODO: Add all relevant attributes. { spanLength :: Int -- ^ Byte offset to the next span or the end of the paragraph text. - , spanLanguage :: String + , spanOptions :: SpanOptions + -- ^ Options applying to this specific span. + + } + deriving (Eq, Read, Show) + +-- TODO: Add all relevant attributes. +data SpanOptions = SpanOptions + + { spanLanguage :: String -- ^ Used for selecting the appropriate glyphs and line breaking rules. } diff --git a/test/Data/Text/ParagraphLayout/ParagraphData.hs b/test/Data/Text/ParagraphLayout/ParagraphData.hs index 07f6d20..2f21685 100644 --- a/test/Data/Text/ParagraphLayout/ParagraphData.hs +++ b/test/Data/Text/ParagraphLayout/ParagraphData.hs @@ -11,38 +11,58 @@ module Data.Text.ParagraphLayout.ParagraphData ) where -import Data.Text.ParagraphLayout (Paragraph, ParagraphOptions) +import Data.Text.ParagraphLayout (Paragraph, ParagraphOptions, SpanOptions(..)) import Data.Text.ParagraphLayout.ParagraphConstruction +-- | Span with text in the Czech language. +cs :: SpanOptions +cs = SpanOptions { spanLanguage = "cs" } + +-- | Span with text in the English language. +en :: SpanOptions +en = SpanOptions { spanLanguage = "en" } + +-- | Span with text in the Japanese language. +ja :: SpanOptions +ja = SpanOptions { spanLanguage = "ja" } + +-- | Span with text in the Serbian language. +sr :: SpanOptions +sr = SpanOptions { spanLanguage = "sr" } + +-- | Span with text in no language. +zxx :: SpanOptions +zxx = SpanOptions { spanLanguage = "zxx" } + emptyParagraph :: ParagraphOptions -> Paragraph emptyParagraph = "x" |<>| "zzzzzzz" emptySpanParagraph :: ParagraphOptions -> Paragraph -emptySpanParagraph = "xx" |< "en"~"" >| "zzzzz" +emptySpanParagraph = "xx" |< en~"" >| "zzzzz" trivialParagraph :: ParagraphOptions -> Paragraph -trivialParagraph = "xxx" |< "en"~"a" >| "zzz" +trivialParagraph = "xxx" |< en~"a" >| "zzz" -- | Fillter text using the Arabic script. -- Source: arabicFillerParagraph :: ParagraphOptions -> Paragraph -arabicFillerParagraph = "xxxx" |< "zxx"~"إعلان بأيدي وبغطاء هذه من. عرض غينيا يتمكن واعتلاء في. و فرنسا الثانية وفي, أسر إذ السبب ارتكبها مليارات. فكان الشتاء، ما حتى, غير أن وصغار الأخذ. في الصفحة لهيمنة وتتحمّل وتم, أن أما وبداية الغالي." >| "z" +arabicFillerParagraph = "xxxx" |< zxx~"إعلان بأيدي وبغطاء هذه من. عرض غينيا يتمكن واعتلاء في. و فرنسا الثانية وفي, أسر إذ السبب ارتكبها مليارات. فكان الشتاء، ما حتى, غير أن وصغار الأخذ. في الصفحة لهيمنة وتتحمّل وتم, أن أما وبداية الغالي." >| "z" -- | Fillter text using the Latin script. -- | Source: loremIpsumParagraph :: ParagraphOptions -> Paragraph -loremIpsumParagraph = "xxxx" |< "zxx"~"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." >| "z" +loremIpsumParagraph = "xxxx" |< zxx~"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." >| "z" czechHelloParagraph :: ParagraphOptions -> Paragraph -czechHelloParagraph = "xxxxx" |< "cs"~"Ahoj, světe!" >| "zz" +czechHelloParagraph = "xxxxx" |< cs~"Ahoj, světe!" >| "zz" mixedScriptSerbianParagraph :: ParagraphOptions -> Paragraph -mixedScriptSerbianParagraph = "xxxxxx" |< "sr"~"Vikipedija (Википедија)" >| "zzzz" +mixedScriptSerbianParagraph = "xxxxxx" |< sr~"Vikipedija (Википедија)" >| "zzzz" -- | For testing line breaking on boundaries that are different from script -- boundaries. mixedScriptWordsParagraph :: ParagraphOptions -> Paragraph -mixedScriptWordsParagraph = "xxxxxxx" |< "zxx"~"jjjжжжjjj jjjжжжjjj жжжjjjжжж жжжjjjжжж jжj jжj жjж жjж" >| "zzzzzzzz" +mixedScriptWordsParagraph = "xxxxxxx" |< zxx~"jjjжжжjjj jjjжжжjjj жжжjjjжжж жжжjjjжжж jжj jжj жjж жjж" >| "zzzzzzzz" mixedLanguageLTRParagraph :: ParagraphOptions -> Paragraph -mixedLanguageLTRParagraph = "Tak " |< "cs"~"jsem tady, " >|< "ja"~"世界!" >| "zzzzzz" +mixedLanguageLTRParagraph = "Tak " |< cs~"jsem tady, " >|< ja~"世界!" >| "zzzzzz" -- 2.30.2