1 | 'use strict'
|
---|
2 |
|
---|
3 | module.exports = uri
|
---|
4 | uri.displayName = 'uri'
|
---|
5 | uri.aliases = ['url']
|
---|
6 | function uri(Prism) {
|
---|
7 | // https://tools.ietf.org/html/rfc3986#appendix-A
|
---|
8 | Prism.languages.uri = {
|
---|
9 | scheme: {
|
---|
10 | pattern: /^[a-z][a-z0-9+.-]*:/im,
|
---|
11 | greedy: true,
|
---|
12 | inside: {
|
---|
13 | 'scheme-delimiter': /:$/
|
---|
14 | }
|
---|
15 | },
|
---|
16 | fragment: {
|
---|
17 | pattern: /#[\w\-.~!$&'()*+,;=%:@/?]*/,
|
---|
18 | inside: {
|
---|
19 | 'fragment-delimiter': /^#/
|
---|
20 | }
|
---|
21 | },
|
---|
22 | query: {
|
---|
23 | pattern: /\?[\w\-.~!$&'()*+,;=%:@/?]*/,
|
---|
24 | inside: {
|
---|
25 | 'query-delimiter': {
|
---|
26 | pattern: /^\?/,
|
---|
27 | greedy: true
|
---|
28 | },
|
---|
29 | 'pair-delimiter': /[&;]/,
|
---|
30 | pair: {
|
---|
31 | pattern: /^[^=][\s\S]*/,
|
---|
32 | inside: {
|
---|
33 | key: /^[^=]+/,
|
---|
34 | value: {
|
---|
35 | pattern: /(^=)[\s\S]+/,
|
---|
36 | lookbehind: true
|
---|
37 | }
|
---|
38 | }
|
---|
39 | }
|
---|
40 | }
|
---|
41 | },
|
---|
42 | authority: {
|
---|
43 | pattern: RegExp(
|
---|
44 | /^\/\//.source + // [ userinfo "@" ]
|
---|
45 | /(?:[\w\-.~!$&'()*+,;=%:]*@)?/.source + // host
|
---|
46 | ('(?:' + // IP-literal
|
---|
47 | /\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\.[\w\-.~!$&'()*+,;=]+)\]/
|
---|
48 | .source +
|
---|
49 | '|' + // IPv4address or registered name
|
---|
50 | /[\w\-.~!$&'()*+,;=%]*/.source +
|
---|
51 | ')') + // [ ":" port ]
|
---|
52 | /(?::\d*)?/.source,
|
---|
53 | 'm'
|
---|
54 | ),
|
---|
55 | inside: {
|
---|
56 | 'authority-delimiter': /^\/\//,
|
---|
57 | 'user-info-segment': {
|
---|
58 | pattern: /^[\w\-.~!$&'()*+,;=%:]*@/,
|
---|
59 | inside: {
|
---|
60 | 'user-info-delimiter': /@$/,
|
---|
61 | 'user-info': /^[\w\-.~!$&'()*+,;=%:]+/
|
---|
62 | }
|
---|
63 | },
|
---|
64 | 'port-segment': {
|
---|
65 | pattern: /:\d*$/,
|
---|
66 | inside: {
|
---|
67 | 'port-delimiter': /^:/,
|
---|
68 | port: /^\d+/
|
---|
69 | }
|
---|
70 | },
|
---|
71 | host: {
|
---|
72 | pattern: /[\s\S]+/,
|
---|
73 | inside: {
|
---|
74 | 'ip-literal': {
|
---|
75 | pattern: /^\[[\s\S]+\]$/,
|
---|
76 | inside: {
|
---|
77 | 'ip-literal-delimiter': /^\[|\]$/,
|
---|
78 | 'ipv-future': /^v[\s\S]+/,
|
---|
79 | 'ipv6-address': /^[\s\S]+/
|
---|
80 | }
|
---|
81 | },
|
---|
82 | 'ipv4-address':
|
---|
83 | /^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/
|
---|
84 | }
|
---|
85 | }
|
---|
86 | }
|
---|
87 | },
|
---|
88 | path: {
|
---|
89 | pattern: /^[\w\-.~!$&'()*+,;=%:@/]+/m,
|
---|
90 | inside: {
|
---|
91 | 'path-separator': /\//
|
---|
92 | }
|
---|
93 | }
|
---|
94 | }
|
---|
95 | Prism.languages.url = Prism.languages.uri
|
---|
96 | }
|
---|