Module:Step vis: Difference between revisions

From Xenharmonic Wiki
Jump to navigation Jump to search
ArrowHead294 (talk | contribs)
mNo edit summary
ArrowHead294 (talk | contribs)
mNo edit summary
Line 25: Line 25:
local current_step_vis = ""
local current_step_vis = ""
local current_step_size = step_pattern[i]
local current_step_size = step_pattern[i]
local next_step_size = (i < #step_pattern and step_pattern[i + 1] or -1)
if i == 1 then
if i == 1 then
-- Start of string
current_step_vis = (current_step_size == 0 and double_border_left or left_border .. string.rep(no_border, current_step_size - 1))
current_step_vis = (current_step_size == 0 and double_border_left or left_border .. string.rep(no_border, current_step_size - 1))
elseif i == #step_pattern then
elseif i == #step_pattern then
-- End of string
if current_step_size == 0 then
if current_step_size == 0 then
-- If the last step size is 0, the last character will be a double right border
if (previous_step_size == 0) then
if (previous_step_size == 0) then
--[[
- If the second-to-last and last step sizes are both 0, remove the double centre border at the end
- The beginning of a string is index 1 in the first argument of string.sub
- The end of the string is index -1 in the second argument of string.sub, and an ampersand version
  of a 4-digit code point is 8 characters long, so removing the last box-drawing character means
  removing the last 8 characters representing it, between indices -1 and -9
]]--
step_visualization = string.sub(step_visualization, 1, -9)
step_visualization = string.sub(step_visualization, 1, -9)
end
end
current_step_vis = double_border_right
current_step_vis = double_border_right
else
else
-- If the last step size is not 0
current_step_vis = (previous_step_size == 0 and "" or single_border) .. string.rep(no_border, current_step_size - 1) .. right_border
current_step_vis = (previous_step_size == 0 and "" or single_border) .. string.rep(no_border, current_step_size - 1) .. right_border
end
end
else
else
-- Steps in between
if current_step_size == 0 and previous_step_size ~= 0 then
if current_step_size == 0 and previous_step_size ~= 0 then
-- Zero-size steps that are not first or last
current_step_vis = double_border
current_step_vis = double_border
elseif step_pattern[i - 1] == 0 then
else
-- Other non-zero step sizes
if step_pattern[i - 1] ~= 0 then
current_step_vis = current_step_vis .. single_border
end
current_step_vis = string.rep(no_border, current_step_size - 1)
current_step_vis = string.rep(no_border, current_step_size - 1)
else
current_step_vis = single_border .. string.rep(no_border, current_step_size - 1)
end
end
end
end

Revision as of 12:15, 28 February 2025

Module documentation[view] [edit] [history] [purge]
This module may be invoked by templates using its corresponding template Template:Step vis, or used directly from other modules.

Generates a visual representation of a scale based on predefined step sizes.

Introspection summary for Module:Step vis 
Functions provided (2)
Line Function Params
6 step_pattern_to_visualization (step_pattern)
72 step_vis_frame (invokable) (frame)
Lua modules required (1)
Variable Module Functions used
tip Module:Template input parse parse_numeric_entries

No function descriptions were provided. The Lua code may have further information.


local tip = require("Module:Template input parse")
local p = {}

-- Helper function
-- Create a step visualization that's based on the table on the diasem page
function p.step_pattern_to_visualization(step_pattern)
	local step_pattern = step_pattern or { 5, 2, 5, 0, 5, 2, 0 }
	
	local left_border = "&#x251C;"				-- U+251C ├
	local right_border = "&#x2524;"				-- U+2524 ┤
	local no_border = "&#x2500;"				-- U+2500 ─
	local double_border = "&#x256B;"			-- U+256B ╫
	local double_border_left = "&#x255F;"		-- U+255F ╟
	local double_border_right = "&#x2562;"		-- U+2562 ╢
	local single_border = "&#x253C;"			-- U+253C ┼
	
	local step_visualization = ""
	local previous_step_size = 0
	
	-- For each step size of k, print a single border, followed by k-1 no-border symbols
	-- If this is the first step, print the left border instead
	-- If the step size is 0, print a double border only; if this happens, the next step should start with a border character
	-- If this is the last step, add a right border after the entire sequence
	for i = 1, #step_pattern do
		local current_step_vis = ""
		local current_step_size = step_pattern[i]
		
		if i == 1 then
			-- Start of string
			current_step_vis = (current_step_size == 0 and double_border_left or left_border .. string.rep(no_border, current_step_size - 1))
		elseif i == #step_pattern then
			-- End of string
			if current_step_size == 0 then
				-- If the last step size is 0, the last character will be a double right border
				if (previous_step_size == 0) then
					--[[
					- If the second-to-last and last step sizes are both 0, remove the double centre border at the end
					- The beginning of a string is index 1 in the first argument of string.sub
					- The end of the string is index -1 in the second argument of string.sub, and an ampersand version
					  of a 4-digit code point is 8 characters long, so removing the last box-drawing character means
					  removing the last 8 characters representing it, between indices -1 and -9
					]]--
					step_visualization = string.sub(step_visualization, 1, -9)
				end
				current_step_vis = double_border_right
			else
				-- If the last step size is not 0
				current_step_vis = (previous_step_size == 0 and "" or single_border) .. string.rep(no_border, current_step_size - 1) .. right_border
			end
		else
			-- Steps in between
			if current_step_size == 0 and previous_step_size ~= 0 then
				-- Zero-size steps that are not first or last
				current_step_vis = double_border
			else
				-- Other non-zero step sizes
				if step_pattern[i - 1] ~= 0 then
					current_step_vis = current_step_vis .. single_border
				end
				current_step_vis = string.rep(no_border, current_step_size - 1)
			end
		end
		
		step_visualization = step_visualization .. current_step_vis
		previous_step_size = current_step_size
	end
	
	return step_visualization
end

-- Wrapper function for step visualization
function p.step_vis_frame(frame)
	local step_pattern = tip.parse_numeric_entries(frame.args["Step Pattern"], " ")
	return p.step_pattern_to_visualization(step_pattern)
end

return p