WIF significa Weaving Information File (archivo de información de tejido). Es un formato de texto plano que la mayoría de los programas de tejido pueden abrir y guardar, para pasar un dibujo de un programa a otro sin redibujarlo. La versión que todo el mundo usa es la 1.1, del 20 de abril de 1997.
A continuación repasamos cómo se arma un archivo .wif, sección por sección, y anotamos lo que Bower y nuestro visor WIF gratuito hacen realmente con cada parte. Si escribes una herramienta o intentas arreglar un archivo que no abre bien, esto debería ayudar. Para una introducción sencilla primero, consulta ¿Qué es un archivo WIF?.
Cuando hablamos de Bower, usamos estas etiquetas:
- Compatible — lo leemos, lo escribimos, o ambas cosas.
- Parcial — lo manejamos, pero no todos los casos límite del texto 1.1.
- Ignorado — el archivo puede contenerlo; lo saltamos y no fallamos la importación solo porque esté ahí.
- No escrito — nuestra exportación nunca lo emite.
- Suspendido en 1.1 — sigue listado en el texto antiguo del formato, pero ya no es de uso normal.
1. Objetivos de diseño
Quienes diseñaron WIF querían un formato que pudiera crecer sin volverse ilegible, que una persona pudiera abrir en un editor de texto y seguir entendiendo, y que cualquier ordenador capaz de leer texto plano pudiera procesar.
Eligieron listas de números de marcos y pedales separadas por comas, fáciles de leer, en lugar de campos binarios compactos. El diseño se parece mucho a un antiguo archivo .INI de Windows — secciones entre corchetes, líneas Key=value — pero no está limitado a los 64K de los ini clásicos de Windows 3.1. No se pueden usar las antiguas APIs private-profile de Windows; hay que analizar el texto uno mismo.
2. Tipo de archivo
Un archivo .wif es solo texto. No hay envoltorio binario. Se espera la extensión .wif; lo que importa es el contenido.
Typical extension .wif Character set ASCII (UTF-8 without BOM is fine in practice) Line endings LF or CRLF Order Readers must not depend on section or key order
Bower: Leemos y escribimos .wif como texto ordinario.
3. Reglas léxicas
Todo se basa en líneas. Una línea es vacía, un comentario, un encabezado de sección o un par clave/valor.
- Las líneas en blanco se ignoran.
- Si el primer carácter que no es espacio es «;», toda la línea es un comentario. También se puede poner un comentario después de un número o un booleano (a menudo tras otro «;»). Las claves de texto libre no deben llevar comentarios al final de la misma línea.
- Los encabezados de sección se ven como [Section Name]. La comparación no distingue mayúsculas; por convención los nombres van en mayúsculas.
- Las asignaciones se ven como Key=value. La clave no distingue mayúsculas. El valor es lo que hay después del primer «=» en esa línea.
- Las claves duplicadas en una sección son mala forma. Los lectores no deben fallar; pueden quedarse con el primero o el último valor.
- El orden de las secciones y el de las claves dentro de una sección no importan para un lector correcto.
Aquí va un fragmento pequeño (no un dibujo completo):
; this line is ignored [WEAVING] Shafts=4 Treadles=4
Bower: Omitimos líneas en blanco y comentarios de línea completa con ;, comparamos nombres sin distinguir mayúsculas, y para claves ordinarias gana el último valor. Las filas de estructura se indexan por número. Recortamos espacios de los valores pero no quitamos de forma especial los comentarios al final de la línea.
4. Booleanos y símbolos
Para verdadero/falso, el formato permite true, on, yes y 1 del lado verdadero, y false, off, no y 0 del lado falso. Si falta un booleano opcional, trátalo como falso salvo que una sección diga lo contrario.
Bower: Tratamos true, yes y 1 como verdadero. Cualquier otro valor no vacío cuenta como falso. No tratamos de forma especial on ni off.
Algunos programas guardan «símbolos» del dibujo (caracteres en lugar de casillas rellenas). Usan un tipo símbolo pequeño:
=1 digit =X single character ='X' quoted character =#219 character code 0..255 Write a space as ' ' or #32. Write a hash as '#' or #35.
Bower: No implementamos símbolos. La apariencia es solo colores. Las secciones de símbolos se ignoran al importar y nunca se escriben al exportar.
5. Requisitos mínimos
Un archivo 1.1 correcto siempre tiene [WIF] y [CONTENTS]. Toda otra sección que aparezca en el archivo debe listarse bajo [CONTENTS] con valor true. Puedes omitir secciones que no uses, o listarlas como false. Si una sección está presente, también deben estarlo sus claves obligatorias.
Así, un archivo que solo tiene enhebrado y no tiene bloque [WIF] no es un documento WIF 1.1 válido — aunque algunas herramientas aún intenten leerlo.
Bower: La importación falla sin [WIF]. No exigimos ni validamos [CONTENTS] a la entrada. Al exportar siempre escribimos ambos, y marcamos true para cada sección que emitimos.
6. Secciones informativas, de datos y datos dispersos
Algunas secciones son de contexto (título, tamaño de paleta, recuentos del telar) y otras son las filas reales del dibujo (líneas de enhebrado, colores por hilo, etc.). [CONTENTS] es la lista de lo incluido. No lista [WIF] en sí.
El formato espera datos dispersos. Creas todos los hilos de urdimbre y trama a partir de Threads, rellenas valores por defecto desde [WARP] y [WEFT], pones las celdas de estructura a cero (sin usar) y solo escribes las líneas que difieren de esos valores. Los lectores invierten ese proceso.
Por ejemplo, si ocho urdimbres son el mismo rojo y solo el hilo 3 es azul, puedes poner rojo por defecto en la urdimbre y sobrescribir una línea:
[WARP] Threads=8 Color=1 [WARP COLORS] 3=2
Los hilos 1, 2, 4–8 se quedan en el color de paleta 1; el hilo 3 usa el color 2. Misma idea para la estructura: una línea de enhebrado ausente significa «ningún marco en ese hilo», no «copiar el hilo anterior».
Bower: Usamos los recuentos de hilos y las tablas de estructura/color. No implementamos valores por defecto de espaciado/grosor ni grosor/espaciado dispersos. La estructura queda vacía por defecto; las claves de estructura ausentes siguen vacías. Si hay tabla de colores, aplicamos los Color por defecto de [WARP] / [WEFT] cuando el índice es mayor que cero, y luego los sobrescritos por hilo y por pasada.
7. Secciones privadas
Las aplicaciones pueden guardar sus propios datos sin romper a los demás. El nombre debe incluir un id de origen único para que dos proveedores no colisionen:
[PRIVATE <SourceID> <SectionName>] Lines inside must not start with '[' so a reader can find the next section.
Bower: Saltamos las secciones privadas y nunca las escribimos. No definimos un Source ID privado.
8. Catálogo de secciones
Aquí va cada sección con nombre del WIF 1.1, y lo que hacemos con ella. Si solo te importa abrir dibujos en Bower, puedes pasar por alto las entradas «Ignorado» y centrarte en estructura, colores y la lista de exportación de la sección 10.
8.1 [WIF] — obligatorio
Este es el bloque de identidad. Sin él, no tratamos el archivo como WIF.
Key Official Description ---- -------- ----------- Version required e.g. 1.1 Date required free-form date string Developers required contact / authors Source Program required creating program name Source Version optional creating program version
Bower: La sección en sí es obligatoria al importar. Escribimos Version=1.1, Date, Developers, Source Program=Bower y Source Version al exportar. No fallamos de forma dura si faltan claves individuales dentro de [WIF] al importar.
8.2 [CONTENTS] — obligatorio en 1.1
Es una tabla de contenidos: nombre de sección como clave, true o false como valor. Solo las secciones que existen deben listarse como true. Algunos escritores listan todas las secciones posibles con true/false; está permitido, no es obligatorio.
En teoría un lector cuidadoso podría decidir qué cargar solo con CONTENTS. En la práctica muchas herramientas (incluidos nosotros) simplemente recorren todo el archivo.
Informational flags: COLOR PALETTE, WARP SYMBOL PALETTE, WEFT SYMBOL PALETTE, TEXT, WEAVING, WARP, WEFT Data flags: NOTES, TIEUP, COLOR TABLE, WARP SYMBOL TABLE, WEFT SYMBOL TABLE, THREADING, WARP THICKNESS, WARP THICKNESS ZOOM, WARP SPACING, WARP SPACING ZOOM, WARP COLORS, WARP SYMBOLS, TREADLING, LIFTPLAN, WEFT THICKNESS, WEFT THICKNESS ZOOM, WEFT SPACING, WEFT SPACING ZOOM, WEFT COLORS, WEFT SYMBOLS, PRIVATE <SourceID> <SectionName> Suspended / reserved: TRANSLATIONS BITMAP IMAGE, BITMAP FILE, BITMAP IMAGE DATA
Bower: No exigimos CONTENTS al importar y no lo usamos para elegir qué analizar. Al exportar escribimos true para cada sección que realmente emitimos.
8.3 [COLOR PALETTE]
Indica el tamaño de la paleta y el rango numérico de los valores RGB. Los archivos antiguos a veces usan 0–999 en lugar de 0–255, así que los lectores deben escalar.
Key Official Description ---- -------- ----------- Entries required integer > 0, palette size Range required min,max with max > min Form=RGB obsolete do not write; ignore if present
Por ejemplo, Range=0,999 y una entrada 1=999,0,0 mapea el canal rojo a unos 255 en 8 bits. Con Range=0,255 y 1=255,0,0, no hace falta escalar.
Bower: Leemos Range (por defecto 0,255 si falta) y convertimos cada canal con round((c − min) / (max − min) * 255), luego lo acotamos a 0–255. Si max−min es cero o negativo, la importación falla. No exigimos Entries. La exportación siempre usa Range=0,255.
8.4 [WARP SYMBOL PALETTE] / [WEFT SYMBOL PALETTE]
Key Official Description ---- -------- ----------- Entries required integer > 0
Bower: Ignorado. No escrito.
8.5 [TEXT]
Notas opcionales sobre la pieza y el autor — título, autor, contacto. Nada de esto cambia la cuadrícula del dibujo.
Key Official ---- -------- Title optional Author optional Address optional EMail optional Telephone optional FAX optional
Bower: Ignorado. No escrito.
8.6 [WEAVING]
Tamaño del telar y convención de calada. Los marcos y pedales pueden crecer si las secciones de estructura mencionan números más altos que los declarados aquí.
Key Official Description ---- -------- ----------- Shafts required integer > 0 Treadles required integer > 0 Rising Shed optional true = listed shafts go up Profile obsolete ignore; do not write
Calada ascendente significa que los marcos listados en el plan de elevación (o elevados por el camino pedal/atadura) son los que suben. La calada descendente es la otra convención física. Si un archivo dice calada descendente, invertimos las celdas del plan de elevación — o de la atadura — tras la carga para que nuestras rejillas internas sigan en calada ascendente y el tejido siga coincidiendo con lo que el archivo quería decir.
Bower: Leemos Shafts y Treadles (por defecto 4 si faltan) y los hacemos crecer desde la estructura cuando hace falta. Rising Shed ausente se trata como true. False dispara la inversión de arriba. La exportación siempre escribe Rising Shed=true, y Treadles=0 en modo plan de elevación. Profile se ignora.
8.7 [WARP] y [WEFT]
Describen toda la urdimbre o trama y el valor por defecto de cada hilo. Cuando conoces Threads, asignas ese número de hilos o pasadas, aplicas valores por defecto y dejas que las secciones dispersas sobrescriban individuos (ver sección 6).
Key Official Description
---- -------- -----------
Threads required number of ends or picks
Color optional palette index, or index + R,G,B
Symbol optional symbol type
Symbol Number optional index into symbol table
Units required if spacing/ Decipoints | Inches | Centimeters
thickness used
Spacing optional real ≥ 0
Thickness optional real ≥ 0
Spacing Zoom optional integer ≥ 0
Thickness Zoom optional integer ≥ 0
Obsolete in 1.1 (ignore / do not write):
Colors, Palette, ColorMix
En Color, prefiere un índice de paleta simple para el intercambio. Algunos archivos también llevan un triple RGB; solo usamos el índice.
Color=2 ; every end/pick defaults to COLOR TABLE entry 2 Color=2,255,0,0 ; index plus optional RGB — we keep the index only
Si un programa solo admite uno de espaciado y grosor, el formato dice preferir Spacing cuando ambos están presentes. Si solo piensas en «grosor», escribe Spacing (o ambos con los mismos números).
Bower: Leemos Threads (por defecto 32 para urdimbre y 48 para trama si faltan) y Color como un índice de paleta cuando es mayor que cero. Ignoramos símbolos, espaciado, grosor, zooms y RGB extra en Color. La exportación escribe Threads, Color y Units=Centimeters.
8.8 [NOTES]
Texto libre, una cadena por línea numerada. No forma parte de las rejillas del dibujo.
1=First line of notes 2=Second line
Bower: Ignorado. No escrito.
8.9 [TIEUP]
Cada pedal lista los marcos que eleva (sentido de calada ascendente, antes de cualquier inversión). Se usa con enhebrado y pisada cuando no estás en un plan de elevación puro.
Key = treadle (1..n)
Value = shafts, comma-separated
0 alone means unused
Missing lines stay unused
Example: 1=1,2 → treadle 1 raises shafts 1 and 2
Bower: Compatible en modo atadura. Los valores multi-marco están bien. La exportación escribe una línea por pedal.
8.10 [COLOR TABLE]
Esta es la paleta. Los índices aquí son a los que apuntan las claves Color de urdimbre/trama. Los números R,G,B viven en el Range de [COLOR PALETTE].
Key = palette index Value = R,G,B in the palette Range
Aquí un ejemplo pequeño de paleta, valor por defecto de urdimbre y dos sobrescrituras:
[COLOR PALETTE] Entries=2 Range=0,255 [COLOR TABLE] 1=200,40,40 2=40,40,200 [WARP] Threads=4 Color=1 [WARP COLORS] 2=2 4=2
Los hilos 1 y 3 toman por defecto la entrada rojiza; los hilos 2 y 4 usan la azulada.
Bower: Compatible, con el mapeo de Range descrito arriba. La exportación escribe una entrada de tabla por color de hilo único y siempre usa Range=0,255.
8.11 [WARP SYMBOL TABLE] / [WEFT SYMBOL TABLE]
Key = symbol index Value = WIF symbol type (see section 4)
Bower: Ignorado. No escrito.
8.12 [THREADING]
Por qué marcos pasa cada hilo de urdimbre. Se permiten varios marcos en un mismo hilo.
Key = warp end (1..n)
Value = shaft, or shaft,shaft,...
1=1,5 means end 1 is on shafts 1 and 5
0 means unused
Missing lines stay unused
Bower: Compatible, incluidos hilos multi-marco. La exportación escribe una línea por hilo.
8.13 Secciones por hilo y por pasada
Asignan valores a hilos o pasadas individuales. Hay tres grupos: estructura (pisada / plan de elevación), color y apariencia (grosor, espaciado, símbolos).
Section Value Default if missing
------- ----- ------------------
[WARP THICKNESS] real ≥ 0 [WARP].Thickness
[WARP THICKNESS ZOOM] integer ≥ 0 [WARP].Thickness Zoom
[WARP SPACING] real ≥ 0 [WARP].Spacing
[WARP SPACING ZOOM] integer ≥ 0 [WARP].Spacing Zoom
[WARP COLORS] palette idx [WARP].Color
(one integer; ignore old R,G,B tail)
[WARP SYMBOLS] symbol idx [WARP].Symbol Number
[TREADLING] treadles unused (zero)
[LIFTPLAN] shafts unused (zero)
[WEFT THICKNESS] real ≥ 0 [WEFT].Thickness
[WEFT THICKNESS ZOOM] integer ≥ 0 [WEFT].Thickness Zoom
[WEFT SPACING] real ≥ 0 [WEFT].Spacing
[WEFT SPACING ZOOM] integer ≥ 0 [WEFT].Spacing Zoom
[WEFT COLORS] palette idx [WEFT].Color
[WEFT SYMBOLS] symbol idx [WEFT].Symbol Number
La pisada es para modo atadura: la clave es la pasada, el valor qué pedales pisas, p. ej. 5=1,2. El plan de elevación es directo: la clave es la pasada, el valor qué marcos suben, p. ej. 5=1,3. Un archivo normal usa un camino de control u otro, no ambos a la vez (ver la siguiente sección).
Bower: Admitimos pisada, plan de elevación y colores de urdimbre/trama. Ignoramos grosor, espaciado, zoom y secciones de símbolos, y nunca las escribimos.
8.14 Modo de telar, calada ascendente y calada
No hay una sola clave «mode=» en el archivo. Se deduce cómo leer la estructura a partir de lo que hay.
Esta es la regla que usamos en Bower y en el visor WIF gratuito:
If [LIFTPLAN] is present
and ([TREADLING] is missing or Treadles is 0)
then treat the file as liftplan
(THREADING + LIFTPLAN)
else treat it as tie-up
(THREADING + TIEUP + TREADLING)
El plan de elevación es el modelo estilo dobby «cada pasada lista marcos». La atadura es el modelo clásico de telar de marcos: los pedales eligen una columna de la atadura, y la pisada es la secuencia de pedales.
Cuando Rising Shed es false, tras cargar las rejillas invertimos cada celda del plan de elevación (modo plan de elevación) o cada celda de atadura (modo atadura). El enhebrado y la pisada se quedan como están escritos.
Rising Shed=true, pick 1=1,2 → shafts 1 and 2 up
Rising Shed=false, same line → those shafts stored as down,
other shafts flipped on
La calada (drawdown) no se guarda en el archivo. Tras cargar la estructura (y cualquier inversión de calada), cada celda del tejido es urdimbre arriba si algún marco enhebrado en ese hilo también está elevado en esa pasada — sea desde el plan de elevación, o desde un pedal activo y su atadura. Si no, es trama arriba. Los programas lo recalculan para la visualización; no hay sección drawdown que exportar.
Bower: Así es como cargamos y mostramos. El visor WIF gratuito sigue las mismas reglas de estructura y color. En modo plan de elevación el visor omite el bloque vacío de atadura y muestra «-» para los pedales en el panel lateral.
8.15 Elementos suspendidos y obsoletos
Suspended at 1.1: [TRANSLATIONS] [BITMAP FILE], [BITMAP IMAGE], [BITMAP IMAGE DATA] Dropped / obsolete in the 1.1 narrative: Design section, ColorMix, Colors key, Palette key, RGB tail on WARP/WEFT COLORS
Bower: Los ignoramos todos y no los escribimos. Las secciones desconocidas no hacen fallar la importación por sí solas.
9. Límites de tamaño de Bower
Estos no forman parte de WIF 1.1. Al importar acotamos las dimensiones para que un archivo salvaje no pueda asignar una rejilla ilimitada. Los valores fuera de rango se meten en el rango en lugar de rechazarse como «no es WIF».
Warps, wefts 1 .. 4096 Shafts, treadles 1 .. 64
10. Lo que escribe Bower
Nuestra exportación es un archivo completo de calada ascendente pensado para abrirse en otros lectores 1.1 que entiendan las mismas secciones básicas. No intentamos conservar notas, símbolos, espaciado ni datos privados de un import anterior — se pierden si haces un viaje de ida y vuelta con nosotros.
- [WIF], [CONTENTS], [COLOR PALETTE] con Range=0,255, [WEAVING] con Rising Shed=true
- [WARP] y [WEFT] con Threads, índice Color, Units=Centimeters
- [COLOR TABLE], [THREADING], [WARP COLORS], [WEFT COLORS]
- O bien [LIFTPLAN] y Treadles=0, o ambos [TIEUP] y [TREADLING]
- Sin secciones TEXT, NOTES, símbolos, espaciado, grosor, privadas ni bitmap
11. Ejemplos
Dos archivos completos pequeños. Sin tabla de colores — solo estructura.
11.1 Modo atadura
Ocho hilos, ocho pasadas, cuatro marcos, cuatro pedales. Enhebrado recto, atadura sencilla estilo sarga, pisada que recorre los cuatro pedales dos veces.
[WIF] Version=1.1 Date=April 20, 1997 [email protected] Source Program=Example Source Version=1.0 [CONTENTS] WEAVING=true WARP=true WEFT=true THREADING=true TIEUP=true TREADLING=true [WEAVING] Shafts=4 Treadles=4 Rising Shed=true [WARP] Threads=8 [WEFT] Threads=8 [THREADING] 1=1 2=2 3=3 4=4 5=1 6=2 7=3 8=4 [TIEUP] 1=1,2 2=2,3 3=3,4 4=1,4 [TREADLING] 1=1 2=2 3=3 4=4 5=1 6=2 7=3 8=4
11.2 Modo plan de elevación
Cuatro hilos, cuatro pasadas. Treadles es 0 y [LIFTPLAN] está presente, así que el archivo se lee como plan de elevación. Cada pasada lista marcos directamente — sin atadura, sin pisada.
[WIF] Version=1.1 Date=April 20, 1997 [email protected] Source Program=Example [CONTENTS] WEAVING=true WARP=true WEFT=true THREADING=true LIFTPLAN=true [WEAVING] Shafts=4 Treadles=0 Rising Shed=true [WARP] Threads=4 [WEFT] Threads=4 [THREADING] 1=1 2=2 3=3 4=4 [LIFTPLAN] 1=1,2 2=2,3 3=3,4 4=1,4
12. Herramientas relacionadas
Puedes abrir un .wif en el visor WIF gratuito para revisar el dibujo en el navegador, o importarlo en Bower (incluido Abrir en Bower desde el visor) cuando quieras editar.
13. Citas
Estas son las fuentes del texto del formato. Las notas «Bower:» de esta página describen nuestro comportamiento de importación y exportación; no forman parte de la especificación de 1997.
- Nielsen, Ravi, et al. Weaving Information File (WIF) Specification, Version 1.1. 20 April 1997. Contributors included Ravi Nielsen (Patternland / Maple Hill Software), Bob Keates (Fiberworks), Rob Sinkler (SwiftWeave), and members of the 1997 WIF email list. Text: http://www.tantradharma.com/maplehill/wif/wif1-1.txt.
- Nielsen, Ravi; Keates, Bob; Sinkler, Rob. Weaving Information File (WIF) Specification, Version 1.0. 3 March 1996. Superseded by 1.1 for current interchange.
- Asunder — Bower y el visor WIF gratuito.