WIF signifie Weaving Information File (fichier d’information de tissage). C’est un format texte que la plupart des programmes de tissage peuvent ouvrir et enregistrer, pour déplacer un dessin d’armure d’une appli à une autre sans le redessiner. La version utilisée par tout le monde est la 1.1, du 20 avril 1997.

Ci-dessous, nous passons en revue la structure d’un fichier .wif, section par section, et nous indiquons ce que Bower et notre visionneuse WIF gratuite font réellement de chaque partie. Si vous écrivez un outil ou si vous corrigez un fichier qui ne s’ouvre pas correctement, cela devrait aider. Pour une introduction simple d’abord, voir Qu’est-ce qu’un fichier WIF ?.

Quand nous parlons de Bower, nous utilisons ces étiquettes :

  • Pris en charge — nous le lisons, l’écrivons, ou les deux.
  • Partiel — nous le gérons, mais pas tous les cas limites du texte 1.1.
  • Ignoré — le fichier peut le contenir ; nous le sautons et n’échouons pas l’import seulement parce qu’il est là.
  • Non écrit — notre export ne l’émet jamais.
  • Suspendu en 1.1 — encore listé dans l’ancien texte du format, mais plus d’usage courant aujourd’hui.

1. Objectifs de conception

Les concepteurs du WIF voulaient un format capable d’évoluer sans devenir illisible, qu’une personne puisse ouvrir dans un éditeur de texte et encore comprendre, et qu’un ordinateur capable de lire du texte brut puisse traiter.

Ils ont choisi des listes de numéros de lames et de marches séparés par des virgules, faciles à lire, plutôt que des champs binaires compacts. La mise en page ressemble beaucoup à un ancien fichier .INI Windows — sections entre crochets, lignes Key=value — mais elle n’est pas limitée aux 64 Ko des ini Windows 3.1 classiques. On ne peut pas utiliser les anciennes API private-profile de Windows ; il faut parser le texte soi-même.

2. Type de fichier

Un fichier .wif n’est que du texte. Il n’y a pas d’enveloppe binaire. On attend l’extension .wif ; ce qui compte, c’est le contenu.

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 : Nous lisons et écrivons le .wif comme du texte ordinaire.

3. Règles lexicales

Tout est basé sur les lignes. Une ligne est vide, un commentaire, un en-tête de section, ou une paire clé/valeur.

  • Les lignes vides sont ignorées.
  • Si le premier caractère non blanc est « ; », toute la ligne est un commentaire. On peut aussi mettre un commentaire après un nombre ou un booléen (souvent après un autre « ; »). Les clés en texte libre ne doivent pas avoir de commentaire en fin de ligne.
  • Les en-têtes de section ressemblent à [Section Name]. La comparaison ignore la casse ; par convention, les noms sont en majuscules.
  • Les affectations ressemblent à Key=value. La clé est comparée sans distinction de casse. La valeur est tout ce qui suit le premier « = » sur la ligne.
  • Des clés en double dans une section sont de mauvaise forme. Les lecteurs ne doivent pas planter ; ils peuvent garder la première ou la dernière valeur.
  • L’ordre des sections et l’ordre des clés dans une section n’ont pas d’importance pour un lecteur correct.

Voici un petit fragment (pas un dessin d’armure complet) :

; this line is ignored
[WEAVING]
Shafts=4
Treadles=4

Bower : Nous ignorons les lignes vides et les commentaires ; en début de ligne, comparons les noms sans distinction de casse, et pour les clés ordinaires la dernière valeur l’emporte. Les lignes de structure sont indexées par numéro. Nous tronquons les espaces des valeurs mais ne retirons pas spécialement les commentaires en fin de ligne.

4. Booléens et symboles

Pour vrai/faux, le format autorise true, on, yes et 1 du côté vrai, et false, off, no et 0 du côté faux. Si un booléen optionnel est absent, le traiter comme faux sauf indication contraire d’une section.

Bower : Nous traitons true, yes et 1 comme vrai. Toute autre valeur non vide compte comme faux. Nous ne gérons pas spécialement on ni off.

Certains programmes stockent des « symboles » de dessin (caractères à la place de cases remplies). Ils utilisent un petit type symbole :

=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 : Nous n’implémentons pas les symboles. L’apparence repose uniquement sur les couleurs. Les sections de symboles sont ignorées à l’import et jamais écrites à l’export.

5. Exigences minimales

