Skip to content

Commit

Permalink
Implement TextAlignment property
Browse files Browse the repository at this point in the history
  • Loading branch information
y0ung3r committed Apr 26, 2024
1 parent c9b9545 commit 7442028
Show file tree
Hide file tree
Showing 7 changed files with 178 additions and 28 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ Implementation Dashboard
- [x] Keep lines
- [x] Keep next
- [ ] Frame
- [ ] Alignment
- [x] Alignment
- [x] Horizontal
- [ ] Vertical (Text alignment)
- [x] Vertical (Text alignment)
- [ ] Spacing
- [x] Before paragraph
- [x] After paragraph
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace OfficeFlow.Word.Core.Elements.Paragraphs.Enums;

public enum TextAlignment
{
Auto,
Baseline,
Bottom,
Center,
Top
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ public static ParagraphFormat Default
public HorizontalAlignment HorizontalAlignment { get; set; }
= HorizontalAlignment.Left;

public TextAlignment TextAlignment { get; set; }
= TextAlignment.Auto;

public IParagraphSpacing SpacingBefore { get; set; }
= ParagraphSpacing.Exactly<Points>(0.0);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,32 @@ public void Should_read_horizontal_alignment_properly(string actualValue, Horizo
.Should()
.Be(expectedValue);
}

[Theory]
[InlineData("auto", TextAlignment.Auto)]
[InlineData("baseline", TextAlignment.Baseline)]
[InlineData("bottom", TextAlignment.Bottom)]
[InlineData("center", TextAlignment.Center)]
[InlineData("top", TextAlignment.Top)]
public void Should_read_text_alignment_properly(string actualValue, TextAlignment expectedValue)
{
// Arrange
var xml = new XElement(OpenXmlNamespaces.Word + "pPr",
new XElement(OpenXmlNamespaces.Word + "textAlignment",
new XAttribute(OpenXmlNamespaces.Word + "val", actualValue)));

var paragraphFormat = new ParagraphFormat();
var sut = new OpenXmlElementReader(xml);

// Act
sut.Visit(paragraphFormat);

// Assert
paragraphFormat
.TextAlignment
.Should()
.Be(expectedValue);
}

[Fact]
public void Should_read_paragraph_spacing_properly()
Expand Down Expand Up @@ -219,6 +245,11 @@ public void Should_read_empty_paragraph_format_properly()
.Should()
.Be(ParagraphFormat.Default.HorizontalAlignment);

paragraphFormat
.TextAlignment
.Should()
.Be(ParagraphFormat.Default.TextAlignment);

paragraphFormat
.SpacingBefore
.Should()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,90 @@ public void Should_write_horizontal_alignment_properly(string expectedValue, Hor
.Should()
.Be(expectedXml);
}

[Fact]
public void Default_value_of_horizontal_alignment_should_not_be_written()
{
// Arrange
var expectedXml = new XElement(OpenXmlNamespaces.Word + "pPr",
new XElement(OpenXmlNamespaces.Word + "spacing",
new XAttribute(OpenXmlNamespaces.Word + "before", "0"),
new XAttribute(OpenXmlNamespaces.Word + "after", "160")));

var sut = new OpenXmlElementWriter(
new XElement(OpenXmlNamespaces.Word + "pPr"));

var paragraphFormat = new ParagraphFormat
{
HorizontalAlignment = HorizontalAlignment.Left
};

// Act
sut.Visit(paragraphFormat);

// Assert
sut.Xml
.Should()
.Be(expectedXml);
}

[Theory]
[InlineData("baseline", TextAlignment.Baseline)]
[InlineData("bottom", TextAlignment.Bottom)]
[InlineData("center", TextAlignment.Center)]
[InlineData("top", TextAlignment.Top)]
public void Should_write_text_alignment_properly(string expectedValue, TextAlignment actualValue)
{
// Arrange
var expectedXml = new XElement(OpenXmlNamespaces.Word + "pPr",
new XElement(OpenXmlNamespaces.Word + "textAlignment",
new XAttribute(OpenXmlNamespaces.Word + "val", expectedValue)),
new XElement(OpenXmlNamespaces.Word + "spacing",
new XAttribute(OpenXmlNamespaces.Word + "before", "0"),
new XAttribute(OpenXmlNamespaces.Word + "after", "160")));

var sut = new OpenXmlElementWriter(
new XElement(OpenXmlNamespaces.Word + "pPr"));

var paragraphFormat = new ParagraphFormat
{
TextAlignment = actualValue
};

// Act
sut.Visit(paragraphFormat);

// Assert
sut.Xml
.Should()
.Be(expectedXml);
}

[Fact]
public void Default_value_of_text_alignment_should_not_be_written()
{
// Arrange
var expectedXml = new XElement(OpenXmlNamespaces.Word + "pPr",
new XElement(OpenXmlNamespaces.Word + "spacing",
new XAttribute(OpenXmlNamespaces.Word + "before", "0"),
new XAttribute(OpenXmlNamespaces.Word + "after", "160")));

var sut = new OpenXmlElementWriter(
new XElement(OpenXmlNamespaces.Word + "pPr"));

var paragraphFormat = new ParagraphFormat
{
TextAlignment = TextAlignment.Auto
};

// Act
sut.Visit(paragraphFormat);

// Assert
sut.Xml
.Should()
.Be(expectedXml);
}

[Fact]
public void Should_write_paragraph_spacing_properly()
Expand Down Expand Up @@ -278,30 +362,4 @@ public void Should_not_write_keep_next()
.Should()
.Be(expectedXml);
}

