@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
99 lines • 3.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var prosemirror_1 = require("../../prosemirror");
var LinkifyIt = require("linkify-it");
var linkify = LinkifyIt();
linkify.add('sourcetree:', 'http:');
function getLinkMatch(str) {
var match = str && linkify.match(str);
return match && match[0];
}
exports.getLinkMatch = getLinkMatch;
/**
* Instance of class LinkMatcher are used in autoformatting in place of Regex.
* Hence it has been made similar to regex with an exec method.
* Extending it directly from class Regex was introducing some issues, thus that has been avoided.
*/
var LinkMatcher = (function () {
function LinkMatcher() {
}
LinkMatcher.prototype.exec = function (str) {
if (str[str.length - 1] === ' ') {
var strSplit = str.slice(0, str.length - 1).split(' ');
var match = linkify.match(strSplit[strSplit.length - 1]);
if (match && match.length > 0) {
var lastMatch = match[match.length - 1];
lastMatch.length = lastMatch.lastIndex - lastMatch.index + 1;
return [lastMatch];
}
}
return null;
};
return LinkMatcher;
}());
exports.LinkMatcher = LinkMatcher;
/**
* Adds protocol to url if needed.
*/
function normalizeUrl(url) {
var match = getLinkMatch(url);
return (match && match.url) || url;
}
exports.normalizeUrl = normalizeUrl;
function linkifyContent(schema, slice) {
var fragment = linkinfyFragment(schema, slice.content);
if (fragment) {
return new prosemirror_1.Slice(fragment, slice.openStart, slice.openEnd);
}
}
exports.linkifyContent = linkifyContent;
function linkinfyFragment(schema, fragment) {
var linkified = [];
var _loop_1 = function (i, len) {
var child = fragment.child(i);
if (child.type === schema.nodes.table) {
return { value: void 0 };
}
if (child.isText) {
var text = child.textContent;
var link_1 = child.type.schema.marks['link'];
var matches = findLinkMatches(text);
var pos_1 = 0;
matches.forEach(function (match) {
if (match.start > 0) {
linkified.push(child.cut(pos_1, match.start));
}
linkified.push(child.cut(match.start, match.end).mark(link_1.create({ href: normalizeUrl(match.href) }).addToSet(child.marks)));
pos_1 = match.end;
});
if (pos_1 < text.length) {
linkified.push(child.cut(pos_1));
}
}
else {
linkified.push(child.copy(linkinfyFragment(schema, child.content)));
}
};
for (var i = 0, len = fragment.childCount; i < len; i++) {
var state_1 = _loop_1(i, len);
if (typeof state_1 === "object")
return state_1.value;
}
return prosemirror_1.Fragment.fromArray(linkified);
}
function findLinkMatches(text) {
var matches = [];
var linkMatches = text && linkify.match(text);
if (linkMatches && linkMatches.length > 0) {
linkMatches.forEach(function (match) {
matches.push({
start: match.index,
end: match.lastIndex,
title: match.raw,
href: match.url,
});
});
}
return matches;
}
//# sourceMappingURL=utils.js.map