import { removeAtag, getAndRemoveConfig, getAndRemoveDocsifyIgnoreConfig, } from '../../src/core/render/utils.js'; import { tree } from '../../src/core/render/tpl.js'; import { slugify } from '../../src/core/render/slugify.js'; // Suite // ----------------------------------------------------------------------------- describe('core/render/utils', () => { // removeAtag() // --------------------------------------------------------------------------- describe('removeAtag()', () => { test('removeAtag from a link', () => { const result = removeAtag('content'); expect(result).toBe('content'); }); }); // getAndRemoveDocsifyIgnoreConfig() // --------------------------------------------------------------------------- describe('getAndRemoveDocsifyIgnoreConfig()', () => { test('getAndRemoveDocsifyIgnoreConfig from ', () => { const { content, ignoreAllSubs, ignoreSubHeading } = getAndRemoveDocsifyIgnoreConfig( 'My Ignore Title', ); expect(content).toBe('My Ignore Title'); expect(ignoreSubHeading).toBeTruthy(); expect(ignoreAllSubs === undefined).toBeTruthy(); }); test('getAndRemoveDocsifyIgnoreConfig from ', () => { const { content, ignoreAllSubs, ignoreSubHeading } = getAndRemoveDocsifyIgnoreConfig( 'My Ignore Title', ); expect(content).toBe('My Ignore Title'); expect(ignoreAllSubs).toBeTruthy(); expect(ignoreSubHeading === undefined).toBeTruthy(); }); test('getAndRemoveDocsifyIgnoreConfig from {docsify-ignore}', () => { const { content, ignoreAllSubs, ignoreSubHeading } = getAndRemoveDocsifyIgnoreConfig('My Ignore Title{docsify-ignore}'); expect(content).toBe('My Ignore Title'); expect(ignoreSubHeading).toBeTruthy(); expect(ignoreAllSubs === undefined).toBeTruthy(); }); test('getAndRemoveDocsifyIgnoreConfig from {docsify-ignore-all}', () => { const { content, ignoreAllSubs, ignoreSubHeading } = getAndRemoveDocsifyIgnoreConfig('My Ignore Title{docsify-ignore-all}'); expect(content).toBe('My Ignore Title'); expect(ignoreAllSubs).toBeTruthy(); expect(ignoreSubHeading === undefined).toBeTruthy(); }); }); // getAndRemoveConfig() // --------------------------------------------------------------------------- describe('getAndRemoveConfig()', () => { test('parse simple config', () => { const result = getAndRemoveConfig( "[filename](_media/example.md ':include')", ); expect(result).toMatchObject({ config: {}, str: "[filename](_media/example.md ':include')", }); }); test('parse config with arguments', () => { const result = getAndRemoveConfig( "[filename](_media/example.md ':include :foo=bar :baz test')", ); expect(result).toMatchObject({ config: { foo: 'bar', baz: true, }, str: "[filename](_media/example.md ':include test')", }); }); test('parse config with key arguments img', () => { const result = getAndRemoveConfig( "![logo](https://docsify.js.org/_media/icon.svg ' :size=50x100 ')", ); expect(result).toMatchObject({ config: { size: '50x100', }, str: "![logo](https://docsify.js.org/_media/icon.svg ' ')", }); }); test('parse config with key arguments', () => { const result = getAndRemoveConfig( "[filename](_media/example.md ' :class=foo ')", ); expect(result).toMatchObject({ config: { class: 'foo', }, str: "[filename](_media/example.md ' ')", }); }); test('parse config with same key arguments', () => { const result = getAndRemoveConfig( "[filename](_media/example.md ' :class=foo :class=bar :bb=aa ')", ); expect(result).toMatchObject({ config: { class: ['foo', 'bar'], }, str: "[filename](_media/example.md ' ')", }); }); test('parse config with double quotes', () => { const result = getAndRemoveConfig( '[filename](_media/example.md ":include")', ); expect(result).toMatchObject({ config: {}, str: '[filename](_media/example.md ":include")', }); }); }); }); describe('core/render/tpl', () => { test('remove html tag in tree', () => { const result = tree([ { level: 2, slug: '#/cover?id=basic-usage', title: 'Basic usage', }, { level: 2, slug: '#/cover?id=custom-background', title: 'Custom background', }, { level: 2, slug: '#/cover?id=test', title: 'icoTest', }, ]); expect(result).toBe( /* html */ '', ); }); }); describe('core/render/slugify', () => { test('slugify()', () => { const htmlStrippedSlug = slugify( 'Bla bla bla ', ); expect(htmlStrippedSlug).toBe('bla-bla-bla-'); const nestedHtmlStrippedSlug = slugify( 'Another broken example', ); expect(nestedHtmlStrippedSlug).toBe('another-broken-example'); const emojiRemovedSlug = slugify('emoji test ⚠️🔥✅'); expect(emojiRemovedSlug).toBe('emoji-test-'); const multiSpaceSlug = slugify('Title with multiple spaces'); expect(multiSpaceSlug).toBe('title----with---multiple-spaces'); const numberLeadingSlug = slugify('123abc'); expect(numberLeadingSlug).toBe('_123abc'); const firstDuplicate = slugify('duplicate'); expect(firstDuplicate).toBe('duplicate'); const secondDuplicate = slugify('duplicate'); expect(secondDuplicate).toBe('duplicate-1'); const thirdDuplicate = slugify('duplicate'); expect(thirdDuplicate).toBe('duplicate-2'); const mixedCaseSlug = slugify('This Is Mixed CASE'); expect(mixedCaseSlug).toBe('this-is-mixed-case'); const chinesePreservedSlug = slugify('你好 world'); expect(chinesePreservedSlug).toBe('你好-world'); const specialCharSlug = slugify('C++ vs. Java & Python!'); expect(specialCharSlug).toBe('c-vs-java--python'); const docsifyIgnoreSlug = slugify( 'Ignore Heading ', ); expect(docsifyIgnoreSlug).toBe('ignore-heading-'); const quoteCleanedSlug = slugify('"The content"'); expect(quoteCleanedSlug).toBe('the-content'); }); });