Module:Infobox Tools: Difference between revisions

From Looney Pyramid Games Wiki
Content added Content deleted
(First attempt to get the links returned to point to the actual page and not just "Medium" etc.)
(Adding a function to convert setup_time to just a number)
 
(12 intermediate revisions by the same user not shown)
Line 71: Line 71:
output_str = "Fast?"
output_str = "Fast?"
elseif (min_time < 30 and max_time <= 45) then
elseif (min_time < 30 and max_time <= 45) then
output_str = "[[Browse_games/Medium_playing_time|Medium?]]"
output_str = "Medium?"
else
else
output_str = "Long?"
output_str = "Long?"
Line 170: Line 170:
output_str = string.gsub(output_str, "poker chips", "[[poker chips]]");
output_str = string.gsub(output_str, "poker chips", "[[poker chips]]");
return output_str;
end

--Create wiki links from the comma separated list of extra equipment
function str.linkify_equip_list(frame)
local source_str = tostring(frame.args[1]);
local output_str = '';
local temp_str;
--escape pattern characters and remove problem ones
temp_str = str._scrubtext(source_str);
temp_str = string.gsub(temp_str, "%%", "");

--Add a comma to the end of the list so the loop can find every item
temp_str = temp_str .. ',';
--Loop through the list and append link brackets and the value to the output
for w in temp_str:gmatch("(.-),") do
--Remove whitespace from the ends of the strings
local str = string.gsub(w, '^%s*(.-)%s*$', '%1')
output_str = output_str .. '[[Equipment/' .. str .. '|' .. str ..']], '
end
--Remove the extra comma and space that got added at the end
output_str = output_str:sub(1, -3);
return output_str;
return output_str;
end
end
Line 322: Line 346:
return clean_str;
return clean_str;
end

--Take the free-form setup_time field and convert it to a single numeric value
function str.setup_time_to_minutes(frame)
local str = tostring(frame.args[1]);
--Prepend "9999" to the string in case they didn't enter any digits
--This will make it easy to identify games with no digits in the setup_time field
--Appending "zzz" to the end to prevent errors when looking past a digit at the end
str = 9999 .. " " .. str .. "zzz"
num = 0;
--Find the last set of numeric digits in the string
for w in string.gmatch(str, "%d+") do
num = w;
end
--Find the position of the digits we found above
a, b = string.find(str, num)
--Get all of the text after the digits we found
text = string.sub(str, b+1, -1);
--Get the first 3 letters in the text above
units = string.sub(text, string.find(text, "%a%a%a"))
--Check if they likely entered seconds instead of minutes
if string.lower(units) == 'sec' then
--Divide the seconds by 60 and round up
num = math.ceil(num/60)
end
--Return the number of minutes without anything else
return num;
end
end



Latest revision as of 02:05, 23 April 2024

Documentation for this module may be created at Module:Infobox Tools/doc

local str = {}

--Clean wiki text from list game designers and delimt with commas
function str.clean_designer(frame)
    local source_str = tostring(frame.args[1]);
    local output_str;
    
    --escape pattern characters and remove problem ones
    output_str = str._scrubtext(source_str)
    output_str = string.gsub(output_str, "%%", "");
    
    --removes usernames (looks cleaner)
    output_str = string.gsub(output_str, "User:%w+,", "");
    output_str = string.gsub(output_str, "user:%w+,", "");
    
    --remove extra text and delimit two items by a single comma
    output_str = string.gsub(output_str, "Designed", "");
    output_str = string.gsub(output_str, "designed", "");
    output_str = string.gsub(output_str, " by ", "");
    output_str = string.gsub(output_str, " with ", "");
    output_str = string.gsub(output_str, "&", ",");
    output_str = string.gsub(output_str, " and ", ",");
    output_str = string.gsub(output_str, ", ,", ",");
    output_str = string.gsub(output_str, ",,", ",");
    
    
    return output_str;
end

--Clean wiki text from list of description string
function str.clean_description(frame)
    local source_str = tostring(frame.args[1]);
    local output_str;
    
    --escape pattern characters and remove problem ones
    output_str = str._scrubtext(source_str)
    output_str = string.gsub(output_str, "%%", "");
    
    return output_str;
