WIF står för Weaving Information File (vävinformationsfil). Det är ett ren textformat som de flesta vävprogram kan öppna och spara, så att du kan flytta en vävnota mellan appar utan att rita om den. Versionen alla använder är 1.1 från 20 april 1997.

Nedan går vi igenom hur en .wif-fil är uppbyggd, avsnitt för avsnitt, och noterar vad Bower och vår gratis WIF-visare faktiskt gör med varje del. Om du skriver ett verktyg eller försöker laga en fil som inte öppnas rent bör detta hjälpa. För en enkel introduktion först, se Vad är en WIF-fil?.

När vi säger något om Bower använder vi dessa etiketter:

  • Stöds — vi läser det, skriver det, eller båda.
  • Delvis — vi hanterar det, men inte varje gränsfall från 1.1-texten.
  • Ignoreras — filen kan innehålla det; vi hoppar över det och låter inte importen misslyckas bara för att det finns där.
  • Skrivs inte — vår export skriver aldrig ut det.
  • Vilande i 1.1 — finns fortfarande listat i den gamla formattexten, men ingår inte i normal användning i dag.

1. Designmål

De som formgav WIF ville ha ett format som kunde växa utan att bli oläsligt, som en människa kunde öppna i en textredigerare och fortfarande förstå, och som vilken dator som helst som kan läsa ren text kunde bearbeta.

De valde människovänliga kommalistor med skaft- och trampnummer i stället för packade binära bitfält. Layouten liknar mycket en gammal Windows-.INI-fil — avsnitt inom hakparenteser, rader Key=value — men den är inte begränsad till 64K hos klassiska Windows 3.1-ini-filer. Du kan inte använda de gamla Windows private-profile-API:erna; du måste parsa texten själv.

2. Filtyp

En .wif-fil är bara text. Det finns inget binärt omslag. Man förväntar sig tillägget .wif; det som spelar roll är innehållet.

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: Vi läser och skriver .wif som vanlig text.

3. Lexikala regler

Allt är radbaserat. En rad är tom, en kommentar, en avsnittsrubrik eller ett nyckel/värde-par.

  • Tomma rader ignoreras.
  • Om det första icke-blanktecknet är «;» är hela raden en kommentar. Du kan också sätta en kommentar efter ett tal eller ett booleskt värde (ofta efter ännu ett «;»). Fritextnycklar ska inte ha efterföljande kommentarer på samma rad.
  • Avsnittsrubriker ser ut som [Section Name]. Jämförelsen är skiftlägesokänslig; enligt konvention skrivs namnen med versaler.
  • Tilldelningar ser ut som Key=value. Nyckeln jämförs skiftlägesokänsligt. Värdet är det som står efter första «=» på raden.
  • Dubbla nycklar i ett avsnitt är dålig stil. Läsare ska inte krascha; de kan behålla första eller sista värdet.
  • Avsnittsordning och nyckelordning inom ett avsnitt spelar ingen roll för en korrekt läsare.

Här är ett litet fragment (inte en full vävnota):

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

Bower: Vi hoppar över tomrader och hela ;-kommentarsrader, matchar namn skiftlägesokänsligt, och för vanliga nycklar vinner sista värdet. Strukturrader indexeras med nummer. Vi trimmar värden men strippar inte särskilt inline-kommentarer i slutet av raden.

4. Booleska värden och symboler

För sant/falskt tillåter formatet true, on, yes och 1 på den sanna sidan, och false, off, no och 0 på den falska. Saknas en valfri boolesk, behandla den som falsk om inte ett visst avsnitt säger något annat.

Bower: Vi behandlar true, yes och 1 som sant. Allt annat icke-tomt räknas som falskt. Vi särbehandlar inte on eller off.

Vissa program lagrar «symboler» för notan (tecken i stället för ifyllda rutor). De använder en liten symboltyp:

=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: Vi implementerar inte symboler. Utseendet är bara färger. Symbolavsnitt ignoreras vid import och skrivs aldrig vid export.

5. Minimikrav

