Jump to content

Module:Sort title

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Gonnym (talk | contribs) at 21:59, 5 July 2019 (created module). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

local match = require("Module:String")._match

local p = {}

local function cleanNumberFromCommas(title)
	return string.gsub(title, "(%d+)(,+)", "%1")
end

local function isFirstWordAnArticle(word)
	word = string.lower(word)
	if (word == "a" or word == "an" or word == "the") then
		return true
	else
		return false
	end
end

local function getTitleWithoutDisambiguation(title, disambiguation)
	local newTitle = string.gsub(title, "%(".. disambiguation .. "%)", "")
	return mw.text.trim(newTitle)
end

local function getTitleWithoutFirstWord(title)
	return mw.ustring.gsub(title, "^[^%s]*%s*", "")
end

local function getFirstWord(title)
	return match(title, "^[^%s]*", 1, 1, false, "")
end

local function getDisambiguation(title)
	local disambiguation = match(title, "%s%((.-)%)", 1, -1, false, "")
	if (disambiguation == "") then
		return "", ""
	end
	
	local firstWord = getFirstWord(disambiguation)
	local disambiguationSort = disambiguation
	if (isFirstWordAnArticle(firstWord)) then
		local disambiguationWihoutFirstWord = getTitleWithoutFirstWord(disambiguation)
		disambiguationSort = disambiguationWihoutFirstWord .. ", " .. firstWord
	end
	
	return disambiguation, "(" .. disambiguationSort .. ")"
end

local function _main(title)
	if (not title) then
		title = mw.title.getCurrentTitle().text
	end

	local firstWord = getFirstWord(title)
	local disambiguation, disambiguationSort = getDisambiguation(title)
	
	title = getTitleWithoutDisambiguation(title, disambiguation)
	title = cleanNumberFromCommas(title)

	if (isFirstWordAnArticle(firstWord)) then
		title = getTitleWithoutFirstWord(title)
		title = title .. ", " .. firstWord
	end
	
	local sortKey = title .. " " .. disambiguationSort
	
	return mw.text.trim(sortKey)
end

function p._getSortKey()
	return _main()
end

function p.getSortKey(frame)
	return p._getSortKey() 
end

function p.getDefaultSort(frame)
	local sortKey = p._getSortKey()
	return frame:preprocess{text = "{{DEFAULTSORT:" .. sortKey .. "}}"} 
end

function p.testcases(frame)
	local getArgs = require('Module:Arguments').getArgs
	local args = getArgs(frame)
	return _main(args[1])
end

return p