feat(dav,obsidian): grupo dav completo (CardDAV/CalDAV client + split vcf/ics + import pipelines) + build_obsidian_graph + dav_list_calendars
Funciones reutilizables creadas esta sesion para el sistema self-hosted de contactos/calendario (Xandikos) y la app osint_web: - grupo dav (infra): split_vcards, split_vevents_to_vcalendars, extract_or_make_uid, carddav_put_vcard, caldav_put_event, dav_list_resources, dav_get_resource, dav_list_calendars - pipelines: import_vcf_to_carddav, import_ics_to_caldav - obsidian: build_obsidian_graph (grafo agregado del vault)
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
"""Divide un archivo .vcf en sus VCARDs individuales.
|
||||
|
||||
Funcion pura: sin I/O, sin estado, determinista. Recibe el texto completo de un
|
||||
archivo .vcf (que puede contener N tarjetas concatenadas) y devuelve una lista
|
||||
de strings, cada uno un VCARD completo (BEGIN:VCARD..END:VCARD) ya stripeado.
|
||||
Solo usa stdlib (re).
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
_VCARD_RE = re.compile(r"BEGIN:VCARD.*?END:VCARD", re.DOTALL)
|
||||
|
||||
|
||||
def split_vcards(vcf_text: str) -> list:
|
||||
"""Divide el texto de un .vcf en VCARDs individuales.
|
||||
|
||||
Args:
|
||||
vcf_text: contenido completo del archivo .vcf, con una o varias tarjetas
|
||||
concatenadas. Tolera saltos de linea LF o CRLF.
|
||||
|
||||
Returns:
|
||||
Lista de strings. Cada elemento es un VCARD completo
|
||||
('BEGIN:VCARD'..'END:VCARD') stripeado de espacios al inicio/fin.
|
||||
Lista vacia si no hay ninguna tarjeta.
|
||||
"""
|
||||
if not vcf_text:
|
||||
return []
|
||||
return [m.strip() for m in _VCARD_RE.findall(vcf_text)]
|
||||
Reference in New Issue
Block a user