En riktig 1.1-fil har alltid [WIF] och [CONTENTS]. Varje annat avsnitt som faktiskt finns i filen ska listas under [CONTENTS] med värdet true. Du kan utelämna avsnitt du inte använder, eller lista dem som false. Om ett avsnitt finns ska dess obligatoriska nycklar också finnas.

Så en fil som bara har solning och inget [WIF]-block är inte ett giltigt WIF 1.1-dokument — även om vissa verktyg fortfarande försöker läsa den.

Bower: Importen misslyckas utan [WIF]. Vi kräver eller validerar inte [CONTENTS] på vägen in. Vid export skriver vi alltid båda, och markerar true för varje avsnitt vi emitterar.

6. Informationsavsnitt, dataavsnitt och sparsamma data

Vissa avsnitt är bakgrund (titel, palettstorlek, vävstolsräknare) och andra är de faktiska raderna i notan (solningsrader, färger per tråd osv.). [CONTENTS] är listan över vad som ingår. Den listar inte [WIF] själv.

Formatet förväntar sig sparsamma data. Du skapar alla varp- och inslagstrådar från Threads, fyller i standardvärden från [WARP] och [WEFT], sätter strukturceller till noll (oanvända) och skriver bara de rader som skiljer sig från standardvärdena. Läsare gör omvänd process.

Till exempel: om åtta varptrådar är samma röda och bara tråd 3 är blå kan du sätta rött som standard på varpen och åsidosätta en rad:

[WARP]
Threads=8
Color=1

[WARP COLORS]
3=2

Trådar 1, 2, 4–8 behåller palettfärg 1; tråd 3 använder palettfärg 2. Samma idé för struktur: en saknad solningsrad betyder «inga skaft på den tråden», inte «kopiera föregående tråd».

Bower: Vi använder trådantal och struktur-/färg tabellerna. Vi implementerar inte spacing/thickness-standardvärden eller sparsam thickness/spacing. Struktur är tom som standard; saknade strukturnycklar förblir tomma. Om en färg tabell finns tillämpar vi Color-standard från [WARP] / [WEFT] när indexet är större än noll, sedan per-tråd- och per-inskottsåsidosättningar.

7. Privata avsnitt

Appar kan lagra egna data utan att störa alla andra. Namnet måste innehålla ett unikt käll-id så att två leverantörer inte krockar:

[PRIVATE <SourceID> <SectionName>]

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

Bower: Vi hoppar över privata avsnitt och skriver dem aldrig. Vi definierar inget privat Source ID.

8. Avsnittskatalog

Här är varje namngivet avsnitt från WIF 1.1, och vad vi gör med det. Om du bara bryr dig om att öppna noter i Bower kan du skumma «Ignoreras»-posterna och fokusera på struktur, färger och exportlistan i avsnitt 10.

8.1 [WIF] — obligatoriskt

Detta är identitetsblocket. Utan det behandlar vi inte filen som 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: Avsnittet i sig krävs vid import. Vi skriver Version=1.1, Date, Developers, Source Program=Bower och Source Version vid export. Vi failar inte hårt om enskilda nycklar i [WIF] saknas vid import.

8.2 [CONTENTS] — obligatoriskt i 1.1

Detta är en innehållsförteckning: avsnittsnamn som nyckel, true eller false som värde. Bara avsnitt som finns behöver listas som true. Vissa skribenter listar alla möjliga avsnitt med true/false; det är tillåtet, inte obligatoriskt.

I teorin kunde en noggrann läsare bestämma vad som ska laddas bara från CONTENTS. I praktiken går många verktyg (inklusive vi) bara igenom hela filen.

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: Vi kräver inte CONTENTS vid import och använder det inte för att välja vad som ska parsas. Vid export skriver vi true för varje avsnitt vi faktiskt emitterar.

8.3 [COLOR PALETTE]

Detta talar om hur stor paletten är och vilket numeriskt intervall RGB-värdena använder. Äldre filer använder ibland 0–999 i stället för 0–255, så läsare måste skala.

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

