mirror of
https://github.com/discourse/discourse.git
synced 2025-01-30 21:52:00 +08:00
FIX: Allow new hashtag HTML to be quoted to markdown (#19117)
Follow up from d3f02a1270
This commit fixes post quoting so that if the new
hashtag-cooked HTML is selected, we convert back to
a regular plain text #hashtag with the correct type and ref.
This commit is contained in:
parent
86ae75f8d5
commit
3846b6248f
|
@ -315,6 +315,18 @@ export class Tag {
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ("hashtag-cooked" === attr.class) {
|
||||||
|
if (attr["data-ref"]) {
|
||||||
|
return `#${attr["data-ref"]}`;
|
||||||
|
} else {
|
||||||
|
let type = "";
|
||||||
|
if (attr["data-type"]) {
|
||||||
|
type = `::${attr["data-type"]}`;
|
||||||
|
}
|
||||||
|
return `#${attr["data-slug"]}${type}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let img;
|
let img;
|
||||||
if (
|
if (
|
||||||
["lightbox", "d-lazyload"].includes(attr.class) &&
|
["lightbox", "d-lazyload"].includes(attr.class) &&
|
||||||
|
|
|
@ -353,6 +353,30 @@ helloWorld();</code>consectetur.`;
|
||||||
assert.strictEqual(toMarkdown(html), markdown);
|
assert.strictEqual(toMarkdown(html), markdown);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("keeps hashtag-cooked and converts to bare hashtag with type", function (assert) {
|
||||||
|
const html = `
|
||||||
|
<p dir="ltr">This is <a class="hashtag-cooked" href="/c/ux/14" data-type="category" data-slug="ux">
|
||||||
|
<svg class="fa d-icon d-icon-folder svg-icon svg-node">
|
||||||
|
<use href="#folder"></use>
|
||||||
|
</svg>
|
||||||
|
<span>ux</span>
|
||||||
|
</a> and <a class="hashtag-cooked" href="/tag/design" data-slug="design">
|
||||||
|
<svg class="fa d-icon d-icon-tag svg-icon svg-node">
|
||||||
|
<use href="#tag"></use>
|
||||||
|
</svg>
|
||||||
|
<span>design</span>
|
||||||
|
</a> and <a class="hashtag-cooked" href="/c/uncategorized/design/22" data-type="category" data-slug="design" data-ref="uncategorized:design">
|
||||||
|
<svg class="fa d-icon d-icon-folder svg-icon svg-node">
|
||||||
|
<use href="#folder"></use>
|
||||||
|
</svg>
|
||||||
|
<span>design</span>
|
||||||
|
</a></p>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const markdown = `This is #ux::category and #design and #uncategorized:design`;
|
||||||
|
assert.strictEqual(toMarkdown(html), markdown);
|
||||||
|
});
|
||||||
|
|
||||||
test("keeps emoji and removes click count", function (assert) {
|
test("keeps emoji and removes click count", function (assert) {
|
||||||
const html = `
|
const html = `
|
||||||
<p>
|
<p>
|
||||||
|
|
|
@ -25,12 +25,22 @@ function addHashtag(buffer, matches, state) {
|
||||||
let token;
|
let token;
|
||||||
if (result) {
|
if (result) {
|
||||||
token = new state.Token("link_open", "a", 1);
|
token = new state.Token("link_open", "a", 1);
|
||||||
|
|
||||||
|
// Data attributes here are used later on for things like quoting
|
||||||
|
// HTML-to-markdown
|
||||||
token.attrs = [
|
token.attrs = [
|
||||||
["class", "hashtag-cooked"],
|
["class", "hashtag-cooked"],
|
||||||
["href", result.relative_url],
|
["href", result.relative_url],
|
||||||
["data-type", result.type],
|
["data-type", result.type],
|
||||||
["data-slug", result.slug],
|
["data-slug", result.slug],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Most cases these will be the exact same, one standout is categories
|
||||||
|
// which have a parent:child reference.
|
||||||
|
if (result.slug !== result.ref) {
|
||||||
|
token.attrs.push(["data-ref", result.ref]);
|
||||||
|
}
|
||||||
|
|
||||||
token.block = false;
|
token.block = false;
|
||||||
buffer.push(token);
|
buffer.push(token);
|
||||||
|
|
||||||
|
@ -127,6 +137,7 @@ export function setup(helper) {
|
||||||
"span.hashtag-raw",
|
"span.hashtag-raw",
|
||||||
"a[data-type]",
|
"a[data-type]",
|
||||||
"a[data-slug]",
|
"a[data-slug]",
|
||||||
|
"a[data-ref]",
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user