mirror of
https://github.com/bendtherules/completion-viz.git
synced 2026-08-18 21:52:36 +00:00
77 lines
2.0 KiB
JavaScript
77 lines
2.0 KiB
JavaScript
'use strict';
|
|
|
|
function snekparse(args) {
|
|
if (typeof args === 'string') {
|
|
args = args.split(' ');
|
|
}
|
|
const argv = [];
|
|
for (let i = 0; i < args.length; i += 1) {
|
|
const arg = args[i];
|
|
if (/^--.+=/.test(arg)) {
|
|
const match = arg.match(/^--([^=]+)=([\s\S]*)$/);
|
|
argv[match[1]] = match[2];
|
|
} else if (/^--no-.+/.test(arg)) {
|
|
argv[arg.match(/^--no-(.+)/)[1]] = false;
|
|
} else if (/^--.+/.test(arg)) {
|
|
const key = arg.match(/^--(.+)/)[1];
|
|
const next = args[i + 1];
|
|
if (typeof next !== 'undefined' && !/^-/.test(next)) {
|
|
argv[key] = next;
|
|
} else if (/^(true|false)$/.test(next)) {
|
|
argv[key] = next === 'true';
|
|
} else {
|
|
argv[key] = true;
|
|
}
|
|
} else if (/^-[^-]+/.test(arg)) {
|
|
const letters = arg.slice(1, -1).split('');
|
|
let broken = false;
|
|
for (const j of letters) {
|
|
const next = arg.slice(j + 2);
|
|
|
|
if (next === '-') {
|
|
argv[letters[j]] = next;
|
|
continue;
|
|
}
|
|
|
|
if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
|
|
argv[letters[j]] = next.split('=')[1];
|
|
broken = true;
|
|
break;
|
|
}
|
|
|
|
if (/[A-Za-z]/.test(letters[j])
|
|
&& /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
|
|
argv[letters[j]] = next;
|
|
broken = true;
|
|
break;
|
|
}
|
|
|
|
if (letters[j + 1] && letters[j + 1].match(/\W/)) {
|
|
argv[letters[j]] = arg.slice(j + 2);
|
|
broken = true;
|
|
break;
|
|
} else {
|
|
argv[letters[j]] = true;
|
|
}
|
|
}
|
|
|
|
const key = arg.slice(-1)[0];
|
|
if (!broken && key !== '-') {
|
|
if (args[i + 1] && !/^(-|--)[^-]/.test(args[i + 1])) {
|
|
argv[key] = args[i + 1];
|
|
} else if (args[i + 1] && /true|false/.test(args[i + 1])) {
|
|
argv[key] = args[i + 1] === 'true';
|
|
} else {
|
|
argv[key] = true;
|
|
}
|
|
}
|
|
} else {
|
|
argv.push(arg);
|
|
}
|
|
}
|
|
|
|
return argv;
|
|
}
|
|
|
|
module.exports = snekparse;
|