This module needs documentation.
Please document this module by describing its purpose and usage on the documentation page.

local m_links_templates = require("Module:links/templates")
local com = require("Module:he-common")

local export = {}

function export.term(frame)
	local args = {}

	for key, val in pairs(frame:getParent().args) do
		args[key] = val
	end

	if args["wv"] == "" then args["wv"] = nil end
	if args["dwv"] == "" then args["dwv"] = nil end

	if args[2] == nil or args[2] == "" then
		local form, formwv, formdwv = com.process_wv_triad(args[1] or "", args["wv"], args["dwv"])
		args[1] = form or ""
		if formdwv then
			args[2] = (formwv or form) .. " / " .. formdwv
		else
			args[2] = (formwv or form)
		end
	end

	args["wv"] = nil
	args["dwv"] = nil

	-- table.insert(args, 1, "he")
	-- shift manually to avoid strange bugs:
	args[4] = args[3]
	args[3] = args[2]
	args[2] = args[1]
	args[1] = "he"
	
	if args[3] and args[2]:find("[[", 1, true) then
		-- args[2] (term) contains wikilinks, so args[3] (alt) will be ignored
		-- by [[Module:links]] and will cause a tracking template to be
		-- transcluded.
		args[3] = nil
		-- [[Special:WhatLinksHere/Wiktionary:Tracking/he-links/alt removed]]
		require("Module:debug").track("he-links/alt removed")
	end

	-- Passthrough arguments after modification
	local frame2 = frame:newChild{title = frame:getParent():getTitle(), args = args}:newChild{title = frame:getTitle(), args = frame.args}

	return m_links_templates.l_term_t(frame2)
end

function export.strongs_list(frame)
	local text = frame.args[1]
	local translit_module = frame.args.module
	local translit_function = frame.args.func
	local transliterate
	if translit_module and translit_function then
		transliterate = require("Module:" .. translit_module)[translit_function]
	elseif (translit_module ~= nil) ~= (translit_function ~= nil) then
		error("Supply both |module= and |func= or neither")
	end
	local entry_name = require "Module:languages/data/2".he.entry_name
	local character_set_to_remove = "[" .. entry_name.Hebr.remove_diacritics .. "]"
	local ugsub = mw.ustring.gsub
	
	local function hebrew_link(word)
		return '<span class="Hebr" lang="he">[['
				.. ugsub(word, character_set_to_remove, "")
				.. "#Hebrew|" .. word .. "]]</span>"
	end
	
	local function hebrew_tag(word)
		return '<span class="Hebr" lang="he">' .. word .. "</span>"
	end
	
	local function get_first_letter(word)
		return word:match("^[%z\1-\127\194-\244][\128-\191]*")
	end
	
	return text:gsub(
		"%f[^\n%z]([^\t\n]+)\t([^\t\n]+)\t([^\t\n]+)",
		function(number, word, pos)
			local header = ""
			local letter = get_first_letter(word)
			if letter ~= prev_letter then
				if number ~= "1" then
					header = "</ul>\n\n"
				end
				header = header
					-- unicode-bidi: isolate; forces the Hebrew letter to the left in headers,
					-- but only &lrm; does that in the table of contents.
					.. ('===%s&lrm; &ndash; %04d===\n<ul class="plainlinks" style="column-width: 15em;">\n')
					:format(hebrew_tag(letter), tonumber(number))
				prev_letter = letter
			end
			
			local tr = transliterate and " (''" .. transliterate(word) .. "'')"
				or ""
			
			return header
				.. '<li> [https://www.blueletterbible.org/lexicon/h' .. number .. "/wlc H" .. number
				.. "]: " .. hebrew_link(word) .. tr .. " ''" .. pos:gsub(" ", ", ") .. "''"
				.. (word:find(" ", 1, true) and ("<br>(" .. word:gsub("[^ ]+", hebrew_link) .. ")") or "")
		end) .. "</ul>"
end

return export