示例#1
0
        public void MergeDocText_HyperlinkQueryString()
        {
            var doc = new Document();

            var builder = new DocumentBuilder(doc);

            builder.InsertRun("^ ");

            builder.InsertField("HYPERLINK \"https://google.com/q=%7b%7bQuery%7d%7d\"");

            builder.InsertRun(" $");

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>^ </Run>
                        <FieldStart></FieldStart>
                        <Run>HYPERLINK ""https://google.com/q=%7b%7bQuery%7d%7d""</Run>
                        <FieldSeparator></FieldSeparator>
                        <FieldEnd></FieldEnd>
                        <Run> $</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>
                ");

            var data = new
            {
                Query = "Arnold Schwarzenegger",
            };

            doc.Merge(data);

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>^ </Run>
                        <FieldStart></FieldStart>
                        <Run>HYPERLINK ""</Run>
                        <Run>https://google.com/q=</Run>
                        <Run>Arnold%20Schwarzenegger</Run>
                        <Run>""</Run>
                        <FieldSeparator></FieldSeparator>
                        <FieldEnd></FieldEnd>
                        <Run> $</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>
                ");
        }
示例#2
0
        public void ExportXml_EmptyDocument()
        {
            var doc = new Document();

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>");
        }
示例#3
0
        public void ExportImportXml_SimpleText()
        {
            var exportDoc = new Document();

            var exportBuilder = new DocumentBuilder(exportDoc);

            exportBuilder.Write("Hello World");

            var exportBodyXml = exportDoc.Export(exportDoc.Sections.Cast<Section>().Single().Body, DocumentTextFormat.Xml);

            var importDoc = new Document();

            importDoc.Import(importDoc.Sections.Cast<Section>().Single().Body, DocumentTextFormat.Xml, exportBodyXml);

            importDoc.AssertXml(importDoc.Sections.Cast<Section>().Single().Body, exportBodyXml);
        }
示例#4
0
        public void ExportXml_SimpleText()
        {
            var doc = new Document();

            var builder = new DocumentBuilder(doc);

            builder.Write("Hello World");

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>Hello World</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>");
        }
