diff --git a/.eslintignore b/.eslintignore index fa88ee67e3..94485166b2 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1195,6 +1195,8 @@ packages/lib/services/interop/InteropService_Importer_Raw.js packages/lib/services/interop/Module.test.js packages/lib/services/interop/Module.js packages/lib/services/interop/types.js +packages/lib/services/interop/utils.test.js +packages/lib/services/interop/utils.js packages/lib/services/joplinCloudUtils.js packages/lib/services/joplinServer/personalizedUserContentBaseUrl.js packages/lib/services/keychain/KeychainService.test.js diff --git a/.gitignore b/.gitignore index daf97879a7..5db4a4268d 100644 --- a/.gitignore +++ b/.gitignore @@ -1171,6 +1171,8 @@ packages/lib/services/interop/InteropService_Importer_Raw.js packages/lib/services/interop/Module.test.js packages/lib/services/interop/Module.js packages/lib/services/interop/types.js +packages/lib/services/interop/utils.test.js +packages/lib/services/interop/utils.js packages/lib/services/joplinCloudUtils.js packages/lib/services/joplinServer/personalizedUserContentBaseUrl.js packages/lib/services/keychain/KeychainService.test.js diff --git a/packages/lib/services/interop/InteropService_Exporter_Html.ts b/packages/lib/services/interop/InteropService_Exporter_Html.ts index 8142cd2752..2a2e424ef2 100644 --- a/packages/lib/services/interop/InteropService_Exporter_Html.ts +++ b/packages/lib/services/interop/InteropService_Exporter_Html.ts @@ -16,6 +16,7 @@ import { assetsToHeaders } from '@joplin/renderer'; import getPluginSettingValue from '../plugins/utils/getPluginSettingValue'; import { LinkRenderingType } from '@joplin/renderer/MdToHtml'; import Logger from '@joplin/utils/Logger'; +import { parseRenderedNoteMetadata } from './utils'; const logger = Logger.create('InteropService_Exporter_Html'); @@ -128,8 +129,11 @@ export default class InteropService_Exporter_Html extends InteropService_Exporte }, }, }); + const noteContent = []; - if (item.title) noteContent.push(`
${escapeHtml(item.title)}
`); + const metadata = parseRenderedNoteMetadata(result.html ? result.html : ''); + if (!metadata.printTitle) logger.info('Not printing title because joplin-metadata-print-title tag is set to false'); + if (metadata.printTitle && item.title) noteContent.push(`
${escapeHtml(item.title)}
`); if (result.html) noteContent.push(result.html); const libRootPath = dirname(dirname(__dirname)); diff --git a/packages/lib/services/interop/utils.test.ts b/packages/lib/services/interop/utils.test.ts new file mode 100644 index 0000000000..dcd3a3c786 --- /dev/null +++ b/packages/lib/services/interop/utils.test.ts @@ -0,0 +1,35 @@ +import { RenderedNoteMetadata, parseRenderedNoteMetadata } from './utils'; + +describe('interop/utils', () => { + + test.each<[string, RenderedNoteMetadata]>([ + [ + '', + { printTitle: true }, + ], + [ + '', + { printTitle: false }, + ], + [ + '', + { printTitle: true }, + ], + [ + '', + { printTitle: false }, + ], + [ + '', + { printTitle: true }, + ], + [ + '', + { printTitle: false }, + ], + ])('should parse metadata from the note HTML body', async (bodyHtml, expected) => { + const actual = parseRenderedNoteMetadata(bodyHtml); + expect(actual).toEqual(expected); + }); + +}); diff --git a/packages/lib/services/interop/utils.ts b/packages/lib/services/interop/utils.ts new file mode 100644 index 0000000000..06ae850743 --- /dev/null +++ b/packages/lib/services/interop/utils.ts @@ -0,0 +1,25 @@ +/* eslint-disable import/prefer-default-export */ + +export interface RenderedNoteMetadata { + printTitle: boolean; +} + +export const parseRenderedNoteMetadata = (noteHtml: string) => { + const output: RenderedNoteMetadata = { + printTitle: true, + }; + + // + const match = noteHtml.match(//); + if (match) { + const [, propName, propValue] = match; + + if (propName === 'print-title') { + output.printTitle = propValue.toLowerCase() === 'true' || propValue === '1'; + } else { + throw new Error(`Unknown view metadata: ${propName}`); + } + } + + return output; +}; diff --git a/readme/api/references/plugin_rendered_note_metadata.md b/readme/api/references/plugin_rendered_note_metadata.md new file mode 100644 index 0000000000..7ec4039304 --- /dev/null +++ b/readme/api/references/plugin_rendered_note_metadata.md @@ -0,0 +1,11 @@ +# Rendered note metadata + +Joplin allows the use of certain metadata tags within the rendered (HTML) version of a note. + +At present, the "print-title" metadata tag is the only one supported. By default, the title of a note is displayed at the top when the note is printed or exported. However, this behavior may not always be desired, such as when a plugin needs to produce a document with a specific custom header. In such cases, you can disable the default behavior by including this tag and setting its value to `false`. + +You can add this tag either directly in the Markdown document or through a Markdown-it content script in the rendered note. + +To prevent the note title from being printed, include the following line in the document: + +`` \ No newline at end of file