feat(infra): auto-commit con 88 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
"""Extrae los embeds ![[...]] (attachments incrustados) de una nota de Obsidian.
|
||||
|
||||
Funcion pura: solo procesa texto. A diferencia de extract_obsidian_wikilinks,
|
||||
ignora los wikilinks normales [[...]] y devuelve unicamente los embeds ![[...]].
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
# Matchea SOLO embeds: el '!' inicial es obligatorio (?<! evitaria capturar
|
||||
# un '[[' precedido de '!', pero aqui exigimos el '!' como parte del match).
|
||||
# Captura el contenido entre los dobles corchetes del embed.
|
||||
_EMBED_RE = re.compile(r"!\[\[([^\[\]]+?)\]\]")
|
||||
|
||||
|
||||
def extract_obsidian_embeds(body: str) -> list:
|
||||
"""Extrae SOLO los embeds ``![[...]]`` del cuerpo de una nota de Obsidian.
|
||||
|
||||
Un embed `![[archivo.jpg]]` incrusta un attachment (imagen, pdf, otra nota)
|
||||
dentro de la nota. Esta funcion devuelve el target de cada embed, mientras
|
||||
que los wikilinks normales `[[...]]` (que NO empiezan por `!`) se ignoran.
|
||||
|
||||
Para cada embed se normaliza el target:
|
||||
|
||||
![[imagen.jpg]] -> "imagen.jpg"
|
||||
![[imagen.jpg|300]] -> "imagen.jpg" (se quita el alias |...)
|
||||
![[nota#Seccion]] -> "nota" (se quita el ancla #...)
|
||||
![[dni enmanuel (2).jpg]] -> "dni enmanuel (2).jpg"
|
||||
|
||||
Los targets se deduplican preservando el orden de primera aparicion. Pura y
|
||||
deterministica: no hace I/O ni muta nada.
|
||||
|
||||
Args:
|
||||
body: Cuerpo Markdown de una nota de Obsidian (idealmente sin
|
||||
frontmatter).
|
||||
|
||||
Returns:
|
||||
Lista de strings con los nombres de los attachments embebidos, unicos y
|
||||
en orden de aparicion. Lista vacia si no hay embeds.
|
||||
"""
|
||||
if not body:
|
||||
return []
|
||||
|
||||
seen = set()
|
||||
targets = []
|
||||
for match in _EMBED_RE.finditer(body):
|
||||
inner = match.group(1)
|
||||
# Quitar alias tras el primer '|'.
|
||||
target = inner.split("|", 1)[0]
|
||||
# Quitar ancla/heading tras el primer '#'.
|
||||
target = target.split("#", 1)[0]
|
||||
target = target.strip()
|
||||
if not target:
|
||||
continue
|
||||
if target in seen:
|
||||
continue
|
||||
seen.add(target)
|
||||
targets.append(target)
|
||||
return targets
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
body = (
|
||||
"Texto con [[Nota normal]] y un embed ![[imagen.jpg]]. "
|
||||
"Otra cosa [[Otra Nota|alias]] y ![[doc.pdf]] y ![[imagen.jpg]]."
|
||||
)
|
||||
assert extract_obsidian_embeds(body) == ["imagen.jpg", "doc.pdf"], body
|
||||
assert extract_obsidian_embeds("") == []
|
||||
assert extract_obsidian_embeds("solo [[wikilink]] aqui") == []
|
||||
assert extract_obsidian_embeds("![[dni enmanuel (2).jpg]]") == ["dni enmanuel (2).jpg"]
|
||||
print("extract_obsidian_embeds smoke OK")
|
||||
Reference in New Issue
Block a user