Skip to content
代码片段 群组 项目
未验证 提交 ada1729d 编辑于 作者: Enrique Alcantara's avatar Enrique Alcantara
浏览文件

Separate serializers and tiptap extensions

Move node and mark serializers out of the
tiptap extension files. Define the serializer
config in the Markdown Serializer factory
module
上级 bb480536
No related branches found
No related tags found
无相关合并请求
显示
21 个添加111 个删除
import { Blockquote } from '@tiptap/extension-blockquote'; export { Blockquote as default } from '@tiptap/extension-blockquote';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const tiptapExtension = Blockquote;
export const serializer = defaultMarkdownSerializer.nodes.blockquote;
import { Bold } from '@tiptap/extension-bold'; export { Bold as default } from '@tiptap/extension-bold';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const tiptapExtension = Bold;
export const serializer = defaultMarkdownSerializer.marks.strong;
import { BulletList } from '@tiptap/extension-bullet-list'; export { BulletList as default } from '@tiptap/extension-bullet-list';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const tiptapExtension = BulletList;
export const serializer = defaultMarkdownSerializer.nodes.bullet_list;
import { Code } from '@tiptap/extension-code'; export { Code as default } from '@tiptap/extension-code';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const tiptapExtension = Code;
export const serializer = defaultMarkdownSerializer.marks.code;
import { CodeBlockLowlight } from '@tiptap/extension-code-block-lowlight'; import { CodeBlockLowlight } from '@tiptap/extension-code-block-lowlight';
import * as lowlight from 'lowlight'; import * as lowlight from 'lowlight';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
const extractLanguage = (element) => element.getAttribute('lang'); const extractLanguage = (element) => element.getAttribute('lang');
const ExtendedCodeBlockLowlight = CodeBlockLowlight.extend({ export default CodeBlockLowlight.extend({
addAttributes() { addAttributes() {
return { return {
language: { language: {
...@@ -38,6 +37,3 @@ const ExtendedCodeBlockLowlight = CodeBlockLowlight.extend({ ...@@ -38,6 +37,3 @@ const ExtendedCodeBlockLowlight = CodeBlockLowlight.extend({
}).configure({ }).configure({
lowlight, lowlight,
}); });
export const tiptapExtension = ExtendedCodeBlockLowlight;
export const serializer = defaultMarkdownSerializer.nodes.code_block;
import Document from '@tiptap/extension-document'; export { Document as default } from '@tiptap/extension-document';
export const tiptapExtension = Document;
import Dropcursor from '@tiptap/extension-dropcursor'; export { Dropcursor as default } from '@tiptap/extension-dropcursor';
export const tiptapExtension = Dropcursor;
import Gapcursor from '@tiptap/extension-gapcursor'; export { Gapcursor as default } from '@tiptap/extension-gapcursor';
export const tiptapExtension = Gapcursor;
import { HardBreak } from '@tiptap/extension-hard-break'; import { HardBreak } from '@tiptap/extension-hard-break';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
const ExtendedHardBreak = HardBreak.extend({ export default HardBreak.extend({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Shift-Enter': () => this.editor.commands.setHardBreak(), 'Shift-Enter': () => this.editor.commands.setHardBreak(),
}; };
}, },
}); });
export const tiptapExtension = ExtendedHardBreak;
export const serializer = defaultMarkdownSerializer.nodes.hard_break;
import { Heading } from '@tiptap/extension-heading'; export { Heading as default } from '@tiptap/extension-heading';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const tiptapExtension = Heading;
export const serializer = defaultMarkdownSerializer.nodes.heading;
import History from '@tiptap/extension-history'; export { History as default } from '@tiptap/extension-history';
export const tiptapExtension = History;
import { nodeInputRule } from '@tiptap/core'; import { nodeInputRule } from '@tiptap/core';
import { HorizontalRule } from '@tiptap/extension-horizontal-rule'; import { HorizontalRule } from '@tiptap/extension-horizontal-rule';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const hrInputRuleRegExp = /^---$/; export const hrInputRuleRegExp = /^---$/;
export const tiptapExtension = HorizontalRule.extend({ export default HorizontalRule.extend({
addInputRules() { addInputRules() {
return [nodeInputRule(hrInputRuleRegExp, this.type)]; return [nodeInputRule(hrInputRuleRegExp, this.type)];
}, },
}); });
export const serializer = defaultMarkdownSerializer.nodes.horizontal_rule;
...@@ -48,11 +48,12 @@ const handleFileEvent = ({ editor, file, uploadsPath, renderMarkdown }) => { ...@@ -48,11 +48,12 @@ const handleFileEvent = ({ editor, file, uploadsPath, renderMarkdown }) => {
return false; return false;
}; };
const ExtendedImage = Image.extend({ export default Image.extend({
defaultOptions: { defaultOptions: {
...Image.options, ...Image.options,
uploadsPath: null, uploadsPath: null,
renderMarkdown: null, renderMarkdown: null,
inline: true,
}, },
addAttributes() { addAttributes() {
return { return {
...@@ -152,17 +153,3 @@ const ExtendedImage = Image.extend({ ...@@ -152,17 +153,3 @@ const ExtendedImage = Image.extend({
return VueNodeViewRenderer(ImageWrapper); return VueNodeViewRenderer(ImageWrapper);
}, },
}); });
const serializer = (state, node) => {
const { alt, canonicalSrc, src, title } = node.attrs;
const quotedTitle = title ? ` ${state.quote(title)}` : '';
state.write(`![${state.esc(alt || '')}](${state.esc(canonicalSrc || src)}${quotedTitle})`);
};
export const configure = ({ renderMarkdown, uploadsPath }) => {
return {
tiptapExtension: ExtendedImage.configure({ inline: true, renderMarkdown, uploadsPath }),
serializer,
};
};
import { Italic } from '@tiptap/extension-italic'; export { Italic as default } from '@tiptap/extension-italic';
export const tiptapExtension = Italic;
export const serializer = { open: '_', close: '_', mixable: true, expelEnclosingWhitespace: true };
...@@ -20,7 +20,7 @@ export const extractHrefFromMarkdownLink = (match) => { ...@@ -20,7 +20,7 @@ export const extractHrefFromMarkdownLink = (match) => {
return extractHrefFromMatch(match); return extractHrefFromMatch(match);
}; };
export const tiptapExtension = Link.extend({ export default Link.extend({
addInputRules() { addInputRules() {
return [ return [
markInputRule(markdownLinkSyntaxInputRuleRegExp, this.type, extractHrefFromMarkdownLink), markInputRule(markdownLinkSyntaxInputRuleRegExp, this.type, extractHrefFromMarkdownLink),
...@@ -51,13 +51,3 @@ export const tiptapExtension = Link.extend({ ...@@ -51,13 +51,3 @@ export const tiptapExtension = Link.extend({
}).configure({ }).configure({
openOnClick: false, openOnClick: false,
}); });
export const serializer = {
open() {
return '[';
},
close(state, mark) {
const href = mark.attrs.canonicalSrc || mark.attrs.href;
return `](${state.esc(href)}${mark.attrs.title ? ` ${state.quote(mark.attrs.title)}` : ''})`;
},
};
import { ListItem } from '@tiptap/extension-list-item'; export { ListItem as default } from '@tiptap/extension-list-item';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const tiptapExtension = ListItem;
export const serializer = defaultMarkdownSerializer.nodes.list_item;
import { OrderedList } from '@tiptap/extension-ordered-list'; export { OrderedList as default } from '@tiptap/extension-ordered-list';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const tiptapExtension = OrderedList;
export const serializer = defaultMarkdownSerializer.nodes.ordered_list;
import { Paragraph } from '@tiptap/extension-paragraph'; export { Paragraph as default } from '@tiptap/extension-paragraph';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const tiptapExtension = Paragraph;
export const serializer = defaultMarkdownSerializer.nodes.paragraph;
import { Strike } from '@tiptap/extension-strike'; export { Strike as default } from '@tiptap/extension-strike';
export const tiptapExtension = Strike;
export const serializer = {
open: '~~',
close: '~~',
mixable: true,
expelEnclosingWhitespace: true,
};
import { Table } from '@tiptap/extension-table'; export { Table as default } from '@tiptap/extension-table';
export const tiptapExtension = Table;
export function serializer(state, node) {
state.renderContent(node);
}
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册