diff --git a/plugins/plugin-annotations/src/banner.mjs b/plugins/plugin-annotations/src/banner.mjs index 423749d730c..404f28d245d 100644 --- a/plugins/plugin-annotations/src/banner.mjs +++ b/plugins/plugin-annotations/src/banner.mjs @@ -1,23 +1,63 @@ -// Export macros -export const bannerMacros = { - banner: function (so) { - // Mix defaults with settings object - so = { - text: '', - dy: -1, - spaces: 12, - repeat: 10, - className: '', - ...so, - } - so.path.attr('data-text-dy', so.dy).attr('data-text-class', `${so.className} center`) - const spacer = ' '.repeat(so.spaces) +import { getIds } from './utils.mjs' - for (let i = 0; i < so.repeat; i++) { - so.path.attr('data-text', spacer) - so.path.attr('data-text', so.text) - } - - so.path.attr('data-text', spacer) - }, +/* + * Defaults for the bannner macro + */ +const macroDefaults = { + classes: 'center', + dy: -1, + force: false, + id: 'banner', + repeat: 10, + spaces: 12, } + +/* + * The rmbanner macro + */ +const rmbanner = function (id = macroDefaults.id, { paths, store, part }) { + for (const pid of Object.values( + store.get(['parts', part.name, 'macros', 'banner', 'ids', id, 'paths'], {}) + )) + delete paths[pid] +} + +const banner = function (config, { part, paths, store, log, complete }) { + /* + * Don't add a banne when complete is false, unless force is true + */ + if (!complete && !config.force) return + + /* + * Merge macro defaults with user-provided config to create the macro config (mc) + */ + const mc = { ...macroDefaults, ...config } + + /* + * Get the list of IDs + */ + const ids = getIds(['banner'], mc.id, 'banner') + + /* + * Prepare the path to hold the banner text + */ + paths[ids.banner] = mc.path + .clone() + .setClass('hidden') + .attr('data-text-dy', mc.dy) + .attr('data-text-class', mc.classes) + + /* + * Construct the text string piece by piece so it gets translated + */ + const spacer = ' '.repeat(mc.spaces) + for (let i = 0; i < mc.repeat; i++) paths[ids.banner].addText(spacer).addText(mc.text) + + /* + * Store all IDs in the store so we can remove this macro with rmbanner + */ + store.set(['parts', part.name, 'macros', 'banner', 'ids', mc.id, 'paths'], ids) +} + +// Export macros +export const bannerMacros = { banner, rmbanner } diff --git a/plugins/plugin-annotations/src/utils.mjs b/plugins/plugin-annotations/src/utils.mjs new file mode 100644 index 00000000000..f513c13fca8 --- /dev/null +++ b/plugins/plugin-annotations/src/utils.mjs @@ -0,0 +1,9 @@ +/* + * Helper method to get the various IDs for a macro + */ +export const getIds = (keys, id, macroName) => { + const ids = {} + for (const key of keys) ids[key] = `__macro_${macroName}_${id}_${key}` + + return ids +}