From 0615750e4579cfdb72cebbc24c22e23491d5e102 Mon Sep 17 00:00:00 2001 From: Jaro Date: Sun, 28 May 2023 09:12:16 +0200 Subject: [PATCH] Autodetect text direction for legacy interface. --- .../spannedArabicFiller20em.golden | 8 ++++---- .golden/paragraphLayout/arabicFiller20em.golden | 4 ++-- .golden/paragraphLayout/hardBreaksRTL.golden | 4 ++-- .../spannedArabicFiller20em.golden | 8 ++++---- .../Text/ParagraphLayout/Internal/BiDiLevels.hs | 1 + src/Data/Text/ParagraphLayout/Internal/Plain.hs | 17 +++++++++++++++-- 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden b/.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden index 7337884..c91291f 100644 --- a/.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden +++ b/.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden @@ -180,7 +180,7 @@ { fragmentUserData = () , fragmentLine = 2 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} + [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ] , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500} , fragmentPen = (0, -1085) @@ -240,7 +240,7 @@ { fragmentUserData = () , fragmentLine = 3 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} + [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ] , fragmentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500} , fragmentPen = (0, -1085) @@ -320,7 +320,7 @@ { fragmentUserData = () , fragmentLine = 3 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} + [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ] , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500} , fragmentPen = (0, -1085) @@ -339,7 +339,7 @@ { fragmentUserData = () , fragmentLine = 4 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} + [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ] , fragmentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500} , fragmentPen = (0, -1085) diff --git a/.golden/paragraphLayout/arabicFiller20em.golden b/.golden/paragraphLayout/arabicFiller20em.golden index 4ff13dc..a90bdf6 100644 --- a/.golden/paragraphLayout/arabicFiller20em.golden +++ b/.golden/paragraphLayout/arabicFiller20em.golden @@ -6,7 +6,7 @@ ParagraphLayout { fragmentUserData = () , fragmentLine = 1 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} + [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ] , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500} , fragmentPen = (0, -1085) @@ -184,7 +184,7 @@ ParagraphLayout { fragmentUserData = () , fragmentLine = 4 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} + [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ] , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500} , fragmentPen = (0, -1085) diff --git a/.golden/paragraphLayout/hardBreaksRTL.golden b/.golden/paragraphLayout/hardBreaksRTL.golden index 335209b..8efde42 100644 --- a/.golden/paragraphLayout/hardBreaksRTL.golden +++ b/.golden/paragraphLayout/hardBreaksRTL.golden @@ -6,7 +6,7 @@ ParagraphLayout { fragmentUserData = () , fragmentLine = 1 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} + [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ] , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500} , fragmentPen = (0, -1085) @@ -137,7 +137,7 @@ ParagraphLayout { fragmentUserData = () , fragmentLine = 9 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} + [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ] , fragmentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500} , fragmentPen = (0, -1085) diff --git a/.golden/paragraphLayout/spannedArabicFiller20em.golden b/.golden/paragraphLayout/spannedArabicFiller20em.golden index dca6979..51fbfe8 100644 --- a/.golden/paragraphLayout/spannedArabicFiller20em.golden +++ b/.golden/paragraphLayout/spannedArabicFiller20em.golden @@ -180,7 +180,7 @@ ParagraphLayout { fragmentUserData = () , fragmentLine = 2 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} + [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ] , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500} , fragmentPen = (0, -1085) @@ -200,7 +200,7 @@ ParagraphLayout { fragmentUserData = () , fragmentLine = 3 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} + [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ] , fragmentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500} , fragmentPen = (0, -1085) @@ -280,7 +280,7 @@ ParagraphLayout { fragmentUserData = () , fragmentLine = 3 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} + [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ] , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500} , fragmentPen = (0, -1085) @@ -299,7 +299,7 @@ ParagraphLayout { fragmentUserData = () , fragmentLine = 4 , fragmentAncestorBoxes = - [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} + [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ] , fragmentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500} , fragmentPen = (0, -1085) diff --git a/src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs b/src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs index a35fdf8..ae6948f 100644 --- a/src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs +++ b/src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs @@ -3,6 +3,7 @@ module Data.Text.ParagraphLayout.Internal.BiDiLevels , TextLevels (TextLevels) , WithLevel , dropLevels + , firstStrongDirection , headLevel , level , levelDirectionH diff --git a/src/Data/Text/ParagraphLayout/Internal/Plain.hs b/src/Data/Text/ParagraphLayout/Internal/Plain.hs index 790e25f..70283c2 100644 --- a/src/Data/Text/ParagraphLayout/Internal/Plain.hs +++ b/src/Data/Text/ParagraphLayout/Internal/Plain.hs @@ -5,6 +5,7 @@ where import Data.Text.Glyphize (Direction (DirLTR)) import Data.Text.ParagraphLayout.Internal.AncestorBox +import Data.Text.ParagraphLayout.Internal.BiDiLevels import Data.Text.ParagraphLayout.Internal.BoxOptions import Data.Text.ParagraphLayout.Internal.Fragment import Data.Text.ParagraphLayout.Internal.ParagraphOptions @@ -29,7 +30,8 @@ layoutPlain p@(P.Paragraph _ _ spans _) = -- Span indexes are added to the user data internally, then used to split the -- resulting fragments according to their corresponding spans. plainToRich :: P.Paragraph d -> R.Paragraph (Int, d) -plainToRich (P.Paragraph arr off spans opts) = R.Paragraph arr off rootNode opts +plainToRich p@(P.Paragraph arr off spans opts) = + R.Paragraph arr off rootNode opts where rootNode = RootBox rootBox rootBox = Box spanNodes baseOpts @@ -39,11 +41,22 @@ plainToRich (P.Paragraph arr off spans opts) = R.Paragraph arr off rootNode opts (boxFromPlain baseOpts i s) defaultBoxOptions indexedSpans = zip [0 ..] spans - baseOpts = (defaultTextOptions DirLTR) + baseOpts = (defaultTextOptions $ detectDirection p) { textFont = paragraphFont opts , textLineHeight = paragraphLineHeight opts } +-- | Simplified autodetection of text direction for plain text, +-- to provide temporary compatibility with the old interface which +-- did not allow setting text direction explicitly. +-- +-- Note that the detected direction carries over hard line breaks, +-- which is not compliant with the Unicode Bidirectional Algorithm. +detectDirection :: P.Paragraph d -> Direction +detectDirection p = case firstStrongDirection (P.paragraphText p) of + Just dir -> dir + Nothing -> DirLTR + -- | Convert a legacy `Span` to a rich text box with one text node inside. -- -- Add the given index to the user data, so that it can be extracted later. -- 2.30.2