end

--Guess the qualitative game length based on input playing time
function str.guess_length(frame)
	local in_min_str = tostring(frame.args[1]);
	local in_max_str = tostring(frame.args[2]);
	local min_time;
	local max_time;
	local output_str;
	
	--test of numbers, strip text with units from input, and convert to numbers
	first_min_num = string.find(in_min_str, "%d")
    if first_min_num ~= nil then
		in_min_str = string.gsub(in_min_str, "%D", "")
		min_time = tonumber(in_min_str)
	else
		min_time = 1
	end
	
	first_max_num = string.find(in_max_str, "%d")
    if first_max_num ~= nil then
		in_max_str = string.gsub(in_max_str, "%D", "")
		max_time = tonumber(in_max_str)
	else
		max_time = -1
	end
	
	--guess game length based on playing time
	if (max_time < 0 and min_time < 30) then
		output_str = "unknown"
	elseif (min_time < 10 and max_time <= 15) then
		output_str = "Fast?"
	elseif (min_time < 30 and max_time <= 45) then
		output_str = "Medium?"
	else
		output_str = "Long?"
	end
	
	return output_str;
end

--Guess the number of trios per color needed
--NOTE WELL: once all of the game pages are upgraded, this function can be deleted
--"sets" means five-color "Treehouse stashes" of 1 trio each of 5 colors
function str.guess_trios_per_color(frame)
	local in_sets_str = tostring(frame.args[1]);
	local output_str;
	
	--Assumes 5 trios per color unless noted otherwise
	first_sets_alphanum = string.find(in_sets_str, "%w")
    if (first_sets_alphanum ~= nil) then
		output_str = in_sets_str
	else
		output_str = "5"
	end
	
	return output_str;
end

--Guess the number of colors needed
--NOTE WELL: once all of the game pages are upgraded, this function can be deleted
--"stashes" means old-style MONOCHROME stashes of 5 trios in a 1 color
function str.guess_number_of_colors(frame)
	local in_stashes_str = tostring(frame.args[1]);
	local output_str;
	
	--Assumes 5 five colors unless noted otherwise
	first_stashes_alphanum = string.find(in_stashes_str, "%w")
    if (first_stashes_alphanum) ~= nil then
		output_str = in_stashes_str
	else
		output_str = "5"
	end
	
	return output_str;
end

--Clean wiki text from list of other_equip and delimit with commas
function str.clean_equip(frame)
	local source_str = tostring(frame.args[1]);
    local output_str;
    
    --escape pattern characters and remove problem ones
	output_str = str._scrubtext(source_str)
    output_str = string.gsub(output_str, "%%", "");
    
    --delimit two items by a single comma
    output_str = string.gsub(output_str, "&", ",");
    output_str = string.gsub(output_str, " and ", ",");
    output_str = string.gsub(output_str, ", ,", ",");
    output_str = string.gsub(output_str, ",,", ",");
    output_str = string.gsub(output_str, " , ", "");
    
    return output_str;
end

--Create wiki links to common extra equipment
--note: this only works for certain standardized component names (NEEDS UPDATING)
--WARNING! This might run slowly!
function str.linkify_equip(frame)
	local source_str = tostring(frame.args[1]);
    local output_str;
    
    --escape pattern characters and remove problem ones
	output_str = str._scrubtext(source_str)
    output_str = string.gsub(output_str, "%%", "");
    
    --create links
    output_str = string.gsub(output_str, "Chessboard", "[[Chessboard]]");
    output_str = string.gsub(output_str, "chessboard", "[[Chessboard]]");
    output_str = string.gsub(output_str, "Volcano board", "[[Volcano board]]");
    output_str = string.gsub(output_str, "Martian Coaster", "[[Martian Coaster board|Martian Coaster]]");
    output_str = string.gsub(output_str, "Wheel board", "[[Wheel board]]");
    output_str = string.gsub(output_str, "Stash pad", "[[Stash pad]]");
    
    output_str = string.gsub(output_str, "Piecepack", "[[Piecepack]]");
    
    output_str = string.gsub(output_str, "Playing cards", "[[Playing cards]]");
    output_str = string.gsub(output_str, "playing cards", "[[playing cards]]");
    output_str = string.gsub(output_str, "Zark City", "[[Zark City deck|Zark City]]");
    
    output_str = string.gsub(output_str, "Dice", "[[Dice|Dice]]");
    output_str = string.gsub(output_str, "dice", "[[Dice|dice]]");
    output_str = string.gsub(output_str, "Die", "[[Dice|Die]]");
    output_str = string.gsub(output_str, "die", "[[Dice|die]]");
    
    output_str = string.gsub(output_str, "bag", "[[Opaque bag|bag]]");
    output_str = string.gsub(output_str, "tokens", "[[Marking_stone|tokens]]");
    output_str = string.gsub(output_str, "stones", "[[Marking_stone|stones]]");
    output_str = string.gsub(output_str, "Poker chips", "[[Poker chips]]");
    output_str = string.gsub(output_str, "poker chips", "[[poker chips]]");
    	
    return output_str;
