JAL-1807 test
[jalviewjs.git] / bin / com / stevesoft / pat / parsePerl.js
1 Clazz.declarePackage ("com.stevesoft.pat");
2 Clazz.load (null, "com.stevesoft.pat.parsePerl", ["com.stevesoft.pat.CaseMgr", "$.Prop", "$.RegSyntaxError", "$.Regex", "$.ReplaceRule", "$.StringRule", "java.lang.StringBuffer"], function () {
3 c$ = Clazz.declareType (com.stevesoft.pat, "parsePerl");
4 c$.close = Clazz.defineMethod (c$, "close", 
5 function (c) {
6 if (c == '<') {
7 return '>';
8 }if (c == '[') {
9 return ']';
10 }if (c == '(') {
11 return ')';
12 }if (c == '{') {
13 return '}';
14 }return c;
15 }, "~S");
16 c$.codify = Clazz.defineMethod (c$, "codify", 
17 function (s, keepbs) {
18 return com.stevesoft.pat.parsePerl.codifyRange (s, 0, s.length, keepbs);
19 }, "~S,~B");
20 c$.codifyRange = Clazz.defineMethod (c$, "codifyRange", 
21 function (s, i0, iN, keepbs) {
22 var sb =  new StringBuffer ();
23 var ucmode = false;
24 var lcmode = false;
25 var litmode = false;
26 var uc1 = false;
27 var lc1 = false;
28 var modified = false;
29 for (var i = i0; i < iN; i++) {
30 var c = s.charAt (i);
31 var mf = true;
32 var app = true;
33 if (c == '\\') {
34 app = false;
35 i++;
36 if (i < s.length) {
37 var c2 = s.charAt (i);
38 switch (c2) {
39 case 'Q':
40 litmode = true;
41 break;
42 case 'U':
43 ucmode = true;
44 break;
45 case 'L':
46 lcmode = true;
47 break;
48 case 'u':
49 uc1 = true;
50 break;
51 case 'l':
52 lc1 = true;
53 break;
54 case 'E':
55 uc1 = lc1 = ucmode = lcmode = litmode = false;
56 break;
57 default:
58 if (keepbs) {
59 sb.append ('\\');
60 }c = c2;
61 if (keepbs) {
62 mf = false;
63 }app = true;
64 break;
65 }
66 modified = new Boolean (modified | mf).valueOf ();
67 }}if (app) {
68 if (lc1) {
69 c = com.stevesoft.pat.parsePerl.lc (c);
70 lc1 = false;
71 } else if (uc1) {
72 c = com.stevesoft.pat.parsePerl.uc (c);
73 uc1 = false;
74 } else if (ucmode) {
75 c = com.stevesoft.pat.parsePerl.uc (c);
76 } else if (lcmode) {
77 c = com.stevesoft.pat.parsePerl.lc (c);
78 }if (litmode && com.stevesoft.pat.parsePerl.needbs (c)) {
79 sb.append ('\\');
80 }sb.append (c);
81 }}
82 return modified ? sb.toString () : s;
83 }, "~S,~N,~N,~B");
84 c$.uc = Clazz.defineMethod (c$, "uc", 
85 function (c) {
86 return com.stevesoft.pat.CaseMgr.toUpperCaseC (c);
87 }, "~S");
88 c$.lc = Clazz.defineMethod (c$, "lc", 
89 function (c) {
90 return com.stevesoft.pat.CaseMgr.toLowerCaseC (c);
91 }, "~S");
92 c$.needbs = Clazz.defineMethod (c$, "needbs", 
93 function (c) {
94 if (c >= 'a' && c <= 'z') {
95 return false;
96 }if (c >= 'A' && c <= 'Z') {
97 return false;
98 }if (c >= '0' && c <= '9') {
99 return false;
100 }if (c == '_') {
101 return false;
102 }return true;
103 }, "~S");
104 c$.parse = Clazz.defineMethod (c$, "parse", 
105 function (s) {
106 var igncase = false;
107 var optim = false;
108 var gFlag = false;
109 var sFlag = false;
110 var mFlag = false;
111 var xFlag = false;
112 var s1 =  new StringBuffer ();
113 var s2 =  new StringBuffer ();
114 var i = 0;
115 var count = 0;
116 var mode;
117 var delim = '/';
118 var cdelim = '/';
119 if (s.length >= 3 && s.charAt (0) == 's') {
120 mode = 's';
121 delim = s.charAt (1);
122 cdelim = com.stevesoft.pat.parsePerl.close (delim);
123 i = 2;
124 } else if (s.length >= 2 && s.charAt (0) == 'm') {
125 mode = 'm';
126 delim = s.charAt (1);
127 cdelim = com.stevesoft.pat.parsePerl.close (delim);
128 i = 2;
129 } else if (s.length >= 1 && s.charAt (0) == '/') {
130 mode = 'm';
131 i = 1;
132 } else {
133 try {
134 com.stevesoft.pat.RegSyntaxError.endItAll ("Regex.perlCode should be of the form s/// or m// or //");
135 } catch (rs) {
136 if (Clazz.exceptionOf (rs, com.stevesoft.pat.RegSyntax)) {
137 } else {
138 throw rs;
139 }
140 }
141 return null;
142 }for (; i < s.length; i++) {
143 if (s.charAt (i) == '\\') {
144 s1.append ('\\');
145 i++;
146 } else if (s.charAt (i) == cdelim && count == 0) {
147 i++;
148 break;
149 } else if (s.charAt (i) == delim && cdelim != delim) {
150 count++;
151 } else if (s.charAt (i) == cdelim && cdelim != delim) {
152 count--;
153 }s1.append (s.charAt (i));
154 }
155 if (mode == 's' && cdelim != delim) {
156 while (i < s.length && com.stevesoft.pat.Prop.isWhite (s.charAt (i))) {
157 i++;
158 }
159 if (i >= s.length) {
160 try {
161 com.stevesoft.pat.RegSyntaxError.endItAll ("" + mode + delim + " needs " + cdelim);
162 } catch (rs) {
163 if (Clazz.exceptionOf (rs, com.stevesoft.pat.RegSyntax)) {
164 } else {
165 throw rs;
166 }
167 }
168 return null;
169 }cdelim = com.stevesoft.pat.parsePerl.close (delim = s.charAt (i));
170 i++;
171 }count = 0;
172 if (mode == 's') {
173 for (; i < s.length; i++) {
174 if (s.charAt (i) == '\\') {
175 s2.append ('\\');
176 i++;
177 } else if (s.charAt (i) == cdelim && count == 0) {
178 i++;
179 break;
180 } else if (s.charAt (i) == delim && cdelim != delim) {
181 count++;
182 } else if (s.charAt (i) == cdelim && cdelim != delim) {
183 count--;
184 }s2.append (s.charAt (i));
185 }
186 }for (; i < s.length; i++) {
187 var c = s.charAt (i);
188 switch (c) {
189 case 'x':
190 xFlag = true;
191 break;
192 case 'i':
193 igncase = true;
194 break;
195 case 'o':
196 optim = true;
197 break;
198 case 's':
199 sFlag = true;
200 break;
201 case 'm':
202 mFlag = true;
203 break;
204 case 'g':
205 gFlag = true;
206 break;
207 default:
208 try {
209 com.stevesoft.pat.RegSyntaxError.endItAll ("Illegal flag to pattern: " + c);
210 } catch (rs) {
211 if (Clazz.exceptionOf (rs, com.stevesoft.pat.RegSyntax)) {
212 } else {
213 throw rs;
214 }
215 }
216 return null;
217 }
218 }
219 var r =  new com.stevesoft.pat.Regex (null, "");
220 try {
221 var pat = s1.toString ();
222 var reprul = s2.toString ();
223 if (xFlag) {
224 pat = com.stevesoft.pat.parsePerl.strip (pat);
225 reprul = com.stevesoft.pat.parsePerl.strip (reprul);
226 }r.compile (pat);
227 r.ignoreCase = new Boolean (r.ignoreCase | igncase).valueOf ();
228 r.gFlag = new Boolean (r.gFlag | gFlag).valueOf ();
229 r.sFlag = new Boolean (r.sFlag | sFlag).valueOf ();
230 r.mFlag = new Boolean (r.mFlag | mFlag).valueOf ();
231 if (optim) {
232 r.optimize ();
233 }if (delim == '\'') {
234 r.setReplaceRule ( new com.stevesoft.pat.StringRule (reprul));
235 } else {
236 r.setReplaceRule (com.stevesoft.pat.ReplaceRule.perlCode (reprul));
237 }} catch (rs) {
238 if (Clazz.exceptionOf (rs, com.stevesoft.pat.RegSyntax)) {
239 r = null;
240 } else {
241 throw rs;
242 }
243 }
244 return r;
245 }, "~S");
246 c$.strip = Clazz.defineMethod (c$, "strip", 
247 function (s) {
248 var sb =  new StringBuffer ();
249 for (var i = 0; i < s.length; i++) {
250 var c = s.charAt (i);
251 if (com.stevesoft.pat.Prop.isWhite (c)) {
252 ;} else if (c == '#') {
253 i++;
254 while (i < s.length) {
255 if (s.charAt (i) == '\n') {
256 break;
257 }i++;
258 }
259 } else if (c == '\\') {
260 sb.append (c);
261 sb.append (s.charAt (++i));
262 } else {
263 sb.append (c);
264 }}
265 return sb.toString ();
266 }, "~S");
267 });