Skip to content

Commit

Permalink
Implement KeepLines and KeepNext properties
Browse files Browse the repository at this point in the history
  • Loading branch information
y0ung3r committed Apr 26, 2024
1 parent 5ffac22 commit c9b9545
Show file tree
Hide file tree
Showing 6 changed files with 200 additions and 2 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ Implementation Dashboard
- [ ] Shading
- [ ] Outline
- [ ] Styles
- [ ] Keep lines
- [ ] Keep next
- [x] Keep lines
- [x] Keep next
- [ ] Frame
- [ ] Alignment
- [x] Horizontal
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ public static ParagraphFormat Default

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

public bool KeepLines { get; set; }

public bool KeepNext { get; set; }

/// <inheritdoc />
public void Accept(IWordVisitor visitor)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,46 @@ public void Should_read_exact_value_of_spacing_before_properly()
.Be(ParagraphSpacing.Exactly<Points>(12.0));
}

[Fact]
public void Should_read_keep_lines_properly()
{
// Arrange
var xml = new XElement(OpenXmlNamespaces.Word + "pPr",
new XElement(OpenXmlNamespaces.Word + "keepLines"));

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

// Act
sut.Visit(paragraphFormat);

// Assert
paragraphFormat
.KeepLines
.Should()
.BeTrue();
}

[Fact]
public void Should_read_keep_next_properly()
{
// Arrange
var xml = new XElement(OpenXmlNamespaces.Word + "pPr",
new XElement(OpenXmlNamespaces.Word + "keepNext"));

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

// Act
sut.Visit(paragraphFormat);

// Assert
paragraphFormat
.KeepNext
.Should()
.BeTrue();
}

[Fact]
public void Should_read_empty_paragraph_format_properly()
{
Expand Down Expand Up @@ -188,5 +228,15 @@ public void Should_read_empty_paragraph_format_properly()
.SpacingAfter
.Should()
.Be(ParagraphFormat.Default.SpacingAfter);

paragraphFormat
.KeepLines
.Should()
.BeFalse();

paragraphFormat
.KeepNext
.Should()
.BeFalse();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,112 @@ public void Should_write_exact_value_of_spacing_after_properly()
.Be(expectedXml);
}

[Fact]
public void Should_write_keep_lines_properly()
{
// 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")),
new XElement(OpenXmlNamespaces.Word + "keepLines"));

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

var paragraphFormat = new ParagraphFormat
{
KeepLines = true
};

// Act
sut.Visit(paragraphFormat);

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

[Fact]
public void Should_not_write_keep_lines()
{
// 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
{
KeepLines = false
};

// Act
sut.Visit(paragraphFormat);

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

[Fact]
public void Should_write_keep_next_properly()
{
// 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")),
new XElement(OpenXmlNamespaces.Word + "keepNext"));

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

var paragraphFormat = new ParagraphFormat
{
KeepNext = true
};

// Act
sut.Visit(paragraphFormat);

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

[Fact]
public void Should_not_write_keep_next()
{
// 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
{
KeepNext = false
};

// Act
sut.Visit(paragraphFormat);

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

[Fact]
public void Default_value_of_horizontal_alignment_should_not_be_written()
{
Expand Down
18 changes: 18 additions & 0 deletions src/Word/OfficeFlow.Word.OpenXml/OpenXmlElementReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ public void Visit(ParagraphFormat paragraphFormat)
{
VisitHorizontalAlignment(paragraphFormat);
VisitSpacing(paragraphFormat);
VisitKeepLines(paragraphFormat);
VisitKeepNext(paragraphFormat);
}

private void VisitHorizontalAlignment(ParagraphFormat paragraphFormat)
Expand Down Expand Up @@ -167,6 +169,22 @@ private void VisitSpacing(ParagraphFormat paragraphFormat)
}
}

private void VisitKeepLines(ParagraphFormat paragraphFormat)
{
var keepLinesXml =
xml.Element(OpenXmlNamespaces.Word + "keepLines");

paragraphFormat.KeepLines = keepLinesXml is not null;
}

private void VisitKeepNext(ParagraphFormat paragraphFormat)
{
var keepNextXml =
xml.Element(OpenXmlNamespaces.Word + "keepNext");

paragraphFormat.KeepNext = keepNextXml is not null;
}

/// <inheritdoc />
public void Visit(Run run)
{
Expand Down
20 changes: 20 additions & 0 deletions src/Word/OfficeFlow.Word.OpenXml/OpenXmlElementWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ public void Visit(ParagraphFormat paragraphFormat)
{
VisitHorizontalAlignment(paragraphFormat);
VisitSpacing(paragraphFormat);
VisitKeepLines(paragraphFormat);
VisitKeepNext(paragraphFormat);
}

private void VisitHorizontalAlignment(ParagraphFormat paragraphFormat)
Expand Down Expand Up @@ -168,6 +170,24 @@ private void VisitSpacing(ParagraphFormat paragraphFormat)
Xml.Add(spacingXml);
}

private void VisitKeepLines(ParagraphFormat paragraphFormat)
{
if (!paragraphFormat.KeepLines)
return;

Xml.Add(
new XElement(OpenXmlNamespaces.Word + "keepLines"));
}

private void VisitKeepNext(ParagraphFormat paragraphFormat)
{
if (!paragraphFormat.KeepNext)
return;

Xml.Add(
new XElement(OpenXmlNamespaces.Word + "keepNext"));
}

/// <inheritdoc />
public void Visit(Run run)
{
Expand Down

0 comments on commit c9b9545

Please sign in to comment.