fix: Improve paste handler parsing for more cases, specifically Google Docs (#3322)
This commit is contained in:
@@ -4,6 +4,9 @@ import { MarkSpec, MarkType } from "prosemirror-model";
|
||||
import markInputRule from "../lib/markInputRule";
|
||||
import Mark from "./Mark";
|
||||
|
||||
const heavyWeightRegex = /^(bold(er)?|[5-9]\d{2,})$/;
|
||||
const normalWeightRegex = /^(normal|[1-4]\d{2,})$/;
|
||||
|
||||
export default class Bold extends Mark {
|
||||
get name() {
|
||||
return "strong";
|
||||
@@ -11,7 +14,20 @@ export default class Bold extends Mark {
|
||||
|
||||
get schema(): MarkSpec {
|
||||
return {
|
||||
parseDOM: [{ tag: "b" }, { tag: "strong" }],
|
||||
parseDOM: [
|
||||
{
|
||||
tag: "b",
|
||||
// Google Docs includes <b> tags with font-weight: normal so we need
|
||||
// to account for this case specifically as not becoming bold when pasted.
|
||||
getAttrs: (dom: HTMLElement) =>
|
||||
normalWeightRegex.test(dom.style.fontWeight) ? false : null,
|
||||
},
|
||||
{ tag: "strong" },
|
||||
{
|
||||
style: "font-weight",
|
||||
getAttrs: (style: string) => heavyWeightRegex.test(style) && null,
|
||||
},
|
||||
],
|
||||
toDOM: () => ["strong"],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -12,7 +12,14 @@ export default class Italic extends Mark {
|
||||
|
||||
get schema(): MarkSpec {
|
||||
return {
|
||||
parseDOM: [{ tag: "i" }, { tag: "em" }],
|
||||
parseDOM: [
|
||||
{ tag: "i" },
|
||||
{ tag: "em" },
|
||||
{
|
||||
style: "font-style",
|
||||
getAttrs: (value) => (value === "italic" ? null : false),
|
||||
},
|
||||
],
|
||||
toDOM: () => ["em"],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -20,6 +20,10 @@ export default class Strikethrough extends Mark {
|
||||
{
|
||||
tag: "strike",
|
||||
},
|
||||
{
|
||||
style: "text-decoration",
|
||||
getAttrs: (value) => (value === "line-through" ? null : false),
|
||||
},
|
||||
],
|
||||
toDOM: () => ["del", 0],
|
||||
};
|
||||
|
||||
@@ -15,7 +15,7 @@ export default class Underline extends Mark {
|
||||
{ tag: "u" },
|
||||
{
|
||||
style: "text-decoration",
|
||||
getAttrs: (value) => (value === "underline" ? {} : undefined),
|
||||
getAttrs: (value) => (value === "underline" ? null : false),
|
||||
},
|
||||
],
|
||||
toDOM: () => ["u", 0],
|
||||
|
||||
Reference in New Issue
Block a user