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