示例#5
0
        public void ImportExportXml_Table()
        {
            var doc = new Document();

            var importBodyXml = @"
                <Body>
                  <Table>
                    <Row>
                      <Cell>
                        <Paragraph>
                          <Run>Number</Run>
                        </Paragraph>
                      </Cell>
                      <Cell>
                        <Paragraph>
                          <Run>Name</Run>
                        </Paragraph>
                      </Cell>
                      <Cell>
                        <Paragraph>
                          <Run>Yes/No</Run>
                        </Paragraph>
                      </Cell>
                    </Row>
                    <Row>
                      <Cell>
                        <Paragraph>
                          <Run>1</Run>
                        </Paragraph>
                      </Cell>
                      <Cell>
                        <Paragraph>
                          <Run>J. Doe</Run>
                        </Paragraph>
                      </Cell>
                      <Cell>
                        <Paragraph>
                          <Run>Yes</Run>
                        </Paragraph>
                      </Cell>
                    </Row>
                    <Row>
                      <Cell>
                        <Paragraph>
                          <Run>2</Run>
                        </Paragraph>
                      </Cell>
                      <Cell>
                        <Paragraph>
                          <Run>A. Smith</Run>
                        </Paragraph>
                      </Cell>
                      <Cell>
                        <Paragraph>
                          <Run>No</Run>
                        </Paragraph>
                      </Cell>
                    </Row>
                  </Table>
                </Body>
                ";

            doc.Import(doc.Sections.Cast<Section>().Single().Body, DocumentTextFormat.Xml, importBodyXml);

            doc.AssertXml(doc.Sections.Cast<Section>().Single().Body, importBodyXml);
        }
        public void CloneRegion_RepeatableThatSpansParagraphs()
        {
            var doc = new Document();

            var runTexts1 = new[] { "^", "{{ PrecedingField }}", "{{ each Items }}", };

            var onlySection = doc.Sections.Cast<Section>().Single();

            var onlyPara = onlySection.Body.Paragraphs.Cast<Paragraph>().Single();

            onlyPara.ParagraphFormat.SpaceBefore = 10;
            onlyPara.ParagraphFormat.SpaceAfter = 1;

            doc.Import(onlyPara, DocumentTextFormat.Xml, "<Paragraph>\r\n" + string.Join("\r\n", runTexts1.Select(t => "<Run>" + t + "</Run>")) + "\r\n</Paragraph>");

            var runs1 = onlyPara.ChildNodes.Cast<Run>().ToArray();

            var newPara = new Paragraph(doc);

            newPara.ParagraphFormat.SpaceBefore = 1;
            newPara.ParagraphFormat.SpaceAfter = 10;

            onlySection.Body.ChildNodes.Add(newPara);

            var runTexts2 = new[] { "{{ Sequence }}", "{{ end each }}", "$", };

            doc.Import(newPara, DocumentTextFormat.Xml, "<Paragraph>\r\n" + string.Join("\r\n", runTexts2.Select(t => "<Run>" + t + "</Run>")) + "\r\n</Paragraph>");

            var runs2 = newPara.ChildNodes.Cast<Run>().ToArray();

            Container<Document, Node, DocumentToken<Node>, Type, object, string> root;
            MergeTemplateError<DocumentToken<Node>>[] errors;
            MergeTemplateCompiler.Compile(typeof(object), TokenParser, ExpressionParser, Scanner.GetTokens(doc), null, true, out root, out errors);

            var repeatable = root.Children.OfType<IRegion<DocumentToken<Node>>>().OfType<Repeatable<Document, Node, DocumentToken<Node>, Type, object, string>>().Single();

            Assert.AreEqual(runs1[2], repeatable.StartToken.Start);

            Assert.AreEqual(runs2[1], repeatable.EndToken.Start);

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph paragraphformat_spacebefore='10' paragraphformat_spaceafter='1'>
                        <Run>^</Run>
                        <Run>{{ PrecedingField }}</Run>
                        <Run>{{ each Items }}</Run>
                      </Paragraph>
                      <Paragraph paragraphformat_spacebefore='1' paragraphformat_spaceafter='10'>
                        <Run>{{ Sequence }}</Run>
                        <Run>{{ end each }}</Run>
                        <Run>$</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>");

            var existingInnerTokens = repeatable.GetInnerTokens().ToArray();

            var clonedTokens = Writer.CloneRegion(doc,
                new Tuple<DocumentToken<Node>, DocumentToken<Node>[], DocumentToken<Node>>(repeatable.StartToken, existingInnerTokens, repeatable.EndToken));

            AssertText(doc, @"^{{ PrecedingField }}{{ each Items }}
                                {{ Sequence }}{{ end each }}
                                {{ each Items }}
                                {{ Sequence }}{{ end each }}$
                                ");

            Assert.AreNotEqual(repeatable.StartToken, clonedTokens.Item1);
            Assert.AreNotEqual(repeatable.StartToken.Start, clonedTokens.Item1.Start);
            Assert.AreNotEqual(repeatable.StartToken.End, clonedTokens.Item1.End);

            Assert.AreEqual(existingInnerTokens.Length, clonedTokens.Item2.Length);

            Assert.AreNotEqual(repeatable.EndToken, clonedTokens.Item3);
            Assert.AreNotEqual(repeatable.EndToken.Start, clonedTokens.Item3.Start);
            Assert.AreNotEqual(repeatable.EndToken.End, clonedTokens.Item3.End);

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph paragraphformat_spacebefore='10' paragraphformat_spaceafter='1'>
                        <Run>^</Run>
                        <Run>{{ PrecedingField }}</Run>
                        <Run>{{ each Items }}</Run>
                      </Paragraph>
                      <Paragraph paragraphformat_spacebefore='1' paragraphformat_spaceafter='10'>
                        <Run>{{ Sequence }}</Run>
                        <Run>{{ end each }}</Run>
                      </Paragraph>
                      <Paragraph paragraphformat_spacebefore='10' paragraphformat_spaceafter='1'>
                        <Run>{{ each Items }}</Run>
                      </Paragraph>
                      <Paragraph paragraphformat_spacebefore='1' paragraphformat_spaceafter='10'>
                        <Run>{{ Sequence }}</Run>
                        <Run>{{ end each }}</Run>
                        <Run>$</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>");
        }
        public void CloneRegion_RepeatableWithNoNestedRegions_NodesAndFieldsAreCloned()
        {
            var doc = new Document();

            var runTexts = new[] { "^", "{{ PrecedingField }}", "{{ each Items }}", "{{ Sequence }}", "{{ end each }}", "$" };

            var importedNodes = doc.Import(doc.Sections.Cast<Section>().Single().Body.Paragraphs.Cast<Paragraph>().Single(),
                DocumentTextFormat.Xml,
                "<Paragraph>\r\n" + string.Join("\r\n", runTexts.Select(t => "<Run>" + t + "</Run>")) + "\r\n</Paragraph>"
                );

            var runs = importedNodes.Cast<Run>().ToArray();

            var root = MergeTemplateCompiler.Compile<Document, Node, DocumentToken<Node>, Type, object, string>(typeof(object), TokenParser, ExpressionParser, Scanner.GetTokens(doc));
            var repeatable = root.Children.OfType<IRegion<DocumentToken<Node>>>().OfType<Repeatable<Document, Node, DocumentToken<Node>, Type, object, string>>().Single();

            Assert.AreEqual(runs[2], repeatable.StartToken.Start);
            Assert.AreEqual(runs[4], repeatable.EndToken.Start);

            var existingInnerTokens = repeatable.GetInnerTokens().ToArray();

            var clonedTokens = Writer.CloneRegion(doc,
                new Tuple<DocumentToken<Node>, DocumentToken<Node>[], DocumentToken<Node>>(repeatable.StartToken, existingInnerTokens, repeatable.EndToken));

            AssertText(doc, "^{{ PrecedingField }}{{ each Items }}{{ Sequence }}{{ end each }}{{ each Items }}{{ Sequence }}{{ end each }}$\r\n");

            Assert.AreNotEqual(repeatable.StartToken, clonedTokens.Item1);
            Assert.AreNotEqual(repeatable.StartToken.Start, clonedTokens.Item1.Start);
            Assert.AreNotEqual(repeatable.StartToken.End, clonedTokens.Item1.End);

            Assert.AreEqual(existingInnerTokens.Length, clonedTokens.Item2.Length);

            Assert.AreNotEqual(repeatable.EndToken, clonedTokens.Item3);
            Assert.AreNotEqual(repeatable.EndToken.Start, clonedTokens.Item3.Start);
            Assert.AreNotEqual(repeatable.EndToken.End, clonedTokens.Item3.End);

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>^</Run>
                        <Run>{{ PrecedingField }}</Run>
                        <Run>{{ each Items }}</Run>
                        <Run>{{ Sequence }}</Run>
                        <Run>{{ end each }}</Run>
                        <Run>{{ each Items }}</Run>
                        <Run>{{ Sequence }}</Run>
                        <Run>{{ end each }}</Run>
                        <Run>$</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>");
        }
示例#8
0
        public void MergeDocText_RepeatableInHeaderAndFooter()
        {
            var doc = new Document();

            var builder = new DocumentBuilder(doc);

            builder.Write("{{ Name }}");

            builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary);

            builder.Write("{{ each Items }}");

            builder.MoveToHeaderFooter(HeaderFooterType.FooterPrimary);

            builder.Write("{{ end each }}");

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>{{ Name }}</Run>
                      </Paragraph>
                    </Body>
                    <HeaderFooter headerfootertype='HeaderPrimary' islinkedtoprevious='False' storytype='PrimaryHeader'>
                      <Paragraph>
                        <Run>{{ each Items }}</Run>
                      </Paragraph>
                    </HeaderFooter>
                    <HeaderFooter headerfootertype='FooterPrimary' islinkedtoprevious='False' storytype='PrimaryFooter'>
                      <Paragraph>
                        <Run>{{ end each }}</Run>
                      </Paragraph>
                    </HeaderFooter>
                  </Section>
                </Document>");

            var data = new
            {
                Name = "Shopping List",
                Items = new[] {
                        new {Name = "Milk" },
                        new {Name = "Eggs" },
                        new {Name = "Artisan Bread" }
                    },
            };

            doc.Merge(data);

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>Milk</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>Eggs</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>Artisan Bread</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>");
        }
示例#9
0
        public void MergeDocText_HyperlinkUrl()
        {
            var doc = new Document();

            var builder = new DocumentBuilder(doc);

            builder.InsertRun("^ ");

            builder.InsertField("HYPERLINK \"%7b%7bUrl%7d%7d\"");

            builder.InsertRun(" $");

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>^ </Run>
                        <FieldStart></FieldStart>
                        <Run>HYPERLINK ""%7b%7bUrl%7d%7d""</Run>
                        <FieldSeparator></FieldSeparator>
                        <FieldEnd></FieldEnd>
                        <Run> $</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>
                ");

            var data = new
            {
                Url = "https://www.google.com",
            };

            doc.Merge(data);

            doc.AssertXml(@"
                <Document>
                  <Section>
                    <Body>
                      <Paragraph>
                        <Run>^ </Run>
                        <FieldStart></FieldStart>
                        <Run>HYPERLINK ""</Run>
                        <Run>https://www.google.com</Run>
                        <Run>""</Run>
                        <FieldSeparator></FieldSeparator>
                        <FieldEnd></FieldEnd>
                        <Run> $</Run>
                      </Paragraph>
                    </Body>
                  </Section>
                </Document>
                ");
        }