Module:Sandbox/Erutuon/author citation

This is an old revision of this page, as edited by Erutuon (talk | contribs) at 17:35, 4 July 2019 (add start and end parameters). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
local p = {}

local function advance_pos_if_starts_with(str, pattern, pos)
	local i, j = mw.ustring.find(str, pattern, pos)
	if i == pos then
		return j + 1
	else
		return pos
	end
end

-- [[d:Property:P428#P1793]]
-- ('t )?(d')?(de )?(la )?(van (der )?)?(Ma?c)?(De)?(Di)?\p{Lu}?C?['\p{Ll}]*([-'. ]*(van )?(y )?(d[ae][nr]?[- ])?(Ma?c)?[\p{Lu}bht]?C?['\p{Ll}]*)*\.? ?f?\.?
function p.is_author_citation(str, i, j)
	local pos = i or 1
	for _, prefix in ipairs {
		"'t ", "d'", "de ", "la ", "van der ", "van ", "Ma?c", "De", "Di", "%l?C?['%l]*",
	} do
		pos = advance_pos_if_starts_with(str, prefix, pos)
	end
	
	while true do
		local loop_pos = pos
		loop_pos = advance_pos_if_starts_with(str, "[-'. ]*", loop_pos)
		loop_pos = advance_pos_if_starts_with(str, "van ", loop_pos)
		loop_pos = advance_pos_if_starts_with(str, "y ", loop_pos)
		loop_pos = advance_pos_if_starts_with(str, "d[ae][nr]?[- ]", loop_pos)
		loop_pos = advance_pos_if_starts_with(str, "Ma?c", loop_pos)
		loop_pos = advance_pos_if_starts_with(str, "[%lbht]?C?", loop_pos)
		loop_pos = advance_pos_if_starts_with(str, "['%l]*", loop_pos)
		pos = loop_pos
	end
	
	pos = advance_pos_if_starts_with(str, "%.? ?f?%.?")
	
	return pos == (j or #str)
end

return p