Escaper.java
01 /*
02  * Java Genetic Algorithm Library (jenetics-7.1.0).
03  * Copyright (c) 2007-2022 Franz Wilhelmstötter
04  *
05  * Licensed under the Apache License, Version 2.0 (the "License");
06  * you may not use this file except in compliance with the License.
07  * You may obtain a copy of the License at
08  *
09  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * Author:
18  *    Franz Wilhelmstötter (franz.wilhelmstoetter@gmail.com)
19  */
20 package io.jenetics.ext.internal.util;
21 
22 /**
23  @author <a href="mailto:franz.wilhelmstoetter@gmail.com">Franz Wilhelmstötter</a>
24  @version 5.0
25  @since 5.0
26  */
27 public final class Escaper {
28 
29     private final char[] _protect;
30     private final char _escape;
31 
32 
33     public Escaper(final char escape, final char... protect) {
34         _protect = protect.clone();
35         _escape = escape;
36     }
37 
38     public String escape(final CharSequence value) {
39         final StringBuilder result = new StringBuilder();
40         for (int i = 0; i < value.length(); ++i) {
41             final char c = value.charAt(i);
42             if (isProtectedChar(c)) {
43                 result.append(_escape);
44             }
45             result.append(c);
46         }
47 
48         return result.toString();
49     }
50 
51     private boolean isProtectedChar(final char c) {
52         for (var c1 : _protect) {
53             if (c == c1return true;
54         }
55         return false;
56     }
57 
58 
59     public String unescape(final CharSequence value) {
60         final StringBuilder result = new StringBuilder();
61 
62         boolean escaping = false;
63         for (int i = 0; i < value.length(); ++i) {
64             final char c = value.charAt(i);
65 
66             if (c == _escape &&
67                 !escaping &&
68                 i + < value.length() &&
69                 isProtectedChar(value.charAt(i + 1)))
70             {
71                 escaping = true;
72                 continue;
73             }
74 
75             if (escaping) {
76                 escaping = false;
77             }
78             result.append(c);
79         }
80 
81         return result.toString();
82     }
83 
84 }