|
@@ -60,6 +60,10 @@ const (
|
60
|
60
|
// confusables detection: standard skeleton algorithm (which may be ineffective
|
61
|
61
|
// over the larger set of permitted identifiers)
|
62
|
62
|
CasemappingPermissive
|
|
63
|
+ // rfc1459 is a legacy mapping as defined here: https://modern.ircdocs.horse/#casemapping-parameter
|
|
64
|
+ CasemappingRFC1459
|
|
65
|
+ // rfc1459-strict is a legacy mapping as defined here: https://modern.ircdocs.horse/#casemapping-parameter
|
|
66
|
+ CasemappingRFC1459Strict
|
63
|
67
|
)
|
64
|
68
|
|
65
|
69
|
// XXX this is a global variable without explicit synchronization.
|
|
@@ -110,6 +114,10 @@ func casefoldWithSetting(str string, setting Casemapping) (string, error) {
|
110
|
114
|
return foldASCII(str)
|
111
|
115
|
case CasemappingPermissive:
|
112
|
116
|
return foldPermissive(str)
|
|
117
|
+ case CasemappingRFC1459:
|
|
118
|
+ return foldRFC1459(str, false)
|
|
119
|
+ case CasemappingRFC1459Strict:
|
|
120
|
+ return foldRFC1459(str, true)
|
113
|
121
|
}
|
114
|
122
|
}
|
115
|
123
|
|
|
@@ -214,7 +222,7 @@ func Skeleton(name string) (string, error) {
|
214
|
222
|
switch globalCasemappingSetting {
|
215
|
223
|
default:
|
216
|
224
|
return realSkeleton(name)
|
217
|
|
- case CasemappingASCII:
|
|
225
|
+ case CasemappingASCII, CasemappingRFC1459, CasemappingRFC1459Strict:
|
218
|
226
|
// identity function is fine because we independently case-normalize in Casefold
|
219
|
227
|
return name, nil
|
220
|
228
|
}
|
|
@@ -302,6 +310,23 @@ func foldASCII(str string) (result string, err error) {
|
302
|
310
|
return strings.ToLower(str), nil
|
303
|
311
|
}
|
304
|
312
|
|
|
313
|
+var (
|
|
314
|
+ rfc1459Replacer = strings.NewReplacer("[", "{", "]", "}", "\\", "|", "~", "^")
|
|
315
|
+ rfc1459StrictReplacer = strings.NewReplacer("[", "{", "]", "}", "\\", "|")
|
|
316
|
+)
|
|
317
|
+
|
|
318
|
+func foldRFC1459(str string, strict bool) (result string, err error) {
|
|
319
|
+ asciiFold, err := foldASCII(str)
|
|
320
|
+ if err != nil {
|
|
321
|
+ return "", err
|
|
322
|
+ }
|
|
323
|
+ replacer := rfc1459Replacer
|
|
324
|
+ if strict {
|
|
325
|
+ replacer = rfc1459StrictReplacer
|
|
326
|
+ }
|
|
327
|
+ return replacer.Replace(asciiFold), nil
|
|
328
|
+}
|
|
329
|
+
|
305
|
330
|
func IsPrintableASCII(str string) bool {
|
306
|
331
|
for i := 0; i < len(str); i++ {
|
307
|
332
|
// allow space here because it's technically printable;
|