UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 8.37 kB
const CHAR_MINUS="-".charCodeAt(0),CHAR_0="0".charCodeAt(0),CHAR_9="9".charCodeAt(0),CHAR_A="A".charCodeAt(0),CHAR_Z="Z".charCodeAt(0),CHAR_LOWER_A="a".charCodeAt(0),CHAR_LOWER_Z="z".charCodeAt(0),CHAR_DQUOTE='"'.charCodeAt(0),CHAR_COLON=":".charCodeAt(0),CHAR_QUESTION_MARK="?".charCodeAt(0),CHAR_STAR="*".charCodeAt(0),CHAR_UNDERSCORE="_".charCodeAt(0),CHAR_DOT=".".charCodeAt(0),CHAR_BACKSLASH="\\".charCodeAt(0),CHAR_SLASH="/".charCodeAt(0),CHAR_PLUS="+".charCodeAt(0),CHAR_EQUALS="=".charCodeAt(0),CHAR_EXCLAMATION="!".charCodeAt(0),CHAR_HASH="#".charCodeAt(0),CHAR_DOLLAR="$".charCodeAt(0),CHAR_PERCENT="%".charCodeAt(0),CHAR_AND="&".charCodeAt(0),CHAR_SQUOTE="'".charCodeAt(0),CHAR_HAT="^".charCodeAt(0),CHAR_BACKTICK="`".charCodeAt(0),CHAR_PIPE="|".charCodeAt(0),CHAR_TILDE="~".charCodeAt(0),CHAR_MIN_ASCII_PRINTABLE=32,CHAR_MAX_ASCII_PRINTABLE=126;function isDigit(e){return void 0!==e&&(e>=CHAR_0&&e<=CHAR_9)}function isAlpha(e){return void 0!==e&&(e>=CHAR_A&&e<=CHAR_Z||e>=CHAR_LOWER_A&&e<=CHAR_LOWER_Z)}function isLcAlpha(e){return void 0!==e&&(e>=CHAR_LOWER_A&&e<=CHAR_LOWER_Z)}function isTChar(e){if(void 0===e)return!1;if(isDigit(e)||isAlpha(e))return!0;switch(e){case CHAR_EXCLAMATION:case CHAR_HASH:case CHAR_DOLLAR:case CHAR_PERCENT:case CHAR_AND:case CHAR_SQUOTE:case CHAR_STAR:case CHAR_PLUS:case CHAR_MINUS:case CHAR_DOT:case CHAR_HAT:case CHAR_UNDERSCORE:case CHAR_BACKTICK:case CHAR_PIPE:case CHAR_TILDE:return!0;default:return!1}}class Input{data;pos;constructor(e){this.data=e,this.pos=0,this.skipSP()}peek(){return this.data[this.pos]}peekCharCode(){return this.pos<this.data.length?this.data.charCodeAt(this.pos):void 0}eat(){++this.pos}skipSP(){for(;" "===this.data[this.pos];)++this.pos}skipOWS(){for(;" "===this.data[this.pos]||"\t"===this.data[this.pos];)++this.pos}atEnd(){return this.pos===this.data.length}allParsed(){return this.skipSP(),this.pos===this.data.length}}function makeError(){return{kind:0}}function parseListInternal(e){const r={kind:11,items:[]};for(;!e.atEnd();){const t=parseItemOrInnerList(e);if(0===t.kind)return t;if(r.items.push(t),e.skipOWS(),e.atEnd())return r;if(","!==e.peek())return makeError();if(e.eat(),e.skipOWS(),e.atEnd())return makeError()}return r}function parseItemOrInnerList(e){return"("===e.peek()?parseInnerList(e):parseItemInternal(e)}function parseInnerList(e){if("("!==e.peek())return makeError();e.eat();const r=[];for(;!e.atEnd();){if(e.skipSP(),")"===e.peek()){e.eat();const t=parseParameters(e);return 0===t.kind?t:{kind:12,items:r,parameters:t}}const t=parseItemInternal(e);if(0===t.kind)return t;if(r.push(t)," "!==e.peek()&&")"!==e.peek())return makeError()}return makeError()}function parseItemInternal(e){const r=parseBareItem(e);if(0===r.kind)return r;const t=parseParameters(e);return 0===t.kind?t:{kind:4,value:r,parameters:t}}function parseBareItem(e){const r=e.peekCharCode();return r===CHAR_MINUS||isDigit(r)?parseIntegerOrDecimal(e):r===CHAR_DQUOTE?parseString(e):r===CHAR_COLON?parseByteSequence(e):r===CHAR_QUESTION_MARK?parseBoolean(e):r===CHAR_STAR||isAlpha(r)?parseToken(e):makeError()}function parseParameters(e){const r=new Map;for(;!e.atEnd()&&";"===e.peek();){e.eat(),e.skipSP();const t=parseKey(e);if(0===t.kind)return t;let a={kind:10,value:!0};if("="===e.peek()){e.eat();const r=parseBareItem(e);if(0===r.kind)return r;a=r}r.has(t.value)&&r.delete(t.value),r.set(t.value,{kind:2,name:t,value:a})}return{kind:3,items:[...r.values()]}}function parseKey(e){let r="";const t=e.peekCharCode();if(t!==CHAR_STAR&&!isLcAlpha(t))return makeError();for(;!e.atEnd();){const t=e.peekCharCode();if(!isLcAlpha(t)&&!isDigit(t)&&t!==CHAR_UNDERSCORE&&t!==CHAR_MINUS&&t!==CHAR_DOT&&t!==CHAR_STAR)break;r+=e.peek(),e.eat()}return{kind:1,value:r}}function parseIntegerOrDecimal(e){let r=5,t=1,a="";if("-"===e.peek()&&(e.eat(),t=-1),!isDigit(e.peekCharCode()))return makeError();for(;!e.atEnd();){const t=e.peekCharCode();if(void 0!==t&&isDigit(t))e.eat(),a+=String.fromCodePoint(t);else{if(t!==CHAR_DOT||5!==r)break;if(e.eat(),a.length>12)return makeError();a+=".",r=6}if(5===r&&a.length>15)return makeError();if(6===r&&a.length>16)return makeError()}if(5===r){const e=t*Number.parseInt(a,10);return e<-999999999999999||e>999999999999999?makeError():{kind:5,value:e}}const n=a.length-1-a.indexOf(".");return n>3||0===n?makeError():{kind:6,value:t*Number.parseFloat(a)}}function parseString(e){let r="";if('"'!==e.peek())return makeError();for(e.eat();!e.atEnd();){const t=e.peekCharCode();if(void 0===t)return makeError();if(e.eat(),t===CHAR_BACKSLASH){if(e.atEnd())return makeError();const t=e.peekCharCode();if(e.eat(),t!==CHAR_BACKSLASH&&t!==CHAR_DQUOTE)return makeError();r+=String.fromCodePoint(t)}else{if(t===CHAR_DQUOTE)return{kind:7,value:r};if(t<CHAR_MIN_ASCII_PRINTABLE||t>CHAR_MAX_ASCII_PRINTABLE)return makeError();r+=String.fromCodePoint(t)}}return makeError()}function parseToken(e){const r=e.peekCharCode();if(r!==CHAR_STAR&&!isAlpha(r))return makeError();let t="";for(;!e.atEnd();){const r=e.peekCharCode();if(void 0===r||!isTChar(r)&&r!==CHAR_COLON&&r!==CHAR_SLASH)break;e.eat(),t+=String.fromCodePoint(r)}return{kind:8,value:t}}function parseByteSequence(e){let r="";if(":"!==e.peek())return makeError();for(e.eat();!e.atEnd();){const t=e.peekCharCode();if(void 0===t)return makeError();if(e.eat(),t===CHAR_COLON)return{kind:9,value:r};if(!isDigit(t)&&!isAlpha(t)&&t!==CHAR_PLUS&&t!==CHAR_SLASH&&t!==CHAR_EQUALS)return makeError();r+=String.fromCodePoint(t)}return makeError()}function parseBoolean(e){return"?"!==e.peek()?makeError():(e.eat(),"0"===e.peek()?(e.eat(),{kind:10,value:!1}):"1"===e.peek()?(e.eat(),{kind:10,value:!0}):makeError())}export function parseItem(e){const r=new Input(e),t=parseItemInternal(r);return r.allParsed()?t:makeError()}export function parseList(e){return parseListInternal(new Input(e))}export function serializeItem(e){const r=serializeBareItem(e.value);if(0===r.kind)return r;const t=serializeParameters(e.parameters);return 0===t.kind?t:{kind:13,value:r.value+t.value}}export function serializeList(e){const r=[];for(let t=0;t<e.items.length;++t){const a=e.items[t];if(12===a.kind){const e=serializeInnerList(a);if(0===e.kind)return e;r.push(e.value)}else{const e=serializeItem(a);if(0===e.kind)return e;r.push(e.value)}}return{kind:13,value:r.join(", ")}}function serializeInnerList(e){const r=[];for(let t=0;t<e.items.length;++t){const a=serializeItem(e.items[t]);if(0===a.kind)return a;r.push(a.value)}let t="("+r.join(" ")+")";const a=serializeParameters(e.parameters);return 0===a.kind?a:(t+=a.value,{kind:13,value:t})}function serializeParameters(e){let r="";for(const t of e.items){r+=";";const e=serializeKey(t.name);if(0===e.kind)return e;r+=e.value;const a=t.value;if(10!==a.kind||!a.value){r+="=";const e=serializeBareItem(a);if(0===e.kind)return e;r+=e.value}}return{kind:13,value:r}}function serializeKey(e){if(0===e.value.length)return makeError();const r=e.value.charCodeAt(0);if(!isLcAlpha(r)&&r!==CHAR_STAR)return makeError();for(let r=1;r<e.value.length;++r){const t=e.value.charCodeAt(r);if(!isLcAlpha(t)&&!isDigit(t)&&t!==CHAR_UNDERSCORE&&t!==CHAR_MINUS&&t!==CHAR_DOT&&t!==CHAR_STAR)return makeError()}return{kind:13,value:e.value}}function serializeBareItem(e){return 5===e.kind?serializeInteger(e):6===e.kind?serializeDecimal(e):7===e.kind?serializeString(e):8===e.kind?serializeToken(e):10===e.kind?serializeBoolean(e):9===e.kind?serializeByteSequence(e):makeError()}function serializeInteger(e){return e.value<-999999999999999||e.value>999999999999999||!Number.isInteger(e.value)?makeError():{kind:13,value:e.value.toString(10)}}function serializeDecimal(e){throw"Unimplemented"}function serializeString(e){for(let r=0;r<e.value.length;++r){const t=e.value.charCodeAt(r);if(t<CHAR_MIN_ASCII_PRINTABLE||t>CHAR_MAX_ASCII_PRINTABLE)return makeError()}let r='"';for(let t=0;t<e.value.length;++t){const a=e.value[t];'"'!==a&&"\\"!==a||(r+="\\"),r+=a}return r+='"',{kind:13,value:r}}function serializeToken(e){if(0===e.value.length)return makeError();const r=e.value.charCodeAt(0);if(!isAlpha(r)&&r!==CHAR_STAR)return makeError();for(let r=1;r<e.value.length;++r){const t=e.value.charCodeAt(r);if(!isTChar(t)&&t!==CHAR_COLON&&t!==CHAR_SLASH)return makeError()}return{kind:13,value:e.value}}function serializeByteSequence(e){throw"Unimplemented"}function serializeBoolean(e){return{kind:13,value:e.value?"?1":"?0"}}