import { ribbit } from './setup'; const r = ribbit(); const macros = [ { name: 'user', toHTML: () => 'TestUser', }, { name: 'npc', toHTML: ({ keywords }: any) => { const name = keywords.join(' '); return '' + name + ''; }, }, { name: 'style', toHTML: ({ keywords, content }: any) => '
' + (content || '') + '
', }, { name: 'toc', toHTML: ({ params }: any) => '', }, ]; const h = new r.HopDown({ macros }); const H = (md: string) => h.toHTML(md); const M = (html: string) => h.toMarkdown(html); describe('Macros', () => { describe('self-closing', () => { it('bare name renders', () => expect(H('hello @user world')).toContain('TestUser')); it('bare name wrapped', () => expect(H('hello @user world')).toContain('data-macro="user"')); it('empty parens', () => expect(H('hello @user() world')).toContain('data-macro="user"')); it('keywords', () => expect(H('@npc(Goblin King)')).toContain('Goblin King')); it('keywords in data attr', () => expect(H('@npc(Goblin King)')).toContain('data-keywords="Goblin King"')); it('params', () => expect(H('@toc(depth="2")')).toContain('data-param-depth="2"')); }); describe('unknown macros', () => { it('renders error', () => expect(H('@bogus')).toContain('ribbit-error')); it('shows name', () => expect(H('@bogus')).toContain('@bogus')); it('block error', () => expect(H('@bogus(args\ncontent\n)')).toContain('ribbit-error')); }); it('email not matched', () => expect(H('user@example.com')).toBe('

user@example.com

')); describe('block macros', () => { it('content processed', () => expect(H('@style(box\n**bold**\n)')).toContain('bold')); it('wrapped with data-macro', () => expect(H('@style(box\ncontent\n)')).toContain('data-macro="style"')); it('keywords in data attr', () => expect(H('@style(box center\ncontent\n)')).toContain('data-keywords="box center"')); }); describe('verbatim', () => { it('skips markdown', () => expect(H('@style(box verbatim\n**bold**\n)')).toContain('**bold**')); it('no strong tag', () => expect(H('@style(box verbatim\n**bold**\n)')).not.toContain('')); it('escapes html', () => expect(H('@style(box verbatim\ntag\n)')).toContain('<b>')); it('preserves newlines', () => expect(H('@style(box verbatim\nline1\nline2\n)')).toContain('line1
')); it('data-verbatim set', () => expect(H('@style(box verbatim\ncontent\n)')).toContain('data-verbatim="true"')); it('keyword stripped from data-keywords', () => { const html = H('@style(box verbatim\ncontent\n)'); expect(html).toContain('data-keywords="box"'); expect(html).not.toMatch(/data-keywords="[^"]*verbatim/); }); }); describe('nesting', () => { it('inline inside bold', () => expect(H('**@npc(Goblin King)**')).toContain('')); it('block contains list', () => expect(H('@style(box\n- item 1\n- item 2\n)')).toContain('