end

--Create wiki links from the comma separated list of extra equipment
function str.linkify_equip_list(frame)
	local source_str = tostring(frame.args[1]);
    local output_str = '';
    local temp_str;
    
    --escape pattern characters and remove problem ones
	temp_str = str._scrubtext(source_str);
    temp_str = string.gsub(temp_str, "%%", "");

    --Add a comma to the end of the list so the loop can find every item
    temp_str = temp_str .. ',';
    --Loop through the list and append link brackets and the value to the output
    for w in temp_str:gmatch("(.-),") do 
    	--Remove whitespace from the ends of the strings
    	local str = string.gsub(w, '^%s*(.-)%s*$', '%1')
    	output_str = output_str .. '[[Equipment/' .. str .. '|' .. str ..']], ' 
    end
    --Remove the extra comma and space that got added at the end
    output_str = output_str:sub(1, -3);
    
    return output_str;
end

--Clean and concat list of game mechanics
function str.clean_mechs(frame)
	local game_m = tostring(frame.args[1]) or "";
	local old_prime_m = tostring(frame.args[2]) or "";
	local old_add_m = tostring(frame.args[3]) or "";
    local merged_str = " ";
    local output_str;
    local any_vals_inputted = 0;
    
    --merging the list together in (hopefuly) a smart way
    first_game_alphanum = string.find(game_m, "%w")
    if first_game_alphanum ~= nil then
    	merged_str = game_m
    	any_vals_inputted = 1
    end
    
    first_old_prime_alphanum = string.find(old_prime_m, "%w")
    if (any_vals_inputted > 0 and first_old_prime_alphanum ~= nil) then
    	merged_str = merged_str..","..old_prime_m
    elseif first_old_prime_alphanum ~= nil then
    	merged_str = old_prime_m
    	any_vals_inputted = 1
    end

    first_old_add_alphanum = string.find(old_add_m, "%w")
    if (any_vals_inputted > 0 and first_old_add_alphanum ~= nil) then
    	merged_str = merged_str..","..old_add_m
    elseif first_old_add_alphanum ~= nil then
    	merged_str = old_add_m
    	any_vals_inputted = 1
    end
    
    if any_vals_inputted > 0 then
	    --escape pattern characters and remove problem ones
	    output_str = str._scrubtext(merged_str)
	    output_str = string.gsub(output_str, "%%", "");
	    
	    --remove extra text (if empty or the user tried to link pages themselves)
	    output_str = string.gsub(output_str, "Category:", "");
	    output_str = string.gsub(output_str, ", ,", ",");
	    output_str = string.gsub(output_str, ",,", ",");
	    output_str = string.gsub(output_str, " , ", ", ");
	    output_str = string.gsub(output_str, " , ", "");
    else
    	output_str = 'unknown';
	end
    
    return output_str;
end

