You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-12-05 22:57:29 +02:00
62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
import { Editor, BackgroundComponent, EditorEventType, Vec2 } from 'js-draw';
|
|
|
|
const watchEditorForTemplateChanges = (
|
|
editor: Editor, initialTemplate: string, updateTemplate: (templateData: string)=> void,
|
|
) => {
|
|
const computeTemplate = (): string => {
|
|
let backgroundSize: Vec2|null = null;
|
|
|
|
// Only store the background size if the size isn't determined
|
|
// by the editor content. In this case, the background always
|
|
// appears to be full screen.
|
|
if (!editor.image.getAutoresizeEnabled()) {
|
|
backgroundSize = editor.getImportExportRect().size;
|
|
|
|
// Constrain the size: Don't allow an extremely small or extremely large template.
|
|
// Map components to constrained components.
|
|
backgroundSize = backgroundSize.map(component => {
|
|
const minDimen = 45;
|
|
const maxDimen = 5000;
|
|
|
|
return Math.max(Math.min(component, maxDimen), minDimen);
|
|
});
|
|
}
|
|
|
|
// Find the topmost background component (if any)
|
|
let backgroundComponent: BackgroundComponent|null = null;
|
|
for (const component of editor.image.getBackgroundComponents()) {
|
|
if (component instanceof BackgroundComponent) {
|
|
backgroundComponent = component;
|
|
}
|
|
}
|
|
|
|
const templateData = {
|
|
imageSize: backgroundSize?.xy,
|
|
backgroundData: backgroundComponent?.serialize(),
|
|
autoresize: editor.image.getAutoresizeEnabled(),
|
|
};
|
|
return JSON.stringify(templateData);
|
|
};
|
|
|
|
let lastTemplate = initialTemplate;
|
|
const updateTemplateIfNecessary = () => {
|
|
const newTemplate = computeTemplate();
|
|
|
|
if (newTemplate !== lastTemplate) {
|
|
updateTemplate(newTemplate);
|
|
lastTemplate = newTemplate;
|
|
}
|
|
};
|
|
|
|
// Whenever a command is done/undone, re-calculate the template & save.
|
|
editor.notifier.on(EditorEventType.CommandDone, () => {
|
|
updateTemplateIfNecessary();
|
|
});
|
|
|
|
editor.notifier.on(EditorEventType.CommandUndone, () => {
|
|
updateTemplateIfNecessary();
|
|
});
|
|
};
|
|
|
|
export default watchEditorForTemplateChanges;
|