mirror of
https://github.com/discourse/discourse.git
synced 2025-04-19 21:09:11 +08:00
UX: when pasting a link use linkify rules
This commit is contained in:
parent
0009498901
commit
f37bffdf6c
@ -50,6 +50,13 @@ export function generateCookFunction(options) {
|
||||
});
|
||||
}
|
||||
|
||||
export function generateLinkifyFunction(options) {
|
||||
return loadMarkdownIt().then(() => {
|
||||
const prettyText = createPrettyText(options);
|
||||
return prettyText.opts.engine.linkify;
|
||||
});
|
||||
}
|
||||
|
||||
export function sanitize(text, options) {
|
||||
return textSanitize(text, new AllowLister(options));
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { bind } from "discourse-common/utils/decorators";
|
||||
import Mixin from "@ember/object/mixin";
|
||||
import { generateLinkifyFunction } from "discourse/lib/text";
|
||||
import toMarkdown from "discourse/lib/to-markdown";
|
||||
import { action } from "@ember/object";
|
||||
import { isEmpty } from "@ember/utils";
|
||||
@ -17,6 +18,14 @@ const isInside = (text, regex) => {
|
||||
};
|
||||
|
||||
export default Mixin.create({
|
||||
init() {
|
||||
this._super(...arguments);
|
||||
generateLinkifyFunction(this.markdownOptions || {}).then((linkify) => {
|
||||
// When pasting links, we should use the same rules to match links as we do when creating links for a cooked post.
|
||||
this._cachedLinkify = linkify;
|
||||
});
|
||||
},
|
||||
|
||||
// ensures textarea scroll position is correct
|
||||
_focusTextArea() {
|
||||
schedule("afterRender", () => {
|
||||
@ -273,16 +282,22 @@ export default Mixin.create({
|
||||
}
|
||||
}
|
||||
|
||||
if (plainText && !handled && selected.end > selected.start) {
|
||||
let isURL;
|
||||
try {
|
||||
isURL = !!new URL(plainText);
|
||||
} catch {
|
||||
isURL = false;
|
||||
}
|
||||
if (isURL) {
|
||||
this._addText(selected, `[${selectedValue}](${plainText})`);
|
||||
handled = true;
|
||||
if (
|
||||
this._cachedLinkify &&
|
||||
plainText &&
|
||||
!handled &&
|
||||
selected.end > selected.start
|
||||
) {
|
||||
if (this._cachedLinkify.test(plainText)) {
|
||||
const match = this._cachedLinkify.match(plainText)[0];
|
||||
if (
|
||||
match &&
|
||||
match.index === 0 &&
|
||||
match.lastIndex === match.raw.length
|
||||
) {
|
||||
this._addText(selected, `[${selectedValue}](${match.url})`);
|
||||
handled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user