From deafbd4eaad4dcd25135571aabd0505a1ad2a800 Mon Sep 17 00:00:00 2001 From: Tindy X <49061470+tindy2013@users.noreply.github.com> Date: Mon, 20 Jul 2020 22:15:27 +0800 Subject: [PATCH] Fix logic error in generating Clash Script inja: Fix exists implementation. --- include/inja.hpp | 2 +- src/templates.cpp | 99 +++++++++++++++++------------------------------ 2 files changed, 37 insertions(+), 64 deletions(-) diff --git a/include/inja.hpp b/include/inja.hpp index 3f79af8..c7daf09 100644 --- a/include/inja.hpp +++ b/include/inja.hpp @@ -3607,7 +3607,7 @@ class Renderer : public NodeVisitor { } break; case Op::Exists: { auto &&name = get_arguments<1>(node)[0]->get_ref(); - result_ptr = std::make_shared(json_input->find(name) != json_input->end()); + result_ptr = std::make_shared(json_input->contains(json::json_pointer(JsonNode(name, 0).ptr))); json_tmp_stack.push_back(result_ptr); json_eval_stack.push(result_ptr.get()); } break; diff --git a/src/templates.cpp b/src/templates.cpp index 553c8df..fdb9899 100644 --- a/src/templates.cpp +++ b/src/templates.cpp @@ -215,7 +215,7 @@ const std::string clash_script_template = R"(def main(ctx, md): return geoips[key]{% endif %} return "{{ match_group }}")"; -const std::string clash_script_group_template = R"({% if rule.has_domain == "false" and rule.has_ipcidr == "false" %} if ctx.rule_providers["{{ rule.name }}"].match(md): +const std::string clash_script_group_template = R"({% if (rule.has_domain == "false" and rule.has_ipcidr == "false") or rule.original == "true" %} if ctx.rule_providers["{{ rule.name }}"].match(md): ctx.log('[Script] matched {{ rule.group }} rule') return "{{ rule.group }}"{% else %}{% if rule.has_domain == "true" %} if ctx.rule_providers["{{ rule.name }}_domain"].match(md): ctx.log('[Script] matched {{ rule.group }} DOMAIN rule') @@ -335,6 +335,7 @@ int renderClashScript(YAML::Node &base_rule, std::vector &rules rule_name = old_rule_name + "_" + std::to_string(idx++); names[rule_name] = rule_group; urls[rule_name] = rule_path_typed; + rule_type[rule_name] = x.rule_type; ruleset_interval[rule_name] = x.update_interval; if(clash_classical_ruleset) { @@ -407,79 +408,50 @@ int renderClashScript(YAML::Node &base_rule, std::vector &rules std::string url = urls[x], keyword = keywords[x], name = names[x]; bool group_has_domain = has_domain[x], group_has_ipcidr = has_ipcidr[x]; int interval = ruleset_interval[x]; - if(clash_classical_ruleset) + + if(group_has_domain) { std::string yaml_key = x; - - switch(rule_type[yaml_key]) - { - case RULESET_CLASH_CLASSICAL: - base_rule["rule-providers"][yaml_key]["behavior"] = "classical"; - base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_classical.yaml"; - break; - case RULESET_CLASH_DOMAIN: + if(rule_type[x] != RULESET_CLASH_DOMAIN) yaml_key += "_domain"; - base_rule["rule-providers"][yaml_key]["behavior"] = "domain"; - base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_domain.yaml"; - break; - case RULESET_CLASH_IPCIDR: - yaml_key += "_ipcidr"; - base_rule["rule-providers"][yaml_key]["behavior"] = "ipcidr"; - base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_ipcidr.yaml"; - break; - } base_rule["rule-providers"][yaml_key]["type"] = "http"; - + base_rule["rule-providers"][yaml_key]["behavior"] = "domain"; + if(url[0] == '*') + base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); + else + base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=3&url=" + urlsafe_base64_encode(url); + base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_domain.yaml"; + if(interval) + base_rule["rule-providers"][yaml_key]["interval"] = interval; + } + if(group_has_ipcidr) + { + std::string yaml_key = x; + if(rule_type[x] != RULESET_CLASH_IPCIDR) + yaml_key += "_ipcidr"; + base_rule["rule-providers"][yaml_key]["type"] = "http"; + base_rule["rule-providers"][yaml_key]["behavior"] = "ipcidr"; + if(url[0] == '*') + base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); + else + base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=4&url=" + urlsafe_base64_encode(url); + base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_ipcidr.yaml"; + if(interval) + base_rule["rule-providers"][yaml_key]["interval"] = interval; + } + if(!group_has_domain && !group_has_ipcidr) + { + std::string yaml_key = x; + base_rule["rule-providers"][yaml_key]["type"] = "http"; + base_rule["rule-providers"][yaml_key]["behavior"] = "classical"; if(url[0] == '*') base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); else base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=6&url=" + urlsafe_base64_encode(url); - + base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_classical.yaml"; if(interval) base_rule["rule-providers"][yaml_key]["interval"] = interval; } - else - { - if(group_has_domain) - { - std::string yaml_key = x + "_domain"; - base_rule["rule-providers"][yaml_key]["type"] = "http"; - base_rule["rule-providers"][yaml_key]["behavior"] = "domain"; - if(url[0] == '*') - base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); - else - base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=3&url=" + urlsafe_base64_encode(url); - base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_domain.yaml"; - if(interval) - base_rule["rule-providers"][yaml_key]["interval"] = interval; - } - if(group_has_ipcidr) - { - std::string yaml_key = x + "_ipcidr"; - base_rule["rule-providers"][yaml_key]["type"] = "http"; - base_rule["rule-providers"][yaml_key]["behavior"] = "ipcidr"; - if(url[0] == '*') - base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); - else - base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=4&url=" + urlsafe_base64_encode(url); - base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_ipcidr.yaml"; - if(interval) - base_rule["rule-providers"][yaml_key]["interval"] = interval; - } - if(!group_has_domain && !group_has_ipcidr) - { - std::string yaml_key = x; - base_rule["rule-providers"][yaml_key]["type"] = "http"; - base_rule["rule-providers"][yaml_key]["behavior"] = "classical"; - if(url[0] == '*') - base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); - else - base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=6&url=" + urlsafe_base64_encode(url); - base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_classical.yaml"; - if(interval) - base_rule["rule-providers"][yaml_key]["interval"] = interval; - } - } if(script) { std::string json_path = "rules." + std::to_string(index) + "."; @@ -489,6 +461,7 @@ int renderClashScript(YAML::Node &base_rule, std::vector &rules parse_json_pointer(data, json_path + "group", name); parse_json_pointer(data, json_path + "set", "true"); parse_json_pointer(data, json_path + "keyword", keyword); + parse_json_pointer(data, json_path + "original", (rule_type[x] == RULESET_CLASH_DOMAIN || rule_type[x] == RULESET_CLASH_IPCIDR) ? "true" : "false"); } index++; }