Module:R:he:HWSSRoot

local p = {}

local list = require("Module:R:he:HWSSRoot/data")

local hebrew_letters = { ["א"] = "ʾ", ["ב"] = "B", ["ג"] = "G", ["ד"] = "D", ["ה"] = "H", ["ו"] = "W", ["ז"] = "Z", ["ח"] = "X", ["ט"] = "7", ["י"] = "Y", ["[כך]"] = "K", ["ל"] = "L", ["[מם]"] = "M", ["[נן]"] = "N", ["ס"] = "S", ["ע"] = "&", ["[פף]"] = "P", ["[ץצ]"] = "C", ["ק"] = "Q", ["ר"] = "R", ["ש"] = "ʃ", ["ת"] = "T", }

local function cleanup(value) return value:gsub("/.", ""):gsub("%(.*", ""):gsub("[VH]$", ""):gsub("[VH] ", " "):gsub("(.)%1$","%1"):gsub("(.)%1 ","%1 ") end

function p.hebrew_to_normalized_latin(term) local normalized = term:gsub("שׁ" ,"ש"):gsub("שׂ", "ש"):gsub("־", "") for k, v in pairs(hebrew_letters) do		normalized = mw.ustring.gsub(normalized, k, v)	end return cleanup(normalized) end

function p.latin_to_hebrew_for_sorting(term) local normalized = term for k, v in pairs(hebrew_letters) do		if mw.ustring.find(k, "%[") then normalized = mw.ustring.gsub(normalized, v, mw.ustring.sub(k, 2, 2)) else normalized = mw.ustring.gsub(normalized, v, k)		end end return normalized end

function p.simple_latin(frame) return hebrew_to_normalized_latin(frame.args[1]) end

function p.page_number(frame) local value = p.hebrew_to_normalized_latin(frame.args[1]) value = p.latin_to_hebrew_for_sorting(value) local low = 1 local high = #list local mid = 0 while high - low > 1 do       mid = math.floor((low+high)/2) local midval = p.latin_to_hebrew_for_sorting(cleanup(list[mid])) if midval == value then return 78 + mid elseif midval < value then low = mid elseif midval > value then high = mid - 1 end end

if p.latin_to_hebrew_for_sorting(list[high]) <= value then return 78 + high else return 78 + low end end

return p