Модуль:MathWorld (Bk;rl,&MathWorld)

Перейти к навигации Перейти к поиску
Документация
-- сообщения об ошибке

function err(s)
	return "<span style=\"color:red\">" .. s .. "</span>"
end

function errParamNotSpecified(name)
	return err("не указан параметр <code>|" .. name .. " = </code>")
end

-- Обеспечивает наличие в конце строки хотя бы одной точки.
function EnsureDot(s)
	return mw.ustring.gsub(s, "([^%.])$", "%1.")
end

-- Удаляет из строки последнюю точку, если она есть.
function RemoveDot(s)
	return mw.ustring.gsub(s, "%.$", "")
end

-- Курсив
function Italic(s)
	return "''" .. s .. "''"
end

--[[
почти не оформленная ссылка на MathWorld по известным:
  path        Часть URL, начиная с '/'
  title       Отображаемый заголовок
]]
function RawMWLink(frame, path, title)
	local ref_en = frame:expandTemplate({title = "ref-en"})
	return "[https://mathworld.wolfram.com" .. path .. " " .. title .. "]" .. ref_en
end

--[[
готовая к отображению ссылка на entry по известным:
  urlname     "RubiksCube" для ссылки "https://mathworld.wolfram.com/RubiksCube.html"
  title       Заголовок для отображения ("Rubik's Cube" в предыдущем примере)
  author      Автор entry (часто, но не всегда, "Weisstein, Eric W.")
]]
function MWEntryByAuthorTitleUrlname(frame, author, title, urlname)
	local path = "/" .. urlname .. ".html"
	local link = RawMWLink(frame, path, title)
	local tail = " на сайте Wolfram [[MathWorld]]."
	return Italic(EnsureDot(author)) .. " " .. link .. tail
end

--[[ exported functions ]]

local p = {}

-- реализация шаблона {{MathWorld}}
function p.MathWorld(_frame)
	-- прямой доступ к параметрам вызывающего шаблона
	local frame = _frame:getParent()
	-- urlname
	local urlname = frame.args[1] or frame.args["urlname"] or frame.args["id"]
	if urlname == nil then
		return errParamNotSpecified("urlname")
	end
	-- title
	local title = frame.args[2] or frame.args["title"]
	if title == nil then
		return errParamNotSpecified("title")
	end
	-- author
	local author = frame.args["author"] or "Weisstein, Eric W"
	-- оформить ссылку
	return MWEntryByAuthorTitleUrlname(frame, author, title, urlname)
end

-- реализация шаблона {{MathWorld3}}
function p.MathWorld3(_frame)
	local function UrlnameFromTitle(title)
		local replacements = {
			{"[ ']", ""},
			{"[áâ]", "a"},
			{"é", "e"},
			{"ö", "oe"}
		}
		local s = title
		for i, r in ipairs(replacements) do
			s = mw.ustring.gsub(s, r[1], r[2])
		end
		return s
	end
	local frame = _frame:getParent()
	-- title, urlname
	local title
	local urlname
	if frame.args[1] and frame.args[2] then
		-- порядок как в {{MathWorld}}
		urlname, title = frame.args[1], frame.args[2]
	else
		title = frame.args[1]
		if title == nil then
			return err("не указан заголовок (пример: <code>" ..
				mw.text.nowiki("{{MathWorld3|Rubik's Cube}}") ..
				"</code>)")
		end
		urlname = UrlnameFromTitle(title)
	end
	-- author
	local author = frame.args["author"] or "Weisstein, Eric W"
	-- оформить ссылку
	return MWEntryByAuthorTitleUrlname(frame, author, title, urlname)
end

return p