diff --git a/src/components/Widgets/Markdown/serializers/__tests__/slate.spec.js b/src/components/Widgets/Markdown/serializers/__tests__/slate.spec.js
index fd3bda41..28d78e77 100644
--- a/src/components/Widgets/Markdown/serializers/__tests__/slate.spec.js
+++ b/src/components/Widgets/Markdown/serializers/__tests__/slate.spec.js
@@ -4,37 +4,33 @@ import { markdownToSlate, slateToMarkdown } from '../index';
const process = flow([markdownToSlate, slateToMarkdown]);
describe('slate', () => {
- it('should distinguish between newlines and hard breaks', () => {
- expect(process('a\n')).toEqual('a\n');
- });
-
it('should not decode encoded html entities in inline code', () => {
- expect(process('<div>
')).toEqual('<div>
\n');
+ expect(process('<div>
')).toEqual('<div>
');
});
it('should parse non-text children of mark nodes', () => {
- expect(process('**a[b](c)d**')).toEqual('**a[b](c)d**\n');
- expect(process('**[a](b)**')).toEqual('**[a](b)**\n');
- expect(process('****')).toEqual('****\n');
- expect(process('_`a`_')).toEqual('_`a`_\n');
- expect(process('_`a`b_')).toEqual('_`a`b_\n');
+ expect(process('**a[b](c)d**')).toEqual('**a[b](c)d**');
+ expect(process('**[a](b)**')).toEqual('**[a](b)**');
+ expect(process('****')).toEqual('****');
+ expect(process('_`a`_')).toEqual('_`a`_');
+ expect(process('_`a`b_')).toEqual('_`a`b_');
});
it('should condense adjacent, identically styled text and inline nodes', () => {
- expect(process('**a ~~b~~~~c~~**')).toEqual('**a ~~bc~~**\n');
- expect(process('**a ~~b~~~~[c](d)~~**')).toEqual('**a ~~b[c](d)~~**\n');
+ expect(process('**a ~~b~~~~c~~**')).toEqual('**a ~~bc~~**');
+ expect(process('**a ~~b~~~~[c](d)~~**')).toEqual('**a ~~b[c](d)~~**');
});
it('should handle nested markdown entities', () => {
- expect(process('**a**b**c**')).toEqual('**a**b**c**\n');
- expect(process('**a _b_ c**')).toEqual('**a _b_ c**\n');
+ expect(process('**a**b**c**')).toEqual('**a**b**c**');
+ expect(process('**a _b_ c**')).toEqual('**a _b_ c**');
});
it('should parse inline images as images', () => {
- expect(process('a ')).toEqual('a \n');
+ expect(process('a ')).toEqual('a ');
});
it('should not escape markdown entities in html', () => {
- expect(process('*')).toEqual('*\n');
+ expect(process('*')).toEqual('*');
});
});
diff --git a/src/components/Widgets/Markdown/serializers/index.js b/src/components/Widgets/Markdown/serializers/index.js
index 5b00150d..bc36b11a 100644
--- a/src/components/Widgets/Markdown/serializers/index.js
+++ b/src/components/Widgets/Markdown/serializers/index.js
@@ -1,4 +1,4 @@
-import { get, isEmpty, reduce, pull } from 'lodash';
+import { get, isEmpty, reduce, pull, trimEnd } from 'lodash';
import unified from 'unified';
import u from 'unist-builder';
import markdownToRemarkPlugin from 'remark-parse';
@@ -118,17 +118,19 @@ export const remarkToMarkdown = obj => {
fences: true,
listItemIndent: '1',
- // Settings to emulate the defaults from the Prosemirror editor, not
- // necessarily optimal. Should eventually be configurable.
+ /**
+ * Settings to emulate the defaults from the Prosemirror editor, not
+ * necessarily optimal. Should eventually be configurable.
+ */
bullet: '*',
strong: '*',
rule: '-',
};
/**
- * Escape markdown entities found in text and html nodes within the MDAST.
+ * Transform the MDAST with plugins.
*/
- const escapedMdast = unified()
+ const processedMdast = unified()
.use(remarkEscapeMarkdownEntities)
.use(remarkStripTrailingBreaks)
.runSync(mdast);
@@ -136,9 +138,12 @@ export const remarkToMarkdown = obj => {
const markdown = unified()
.use(remarkToMarkdownPlugin, remarkToMarkdownPluginOpts)
.use(remarkAllowAllText)
- .stringify(escapedMdast);
+ .stringify(processedMdast);
- return markdown;
+ /**
+ * Return markdown with trailing whitespace removed.
+ */
+ return trimEnd(markdown);
};