1 #Region "Microsoft.VisualBasic::7ce2456a32bc0deaf78d7ef143d540f8, Microsoft.VisualBasic.Core\Text\GreekAlphabets.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 '     Module GreekAlphabets
35
36 '         Properties: Alphabets
37
38 '         Function: (+2 Overloads) StripGreek
39
40
41 ' /********************************************************************************/
42
43 #End Region
44
45 Imports System.Runtime.CompilerServices
46 Imports System.Text
47 Imports Microsoft.VisualBasic.Language
48
49 Namespace Text
50
51     ''' <summary>
52     ''' Processing for the chemical compound name/genome species scientific name.
53     ''' </summary>
54     Public Module GreekAlphabets
55
56         Const Α$ = "alpha"
57         Const Β$ = "beta"
58         Const Γ$ = "gamma"
59         Const Δ$ = "delta"
60         Const Ε$ = "epsilon"
61         Const Ζ$ = "zeta"
62         Const Η$ = "eta"
63         Const Θ$ = "theta"
64         Const Ι$ = "iota"
65         Const Κ$ = "kappa"
66         Const Λ$ = "lambda"
67         Const Μ$ = "mu"
68         Const Ν$ = "nu"
69         Const Ξ$ = "xi"
70         Const Ο$ = "omicron"
71         Const Π$ = "pi"
72         Const Ρ$ = "rho"
73         Const Σ$ = "sigma"
74         Const Τ$ = "tau"
75         Const Υ$ = "upsilon"
76         Const Φ$ = "phi"
77         Const Χ$ = "chi"
78         Const Ψ$ = "psi"
79         Const Ω$ = "omega"
80
81         Public ReadOnly Property Alphabets As Dictionary(Of StringString)
82         Public ReadOnly Property upper As Dictionary(Of StringString)
83         Public ReadOnly Property lower As Dictionary(Of StringString)
84
85         Sub New()
86             _Alphabets = New Dictionary(Of StringString) From {
87                {"α", GreekAlphabets.Α}, {"Α", GreekAlphabets.Α},
88                {"β", GreekAlphabets.Β}, {"Β", GreekAlphabets.Β},
89                {"γ", GreekAlphabets.Γ}, {"Γ", GreekAlphabets.Γ},
90                {"δ", GreekAlphabets.Δ}, {"Δ", GreekAlphabets.Δ},
91                {"ε", GreekAlphabets.Ε}, {"Ε", GreekAlphabets.Ε},
92                {"ζ", GreekAlphabets.Ζ}, {"Ζ", GreekAlphabets.Ζ},
93                {"η", GreekAlphabets.Η}, {"Η", GreekAlphabets.Η},
94                {"θ", GreekAlphabets.Θ}, {"Θ", GreekAlphabets.Θ},
95                {"ι", GreekAlphabets.Ι}, {"Ι", GreekAlphabets.Ι},
96                {"κ", GreekAlphabets.Κ}, {"Κ", GreekAlphabets.Κ},
97                {"λ", GreekAlphabets.Λ}, {"Λ", GreekAlphabets.Λ},
98                {"μ", GreekAlphabets.Μ}, {"Μ", GreekAlphabets.Μ},
99                {"ν", GreekAlphabets.Ν}, {"Ν", GreekAlphabets.Ν},
100                {"ξ", GreekAlphabets.Ξ}, {"Ξ", GreekAlphabets.Ξ},
101                {"ο", GreekAlphabets.Ο}, {"Ο", GreekAlphabets.Ο},
102                {"π", GreekAlphabets.Π}, {"Π", GreekAlphabets.Π},
103                {"ρ", GreekAlphabets.Ρ}, {"Ρ", GreekAlphabets.Ρ},
104                {"σ", GreekAlphabets.Σ}, {"Σ", GreekAlphabets.Σ},
105                {"τ", GreekAlphabets.Τ}, {"Τ", GreekAlphabets.Τ},
106                {"υ", GreekAlphabets.Υ}, {"Υ", GreekAlphabets.Υ},
107                {"φ", GreekAlphabets.Φ}, {"Φ", GreekAlphabets.Φ},
108                {"χ", GreekAlphabets.Χ}, {"Χ", GreekAlphabets.Χ},
109                {"ψ", GreekAlphabets.Ψ}, {"Ψ", GreekAlphabets.Ψ},
110                {"ω", GreekAlphabets.Ω}, {"Ω", GreekAlphabets.Ω}
111             }
112
113             _upper = Alphabets.Subset({
114                 "Α""Β""Γ""Δ""Ε""Ζ",
115                 "Η""Θ""Ι""Κ""Λ""Μ",
116                 "Ν""Ξ""Ο""Π""Ρ""Σ",
117                 "Τ""Υ""Φ""Χ""Ψ""Ω"
118             })
119             _lower = Alphabets.Subset(Alphabets.Keys.AsSet - upper.Keys)
120         End Sub
121
122         ''' <summary>
123         ''' 将字符串文本之中的希腊字母替换为英文单词
124         ''' </summary>
125         ''' <param name="s"></param>
126         ''' <returns></returns>
127         <Extension> Public Function StripGreek(ByRef s As StringBuilder) As StringBuilder
128             For Each key In Alphabets.Keys
129                 Call s.Replace(key, Alphabets(key))
130             Next
131             Return s
132         End Function
133
134         ''' <summary>
135         ''' 将字符串文本之中的希腊字母替换为英文单词
136         ''' </summary>
137         ''' <param name="s$"></param>
138         ''' <returns></returns>
139         <Extension> Public Function StripGreek(s$) As String
140             Return New StringBuilder(s).StripGreek.ToString
141         End Function
142
143         Const contactSymbols = "[\-\(\)&;\s ,\.:\|\[\]\+\*]"
144         Const escapePattern$ = contactSymbols & "[a-z]{2,10}" & contactSymbols
145
146         ''' <summary>
147         ''' 
148         ''' </summary>
149         ''' <param name="s$"></param>
150         ''' <param name="removesContacts"></param>
151         ''' <param name="upperCase"></param>
152         ''' <returns></returns>
153         ''' 
154         <MethodImpl(MethodImplOptions.AggressiveInlining)>
155         <Extension>
156         Public Function AlphabetUnescape(s$, Optional removesContacts As Boolean = FalseOptional upperCase As Boolean = FalseAs String
157             Return s.unescapeInternal(escapePattern, upperCase, removesContacts)
158         End Function
159
160         <Extension>
161         Private Function unescapeInternal(s$, escapePattern$, upperCase As Boolean, removesContacts As BooleanAs String
162             ' 如果直接匹配替换的话,可能会将单词之中的一部分给错误的替换掉,
163             ' 所以在这里假设希腊字母是在连接符周围的
164             Dim matches = s.Matches(escapePattern, RegexICSng)
165             Dim sb As New StringBuilder(s)
166             Dim alphabets = (upper Or lower.When(Not upperCase)).ReverseMaps
167
168             For Each match As String In matches
169                 Dim term$ = Mid(match, 2, Length:=match.Length - 2)
170                 Dim greek$ = alphabets.TryGetValue(term.ToLower)
171
172                 If Not greek Is Nothing Then
173                     If Not removesContacts Then
174                         match = term
175                     End If
176
177                     Call sb.Replace(match, greek)
178                 End If
179             Next
180
181             Return sb.ToString
182         End Function
183
184         <MethodImpl(MethodImplOptions.AggressiveInlining)>
185         <Extension>
186         Public Function AlphabetUnescape(s$, contacts As (left As Char, right As Char), Optional upperCase As Boolean = FalseAs String
187             Return s.unescapeInternal($"[{contacts.left}][a-z]{{2,10}}[{contacts.right}]", upperCase, True)
188         End Function
189     End Module
190 End Namespace