/// <inheritdoc />
        /// <summary>
        ///
        /// </summary>
        /// <param name="subject"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"/>
        protected override IOpenXmlVisitor Create(IOpenXmlVisitor subject)
        {
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            return(new ReportVisitor(subject));
        }
        protected override IOpenXmlVisitor VisitDocument(IOpenXmlVisitor subject, int revisionId)
        {
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            return(Create(new DocumentVisit(subject, revisionId).Result));
        }
        protected override IOpenXmlVisitor VisitNumbering(IOpenXmlVisitor subject)
        {
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            return(new NumberingVisit(subject).Result);
        }
        protected virtual IOpenXmlVisitor VisitFootnoteRelations([NotNull] IOpenXmlVisitor subject, int footnoteRelationId)
        {
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            return(Create(subject));
        }
        protected override IOpenXmlVisitor VisitFootnoteRelations(IOpenXmlVisitor subject, int footnoteRelationId)
        {
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            return(new FootnoteRelationVisit(subject, footnoteRelationId).Result);
        }
        protected virtual IOpenXmlVisitor VisitNumbering([NotNull] IOpenXmlVisitor subject)
        {
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            return(Create(subject));
        }
        protected virtual IOpenXmlVisitor VisitDocument([NotNull] IOpenXmlVisitor subject, int revisionId)
        {
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            return(Create(subject));
        }
        public virtual IOpenXmlVisitor Fold(IOpenXmlVisitor subject)
        {
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            return(Create(StaticFold(this, subject)));
        }
        /// <summary>
        /// Marshals content from the source document to be added into the container.
        /// </summary>
        /// <param name="subject">The file from which content is copied.</param>
        /// <param name="revisionId">
        /// The current revision number incremented by one.
        /// </param>
        /// <returns>The updated document node of the source file.</returns>
        public DocumentVisit(IOpenXmlVisitor subject, int revisionId)
        {
            XElement document = Execute(subject.Document, revisionId);

            Result =
                new OpenXmlVisitor(
                    subject.ContentTypes,
                    document,
                    subject.DocumentRelations,
                    subject.Footnotes,
                    subject.FootnoteRelations,
                    subject.Styles,
                    subject.Numbering,
                    subject.Theme1,
                    subject.Charts);
        }