[Fact]
public void Default_value_of_horizontal_alignment_should_not_be_written()
{
// Arrange
var expectedXml = new XElement(OpenXmlNamespaces.Word + "pPr",
new XElement(OpenXmlNamespaces.Word + "spacing",
new XAttribute(OpenXmlNamespaces.Word + "before", "0"),
new XAttribute(OpenXmlNamespaces.Word + "after", "160")));

var sut = new OpenXmlElementWriter(
new XElement(OpenXmlNamespaces.Word + "pPr"));

var paragraphFormat = new ParagraphFormat
{
HorizontalAlignment = HorizontalAlignment.Left
};

// Act
sut.Visit(paragraphFormat);

// Assert
sut.Xml
.Should()
.Be(expectedXml);
}
}
23 changes: 23 additions & 0 deletions src/Word/OfficeFlow.Word.OpenXml/OpenXmlElementReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ public void Visit(Paragraph paragraph)
public void Visit(ParagraphFormat paragraphFormat)
{
VisitHorizontalAlignment(paragraphFormat);
VisitTextAlignment(paragraphFormat);
VisitSpacing(paragraphFormat);
VisitKeepLines(paragraphFormat);
VisitKeepNext(paragraphFormat);
Expand Down Expand Up @@ -132,6 +133,28 @@ private void VisitHorizontalAlignment(ParagraphFormat paragraphFormat)
paragraphFormat.HorizontalAlignment = horizontalAlignment.Value;
}

private void VisitTextAlignment(ParagraphFormat paragraphFormat)
{
var alignmentXml = xml.Element(OpenXmlNamespaces.Word + "textAlignment")?
.Attribute(OpenXmlNamespaces.Word + "val")?
.Value;

var textAlignment = alignmentXml switch
{
"auto" => TextAlignment.Auto,
"baseline" => TextAlignment.Baseline,
"bottom" => TextAlignment.Bottom,
"center" => TextAlignment.Center,
"top" => TextAlignment.Top,
_ => default(TextAlignment?)
};

if (textAlignment is null)
return;

paragraphFormat.TextAlignment = textAlignment.Value;
}

private void VisitSpacing(ParagraphFormat paragraphFormat)
{
var spacingProperties = new Dictionary<string, Func<IParagraphSpacing, IParagraphSpacing>>
Expand Down
25 changes: 25 additions & 0 deletions src/Word/OfficeFlow.Word.OpenXml/OpenXmlElementWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ public void Visit(Paragraph paragraph)
public void Visit(ParagraphFormat paragraphFormat)
{
VisitHorizontalAlignment(paragraphFormat);
VisitTextAlignment(paragraphFormat);
VisitSpacing(paragraphFormat);
VisitKeepLines(paragraphFormat);
VisitKeepNext(paragraphFormat);
Expand Down Expand Up @@ -133,6 +134,30 @@ private void VisitHorizontalAlignment(ParagraphFormat paragraphFormat)
Xml.Add(horizontalAlignmentXml);
}

private void VisitTextAlignment(ParagraphFormat paragraphFormat)
{
if (paragraphFormat.TextAlignment is TextAlignment.Auto)
return;

var value = paragraphFormat.TextAlignment switch
{
TextAlignment.Baseline => "baseline",
TextAlignment.Bottom => "bottom",
TextAlignment.Center => "center",
TextAlignment.Top => "top",
_ => null
};

if (value is null)
return;

var textAlignmentXml = new XElement(
OpenXmlNamespaces.Word + "textAlignment",
new XAttribute(OpenXmlNamespaces.Word + "val", value));

Xml.Add(textAlignmentXml);
}

private void VisitSpacing(ParagraphFormat paragraphFormat)
{
var spacingProperties = new Dictionary<string, Func<IParagraphSpacing>>
Expand Down

0 comments on commit 7442028

Please sign in to comment.