pub const TEXT_TEMPLATE: &str = "// ============================================\n// Text Template Engine - \u{6587}\u{672c}\u{6a21}\u{677f}\u{5f15}\u{64ce}\n// ============================================\n// \u{63d0}\u{4f9b}\u{6a21}\u{677f}\u{6e32}\u{67d3}\u{529f}\u{80fd}\u{ff0c}\u{7528}\u{4e8e}\u{4ee3}\u{7801}\u{751f}\u{6210}\u{3001}\u{62a5}\u{544a}\u{7b49}\u{573a}\u{666f}\n// \u{652f}\u{6301}\u{ff1a}\n// - \u{53d8}\u{91cf}\u{66ff}\u{6362}: {{variable}}\n// - \u{6761}\u{4ef6}\u{6e32}\u{67d3}: {{if condition}}...{{endif}}\n// - \u{5faa}\u{73af}: {{for item in list}}...{{endfor}}\n// - \u{5d4c}\u{5957}\u{6a21}\u{677f}\n// - \u{8fc7}\u{6ee4}\u{5668}: {{variable|upper}}\n// ============================================\n\n// ============================================\n// \u{6a21}\u{677f}\u{6e32}\u{67d3}\u{4e3b}\u{51fd}\u{6570}\n// ============================================\n\n// \u{6e32}\u{67d3}\u{6a21}\u{677f}\n// TEMPLATE: \u{6a21}\u{677f}\u{5b57}\u{7b26}\u{4e32}\n// CONTEXT: \u{53d8}\u{91cf}\u{4e0a}\u{4e0b}\u{6587}\u{5b57}\u{5178}\nFunc TEMPLATE_RENDER(TEMPLATE, CONTEXT) {\n Set RESULT TEMPLATE\n \n // 1. \u{5904}\u{7406}\u{6761}\u{4ef6}\u{8bed}\u{53e5}\n Set RESULT TEMPLATE_PROCESS_IF(RESULT, CONTEXT)\n \n // 2. \u{5904}\u{7406}\u{5faa}\u{73af}\n Set RESULT TEMPLATE_PROCESS_FOR(RESULT, CONTEXT)\n \n // 3. \u{5904}\u{7406}\u{53d8}\u{91cf}\u{66ff}\u{6362}\u{ff08}\u{5e26}\u{8fc7}\u{6ee4}\u{5668}\u{ff09}\n Set RESULT TEMPLATE_PROCESS_VARS(RESULT, CONTEXT)\n \n Return RESULT\n}\n\n// ============================================\n// \u{53d8}\u{91cf}\u{66ff}\u{6362} {{variable}} \u{6216} {{variable|filter}}\n// ============================================\n\nFunc TEMPLATE_PROCESS_VARS(TEXT, CONTEXT) {\n Set RESULT TEXT\n Set PATTERN \"{{\"\n \n While (CONTAINS(RESULT, PATTERN)) {\n Set START_POS INDEXOF(RESULT, PATTERN)\n Set END_PATTERN \"}}\"\n Set END_POS INDEXOF(RESULT, END_PATTERN)\n \n If (END_POS < 0) {\n Break\n }\n \n // \u{63d0}\u{53d6}\u{53d8}\u{91cf}\u{8868}\u{8fbe}\u{5f0f}\n Set VAR_START (START_POS + 2)\n Set VAR_EXPR STRSLICE(RESULT, VAR_START, END_POS)\n Set VAR_EXPR TRIM(VAR_EXPR)\n \n // \u{68c0}\u{67e5}\u{662f}\u{5426}\u{6709}\u{8fc7}\u{6ee4}\u{5668}\n Set VALUE Null\n If (CONTAINS(VAR_EXPR, \"|\")) {\n Set PARTS SPLIT(VAR_EXPR, \"|\")\n Set VAR_NAME TRIM(PARTS[0])\n Set FILTER_NAME TRIM(PARTS[1])\n \n // \u{83b7}\u{53d6}\u{53d8}\u{91cf}\u{503c}\n If (HAS(CONTEXT, VAR_NAME)) {\n Set VALUE CONTEXT[VAR_NAME]\n // \u{5e94}\u{7528}\u{8fc7}\u{6ee4}\u{5668}\n Set VALUE TEMPLATE_APPLY_FILTER(VALUE, FILTER_NAME)\n } Else {\n Set VALUE \"\"\n }\n } Else {\n // \u{65e0}\u{8fc7}\u{6ee4}\u{5668}\u{ff0c}\u{76f4}\u{63a5}\u{83b7}\u{53d6}\u{503c}\n If (HAS(CONTEXT, VAR_EXPR)) {\n Set VALUE CONTEXT[VAR_EXPR]\n } Else {\n Set VALUE \"\"\n }\n }\n \n // \u{66ff}\u{6362}\n Set VALUE_STR TO_STRING(VALUE)\n Set BEFORE STRSLICE(RESULT, 0, START_POS)\n Set AFTER STRSLICE(RESULT, (END_POS + 2), LEN(RESULT))\n Set RESULT (BEFORE + VALUE_STR + AFTER)\n }\n \n Return RESULT\n}\n\n// ============================================\n// \u{8fc7}\u{6ee4}\u{5668}\n// ============================================\n\nFunc TEMPLATE_APPLY_FILTER(VALUE, FILTER) {\n Set VALUE_STR TO_STRING(VALUE)\n \n If (FILTER == \"upper\") {\n Return UPPER(VALUE_STR)\n } Elif (FILTER == \"lower\") {\n Return LOWER(VALUE_STR)\n } Elif (FILTER == \"title\") {\n Return TITLE_CASE(VALUE_STR)\n } Elif (FILTER == \"trim\") {\n Return TRIM(VALUE_STR)\n } Elif (FILTER == \"length\") {\n Return LEN(VALUE_STR)\n } Elif (FILTER == \"reverse\") {\n Return REVERSE_STRING(VALUE_STR)\n } Elif (FILTER == \"json\") {\n Return JSON_STRINGIFY(VALUE)\n } Elif (FILTER == \"escape\") {\n Return TEMPLATE_ESCAPE_HTML(VALUE_STR)\n }\n \n Return VALUE\n}\n\n// \u{6807}\u{9898}\u{683c}\u{5f0f}\u{5316}\u{ff08}\u{9996}\u{5b57}\u{6bcd}\u{5927}\u{5199}\u{ff09}\nFunc TITLE_CASE(STR) {\n If (LEN(STR) == 0) {\n Return STR\n }\n Set FIRST UPPER(STRSLICE(STR, 0, 1))\n Set REST STRSLICE(STR, 1, LEN(STR))\n Return (FIRST + REST)\n}\n\n// \u{53cd}\u{8f6c}\u{5b57}\u{7b26}\u{4e32}\nFunc REVERSE_STRING(STR) {\n Set RESULT \"\"\n Set I (LEN(STR) - 1)\n While (I >= 0) {\n Set RESULT (RESULT + CHARAT(STR, I))\n Set I (I - 1)\n }\n Return RESULT\n}\n\n// HTML \u{8f6c}\u{4e49}\nFunc TEMPLATE_ESCAPE_HTML(STR) {\n Set RESULT STR\n Set RESULT REPLACE(RESULT, \"&\", \"&\")\n Set RESULT REPLACE(RESULT, \"<\", \"<\")\n Set RESULT REPLACE(RESULT, \">\", \">\")\n Set RESULT REPLACE(RESULT, \"\\\"\", \""\")\n Set RESULT REPLACE(RESULT, \"\'\", \"'\")\n Return RESULT\n}\n\n// ============================================\n// \u{6761}\u{4ef6}\u{8bed}\u{53e5} {{if condition}}...{{endif}}\n// ============================================\n\nFunc TEMPLATE_PROCESS_IF(TEXT, CONTEXT) {\n Set RESULT TEXT\n Set IF_START \"{{if \"\n Set IF_END \"{{endif}}\"\n Set ELSE_TAG \"{{else}}\"\n \n While (CONTAINS(RESULT, IF_START)) {\n Set START_POS INDEXOF(RESULT, IF_START)\n \n // \u{627e}\u{5230} if \u{6807}\u{7b7e}\u{7684}\u{7ed3}\u{675f}\n Set TAG_END_POS INDEXOF(STRSLICE(RESULT, START_POS, LEN(RESULT)), \"}}\")\n If (TAG_END_POS < 0) {\n Break\n }\n Set TAG_END_POS (TAG_END_POS + START_POS)\n \n // \u{63d0}\u{53d6}\u{6761}\u{4ef6}\n Set CONDITION_START (START_POS + LEN(IF_START))\n Set CONDITION STRSLICE(RESULT, CONDITION_START, TAG_END_POS)\n Set CONDITION TRIM(CONDITION)\n \n // \u{627e}\u{5230}\u{5bf9}\u{5e94}\u{7684} endif\n Set ENDIF_POS INDEXOF(STRSLICE(RESULT, TAG_END_POS, LEN(RESULT)), IF_END)\n If (ENDIF_POS < 0) {\n Break\n }\n Set ENDIF_POS (ENDIF_POS + TAG_END_POS)\n \n // \u{63d0}\u{53d6}\u{5185}\u{5bb9}\u{5757}\n Set CONTENT_START (TAG_END_POS + 2)\n Set CONTENT STRSLICE(RESULT, CONTENT_START, ENDIF_POS)\n \n // \u{68c0}\u{67e5}\u{662f}\u{5426}\u{6709} else\n Set TRUE_BLOCK CONTENT\n Set FALSE_BLOCK \"\"\n \n If (CONTAINS(CONTENT, ELSE_TAG)) {\n Set ELSE_POS INDEXOF(CONTENT, ELSE_TAG)\n Set TRUE_BLOCK STRSLICE(CONTENT, 0, ELSE_POS)\n Set FALSE_BLOCK STRSLICE(CONTENT, (ELSE_POS + LEN(ELSE_TAG)), LEN(CONTENT))\n }\n \n // \u{8bc4}\u{4f30}\u{6761}\u{4ef6}\n Set CONDITION_VALUE TEMPLATE_EVAL_CONDITION(CONDITION, CONTEXT)\n \n // \u{9009}\u{62e9}\u{8981}\u{6e32}\u{67d3}\u{7684}\u{5757}\n Set RENDERED \"\"\n If (CONDITION_VALUE) {\n Set RENDERED TRUE_BLOCK\n } Else {\n Set RENDERED FALSE_BLOCK\n }\n \n // \u{66ff}\u{6362}\u{6574}\u{4e2a} if \u{5757}\n Set BEFORE STRSLICE(RESULT, 0, START_POS)\n Set AFTER STRSLICE(RESULT, (ENDIF_POS + LEN(IF_END)), LEN(RESULT))\n Set RESULT (BEFORE + RENDERED + AFTER)\n }\n \n Return RESULT\n}\n\n// \u{8bc4}\u{4f30}\u{6761}\u{4ef6}\u{8868}\u{8fbe}\u{5f0f}\nFunc TEMPLATE_EVAL_CONDITION(CONDITION, CONTEXT) {\n // \u{7b80}\u{5355}\u{7684}\u{6761}\u{4ef6}\u{8bc4}\u{4f30}\u{ff1a}\u{68c0}\u{67e5}\u{53d8}\u{91cf}\u{662f}\u{5426}\u{5b58}\u{5728}\u{4e14}\u{4e3a}\u{771f}\u{503c}\n Set VAR_NAME TRIM(CONDITION)\n \n // \u{5904}\u{7406} not \u{8fd0}\u{7b97}\u{7b26}\n Set IS_NOT False\n If (STARTS_WITH(VAR_NAME, \"not \")) {\n Set IS_NOT True\n Set VAR_NAME TRIM(STRSLICE(VAR_NAME, 4, LEN(VAR_NAME)))\n }\n \n // \u{68c0}\u{67e5}\u{53d8}\u{91cf}\n Set VALUE False\n If (HAS(CONTEXT, VAR_NAME)) {\n Set VALUE CONTEXT[VAR_NAME]\n \n // \u{8f6c}\u{6362}\u{4e3a}\u{5e03}\u{5c14}\u{503c}\n If (TYPE(VALUE) == \"Boolean\") {\n // \u{5df2}\u{7ecf}\u{662f}\u{5e03}\u{5c14}\u{503c}\n } Elif (TYPE(VALUE) == \"Number\") {\n Set VALUE (VALUE != 0)\n } Elif (TYPE(VALUE) == \"String\") {\n Set VALUE (LEN(VALUE) > 0)\n } Elif (TYPE(VALUE) == \"Array\") {\n Set VALUE (LEN(VALUE) > 0)\n } Elif (TYPE(VALUE) == \"Null\") {\n Set VALUE False\n } Else {\n Set VALUE True\n }\n }\n \n If (IS_NOT) {\n Return (Not VALUE)\n }\n \n Return VALUE\n}\n\n// ============================================\n// \u{5faa}\u{73af} {{for item in list}}...{{endfor}}\n// ============================================\n\nFunc TEMPLATE_PROCESS_FOR(TEXT, CONTEXT) {\n Set RESULT TEXT\n Set FOR_START \"{{for \"\n Set FOR_END \"{{endfor}}\"\n \n While (CONTAINS(RESULT, FOR_START)) {\n Set START_POS INDEXOF(RESULT, FOR_START)\n \n // \u{627e}\u{5230} for \u{6807}\u{7b7e}\u{7684}\u{7ed3}\u{675f}\n Set TAG_END_POS INDEXOF(STRSLICE(RESULT, START_POS, LEN(RESULT)), \"}}\")\n If (TAG_END_POS < 0) {\n Break\n }\n Set TAG_END_POS (TAG_END_POS + START_POS)\n \n // \u{63d0}\u{53d6}\u{5faa}\u{73af}\u{8868}\u{8fbe}\u{5f0f}: item in list\n Set EXPR_START (START_POS + LEN(FOR_START))\n Set EXPR STRSLICE(RESULT, EXPR_START, TAG_END_POS)\n Set EXPR TRIM(EXPR)\n \n // \u{89e3}\u{6790}: item in list\n If (Not CONTAINS(EXPR, \" in \")) {\n Break\n }\n \n Set PARTS SPLIT(EXPR, \" in \")\n Set ITEM_VAR TRIM(PARTS[0])\n Set LIST_VAR TRIM(PARTS[1])\n \n // \u{627e}\u{5230}\u{5bf9}\u{5e94}\u{7684} endfor\n Set ENDFOR_POS INDEXOF(STRSLICE(RESULT, TAG_END_POS, LEN(RESULT)), FOR_END)\n If (ENDFOR_POS < 0) {\n Break\n }\n Set ENDFOR_POS (ENDFOR_POS + TAG_END_POS)\n \n // \u{63d0}\u{53d6}\u{5faa}\u{73af}\u{4f53}\n Set BODY_START (TAG_END_POS + 2)\n Set BODY STRSLICE(RESULT, BODY_START, ENDFOR_POS)\n \n // \u{83b7}\u{53d6}\u{5217}\u{8868}\n Set LIST []\n If (HAS(CONTEXT, LIST_VAR)) {\n Set LIST CONTEXT[LIST_VAR]\n }\n \n // \u{6e32}\u{67d3}\u{6bcf}\u{6b21}\u{8fed}\u{4ee3}\n Set RENDERED \"\"\n Set I 0\n While (I < LEN(LIST)) {\n Set ITEM LIST[I]\n \n // \u{521b}\u{5efa}\u{65b0}\u{7684}\u{4e0a}\u{4e0b}\u{6587}\u{ff08}\u{5305}\u{542b}\u{5faa}\u{73af}\u{53d8}\u{91cf}\u{ff09}\n Set LOOP_CONTEXT CLONE(CONTEXT)\n Set LOOP_CONTEXT[ITEM_VAR] ITEM\n Set LOOP_CONTEXT[\"loop_index\"] I\n Set LOOP_CONTEXT[\"loop_first\"] (I == 0)\n Set LOOP_CONTEXT[\"loop_last\"] (I == (LEN(LIST) - 1))\n \n // \u{6e32}\u{67d3}\u{5faa}\u{73af}\u{4f53}\n Set ITERATION TEMPLATE_PROCESS_VARS(BODY, LOOP_CONTEXT)\n Set RENDERED (RENDERED + ITERATION)\n \n Set I (I + 1)\n }\n \n // \u{66ff}\u{6362}\u{6574}\u{4e2a} for \u{5757}\n Set BEFORE STRSLICE(RESULT, 0, START_POS)\n Set AFTER STRSLICE(RESULT, (ENDFOR_POS + LEN(FOR_END)), LEN(RESULT))\n Set RESULT (BEFORE + RENDERED + AFTER)\n }\n \n Return RESULT\n}\n\n// ============================================\n// \u{6a21}\u{677f}\u{52a0}\u{8f7d}\u{ff08}\u{4ece}\u{6587}\u{4ef6}\u{ff09}\n// ============================================\n\nFunc TEMPLATE_LOAD(FILEPATH) {\n Return READ_FILE(FILEPATH)\n}\n\n// \u{6e32}\u{67d3}\u{6587}\u{4ef6}\u{6a21}\u{677f}\nFunc TEMPLATE_RENDER_FILE(FILEPATH, CONTEXT) {\n Set TEMPLATE TEMPLATE_LOAD(FILEPATH)\n Return TEMPLATE_RENDER(TEMPLATE, CONTEXT)\n}\n\n// ============================================\n// \u{5e38}\u{7528}\u{6a21}\u{677f}\u{9884}\u{8bbe}\n// ============================================\n\n// HTML \u{9875}\u{9762}\u{6a21}\u{677f}\nFunc TEMPLATE_HTML_PAGE(TITLE, CONTENT, STYLE) {\n Set LINE1 \"<!DOCTYPE html><html><head><meta charset=\'UTF-8\'>\"\n Set LINE2 \"<title>{{title}}</title><style>{{style}}</style></head>\"\n Set LINE3 \"<body>{{content}}</body></html>\"\n Set TEMPLATE (LINE1 + LINE2 + LINE3)\n \n Set CTX {}\n Set CTX[\"title\"] TITLE\n Set CTX[\"content\"] CONTENT\n Set CTX[\"style\"] STYLE\n \n Return TEMPLATE_RENDER(TEMPLATE, CTX)\n}\n\n// Markdown \u{62a5}\u{544a}\u{6a21}\u{677f}\nFunc TEMPLATE_MARKDOWN_REPORT(TITLE, SECTIONS) {\n Set TEMPLATE \"# {{title}}\\n\\n{{for section in sections}}\\n## \u{7ae0}\u{8282}\\n\\n\u{5185}\u{5bb9}\\n\\n{{endfor}}\"\n \n Set CTX {}\n Set CTX[\"title\"] TITLE\n Set CTX[\"sections\"] SECTIONS\n \n Return TEMPLATE_RENDER(TEMPLATE, CTX)\n}\n\n// \u{4ee3}\u{7801}\u{751f}\u{6210}\u{6a21}\u{677f}\u{ff08}\u{51fd}\u{6570}\u{ff09}\nFunc TEMPLATE_FUNCTION_CODE(LANG, NAME, PARAMS, BODY) {\n Set JS_TPL \"function {{name}}({{params}}) {\\n {{body}}\\n}\"\n Set PY_TPL \"def {{name}}({{params}}):\\n {{body}}\"\n Set RS_TPL \"fn {{name}}({{params}}) {\\n {{body}}\\n}\"\n Set GO_TPL \"func {{name}}({{params}}) {\\n {{body}}\\n}\"\n \n Set TEMPLATES {}\n Set TEMPLATES[\"javascript\"] JS_TPL\n Set TEMPLATES[\"python\"] PY_TPL\n Set TEMPLATES[\"rust\"] RS_TPL\n Set TEMPLATES[\"go\"] GO_TPL\n \n If (HAS(TEMPLATES, LANG)) {\n Set TEMPLATE TEMPLATES[LANG]\n Set CTX {}\n Set CTX[\"name\"] NAME\n Set CTX[\"params\"] PARAMS\n Set CTX[\"body\"] BODY\n Return TEMPLATE_RENDER(TEMPLATE, CTX)\n }\n \n Return \"\"\n}\n\n// JSON \u{914d}\u{7f6e}\u{6a21}\u{677f}\nFunc TEMPLATE_JSON_CONFIG(DATA) {\n Return JSON_STRINGIFY(DATA, 2)\n}\n\n// ============================================\n// \u{6279}\u{91cf}\u{6e32}\u{67d3}\n// ============================================\n\n// \u{6279}\u{91cf}\u{6e32}\u{67d3}\u{591a}\u{4e2a}\u{6a21}\u{677f}\n// TEMPLATES: [{\"template\": \"...\", \"context\": {...}, \"output\": \"path\"}, ...]\nFunc TEMPLATE_BATCH_RENDER(TEMPLATES) {\n Set RESULTS []\n \n Set I 0\n While (I < LEN(TEMPLATES)) {\n Set ITEM TEMPLATES[I]\n Set TEMPLATE ITEM[\"template\"]\n Set CONTEXT ITEM[\"context\"]\n \n Set RENDERED TEMPLATE_RENDER(TEMPLATE, CONTEXT)\n \n // \u{5982}\u{679c}\u{6307}\u{5b9a}\u{4e86}\u{8f93}\u{51fa}\u{8def}\u{5f84}\u{ff0c}\u{4fdd}\u{5b58}\u{6587}\u{4ef6}\n If (HAS(ITEM, \"output\")) {\n WRITE_FILE(ITEM[\"output\"], RENDERED)\n Set RESULTS PUSH(RESULTS, {\"output\": ITEM[\"output\"], \"success\": True})\n } Else {\n Set RESULTS PUSH(RESULTS, {\"content\": RENDERED, \"success\": True})\n }\n \n Set I (I + 1)\n }\n \n Return RESULTS\n}\n\n";Expand description
文本模板引擎