Till exempel: Range=0,999 och en tabellpost 1=999,0,0 mappar den röda kanalen till ungefär 255 i 8 bitar. Med Range=0,255 och 1=255,0,0 behövs ingen skalning.

Bower: Vi läser Range (standard 0,255 om det saknas) och konverterar varje kanal med round((c − min) / (max − min) * 255), sedan clamp till 0–255. Om max−min är noll eller negativ misslyckas importen. Vi tvingar inte Entries. Export använder alltid Range=0,255.

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

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

Bower: Ignoreras. Skrivs inte.

8.5 [TEXT]

Valfria anteckningar om verket och skaparen — titel, författare, kontakt. Inget av detta ändrar vävnotans rutnät.

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

Bower: Ignoreras. Skrivs inte.

8.6 [WEAVING]

Vävstolsstorlek och skälkonvention. Skaft och trampor kan växa om strukturavsnitten nämner högre nummer än du deklarerade här.

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

Stigande skäl betyder att skaften listade i lyftplanen (eller lyfta via tramp/uppknytning) är de som lyfts. Fallande skäl är den andra fysiska konventionen. Om en fil säger fallande skäl speglar vi lyftplancellerna — eller uppknytningscellerna — efter laddning så att våra interna rutnät förblir stigande skäl och tyget fortfarande stämmer med filens avsikt.

Bower: Vi läser Shafts och Treadles (standard 4 om de saknas) och växer dem från strukturen vid behov. Saknat Rising Shed behandlas som true. False utlöser speglingen ovan. Export skriver alltid Rising Shed=true, och Treadles=0 i lyftplansläge. Profile ignoreras.

8.7 [WARP] och [WEFT]

