Compare commits

..

No commits in common. 'feat/plain-text-support' and 'main' have entirely different histories.

  1. 4
      src/index.js
  2. 75
      src/mentions/schema.js

4
src/index.js

@ -13,6 +13,10 @@ import Placeholder from './Placeholder';
export { EditorState } from 'prosemirror-state'; export { EditorState } from 'prosemirror-state';
export { EditorView } from 'prosemirror-view'; export { EditorView } from 'prosemirror-view';
export {
defaultMarkdownParser,
defaultMarkdownSerializer,
} from 'prosemirror-markdown';
export { buildMenuItems, buildKeymap, buildInputRules }; export { buildMenuItems, buildKeymap, buildInputRules };

75
src/mentions/schema.js

@ -2,11 +2,9 @@ import {
schema, schema,
MarkdownParser, MarkdownParser,
MarkdownSerializer, MarkdownSerializer,
defaultMarkdownParser,
defaultMarkdownSerializer,
} from 'prosemirror-markdown'; } from 'prosemirror-markdown';
import { Schema, DOMParser } from 'prosemirror-model'; import { Schema } from 'prosemirror-model';
const mentionParser = () => ({ const mentionParser = () => ({
node: 'mention', node: 'mention',
@ -18,31 +16,18 @@ const mentionParser = () => ({
const markdownSerializer = () => (state, node) => { const markdownSerializer = () => (state, node) => {
const uri = state.esc( const uri = state.esc(
`mention://user/${node.attrs.userId}/${encodeURIComponent( `mention://user/${node.attrs.userId}/${encodeURIComponent(node.attrs.userFullName)}`
node.attrs.userFullName
)}`
); );
const escapedDisplayName = state.esc('@' + (node.attrs.userFullName || '')); const escapedDisplayName = state.esc('@' + (node.attrs.userFullName || ''));
state.write(`[${escapedDisplayName}](${uri})`); state.write(`[${escapedDisplayName}](${uri})`);
}; };
export const addMentionsToMarkdownSerializer = () => { export const addMentionsToMarkdownSerializer = serializer =>
const result = new MarkdownSerializer( new MarkdownSerializer(
{ { mention: markdownSerializer(), ...serializer.nodes },
mention: markdownSerializer(), serializer.marks
...defaultMarkdownSerializer.nodes,
},
defaultMarkdownSerializer.marks
); );
return result;
};
export const plainTextSerializer = () => {
const { text, paragraph, hard_break } = defaultMarkdownSerializer.nodes;
const result = new MarkdownSerializer({ text, paragraph, hard_break }, {});
return result;
};
const mentionNode = { const mentionNode = {
attrs: { userFullName: { default: '' }, userId: { default: '' } }, attrs: { userFullName: { default: '' }, userId: { default: '' } },
@ -79,49 +64,9 @@ export const schemaWithMentions = new Schema({
marks: schema.spec.marks, marks: schema.spec.marks,
}); });
export const addMentionsToMarkdownParser = () => { export const addMentionsToMarkdownParser = parser => {
return new MarkdownParser( return new MarkdownParser(schemaWithMentions, parser.tokenizer, {
schemaWithMentions, ...parser.tokens,
defaultMarkdownParser.tokenizer,
{
...defaultMarkdownParser.tokens,
mention: mentionParser(), mention: mentionParser(),
}
);
};
export const defaultPlainTextSchema = new Schema({
nodes: {
doc: {
content: 'block+',
},
paragraph: {
content: 'inline*',
group: 'block',
parseDOM: [{ tag: 'p' }],
toDOM() {
return ['p', 0];
},
},
text: {
group: 'inline',
},
hard_break: {
inline: true,
group: 'inline',
selectable: false,
parseDOM: [{ tag: 'br' }],
toDOM() {
return ['br'];
},
},
},
marks: {},
}); });
};
export const plainTextParser = () =>
DOMParser.fromSchema(defaultPlainTextSchema);

Loading…
Cancel
Save