@@ -38,72 +38,63 @@ export enum Type {
38
38
RoomAlias = "roomalias" ,
39
39
}
40
40
41
- // Linkify stuff doesn't type scanner/parser/utils properly :/
42
41
function matrixOpaqueIdLinkifyParser ( {
43
42
scanner,
44
43
parser,
45
- utils,
46
44
token,
47
45
name,
48
46
} : {
49
- scanner : any ;
50
- parser : any ;
51
- utils : any ;
47
+ scanner : linkifyjs . ScannerInit ;
48
+ parser : linkifyjs . ParserInit ;
52
49
token : "#" | "+" | "@" ;
53
50
name : Type ;
54
51
} ) : void {
55
52
const {
56
53
DOT ,
57
54
// IPV4 necessity
58
55
NUM ,
59
- TLD ,
60
56
COLON ,
61
57
SYM ,
62
58
SLASH ,
63
59
EQUALS ,
64
60
HYPHEN ,
65
61
UNDERSCORE ,
66
- // because 'localhost' is tokenised to the localhost token,
67
- // usernames @localhost :foo.com are otherwise not matched!
68
- LOCALHOST ,
69
- domain,
70
62
} = scanner . tokens ;
71
63
72
- const S_START = parser . start ;
73
- const matrixSymbol = utils . createTokenClass ( name , { isLink : true } ) ;
64
+ // Contains NUM, WORD, UWORD, EMOJI, TLD, UTLD, SCHEME, SLASH_SCHEME and LOCALHOST plus custom protocols (e.g. "matrix")
65
+ const { domain } = scanner . tokens . groups ;
74
66
75
- const localpartTokens = [ domain , TLD , DOT , LOCALHOST , SYM , SLASH , EQUALS , UNDERSCORE , HYPHEN ] ;
76
- const domainpartTokens = [ domain , TLD , LOCALHOST , HYPHEN ] ;
67
+ // Tokens we need that are not contained in the domain group
68
+ const additionalLocalpartTokens = [ DOT , SYM , SLASH , EQUALS , UNDERSCORE , HYPHEN ] ;
69
+ const additionalDomainpartTokens = [ HYPHEN ] ;
77
70
78
- const INITIAL_STATE = S_START . tt ( token ) ;
71
+ const matrixToken = linkifyjs . createTokenClass ( name , { isLink : true } ) ;
72
+ const matrixTokenState = new linkifyjs . State ( matrixToken ) as any as linkifyjs . State < linkifyjs . MultiToken > ; // linkify doesn't appear to type this correctly
79
73
80
- const LOCALPART_STATE = INITIAL_STATE . tt ( domain ) ;
81
- for ( const token of localpartTokens ) {
82
- INITIAL_STATE . tt ( token , LOCALPART_STATE ) ;
83
- LOCALPART_STATE . tt ( token , LOCALPART_STATE ) ;
84
- }
85
- const LOCALPART_STATE_DOT = LOCALPART_STATE . tt ( DOT ) ;
86
- for ( const token of localpartTokens ) {
87
- LOCALPART_STATE_DOT . tt ( token , LOCALPART_STATE ) ;
88
- }
74
+ const matrixTokenWithPort = linkifyjs . createTokenClass ( name , { isLink : true } ) ;
75
+ const matrixTokenWithPortState = new linkifyjs . State (
76
+ matrixTokenWithPort ,
77
+ ) as any as linkifyjs . State < linkifyjs . MultiToken > ; // linkify doesn't appear to type this correctly
89
78
90
- const DOMAINPART_STATE_DOT = LOCALPART_STATE . tt ( COLON ) ;
91
- const DOMAINPART_STATE = DOMAINPART_STATE_DOT . tt ( domain ) ;
92
- DOMAINPART_STATE . tt ( DOT , DOMAINPART_STATE_DOT ) ;
93
- for ( const token of domainpartTokens ) {
94
- DOMAINPART_STATE . tt ( token , DOMAINPART_STATE ) ;
95
- // we are done if we have a domain
96
- DOMAINPART_STATE . tt ( token , matrixSymbol ) ;
97
- }
98
-
99
- // accept repeated TLDs (e.g .org.uk) but do not accept double dots: ..
100
- for ( const token of domainpartTokens ) {
101
- DOMAINPART_STATE_DOT . tt ( token , DOMAINPART_STATE ) ;
102
- }
79
+ const INITIAL_STATE = parser . start . tt ( token ) ;
103
80
104
- const PORT_STATE = DOMAINPART_STATE . tt ( COLON ) ;
81
+ // Localpart
82
+ const LOCALPART_STATE = new linkifyjs . State < linkifyjs . MultiToken > ( ) ;
83
+ INITIAL_STATE . ta ( domain , LOCALPART_STATE ) ;
84
+ INITIAL_STATE . ta ( additionalLocalpartTokens , LOCALPART_STATE ) ;
85
+ LOCALPART_STATE . ta ( domain , LOCALPART_STATE ) ;
86
+ LOCALPART_STATE . ta ( additionalLocalpartTokens , LOCALPART_STATE ) ;
105
87
106
- PORT_STATE . tt ( NUM , matrixSymbol ) ;
88
+ // Domainpart
89
+ const DOMAINPART_STATE_DOT = LOCALPART_STATE . tt ( COLON ) ;
90
+ DOMAINPART_STATE_DOT . ta ( domain , matrixTokenState ) ;
91
+ DOMAINPART_STATE_DOT . ta ( additionalDomainpartTokens , matrixTokenState ) ;
92
+ matrixTokenState . ta ( domain , matrixTokenState ) ;
93
+ matrixTokenState . ta ( additionalDomainpartTokens , matrixTokenState ) ;
94
+ matrixTokenState . tt ( DOT , DOMAINPART_STATE_DOT ) ;
95
+
96
+ // Port suffixes
97
+ matrixTokenState . tt ( COLON ) . tt ( NUM , matrixTokenWithPortState ) ;
107
98
}
108
99
109
100
function onUserClick ( event : MouseEvent , userId : string ) : void {
@@ -231,23 +222,21 @@ export const options: Opts = {
231
222
} ;
232
223
233
224
// Run the plugins
234
- registerPlugin ( Type . RoomAlias , ( { scanner, parser, utils } : any ) => {
225
+ registerPlugin ( Type . RoomAlias , ( { scanner, parser } ) => {
235
226
const token = scanner . tokens . POUND as "#" ;
236
227
matrixOpaqueIdLinkifyParser ( {
237
228
scanner,
238
229
parser,
239
- utils,
240
230
token,
241
231
name : Type . RoomAlias ,
242
232
} ) ;
243
233
} ) ;
244
234
245
- registerPlugin ( Type . UserId , ( { scanner, parser, utils } : any ) => {
235
+ registerPlugin ( Type . UserId , ( { scanner, parser } ) => {
246
236
const token = scanner . tokens . AT as "@" ;
247
237
matrixOpaqueIdLinkifyParser ( {
248
238
scanner,
249
239
parser,
250
- utils,
251
240
token,
252
241
name : Type . UserId ,
253
242
} ) ;
0 commit comments