From f54b2dd5df025850332213d2cb0ac0c7f38c0009 Mon Sep 17 00:00:00 2001 From: vderyushev Date: Tue, 30 Apr 2024 18:41:21 +0300 Subject: [PATCH 01/33] Updated examples --- .../ApiExamples/ApiExamples.csproj | 3 +- Examples/ApiExamples/ApiExamples/ExCharts.cs | 111 ++++++++++++++++++ .../ApiExamples/ApiExamples/ExDocument.cs | 12 ++ .../ApiExamples/ApiExamples/ExFieldOptions.cs | 2 +- Examples/ApiExamples/ApiExamples/ExFont.cs | 1 - .../ApiExamples/ExHtmlSaveOptions.cs | 2 +- .../ApiExamples/ExReportingEngine.cs | 23 ++++ Examples/ApiExamples/ApiExamples/ExShape.cs | 70 +++++++++++ .../ApiExamples/ExSvgSaveOptions.cs | 18 +++ Examples/Data/Combo chart.docx | Bin 0 -> 27017 bytes ...ortingEngine.SourseListNumbering Gold.docx | Bin 0 -> 8322 bytes Examples/Data/Rounded rectangle shape.docx | Bin 0 -> 15354 bytes .../DocsExamples/DocsExamples.csproj | 4 +- 13 files changed, 240 insertions(+), 6 deletions(-) create mode 100644 Examples/Data/Combo chart.docx create mode 100644 Examples/Data/Golds/ReportingEngine.SourseListNumbering Gold.docx create mode 100644 Examples/Data/Rounded rectangle shape.docx diff --git a/Examples/ApiExamples/ApiExamples/ApiExamples.csproj b/Examples/ApiExamples/ApiExamples/ApiExamples.csproj index aca616163..ff0f4c1bd 100644 --- a/Examples/ApiExamples/ApiExamples/ApiExamples.csproj +++ b/Examples/ApiExamples/ApiExamples/ApiExamples.csproj @@ -128,7 +128,7 @@ - + @@ -138,6 +138,7 @@ all runtime; build; native; contentfiles; analyzers + diff --git a/Examples/ApiExamples/ApiExamples/ExCharts.cs b/Examples/ApiExamples/ApiExamples/ExCharts.cs index f1e8000de..4c7ace795 100644 --- a/Examples/ApiExamples/ApiExamples/ExCharts.cs +++ b/Examples/ApiExamples/ApiExamples/ExCharts.cs @@ -1766,5 +1766,116 @@ public void ChartFormat() Assert.AreEqual(Color.LightGoldenrodYellow.ToArgb(), chart.AxisX.Title.Format.Fill.Color.ToArgb()); Assert.AreEqual(Color.LightGoldenrodYellow.ToArgb(), chart.Legend.Format.Fill.Color.ToArgb()); } + + [Test] + public void SecondaryAxis() + { + //ExStart:SecondaryAxis + //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:ChartSeriesGroup + //ExFor:ChartSeriesGroup.AxisGroup + //ExFor:ChartSeriesGroup.AxisX + //ExFor:ChartSeriesGroup.AxisY + //ExFor:ChartSeriesGroup.Series + //ExFor:ChartSeriesGroupCollection.Add(ChartSeriesType) + //ExFor:AxisGroup + //ExSummary:Shows how to work with the secondary axis of chart. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + Shape shape = builder.InsertChart(ChartType.Line, 450, 250); + Chart chart = shape.Chart; + ChartSeriesCollection series = chart.Series; + + // Delete default generated series. + series.Clear(); + + string[] categories = new string[] { "Category 1", "Category 2", "Category 3" }; + series.Add("Series 1 of primary series group", categories, new double[] { 2, 3, 4 }); + series.Add("Series 2 of primary series group", categories, new double[] { 5, 2, 3 }); + + // Create an additional series group, also of the line type. + ChartSeriesGroup newSeriesGroup = chart.SeriesGroups.Add(ChartSeriesType.Line); + // Specify the use of secondary axes for the new series group. + newSeriesGroup.AxisGroup = AxisGroup.Secondary; + // Hide the secondary X axis. + newSeriesGroup.AxisX.Hidden = true; + // Define title of the secondary Y axis. + newSeriesGroup.AxisY.Title.Show = true; + newSeriesGroup.AxisY.Title.Text = "Secondary Y axis"; + + // Add a series to the new series group. + ChartSeries series3 = + newSeriesGroup.Series.Add("Series of secondary series group", categories, new double[] { 13, 11, 16 }); + series3.Format.Stroke.Weight = 3.5; + + doc.Save(ArtifactsDir + "Charts.SecondaryAxis.docx"); + //ExEnd:SecondaryAxis + } + + [Test] + public void ConfigureGapOverlap() + { + //ExStart:ConfigureGapOverlap + //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:ChartSeriesGroup.GapWidth + //ExFor:ChartSeriesGroup.Overlap + //ExSummary:Show how to configure gap width and overlap. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + Shape shape = builder.InsertChart(ChartType.Column, 450, 250); + ChartSeriesGroup seriesGroup = shape.Chart.SeriesGroups[0]; + + // Set column gap width and overlap. + seriesGroup.GapWidth = 450; + seriesGroup.Overlap = -75; + + doc.Save(ArtifactsDir + "Charts.ConfigureGapOverlap.docx"); + //ExEnd:ConfigureGapOverlap + } + + [Test] + public void BubbleScale() + { + //ExStart:BubbleScale + //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:ChartSeriesGroup.BubbleScale + //ExSummary:Show how to set size of the bubbles. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Insert a bubble 3D chart. + Shape shape = builder.InsertChart(ChartType.Bubble3D, 450, 250); + ChartSeriesGroup seriesGroup = shape.Chart.SeriesGroups[0]; + + // Set bubble scale to 200%. + seriesGroup.BubbleScale = 200; + + doc.Save(ArtifactsDir + "Charts.BubbleScale.docx"); + //ExEnd:BubbleScale + } + + [Test] + public void RemoveSecondaryAxis() + { + //ExStart:RemoveSecondaryAxis + //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:ChartSeriesGroupCollection.Count + //ExFor:ChartSeriesGroupCollection.Item(Int32) + //ExFor:ChartSeriesGroupCollection.RemoveAt(Int32) + //ExSummary:Show how to remove secondary axis. + Document doc = new Document(MyDir + "Combo chart.docx"); + + Shape shape = (Shape)doc.GetChild(NodeType.Shape, 0, true); + Chart chart = shape.Chart; + ChartSeriesGroupCollection seriesGroups = chart.SeriesGroups; + + // Find secondary axis and remove from the collection. + for (int i = 0; i < seriesGroups.Count; i++) + if (seriesGroups[i].AxisGroup == AxisGroup.Secondary) + seriesGroups.RemoveAt(i); + //ExEnd:RemoveSecondaryAxis + } } } diff --git a/Examples/ApiExamples/ApiExamples/ExDocument.cs b/Examples/ApiExamples/ApiExamples/ExDocument.cs index de9d2abc3..cd2698b74 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocument.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocument.cs @@ -3092,5 +3092,17 @@ public void SaveDocumentToStream(SaveFormat saveFormat) doc.Save(stream, saveFormat); } } + + [Test] + public void HasMacros() + { + //ExStart:HasMacros + //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:FileFormatInfo.HasMacros + //ExSummary:Shows how to check VBA macro presence without loading document. + FileFormatInfo fileFormatInfo = FileFormatUtil.DetectFileFormat(MyDir + "Macro.docm"); + Assert.IsTrue(fileFormatInfo.HasMacros); + //ExEnd:HasMacros + } } } diff --git a/Examples/ApiExamples/ApiExamples/ExFieldOptions.cs b/Examples/ApiExamples/ApiExamples/ExFieldOptions.cs index 42b8d3a43..08faa8fee 100644 --- a/Examples/ApiExamples/ApiExamples/ExFieldOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExFieldOptions.cs @@ -298,7 +298,7 @@ public void UseInvariantCultureNumberFormat() // Sometimes, fields may not format their numbers correctly under certain cultures. Assert.IsFalse(doc.FieldOptions.UseInvariantCultureNumberFormat); - Assert.AreEqual("$1234567,89 . ", field.Result); + Assert.AreEqual("$1.234.567,89 , ", field.Result); // To fix this, we could change the culture for the entire thread. // Another way to fix this is to set this flag, diff --git a/Examples/ApiExamples/ApiExamples/ExFont.cs b/Examples/ApiExamples/ApiExamples/ExFont.cs index 6c4b0b687..8e23d9bb2 100644 --- a/Examples/ApiExamples/ApiExamples/ExFont.cs +++ b/Examples/ApiExamples/ApiExamples/ExFont.cs @@ -781,7 +781,6 @@ public void Bidi() Assert.AreEqual(1033, run.Font.LocaleId); Assert.AreEqual(16, run.Font.Size); - Assert.AreEqual("Courier New", run.Font.Name); Assert.False(run.Font.Italic); Assert.False(run.Font.Bold); Assert.AreEqual(1025, run.Font.LocaleIdBi); diff --git a/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs index 0ea4dddeb..487d00631 100644 --- a/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs @@ -783,7 +783,7 @@ public void HtmlVersions(HtmlVersion htmlVersion) case HtmlVersion.Html5: Assert.True(outDocContents.Contains("")); Assert.True(outDocContents.Contains("")); - Assert.True(outDocContents.Contains("")); + Assert.True(outDocContents.Contains("
")); break; case HtmlVersion.Xhtml: Assert.True(outDocContents.Contains("")); diff --git a/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs b/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs index e79cc8615..18af81091 100644 --- a/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs +++ b/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs @@ -373,6 +373,29 @@ public void InsertDocumentDynamicallyTrimLastParagraph() Assert.AreEqual(1, template.FirstSection.Body.Paragraphs.Count); } + [Test] + public void SourseListNumbering() + { + //ExStart:SourseListNumbering + //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:ReportingEngine.BuildReport(Document, Object[], String[]) + //ExSummary:Shows how to keep inserted numbering as is. + // By default, numbered lists from a template document are continued when their identifiers match those from a document being inserted. + // With "-sourceNumbering" numbering should be separated and kept as is. + Document template = DocumentHelper.CreateSimpleDocument("<>" + Environment.NewLine + "<>"); + + DocumentTestClass doc = new DocumentTestBuilder() + .WithDocument(new Document(MyDir + "List item.docx")).Build(); + + ReportingEngine engine = new ReportingEngine() { Options = ReportBuildOptions.RemoveEmptyParagraphs }; + engine.BuildReport(template, new object[] { doc }, new[] { "src" }); + + template.Save(ArtifactsDir + "ReportingEngine.SourseListNumbering.docx"); + //ExEnd:SourseListNumbering + + Assert.IsTrue(DocumentHelper.CompareDocs(ArtifactsDir + "ReportingEngine.SourseListNumbering.docx", GoldsDir + "ReportingEngine.SourseListNumbering Gold.docx")); + } + [Test] public void InsertDocumentDynamicallyByStream() { diff --git a/Examples/ApiExamples/ApiExamples/ExShape.cs b/Examples/ApiExamples/ApiExamples/ExShape.cs index f6439ce05..627a4dde3 100644 --- a/Examples/ApiExamples/ApiExamples/ExShape.cs +++ b/Examples/ApiExamples/ApiExamples/ExShape.cs @@ -25,6 +25,7 @@ using HorizontalAlignment = Aspose.Words.Drawing.HorizontalAlignment; using TextBox = Aspose.Words.Drawing.TextBox; using Aspose.Words.Themes; +using Aspose.Words.Model.Drawing; namespace ApiExamples { @@ -3180,5 +3181,74 @@ public void Reflection() Assert.AreEqual(0, shape.Reflection.Distance); //ExEnd:Reflection } + + [Test] + public void SoftEdge() + { + //ExStart:SoftEdge + //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:ShapeBase.SoftEdge + //ExFor:SoftEdgeFormat.Radius + //ExFor:SoftEdgeFormat.Remove + //ExSummary:Shows how to work with soft edge formatting. + DocumentBuilder builder = new DocumentBuilder(); + Shape shape = builder.InsertShape(ShapeType.Rectangle, 200, 200); + + // Apply soft edge to the shape. + shape.SoftEdge.Radius = 30; + + builder.Document.Save(ArtifactsDir + "Shape.SoftEdge.docx"); + + // Load document with rectangle shape with soft edge. + Document doc = new Document(ArtifactsDir + "Shape.SoftEdge.docx"); + shape = (Shape)doc.GetChild(NodeType.Shape, 0, true); + + // Check soft edge radius. + Assert.AreEqual(30, shape.SoftEdge.Radius); + + // Remove soft edge from the shape. + shape.SoftEdge.Remove(); + + // Check radius of the removed soft edge. + Assert.AreEqual(0, shape.SoftEdge.Radius); + //ExEnd:SoftEdge + } + + [Test] + public void Adjustments() + { + //ExStart:Adjustments + //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:Shape.Adjustments + //ExFor:AdjustmentCollection + //ExFor:Adjustment + //ExFor:Adjustment.Name + //ExFor:Adjustment.Value + //ExSummary:Shows how to work with adjustment raw values. + Document doc = new Document(MyDir + "Rounded rectangle shape.docx"); + Shape shape = (Shape)doc.GetChild(NodeType.Shape, 0, true); + + AdjustmentCollection adjustments = shape.Adjustments; + Assert.AreEqual(1, adjustments.Count); + + Adjustment adjustment = adjustments[0]; + Assert.AreEqual("adj", adjustment.Name); + Assert.AreEqual(16667, adjustment.Value); + + adjustment.Value = 30000; + + doc.Save(ArtifactsDir + "Shape.Adjustments.docx"); + //ExEnd:Adjustments + + doc = new Document(ArtifactsDir + "Shape.Adjustments.docx"); + shape = (Shape)doc.GetChild(NodeType.Shape, 0, true); + + adjustments = shape.Adjustments; + Assert.AreEqual(1, adjustments.Count); + + adjustment = adjustments[0]; + Assert.AreEqual("adj", adjustment.Name); + Assert.AreEqual(30000, adjustment.Value); + } } } diff --git a/Examples/ApiExamples/ApiExamples/ExSvgSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExSvgSaveOptions.cs index 16f5b9628..21999c2d9 100644 --- a/Examples/ApiExamples/ApiExamples/ExSvgSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExSvgSaveOptions.cs @@ -101,5 +101,23 @@ public void SaveOfficeMath() math.GetMathRenderer().Save(ArtifactsDir + "SvgSaveOptions.Output.svg", options); //ExEnd:SaveOfficeMath } + + [Test] + public void MaxImageResolution() + { + //ExStart:MaxImageResolution + //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:ShapeBase.SoftEdge + //ExFor:SoftEdgeFormat.Radius + //ExFor:SoftEdgeFormat.Remove + //ExSummary:Shows how to set limit for image resolution. + Document doc = new Document(MyDir + "Rendering.docx"); + + SvgSaveOptions saveOptions = new SvgSaveOptions(); + saveOptions.MaxImageResolution = 72; + + doc.Save(ArtifactsDir + "SvgSaveOptions.MaxImageResolution.svg", saveOptions); + //ExEnd:MaxImageResolution + } } } diff --git a/Examples/Data/Combo chart.docx b/Examples/Data/Combo chart.docx new file mode 100644 index 0000000000000000000000000000000000000000..e6ad9c51f904797cbc037c4097df982d1ce6bd94 GIT binary patch literal 27017 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

x1ODGEYdty!i(Vis4gJk}UCdowVX^D- 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 literal 0 HcmV?d00001 diff --git a/Examples/Data/Rounded rectangle shape.docx b/Examples/Data/Rounded rectangle shape.docx new file mode 100644 index 0000000000000000000000000000000000000000..96e93dc8655936533072407ff5fac292c0cdaf31 GIT binary patch literal 15354 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 A%m4rY literal 0 HcmV?d00001 diff --git a/Examples/DocsExamples/DocsExamples/DocsExamples.csproj b/Examples/DocsExamples/DocsExamples/DocsExamples.csproj index d83e6f725..2caba3a8f 100644 --- a/Examples/DocsExamples/DocsExamples/DocsExamples.csproj +++ b/Examples/DocsExamples/DocsExamples/DocsExamples.csproj @@ -118,8 +118,8 @@ - - + + From 5395c1f597a2fe21e438a9615bb2e87a18954b12 Mon Sep 17 00:00:00 2001 From: vderyushev Date: Wed, 15 May 2024 15:32:46 +0300 Subject: [PATCH 02/33] Fixed tests --- Examples/ApiExamples/ApiExamples/ExChmLoadOptions.cs | 1 + Examples/ApiExamples/ApiExamples/ExMarkdownSaveOptions.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/Examples/ApiExamples/ApiExamples/ExChmLoadOptions.cs b/Examples/ApiExamples/ApiExamples/ExChmLoadOptions.cs index 8d53dd7af..7834c2a27 100644 --- a/Examples/ApiExamples/ApiExamples/ExChmLoadOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExChmLoadOptions.cs @@ -12,6 +12,7 @@ namespace ApiExamples { + [TestFixture] public class ExChmLoadOptions : ApiExampleBase { [Test] // ToDo: Need to add tests. diff --git a/Examples/ApiExamples/ApiExamples/ExMarkdownSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExMarkdownSaveOptions.cs index cea045ccc..f3058b9a6 100644 --- a/Examples/ApiExamples/ApiExamples/ExMarkdownSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExMarkdownSaveOptions.cs @@ -12,6 +12,7 @@ namespace ApiExamples { + [TestFixture] class ExMarkdownSaveOptions : ApiExampleBase { [TestCase(TableContentAlignment.Left)] From d2d83d296adcce241e4ef219b1403a28fca4de4d Mon Sep 17 00:00:00 2001 From: vderyushev Date: Tue, 4 Jun 2024 13:06:57 +0300 Subject: [PATCH 03/33] Updated API examples --- Examples/ApiExamples/ApiExamples/ExCharts.cs | 279 +++++++++++ Examples/ApiExamples/ApiExamples/ExComment.cs | 25 + .../ApiExamples/ApiExamples/ExDocument.cs | 451 ++---------------- .../ApiExamples/ExHtmlSaveOptions.cs | 8 +- .../ApiExamples/ExReportingEngine.cs | 38 +- .../ApiExamples/ApiExamples/ExRevision.cs | 398 +++++++++++++++- Examples/ApiExamples/ApiExamples/ExShape.cs | 31 +- Examples/Data/Document with SDT 1.docx | Bin 0 -> 46065 bytes Examples/Data/Document with SDT 2.docx | Bin 0 -> 21878 bytes ...ne.SelectiveDeletionOfParagraphs Gold.docx | Bin 0 -> 10657 bytes ...emplate - Selective remove paragraphs.docx | Bin 0 -> 15228 bytes Examples/Data/Shadow color.docx | Bin 0 -> 15840 bytes 12 files changed, 798 insertions(+), 432 deletions(-) create mode 100644 Examples/Data/Document with SDT 1.docx create mode 100644 Examples/Data/Document with SDT 2.docx create mode 100644 Examples/Data/Golds/ReportingEngine.SelectiveDeletionOfParagraphs Gold.docx create mode 100644 Examples/Data/Reporting engine template - Selective remove paragraphs.docx create mode 100644 Examples/Data/Shadow color.docx diff --git a/Examples/ApiExamples/ApiExamples/ExCharts.cs b/Examples/ApiExamples/ApiExamples/ExCharts.cs index 4c7ace795..d7cf3f77b 100644 --- a/Examples/ApiExamples/ApiExamples/ExCharts.cs +++ b/Examples/ApiExamples/ApiExamples/ExCharts.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Globalization; using System.Linq; namespace ApiExamples @@ -1877,5 +1878,283 @@ public void RemoveSecondaryAxis() seriesGroups.RemoveAt(i); //ExEnd:RemoveSecondaryAxis } + + [Test] + public void TreemapChart() + { + //ExStart:TreemapChart + //ReleaseVersion:24.6 + //ExFor:ChartSeriesCollection.Add(String, ChartMultilevelValue[], double[]) + //ExFor:ChartMultilevelValue(String, String) + //ExSummary:Shows how to create treemap chart. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Insert a Treemap chart. + Shape shape = builder.InsertChart(ChartType.Treemap, 450, 280); + Chart chart = shape.Chart; + chart.Title.Text = "World Population"; + + // Delete default generated series. + chart.Series.Clear(); + + // Add a series. + ChartSeries series = chart.Series.Add( + "Population by Region", + new ChartMultilevelValue[] + { + new ChartMultilevelValue("Asia", "China"), + new ChartMultilevelValue("Asia", "India"), + new ChartMultilevelValue("Asia", "Indonesia"), + new ChartMultilevelValue("Asia", "Pakistan"), + new ChartMultilevelValue("Asia", "Bangladesh"), + new ChartMultilevelValue("Asia", "Japan"), + new ChartMultilevelValue("Asia", "Philippines"), + new ChartMultilevelValue("Asia", "Other"), + new ChartMultilevelValue("Africa", "Nigeria"), + new ChartMultilevelValue("Africa", "Ethiopia"), + new ChartMultilevelValue("Africa", "Egypt"), + new ChartMultilevelValue("Africa", "Other"), + new ChartMultilevelValue("Europe", "Russia"), + new ChartMultilevelValue("Europe", "Germany"), + new ChartMultilevelValue("Europe", "Other"), + new ChartMultilevelValue("Latin America", "Brazil"), + new ChartMultilevelValue("Latin America", "Mexico"), + new ChartMultilevelValue("Latin America", "Other"), + new ChartMultilevelValue("Northern America", "United States"), + new ChartMultilevelValue("Northern America", "Other"), + new ChartMultilevelValue("Oceania") + }, + new double[] + { + 1409670000, 1400744000, 279118866, 241499431, 169828911, 123930000, 112892781, 764000000, + 223800000, 107334000, 105914499, 903000000, + 146150789, 84607016, 516000000, + 203080756, 129713690, 310000000, + 335893238, 35000000, + 42000000 + }); + + // Show data labels. + series.HasDataLabels = true; + series.DataLabels.ShowValue = true; + series.DataLabels.ShowCategoryName = true; + string thousandSeparator = CultureInfo.CurrentCulture.NumberFormat.CurrencyGroupSeparator; + series.DataLabels.NumberFormat.FormatCode = $"#{thousandSeparator}0"; + + doc.Save(ArtifactsDir + "Charts.Treemap.docx"); + //ExEnd:TreemapChart + } + + [Test] + public void SunburstChart() + { + //ExStart:SunburstChart + //ReleaseVersion:24.6 + //ExFor:ChartSeriesCollection.Add(String, ChartMultilevelValue[], double[]) + //ExSummary:Shows how to create sunburst chart. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Insert a Sunburst chart. + Shape shape = builder.InsertChart(ChartType.Sunburst, 450, 450); + Chart chart = shape.Chart; + chart.Title.Text = "Sales"; + + // Delete default generated series. + chart.Series.Clear(); + + // Add a series. + ChartSeries series = chart.Series.Add( + "Sales", + new ChartMultilevelValue[] + { + new ChartMultilevelValue("Sales - Europe", "UK", "London Dep."), + new ChartMultilevelValue("Sales - Europe", "UK", "Liverpool Dep."), + new ChartMultilevelValue("Sales - Europe", "UK", "Manchester Dep."), + new ChartMultilevelValue("Sales - Europe", "France", "Paris Dep."), + new ChartMultilevelValue("Sales - Europe", "France", "Lyon Dep."), + new ChartMultilevelValue("Sales - NA", "USA", "Denver Dep."), + new ChartMultilevelValue("Sales - NA", "USA", "Seattle Dep."), + new ChartMultilevelValue("Sales - NA", "USA", "Detroit Dep."), + new ChartMultilevelValue("Sales - NA", "USA", "Houston Dep."), + new ChartMultilevelValue("Sales - NA", "Canada", "Toronto Dep."), + new ChartMultilevelValue("Sales - NA", "Canada", "Montreal Dep."), + new ChartMultilevelValue("Sales - Oceania", "Australia", "Sydney Dep."), + new ChartMultilevelValue("Sales - Oceania", "New Zealand", "Auckland Dep.") + }, + new double[] { 1236, 851, 536, 468, 179, 527, 799, 1148, 921, 457, 482, 761, 694 }); + + // Show data labels. + series.HasDataLabels = true; + series.DataLabels.ShowValue = false; + series.DataLabels.ShowCategoryName = true; + + doc.Save(ArtifactsDir + "Charts.Sunburst.docx"); + //ExEnd:SunburstChart + } + + public void HistogramChart() + { + //ExStart:HistogramChart + //ReleaseVersion:24.6 + //ExFor:ChartSeriesCollection.Add(String, double[]) + //ExSummary:Shows how to create histogram chart. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Insert a Histogram chart. + Shape shape = builder.InsertChart(ChartType.Histogram, 450, 450); + Chart chart = shape.Chart; + chart.Title.Text = "Avg Temperature since 1991"; + + // Delete default generated series. + chart.Series.Clear(); + + // Add a series. + chart.Series.Add( + "Avg Temperature", + new double[] + { + 51.8, 53.6, 50.3, 54.7, 53.9, 54.3, 53.4, 52.9, 53.3, 53.7, 53.8, 52.0, 55.0, 52.1, 53.4, + 53.8, 53.8, 51.9, 52.1, 52.7, 51.8, 56.6, 53.3, 55.6, 56.3, 56.2, 56.1, 56.2, 53.6, 55.7, + 56.3, 55.9, 55.6 + }); + + doc.Save(ArtifactsDir + "Charts.Histogram.docx"); + //ExEnd:HistogramChart + } + + public void ParetoChart() + { + //ExStart:ParetoChart + //ReleaseVersion:24.6 + //ExFor:ChartSeriesCollection.Add(String, String[], double[]) + //ExSummary:Shows how to create pareto chart. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Insert a Pareto chart. + Shape shape = builder.InsertChart(ChartType.Pareto, 450, 450); + Chart chart = shape.Chart; + chart.Title.Text = "Best-Selling Car"; + + // Delete default generated series. + chart.Series.Clear(); + + // Add a series. + chart.Series.Add( + "Best-Selling Car", + new string[] { "Tesla Model Y", "Toyota Corolla", "Toyota RAV4", "Ford F-Series", "Honda CR-V" }, + new double[] { 1.43, 0.91, 1.17, 0.98, 0.85 }); + + doc.Save(ArtifactsDir + "Charts.Pareto.docx"); + //ExEnd:ParetoChart + } + + public void BoxAndWhiskerChart() + { + //ExStart:BoxAndWhiskerChart + //ReleaseVersion:24.6 + //ExFor:ChartSeriesCollection.Add(String, String[], double[]) + //ExSummary:Shows how to create box and whisker chart. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Insert a Box & Whisker chart. + Shape shape = builder.InsertChart(ChartType.BoxAndWhisker, 450, 450); + Chart chart = shape.Chart; + chart.Title.Text = "Points by Years"; + + // Delete default generated series. + chart.Series.Clear(); + + // Add a series. + ChartSeries series = chart.Series.Add( + "Points by Years", + new string[] + { + "WC", "WC", "WC", "WC", "WC", "WC", "WC", "WC", "WC", "WC", + "NR", "NR", "NR", "NR", "NR", "NR", "NR", "NR", "NR", "NR", + "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA" + }, + new double[] + { + 91, 80, 100, 77, 90, 104, 105, 118, 120, 101, + 114, 107, 110, 60, 79, 78, 77, 102, 101, 113, + 94, 93, 84, 71, 80, 103, 80, 94, 100, 101 + }); + + // Show data labels. + series.HasDataLabels = true; + + doc.Save(ArtifactsDir + "Charts.BoxAndWhisker.docx"); + //ExEnd:BoxAndWhiskerChart + } + + [Test] + public void WaterfallChart() + { + //ExStart:WaterfallChart + //ReleaseVersion:24.6 + //ExFor:ChartSeriesCollection.Add(String, String[], double[], bool[]) + //ExSummary:Shows how to create waterfall chart. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Insert a Waterfall chart. + Shape shape = builder.InsertChart(ChartType.Waterfall, 450, 450); + Chart chart = shape.Chart; + chart.Title.Text = "New Zealand GDP"; + + // Delete default generated series. + chart.Series.Clear(); + + // Add a series. + ChartSeries series = chart.Series.Add( + "New Zealand GDP", + new string[] { "2018", "2019 growth", "2020 growth", "2020", "2021 growth", "2022 growth", "2022" }, + new double[] { 100, 0.57, -0.25, 100.32, 20.22, -2.92, 117.62 }, + new bool[] { true, false, false, true, false, false, true }); + + // Show data labels. + series.HasDataLabels = true; + + doc.Save(ArtifactsDir + "Charts.Waterfall.docx"); + //ExEnd:WaterfallChart + } + + [Test] + public void FunnelChart() + { + //ExStart:FunnelChart + //ReleaseVersion:24.6 + //ExFor:ChartSeriesCollection.Add(String, String[], double[]) + //ExSummary:Shows how to create funnel chart. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Insert a Funnel chart. + Shape shape = builder.InsertChart(ChartType.Funnel, 450, 450); + Chart chart = shape.Chart; + chart.Title.Text = "Population by Age Group"; + + // Delete default generated series. + chart.Series.Clear(); + + // Add a series. + ChartSeries series = chart.Series.Add( + "Population by Age Group", + new string[] { "0-9", "10-19", "20-29", "30-39", "40-49", "50-59", "60-69", "70-79", "80-89", "90-" }, + new double[] { 0.121, 0.128, 0.132, 0.146, 0.124, 0.124, 0.111, 0.075, 0.032, 0.007 }); + + // Show data labels. + series.HasDataLabels = true; + string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator; + series.DataLabels.NumberFormat.FormatCode = $"0{decimalSeparator}0%"; + + doc.Save(ArtifactsDir + "Charts.Funnel.docx"); + //ExEnd:FunnelChart + } } } diff --git a/Examples/ApiExamples/ApiExamples/ExComment.cs b/Examples/ApiExamples/ApiExamples/ExComment.cs index 665fd0631..18ede3311 100644 --- a/Examples/ApiExamples/ApiExamples/ExComment.cs +++ b/Examples/ApiExamples/ApiExamples/ExComment.cs @@ -334,5 +334,30 @@ private void IndentAndAppendLine(string text) private readonly StringBuilder mBuilder; } //ExEnd + + [Test] + public void UtcDateTime() + { + //ExStart:UtcDateTime + //ReleaseVersion:24.6 + //ExFor:Comment.DateTimeUtc + //ExSummary:Shows how to get UTC date and time. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + DateTime dateTime = DateTime.Now; + Comment comment = new Comment(doc, "John Doe", "J.D.", dateTime); + comment.SetText("My comment."); + + builder.CurrentParagraph.AppendChild(comment); + + doc.Save(ArtifactsDir + "Comment.UtcDateTime.docx"); + doc = new Document(ArtifactsDir + "Comment.UtcDateTime.docx"); + + comment = (Comment)doc.GetChild(NodeType.Comment, 0, true); + // By default DateTimeUtc without millisaconds. + Assert.AreEqual(dateTime.ToUniversalTime().ToString("yyyy-MM-dd hh:mm:ss"), comment.DateTimeUtc.ToString("yyyy-MM-dd hh:mm:ss")); + //ExEnd:UtcDateTime + } } } \ No newline at end of file diff --git a/Examples/ApiExamples/ApiExamples/ExDocument.cs b/Examples/ApiExamples/ApiExamples/ExDocument.cs index cd2698b74..b7f494bc2 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocument.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocument.cs @@ -16,7 +16,6 @@ using System.Text; using System.Text.RegularExpressions; using Aspose.Words; -using Aspose.Words.Comparing; using Aspose.Words.DigitalSignatures; using Aspose.Words.Drawing; using Aspose.Words.Fields; @@ -40,8 +39,6 @@ using Aspose.Words.Settings; using Aspose.Pdf.Text; using Aspose.Words.Shaping.HarfBuzz; -using System.Net.Http; -using System.Threading.Tasks; #if NET5_0_OR_GREATER || __MOBILE__ using SkiaSharp; #endif @@ -312,11 +309,12 @@ public void PdfRenderer(string docName, string format) break; case "PNG": - options = new PdfFixedOptions() { - PageIndex = 0, - PageCount = 2, - JpegQuality = 50, - ImageFormat = FixedImageFormat.Png + options = new PdfFixedOptions() + { + PageIndex = 0, + PageCount = 2, + JpegQuality = 50, + ImageFormat = FixedImageFormat.Png }; SaveTo(pdfRenderer, docName, options, "png"); AssertResult("png"); @@ -389,7 +387,7 @@ private void AssertResult(string fileExt) .Where(path => reg.IsMatch(path)) .ToList(); - if(fileExt == "png") + if (fileExt == "png") Assert.AreEqual(2, images.Count); else Assert.AreEqual(5, images.Count); @@ -636,7 +634,7 @@ void INodeChangingCallback.NodeInserted(NodeChangingArgs args) if (args.Node.NodeType == NodeType.Run) { - Aspose.Words.Font font = ((Run) args.Node).Font; + Aspose.Words.Font font = ((Run)args.Node).Font; mLog.Append($"\tFont:\tChanged from \"{font.Name}\" {font.Size}pt"); font.Size = 24; @@ -863,7 +861,7 @@ public void ValidateIndividualDocumentSignatures() foreach (DigitalSignature signature in doc.DigitalSignatures) { Console.WriteLine($"{(signature.IsValid ? "Valid" : "Invalid")} signature: "); - Console.WriteLine($"\tReason:\t{signature.Comments}"); + Console.WriteLine($"\tReason:\t{signature.Comments}"); Console.WriteLine($"\tType:\t{signature.SignatureType}"); Console.WriteLine($"\tSign time:\t{signature.SignTime}"); Console.WriteLine($"\tSubject name:\t{signature.CertificateHolder.Certificate.SubjectName}"); @@ -909,7 +907,7 @@ public void DigitalSignature() // There are two ways of saving a signed copy of a document to the local file system: // 1 - Designate a document by a local system filename and save a signed copy at a location specified by another filename. SignOptions signOptions = new SignOptions { SignTime = DateTime.Now }; - DigitalSignatureUtil.Sign(MyDir + "Document.docx", ArtifactsDir + "Document.DigitalSignature.docx", + DigitalSignatureUtil.Sign(MyDir + "Document.docx", ArtifactsDir + "Document.DigitalSignature.docx", certificateHolder, signOptions); Assert.True(FileFormatUtil.DetectFileFormat(ArtifactsDir + "Document.DigitalSignature.docx").HasDigitalSignature); @@ -1052,7 +1050,7 @@ public void CloneDocument() // but with a unique copy of each of the original document's nodes. Document clone = doc.Clone(); - Assert.AreEqual(doc.FirstSection.Body.FirstParagraph.Runs[0].GetText(), + Assert.AreEqual(doc.FirstSection.Body.FirstParagraph.Runs[0].GetText(), clone.FirstSection.Body.FirstParagraph.Runs[0].Text); Assert.AreNotEqual(doc.FirstSection.Body.FirstParagraph.Runs[0].GetHashCode(), clone.FirstSection.Body.FirstParagraph.Runs[0].GetHashCode()); @@ -1282,9 +1280,9 @@ public void TableStyleToDirectFormatting() doc.Save(ArtifactsDir + "Document.TableStyleToDirectFormatting.docx"); //ExEnd - TestUtil.DocPackageFileContainsString("", + TestUtil.DocPackageFileContainsString("", ArtifactsDir + "Document.TableStyleToDirectFormatting.docx", "document.xml"); - TestUtil.DocPackageFileContainsString("", + TestUtil.DocPackageFileContainsString("", ArtifactsDir + "Document.TableStyleToDirectFormatting.docx", "document.xml"); TestUtil.DocPackageFileContainsString("", ArtifactsDir + "Document.TableStyleToDirectFormatting.docx", "document.xml"); @@ -1324,170 +1322,6 @@ public void FootnoteColumns() Assert.AreEqual(2, doc.FirstSection.PageSetup.FootnoteOptions.Columns); } - [Test] - public void Compare() - { - //ExStart - //ExFor:Document.Compare(Document, String, DateTime) - //ExFor:RevisionCollection.AcceptAll - //ExSummary:Shows how to compare documents. - Document docOriginal = new Document(); - DocumentBuilder builder = new DocumentBuilder(docOriginal); - builder.Writeln("This is the original document."); - - Document docEdited = new Document(); - builder = new DocumentBuilder(docEdited); - builder.Writeln("This is the edited document."); - - // Comparing documents with revisions will throw an exception. - if (docOriginal.Revisions.Count == 0 && docEdited.Revisions.Count == 0) - docOriginal.Compare(docEdited, "authorName", DateTime.Now); - - // After the comparison, the original document will gain a new revision - // for every element that is different in the edited document. - Assert.AreEqual(2, docOriginal.Revisions.Count); //ExSkip - foreach (Revision r in docOriginal.Revisions) - { - Console.WriteLine($"Revision type: {r.RevisionType}, on a node of type \"{r.ParentNode.NodeType}\""); - Console.WriteLine($"\tChanged text: \"{r.ParentNode.GetText()}\""); - } - - // Accepting these revisions will transform the original document into the edited document. - docOriginal.Revisions.AcceptAll(); - - Assert.AreEqual(docOriginal.GetText(), docEdited.GetText()); - //ExEnd - - docOriginal = DocumentHelper.SaveOpen(docOriginal); - Assert.AreEqual(0, docOriginal.Revisions.Count); - } - - [Test] - public void CompareDocumentWithRevisions() - { - Document doc1 = new Document(); - DocumentBuilder builder = new DocumentBuilder(doc1); - builder.Writeln("Hello world! This text is not a revision."); - - Document docWithRevision = new Document(); - builder = new DocumentBuilder(docWithRevision); - - docWithRevision.StartTrackRevisions("John Doe"); - builder.Writeln("This is a revision."); - - Assert.Throws(() => docWithRevision.Compare(doc1, "John Doe", DateTime.Now)); - } - - [Test] - public void CompareOptions() - { - //ExStart - //ExFor:CompareOptions - //ExFor:CompareOptions.IgnoreFormatting - //ExFor:CompareOptions.IgnoreCaseChanges - //ExFor:CompareOptions.IgnoreComments - //ExFor:CompareOptions.IgnoreTables - //ExFor:CompareOptions.IgnoreFields - //ExFor:CompareOptions.IgnoreFootnotes - //ExFor:CompareOptions.IgnoreTextboxes - //ExFor:CompareOptions.IgnoreHeadersAndFooters - //ExFor:CompareOptions.Target - //ExFor:ComparisonTargetType - //ExFor:Document.Compare(Document, String, DateTime, CompareOptions) - //ExSummary:Shows how to filter specific types of document elements when making a comparison. - // Create the original document and populate it with various kinds of elements. - Document docOriginal = new Document(); - DocumentBuilder builder = new DocumentBuilder(docOriginal); - - // Paragraph text referenced with an endnote: - builder.Writeln("Hello world! This is the first paragraph."); - builder.InsertFootnote(FootnoteType.Endnote, "Original endnote text."); - - // Table: - builder.StartTable(); - builder.InsertCell(); - builder.Write("Original cell 1 text"); - builder.InsertCell(); - builder.Write("Original cell 2 text"); - builder.EndTable(); - - // Textbox: - Shape textBox = builder.InsertShape(ShapeType.TextBox, 150, 20); - builder.MoveTo(textBox.FirstParagraph); - builder.Write("Original textbox contents"); - - // DATE field: - builder.MoveTo(docOriginal.FirstSection.Body.AppendParagraph("")); - builder.InsertField(" DATE "); - - // Comment: - Comment newComment = new Comment(docOriginal, "John Doe", "J.D.", DateTime.Now); - newComment.SetText("Original comment."); - builder.CurrentParagraph.AppendChild(newComment); - - // Header: - builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary); - builder.Writeln("Original header contents."); - - // Create a clone of our document and perform a quick edit on each of the cloned document's elements. - Document docEdited = (Document)docOriginal.Clone(true); - Paragraph firstParagraph = docEdited.FirstSection.Body.FirstParagraph; - - firstParagraph.Runs[0].Text = "hello world! this is the first paragraph, after editing."; - firstParagraph.ParagraphFormat.Style = docEdited.Styles[StyleIdentifier.Heading1]; - ((Footnote)docEdited.GetChild(NodeType.Footnote, 0, true)).FirstParagraph.Runs[1].Text = "Edited endnote text."; - ((Table)docEdited.GetChild(NodeType.Table, 0, true)).FirstRow.Cells[1].FirstParagraph.Runs[0].Text = "Edited Cell 2 contents"; - ((Shape)docEdited.GetChild(NodeType.Shape, 0, true)).FirstParagraph.Runs[0].Text = "Edited textbox contents"; - ((FieldDate)docEdited.Range.Fields[0]).UseLunarCalendar = true; - ((Comment)docEdited.GetChild(NodeType.Comment, 0, true)).FirstParagraph.Runs[0].Text = "Edited comment."; - docEdited.FirstSection.HeadersFooters[HeaderFooterType.HeaderPrimary].FirstParagraph.Runs[0].Text = - "Edited header contents."; - - // Comparing documents creates a revision for every edit in the edited document. - // A CompareOptions object has a series of flags that can suppress revisions - // on each respective type of element, effectively ignoring their change. - Aspose.Words.Comparing.CompareOptions compareOptions = new Aspose.Words.Comparing.CompareOptions(); - compareOptions.IgnoreFormatting = false; - compareOptions.IgnoreCaseChanges = false; - compareOptions.IgnoreComments = false; - compareOptions.IgnoreTables = false; - compareOptions.IgnoreFields = false; - compareOptions.IgnoreFootnotes = false; - compareOptions.IgnoreTextboxes = false; - compareOptions.IgnoreHeadersAndFooters = false; - compareOptions.Target = ComparisonTargetType.New; - - docOriginal.Compare(docEdited, "John Doe", DateTime.Now, compareOptions); - docOriginal.Save(ArtifactsDir + "Document.CompareOptions.docx"); - //ExEnd - - docOriginal = new Document(ArtifactsDir + "Document.CompareOptions.docx"); - - TestUtil.VerifyFootnote(FootnoteType.Endnote, true, string.Empty, - "OriginalEdited endnote text.", (Footnote)docOriginal.GetChild(NodeType.Footnote, 0, true)); - } - - [TestCase(false)] - [TestCase(true)] - public void IgnoreDmlUniqueId(bool isIgnoreDmlUniqueId) - { - //ExStart - //ExFor:CompareOptions.IgnoreDmlUniqueId - //ExSummary:Shows how to compare documents ignoring DML unique ID. - Document docA = new Document(MyDir + "DML unique ID original.docx"); - Document docB = new Document(MyDir + "DML unique ID compare.docx"); - - // By default, Aspose.Words do not ignore DML's unique ID, and the revisions count was 2. - // If we are ignoring DML's unique ID, and revisions count were 0. - Aspose.Words.Comparing.CompareOptions compareOptions = new Aspose.Words.Comparing.CompareOptions(); - compareOptions.IgnoreDmlUniqueId = isIgnoreDmlUniqueId; - - docA.Compare(docB, "Aspose.Words", DateTime.Now, compareOptions); - - Assert.AreEqual(isIgnoreDmlUniqueId ? 0 : 2, docA.Revisions.Count); - //ExEnd - } - [Test] public void RemoveExternalSchemaReferences() { @@ -1500,113 +1334,6 @@ public void RemoveExternalSchemaReferences() //ExEnd } - [Test] - public void TrackRevisions() - { - //ExStart - //ExFor:Document.StartTrackRevisions(String) - //ExFor:Document.StartTrackRevisions(String, DateTime) - //ExFor:Document.StopTrackRevisions - //ExSummary:Shows how to track revisions while editing a document. - Document doc = new Document(); - DocumentBuilder builder = new DocumentBuilder(doc); - - // Editing a document usually does not count as a revision until we begin tracking them. - builder.Write("Hello world! "); - - Assert.AreEqual(0, doc.Revisions.Count); - Assert.False(doc.FirstSection.Body.Paragraphs[0].Runs[0].IsInsertRevision); - - doc.StartTrackRevisions("John Doe"); - - builder.Write("Hello again! "); - - Assert.AreEqual(1, doc.Revisions.Count); - Assert.True(doc.FirstSection.Body.Paragraphs[0].Runs[1].IsInsertRevision); - Assert.AreEqual("John Doe", doc.Revisions[0].Author); - Assert.IsTrue((DateTime.Now - doc.Revisions[0].DateTime).Milliseconds <= 10); - - // Stop tracking revisions to not count any future edits as revisions. - doc.StopTrackRevisions(); - builder.Write("Hello again! "); - - Assert.AreEqual(1, doc.Revisions.Count); - Assert.False(doc.FirstSection.Body.Paragraphs[0].Runs[2].IsInsertRevision); - - // Creating revisions gives them a date and time of the operation. - // We can disable this by passing DateTime.MinValue when we start tracking revisions. - doc.StartTrackRevisions("John Doe", DateTime.MinValue); - builder.Write("Hello again! "); - - Assert.AreEqual(2, doc.Revisions.Count); - Assert.AreEqual("John Doe", doc.Revisions[1].Author); - Assert.AreEqual(DateTime.MinValue, doc.Revisions[1].DateTime); - - // We can accept/reject these revisions programmatically - // by calling methods such as Document.AcceptAllRevisions, or each revision's Accept method. - // In Microsoft Word, we can process them manually via "Review" -> "Changes". - doc.Save(ArtifactsDir + "Document.StartTrackRevisions.docx"); - //ExEnd - } - - [Test] - public void AcceptAllRevisions() - { - //ExStart - //ExFor:Document.AcceptAllRevisions - //ExSummary:Shows how to accept all tracking changes in the document. - Document doc = new Document(); - DocumentBuilder builder = new DocumentBuilder(doc); - - // Edit the document while tracking changes to create a few revisions. - doc.StartTrackRevisions("John Doe"); - builder.Write("Hello world! "); - builder.Write("Hello again! "); - builder.Write("This is another revision."); - doc.StopTrackRevisions(); - - Assert.AreEqual(3, doc.Revisions.Count); - - // We can iterate through every revision and accept/reject it as a part of our document. - // If we know we wish to accept every revision, we can do it more straightforwardly so by calling this method. - doc.AcceptAllRevisions(); - - Assert.AreEqual(0, doc.Revisions.Count); - Assert.AreEqual("Hello world! Hello again! This is another revision.", doc.GetText().Trim()); - //ExEnd - } - - [Test] - public void GetRevisedPropertiesOfList() - { - //ExStart - //ExFor:RevisionsView - //ExFor:Document.RevisionsView - //ExSummary:Shows how to switch between the revised and the original view of a document. - Document doc = new Document(MyDir + "Revisions at list levels.docx"); - doc.UpdateListLabels(); - - ParagraphCollection paragraphs = doc.FirstSection.Body.Paragraphs; - Assert.AreEqual("1.", paragraphs[0].ListLabel.LabelString); - Assert.AreEqual("a.", paragraphs[1].ListLabel.LabelString); - Assert.AreEqual(string.Empty, paragraphs[2].ListLabel.LabelString); - - // View the document object as if all the revisions are accepted. Currently supports list labels. - doc.RevisionsView = RevisionsView.Final; - - Assert.AreEqual(string.Empty, paragraphs[0].ListLabel.LabelString); - Assert.AreEqual("1.", paragraphs[1].ListLabel.LabelString); - Assert.AreEqual("a.", paragraphs[2].ListLabel.LabelString); - //ExEnd - - doc.RevisionsView = RevisionsView.Original; - doc.AcceptAllRevisions(); - - Assert.AreEqual("a.", paragraphs[0].ListLabel.LabelString); - Assert.AreEqual(string.Empty, paragraphs[1].ListLabel.LabelString); - Assert.AreEqual("b.", paragraphs[2].ListLabel.LabelString); - } - [Test] public void UpdateThumbnail() { @@ -1630,7 +1357,7 @@ public void UpdateThumbnail() // 2 - Use the first image found in the document: ThumbnailGeneratingOptions options = new ThumbnailGeneratingOptions(); - Assert.AreEqual(new Size(600, 900), options.ThumbnailSize); //ExSkip + Assert.AreEqual(new Size(600, 900), options.ThumbnailSize); //ExSKip Assert.True(options.GenerateFromFirstPage); //ExSkip options.ThumbnailSize = new Size(400, 400); options.GenerateFromFirstPage = false; @@ -1895,43 +1622,11 @@ public void SetInvalidateFieldTypes() Assert.AreEqual(FieldType.FieldPage, field.Type); Assert.AreEqual(FieldType.FieldPage, field.Start.FieldType); - Assert.AreEqual(FieldType.FieldPage, field.Separator.FieldType); + Assert.AreEqual(FieldType.FieldPage, field.Separator.FieldType); Assert.AreEqual(FieldType.FieldPage, field.End.FieldType); //ExEnd } - [Test] - public void LayoutOptionsRevisions() - { - //ExStart - //ExFor:Document.LayoutOptions - //ExFor:LayoutOptions - //ExFor:LayoutOptions.RevisionOptions - //ExFor:RevisionColor - //ExFor:RevisionOptions - //ExFor:RevisionOptions.InsertedTextColor - //ExFor:RevisionOptions.ShowRevisionBars - //ExSummary:Shows how to alter the appearance of revisions in a rendered output document. - Document doc = new Document(); - DocumentBuilder builder = new DocumentBuilder(doc); - - // Insert a revision, then change the color of all revisions to green. - builder.Writeln("This is not a revision."); - doc.StartTrackRevisions("John Doe", DateTime.Now); - Assert.AreEqual(RevisionColor.ByAuthor, doc.LayoutOptions.RevisionOptions.InsertedTextColor); //ExSkip - Assert.True(doc.LayoutOptions.RevisionOptions.ShowRevisionBars); //ExSkip - builder.Writeln("This is a revision."); - doc.StopTrackRevisions(); - builder.Writeln("This is not a revision."); - - // Remove the bar that appears to the left of every revised line. - doc.LayoutOptions.RevisionOptions.InsertedTextColor = RevisionColor.BrightGreen; - doc.LayoutOptions.RevisionOptions.ShowRevisionBars = false; - - doc.Save(ArtifactsDir + "Document.LayoutOptionsRevisions.pdf"); - //ExEnd - } - [TestCase(false)] [TestCase(true)] public void LayoutOptionsHiddenText(bool showHiddenText) @@ -1966,8 +1661,8 @@ public void UsePdfDocumentForLayoutOptionsHiddenText(bool showHiddenText) TextAbsorber textAbsorber = new TextAbsorber(); textAbsorber.Visit(pdfDoc); - Assert.AreEqual(showHiddenText ? - $"This text is not hidden.{Environment.NewLine}This text is hidden." : + Assert.AreEqual(showHiddenText ? + $"This text is not hidden.{Environment.NewLine}This text is hidden." : "This text is not hidden.", textAbsorber.Text); } @@ -2005,8 +1700,8 @@ public void UsePdfDocumentForLayoutOptionsParagraphMarks(bool showParagraphMarks TextAbsorber textAbsorber = new TextAbsorber(); textAbsorber.Visit(pdfDoc); - Assert.AreEqual(showParagraphMarks ? - $"Hello world!¶{Environment.NewLine}Hello again!¶{Environment.NewLine}¶" : + Assert.AreEqual(showParagraphMarks ? + $"Hello world!¶{Environment.NewLine}Hello again!¶{Environment.NewLine}¶" : $"Hello world!{Environment.NewLine}Hello again!", textAbsorber.Text.Trim()); } @@ -2030,7 +1725,7 @@ public void UpdatePageLayout() doc.Sections[0].PageSetup.Orientation = Aspose.Words.Orientation.Landscape; doc.Sections[0].PageSetup.Margins = Margins.Mirrored; - // In the current version of Aspose.Words, modifying the document does not automatically rebuild + // In the current version of Aspose.Words, modifying the document does not automatically rebuild // the cached page layout. If we wish for the cached layout // to stay up to date, we will need to update it manually. doc.UpdatePageLayout(); @@ -2103,23 +1798,23 @@ private static void TestDocPackageCustomParts(CustomPartCollection parts) { Assert.AreEqual(3, parts.Count); - Assert.AreEqual("/payload/payload_on_package.test", parts[0].Name); - Assert.AreEqual("mytest/somedata", parts[0].ContentType); - Assert.AreEqual("http://mytest.payload.internal", parts[0].RelationshipType); - Assert.AreEqual(false, parts[0].IsExternal); - Assert.AreEqual(18, parts[0].Data.Length); + Assert.AreEqual("/payload/payload_on_package.test", parts[0].Name); + Assert.AreEqual("mytest/somedata", parts[0].ContentType); + Assert.AreEqual("http://mytest.payload.internal", parts[0].RelationshipType); + Assert.AreEqual(false, parts[0].IsExternal); + Assert.AreEqual(18, parts[0].Data.Length); - Assert.AreEqual("http://www.aspose.com/Images/aspose-logo.jpg", parts[1].Name); - Assert.AreEqual("", parts[1].ContentType); - Assert.AreEqual("http://mytest.payload.external", parts[1].RelationshipType); - Assert.AreEqual(true, parts[1].IsExternal); - Assert.AreEqual(0, parts[1].Data.Length); + Assert.AreEqual("http://www.aspose.com/Images/aspose-logo.jpg", parts[1].Name); + Assert.AreEqual("", parts[1].ContentType); + Assert.AreEqual("http://mytest.payload.external", parts[1].RelationshipType); + Assert.AreEqual(true, parts[1].IsExternal); + Assert.AreEqual(0, parts[1].Data.Length); - Assert.AreEqual("http://www.aspose.com/Images/aspose-logo.jpg", parts[2].Name); - Assert.AreEqual("", parts[2].ContentType); - Assert.AreEqual("http://mytest.payload.external", parts[2].RelationshipType); - Assert.AreEqual(true, parts[2].IsExternal); - Assert.AreEqual(0, parts[2].Data.Length); + Assert.AreEqual("http://www.aspose.com/Images/aspose-logo.jpg", parts[2].Name); + Assert.AreEqual("", parts[2].ContentType); + Assert.AreEqual("http://mytest.payload.external", parts[2].RelationshipType); + Assert.AreEqual(true, parts[2].IsExternal); + Assert.AreEqual(0, parts[2].Data.Length); } [TestCase(false)] @@ -2351,7 +2046,7 @@ public void CopyTemplateStylesViaDocumentNew() Assert.AreEqual(21, target.Styles.Count); //ExEnd } - + [Test] public void ReadMacrosFromExistingDocument() { @@ -2359,8 +2054,8 @@ public void ReadMacrosFromExistingDocument() //ExFor:Document.VbaProject //ExFor:VbaModuleCollection //ExFor:VbaModuleCollection.Count - //ExFor:VbaModuleCollection.Item(Int32) - //ExFor:VbaModuleCollection.Item(String) + //ExFor:VbaModuleCollection.Item(System.Int32) + //ExFor:VbaModuleCollection.Item(System.String) //ExFor:VbaModuleCollection.Remove //ExFor:VbaModule //ExFor:VbaModule.Name @@ -2380,7 +2075,7 @@ public void ReadMacrosFromExistingDocument() ? $"Project name: {vbaProject.Name} signed; Project code page: {vbaProject.CodePage}; Modules count: {vbaProject.Modules.Count()}\n" : $"Project name: {vbaProject.Name} not signed; Project code page: {vbaProject.CodePage}; Modules count: {vbaProject.Modules.Count()}\n"); - VbaModuleCollection vbaModules = doc.VbaProject.Modules; + VbaModuleCollection vbaModules = doc.VbaProject.Modules; Assert.AreEqual(vbaModules.Count(), 3); @@ -2698,70 +2393,6 @@ public void SpellingAndGrammarErrors(bool showErrors) Assert.AreEqual(showErrors, doc.ShowSpellingErrors); } - [TestCase(Granularity.CharLevel)] - [TestCase(Granularity.WordLevel)] - public void GranularityCompareOption(Granularity granularity) - { - //ExStart - //ExFor:CompareOptions.Granularity - //ExFor:Granularity - //ExSummary:Shows to specify a granularity while comparing documents. - Document docA = new Document(); - DocumentBuilder builderA = new DocumentBuilder(docA); - builderA.Writeln("Alpha Lorem ipsum dolor sit amet, consectetur adipiscing elit"); - - Document docB = new Document(); - DocumentBuilder builderB = new DocumentBuilder(docB); - builderB.Writeln("Lorems ipsum dolor sit amet consectetur - \"adipiscing\" elit"); - - // Specify whether changes are tracking - // by character ('Granularity.CharLevel'), or by word ('Granularity.WordLevel'). - Aspose.Words.Comparing.CompareOptions compareOptions = new Aspose.Words.Comparing.CompareOptions(); - compareOptions.Granularity = granularity; - - docA.Compare(docB, "author", DateTime.Now, compareOptions); - - // The first document's collection of revision groups contains all the differences between documents. - RevisionGroupCollection groups = docA.Revisions.Groups; - Assert.AreEqual(5, groups.Count); - //ExEnd - - if (granularity == Granularity.CharLevel) - { - Assert.AreEqual(RevisionType.Deletion, groups[0].RevisionType); - Assert.AreEqual("Alpha ", groups[0].Text); - - Assert.AreEqual(RevisionType.Deletion, groups[1].RevisionType); - Assert.AreEqual(",", groups[1].Text); - - Assert.AreEqual(RevisionType.Insertion, groups[2].RevisionType); - Assert.AreEqual("s", groups[2].Text); - - Assert.AreEqual(RevisionType.Insertion, groups[3].RevisionType); - Assert.AreEqual("- \"", groups[3].Text); - - Assert.AreEqual(RevisionType.Insertion, groups[4].RevisionType); - Assert.AreEqual("\"", groups[4].Text); - } - else - { - Assert.AreEqual(RevisionType.Deletion, groups[0].RevisionType); - Assert.AreEqual("Alpha Lorem", groups[0].Text); - - Assert.AreEqual(RevisionType.Deletion, groups[1].RevisionType); - Assert.AreEqual(",", groups[1].Text); - - Assert.AreEqual(RevisionType.Insertion, groups[2].RevisionType); - Assert.AreEqual("Lorems", groups[2].Text); - - Assert.AreEqual(RevisionType.Insertion, groups[3].RevisionType); - Assert.AreEqual("- \"", groups[3].Text); - - Assert.AreEqual(RevisionType.Insertion, groups[4].RevisionType); - Assert.AreEqual("\"", groups[4].Text); - } - } - [Test] public void IgnorePrinterMetrics() { @@ -2806,7 +2437,7 @@ public void SpellingOrGrammar(bool checkSpellingGrammar) // The string with spelling errors. doc.FirstSection.Body.FirstParagraph.Runs.Add(new Run(doc, "The speeling in this documentz is all broked.")); - // Spelling/Grammar check start if we set properties to false. + // Spelling/Grammar check start if we set properties to false. // We can see all errors in Microsoft Word via Review -> Spelling & Grammar. // Note that Microsoft Word does not start grammar/spell check automatically for DOC and RTF document format. doc.SpellingChecked = checkSpellingGrammar; @@ -3088,7 +2719,7 @@ public void SaveDocumentToStream(SaveFormat saveFormat) doc.Save(stream, saveOptions); } - else + else doc.Save(stream, saveFormat); } } diff --git a/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs index 487d00631..fdd874a7a 100644 --- a/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs @@ -440,8 +440,8 @@ public void CssClassNamesPrefix() outDocContents = File.ReadAllText(ArtifactsDir + "HtmlSaveOptions.CssClassNamePrefix.css"); - Assert.True(outDocContents.Contains(".myprefix-Footer { margin-bottom:0pt; line-height:normal; font-family:Arial; font-size:11pt }\r\n" + - ".myprefix-Header { margin-bottom:0pt; line-height:normal; font-family:Arial; font-size:11pt }\r\n")); + Assert.True(outDocContents.Contains(".myprefix-Footer { margin-bottom:0pt; line-height:normal; font-family:Arial; font-size:11pt; -aw-style-name:footer }\r\n" + + ".myprefix-Header { margin-bottom:0pt; line-height:normal; font-family:Arial; font-size:11pt; -aw-style-name:header }\r\n")); //ExEnd } @@ -1683,9 +1683,9 @@ public void OfficeMathOutputMode(HtmlOfficeMathOutputMode htmlOfficeMathOutputMo switch (htmlOfficeMathOutputMode) { case HtmlOfficeMathOutputMode.Image: - Assert.True(Regex.Match(outDocContents, + Assert.True(Regex.Match(outDocContents, "

" + - "\"\"" + "

").Success); break; diff --git a/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs b/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs index 18af81091..db934bd7f 100644 --- a/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs +++ b/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs @@ -836,19 +836,23 @@ public void WithoutMissingMembers() } [Test] - public void WithMissingMembers() + public void MissingMembers() { + //ExStart:MissingMembers + //ReleaseVersion:24.6 + //ExFor:ReportingEngine.BuildReport(Document, Object, String) + //ExSummary:Shows how to allow missinng members. DocumentBuilder builder = new DocumentBuilder(); + builder.Writeln("<<[missingObject.First().id]>>"); + builder.Writeln("<><<[id]>><>"); - // Add templete to the document for reporting engine. - DocumentHelper.InsertBuilderText(builder, - new[] { "<<[missingObject.First().id]>>", "<><<[id]>><>" }); - - BuildReport(builder.Document, new DataSet(), "", ReportBuildOptions.AllowMissingMembers); + ReportingEngine engine = new ReportingEngine { Options = ReportBuildOptions.AllowMissingMembers }; + engine.MissingMemberMessage = "Missed"; + engine.BuildReport(builder.Document, new DataSet(), ""); + //ExEnd:MissingMembers // Assert that build report success with "ReportBuildOptions.AllowMissingMembers". - Assert.AreEqual(ControlChar.ParagraphBreak + ControlChar.ParagraphBreak + ControlChar.SectionBreak, - builder.Document.GetText()); + Assert.AreEqual("Missed", builder.Document.GetText().Trim()); } [TestCase("<<[missingObject.First().id]>>", "<<[missingObject.First( Error! Can not get the value of member 'missingObject' on type 'System.Data.DataSet'. ).id]>>", TestName = "Can not get the value of member")] @@ -1277,6 +1281,24 @@ public void Word2016Charts() //ExEnd:Word2016Charts } + [Test] + public void RemoveParagraphsSelectively() + { + //ExStart:RemoveParagraphsSelectively + //ReleaseVersion:24.6 + //ExFor:ReportingEngine.BuildReport(Document, Object, String) + //ExSummary:Shows how to remove paragraphs selectively. + Document doc = new Document(MyDir + "Reporting engine template - Selective remove paragraphs.docx"); + + ReportingEngine engine = new ReportingEngine(); + engine.BuildReport(doc, false, "value"); + + doc.Save(ArtifactsDir + "ReportingEngine.SelectiveDeletionOfParagraphs.docx"); + //ExEnd:RemoveParagraphsSelectively + + Assert.IsTrue(DocumentHelper.CompareDocs(ArtifactsDir + "ReportingEngine.SelectiveDeletionOfParagraphs.docx", GoldsDir + "ReportingEngine.SelectiveDeletionOfParagraphs Gold.docx")); + } + private static void BuildReport(Document document, object dataSource, ReportBuildOptions reportBuildOptions) { ReportingEngine engine = new ReportingEngine { Options = reportBuildOptions }; diff --git a/Examples/ApiExamples/ApiExamples/ExRevision.cs b/Examples/ApiExamples/ApiExamples/ExRevision.cs index 99d1d22fa..2bc77ce8a 100644 --- a/Examples/ApiExamples/ApiExamples/ExRevision.cs +++ b/Examples/ApiExamples/ApiExamples/ExRevision.cs @@ -8,7 +8,12 @@ using System; using System.Collections.Generic; using Aspose.Words; +using Aspose.Words.Comparing; +using Aspose.Words.Drawing; +using Aspose.Words.Fields; using Aspose.Words.Layout; +using Aspose.Words.Notes; +using Aspose.Words.Tables; using NUnit.Framework; namespace ApiExamples @@ -306,7 +311,7 @@ public void RevisionSpecifiedCriteria() builder.Write("This does not count as a revision. "); // To register our edits as revisions, we need to declare an author, and then start tracking them. - doc.StartTrackRevisions("John Doe", DateTime.Now); + doc.StartTrackRevisions("John Doe", DateTime.Now); builder.Write("This is insertion revision #1. "); doc.StopTrackRevisions(); @@ -347,5 +352,396 @@ public bool IsMatch(Revision revision) } } //ExEnd:RevisionSpecifiedCriteria + + [Test] + public void TrackRevisions() + { + //ExStart + //ExFor:Document.StartTrackRevisions(String) + //ExFor:Document.StartTrackRevisions(String, DateTime) + //ExFor:Document.StopTrackRevisions + //ExSummary:Shows how to track revisions while editing a document. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Editing a document usually does not count as a revision until we begin tracking them. + builder.Write("Hello world! "); + + Assert.AreEqual(0, doc.Revisions.Count); + Assert.False(doc.FirstSection.Body.Paragraphs[0].Runs[0].IsInsertRevision); + + doc.StartTrackRevisions("John Doe"); + + builder.Write("Hello again! "); + + Assert.AreEqual(1, doc.Revisions.Count); + Assert.True(doc.FirstSection.Body.Paragraphs[0].Runs[1].IsInsertRevision); + Assert.AreEqual("John Doe", doc.Revisions[0].Author); + Assert.IsTrue((DateTime.Now - doc.Revisions[0].DateTime).Milliseconds <= 10); + + // Stop tracking revisions to not count any future edits as revisions. + doc.StopTrackRevisions(); + builder.Write("Hello again! "); + + Assert.AreEqual(1, doc.Revisions.Count); + Assert.False(doc.FirstSection.Body.Paragraphs[0].Runs[2].IsInsertRevision); + + // Creating revisions gives them a date and time of the operation. + // We can disable this by passing DateTime.MinValue when we start tracking revisions. + doc.StartTrackRevisions("John Doe", DateTime.MinValue); + builder.Write("Hello again! "); + + Assert.AreEqual(2, doc.Revisions.Count); + Assert.AreEqual("John Doe", doc.Revisions[1].Author); + Assert.AreEqual(DateTime.MinValue, doc.Revisions[1].DateTime); + + // We can accept/reject these revisions programmatically + // by calling methods such as Document.AcceptAllRevisions, or each revision's Accept method. + // In Microsoft Word, we can process them manually via "Review" -> "Changes". + doc.Save(ArtifactsDir + "Document.StartTrackRevisions.docx"); + //ExEnd + } + + [Test] + public void AcceptAllRevisions() + { + //ExStart + //ExFor:Document.AcceptAllRevisions + //ExSummary:Shows how to accept all tracking changes in the document. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Edit the document while tracking changes to create a few revisions. + doc.StartTrackRevisions("John Doe"); + builder.Write("Hello world! "); + builder.Write("Hello again! "); + builder.Write("This is another revision."); + doc.StopTrackRevisions(); + + Assert.AreEqual(3, doc.Revisions.Count); + + // We can iterate through every revision and accept/reject it as a part of our document. + // If we know we wish to accept every revision, we can do it more straightforwardly so by calling this method. + doc.AcceptAllRevisions(); + + Assert.AreEqual(0, doc.Revisions.Count); + Assert.AreEqual("Hello world! Hello again! This is another revision.", doc.GetText().Trim()); + //ExEnd + } + + [Test] + public void GetRevisedPropertiesOfList() + { + //ExStart + //ExFor:RevisionsView + //ExFor:Document.RevisionsView + //ExSummary:Shows how to switch between the revised and the original view of a document. + Document doc = new Document(MyDir + "Revisions at list levels.docx"); + doc.UpdateListLabels(); + + ParagraphCollection paragraphs = doc.FirstSection.Body.Paragraphs; + Assert.AreEqual("1.", paragraphs[0].ListLabel.LabelString); + Assert.AreEqual("a.", paragraphs[1].ListLabel.LabelString); + Assert.AreEqual(string.Empty, paragraphs[2].ListLabel.LabelString); + + // View the document object as if all the revisions are accepted. Currently supports list labels. + doc.RevisionsView = RevisionsView.Final; + + Assert.AreEqual(string.Empty, paragraphs[0].ListLabel.LabelString); + Assert.AreEqual("1.", paragraphs[1].ListLabel.LabelString); + Assert.AreEqual("a.", paragraphs[2].ListLabel.LabelString); + //ExEnd + + doc.RevisionsView = RevisionsView.Original; + doc.AcceptAllRevisions(); + + Assert.AreEqual("a.", paragraphs[0].ListLabel.LabelString); + Assert.AreEqual(string.Empty, paragraphs[1].ListLabel.LabelString); + Assert.AreEqual("b.", paragraphs[2].ListLabel.LabelString); + } + + [Test] + public void Compare() + { + //ExStart + //ExFor:Document.Compare(Document, String, DateTime) + //ExFor:RevisionCollection.AcceptAll + //ExSummary:Shows how to compare documents. + Document docOriginal = new Document(); + DocumentBuilder builder = new DocumentBuilder(docOriginal); + builder.Writeln("This is the original document."); + + Document docEdited = new Document(); + builder = new DocumentBuilder(docEdited); + builder.Writeln("This is the edited document."); + + // Comparing documents with revisions will throw an exception. + if (docOriginal.Revisions.Count == 0 && docEdited.Revisions.Count == 0) + docOriginal.Compare(docEdited, "authorName", DateTime.Now); + + // After the comparison, the original document will gain a new revision + // for every element that is different in the edited document. + Assert.AreEqual(2, docOriginal.Revisions.Count); //ExSkip + foreach (Revision r in docOriginal.Revisions) + { + Console.WriteLine($"Revision type: {r.RevisionType}, on a node of type \"{r.ParentNode.NodeType}\""); + Console.WriteLine($"\tChanged text: \"{r.ParentNode.GetText()}\""); + } + + // Accepting these revisions will transform the original document into the edited document. + docOriginal.Revisions.AcceptAll(); + + Assert.AreEqual(docOriginal.GetText(), docEdited.GetText()); + //ExEnd + + docOriginal = DocumentHelper.SaveOpen(docOriginal); + Assert.AreEqual(0, docOriginal.Revisions.Count); + } + + [Test] + public void CompareDocumentWithRevisions() + { + Document doc1 = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc1); + builder.Writeln("Hello world! This text is not a revision."); + + Document docWithRevision = new Document(); + builder = new DocumentBuilder(docWithRevision); + + docWithRevision.StartTrackRevisions("John Doe"); + builder.Writeln("This is a revision."); + + Assert.Throws(() => docWithRevision.Compare(doc1, "John Doe", DateTime.Now)); + } + + [Test] + public void CompareOptions() + { + //ExStart + //ExFor:CompareOptions + //ExFor:CompareOptions.IgnoreFormatting + //ExFor:CompareOptions.IgnoreCaseChanges + //ExFor:CompareOptions.IgnoreComments + //ExFor:CompareOptions.IgnoreTables + //ExFor:CompareOptions.IgnoreFields + //ExFor:CompareOptions.IgnoreFootnotes + //ExFor:CompareOptions.IgnoreTextboxes + //ExFor:CompareOptions.IgnoreHeadersAndFooters + //ExFor:CompareOptions.Target + //ExFor:ComparisonTargetType + //ExFor:Document.Compare(Document, String, DateTime, CompareOptions) + //ExSummary:Shows how to filter specific types of document elements when making a comparison. + // Create the original document and populate it with various kinds of elements. + Document docOriginal = new Document(); + DocumentBuilder builder = new DocumentBuilder(docOriginal); + + // Paragraph text referenced with an endnote: + builder.Writeln("Hello world! This is the first paragraph."); + builder.InsertFootnote(FootnoteType.Endnote, "Original endnote text."); + + // Table: + builder.StartTable(); + builder.InsertCell(); + builder.Write("Original cell 1 text"); + builder.InsertCell(); + builder.Write("Original cell 2 text"); + builder.EndTable(); + + // Textbox: + Shape textBox = builder.InsertShape(ShapeType.TextBox, 150, 20); + builder.MoveTo(textBox.FirstParagraph); + builder.Write("Original textbox contents"); + + // DATE field: + builder.MoveTo(docOriginal.FirstSection.Body.AppendParagraph("")); + builder.InsertField(" DATE "); + + // Comment: + Comment newComment = new Comment(docOriginal, "John Doe", "J.D.", DateTime.Now); + newComment.SetText("Original comment."); + builder.CurrentParagraph.AppendChild(newComment); + + // Header: + builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary); + builder.Writeln("Original header contents."); + + // Create a clone of our document and perform a quick edit on each of the cloned document's elements. + Document docEdited = (Document)docOriginal.Clone(true); + Paragraph firstParagraph = docEdited.FirstSection.Body.FirstParagraph; + + firstParagraph.Runs[0].Text = "hello world! this is the first paragraph, after editing."; + firstParagraph.ParagraphFormat.Style = docEdited.Styles[StyleIdentifier.Heading1]; + ((Footnote)docEdited.GetChild(NodeType.Footnote, 0, true)).FirstParagraph.Runs[1].Text = "Edited endnote text."; + ((Table)docEdited.GetChild(NodeType.Table, 0, true)).FirstRow.Cells[1].FirstParagraph.Runs[0].Text = "Edited Cell 2 contents"; + ((Shape)docEdited.GetChild(NodeType.Shape, 0, true)).FirstParagraph.Runs[0].Text = "Edited textbox contents"; + ((FieldDate)docEdited.Range.Fields[0]).UseLunarCalendar = true; + ((Comment)docEdited.GetChild(NodeType.Comment, 0, true)).FirstParagraph.Runs[0].Text = "Edited comment."; + docEdited.FirstSection.HeadersFooters[HeaderFooterType.HeaderPrimary].FirstParagraph.Runs[0].Text = + "Edited header contents."; + + // Comparing documents creates a revision for every edit in the edited document. + // A CompareOptions object has a series of flags that can suppress revisions + // on each respective type of element, effectively ignoring their change. + Aspose.Words.Comparing.CompareOptions compareOptions = new Aspose.Words.Comparing.CompareOptions(); + compareOptions.IgnoreFormatting = false; + compareOptions.IgnoreCaseChanges = false; + compareOptions.IgnoreComments = false; + compareOptions.IgnoreTables = false; + compareOptions.IgnoreFields = false; + compareOptions.IgnoreFootnotes = false; + compareOptions.IgnoreTextboxes = false; + compareOptions.IgnoreHeadersAndFooters = false; + compareOptions.Target = ComparisonTargetType.New; + + docOriginal.Compare(docEdited, "John Doe", DateTime.Now, compareOptions); + docOriginal.Save(ArtifactsDir + "Document.CompareOptions.docx"); + //ExEnd + + docOriginal = new Document(ArtifactsDir + "Document.CompareOptions.docx"); + + TestUtil.VerifyFootnote(FootnoteType.Endnote, true, string.Empty, + "OriginalEdited endnote text.", (Footnote)docOriginal.GetChild(NodeType.Footnote, 0, true)); + } + + [TestCase(false)] + [TestCase(true)] + public void IgnoreDmlUniqueId(bool isIgnoreDmlUniqueId) + { + //ExStart + //ExFor:CompareOptions.IgnoreDmlUniqueId + //ExSummary:Shows how to compare documents ignoring DML unique ID. + Document docA = new Document(MyDir + "DML unique ID original.docx"); + Document docB = new Document(MyDir + "DML unique ID compare.docx"); + + // By default, Aspose.Words do not ignore DML's unique ID, and the revisions count was 2. + // If we are ignoring DML's unique ID, and revisions count were 0. + Aspose.Words.Comparing.CompareOptions compareOptions = new Aspose.Words.Comparing.CompareOptions(); + compareOptions.AdvancedOptions.IgnoreDmlUniqueId = isIgnoreDmlUniqueId; + + docA.Compare(docB, "Aspose.Words", DateTime.Now, compareOptions); + + Assert.AreEqual(isIgnoreDmlUniqueId ? 0 : 2, docA.Revisions.Count); + //ExEnd + } + + [Test] + public void LayoutOptionsRevisions() + { + //ExStart + //ExFor:Document.LayoutOptions + //ExFor:LayoutOptions + //ExFor:LayoutOptions.RevisionOptions + //ExFor:RevisionColor + //ExFor:RevisionOptions + //ExFor:RevisionOptions.InsertedTextColor + //ExFor:RevisionOptions.ShowRevisionBars + //ExSummary:Shows how to alter the appearance of revisions in a rendered output document. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + // Insert a revision, then change the color of all revisions to green. + builder.Writeln("This is not a revision."); + doc.StartTrackRevisions("John Doe", DateTime.Now); + Assert.AreEqual(RevisionColor.ByAuthor, doc.LayoutOptions.RevisionOptions.InsertedTextColor); //ExSkip + Assert.True(doc.LayoutOptions.RevisionOptions.ShowRevisionBars); //ExSkip + builder.Writeln("This is a revision."); + doc.StopTrackRevisions(); + builder.Writeln("This is not a revision."); + + // Remove the bar that appears to the left of every revised line. + doc.LayoutOptions.RevisionOptions.InsertedTextColor = RevisionColor.BrightGreen; + doc.LayoutOptions.RevisionOptions.ShowRevisionBars = false; + + doc.Save(ArtifactsDir + "Document.LayoutOptionsRevisions.pdf"); + //ExEnd + } + + [TestCase(Granularity.CharLevel)] + [TestCase(Granularity.WordLevel)] + public void GranularityCompareOption(Granularity granularity) + { + //ExStart + //ExFor:CompareOptions.Granularity + //ExFor:Granularity + //ExSummary:Shows to specify a granularity while comparing documents. + Document docA = new Document(); + DocumentBuilder builderA = new DocumentBuilder(docA); + builderA.Writeln("Alpha Lorem ipsum dolor sit amet, consectetur adipiscing elit"); + + Document docB = new Document(); + DocumentBuilder builderB = new DocumentBuilder(docB); + builderB.Writeln("Lorems ipsum dolor sit amet consectetur - \"adipiscing\" elit"); + + // Specify whether changes are tracking + // by character ('Granularity.CharLevel'), or by word ('Granularity.WordLevel'). + Aspose.Words.Comparing.CompareOptions compareOptions = new Aspose.Words.Comparing.CompareOptions(); + compareOptions.Granularity = granularity; + + docA.Compare(docB, "author", DateTime.Now, compareOptions); + + // The first document's collection of revision groups contains all the differences between documents. + RevisionGroupCollection groups = docA.Revisions.Groups; + Assert.AreEqual(5, groups.Count); + //ExEnd + + if (granularity == Granularity.CharLevel) + { + Assert.AreEqual(RevisionType.Deletion, groups[0].RevisionType); + Assert.AreEqual("Alpha ", groups[0].Text); + + Assert.AreEqual(RevisionType.Deletion, groups[1].RevisionType); + Assert.AreEqual(",", groups[1].Text); + + Assert.AreEqual(RevisionType.Insertion, groups[2].RevisionType); + Assert.AreEqual("s", groups[2].Text); + + Assert.AreEqual(RevisionType.Insertion, groups[3].RevisionType); + Assert.AreEqual("- \"", groups[3].Text); + + Assert.AreEqual(RevisionType.Insertion, groups[4].RevisionType); + Assert.AreEqual("\"", groups[4].Text); + } + else + { + Assert.AreEqual(RevisionType.Deletion, groups[0].RevisionType); + Assert.AreEqual("Alpha Lorem", groups[0].Text); + + Assert.AreEqual(RevisionType.Deletion, groups[1].RevisionType); + Assert.AreEqual(",", groups[1].Text); + + Assert.AreEqual(RevisionType.Insertion, groups[2].RevisionType); + Assert.AreEqual("Lorems", groups[2].Text); + + Assert.AreEqual(RevisionType.Insertion, groups[3].RevisionType); + Assert.AreEqual("- \"", groups[3].Text); + + Assert.AreEqual(RevisionType.Insertion, groups[4].RevisionType); + Assert.AreEqual("\"", groups[4].Text); + } + } + + [Test] + public void IgnoreStoreItemId() + { + //ExStart:IgnoreStoreItemId + //ReleaseVersion:24.6 + //ExFor:AdvancedCompareOptions.IgnoreStoreItemId + //ExSummary:Shows how to compare SDT with same text and different store item id. + Document docA = new Document(MyDir + "Document with SDT 1.docx"); + Document docB = new Document(MyDir + "Document with SDT 2.docx"); + + Aspose.Words.Comparing.CompareOptions compareOptions = new Aspose.Words.Comparing.CompareOptions(); + compareOptions.AdvancedOptions.IgnoreStoreItemId = false; + + docA.Compare(docB, "user", DateTime.Now, compareOptions); + Assert.AreEqual(8, docA.Revisions.Count); + + compareOptions.AdvancedOptions.IgnoreStoreItemId = true; + + docA.Revisions.RejectAll(); + docA.Compare(docB, "user", DateTime.Now, compareOptions); + Assert.AreEqual(0, docA.Revisions.Count); + //ExEnd:IgnoreStoreItemId + } } } diff --git a/Examples/ApiExamples/ApiExamples/ExShape.cs b/Examples/ApiExamples/ApiExamples/ExShape.cs index 0c9086567..d02218bbe 100644 --- a/Examples/ApiExamples/ApiExamples/ExShape.cs +++ b/Examples/ApiExamples/ApiExamples/ExShape.cs @@ -25,7 +25,6 @@ using HorizontalAlignment = Aspose.Words.Drawing.HorizontalAlignment; using TextBox = Aspose.Words.Drawing.TextBox; using Aspose.Words.Themes; -using Aspose.Words.Model.Drawing; namespace ApiExamples { @@ -1441,7 +1440,7 @@ public void RenderOfficeMath() //ExEnd if (!IsRunningOnMono()) - TestUtil.VerifyImage(792, 87, ArtifactsDir + "Shape.RenderOfficeMath.png"); + TestUtil.VerifyImage(799, 87, ArtifactsDir + "Shape.RenderOfficeMath.png"); else TestUtil.VerifyImage(735, 128, ArtifactsDir + "Shape.RenderOfficeMath.png"); } @@ -2765,36 +2764,36 @@ public void OfficeMathRenderer() OfficeMathRenderer renderer = new OfficeMathRenderer(officeMath); // Verify the size of the image that the OfficeMath object will create when we render it. - Assert.AreEqual(119.0f, renderer.SizeInPoints.Width, 0.25f); + Assert.AreEqual(120.0f, renderer.SizeInPoints.Width, 0.25f); Assert.AreEqual(13.0f, renderer.SizeInPoints.Height, 0.1f); - Assert.AreEqual(119.0f, renderer.BoundsInPoints.Width, 0.25f); + Assert.AreEqual(120.0f, renderer.BoundsInPoints.Width, 0.25f); Assert.AreEqual(13.0f, renderer.BoundsInPoints.Height, 0.1f); // Shapes with transparent parts may contain different values in the "OpaqueBoundsInPoints" properties. - Assert.AreEqual(119.0f, renderer.OpaqueBoundsInPoints.Width, 0.25f); + Assert.AreEqual(120.0f, renderer.OpaqueBoundsInPoints.Width, 0.25f); Assert.AreEqual(14.2f, renderer.OpaqueBoundsInPoints.Height, 0.1f); // Get the shape size in pixels, with linear scaling to a specific DPI. Rectangle bounds = renderer.GetBoundsInPixels(1.0f, 96.0f); - Assert.AreEqual(159, bounds.Width); + Assert.AreEqual(160, bounds.Width); Assert.AreEqual(18, bounds.Height); // Get the shape size in pixels, but with a different DPI for the horizontal and vertical dimensions. bounds = renderer.GetBoundsInPixels(1.0f, 96.0f, 150.0f); - Assert.AreEqual(159, bounds.Width); + Assert.AreEqual(160, bounds.Width); Assert.AreEqual(28, bounds.Height); // The opaque bounds may vary here also. bounds = renderer.GetOpaqueBoundsInPixels(1.0f, 96.0f); - Assert.AreEqual(159, bounds.Width); + Assert.AreEqual(160, bounds.Width); Assert.AreEqual(18, bounds.Height); bounds = renderer.GetOpaqueBoundsInPixels(1.0f, 96.0f, 150.0f); - Assert.AreEqual(159, bounds.Width); + Assert.AreEqual(160, bounds.Width); Assert.AreEqual(30, bounds.Height); //ExEnd } @@ -3250,5 +3249,19 @@ public void Adjustments() Assert.AreEqual("adj", adjustment.Name); Assert.AreEqual(30000, adjustment.Value); } + + [Test] + public void ShadowFormatColor() + { + //ExStart:ShadowFormatColor + //ReleaseVersion:24.6 + //ExFor:ShadowFormat.Color + //ExSummary:Shows how to get shadow color. + Document doc = new Document(MyDir + "Shadow color.docx"); + Shape shape = (Shape)doc.GetChild(NodeType.Shape, 0, true); + + Assert.AreEqual(Color.Red.ToArgb(), shape.ShadowFormat.Color.ToArgb()); + //ExEnd:ShadowFormatColor + } } } diff --git a/Examples/Data/Document with SDT 1.docx b/Examples/Data/Document with SDT 1.docx new file mode 100644 index 0000000000000000000000000000000000000000..8f729a2fe98bc62f135f2d158b5f1d57d44318b1 GIT binary patch literal 46065 zcmb@sQ-C1NvM$=wwrzXb?w+>oY1_7KYudJL+qP}nygmOqci+7Z_PG!HB`P8^Dk>wt z%*v{Wl$8JiMg{-?00*$O)l_+2gybLj0RV6W0|0>ZtyLGWwsJ7Ea?nAxJ6~A-v#91h!U*zuwItT`BPW-b_{6Sce)W!9 zh74CiRii`oPY18yg=UZR9s5|fSXI3`iiNoyjJ&Mc5v{am?)WFdt)l8xPXnw=97}Zsp5VNMHsWL8Qwg&i)iADL zKBw*+3k|F2=4WG&IiP!Lbb# zhj^2-Njc(GOwLY0%JLB|UC_Q9j!(#W>iYl*yc`}+o-IuIcz91Wz_%H`9Qn)#B)WH%O_Gp{UvNL#}L$wKlkw7hOFshPy8wiUYKGlii8D}D;>PCd>rvKFfrGGOyFn=9;V{rkzP!O+qn=ohc}CZ zGDKTf((!{T$m#}06aVd-MMwDM&OqK#(S2$EtXi(Wnj(V7uhmuj^9xY+-;h_2b!@o% zMtlzt008Rys%>XzVNXl*msZ4$NdwVC3we{=cJ7(-f#(!%RG(DxzxyP(;OgDV?owQA zA;FiDQ_iVYN7#GXIV3zh9)mh=$G>eeQX#@^;t}_v^$Jt5#6lSoVXQ(`V{V^v4s==@@X(r0q z2K?X_#ubc{TFCm2J$}4AmO$o30+}K|mb>$dIQ-FF1BIHry|V6A28SEceas0#VMS&( z$!tnm$XI(2gJMvupzTH6yD2&8m)9!KaimwSkWar{#AilE)#m zn6@Z&G=raK|KSGjEN?P-Im(eLefydC&Q;zPF`w;35=j~!2E{<-13irkO1D0Zs8baYeG(@k2-kl++_ApNK1GF;#M}?`zMidXG(-&nkzi?HN z%nOE0);$v4>X70wZT@g5lkyA@1?XXsfx}Z9{YTF*)n26$6Imer!9(qg@?3R&AYr)G z$36?kn4s~jO2Ba6@*~jvBy#$uvpxJ=^!4bhQzZ?!AqK5H>8krEvUG`+BjV#PWAtbs z&i*L>bUH~7vSy6H&MVR!v?{)GPvmpqR7+c}lW+u`U%e|J^9_`txg!-$*AQP;y#b0E z)uDO^226Bc_ab|AJyBcseZer)t+MqBTGes{4>>qM^WgK?=d72uTfL9yB@4Ua5AQSW70Xrml~6+X8R zhDaX9P#W}5miJ^$DISft7q!RHZ)W&pv<9@AWwL+9pfjB;`|M$=p^%V*P@jQSaS)gh z+=J3;-sXY=;^4`3Kv8CeoBG}Wb@Wt+X)AZ+X98NX*4 zPg;4GRyTmhW81zf@?wwB-ylr*b~ zXp4_CLoOGFqJHf!A4)`g@l$%J`O!lHu0aU|M2pgOsCeVR5pCI9r}samccOvy&_UN& zyDwt|xwz~)J$8NKk_>d^c4bM-uteMyyf%N(|KP!>H>lrOjo@3{MPmU&DJ|Y)dQcQ- zKlkm4MnpKty48z&wLFmiDYKGJ4fQZiX!7$gy^Ik%po*Hu!Dohwe!`x>8Ty)v8y5P! zG7!z#ySo&{q05r<6+S$hXq)mddm=0=#K>=#S(0s8JKVf;c>d9GFk$!Lu|wz1xK0Yy zhBTMAi-q1w3r(WI>*Aen$ppiEq(RG|;q;cTd;pRoRmxt7V7jx(vZV1^`AJ}D^;7%p z)%xEz7Fezh3xy23-|k~?`ZE}ZK+~uLHn=m*VMt#lK$@o^UppUIaLGMO9v0S z{Trfbtsa(ec79+$s=tRhe~D#zpZ}8b^%0Z|1Z=2n@5`%lgQvIrGI>RTXeKN^)K5BwxE~`9ZEz zgN=!(;w8t9nU^^qYXuy4pqFLVY?`TnuVp6a%^lx$M7q&v$O}|d$R)Zgh6G{98dpL3 zZIC|q1;qj2f;MIEU&|f;(?%+_78CG)igV&1BJW9=M}GQ8AR&WvN*n zoeD!hGl#3MRv9Oi#RJH)R8WX&eZ`0`>Wx@+t2N|$RcL??bP6I|=SN!8aO7D3E#4|V z%}j`|8dLQ4KA;v7op?Ny)t}VJmAc%9l#!=;cOiP+P(e?nC1DWa&J~|-)$Tw39bW+n zEQ0@Ayo~=T-kxuKp}+B^XlauMK~Oy!2xmor(~?NC9B81BB7J>Cm4U?NBHj7&nmxzU zm3JOLr@&NE{);aM9vD#FefVE|IXUJ2!MAAwgX|mMyno?K{uf^?`hVe@`47Iw-}u57 z|Nf77IluA!`LB3Ot~$QsW&bDMiNEo3{3~9cf8sUML_vzT!uoj7dHbI}BB>xQ)pNc- zAWwn+_51Mu&FBA^$&reh)^l{oo+7(EDy~n}`kZ(R95oGT#mgcM$hf>*%aad@v8zhl zKA-OA^`>CZJ!u!|?v+!&hS)XNX$6o`9PZAzp@#fhW> ztPU^>5zrv|kf$_&OlUYm!$f>wjS*hKrPSFuBZna(r!(9DHzv$h8t0DHD2u7y=$u=% z{VxdbE5RdSD1=fOqD*O+4i)Xnjes5Zgp;GM0yEq2!Y8I>N5eLsJo3XnFo z>abnB5@3dGTif+n*c%GX`dyClM+JU20iLE>JiDKoMO;=kj2s1~?~}(s7HfK*E`cOK zSI>_*#@(Djj}Dwqo0+KR5=xTOM$rfEJCA5il9gkM&o`&GXF6 zRGsS$$j`03(Of;C);MOhRw?bV$+efZDyTL7xr#R0I64j**1X9mZyeFdknvj-^30RW^M1O4+u{O>dRpLf-{r$qEVTjrK4+VT~=G`_KW z^(1sh!LY3xLUcrBddcWy$?zqE1v*rqA418`!2AT{m*XCQ@QznD?QYgBkB1R7@AyE^ z%_^NZH{cSHke=+?($<7P;b8Jxk=w7`uc@TZzKe|x91{Peild<=S>R+r6*?Q;z4r{LsDR z%gtqHbuxVQt?3|>R#0mKiQqiemHcZj7S_D0?^MZlo{!1II}0}GoY6YwLrLmOp?+*C zWJ%QueL5XZICP4{Bj~*hPo_6@$oEx`#W94(!PeHg62WENEzy2-xV?{>y?Vya1xU{j z7PEck;CJvp@wi{g#_)l;$6H`?D>C}gOgqZT(UP`75;gc3dZmN##Wmo+aC#?J<(PmA zC(iqYN61e)hcoWV=2cr4$M9DTeodYvJ+>FV)d-IhiE~F0fyu!_8O3aC~tgqV+Z0 z!M6om>qmjP)sf~<+pL0?LW7M~IIFg=tX57D za!mbpjg4rY%IRZ)+}$LPqlP(AmbCmDq1hjB)fG?|dSs-I0BFboisT2>dPKjS!GE=3 zsxRe*1cN`%A^e>)pO+IsV5S5jx(Dc2QHp=!A(}90Sw<+U&)Vp8?~0~{Zw)tkHv5pB zs7Dmn_q}?O`81F%`GhKG8x6k3Bm}7+7F*yDuB#{eqpehiHxtodIz6a0QUx+x_&L(g zBFBe^Ne5C2ELMPOnRxaN7A4fZ(B%@*+5GUs5UHiev2xObD!ZzZ!4TWbWf5bER zz(oNLi;6XN+sJa+0tcn*L+gqGl5tm3OamIy-JCg9?9qkvkT|`9$?Ab6IkUn633b%d6!Z)Xc!6txmMwiKu(@>lUGARlJ){t)q*{s2 z)p4D0^M}6nW2fbD-DHZ#F*9ARHOVR)^u-?`J&;NTJ~H!_7(F@*&%59uz=iKG_-C}a z)pnfKC8-||3brNH?Qn|-8bu#Ydxq#b=?smqIbEF9+3v66s&+$gEx$p_EtRiGu65zc z`}E11=dNaUNvUU6Rf{|bgiyC#Xu?=6`R^kL>Hz2m`QkzIvsqYLl08EM74|!V+SaNQ zT%oxsmSy$qt7jPENg`UP0Ph$Vp{)G&$F zF^OYBmJsCgrAU!T{b`6}GMO6@Y?)cf&jEiYkDGxeDh@`zr4-g(eo#gCMHiGQ;q+LN zY%@l0fq|9VeWBDMnFmtsxM*=oXMG~5{k;v#(UlKC{7CBU?e46UHlTUHj;y-)Q-GlW z;bjvleaaP9<%`KNd#g{en(!_V_xx3Vy8>W_AGwrZh>MDLD!TzsV%CF8sXkO!dOnmZ zfy`bL*OV2>QCOiBmd>kx*ZzwAN*O_p6EcsqGPesw?4Og=CuC$@-tu~n5q^rk-s$~3nK9~map!~ z`v3-&0C;E7N7invFCIA`4$3`aEr<=3?r$8%G_4C2TO$-;v{sae_2MH^SiEa8l^CqR zf^#FVku|F?Fe!Ii>j_b!JQXIF!jmF4R8E9cN-`Qe4w9mb!p@nVdIKVwA)r(g zz6{q2m8UO#YI>0(EGQ_Es(5RFl^X)PCAAac_lrO9 zv?}xNK!W;^g%l)D3iW!ow@EaCpgB zAz4rDl~_Vf_Tt$(zMxnLvhf$}U{ADN*q%;0A)Kikd;_LQlgkDT&=tUl!?R3c%y~+T z1EdE7T&(0tn1R8OLfnW$nEZ%>1Vgy=4*m+$vJg#3Og9cPGg8wBv^B||f44g^4qg3JCng zmtv(Vi(F)AV)82{1SLTXH-8+=tdpuMzy{!9icYG-f_{6^b6H04>XBpQqnk}1$=4GK z^+f(8cTj;AAq&}=f7B4I_h(Amv;9GJA;!ch=h(oppu|+?zA%9sco`rrz|>Mk2kOf> zNGGO9t@)Ie^*SL#ji7Iiyk_miA#VFE;Y?!Rr)7EFq-BYZ`7Dknn?|lBhA{IS`-|z@ zYiuUi&5K`SM>oV@!EY{2w!+=$P;G|Fx{>8N6GnlYW`t~p9{(jeK_?j@pk(|D)`xLc zqg#zgIgiqUSAy73^PC7BNHc#)5A+--LZoy62j)cnOw*~LMLT}f#qmRhw9C;$jVr3_ z<$CXqiMW!-+S$GaEEsAU}_!Kw$*lNS3^ww1w0 zE_f7mo{&A}cyIXup|(@~S9&m2nz=u0$ov#vh+L~OR`3hN2XrYs{5kW;Yv+$-37`2Y zK?adVf5K-XD>Y46S@*(k6fw1rgP7^b>Rz6W7+x6zRRrFtO=mqey^O?0BRGTv+@rL= zAmnEU%1^GURV7mn59H2Fpv!zc;rYsyzu`a9UU;Ril7+`;>wg}63Y@x1!&p0 zs-cWhnLHfTFof1vX6K;ZdB1(o&q72JJMbxVAz_F=n_9&_@cXjE9sTI`u-ZkM2zbHOF}>hZV;Jdosl39k1b+#GSw~Up3l^JUQlSGJ$}ttLL$3U=SyjK1P{WO5b-VL z@$ZwNf%d0R+#zrIz44&RFS1TAkU1-p+gV_R00LxW--{ zq2bS>JgycW?`Sy+!doYY%vJXWImq9m++gmsqp-aI_VC#~67FFveCPByl51)Zpm+xk z=iN}k%U1Eu+*VKC>IiOE+P*j)3nZNk5% z_0o`qzRv|ADN-ZjRWBMsG_h{;tS$H)U!37g+9{qBpnay^TD}kk5Xuh>@8@O#uDqk+W9BVgO~*b^Vg5+}*Cx>k04JTfG6OUS58t3|rkkO)w_%uR z){)97;XG>FAB~rs&LF?A3G=?dKRRV>uD=jg=R9BWj#M=3fXS8#u2h*}_@~=l9Pf4k zJkq}KooO%S(XhF%);*EvhItNR?hl$B$&YVE1T|ZrnRbDD{naJ!yKr59=LU_dX1q2o zm|Cl6d^Rp%d|zG~7gVj)H;ye!?RBvq;!3R>Y9U#$)cj%XbD4|D$<+Ko?Q)sP(Z88b zn{N%+H*^2p1pYK*BDT#mLX$&o=3iKy-4rcSl-&f!^G%{z{&F;bIg-B|&R-7sF9+Rz zTq40HTC@mkO3o2*0S1AdZExsDXNgC+>!VC;<`&(8Uwwc6P3Db^qI~fshX$uEYV()& z;G%9B5Ru{G{2p{JtZq~Eeq;cAB3=8zL!U1|%A7(4Me^2$W12WHndLypdBt|&>+s_U z3gk7rY+p4>=+F0e_Yv)gCqjN=fE`KGL`fLLNdY1Xf%K`r?-pSA(dhJy}tQ z1%aE zVRRu2jDsk`GU2Rt3&P(5oQd%`wK*RARMJ&7o3Zd{JD_^UjB3E1UYhnnO=@y*)AIqf zEsw8fw)xhN)wV+;b*kxdDu^q)kc3Pi70TUEi}_LNc~MGpK}yL$Q zFcic)mz71k`nC2Tbo+RyXWq8STOWOQxzqR7BLJUEhm9afY|$ztLubcA^|nD){a%4D zy1rZkWO%EjNTnc}GiQTtcM6HME8lJrUP;b%%+S_JWg|IM> z^@HCQ?UCg^U>4bO(LE?pDj6(T&U-X^Dx_z8{+17)m_8QkD)9>(Tdwe)1|2-z_f0ox z+g10xcTCeK%+7#ZR!$oFkPSOAW*+K{8-%j-4Y_#vQsx(D)W+bz6O!BjBEHB)5MVCg zE;NcKj%UZ6AQDS3isTBmGMy=qb<>0X4O4e0esN8&#zpkM1+{!#-wlZm|PIUzkviOU#{V_oeHkGM}$8xN)m)jm4yDS z(i5$*E13k<=?I$aIQ|g@fJ&7IT&*G|boZr$1$wMeBfE_SXJMf`w?uL1iCjKIU)(Jd zEd>rFdK%Y28#!=i`p0IQ?Agc!D4M64GG?AwD z3)--Fh@TtPhzCA#e2e8LP_J)!vWNc2~t0vyVl&g9Y&yr;F5;nIp9u`ZdF< zkN~XyC5xnPz}!ZN3x1XODkQx+O+bnVtcaVLYfSFOIlZdj3G$2mWhw(kaZb6>)Rl+@ z>FnAt7JZzOvI*V`@izpnmSHmXO`E;e@C@#R8Bxwzw=Y{X;)I`wqcuak)-$Fb=+I^} z^ZH5b6yb}K2SifpjMK3!l^DmO`b*Fb0So59J9OR?Di@M@=Q@nCZI=q5H5kR3H|9U} z9RtkB6c!ki&|H6_X{A!hODg2{_uqag zeNu{ZI;MWR_#PJ0gDSoMM`=<{U_QsT-}(V7MuUv2FGskXs}_jCd*IIFrYbM!=d2eTfx4vR>ZXB*MzI3m zbRm9T_uXG(@Yli;{Jt_IE4)tiDuBFbzD-E^S)r*pe4DVXV!nh}>oL%^xLU!j+Q}ej zeldt^?%F8@<(XRmJ!3Tp4&L%3-?JQ_x75M}k04}MiKadpO7MmfX;lO$x0#z)KmbF4 zCoD|3hOFIhj%FG-Y9(ThW?8B7(4S9fB1+$yanjbqYLGo@XMzno-5Pig#n*^eTGa%U zONhKwe2fgah|-%8HcM8~RvJDGa=CePqZ=*xWhAyXpAIDAfvqxsWco ze~l2rM$3VUzMuO1KaA3m0&)TW!+}nl?6xYkI60evFTjp1Rp>5P6p&oHu?c>d{ZKsc zpcp-guf4pa>VX*z5f?ql$fi;H-t&5dJ$7H3EgRbw_#hSFgim_yG_*^Y>~(*;qr{Mz`tY%of}(O{Zg+6919YM+{n1dL` z_=Px@0NC#Ov!F0=%z_9j@ciPBmK16I{u6RSEXFVgq>ixRgUDhRQZs@qBsg~9pgYE` z2m<23LZzy&7&0ws2oxa3ay3U~LrU>!P1PKb^ysIa6AEkIwc$H`|0%OfaQlX6KyDBH zVgm2UhN-569|#2gC>vWQdpaXK2;Wc&*w03n=%Z6cDH=g!fKf8b&KD(Wh%O zl|CUIw;-&OlwieiT*R)O|1y8jJ8jIWAd%v=CLOT)H)mi=Eqf(+|2LCxFAdBn zc_qlij-YR7AWeGsoj^c-lWMgkf^=b#$sOK&L+ap}`43{twfcKUW_gT_?>nvQWa3V7 z6MzjIx?U!7-jcS*6TW)fx#1f6hRgK>4ratvdY%Pt+rX^uoaO$Oy3okXUa2d`X@EOt ziRK+|BZQ4_lW&9Dkd1VzX`l?nW_?!JVl{;?P3G#FPOB94;&_}fV=SqlsmuA+*<_0b zMCJlL$RR)TR=zr6SRD#z*h-4TsU2=CP@{bheIf2J04}<*%Xhy#G5@r%(OcML$TVWK z)yr?#?O$RH#z;SZfK5ElbytPKT~0=TC4hnV5sUP7u+;<0kF}{DVXm0 z;2-hMxas$`uJ@`cc@xD1Znz$NCa3den$uS&jP1GIX#HUY%ALr5aZ`9IF$NS%h9cq| zt#X@EXVKEbR^5`(cm}hWdlks(ls{ZsLjag2YfuD+IbTREunSjvZ-p!m6LCrk^pVyr z)@u4&&;m*OB_W++sZ4RiuF{>+V>o|qvPAvm82dvoxkZ_kVM3Ml{WrVuSWYlD1X{{) zGpPVMOrw&)ngucxInMW6D6_L_b4?UQ9L4rdidQW~rkD{tnNh+|%lL3346e!+UA3ni ze{3kl&$@&gq~^7~syjTb!_Vj|Fc;%SEBY4=4Pre!uOm;JD$SUM&#`+ra8TP5NBW6uu;-$&Y`DF9x%tU_}r!rlHR8j#uq7EG5_kMA##4m zS#b8_i>FT*6b}^!sdK^3YZQeH+}yH29zbw&MiiQ{=mn#jF$>9PmhqWdE32*OkINPa zQbaCIA!4H%i37s5g_0=jp|Rs*Y6hAD))p_3)|hai?22#NUh4W7`#O%%53{JYgEmI# ztC6YZdS&60ybhP>G_~%Dr@6o)rlOLtQKqMU(R-Bg zhVpVW->RM(8mtL(AD*hYyhyuY`D=TESXbv$7p5zf^f=)GRp?;4KLWL(IlM&gEzt5#PUyC8@Cnd`$hIeP7e;5fM=(o~NrYnf0S0+^p4G%=V0bY`1 zB=FE9Vmm+BCYHj*EzrY{4tanao9<+Di;$O65`WRa~idys)EPpCad>}bz zOd^s9!#Eh8{5esbPrst8CBm|ynCbI}T!tU4Ir7pqMd(bofye@NKk#`DLZ`K7z?-489`4{^7ty-c?r z#*j^aV)kaLr#AbCrXuHA#bizB87r`3bvx!ar?BD{U(Yb>u#= zwZ!yT<};tTY2BGvgsl{3%eyaTV((5+i}F7WBPL&Qgf!Ma^r+-Nq6np<9BT-L>I%2y`bSb}ey_iMxBZ<# z6@L}q(?-23FXRui=4z9d2m+c!XR_y+GqSB+In*1=e(1tM;TVH~XQ^pW;h*_~49{oz zqvnG`cN_zKZsww}?v#+4N-9?U6t!kT=7R8)5HJVr(N7KegY4#**yHI_pssg3bitSm zM7Dg72?an;wkbaI%bjev0Zv<`H@eo$Y(NWsJV3@-wGgS}z9s2z!40wj!gG08)SQ52 z2MyzvSyO^E+S);%^zgLu6L}=IJb$Dw4*`1rL?-sWNK`so#yc#ZN5~G+^HqWPgCb7h zm`D#!|63Qxy){jN*m8oXCWIFqaiU1*K7KZ`h(lDO-j2?iPP}ubI)_p}Dw%rLN@J&R zTwY;Zdy%=CQP{SlIDk!cD>zI!mv(8JkQTLDw(3xRM%qVmSN_Y*e8!w3tzhy9$uS?Q ztf9teC z?*?sJ^?}QmJ!asoi||!fdOjJvS-q=l#Y{VGFRQ#=GKRdbqUpl7J-4fGjA>?`f^m~% zeE)2#ZQMUX2#zemE>#?)c(y;e$c?6;@zQFs<>wL{xOz7Hx@&lTam{*l%`$Vx;>jDliIl<;Neu5^ z9fKuWWM-Eh?7woaHz#)YOVpF(j=93*Y;F9l)}Ns&il~89sZ6Y zM9!1kmMKCIAm>)DE7Q()y^f+efwWqD6dUSXfCkQ3Ik>)~l2vZTIiX1gRH>4yziSdkcgj1?{Y+8ap#tecHxmsl%fK33~L!AV2 z{T>x`gQ~+cU4BWys8&IM4Z(V2JWP%R}ta*UKn1eH)x3Q1|nD6<-cm9I-mq?hoFq*%>>QkBkO{l&J58 z(qln|vYkd1E7L&zvf)lZJ=x4byPRg6RC-U%aBEx%+pPL3{CGX0BD?k@w~p(O0L0zB zVf%=nd@gf(Uva2@`f%U+Qe=Kpdi%04dn|+ckt+Ro!pbP6Ktiw;{3@T+LN1lo@sNhK zkPOwK>||heJM6Z$QG(ZlDcJ1{YbkvY1(00HPbuM4gf?b(3_JmhfYwHrsM(ra?SfQcg%CrYozwX%ZM}funir%4WizVG%Jpiq&5o zTbVY-1~L%2cFq{l!-rHwxAz%UzARLIgoKN96_PcJ>kE+)W=;>x1W z_BevMCpoAv(VP=K92Yl^w8up5`S6CJFIX!u`_tY^#Srn5d(t%94ey94rg8!E$yOTX z1YM(udvZs4@tY`plM(_P|Jp}e*rvavs`k@tFTD^-Scg0tV~_oy`EHQiajoUl`Ipj@ z-3(w45)GZk4#oDT>JRRBEDfHqJl=|XB%6(LpAOlfb(Xb@LbOaNr3yh*yQ%UJ7$uxd zMu|VM#(OA07$C>3A)ddjv(LHGs?;FJc~^waTM@G_&I9&Wau&oz2_S#!IWMMBFip|W zfHFYJnjoY#Z}R52Ho7(-%KGq!FK;~*LQd47l_$jTBdhguSHq&D(hi!mo=(y2r{sRa;^+L&dWAL!F@`Q((2+|61ty5WG0$enPLe=u_u_K-=agh_-F{HezKsy z5DKsP#r27i)^9g;?o{*IzxRtCqC7d{967^o^JEv8S8B#BQktKKG^{e+ zza5y_+Heq&MVD3y#APwh;h&g0wkj!hof(E%bnM05;oUxc?oQSG&H-p{rfIB8uE z#nDL-$fY$iu?pIM)iozC%tXkfs3sj5QMgah(s7pf=|Qf3xQxR1?gQp$@!KbtW-tC^3jOif%=iyl;o)KZURn3dF= zfhnoL955&!DlQY5BNkA8kTYj4Z%A(Fpf_}7!aNaggRX}3Rhq)qRFYC!EN^r}&Zx!=pXiv=!_vMdX3z*H@*0F$4X{i*P0?Nm3xv}FK&r9Nt*mK3WTWdRdt zMV`sgfcI=s4WUkBY0W>jJgv}hq{2wV$Vje&Z@NA1v4o>28Qgwxd-Jx+107Q1&hS!slY=V_XyjKZYpIZPq4%=ubi!`lpy6! zA|}_^{W!lxG7MG z20;%U1U5uJq~(Fe{=Q4#Sk*r45&ox)SlrPhH%p5nHfgpIjKmh(;^l7+zX zc)?lA$QgV}SsgTKGxwU%rxK{GoJS=hN{cvW%m*zkLd|>{YKo!e5Hl>%wyyj@v=#c1 ziMkfk^DRA?E602&S%2$0PzIuaGeXw);k5}WMi%Srv#gAF!)ZWX9$4NI0Q?S4*uG)9 zplV`YB>z2~du&p#4ZkF8@<$cXv`)7x8X`_Nl9N`)N-I_`pNioJjC|U9>Q{g!nmYOb z<`;JG7z{|heE>Xb#)980GfPEip&8i+;cUQ}!NyY9aQRs;n}Uz1l=7MU@%@~|SC)9= zwrNL|Nj`cTN)5zZF#7JeT3CF4*iIP7_xo0DPH~u6SB}D};JxDcNlyAp7FBjY*t`C!z=?I`zyG(+f26QvNE1l3#U_sWmm+O=X(>g&`KtR-yi0jPxX72|^#K*!_j!Mg!#WP0^&cy@(cj*^c@rKEAy8pfY zM22$c3)9p3wLg{+pTk*IwuzHQLEGT(AyS%oAdfo*WG?+tB6iT&+5nstvUDK=cF0*`aA;mPA6Yrw>#9(n(RgTzH{(;gI`}8|ynYgT3K!Z| zOA!=4I$^XtZUfmdJc%Co*(Cc>MnqDY2?+pAH{9fl-xSB1ii@(S5s>a#x?OtDr_Dqc{LU@_ylG-RTbxm!QnY&~1%re?HJy{Vl zX(2jB^AvVoGvtwb<+z^Sd{}7vcoRpQ;4w+I_8eNP=+oy0xH|;~+c}BK@=lkmKKTHFi{xk~+zBKEcOuk!*q4l$2Cfe6qX z?p&g9)!nS!QGaaDR~u;S>Kd7?)0^ofi3Si7D*LYX z&%skm*!bauX)FC%=iDDCOG5(-SUFsuN8QNLdsg}2IRKA`Q&%SsKLuqlX6L%?7rdgI zuAFDqa%fO+s8Dd|P;kgoaHvyoC{wtXBRi&nCexPxsoQNNpud2_!lbOJ`^~`oWpo7e z6Fk2eRpW2Q@-Jg0AOR?nd`?I$7Z+YFIP$X>k)#1!B7Xc^f%sQJ^{uG*R+JZ7jpJu@ zAqBL+`t`#h((#h%1M9AG3-%*S{!nzjf{YUOc;MPC5#);$4uA(uTrIX(M+rDteojHK zw3$bbO2P*1ajSM>eQ~J27WerA=0cx`{VwTOp;s&QLSy+Fpw-M4!8A;V7e9lhqU-Rp zt7U_jfOG36RdPa@d6`%P69IZJK;+nK_y$>;bIRd^Q$bktfC73B=-H6PF{8`Hi}?2l zwlJYf#>;#&?9AvEeplW|60Oh*?zwp-k`$!){ zV%<+cYS=g%Y*@Lq9#8|4q(orDe&GNykx_wrAeL)^!R-dc0LqkOMU#M7PT729khgmI zaARU#Y=t`1p|u(I68J)`t&t2ILjSl(UI``VxKQPA&Qqb&KkErp?d9Aj=s-FRI#;JI zjdd548*D8P#9?9vLS59Owc!qD61*A?H2>jpH_G3HzAl6aQeuItOJmizlZVrG6FYEg zxY`58i9G-AKIP;Y>(SP-yjsZ$|0|@^{rTGK8a}`T5#YN#e@-kKr$dF#o(BDPiKOzW z3{PxzjvnOlSyrrE7{h|AW*aa%TOf)cbvPe?_@Ckok`jVw1O?6zHHWK+c&;Nid3 z_hO0|XcWzzrcKveh_pV)LJL@`9$FT}53+3-pJ#VND1l zlpy3WGH8lKF?4zAU^)Y^bA*N$A0OlfFyC*2LJ)|2nh77HcTfwoBzPQ$@Pk5`hCW}V zrT<%nC=iw);m87T#_Vt@1ZVSIp2r~Z84#yT9RgdU;~nw{1l)4b(T7S)m8Snr`A0?( z0eiLfsiD)UQCtTEBT^Kr@I3>6db|I=!xFRFn1YD;%E|r%qhHweDlv)kQ*Q&gr8CiNdGoI=9K+o%gFC8NQy`Lx$)9(Ybzx&Rd#wLp0{lzc3h^D%~ z_uEsnEt7s*>33|^@RQe7?A1-IM*X^^WX%UlWB9CjdvF;^7+Ox#{gPbst-e@!yi|zX zjNqncr)7&)iYy~IR98>iRC<|Xi#R`08VvIpS`KJo?d8yopidc>yt3C>mET99No!w? zEei_?{jR8_gP0;CT;b<@G56O;iq(gi@Z>xXQ|XlV*KqM?a#@w|Efj4hQty#$WXCKT z$hLd2u#Oo2GB7jv*efACUMa$Gah5%Qqb}rr@u5&bFdYgrCuLwjNpXt&l4NpXDxV`t zpee>FrKD&@eG)f!24L7%T8iClDnm!#wAmX2sv|_ z%h<4j9AijR1Q!akGyd4{oIE3VZA7Fo{kN$hGNt#PD~#l@{0r8UgAPCH=oEr!_B+>4 z=ElI$DJ1zm_2PFff`0@V+69Z#4vrvH zDS2eRyXE>{^ohsvzsr&Ne~Y8L19LZbD5;)?NHYOokwS?AS0LJxj(4V>8j7CWK)Qig zf`K{mR{K%SYUq+0iV__JPz2R@07Pb!Q(};z|A(%34A7iu+J?urZSL5%ZQHhObH}!A z+ctK*;~m@jX0M0${eI7nR61umN$2S5YMhm$ylviJw>Is=ax}KYG&I9keg-a9@^LLg>CjvUN`-@6*6557DY5suwXclEDJ?`+5-}u{tO@*h!Wtz zlVA3rEE5B);G_d-z9_Ab!{tU;vXG8xW2bVe2mRt2H&<3pq&} z$1E`-vrmf+IS?>xLGXvvGz2931%lGGupUrQemm%V&fmXi0RR=Nt|WgAf*lx0{`Vwh z3oxkMC>)AR7+9Jtu)O_H#@`bNDBS&IdB4Hcx#X|^xvm~qgbEov{(oQkzO)R7!j1c1 zIsX05+R^<;|JUg5+I-2Dq=FJb36rHhNlDd?k zqklaoHMtvbnmUG_q(S187!i8Jr_q4u2d1d|L$U&f#K=(si6|Y0o%{+I7%2r2FxXd; z{BJRkS9e1x@*l#Sley0s%l|u5Qs94y;J-N|`Ts}EPYeN)te~K<@)rLUq%cs}xr!kF zB9K7-J`?o61Z2?n%~1Y6`+vm0l|t9%8aK|aZ;*%5asnF~>}jgnVL5eNC8o?)@-lpL zzVq{ztNL#CXJD<`;e#zI}mY-O&)h;1N&&I&i z)?TCCUF&kJOotf+k4QiP=v_1VqRH(!sJ!Vr?l_mGsasF)Ao|6^^t#<2q(8@J3EOD~ zR@KG{xP<*+2-|Fh7N3{QdQ0Jk1XXdSK-~{>XZzsXv-TCfGKe{p0EZ$YcWI z(a2zutn8RiVTp)?!l<(5TFjh`VUTYul+u=HqTyIzg#z9FE ze&P(+EuyfnP;V?wLAUW_#uWfyiTmVWU_rRp`qFQ}Bi~=LRuj-^w6xX0LO36A8;N6w zJ4K|05Ts{2!%n^4S?Ngv#!Kl91%laz=L@KJ(2C%iI`+RZ0B_kA{d!7p4tO@j+Lk&R z8sC`2D^z?jJ=M)yp%v6z_(qc^bkE0k(RC$r8T`t>n)zw)x>{^C+O@(m-!IYBWOEl$ z-SVdnW?mj@Vq0+FFaD(^f$GH{5~gh1hm^naup@D8<>QUf1=JXon{(^qCVc|aq~0$* z@qajxU53tWQf3RTb`<;t!A{uIsRUwOstk!Ll?`jr zUTns|*R@Mz-u44XQ|)PKMh6YxoXf-nPfdrX;wJB=mkC)p)88kbY4^L*7R9!kbk2Uw zL|j>0L-+t*5_KY*E}urmfu3zEvi!)rTI3 zW}3CE0u+gF=xYYLt{liD8~8!h9|WLn_M22>?Dg{SNiL4;atOD5?pBfm#gDEsr5c)R zM}VbQN%`Z_jZ_gCcCkXEQjpWxcsyDK#!zZRzBD3naA-K|_Y6*}SVc1VY=gNgdwOYTrlt~)h!Gz1C24D2YpTOlXF^%$u4?FO2I7W?8Vj5x{PURdBqOT>wP({-m+zXqX|3b%ExO)m96eh>*P$bqWo@(iyp8@mEv!N-2QB z;&mp@&@>&TWLBbqj#~jVJsXXixqJ&93&T*dmRyJ6smuv+)J;8RmmfjKqJ7rvx)lx; zsg<_ON((q{WHsAuMy-ysJXlCP&*XugxW%b5qRlSeXZaNB4l(t_<7GyWT=tZ+zW zp0NSdt6q^w631^Rr^}-@O;UjeA*uWx%OZ$jNda#WPGe^x(acJd_}m4}w#Ef6iG&;} z!N$$;g*O(kIB_nmq?U)g4eOi9rh75KqjuLIswLTNNlxeSj&=9SUh~-FHTE>6&S{}D z0ctPl8AuLsc(O!yPR*Gde17(HN^CDyn6J9Yc;lh{`rww#xcw4_&HDY!i`$Bz?H$>m zR>lGc+?s`v#C-m0)-7duC)d7EO_9tRu*gN@8RGdCE?}vA^ekjZ3A3||fELoT>YZCT z!Rx11EDN)Z?k#P-Q|f%RB0a-S3zn~WTi@%gud&U3v0H<8=3IQ>ZPy$(%-K~Cn?8ca zh!Y**w%KCGZ!wJZ3{=af7$&C<{_F*6OblqU=k@ktP#v>gGm=83VjTUJi3RH2V*Xlz!E=8>K$?I))<>|xl7jZlu z5Fr_-;ieT-84>N~Sa8N*Vn3UvIJjLF4RlrDOml}p`og6+2S3`LqMO#$cgzB@($xf| zvR^ipTZY!&PRSYrXJo57)cIR=K@=dxxm?oDofAmm5`ktHjs)i8r6eN1f6XIdVOx! zR8})m#v#vwwBw6{1AZL{wLpilI+NB&Ka^Ap5laYh36eJ0vdwFC0pFr}qK7?a>GInj zdI8thFDj=n4H9;G)UUoE=%R2zx>-S#9N-*O0noTFv)Al}wM?6Z2`?wKQsGX$@wJBk z1RA_s^uc(Y>%cJZ)ZG(k^L@YA?Erd9a4{hQ9nNqJW3(?`%(ja`m=Lc$JFQ0Pyu=?; zbjZ!ZKNY>)$`|;vjk|Ja%q!(HXYSig&UwxdYATe&ja1i?NII*2>qzm!HpOXVy064L7fzxSa6SQp18X0Kl#jAhH7v+=(s3z!Ca)q*MPgQ(WX%X< zE5tO965lM{d^47Hm2K1v!z&S+Kr?AiKCwbV5N%8;qyt-Agk0+!MsTEMc7Xc&?Po0S zz)1BlrcSAaThwxH0pn@o@UYN(W8??T*yOoWs1pz8U`o81FM#tg|0}vOv67gg`uSjj zgE1il@t6wiC@+guUxO!uE$-3b_vkZ@iZpZF&b(X*S!mOHgjUpIvU?qGg02>p2U#mK zyJCqK6)=f%*08E%!AY~U*_5mP+Cik+$*$+zAEzUwa4H&{E4u5?O0@J4pXLb>d77D66i>*u8ik+OoV7>6n^>~XzU2}oalw1Iy_0hd=p(& zK$FVuDo(fZu&zMd6HnLfniQ1mWSMBG&x)gAgk#Qwn(24+;Kq%Yb80D>R6MyX^7cEk zO{m6AEncSJai-k(O2bO#yLIPs;JAWFxmf1?MB=;WB1EBku-TM?pSX1jTyVUM5kYZy zdT?ADFMr533<0*beU8NjRF zY~k$fbhZcUIl2|PXj^sQ5xjG?;|m&BkB){Vwd2LWQF?8WOf}|3t;yny4hd9E@*;_f&FAWRl@m^h_@#1>- zeH!mSP-j2JiKtAh(qFH2u`lqKS)tE$5H(l#U3n9S&Zg#N&qvIn zVtxi=B>Hft*O6iK0i^BFszo+hDtlATR=x=7%b;SpHWSa(NDQs{cq5uYavcer77H|i zw#oN|deKg0Tbl1xxfLv2XUxE1I`8gyirQi83@JDpS#%6(ZRpynZBRU@q?`MyPDQXV zE+{`OmZ{I&r*BN8pS$^HQSa-I#-f5{A#^%(kdvH1f+8y}o(IQw{0w`IK0z(R;sCLU zaq7rSJnKeeqNPhV32b%mM5JNV;%#X-YmSpCGgH72efpGa#!RL&o3)O~WL1G1BVPaI zIeo6}zXDcs#)WPS4f=7e{U;c(RH1Fb6o{7kSU9^K3^AUycR!Ebu$pcHHfe&aJ(mljQ@3-gt49=j7X zlySnX1W&ItGC1EQDcQJad4zOoJmjSkL+F`Hu|GH2{!uVQ|?JT6LIMw1IZqt zShRpovM$OtXOxI5XCZ;swnu2#rh`A+`tNyT{*c{_t5xyqBdgcMpg?1mF^t1ls0ym~fZX@Y&jnJ@Yti4r7Yj6QJciK);J;7wgs@zxeCdn|KB;?q~7=VUd} zAqHe>H6a8^^$XGQS!Q1xY}bf|%dwhWHE%$h^d1Plc{k_A;(iZ#vng*F_jAPwW-d3Z zR@;ROf9upq0@j4`D1lMt1tjkA_q+&iHZAv`aY&R(<74gy^WqC?QSL-@hf?vio%Ytm zq8Hk`R(p7vC-ySWnvC|R#zF&yjrloppc|3f3a$fek8i%6!$dC9R5Q${KoL#tc@sYh zLGsuJ!^DC;GFclB?sJvQm-_jEw!Oa#523T63smjaF-@1oRjF zhK%i8lH*7HIb!uMh-%+Opr7BO;6jd|S_br0C5V}{CzLT-5(jB{F3t=dwfWI~$I$Mi za&h<4wAlIejb5$Zta8x3TWWiE(!BkV$6EuvBH#yg0B@oroD#z2gGca(%!o1wx&y+n zz-v8)lXumQMi3}$>LH?1l1hatM;k#83r6Tnn;M#DQdXr5i`VZgsZT)aNj=y3MTs3; zo`^+#%vZHf#l5K&D3|#gjU8OKZUCfObmxU(3oV_ctzCDtw+5bkzTqpCW0guq7kBJF ziqId>{n;@ki>WZ3=`Xn5px-{jcsT%3*N+~u{PyJQ*6~r)yE&~}qHD6>?xU9Fbjz)& z73XKZop7q3ajTz?O!op>cy8D{OT(7gu!bea#hN=YQc)ZH0HWTXBj+pA>G|twa+Lho zT4yRAIE%XFm_(zRJ9#VPqtEsPH(R;ip!Q z!Gqo?bYaCg6(7GYm4wgylL*rDAo7K6w{6kEqz2yl-!4uqn(kW54q)q>#}oe?k*U8{ znzxTSdP|D?z$;Dg>G|ebQu-e75Q}72v0Oo*h8@V@vX}i~^#}!Mm0jFw>?aUt9EnL? z;{9Nbv;(jF)hV`rMTQd{I=H6454zk%^ffd&H!34lF*-@#qv@zudRl$Cc`A0xkRDc# zOvJ+fHS9S01&2e#cYmYeJbQYZCrThqx->J!7m6hmQQp;ot&p_00ZNv<`^VbR`?+8x z6mbiz>}WET?wD?CovnOe8)?)|C-3p#e2mAWcT!~xkAEi@zH~4m9B4I^fq(b;{@&S> zI*-0aDGdN6HneekT%6xPv6MdK+1`_}v{4&85Na(5lYjU8+MN|qA@4`k4Li_MEj||g z@5mkDT`EXG?`d`?HxNA|{u4MEx6Fx$h$1dSVrf7m4HV`~0kWgeqPwZ?X&_ks*K6w63%(yQRnEe&-AYyR&*WgXPmM=~e0M zyExrH0mX7YDXV;faLZ7%pC2FS(qc6$H@vWYdwkkK6STpf&M=SH}o;Z zB%BjD`5?2D=;G@xIMs{xDr$ia^xg4y$%u#O-@V?5vj#x?PD8$OXyTmXa>7@}-v|e< zue{!tHpD&mb}eL7K4VgAc1QGlqEn;&6Hp8eSKx_{4=3c1+KxJ(i5Fw=J;xj+{qI=c z+YBa0E$qQl{q{u=bv{L$!?F^lWfxNQJ4>v(WG@k(d5(c(ig!&#s#y1S#67oF0n_k7 zd4Vx>-flJQCz%_7uzVX!Q)5E*$H;zFgr(5)8%aG0K{IakeuU|HLxUw}P?cdw9u%Je zkKw%F_OrRYyYF7KqJO%=sy#D%dt>qP!s5e*!MDpWU^AZ*4-piOv@>9bpgSQ46Go8t zNR-W!32bR)=c_Fd3zj%nxmw+mFOmpkZ~P*b%VL-G!znteYz`}=qkZ_;2!6S?*^5V6 z*bUg5T()ASEm_N?j4+UYm+88lC(k12IwdtLR*F^A%n zdPAWf&HIzD`$ZKrR|M=b%w4hxm5LY)+9T!Q`tZeCt2q>pLHZ?2CcbJ+`jURl4uNf6 zG1%_DE!Kv94|Bqe9rJPq`q+^a*Fibg^H&Z&b&xyeicb64AEf*x4Q}$MbAzF<5WRz; zLp|}G92|%9e&Z85zA2b)B%kUKmYdt7eDIrC6B#7+s>>m+WXaUg9>F%?v3S@r44?-X zalvpjy}ZZ6^dFGJ=xV-^@y?k|2>^i+mwV<-mN=48lu=Fefo&O0*12Cxae*#jWtN? z@e?k|&-7DKmM&e&mfHnP%2A9rA;rv7y*Hon;j*T0*UmOc}#L$t@uq4h=5KpGU{0vlt z2a~8N3NJz5c^yk4Ya+xH$7Zx{ByBZFBGG-Xr%-Axa~~X2pKnr47e04c#-rVl-A+=- zl*vz6jyg(;V_s*pZKTm4BM!m2)!K?w#T0~PR*^d0&u`+Wz6Gh3h?g-?F`5uNEs(76uT;Aj^R*&yUH739Jyo4rw;q;3DR!o6*um;zKkq^PmX?jEh7r-r)$F$43Ed@4 z27S?$6f)Q~@7+Zl0WD=~$cc%)wbakF&5AX#&*Wa6mr8PT!=Af+<~(qsr4s0Sc1!|; ziVYL}F9Qo0R^QX=_%85CipRt10n+tBj)!n&IKGd?{FgemlCPgzLBRee8 z%*QqenKLvigm(zR{Wm__wXAZY+3x}oee?HX{67VgceJy2`iH((M{d$~kO1KwwaE>r zL?TOlL;>k7-b${UNF9j;81Z+7%CaAwk9NkQr7Lso=k<}Z@L#rFeBC;^cMAA*kcDHB~AEDaYAKMJd3nK?A<@7olO)C~Sg}U6K10cs* zC8=0fdhalNKEBJd=68P2IyMqDH4^zw`AmLf{J-WJ!3n)^SiS#^!@Y2mZ!Ry{J68BV zjp?RdWjs#78lAq`2^i82^-#3R+jBxB$hcyPABnXwZd zgGLFTvRR6n1Lp^}eWD3Un#k>??st}|_Z!DoZ=lN0bbb{Vy5v}PTsB-MQz`P+=b8de zlu)r$lBBd28U_l3fl=BKkpT$G5J^Al$>kmoF#X=a{#Aj2>Ztv9zairJzajcZi@za~ z9i;yY(Ylvq;zE(Sgy%`I;xM4Y?~eM_YSJ&|79|D3ZCv0ze!0rE<(VnA^X+aUHOaLR z`hh`7fWo|jmR;rnMd?P+6lky*S}?3#QB2pxyv8MU`qZ>P@?(u1buM_1#NP6q3XPgd zjcYAFchAgE)6~JX(I+4$vgx|jd;!Y`@;0{+$BMKGcU3b747Gb9f;<^%+$ld6BgBlV z3Vf8KO6A?Dgh!VZ_dhb-t{0D=-a@25>3S<^##J*=iePUe$M?>~@f^t1IKH$GtpsIe z|3G5og83egU!|AQ{VOaZ)iad6-;neH0{|d=!}A?d;h#1`XJBvtmlZi%Nx*i49^pN* z&r6z%Hku$06J>@ltc5|Jg~P5qStf}H($Qwf$0t>>U`#@8*}}CA2i8s8lrPVr4jl^jWwaUryAxR#(xMg?sQ;@a(jhV`$qtNsRsH4y1PHHs#==$ z?S{rxYuRHady_8#3qm?Ww>)#rUqHf!D4V>65qG04(~YTzHlvY?qj5*%+faC(8pztVZ`ctFv)l|->U!|j zrFc5FaF6$_&zOEWqnpAWt&g)4`2zjd%0?HPu%i90Z0&D;=)XZU{=2e`>>N%0)^<#S zj@%#t%6DLyK_97&7Y2z9QePboqdlY;H;@@l!+elm9iLv5uGxz^?h@O_+#VeA)Q=4j zuKHExDiIANB8U_#j`^oZHd~xIg=3r*>^7R9q^JD_A}aJU>Q=vpo3Nsh^@*<(Qs{LG zVw^Jct=GUvnj^@Q;8&}EF1-|%*O#0puK3?EcMl-p94;wvLm2U3&X*lnE1p(c1o|_< zz>3Sy>`{+j|8&tW;^9I_z%N3nS+z&w2}bU2H3aIck?PRk_xXb9rOVYFR58jAm0{pF z;Dc?pJwb0r>$7`1T_g9o@3W$~-f_mDuR|VWQcev>iyd~S8i0`p=f1TWb9)lHW$o)>n24N)=od@rV~_pji>_B{xme}n4s z4e;L{@_)enhf)5Y#uPto8}uKxrPD}A7#jhBB_6L*vf8sX8dCgO>`^eVqQ?uD#pbem z+ER6AMz+28PXzTu*n9?50xWnzbkml(Eb7#+McjD*0cXPoQI)z1fVU3shZV}WLMRd- z=`wwOXHX*nILWBGh?WRhyKXcLF+anWE3tA-DzoZuAMHDEvSWW$rKhkUeBJurem}F5 zSDknFeO!L3rLsLsdd3*3^_yj~*ks;BmyCAhL(0K1?;OP?U9ro-Tij*w;r9BsojF1c zLEz&1DeZ;u_z;1VR7+ z;CzGgPxzMqAlU!L>A!=x{KK)|ox-CuNDmYG6*YQTTjxc-#@Xb znk40&V-@;P7t7`EKxnjGSp@@Jl#83@BFW9CX*zm3v}2j7vtad`8jQw~lDO1j2j?2H zq%3D$#!;C~*TqkNuS^L^Os9%?j5JY~BQq&Lw8BA-056TDDJeUrK#uHKwZv<4@bNNt z0fDs+*PfHJM0PGt)*PDgj4z{J({CJZO? z_htgDA!E@0bX~+?#v+W~T&VBLlbxJ(=L=2%Cg2rr4+&cD!hR z(g%W=)9{;_`G`;*C@ZdoGDm;EtB4WT60Rfn958d2B8L1B05=?l(WO<08`cxs*wo)` zF;AAmnMTj7&5pe(OgcD4^I>|yl{%&n#e%(ESKgm4(ZP zF8!hl>I#a$tw9U4%ahzQeIT%Fbp7quF}n@z(OcHbX})_&url+q`c%v3=WW%vMvMwb z`3vy(<~v*>7Od_XiKGK4!Nc$Qs||{kF#nJ&1A!P@m#aW9Y7R34}vS2(C_<3 zOTHh>3LHyE4YO|dwTyTDctZlM?06Qe3JI4AD5}kn4do(!J#Q8TD>|c;ydX%G^P9=- z*`c+1Z%PZKWnwtl0CJ|Aje#)sP+PGzDNy6W`6yLds-RJtUiOEL5)!DvoHk}9rW+g% zkAjL~7#9wgOkr_~s=hX`TJYhLr!N-9uJss?2SFwSMF$`VqUbJ$3mbMbS#t%VxeGFc za*X&>>rc`CaR*5AK~(OkrsSnTIWK~Q_0~cSfM4=-x*~+{m}&hTqvmBCm3wgYZRX`N zd#X~c_h_z>J1YkojfDpjYY@&`X4!4vwwDw54OXwmFX=&a_LsgW!79NYPoPKT4BTxd+WIuNPgFN<&&9tdpgz1{t+I?Gy!Z zsM?EcDM1_8PX_4HQ-sk&^s|=Mk4T^femj~}nQn5}-v?C?yR;3~FEVS|TELFL(vwvc zt=uj4L6`~QjS)+Xgt4Q!q|D#CM|0q%?`L`kk{ih<4 z{*NLpd@GWrh4jMzR-~YV2|aG4NvgTLWU7$%m7K0rF!)J4$9L-R!m3xFW=L|fTfdmQ z%@Pv;*`GUyimKJOvk?aLgv79WmJA{TUb)>!5+PVPJ1)#@Vc4?N7kCIhAk2%lV0l~< zTA)^Bw;IuPW(aj%yKNqd`amuiZYe@>K<0R4FJi*pd(NL@1n1cZsc&6bB9Vbs^7>Ld zH07Nw+BT1k`h~KuCJ+5E%r`9SvfZ%MPb@1^60p)-;|p857E*dt6kz7?AgHk!h=H`A zf$NS|XiG{qd-G(Qkbz*T64kn?3iV zf0w&2oT@}A{}Gb+*}7$9%%eh4(|j1&`v`8wj?E;?BdSley^Wc=zx|1fY^Xj<>hwsF zzA}5}JV*?t%f!Vy3c5WQtCcEU{^BkvcOFd$W)?}XID+>dRm{F0C7R`vH>uHVh zr*hf$jf|L+OWW?)!X?1G7(dGe8NhmBmuj6MQT7l77Z~6qRct01D4BeegW1{>g@1{` z%2#-JT-FReW^gz1o?`A%qPT)RB$Rb|DThmH3e~hPlJ%TKZxwG^4q1=rMtN(_Vb6%? zczJ*YxklFpmCcD2;4r{NK;D1?i=ey?K^bMMrGQM1yxUZprw+FA$aR9;7YREA-b&Om z=RlniBDUoT+ypb!C0?!{HTtv;#zjxZTlWWZ^iGSe?t42x*vs&;UTJ@SMGl3d|0tGJmoxkG5=4tR_ zIL(QP4&NEKNgs=n4K}dH1~vc1sPLD8*s-US-Fyxhl%r9wDH5fZgMp!~1k5{$ib23a zD{hJtr}y0MN8AWWm(?wMX+)I3qx<#!nM1^-Cik>OKci>H=a`#MdTlM7&BwpZi9a)& zg9^SEKPun=0I>cabpAIkTd6v6g{b#V~vH*VhJ=Lf=<=aXXUCLUzQ<7LS(c>Y!OJo=S z>EwY@pPSqyUCb|cPC4{~MctEmxqqlwv21O8Ku=DF)4ICp9VP z)U!za=((^I3b0x~$m|-+EHnf%8?qH&# zdd^H4(DY!No$!!t)l4m>spD?AbS87Ah@d`{K$?$>BjAzPNkeG zmEjb#i^e0(rtHX+$i~e@!(#B9L;YM~+FODV059FTK3g2ms1RItxOtXF776pg7Hu58 zOg~dp&qqVPN9_iBK|V4tQ9MR*6hz=}_mV)0@cN*hxU{GuSlofd znHNpMWxC4yxMVnhNa}F=R6hn@y(m`@g3*Re-=gF2(j#^0-5NQ{*9qMcfYA17qoO^e z^<07H`_z_CnMtaPa#IOeXq)LXoiEd~g{4fForm_j?%pFULw7ZFdgbC7aDqqR;D|;7 zv;aVodRQJDM5_03=KyW+HeGQTx`z6I!ZEgYfalN)iu!o^N8-KdRgphHCuD&A~%}xk6lfGu-3*xHnziBNqPBbpBE1#qX0Jn0ad}JMyIz zlfB+>*7fQ2@(lm4Be5li4Ih;6mc0u99X9s=Y1#iW)7?`2XHe#gI{8F1LI@d?p=z@( zo>-z=wdi``54l1w+Oo(zTQ}J~x~*^5*gXmdwqQ(RRrXpq4FNd%ILeXRYm~cq=art% zRTCrsg7G#ALYyP^1MS5-8l9B`ih(iZkYQ4JX4HKcmY0u9Cl)DLD@fnfR+JHIe`($D zz=KS(-S|iyl{;)k*kYX8`?Q@r{j-50mWUMEbXeMWpoUv=3}BW16#*rgglJFgho*Rr z7TeAuH?VMWrZP&&x5GwYi!vu|Q)C+hLjBYa?s4Is(3>E%c$A;2qNI-)f#p1o^7LEe zmoldC03WshO`!DQ!ke&0@<#6TPQatrw)7uhBUL25I{>F($d}>aJAAN%Q7t$O^)ZXG z;z?COf$dWbN$DuWm@(VaPQ`1~zzO=xh}1ZaS^1Wr6W|rvV$-<}iBRSo6Y0U}_#p>i zTi2woc_fot{(*-R_V^>4_14i6Cqw@C;<+I9O776~w-Y}VCYp9#c@mZ$gC%}eV>P;t zsmKvpC$ZwXNk=jIcg%)!+*40QN8hjz2J6a|wlzE(aRW}$pX;rlX@1T$C$2AOX^C4z z;KaV&Q)P|qaz_W`dZOaeXp%|K^tJLhCowBKCpFEf6$HVso`UoLjA;Nhu5>XRqz+-gU86Aa?|kYTF)h;CbI*e9I~^MdHUV0y7sF9XC0-gY z>SWIm9CewSKqZgeJv*2XF-Y#G!!AfVI))`Nq zaJB4&PnDaWAWDY$N>0dGLG)q*oIDnQe;*TIYTTJV98@ZDSJ zzEbSb>X1Tp>P}1)-n?_4m8d(@hgrXMk1+m%aWT`d$>f2uXqJUCfUf+c3DEX8>TC>2 zkQz(KJI?3@+%j^kx6}Liep4M$GMof2-46yn`?@}@%M>15*UY+-BW^mmc7Syk(Abiq$5h3(FwHBI^EKz(`}b5LP$Zmt^%qv^*8>r$PU z2OKU3EoSECJf3CV)GO_e;#52QWa${% z+x`-}9c^1vv@BxcOa%WHCY9;Mk#^SN6enkvN@<3>x#mJBmB}oM z5ER=?R1aPmaEzin(OIzYpGe69QO$R>OjTA2{nyAmQw$DXsqpG9P)*Q?Ouz|_{5IJ0 z>)|Dzs4+=0AR2sXLz?5}t(eDRNu2_NZg`_b$GDn7sOnO{ii~6w_q^A`$ay;FOp!cE z7mi2lGls$CBUMhIpFMQvO(#>7@aED?f}kMQ)j)(AaP%zKUMrl z4BPjoCB#K~s3N`7jbIx)U7Bvws!vqh3Ye#?;nhS{8aI+f2PGx4OO_?fUnR`F7vko> zNPIpdr1>6j>e1>X{)8!jt&bMin&{p@EBq_~Rhow;+8)0XFw&>tM*sMuQ?C3qLY-dZ ze1Ys5kQK=PC(KQ=@J#Pk)|?L@Wa^{1G%F7hkbS8t@iHe_D$Hi;QUwvY49isgu#Z|x zRUwaRX(lf^6o;>{ljxK2zN3f4wo+SO&$> zS8n6=8ZTSOrO^i4^65*a(GPrWS9LKL*mi#xyI^DOXn6F_!2xln=0W=!U8QAEp6M(9 z-Ewc-&ZxjMm8wLNSiJ!vSMjQ)b$bd26(Qv*HbfKzeXj6ID%X>e9aZae{^Ix-yG2Tm zxq4m8g_l~*$enVe%07?`dxwKzm_4Q1a2{1)%^#QDfgiJq#ymKW4MY=g=QD-p-gKSe z4N=|JNG6Hh)>tM=bXI@*F(gpLjG{+#K#PZ9uQR(pBg(D@+>xHALP+z;yn|kO8vDZX zhraCXe1ZS9>q<%psbTtFmsNE8k3Y5lS&jPdA-j{ahqcK+ZLK?d!?lnTDO4}yurfW$ z8h;;WWoDadRAR-sqjBTp#0v939hn~wF55WAH<%rx6QM*{=C#D={FUVXj7}M2>dLPN zyyq@TtUi8sSpR*){P*=-at?$ZEto|ECnqku!+>Di3*!NL5Ii3IH>K`V>mB>cwa0nc zH9ari0?1ncpj!Fi2G-`>taXxQm=ax_p%S?c^Gz5cva2Zy6cok4^;lpYEG;P`hm zER?h|XptJ#fkU$U3p*WiJH}hqpUxgQl{#?mS?KhLs%bYc z{y@8;j471|Y|Ts}amD&BFOninAhjCZdF+9n-gilp5Vc+{`)*i@(jPN%D$Ao@eVxR#k{mguKj^+-T3 zIpy6$Y1l9X?9-@C1W6tYH31EprU zQy4#2vY4`}#=*Eu_oSL$(c46~NWpd+#-EX;5qx;LpYcB>_0fYG8x8jZ!S{6C@!+lS zVO9tB`Bu5#5uNNhKWe$MgCk*Uq=g=y?u~1X6Y;%TuV{CSDP_8`8>H83HT-jZI8ir7 zT%P?Tf3+pmK-L{mOP$TQ=Q@O%NjJo|we(KUIon;0KBtuAt}L7{YI1%yr5t@H$4i@? zUoB{|KX$Z`@=M{!_K#c%9uda$rMSm_b8?UA|M=cxe(xc<$LRNO2nK^kf?)1YfhCKq zGGd!8_*kajT(5TvLrI^n1qP73pVRaqdA%X(K=5atQ+^LZZX*HR4gFUAM ze=nh`%ISDmH6*2q{&2+!@8_Ur+cwB82S^!#sMefmAWz?C=_uwsOpMpj#n;F>2wAQ% z{wLU?t|+Y#`%w^lKVOU|m^6V*NSR3sb>nP`Hqg)&d@9D+Pnrl*r{S5%Fz{xAVn*fk zEeq-~*}TF6LjW?L0|Yhr2mu8lLr9))DTx@n1W1fU6ExOx4hm=a*CBGU_4(ffDtkpe zl|6{j6E%`v>BnoNaWwm#+r?xW2{7%DRN3s=qZlf=PBuAOeQLPPimYp3SGv}YjkA#2 z!kc}L1e^{g>_vS_|< z{}N1>o^Kkx`{T`N5GgRdrFkGb+>ld<*@?2`cGY^^ORgDh^D!~cN(&=k@G%j^1{|79 zgwN-s2Z{9PEe2&nma94(f=`Cdj98^(wSctp5+^(l9i$3UT3 zd6%DgDurK477&LuC4j$%iGF4)oyJkUKS&EzW_v_09`?3N#lQAQh83mPR4())%ketBXujgbNq3sS zsiHm-^;#JF!8?m}WOIEG>8?aHs;lYYEpgn<@6I)h?L?f-8842_lG`}MZ6aI9Kca4* zGvpE#kP~>W5PEh_{etAV#Ddbwc7xcWEpZc+>j)iCmFo;luvNcbXD61`G*eVT z!8+QNIPxKzpm0iO*wQgI zZCbzJ`XX%r=KGO+idK2X(g$d;!jt=%JOScO$SbfJ_LzsJW-yg4I)`#o{Y!S60p9cp z#Msn%R@hYZDd{^gDKp}(oxo_+VMfJN=(Wzsbo~O2M;ZSD4fJ=bx1B0#IZ_*f-IFU}T~d-v3YT z5SahYveJS?KeDlgW_aE5pTBNs=xqoBEVLl#f9J1npc(pY1C8mvAqckJ5+Be?WBm7! zeIwAFYeNv`zkl-DT>U1$Xrcj8|Grg~H8jJ&UGVpCriEa8rUfDBKkwnbG4r;L2K2Xp zR2zcP$u@*w|551g*ZH3UuAvS6uhJE|l%VZ|XV^kwXl048Z0pir&iv?j==RO@%w`d( zoA6CHNW840qSVVC(V{3-0uiD1A$*9i8(e*Hsq4W5e!xAxYdw3+{Qr8p%CM@|Zc7N# z(%sz+(o)hb-AIFUw=_tDfPf&aNOyyDi!{nBakJSsB{8O>Qx2O4V%wn`@BJg46?(wSdZemr%jR)76blg*wV9iP~= zFjPIIqJdG2AXm`Qaw_j}6yk0nO#|kG`*j?46Qqk=)w$m_$??C8lk0@>IhTbu5_!)! zm3$c+D+U|lVY3WDW6N|367K26N7NbC;AP7!4>1un*GQ$)U=NFK24?0NtbnUv!l<^6d zKfMsS_ha-}-)iMR0l#bmBbZ*gV-XIykW2K2t6~Y+;4Rm}-H?z|gc?5SPhiOtd|P*F zB#omNBC7dIXY~D%OI#V2yWLKj45)4;MUP3@oEe658{P*_C#Z1*Sh+z_&{c{js5x!+ zhkPVWMoArGC$lZX<;FZq)^N=j0CpU+suK6}IDqZMZl32ab??1bu`_ZrR>jxQ<)DeA zFHT0^jwu}gj`QD!0j%tcV}5l!Zhmy&ap4QHKDzQ79!Y>_ESsyW!9ocj!@>ADn6C;@ z#cTXFc)O=?0C_uj`!+04N~r5g{Fjcm302Phmewlw?#vG7{O2x%sk>a7doBdSJS;}tA$eZ*=flqe2@TTs$>7+es#P&;)o7Y z69MDYXhsQ(OQEJi*qeP;cGU}48z-h$SKsC?b7h-%^6Se|Lsz@{c4v_^cY9J#vEgdQ%mA8ltsRlpt94j4~e_N9;eB#3wkoL3zq*EKU0 zp5trzF=3mUC8Xna>gXwou&fYJ zIgMpaMXa7R?OhhN;0^ABo4jwdS)AjW=YVv#$y9e;4HnDl*>u$APc3!z%T6&q*duee zEPhF6p=L_uQ)6C`8!X3h4ma>+d8p^&#M+rZX)t#`e`KVuynMIENFYroErO}|0~i5< z*;I8(ea~zKU%USr52n05-}ppL1z%4oZo(NEW1ooCCQ4$Q#mEs#;#lVrO5!ORy@q2& zP5-=^x1TY!h&A@^UhzrPHHdLkoMJOo81UtI10U@P{-Ke%7(adT%P0HP5k;F;Vq~y| zW?@&g_eq`Xs&U4j%My)yyupX_DIg&P@1?D(U`)xnv(6kj(tW&~uRM>$;)+HL0f!(WnwmLcPO|_RA|p@thsW@qvOJA z>hMkaqk<%2u#j4qO`M;8)i>|~M>NFrQNDM6jU%i>A#6>papChO?=qO^}-(&PG3f8*K1G{+d;FhL^^|2mK5N0&UX;a9VHMFl|a{ zH>Qk%2$Tn4zUBYO@R=DK82#-zn6=NmNflGXc_5}cX^3seOq);Cr*5KUlSt&Q7{*ec z9eE%lYdQ1kH!{O;H}5~2Ed|az#}2s^LvD=NRPj|fp?=I1rW)m+Z_;(hdmA8Mc(Vd>r-UQDvJ_C)jU#kGqlI6}gZhPRSfu;5gZR=x)}a|1jF zh!QTeZz|Du!- zu~!VFib=^hmY%YRwTiz<1yaT91oMvUYQcDs^qWY?UeKc>))49Zy_QgPlx33PC5Aw% zc&Wx5NEKINyTp0{sbXBpD@P&VTPCHC7SeUZ-|z^Forwp&0h|A<96D3=;~hP-3#vV zO`y5zFz;j#Gb*RtOmOG-Y4Zsf0I?ooYIrgIOCbH_Ik*d?l657qjsB_6I@``w^3g%W zNwHCqnO~>3g#@2{bN=9NfNbx*=3_5ld+8cW!E<9?p+Q=^HLt){%I~(Um1C2w<@K87 zVaV?$@m|zus7c0X0Ol2ncmo>7hKH~ukr>)a4-;?9D_d)Td1YVw#=OD?m{)9TSykD# z@VTaxoU(5M3HPr+g1HH#(VIY`a3kJDMxO=ugUPZDIph2pNOpkd08ygvT*7~0rQ}}4 zA{^nDDXI0vx3g%Ho8Mdd!JfUtV#-9nLg?2YGhiQmts)urN~dy^QZg$?hX5&v#(}2Z(ox*I6ESm4>Af7cj`PFj0ah}u>c(4(ofI9FDsJ5?TS>LTI9kzO(h``Ez{FQu6VF{OiWzm`2VpYU1qKe z5?I@9a789)X!_bAY9p&Ed_OHU4TvL={&huKw`R3?Y@q`AX^9f~9d2~OA6KO6A1jjX zK-e8cQL*!o7I z-ML#<3!gPR;o?*ACTO=SEfLFyw#C3c-S~x%L$X~M%I5;f`W)TC8_xl78!~Cgd+5Lw z1Pqv+osPOKGCiflJuomP#2-%cTLJU8EPSbO}hu z8Zq(e@91%Wo6_TLH4{;2xz)Nqt}lE;x=%u+ME;nDNPu6Z--BF9v4sh`CF#))Ojl;Q zrvr=GfjbwWs}z|oF(p?m_C^S<=h=w?ucD}>f)XLJEl1u?NBU@8TDTZoVz%(Q%xC~) z4Q81zuE45^GRf(uQ4#w0xaM`4;p?;12bYeYhG1-IPqVYIRnet0+BNawLe-0DC}*R} zql7rGktWS92?1b;O$LY6&BlN<2mou_r8QXUiC5qH0 zOAeqOp8nVtpOwtN&#o_vnJaR`<*O@5mI#=6FILM|lJ4mrXfGp4 z-b;BWefT8481b6h)n<5eA(ogeTHeoZ5sI51#SUvMbksza;pCx%LV+mW78(J=`q#73 zP^SwC4F0joK4jGYf=@LhbZsA}Dy9wI@JYK!)paV#oum#jTzYNkoT!ZM3_a>B> z#T7%eGE8lGC9rh~G(0r$Rr`*XSk42V3J2rsQ9jHhrrZ%5o*+v1bs!?A61d)$`~cVu zgtm@P`$#S*F69{AcCii+p`_~9=3y2)U|=2=HGlZlI6p>CCGjvi?|9E7KZZ?nUV$c1 zdk2DN>#||!Fj-fbt<*$Uv`v$b^GS9#3=m^(c zi*kr}$s#Zn3fFe1kyMNvUiQ(ah^grmKnnBrSZTg42g`ON?>AKwBv%znR*^9&rIp!9tPB=jv$pKO@lwNOwlW4Y zSr{U3t>j#dAqb$}FgQ$WqD+QSwmt?=dBSR(U- zW;}YZ?}@D&SZ=^~xYo8$obq5z2-!q!d7qwF{@O{!<=RQ$>i+M`j?h;l3~L}m`A#1U z49NQbaPi)yOJ-jK>5`h;bjf+eV6c&_i7L;xjgJKaMpNH7CRn>!>cQQRx5zIK$l6<4 z14E>!&!4VQmSzZKpMA%ADSNURwZ^sQJ^V75z7{`xJ_4Fh7AQC9SzcX;wi;B0j4~yM zm1swG=XTBT-09kG=GWQTpvas-TZC;6x$J9U>^s70BRO_qr@SDT9ua*uQ^ro2!#oe%WT9ZHii zlcz^KqS>ced)jNKyz>;5lEZ`#GM($-N#|!y4=TzhkrJ7rC$8kzFS5w=BOztL^cRD{ zBTK1qL{RcBbWR2C{48vt};{usx-4+piUr_174%(F*)Ed1dDuZ|*^dik{PK!8Cnp?IZOE5T^S zqmFpyL0eyo2sZq=XNLUTLrgS9D|xJ!I~y;8vz?Z=XcspP1Z>iQiU?! zXXid|vL?*&wnT%5kR2{Rj1R|8$RbSpXsp*v>%yB3Zlc>xheLo1bn`YJ;Z^)IjjODcfZ| zr;UD0KTAj&ELjk;Ri=(In-lXmm}^mviout0jo$a;+l?}N@=qu27q~l*@@nXvb3?MZ z<3xsEo0FJ-42Wj0rp4An!x;)^3J5prRC`oBBoN5wpk@>MrC^SHK%-GIx!gUD-Sm*s z{NuXp@awUZZ0>wOMHa8tS~o=+ofo|XVciS?Dl$Xi73!*O21-4ji8siWzXiQn$`PucB1z)$2>^rc8q&RkX zq0`24<7K2QT)@ ztT4pblwu4qITtB0^-x*7ny{ukd;L?Dg|_qflQyoo`0bJGLUsg#?EBc7k`Dykq@sk9 zq@!3|lG29Et8ETUU%d(NU@WpnI3}lvqWQcnXZV(FALFPPvhOR6zP&Y44O*fA>|0$r zGalCa9IB*V?gNSB{B53A!)*OnH2iJPDu+9l6BzhAJuh!wVdaNx&TMhGZ~qv$-}?(_ za8)|ocJ)FtuOhqygnf7z{vT3t)nH{{nr}HnNOk$IitkPxqPZ4~AfVIUh`Or3iOWBA zS}PAotA^BH)!Wp=N``yHR`B3A+XLF}olJZuB>!Vi`%V9gQjN*_4}IHt=>M!br^ah~ z>*dW6=0Qg>2s|Dur8IO<h3H1XX^5VMcLUAeQDJ zAZ~xwt)!W2t8xeQZ6l8y72vrOZRE3J9t`m+HTRB~O_h|T?xXjzyM%OAgn+_b*0_Fy zx!vaA1=(~y=P%ndQCTtoiaN0UlN&O%TXKMG3LPM`0=A|r{A+M551<;R`*rY^Dqa;p z-VWaGr_eC=%R^`KvJuzAH$iE(^UmIwWN?VrM6jWZ&{w<0@*`g(#I9p@bi{P8)5ak# z`6X#ghvacx8SU9UE%^2r9u;^pX2W!g1~K0EIBc%t=lki$)lP9k!W3{>Hv?ryvd}9S=5&JR~JNwO0g<<%r$kw`#Tp!Vw z`(oPsxW#jQarGD?ytx%qji~FdF6{@!-uH2vb*8NXcWJ10v^4dD7qPsraosidJqz7% zN;HstDXN|vIsEM&j#r17zbWgxWq zESZnEk5N3OP*N1=_MU#9`5kAZ*tS}E$9o>AjlMEsJl(4z=l(&0!2P4}HPd4iC!QzH zQu$HyD*|gHduc5OkMR@4nGb4w7BY2LVx4G{So226F;e)9Td9&PbjTdtJorr`)oPFY zYK-YEX+o@aIg5zl#;-MmsN;BKl}ht`gl69NT+L&Ml0hDN#;+N7cNxEy!xfN+zs87s?{H;wJaJ<2hCSSx2>q0OT3HW8t0xDZ4yLlT_PM5BKVFVBbW?%NKeP z`15m-?eaR#PD2FqO0=b0F)zB1iHP_v^z4t;8Z#7f#jMCxsS+&4IaM?;Jx{=s2Lm1P;+2_-J)Y?Y(LMPA8txOk-?P0=;(d($u?*?M?z)c(hw9Fm;zu$ z#rW&e)X~h?%9!c)_idHgriQG|G$(e`gGnD^M;qhQd^v@;Aq4fa!xchH&R=5^%tARR z;K)-)t26kKu$c?+oYj42ow2Jh%zSm~^x_KJ#=$S)Jq``R%D%N*u@#7X7om?GJQrY^ zXNvi_N_Q+A6d4lzQrxPqR=pHCRC{Zv+eWJz8t6y^FBwSofQ>Mwii2XfuIzB}e&TK} zoP-2&x41o8b)jIM>qu1&{D`{l3QMTIRr})*41_=%4+tXvx#-VhQaR?quf#B4*uq%Y zM2d}4m_@&qC{gv3%2fkC!MWsvq7$BPg^gOPS!t#x#N1_D!4@h&q9wu zUr{J^R=QExccdMXhf$WS{pfPVzV`XUqFnn{qK{Ci-d@YYAGLirMw-LFAG*(`u}vgG zlzeZMOQm?$IB(CxmWoU5p*=oZ$WD96sym{m)oSC&liDc;t4FtUNa2}3TwtRned6wG zLq9$LdCNJ4!ZYi`!^E9SX}ke2>3@Ez7ZA8Fp7wRWeJ(hs92fc zUx#BnmB`>lcVgzKGZGB$rFV=7LQc%<5e#wZdFWBC7|a%TMqsZjCaj`wq9m!_6QQ;% zy7C z!;elYNJK7>_?==Y=ICE1qgJq$(6hXX!o_y%1IZ0TAR|?S&N(S^Y~SciSHII^&69{W zGA7+?(pmpN5+P^V6)yZpVA~l1ap$x;>PkGq6>m;5S4#a^bG~huY;|9t`21B`y+75E zfG@kxy#0Ljj7#Zi(fc(gJgXtCO&Nb@Q6#mrXz`b&A{@pmbu#s3_p%xVWODtL&Af@D zAYJ>vNpa~d9N@qf31rZ6A=o0Y%k?hwX;(5S_ETs>7R1-ZLAlbsdsf6!4+epo&%b3n z!g2YOOD!(aGY@SH73zEJ7-J(&QXKe%kpr$tRcGF_sxPwdpabG8n@0*vMx$9?p)l=w zh?Vl~dCbn&67C9-vl9$TVU~Bn#^$ zb3{<(c#jBQ%Vn)a#wFTfi0vCDB7dfgU|@GX8d#(3~P@nT6GZ^a3VtTRr}G~JR{`MQG$J4!h@cXA~8?u z43_m}q0ZrqeHIi99N%xJQ}fn^3Tqx*8S~Y^UudAJte7<2IdHQU;Ti5PSDU;_*2+s= zRy|<%?y8D4V#L?7)ZP2q$|9)$a>Zxqz7tgNgNRRKTWef7YW)L_XHI-{Aw&$Y`S>J!D5iDbQHkGfxJRsxRp=LGKuxw$t zsb+MZv-;4dt=R|@BC@HDbDCA3ls=D6$JtUJe!<>oldaOQTTlzN4@PH4eow9K{Mk(& zSt(I0Y?+pmuHmw5kB!nfotHv!iRntiCJK9$iu?$jjz0xcQ^-;Iyr%d-D7i<94inE3 zk6JiK{)2nH#q5yk z3QkfV=*pSsqDy-j470&;M7ZooZ9PXe4tWSGj7ekvowv#2l1)=SZwr-M|Kp)Pmxq~G z150`0eV9h+_R(&3EQcPmbo-M6Y-eom=N(-7S77w1#a%dkVFvaqscp=W8rnDlB>3Cu zcKz#7FBVQ7wbkf_+A=utN+n}eXWAEFOlw+K3ad43l2O#d*Gjsr(>{&dkK zx~}f3ApY}B>mzUohTHl3p*5e3!wL5Qv$_Uo%{PrVe*e-E0a_XuTRZA0yV)8$=-fEe zK?$^CoGSML)G|;Y2mc%T450ndrQ)_T1t^e+jZA zn?iyRpa2Tr?*zAp1WEwfx$JJD6ZAm|ZjS?$0JOu{9RZU8D8XI7F;EuJ7F~BN>`(v5 z^2dV#?P7JuqGtF^j60rt&;P;mcWDMF3#ilTj>Re* zlm+CH0F(;UH*`m}9`Tdv7Z(vI8q_Ruhh~fZ4gJTk19b@8p*>@NL;o@CK-0o^=#G~^ z(f{d8fTnlu;CxAc!T$f|K>Aas5|2TC}!1Vzb7zyxQ M0JN52%D;K`KcN-$r~m)} literal 0 HcmV?d00001 diff --git a/Examples/Data/Document with SDT 2.docx b/Examples/Data/Document with SDT 2.docx new file mode 100644 index 0000000000000000000000000000000000000000..5688bdd69ac7490b844dbb6cf60e94c0567a3bec GIT binary patch literal 21878 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
8GCPG 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 literal 0 HcmV?d00001 diff --git a/Examples/Data/Golds/ReportingEngine.SelectiveDeletionOfParagraphs Gold.docx b/Examples/Data/Golds/ReportingEngine.SelectiveDeletionOfParagraphs Gold.docx new file mode 100644 index 0000000000000000000000000000000000000000..019c3d19093fefa2cd48148eec132e7386848c6a GIT binary patch literal 10657 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 DTKJfG literal 0 HcmV?d00001 diff --git a/Examples/Data/Reporting engine template - Selective remove paragraphs.docx b/Examples/Data/Reporting engine template - Selective remove paragraphs.docx new file mode 100644 index 0000000000000000000000000000000000000000..9c931482529400b68dcd08bab4b01918f0238d88 GIT binary patch literal 15228 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∨q3C=sD@ifXn+V|}!I!7TJ`||_ z&|dn^G4^b8ebEM25jTc070^D`I*O;w&4c;+uhkg{D9!sy?7x@7{^NW6N&ib>teoUu z8T_?y?@uTI5dS_Y{;iDf@4&xTH2n#!f&4G^O@D{~HJ$5EFaU7#o~QHwOYZtRr@yE8 z{K@MR)*qbyp78T`7Jm;t{>fsN@DCRM9*F!q{O^A7KjER||Aha`EB<%z-&fdwf-M>T z0RL^h{dW$3Ulabx;fe7N4u4r8{vH2Ui~T1W0LWkg0RF>%{~i8UHTmywQ?`GD|DiPH XBq83# Date: Tue, 4 Jun 2024 13:09:57 +0300 Subject: [PATCH 04/33] Updated gists --- Examples/ApiExamples/ApiExamples/ExCharts.cs | 14 +++++++------- Examples/ApiExamples/ApiExamples/ExComment.cs | 2 +- .../ApiExamples/ApiExamples/ExReportingEngine.cs | 4 ++-- Examples/ApiExamples/ApiExamples/ExRevision.cs | 2 +- Examples/ApiExamples/ApiExamples/ExShape.cs | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Examples/ApiExamples/ApiExamples/ExCharts.cs b/Examples/ApiExamples/ApiExamples/ExCharts.cs index d7cf3f77b..50396b0bc 100644 --- a/Examples/ApiExamples/ApiExamples/ExCharts.cs +++ b/Examples/ApiExamples/ApiExamples/ExCharts.cs @@ -1883,7 +1883,7 @@ public void RemoveSecondaryAxis() public void TreemapChart() { //ExStart:TreemapChart - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ChartSeriesCollection.Add(String, ChartMultilevelValue[], double[]) //ExFor:ChartMultilevelValue(String, String) //ExSummary:Shows how to create treemap chart. @@ -1950,7 +1950,7 @@ public void TreemapChart() public void SunburstChart() { //ExStart:SunburstChart - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ChartSeriesCollection.Add(String, ChartMultilevelValue[], double[]) //ExSummary:Shows how to create sunburst chart. Document doc = new Document(); @@ -1997,7 +1997,7 @@ public void SunburstChart() public void HistogramChart() { //ExStart:HistogramChart - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ChartSeriesCollection.Add(String, double[]) //ExSummary:Shows how to create histogram chart. Document doc = new Document(); @@ -2028,7 +2028,7 @@ public void HistogramChart() public void ParetoChart() { //ExStart:ParetoChart - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ChartSeriesCollection.Add(String, String[], double[]) //ExSummary:Shows how to create pareto chart. Document doc = new Document(); @@ -2055,7 +2055,7 @@ public void ParetoChart() public void BoxAndWhiskerChart() { //ExStart:BoxAndWhiskerChart - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ChartSeriesCollection.Add(String, String[], double[]) //ExSummary:Shows how to create box and whisker chart. Document doc = new Document(); @@ -2096,7 +2096,7 @@ public void BoxAndWhiskerChart() public void WaterfallChart() { //ExStart:WaterfallChart - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ChartSeriesCollection.Add(String, String[], double[], bool[]) //ExSummary:Shows how to create waterfall chart. Document doc = new Document(); @@ -2128,7 +2128,7 @@ public void WaterfallChart() public void FunnelChart() { //ExStart:FunnelChart - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ChartSeriesCollection.Add(String, String[], double[]) //ExSummary:Shows how to create funnel chart. Document doc = new Document(); diff --git a/Examples/ApiExamples/ApiExamples/ExComment.cs b/Examples/ApiExamples/ApiExamples/ExComment.cs index 18ede3311..bda7aefe7 100644 --- a/Examples/ApiExamples/ApiExamples/ExComment.cs +++ b/Examples/ApiExamples/ApiExamples/ExComment.cs @@ -339,7 +339,7 @@ private void IndentAndAppendLine(string text) public void UtcDateTime() { //ExStart:UtcDateTime - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:Comment.DateTimeUtc //ExSummary:Shows how to get UTC date and time. Document doc = new Document(); diff --git a/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs b/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs index db934bd7f..e3155c045 100644 --- a/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs +++ b/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs @@ -839,7 +839,7 @@ public void WithoutMissingMembers() public void MissingMembers() { //ExStart:MissingMembers - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ReportingEngine.BuildReport(Document, Object, String) //ExSummary:Shows how to allow missinng members. DocumentBuilder builder = new DocumentBuilder(); @@ -1285,7 +1285,7 @@ public void Word2016Charts() public void RemoveParagraphsSelectively() { //ExStart:RemoveParagraphsSelectively - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ReportingEngine.BuildReport(Document, Object, String) //ExSummary:Shows how to remove paragraphs selectively. Document doc = new Document(MyDir + "Reporting engine template - Selective remove paragraphs.docx"); diff --git a/Examples/ApiExamples/ApiExamples/ExRevision.cs b/Examples/ApiExamples/ApiExamples/ExRevision.cs index 2bc77ce8a..01273a3e0 100644 --- a/Examples/ApiExamples/ApiExamples/ExRevision.cs +++ b/Examples/ApiExamples/ApiExamples/ExRevision.cs @@ -724,7 +724,7 @@ public void GranularityCompareOption(Granularity granularity) public void IgnoreStoreItemId() { //ExStart:IgnoreStoreItemId - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:AdvancedCompareOptions.IgnoreStoreItemId //ExSummary:Shows how to compare SDT with same text and different store item id. Document docA = new Document(MyDir + "Document with SDT 1.docx"); diff --git a/Examples/ApiExamples/ApiExamples/ExShape.cs b/Examples/ApiExamples/ApiExamples/ExShape.cs index d02218bbe..7e7d7fb41 100644 --- a/Examples/ApiExamples/ApiExamples/ExShape.cs +++ b/Examples/ApiExamples/ApiExamples/ExShape.cs @@ -3254,7 +3254,7 @@ public void Adjustments() public void ShadowFormatColor() { //ExStart:ShadowFormatColor - //ReleaseVersion:24.6 + //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ShadowFormat.Color //ExSummary:Shows how to get shadow color. Document doc = new Document(MyDir + "Shadow color.docx"); From 356c92e6536ac7812a3f76592c256e91cb9a29f2 Mon Sep 17 00:00:00 2001 From: vderyushev Date: Wed, 5 Jun 2024 08:54:07 +0300 Subject: [PATCH 05/33] Fixed examples --- Examples/ApiExamples/ApiExamples/ExCharts.cs | 2 +- Examples/ApiExamples/ApiExamples/ExComment.cs | 2 +- Examples/ApiExamples/ApiExamples/ExDocument.cs | 2 +- Examples/ApiExamples/ApiExamples/ExReportingEngine.cs | 1 + Examples/ApiExamples/ApiExamples/ExRevision.cs | 5 +++-- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Examples/ApiExamples/ApiExamples/ExCharts.cs b/Examples/ApiExamples/ApiExamples/ExCharts.cs index 50396b0bc..41c48fe9f 100644 --- a/Examples/ApiExamples/ApiExamples/ExCharts.cs +++ b/Examples/ApiExamples/ApiExamples/ExCharts.cs @@ -1885,7 +1885,7 @@ public void TreemapChart() //ExStart:TreemapChart //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ChartSeriesCollection.Add(String, ChartMultilevelValue[], double[]) - //ExFor:ChartMultilevelValue(String, String) + //ExFor:ChartMultilevelValue.#ctor(String, String) //ExSummary:Shows how to create treemap chart. Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); diff --git a/Examples/ApiExamples/ApiExamples/ExComment.cs b/Examples/ApiExamples/ApiExamples/ExComment.cs index bda7aefe7..1514fda68 100644 --- a/Examples/ApiExamples/ApiExamples/ExComment.cs +++ b/Examples/ApiExamples/ApiExamples/ExComment.cs @@ -355,7 +355,7 @@ public void UtcDateTime() doc = new Document(ArtifactsDir + "Comment.UtcDateTime.docx"); comment = (Comment)doc.GetChild(NodeType.Comment, 0, true); - // By default DateTimeUtc without millisaconds. + // DateTimeUtc return data without milliseconds. Assert.AreEqual(dateTime.ToUniversalTime().ToString("yyyy-MM-dd hh:mm:ss"), comment.DateTimeUtc.ToString("yyyy-MM-dd hh:mm:ss")); //ExEnd:UtcDateTime } diff --git a/Examples/ApiExamples/ApiExamples/ExDocument.cs b/Examples/ApiExamples/ApiExamples/ExDocument.cs index b7f494bc2..629e2ec62 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocument.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocument.cs @@ -1357,7 +1357,7 @@ public void UpdateThumbnail() // 2 - Use the first image found in the document: ThumbnailGeneratingOptions options = new ThumbnailGeneratingOptions(); - Assert.AreEqual(new Size(600, 900), options.ThumbnailSize); //ExSKip + Assert.AreEqual(new Size(600, 900), options.ThumbnailSize); //ExSkip Assert.True(options.GenerateFromFirstPage); //ExSkip options.ThumbnailSize = new Size(400, 400); options.GenerateFromFirstPage = false; diff --git a/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs b/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs index e3155c045..62dc2eefa 100644 --- a/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs +++ b/Examples/ApiExamples/ApiExamples/ExReportingEngine.cs @@ -1288,6 +1288,7 @@ public void RemoveParagraphsSelectively() //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ReportingEngine.BuildReport(Document, Object, String) //ExSummary:Shows how to remove paragraphs selectively. + // Template contains tags with an exclamation mark. For such tags, empty paragraphs will be removed. Document doc = new Document(MyDir + "Reporting engine template - Selective remove paragraphs.docx"); ReportingEngine engine = new ReportingEngine(); diff --git a/Examples/ApiExamples/ApiExamples/ExRevision.cs b/Examples/ApiExamples/ApiExamples/ExRevision.cs index 01273a3e0..903726228 100644 --- a/Examples/ApiExamples/ApiExamples/ExRevision.cs +++ b/Examples/ApiExamples/ApiExamples/ExRevision.cs @@ -726,11 +726,12 @@ public void IgnoreStoreItemId() //ExStart:IgnoreStoreItemId //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:AdvancedCompareOptions.IgnoreStoreItemId - //ExSummary:Shows how to compare SDT with same text and different store item id. + //ExSummary:Shows how to compare SDT with same content but different store item id. Document docA = new Document(MyDir + "Document with SDT 1.docx"); Document docB = new Document(MyDir + "Document with SDT 2.docx"); - Aspose.Words.Comparing.CompareOptions compareOptions = new Aspose.Words.Comparing.CompareOptions(); + // Configure options to compare SDT with same content but different store item id. + CompareOptions compareOptions = new CompareOptions(); compareOptions.AdvancedOptions.IgnoreStoreItemId = false; docA.Compare(docB, "user", DateTime.Now, compareOptions); From 390d6928254361757de4f06120767a598f8f2bea Mon Sep 17 00:00:00 2001 From: vderyushev Date: Wed, 5 Jun 2024 12:46:01 +0300 Subject: [PATCH 06/33] Fixed examples --- Examples/ApiExamples/ApiExamples/ExCharts.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Examples/ApiExamples/ApiExamples/ExCharts.cs b/Examples/ApiExamples/ApiExamples/ExCharts.cs index 41c48fe9f..ec55df441 100644 --- a/Examples/ApiExamples/ApiExamples/ExCharts.cs +++ b/Examples/ApiExamples/ApiExamples/ExCharts.cs @@ -1994,6 +1994,7 @@ public void SunburstChart() //ExEnd:SunburstChart } + [Test] public void HistogramChart() { //ExStart:HistogramChart @@ -2025,6 +2026,7 @@ public void HistogramChart() //ExEnd:HistogramChart } + [Test] public void ParetoChart() { //ExStart:ParetoChart @@ -2052,6 +2054,7 @@ public void ParetoChart() //ExEnd:ParetoChart } + [Test] public void BoxAndWhiskerChart() { //ExStart:BoxAndWhiskerChart From a0eb65a64a6df72e7f18d4075c1535c483278a1d Mon Sep 17 00:00:00 2001 From: vderyushev Date: Tue, 2 Jul 2024 18:41:24 +0300 Subject: [PATCH 07/33] Updated API examples --- .../ApiExamples/ApiExamples.csproj | 14 +-- .../ApiExamples/CustomBarcodeGenerator.cs | 2 +- Examples/ApiExamples/ApiExamples/ExCharts.cs | 39 ++++++++ .../ApiExamples/ExHtmlSaveOptions.cs | 2 +- Examples/ApiExamples/ApiExamples/ExLists.cs | 28 +++++- .../ApiExamples/ExMarkdownSaveOptions.cs | 31 ++++++ .../ApiExamples/ExPdfSaveOptions.cs | 17 +++- Examples/ApiExamples/ApiExamples/ExShape.cs | 92 +++++++++++++++--- .../ApiExamples/ApiExamples/ExVbaProject.cs | 12 +++ .../ApiExamples/ExXlsxSaveOptions.cs | 18 ++++ Examples/Data/List with leading zero.docx | Bin 14530 -> 14955 bytes Examples/Data/Radio buttons.docx | Bin 0 -> 27078 bytes Examples/Data/Vba protected.docm | Bin 0 -> 16415 bytes Examples/Data/Xlsx DateTime.docx | Bin 0 -> 12425 bytes 14 files changed, 231 insertions(+), 24 deletions(-) create mode 100644 Examples/Data/Radio buttons.docx create mode 100644 Examples/Data/Vba protected.docm create mode 100644 Examples/Data/Xlsx DateTime.docx diff --git a/Examples/ApiExamples/ApiExamples/ApiExamples.csproj b/Examples/ApiExamples/ApiExamples/ApiExamples.csproj index ff0f4c1bd..3066efe8f 100644 --- a/Examples/ApiExamples/ApiExamples/ApiExamples.csproj +++ b/Examples/ApiExamples/ApiExamples/ApiExamples.csproj @@ -125,14 +125,14 @@ - - - - - - + + + + + + - + all diff --git a/Examples/ApiExamples/ApiExamples/CustomBarcodeGenerator.cs b/Examples/ApiExamples/ApiExamples/CustomBarcodeGenerator.cs index 091dbaf9b..8eb73b9d8 100644 --- a/Examples/ApiExamples/ApiExamples/CustomBarcodeGenerator.cs +++ b/Examples/ApiExamples/ApiExamples/CustomBarcodeGenerator.cs @@ -101,7 +101,7 @@ public Image GetBarcodeImage(BarcodeParameters parameters) generator = new BarcodeGenerator(EncodeTypes.Code128); break; case "CODE39": - generator = new BarcodeGenerator(EncodeTypes.Code39Standard); + generator = new BarcodeGenerator(EncodeTypes.Code39); break; case "EAN8": generator = new BarcodeGenerator(EncodeTypes.EAN8); diff --git a/Examples/ApiExamples/ApiExamples/ExCharts.cs b/Examples/ApiExamples/ApiExamples/ExCharts.cs index ec55df441..b75c94939 100644 --- a/Examples/ApiExamples/ApiExamples/ExCharts.cs +++ b/Examples/ApiExamples/ApiExamples/ExCharts.cs @@ -2159,5 +2159,44 @@ public void FunnelChart() doc.Save(ArtifactsDir + "Charts.Funnel.docx"); //ExEnd:FunnelChart } + + [Test] + public void LabelOrientationRotation() + { + //ExStart:LabelOrientationRotation + //GistId:ac8ba4eb35f3fbb8066b48c999da63b0 + //ExFor:ChartDataLabelCollection.Orientation + //ExFor:ChartDataLabelCollection.Rotation + //ExFor:ChartDataLabel.Rotation + //ExFor:ChartDataLabel.Orientation + //ExFor:ShapeTextOrientation + //ExSummary:Shows how to change orientation and rotation for data labels. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + + Shape shape = builder.InsertChart(ChartType.Column, 432, 252); + ChartSeries series = shape.Chart.Series[0]; + ChartDataLabelCollection dataLabels = series.DataLabels; + + // Show data labels. + series.HasDataLabels = true; + dataLabels.ShowValue = true; + dataLabels.ShowCategoryName = true; + + // Define data label shape. + dataLabels.Format.ShapeType = ChartShapeType.UpArrow; + dataLabels.Format.Stroke.Fill.Solid(Color.DarkBlue); + + // Set data label orientation and rotation for the entire series. + dataLabels.Orientation = ShapeTextOrientation.VerticalFarEast; + dataLabels.Rotation = -45; + + // Change orientation and rotation of the first data label. + dataLabels[0].Orientation = ShapeTextOrientation.Horizontal; + dataLabels[0].Rotation = 45; + + doc.Save(ArtifactsDir + "Charts.LabelOrientationRotation.docx"); + //ExEnd:LabelOrientationRotation + } } } diff --git a/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs index fdd874a7a..3193907b1 100644 --- a/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExHtmlSaveOptions.cs @@ -1685,7 +1685,7 @@ public void OfficeMathOutputMode(HtmlOfficeMathOutputMode htmlOfficeMathOutputMo case HtmlOfficeMathOutputMode.Image: Assert.True(Regex.Match(outDocContents, "

" + - "\"\"" + "

").Success); break; diff --git a/Examples/ApiExamples/ApiExamples/ExLists.cs b/Examples/ApiExamples/ApiExamples/ExLists.cs index 8ac90175a..85657f634 100644 --- a/Examples/ApiExamples/ApiExamples/ExLists.cs +++ b/Examples/ApiExamples/ApiExamples/ExLists.cs @@ -964,7 +964,7 @@ public void CreatePictureBullet() } [Test] - public void CustomNumberStyleFormat() + public void GetCustomNumberStyleFormat() { //ExStart //ExFor:ListLevel.CustomNumberStyleFormat @@ -1004,5 +1004,31 @@ public void HasSameTemplate() Assert.False(doc.Lists[1].HasSameTemplate(doc.Lists[2])); //ExEnd } + + [Test] + public void SetCustomNumberStyleFormat() + { + //ExStart:SetCustomNumberStyleFormat + //GistId:ac8ba4eb35f3fbb8066b48c999da63b0 + //ExFor:ListLevel.CustomNumberStyleFormat + //ExSummary:Shows how to set customer number style format. + Document doc = new Document(MyDir + "List with leading zero.docx"); + + doc.UpdateListLabels(); + + ParagraphCollection paras = doc.FirstSection.Body.Paragraphs; + Assert.AreEqual("001.", paras[0].ListLabel.LabelString); + Assert.AreEqual("0001.", paras[1].ListLabel.LabelString); + Assert.AreEqual("0002.", paras[2].ListLabel.LabelString); + + paras[1].ListFormat.ListLevel.CustomNumberStyleFormat = "001, 002, 003, ..."; + + doc.UpdateListLabels(); + + Assert.AreEqual("001.", paras[0].ListLabel.LabelString); + Assert.AreEqual("001.", paras[1].ListLabel.LabelString); + Assert.AreEqual("002.", paras[2].ListLabel.LabelString); + //ExEnd:SetCustomNumberStyleFormat + } } } \ No newline at end of file diff --git a/Examples/ApiExamples/ApiExamples/ExMarkdownSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExMarkdownSaveOptions.cs index f3058b9a6..8fe2903bc 100644 --- a/Examples/ApiExamples/ApiExamples/ExMarkdownSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExMarkdownSaveOptions.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using Aspose.Words; +using Aspose.Words.Drawing; using Aspose.Words.Saving; using Aspose.Words.Tables; using NUnit.Framework; @@ -205,5 +206,35 @@ public void ExportUnderlineFormatting() doc.Save(ArtifactsDir + "MarkdownSaveOptions.ExportUnderlineFormatting.md", saveOptions); //ExEnd:ExportUnderlineFormatting } + + [Test] + public void LinkExportMode() + { + //ExStart:LinkExportMode + //GistId:ac8ba4eb35f3fbb8066b48c999da63b0 + //ExFor:MarkdownSaveOptions.LinkExportMode + //ExFor:MarkdownLinkExportMode + //ExSummary:Shows how to links will be written to the .md file. + Document doc = new Document(); + DocumentBuilder builder = new DocumentBuilder(doc); + builder.InsertShape(ShapeType.Balloon, 100, 100); + + // Image will be written as reference: + // ![ref1] + // + // [ref1]: aw_ref.001.png + MarkdownSaveOptions saveOptions = new MarkdownSaveOptions(); + saveOptions.LinkExportMode = MarkdownLinkExportMode.Reference; + doc.Save(ArtifactsDir + "MarkdownSaveOptions.LinkExportMode.Reference.md", saveOptions); + + // Image will be written as inline: + // ![](aw_inline.001.png) + saveOptions.LinkExportMode = MarkdownLinkExportMode.Inline; + doc.Save(ArtifactsDir + "MarkdownSaveOptions.LinkExportMode.Inline.md", saveOptions); + //ExEnd:LinkExportMode + + string outDocContents = File.ReadAllText(ArtifactsDir + "MarkdownSaveOptions.LinkExportMode.Inline.md"); + Assert.AreEqual("![](MarkdownSaveOptions.LinkExportMode.Inline.001.png)", outDocContents.Trim()); + } } } diff --git a/Examples/ApiExamples/ApiExamples/ExPdfSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExPdfSaveOptions.cs index 9efa95bce..34a9b7607 100644 --- a/Examples/ApiExamples/ApiExamples/ExPdfSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExPdfSaveOptions.cs @@ -474,6 +474,8 @@ public void UsePdfDocumentForPreserveFormFields(bool preserveFormFields) [TestCase(PdfCompliance.PdfUa1)] [TestCase(PdfCompliance.Pdf20)] [TestCase(PdfCompliance.PdfA4)] + [TestCase(PdfCompliance.PdfA4Ua2)] + [TestCase(PdfCompliance.PdfUa2)] public void Compliance(PdfCompliance pdfCompliance) { //ExStart @@ -498,6 +500,9 @@ public void Compliance(PdfCompliance pdfCompliance) // Set the "Compliance" property to "PdfCompliance.Pdf20" to comply with the "PDF 2.0" (ISO 32000-2) standard. // Set the "Compliance" property to "PdfCompliance.PdfA4" to comply with the "PDF/A-4" (ISO 19004:2020) standard, // which preserving document static visual appearance over time. + // Set the "Compliance" property to "PdfCompliance.PdfA4Ua2" to comply with both PDF/A-4 (ISO 19005-4:2020) + // and PDF/UA-2 (ISO 14289-2:2024) standards. + // Set the "Compliance" property to "PdfCompliance.PdfUa2" to comply with the PDF/UA-2 (ISO 14289-2:2024) standard. // This helps with making documents searchable but may significantly increase the size of already large documents. saveOptions.Compliance = pdfCompliance; @@ -511,6 +516,8 @@ public void Compliance(PdfCompliance pdfCompliance) [TestCase(PdfCompliance.PdfUa1)] [TestCase(PdfCompliance.Pdf20)] [TestCase(PdfCompliance.PdfA4)] + [TestCase(PdfCompliance.PdfA4Ua2)] + [TestCase(PdfCompliance.PdfUa2)] public void UsePdfDocumentForCompliance(PdfCompliance pdfCompliance) { Compliance(pdfCompliance); @@ -543,6 +550,14 @@ public void UsePdfDocumentForCompliance(PdfCompliance pdfCompliance) Assert.AreEqual(PdfFormat.v_2_0, pdfDocument.PdfFormat); Assert.AreEqual("2.0", pdfDocument.Version); break; + case PdfCompliance.PdfA4Ua2: + Assert.AreEqual(PdfFormat.PDF_UA_1, pdfDocument.PdfFormat); + Assert.AreEqual("2.0", pdfDocument.Version); + break; + case PdfCompliance.PdfUa2: + Assert.AreEqual(PdfFormat.PDF_UA_1, pdfDocument.PdfFormat); + Assert.AreEqual("2.0", pdfDocument.Version); + break; } } @@ -2312,7 +2327,7 @@ public void UsePdfDocumentForRenderMetafile(EmfPlusDualRenderingMode renderingMo case EmfPlusDualRenderingMode.EmfPlusWithFallback: case EmfPlusDualRenderingMode.EmfPlus: Assert.AreEqual(0, pdfDocument.Pages[1].Resources.Images.Count); - TestUtil.FileContainsString("<>>>/Group<>>>", + TestUtil.FileContainsString("<>>>/Group<>>>", ArtifactsDir + "PdfSaveOptions.RenderMetafile.pdf"); break; } diff --git a/Examples/ApiExamples/ApiExamples/ExShape.cs b/Examples/ApiExamples/ApiExamples/ExShape.cs index 7e7d7fb41..a8f92dc87 100644 --- a/Examples/ApiExamples/ApiExamples/ExShape.cs +++ b/Examples/ApiExamples/ApiExamples/ExShape.cs @@ -1440,7 +1440,7 @@ public void RenderOfficeMath() //ExEnd if (!IsRunningOnMono()) - TestUtil.VerifyImage(799, 87, ArtifactsDir + "Shape.RenderOfficeMath.png"); + TestUtil.VerifyImage(813, 87, ArtifactsDir + "Shape.RenderOfficeMath.png"); else TestUtil.VerifyImage(735, 128, ArtifactsDir + "Shape.RenderOfficeMath.png"); } @@ -2764,37 +2764,37 @@ public void OfficeMathRenderer() OfficeMathRenderer renderer = new OfficeMathRenderer(officeMath); // Verify the size of the image that the OfficeMath object will create when we render it. - Assert.AreEqual(120.0f, renderer.SizeInPoints.Width, 0.25f); - Assert.AreEqual(13.0f, renderer.SizeInPoints.Height, 0.1f); + Assert.AreEqual(122.0f, renderer.SizeInPoints.Width, 0.25f); + Assert.AreEqual(13.0f, renderer.SizeInPoints.Height, 0.15f); - Assert.AreEqual(120.0f, renderer.BoundsInPoints.Width, 0.25f); - Assert.AreEqual(13.0f, renderer.BoundsInPoints.Height, 0.1f); + Assert.AreEqual(122.0f, renderer.BoundsInPoints.Width, 0.25f); + Assert.AreEqual(13.0f, renderer.BoundsInPoints.Height, 0.15f); // Shapes with transparent parts may contain different values in the "OpaqueBoundsInPoints" properties. - Assert.AreEqual(120.0f, renderer.OpaqueBoundsInPoints.Width, 0.25f); + Assert.AreEqual(122.0f, renderer.OpaqueBoundsInPoints.Width, 0.25f); Assert.AreEqual(14.2f, renderer.OpaqueBoundsInPoints.Height, 0.1f); // Get the shape size in pixels, with linear scaling to a specific DPI. Rectangle bounds = renderer.GetBoundsInPixels(1.0f, 96.0f); - Assert.AreEqual(160, bounds.Width); + Assert.AreEqual(163, bounds.Width); Assert.AreEqual(18, bounds.Height); // Get the shape size in pixels, but with a different DPI for the horizontal and vertical dimensions. bounds = renderer.GetBoundsInPixels(1.0f, 96.0f, 150.0f); - Assert.AreEqual(160, bounds.Width); - Assert.AreEqual(28, bounds.Height); + Assert.AreEqual(163, bounds.Width); + Assert.AreEqual(27, bounds.Height); // The opaque bounds may vary here also. bounds = renderer.GetOpaqueBoundsInPixels(1.0f, 96.0f); - Assert.AreEqual(160, bounds.Width); - Assert.AreEqual(18, bounds.Height); + Assert.AreEqual(163, bounds.Width); + Assert.AreEqual(19, bounds.Height); bounds = renderer.GetOpaqueBoundsInPixels(1.0f, 96.0f, 150.0f); - Assert.AreEqual(160, bounds.Width); - Assert.AreEqual(30, bounds.Height); + Assert.AreEqual(163, bounds.Width); + Assert.AreEqual(29, bounds.Height); //ExEnd } @@ -3263,5 +3263,71 @@ public void ShadowFormatColor() Assert.AreEqual(Color.Red.ToArgb(), shape.ShadowFormat.Color.ToArgb()); //ExEnd:ShadowFormatColor } + + [Test] + public void SetActiveXProperties() + { + //ExStart:SetActiveXProperties + //GistId:ac8ba4eb35f3fbb8066b48c999da63b0 + //ExFor:Forms2OleControl.ForeColor + //ExFor:Forms2OleControl.BackColor + //ExFor:Forms2OleControl.Height + //ExFor:Forms2OleControl.Width + //ExSummary:Shows how to set properties for ActiveX control. + Document doc = new Document(MyDir + "ActiveX controls.docx"); + + Shape shape = (Shape)doc.GetChild(NodeType.Shape, 0, true); + Forms2OleControl oleControl = (Forms2OleControl)shape.OleFormat.OleControl; + oleControl.ForeColor = Color.FromArgb(0x17, 0xE1, 0x35); + oleControl.BackColor = Color.FromArgb(0x33, 0x97, 0xF4); + oleControl.Height = 100.54; + oleControl.Width = 201.06; + //ExEnd:SetActiveXProperties + + Assert.AreEqual(Color.FromArgb(0x17, 0xE1, 0x35).ToArgb(), oleControl.ForeColor.ToArgb()); + Assert.AreEqual(Color.FromArgb(0x33, 0x97, 0xF4).ToArgb(), oleControl.BackColor.ToArgb()); + Assert.AreEqual(100.54, oleControl.Height); + Assert.AreEqual(201.06, oleControl.Width); + } + + [Test] + public void SelectRadioControl() + { + //ExStart:SelectRadioControl + //GistId:ac8ba4eb35f3fbb8066b48c999da63b0 + //ExFor:OptionButtonControl.Selected + //ExSummary:Shows how to select radio button. + Document doc = new Document(MyDir + "Radio buttons.docx"); + + Shape shape1 = (Shape)doc.GetChild(NodeType.Shape, 0, true); + OptionButtonControl optionButton1 = (OptionButtonControl)shape1.OleFormat.OleControl; + // Deselect selected first item. + optionButton1.Selected = false; + + Shape shape2 = (Shape)doc.GetChild(NodeType.Shape, 1, true); + OptionButtonControl optionButton2 = (OptionButtonControl)shape2.OleFormat.OleControl; + // Select second option button. + optionButton2.Selected = true; + + doc.Save(ArtifactsDir + "Shape.SelectRadioControl.docx"); + //ExEnd:SelectRadioControl + } + + [Test] + public void CheckedCheckBox() + { + //ExStart:CheckedCheckBox + //GistId:ac8ba4eb35f3fbb8066b48c999da63b0 + //ExFor:CheckBoxControl.Checked + //ExSummary:Shows how to change state of the CheckBox control. + Document doc = new Document(MyDir + "ActiveX controls.docx"); + + Shape shape = (Shape)doc.GetChild(NodeType.Shape, 0, true); + CheckBoxControl checkBoxControl = (CheckBoxControl)shape.OleFormat.OleControl; + + checkBoxControl.Checked = true; + //ExEnd:CheckedCheckBox + Assert.AreEqual(true, checkBoxControl.Checked); + } } } diff --git a/Examples/ApiExamples/ApiExamples/ExVbaProject.cs b/Examples/ApiExamples/ApiExamples/ExVbaProject.cs index 4aeb996c5..71aad0375 100644 --- a/Examples/ApiExamples/ApiExamples/ExVbaProject.cs +++ b/Examples/ApiExamples/ApiExamples/ExVbaProject.cs @@ -177,5 +177,17 @@ private static string GetLibIdProjectPath(string libIdProject) return libIdProject != null ? libIdProject.Substring(3) : ""; } //ExEnd + + [Test] + public void IsProtected() + { + //ExStart:IsProtected + //GistId:ac8ba4eb35f3fbb8066b48c999da63b0 + //ExFor:VbaProject.IsProtected + //ExSummary:Shows whether the VbaProject is password protected. + Document doc = new Document(MyDir + "Vba protected.docm"); + Assert.True(doc.VbaProject.IsProtected); + //ExEnd:IsProtected + } } } diff --git a/Examples/ApiExamples/ApiExamples/ExXlsxSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExXlsxSaveOptions.cs index 395f1edff..69fd09ae6 100644 --- a/Examples/ApiExamples/ApiExamples/ExXlsxSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExXlsxSaveOptions.cs @@ -46,5 +46,23 @@ public void SelectionMode() doc.Save(ArtifactsDir + "XlsxSaveOptions.SelectionMode.xlsx", xlsxSaveOptions); //ExEnd:SelectionMode } + + [Test] + public void DateTimeParsingMode() + { + //ExStart:DateTimeParsingMode + //GistId:ac8ba4eb35f3fbb8066b48c999da63b0 + //ExFor:XlsxSaveOptions.DateTimeParsingMode + //ExFor:XlsxDateTimeParsingMode + //ExSummary:Shows how to specify autodetection of the date time format. + Document doc = new Document(MyDir + "Xlsx DateTime.docx"); + + XlsxSaveOptions saveOptions = new XlsxSaveOptions(); + // Specify using datetime format autodetection. + saveOptions.DateTimeParsingMode = XlsxDateTimeParsingMode.Auto; + + doc.Save(ArtifactsDir + "XlsxSaveOptions.DateTimeParsingMode.xlsx", saveOptions); + //ExEnd:DateTimeParsingMode + } } } diff --git a/Examples/Data/List with leading zero.docx b/Examples/Data/List with leading zero.docx index b87f30a89dc8b855a97114c98d4698e9ba6d1914..be7671f03344ba426d9346a5c3a8c6eb1cdcf041 100644 GIT binary patch delta 9639 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 Rql!O+M0h^Jm9YQS`(MMsm?i)K diff --git a/Examples/Data/Radio buttons.docx b/Examples/Data/Radio buttons.docx new file mode 100644 index 0000000000000000000000000000000000000000..363a5c5fd7735c25023eeafcc2f22c3c8898b0f2 GIT binary patch literal 27078 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 literal 0 HcmV?d00001 diff --git a/Examples/Data/Xlsx DateTime.docx b/Examples/Data/Xlsx DateTime.docx new file mode 100644 index 0000000000000000000000000000000000000000..42e4cc92c8b647b637cab42a8441785579d2cc70 GIT binary patch literal 12425 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 Date: Wed, 3 Jul 2024 10:34:47 +0300 Subject: [PATCH 08/33] Updated Shaping dll --- Examples/ApiExamples/ApiExamples/ApiExamples.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/ApiExamples/ApiExamples/ApiExamples.csproj b/Examples/ApiExamples/ApiExamples/ApiExamples.csproj index 3066efe8f..8ffe2b8e6 100644 --- a/Examples/ApiExamples/ApiExamples/ApiExamples.csproj +++ b/Examples/ApiExamples/ApiExamples/ApiExamples.csproj @@ -129,7 +129,7 @@ - + From 52a0847d67c28d8fad4af29522b16a7332511cd2 Mon Sep 17 00:00:00 2001 From: vderyushev Date: Wed, 3 Jul 2024 20:40:37 +0300 Subject: [PATCH 09/33] Updated API references --- .../ApiExamples/ExAbsolutePositionTab.cs | 10 ++- .../ApiExamples/ExBuildingBlocks.cs | 52 +++++++---- .../ApiExamples/ExChmLoadOptions.cs | 2 + Examples/ApiExamples/ApiExamples/ExComment.cs | 42 +++++---- .../ApiExamples/ExCompatibilityOptions.cs | 87 +++++++++++++++++-- .../ApiExamples/ExDigitalSignatureUtil.cs | 1 + .../ApiExamples/ApiExamples/ExDocument.cs | 5 +- .../ApiExamples/ExDocumentVisitor.cs | 5 +- Examples/ApiExamples/ApiExamples/ExDrawing.cs | 1 + Examples/ApiExamples/ApiExamples/ExFont.cs | 4 +- .../ApiExamples/ApiExamples/ExFontSettings.cs | 3 + Examples/ApiExamples/ApiExamples/ExLowCode.cs | 2 + .../ApiExamples/ApiExamples/ExPageSetup.cs | 3 + .../ApiExamples/ExStructuredDocumentTag.cs | 1 + .../ApiExamples/ApiExamples/ExVbaProject.cs | 3 + 15 files changed, 172 insertions(+), 49 deletions(-) diff --git a/Examples/ApiExamples/ApiExamples/ExAbsolutePositionTab.cs b/Examples/ApiExamples/ApiExamples/ExAbsolutePositionTab.cs index 4bc63b846..626382221 100644 --- a/Examples/ApiExamples/ApiExamples/ExAbsolutePositionTab.cs +++ b/Examples/ApiExamples/ApiExamples/ExAbsolutePositionTab.cs @@ -18,6 +18,9 @@ public class ExAbsolutePositionTab : ApiExampleBase //ExFor:AbsolutePositionTab //ExFor:AbsolutePositionTab.Accept(DocumentVisitor) //ExFor:DocumentVisitor.VisitAbsolutePositionTab + //ExFor:Body.Accept(DocumentVisitor) + //ExFor:Body.AcceptStart(DocumentVisitor) + //ExFor:Body.AcceptEnd(DocumentVisitor) //ExSummary:Shows how to process absolute position tab characters with a document visitor. [Test] //ExSkip public void DocumentToTxt() @@ -26,7 +29,12 @@ public void DocumentToTxt() // Extract the text contents of our document by accepting this custom document visitor. DocTextExtractor myDocTextExtractor = new DocTextExtractor(); - doc.FirstSection.Body.Accept(myDocTextExtractor); + Section fisrtSection = doc.FirstSection; + fisrtSection.Body.Accept(myDocTextExtractor); + // Visit only start of the document body. + fisrtSection.Body.AcceptStart(myDocTextExtractor); + // Visit only end of the document body. + fisrtSection.Body.AcceptEnd(myDocTextExtractor); // The absolute position tab, which has no equivalent in string form, has been explicitly converted to a tab character. Assert.AreEqual("Before AbsolutePositionTab\tAfter AbsolutePositionTab", myDocTextExtractor.GetText()); diff --git a/Examples/ApiExamples/ApiExamples/ExBuildingBlocks.cs b/Examples/ApiExamples/ApiExamples/ExBuildingBlocks.cs index 816dfdac9..89eb42c59 100644 --- a/Examples/ApiExamples/ApiExamples/ExBuildingBlocks.cs +++ b/Examples/ApiExamples/ApiExamples/ExBuildingBlocks.cs @@ -16,25 +16,27 @@ namespace ApiExamples { [TestFixture] public class ExBuildingBlocks : ApiExampleBase - { - //ExStart - //ExFor:Document.GlossaryDocument - //ExFor:BuildingBlock - //ExFor:BuildingBlock.#ctor(GlossaryDocument) - //ExFor:BuildingBlock.Accept(DocumentVisitor) - //ExFor:BuildingBlock.Behavior - //ExFor:BuildingBlock.Category - //ExFor:BuildingBlock.Description - //ExFor:BuildingBlock.FirstSection - //ExFor:BuildingBlock.Gallery - //ExFor:BuildingBlock.Guid - //ExFor:BuildingBlock.LastSection - //ExFor:BuildingBlock.Name - //ExFor:BuildingBlock.Sections - //ExFor:BuildingBlock.Type - //ExFor:BuildingBlockBehavior - //ExFor:BuildingBlockType - //ExSummary:Shows how to add a custom building block to a document. + { + //ExStart + //ExFor:Document.GlossaryDocument + //ExFor:BuildingBlock + //ExFor:BuildingBlock.#ctor(GlossaryDocument) + //ExFor:BuildingBlock.Accept(DocumentVisitor) + //ExFor:BuildingBlock.AcceptStart(DocumentVisitor) + //ExFor:BuildingBlock.AcceptEnd(DocumentVisitor) + //ExFor:BuildingBlock.Behavior + //ExFor:BuildingBlock.Category + //ExFor:BuildingBlock.Description + //ExFor:BuildingBlock.FirstSection + //ExFor:BuildingBlock.Gallery + //ExFor:BuildingBlock.Guid + //ExFor:BuildingBlock.LastSection + //ExFor:BuildingBlock.Name + //ExFor:BuildingBlock.Sections + //ExFor:BuildingBlock.Type + //ExFor:BuildingBlockBehavior + //ExFor:BuildingBlockType + //ExSummary:Shows how to add a custom building block to a document. [Test] //ExSkip public void CreateAndInsert() { @@ -66,7 +68,12 @@ public void CreateAndInsert() // Before we can add this building block to our document, we will need to give it some contents, // which we will do using a document visitor. This visitor will also set a category, gallery, and behavior. BuildingBlockVisitor visitor = new BuildingBlockVisitor(glossaryDoc); + // Visit start/end of the BuildingBlock. block.Accept(visitor); + // Visit only start of the BuildingBlock. + block.AcceptStart(visitor); + // Visit only end of the BuildingBlock. + block.AcceptEnd(visitor); // We can access the block that we just made from the glossary document. BuildingBlock customBlock = glossaryDoc.GetBuildingBlock(BuildingBlockGallery.QuickParts, @@ -134,6 +141,8 @@ public override VisitorAction VisitBuildingBlockEnd(BuildingBlock block) //ExStart //ExFor:GlossaryDocument //ExFor:GlossaryDocument.Accept(DocumentVisitor) + //ExFor:GlossaryDocument.AcceptStart(DocumentVisitor) + //ExFor:GlossaryDocument.AcceptEnd(DocumentVisitor) //ExFor:GlossaryDocument.BuildingBlocks //ExFor:GlossaryDocument.FirstBuildingBlock //ExFor:GlossaryDocument.GetBuildingBlock(BuildingBlockGallery,String,String) @@ -184,7 +193,12 @@ public void GlossaryDocument() // We will do that using a custom visitor, // which will give every BuildingBlock in the GlossaryDocument a unique GUID GlossaryDocVisitor visitor = new GlossaryDocVisitor(); + // Visit start/end of the Glossary document. glossaryDoc.Accept(visitor); + // Visit only start of the Glossary document. + glossaryDoc.AcceptStart(visitor); + // Visit only end of the Glossary document. + glossaryDoc.AcceptEnd(visitor); Assert.AreEqual(5, visitor.GetDictionary().Count); //ExSkip Console.WriteLine(visitor.GetText()); diff --git a/Examples/ApiExamples/ApiExamples/ExChmLoadOptions.cs b/Examples/ApiExamples/ApiExamples/ExChmLoadOptions.cs index 7834c2a27..01221e474 100644 --- a/Examples/ApiExamples/ApiExamples/ExChmLoadOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExChmLoadOptions.cs @@ -19,6 +19,8 @@ public class ExChmLoadOptions : ApiExampleBase public void OriginalFileName() { //ExStart + //ExFor:ChmLoadOptions + //ExFor:ChmLoadOptions.#ctor //ExFor:ChmLoadOptions.OriginalFileName //ExSummary:Shows how to resolve URLs like "ms-its:myfile.chm::/index.htm". // Our document contains URLs like "ms-its:amhelp.chm::....htm", but it has a different name, diff --git a/Examples/ApiExamples/ApiExamples/ExComment.cs b/Examples/ApiExamples/ApiExamples/ExComment.cs index 1514fda68..e96a7a14d 100644 --- a/Examples/ApiExamples/ApiExamples/ExComment.cs +++ b/Examples/ApiExamples/ApiExamples/ExComment.cs @@ -162,24 +162,26 @@ public void Done() Assert.True(comment.Done); Assert.AreEqual("\u0005Fix the spelling error!", comment.GetText().Trim()); Assert.AreEqual("Hello world!", doc.FirstSection.Body.FirstParagraph.Runs[0].Text); - } - - //ExStart - //ExFor:Comment.Done - //ExFor:Comment.#ctor(DocumentBase) - //ExFor:Comment.Accept(DocumentVisitor) - //ExFor:Comment.DateTime - //ExFor:Comment.Id - //ExFor:Comment.Initial - //ExFor:CommentRangeEnd - //ExFor:CommentRangeEnd.#ctor(DocumentBase,Int32) - //ExFor:CommentRangeEnd.Accept(DocumentVisitor) - //ExFor:CommentRangeEnd.Id - //ExFor:CommentRangeStart - //ExFor:CommentRangeStart.#ctor(DocumentBase,Int32) - //ExFor:CommentRangeStart.Accept(DocumentVisitor) - //ExFor:CommentRangeStart.Id - //ExSummary:Shows how print the contents of all comments and their comment ranges using a document visitor. + } + + //ExStart + //ExFor:Comment.Done + //ExFor:Comment.#ctor(DocumentBase) + //ExFor:Comment.Accept(DocumentVisitor) + //ExFor:Comment.AcceptStart(DocumentVisitor) + //ExFor:Comment.AcceptEnd(DocumentVisitor) + //ExFor:Comment.DateTime + //ExFor:Comment.Id + //ExFor:Comment.Initial + //ExFor:CommentRangeEnd + //ExFor:CommentRangeEnd.#ctor(DocumentBase,Int32) + //ExFor:CommentRangeEnd.Accept(DocumentVisitor) + //ExFor:CommentRangeEnd.Id + //ExFor:CommentRangeStart + //ExFor:CommentRangeStart.#ctor(DocumentBase,Int32) + //ExFor:CommentRangeStart.Accept(DocumentVisitor) + //ExFor:CommentRangeStart.Id + //ExSummary:Shows how print the contents of all comments and their comment ranges using a document visitor. [Test] //ExSkip public void CreateCommentsAndPrintAllInfo() { @@ -224,6 +226,10 @@ private static void PrintAllCommentInfo(NodeCollection comments) // Then, visit the comment, and any replies that it may have. comment.Accept(commentVisitor); + // Visit only start of the comment. + comment.AcceptStart(commentVisitor); + // Visit only end of the comment. + comment.AcceptEnd(commentVisitor); foreach (Comment reply in comment.Replies) reply.Accept(commentVisitor); diff --git a/Examples/ApiExamples/ApiExamples/ExCompatibilityOptions.cs b/Examples/ApiExamples/ApiExamples/ExCompatibilityOptions.cs index b44596ec9..e02f43caf 100644 --- a/Examples/ApiExamples/ApiExamples/ExCompatibilityOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExCompatibilityOptions.cs @@ -15,14 +15,85 @@ namespace ApiExamples { [TestFixture] public class ExCompatibilityOptions : ApiExampleBase - { - //ExStart - //ExFor:Compatibility - //ExFor:CompatibilityOptions - //ExFor:CompatibilityOptions.OptimizeFor(MsWordVersion) - //ExFor:Document.CompatibilityOptions - //ExFor:MsWordVersion - //ExSummary:Shows how to optimize the document for different versions of Microsoft Word. + { + //ExStart + //ExFor:Compatibility + //ExFor:CompatibilityOptions + //ExFor:CompatibilityOptions.OptimizeFor(MsWordVersion) + //ExFor:Document.CompatibilityOptions + //ExFor:MsWordVersion + //ExFor:CompatibilityOptions.AdjustLineHeightInTable + //ExFor:CompatibilityOptions.AlignTablesRowByRow + //ExFor:CompatibilityOptions.AllowSpaceOfSameStyleInTable + //ExFor:CompatibilityOptions.ApplyBreakingRules + //ExFor:CompatibilityOptions.AutofitToFirstFixedWidthCell + //ExFor:CompatibilityOptions.AutoSpaceLikeWord95 + //ExFor:CompatibilityOptions.BalanceSingleByteDoubleByteWidth + //ExFor:CompatibilityOptions.CachedColBalance + //ExFor:CompatibilityOptions.ConvMailMergeEsc + //ExFor:CompatibilityOptions.DisableOpenTypeFontFormattingFeatures + //ExFor:CompatibilityOptions.DisplayHangulFixedWidth + //ExFor:CompatibilityOptions.DoNotAutofitConstrainedTables + //ExFor:CompatibilityOptions.DoNotBreakConstrainedForcedTable + //ExFor:CompatibilityOptions.DoNotBreakWrappedTables + //ExFor:CompatibilityOptions.DoNotExpandShiftReturn + //ExFor:CompatibilityOptions.DoNotLeaveBackslashAlone + //ExFor:CompatibilityOptions.DoNotSnapToGridInCell + //ExFor:CompatibilityOptions.DoNotSuppressIndentation + //ExFor:CompatibilityOptions.DoNotSuppressParagraphBorders + //ExFor:CompatibilityOptions.DoNotUseEastAsianBreakRules + //ExFor:CompatibilityOptions.DoNotUseHTMLParagraphAutoSpacing + //ExFor:CompatibilityOptions.DoNotUseIndentAsNumberingTabStop + //ExFor:CompatibilityOptions.DoNotVertAlignCellWithSp + //ExFor:CompatibilityOptions.DoNotVertAlignInTxbx + //ExFor:CompatibilityOptions.DoNotWrapTextWithPunct + //ExFor:CompatibilityOptions.FootnoteLayoutLikeWW8 + //ExFor:CompatibilityOptions.ForgetLastTabAlignment + //ExFor:CompatibilityOptions.GrowAutofit + //ExFor:CompatibilityOptions.LayoutRawTableWidth + //ExFor:CompatibilityOptions.LayoutTableRowsApart + //ExFor:CompatibilityOptions.LineWrapLikeWord6 + //ExFor:CompatibilityOptions.MWSmallCaps + //ExFor:CompatibilityOptions.NoColumnBalance + //ExFor:CompatibilityOptions.NoExtraLineSpacing + //ExFor:CompatibilityOptions.NoLeading + //ExFor:CompatibilityOptions.NoSpaceRaiseLower + //ExFor:CompatibilityOptions.NoTabHangInd + //ExFor:CompatibilityOptions.OverrideTableStyleFontSizeAndJustification + //ExFor:CompatibilityOptions.PrintBodyTextBeforeHeader + //ExFor:CompatibilityOptions.PrintColBlack + //ExFor:CompatibilityOptions.SelectFldWithFirstOrLastChar + //ExFor:CompatibilityOptions.ShapeLayoutLikeWW8 + //ExFor:CompatibilityOptions.ShowBreaksInFrames + //ExFor:CompatibilityOptions.SpaceForUL + //ExFor:CompatibilityOptions.SpacingInWholePoints + //ExFor:CompatibilityOptions.SplitPgBreakAndParaMark + //ExFor:CompatibilityOptions.SubFontBySize + //ExFor:CompatibilityOptions.SuppressBottomSpacing + //ExFor:CompatibilityOptions.SuppressSpacingAtTopOfPage + //ExFor:CompatibilityOptions.SuppressSpBfAfterPgBrk + //ExFor:CompatibilityOptions.SuppressTopSpacing + //ExFor:CompatibilityOptions.SuppressTopSpacingWP + //ExFor:CompatibilityOptions.SwapBordersFacingPgs + //ExFor:CompatibilityOptions.SwapInsideAndOutsideForMirrorIndentsAndRelativePositioning + //ExFor:CompatibilityOptions.TransparentMetafiles + //ExFor:CompatibilityOptions.TruncateFontHeightsLikeWP6 + //ExFor:CompatibilityOptions.UICompat97To2003 + //ExFor:CompatibilityOptions.UlTrailSpace + //ExFor:CompatibilityOptions.UnderlineTabInNumList + //ExFor:CompatibilityOptions.UseAltKinsokuLineBreakRules + //ExFor:CompatibilityOptions.UseAnsiKerningPairs + //ExFor:CompatibilityOptions.UseFELayout + //ExFor:CompatibilityOptions.UseNormalStyleForList + //ExFor:CompatibilityOptions.UsePrinterMetrics + //ExFor:CompatibilityOptions.UseSingleBorderforContiguousCells + //ExFor:CompatibilityOptions.UseWord2002TableStyleRules + //ExFor:CompatibilityOptions.UseWord2010TableStyleRules + //ExFor:CompatibilityOptions.UseWord97LineBreakRules + //ExFor:CompatibilityOptions.WPJustification + //ExFor:CompatibilityOptions.WPSpaceWidth + //ExFor:CompatibilityOptions.WrapTrailSpaces + //ExSummary:Shows how to optimize the document for different versions of Microsoft Word. [Test] //ExSkip public void OptimizeFor() { diff --git a/Examples/ApiExamples/ApiExamples/ExDigitalSignatureUtil.cs b/Examples/ApiExamples/ApiExamples/ExDigitalSignatureUtil.cs index 3a522abc5..01157d09d 100644 --- a/Examples/ApiExamples/ApiExamples/ExDigitalSignatureUtil.cs +++ b/Examples/ApiExamples/ApiExamples/ExDigitalSignatureUtil.cs @@ -89,6 +89,7 @@ public void SignDocument() //ExFor:CertificateHolder //ExFor:CertificateHolder.Create(String, String) //ExFor:DigitalSignatureUtil.Sign(Stream, Stream, CertificateHolder, SignOptions) + //ExFor:DigitalSignatures.SignOptions //ExFor:SignOptions.Comments //ExFor:SignOptions.SignTime //ExSummary:Shows how to digitally sign documents. diff --git a/Examples/ApiExamples/ApiExamples/ExDocument.cs b/Examples/ApiExamples/ApiExamples/ExDocument.cs index 629e2ec62..12a55d2cf 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocument.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocument.cs @@ -2162,6 +2162,7 @@ public void CreateWebExtension() //ExFor:WebExtension.Properties //ExFor:WebExtension.Bindings //ExFor:WebExtension.IsFrozen + //ExFor:WebExtensionReference //ExFor:WebExtensionReference.Id //ExFor:WebExtensionReference.Version //ExFor:WebExtensionReference.StoreType @@ -2174,6 +2175,8 @@ public void CreateWebExtension() //ExFor:WebExtensionBindingType //ExFor:TaskPaneDockState //ExFor:TaskPaneCollection + //ExFor:WebExtensionBinding.AppRef + //ExFor:WebExtensionBinding.BindingType //ExSummary:Shows how to add a web extension to a document. Document doc = new Document(); @@ -2210,7 +2213,6 @@ public void CreateWebExtension() doc.WebExtensionTaskPanes.Clear(); Assert.AreEqual(0, doc.WebExtensionTaskPanes.Count); - //ExEnd doc = new Document(ArtifactsDir + "Document.WebExtension.docx"); myScriptTaskPane = doc.WebExtensionTaskPanes[0]; @@ -2235,6 +2237,7 @@ public void CreateWebExtension() Assert.AreEqual("104380646", webExtension.Bindings[0].AppRef); Assert.False(webExtension.IsFrozen); + //ExEnd } [Test] diff --git a/Examples/ApiExamples/ApiExamples/ExDocumentVisitor.cs b/Examples/ApiExamples/ApiExamples/ExDocumentVisitor.cs index e49fa71de..667719204 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocumentVisitor.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocumentVisitor.cs @@ -22,7 +22,6 @@ public class ExDocumentVisitor : ApiExampleBase { //ExStart //ExFor:Document.Accept(DocumentVisitor) - //ExFor:Body.Accept(DocumentVisitor) //ExFor:SubDocument.Accept(DocumentVisitor) //ExFor:DocumentVisitor //ExFor:DocumentVisitor.VisitRun(Run) @@ -217,6 +216,8 @@ private static void TestDocStructureToText(DocStructurePrinter visitor) //ExStart //ExFor:Cell.Accept(DocumentVisitor) + //ExFor:Cell.AcceptStart(DocumentVisitor) + //ExFor:Cell.AcceptEnd(DocumentVisitor) //ExFor:Cell.IsFirstCell //ExFor:Cell.IsLastCell //ExFor:DocumentVisitor.VisitTableEnd(Table) @@ -226,6 +227,8 @@ private static void TestDocStructureToText(DocStructurePrinter visitor) //ExFor:DocumentVisitor.VisitCellStart(Cell) //ExFor:DocumentVisitor.VisitCellEnd(Cell) //ExFor:Row.Accept(DocumentVisitor) + //ExFor:Row.AcceptStart(DocumentVisitor) + //ExFor:Row.AcceptEnd(DocumentVisitor) //ExFor:Row.FirstCell //ExFor:Row.GetText //ExFor:Row.IsFirstRow diff --git a/Examples/ApiExamples/ApiExamples/ExDrawing.cs b/Examples/ApiExamples/ApiExamples/ExDrawing.cs index 0dc565f44..e7a2bfa77 100644 --- a/Examples/ApiExamples/ApiExamples/ExDrawing.cs +++ b/Examples/ApiExamples/ApiExamples/ExDrawing.cs @@ -239,6 +239,7 @@ public void FillSolid() //ExStart //ExFor:Fill.Color() //ExFor:Fill.Solid(Color) + //ExFor:Font.Fill //ExSummary:Shows how to convert any of the fills back to solid fill. Document doc = new Document(MyDir + "Two color gradient.docx"); diff --git a/Examples/ApiExamples/ApiExamples/ExFont.cs b/Examples/ApiExamples/ApiExamples/ExFont.cs index 9f09a35ae..f73a2286c 100644 --- a/Examples/ApiExamples/ApiExamples/ExFont.cs +++ b/Examples/ApiExamples/ApiExamples/ExFont.cs @@ -1078,7 +1078,9 @@ public void SetFontAutoColor() //ExFor:SpecialChar //ExFor:Node.Accept //ExFor:Paragraph.ParagraphBreakFont - //ExFor:Table.Accept + //ExFor:Table.Accept(DocumentVisitor) + //ExFor:Table.AcceptStart(DocumentVisitor) + //ExFor:Table.AcceptEnd(DocumentVisitor) //ExSummary:Shows how to use a DocumentVisitor implementation to remove all hidden content from a document. [Test] //ExSkip public void RemoveHiddenContentFromDocument() diff --git a/Examples/ApiExamples/ApiExamples/ExFontSettings.cs b/Examples/ApiExamples/ApiExamples/ExFontSettings.cs index 885b64ba8..967989519 100644 --- a/Examples/ApiExamples/ApiExamples/ExFontSettings.cs +++ b/Examples/ApiExamples/ApiExamples/ExFontSettings.cs @@ -1286,6 +1286,9 @@ public override Stream OpenFontDataStream() //ExFor:MemoryFontSource.#ctor(Byte[], Int32, String) //ExFor:FontSettings.SaveSearchCache(Stream) //ExFor:FontSettings.SetFontsSources(FontSourceBase[], Stream) + //ExFor:FileFontSource.CacheKey + //ExFor:MemoryFontSource.CacheKey + //ExFor:StreamFontSource.CacheKey //ExSummary:Shows how to speed up the font cache initialization process. [Test]//ExSkip public void LoadFontSearchCache() diff --git a/Examples/ApiExamples/ApiExamples/ExLowCode.cs b/Examples/ApiExamples/ApiExamples/ExLowCode.cs index 96c88d66f..e4f6a653d 100644 --- a/Examples/ApiExamples/ApiExamples/ExLowCode.cs +++ b/Examples/ApiExamples/ApiExamples/ExLowCode.cs @@ -25,6 +25,8 @@ public void MergeDocuments() //ExFor:Merger.Merge(String[], MergeFormatMode) //ExFor:Merger.Merge(String, String[], SaveOptions, MergeFormatMode) //ExFor:Merger.Merge(String, String[], SaveFormat, MergeFormatMode) + //ExFor:LowCode.MergeFormatMode + //ExFor:LowCode.Merger //ExSummary:Shows how to merge documents into a single output document. //There is a several ways to merge documents: Merger.Merge(ArtifactsDir + "LowCode.MergeDocument.SimpleMerge.docx", new[] { MyDir + "Big document.docx", MyDir + "Tables.docx" }); diff --git a/Examples/ApiExamples/ApiExamples/ExPageSetup.cs b/Examples/ApiExamples/ApiExamples/ExPageSetup.cs index 4e2973cdf..4451f8f25 100644 --- a/Examples/ApiExamples/ApiExamples/ExPageSetup.cs +++ b/Examples/ApiExamples/ApiExamples/ExPageSetup.cs @@ -486,6 +486,8 @@ public void ColumnsSameWidth() //ExFor:TextColumnCollection //ExFor:TextColumnCollection.Spacing //ExFor:TextColumnCollection.SetCount + //ExFor:TextColumnCollection.Count + //ExFor:TextColumnCollection.Width //ExSummary:Shows how to create multiple evenly spaced columns in a section. Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); @@ -505,6 +507,7 @@ public void ColumnsSameWidth() Assert.AreEqual(100.0d, doc.FirstSection.PageSetup.TextColumns.Spacing); Assert.AreEqual(2, doc.FirstSection.PageSetup.TextColumns.Count); + Assert.AreEqual(185.15, doc.FirstSection.PageSetup.TextColumns.Width, 0.01); } [Test] diff --git a/Examples/ApiExamples/ApiExamples/ExStructuredDocumentTag.cs b/Examples/ApiExamples/ApiExamples/ExStructuredDocumentTag.cs index 8c7e0c8c7..4e64f37b0 100644 --- a/Examples/ApiExamples/ApiExamples/ExStructuredDocumentTag.cs +++ b/Examples/ApiExamples/ApiExamples/ExStructuredDocumentTag.cs @@ -144,6 +144,7 @@ public void Date() //ExFor:StructuredDocumentTag.DateDisplayLocale //ExFor:StructuredDocumentTag.DateStorageFormat //ExFor:StructuredDocumentTag.FullDate + //ExFor:SdtCalendarType //ExSummary:Shows how to prompt the user to enter a date with a structured document tag. Document doc = new Document(); diff --git a/Examples/ApiExamples/ApiExamples/ExVbaProject.cs b/Examples/ApiExamples/ApiExamples/ExVbaProject.cs index 71aad0375..985783545 100644 --- a/Examples/ApiExamples/ApiExamples/ExVbaProject.cs +++ b/Examples/ApiExamples/ApiExamples/ExVbaProject.cs @@ -104,12 +104,15 @@ public void CloneVbaProject() //ExStart //ExFor:VbaReference + //ExFor:VbaReference.Type //ExFor:VbaReference.LibId //ExFor:VbaReferenceCollection + //ExFor:VbaReferenceCollection.Item(Int32) //ExFor:VbaReferenceCollection.Count //ExFor:VbaReferenceCollection.RemoveAt(int) //ExFor:VbaReferenceCollection.Remove(VbaReference) //ExFor:VbaReferenceType + //ExFor:VbaProject.References //ExSummary:Shows how to get/remove an element from the VBA reference collection. [Test]//ExSkip public void RemoveVbaReference() From a6e7a28754b977d797767e8ec1ae29b2070ab44a Mon Sep 17 00:00:00 2001 From: vderyushev Date: Wed, 3 Jul 2024 21:28:47 +0300 Subject: [PATCH 10/33] Updated tags --- .../ApiExamples/ExAbsolutePositionTab.cs | 1 + .../ApiExamples/ApiExamples/ExDocument.cs | 25 ++++++++++++++++--- .../ApiExamples/ExDocumentBuilder.cs | 12 +++++++-- Examples/ApiExamples/ApiExamples/ExFont.cs | 11 ++++++-- .../ApiExamples/ApiExamples/ExHeaderFooter.cs | 3 ++- .../ApiExamples/ExOoxmlSaveOptions.cs | 5 +++- .../ApiExamples/ApiExamples/ExParagraph.cs | 2 ++ .../ApiExamples/ApiExamples/ExPrinting.cs | 2 ++ .../ApiExamples/ExStructuredDocumentTag.cs | 1 + Examples/ApiExamples/ApiExamples/ExStyles.cs | 1 + .../ApiExamples/ExSvgSaveOptions.cs | 4 +++ .../ApiExamples/ExVariableCollection.cs | 5 ++++ 12 files changed, 63 insertions(+), 9 deletions(-) diff --git a/Examples/ApiExamples/ApiExamples/ExAbsolutePositionTab.cs b/Examples/ApiExamples/ApiExamples/ExAbsolutePositionTab.cs index 626382221..35f85b693 100644 --- a/Examples/ApiExamples/ApiExamples/ExAbsolutePositionTab.cs +++ b/Examples/ApiExamples/ApiExamples/ExAbsolutePositionTab.cs @@ -21,6 +21,7 @@ public class ExAbsolutePositionTab : ApiExampleBase //ExFor:Body.Accept(DocumentVisitor) //ExFor:Body.AcceptStart(DocumentVisitor) //ExFor:Body.AcceptEnd(DocumentVisitor) + //ExFor:VisitorAction //ExSummary:Shows how to process absolute position tab characters with a document visitor. [Test] //ExSkip public void DocumentToTxt() diff --git a/Examples/ApiExamples/ApiExamples/ExDocument.cs b/Examples/ApiExamples/ApiExamples/ExDocument.cs index 12a55d2cf..cb49329f7 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocument.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocument.cs @@ -514,10 +514,16 @@ public void LoadEncrypted() [Test] public void NotSupportedWarning() { - WarningInfoCollection warings = new WarningInfoCollection(); - Document doc = new Document(MyDir + "FB2 document.fb2", new LoadOptions { WarningCallback = warings }); + //ExStart + //ExFor:WarningInfoCollection.Count + //ExFor:WarningInfoCollection.Item(Int32) + //ExSummary:Shows how to get warnings about unsupported formats. + WarningInfoCollection warnings = new WarningInfoCollection(); + Document doc = new Document(MyDir + "FB2 document.fb2", new LoadOptions { WarningCallback = warnings }); - Assert.AreEqual("The original file load format is FB2, which is not supported by Aspose.Words. The file is loaded as an XML document.", warings[0].Description); + Assert.AreEqual("The original file load format is FB2, which is not supported by Aspose.Words. The file is loaded as an XML document.", warnings[0].Description); + Assert.AreEqual(1, warnings.Count); + //ExEnd } [Test] @@ -590,6 +596,7 @@ public void SaveToStream() } //ExStart + //ExFor:Range.Fields //ExFor:INodeChangingCallback //ExFor:INodeChangingCallback.NodeInserting //ExFor:INodeChangingCallback.NodeInserted @@ -1568,6 +1575,7 @@ public void DefaultTemplate() public void UseSubstitutions() { //ExStart + //ExFor:FindReplaceOptions.#ctor //ExFor:FindReplaceOptions.UseSubstitutions //ExFor:FindReplaceOptions.LegacyMode //ExSummary:Shows how to recognize and use substitutions within replacement patterns. @@ -2294,9 +2302,12 @@ public void EpubCover() public void TextWatermark() { //ExStart + //ExFor:Document.Watermark + //ExFor:Watermark //ExFor:Watermark.SetText(String) //ExFor:Watermark.SetText(String, TextWatermarkOptions) //ExFor:Watermark.Remove + //ExFor:TextWatermarkOptions //ExFor:TextWatermarkOptions.FontFamily //ExFor:TextWatermarkOptions.FontSize //ExFor:TextWatermarkOptions.Color @@ -2304,6 +2315,7 @@ public void TextWatermark() //ExFor:TextWatermarkOptions.IsSemitrasparent //ExFor:WatermarkLayout //ExFor:WatermarkType + //ExFor:Watermark.Type //ExSummary:Shows how to create a text watermark. Document doc = new Document(); @@ -2340,6 +2352,8 @@ public void ImageWatermark() //ExFor:Watermark.SetImage(Image, ImageWatermarkOptions) //ExFor:ImageWatermarkOptions.Scale //ExFor:ImageWatermarkOptions.IsWashout + //ExFor:Watermark.SetImage(Image) + //ExFor:Watermark.SetImage(String, ImageWatermarkOptions) //ExSummary:Shows how to create a watermark from an image in the local file system. Document doc = new Document(); @@ -2350,7 +2364,12 @@ public void ImageWatermark() imageWatermarkOptions.IsWashout = false; #if NET461_OR_GREATER || JAVA + // We have a different options to insert image: doc.Watermark.SetImage(Image.FromFile(ImageDir + "Logo.jpg"), imageWatermarkOptions); + + doc.Watermark.SetImage(Image.FromFile(ImageDir + "Logo.jpg")); + + doc.Watermark.SetImage(ImageDir + "Logo.jpg", imageWatermarkOptions); #elif NET5_0_OR_GREATER using (SKBitmap image = SKBitmap.Decode(ImageDir + "Logo.jpg")) { diff --git a/Examples/ApiExamples/ApiExamples/ExDocumentBuilder.cs b/Examples/ApiExamples/ApiExamples/ExDocumentBuilder.cs index 3242de944..6c11305a3 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocumentBuilder.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocumentBuilder.cs @@ -1905,6 +1905,7 @@ public void SignatureLineProviderId() //ExFor:SignatureLine.IsSigned //ExFor:SignatureLine.IsValid //ExFor:SignatureLine.ProviderId + //ExFor:SignatureLineOptions //ExFor:SignatureLineOptions.ShowDate //ExFor:SignatureLineOptions.Email //ExFor:SignatureLineOptions.DefaultInstructions @@ -3011,6 +3012,9 @@ public void SmartStyleBehavior() [Test] public void EmphasesWarningSourceMarkdown() { + //ExStart + //ExFor:WarningInfo.Source + //ExSummary:Shows how to work with the warning source. Document doc = new Document(MyDir + "Emphases markdown warning.docx"); WarningInfoCollection warnings = new WarningInfoCollection(); @@ -3022,6 +3026,7 @@ public void EmphasesWarningSourceMarkdown() if (warningInfo.Source == WarningSource.Markdown) Assert.AreEqual("The (*, 0:11) cannot be properly written into Markdown.", warningInfo.Description); } + //ExEnd } [Test] @@ -3546,6 +3551,7 @@ public void PhoneticGuide() //ExStart //ExFor:Run.IsPhoneticGuide //ExFor:Run.PhoneticGuide + //ExFor:PhoneticGuide //ExFor:PhoneticGuide.BaseText //ExFor:PhoneticGuide.RubyText //ExSummary:Shows how to get properties of the phonetic guide. @@ -3554,8 +3560,10 @@ public void PhoneticGuide() RunCollection runs = doc.FirstSection.Body.FirstParagraph.Runs; // Use phonetic guide in the Asian text. Assert.AreEqual(true, runs[0].IsPhoneticGuide); - Assert.AreEqual("base", runs[0].PhoneticGuide.BaseText); - Assert.AreEqual("ruby", runs[0].PhoneticGuide.RubyText); + + PhoneticGuide phoneticGuide = runs[0].PhoneticGuide; + Assert.AreEqual("base", phoneticGuide.BaseText); + Assert.AreEqual("ruby", phoneticGuide.RubyText); //ExEnd } } diff --git a/Examples/ApiExamples/ApiExamples/ExFont.cs b/Examples/ApiExamples/ApiExamples/ExFont.cs index f73a2286c..47774413e 100644 --- a/Examples/ApiExamples/ApiExamples/ExFont.cs +++ b/Examples/ApiExamples/ApiExamples/ExFont.cs @@ -626,6 +626,7 @@ public void ComplexScript() public void SparklingText() { //ExStart + //ExFor:TextEffect //ExFor:Font.TextEffect //ExSummary:Shows how to apply a visual effect to a run. Document doc = new Document(); @@ -1064,7 +1065,7 @@ public void SetFontAutoColor() //ExStart //ExFor:Font.Hidden - //ExFor:Paragraph.Accept + //ExFor:Paragraph.Accept(DocumentVisitor) //ExFor:DocumentVisitor.VisitParagraphStart(Paragraph) //ExFor:DocumentVisitor.VisitFormField(FormField) //ExFor:DocumentVisitor.VisitTableEnd(Table) @@ -1076,7 +1077,9 @@ public void SetFontAutoColor() //ExFor:DocumentVisitor.VisitCommentStart(Comment) //ExFor:DocumentVisitor.VisitFootnoteStart(Footnote) //ExFor:SpecialChar - //ExFor:Node.Accept + //ExFor:SpecialChar.Accept(DocumentVisitor) + //ExFor:SpecialChar.GetText + //ExFor:Node.Accept(DocumentVisitor) //ExFor:Paragraph.ParagraphBreakFont //ExFor:Table.Accept(DocumentVisitor) //ExFor:Table.AcceptStart(DocumentVisitor) @@ -1228,6 +1231,8 @@ public override VisitorAction VisitFootnoteStart(Footnote footnote) /// public override VisitorAction VisitSpecialChar(SpecialChar specialChar) { + Console.WriteLine(specialChar.GetText()); + if (specialChar.Font.Hidden) specialChar.Remove(); @@ -1447,6 +1452,7 @@ public void HasDmlEffect() { //ExStart //ExFor:Font.HasDmlEffect(TextDmlEffect) + //ExFor:TextDmlEffect //ExSummary:Shows how to check if a run displays a DrawingML text effect. Document doc = new Document(MyDir + "DrawingML text effects.docx"); @@ -1642,3 +1648,4 @@ public void CreateThemedStyle() } } } + diff --git a/Examples/ApiExamples/ApiExamples/ExHeaderFooter.cs b/Examples/ApiExamples/ApiExamples/ExHeaderFooter.cs index 7c94351df..e570d7b2a 100644 --- a/Examples/ApiExamples/ApiExamples/ExHeaderFooter.cs +++ b/Examples/ApiExamples/ApiExamples/ExHeaderFooter.cs @@ -254,6 +254,7 @@ public void ReplaceText() //ExStart //ExFor:IReplacingCallback //ExFor:PageSetup.DifferentFirstPageHeaderFooter + //ExFor:FindReplaceOptions.#ctor(IReplacingCallback) //ExSummary:Shows how to track the order in which a text replacement operation traverses nodes. [TestCase(false)] //ExSkip [TestCase(true)] //ExSkip @@ -264,7 +265,7 @@ public void Order(bool differentFirstPageHeaderFooter) Section firstPageSection = doc.FirstSection; ReplaceLog logger = new ReplaceLog(); - FindReplaceOptions options = new FindReplaceOptions { ReplacingCallback = logger }; + FindReplaceOptions options = new FindReplaceOptions(logger); // Using a different header/footer for the first page will affect the search order. firstPageSection.PageSetup.DifferentFirstPageHeaderFooter = differentFirstPageHeaderFooter; diff --git a/Examples/ApiExamples/ApiExamples/ExOoxmlSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExOoxmlSaveOptions.cs index dc2cfb14e..f500af66d 100644 --- a/Examples/ApiExamples/ApiExamples/ExOoxmlSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExOoxmlSaveOptions.cs @@ -17,6 +17,7 @@ using Aspose.Words.Saving; using Aspose.Words.Settings; using NUnit.Framework; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView; namespace ApiExamples { @@ -410,6 +411,8 @@ public void DigitalSignature() //ExStart:DigitalSignature //GistId:5f20ac02cb42c6b08481aa1c5b0cd3db //ExFor:OoxmlSaveOptions.DigitalSignatureDetails + //ExFor:DigitalSignatureDetails + //ExFor:DigitalSignatureDetails.#ctor(CertificateHolder, SignOptions) //ExSummary:Shows how to sign OOXML document. Document doc = new Document(MyDir + "Document.docx"); @@ -423,4 +426,4 @@ public void DigitalSignature() //ExEnd:DigitalSignature } } -} +} \ No newline at end of file diff --git a/Examples/ApiExamples/ApiExamples/ExParagraph.cs b/Examples/ApiExamples/ApiExamples/ExParagraph.cs index c981ffb82..d29d92377 100644 --- a/Examples/ApiExamples/ApiExamples/ExParagraph.cs +++ b/Examples/ApiExamples/ApiExamples/ExParagraph.cs @@ -571,6 +571,8 @@ public void BreakIsStyleSeparator() public void TabStops() { //ExStart + //ExFor:TabLeader + //ExFor:TabAlignment //ExFor:Paragraph.GetEffectiveTabStops //ExSummary:Shows how to set custom tab stops for a paragraph. Document doc = new Document(); diff --git a/Examples/ApiExamples/ApiExamples/ExPrinting.cs b/Examples/ApiExamples/ApiExamples/ExPrinting.cs index bfc485c18..0701eaaad 100644 --- a/Examples/ApiExamples/ApiExamples/ExPrinting.cs +++ b/Examples/ApiExamples/ApiExamples/ExPrinting.cs @@ -130,6 +130,7 @@ public void PrintPageInfo() { //ExStart //ExFor:PageInfo + //ExFor:PageInfo.GetSizeInPixels(Single, Single) //ExFor:PageInfo.GetSizeInPixels(Single, Single, Single) //ExFor:PageInfo.GetSpecifiedPrinterPaperSource(PaperSourceCollection, PaperSource) //ExFor:PageInfo.HeightInPoints @@ -269,6 +270,7 @@ public void PrintRange() public void PreviewAndPrint() { //ExStart + //ExFor:AsposeWordsPrintDocument //ExFor:AsposeWordsPrintDocument.#ctor(Document) //ExFor:AsposeWordsPrintDocument.CachePrinterSettings //ExFor:AsposeWordsPrintDocument.ColorMode diff --git a/Examples/ApiExamples/ApiExamples/ExStructuredDocumentTag.cs b/Examples/ApiExamples/ApiExamples/ExStructuredDocumentTag.cs index 4e64f37b0..e37a7e4a9 100644 --- a/Examples/ApiExamples/ApiExamples/ExStructuredDocumentTag.cs +++ b/Examples/ApiExamples/ApiExamples/ExStructuredDocumentTag.cs @@ -1147,6 +1147,7 @@ public StructuredDocumentTagRangeStart InsertStructuredDocumentTagRanges(Documen public void GetSdt() { //ExStart + //ExFor:Range.StructuredDocumentTags //ExFor:StructuredDocumentTagCollection.Remove(int) //ExFor:StructuredDocumentTagCollection.RemoveAt(int) //ExSummary:Shows how to remove structured document tag. diff --git a/Examples/ApiExamples/ApiExamples/ExStyles.cs b/Examples/ApiExamples/ApiExamples/ExStyles.cs index 51f6dd015..76920b91b 100644 --- a/Examples/ApiExamples/ApiExamples/ExStyles.cs +++ b/Examples/ApiExamples/ApiExamples/ExStyles.cs @@ -183,6 +183,7 @@ public void ChangeTocsTabStops() public void CopyStyleSameDocument() { //ExStart + //ExFor:StyleCollection.Add(Style) //ExFor:StyleCollection.AddCopy(Style) //ExFor:Style.Name //ExSummary:Shows how to clone a document's style. diff --git a/Examples/ApiExamples/ApiExamples/ExSvgSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExSvgSaveOptions.cs index 21999c2d9..037c3d81f 100644 --- a/Examples/ApiExamples/ApiExamples/ExSvgSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExSvgSaveOptions.cs @@ -90,6 +90,7 @@ public void SaveOfficeMath() //ExStart:SaveOfficeMath //GistId:a775441ecb396eea917a2717cb9e8f8f //ExFor:NodeRendererBase.Save(String, SvgSaveOptions) + //ExFor:NodeRendererBase.Save(Stream, SvgSaveOptions) //ExSummary:Shows how to pass save options when rendering office math. Document doc = new Document(MyDir + "Office math.docx"); @@ -99,6 +100,9 @@ public void SaveOfficeMath() options.TextOutputMode = SvgTextOutputMode.UsePlacedGlyphs; math.GetMathRenderer().Save(ArtifactsDir + "SvgSaveOptions.Output.svg", options); + + using (MemoryStream stream = new MemoryStream()) + math.GetMathRenderer().Save(stream, options); //ExEnd:SaveOfficeMath } diff --git a/Examples/ApiExamples/ApiExamples/ExVariableCollection.cs b/Examples/ApiExamples/ApiExamples/ExVariableCollection.cs index 7423d5a13..752921929 100644 --- a/Examples/ApiExamples/ApiExamples/ExVariableCollection.cs +++ b/Examples/ApiExamples/ApiExamples/ExVariableCollection.cs @@ -31,6 +31,8 @@ public void Primer() //ExFor:VariableCollection.IndexOfKey //ExFor:VariableCollection.Remove //ExFor:VariableCollection.RemoveAt + //ExFor:VariableCollection.Item(Int32) + //ExFor:VariableCollection.Item(String) //ExSummary:Shows how to work with a document's variable collection. Document doc = new Document(); VariableCollection variables = doc.Variables; @@ -69,6 +71,9 @@ public void Primer() Assert.AreEqual(1, variables.IndexOfKey("City")); Assert.AreEqual(2, variables.IndexOfKey("Home address")); + Assert.AreEqual("3", variables[0]); + Assert.AreEqual("London", variables["City"]); + // Enumerate over the collection of variables. using (IEnumerator> enumerator = doc.Variables.GetEnumerator()) while (enumerator.MoveNext()) From 2dd58c7f5535c4faa04577066eb48b6f22c566ea Mon Sep 17 00:00:00 2001 From: vderyushev Date: Thu, 4 Jul 2024 11:24:15 +0300 Subject: [PATCH 11/33] Fixed build --- Examples/ApiExamples/ApiExamples/ExOoxmlSaveOptions.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Examples/ApiExamples/ApiExamples/ExOoxmlSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExOoxmlSaveOptions.cs index f500af66d..a7724ac20 100644 --- a/Examples/ApiExamples/ApiExamples/ExOoxmlSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExOoxmlSaveOptions.cs @@ -17,7 +17,6 @@ using Aspose.Words.Saving; using Aspose.Words.Settings; using NUnit.Framework; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView; namespace ApiExamples { From 87b207b96289c42eef5d70d7a7870fc7ef74e64f Mon Sep 17 00:00:00 2001 From: vderyushev Date: Thu, 4 Jul 2024 12:55:02 +0300 Subject: [PATCH 12/33] Added ExFor tags --- Examples/ApiExamples/ApiExamples/ExCharts.cs | 21 +++++- Examples/ApiExamples/ApiExamples/ExComment.cs | 1 + .../ApiExamples/ExDocSaveOptions.cs | 1 + .../ApiExamples/ApiExamples/ExDocument.cs | 5 ++ .../ApiExamples/ExDocumentBuilder.cs | 2 + .../ApiExamples/ExDocumentVisitor.cs | 60 ++++++++++++---- Examples/ApiExamples/ApiExamples/ExDrawing.cs | 9 ++- Examples/ApiExamples/ApiExamples/ExField.cs | 13 ++++ Examples/ApiExamples/ApiExamples/ExFont.cs | 2 + .../ApiExamples/ExHtmlLoadOptions.cs | 2 + Examples/ApiExamples/ApiExamples/ExLayout.cs | 2 + .../ApiExamples/ApiExamples/ExLoadOptions.cs | 2 + .../ApiExamples/ApiExamples/ExMailMerge.cs | 2 + .../ApiExamples/ExMailMergeCustom.cs | 1 + .../ApiExamples/ExMarkdownLoadOptions.cs | 1 + .../ApiExamples/ExOdtSaveOptions.cs | 2 + .../ApiExamples/ExParagraphFormat.cs | 2 + .../ApiExamples/ExPdfLoadOptions.cs | 9 +-- .../ApiExamples/ApiExamples/ExRendering.cs | 1 + .../ApiExamples/ApiExamples/ExRevision.cs | 6 +- Examples/ApiExamples/ApiExamples/ExShape.cs | 68 ++++++++++++++----- .../ApiExamples/ApiExamples/ExSmartTag.cs | 2 + .../ApiExamples/ExStructuredDocumentTag.cs | 2 + .../ApiExamples/ExTxtLoadOptions.cs | 3 + 24 files changed, 181 insertions(+), 38 deletions(-) diff --git a/Examples/ApiExamples/ApiExamples/ExCharts.cs b/Examples/ApiExamples/ApiExamples/ExCharts.cs index b75c94939..bb4870bb4 100644 --- a/Examples/ApiExamples/ApiExamples/ExCharts.cs +++ b/Examples/ApiExamples/ApiExamples/ExCharts.cs @@ -123,9 +123,13 @@ public void AxisProperties() //ExFor:ChartAxis.MinorTickMark //ExFor:ChartAxis.MajorUnit //ExFor:ChartAxis.MinorUnit + //ExFor:AxisTickLabels //ExFor:AxisTickLabels.Offset //ExFor:AxisTickLabels.Position //ExFor:AxisTickLabels.IsAutoSpacing + //ExFor:AxisTickLabels.Alignment + //ExFor:AxisTickLabels.Font + //ExFor:AxisTickLabels.Spacing //ExFor:ChartAxis.TickMarkSpacing //ExFor:AxisCategoryType //ExFor:AxisCrosses @@ -171,6 +175,9 @@ public void AxisProperties() yAxis.MajorUnit = 100.0d; yAxis.MinorUnit = 20.0d; yAxis.TickLabels.Position = AxisTickLabelPosition.NextToAxis; + yAxis.TickLabels.Alignment = ParagraphAlignment.Center; + yAxis.TickLabels.Font.Color = Color.Red; + yAxis.TickLabels.Spacing = 1; // Column charts do not have a Z-axis. Assert.Null(chart.AxisZ); @@ -201,6 +208,9 @@ public void AxisProperties() Assert.AreEqual(100.0d, chart.AxisY.MajorUnit); Assert.AreEqual(20.0d, chart.AxisY.MinorUnit); Assert.AreEqual(AxisTickLabelPosition.NextToAxis, chart.AxisY.TickLabels.Position); + Assert.AreEqual(ParagraphAlignment.Center, chart.AxisY.TickLabels.Alignment); + Assert.AreEqual(Color.Red.ToArgb(), chart.AxisY.TickLabels.Font.Color.ToArgb()); + Assert.AreEqual(1, chart.AxisY.TickLabels.Spacing); } [Test] @@ -1223,6 +1233,7 @@ public void MarkerFormatting() //ExFor:Stroke.BackColor //ExFor:Stroke.Visible //ExFor:Stroke.Transparency + //ExFor:PresetTexture //ExFor:Fill.PresetTextured(PresetTexture) //ExSummary:Show how to set marker formatting. Document doc = new Document(); @@ -1357,6 +1368,7 @@ public void LegendFont() { //ExStart:LegendFont //GistId:470c0da51e4317baae82ad9495747fed + //ExFor:ChartLegendEntry //ExFor:ChartLegendEntry.Font //ExFor:ChartLegend.Font //ExSummary:Shows how to work with a legend font. @@ -1404,6 +1416,7 @@ public void RemoveSpecificChartSeries() public void PopulateChartWithData() { //ExStart + //ExFor:ChartXValue //ExFor:ChartXValue.FromDouble(Double) //ExFor:ChartYValue.FromDouble(Double) //ExFor:ChartSeries.Add(ChartXValue, ChartYValue) @@ -1681,6 +1694,7 @@ public void DataTable() { //ExStart:DataTable //GistId:a775441ecb396eea917a2717cb9e8f8f + //ExFor:Chart.DataTable //ExFor:ChartDataTable //ExFor:ChartDataTable.Show //ExSummary:Shows how to show data table with chart series data. @@ -1718,6 +1732,7 @@ public void ChartFormat() { //ExStart:ChartFormat //GistId:5f20ac02cb42c6b08481aa1c5b0cd3db + //ExFor:ChartFormat //ExFor:Chart.Format //ExFor:ChartTitle.Format //ExFor:ChartAxisTitle.Format @@ -1819,6 +1834,7 @@ public void ConfigureGapOverlap() { //ExStart:ConfigureGapOverlap //GistId:6e4482e7434754c31c6f2f6e4bf48bb1 + //ExFor:Chart.SeriesGroups //ExFor:ChartSeriesGroup.GapWidth //ExFor:ChartSeriesGroup.Overlap //ExSummary:Show how to configure gap width and overlap. @@ -1885,7 +1901,10 @@ public void TreemapChart() //ExStart:TreemapChart //GistId:65919861586e42e24f61a3ccb65f8f4e //ExFor:ChartSeriesCollection.Add(String, ChartMultilevelValue[], double[]) + //ExFor:ChartMultilevelValue + //ExFor:ChartMultilevelValue.#ctor(String, String, String) //ExFor:ChartMultilevelValue.#ctor(String, String) + //ExFor:ChartMultilevelValue.#ctor(String) //ExSummary:Shows how to create treemap chart. Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); @@ -1921,7 +1940,7 @@ public void TreemapChart() new ChartMultilevelValue("Latin America", "Brazil"), new ChartMultilevelValue("Latin America", "Mexico"), new ChartMultilevelValue("Latin America", "Other"), - new ChartMultilevelValue("Northern America", "United States"), + new ChartMultilevelValue("Northern America", "United States", "Other"), new ChartMultilevelValue("Northern America", "Other"), new ChartMultilevelValue("Oceania") }, diff --git a/Examples/ApiExamples/ApiExamples/ExComment.cs b/Examples/ApiExamples/ApiExamples/ExComment.cs index e96a7a14d..d1941a8f0 100644 --- a/Examples/ApiExamples/ApiExamples/ExComment.cs +++ b/Examples/ApiExamples/ApiExamples/ExComment.cs @@ -67,6 +67,7 @@ public void PrintAllComments() //ExFor:Comment.Ancestor //ExFor:Comment.Author //ExFor:Comment.Replies + //ExFor:CompositeNode.GetEnumerator //ExFor:CompositeNode.GetChildNodes(NodeType, Boolean) //ExSummary:Shows how to print all of a document's comments and their replies. Document doc = new Document(MyDir + "Comments.docx"); diff --git a/Examples/ApiExamples/ApiExamples/ExDocSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExDocSaveOptions.cs index 413a26d85..964f5f894 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocSaveOptions.cs @@ -27,6 +27,7 @@ public void SaveAsDoc() //ExFor:DocSaveOptions.Password //ExFor:DocSaveOptions.SaveFormat //ExFor:DocSaveOptions.SaveRoutingSlip + //ExFor:IncorrectPasswordException //ExSummary:Shows how to set save options for older Microsoft Word formats. Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); diff --git a/Examples/ApiExamples/ApiExamples/ExDocument.cs b/Examples/ApiExamples/ApiExamples/ExDocument.cs index cb49329f7..62340efce 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocument.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocument.cs @@ -429,6 +429,7 @@ public void OpenFromStreamWithBaseUri() //ExFor:Document.#ctor(Stream,LoadOptions) //ExFor:LoadOptions.#ctor //ExFor:LoadOptions.BaseUri + //ExFor:ShapeBase.IsImage //ExSummary:Shows how to open an HTML document with images from a stream using a base URI. using (Stream stream = File.OpenRead(MyDir + "Document.html")) { @@ -1603,6 +1604,7 @@ public void SetInvalidateFieldTypes() { //ExStart //ExFor:Document.NormalizeFieldTypes + //ExFor:Range.NormalizeFieldTypes //ExSummary:Shows how to get the keep a field's type up to date with its field code. Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); @@ -2158,6 +2160,7 @@ public void CreateWebExtension() //ExStart //ExFor:BaseWebExtensionCollection`1.Add(`0) //ExFor:BaseWebExtensionCollection`1.Clear + //ExFor:Document.WebExtensionTaskPanes //ExFor:TaskPane //ExFor:TaskPane.DockState //ExFor:TaskPane.IsVisible @@ -2350,6 +2353,7 @@ public void ImageWatermark() { //ExStart //ExFor:Watermark.SetImage(Image, ImageWatermarkOptions) + //ExFor:ImageWatermarkOptions //ExFor:ImageWatermarkOptions.Scale //ExFor:ImageWatermarkOptions.IsWashout //ExFor:Watermark.SetImage(Image) @@ -2642,6 +2646,7 @@ public void PageIsInColor() { //ExStart //ExFor:PageInfo.Colored + //ExFor:Document.GetPageInfo(Int32) //ExSummary:Shows how to check whether the page is in color or not. Document doc = new Document(MyDir + "Document.docx"); diff --git a/Examples/ApiExamples/ApiExamples/ExDocumentBuilder.cs b/Examples/ApiExamples/ApiExamples/ExDocumentBuilder.cs index 6c11305a3..3db7bef32 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocumentBuilder.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocumentBuilder.cs @@ -164,6 +164,7 @@ public void InsertHorizontalRule() //ExFor:DocumentBuilder.InsertHorizontalRule //ExFor:ShapeBase.IsHorizontalRule //ExFor:Shape.HorizontalRuleFormat + //ExFor:HorizontalRuleAlignment //ExFor:HorizontalRuleFormat //ExFor:HorizontalRuleFormat.Alignment //ExFor:HorizontalRuleFormat.WidthPercent @@ -3014,6 +3015,7 @@ public void EmphasesWarningSourceMarkdown() { //ExStart //ExFor:WarningInfo.Source + //ExFor:WarningSource //ExSummary:Shows how to work with the warning source. Document doc = new Document(MyDir + "Emphases markdown warning.docx"); diff --git a/Examples/ApiExamples/ApiExamples/ExDocumentVisitor.cs b/Examples/ApiExamples/ApiExamples/ExDocumentVisitor.cs index 667719204..c9be18d5a 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocumentVisitor.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocumentVisitor.cs @@ -19,10 +19,14 @@ namespace ApiExamples { [TestFixture] public class ExDocumentVisitor : ApiExampleBase - { - //ExStart - //ExFor:Document.Accept(DocumentVisitor) - //ExFor:SubDocument.Accept(DocumentVisitor) + { + //ExStart + //ExFor:Document.Accept(DocumentVisitor) + //ExFor:SubDocument.Accept(DocumentVisitor) + //ExFor:CompositeNode.AcceptEnd(DocumentVisitor) + //ExFor:CompositeNode.AcceptStart(DocumentVisitor) + //ExFor:Document.AcceptEnd(DocumentVisitor) + //ExFor:Document.AcceptStart(DocumentVisitor) //ExFor:DocumentVisitor //ExFor:DocumentVisitor.VisitRun(Run) //ExFor:DocumentVisitor.VisitDocumentEnd(Document) @@ -34,6 +38,8 @@ public class ExDocumentVisitor : ApiExampleBase //ExFor:DocumentVisitor.VisitParagraphStart(Paragraph) //ExFor:DocumentVisitor.VisitParagraphEnd(Paragraph) //ExFor:DocumentVisitor.VisitSubDocument(SubDocument) + //ExFor:DocumentVisitor.VisitStructuredDocumentTagRangeEnd(StructuredDocumentTagRangeEnd) + //ExFor:DocumentVisitor.VisitStructuredDocumentTagRangeStart(StructuredDocumentTagRangeStart) //ExSummary:Shows how to use a document visitor to print a document's node structure. [Test] //ExSkip public void DocStructureToText() @@ -182,6 +188,26 @@ public override VisitorAction VisitSubDocument(SubDocument subDocument) return VisitorAction.Continue; } + /// + /// Called when a SubDocument node is encountered in the document. + /// + public override VisitorAction VisitStructuredDocumentTagRangeStart(StructuredDocumentTagRangeStart sdtRangeStart) + { + IndentAndAppendLine("[SdtRangeStart]"); + + return VisitorAction.Continue; + } + + /// + /// Called when a SubDocument node is encountered in the document. + /// + public override VisitorAction VisitStructuredDocumentTagRangeEnd(StructuredDocumentTagRangeEnd sdtRangeEnd) + { + IndentAndAppendLine("[SdtRangeEnd]"); + + return VisitorAction.Continue; + } + /// /// Append a line to the StringBuilder and indent it depending on how deep the visitor is into the document tree. /// @@ -651,6 +677,8 @@ private static void TestFieldToText(FieldStructurePrinter visitor) //ExFor:DocumentVisitor.VisitHeaderFooterStart(HeaderFooter) //ExFor:DocumentVisitor.VisitHeaderFooterEnd(HeaderFooter) //ExFor:HeaderFooter.Accept(DocumentVisitor) + //ExFor:HeaderFooter.AcceptStart(DocumentVisitor) + //ExFor:HeaderFooter.AcceptEnd(DocumentVisitor) //ExFor:HeaderFooterCollection.ToArray //ExFor:Run.Accept(DocumentVisitor) //ExFor:Run.GetText @@ -861,6 +889,8 @@ private static void TestEditableRangeToText(EditableRangeStructurePrinter visito //ExFor:DocumentVisitor.VisitFootnoteEnd(Footnote) //ExFor:DocumentVisitor.VisitFootnoteStart(Footnote) //ExFor:Footnote.Accept(DocumentVisitor) + //ExFor:Footnote.AcceptStart(DocumentVisitor) + //ExFor:Footnote.AcceptEnd(DocumentVisitor) //ExSummary:Shows how to print the node structure of every footnote in a document. [Test] //ExSkip public void FootnoteToText() @@ -955,15 +985,17 @@ private static void TestFootnoteToText(FootnoteStructurePrinter visitor) Assert.True(visitorText.Contains("[Footnote start] Type: Footnote")); Assert.True(visitorText.Contains("[Footnote end]")); Assert.True(visitorText.Contains("[Run]")); - } - - //ExStart - //ExFor:DocumentVisitor.VisitOfficeMathEnd(OfficeMath) - //ExFor:DocumentVisitor.VisitOfficeMathStart(OfficeMath) - //ExFor:MathObjectType - //ExFor:OfficeMath.Accept(DocumentVisitor) - //ExFor:OfficeMath.MathObjectType - //ExSummary:Shows how to print the node structure of every office math node in a document. + } + + //ExStart + //ExFor:DocumentVisitor.VisitOfficeMathEnd(OfficeMath) + //ExFor:DocumentVisitor.VisitOfficeMathStart(OfficeMath) + //ExFor:MathObjectType + //ExFor:OfficeMath.Accept(DocumentVisitor) + //ExFor:OfficeMath.AcceptStart(DocumentVisitor) + //ExFor:OfficeMath.AcceptEnd(DocumentVisitor) + //ExFor:OfficeMath.MathObjectType + //ExSummary:Shows how to print the node structure of every office math node in a document. [Test] //ExSkip public void OfficeMathToText() { @@ -1174,6 +1206,8 @@ private static void TestSmartTagToText(SmartTagStructurePrinter visitor) //ExStart //ExFor:StructuredDocumentTag.Accept(DocumentVisitor) + //ExFor:StructuredDocumentTag.AcceptStart(DocumentVisitor) + //ExFor:StructuredDocumentTag.AcceptEnd(DocumentVisitor) //ExFor:DocumentVisitor.VisitStructuredDocumentTagEnd(StructuredDocumentTag) //ExFor:DocumentVisitor.VisitStructuredDocumentTagStart(StructuredDocumentTag) //ExSummary:Shows how to print the node structure of every structured document tag in a document. diff --git a/Examples/ApiExamples/ApiExamples/ExDrawing.cs b/Examples/ApiExamples/ApiExamples/ExDrawing.cs index e7a2bfa77..754d826c4 100644 --- a/Examples/ApiExamples/ApiExamples/ExDrawing.cs +++ b/Examples/ApiExamples/ApiExamples/ExDrawing.cs @@ -238,7 +238,10 @@ public void FillSolid() { //ExStart //ExFor:Fill.Color() - //ExFor:Fill.Solid(Color) + //ExFor:FillType + //ExFor:Fill.FillType + //ExFor:Fill.Solid + //ExFor:Fill.Transparency //ExFor:Font.Fill //ExSummary:Shows how to convert any of the fills back to solid fill. Document doc = new Document(MyDir + "Two color gradient.docx"); @@ -252,7 +255,7 @@ public void FillSolid() Console.WriteLine("The fill is transparent at {0}%", fill.Transparency * 100); // Change type of the fill to Solid with uniform green color. - fill.Solid(Color.Green); + fill.Solid(); Console.WriteLine("\nThe fill is changed:"); Console.WriteLine("The type of the fill is: {0}", fill.FillType); Console.WriteLine("The foreground color of the fill is: {0}", fill.ForeColor); @@ -341,6 +344,8 @@ public void StrokePattern() //ExFor:GroupShape //ExFor:GroupShape.#ctor(DocumentBase) //ExFor:GroupShape.Accept(DocumentVisitor) + //ExFor:GroupShape.AcceptStart(DocumentVisitor) + //ExFor:GroupShape.AcceptEnd(DocumentVisitor) //ExFor:ShapeBase.IsGroup //ExFor:ShapeBase.ShapeType //ExSummary:Shows how to create a group of shapes, and print its contents using a document visitor. diff --git a/Examples/ApiExamples/ApiExamples/ExField.cs b/Examples/ApiExamples/ApiExamples/ExField.cs index b70fa643b..74eceeee6 100644 --- a/Examples/ApiExamples/ApiExamples/ExField.cs +++ b/Examples/ApiExamples/ApiExamples/ExField.cs @@ -468,6 +468,9 @@ public void FieldDatabase() //ExFor:FieldDatabase.LastRecord //ExFor:FieldDatabase.Query //ExFor:FieldDatabase.TableFormat + //ExFor:FieldDatabaseDataTable + //ExFor:IFieldDatabaseProvider + //ExFor:IFieldDatabaseProvider.GetQueryResult(String,String,String,FieldDatabase) //ExSummary:Shows how to extract data from a database and insert it as a field into a document. Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); @@ -2536,6 +2539,7 @@ public void FieldCitation() //ExStart //ExFor:IBibliographyStylesProvider + //ExFor:IBibliographyStylesProvider.GetStyle(String) //ExFor:FieldOptions.BibliographyStylesProvider //ExSummary:Shows how to override built-in styles or provide custom one. [Test] //ExSkip @@ -4896,6 +4900,7 @@ public void FieldBuilder() //ExFor:FieldBuilder.AddSwitch(String, String) //ExFor:FieldBuilder.BuildAndInsert(Paragraph) //ExFor:FieldArgumentBuilder + //ExFor:FieldArgumentBuilder.#ctor //ExFor:FieldArgumentBuilder.AddField(FieldBuilder) //ExFor:FieldArgumentBuilder.AddText(String) //ExFor:FieldArgumentBuilder.AddNode(Inline) @@ -6878,6 +6883,7 @@ public void FieldEQAsOfficeMath() { //ExStart //ExFor:FieldEQ + //ExFor:FieldEQ.AsOfficeMath //ExSummary:Shows how to replace the EQ field with Office Math. Document doc = new Document(MyDir + "Field sample - EQ.docx"); FieldEQ fieldEQ = doc.Range.Fields.OfType().First(); @@ -7336,6 +7342,7 @@ public void Legacy() public void SetFieldIndexFormat() { //ExStart + //ExFor:FieldIndexFormat //ExFor:FieldOptions.FieldIndexFormat //ExSummary:Shows how to formatting FieldIndex fields. Document doc = new Document(); @@ -7363,6 +7370,8 @@ public void SetFieldIndexFormat() //ExFor:ComparisonExpression.ComparisonOperator //ExFor:ComparisonExpression.RightExpression //ExFor:FieldOptions.ComparisonExpressionEvaluator + //ExFor:IComparisonExpressionEvaluator + //ExFor:IComparisonExpressionEvaluator.Evaluate(Field,ComparisonExpression) //ExSummary:Shows how to implement custom evaluation for the IF and COMPARE fields. [TestCase(" IF {0} {1} {2} \"true argument\" \"false argument\" ", 1, null, "true argument")] //ExSkip [TestCase(" IF {0} {1} {2} \"true argument\" \"false argument\" ", 0, null, "false argument")] //ExSkip @@ -7536,9 +7545,12 @@ public void ComparisonExpressionEvaluatorHeaderFooterFields() } //ExStart + //ExFor:FieldOptions.FieldUpdatingCallback + //ExFor:FieldOptions.FieldUpdatingProgressCallback //ExFor:IFieldUpdatingCallback //ExFor:IFieldUpdatingProgressCallback //ExFor:IFieldUpdatingProgressCallback.Notify(FieldUpdatingProgressArgs) + //ExFor:FieldUpdatingProgressArgs //ExFor:FieldUpdatingProgressArgs.UpdateCompleted //ExFor:FieldUpdatingProgressArgs.TotalFieldsCount //ExFor:FieldUpdatingProgressArgs.UpdatedFieldsCount @@ -7611,6 +7623,7 @@ public void BibliographySources() { //ExStart:BibliographySources //GistId:eeeec1fbf118e95e7df3f346c91ed726 + //ExFor:Document.Bibliography //ExFor:Bibliography //ExFor:Bibliography.Sources //ExFor:Source.Title diff --git a/Examples/ApiExamples/ApiExamples/ExFont.cs b/Examples/ApiExamples/ApiExamples/ExFont.cs index 47774413e..68e3094a0 100644 --- a/Examples/ApiExamples/ApiExamples/ExFont.cs +++ b/Examples/ApiExamples/ApiExamples/ExFont.cs @@ -1066,6 +1066,8 @@ public void SetFontAutoColor() //ExStart //ExFor:Font.Hidden //ExFor:Paragraph.Accept(DocumentVisitor) + //ExFor:Paragraph.AcceptStart(DocumentVisitor) + //ExFor:Paragraph.AcceptEnd(DocumentVisitor) //ExFor:DocumentVisitor.VisitParagraphStart(Paragraph) //ExFor:DocumentVisitor.VisitFormField(FormField) //ExFor:DocumentVisitor.VisitTableEnd(Table) diff --git a/Examples/ApiExamples/ApiExamples/ExHtmlLoadOptions.cs b/Examples/ApiExamples/ApiExamples/ExHtmlLoadOptions.cs index 1c4972f0e..767f862f7 100644 --- a/Examples/ApiExamples/ApiExamples/ExHtmlLoadOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExHtmlLoadOptions.cs @@ -29,6 +29,7 @@ internal class ExHtmlLoadOptions : ApiExampleBase public void SupportVml(bool supportVml) { //ExStart + //ExFor:HtmlLoadOptions //ExFor:HtmlLoadOptions.#ctor //ExFor:HtmlLoadOptions.SupportVml //ExSummary:Shows how to support conditional comments while loading an HTML document. @@ -212,6 +213,7 @@ public void GetSelectAsSdt() { //ExStart //ExFor:HtmlLoadOptions.PreferredControlType + //ExFor:HtmlControlType //ExSummary:Shows how to set preferred type of document nodes that will represent imported and