--Concat and create internal wiki links for a list of game mechanics
function str.linkify_mechs(frame)
	local game_m = tostring(frame.args[1]) or "";
	local old_prime_m = tostring(frame.args[2]) or "";
	local old_add_m = tostring(frame.args[3]) or "";
    local merged_str = " ";
    local output_str;
    local any_vals_inputted = 0;
    
    --merging the list together in (hopefuly) a smart way
    first_game_alphanum = string.find(game_m, "%w")
    if first_game_alphanum ~= nil then
    	merged_str = game_m
    	any_vals_inputted = 1
    end
    
    first_old_prime_alphanum = string.find(old_prime_m, "%w")
    if (any_vals_inputted > 0 and first_old_prime_alphanum ~= nil) then
    	merged_str = merged_str..","..old_prime_m
    elseif first_old_prime_alphanum ~= nil then
    	merged_str = old_prime_m
    	any_vals_inputted = 1
    end

    first_old_add_alphanum = string.find(old_add_m, "%w")
    if (any_vals_inputted > 0 and first_old_add_alphanum ~= nil) then
    	merged_str = merged_str..","..old_add_m
    elseif first_old_add_alphanum ~= nil then
    	merged_str = old_add_m
    	any_vals_inputted = 1
    end
    
    if any_vals_inputted > 0 then
	    --escape pattern characters and remove problem ones
	    output_str = str._scrubtext(merged_str)
	    output_str = string.gsub(output_str, "%%", "");
	    
	    --remove extra text (in case the user tried to link pages themselves)
	    output_str = string.gsub(output_str, "Category:", "");
	    output_str = string.gsub(output_str, ", ,", ",");
	    output_str = string.gsub(output_str, ",,", ",");
	   	output_str = string.gsub(output_str, " , ", ", ");
	    output_str = string.gsub(output_str, " , ", "");
	    
	    --expand commas and create links (in theory)
	    output_str = string.gsub(output_str, ",", "]], [[");
	    output_str = "[["..output_str.."]]";
    else
    	output_str = ""
	end
    	
    return output_str;
end

--Clean wiki text from theme
function str.clean_theme(frame)
    local source_str = tostring(frame.args[1]);
    local output_str;
    
    --escape pattern characters and remove problem ones
    output_str = str._scrubtext(source_str)
    output_str = string.gsub(output_str, "%%", "");
    
    return output_str;
end

--Clean wiki text from BGG_link
function str.clean_url(frame)
	--NOTE: this function does not seem to work as expected. Use the {{clean_URL}} template instead.
    local source_str = tostring(frame.args[1]);
    local output_str;
    
    --escape pattern characters and remove problem ones
	output_str = str._scrubtext(source_str)
	output_str = string.gsub(output_str, ",", " ");
    
    --cut off link text
    end_index = string.find(output_str, "%s+", 10)
    if end_index then
    	output_str = string.sub(output_str, 1, end_index)
    end
 
    --put back certain escaped charaters that might haave been part of the URL   
    output_str = string.gsub(output_str, "%+", "+");
    output_str = string.gsub(output_str, "%-", "-");
    output_str = string.gsub(output_str, "%.", ".");
    output_str = string.gsub(output_str, "%%", "%");

    return output_str;
end

--Helper function that escapes pattern characters and cleans out wiki markup
function str._scrubtext(str_with_wikitext)
	clean_str = string.gsub(str_with_wikitext, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1");
    clean_str = string.gsub(clean_str, "|", ",");
    clean_str = string.gsub(clean_str, "%[", "");
    clean_str = string.gsub(clean_str, "%]", "");
    
    return clean_str;
end

--Take the free-form setup_time field and convert it to a single numeric value
function str.setup_time_to_minutes(frame)
	local str = tostring(frame.args[1]);
    --Prepend "9999" to the string in case they didn't enter any digits
    --This will make it easy to identify games with no digits in the setup_time field
    --Appending "zzz" to the end to prevent errors when looking past a digit at the end
    str = 9999 .. " " .. str .. "zzz"
    num = 0;
    --Find the last set of numeric digits in the string
    for w in string.gmatch(str, "%d+") do
      num = w;
    end
    --Find the position of the digits we found above
    a, b = string.find(str, num)
    --Get all of the text after the digits we found
    text = string.sub(str, b+1, -1);
    --Get the first 3 letters in the text above
    units = string.sub(text, string.find(text, "%a%a%a"))
    --Check if they likely entered seconds instead of minutes
    if string.lower(units) == 'sec' then
      --Divide the seconds by 60 and round up
      num = math.ceil(num/60)
    end
    --Return the number of minutes without anything else
    return num;
end

return str