mirror of
https://github.com/natelandau/obsidian-metadata.git
synced 2025-11-17 09:23:40 -05:00
feat: add new inline metadata (#15)
* feat: add new inline metadata to notes * fix: prepend note content after frontmatter * refactor: cleanup search patterns * feat(regex): find top of note * test: add headers * fix: insert to specified location * test: improve test coverage * docs: add inline metadata
This commit is contained in:
committed by
Nathaniel Landau
parent
13513b2a14
commit
17985615b3
@@ -32,6 +32,19 @@ class Application:
|
||||
self.questions = Questions()
|
||||
self.filters: list[VaultFilter] = []
|
||||
|
||||
def _load_vault(self) -> None:
|
||||
"""Load the vault."""
|
||||
|
||||
if len(self.filters) == 0:
|
||||
self.vault: Vault = Vault(config=self.config, dry_run=self.dry_run)
|
||||
else:
|
||||
self.vault = Vault(config=self.config, dry_run=self.dry_run, filters=self.filters)
|
||||
|
||||
alerts.success(
|
||||
f"Loaded {len(self.vault.notes_in_scope)} notes from {len(self.vault.all_notes)} total notes"
|
||||
)
|
||||
self.questions = Questions(vault=self.vault)
|
||||
|
||||
def application_main(self) -> None:
|
||||
"""Questions for the main application."""
|
||||
self._load_vault()
|
||||
@@ -70,31 +83,29 @@ class Application:
|
||||
|
||||
area = self.questions.ask_area()
|
||||
match area:
|
||||
case MetadataType.FRONTMATTER:
|
||||
case MetadataType.FRONTMATTER | MetadataType.INLINE:
|
||||
key = self.questions.ask_new_key(question="Enter the key for the new metadata")
|
||||
if key is None:
|
||||
if key is None: # pragma: no cover
|
||||
return
|
||||
|
||||
value = self.questions.ask_new_value(
|
||||
question="Enter the value for the new metadata"
|
||||
)
|
||||
if value is None:
|
||||
if value is None: # pragma: no cover
|
||||
return
|
||||
|
||||
num_changed = self.vault.add_metadata(area, key, value)
|
||||
if num_changed == 0:
|
||||
num_changed = self.vault.add_metadata(
|
||||
area=area, key=key, value=value, location=self.vault.insert_location
|
||||
)
|
||||
if num_changed == 0: # pragma: no cover
|
||||
alerts.warning(f"No notes were changed")
|
||||
return
|
||||
|
||||
alerts.success(f"Added metadata to {num_changed} notes")
|
||||
|
||||
case MetadataType.INLINE:
|
||||
alerts.warning(f"Adding metadata to {area} is not supported yet")
|
||||
|
||||
case MetadataType.TAGS:
|
||||
alerts.warning(f"Adding metadata to {area} is not supported yet")
|
||||
|
||||
case _:
|
||||
case _: # pragma: no cover
|
||||
return
|
||||
|
||||
def application_filter(self) -> None:
|
||||
@@ -114,7 +125,7 @@ class Application:
|
||||
match self.questions.ask_selection(choices=choices, question="Select an action"):
|
||||
case "apply_path_filter":
|
||||
path = self.questions.ask_filter_path()
|
||||
if path is None or path == "":
|
||||
if path is None or path == "": # pragma: no cover
|
||||
return
|
||||
|
||||
self.filters.append(VaultFilter(path_filter=path))
|
||||
@@ -122,14 +133,14 @@ class Application:
|
||||
|
||||
case "apply_metadata_filter":
|
||||
key = self.questions.ask_existing_key()
|
||||
if key is None:
|
||||
if key is None: # pragma: no cover
|
||||
return
|
||||
|
||||
questions2 = Questions(vault=self.vault, key=key)
|
||||
value = questions2.ask_existing_value(
|
||||
question="Enter the value for the metadata filter",
|
||||
)
|
||||
if value is None:
|
||||
if value is None: # pragma: no cover
|
||||
return
|
||||
if value == "":
|
||||
self.filters.append(VaultFilter(key_filter=key))
|
||||
@@ -302,7 +313,7 @@ class Application:
|
||||
self.delete_value()
|
||||
case "delete_inline_tag":
|
||||
self.delete_inline_tag()
|
||||
case _:
|
||||
case _: # pragma: no cover
|
||||
return
|
||||
|
||||
def application_rename_metadata(self) -> None:
|
||||
@@ -325,7 +336,7 @@ class Application:
|
||||
self.rename_value()
|
||||
case "rename_inline_tag":
|
||||
self.rename_inline_tag()
|
||||
case _:
|
||||
case _: # pragma: no cover
|
||||
return
|
||||
|
||||
def commit_changes(self) -> bool:
|
||||
@@ -373,7 +384,7 @@ class Application:
|
||||
key_to_delete = self.questions.ask_existing_keys_regex(
|
||||
question="Regex for the key(s) you'd like to delete?"
|
||||
)
|
||||
if key_to_delete is None:
|
||||
if key_to_delete is None: # pragma: no cover
|
||||
return
|
||||
|
||||
num_changed = self.vault.delete_metadata(key_to_delete)
|
||||
@@ -390,12 +401,12 @@ class Application:
|
||||
def delete_value(self) -> None:
|
||||
"""Delete a value from the vault."""
|
||||
key = self.questions.ask_existing_key(question="Which key contains the value to delete?")
|
||||
if key is None:
|
||||
if key is None: # pragma: no cover
|
||||
return
|
||||
|
||||
questions2 = Questions(vault=self.vault, key=key)
|
||||
value = questions2.ask_existing_value_regex(question="Regex for the value to delete")
|
||||
if value is None:
|
||||
if value is None: # pragma: no cover
|
||||
return
|
||||
|
||||
num_changed = self.vault.delete_metadata(key, value)
|
||||
@@ -409,19 +420,6 @@ class Application:
|
||||
|
||||
return
|
||||
|
||||
def _load_vault(self) -> None:
|
||||
"""Load the vault."""
|
||||
|
||||
if len(self.filters) == 0:
|
||||
self.vault: Vault = Vault(config=self.config, dry_run=self.dry_run)
|
||||
else:
|
||||
self.vault = Vault(config=self.config, dry_run=self.dry_run, filters=self.filters)
|
||||
|
||||
alerts.success(
|
||||
f"Loaded {len(self.vault.notes_in_scope)} notes from {len(self.vault.all_notes)} total notes"
|
||||
)
|
||||
self.questions = Questions(vault=self.vault)
|
||||
|
||||
def noninteractive_export_csv(self, path: Path) -> None:
|
||||
"""Export the vault metadata to CSV."""
|
||||
self._load_vault()
|
||||
@@ -440,11 +438,11 @@ class Application:
|
||||
original_key = self.questions.ask_existing_key(
|
||||
question="Which key would you like to rename?"
|
||||
)
|
||||
if original_key is None:
|
||||
if original_key is None: # pragma: no cover
|
||||
return
|
||||
|
||||
new_key = self.questions.ask_new_key()
|
||||
if new_key is None:
|
||||
if new_key is None: # pragma: no cover
|
||||
return
|
||||
|
||||
num_changed = self.vault.rename_metadata(original_key, new_key)
|
||||
@@ -460,11 +458,11 @@ class Application:
|
||||
"""Rename an inline tag."""
|
||||
|
||||
original_tag = self.questions.ask_existing_inline_tag(question="Which tag to rename?")
|
||||
if original_tag is None:
|
||||
if original_tag is None: # pragma: no cover
|
||||
return
|
||||
|
||||
new_tag = self.questions.ask_new_tag("New tag")
|
||||
if new_tag is None:
|
||||
if new_tag is None: # pragma: no cover
|
||||
return
|
||||
|
||||
num_changed = self.vault.rename_inline_tag(original_tag, new_tag)
|
||||
@@ -480,16 +478,16 @@ class Application:
|
||||
def rename_value(self) -> None:
|
||||
"""Rename a value in the vault."""
|
||||
key = self.questions.ask_existing_key(question="Which key contains the value to rename?")
|
||||
if key is None:
|
||||
if key is None: # pragma: no cover
|
||||
return
|
||||
|
||||
question_key = Questions(vault=self.vault, key=key)
|
||||
value = question_key.ask_existing_value(question="Which value would you like to rename?")
|
||||
if value is None:
|
||||
if value is None: # pragma: no cover
|
||||
return
|
||||
|
||||
new_value = question_key.ask_new_value()
|
||||
if new_value is None:
|
||||
if new_value is None: # pragma: no cover
|
||||
return
|
||||
|
||||
num_changes = self.vault.rename_metadata(key, value, new_value)
|
||||
@@ -511,7 +509,7 @@ class Application:
|
||||
answer = self.questions.ask_confirm(
|
||||
question="View diffs of individual files?", default=False
|
||||
)
|
||||
if not answer:
|
||||
if not answer: # pragma: no cover
|
||||
return
|
||||
|
||||
choices: list[dict[str, Any] | questionary.Separator] = [questionary.Separator()]
|
||||
|
||||
Reference in New Issue
Block a user