forked from cujojs/rest
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrfc5988.pegjs
73 lines (60 loc) · 1.5 KB
/
rfc5988.pegjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
* Copyright 2013 the original author or authors
* @license MIT, see LICENSE.txt for details
*
* @author Scott Andrews
*/
start =
start:(i:LinkValue OptionalSP ',' OptionalSP {return i;})* last:LinkValue
{ return start.concat([last]) }
LinkValue =
'<' href:URIReference '>' OptionalSP params:LinkParams*
{
var link = {};
params.forEach(function (param) {
link[param[0]] = param[1];
});
link.href = href;
return link;
}
LinkParams =
';' OptionalSP param:LinkParam OptionalSP
{ return param }
URIReference =
// TODO see http://tools.ietf.org/html/rfc3987#section-3.1
url:[^>]+
{ return url.join('') }
LinkParam =
name:LinkParamName value:LinkParamValue?
{ return [name, value] }
LinkParamName =
name:[a-z]+
{ return name.join('') }
LinkParamValue =
"=" str:(PToken / QuotedString)
{ return str }
PToken =
token:PTokenChar+
{ return token.join('') }
PTokenChar = '!' / '#' / '$' / '%' / '&' / "'" / '('
/ ')' / '*' / '+' / '-' / '.' / '|' / Digit
/ ':' / '<' / '=' / '>' / '?' / '@' / Alpha
/ '[' / ']' / '^' / '_' / '`' / '{' / [//]
/ '}' / '~'
OptionalSP =
SP*
QuotedString =
DQ str:QuotedStringInternal DQ
{ return str }
QuotedStringInternal =
str:(QDText / QuotedPair )*
{ return str.join('') }
Char = [\x00-\x7F]
UpAlpha = [A-Z]
LoAlpha = [a-z]
Alpha = UpAlpha / LoAlpha
Digit = [0-9]
SP = [\x20]
DQ = [\x22]
QDText = [^"]
QuotedPair = [\\] Char