TEXT_TEMPLATE

Constant TEXT_TEMPLATE 

Source
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, \"&\", \"&amp;\")\n    Set RESULT REPLACE(RESULT, \"<\", \"&lt;\")\n    Set RESULT REPLACE(RESULT, \">\", \"&gt;\")\n    Set RESULT REPLACE(RESULT, \"\\\"\", \"&quot;\")\n    Set RESULT REPLACE(RESULT, \"\'\", \"&#39;\")\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

文本模板引擎