<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AGeological_time</id>
	<title>Module:Geological time - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AGeological_time"/>
	<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=Module:Geological_time&amp;action=history"/>
	<updated>2026-09-26T12:49:53Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://en.bharatpedia.org/w/index.php?title=Module:Geological_time&amp;diff=556125&amp;oldid=prev</id>
		<title>WikiDwarf: Add missing module</title>
		<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=Module:Geological_time&amp;diff=556125&amp;oldid=prev"/>
		<updated>2025-12-10T11:48:23Z</updated>

		<summary type="html">&lt;p&gt;Add missing module&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Determine whether a query string matches a stored timespan string&lt;br /&gt;
-- Arguments:&lt;br /&gt;
--   s: query string&lt;br /&gt;
--   sub: standard name of timespan&lt;br /&gt;
-- Returns:&lt;br /&gt;
--   false if there is no match&lt;br /&gt;
--   prefix and suffix of match, otherwise&lt;br /&gt;
local function matches(s, sub)&lt;br /&gt;
	local sLen = mw.ustring.len(s)&lt;br /&gt;
	local subLen = mw.ustring.len(sub)&lt;br /&gt;
	if subLen &amp;gt; sLen then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local lowerS = mw.ustring.lower(s)&lt;br /&gt;
	local lowerSub = mw.ustring.lower(sub)&lt;br /&gt;
	local startOffset, endOffset = mw.ustring.find(lowerS,lowerSub,1,true)&lt;br /&gt;
	if not startOffset then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return (mw.ustring.sub(s,1,startOffset-1) or &amp;quot;&amp;quot;), (mw.ustring.sub(s,endOffset+1) or &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Create list of strings to search corresponding to a standard timespan&lt;br /&gt;
-- Some timespans are disambiguated: first search for the dabbed title, then&lt;br /&gt;
-- the base title. Otherwise just search for the standard timespan string&lt;br /&gt;
-- Argument:&lt;br /&gt;
--   span = value in timespan lists (above)&lt;br /&gt;
-- Returns:&lt;br /&gt;
--   list of strings to search in query string&lt;br /&gt;
local function searchStringList(span)&lt;br /&gt;
	if type(span) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		return {span.base..&amp;quot; &amp;quot;..span.dab, span.base}&lt;br /&gt;
	end&lt;br /&gt;
	return {span}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- When an adjacent time span is found, this function returns the&lt;br /&gt;
-- corresponding basename for the page.&lt;br /&gt;
-- Arguments:&lt;br /&gt;
--   span: adjacent entry from table, above&lt;br /&gt;
--   prefix: prefix of query string before match&lt;br /&gt;
--   suffix: remainder of original query string beyond match&lt;br /&gt;
-- Returns:&lt;br /&gt;
--   page title&lt;br /&gt;
--&lt;br /&gt;
-- If the adjacent time span is dabbed, then return the dab if the suffix&lt;br /&gt;
-- is empty. If the suffix is non-empty (e.g., &amp;quot;life&amp;quot;), append it to the base&lt;br /&gt;
-- name of the span (e.g., &amp;quot;Oxfordian&amp;quot;) --&amp;gt; &amp;quot;Oxfordian life&amp;quot;&lt;br /&gt;
local function matchedString(span, prefix, suffix)&lt;br /&gt;
	if type(span) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		if prefix == &amp;quot;&amp;quot; and suffix == &amp;quot;&amp;quot; then&lt;br /&gt;
			return span.base..&amp;quot; &amp;quot;..span.dab&lt;br /&gt;
		end&lt;br /&gt;
		return prefix..span.base..suffix&lt;br /&gt;
	end&lt;br /&gt;
	return prefix..span..suffix&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to find the page titles of time spans adjacent to a query string&lt;br /&gt;
-- Arguments:&lt;br /&gt;
--   s: query string to search for&lt;br /&gt;
local function find(s)&lt;br /&gt;
    -- lazy load list of geological timespans, &lt;br /&gt;
    local data = mw.loadData(&amp;#039;Module:Geological time/data&amp;#039;)&lt;br /&gt;
	-- Search from most-specific to least, to catch &amp;quot;Cambrian Series 2&amp;quot; before &amp;quot;Cambrian&amp;quot;&lt;br /&gt;
	for _, level in ipairs({&amp;#039;age&amp;#039;, &amp;#039;epoch&amp;#039;, &amp;#039;series&amp;#039;, &amp;#039;period&amp;#039;, &amp;#039;era&amp;#039;, &amp;#039;eon&amp;#039;}) do&lt;br /&gt;
        local list = data[level]&lt;br /&gt;
		local listLen = data.listLen[level]&lt;br /&gt;
		for i, span in ipairs(list) do&lt;br /&gt;
			-- Each timespan might have more than one search string&lt;br /&gt;
			for _, searchString in ipairs(searchStringList(span)) do&lt;br /&gt;
				local prefix, suffix = matches(s, searchString)&lt;br /&gt;
				if suffix then&lt;br /&gt;
					local prevSpan = i &amp;gt; 1 and matchedString(list[i-1], prefix, suffix)&lt;br /&gt;
					local nextSpan = i &amp;lt; listLen and matchedString(list[i+1], prefix, suffix)&lt;br /&gt;
					-- return first match found&lt;br /&gt;
					return {prev=prevSpan, next=nextSpan}&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Lua entry point to generate see also hatnote for geological time spans adjanct in time&lt;br /&gt;
-- Arguments:&lt;br /&gt;
--   args[1]: name of page to generate adjacency (current page if None)&lt;br /&gt;
-- Returns:&lt;br /&gt;
--   See also previous and next, formatted as a hatnote&lt;br /&gt;
function p._seeAlso(args)&lt;br /&gt;
	local title = args[1] and mw.title.new(args[1]) or mw.title.getCurrentTitle()&lt;br /&gt;
	local basetext = title.baseText&lt;br /&gt;
	local namespace = title.namespace&lt;br /&gt;
	local adjacent = find(basetext)&lt;br /&gt;
	if not adjacent then&lt;br /&gt;
		local warning = require(&amp;#039;Module:If preview&amp;#039;)._warning&lt;br /&gt;
		local warn = warning({&amp;quot;Cannot find geological time frame in &amp;quot;..basetext})&lt;br /&gt;
		if mw.title.getCurrentTitle().nsText ~= &amp;quot;Template&amp;quot; then&lt;br /&gt;
			warn = warn..&amp;quot;[[Category:Missing geological time frame]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return warn&lt;br /&gt;
	end&lt;br /&gt;
	local prevTitle = adjacent.prev and mw.title.new(adjacent.prev, namespace)&lt;br /&gt;
	local nextTitle = adjacent.next and mw.title.new(adjacent.next, namespace)&lt;br /&gt;
    local catPair = require(&amp;#039;Module:Category pair&amp;#039;)._pair&lt;br /&gt;
	return catPair(prevTitle, nextTitle)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to find timespan before argument&lt;br /&gt;
function p._before(s)&lt;br /&gt;
	local findOut = s and find(tostring(s))&lt;br /&gt;
	return findOut and findOut.prev&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to find timespan after argument&lt;br /&gt;
function p._after(s)&lt;br /&gt;
	local findOut = s and find(tostring(s))&lt;br /&gt;
	return findOut and findOut.next&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Template entry points&lt;br /&gt;
function p.seeAlso(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return p._seeAlso(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.before(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return p._before(args[1]) or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.after(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return p._after(args[1]) or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WikiDwarf</name></author>
	</entry>
</feed>