Rudimentary support for Include(name) directives in scripts.
Johnny C. Lam [10-31-13 - 19:06]
Rudimentary support for Include(name) directives in scripts.
- Include(name) will cause the the contents of <name> from the script
library to be inserted at that point prior to compiling the script.
- Include() may be nested, i.e., a script may include a script that
includes another script, etc.
- A script that is intended to be included in other scripts and not to be
listed as a selectable script for evaluation at runtime should be
registered with OvaleScripts using:
:RegisterScript(class, name, description, code, scriptType)
where scriptType is anything other than "script", e.g., "include"
git-svn-id: svn://svn.curseforge.net/wow/ovale/mainline/trunk@1118 d5049fe3-3747-40f7-a4b5-f36d6801af5f
diff --git a/Ovale.toc b/Ovale.toc
index 8ad5da8..15c8dd2 100644
--- a/Ovale.toc
+++ b/Ovale.toc
@@ -41,6 +41,7 @@ OvaleAura.lua
OvaleComboPoints.lua
OvaleRecount.lua
OvaleScripts.lua
+scripts\scripts.xml
defaut\scripts.xml
OvaleSkada.lua
OvaleSpellDamage.lua
diff --git a/OvaleCompile.lua b/OvaleCompile.lua
index 185fa56..2d53696 100644
--- a/OvaleCompile.lua
+++ b/OvaleCompile.lua
@@ -269,7 +269,7 @@ local function ParseFunction(prefix, func, params)
self_missingSpellList[spellId] = spellName
end
else
- Ovale:DebugPrintf(OVALE_UNKNOWN_SPELL_DEBUG, "Unknown spell with ID %d", spellId)
+ Ovale:DebugPrintf(OVALE_UNKNOWN_SPELL_DEBUG, "Unknown spell with ID %s", spellId)
end
end
end
@@ -575,6 +575,18 @@ local function ParseLua(text)
return AddNode(node)
end
+local function ParseInclude(name)
+ local code
+ local script = OvaleScripts.script[name]
+ if script then
+ code = script.code
+ end
+ if not code then
+ Ovale:FormatPrint("Cannot Include(...): script named \"%s\" not found", name)
+ end
+ return code or ""
+end
+
local function ParseCommands(text)
local original = text
text = strgsub(text,"(%b[])", ParseLua)
@@ -699,13 +711,6 @@ local function ParseL(text)
return '"'..L[text]..'"'
end
--- Suppression des commentaires
-local function CompileComments(text)
- text = strgsub(text, "#.-\n","")
- text = strgsub(text, "#.*$","")
- return text
-end
-
-- On compile les AddCheckBox et AddListItem
local function CompileInputs(text)
Ovale.casesACocher = {}
@@ -768,7 +773,18 @@ local function CompileScript(text)
end
wipe(self_node)
- text = CompileComments(text)
+ -- Loop and strip out comments and replace Include() directives until there
+ -- are no more inclusions to make.
+ while true do
+ local was = text
+ text = strgsub(text, "#.-\n","")
+ text = strgsub(text, "#.*$","")
+ text = strgsub(text, "Include%s*%(%s*([%w_]+)%s*%)", ParseInclude)
+ if was == text then
+ break
+ end
+ end
+
text = CompileDeclarations(text)
text = CompileInputs(text)
diff --git a/OvaleScripts.lua b/OvaleScripts.lua
index 0e19b33..6d982e6 100644
--- a/OvaleScripts.lua
+++ b/OvaleScripts.lua
@@ -18,31 +18,35 @@ local OvalePaperDoll = Ovale.OvalePaperDoll
--</private-static-properties>
--<public-static-properties>
--- Table of scripts, indexed by source; a script is a table { description = description, code = "..." }.
+-- A "script" is a table { type = "scriptType", desc = "description", code = "..." }
+-- Table of scripts, indexed by name.
OvaleScripts.script = {}
--</public-static-properties>
--<public-static-methods>
--- Return a table of script descriptions indexed by source.
-function OvaleScripts:GetDescriptions()
+-- Return a table of script descriptions indexed by name.
+function OvaleScripts:GetDescriptions(scriptType)
+ scriptType = scriptType or "script"
local descriptionsTable = {}
- for src, tbl in pairs(self.script) do
- descriptionsTable[src] = tbl.desc
+ for name, script in pairs(self.script) do
+ if script.type == scriptType then
+ descriptionsTable[name] = script.desc
+ end
end
return descriptionsTable
end
-function OvaleScripts:RegisterScript(class, source, description, code)
+function OvaleScripts:RegisterScript(class, name, description, code, scriptType)
if class == OvalePaperDoll.class then
- self.script[source] = self.script[source] or {}
- self.script[source].desc = description or source
- self.script[source].code = code or ""
+ self.script[name] = self.script[name] or {}
+ local script = self.script[name]
+ script.type = scriptType or "script"
+ script.desc = description or name
+ script.code = code or ""
end
end
-function OvaleScripts:UnregisterScript(class, source)
- if class == OvalePaperDoll.class then
- self.script[source] = nil
- end
+function OvaleScripts:UnregisterScript(name)
+ self.script[name] = nil
end
--</public-static-methods>
diff --git a/scripts/scripts.xml b/scripts/scripts.xml
new file mode 100644
index 0000000..13345be
--- /dev/null
+++ b/scripts/scripts.xml
@@ -0,0 +1,2 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
+</Ui>