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