Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Fix linkification and bump linkifyjs dep #460

Merged
merged 1 commit into from
Sep 13, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"fuse.js": "^2.2.0",
"glob": "^5.0.14",
"highlight.js": "^8.9.1",
"linkifyjs": "2.0.0-beta.4",
"linkifyjs": "2.1.0",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the reason this was pinned to that particular version was due to element-hq/element-web#2010 - can you check it doesn't reintroduce that regression?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does, I'll update and revert this change. The actual fix here is to modify the states and transitions used, so that is all that's required.

"lodash": "^4.13.1",
"marked": "^0.3.5",
"matrix-js-sdk": "matrix-org/matrix-js-sdk#develop",
Expand Down
62 changes: 35 additions & 27 deletions src/linkify-matrix.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,76 +23,84 @@ function matrixLinkify(linkify) {
var S_START = linkify.parser.start;


var ROOMALIAS = function(value) {
MultiToken.call(this, value);
this.type = 'roomalias';
this.isLink = true;
};
ROOMALIAS.prototype = new MultiToken();

var S_HASH = new linkify.parser.State();
function ROOMALIAS(value) {
this.v = value;
}
linkify.inherits(MultiToken, ROOMALIAS, {
type: 'roomalias',
isLink: true,
});

var S_HASH = S_START.jump(TT.POUND);
var S_HASH_NAME = new linkify.parser.State();
var S_HASH_NAME_COLON = new linkify.parser.State();
var S_HASH_NAME_COLON_DOMAIN = new linkify.parser.State();
var S_HASH_NAME_COLON_DOMAIN_DOT = new linkify.parser.State();
var S_ROOMALIAS = new linkify.parser.State(ROOMALIAS);

// WTF!? It is absolutely crazy that these have to be listed out this way,
// TT.DOMAIN should've covered all of them!

const localpart_tokens = [
TT.DOMAIN,
TT.TLD,
TT.LOCALHOST,
TT.NUM,
TT.UNDERSCORE,
];

var roomname_tokens = [
TT.POUND,
TT.UNDERSCORE,
TT.DOT,
TT.PLUS,
TT.NUM,
TT.DOMAIN,
TT.TLD
TT.LOCALHOST
];

S_START.on(TT.POUND, S_HASH);

S_HASH.on(roomname_tokens, S_HASH_NAME);
S_HASH_NAME.on(roomname_tokens, S_HASH_NAME);
S_HASH_NAME.on(TT.DOMAIN, S_HASH_NAME);

S_HASH_NAME.on(TT.COLON, S_HASH_NAME_COLON);

S_HASH_NAME_COLON.on(TT.DOMAIN, S_HASH_NAME_COLON_DOMAIN);
S_HASH_NAME_COLON_DOMAIN.on(TT.DOT, S_HASH_NAME_COLON_DOMAIN_DOT);
S_HASH_NAME_COLON_DOMAIN_DOT.on(TT.DOMAIN, S_HASH_NAME_COLON_DOMAIN);
S_HASH_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_ROOMALIAS);
S_HASH_NAME_COLON.on(localpart_tokens, S_ROOMALIAS);
S_ROOMALIAS.on(TT.DOT, S_HASH_NAME_COLON);


var USERID = function(value) {
MultiToken.call(this, value);
this.type = 'userid';
this.isLink = true;
this.v = value;
};
USERID.prototype = new MultiToken();
linkify.inherits(MultiToken, USERID, {
type: 'userid',
isLink: true,
});

var S_AT = new linkify.parser.State();
var S_AT_NAME = new linkify.parser.State();
var S_AT_NAME_COLON = new linkify.parser.State();
var S_AT_NAME_COLON_DOMAIN = new linkify.parser.State();
var S_AT_NAME_COLON_DOMAIN_DOT = new linkify.parser.State();
var S_USERID = new linkify.parser.State(USERID);

var username_tokens = [
TT.DOT,
TT.UNDERSCORE,
TT.PLUS,
TT.NUM,
TT.DOMAIN,
TT.TLD
TT.TLD,
TT.LOCALHOST,
];

S_START.on(TT.AT, S_AT);

S_AT.on(username_tokens, S_AT_NAME);
S_AT_NAME.on(username_tokens, S_AT_NAME);
S_AT_NAME.on(TT.DOMAIN, S_AT_NAME);

S_AT_NAME.on(TT.COLON, S_AT_NAME_COLON);

S_AT_NAME_COLON.on(TT.DOMAIN, S_AT_NAME_COLON_DOMAIN);
S_AT_NAME_COLON_DOMAIN.on(TT.DOT, S_AT_NAME_COLON_DOMAIN_DOT);
S_AT_NAME_COLON_DOMAIN_DOT.on(TT.DOMAIN, S_AT_NAME_COLON_DOMAIN);
S_AT_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_USERID);
S_AT_NAME_COLON.on(localpart_tokens, S_USERID);
S_USERID.on(TT.DOT, S_AT_NAME_COLON);
}

// stubs, overwritten in MatrixChat's componentDidMount
Expand Down