Для документации этого модуля может быть создана страница Модуль:Алфавит/Документация

-- модуль для формирования блока алфавита для индексов

-- загрузка модуля данных с таблицей языков
local languages = mw.loadData("Module:language/data");
local p = {};

function p.generate_alphabet_first_links(frame)
	local code = frame.args['lang']
	local reversed = frame.args['reversed']
	local data = languages[code]
	local result = ''
	if data['alphabet'] then
		alphabet = data['alphabet']
		if reversed ~= '' then
			alphabet = mw.ustring.lower(alphabet)
		end
		letters = string.gmatch(alphabet, '([^ ]+)')
		for letter in letters do
			if reversed ~= '' then
				letter = '-' .. letter  -- добавить дефис перед буквой
			end
			-- нам нужна такая строка: "[[../A|A]] • ":
			result = result .. "[[../" .. letter .. "|" .. letter .. "]] • "
			
		end
	end
	return result
end

function get_array(iterator)
	local items = {}
	local i = 1
	for item in iterator do
		items[i] = item
		i = i + 1
	end
	return items
end

function p.generate_alphabet_other_links(frame)
	local items = frame.args['items']
	local reversed = frame.args['reversed']
	local result = ''
	items = string.gmatch(items, '([^,]+)')
	for item in items do
		-- "[[../X#xx|xx]] · " - если содержит символ '#'
		-- "[[#xx|xx]]↓ · " - если все буквы маленькие
		-- "[[../Xx|xx]] · " - если начинается с большой буквы
		pos = string.find(item, '#')
		if reversed ~= '' then
			if pos ~= nil then
				parts_iterator = string.gmatch(item, '([^#]+)')  -- пытаемся делить по '#'
				parts = get_array(parts_iterator)
				result = result .. "[[../" .. parts[1] .. "#-" .. parts[2] .. "|-" .. parts[2] .. "]] · "
			elseif string.byte(item) ~= string.byte("-") then
				result = result .. "[[#-" .. item .. "|-" .. item .. "]]↓ · "
			else
				result = result .. "[[../" .. item .. "|" .. item .. "]] · "
			end
		else
			if pos ~= nil then
				parts_iterator = string.gmatch(item, '([^#]+)')  -- пытаемся делить по '#'
				parts = get_array(parts_iterator)
				result = result .. "[[../" .. parts[1] .. "#" .. parts[2] .. "|" .. parts[2] .. "]] · "
			elseif mw.ustring.lower(item) == item then
				result = result .. "[[#" .. item .. "|" .. item .. "]]↓ · "
			else
				result = result .. "[[../" .. item .. "|" .. mw.ustring.lower(item) .. "]] · "
			end
		end
	end
	if result ~= '' then
		result = result:sub(1,#result-3)  -- убираем последнюю "·" из результата
	end
	return result
end

return p