Skip to content

Commit cfd099e

Browse files
authored
feat: align grammar with OpenAPI specification (#77)
Refs OAI/OpenAPI-Specification#4264 Refs #73
1 parent 670dfbe commit cfd099e

File tree

4 files changed

+220
-154
lines changed

4 files changed

+220
-154
lines changed

README.md

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -256,27 +256,24 @@ The Server URL Templating is defined by the following [ABNF](https://tools.ietf.
256256

257257
```abnf
258258
; OpenAPI Server URL templating ABNF syntax
259-
; Aligned with RFC 6570 (https://www.rfc-editor.org/rfc/rfc6570)
260-
server-url-template = 1*( literals / server-variable )
259+
server-url-template = 1*( literals / server-variable ) ; variant of https://www.rfc-editor.org/rfc/rfc6570#section-2
261260
server-variable = "{" server-variable-name "}"
262-
server-variable-name = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" )
263-
literals = 1*( %x21 / %x23-24 / %x26 / %x28-3B / %x3D / %x3F-5B
261+
server-variable-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)
262+
263+
; https://www.rfc-editor.org/rfc/rfc6570#section-2.1
264+
; https://www.rfc-editor.org/errata/eid6937
265+
literals = 1*( %x21 / %x23-24 / %x26-3B / %x3D / %x3F-5B
264266
/ %x5D / %x5F / %x61-7A / %x7E / ucschar / iprivate
265267
/ pct-encoded)
266-
; any Unicode character except: CTL, SP,
267-
; DQUOTE, "'", "%" (aside from pct-encoded),
268-
; "<", ">", "\", "^", "`", "{", "|", "}"
268+
; any Unicode character except: CTL, SP,
269+
; DQUOTE, "%" (aside from pct-encoded),
270+
; "<", ">", "\", "^", "`", "{", "|", "}"
269271
270-
; Characters definitions (from RFC 6570)
271-
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
272+
; https://www.rfc-editor.org/rfc/rfc6570#section-1.5
272273
DIGIT = %x30-39 ; 0-9
273-
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
274-
; case-insensitive
274+
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" ; case-insensitive
275275
276276
pct-encoded = "%" HEXDIG HEXDIG
277-
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
278-
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
279-
/ "*" / "+" / "," / ";" / "="
280277
281278
ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
282279
/ %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD

src/server-url-templating.bnf

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
11
; OpenAPI Server URL templating ABNF syntax
2-
; Aligned with RFC 6570 (https://www.rfc-editor.org/rfc/rfc6570)
3-
server-url-template = 1*( literals / server-variable )
2+
server-url-template = 1*( literals / server-variable ) ; variant of https://www.rfc-editor.org/rfc/rfc6570#section-2
43
server-variable = "{" server-variable-name "}"
5-
server-variable-name = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" )
6-
literals = 1*( %x21 / %x23-24 / %x26 / %x28-3B / %x3D / %x3F-5B
4+
server-variable-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)
5+
6+
; https://www.rfc-editor.org/rfc/rfc6570#section-2.1
7+
; https://www.rfc-editor.org/errata/eid6937
8+
literals = 1*( %x21 / %x23-24 / %x26-3B / %x3D / %x3F-5B
79
/ %x5D / %x5F / %x61-7A / %x7E / ucschar / iprivate
810
/ pct-encoded)
9-
; any Unicode character except: CTL, SP,
10-
; DQUOTE, "'", "%" (aside from pct-encoded),
11-
; "<", ">", "\", "^", "`", "{", "|", "}"
11+
; any Unicode character except: CTL, SP,
12+
; DQUOTE, "%" (aside from pct-encoded),
13+
; "<", ">", "\", "^", "`", "{", "|", "}"
1214

13-
; Characters definitions (from RFC 6570)
14-
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
15+
; https://www.rfc-editor.org/rfc/rfc6570#section-1.5
1516
DIGIT = %x30-39 ; 0-9
16-
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
17-
; case-insensitive
17+
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" ; case-insensitive
1818

1919
pct-encoded = "%" HEXDIG HEXDIG
20-
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
21-
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
22-
/ "*" / "+" / "," / ";" / "="
2320

2421
ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
2522
/ %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD

src/server-url-templating.js

Lines changed: 77 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@
55
export default function grammar(){
66
// ```
77
// SUMMARY
8-
// rules = 12
8+
// rules = 9
99
// udts = 0
10-
// opcodes = 87
10+
// opcodes = 62
1111
// --- ABNF original opcodes
12-
// ALT = 9
12+
// ALT = 6
1313
// CAT = 2
1414
// REP = 3
15-
// RNM = 14
16-
// TLS = 26
15+
// RNM = 9
16+
// TLS = 9
1717
// TBS = 6
1818
// TRG = 27
1919
// --- SABNF superset opcodes
2020
// UDT = 0
2121
// AND = 0
2222
// NOT = 0
23-
// characters = [33 - 1114109]
23+
// characters = [0 - 1114111]
2424
// ```
2525
/* OBJECT IDENTIFIER (for internal parser use) */
2626
this.grammarObject = 'grammarObject';
@@ -31,14 +31,11 @@ export default function grammar(){
3131
this.rules[1] = { name: 'server-variable', lower: 'server-variable', index: 1, isBkr: false };
3232
this.rules[2] = { name: 'server-variable-name', lower: 'server-variable-name', index: 2, isBkr: false };
3333
this.rules[3] = { name: 'literals', lower: 'literals', index: 3, isBkr: false };
34-
this.rules[4] = { name: 'ALPHA', lower: 'alpha', index: 4, isBkr: false };
35-
this.rules[5] = { name: 'DIGIT', lower: 'digit', index: 5, isBkr: false };
36-
this.rules[6] = { name: 'HEXDIG', lower: 'hexdig', index: 6, isBkr: false };
37-
this.rules[7] = { name: 'pct-encoded', lower: 'pct-encoded', index: 7, isBkr: false };
38-
this.rules[8] = { name: 'unreserved', lower: 'unreserved', index: 8, isBkr: false };
39-
this.rules[9] = { name: 'sub-delims', lower: 'sub-delims', index: 9, isBkr: false };
40-
this.rules[10] = { name: 'ucschar', lower: 'ucschar', index: 10, isBkr: false };
41-
this.rules[11] = { name: 'iprivate', lower: 'iprivate', index: 11, isBkr: false };
34+
this.rules[4] = { name: 'DIGIT', lower: 'digit', index: 4, isBkr: false };
35+
this.rules[5] = { name: 'HEXDIG', lower: 'hexdig', index: 5, isBkr: false };
36+
this.rules[6] = { name: 'pct-encoded', lower: 'pct-encoded', index: 6, isBkr: false };
37+
this.rules[7] = { name: 'ucschar', lower: 'ucschar', index: 7, isBkr: false };
38+
this.rules[8] = { name: 'iprivate', lower: 'iprivate', index: 8, isBkr: false };
4239

4340
/* UDTS */
4441
this.udts = [];
@@ -61,137 +58,100 @@ export default function grammar(){
6158
/* server-variable-name */
6259
this.rules[2].opcodes = [];
6360
this.rules[2].opcodes[0] = { type: 3, min: 1, max: Infinity };// REP
64-
this.rules[2].opcodes[1] = { type: 1, children: [2,3,4,5,6] };// ALT
65-
this.rules[2].opcodes[2] = { type: 4, index: 8 };// RNM(unreserved)
66-
this.rules[2].opcodes[3] = { type: 4, index: 7 };// RNM(pct-encoded)
67-
this.rules[2].opcodes[4] = { type: 4, index: 9 };// RNM(sub-delims)
68-
this.rules[2].opcodes[5] = { type: 7, string: [58] };// TLS
69-
this.rules[2].opcodes[6] = { type: 7, string: [64] };// TLS
61+
this.rules[2].opcodes[1] = { type: 1, children: [2,3,4] };// ALT
62+
this.rules[2].opcodes[2] = { type: 5, min: 0, max: 122 };// TRG
63+
this.rules[2].opcodes[3] = { type: 6, string: [124] };// TBS
64+
this.rules[2].opcodes[4] = { type: 5, min: 126, max: 1114111 };// TRG
7065

7166
/* literals */
7267
this.rules[3].opcodes = [];
7368
this.rules[3].opcodes[0] = { type: 3, min: 1, max: Infinity };// REP
74-
this.rules[3].opcodes[1] = { type: 1, children: [2,3,4,5,6,7,8,9,10,11,12,13,14] };// ALT
69+
this.rules[3].opcodes[1] = { type: 1, children: [2,3,4,5,6,7,8,9,10,11,12,13] };// ALT
7570
this.rules[3].opcodes[2] = { type: 6, string: [33] };// TBS
7671
this.rules[3].opcodes[3] = { type: 5, min: 35, max: 36 };// TRG
77-
this.rules[3].opcodes[4] = { type: 6, string: [38] };// TBS
78-
this.rules[3].opcodes[5] = { type: 5, min: 40, max: 59 };// TRG
79-
this.rules[3].opcodes[6] = { type: 6, string: [61] };// TBS
80-
this.rules[3].opcodes[7] = { type: 5, min: 63, max: 91 };// TRG
81-
this.rules[3].opcodes[8] = { type: 6, string: [93] };// TBS
82-
this.rules[3].opcodes[9] = { type: 6, string: [95] };// TBS
83-
this.rules[3].opcodes[10] = { type: 5, min: 97, max: 122 };// TRG
84-
this.rules[3].opcodes[11] = { type: 6, string: [126] };// TBS
85-
this.rules[3].opcodes[12] = { type: 4, index: 10 };// RNM(ucschar)
86-
this.rules[3].opcodes[13] = { type: 4, index: 11 };// RNM(iprivate)
87-
this.rules[3].opcodes[14] = { type: 4, index: 7 };// RNM(pct-encoded)
88-
89-
/* ALPHA */
90-
this.rules[4].opcodes = [];
91-
this.rules[4].opcodes[0] = { type: 1, children: [1,2] };// ALT
92-
this.rules[4].opcodes[1] = { type: 5, min: 65, max: 90 };// TRG
93-
this.rules[4].opcodes[2] = { type: 5, min: 97, max: 122 };// TRG
72+
this.rules[3].opcodes[4] = { type: 5, min: 38, max: 59 };// TRG
73+
this.rules[3].opcodes[5] = { type: 6, string: [61] };// TBS
74+
this.rules[3].opcodes[6] = { type: 5, min: 63, max: 91 };// TRG
75+
this.rules[3].opcodes[7] = { type: 6, string: [93] };// TBS
76+
this.rules[3].opcodes[8] = { type: 6, string: [95] };// TBS
77+
this.rules[3].opcodes[9] = { type: 5, min: 97, max: 122 };// TRG
78+
this.rules[3].opcodes[10] = { type: 6, string: [126] };// TBS
79+
this.rules[3].opcodes[11] = { type: 4, index: 7 };// RNM(ucschar)
80+
this.rules[3].opcodes[12] = { type: 4, index: 8 };// RNM(iprivate)
81+
this.rules[3].opcodes[13] = { type: 4, index: 6 };// RNM(pct-encoded)
9482

9583
/* DIGIT */
96-
this.rules[5].opcodes = [];
97-
this.rules[5].opcodes[0] = { type: 5, min: 48, max: 57 };// TRG
84+
this.rules[4].opcodes = [];
85+
this.rules[4].opcodes[0] = { type: 5, min: 48, max: 57 };// TRG
9886

9987
/* HEXDIG */
100-
this.rules[6].opcodes = [];
101-
this.rules[6].opcodes[0] = { type: 1, children: [1,2,3,4,5,6,7] };// ALT
102-
this.rules[6].opcodes[1] = { type: 4, index: 5 };// RNM(DIGIT)
103-
this.rules[6].opcodes[2] = { type: 7, string: [97] };// TLS
104-
this.rules[6].opcodes[3] = { type: 7, string: [98] };// TLS
105-
this.rules[6].opcodes[4] = { type: 7, string: [99] };// TLS
106-
this.rules[6].opcodes[5] = { type: 7, string: [100] };// TLS
107-
this.rules[6].opcodes[6] = { type: 7, string: [101] };// TLS
108-
this.rules[6].opcodes[7] = { type: 7, string: [102] };// TLS
88+
this.rules[5].opcodes = [];
89+
this.rules[5].opcodes[0] = { type: 1, children: [1,2,3,4,5,6,7] };// ALT
90+
this.rules[5].opcodes[1] = { type: 4, index: 4 };// RNM(DIGIT)
91+
this.rules[5].opcodes[2] = { type: 7, string: [97] };// TLS
92+
this.rules[5].opcodes[3] = { type: 7, string: [98] };// TLS
93+
this.rules[5].opcodes[4] = { type: 7, string: [99] };// TLS
94+
this.rules[5].opcodes[5] = { type: 7, string: [100] };// TLS
95+
this.rules[5].opcodes[6] = { type: 7, string: [101] };// TLS
96+
this.rules[5].opcodes[7] = { type: 7, string: [102] };// TLS
10997

11098
/* pct-encoded */
111-
this.rules[7].opcodes = [];
112-
this.rules[7].opcodes[0] = { type: 2, children: [1,2,3] };// CAT
113-
this.rules[7].opcodes[1] = { type: 7, string: [37] };// TLS
114-
this.rules[7].opcodes[2] = { type: 4, index: 6 };// RNM(HEXDIG)
115-
this.rules[7].opcodes[3] = { type: 4, index: 6 };// RNM(HEXDIG)
116-
117-
/* unreserved */
118-
this.rules[8].opcodes = [];
119-
this.rules[8].opcodes[0] = { type: 1, children: [1,2,3,4,5,6] };// ALT
120-
this.rules[8].opcodes[1] = { type: 4, index: 4 };// RNM(ALPHA)
121-
this.rules[8].opcodes[2] = { type: 4, index: 5 };// RNM(DIGIT)
122-
this.rules[8].opcodes[3] = { type: 7, string: [45] };// TLS
123-
this.rules[8].opcodes[4] = { type: 7, string: [46] };// TLS
124-
this.rules[8].opcodes[5] = { type: 7, string: [95] };// TLS
125-
this.rules[8].opcodes[6] = { type: 7, string: [126] };// TLS
126-
127-
/* sub-delims */
128-
this.rules[9].opcodes = [];
129-
this.rules[9].opcodes[0] = { type: 1, children: [1,2,3,4,5,6,7,8,9,10,11] };// ALT
130-
this.rules[9].opcodes[1] = { type: 7, string: [33] };// TLS
131-
this.rules[9].opcodes[2] = { type: 7, string: [36] };// TLS
132-
this.rules[9].opcodes[3] = { type: 7, string: [38] };// TLS
133-
this.rules[9].opcodes[4] = { type: 7, string: [39] };// TLS
134-
this.rules[9].opcodes[5] = { type: 7, string: [40] };// TLS
135-
this.rules[9].opcodes[6] = { type: 7, string: [41] };// TLS
136-
this.rules[9].opcodes[7] = { type: 7, string: [42] };// TLS
137-
this.rules[9].opcodes[8] = { type: 7, string: [43] };// TLS
138-
this.rules[9].opcodes[9] = { type: 7, string: [44] };// TLS
139-
this.rules[9].opcodes[10] = { type: 7, string: [59] };// TLS
140-
this.rules[9].opcodes[11] = { type: 7, string: [61] };// TLS
99+
this.rules[6].opcodes = [];
100+
this.rules[6].opcodes[0] = { type: 2, children: [1,2,3] };// CAT
101+
this.rules[6].opcodes[1] = { type: 7, string: [37] };// TLS
102+
this.rules[6].opcodes[2] = { type: 4, index: 5 };// RNM(HEXDIG)
103+
this.rules[6].opcodes[3] = { type: 4, index: 5 };// RNM(HEXDIG)
141104

142105
/* ucschar */
143-
this.rules[10].opcodes = [];
144-
this.rules[10].opcodes[0] = { type: 1, children: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] };// ALT
145-
this.rules[10].opcodes[1] = { type: 5, min: 160, max: 55295 };// TRG
146-
this.rules[10].opcodes[2] = { type: 5, min: 63744, max: 64975 };// TRG
147-
this.rules[10].opcodes[3] = { type: 5, min: 65008, max: 65519 };// TRG
148-
this.rules[10].opcodes[4] = { type: 5, min: 65536, max: 131069 };// TRG
149-
this.rules[10].opcodes[5] = { type: 5, min: 131072, max: 196605 };// TRG
150-
this.rules[10].opcodes[6] = { type: 5, min: 196608, max: 262141 };// TRG
151-
this.rules[10].opcodes[7] = { type: 5, min: 262144, max: 327677 };// TRG
152-
this.rules[10].opcodes[8] = { type: 5, min: 327680, max: 393213 };// TRG
153-
this.rules[10].opcodes[9] = { type: 5, min: 393216, max: 458749 };// TRG
154-
this.rules[10].opcodes[10] = { type: 5, min: 458752, max: 524285 };// TRG
155-
this.rules[10].opcodes[11] = { type: 5, min: 524288, max: 589821 };// TRG
156-
this.rules[10].opcodes[12] = { type: 5, min: 589824, max: 655357 };// TRG
157-
this.rules[10].opcodes[13] = { type: 5, min: 655360, max: 720893 };// TRG
158-
this.rules[10].opcodes[14] = { type: 5, min: 720896, max: 786429 };// TRG
159-
this.rules[10].opcodes[15] = { type: 5, min: 786432, max: 851965 };// TRG
160-
this.rules[10].opcodes[16] = { type: 5, min: 851968, max: 917501 };// TRG
161-
this.rules[10].opcodes[17] = { type: 5, min: 921600, max: 983037 };// TRG
106+
this.rules[7].opcodes = [];
107+
this.rules[7].opcodes[0] = { type: 1, children: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] };// ALT
108+
this.rules[7].opcodes[1] = { type: 5, min: 160, max: 55295 };// TRG
109+
this.rules[7].opcodes[2] = { type: 5, min: 63744, max: 64975 };// TRG
110+
this.rules[7].opcodes[3] = { type: 5, min: 65008, max: 65519 };// TRG
111+
this.rules[7].opcodes[4] = { type: 5, min: 65536, max: 131069 };// TRG
112+
this.rules[7].opcodes[5] = { type: 5, min: 131072, max: 196605 };// TRG
113+
this.rules[7].opcodes[6] = { type: 5, min: 196608, max: 262141 };// TRG
114+
this.rules[7].opcodes[7] = { type: 5, min: 262144, max: 327677 };// TRG
115+
this.rules[7].opcodes[8] = { type: 5, min: 327680, max: 393213 };// TRG
116+
this.rules[7].opcodes[9] = { type: 5, min: 393216, max: 458749 };// TRG
117+
this.rules[7].opcodes[10] = { type: 5, min: 458752, max: 524285 };// TRG
118+
this.rules[7].opcodes[11] = { type: 5, min: 524288, max: 589821 };// TRG
119+
this.rules[7].opcodes[12] = { type: 5, min: 589824, max: 655357 };// TRG
120+
this.rules[7].opcodes[13] = { type: 5, min: 655360, max: 720893 };// TRG
121+
this.rules[7].opcodes[14] = { type: 5, min: 720896, max: 786429 };// TRG
122+
this.rules[7].opcodes[15] = { type: 5, min: 786432, max: 851965 };// TRG
123+
this.rules[7].opcodes[16] = { type: 5, min: 851968, max: 917501 };// TRG
124+
this.rules[7].opcodes[17] = { type: 5, min: 921600, max: 983037 };// TRG
162125

163126
/* iprivate */
164-
this.rules[11].opcodes = [];
165-
this.rules[11].opcodes[0] = { type: 1, children: [1,2,3] };// ALT
166-
this.rules[11].opcodes[1] = { type: 5, min: 57344, max: 63743 };// TRG
167-
this.rules[11].opcodes[2] = { type: 5, min: 983040, max: 1048573 };// TRG
168-
this.rules[11].opcodes[3] = { type: 5, min: 1048576, max: 1114109 };// TRG
127+
this.rules[8].opcodes = [];
128+
this.rules[8].opcodes[0] = { type: 1, children: [1,2,3] };// ALT
129+
this.rules[8].opcodes[1] = { type: 5, min: 57344, max: 63743 };// TRG
130+
this.rules[8].opcodes[2] = { type: 5, min: 983040, max: 1048573 };// TRG
131+
this.rules[8].opcodes[3] = { type: 5, min: 1048576, max: 1114109 };// TRG
169132

170133
// The `toString()` function will display the original grammar file(s) that produced these opcodes.
171134
this.toString = function toString(){
172135
let str = "";
173136
str += "; OpenAPI Server URL templating ABNF syntax\n";
174-
str += "; Aligned with RFC 6570 (https://www.rfc-editor.org/rfc/rfc6570)\n";
175-
str += "server-url-template = 1*( literals / server-variable )\n";
137+
str += "server-url-template = 1*( literals / server-variable ) ; variant of https://www.rfc-editor.org/rfc/rfc6570#section-2\n";
176138
str += "server-variable = \"{\" server-variable-name \"}\"\n";
177-
str += "server-variable-name = 1*( unreserved / pct-encoded / sub-delims / \":\" / \"@\" )\n";
178-
str += "literals = 1*( %x21 / %x23-24 / %x26 / %x28-3B / %x3D / %x3F-5B\n";
139+
str += "server-variable-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)\n";
140+
str += "\n";
141+
str += "; https://www.rfc-editor.org/rfc/rfc6570#section-2.1\n";
142+
str += "; https://www.rfc-editor.org/errata/eid6937\n";
143+
str += "literals = 1*( %x21 / %x23-24 / %x26-3B / %x3D / %x3F-5B\n";
179144
str += " / %x5D / %x5F / %x61-7A / %x7E / ucschar / iprivate\n";
180145
str += " / pct-encoded)\n";
181-
str += " ; any Unicode character except: CTL, SP,\n";
182-
str += " ; DQUOTE, \"'\", \"%\" (aside from pct-encoded),\n";
183-
str += " ; \"<\", \">\", \"\\\", \"^\", \"`\", \"{\", \"|\", \"}\"\n";
146+
str += " ; any Unicode character except: CTL, SP,\n";
147+
str += " ; DQUOTE, \"%\" (aside from pct-encoded),\n";
148+
str += " ; \"<\", \">\", \"\\\", \"^\", \"`\", \"{\", \"|\", \"}\"\n";
184149
str += "\n";
185-
str += "; Characters definitions (from RFC 6570)\n";
186-
str += "ALPHA = %x41-5A / %x61-7A ; A-Z / a-z\n";
150+
str += "; https://www.rfc-editor.org/rfc/rfc6570#section-1.5\n";
187151
str += "DIGIT = %x30-39 ; 0-9\n";
188-
str += "HEXDIG = DIGIT / \"A\" / \"B\" / \"C\" / \"D\" / \"E\" / \"F\"\n";
189-
str += " ; case-insensitive\n";
152+
str += "HEXDIG = DIGIT / \"A\" / \"B\" / \"C\" / \"D\" / \"E\" / \"F\" ; case-insensitive\n";
190153
str += "\n";
191154
str += "pct-encoded = \"%\" HEXDIG HEXDIG\n";
192-
str += "unreserved = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n";
193-
str += "sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n";
194-
str += " / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n";
195155
str += "\n";
196156
str += "ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF\n";
197157
str += " / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD\n";

0 commit comments

Comments
 (0)