Un fichier 1.1 correct a toujours [WIF] et [CONTENTS]. Toute autre section présente dans le fichier doit être listée sous [CONTENTS] avec la valeur true. Vous pouvez omettre les sections inutilisées, ou les lister à false. Si une section est présente, ses clés obligatoires doivent l’être aussi.

Ainsi, un fichier qui n’a que le rentrage et pas de bloc [WIF] n’est pas un document WIF 1.1 valide — même si certains outils tentent encore de le lire.

Bower : L’import échoue sans [WIF]. Nous n’exigeons ni ne validons [CONTENTS] à l’entrée. À l’export, nous écrivons toujours les deux, et marquons true pour chaque section émise.

6. Sections d’information, sections de données et données éparses

Certaines sections sont du contexte (titre, taille de palette, effectifs du métier) et d’autres sont les lignes réelles du dessin (rentrage, couleurs par fil, etc.). [CONTENTS] liste ce qui est inclus. Elle ne liste pas [WIF] elle-même.

Le format attend des données éparses. On crée tous les fils de chaîne et de trame à partir de Threads, on remplit les défauts depuis [WARP] et [WEFT], on met les cellules de structure à zéro (inutilisées), puis on n’écrit que les lignes qui diffèrent de ces défauts. Les lecteurs font l’inverse.

Par exemple, si huit fils de chaîne sont le même rouge et seul le fil 3 est bleu, vous pouvez mettre le rouge par défaut sur la chaîne et surcharger une ligne :

[WARP]
Threads=8
Color=1

[WARP COLORS]
3=2

Les fils 1, 2, 4–8 restent en couleur de palette 1 ; le fil 3 utilise la couleur 2. Même idée pour la structure : une ligne de rentrage absente signifie « aucune lame sur ce fil », pas « copier le fil précédent ».

Bower : Nous utilisons les nombres de fils et les tables de structure/couleur. Nous n’implémentons pas les défauts d’espacement/épaisseur ni l’espacement/épaisseur épars. La structure est vide par défaut ; les clés de structure manquantes restent vides. Si une table de couleurs est présente, nous appliquons les défauts Color de [WARP] / [WEFT] quand l’indice est supérieur à zéro, puis les surcharges par fil et par duite.

7. Sections privées

Les applications peuvent stocker leurs propres données sans casser les autres. Le nom doit inclure un identifiant de source unique pour éviter les collisions entre éditeurs :

[PRIVATE <SourceID> <SectionName>]

Lines inside must not start with '[' so a reader can find the next section.

Bower : Nous ignorons les sections privées et ne les écrivons jamais. Nous ne définissons pas d’identifiant Source privé.

8. Catalogue des sections

Voici chaque section nommée du WIF 1.1, et ce que nous en faisons. Si vous ne vous intéressez qu’à ouvrir des dessins dans Bower, vous pouvez parcourir les entrées « Ignoré » et vous concentrer sur la structure, les couleurs et la liste d’export en section 10.

8.1 [WIF] — obligatoire

C’est le bloc d’identité. Sans lui, nous ne traitons pas le fichier comme du 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 section elle-même est obligatoire à l’import. Nous écrivons Version=1.1, Date, Developers, Source Program=Bower et Source Version à l’export. Nous n’échouons pas durement si des clés individuelles dans [WIF] manquent à l’import.

8.2 [CONTENTS] — obligatoire en 1.1

C’est une table des matières : nom de section comme clé, true ou false comme valeur. Seules les sections qui existent doivent être listées à true. Certains auteurs listent toutes les sections possibles en true/false ; c’est autorisé, pas obligatoire.

En théorie, un lecteur soigneux pourrait décider quoi charger à partir de CONTENTS seul. En pratique, beaucoup d’outils (y compris nous) parcourent simplement tout le fichier.

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 : Nous n’exigeons pas CONTENTS à l’import et ne l’utilisons pas pour choisir quoi parser. À l’export, nous écrivons true pour chaque section réellement émise.

8.3 [COLOR PALETTE]

Cela indique la taille de la palette et la plage numérique des valeurs RVB. Les anciens fichiers utilisent parfois 0–999 au lieu de 0–255, donc les lecteurs doivent mettre à l’échelle.

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

Par exemple, Range=0,999 et une entrée 1=999,0,0 mappe le canal rouge à environ 255 en 8 bits. Avec Range=0,255 et 1=255,0,0, aucun redimensionnement n’est nécessaire.

