import { source } from 'common-tags'; import { OpenTagToken } from '@t/renderer'; import { Parser } from '../../commonmark/blocks'; import { Renderer } from '../renderer'; const parser = new Parser(); describe('softbreak options', () => { it('softbreak option value should be used as a raw HTML string', () => { const renderer = new Renderer({ softbreak: '\n
\n', }); const html = renderer.render(parser.parse('Hello\nWorld')); expect(html).toBe('

Hello\n
\nWorld

\n'); }); }); describe('nodeId options', () => { const renderer = new Renderer({ nodeId: true }); it('every html tag corresponds to container node should contain data-nodeid', () => { const root = parser.parse('*Hello* **World**'); const para = root.firstChild!; const emph = para.firstChild!; const strong = emph.next!.next!; expect(renderer.render(root)).toBe( [ `

`, `Hello `, `World`, '

\n', ].join('') ); }); it('htmlBlock should be wrapped by div to contain data-nodeid', () => { const root = parser.parse('
  • Hi
  • '); const htmlBlock = root.firstChild!; expect(renderer.render(root)).toBe(`
  • Hi
  • \n`); }); it('only top-level tag for each node should contain data-nodeid', () => { const root = parser.parse('```\nHello\n```'); const codeBlock = root.firstChild!; expect(renderer.render(root)).toBe( `
    Hello\n
    \n` ); }); }); describe('convertors options', () => { it('should pass the context object to convertor', () => { const spy = jest.fn(() => null); const options = { gfm: true, softbreak: '
    \n', nodeId: true, }; const renderer = new Renderer({ ...options, convertors: { paragraph: spy, }, }); const root = parser.parse('Hello World'); renderer.render(root); expect(spy).toHaveBeenCalledTimes(2); const firstCall = spy.mock.calls[0] as any[]; expect(firstCall[0]).toBe(root.firstChild); expect(firstCall[1]).toMatchObject({ entering: true, leaf: false, options, }); const secondCall = spy.mock.calls[1] as any[]; expect(secondCall[0]).toBe(root.firstChild); expect(secondCall[1]).toMatchObject({ entering: false, leaf: false, options, }); }); it('context object has origin convertor', () => { const renderer = new Renderer({ convertors: { paragraph(_, { entering, origin }) { const result = origin!(); if (entering) { (result as OpenTagToken).classNames = ['my-class']; return result; } return result; }, }, }); const html = renderer.render(parser.parse('Hello World')); expect(html).toBe('

    Hello World

    \n'); }); }); describe('gfm convertors', () => { it('should apply custom renderer without changing node type to lower case', () => { const spy = jest.fn(); const renderer = new Renderer({ gfm: true, convertors: { tableCell(_, { origin }) { spy(); return origin!(); }, }, }); const input = source` | a | | | | - | - | - | | | b | | | | | c | `; renderer.render(parser.parse(input)); expect(spy).toHaveBeenCalled(); }); });