--- name: extract_obsidian_embeds kind: function lang: py domain: obsidian version: "1.0.0" purity: pure signature: "def extract_obsidian_embeds(body: str) -> list" description: "Extrae SOLO los embeds ![[...]] (attachments incrustados: imagenes, pdf, otras notas) del cuerpo de una nota de Obsidian, ignorando los wikilinks normales [[...]]. Para cada embed devuelve el target tal cual (nombre de archivo), quitando alias (|...) y anclas (#...). Deduplica preservando orden de aparicion. Pura, sin I/O. Util para detectar que attachments arrastra una nota al migrar un subgrafo." tags: [obsidian, embed, attachment, image, markdown, extract, migrate] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "" imports: ["re"] params: - name: body desc: "Cuerpo Markdown de una nota de Obsidian (idealmente sin frontmatter). Puede mezclar wikilinks [[...]] y embeds ![[...]] con alias (|) o ancla (#)." output: "Lista de strings con los nombres de los attachments embebidos (el target de cada ![[...]]), unicos y en orden de aparicion. Solo embeds: los wikilinks normales [[...]] se ignoran. Lista vacia si no hay embeds." tested: true tests: - "solo embeds ignora wikilinks" - "varios embeds orden y dedup" - "quita alias y ancla" - "nombre con espacios y parentesis" - "sin embeds solo wikilinks" - "body vacio" test_file_path: "python/functions/obsidian/extract_obsidian_embeds_test.py" file_path: "python/functions/obsidian/extract_obsidian_embeds.py" --- ## Ejemplo ```python body = ( "Texto con [[Nota normal]] y un embed ![[imagen.jpg]]. " "Luego ![[doc.pdf]] y otra vez ![[imagen.jpg]]." ) extract_obsidian_embeds(body) # ["imagen.jpg", "doc.pdf"] extract_obsidian_embeds("![[dni enmanuel (2).jpg]]") # ["dni enmanuel (2).jpg"] ``` ## Cuando usarla Usala cuando migres o extraigas un subgrafo de notas y necesites saber QUE attachments hay que copiar junto a cada nota. A diferencia de `extract_obsidian_wikilinks` (que devuelve todos los enlaces, incluidos los embeds), esta funcion aisla solo los `![[...]]`, que son los archivos fisicos incrustados. Combinala con `resolve_obsidian_embed` para localizar el path real de cada attachment dentro del vault. ## Gotchas - Devuelve el nombre del attachment tal cual aparece en el embed (p.ej. `dni enmanuel (2).jpg`), NO un path. Obsidian resuelve embeds por nombre de archivo unico; para obtener la ruta real usa `resolve_obsidian_embed`. - Quita deliberadamente el alias (`|300`, util para dimensionar imagenes) y el ancla (`#Seccion`, util para embeber un trozo de otra nota). Si necesitas esos modificadores, parsea el body tu mismo. - Solo reconoce embeds con doble corchete `![[...]]`. Los embeds Markdown estandar de imagen `![alt](ruta)` NO se detectan.