mirror of
https://github.com/sbrl/terrain50-cli.git
synced 2024-11-26 07:33:00 +00:00
image: add --stream argument, and stdin support to --input
This commit is contained in:
parent
2787701f1c
commit
9e47a12b12
3 changed files with 51 additions and 12 deletions
|
@ -14,6 +14,11 @@ npm install --save terrain50-cli
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|
||||||
|
## v1.7 (unreleased)
|
||||||
|
- `image`: Add `--stream` argument for mass-converting large numbers of images from a single stream of multiple terrain50 files
|
||||||
|
- `image`: Add support for reading from stdin with `--input -`
|
||||||
|
|
||||||
|
|
||||||
## v1.6.4
|
## v1.6.4
|
||||||
- Update `terrain50`
|
- Update `terrain50`
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,8 @@ import a from '../../Helpers/Ansi.mjs';
|
||||||
import Terrain50 from 'terrain50';
|
import Terrain50 from 'terrain50';
|
||||||
import Terrain50Renderer from './Terrain50Renderer.mjs';
|
import Terrain50Renderer from './Terrain50Renderer.mjs';
|
||||||
|
|
||||||
|
import { write_safe, end_safe } from '../../Helpers/StreamHelpers.mjs';
|
||||||
|
|
||||||
export default async function(settings) {
|
export default async function(settings) {
|
||||||
if(typeof settings.cli.input !== "string") {
|
if(typeof settings.cli.input !== "string") {
|
||||||
l.error("Error: No input file specified (try --filename path/to/file.asc)");
|
l.error("Error: No input file specified (try --filename path/to/file.asc)");
|
||||||
|
@ -18,19 +20,45 @@ export default async function(settings) {
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!fs.existsSync(settings.cli.input)) {
|
||||||
|
l.error(`Error: The specified input file '${settings.cli.input}' does not exist (check the spelling and permissions).`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let renderer = new Terrain50Renderer(settings.scale_factor | 1);
|
||||||
|
|
||||||
|
if(settings.cli.stream) {
|
||||||
|
if(!fs.existsSync(settings.cli.output))
|
||||||
|
await fs.promises.mkdir(settings.cli.output, { recursive: true, mode: 0o755 });
|
||||||
|
|
||||||
|
let reader = process.stdin;
|
||||||
|
if(settings.cli.input !== "-")
|
||||||
|
reader = fs.createReadStream(settings.cli.input, "utf-8");
|
||||||
|
|
||||||
|
let i = 0;
|
||||||
|
for await(let next of Terrain50.ParseStream(reader)) {
|
||||||
|
process.stderr.write(`${a.fgreen}>>>>> ${a.hicol} Item ${i} ${a.reset}${a.fgreen} <<<<<${a.reset}`);
|
||||||
|
|
||||||
|
await fs.promises.writeFile(
|
||||||
|
path.join(settings.cli.output, `${i}.png`),
|
||||||
|
await renderer.render(next)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
l.log(`Written ${a.hicol}${i}${a.reset} items to ${a.hicol}${a.fgreen}${settings.cli.output}${a.reset}`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
let terrain50 = Terrain50.Parse(
|
let terrain50 = Terrain50.Parse(
|
||||||
await fs.promises.readFile(settings.cli.input, "utf-8")
|
await fs.promises.readFile(settings.cli.input, "utf-8")
|
||||||
);
|
);
|
||||||
|
|
||||||
let renderer = new Terrain50Renderer(settings.scale_factor | 1);
|
|
||||||
let png_buffer = await renderer.render(terrain50);
|
let png_buffer = await renderer.render(terrain50);
|
||||||
|
|
||||||
if(!(png_buffer instanceof Buffer))
|
if(!(png_buffer instanceof Buffer))
|
||||||
throw new Error(`Error: Renderer did not return Buffer (found unexpected ${png_buffer} instead)`);
|
throw new Error(`Error: Renderer did not return Buffer (found unexpected ${png_buffer} instead)`);
|
||||||
|
|
||||||
await fs.promises.writeFile(
|
await fs.promises.writeFile(
|
||||||
settings.cli.output,
|
settings.cli.output,
|
||||||
png_buffer
|
png_buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
l.log(`Written to ${a.hicol}${settings.cli.output}${a.reset}`);
|
l.log(`Written to ${a.hicol}${settings.cli.output}${a.reset}`);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -11,3 +11,9 @@ name = "output"
|
||||||
description = "The output file to write to"
|
description = "The output file to write to"
|
||||||
# default_value = ""
|
# default_value = ""
|
||||||
type = "string"
|
type = "string"
|
||||||
|
|
||||||
|
[[arguments]]
|
||||||
|
name = "stream"
|
||||||
|
description = "Treat the input as a stream of Terrain50 objects. The path specified by the --output argument will be a directory containing all the extracted objects, 1 image file per object."
|
||||||
|
default_value = false
|
||||||
|
type = "boolean"
|
||||||
|
|
Loading…
Reference in a new issue