Bower : Nous lisons Range (défaut 0,255 s’il manque) et convertissons chaque canal avec round((c − min) / (max − min) * 255), puis bornons à 0–255. Si max−min est nul ou négatif, l’import échoue. Nous n’imposons pas Entries. L’export utilise toujours Range=0,255.

8.4 [WARP SYMBOL PALETTE] / [WEFT SYMBOL PALETTE]

Key       Official     Description
----      --------     -----------
Entries   required     integer > 0

Bower : Ignoré. Non écrit.

8.5 [TEXT]

Notes optionnelles sur l’œuvre et le créateur — titre, auteur, coordonnées. Rien de tout cela ne change la grille du dessin.

Key         Official
----        --------
Title       optional
Author      optional
Address     optional
EMail       optional
Telephone   optional
FAX         optional

Bower : Ignoré. Non écrit.

8.6 [WEAVING]

Taille du métier et convention de foule. Les lames et marches peuvent croître si les sections de structure mentionnent des numéros plus élevés que ceux déclarés ici.

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

Foule montante signifie que les lames listées dans le plan de levée (ou levées via marche/attachage) sont celles qui montent. La foule descendante est l’autre convention physique. Si un fichier indique une foule descendante, nous inversons les cellules du plan de levée — ou d’attachage — après chargement pour que nos grilles internes restent en foule montante et que le tissu corresponde encore au sens du fichier.

Bower : Nous lisons Shafts et Treadles (défaut 4 si manquants) et les faisons croître depuis la structure si besoin. Rising Shed absent est traité comme true. False déclenche l’inversion ci-dessus. L’export écrit toujours Rising Shed=true, et Treadles=0 en mode plan de levée. Profile est ignoré.

8.7 [WARP] et [WEFT]

