@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
65 lines (59 loc) • 1.62 kB
text/typescript
import {
MarkdownSerializerState,
Node as PMNode,
} from '../../prosemirror';
const isHeaderRow = (row: PMNode): boolean => row.child(0).type.name === 'tableHeader';
const isHeaderRowPresent = (table: PMNode): boolean => {
let headerRowPresent = false;
table.content.forEach((row: PMNode, i: number) => {
if (isHeaderRow(row)) {
headerRowPresent = true;
}
});
return headerRowPresent;
};
const renderNode = (state: MarkdownSerializerState, node: PMNode, index: number): void => {
if (index > 0) {
state.write(' ');
}
node.content.forEach((child: PMNode, i: number) => {
if (child.isTextblock) {
if (i > 0) {
state.write(' ');
}
state.renderInline(child);
}
else {
renderNode(state, child, i);
}
});
};
const renderInlineContent = (state: MarkdownSerializerState, node: PMNode) => {
state.write('| ');
renderNode(state, node, 0);
state.write(' ');
};
export default {
table(state: MarkdownSerializerState, node: PMNode) {
if (isHeaderRowPresent(node)) {
node.content.forEach((child, i) => state.render(child, node, i));
state.closeBlock(node);
}
},
tableRow(state: MarkdownSerializerState, node: PMNode) {
node.content.forEach((child, i) => {
state.render(child, node, i);
});
state.write('|');
state.ensureNewLine();
if (isHeaderRow(node)) {
for(let i = 0; i < node.childCount; i++) {
state.write('| --- ');
}
state.write('|');
state.ensureNewLine();
}
},
tableHeader: renderInlineContent,
tableCell: renderInlineContent,
};