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