2020-02-14 01:59:23 +02:00
|
|
|
const os = require('os');
|
2020-10-21 01:23:55 +02:00
|
|
|
const { filename } = require('lib/path-utils');
|
|
|
|
const { asyncTest, setupDatabaseAndSynchronizer, switchClient } = require('test-utils.js');
|
2020-10-09 19:35:46 +02:00
|
|
|
const shim = require('lib/shim').default;
|
2020-10-21 01:23:55 +02:00
|
|
|
const MdToHtml = require('lib/joplin-renderer/MdToHtml').default;
|
2020-06-10 23:08:59 +02:00
|
|
|
const { themeStyle } = require('lib/theme');
|
2020-02-14 01:59:23 +02:00
|
|
|
|
2020-10-21 01:23:55 +02:00
|
|
|
function newTestMdToHtml(options:any = null) {
|
2020-03-23 02:47:25 +02:00
|
|
|
options = {
|
|
|
|
ResourceModel: {
|
|
|
|
isResourceUrl: () => false,
|
|
|
|
},
|
|
|
|
fsDriver: shim.fsDriver(),
|
|
|
|
...options,
|
|
|
|
};
|
|
|
|
|
|
|
|
return new MdToHtml(options);
|
|
|
|
}
|
|
|
|
|
2020-02-14 01:59:23 +02:00
|
|
|
describe('MdToHtml', function() {
|
|
|
|
|
2020-10-21 01:23:55 +02:00
|
|
|
beforeEach(async (done:Function) => {
|
2020-02-14 01:59:23 +02:00
|
|
|
await setupDatabaseAndSynchronizer(1);
|
|
|
|
await switchClient(1);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should convert from Markdown to Html', asyncTest(async () => {
|
|
|
|
const basePath = `${__dirname}/md_to_html`;
|
|
|
|
const files = await shim.fsDriver().readDirStats(basePath);
|
2020-03-23 02:47:25 +02:00
|
|
|
const mdToHtml = newTestMdToHtml();
|
2020-02-14 01:59:23 +02:00
|
|
|
|
|
|
|
for (let i = 0; i < files.length; i++) {
|
|
|
|
const mdFilename = files[i].path;
|
|
|
|
if (mdFilename.indexOf('.md') < 0) continue;
|
|
|
|
|
|
|
|
const mdFilePath = `${basePath}/${mdFilename}`;
|
|
|
|
const htmlPath = `${basePath}/${filename(mdFilePath)}.html`;
|
|
|
|
|
2020-03-06 02:54:21 +02:00
|
|
|
// if (mdFilename !== 'sanitize_9.md') continue;
|
2020-02-14 01:59:23 +02:00
|
|
|
|
2020-10-21 01:23:55 +02:00
|
|
|
const mdToHtmlOptions:any = {
|
2020-02-14 01:59:23 +02:00
|
|
|
bodyOnly: true,
|
|
|
|
};
|
|
|
|
|
2020-03-23 02:47:25 +02:00
|
|
|
if (mdFilename === 'checkbox_alternative.md') {
|
|
|
|
mdToHtmlOptions.plugins = {
|
|
|
|
checkbox: {
|
2020-10-21 01:23:55 +02:00
|
|
|
checkboxRenderingType: 2,
|
2020-03-23 02:47:25 +02:00
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2020-02-14 01:59:23 +02:00
|
|
|
const markdown = await shim.fsDriver().readFile(mdFilePath);
|
|
|
|
let expectedHtml = await shim.fsDriver().readFile(htmlPath);
|
|
|
|
|
|
|
|
const result = await mdToHtml.render(markdown, null, mdToHtmlOptions);
|
|
|
|
let actualHtml = result.html;
|
|
|
|
|
|
|
|
if (os.EOL === '\r\n') {
|
|
|
|
expectedHtml = expectedHtml.replace(/\r\n/g, '\n');
|
|
|
|
actualHtml = actualHtml.replace(/\r\n/g, '\n');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (actualHtml !== expectedHtml) {
|
|
|
|
console.info('');
|
|
|
|
console.info(`Error converting file: ${mdFilename}`);
|
|
|
|
console.info('--------------------------------- Got:');
|
|
|
|
console.info(actualHtml);
|
|
|
|
console.info('--------------------------------- Raw:');
|
|
|
|
console.info(actualHtml.split('\n'));
|
|
|
|
console.info('--------------------------------- Expected:');
|
|
|
|
console.info(expectedHtml.split('\n'));
|
|
|
|
console.info('--------------------------------------------');
|
|
|
|
console.info('');
|
|
|
|
|
|
|
|
expect(false).toBe(true);
|
|
|
|
// return;
|
|
|
|
} else {
|
|
|
|
expect(true).toBe(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
|
2020-03-23 02:47:25 +02:00
|
|
|
it('should return enabled plugin assets', asyncTest(async () => {
|
2020-10-21 01:23:55 +02:00
|
|
|
const pluginOptions:any = {};
|
2020-03-23 02:47:25 +02:00
|
|
|
const pluginNames = MdToHtml.pluginNames();
|
|
|
|
|
|
|
|
for (const n of pluginNames) pluginOptions[n] = { enabled: false };
|
|
|
|
|
|
|
|
{
|
|
|
|
const mdToHtml = newTestMdToHtml({ pluginOptions: pluginOptions });
|
|
|
|
const assets = await mdToHtml.allAssets(themeStyle(1));
|
|
|
|
expect(assets.length).toBe(1); // Base note style should always be returned
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
pluginOptions['checkbox'].enabled = true;
|
|
|
|
const mdToHtml = newTestMdToHtml({ pluginOptions: pluginOptions });
|
|
|
|
|
|
|
|
const assets = await mdToHtml.allAssets(themeStyle(1));
|
|
|
|
expect(assets.length).toBe(2);
|
|
|
|
expect(assets[1].mime).toBe('text/css');
|
|
|
|
|
|
|
|
const content = await shim.fsDriver().readFile(assets[1].path);
|
|
|
|
expect(content.indexOf('joplin-checklist') >= 0).toBe(true);
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
|
|
|
|
it('should wrapped the rendered Markdown', asyncTest(async () => {
|
|
|
|
const mdToHtml = newTestMdToHtml();
|
|
|
|
|
|
|
|
// In this case, the HTML contains both the style and
|
|
|
|
// the rendered markdown wrapped in a DIV.
|
|
|
|
const result = await mdToHtml.render('just **testing**');
|
2020-10-21 01:23:55 +02:00
|
|
|
expect(result.cssStrings.length).toBeGreaterThan(0);
|
2020-03-23 02:47:25 +02:00
|
|
|
expect(result.html.indexOf('rendered-md') >= 0).toBe(true);
|
|
|
|
}));
|
|
|
|
|
|
|
|
it('should return the rendered body only', asyncTest(async () => {
|
|
|
|
const mdToHtml = newTestMdToHtml();
|
|
|
|
|
|
|
|
// In this case, the HTML contains only the rendered markdown,
|
|
|
|
// with no wrapper and no style.
|
|
|
|
// The style is instead in the cssStrings property.
|
|
|
|
const result = await mdToHtml.render('just **testing**', null, { bodyOnly: true });
|
2020-10-21 01:23:55 +02:00
|
|
|
expect(result.cssStrings.length).toBeGreaterThan(0);
|
2020-07-04 13:17:30 +02:00
|
|
|
expect(result.html.trim()).toBe('just <strong>testing</strong>');
|
2020-03-23 02:47:25 +02:00
|
|
|
}));
|
|
|
|
|
|
|
|
it('should split HTML and CSS', asyncTest(async () => {
|
|
|
|
const mdToHtml = newTestMdToHtml();
|
|
|
|
|
|
|
|
// It is similar to the bodyOnly option, excepts that
|
|
|
|
// the rendered Markdown is wrapped in a DIV
|
|
|
|
const result = await mdToHtml.render('just **testing**', null, { splitted: true });
|
2020-10-21 01:23:55 +02:00
|
|
|
expect(result.cssStrings.length).toBeGreaterThan(0);
|
2020-03-23 02:47:25 +02:00
|
|
|
expect(result.html.trim()).toBe('<div id="rendered-md"><p>just <strong>testing</strong></p>\n</div>');
|
|
|
|
}));
|
2020-03-10 01:24:57 +02:00
|
|
|
|
|
|
|
|
2020-02-14 01:59:23 +02:00
|
|
|
});
|