বিষয়বস্তুতে চলুন

মডিউল:R:Bailly

উইকিঅভিধান, মুক্ত অভিধান থেকে

এই মডিউলের জন্য মডিউল:R:Bailly/নথি-এ নথিপত্র তৈরি করা হয়ে থাকতে পারে

local export = {}

local grc_accent_module = "Module:grc-accent"
local languages_module = "Module:languages"
local load_module = "Module:load"
local string_compare_module = "Module:string/compare"
local string_utilities_module = "Module:string utilities"

local require = require
local type = type

local function load_data(...)
	load_data = require(load_module).load_data
	return load_data(...)
end

local function string_compare(...)
	string_compare =  require(string_compare_module)
	return string_compare(...)
end

local function strip_accent(...)
	strip_accent = require(grc_accent_module).strip_accent
	return strip_accent(...)
end

local function ulower(...)
	ulower = require(string_utilities_module).lower
	return ulower(...)
end

local lang
local function get_lang(...)
	lang, get_lang = require(languages_module).getByCode("grc"), nil
	return lang
end

function export.create(frame)
	local args = require("Module:parameters").process(frame:getParent().args, {
		[1] = true,
		["w"] = {alias_of = 1},
	})

	local logos = args[1] or load_data("Module:headword/data").pagename
	if (lang or get_lang()):findBestScript(logos):getCode() ~= "Polyt" then
		return ""
	end
	
	local headwords = load_data("Module:R:Bailly/data")
	local x = strip_accent(logos)
	local x_sortkey = lang:makeSortKey(x)
	local is_lower = x == ulower(x)
	local l, h = 1, headwords.n
	while l < h do
		local m = (l + h) / 2
		m = m + m % 1
		local hw, dir, init_m = headwords[m], 1, m
		-- If the table has false (i.e. a page which no entries begin on), find
		-- one that does.
		while not hw do
			m = m + dir
			hw = headwords[m]
			if hw == nil then
				m, dir = init_m, -dir
			end
		end
		-- If there's a direct match, use it.
		if x == hw then
			l = m
			break
		-- If it's a table, and there's an exact match, return page. This is
		-- used to specify the start page for multipage entries, as most aren't
		-- the first entry on the page they begin.
		elseif type(hw) == "table" then
			local hw_page = hw[2]
			hw = hw[1]
			if x == hw then
				l = hw_page
				break
			end
		end
		-- If `x` is lower, the upper bound is the previous page; if higher, the
		-- lower bound is this page.
		local hw_sortkey = lang:makeSortKey(hw)
		if (
			x_sortkey == hw_sortkey and is_lower and hw ~= ulower(hw) or
			string_compare(x_sortkey, hw_sortkey)
		) then
			h = m - 1
			-- If the previous page has no headword, iterate backwards until one
			-- is found.
			while headwords[h] == false do
				h = h - 1
			end
		else
			l = m
		end
	end
	
	if headwords[l] ~= x then
		while headwords[l + 1] == false do
			l = l + 1
		end
	end
	local page = l == 1 and "" or ("page/n%d/"):format(l - 1)
	return ('[https://archive.org/details/BaillyDictionnaireGrecFrancais/%smode/1up <span class="Polyt" lang="grc">%s</span>] in '):format(
		page, logos
	)
end

return export