@gobstones/gobstones-gbb-parser
Version:
A Parser/Stringifier for GBB (Gobstones Board) file format
72 lines (67 loc) • 2.86 kB
text/typescript
import { GBB } from './index';
import { GBBParsingOptions } from './parser';
import { GBBStringifyingOptions } from './stringifier';
import { cli } from '@gobstones/gobstones-core/cli';
import { intl } from './translations';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const packageJSON = require('../package.json');
interface CLIArguments {
language: string;
file: string;
out: string;
pretty: boolean;
}
// Read from the package.json in order to retrieve the name and version
const name = (packageJSON.name as string).split('/').slice(-1).pop();
const versionNumber = packageJSON.version;
cli({
translator: intl,
texts: {
name,
versionNumber,
help: 'cli.descriptions.help',
tool: 'cli.descriptions.tool',
language: 'cli.descriptions.language',
languageError: 'cli.errors.language',
version: 'cli.descriptions.version'
}
})
.command('parse [gbbString]', 'cli.descriptions.parse', (cmd) => {
cmd.input('cli.descriptions.in', 'cli.errors.file')
.output('cli.descriptions.out')
.option('pretty', 'cli.descriptions.pretty')
.action((app, _, opts: CLIArguments) => {
app.outputHelpOnNoArgs();
const gbbString = app.read();
const parseOpts: GBBParsingOptions = { language: opts.language };
const jsonBoard = GBB.parse(gbbString, parseOpts);
const result = JSON.stringify(jsonBoard, undefined, opts.pretty ? 2 : undefined);
app.write(result);
});
})
.command('stringify [jsonBoard]', 'cli.descriptions.stringify', (cmd) => {
cmd.input('cli.descriptions.in', 'cli.errors.file')
.output('cli.descriptions.out')
.option('pretty', 'cli.descriptions.pretty')
.action((app, _, opts: CLIArguments) => {
app.outputHelpOnNoArgs();
const jsonBoardString = app.read();
const jsonBoard = JSON.parse(jsonBoardString);
const stringifyOpts: GBBStringifyingOptions = {
language: opts.language,
useFullColorNames: opts.pretty,
declareColorsWithZeroStones: false,
declareColorsWithAllZeroStones: false,
separators: {
betweenKeywords: opts.pretty ? 'newline' : 'space',
betweenColors: 'space',
colorKeyToNumber: opts.pretty ? 'tab' : 'space',
betweenCoordinates: 'space',
keywordToCoordinates: 'space'
}
};
const result = GBB.stringify(jsonBoard, stringifyOpts);
app.write(result);
});
})
.run();