Repository navigation
Expand file tree
/
Copy pathProgram.cs
More file actions
196 lines (159 loc) · 5.16 KB
/
Copy pathProgram.cs
File metadata and controls
196 lines (159 loc) · 5.16 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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Pipelines;
using System.Text;
using System.Threading.Tasks;
using RazorEngineCore;
namespace ExampleApp
{
public abstract class BinaryDataEngineTemplateBase<T> : BinaryDataEngineTemplateBase
{
public new T Model { get; set; }
}
public class BinaryDataEngineTemplateBase : IRazorEngineTemplate<byte[]>
{
readonly MemoryStream binaryWriter = new();
Encoding encoding = Encoding.UTF8;
private string attributeSuffix = null;
public dynamic Model { get; set; }
public void WriteLiteral(string literal = null)
{
WriteLiteralAsync(literal).GetAwaiter().GetResult();
}
public virtual Task WriteLiteralAsync(string literal = null)
{
Write(literal);
return Task.CompletedTask;
}
public void Write(object obj = null)
{
WriteAsync(obj).GetAwaiter().GetResult();
}
public virtual Task WriteAsync(object obj = null)
{
if (obj is byte[] bytes)
binaryWriter.Write(bytes);
else
binaryWriter.Write( encoding.GetBytes(obj.ToString()));
return Task.CompletedTask;
}
public void BeginWriteAttribute(string name, string prefix, int prefixOffset, string suffix, int suffixOffset,
int attributeValuesCount)
{
BeginWriteAttributeAsync(name, prefix, prefixOffset, suffix, suffixOffset, attributeValuesCount).GetAwaiter().GetResult();
}
public virtual Task BeginWriteAttributeAsync(string name, string prefix, int prefixOffset, string suffix, int suffixOffset, int attributeValuesCount)
{
this.attributeSuffix = suffix;
Write(prefix);
return Task.CompletedTask;
}
public void WriteAttributeValue(string prefix, int prefixOffset, object value, int valueOffset, int valueLength,
bool isLiteral)
{
WriteAttributeValueAsync(prefix, prefixOffset, value, valueOffset, valueLength, isLiteral).GetAwaiter().GetResult();
}
public virtual Task WriteAttributeValueAsync(string prefix, int prefixOffset, object value, int valueOffset, int valueLength, bool isLiteral)
{
Write(prefix);
Write(value);
return Task.CompletedTask;
}
public void EndWriteAttribute()
{
EndWriteAttributeAsync().GetAwaiter().GetResult();
}
public virtual Task EndWriteAttributeAsync()
{
Write(attributeSuffix);
this.attributeSuffix = null;
return Task.CompletedTask;
}
public void Execute()
{
ExecuteAsync().GetAwaiter().GetResult();
}
public virtual Task ExecuteAsync()
{
return Task.CompletedTask;
}
public virtual byte[] Result()
{
return ResultAsync().GetAwaiter().GetResult();
}
public virtual Task<byte[]> ResultAsync()
{
return Task.FromResult<byte[]>( binaryWriter.ToArray() );
}
}
public class TestModel : BinaryDataEngineTemplateBase<TestModel>
{
public string Name { get; set; }
public IEnumerable<string> Items { get; set; }
public byte[] BinaryData { get; set; }
}
class Program
{
static readonly string Content = @"
Hello @Model.Name
@{
string testheader = "" ---------------- mytest: will show the modified items ----------- "";
List<string> myitems = new ();
foreach (var item in Model.Items) {
myitems.Add("" ---->>>> "" + item);
}
}
@foreach(var item in @Model.Items)
{
<div>- @item</div>
}
@testheader
@foreach(var myitem in @myitems)
{
<text>| @(myitem) | @(myitem) | @(myitem) |
</text>
}
Binary data below:
@Model.BinaryData
End of Binary data
<div data-name=""@Model.Name""></div>
<area>
@{ RecursionTest(3); }
</area>
@{
void RecursionTest(int level){
if (level <= 0)
{
return;
}
<div>LEVEL: @level</div>
@{ RecursionTest(level - 1); }
}
}";
static void Main(string[] args)
{
IRazorEngine razorEngine = new RazorEngine();
var template = razorEngine.Compile<BinaryDataEngineTemplateBase<TestModel>, byte[]>(Content);
/*
StringBuilder stringBuilder = new StringBuilder();
byte[] somebytes = { 0x02, 0x04, 0x50 };
stringBuilder.Append(somebytes);
var s = stringBuilder.ToString();
*/
TestModel model = new TestModel()
{
Name = "Alexander",
Items = new List<string>()
{
"item 1",
"item 2"
},
BinaryData = new byte[10] { 0x41, 0x0A, 0x0D, 0x00, 0x30, 0x31, 0x00, 0x0A, 0x0D, 0x41 }
};
byte[] result = template.Run(instance => instance.Model = model);
Console.WriteLine(Encoding.UTF8.GetString(result));
Console.ReadKey();
}
}
}