iamcal 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/property/escape.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAe/D;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAclE;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpE;AAGD,eAAO,MAAM,eAAe,KAAK,CAAA;AAEjC;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY7C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD"}
1
+ {"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/property/escape.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA2C/D;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAclE;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpE;AAGD,eAAO,MAAM,eAAe,KAAK,CAAA;AAEjC;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY7C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -7,6 +7,7 @@ exports.escapePropertyParameterValue = escapePropertyParameterValue;
7
7
  exports.unescapePropertyParameterValue = unescapePropertyParameterValue;
8
8
  exports.foldLine = foldLine;
9
9
  exports.unfoldLine = unfoldLine;
10
+ const patterns_1 = require("../patterns");
10
11
  /**
11
12
  * Escape special characters in a TEXT property value.
12
13
  *
@@ -26,17 +27,44 @@ function escapeTextPropertyValue(value) {
26
27
  * @see {@link unescapeTextPropertyValue}
27
28
  */
28
29
  function unescapeTextPropertyValue(value) {
29
- const broadBadEscapePattern = /(?<!\\)\\(\\\\)*[^,;\\nN]/;
30
- const broadBadEscape = broadBadEscapePattern.exec(value);
31
- if (broadBadEscape) {
32
- const badEscape = value
33
- .substring(broadBadEscape.index)
34
- .match(/\\[^,;\\nN]/);
35
- const position = broadBadEscape.index + badEscape.index;
36
- throw new SyntaxError(`Bad escaped character '${badEscape[0]}' at position ${position}`);
30
+ /** List that will contain the characters of the unescaped string. */
31
+ const chars = [];
32
+ // Character codes for special characters
33
+ const backslash = (0, patterns_1.ord)('\\');
34
+ const newline = (0, patterns_1.ord)('\n');
35
+ const lowercaseN = (0, patterns_1.ord)('n');
36
+ const uppercaseN = (0, patterns_1.ord)('N');
37
+ const comma = (0, patterns_1.ord)(',');
38
+ const semicolon = (0, patterns_1.ord)(';');
39
+ let previousCharWasBackslash = false;
40
+ for (let i = 0; i < value.length; i++) {
41
+ const char = value.charCodeAt(i);
42
+ if (previousCharWasBackslash) {
43
+ // Previous character was a backslash, so this character is the second character in an escape sequence
44
+ if (char === lowercaseN || char === uppercaseN) {
45
+ chars.push(newline);
46
+ }
47
+ else if (char === comma ||
48
+ char === semicolon ||
49
+ char === backslash) {
50
+ chars.push(char);
51
+ }
52
+ else {
53
+ const position = i - 1;
54
+ throw new SyntaxError(`Bad escaped character '\\${String.fromCharCode(char)}' at position ${position}`);
55
+ }
56
+ // End the escape sequence
57
+ previousCharWasBackslash = false;
58
+ }
59
+ else if (char === backslash) {
60
+ // Start of an escape sequence
61
+ previousCharWasBackslash = true;
62
+ }
63
+ else {
64
+ chars.push(char);
65
+ }
37
66
  }
38
- const jsonValue = value.replace(/\\N/, '\\n').replace(/\\(?=[,;:"])/g, '');
39
- return JSON.parse(`"${jsonValue}"`);
67
+ return String.fromCharCode(...chars);
40
68
  }
41
69
  /**
42
70
  * Escape a property parameter value.
@@ -98,4 +126,4 @@ function foldLine(line) {
98
126
  function unfoldLine(lines) {
99
127
  return lines.replace(/\r\n /g, '');
100
128
  }
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNjYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3BlcnR5L2VzY2FwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSwwREFFQztBQVNELDhEQWVDO0FBU0Qsb0VBY0M7QUFRRCx3RUFLQztBQVVELDRCQVlDO0FBT0QsZ0NBRUM7QUFyR0Q7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHVCQUF1QixDQUFDLEtBQWE7SUFDakQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQ3RFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQix5QkFBeUIsQ0FBQyxLQUFhO0lBQ25ELE1BQU0scUJBQXFCLEdBQUcsMkJBQTJCLENBQUE7SUFDekQsTUFBTSxjQUFjLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3hELElBQUksY0FBYyxFQUFFLENBQUM7UUFDakIsTUFBTSxTQUFTLEdBQUcsS0FBSzthQUNsQixTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQzthQUMvQixLQUFLLENBQUMsYUFBYSxDQUFFLENBQUE7UUFDMUIsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBTSxDQUFBO1FBQ3hELE1BQU0sSUFBSSxXQUFXLENBQ2pCLDBCQUEwQixTQUFTLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixRQUFRLEVBQUUsQ0FDcEUsQ0FBQTtJQUNMLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFXLENBQUE7QUFDakQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLDRCQUE0QixDQUFDLEtBQWE7SUFDdEQsd0VBQXdFO0lBQ3hFLG9FQUFvRTtJQUNwRSw2Q0FBNkM7SUFDN0MsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsdUVBQXVFO0lBQ3ZFLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxLQUFLLEdBQUcsQ0FBQTtJQUN2QixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsOEJBQThCLENBQUMsS0FBYTtJQUN4RCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQy9DLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDaEIsQ0FBQztBQUVELDhDQUE4QztBQUNqQyxRQUFBLGVBQWUsR0FBRyxFQUFFLENBQUE7QUFFakM7Ozs7R0FJRztBQUNILFNBQWdCLFFBQVEsQ0FBQyxJQUFZO0lBQ2pDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyx1QkFBZTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTlDLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsdUJBQWUsQ0FBQyxDQUFDLENBQUE7SUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSTtTQUNmLFNBQVMsQ0FBQyx1QkFBZSxDQUFDO1NBQzFCLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLHVCQUFlLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMzRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUM5QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxLQUFhO0lBQ3BDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDdEMsQ0FBQyJ9
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNjYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3BlcnR5L2VzY2FwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSwwREFFQztBQVNELDhEQTJDQztBQVNELG9FQWNDO0FBUUQsd0VBS0M7QUFVRCw0QkFZQztBQU9ELGdDQUVDO0FBbklELDBDQUFpQztBQUVqQzs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsS0FBYTtJQUNqRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHlCQUF5QixDQUFDLEtBQWE7SUFDbkQscUVBQXFFO0lBQ3JFLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUUxQix5Q0FBeUM7SUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBQSxjQUFHLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBQSxjQUFHLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFDekIsTUFBTSxVQUFVLEdBQUcsSUFBQSxjQUFHLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBQSxjQUFHLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBQSxjQUFHLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBQSxjQUFHLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFFMUIsSUFBSSx3QkFBd0IsR0FBRyxLQUFLLENBQUE7SUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iamcal",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "description": "Read and write ICalendar files",
5
5
  "files": [
6
6
  "/lib",
@@ -1,3 +1,5 @@
1
+ import { ord } from '../patterns'
2
+
1
3
  /**
2
4
  * Escape special characters in a TEXT property value.
3
5
  *
@@ -18,20 +20,48 @@ export function escapeTextPropertyValue(value: string): string {
18
20
  * @see {@link unescapeTextPropertyValue}
19
21
  */
20
22
  export function unescapeTextPropertyValue(value: string): string {
21
- const broadBadEscapePattern = /(?<!\\)\\(\\\\)*[^,;\\nN]/
22
- const broadBadEscape = broadBadEscapePattern.exec(value)
23
- if (broadBadEscape) {
24
- const badEscape = value
25
- .substring(broadBadEscape.index)
26
- .match(/\\[^,;\\nN]/)!
27
- const position = broadBadEscape.index + badEscape.index!
28
- throw new SyntaxError(
29
- `Bad escaped character '${badEscape[0]}' at position ${position}`
30
- )
23
+ /** List that will contain the characters of the unescaped string. */
24
+ const chars: number[] = []
25
+
26
+ // Character codes for special characters
27
+ const backslash = ord('\\')
28
+ const newline = ord('\n')
29
+ const lowercaseN = ord('n')
30
+ const uppercaseN = ord('N')
31
+ const comma = ord(',')
32
+ const semicolon = ord(';')
33
+
34
+ let previousCharWasBackslash = false
35
+ for (let i = 0; i < value.length; i++) {
36
+ const char = value.charCodeAt(i)
37
+
38
+ if (previousCharWasBackslash) {
39
+ // Previous character was a backslash, so this character is the second character in an escape sequence
40
+ if (char === lowercaseN || char === uppercaseN) {
41
+ chars.push(newline)
42
+ } else if (
43
+ char === comma ||
44
+ char === semicolon ||
45
+ char === backslash
46
+ ) {
47
+ chars.push(char)
48
+ } else {
49
+ const position = i - 1
50
+ throw new SyntaxError(
51
+ `Bad escaped character '\\${String.fromCharCode(char)}' at position ${position}`
52
+ )
53
+ }
54
+ // End the escape sequence
55
+ previousCharWasBackslash = false
56
+ } else if (char === backslash) {
57
+ // Start of an escape sequence
58
+ previousCharWasBackslash = true
59
+ } else {
60
+ chars.push(char)
61
+ }
31
62
  }
32
63
 
33
- const jsonValue = value.replace(/\\N/, '\\n').replace(/\\(?=[,;:"])/g, '')
34
- return JSON.parse(`"${jsonValue}"`) as string
64
+ return String.fromCharCode(...chars)
35
65
  }
36
66
 
37
67
  /**