Dessa beskriver hela varpen eller inslaget och standarden för varje tråd. När du känner till Threads allokerar du så många ändar eller inslag, tillämpar standardvärden och låter sparsamma avsnitt åsidosätta enskilda (se avsnitt 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

För Color, föredra ett enkelt palettindex för utbyte. Vissa filer bifogar också en RGB-trippel; vi använder bara indexet.

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

Om ett program bara stöder en av spacing och thickness säger formatet att föredra Spacing när båda finns. Om du bara tänker i «tjocklek», skriv Spacing (eller båda med samma tal).

Bower: Vi läser Threads (standard 32 för varp och 48 för inslag om de saknas) och Color som ett palettindex när det är större än noll. Vi ignorerar symboler, spacing, thickness, zooms och extra RGB på Color. Export skriver Threads, Color och Units=Centimeters.

8.8 [NOTES]

Fritext, en sträng per numrerad rad. Ingår inte i vävnotans rutnät.

1=First line of notes
2=Second line

Bower: Ignoreras. Skrivs inte.

8.9 [TIEUP]

Varje trampa listar skaften den lyfter (stigande skäl-mening, före eventuell spegling). Du använder detta med solning och trampning när du inte är på ren lyftplan.

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: Stöds i uppknytningsläge. Multi-skaft-värden går bra. Export skriver en rad per trampa.

8.10 [COLOR TABLE]

Detta är paletten. Index här är det som varp/inslag Color-nycklar pekar på. R,G,B-talen lever i Range från [COLOR PALETTE].

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

Här är ett litet exempel med palett, varpstandard och två åsidosättningar:

[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

Trådar 1 och 3 får som standard den rödaktiga palettposten; trådar 2 och 4 använder den blåaktiga.

Bower: Stöds, med Range-mappningen som beskrivs ovan. Export skriver en tabellpost per unik garnfärg och använder alltid Range=0,255.

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

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

Bower: Ignoreras. Skrivs inte.

8.12 [THREADING]

Vilka skaft varje varptråd går genom. Flera skaft på en tråd är tillåtna.

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: Stöds, inklusive multi-skaft-trådar. Export skriver en rad per tråd.

8.13 Avsnitt per tråd och inslag

Dessa knyter värden till enskilda ändar eller inslag. Tre grupper: struktur (trampning / lyftplan), färg och utseende (tjocklek, avstånd, symboler).

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

Trampning är för uppknytningsläge: nyckeln är inslaget, värdet vilka trampor du trycker, t.ex. 5=1,2. Lyftplan är direkt: nyckeln är inslaget, värdet vilka skaft som lyfts, t.ex. 5=1,3. En normal fil använder den ena eller den andra kontrollvägen, inte båda samtidigt (se nästa avsnitt).

Bower: Vi stöder trampning, lyftplan och varp-/inslagsfärger. Vi ignorerar thickness, spacing, zoom och symbolavsnitt, och skriver dem aldrig.

8.14 Vävstolsläge, stigande skäl och bindning

Det finns ingen enda «mode=»-nyckel i filen. Du räknar ut hur strukturen ska läsas utifrån vad som finns.

Detta är regeln vi använder i Bower och den gratis WIF-visaren:

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)

Lyftplan är dobby-modellen «varje inslag listar skaft». Uppknytning är den klassiska skaftvävstolmodellen: trampor väljer en kolumn i uppknytningen, och trampning är sekvensen av trampor.

När Rising Shed är false speglar vi efter laddning varje lyftplancell (lyftplansläge) eller varje uppknytningscell (uppknytningsläge). Solning och trampning förblir som skrivna.

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

Bindningen (drawdown) lagras inte i filen. Efter att strukturen laddats (och eventuell skäl-spegling gjorts) är varje tygcell varp upp om något skaft som är solat på den tråden också lyfts på det inslaget — antingen från lyftplanen, eller via en aktiv trampa och dess uppknytning. Annars är det inslag upp. Program räknar om det för visning; det finns inget drawdown-avsnitt att exportera.

Bower: Så här laddar och visar vi. Den gratis WIF-visaren följer samma struktur- och färgregler. I lyftplansläge utelämnar visaren det tomma uppknytningsblocket och visar trampor som «-» i sidopanelen.

8.15 Vilande och föråldrade delar

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: Vi ignorerar allt detta och skriver det inte. Okända avsnitt får aldrig importen att misslyckas av sig själva.

9. Bowers storleksgränser

Dessa ingår inte i WIF 1.1. Vid import kläms dimensioner så att en vild fil inte kan allokera ett obegränsat rutnät. Värden utanför intervallet dras in i intervallet i stället för att avvisas som «inte WIF».

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

10. Vad Bower skriver

Vår export är en fullstigande-skäl-fil avsedd att öppnas i andra 1.1-läsare som förstår samma kärnavsnitt. Vi försöker inte bevara anteckningar, symboler, spacing eller privata leverantörsdata från en tidigare import — det faller bort om du rundtrippar genom oss.

  • [WIF], [CONTENTS], [COLOR PALETTE] med Range=0,255, [WEAVING] med Rising Shed=true
  • [WARP] och [WEFT] med Threads, Color-index, Units=Centimeters
  • [COLOR TABLE], [THREADING], [WARP COLORS], [WEFT COLORS]
  • Antingen [LIFTPLAN] och Treadles=0, eller både [TIEUP] och [TREADLING]
  • Inga TEXT-, NOTES-, symbol-, spacing-, thickness-, privata eller bitmap-avsnitt

11. Exempel

Två små kompletta filer. Ingen färg tabell — bara struktur.

11.1 Uppknytningsläge

Åtta trådar, åtta inslag, fyra skaft, fyra trampor. Rak solning, enkel kypert-uppknytning, trampning som går igenom de fyra tramperna två gånger.

[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 Lyftplansläge

Fyra trådar, fyra inslag. Treadles är 0 och [LIFTPLAN] finns, så filen läses som lyftplan. Varje inslag listar skaft direkt — ingen uppknytning, ingen trampning.

[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. Relaterade verktyg

Du kan öppna en .wif i den gratis WIF-visaren för att kontrollera notan i webbläsaren, eller importera den i Bower (inklusive Öppna i Bower från visaren) när du vill redigera.

13. Källor

Detta är källorna till formattexten. «Bower:»-noterna på den här sidan beskriver vårt import- och exportbeteende; de ingår inte i 1997-specifikationen.

  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 och den gratis WIF-visaren.