pub const CLI_UTILS: &str = "// ============================================\n// CLI Utilities - \u{547d}\u{4ee4}\u{884c}\u{5de5}\u{5177}\u{53cb}\u{597d}\u{5e93}\n// ============================================\n// \u{63d0}\u{4f9b}\u{547d}\u{4ee4}\u{884c}\u{7a0b}\u{5e8f}\u{5e38}\u{7528}\u{7684}\u{529f}\u{80fd}\u{ff1a}\n// - \u{53c2}\u{6570}\u{89e3}\u{6790}\u{ff08}\u{77ed}\u{9009}\u{9879}\u{3001}\u{957f}\u{9009}\u{9879}\u{3001}\u{4f4d}\u{7f6e}\u{53c2}\u{6570}\u{ff09}\n// - ANSI \u{989c}\u{8272}\u{8f93}\u{51fa}\n// - \u{8fdb}\u{5ea6}\u{6761}\u{663e}\u{793a}\n// - \u{8868}\u{683c}\u{683c}\u{5f0f}\u{5316}\n// - \u{4ea4}\u{4e92}\u{5f0f}\u{786e}\u{8ba4}\n// ============================================\n\n// ============================================\n// ANSI \u{989c}\u{8272}\u{4ee3}\u{7801}\n// ============================================\n\n// \u{6587}\u{672c}\u{989c}\u{8272}\u{5e38}\u{91cf}\nSet CLI_COLOR_BLACK \"\\u001b[30m\"\nSet CLI_COLOR_RED \"\\u001b[31m\"\nSet CLI_COLOR_GREEN \"\\u001b[32m\"\nSet CLI_COLOR_YELLOW \"\\u001b[33m\"\nSet CLI_COLOR_BLUE \"\\u001b[34m\"\nSet CLI_COLOR_MAGENTA \"\\u001b[35m\"\nSet CLI_COLOR_CYAN \"\\u001b[36m\"\nSet CLI_COLOR_WHITE \"\\u001b[37m\"\nSet CLI_COLOR_RESET \"\\u001b[0m\"\n\n// \u{80cc}\u{666f}\u{989c}\u{8272}\u{5e38}\u{91cf}\nSet CLI_BG_BLACK \"\\u001b[40m\"\nSet CLI_BG_RED \"\\u001b[41m\"\nSet CLI_BG_GREEN \"\\u001b[42m\"\nSet CLI_BG_YELLOW \"\\u001b[43m\"\nSet CLI_BG_BLUE \"\\u001b[44m\"\nSet CLI_BG_MAGENTA \"\\u001b[45m\"\nSet CLI_BG_CYAN \"\\u001b[46m\"\nSet CLI_BG_WHITE \"\\u001b[47m\"\n\n// \u{6587}\u{672c}\u{6837}\u{5f0f}\nSet CLI_STYLE_BOLD \"\\u001b[1m\"\nSet CLI_STYLE_DIM \"\\u001b[2m\"\nSet CLI_STYLE_ITALIC \"\\u001b[3m\"\nSet CLI_STYLE_UNDERLINE \"\\u001b[4m\"\nSet CLI_STYLE_BLINK \"\\u001b[5m\"\nSet CLI_STYLE_REVERSE \"\\u001b[7m\"\nSet CLI_STYLE_HIDDEN \"\\u001b[8m\"\n\n// ============================================\n// \u{989c}\u{8272}\u{8f93}\u{51fa}\u{51fd}\u{6570}\n// ============================================\n\n// \u{7528}\u{6307}\u{5b9a}\u{989c}\u{8272}\u{5305}\u{88c5}\u{6587}\u{672c}\nFunc CLI_COLORIZE(TEXT, COLOR) {\n Return (COLOR + TEXT + CLI_COLOR_RESET)\n}\n\n// \u{5feb}\u{6377}\u{989c}\u{8272}\u{51fd}\u{6570}\nFunc CLI_RED(TEXT) {\n Return CLI_COLORIZE(TEXT, CLI_COLOR_RED)\n}\n\nFunc CLI_GREEN(TEXT) {\n Return CLI_COLORIZE(TEXT, CLI_COLOR_GREEN)\n}\n\nFunc CLI_YELLOW(TEXT) {\n Return CLI_COLORIZE(TEXT, CLI_COLOR_YELLOW)\n}\n\nFunc CLI_BLUE(TEXT) {\n Return CLI_COLORIZE(TEXT, CLI_COLOR_BLUE)\n}\n\nFunc CLI_CYAN(TEXT) {\n Return CLI_COLORIZE(TEXT, CLI_COLOR_CYAN)\n}\n\nFunc CLI_MAGENTA(TEXT) {\n Return CLI_COLORIZE(TEXT, CLI_COLOR_MAGENTA)\n}\n\n// \u{5e26}\u{6837}\u{5f0f}\u{7684}\u{989c}\u{8272}\u{8f93}\u{51fa}\nFunc CLI_BOLD(TEXT) {\n Return (CLI_STYLE_BOLD + TEXT + CLI_COLOR_RESET)\n}\n\nFunc CLI_DIM(TEXT) {\n Return (CLI_STYLE_DIM + TEXT + CLI_COLOR_RESET)\n}\n\nFunc CLI_UNDERLINE(TEXT) {\n Return (CLI_STYLE_UNDERLINE + TEXT + CLI_COLOR_RESET)\n}\n\n// \u{8bed}\u{4e49}\u{5316}\u{989c}\u{8272}\u{51fd}\u{6570}\nFunc CLI_SUCCESS(TEXT) {\n Return CLI_GREEN(\"\u{2713} \" + TEXT)\n}\n\nFunc CLI_ERROR(TEXT) {\n Return CLI_RED(\"\u{2717} \" + TEXT)\n}\n\nFunc CLI_WARNING(TEXT) {\n Return CLI_YELLOW(\"\u{26a0} \" + TEXT)\n}\n\nFunc CLI_INFO(TEXT) {\n Return CLI_BLUE(\"\u{2139} \" + TEXT)\n}\n\n// ============================================\n// \u{53c2}\u{6570}\u{89e3}\u{6790}\n// ============================================\n\n// \u{89e3}\u{6790}\u{547d}\u{4ee4}\u{884c}\u{53c2}\u{6570}\n// \u{8fd4}\u{56de}\u{5b57}\u{5178}: { \"flags\": [...], \"options\": [[key, value], ...], \"args\": [...] }\nFunc CLI_PARSE_ARGS(ARGS_ARRAY) {\n Set RESULT {}\n Set RESULT[\"flags\"] []\n Set RESULT[\"options\"] []\n Set RESULT[\"args\"] []\n \n Set I 0\n While (I < LEN(ARGS_ARRAY)) {\n Set ARG ARGS_ARRAY[I]\n \n // \u{957f}\u{9009}\u{9879}: --option=value \u{6216} --option value\n If (STARTS_WITH(ARG, \"--\")) {\n Set KEY STRSLICE(ARG, 2, LEN(ARG))\n \n If (CONTAINS(KEY, \"=\")) {\n Set PARTS SPLIT(KEY, \"=\")\n Set OPT_NAME PARTS[0]\n Set OPT_VALUE PARTS[1]\n Set RESULT[\"options\"] PUSH(RESULT[\"options\"], [OPT_NAME, OPT_VALUE])\n } Else {\n // \u{68c0}\u{67e5}\u{4e0b}\u{4e00}\u{4e2a}\u{53c2}\u{6570}\u{662f}\u{5426}\u{662f}\u{503c}\n Set NEXT_I (I + 1)\n If (NEXT_I < LEN(ARGS_ARRAY)) {\n Set NEXT_ARG ARGS_ARRAY[NEXT_I]\n If (Not (STARTS_WITH(NEXT_ARG, \"-\"))) {\n Set RESULT[\"options\"] PUSH(RESULT[\"options\"], [KEY, NEXT_ARG])\n Set I (I + 1)\n } Else {\n Set RESULT[\"flags\"] PUSH(RESULT[\"flags\"], KEY)\n }\n } Else {\n Set RESULT[\"flags\"] PUSH(RESULT[\"flags\"], KEY)\n }\n }\n } Elif (STARTS_WITH(ARG, \"-\")) {\n // \u{77ed}\u{9009}\u{9879}: -f \u{6216} -abc (\u{591a}\u{4e2a}\u{6807}\u{5fd7})\n Set FLAGS STRSLICE(ARG, 1, LEN(ARG))\n Set J 0\n While (J < LEN(FLAGS)) {\n Set FLAG_CHAR CHARAT(FLAGS, J)\n Set RESULT[\"flags\"] PUSH(RESULT[\"flags\"], FLAG_CHAR)\n Set J (J + 1)\n }\n } Else {\n // \u{4f4d}\u{7f6e}\u{53c2}\u{6570}\n Set RESULT[\"args\"] PUSH(RESULT[\"args\"], ARG)\n }\n \n Set I (I + 1)\n }\n \n Return RESULT\n}\n\n// \u{83b7}\u{53d6}\u{9009}\u{9879}\u{503c}\u{ff0c}\u{5e26}\u{9ed8}\u{8ba4}\u{503c}\nFunc CLI_GET_OPTION(OPTIONS_LIST, NAME, DEFAULT) {\n Set I 0\n While (I < LEN(OPTIONS_LIST)) {\n Set PAIR OPTIONS_LIST[I]\n If (PAIR[0] == NAME) {\n Return PAIR[1]\n }\n Set I (I + 1)\n }\n Return DEFAULT\n}\n\n// \u{68c0}\u{67e5}\u{6807}\u{5fd7}\u{662f}\u{5426}\u{5b58}\u{5728}\nFunc CLI_HAS_FLAG(FLAGS_LIST, NAME) {\n Return CONTAINS(FLAGS_LIST, NAME)\n}\n\n// ============================================\n// \u{8868}\u{683c}\u{683c}\u{5f0f}\u{5316}\n// ============================================\n\n// \u{683c}\u{5f0f}\u{5316}\u{8868}\u{683c}\n// HEADERS: [\"\u{5217}1\", \"\u{5217}2\", \"\u{5217}3\"]\n// ROWS: [[\"\u{6570}\u{636e}1\", \"\u{6570}\u{636e}2\", \"\u{6570}\u{636e}3\"], ...]\n// OPTIONS: { \"border\": true, \"padding\": 1 }\nFunc CLI_TABLE(HEADERS, ROWS, OPTIONS) {\n Set BORDER True\n Set PADDING 1\n \n If (TYPE(OPTIONS) == \"Dict\") {\n If (HAS(OPTIONS, \"border\")) {\n Set BORDER OPTIONS[\"border\"]\n }\n If (HAS(OPTIONS, \"padding\")) {\n Set PADDING OPTIONS[\"padding\"]\n }\n }\n \n // \u{8ba1}\u{7b97}\u{6bcf}\u{5217}\u{7684}\u{6700}\u{5927}\u{5bbd}\u{5ea6}\n Set W1 LEN(TO_STRING(HEADERS[0]))\n Set W2 LEN(TO_STRING(HEADERS[1]))\n Set W3 LEN(TO_STRING(HEADERS[2]))\n \n // \u{68c0}\u{67e5}\u{6bcf}\u{884c}\u{6570}\u{636e}\n Set J 0\n While (J < LEN(ROWS)) {\n Set ROW ROWS[J]\n If (LEN(ROW) > 0) {\n Set L LEN(TO_STRING(ROW[0]))\n If (L > W1) { Set W1 L }\n }\n If (LEN(ROW) > 1) {\n Set L LEN(TO_STRING(ROW[1]))\n If (L > W2) { Set W2 L }\n }\n If (LEN(ROW) > 2) {\n Set L LEN(TO_STRING(ROW[2]))\n If (L > W3) { Set W3 L }\n }\n Set J (J + 1)\n }\n \n Set COL_WIDTHS [W1, W2, W3]\n \n // \u{6784}\u{5efa}\u{8868}\u{683c}\n Set RESULT \"\"\n \n // \u{9876}\u{90e8}\u{8fb9}\u{6846}\n If (BORDER) {\n Set RESULT (RESULT + CLI_TABLE_BORDER(COL_WIDTHS, PADDING, \"top\") + \"\\n\")\n }\n \n // \u{8868}\u{5934}\n Set RESULT (RESULT + CLI_TABLE_ROW(HEADERS, COL_WIDTHS, PADDING, BORDER) + \"\\n\")\n \n // \u{8868}\u{5934}\u{5206}\u{9694}\u{7ebf}\n If (BORDER) {\n Set RESULT (RESULT + CLI_TABLE_BORDER(COL_WIDTHS, PADDING, \"middle\") + \"\\n\")\n }\n \n // \u{6570}\u{636e}\u{884c}\n Set I 0\n While (I < LEN(ROWS)) {\n Set ROW ROWS[I]\n Set RESULT (RESULT + CLI_TABLE_ROW(ROW, COL_WIDTHS, PADDING, BORDER) + \"\\n\")\n Set I (I + 1)\n }\n \n // \u{5e95}\u{90e8}\u{8fb9}\u{6846}\n If (BORDER) {\n Set RESULT (RESULT + CLI_TABLE_BORDER(COL_WIDTHS, PADDING, \"bottom\") + \"\\n\")\n }\n \n Return RESULT\n}\n\n// \u{5185}\u{90e8}\u{51fd}\u{6570}\u{ff1a}\u{751f}\u{6210}\u{8868}\u{683c}\u{884c}\nFunc CLI_TABLE_ROW(CELLS, COL_WIDTHS, PADDING, BORDER) {\n Set RESULT \"\"\n Set PAD_STR REPEAT(\" \", PADDING)\n \n If (BORDER) {\n Set RESULT (RESULT + \"\u{2502}\")\n }\n \n Set I 0\n While (I < LEN(CELLS)) {\n Set CELL TO_STRING(CELLS[I])\n Set WIDTH COL_WIDTHS[I]\n Set PADDED (CELL + REPEAT(\" \", (WIDTH - LEN(CELL))))\n \n Set RESULT (RESULT + PAD_STR)\n Set RESULT (RESULT + PADDED)\n Set RESULT (RESULT + PAD_STR)\n \n If (BORDER) {\n Set RESULT (RESULT + \"\u{2502}\")\n }\n \n Set I (I + 1)\n }\n \n Return RESULT\n}\n\n// \u{5185}\u{90e8}\u{51fd}\u{6570}\u{ff1a}\u{751f}\u{6210}\u{8868}\u{683c}\u{8fb9}\u{6846}\nFunc CLI_TABLE_BORDER(COL_WIDTHS, PADDING, TYPE) {\n Set LEFT \"\u{251c}\"\n Set MID \"\u{253c}\"\n Set RIGHT \"\u{2524}\"\n Set HLINE \"\u{2500}\"\n \n If (TYPE == \"top\") {\n Set LEFT \"\u{250c}\"\n Set MID \"\u{252c}\"\n Set RIGHT \"\u{2510}\"\n } Elif (TYPE == \"bottom\") {\n Set LEFT \"\u{2514}\"\n Set MID \"\u{2534}\"\n Set RIGHT \"\u{2518}\"\n }\n \n Set PARTS []\n PUSH(PARTS, LEFT)\n \n Set I 0\n While (I < LEN(COL_WIDTHS)) {\n Set WIDTH COL_WIDTHS[I]\n Set TOTAL_WIDTH (WIDTH + (PADDING * 2))\n PUSH(PARTS, REPEAT(HLINE, TOTAL_WIDTH))\n \n If (I < (LEN(COL_WIDTHS) - 1)) {\n PUSH(PARTS, MID)\n }\n \n Set I (I + 1)\n }\n \n PUSH(PARTS, RIGHT)\n Return JOIN(PARTS, \"\")\n}\n\n// ============================================\n// \u{8fdb}\u{5ea6}\u{6761}\n// ============================================\n\n// \u{521b}\u{5efa}\u{8fdb}\u{5ea6}\u{6761}\n// CURRENT: \u{5f53}\u{524d}\u{503c}\n// TOTAL: \u{603b}\u{503c}\n// WIDTH: \u{8fdb}\u{5ea6}\u{6761}\u{5bbd}\u{5ea6}\u{ff08}\u{5b57}\u{7b26}\u{6570}\u{ff09}\n// OPTIONS: { \"showPercent\": true, \"showNumbers\": true }\nFunc CLI_PROGRESS_BAR(CURRENT, TOTAL, WIDTH, OPTIONS) {\n Set SHOW_PERCENT True\n Set SHOW_NUMBERS True\n \n If (TYPE(OPTIONS) == \"Dict\") {\n If (HAS(OPTIONS, \"showPercent\")) {\n Set SHOW_PERCENT OPTIONS[\"showPercent\"]\n }\n If (HAS(OPTIONS, \"showNumbers\")) {\n Set SHOW_NUMBERS OPTIONS[\"showNumbers\"]\n }\n }\n \n // \u{8ba1}\u{7b97}\u{767e}\u{5206}\u{6bd4}\n Set PERCENT ((CURRENT / TOTAL) * 100)\n Set FILLED_WIDTH FLOOR((PERCENT / 100) * WIDTH)\n \n // \u{6784}\u{5efa}\u{8fdb}\u{5ea6}\u{6761}\n Set BAR \"[\"\n Set BAR (BAR + REPEAT(\"\u{2588}\", FILLED_WIDTH))\n Set BAR (BAR + REPEAT(\"\u{2591}\", (WIDTH - FILLED_WIDTH)))\n Set BAR (BAR + \"]\")\n \n // \u{6dfb}\u{52a0}\u{767e}\u{5206}\u{6bd4}\n If (SHOW_PERCENT) {\n Set BAR (BAR + \" \" + TO_STRING(FLOOR(PERCENT)) + \"%\")\n }\n \n // \u{6dfb}\u{52a0}\u{6570}\u{5b57}\n If (SHOW_NUMBERS) {\n Set BAR (BAR + \" (\" + TO_STRING(CURRENT) + \"/\" + TO_STRING(TOTAL) + \")\")\n }\n \n Return BAR\n}\n\n// \u{7b80}\u{5316}\u{7248}\u{8fdb}\u{5ea6}\u{6761}\u{ff08}\u{4ec5}\u{767e}\u{5206}\u{6bd4}\u{ff09}\nFunc CLI_PROGRESS(PERCENT, WIDTH) {\n Set FILLED_WIDTH FLOOR((PERCENT / 100) * WIDTH)\n Set BAR \"[\"\n Set BAR (BAR + REPEAT(\"\u{2588}\", FILLED_WIDTH))\n Set BAR (BAR + REPEAT(\"\u{2591}\", (WIDTH - FILLED_WIDTH)))\n Set BAR (BAR + \"] \" + TO_STRING(FLOOR(PERCENT)) + \"%\")\n Return BAR\n}\n\n// ============================================\n// \u{4ea4}\u{4e92}\u{5f0f}\u{8f93}\u{5165}\n// ============================================\n\n// \u{786e}\u{8ba4}\u{63d0}\u{793a}\u{ff08}\u{8fd4}\u{56de}\u{7528}\u{6237}\u{8f93}\u{5165}\u{ff09}\nFunc CLI_CONFIRM(MESSAGE) {\n PRINT(MESSAGE + \" (y/n): \")\n Set INPUT INPUT_LINE()\n Set LOWER LOWER(TRIM(INPUT))\n Return (((LOWER == \"y\") Or (LOWER == \"yes\")))\n}\n\n// \u{9009}\u{62e9}\u{83dc}\u{5355}\nFunc CLI_SELECT(PROMPT, OPTIONS) {\n PRINTLN(PROMPT)\n Set I 0\n While (I < LEN(OPTIONS)) {\n PRINTLN(\" \" + TO_STRING((I + 1)) + \". \" + OPTIONS[I])\n Set I (I + 1)\n }\n \n PRINT(\"\u{8bf7}\u{9009}\u{62e9} (1-\" + TO_STRING(LEN(OPTIONS)) + \"): \")\n Set INPUT INPUT_LINE()\n Set CHOICE (TO_NUMBER(TRIM(INPUT)) - 1)\n \n If ((CHOICE >= 0) And (CHOICE < LEN(OPTIONS))) {\n Return OPTIONS[CHOICE]\n }\n \n Return Null\n}\n\n// ============================================\n// \u{5e2e}\u{52a9}\u{4fe1}\u{606f}\u{751f}\u{6210}\n// ============================================\n\n// \u{751f}\u{6210}\u{5e2e}\u{52a9}\u{4fe1}\u{606f}\n// CONFIG: {\n// \"name\": \"\u{547d}\u{4ee4}\u{540d}\",\n// \"version\": \"1.0.0\",\n// \"description\": \"\u{63cf}\u{8ff0}\",\n// \"usage\": \"\u{547d}\u{4ee4} [\u{9009}\u{9879}] \u{53c2}\u{6570}\",\n// \"options\": [\n// {\"flag\": \"-h, --help\", \"description\": \"\u{663e}\u{793a}\u{5e2e}\u{52a9}\"},\n// ...\n// ],\n// \"examples\": [\n// \"\u{547d}\u{4ee4} --option value\",\n// ...\n// ]\n// }\nFunc CLI_HELP(CONFIG) {\n Set LINES []\n \n // \u{6807}\u{9898}\u{548c}\u{7248}\u{672c}\n If (HAS(CONFIG, \"name\")) {\n Set TITLE CONFIG[\"name\"]\n If (HAS(CONFIG, \"version\")) {\n Set TITLE (TITLE + \" v\" + CONFIG[\"version\"])\n }\n Set LINES PUSH(LINES, CLI_BOLD(TITLE))\n Set LINES PUSH(LINES, \"\")\n }\n \n // \u{63cf}\u{8ff0}\n If (HAS(CONFIG, \"description\")) {\n Set LINES PUSH(LINES, CONFIG[\"description\"])\n Set LINES PUSH(LINES, \"\")\n }\n \n // \u{7528}\u{6cd5}\n If (HAS(CONFIG, \"usage\")) {\n Set LINES PUSH(LINES, CLI_BOLD(\"\u{7528}\u{6cd5}:\"))\n Set LINES PUSH(LINES, \" \" + CONFIG[\"usage\"])\n Set LINES PUSH(LINES, \"\")\n }\n \n // \u{9009}\u{9879}\n If (HAS(CONFIG, \"options\")) {\n Set LINES PUSH(LINES, CLI_BOLD(\"\u{9009}\u{9879}:\"))\n Set OPTIONS CONFIG[\"options\"]\n Set I 0\n While (I < LEN(OPTIONS)) {\n Set OPT OPTIONS[I]\n Set FLAG OPT[\"flag\"]\n Set DESC OPT[\"description\"]\n \n // \u{5bf9}\u{9f50}\u{63cf}\u{8ff0}\n Set PADDING REPEAT(\" \", (20 - LEN(FLAG)))\n Set LINES PUSH(LINES, \" \" + CLI_GREEN(FLAG) + PADDING + DESC)\n \n Set I (I + 1)\n }\n Set LINES PUSH(LINES, \"\")\n }\n \n // \u{793a}\u{4f8b}\n If (HAS(CONFIG, \"examples\")) {\n Set LINES PUSH(LINES, CLI_BOLD(\"\u{793a}\u{4f8b}:\"))\n Set EXAMPLES CONFIG[\"examples\"]\n Set I 0\n While (I < LEN(EXAMPLES)) {\n Set LINES PUSH(LINES, \" $ \" + CLI_DIM(EXAMPLES[I]))\n Set I (I + 1)\n }\n Set LINES PUSH(LINES, \"\")\n }\n \n Return JOIN(LINES, \"\\n\")\n}\n\n// ============================================\n// \u{5b57}\u{7b26}\u{4e32}\u{91cd}\u{590d}\u{ff08}\u{8f85}\u{52a9}\u{51fd}\u{6570}\u{ff09}\n// ============================================\n\nFunc REPEAT(STR, COUNT) {\n Set RESULT \"\"\n Set I 0\n While (I < COUNT) {\n Set RESULT (RESULT + STR)\n Set I (I + 1)\n }\n Return RESULT\n}\n\n";Expand description
CLI 工具库