Module:Infobox Tools

From Looney Pyramid Games Wiki

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