Exemple #10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="subject"></param>
        public StyleVisit(IOpenXmlVisitor subject)
        {
            XElement styles = Execute(subject.Styles.Clone());

            Result =
                new OpenXmlVisitor(
                    subject.ContentTypes,
                    subject.Document,
                    subject.DocumentRelations,
                    subject.Footnotes,
                    subject.FootnoteRelations,
                    styles,
                    subject.Numbering,
                    subject.Theme1,
                    subject.Charts);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="subject"></param>
        public NumberingVisit(IOpenXmlVisitor subject)
        {
            XElement numbering = Numbering.Clone();

            Result =
                new OpenXmlVisitor(
                    subject.ContentTypes,
                    subject.Document,
                    subject.DocumentRelations,
                    subject.Footnotes,
                    subject.FootnoteRelations,
                    subject.Styles,
                    numbering,
                    subject.Theme1,
                    subject.Charts);
        }
        /// <summary>
        /// Marshals footnotes from the source document into the container.
        /// </summary>
        /// <param name="subject">The file from which content is copied.</param>
        /// <param name="footnoteRelationId"></param>
        /// <returns>The updated document node of the source file.</returns>
        public FootnoteRelationVisit(IOpenXmlVisitor subject, int footnoteRelationId)
        {
            (var footnotes, var footnoteRelations) = Execute(subject.Footnotes, subject.FootnoteRelations, footnoteRelationId);

            Result =
                new OpenXmlVisitor(
                    subject.ContentTypes,
                    subject.Document,
                    subject.DocumentRelations,
                    footnotes,
                    footnoteRelations,
                    subject.Styles,
                    subject.Numbering,
                    subject.Theme1,
                    subject.Charts);
        }
        public virtual IOpenXmlVisitor Visit(DocxFilePath file)
        {
            if (file is null)
            {
                throw new ArgumentNullException(nameof(file));
            }

            IOpenXmlVisitor subject                 = new OpenXmlVisitor(file);
            IOpenXmlVisitor documentVisitor         = VisitDocument(subject, NextRevisionId);
            IOpenXmlVisitor footnoteVisitor         = VisitFootnotes(documentVisitor, NextFootnoteId, NextRevisionId);
            IOpenXmlVisitor documentRelationVisitor = VisitDocumentRelations(footnoteVisitor, NextDocumentRelationId);
            IOpenXmlVisitor footnoteRelationVisitor = VisitFootnoteRelations(documentRelationVisitor, NextFootnoteRelationId);
            IOpenXmlVisitor styleVisitor            = VisitStyles(footnoteRelationVisitor);
            IOpenXmlVisitor numberingVisitor        = VisitNumbering(styleVisitor);

            return(numberingVisitor);
        }
        /// <summary>
        /// Initializes a new <see cref="OpenXmlVisitor"/> from an existing <see cref="IOpenXmlVisitor"/>.
        /// </summary>
        /// <param name="subject">
        /// The <see cref="IOpenXmlVisitor"/> to visit.
        /// </param>
        /// <exception cref="ArgumentNullException"/>
        public OpenXmlVisitor([NotNull] IOpenXmlVisitor subject)
        {
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            Document          = subject.Document.Clone();
            DocumentRelations = subject.DocumentRelations.Clone();
            ContentTypes      = subject.ContentTypes.Clone();
            Footnotes         = subject.Footnotes.Clone();
            FootnoteRelations = subject.FootnoteRelations.Clone();
            Styles            = subject.Styles.Clone();
            Numbering         = subject.Numbering.Clone();
            Theme1            = subject.Theme1.Clone();
            Charts            = subject.Charts.Select(x => new ChartInformation(x.Name, x.Chart.Clone())).ToImmutableArray();
        }
 /// <inheritdoc />
 /// <summary>
 /// Initialize a new <see cref="ReportVisitor"/> from the supplied <see cref="OpenXmlVisitor"/>.
 /// </summary>
 /// <param name="subject">
 /// The <see cref="OpenXmlVisitor"/> used to initialize the new <see cref="ReportVisitor"/>.
 /// </param>
 private ReportVisitor([NotNull] IOpenXmlVisitor subject) : base(subject)
 {
 }
        private static OpenXmlVisitor StaticFold([NotNull] IOpenXmlVisitor source, [NotNull] IOpenXmlVisitor subject)
        {
            if (source is null)
            {
                throw new ArgumentNullException(nameof(source));
            }
            if (subject is null)
            {
                throw new ArgumentNullException(nameof(subject));
            }

            XElement document =
                new XElement(
                    source.Document.Name,
                    source.Document.Attributes(),
                    new XElement(
                        source.Document.Elements().First().Name,
                        source.Document.Elements().First().Elements(),
                        subject.Document.Elements().First().Elements()));

            document = document.RemoveDuplicateSectionProperties();

            XElement footnotes =
                new XElement(
                    source.Footnotes.Name,
                    source.Footnotes.Attributes(),
                    source.Footnotes
                    .Elements()
                    .Union(
                        subject.Footnotes.Elements(),
                        XNode.EqualityComparer));

            XElement footnoteRelations =
                new XElement(
                    source.FootnoteRelations.Name,
                    source.FootnoteRelations.Attributes(),
                    source.FootnoteRelations
                    .Elements()
                    .Union(
                        subject.FootnoteRelations.Elements(),
                        XNode.EqualityComparer));

            XElement documentRelations =
                new XElement(
                    source.DocumentRelations.Name,
                    source.DocumentRelations.Attributes(),
                    source.DocumentRelations
                    .Elements()
                    .Union(
                        subject.DocumentRelations.Elements(),
                        XNode.EqualityComparer));

            XElement contentTypes =
                new XElement(
                    source.ContentTypes.Name,
                    source.ContentTypes.Attributes(),
                    source.ContentTypes
                    .Elements()
                    .Union(
                        subject.ContentTypes.Elements(),
                        XNode.EqualityComparer));

            XElement styles =
                new XElement(
                    source.Styles.Name,
                    source.Styles.Attributes(),
                    source.Styles
                    .Elements()
                    .Union(
                        subject.Styles
                        .Elements()
                        .Where(x => x.Name != W + "docDefaults")
                        .Where(x => (string)x.Attribute(W + "styleId") != "Normal"),
                        XNode.EqualityComparer));

            XElement numbering =
                new XElement(
                    source.Numbering.Name,
                    source.Numbering.Attributes(),
                    source.Numbering
                    .Elements()
                    .Union(
                        subject.Numbering.Elements(),
                        XNode.EqualityComparer));

            // TODO: write a ThemeVisit
//            XElement theme1 =
//                new XElement(
//                    source.Theme1.Name,
//                    source.Theme1.Attributes(),
//                    source.Theme1
//                          .Elements()
//                          .Union(
//                              subject.Theme1.Elements(),
//                              XNode.EqualityComparer));

            IEnumerable <ChartInformation> charts =
                source.Charts
                .Union(
                    subject.Charts,
                    ChartInformation.Comparer);

            return
                (new OpenXmlVisitor(
                     contentTypes,
                     document,
                     documentRelations,
                     footnotes,
                     footnoteRelations,
                     styles,
                     numbering,
                     subject.Theme1,
                     charts));
        }