// @flow
import React from 'react';
import Code from './components/Code';
import HorizontalRule from './components/HorizontalRule';
import InlineCode from './components/InlineCode';
import Image from './components/Image';
import Link from './components/Link';
import ListItem from './components/ListItem';
import TodoList from './components/TodoList';
import {
Heading1,
Heading2,
Heading3,
Heading4,
Heading5,
Heading6,
} from './components/Heading';
import Paragraph from './components/Paragraph';
import BlockToolbar from './components/Toolbar/BlockToolbar';
import type { Props, Node, Transform } from './types';
type Options = {
onInsertImage: Function,
onChange: Function,
};
const createSchema = ({ onInsertImage, onChange }: Options) => {
return {
marks: {
bold: (props: Props) => {props.children},
code: (props: Props) => {props.children},
italic: (props: Props) => {props.children},
underlined: (props: Props) => {props.children},
deleted: (props: Props) => {props.children},
added: (props: Props) => {props.children},
},
nodes: {
'block-toolbar': (props: Props) => (
),
paragraph: (props: Props) => ,
'block-quote': (props: Props) => (
{props.children}
),
'horizontal-rule': HorizontalRule,
'bulleted-list': (props: Props) => (
),
'ordered-list': (props: Props) => (
{props.children}
),
'todo-list': (props: Props) => (
{props.children}
),
table: (props: Props) => (
),
'table-row': (props: Props) => (
{props.children}
),
'table-head': (props: Props) => (
{props.children} |
),
'table-cell': (props: Props) => (
{props.children} |
),
code: Code,
image: Image,
link: Link,
'list-item': ListItem,
heading1: (props: Props) => ,
heading2: (props: Props) => ,
heading3: (props: Props) => ,
heading4: (props: Props) => ,
heading5: (props: Props) => ,
heading6: (props: Props) => ,
},
rules: [
// ensure first node is always a heading
{
match: (node: Node) => {
return node.kind === 'document';
},
validate: (document: Node) => {
const firstNode = document.nodes.first();
return firstNode && firstNode.type === 'heading1' ? null : firstNode;
},
normalize: (transform: Transform, document: Node, firstNode: Node) => {
transform.setBlock({ type: 'heading1' });
},
},
// automatically removes any marks in first heading
{
match: (node: Node) => {
return node.kind === 'heading1';
},
validate: (heading: Node) => {
const hasMarks = heading.getMarks().isEmpty();
const hasInlines = heading.getInlines().isEmpty();
return !(hasMarks && hasInlines);
},
normalize: (transform: Transform, heading: Node) => {
transform.unwrapInlineByKey(heading.key);
heading.getMarks().forEach(mark => {
heading.nodes.forEach(textNode => {
if (textNode.kind === 'text') {
transform.removeMarkByKey(
textNode.key,
0,
textNode.text.length,
mark
);
}
});
});
return transform;
},
},
],
};
};
export default createSchema;