-
Notifications
You must be signed in to change notification settings - Fork 11
/
IncludeExamples.ttinclude
115 lines (108 loc) · 4.47 KB
/
IncludeExamples.ttinclude
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
<#
/*
* Copyright (C) 2017-2018 Kazuya Ujihara <[email protected]>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
* All we ask is that proper credit is given for our work, which includes
* - but is not limited to - adding the above copyright notice to the beginning
* of your source code files, and to any copyright notice that you may distribute
* with programs based on this work.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT Any WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#>
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".xml" #>
<#
{
var source = new FileInfo(this.Host.TemplateFile).Directory.Parent;
source = new DirectoryInfo(Path.Combine(source.FullName, "ExampleCodes"));
var doc = new XDocument();
var root = new XElement("Comments");
doc.Add(root);
AddElements(root, "NCDK", source);
var stringWriter = new StringWriter();
doc.Save(stringWriter);
var str = stringWriter.ToString();
str = doc.ToString();
#>
<?xml version="1.0" encoding="utf-8" ?>
<#= str #>
<#
}
#>
<#+
static HashSet<string> excludeDirs = new HashSet<string>()
{
"bin", "obj",
};
static HashSet<string> excludeFileNames = new HashSet<string>()
{
"AssemblyInfo", "Program",
};
static Regex a = new Regex(@"^\s*#region([ ]+(?<name>[0-9A-Za-z_\-]+))?\s*\n(?<content>.+?)^\s*#endregion\s*$", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.Singleline | RegexOptions.Multiline);
static void AddElements(XElement parent, string parentId, DirectoryInfo dir)
{
foreach (var cd in dir.GetDirectories().Where(n => !excludeDirs.Contains(n.Name)))
{
AddElements(parent, parentId + "." + cd.Name, cd);
}
foreach (var cs in dir.GetFiles()
.Where(fn => fn.Extension == ".cs")
.Where(fn => !excludeFileNames.Contains(Path.GetFileNameWithoutExtension(fn.Name))))
{
string allContent;
using (var r = new StreamReader(cs.FullName))
{
allContent = r.ReadToEnd();
}
var ms = a.Matches(allContent);
if (ms.Count == 0)
{
var aCode = new XElement("Codes");
aCode.SetAttributeValue("id", parentId + "." + cs.Name);
var code = new XElement("code");
code.Add(new XText(allContent));
aCode.Add(code);
parent.Add(aCode);
}
else
{
foreach (var m in ms.Cast<Match>())
{
var name = m.Groups["name"].Value;
var content = m.Groups["content"].Value;
string id = parentId + "." + cs.Name;
if (!string.IsNullOrEmpty(name))
id = id + "+" + name;
var aCode = new XElement("Codes");
aCode.SetAttributeValue("id", id);
var code = new XElement("code");
code.Add(new XText(content));
aCode.Add(code);
parent.Add(aCode);
}
}
}
}
#>