forked from textiles-lab/knitout-backend-kniterate
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
8d1c353
commit 98bdbec
Showing
4 changed files
with
676 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
/*.k | ||
/*.kc | ||
sketches/ | ||
sketches/*.k | ||
sketches/*.kc | ||
sketches/*.html | ||
sketches/*.css |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
#!/bin/sh | ||
':'; //; exec "$(command -v nodejs || command -v node)" "$0" "$@" | ||
'use strict'; | ||
|
||
//------------------------------------ | ||
|
||
const fs = require('fs'); | ||
|
||
let inFile = process.argv[2]; | ||
let outFile = process.argv[3]; | ||
|
||
const fullGauge = fs.readFileSync(inFile, 'utf8'); | ||
let lines = fullGauge.split('\n'); | ||
let halfGauge = []; | ||
|
||
let rackCount = 0, | ||
xferCount = 0; | ||
|
||
// fn -> f(2n) | ||
// fsn -> f(2n+1) | ||
// bn -> b(2n+1) | ||
// bs -> b(2n) | ||
|
||
const commentCheck = (line, str, skipPush) => { | ||
if (line.indexOf(';') !== -1 && line.indexOf(';') < line.indexOf(str)) { | ||
if (!skipPush) halfGauge.push(line); | ||
return true; | ||
} else return false; | ||
}; | ||
|
||
const replaceValue = (line, bn) => { | ||
if (!commentCheck(line, bn)) { | ||
let splitLine = line.split(bn); | ||
let needle = bn.match(/\d+/g)[0]; | ||
let bed = bn.slice(0, bn.indexOf(needle)); | ||
// | ||
if (line.includes('xfer') && (rackCount !== xferCount || xferCount === 0)) { | ||
++xferCount; | ||
if (rackCount < xferCount) { | ||
//meaning rack was 0 & it wasn't specified | ||
halfGauge.push(`rack 0`); //might be changed later | ||
console.warn('inserting temp rack 0'); //remove | ||
++rackCount; | ||
} | ||
} | ||
// | ||
if (bed === 'fs' || bed === 'b') { | ||
return splitLine.join(`${bed.charAt(0)}${2 * needle + 1}`); | ||
} else { | ||
return splitLine.join(`${bed.charAt(0)}${2 * needle}`); | ||
} | ||
} | ||
}; | ||
let arr = [1, 2]; | ||
let bedNeedle; | ||
const testForBed = (line, bed) => { | ||
if (typeof line === 'object') { | ||
let lineMatch = line.find((str) => str.match(`${bed}[0-9]+`) !== null); | ||
// if (line.some((str) => str.match(`${bed}[0-9]+`) !== null)) { | ||
if (lineMatch !== undefined) { | ||
bedNeedle = lineMatch; | ||
return true; | ||
} | ||
} else { | ||
if (line.match(`${bed}[0-9]+`) !== null) { | ||
bedNeedle = line.match(`${bed}[0-9]+`)[0]; | ||
return true; | ||
} | ||
} | ||
}; | ||
let initRack = false; | ||
for (let i = 0; i < lines.length; ++i) { | ||
if (lines[i].charAt(0) === ';' || lines[i].includes('x-')) { | ||
halfGauge.push(lines[i]); | ||
} else { | ||
if (lines[i].includes('rack')) { | ||
initRack = true; //? | ||
if (!commentCheck(lines[i], 'rack')) { | ||
let rackInfo = lines[i].split(' '); | ||
let oldRack = parseInt(rackInfo[1]); | ||
let newRack = 2 * oldRack - 1; //assuming the racking stays the same if > 1, but need to //check | ||
findxfer: for (let r = i + 1; r < lines.length; ++r) { | ||
//TODO: something similar for split ? | ||
if ( | ||
(lines[r].includes('rack') && !commentCheck(lines[r], 'rack', true)) || | ||
(lines[r].includes('knit') && !commentCheck(lines[r], 'knit', true)) || | ||
(lines[r].includes('tuck') && !commentCheck(lines[r], 'tuck', true)) || | ||
(lines[r].includes('drop') && !commentCheck(lines[r], 'drop', true)) //? //check because seems like sliders could actually be involved in tuck | ||
) { | ||
console.warn(`not changing rack value based on xfer because a ${lines[r].split(' ')[0]} op occurs before any xfers.\n`); //remove //? | ||
break findxfer; | ||
} | ||
///// | ||
if (lines[r].includes('xfer') && !commentCheck(lines[r], 'xfer', true)) { | ||
++rackCount; | ||
let xferInfo = lines[r].split(' '); | ||
if ((testForBed(xferInfo, 'fs') && testForBed(xferInfo, 'bs'))) { // both fs & bs | ||
newRack = (2 * oldRack) + 1; | ||
} else if (testForBed(xferInfo, 'fs') || testForBed(xferInfo, 'bs')) { // only one is either fs||bs, & other is b||f | ||
newRack = 2 * oldRack; | ||
} | ||
break findxfer; | ||
} | ||
} | ||
halfGauge.push(`rack ${newRack}`); | ||
} | ||
} else { | ||
bedNeedle = null; | ||
let newLine = lines[i]; | ||
if (testForBed(lines[i], 'fs')) { | ||
newLine = replaceValue(newLine, bedNeedle); | ||
} else if (testForBed(lines[i], 'f')) { | ||
newLine = replaceValue(newLine, bedNeedle); | ||
} | ||
if (testForBed(lines[i], 'bs')) { | ||
newLine = replaceValue(newLine, bedNeedle); | ||
} else if (testForBed(lines[i], 'b')) { | ||
newLine = replaceValue(newLine, bedNeedle); | ||
} | ||
if (!initRack && bedNeedle !== null) { | ||
halfGauge.push('rack -1'); //equivalent to rack 0 for non-slider (aka when knitting) //TODO: double check to confirm that sliders are never engaged during knitting/tucking/missing | ||
++rackCount; //? | ||
initRack = true; | ||
} | ||
if (newLine.includes('xfer')) { | ||
let prevRackIdx = halfGauge.map((line) => line.includes('rack ') && !commentCheck(line, 'rack', true)).lastIndexOf(true); | ||
let prevRack = halfGauge[prevRackIdx]; | ||
prevRack = parseInt(prevRack.split(' ')[1]); | ||
let frontN = parseInt(newLine.match('f[0-9]+')[0].slice(1)); | ||
let backN = parseInt(newLine.match('b[0-9]+')[0].slice(1)); | ||
if (prevRack !== frontN - backN) { | ||
console.warn(`Changing rack value from ${prevRack} to ${frontN - backN}.\nOld line: ${lines[i]}\nNew line: ${newLine}\n`); | ||
halfGauge.splice(prevRackIdx, 1, `rack ${frontN - backN}`); | ||
} | ||
} | ||
halfGauge.push(newLine); | ||
} | ||
} | ||
} | ||
fs.writeFileSync(outFile, halfGauge.join('\n')); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
#!/bin/sh | ||
':'; //; exec "$(command -v nodejs || command -v node)" "$0" "$@" | ||
'use strict'; | ||
|
||
//------------------------------------ | ||
//TODO: add option too only do one of these things (or just replace carriers) | ||
const fs = require('fs'); | ||
const readline = require('readline'); | ||
|
||
const rl = readline.createInterface({ | ||
input: process.stdin, | ||
output: process.stdout, | ||
}); | ||
|
||
let inFile, outFile, file, lines; | ||
let defaultRollerAdvance = 400, defaultStitchNumber = 6, defaultSpeedNumber = 300; | ||
let rollerAdvance, xferRollerAdvance, stitchNumber, xferStitchNumber, speedNumber, xferSpeedNumber; | ||
let carriers = []; | ||
let changedCarriers = []; | ||
let carrierChange = ({from, to}) => ({ | ||
from: from, | ||
to: to | ||
}); | ||
|
||
// Create a promise based version of rl.question so we can use it in async functions | ||
const question = (str) => new Promise(resolve => rl.question(str, resolve)); | ||
|
||
// all the steps involved, executed asynchronously | ||
const steps = { | ||
start: async () => { | ||
inFile = await question(`Path to input file: `); | ||
console.log('\nPress Enter to skip any of the following prompts.\n'); | ||
return steps.rollerAdvance(); | ||
}, | ||
rollerAdvance: async () => { | ||
rollerAdvance = await question(`Roller advance per pass: `); | ||
if (rollerAdvance) defaultRollerAdvance = rollerAdvance; | ||
return steps.xferRollerAdvance(); | ||
}, | ||
xferRollerAdvance: async () => { | ||
xferRollerAdvance = await question(`Roller advance for transfers: `); | ||
return steps.stitchNumber(); | ||
}, | ||
stitchNumber: async () => { | ||
stitchNumber = await question(`Main stitch number (for knit/tuck): `); | ||
if (stitchNumber) defaultStitchNumber = stitchNumber; | ||
return steps.xferStitchNumber(); | ||
}, | ||
xferStitchNumber: async () => { | ||
xferStitchNumber = await question(`Stitch number for transfers: `); | ||
return steps.speedNumber(); | ||
}, | ||
speedNumber: async () => { | ||
speedNumber = await question(`Main speed number (for knit/tuck): `); | ||
if (speedNumber) defaultSpeedNumber = speedNumber; | ||
return steps.xferSpeedNumber(); | ||
}, | ||
xferSpeedNumber: async () => { | ||
xferSpeedNumber = await question(`Speed number for transfers: `); | ||
return steps.readFile(); | ||
}, | ||
readFile: async () => { | ||
file = fs.readFileSync(inFile, { encoding: 'utf8'}); | ||
return steps.parse(); | ||
}, | ||
parse: async () => { | ||
lines = file.split('\n'); | ||
let xStitch = false, | ||
xSpeed = false, | ||
xRoll = false, | ||
xfer = false; | ||
// | ||
function chopOffComment(str) { | ||
if (str.includes(';')) return str.split(';')[0]; | ||
else return str; | ||
} | ||
// | ||
for (let line in lines) { | ||
if (lines[line] === '') continue; | ||
let info = lines[line].split(' '); | ||
if (info[0] === 'in' || info[0] === 'inhook') { | ||
if (!carriers.includes(info[1])) carriers.push(info[1]); | ||
if (info[0] === 'inhook') { | ||
lines[line] = `in ${info[1]}`; | ||
} | ||
if (!xStitch || !xSpeed || !xRoll) { | ||
if (!xStitch) lines[line] = `x-stitch-number ${defaultStitchNumber}\n${lines[line]}`; | ||
if (!xSpeed) lines[line] = `x-speed-number ${defaultSpeedNumber}\n${lines[line]}`; | ||
if (!xRoll) lines[line] = `x-roller-advance ${defaultRollerAdvance}\n${lines[line]}`; | ||
} | ||
} else if (info[0] === 'x-stitch-number') { | ||
xStitch = true; | ||
if (stitchNumber) lines[line] = `x-stitch-number ${stitchNumber}`; | ||
else defaultStitchNumber = chopOffComment(info[1]); //TODO: determine if this should be redefined... | ||
} else if (info[0] === 'x-speed-number') { | ||
xSpeed = true; | ||
if (speedNumber) lines[line] = `x-speed-number ${speedNumber}`; | ||
else defaultSpeedNumber = chopOffComment(info[1]); | ||
} else if (info[0] === 'x-roller-advance') { | ||
xRoll = true; | ||
if (rollerAdvance) lines[line] = `x-roller-advance ${rollerAdvance}`; | ||
else defaultRollerAdvance = chopOffComment(info[1]); | ||
} else if (info[0] === 'releasehook') { | ||
lines[line] = ''; | ||
} else if (info[0] === 'outhook') { | ||
lines[line] = `out ${info[1]}`; | ||
} else if (!xfer && info[0] === 'xfer') { | ||
let replacementLine = ''; | ||
if (xferStitchNumber) replacementLine += `x-stitch-number ${xferStitchNumber}\n`; | ||
if (xferSpeedNumber) replacementLine += `x-speed-number ${xferSpeedNumber}\n`; | ||
if (xferRollerAdvance) replacementLine += `x-roller-advance ${xferRollerAdvance}\n`; | ||
replacementLine += `${lines[line]}`; | ||
lines[line] = replacementLine; | ||
xfer = true; | ||
} | ||
// | ||
if (xfer && info[0] !== 'xfer' && info[0] !== 'rack' && info[0].charAt(0) !== ';') { | ||
let replacementLine = ''; | ||
if (xferStitchNumber) replacementLine += `x-stitch-number ${defaultStitchNumber}\n`; | ||
if (xferSpeedNumber) replacementLine += `x-speed-number ${defaultSpeedNumber}\n`; | ||
if (xferRollerAdvance) replacementLine += `x-roller-advance ${defaultRollerAdvance}\n`; | ||
replacementLine += `${lines[line]}`; | ||
lines[line] = replacementLine; | ||
xfer = false; | ||
} | ||
} | ||
lines = lines.join('\n'); | ||
return steps.changeCarriers(); | ||
}, | ||
changeCarriers: async () => { | ||
let change = await question(`Would you like to change any of the carriers? [y/n] `); | ||
if (change.toLowerCase() === 'y') { | ||
for (let c in carriers) { | ||
let newCarrier = await question(`Which carrier would you like to change '${carriers[c]}' to? `); | ||
newCarrier = newCarrier.toString().match(/\d+/g)[0]; | ||
changedCarriers.push(carrierChange({ from: carriers[c], to: newCarrier })); | ||
} | ||
lines = lines.split('\n'); | ||
for (let line in lines) { | ||
let info = lines[line].split(' '); | ||
let comment = ''; | ||
if (info[info.length - 1].includes(';')) { | ||
comment = info[info.length - 1].split(';'); | ||
info[info.length - 1] = comment[0]; | ||
comment = `;${comment[1]}`; | ||
} | ||
if (info[0] === 'in' || info[0] === 'out') { | ||
lines[line] = `${info[0]} ${changedCarriers.find(c => c.from == info[1] ).to}${comment}`; | ||
} else if (info[0] === 'knit' || info[0] === 'tuck' || info[0] === 'miss') { //TODO: deal with split | ||
info[3] = changedCarriers.find(c => c.from == info[3]).to; | ||
lines[line] = `${info.join(' ')}${comment}`; | ||
} | ||
} | ||
lines = lines.join('\n'); | ||
} | ||
return steps.writeFile(); | ||
}, | ||
writeFile: async () => { | ||
outFile = await question(`Filename for output knitout: `); | ||
fs.writeFileSync(outFile, lines); | ||
return steps.end(); | ||
}, | ||
end: async () => { | ||
rl.close(); | ||
}, | ||
}; | ||
|
||
// Start the program | ||
steps.start(); |
Oops, something went wrong.