; ========== CapsLockX ========== ; GenerateModuleRunner.ahk — Standalone module scanner / code generator ; Scans Modules/ directory and generates: ; Core\CapsLockX-ModulesRunner.ahk ; Core\CapsLockX-ModulesFunctions.ahk ; Then exits immediately. ; Encoding: UTF-8 with BOM ; ========== CapsLockX ========== #SingleInstance Force #NoTrayIcon SetWorkingDir, %A_ScriptDir%\..\ #Include %A_ScriptDir%\CapsLockX-Config.ahk #Include %A_ScriptDir%\CapsLockX-i18n.ahk global CLX_ModuleDir := "./Modules" global CLX_CoreDir := "./Core" global CLX_Version FileRead, CLX_Version, ./Core/version.txt CLX_Version := CLX_Version ? Trim(CLX_Version, "`r`n`t ") : "0.0.0" global CLX_VersionName := "v" CLX_Version global CLX_ModulesRunner := "Core\CapsLockX-ModulesRunner.ahk" global CLX_ModulesFunctions := "Core\CapsLockX-ModulesFunctions.ahk" ; Copy user modules into Modules/ FileDelete, %CLX_ModuleDir%/*.user.ahk FileDelete, %CLX_ModuleDir%/*.user.md FileCopy %CLX_ConfigDir%/*.user.ahk, %CLX_ModuleDir%/, 1 FileCopy %CLX_ConfigDir%/*.user.md, %CLX_ModuleDir%/, 1 GenerateModuleFiles() ExitApp GenerateModuleFiles() { FileEncoding UTF-8-Raw ; List module files ModuleFiles := "" ; Subdirectory modules (e.g. AccModel/AccModel.ahk) loop, Files, %CLX_ModuleDir%\*, D { ModuleFile := A_LoopFileName "/" A_LoopFileName ".ahk" if (FileExist(CLX_ModuleDir "/" ModuleFile)) { ModuleFiles .= ModuleFile "`n" } } ; Top-level .ahk modules loop, Files, %CLX_ModuleDir%\*.ahk { ModuleFiles .= A_LoopFileName "`n" } ModuleFiles := Trim(ModuleFiles, "`n") Sort ModuleFiles i := 0 loop, Parse, ModuleFiles, `n { i++ ModuleFile := A_LoopField matchResult := RegExMatch(A_LoopField, "O)(?:.*/)?((?:.*[-])*)(.*?)(?:\.user)?\.ahk", Match) if (!matchResult) { matchResult := RegExMatch(A_LoopField, "O)(?:.*/)?((?:.*[-])*)(.*?)(?:\.用户)?\.ahk", Match) } if (!matchResult) Continue ModuleName := Match[2] ModuleFileName := Match[1] Match[2] ; Check if module is disabled T_Disabled := CLX_Config("ModuleDisable", "T" ModuleName "_Disabled", 0, "") ; Find help file HelpFile := "" if (FileExist(CLX_ModuleDir "/" ModuleName ".md")) { HelpFile := CLX_ModuleDir "/" ModuleName ".md" } else if (FileExist(CLX_ModuleDir "/" ModuleFileName ".md")) { HelpFile := CLX_ModuleDir "/" ModuleFileName ".md" } if (!T_Disabled) { ; Encoding cleanup CONVERT_FILE_TO_UTF8_WITH_BOM_ENCODING(CLX_ModuleDir "/" ModuleFile) RunnerCode .= "GoSub CLX_ModuleSetup_" i "`n" FunctionsCode .= "`n" "#If" "`n" "`n" FunctionsCode .= "CLX_ModuleSetup_" i ":" "`n" if (HelpFile) { FunctionsCode .= " CLX_THIS_MODULE_HELP_FILE_PATH = " HelpFile "`n" } else { FunctionsCode .= " CLX_THIS_MODULE_HELP_FILE_PATH := """"" "`n" } FunctionsCode .= " #Include " CLX_ModuleDir "/" ModuleFile "`n" FunctionsCode .= "Return" "`n" } } ; Build runner file Header := "; Auto-generated by GenerateModuleRunner.ahk — do not edit`n" Header .= "global CLX_ModuleDir := " """" CLX_ModuleDir """" "`n" Header .= "global CLX_CoreDir := " """" CLX_CoreDir """" "`n" Header .= "global CLX_Version := " """" CLX_Version """" "`n" Header .= "global CLX_VersionName := " """" CLX_VersionName """" "`n" RunnerOutput := Header "`n" RunnerCode FunctionsOutput := "Return" "`n" FunctionsCode FileEncoding UTF-8 FileDelete %CLX_ModulesRunner% FileAppend %RunnerOutput%, %CLX_ModulesRunner% FileDelete %CLX_ModulesFunctions% FileAppend %FunctionsOutput%, %CLX_ModulesFunctions% }