Ces sections décrivent toute la chaîne ou la trame et le défaut pour chaque fil. Une fois Threads connu, on alloue autant de fils ou de duites, on applique les défauts, puis les sections éparses surchargent les individus (voir section 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

Pour Color, préférez un simple indice de palette pour l’échange. Certains fichiers ajoutent aussi un triplet RVB ; nous n’utilisons que l’indice.

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 programme ne gère qu’un des deux, espacement ou épaisseur, le format dit de préférer Spacing quand les deux sont présents. Si vous ne pensez qu’en « épaisseur », écrivez Spacing (ou les deux avec les mêmes nombres).

Bower : Nous lisons Threads (défauts 32 pour la chaîne et 48 pour la trame si manquants) et Color comme un indice de palette quand il est supérieur à zéro. Nous ignorons symboles, espacement, épaisseur, zooms et RVB supplémentaire sur Color. L’export écrit Threads, Color et Units=Centimeters.

8.8 [NOTES]

Texte libre, une chaîne par ligne numérotée. Ne fait pas partie des grilles du dessin.

1=First line of notes
2=Second line

Bower : Ignoré. Non écrit.

8.9 [TIEUP]

Chaque marche liste les lames qu’elle lève (sens foule montante, avant toute inversion). On l’utilise avec le rentrage et le pédalage hors plan de levée pur.

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 : Pris en charge en mode attachage. Les valeurs multi-lames sont acceptées. L’export écrit une ligne par marche.

8.10 [COLOR TABLE]

C’est la palette. Les indices ici sont ceux que pointent les clés Color de chaîne/trame. Les nombres R,G,B vivent dans le Range de [COLOR PALETTE].

Key     = palette index
Value   = R,G,B in the palette Range

Voici un petit exemple de palette, défaut de chaîne, et deux surcharges :

[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

Les fils 1 et 3 prennent par défaut l’entrée rougeâtre ; les fils 2 et 4 utilisent la bleutée.

Bower : Pris en charge, avec le mappage Range décrit plus haut. L’export écrit une entrée de table par couleur de fil unique et utilise toujours Range=0,255.

8.11 [WARP SYMBOL TABLE] / [WEFT SYMBOL TABLE]

Key     = symbol index
Value   = WIF symbol type (see section 4)

Bower : Ignoré. Non écrit.

8.12 [THREADING]

Par quelles lames passe chaque fil de chaîne. Plusieurs lames sur un même fil sont autorisées.

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 : Pris en charge, y compris les fils multi-lames. L’export écrit une ligne par fil.

8.13 Sections par fil et par duite

Ces sections attachent des valeurs à des fils ou duites individuels. Trois groupes : structure (pédalage / plan de levée), couleur, et apparence (épaisseur, espacement, symboles).

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

Le pédalage est pour le mode attachage : la clé est la duite, la valeur les marches enfoncées, p. ex. 5=1,2. Le plan de levée est direct : la clé est la duite, la valeur les lames levées, p. ex. 5=1,3. Un fichier normal utilise l’un ou l’autre chemin de contrôle, pas les deux à la fois (voir la section suivante).

Bower : Nous prenons en charge pédalage, plan de levée et couleurs chaîne/trame. Nous ignorons épaisseur, espacement, zoom et sections de symboles, et ne les écrivons jamais.

8.14 Mode métier, foule montante et dessin d’armure

Il n’y a pas de clé unique « mode= » dans le fichier. On déduit comment lire la structure d’après ce qui est présent.

Voici la règle que nous utilisons dans Bower et la visionneuse WIF gratuite :

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)

Le plan de levée est le modèle style dobby « chaque duite liste les lames ». L’attachage est le modèle classique de métier à lames : les marches sélectionnent une colonne d’attachage, et le pédalage est la séquence de marches.

Quand Rising Shed est false, après chargement des grilles nous inversons chaque cellule du plan de levée (mode plan de levée) ou chaque cellule d’attachage (mode attachage). Le rentrage et le pédalage restent tels qu’écrits.

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

Le dessin d’armure n’est pas stocké dans le fichier. Après chargement de la structure (et toute inversion de foule), chaque case du tissu est chaîne en dessus si une lame rentrée sur ce fil est aussi levée pour cette duite — soit depuis le plan de levée, soit via une marche active et son attachage. Sinon c’est trame en dessus. Les programmes recalculent cela pour l’affichage ; il n’y a pas de section drawdown à exporter.

Bower : C’est ainsi que nous chargeons et affichons. La visionneuse WIF gratuite suit les mêmes règles de structure et de couleur. En mode plan de levée, la visionneuse omet le bloc d’attachage vide et affiche « - » pour les marches dans le panneau latéral.

8.15 Éléments suspendus et obsolètes

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 : Nous les ignorons tous et ne les écrivons pas. Les sections inconnues ne font jamais échouer l’import à elles seules.

9. Limites de taille Bower

Ce ne fait pas partie du WIF 1.1. À l’import, nous bornons les dimensions pour qu’un fichier sauvage n’alloue pas une grille illimitée. Les valeurs hors plage sont ramenées dans la plage plutôt que rejetées comme « pas du WIF ».

Warps, wefts     1 .. 4096
Shafts, treadles 1 .. 64

10. Ce que Bower écrit

Notre export est un fichier complet en foule montante, destiné à s’ouvrir dans d’autres lecteurs 1.1 qui comprennent les mêmes sections de base. Nous ne cherchons pas à conserver notes, symboles, espacement ou données privées d’un import précédent — tout cela est perdu si vous faites un aller-retour chez nous.

  • [WIF], [CONTENTS], [COLOR PALETTE] avec Range=0,255, [WEAVING] avec Rising Shed=true
  • [WARP] et [WEFT] avec Threads, indice Color, Units=Centimeters
  • [COLOR TABLE], [THREADING], [WARP COLORS], [WEFT COLORS]
  • Soit [LIFTPLAN] et Treadles=0, soit [TIEUP] et [TREADLING] ensemble
  • Pas de sections TEXT, NOTES, symboles, espacement, épaisseur, privées ou bitmap

11. Exemples

Deux petits fichiers complets. Pas de table de couleurs — juste la structure.

11.1 Mode attachage

Huit fils, huit duites, quatre lames, quatre marches. Rentrage droit, attachage simple style sergé, pédalage qui parcourt les quatre marches deux fois.

[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 Mode plan de levée

Quatre fils, quatre duites. Treadles vaut 0 et [LIFTPLAN] est présent, donc le fichier est lu en plan de levée. Chaque duite liste les lames directement — pas d’attachage, pas de pédalage.

[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. Outils associés

Vous pouvez ouvrir un .wif dans la visionneuse WIF gratuite pour vérifier le dessin dans le navigateur, ou l’importer dans Bower (y compris Ouvrir dans Bower depuis la visionneuse) pour l’éditer.

13. Références

Voici les sources du texte du format. Les notes « Bower : » de cette page décrivent notre comportement d’import et d’export ; elles ne font pas partie de la spécification de 1997.

  1. 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.
  2. Nielsen, Ravi; Keates, Bob; Sinkler, Rob. Weaving Information File (WIF) Specification, Version 1.0. 3 March 1996. Superseded by 1.1 for current interchange.
  3. Asunder — Bower et la visionneuse WIF gratuite.