Difference between revisions of "Module:Sandbox/Arcangelus"

From RimWorld Wiki
Jump to navigation Jump to search
m
m (Testing if Module:Key works out of the box.)
Line 1: Line 1:
--[[
+
-- This module implements {{key press}}.
This module implements the functions of Template:Thought
 
]]
 
  
local p = {}
+
local kbdPrefix = '<kbd class="keyboard-key nowrap">'
local getArgs = require('Module:Arguments').getArgs
 
  
--[[ The template argument goes to "main"
+
local kbdSuffix = '</kbd>'
Only this funcion will work when invoked. This is case sensitive.
 
What it does is obtain the data from the wiki to a fomrat readable by other functions]]
 
  
function p.main(frame)
+
local keyText = {
local args = getArgs(frame)
+
['caps lock'] = '⇪ Caps Lock',
--[[ The advantage of adding values to an empty list rather than defining a list
+
['[[caps lock]]'] = '⇪ [[Caps Lock]]',
with the correct values is that no nil values will get into the list this way.
+
['shift'] = '⇧ Shift',
This means that values don't have to be consecutive.
+
['[[shift key|shift]]'] = '⇧ [[Shift key|Shift]]',
EX: value9 is valid w/o defining value2 to value8.
+
['enter'] = '↵ Enter',
]]
+
['[[enter key|enter]]'] = '↵ [[Enter key|Enter]]',
local multi = tonumber(args["multi"]) or 1
+
['cmd'] = '⌘ Cmd',
local valores = {}
+
['[[command key|cmd]]'] = '⌘ [[Command key|Cmd]]',
valores[#valores+1]=args["value"]
+
['command'] = '⌘ Command',
valores[#valores+1]=args["value2"]
+
['[[command key|command]]'] = '⌘ [[Command key|Command]]',
valores[#valores+1]=args["value3"]
+
['opt'] = '⌥ Opt',
valores[#valores+1]=args["value4"]
+
['[[option key|opt]]'] = '⌥ [[Option key|Opt]]',
valores[#valores+1]=args["value5"]
+
['option'] = '⌥ Option',
valores[#valores+1]=args["value6"]
+
['[[option key|option]]'] = '⌥ [[Option key|Option]]',
valores[#valores+1]=args["value7"]
+
['tab'] = 'Tab ↹',
valores[#valores+1]=args["value8"]
+
['[[tab key|tab]]'] = '[[Tab key|Tab]] ↹',
valores[#valores+1]=args["value9"]
+
['backspace'] = '← Backspace',
if tonumber(args["value"]) then
+
['[[backspace]]'] = '← [[Backspace]]',
return p._main(tostring(args["desc"]), tostring(args["label"]), tonumber(args["duration"]), tonumber(args["stack"]), multi, valores)
+
['win'] = '⊞ Win',
else
+
['[[windows key|win]]'] = '⊞ [[Windows key|Win]]',
return "<big><b>Missing value. Please, define a numerical value to use.</b></big>"
+
['menu'] = '≣ Menu',
end
+
['[[menu key|menu]]'] = '≣ [[Menu key|Menu]]',
end
+
['up'] = '↑',
 +
['[[arrow keys|up]]'] = '[[Arrow keys|↑]]',
 +
['down'] = '↓',
 +
['[[arrow keys|down]]'] = '[[Arrow keys|↓]]',
 +
['left'] = '←',
 +
['[[arrow keys|left]]'] = '[[Arrow keys|←]]',
 +
['right'] = '→',
 +
['[[arrow keys|right]]'] = '[[Arrow keys|→]]',
 +
['asterisk'] = '&#42;',
 +
['hash'] = '&#35;',
 +
['[[#]]'] = '[[Number sign|#]]',
 +
['colon'] = '&#58;',
 +
['[[:]]'] = '[[Colon (punctuation)|:]]',
 +
['pipe'] = '&#124;',
 +
['[[|]]'] = '[[Pipe symbol|&#124;]]',
 +
['semicolon'] = '&#59;',
 +
['[[;]]'] = '[[Semi-colon|&#59;]]',
 +
['equals'] = '&#61;',
 +
 
 +
-- Left & right analog sticks.
 +
['l up'] = 'L↑',
 +
['l down'] = 'L↓',
 +
['l left'] = 'L←',
 +
['l right'] = 'L→',
 +
['l ne'] = 'L↗',
 +
['l se'] = 'L↘',
 +
['l nw'] = 'L↖',
 +
['l sw'] = 'L↙',
 +
 
 +
['r up'] = 'R↑',
 +
['r down'] = 'R↓',
 +
['r left'] = 'R←',
 +
['r right'] = 'R→',
 +
['r ne'] = 'R↗',
 +
['r se'] = 'R↘',
 +
['r nw'] = 'R↖',
 +
['r sw'] = 'R↙',
 +
 
 +
-- PlayStation.
 +
['ex'] = '×',
 +
['circle'] = '○',
 +
['square'] = '□',
 +
['triangle'] = '△',
 +
 
 +
-- Nintendo 64 and GameCube.
 +
['c up'] = 'C↑',
 +
['c down'] = 'C↓',
 +
['c left'] = 'C←',
 +
['c right'] = 'C→',
 +
['c ne'] = 'C↗',
 +
['c se'] = 'C↘',
 +
['c nw'] = 'C↖',
 +
['c sw'] = 'C↙',
 +
}
  
--[[
+
local keyAlias = {
_main function decides the kind of thought this will be and returns the final output
+
-- ['alternate name for key (alias)'] = 'name for key used in key table'
If the are several defines values, then it uses the Thought function
+
['[[cmd key|cmd]]'] = '[[command key|cmd]]',
If only value is defined, then:
+
['[[cmd key|command]]'] = '[[command key|command]]',
- If both stack and the multiplier "multi" are 1, it gives a result early.
+
['[[opt key|opt]]'] = '[[option key|opt]]',
multi defaults to 1 when not defined (or invalid)
+
['[[option key]]'] = '[[option key|option]]',
- Otherwise, it calls the stacks function.
+
['[[opt key|option]]'] = '[[option key|option]]',
]]
+
['[[win key|win]]'] = '[[windows key|win]]',
 +
['*'] = 'asterisk',
 +
['#'] = 'hash',
 +
[':'] = 'colon',
 +
[';'] = 'semicolon',
 +
['l-up'] = 'l up',
 +
['l-down'] = 'l down',
 +
['l-left'] = 'l left',
 +
['l-right'] = 'l right',
 +
['l-ne'] = 'l ne',
 +
['l-se'] = 'l se',
 +
['l-nw'] = 'l nw',
 +
['l-sw'] = 'l sw',
 +
['r-up'] = 'r up',
 +
['r-down'] = 'r down',
 +
['r-left'] = 'r left',
 +
['r-right'] = 'r right',
 +
['r-ne'] = 'r ne',
 +
['r-se'] = 'r se',
 +
['r-nw'] = 'r nw',
 +
['r-sw'] = 'r sw',
 +
['ps x'] = 'ex',
 +
['ps c'] = 'circle',
 +
['ps s'] = 'square',
 +
['ps t'] = 'triangle',
 +
['c-up'] = 'c up',
 +
['c-down'] = 'c down',
 +
['c-left'] = 'c left',
 +
['c-right'] = 'c right',
 +
['c-ne'] = 'c ne',
 +
['c-se'] = 'c se',
 +
['c-nw'] = 'c nw',
 +
['c-sw'] = 'c sw',
 +
}
  
function p._main(desc, label, duration, stack, multi, valores)
+
local Collection = {}
local final_string = duration and {'<abbr title="', desc, '"><i>', (label:gsub("^%l", string.upper)), '</i></abbr> [[mood]] for ', duration, " [[Time|days]]" } or {'<abbr title="', desc, '"><i>', (label:gsub("^%l", string.upper)), '</i></abbr> [[mood]]' }
+
Collection.__index = Collection
-- local final_string = duration and {" [[mood]] for ", duration, " [[Time|days]]" } or {" [[mood]]"}
+
do
-- local middle_string = {'<abbr title="', desc, '"><i>', (label:gsub("^%l", string.upper)), '</i></abbr>' }
+
function Collection:add(item)
-- "valores" is a list of all values given to the function.
+
if item ~= nil then
-- This checks if a second value exist
+
self.n = self.n + 1
if valores[2] then
+
self[self.n] = item
return p.Thought(valores, final_string) --..table.concat(middle_string,"")..table.concat(final_string,"") --..middle_string..final_string
 
else --Only initial value defined
 
if stack==1 and multi==1 then
 
local value = valores[1]
 
if tonumber(value)>0 then
 
return '<b><font color="forestgreen">'..value..'</font></b> '..table.concat(final_string,"")
 
-- return '<b><font color="forestgreen">'..value..'</font></b> '..table.concat(middle_string,"")..table.concat(final_string,"")
 
elseif tonumber(value) == 0 then
 
return '<b>'..value..'</b> '..table.concat(final_string,"")
 
-- return '<b>'..value..'</b> '..table.concat(middle_string,"")..table.concat(final_string,"")
 
else
 
-- return '<b><font color="firebrick">'..value..'</font></b> '..table.concat(middle_string,"")..table.concat(final_string,"")
 
return '<b><font color="firebrick">'..value..'</font></b> '..table.concat(final_string,"")
 
end
 
 
end
 
end
return p.stacks(stack, multi, valores[1])..table.concat(final_string,"")
+
end
-- return p.stacks(stack, multi, valores[1])..table.concat(middle_string,"")..table.concat(final_string,"")
+
function Collection:join(sep)
 +
return table.concat(self, sep)
 +
end
 +
function Collection:sort(comp)
 +
table.sort(self, comp)
 +
end
 +
function Collection.new()
 +
return setmetatable({n = 0}, Collection)
 
end
 
end
 
end
 
end
  
--[[
+
local function keyPress(args)
The "Thought" function returns a string if more than 1 value was defined.
+
local chainNames = {
It iterates through all the values defined (contained on the list "valores")  
+
'chain first',
For each element:
+
'chain second',
1.- If it is a valid number, then it valuates what kind of number it is.
+
'chain third',
1.2.- If it is, it then decides what color it need. Currently, it returns:
+
'chain fourth',
Green for positive, Red for negative, None for 0.
+
'chain fifth',
2.- It it is not a valid number, it returns the value bolded and large. The idea is to make the mistake obvious.
+
'chain sixth',
3.- Once all values are checked, it concatenates all results, with some extras to make sense.
+
'chain seventh',
This last part is what it returns.
+
'chain eighth',
]]
+
'chain ninth',
 
+
}
function p.Thought(valores, final_string)
+
local result = Collection.new()
local valores_buscados={}
+
local chainDefault = args.chain or '+'
for i, j in ipairs(valores) do
+
for i, id in ipairs(args) do
local vx = valores[i]
+
if i > 1 then
local vy = ""
+
result:add(args[chainNames[i - 1]] or chainDefault)
if tonumber(vx) then -- A number.
 
vy = tonumber(vx)<0 and '<b><font color="firebrick">'..vx.."</font></b>" or tonumber(vx)>0 and '<b><font color="forestgreen">'..vx.."</font></b>" or '<b>0</b>'
 
else
 
vy='<big><b>'..vx.."</b></big>" --The idea is to prevent a hard to track error
 
 
end
 
end
valores_buscados[#valores_buscados+1]=vy
+
local lc = id:lower()
 +
local text = keyText[lc] or keyText[keyAlias[lc]] or id
 +
result:add(kbdPrefix .. text .. kbdSuffix)
 
end
 
end
return "<b>"..table.concat(valores_buscados,"<b>/</b>").."</b> "..table.concat(final_string,"")
+
return mw.getCurrentFrame():extensionTag{
 +
name = 'templatestyles', args = { src = 'Template:Key press/styles.css'}
 +
} .. result:join()
 
end
 
end
  
--[[
+
local function keypress(frame)
The "stacks" function return a string for the case that only 1 value was defined.
+
-- Called by "{{key press|...}}".
1.  If a stack value was defined:
+
-- Using the template doubles the post‐expand include size.
1.1 Is stack equal to 1
+
return keyPress(frame:getParent().args)
1.2 Any other case.
+
end
2.  If a stack was not defined, then check the multiplier
 
2.1 If the multiplier is equal or above one
 
2.2 If the multiplier is below 1.
 
 
 
Finally, some final code to decide what color to use.
 
1. Green (forestgreen) for positive.
 
2. None for 0.
 
3. Red (firebrick) for negatives.
 
The retuned value is rounded half-down. (Meaning 0.5 -> 0 )
 
string.format("%.2f", number))
 
To combat that, I add 0.001 to the number calculated. It should be enough.
 
]]
 
 
 
function p.stacks(stack, multi, value)
 
local text=""
 
if stack then
 
if multi == 1 then
 
if stack ~= 1 then
 
text = "Stacking "..stack.." times for a maximum of "..tostring(value*stack)
 
end
 
else
 
text = "Stacking "..stack.." times with a "..multi.." multiplier for maximum of "..string.format("%.2f", value*( 1 - multi^stack)/(1 - multi) + 0.001)
 
end
 
else
 
if multi >= 1 then --I want to avoid the case of really large numbers.
 
text = "Stacking infinitely"
 
else
 
text = "Stacking with a "..multi.." multiplier for maximum of "..string.format("%.2f", value*( 1 - multi^100)/(1 - multi) + 0.001)
 
end
 
end
 
  
if tonumber(value)>0 then
+
local function press(frame)
return '<abbr title="'..text..'"><b><font color="forestgreen">'..value..'</font></b></abbr> '
+
-- Called by "{{#invoke:key|press|...}}".
elseif tonumber(value) == 0 then
+
return keyPress(frame.args)
return '<abbr title="'..text..'"><b>'..value..'</b></abbr> '
 
else
 
return '<abbr title="'..text..'"><b><font color="firebrick">'..value..'</font></b></abbr> '
 
end
 
 
end
 
end
  
--This last part outputs the actual result. W/O it, it gives an error.
+
return {
return p
+
keypress = keypress,
 +
press = press,
 +
}

Revision as of 18:07, 21 August 2024

Welcome to the RimWorld Wiki sandbox!
This sandbox is where you can experiment and practice working on a wiki page. This page will usually have little or no content. Feel free to add content or to make changes and save them to see the results.

To learn about editing and formatting start here: Help:Contents. Just start with the basics... enter some text, and learn the other pieces as you go.

Your content contributions are welcome and important. The wiki is a collaborative effort and others can help with formatting and other improvements.]

Best wishes!

Description

This is a doc attached to my sandbox. I'll use it to see the effects of my changes W/o messing something important

NOTE: LUA is usually slower than ParserFunctions for short statements. The factor varies from 7-1 to 2-1.
Lua only is an advantage to long statements, nested logic, loops (maybe others case i don't see right now).

expr only uses 1 Preprocessor visited node count, in general. Variables may change that.


function p._TableRow(skillBase, skillBonus, statMin, statMax, capImportance, capLimit, resultCols, LV, Ln)



-- This module implements {{key press}}.

local kbdPrefix = '<kbd class="keyboard-key nowrap">'

local kbdSuffix = '</kbd>'

local keyText = {
	['caps lock'] = '⇪ Caps Lock',
	['[[caps lock]]'] = '⇪ [[Caps Lock]]',
	['shift'] = '⇧ Shift',
	['[[shift key|shift]]'] = '⇧ [[Shift key|Shift]]',
	['enter'] = '↵ Enter',
	['[[enter key|enter]]'] = '↵ [[Enter key|Enter]]',
	['cmd'] = '⌘ Cmd',
	['[[command key|cmd]]'] = '⌘ [[Command key|Cmd]]',
	['command'] = '⌘ Command',
	['[[command key|command]]'] = '⌘ [[Command key|Command]]',
	['opt'] = '⌥ Opt',
	['[[option key|opt]]'] = '⌥ [[Option key|Opt]]',
	['option'] = '⌥ Option',
	['[[option key|option]]'] = '⌥ [[Option key|Option]]',
	['tab'] = 'Tab ↹',
	['[[tab key|tab]]'] = '[[Tab key|Tab]] ↹',
	['backspace'] = '← Backspace',
	['[[backspace]]'] = '← [[Backspace]]',
	['win'] = '⊞ Win',
	['[[windows key|win]]'] = '⊞ [[Windows key|Win]]',
	['menu'] = '≣ Menu',
	['[[menu key|menu]]'] = '≣ [[Menu key|Menu]]',
	['up'] = '↑',
	['[[arrow keys|up]]'] = '[[Arrow keys|↑]]',
	['down'] = '↓',
	['[[arrow keys|down]]'] = '[[Arrow keys|↓]]',
	['left'] = '←',
	['[[arrow keys|left]]'] = '[[Arrow keys|←]]',
	['right'] = '→',
	['[[arrow keys|right]]'] = '[[Arrow keys|→]]',
	['asterisk'] = '&#42;',
	['hash'] = '&#35;',
	['[[#]]'] = '[[Number sign|#]]',
	['colon'] = '&#58;',
	['[[:]]'] = '[[Colon (punctuation)|:]]',
	['pipe'] = '&#124;',
	['[[|]]'] = '[[Pipe symbol|&#124;]]',
	['semicolon'] = '&#59;',
	['[[;]]'] = '[[Semi-colon|&#59;]]',
	['equals'] = '&#61;',

	-- Left & right analog sticks.
	['l up'] = 'L↑',
	['l down'] = 'L↓',
	['l left'] = 'L←',
	['l right'] = 'L→',
	['l ne'] = 'L↗',
	['l se'] = 'L↘',
	['l nw'] = 'L↖',
	['l sw'] = 'L↙',

	['r up'] = 'R↑',
	['r down'] = 'R↓',
	['r left'] = 'R←',
	['r right'] = 'R→',
	['r ne'] = 'R↗',
	['r se'] = 'R↘',
	['r nw'] = 'R↖',
	['r sw'] = 'R↙',

	-- PlayStation.
	['ex'] = '×',
	['circle'] = '○',
	['square'] = '□',
	['triangle'] = '△',

	-- Nintendo 64 and GameCube.
	['c up'] = 'C↑',
	['c down'] = 'C↓',
	['c left'] = 'C←',
	['c right'] = 'C→',
	['c ne'] = 'C↗',
	['c se'] = 'C↘',
	['c nw'] = 'C↖',
	['c sw'] = 'C↙',
}

local keyAlias = {
	-- ['alternate name for key (alias)'] = 'name for key used in key table'
	['[[cmd key|cmd]]'] = '[[command key|cmd]]',
	['[[cmd key|command]]'] = '[[command key|command]]',
	['[[opt key|opt]]'] = '[[option key|opt]]',
	['[[option key]]'] = '[[option key|option]]',
	['[[opt key|option]]'] = '[[option key|option]]',
	['[[win key|win]]'] = '[[windows key|win]]',
	['*'] = 'asterisk',
	['#'] = 'hash',
	[':'] = 'colon',
	[';'] = 'semicolon',
	['l-up'] = 'l up',
	['l-down'] = 'l down',
	['l-left'] = 'l left',
	['l-right'] = 'l right',
	['l-ne'] = 'l ne',
	['l-se'] = 'l se',
	['l-nw'] = 'l nw',
	['l-sw'] = 'l sw',
	['r-up'] = 'r up',
	['r-down'] = 'r down',
	['r-left'] = 'r left',
	['r-right'] = 'r right',
	['r-ne'] = 'r ne',
	['r-se'] = 'r se',
	['r-nw'] = 'r nw',
	['r-sw'] = 'r sw',
	['ps x'] = 'ex',
	['ps c'] = 'circle',
	['ps s'] = 'square',
	['ps t'] = 'triangle',
	['c-up'] = 'c up',
	['c-down'] = 'c down',
	['c-left'] = 'c left',
	['c-right'] = 'c right',
	['c-ne'] = 'c ne',
	['c-se'] = 'c se',
	['c-nw'] = 'c nw',
	['c-sw'] = 'c sw',
}

local Collection = {}
Collection.__index = Collection
do
	function Collection:add(item)
		if item ~= nil then
			self.n = self.n + 1
			self[self.n] = item
		end
	end
	function Collection:join(sep)
		return table.concat(self, sep)
	end
	function Collection:sort(comp)
		table.sort(self, comp)
	end
	function Collection.new()
		return setmetatable({n = 0}, Collection)
	end
end

local function keyPress(args)
	local chainNames = {
		'chain first',
		'chain second',
		'chain third',
		'chain fourth',
		'chain fifth',
		'chain sixth',
		'chain seventh',
		'chain eighth',
		'chain ninth',
	}
	local result = Collection.new()
	local chainDefault = args.chain or '+'
	for i, id in ipairs(args) do
		if i > 1 then
			result:add(args[chainNames[i - 1]] or chainDefault)
		end
		local lc = id:lower()
		local text = keyText[lc] or keyText[keyAlias[lc]] or id
		result:add(kbdPrefix .. text .. kbdSuffix)
	end
	return mw.getCurrentFrame():extensionTag{
		name = 'templatestyles', args = { src = 'Template:Key press/styles.css'} 
	} .. result:join()
end

local function keypress(frame)
	-- Called by "{{key press|...}}".
	-- Using the template doubles the post‐expand include size.
	return keyPress(frame:getParent().args)
end

local function press(frame)
	-- Called by "{{#invoke:key|press|...}}".
	return keyPress(frame.args)
end

return {
	keypress = keypress,
	press = press,
}