Implementaciones
Doce implementaciones nativas e independientes de SPDF 5.0, todas comprobadas con la misma batería de conformidad en cada commit, y lo que dice hoy el CI de cada una.
Revisado Markdown
SPDF no es una biblioteca con envoltorios para otros lenguajes. Es una especificación con varias implementaciones nativas e independientes, escrita cada una con las costumbres de su lenguaje y comprobadas todas con los mismos casos de conformidad. La de Rust es la de referencia y además ofrece una ABI de C para quien prefiera no tratar con SQLite directamente.
La tabla se rehace a partir de la integración continua del repositorio cada vez que se publica esta web. Aquí no hay nada escrito a mano: si un run está en rojo, sale en rojo.
| Implementación | CI en main | Último run |
|---|---|---|
Rust spdfImplementación de referencia; da además la ABI de C. · primer nivel | 44207da | |
TypeScript spdf-formatNode (node:sqlite), Bun y el navegador (sqlite-wasm). Es la que mueve el validador de esta web. · primer nivel | 66e338b | |
Python spdf-formatSolo sqlite3 de la biblioteca estándar; se importa como spdf. · primer nivel | 44207da | |
Swift SPDFSwift Package Manager, desde el repositorio. Plataformas de Apple y Linux. · primer nivel | 44207da | |
Kotlin / JVM io.github.joseluissaorin:spdfKotlin y Java sobre la JVM y Android. · primer nivel | 44207da | |
Go github.com/joseluissaorin/spdf/goMódulo de Go dentro del monorepo. · primer nivel | 44207da | |
C# / .NET Spdf.Format.NET con Microsoft.Data.Sqlite. · primer nivel | CI en rojo | 44207da |
PHP joseluissaorin/spdfPDO SQLite. · segundo nivel | 44207da | |
Ruby spdf-formatSobre la gema sqlite3. · segundo nivel | 44207da | |
R spdfSobre RSQLite; los fragmentos como data frames. · segundo nivel | 44207da | |
Julia SPDF.jlSobre SQLite.jl. · segundo nivel | 44207da | |
C libspdfABI de C sobre el núcleo de Rust, para C, C++ y cualquier FFI. · segundo nivel | 44207da | |
Productor de referencia (spdf build) producer/ | CI en verde · 16/16 casos | 44207da |
Lector SPDF reader/ | 707d167 | |
Batería de conformidad conformance/ | 44207da | |
Integraciones integrations/ | 66e338b | |
Esta web site/ | 66e338b |
Comprobado al construir esta web, el 7 de octubre de 2026. También en /status.json.
Clases de producto
Lo que declara cada implementación, según las clases de producto de la especificación (lector, lector semántico, escritor, validador), tal como lo registra el editor de la especificación en el README del repositorio. La columna de CI de arriba es lo que comprueban hoy las máquinas; esta tabla es lo declarado.
| Implementación | Carpeta | Lector | Lector semántico | Escritor | Validador | ALTO / TEI / IIIF | Batería 0.3.0 | Batería 0.4.0 |
|---|---|---|---|---|---|---|---|---|
| Rust (referencia) | rust | sí | sí | sí | sí | sin probar | 229/229 | pendiente |
| TypeScript | js | sí | sí | sí | sí | sin probar | 229/229 | 309/309 |
| Python | python | sí | sí | sí | sí | sin probar | 229/229 | pendiente |
| Swift | swift | sí | sí | sí | sí | sin probar | 229/229 | pendiente |
| Kotlin / JVM | kotlin | sí | sí | sí | sí | sin probar | 229/229 | pendiente |
| Go | go | sí | sí | sí | sí | sin probar | 229/229 | pendiente |
| C# | dotnet | sí | sí | sí | sí | sin probar | 229/229 | pendiente |
| PHP | php | sí | sí | sí | sí | sin probar | 229/229 | 309/309 |
| Ruby | ruby | sí | sí | sí | sí | sin probar | 229/229 | 309/309 |
| R | r | sí | sí | sí | sí | sin probar | 229/229 | 309/309 |
| Julia | julia | sí | sí | sí | sí | sin probar | 229/229 | 309/309 |
| C (Rust C ABI) | c | sí | sí | sí | sí | sin probar | 229/229 | 309/309 |
Productor spdf build | producer | n/a | n/a | lo que produce valida | n/a | n/a | pruebas propias 16/16 | pendiente |
Lo que hace cada implementación
Todas las implementaciones, en todos los lenguajes, hacen las mismas ocho cosas, y la batería de conformidad las comprueba todas:
- Abren con seguridad: en solo lectura, con
query_only,trusted_schema=OFFy el modo defensivo donde el enlace con SQLite lo permite, sin cargar nunca extensiones, rechazando los ficheros con disparadores o vistas y con límites al tamaño de los blobs y de la descompresión. - Validan un fichero e informan con los códigos de error y de aviso de la especificación (§ Validación).
- Leen SPDF 5.0 y los ficheros heredados 4.0 y 4.1 de Scholaris, que suelen venir envueltos en gzip y usan identificadores en castellano.
- Vuelcan un fichero a JSON canónico (RFC 8785), el oráculo con el que se compara a todas las demás.
- Buscan: léxica (FTS5), vectorial (fuerza bruta, en f32, f16 o i8) e híbrida (fusión por rango recíproco con k = 10).
- Escriben y leen URI de ancla, byte a byte, en los dos sentidos.
- Citan: citas cortas de autor y año en castellano y en inglés, y bibliografía en CSL-JSON y BibTeX.
- Construyen: crean un SPDF válido desde cero y reconstruyen un fichero a partir de su volcado.
Cómo se comprueba la conformidad
La batería está en conformance/: volcados de origen, ficheros generados, ficheros heredados, ficheros rotos a propósito y un caso en JSON por cada comprobación. Un caso tiene un id, un tipo (dump, validate, search_lexical, search_vector, search_hybrid, anchor_uri, cite, legacy_dump, roundtrip), una entrada y el resultado esperado.
Cada implementación trae un ejecutor que pasa todos los casos e imprime una línea de JSON:
{"impl": "rust", "version": "5.0.0", "passed": ["dump-001", "…"], "failed": [], "skipped": []}El CI de cada implementación falla si falla un solo caso y sube ese JSON como el artefacto conformance-<carpeta>, que es lo que cuenta la tabla de arriba.
Niveles
- Primer nivel: Rust, TypeScript, Python, Swift, Kotlin/JVM, Go y C#. Se publican a la vez que cada versión de la especificación.
- Segundo nivel: PHP, Ruby, R, Julia y C. La misma batería; se publican cuando están listas.
Productores
Leer un documento es cosa del productor, no de la biblioteca. Hay dos productores independientes, y que se entiendan entre sí es condición para declarar estable el formato:
spdf build, el productor de referencia, en Python, con modelos locales (EmbeddingGemma 2, Gemma 4, Whisper) o con tu propia clave de API.- Scholaris, en TypeScript, donde nació el formato.