diff --git a/legacy_settings/data_1_0.json b/legacy_settings/data_1_0.json index 27832c9..4d679d6 100644 --- a/legacy_settings/data_1_0.json +++ b/legacy_settings/data_1_0.json @@ -2,5 +2,45 @@ "dataview-recent-files": "markdown:\nMy own plugin to show the recently modified files.\n[[2024-06-13 Survey group culture]]\n\n![[00 Meta/Misc/Test.jpg]]\n\n[[2024-08-05 Review Cs-based Rydberg quantum computers]]", "dataview": "Super-useful plugin that allows querying the notes to provide database functionality. 🔥🔥🔥", "highlightr-plugin": "Allows highlighting the markdown text.", - "obsidian-completr": "Allows auto-completion of commands. Very useful." + "obsidian-completr": "Allows auto-completion of commands. Very useful.", + "find-unlinked-files": "Very useful to find orphaned files and broken links.", + "homepage": "Useful to show a customized homepage.", + "obsidian-icon-folder": "Useful to customize icons.", + "import-attachments-plus": "My own plugin to import attachments by moving them into the vault.", + "obsidian-languagetool-plugin": "Very useful as spell checker.", + "languagetool": "It is claimed to be better but it does not work. It is still in beta function.", + "number-headings-obsidian": "Very useful to add numbers to the headings.", + "pdf-plus": "Very useful to comment PDF documents in Obsidian.", + "templater-obsidian": "Very useful to define templates.", + "obsidian-tasks-plugin": "Not really useful. Never used so far.", + "obsidian-style-settings": "Super useful to customize the style with CCS and be able to modify the settings from Obsidian.", + "obsidian-smart-typography": "Semi useful to improve typography of symbols.", + "wikilinks-to-mdlinks-obsidian": "Not really needed. It converts Wikilinks to MD links.", + "webpage-html-export": "Super useful to export in HTML. It is a bit clunky to load. It is per default disabled, unless I need it.", + "frontmatter-modified-date": "Very useful to update the property `modified date`.", + "supercharged-links-obsidian": "The idea is very nice but then the MD notes are not really readable outside of Obsidian. Disabled for now.", + "tag-wrangler": "Very useful to rename tags across all notes.", + "sheets": "Useful to extend tables and merge cells.", + "obsidian-html-plugin": "It allows opening HTML files in Obsidian.", + "obsidian-advanced-uri": "Very useful to copy URI.", + "callout-manager": "Offers a GUI to customize callouts.", + "obsidian-file-path-to-uri": "Not really needed. It converts a file path to a URI.", + "obsidian-text-expander-js": "Quite powerful to run inline scripts, and replace predefined macros. However, not really used.", + "omnisearch": "Powerful tool to search through the vault.", + "obsidian-outliner": "Very handy to operate on outlines.", + "url-into-selection": "Not really needed. It causes more confusion when pasting on existing selected text.", + "periodic-notes": "Manages daily notes. Just used for daily notes.", + "settings-search": "Adds a search field with a fuzzy search functionality to search through Obsidian settings.", + "text-extractor": "I did not really test it how good it works.", + "file-explorer-note-count": "Very useful to display the number of notes in the various folders.", + "plugins-annotations": "My own plugin to take notes about installed plugins.", + "editing-toolbar": "Nice toolbar shown above the notes. Quite handy.", + "obsidian-spaced-repetition": "Super effective plugin to learn flashcards.", + "table-editor-obsidian": "A must to operate on tables in Obsidian. 🚀🚀🚀", + "settings-management": "Enhanced settings with multiple configurations.", + "obsidian-admonition": "Improve callouts 🖋️. They can be entered as `codeblocks`.", + "obsidian-divide-and-conquer": "Plugin useful to debug problems with plugins. Generally, it can be left disabled.", + "js-engine": "Allows executing Javascript dynamically in the note.", + "plugin-reloader": "Allows reloading a specific plugin without restarting Obsidian. Hotkeys configurable.", + "obsidian-kanban": "Plugin for the Kanban 🗓️ organization." } \ No newline at end of file diff --git a/legacy_settings/data_1_3.json b/legacy_settings/data_1_3.json index 97e3096..1901b16 100644 --- a/legacy_settings/data_1_3.json +++ b/legacy_settings/data_1_3.json @@ -4,7 +4,47 @@ "dataview-recent-files": "markdown:\nMy own plugin to show the recently modified files.\n[[2024-06-13 Survey group culture]]\n\n![[00 Meta/Misc/Test.jpg]]\n\n[[2024-08-05 Review Cs-based Rydberg quantum computers]]", "dataview": "Super-useful plugin that allows querying the notes to provide database functionality. 🔥🔥🔥", "highlightr-plugin": "Allows highlighting the markdown text.", - "obsidian-completr": "Allows auto-completion of commands. Very useful." + "obsidian-completr": "Allows auto-completion of commands. Very useful.", + "find-unlinked-files": "Very useful to find orphaned files and broken links.", + "homepage": "Useful to show a customized homepage.", + "obsidian-icon-folder": "Useful to customize icons.", + "import-attachments-plus": "My own plugin to import attachments by moving them into the vault.", + "obsidian-languagetool-plugin": "Very useful as spell checker.", + "languagetool": "It is claimed to be better but it does not work. It is still in beta function.", + "number-headings-obsidian": "Very useful to add numbers to the headings.", + "pdf-plus": "Very useful to comment PDF documents in Obsidian.", + "templater-obsidian": "Very useful to define templates.", + "obsidian-tasks-plugin": "Not really useful. Never used so far.", + "obsidian-style-settings": "Super useful to customize the style with CCS and be able to modify the settings from Obsidian.", + "obsidian-smart-typography": "Semi useful to improve typography of symbols.", + "wikilinks-to-mdlinks-obsidian": "Not really needed. It converts Wikilinks to MD links.", + "webpage-html-export": "Super useful to export in HTML. It is a bit clunky to load. It is per default disabled, unless I need it.", + "frontmatter-modified-date": "Very useful to update the property `modified date`.", + "supercharged-links-obsidian": "The idea is very nice but then the MD notes are not really readable outside of Obsidian. Disabled for now.", + "tag-wrangler": "Very useful to rename tags across all notes.", + "sheets": "Useful to extend tables and merge cells.", + "obsidian-html-plugin": "It allows opening HTML files in Obsidian.", + "obsidian-advanced-uri": "Very useful to copy URI.", + "callout-manager": "Offers a GUI to customize callouts.", + "obsidian-file-path-to-uri": "Not really needed. It converts a file path to a URI.", + "obsidian-text-expander-js": "Quite powerful to run inline scripts, and replace predefined macros. However, not really used.", + "omnisearch": "Powerful tool to search through the vault.", + "obsidian-outliner": "Very handy to operate on outlines.", + "url-into-selection": "Not really needed. It causes more confusion when pasting on existing selected text.", + "periodic-notes": "Manages daily notes. Just used for daily notes.", + "settings-search": "Adds a search field with a fuzzy search functionality to search through Obsidian settings.", + "text-extractor": "I did not really test it how good it works.", + "file-explorer-note-count": "Very useful to display the number of notes in the various folders.", + "plugins-annotations": "My own plugin to take notes about installed plugins.", + "editing-toolbar": "Nice toolbar shown above the notes. Quite handy.", + "obsidian-spaced-repetition": "Super effective plugin to learn flashcards.", + "table-editor-obsidian": "A must to operate on tables in Obsidian. 🚀🚀🚀", + "settings-management": "Enhanced settings with multiple configurations.", + "obsidian-admonition": "Improve callouts 🖋️. They can be entered as `codeblocks`.", + "obsidian-divide-and-conquer": "Plugin useful to debug problems with plugins. Generally, it can be left disabled.", + "js-engine": "Allows executing Javascript dynamically in the note.", + "plugin-reloader": "Allows reloading a specific plugin without restarting Obsidian. Hotkeys configurable.", + "obsidian-kanban": "Plugin for the Kanban 🗓️ organization." }, "plugins_annotations_uuid": "FAA70013-38E9-4FDF-B06A-F899F6487C19", "hide_placeholders": true, @@ -13,7 +53,5 @@ "label_desktop": "Personal annotation: ", "label_placeholder": "Add your personal comment about ${plugin_name} here...", "editable": true, - "automatic_remove": false, - "markdown_file_path": "00 Meta/Misc/Plugins annotations.md", - "markdown_notes": false + "automatic_remove": false } \ No newline at end of file diff --git a/legacy_settings/data_1_4.json b/legacy_settings/data_1_4.json index f79a670..00cf296 100644 --- a/legacy_settings/data_1_4.json +++ b/legacy_settings/data_1_4.json @@ -229,7 +229,5 @@ "label_desktop": "Personal annotation: ", "label_placeholder": "Add your personal comment about ${plugin_name} here...", "editable": true, - "automatic_remove": false, - "markdown_file_path": "00 Meta/Misc/Plugins annotations.md", - "markdown_notes": false + "automatic_remove": false } \ No newline at end of file diff --git a/src/defaults.ts b/src/defaults.ts index 094fa24..69bf308 100644 --- a/src/defaults.ts +++ b/src/defaults.ts @@ -1,5 +1,17 @@ // defaults.ts -// import { PluginsAnnotationsSettings_1_4_0 } from './types_legacy'; +import { PluginsAnnotationsSettings } from './types'; -export const a = 1; \ No newline at end of file +export const DEFAULT_SETTINGS: PluginsAnnotationsSettings = { + annotations: {}, + plugins_annotations_uuid: 'BC56AB7B-A46F-4ACF-9BA1-3A4461F74C79', + hide_placeholders: false, + delete_placeholder_string_on_insertion: false, + label_mobile: 'Annotation: ', + label_desktop: 'Personal annotation: ', + label_placeholder : "Add your personal comment about ${plugin_name} here...", + editable: true, + automatic_remove: false, + markdown_file_path: '', + compatibility: '1.5.0', +} diff --git a/src/defaults_legacy.ts b/src/defaults_legacy.ts index fa4474c..e7fe04a 100644 --- a/src/defaults_legacy.ts +++ b/src/defaults_legacy.ts @@ -12,7 +12,6 @@ export const DEFAULT_SETTINGS_1_4_0: PluginsAnnotationsSettings_1_4_0 = { label_placeholder : "Add your personal comment about ${plugin_name} here...", editable: true, automatic_remove: false, - markdown_file_path: '', } export const DEFAULT_SETTINGS_1_3_0: PluginsAnnotationsSettings_1_3_0 = { diff --git a/src/main.ts b/src/main.ts index 47fada0..e58ae3b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,15 +14,16 @@ import { // App, } from 'obsidian'; import { around } from 'monkey-around'; -import { AnnotationType } from './types'; -import { PluginAnnotationDict_1_4_0, isPluginsAnnotationsSettings_1_4_0, PluginsAnnotationsSettings_1_4_0, PluginsAnnotationsSettings_1_3_0, isPluginAnnotationDictFormat_1_3_0, isSettingsFormat_1_3_0} from 'types_legacy' +import { AnnotationType, isPluginsAnnotationsSettings, PluginAnnotationDict, PluginsAnnotationsSettings } from './types'; +import { PluginAnnotationDict_1_4_0, PluginsAnnotationsSettings_1_4_0, PluginsAnnotationsSettings_1_3_0, isPluginAnnotationDictFormat_1_3_0, isSettingsFormat_1_3_0, isSettingsFormat_1_4_0, parse_annotation_1_4_0, } from 'types_legacy' import { DEFAULT_SETTINGS_1_3_0, DEFAULT_SETTINGS_1_4_0 } from './defaults_legacy'; +import { DEFAULT_SETTINGS } from 'defaults'; import { PluginsAnnotationsSettingTab } from 'settings_tab' import * as path from 'path'; import { readAnnotationsFromFile, writeAnnotationsToFile } from 'manageAnnotations'; export default class PluginsAnnotations extends Plugin { - settings: PluginsAnnotationsSettings_1_4_0 = {...DEFAULT_SETTINGS_1_4_0}; + settings: PluginsAnnotationsSettings = {...DEFAULT_SETTINGS}; pluginNameToIdMap: Record = {}; pluginIdToNameMap: Record = {}; @@ -71,9 +72,35 @@ export default class PluginsAnnotations extends Plugin { // type: AnnotationType.markdown, - if (isPluginsAnnotationsSettings_1_4_0(data)) { - const settings: PluginsAnnotationsSettings_1_4_0 = data; + if (isPluginsAnnotationsSettings(data)) { + const settings: PluginsAnnotationsSettings = data; return settings; + } else if (isSettingsFormat_1_4_0(data)) { // previous versions where the name of the plugins was not stored + // Upgrade annotations format + const upgradedAnnotations: PluginAnnotationDict = {}; + for (const pluginId in data.annotations) { + const annotation = data.annotations[pluginId]; + const {type,content} = parse_annotation_1_4_0(annotation.anno); + upgradedAnnotations[pluginId] = { + name: annotation.name, + desc: content, + type: type, + }; + } + + const oldSettings: PluginsAnnotationsSettings_1_4_0 = data; + + // Update the data with the new format + const newSettings: PluginsAnnotationsSettings = { + ...oldSettings, + annotations: upgradedAnnotations, + plugins_annotations_uuid: DEFAULT_SETTINGS.plugins_annotations_uuid, + compatibility: DEFAULT_SETTINGS.compatibility, + markdown_file_path: DEFAULT_SETTINGS.markdown_file_path + }; + wasUpdated = true; + return getSettingsFromData(newSettings); + } else if (isSettingsFormat_1_3_0(data)) { // previous versions where the name of the plugins was not stored // Upgrade annotations format const upgradedAnnotations: PluginAnnotationDict_1_4_0 = {}; @@ -105,10 +132,9 @@ export default class PluginsAnnotations extends Plugin { }; // Merge loaded settings with default settings - this.settings = Object.assign({}, DEFAULT_SETTINGS_1_4_0, getSettingsFromData(await this.loadData())); + this.settings = Object.assign({}, DEFAULT_SETTINGS, getSettingsFromData(await this.loadData())); if(wasUpdated) { - console.log("SAVED"); this.debouncedSaveAnnotations(); } @@ -134,7 +160,7 @@ export default class PluginsAnnotations extends Plugin { } else return ""; } - async saveSettings(settings:PluginsAnnotationsSettings_1_4_0) { + async saveSettings(settings:PluginsAnnotationsSettings) { try { await this.saveData(settings); } catch (error) { @@ -277,24 +303,6 @@ export default class PluginsAnnotations extends Plugin { } } - // Function to render the annotation based on preamble - parse_annotation(annotation_div: HTMLDivElement, text: string): {type:AnnotationType,content:string} { - const lines = text.split('\n'); - const preamble = lines[0].toLowerCase(); - const sliced = lines.slice(1).join('\n'); - - annotation_div.innerHTML = ''; - if (preamble.startsWith('html:')) { - return {type: AnnotationType.html, content: sliced}; - } else if (preamble.startsWith('markdown:')) { - return {type: AnnotationType.markdown, content: sliced}; - } else if (preamble.startsWith('text:')) { - return {type: AnnotationType.text, content: sliced}; - } else { - return {type: AnnotationType.text, content: text}; - } - } - // Helper function to parse links and add click listeners parse_links(element: HTMLElement) { const links = element.querySelectorAll('a'); @@ -372,7 +380,7 @@ export default class PluginsAnnotations extends Plugin { const placeholder = (this.settings.label_placeholder).replace(/\$\{plugin_name\}/g, pluginName); let isPlaceholder = this.settings.annotations[pluginId] ? false : true; - let annotation_text = ((this.settings.annotations[pluginId] && this.settings.annotations[pluginId].anno) || placeholder).trim(); + let annotation_text = ((this.settings.annotations[pluginId] && this.settings.annotations[pluginId].desc) || placeholder).trim(); if (isPlaceholder) { annotation_div.classList.add('plugin-comment-placeholder'); @@ -384,7 +392,7 @@ export default class PluginsAnnotations extends Plugin { // Parsing the stored annotation let type:AnnotationType; let content:string; - ({type,content} = this.parse_annotation(annotation_div,annotation_text)); + ({type,content} = parse_annotation_1_4_0(annotation_text)); // Initial render if(isPlaceholder) { @@ -443,7 +451,7 @@ export default class PluginsAnnotations extends Plugin { } isPlaceholder = true; } else { - ({type,content} = this.parse_annotation(annotation_div,annotation_text)); + ({type,content} = parse_annotation_1_4_0(annotation_text)); this.render_annotation(annotation_div,type,content); } } @@ -470,9 +478,9 @@ export default class PluginsAnnotations extends Plugin { } else { isPlaceholder = false; this.settings.annotations[pluginId] = { - anno: annotation_text, + desc: annotation_text, name: pluginName, - // type: AnnotationType.markdown, + type: AnnotationType.markdown, // FIXME }; annotation_div.classList.remove('plugin-comment-placeholder'); isPlaceholder = false; @@ -644,9 +652,9 @@ export default class PluginsAnnotations extends Plugin { this.disconnectObservers(); } - getUninstalledPlugins(): PluginAnnotationDict_1_4_0 { + getUninstalledPlugins(): PluginAnnotationDict { const installedPluginIds = new Set(Object.keys(this.app.plugins.manifests)); - const uninstalledPlugins: PluginAnnotationDict_1_4_0 = {}; + const uninstalledPlugins: PluginAnnotationDict = {}; for (const pluginId in this.settings.annotations) { if (!installedPluginIds.has(pluginId)) { diff --git a/src/manageAnnotations.ts b/src/manageAnnotations.ts index 0b2ecc3..7a771aa 100644 --- a/src/manageAnnotations.ts +++ b/src/manageAnnotations.ts @@ -5,6 +5,7 @@ import { Platform, TFile } from "obsidian"; import { createFolderIfNotExists, joinPaths, makePosixPathOScompatible, parseFilePath, showConfirmationDialog } from "utils"; import { parse, SyntaxError } from "./peggy.mjs"; import { PluginAnnotationDict_1_4_0 } from "types_legacy"; +import { PluginAnnotationDict } from "types"; export async function handleMarkdownFilePathChange(plugin: PluginsAnnotations, filepath: string): Promise { const file = plugin.app.vault.getAbstractFileByPath(filepath); @@ -74,7 +75,7 @@ export async function readAnnotationsFromFile(plugin: PluginsAnnotations): Promi const md_content = await plugin.app.vault.read(file); try { - const md_content_parsed = parse(md_content) as PluginAnnotationDict_1_4_0; + const md_content_parsed = parse(md_content) as PluginAnnotationDict; plugin.settings.annotations = md_content_parsed; } catch(error) { if (error instanceof SyntaxError) { @@ -100,7 +101,7 @@ export async function writeAnnotationsToFile(plugin: PluginsAnnotations) { const content: string[] = [header]; for (const pluginId in annotations) { - content.push(`# ${annotations[pluginId].name}\n\n\n\n${annotations[pluginId].anno}\n\n`); + content.push(`# ${annotations[pluginId].name}\n\n\n\n${annotations[pluginId].desc}\n\n`); } console.log(content.join('\n')); diff --git a/src/settings_tab.ts b/src/settings_tab.ts index 225ec24..f2e8a60 100644 --- a/src/settings_tab.ts +++ b/src/settings_tab.ts @@ -3,6 +3,7 @@ import PluginsAnnotations from "main"; import { handleMarkdownFilePathChange } from "manageAnnotations"; import { AbstractInputSuggest, App, Platform, PluginSettingTab, prepareFuzzySearch, SearchResult, Setting, TFile } from "obsidian"; +import { PluginAnnotationDict } from "types"; import { PluginAnnotationDict_1_4_0 } from "types_legacy"; import { parseFilePath } from "utils"; @@ -56,7 +57,7 @@ export class PluginsAnnotationsSettingTab extends PluginSettingTab { } createUninstalledPluginSettings(containerEl: HTMLElement) { - const uninstalledPlugins:PluginAnnotationDict_1_4_0 = this.plugin.getUninstalledPlugins(); + const uninstalledPlugins:PluginAnnotationDict = this.plugin.getUninstalledPlugins(); const heading = new Setting(containerEl).setName('Personal annotations of no longer installed community plugins').setHeading(); const headingEl = heading.settingEl; @@ -86,7 +87,7 @@ export class PluginsAnnotationsSettingTab extends PluginSettingTab { Object.keys({...uninstalledPlugins}).forEach(pluginId => { const pluginSetting = new Setting(containerEl) .setName(`Plugin ${uninstalledPlugins[pluginId].name}`) - .setDesc("Annotation: " + uninstalledPlugins[pluginId].anno) + .setDesc("Annotation: " + uninstalledPlugins[pluginId].desc) .addButton(button => button .setButtonText('Delete') .setCta() diff --git a/src/types.ts b/src/types.ts index 1b778c3..100d258 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,40 @@ // types.ts -import { DEFAULT_SETTINGS_1_4_0 } from './defaults_legacy'; +import { DEFAULT_SETTINGS } from "defaults"; + +export interface PluginAnnotation { + name: string; // extended name of the plugin + desc: string; // personal annontation + type: AnnotationType; // annotation type +} + +export interface PluginAnnotationDict { + [pluginId: string]: PluginAnnotation; +} + +export interface PluginsAnnotationsSettings { + annotations: PluginAnnotationDict; + plugins_annotations_uuid: string; + hide_placeholders: boolean; + delete_placeholder_string_on_insertion: boolean; + label_mobile: string; + label_desktop: string; + label_placeholder: string; + editable: boolean; + automatic_remove: boolean; + markdown_file_path: string; + compatibility: string; +} + +export function isPluginsAnnotationsSettings(s:unknown): s is PluginsAnnotationsSettings { + if (typeof s !== 'object' || s === null) { + return false; + } + return 'annotations' in s + && 'compatibility' in s && (s as PluginsAnnotationsSettings).compatibility === '1.5.0' + && 'plugins_annotations_uuid' in s + && (s as PluginsAnnotationsSettings).plugins_annotations_uuid === DEFAULT_SETTINGS.plugins_annotations_uuid; +} // type: AnnotationType; // type of annotation diff --git a/src/types_legacy.ts b/src/types_legacy.ts index 4256bfc..8d9bd64 100644 --- a/src/types_legacy.ts +++ b/src/types_legacy.ts @@ -1,32 +1,24 @@ // types_legacy.ts import { DEFAULT_SETTINGS_1_3_0, DEFAULT_SETTINGS_1_4_0 } from "defaults_legacy"; +import { AnnotationType, PluginAnnotation, PluginsAnnotationsSettings } from "types"; /* VERSION 1.4 */ -export interface PluginAnnotation_1_4_0 { - name: string; // extended name of the plugin +export interface PluginAnnotation_1_4_0 extends Omit { anno: string; // personal annontation } -export interface PluginAnnotationDict_1_4_0 { +export type PluginAnnotationDict_1_4_0 = { [pluginId: string]: PluginAnnotation_1_4_0; } -export interface PluginsAnnotationsSettings_1_4_0 { +// Extend the original interface and override the annotations property +export interface PluginsAnnotationsSettings_1_4_0 extends Omit { annotations: PluginAnnotationDict_1_4_0; - plugins_annotations_uuid: string; - hide_placeholders: boolean; - delete_placeholder_string_on_insertion: boolean; - label_mobile: string; - label_desktop: string; - label_placeholder: string; - editable: boolean; - automatic_remove: boolean; - markdown_file_path: string; } -export function isPluginsAnnotationsSettings_1_4_0(s:unknown): s is PluginsAnnotationsSettings_1_4_0 { +export function isSettingsFormat_1_4_0(s:unknown): s is PluginsAnnotationsSettings_1_4_0 { if (typeof s !== 'object' || s === null) { return false; } @@ -35,6 +27,23 @@ export function isPluginsAnnotationsSettings_1_4_0(s:unknown): s is PluginsAnnot && (s as PluginsAnnotationsSettings_1_4_0).plugins_annotations_uuid === DEFAULT_SETTINGS_1_4_0.plugins_annotations_uuid; } +// Function to render the annotation based on preamble +export function parse_annotation_1_4_0(text: string): {type:AnnotationType,content:string} { + const lines = text.split('\n'); + const preamble = lines[0].toLowerCase(); + const sliced = lines.slice(1).join('\n'); + + // annotation_div.innerHTML = ''; + if (preamble.startsWith('html:')) { + return {type: AnnotationType.html, content: sliced}; + } else if (preamble.startsWith('markdown:')) { + return {type: AnnotationType.markdown, content: sliced}; + } else if (preamble.startsWith('text:')) { + return {type: AnnotationType.text, content: sliced}; + } else { + return {type: AnnotationType.text, content: text}; + } +} /* VERSION 1.3 */