public Macro(Project project, Variables variables, out List <LogInfo> logs) { logs = new List <LogInfo>(); MacroEnabled = true; if (!project.MainScript.Sections.ContainsKey(ScriptSection.Names.Variables)) { MacroEnabled = false; logs.Add(new LogInfo(LogState.Info, "Macro not defined")); return; } ScriptSection mainScriptVarSection = project.MainScript.Sections[ScriptSection.Names.Variables]; Dictionary <string, string> varDict = IniReadWriter.ParseIniLinesVarStyle(mainScriptVarSection.Lines); if (!(varDict.ContainsKey(KnownVar.API) && varDict.ContainsKey(KnownVar.APIVAR))) { MacroEnabled = false; logs.Add(new LogInfo(LogState.Info, "Macro not defined")); return; } // Get macroScript string rawScriptPath = varDict[KnownVar.API]; string macroScriptPath = variables.Expand(varDict[KnownVar.API]); // Need expansion MacroScript = project.AllScripts.Find(x => x.RealPath.Equals(macroScriptPath, StringComparison.OrdinalIgnoreCase)); if (MacroScript == null) { MacroEnabled = false; logs.Add(new LogInfo(LogState.Error, $"Macro defined but unable to find macro script [{rawScriptPath}")); return; } // Get macroScript if (!MacroScript.Sections.ContainsKey(varDict[KnownVar.APIVAR])) { MacroEnabled = false; logs.Add(new LogInfo(LogState.Error, $"Macro defined but unable to find macro section [{varDict[KnownVar.APIVAR]}")); return; } MacroSection = MacroScript.Sections[varDict[KnownVar.APIVAR]]; variables.SetValue(VarsType.Global, KnownVar.API, macroScriptPath); if (MacroScript.Sections.ContainsKey(ScriptSection.Names.Variables)) { logs.AddRange(variables.AddVariables(VarsType.Global, MacroScript.Sections[ScriptSection.Names.Variables])); } // Import Section [APIVAR]'s variables, such as '%Shc_Mode%=0' logs.AddRange(variables.AddVariables(VarsType.Global, MacroSection)); // Parse Section [APIVAR] into MacroDict { ScriptSection section = MacroSection; Dictionary <string, string> rawDict = IniReadWriter.ParseIniLinesIniStyle(MacroSection.Lines); foreach (var kv in rawDict) { try { if (Regex.Match(kv.Key, MacroNameRegex, RegexOptions.Compiled | RegexOptions.CultureInvariant).Success) { // Macro Name Validation CodeParser parser = new CodeParser(section, Global.Setting, section.Project.Compat); GlobalDict[kv.Key] = parser.ParseStatement(kv.Value); } else { logs.Add(new LogInfo(LogState.Error, $"Invalid macro name [{kv.Key}]")); } } catch (Exception e) { logs.Add(new LogInfo(LogState.Error, e)); } } } // Parse MainScript's section [Variables] into MacroDict // (Written by SetMacro, ... ,PERMANENT if (project.MainScript.Sections.ContainsKey(ScriptSection.Names.Variables)) { ScriptSection permaSection = project.MainScript.Sections[ScriptSection.Names.Variables]; Dictionary <string, string> rawDict = IniReadWriter.ParseIniLinesIniStyle(permaSection.Lines); foreach (var kv in rawDict) { try { if (Regex.Match(kv.Key, MacroNameRegex, RegexOptions.Compiled | RegexOptions.CultureInvariant).Success) { // Macro Name Validation CodeParser parser = new CodeParser(permaSection, Global.Setting, permaSection.Project.Compat); GlobalDict[kv.Key] = parser.ParseStatement(kv.Value); } else { logs.Add(new LogInfo(LogState.Error, $"Invalid macro name [{kv.Key}]")); } } catch (Exception e) { logs.Add(new LogInfo(LogState.Error, e)); } } } }