1 /*******************************************************************************
2
3 An abstract class template representing an entity de/coder, over a specific
4 set of entities.
5
6 The class has various abstract methods, which must be implemented, to decode
7 and encode strings.
8
9 Copyright:
10 Copyright (c) 2009-2016 dunnhumby Germany GmbH.
11 All rights reserved.
12
13 License:
14 Boost Software License Version 1.0. See LICENSE_BOOST.txt for details.
15 Alternatively, this file may be distributed under the terms of the Tango
16 3-Clause BSD License (see LICENSE_BSD.txt for details).
17
18 *******************************************************************************/
19
20 module ocean.text.entities.model.IEntityCodec;
21
22
23
24
25 import ocean.text.entities.model.IEntitySet;
26
27 import Utf = ocean.text.convert.Utf;
28
29 import ocean.meta.types.Qualifiers;
30
31 /*******************************************************************************
32
33 Abstract entity codec template class. Provides
34
35 Params:
36 E = entity set the codec deals with
37
38 *******************************************************************************/
39
40 public abstract class IEntityCodec ( E : IEntitySet )
41 {
42 /***************************************************************************
43
44 Abstract methods to encode any unencoded entities in a string.
45
46 (Unfortunately template methods can't be abstract.)
47
48 ***************************************************************************/
49
50 public abstract char[] encode ( const(char)[] text, ref char[] encoded );
51 public abstract wchar[] encode ( const(wchar)[] text, ref wchar[] encoded );
52 public abstract dchar[] encode ( const(dchar)[] text, ref dchar[] encoded );
53
54
55 /***************************************************************************
56
57 Abstract methods to decode any encoded entities in a string.
58
59 (Unfortunately template methods can't be abstract.)
60
61 ***************************************************************************/
62
63 public abstract char[] decode ( const(char)[] text, ref char[] decoded );
64 public abstract wchar[] decode ( const(wchar)[] text, ref wchar[] decoded );
65 public abstract dchar[] decode ( const(dchar)[] text, ref dchar[] decoded );
66
67
68 /***************************************************************************
69
70 Abstract methods to tell whether a string contains any unencoded
71 entities.
72
73 (Unfortunately template methods can't be abstract.)
74
75 ***************************************************************************/
76
77 public abstract bool containsUnencoded ( const(char)[] text );
78 public abstract bool containsUnencoded ( const(wchar)[] text );
79 public abstract bool containsUnencoded ( const(dchar)[] text );
80
81
82 /***************************************************************************
83
84 Abstract methods to tell whether a string contains any encoded entities.
85
86 (Unfortunately template methods can't be abstract.)
87
88 ***************************************************************************/
89
90 public abstract bool containsEncoded ( const(char)[] text );
91 public abstract bool containsEncoded ( const(wchar)[] text );
92 public abstract bool containsEncoded ( const(dchar)[] text );
93
94
95 /***************************************************************************
96
97 Internal entity set
98
99 ***************************************************************************/
100
101 protected E entities;
102
103
104 /***************************************************************************
105
106 Constructor.
107
108 ***************************************************************************/
109
110 public this ( )
111 {
112 this.entities = new E();
113 }
114
115
116 /***************************************************************************
117
118 Tells whether a string is fully encoded (ie contains no unencoded
119 entities).
120
121 Params:
122 text = string to check
123
124 Returns:
125 true if there are no unencoded entities in the string
126
127 ***************************************************************************/
128
129 public bool encoded ( Char ) ( Char[] text )
130 {
131 return !this.unencoded();
132 }
133
134
135 /***************************************************************************
136
137 Tells whether a string is unencoded (ie contains one or more unencoded
138 entities).
139
140 Params:
141 text = string to check
142
143 Returns:
144 true if there are unencoded entities in the string
145
146 ***************************************************************************/
147
148 public bool unencoded ( Char ) ( Char[] text )
149 {
150 return this.containsUnencoded(text);
151 }
152
153
154 /***************************************************************************
155
156 Static template method to convert from a char to another type.
157
158 Params:
159 Char = type to convert to
160 c = character to convert
161
162 Returns:
163 converted character
164
165 ***************************************************************************/
166
167 protected static Char[] charTo ( Char ) ( char c )
168 {
169 char[1] str;
170 str[0] = c;
171 return this.charTo!(Char)(str);
172 }
173
174
175 /***************************************************************************
176
177 Static template method to convert from a char[] to another type.
178
179 Params:
180 Char = type to convert to
181 text = string to convert
182 output = buffer to write the output to
183
184 Returns:
185 converted string
186
187 ***************************************************************************/
188
189 protected static Char[] charTo ( Char ) ( char[] text, ref Char[] output )
190 {
191 output.length = text.length;
192 assumeSafeAppend(output);
193
194 static if ( is(Char == dchar) )
195 {
196 return Utf.toString32(text, output);
197 }
198 else static if ( is(Char == wchar) )
199 {
200 return Utf.toString16(text, output);
201 }
202 else static if ( is(Char == char) )
203 {
204 return text;
205 }
206 else
207 {
208 static assert(false, This.stringof ~ ".charTo - template parameter must be one of {char, wchar, dchar}");
209 }
210 }
211
212
213 /***************************************************************************
214
215 Static template method to convert from a dchar to another type.
216
217 Params:
218 Char = type to convert to
219 c = character to convert
220 output = buffer to write the output to
221
222 Returns:
223 converted character
224
225 ***************************************************************************/
226
227 protected static Char[] dcharTo ( Char ) ( dchar c, ref Char[] output )
228 {
229 dchar[1] str;
230 str[0] = c;
231 return this.dcharTo!(Char)(str, output);
232 }
233
234 /***************************************************************************
235
236 Static template method to convert from a dchar[] to another type.
237
238 Params:
239 Char = type to convert to
240 text = string to convert
241 output = buffer to write the output to
242
243 Returns:
244 converted string
245
246 ***************************************************************************/
247
248 protected static Char[] dcharTo ( Char ) ( dchar[] text, ref Char[] output )
249 {
250 output.length = text.length * 4; // Maximum one unicode character -> 4 bytes
251 assumeSafeAppend(output);
252
253 static if ( is(Char == dchar) )
254 {
255 output[0..text.length] = text[];
256
257 return output[0..text.length];
258 }
259 else static if ( is(Char == wchar) )
260 {
261 return Utf.toString16(text, output);
262 }
263 else static if ( is(Char == char) )
264 {
265 return Utf.toString(text, output);
266 }
267 else
268 {
269 static assert(false, This.stringof ~ ".charTo - template parameter must be one of {char, wchar, dchar}");
270 }
271 }
272 }
273