1 #Region "Microsoft.VisualBasic::59453605d79316e5c2b6c38c9e7f9894, Microsoft.VisualBasic.Core\Scripting\ScriptBuilder.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Class ScriptBuilder
35     
36     '         Properties: Preview, Script
37     
38     '         Constructor: (+4 OverloadsSub New
39     '         Function: AppendLine, Replace, (+2 Overloads) Save, ToString
40     '         Operators: +
41     
42     
43     ' /********************************************************************************/
44
45 #End Region
46
47 Imports System.Runtime.CompilerServices
48 Imports System.Text
49 Imports Microsoft.VisualBasic.ComponentModel
50 Imports Microsoft.VisualBasic.Text
51
52 Namespace Scripting.SymbolBuilder
53
54     ''' <summary>
55     ''' 对<see cref="StringBuilder"/>对象的拓展,添加了操作符凭借字符串,从而能够让生成代码的操作更加的方便
56     ''' </summary>
57     Public Class ScriptBuilder : Implements ISaveHandle
58
59         Public ReadOnly Property Script As StringBuilder
60
61         ''' <summary>
62         ''' The variable in target script text should be in format like: ``{$name}``
63         ''' </summary>
64         ''' <param name="name"></param>
65         Default Public WriteOnly Property Assign(name As StringAs String
66             <MethodImpl(MethodImplOptions.AggressiveInlining)>
67             Set
68                 Call Script.Replace($"{{${name}}}", Value)
69             End Set
70         End Property
71
72         ''' <summary>
73         ''' Equals to <see cref="StringBuilder.ToString()"/>
74         ''' </summary>
75         ''' <returns></returns>
76         Public ReadOnly Property Preview As String
77             <MethodImpl(MethodImplOptions.AggressiveInlining)>
78             Get
79                 Return Script.ToString
80             End Get
81         End Property
82
83         Sub New(sb As StringBuilder)
84             Script = sb
85         End Sub
86
87         Sub New(capacity As Integer)
88             Script = New StringBuilder(capacity)
89         End Sub
90
91         Sub New()
92             Call Me.New(capacity:=1024)
93         End Sub
94
95         Sub New(script$)
96             Call Me.New(New StringBuilder(script))
97         End Sub
98
99         ''' <summary>
100         ''' <see cref="StringBuilder.Replace(String, String)"/>
101         ''' </summary>
102         ''' <param name="key$"></param>
103         ''' <param name="value$"></param>
104         ''' <returns></returns>
105         Public Function Replace(key$, value$) As ScriptBuilder
106             Call Script.Replace(key, value)
107             Return Me
108         End Function
109
110         ''' <summary>
111         ''' Display the string text in the <see cref="StringBuilder"/> object.
112         ''' </summary>
113         ''' <returns></returns>
114         ''' 
115         <MethodImpl(MethodImplOptions.AggressiveInlining)>
116         Public Overrides Function ToString() As String
117             Return Script.ToString
118         End Function
119
120         ''' <summary>
121         ''' Appends a copy of the specified string followed by the default line terminator
122         ''' to the end of the current <see cref="ScriptBuilder"/> object.
123         ''' </summary>
124         ''' <param name="line$">The string to append.</param>
125         ''' <returns>A reference to this instance after the append operation has completed.</returns>
126         Public Function AppendLine(Optional line$ = ""As ScriptBuilder
127             Call Script.AppendLine(line)
128             Return Me
129         End Function
130
131         ''' <summary>
132         ''' <see cref="StringBuilder.ToString()"/>
133         ''' </summary>
134         ''' <param name="sb"></param>
135         ''' <returns></returns>
136         ''' 
137         <MethodImpl(MethodImplOptions.AggressiveInlining)>
138         Public Shared Narrowing Operator CType(sb As ScriptBuilder) As String
139             Return sb.Script.ToString
140         End Operator
141
142         <MethodImpl(MethodImplOptions.AggressiveInlining)>
143         Public Shared Widening Operator CType(script As StringAs ScriptBuilder
144             Return New ScriptBuilder(script)
145         End Operator
146
147         ''' <summary>
148         ''' <see cref="StringBuilder.Append"/>
149         ''' </summary>
150         ''' <param name="sb"></param>
151         ''' <param name="s"></param>
152         ''' <returns></returns>
153         Public Shared Operator &(sb As ScriptBuilder, s As StringAs ScriptBuilder
154             Call sb.Script.Append(s)
155             Return sb
156         End Operator
157
158         ''' <summary>
159         ''' <see cref="StringBuilder.AppendLine"/>
160         ''' </summary>
161         ''' <param name="sb"></param>
162         ''' <param name="s"></param>
163         ''' <returns></returns>
164         Public Shared Operator +(sb As ScriptBuilder, s As StringAs ScriptBuilder
165             Call sb.Script.AppendLine(s)
166             Return sb
167         End Operator
168
169         <MethodImpl(MethodImplOptions.AggressiveInlining)>
170         Public Function Save(Optional path As String = ""Optional encoding As Encoding = NothingAs Boolean Implements ISaveHandle.Save
171             Return Script.ToString.SaveTo(path, encoding)
172         End Function
173
174         <MethodImpl(MethodImplOptions.AggressiveInlining)>
175         Public Function Save(Optional path As String = ""Optional encoding As Encodings = Encodings.UTF8) As Boolean Implements ISaveHandle.Save
176             Return Script.ToString.SaveTo(path, encoding.CodePage)
177         End Function
178     End Class
179 End Namespace