Files
outline/shared/editor/marks/Italic.ts
2023-05-24 19:24:05 -07:00

74 lines
1.5 KiB
TypeScript

import { toggleMark } from "prosemirror-commands";
import { InputRule } from "prosemirror-inputrules";
import { MarkSpec, MarkType } from "prosemirror-model";
import { Command } from "prosemirror-state";
import markInputRule from "../lib/markInputRule";
import Mark from "./Mark";
export default class Italic extends Mark {
get name() {
return "em";
}
get schema(): MarkSpec {
return {
parseDOM: [
{ tag: "i" },
{ tag: "em" },
{
style: "font-style",
getAttrs: (value) => (value === "italic" ? null : false),
},
],
toDOM: () => ["em"],
};
}
inputRules({ type }: { type: MarkType }): InputRule[] {
/**
* Due to use of snake_case strings common in docs the matching conditions
* are a bit more strict than e.g. the ** bold syntax to help prevent
* false positives.
*
* Matches:
* _1_
* _123_
* (_one_
* [_one_
*
* No match:
* __
* __123_
* __123__
* _123
* one_123_
* ONE_123_
* 1_123_
*/
return [
markInputRule(/(?:^|[^_a-zA-Z0-9])(_([^_]+)_)$/, type),
markInputRule(/(?:^|[^*a-zA-Z0-9])(\*([^*]+)\*)$/, type),
];
}
keys({ type }: { type: MarkType }): Record<string, Command> {
return {
"Mod-i": toggleMark(type),
"Mod-I": toggleMark(type),
};
}
toMarkdown() {
return {
open: "*",
close: "*",
mixable: true,
expelEnclosingWhitespace: true,
};
}
parseMarkdown() {
return { mark: "em" };
}
}