diff --git a/OpenXmlFormats/Wordprocessing/Paragraph.cs b/OpenXmlFormats/Wordprocessing/Paragraph.cs index 3479953d4d..4f2e49db87 100644 --- a/OpenXmlFormats/Wordprocessing/Paragraph.cs +++ b/OpenXmlFormats/Wordprocessing/Paragraph.cs @@ -5021,6 +5021,39 @@ public bool IsSetHighlight() { return this.highlightField != null; } + + public bool IsSetVanish() + { + return this.vanishField != null; + } + + public CT_OnOff AddNewVanish() + { + this.vanishField = new CT_OnOff(); + return this.vanishField; + } + + public bool IsSetW() + { + return this.w!=null; + } + + public CT_TextScale AddNewW() + { + this.w=new CT_TextScale(); + return this.w; + } + + public bool IsSetEm() + { + return this.em!=null; + } + + public CT_Em AddNewEm() + { + this.em = new CT_Em(); + return this.em; + } } diff --git a/ooxml/XWPF/Usermodel/XWPFRun.cs b/ooxml/XWPF/Usermodel/XWPFRun.cs index 384ef011f8..7f3b24526f 100644 --- a/ooxml/XWPF/Usermodel/XWPFRun.cs +++ b/ooxml/XWPF/Usermodel/XWPFRun.cs @@ -16,7 +16,8 @@ limitations under the License. ==================================================================== */ namespace NPOI.XWPF.UserModel { -using Cysharp.Text; + using Cysharp.Text; + using EnumsNET; using NPOI.OpenXmlFormats.Dml; using NPOI.OpenXmlFormats.Dml.WordProcessing; using NPOI.OpenXmlFormats.Wordprocessing; @@ -891,7 +892,22 @@ public VerticalAlign Subscript ctValign.val = EnumConverter.ValueOf(value); } } - + /// + /// Get the vanish (hidden text) value + /// + public bool IsVanish + { + get + { + var pr = GetRunProperties(false); + return pr != null && pr.IsSetVanish() && IsCTOnOff(pr.vanish); + } + set { + var pr = GetRunProperties(true); + CT_OnOff vanish = pr.IsSetVanish() ? pr.vanish : pr.AddNewVanish(); + vanish.val = value; + } + } public int Kerning { get @@ -913,7 +929,7 @@ public bool IsHighlighted { get { - CT_RPr pr = run.rPr; + CT_RPr pr = GetRunProperties(false); if (pr == null || !pr.IsSetHighlight()) return false; if (pr.highlight.val == ST_HighlightColor.none) @@ -921,10 +937,115 @@ public bool IsHighlighted return true; } } - // TODO Provide a wrapper round STHighlightColor, then expose getter/setter - // for the highlight colour. Ideally also then add to CharacterRun interface + public string TextHighlightColor + { + get + { + var pr = GetRunProperties(false); + if (pr==null||!pr.IsSetHighlight()) + return null; + if (pr.highlight.val == ST_HighlightColor.none) + return null; + return pr.highlight.val.ToString(); + } + set + { + var pr = GetRunProperties(true); + CT_Highlight highlight = pr.IsSetHighlight() ? pr.highlight : pr.AddNewHighlight(); + if (value == null) + { + highlight.val = ST_HighlightColor.none; + } + else + { + highlight.val = Enums.Parse(value,true); + } + } + } + public string UnderlineColor + { + get { + var underline = GetCTUnderline(false); + if (underline?.color==null) + return "auto"; + return underline.color; + } + set { + var underline = GetCTUnderline(true); + underline.color = value.ToLower(); + } + } + public ST_Em EmphasisMark + { + get { + CT_RPr pr = GetRunProperties(false); + if(pr==null || !pr.IsSetEm()) + return ST_Em.none; + return pr.em.val; + } + set + { + CT_RPr pr = GetRunProperties(true); + var em = pr.IsSetEm() ? pr.em : pr.AddNewEm(); + em.val=value; + } + } + public int TextScale + { + get { + CT_RPr pr = GetRunProperties(false); + if(pr==null|| !pr.IsSetW()) + { + return 100; + } + return Int32.Parse(pr.w.val); + } + set { + CT_RPr pr = GetRunProperties(true); + var scale = pr.IsSetW() ? pr.w : pr.AddNewW(); + scale.val = value.ToString(); + } + } + /// + /// Get or set the vertical alignment of the run. + /// + public ST_VerticalAlignRun VerticalAlignment + { + get + { + CT_RPr pr = GetRunProperties(false); + if(pr==null || !pr.IsSetVertAlign()) + return ST_VerticalAlignRun.baseline; + return pr.vertAlign.val; + } + set + { + CT_RPr pr = GetRunProperties(true); + CT_VerticalAlignRun vertAlign = pr.IsSetVertAlign() ? pr.vertAlign : pr.AddNewVertAlign(); + vertAlign.val =value; + } + } + /// + /// Set or get the highlight color for the run + /// + public ST_HighlightColor TextHightlightColor + { + get + { + var pr = GetRunProperties(false); + if(pr==null||!pr.IsSetHighlight()) + return ST_HighlightColor.none; + return pr.highlight.val; + } + set + { + var pr = GetRunProperties(true); + CT_Highlight highlight = pr.IsSetHighlight() ? pr.highlight : pr.AddNewHighlight(); + highlight.val = value; + } + } public int CharacterSpacing { get @@ -1174,9 +1295,9 @@ public void AddTab() run.AddNewTab(); } - public void RemoveTab() + public void RemoveTab(int p) { - //TODO + run.RemoveTab(p); } /** @@ -1198,7 +1319,7 @@ public void AddCarriageReturn() public void RemoveCarriageReturn(int i) { - throw new NotImplementedException(); + run.RemoveCr(i); } XWPFPicture AddPicture(Stream pictureData, int pictureType, String filename, int width, int height, Action extAct) @@ -1439,6 +1560,24 @@ public String Lang ctLang.val = value; } } + + public string UnderlineThemeColor + { + get{ + var underline = GetCTUnderline(false); + if(underline?.themeColor==null) + return "none"; + return underline.themeColor.ToString(); + } + set{ + var underline = GetCTUnderline(true); + if (value!=null) + { + underline.themeColor = Enums.Parse(value, true); + } + } + } + protected CT_RPr GetRunProperties(bool create) { CT_RPr pr = run.IsSetRPr() ? run.rPr : null; diff --git a/testcases/ooxml/XWPF/UserModel/TestXWPFRun.cs b/testcases/ooxml/XWPF/UserModel/TestXWPFRun.cs index 1b518aaebe..ed202c1474 100644 --- a/testcases/ooxml/XWPF/UserModel/TestXWPFRun.cs +++ b/testcases/ooxml/XWPF/UserModel/TestXWPFRun.cs @@ -14,21 +14,24 @@ the License. You may obtain a copy of the License at See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ +using NUnit.Framework; +using System; + namespace TestCases.XWPF.UserModel { using NPOI.OpenXmlFormats.Wordprocessing; - using CT_Blip = NPOI.OpenXmlFormats.Dml.CT_Blip; - using CT_BlipFillProperties = NPOI.OpenXmlFormats.Dml.CT_BlipFillProperties; - using CT_Picture = NPOI.OpenXmlFormats.Dml.Picture.CT_Picture; using NPOI.Util; using NPOI.WP.UserModel; using NPOI.XWPF.Model; using NPOI.XWPF.UserModel; - using NUnit.Framework;using NUnit.Framework.Legacy; + using NUnit.Framework; + using NUnit.Framework.Legacy; using System; using System.Collections.Generic; using System.IO; - using System.Linq; + using CT_Blip = NPOI.OpenXmlFormats.Dml.CT_Blip; + using CT_BlipFillProperties = NPOI.OpenXmlFormats.Dml.CT_BlipFillProperties; + using CT_Picture = NPOI.OpenXmlFormats.Dml.Picture.CT_Picture; /** * Tests for XWPF Run @@ -68,39 +71,6 @@ public void TestSetGetText() //Assert.Fail("Position wrong"); } - /* - * bug 59208 - * Purpose: test all valid boolean-like values - * exercise isCTOnOff(CTOnOff) through all valid permutations - */ - [Ignore("stub testCTOnOff")] - public void TestCTOnOff() - { - //CTRPr rpr = ctRun.addNewRPr(); - //CTOnOff bold = rpr.addNewB(); - //XWPFRun run = new XWPFRun(ctRun, p); - - //// True values: "true", "1", "on" - //bold.setVal(STOnOff.TRUE); - //assertEquals(true, run.isBold()); - - //bold.setVal(STOnOff.X_1); - //assertEquals(true, run.isBold()); - - //bold.setVal(STOnOff.ON); - //assertEquals(true, run.isBold()); - - //// False values: "false", "0", "off" - //bold.setVal(STOnOff.FALSE); - //assertEquals(false, run.isBold()); - - //bold.setVal(STOnOff.X_0); - //assertEquals(false, run.isBold()); - - //bold.setVal(STOnOff.OFF); - //assertEquals(false, run.isBold()); - } - [Test] public void TestSetGetBold() { @@ -157,20 +127,6 @@ public void TestSetGetUnderline() } - [Test] - public void TestSetGetVAlign() - { - CT_RPr rpr = ctRun.AddNewRPr(); - rpr.AddNewVertAlign().val = (ST_VerticalAlignRun.subscript); - - XWPFRun run = new XWPFRun(ctRun, p); - ClassicAssert.AreEqual(VerticalAlign.SUBSCRIPT, run.Subscript); - - run.Subscript = (VerticalAlign.BASELINE); - ClassicAssert.AreEqual(ST_VerticalAlignRun.baseline, rpr.vertAlign.val); - } - - [Test] public void TestSetGetFontFamily() { @@ -195,7 +151,7 @@ public void TestSetGetFontSize() ClassicAssert.AreEqual(7.0, run.FontSize); run.FontSize = 24; - ClassicAssert.AreEqual(48, (int)rpr.sz.val); + ClassicAssert.AreEqual(48, (int) rpr.sz.val); run.FontSize = 24.5; ClassicAssert.AreEqual(24.5, run.FontSize); @@ -290,7 +246,7 @@ public void TestAddPageBreak() /** * Test that on an existing document, we do the * right thing with it - * @throws IOException + * @ */ [Test] public void TestExisting() @@ -435,13 +391,13 @@ public void TestPictureInHeader() int count = 0; - foreach (XWPFParagraph p in header.Paragraphs) + foreach(XWPFParagraph p in header.Paragraphs) { - foreach (XWPFRun r in p.Runs) + foreach(XWPFRun r in p.Runs) { List pictures = r.GetEmbeddedPictures(); - foreach (XWPFPicture pic in pictures) + foreach(XWPFPicture pic in pictures) { ClassicAssert.IsNotNull(pic.GetPictureData()); ClassicAssert.AreEqual("DOZOR", pic.GetDescription()); @@ -454,20 +410,6 @@ public void TestPictureInHeader() ClassicAssert.AreEqual(1, count); } - [Test] - public void testSetGetHighlight() - { - XWPFRun run = new XWPFRun(ctRun, p); - ClassicAssert.AreEqual(false, run.IsHighlighted); - - // TODO Do this using XWPFRun methods - run.GetCTR().AddNewRPr().AddNewHighlight().val = (ST_HighlightColor.none); - ClassicAssert.AreEqual(false, run.IsHighlighted); - run.GetCTR().rPr.highlight.val = (ST_HighlightColor.cyan); - ClassicAssert.AreEqual(true, run.IsHighlighted); - run.GetCTR().rPr.highlight.val = (ST_HighlightColor.none); - ClassicAssert.AreEqual(false, run.IsHighlighted); - } [Test] public void TestAddPicture() @@ -479,7 +421,7 @@ public void TestAddPicture() ClassicAssert.AreEqual(0, doc.AllPictures.Count); ClassicAssert.AreEqual(0, r.GetEmbeddedPictures().Count); - r.AddPicture(new MemoryStream(new byte[0]), (int)PictureType.JPEG, "test.jpg", 21, 32); + r.AddPicture(new MemoryStream(new byte[0]), (int) PictureType.JPEG, "test.jpg", 21, 32); ClassicAssert.AreEqual(1, doc.AllPictures.Count); ClassicAssert.AreEqual(1, r.GetEmbeddedPictures().Count); @@ -501,7 +443,7 @@ public void TestAddPictureInHeader() ClassicAssert.AreEqual(0, hdr.AllPictures.Count); ClassicAssert.AreEqual(0, r.GetEmbeddedPictures().Count); - r.AddPicture(new ByteArrayInputStream(new byte[0]), (int)PictureType.JPEG, "test.jpg", 21, 32); + r.AddPicture(new ByteArrayInputStream(new byte[0]), (int) PictureType.JPEG, "test.jpg", 21, 32); ClassicAssert.AreEqual(1, hdr.AllPictures.Count); ClassicAssert.AreEqual(1, r.GetEmbeddedPictures().Count); @@ -535,15 +477,15 @@ public void TestSetFontFamily_52288() { XWPFDocument doc = XWPFTestDataSamples.OpenSampleDocument("52288.docx"); IEnumerator paragraphs = doc.Paragraphs.GetEnumerator(); - while (paragraphs.MoveNext()) + while(paragraphs.MoveNext()) { XWPFParagraph paragraph = paragraphs.Current; - foreach (XWPFRun run in paragraph.Runs) + foreach(XWPFRun run in paragraph.Runs) { - if (run != null) + if(run != null) { String text = run.GetText(0); - if (text != null) + if(text != null) { run.FontFamily = ("Times New Roman"); } @@ -558,7 +500,7 @@ public void TestBug55476() byte[] image = XWPFTestDataSamples.GetImage("abstract1.jpg"); XWPFDocument document = new XWPFDocument(); document.CreateParagraph().CreateRun().AddPicture( - new MemoryStream(image), (int)PictureType.JPEG, "test.jpg", Units.ToEMU(300), Units.ToEMU(100)); + new MemoryStream(image), (int) PictureType.JPEG, "test.jpg", Units.ToEMU(300), Units.ToEMU(100)); XWPFDocument docBack = XWPFTestDataSamples.WriteOutAndReadBack(document); List pictures = docBack.GetParagraphArray(0).Runs[0].GetEmbeddedPictures(); ClassicAssert.AreEqual(1, pictures.Count); @@ -573,7 +515,6 @@ public void TestBug55476() } [Test] - [Ignore("TODO FIX CI TESTS")] public void TestBug58922() { XWPFDocument document = new XWPFDocument(); @@ -622,7 +563,7 @@ public void TestWhitespace() }; MemoryStream bos = new MemoryStream(); XWPFDocument doc = new XWPFDocument(); - foreach (String s in text) + foreach(String s in text) { XWPFParagraph p1 = doc.CreateParagraph(); XWPFRun r1 = p1.CreateRun(); @@ -635,7 +576,7 @@ public void TestWhitespace() var paragraphs = doc2.Paragraphs; ClassicAssert.AreEqual(2, paragraphs.Count); - for (int i = 0; i < text.Length; i++) + for(int i = 0; i < text.Length; i++) { XWPFParagraph p1 = paragraphs[i]; String expected = text[i]; @@ -653,7 +594,7 @@ public void TestWhitespace() public void TestGetNumberOfTexts() { XWPFDocument doc = new XWPFDocument(); - var p = doc.CreateParagraph(); + var p = doc.CreateParagraph(); XWPFRun run = p.CreateRun(); ClassicAssert.AreEqual(0, run.NumberOfTexts); run.SetText("TEST STRING"); @@ -676,5 +617,113 @@ public void TestSetStyleId() document.Close(); } + + [Test] + public void TestSetGetTextScale() + { + using(XWPFDocument document = new XWPFDocument()) + { + XWPFRun run = document.CreateParagraph().CreateRun(); + ClassicAssert.AreEqual(100, run.TextScale); + run.TextScale =200; + ClassicAssert.AreEqual(200, run.TextScale); + } + } + + [Test] + public void TestSetGetTextHighlightColor() + { + using(XWPFDocument document = new XWPFDocument()) + { + XWPFRun run = document.CreateParagraph().CreateRun(); + ClassicAssert.AreEqual(ST_HighlightColor.none, run.TextHightlightColor); + ClassicAssert.AreEqual(false, run.IsHighlighted); + run.TextHighlightColor = ("darkGreen"); // See 17.18.40 ST_HighlightColor (Text Highlight Colors) + ClassicAssert.AreEqual(ST_HighlightColor.darkGreen, run.TextHightlightColor); + ClassicAssert.AreEqual(true, run.IsHighlighted); + run.TextHighlightColor = ("none"); + ClassicAssert.AreEqual(false, run.IsHighlighted); + } + } + + [Test] + public void TestSetGetVanish() + { + using(XWPFDocument document = new XWPFDocument()) + { + XWPFRun run = document.CreateParagraph().CreateRun(); + ClassicAssert.AreEqual(false, run.IsVanish); + run.IsVanish = (true); + ClassicAssert.AreEqual(true, run.IsVanish); + run.IsVanish = (false); + ClassicAssert.AreEqual(false, run.IsVanish); + } + } + + [Test] + public void TestSetVerticalAlignment() + { + using(XWPFDocument document = new XWPFDocument()) + { + XWPFRun run = document.CreateParagraph().CreateRun(); + ClassicAssert.AreEqual(ST_VerticalAlignRun.baseline, run.VerticalAlignment); + run.VerticalAlignment = ST_VerticalAlignRun.subscript; + ClassicAssert.AreEqual(ST_VerticalAlignRun.subscript, run.VerticalAlignment); + run.VerticalAlignment = ST_VerticalAlignRun.superscript; + ClassicAssert.AreEqual(ST_VerticalAlignRun.superscript, run.VerticalAlignment); + } + } + + [Test] + public void TestSetGetVAlign() + { + var rpr = ctRun.AddNewRPr(); + rpr.AddNewVertAlign().val = ST_VerticalAlignRun.subscript; + + XWPFRun run = new XWPFRun(ctRun, p); + ClassicAssert.AreEqual(VerticalAlign.SUBSCRIPT, run.Subscript); + + run.Subscript =VerticalAlign.BASELINE; + ClassicAssert.AreEqual(ST_VerticalAlignRun.baseline, rpr.vertAlign.val); + } + + + [Test] + public void TestSetGetEmphasisMark() + { + using(XWPFDocument document = new XWPFDocument()) + { + XWPFRun run = document.CreateParagraph().CreateRun(); + ClassicAssert.AreEqual(ST_Em.none, run.EmphasisMark); + run.EmphasisMark = ST_Em.dot; + ClassicAssert.AreEqual(ST_Em.dot, run.EmphasisMark); + } + } + + [Test] + public void TestSetGetUnderlineColor() + { + XWPFDocument document = new XWPFDocument(); + XWPFRun run = document.CreateParagraph().CreateRun(); + ClassicAssert.AreEqual("auto", run.UnderlineColor); + String colorRgb = "C0F1a2"; + run.UnderlineColor = (colorRgb); + ClassicAssert.AreEqual(colorRgb.ToLower(), run.UnderlineColor); + run.UnderlineColor = ("auto"); + ClassicAssert.AreEqual("auto", run.UnderlineColor); + } + + [Test] + public void TestSetGetUnderlineThemeColor() + { + XWPFDocument document = new XWPFDocument(); + XWPFRun run = document.CreateParagraph().CreateRun(); + ClassicAssert.AreEqual("none", run.UnderlineThemeColor); + String colorName = "accent4"; + run.UnderlineThemeColor = (colorName); + ClassicAssert.AreEqual(colorName, run.UnderlineThemeColor); + run.UnderlineThemeColor =("none"); + ClassicAssert.AreEqual("none", run.UnderlineThemeColor); + } } }