forked from dotnet/Open-XML-SDK
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathParticleWriterExtensions.cs
More file actions
158 lines (139 loc) · 5.02 KB
/
ParticleWriterExtensions.cs
File metadata and controls
158 lines (139 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using DocumentFormat.OpenXml.Generator.Editor;
using DocumentFormat.OpenXml.Generator.Models;
using System.CodeDom.Compiler;
namespace DocumentFormat.OpenXml.Generator.Generators.Elements;
internal static class ParticleWriterExtensions
{
public static void WriteParticle(this IndentedTextWriter writer, OpenXmlGeneratorServices services, SchemaType containingType, Particle particle)
{
writer.WriteItemNode(services, containingType, particle);
}
private static void WriteArgumentList(this IndentedTextWriter writer, Particle p, ParticleVersion v, Action<IndentedTextWriter>? arg = null)
{
var args = writer.TrackDelimiter();
if (arg != null)
{
args.AddDelimiter();
arg(writer);
}
args.AddDelimiter();
writer.Write(v.Min);
args.AddDelimiter();
writer.Write(v.Max);
if (v.IncludeVersion)
{
args.AddDelimiter();
writer.Write("version: FileFormatVersions.");
writer.Write(v.Version);
}
else if (p.InitialVersion != OfficeVersion.Office2007)
{
args.AddDelimiter();
writer.Write("version: FileFormatVersions.");
writer.Write(p.InitialVersion);
}
if (p.RequireFilter)
{
args.AddDelimiter();
writer.Write("requireFilter: true");
}
}
private static void WriteCompositeObject(this IndentedTextWriter writer, OpenXmlGeneratorServices services, SchemaType containingType, string type, Particle p)
{
writer.WriteObject("CompositeParticle.Builder", p, w => w.Write($"ParticleType.{type}"), block: writer =>
{
using (writer.AddBlock(new() { IncludeTrailingNewline = false }))
{
var list = writer.TrackDelimiter(newLineCount: 1);
foreach (var item in p.Items)
{
list.AddDelimiter();
writer.WriteItemNode(services, containingType, item);
}
writer.WriteLine();
}
});
}
private static void WriteObject(this IndentedTextWriter writer, string name, Particle p, Action<IndentedTextWriter>? arg = null, Action<IndentedTextWriter>? block = null)
{
var list = writer.TrackDelimiter(newLineCount: 1);
foreach (var info in p.Occurs)
{
list.AddDelimiter();
writer.Write("new ");
writer.Write(name);
writer.Write("(");
writer.WriteArgumentList(p, info, arg);
writer.Write(")");
if (block is not null)
{
writer.WriteLine();
block(writer);
}
}
}
private static void WriteItemNode(this IndentedTextWriter writer, OpenXmlGeneratorServices services, SchemaType containingType, Particle particle)
{
if (particle.Kind == ParticleType.Element)
{
var info = services.FindClassName(particle.Name);
writer.WriteObject("ElementParticle", particle, w =>
{
w.Write(info);
w.Write(".ElementType");
});
}
else if (particle.Kind == ParticleType.Any)
{
static void WriteNamespace(IndentedTextWriter writer, string ns)
{
var xsd = ns switch
{
"##local" => "XsdAny.Local",
"##any" => "XsdAny.Any",
"##other" => "XsdAny.Other",
"##targetNamespace" => "XsdAny.TargetNamespace",
_ => null,
};
if (xsd is null)
{
writer.WriteItem(ns);
}
else
{
writer.Write(xsd);
}
}
if (particle.Namespace is null)
{
writer.WriteObject("AnyParticle", particle);
}
else
{
writer.WriteObject("AnyParticle", particle, arg: writer => WriteNamespace(writer, particle.Namespace));
}
}
else if (particle.Kind == ParticleType.Choice)
{
writer.WriteCompositeObject(services, containingType, "Choice", particle);
}
else if (particle.Kind == ParticleType.Sequence)
{
writer.WriteCompositeObject(services, containingType, "Sequence", particle);
}
else if (particle.Kind == ParticleType.All)
{
writer.WriteCompositeObject(services, containingType, "All", particle);
}
else if (particle.Kind == ParticleType.Group)
{
writer.WriteCompositeObject(services, containingType, "Group", particle);
}
else
{
throw new InvalidOperationException();
}
}
}