Module:SortName

local p = {}

function p.sortname(frame) local currentpage = mw.title.getCurrentTitle local pagetitle = frame.args[1] or currentpage.text local langvar = mw.language.getContentLanguage local text1 = '' local text2 = '' local parts = { 'de','De','von','Von','du','Du','del','Del','zu','Zu','di','Di','van','Van','na','Na','le','Le','de\,'De\ } local partmatch = false if string.find( pagetitle, ' ' ) ~= nil then pagetitle = string.gsub( string.gsub( string.gsub( pagetitle, '%b',  ), ' +', ' '), ' $',  ) if string.find( pagetitle, '^List of ' ) ~= nil then pagetitle = langvar:ucfirst( string.gsub( pagetitle, '^List of ', '', 1 ) ) elseif string.find( pagetitle, '^The ' ) ~= nil then pagetitle = string.gsub( pagetitle, '^The ', '' ) .. ', The' else pagetitle = string.gsub( pagetitle, ',.*$', '' ) pagetitle = string.gsub( pagetitle, ' of .*$', '' ) for i in ipairs( parts ) do               if string.find( pagetitle, ' ' .. parts[i] .. ' ' ) ~= nil then text1 = string.sub( pagetitle, string.find( pagetitle, ' ' .. parts[i] .. ' ' ) + 1, #pagetitle ) text2 = string.sub( pagetitle, 0, string.find( pagetitle, ' ' .. parts[i] .. ' ' ) - 1 )                   pagetitle = text1 .. ', ' .. text2 partmatch = true break end end if not partmatch and string.find( pagetitle, ' ' ) ~= nil then text1 = string.sub( pagetitle, string.find( pagetitle, ' [^ ]*$' ) + 1, #pagetitle ) text2 = string.sub( pagetitle, 0, string.find( pagetitle, ' [^ ]*$' ) - 1 ) local romannumeral = roman_to_numeral(text1) if romannumeral == -1 then pagetitle = text1 .. ', ' .. text2 else if string.find( text2, ' ' ) == nil then pagetitle = text2 .. ' ' .. romannumeral else text1 = string.sub( text2, string.find( text2, ' [^ ]*$' ) + 1, #text2 ) text2 = string.sub( text2, 0, string.find( text2, ' [^ ]*$' ) - 1 ) pagetitle = text1 .. ' ' .. romannumeral .. ', ' .. text2 end end end end end return pagetitle end

-- the following table and roman_to_numeral function came from Module:ConvertNumeric, created by User:Dcoetzee roman_numerals = { I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000 } -- Converts a given valid roman numeral (and some invalid roman numerals) to a number. Returns -1, errorstring on error function roman_to_numeral(roman) if type(roman) ~= "string" then return -1, "roman numeral not a string" end local rev = roman:reverse local raising = true local last = 0 local result = 0 for i = 1, #rev do       local c = rev:sub(i, i)        local next = roman_numerals[c] if next == nil then return -1, "roman numeral contains illegal character " .. c end if next > last then result = result + next raising = true elseif next < last then result = result - next raising = false elseif raising then result = result + next else result = result - next end last = next end return result end return p