From f4470b0545b9cfcba592e4bc9093916f00b308ff Mon Sep 17 00:00:00 2001 From: Ariel Ror Date: Wed, 3 Apr 2024 10:43:08 -0400 Subject: [PATCH] LT-21633: Improve Bidi handling in Word Export (#15) - Remove unneeded TextDirection property. - Create Writing System styles so that they are based on styles that they should inherit from. --- Src/xWorks/WordStylesGenerator.cs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Src/xWorks/WordStylesGenerator.cs b/Src/xWorks/WordStylesGenerator.cs index c5d1419c01..d48bba8f7c 100644 --- a/Src/xWorks/WordStylesGenerator.cs +++ b/Src/xWorks/WordStylesGenerator.cs @@ -264,6 +264,7 @@ internal static Style GenerateWordStyleFromLcmStyleSheet( if (exportStyleInfo.HasTrailingIndent) { + // Check bidirectional flag to determine correct orientation for indent if (exportStyleInfo.DirectionIsRightToLeft == TriStateBool.triTrue) parProps.Append(new Indentation() { Left = MilliPtToTwentiPt(exportStyleInfo.TrailingIndent).ToString() }); else @@ -279,6 +280,7 @@ internal static Style GenerateWordStyleFromLcmStyleSheet( ancestorIndents = CalculateParagraphIndentsFromAncestors(ancestorIndents.Ancestor, styleSheet, new AncestorIndents(0f, 0f)); var leadingIndent = CalculateMarginLeft(exportStyleInfo, ancestorIndents, hangingIndent); + // Check bidirectional flag to determine correct orientation for indent if (exportStyleInfo.DirectionIsRightToLeft == TriStateBool.triTrue) parProps.Append(new Indentation() { Right = leadingIndent.ToString() }); else @@ -286,16 +288,10 @@ internal static Style GenerateWordStyleFromLcmStyleSheet( } } - // If text direction is specified, add specification to paragraph properties - if (exportStyleInfo.DirectionIsRightToLeft != TriStateBool.triNotSet) + // If text direction is right to left, add BiDi property to the paragraph. + if (exportStyleInfo.DirectionIsRightToLeft == TriStateBool.triTrue) { parProps.Append(new BiDi()); - - if (exportStyleInfo.DirectionIsRightToLeft == TriStateBool.triTrue) - parProps.Append(new TextDirection() { Val = TextDirectionValues.TopToBottomRightToLeft }); - - else - parProps.Append(new TextDirection() { Val = TextDirectionValues.LefToRightTopToBottom }); } exportStyle.Append(parProps); } @@ -441,12 +437,18 @@ private static Style GenerateWordStyleFromWsOptions(ConfigurableDictionaryNode c // if the writing system isn't a magic name just use it otherwise find the right one from the magic list var wsIdString = possiblyMagic == 0 ? ws.Id : WritingSystemServices.GetWritingSystemList(cache, possiblyMagic, true).First().Id; var wsId = cache.LanguageWritingSystemFactoryAccessor.GetWsFromStr(wsIdString); + var wsString = String.Format("[lang=\'{0}\']", wsIdString).Trim('.'); var wsStyle = new Style(); + if (!string.IsNullOrEmpty(configNode.Style)) wsStyle = GenerateWordStyleFromLcmStyleSheet(configNode.Style, wsId, propertyTable); - wsStyle.StyleId = configNode.Style + (String.Format("[lang=\'{0}\']", wsIdString)).Trim('.'); + //style should be based on the span for the current ws as well as the style info for the current node that is independent from the ws + wsStyle.Append(new BasedOn() { Val = "span" + wsString }); + wsStyle.Append(new BasedOn() { Val = configNode.Style }); + + wsStyle.StyleId = configNode.Style + wsString; if (!IsEmptyStyle(wsStyle)) return wsStyle;