import { describe, test } from '@jest/globals'; import assert from 'assert'; import fs from 'fs'; import { diff } from 'jest-diff'; import path from 'path'; import { MarkdownRenderer, TableMergeInfo } from '../src'; import { escapeHTMLTags } from '../src/renderer'; const fixture = (filename: string): string => { return fs.readFileSync(path.join(__dirname, 'fixtures', filename), 'utf8'); }; const fixtureJSON = (filename: string): any => { return JSON.parse(fixture(filename)); }; describe('MarkdownRenderer', () => { test('parse', () => { let render = new MarkdownRenderer({}); let result = render.parse(); assert.strictEqual(result, ''); }); test('parse file', () => { ['case0', 'case1', 'case2', 'case3', 'case4'].forEach((caseName) => { const doc = fixtureJSON(`${caseName}.raw.json`); const expected = fixture(`${caseName}.expect.md`); let render = new MarkdownRenderer(doc); let result = render.parse(); if (result.trim() !== expected.trim()) { const diffResult = diff(expected.trim(), result.trim()); console.error('test failed on:', caseName); console.log(diffResult); // console.log(result); } }); }); test('pageMeta', () => { let render = new MarkdownRenderer(fixtureJSON(`case1.raw.json`)); render.parse(); assert.equal(render.meta?.slug, 'test-slug'); render = new MarkdownRenderer(fixtureJSON(`case3.raw.json`)); render.parse(); assert.equal(render.meta?.slug, 'gettting-started'); assert.equal(render.meta?.keywords, 'feishu-pages, feishu-docx'); }); test('fileTokens', () => { const doc = fixtureJSON(`case3.raw.json`); let render = new MarkdownRenderer(doc); render.parse(); assert.deepEqual(Object.keys(render.fileTokens), [ 'Bwk8bcQH6oLQn1xjzdacPBckn8d', 'DkwibdF3ooVi0KxttdocdoQ5nPh', 'M9hDb8WXzo7TU5xg4xtcvArPnxe', 'TVEyb1pmWo8oIwxyL3kcIfrrnGd', 'SzJmbprNwo5Y7Cx2MzAc7k7dnCt', 'DPH0bRiUuohOKlxHKnCce5SRnMd', ]); assert.deepEqual(render.fileTokens['DkwibdF3ooVi0KxttdocdoQ5nPh'], { token: 'DkwibdF3ooVi0KxttdocdoQ5nPh', type: 'image', }); assert.deepEqual(render.fileTokens['TVEyb1pmWo8oIwxyL3kcIfrrnGd'], { token: 'TVEyb1pmWo8oIwxyL3kcIfrrnGd', type: 'file', }); }); test('parse unsupport', () => { const doc = fixtureJSON(`unsupport.raw.json`); let render = new MarkdownRenderer(doc, { outputUnsupported: true }); let result = render.parse(); let expect = fixture(`unsupport.a.md`); assert.equal(result.trim(), expect.trim()); expect = fixture(`unsupport.b.md`); render = new MarkdownRenderer(doc); result = render.parse(); assert.equal(result.trim(), expect.trim()); }); test('markdownToHTML', () => { let render = new MarkdownRenderer({}); let raw = `[This is a Link](https://github.com) this is suffix.`; let result = render.markdownToHTML(raw); let expect = `

This is a Link this is suffix.

\n`; assert.equal(result, expect); raw = `
\n\n[This is a Link](https://github.com)\nThis is suffix.`; result = render.markdownToHTML(raw); expect = `
\n\n

This is a Link
This is suffix.

\n`; assert.equal(result, expect); raw = `> This is first line.\n> This is second line.`; result = render.markdownToHTML(raw); expect = `
\n

This is first line.
This is second line.

\n
\n`; }); test('escapeHTMLTags', () => { assert.equal(escapeHTMLTags('2 > 1 && 3 < 2'), '2 > 1 && 3 < 2'); }); test('tableCellAttrHTML', () => { let mergeInfo: TableMergeInfo[] = [ { row_span: 1, col_span: 1, }, { row_span: 1, col_span: 2, }, { row_span: 2, col_span: 1, }, { row_span: 1, col_span: 1, }, { row_span: 2, col_span: 3, }, ]; let render = new MarkdownRenderer({}); assert.equal(render.tableCellAttrHTML(mergeInfo, 0), ''); assert.equal(render.tableCellAttrHTML(mergeInfo, 1), ' colspan="2"'); assert.equal(render.tableCellAttrHTML(mergeInfo, 2), ' rowspan="2"'); assert.equal(render.tableCellAttrHTML(mergeInfo, 3), ''); assert.equal( render.tableCellAttrHTML(mergeInfo, 4), ' rowspan="2" colspan="3"' ); }); });