<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.tiffa.net/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AAncient_Greek</id>
	<title>Module:Ancient Greek - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tiffa.net/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AAncient_Greek"/>
	<link rel="alternate" type="text/html" href="https://wiki.tiffa.net/w/index.php?title=Module:Ancient_Greek&amp;action=history"/>
	<updated>2026-04-06T21:26:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.tiffa.net/w/index.php?title=Module:Ancient_Greek&amp;diff=3768&amp;oldid=prev</id>
		<title>imported&gt;Fire: Created page with &quot;local p = {}  local macron = mw.ustring.char(0x304) local breve = mw.ustring.char(0x306) local rough = mw.ustring.char(0x314) local smooth = mw.ustring.char(0x313) local diaeresis = mw.ustring.char(0x308) local acute = mw.ustring.char(0x301) local grave = mw.ustring.char(0x300) local circumflex = mw.ustring.char(0x342) local Latin_circumflex = mw.ustring.char(0x302) local subscript = mw.ustring.char(0x345) local macron_circumflex = macron .. diaeresis .. &#039;?&#039; .. Latin_cir...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.tiffa.net/w/index.php?title=Module:Ancient_Greek&amp;diff=3768&amp;oldid=prev"/>
		<updated>2023-01-03T13:51:40Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  local macron = mw.ustring.char(0x304) local breve = mw.ustring.char(0x306) local rough = mw.ustring.char(0x314) local smooth = mw.ustring.char(0x313) local diaeresis = mw.ustring.char(0x308) local acute = mw.ustring.char(0x301) local grave = mw.ustring.char(0x300) local circumflex = mw.ustring.char(0x342) local Latin_circumflex = mw.ustring.char(0x302) local subscript = mw.ustring.char(0x345) local macron_circumflex = macron .. diaeresis .. &amp;#039;?&amp;#039; .. Latin_cir...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local macron = mw.ustring.char(0x304)&lt;br /&gt;
local breve = mw.ustring.char(0x306)&lt;br /&gt;
local rough = mw.ustring.char(0x314)&lt;br /&gt;
local smooth = mw.ustring.char(0x313)&lt;br /&gt;
local diaeresis = mw.ustring.char(0x308)&lt;br /&gt;
local acute = mw.ustring.char(0x301)&lt;br /&gt;
local grave = mw.ustring.char(0x300)&lt;br /&gt;
local circumflex = mw.ustring.char(0x342)&lt;br /&gt;
local Latin_circumflex = mw.ustring.char(0x302)&lt;br /&gt;
local subscript = mw.ustring.char(0x345)&lt;br /&gt;
local macron_circumflex = macron .. diaeresis .. &amp;#039;?&amp;#039; .. Latin_circumflex&lt;br /&gt;
&lt;br /&gt;
local is_velar = { [&amp;#039;κ&amp;#039;] = true, [&amp;#039;γ&amp;#039;] = true, [&amp;#039;χ&amp;#039;] = true, [&amp;#039;ξ&amp;#039;] = true, }&lt;br /&gt;
&lt;br /&gt;
local UTF8_char = &amp;quot;[%z\1-\127\194-\244][\128-\191]*&amp;quot;&lt;br /&gt;
local basic_Greek = &amp;quot;[\206-\207][\128-\191]&amp;quot; -- excluding first line of Greek and Coptic block: ͰͱͲͳʹ͵Ͷͷͺͻͼͽ;Ϳ&lt;br /&gt;
&lt;br /&gt;
local info = {}&lt;br /&gt;
&lt;br /&gt;
-- The tables are shared among different characters so that they can be checked&lt;br /&gt;
-- for equality if needed, and to use less space.&lt;br /&gt;
local vowel = { vowel = true, diacritic_seat = true }&lt;br /&gt;
local iota = { vowel = true, diacritic_seat = true, offglide = true }&lt;br /&gt;
local upsilon = { vowel = true, diacritic_seat = true, offglide = true }&lt;br /&gt;
-- Technically rho is only a seat for rough or smooth breathing.&lt;br /&gt;
local rho = { consonant = true, diacritic_seat = true }&lt;br /&gt;
local consonant = { consonant = true }&lt;br /&gt;
local diacritic = { diacritic = true }&lt;br /&gt;
-- Needed for equality comparisons.&lt;br /&gt;
local breathing = { diacritic = true }&lt;br /&gt;
&lt;br /&gt;
local function add_info(characters, t)&lt;br /&gt;
	if type(characters) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		for character in string.gmatch(characters, UTF8_char) do&lt;br /&gt;
			info[character] = t&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for _, character in ipairs(characters) do&lt;br /&gt;
			info[character] = t&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
add_info({ macron, breve,&lt;br /&gt;
		diaeresis,&lt;br /&gt;
		acute, grave, circumflex,&lt;br /&gt;
		subscript,&lt;br /&gt;
	}, diacritic)&lt;br /&gt;
&lt;br /&gt;
add_info({rough, smooth}, breathing)&lt;br /&gt;
add_info(&amp;quot;ΑΕΗΟΩαεηοω&amp;quot;, vowel)&lt;br /&gt;
add_info(&amp;quot;Ιι&amp;quot;, iota)&lt;br /&gt;
add_info(&amp;quot;Υυ&amp;quot;, upsilon)&lt;br /&gt;
add_info(&amp;quot;ΒΓΔΖΘΚΛΜΝΞΠΡΣΤΦΧΨϜϘϺϷͶϠβγδζθκλμνξπρσςτφχψϝϙϻϸͷϡ&amp;quot;, consonant)&lt;br /&gt;
add_info(&amp;quot;Ρρ&amp;quot;, rho)&lt;br /&gt;
&lt;br /&gt;
local not_recognized = {}&lt;br /&gt;
setmetatable(info, { __index =&lt;br /&gt;
	function()&lt;br /&gt;
		return not_recognized&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
local function quote(str)&lt;br /&gt;
	return &amp;quot;“&amp;quot; ..  str .. &amp;quot;”&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local correspondences = {&lt;br /&gt;
	-- Vowels&lt;br /&gt;
	[&amp;quot;α&amp;quot;] = &amp;quot;a&amp;quot;,&lt;br /&gt;
	[&amp;quot;ε&amp;quot;] = &amp;quot;e&amp;quot;,&lt;br /&gt;
	[&amp;quot;η&amp;quot;] = &amp;quot;e&amp;quot; .. macron,&lt;br /&gt;
	[&amp;quot;ι&amp;quot;] = &amp;quot;i&amp;quot;,&lt;br /&gt;
	[&amp;quot;ο&amp;quot;] = &amp;quot;o&amp;quot;,&lt;br /&gt;
	[&amp;quot;υ&amp;quot;] = &amp;quot;u&amp;quot;,&lt;br /&gt;
	[&amp;quot;ω&amp;quot;] = &amp;quot;o&amp;quot; .. macron,&lt;br /&gt;
&lt;br /&gt;
	-- Consonants&lt;br /&gt;
	[&amp;quot;β&amp;quot;] = &amp;quot;b&amp;quot;,&lt;br /&gt;
	[&amp;quot;γ&amp;quot;] = &amp;quot;g&amp;quot;,&lt;br /&gt;
	[&amp;quot;δ&amp;quot;] = &amp;quot;d&amp;quot;,&lt;br /&gt;
	[&amp;quot;ζ&amp;quot;] = &amp;quot;z&amp;quot;,&lt;br /&gt;
	[&amp;quot;θ&amp;quot;] = &amp;quot;th&amp;quot;,&lt;br /&gt;
	[&amp;quot;κ&amp;quot;] = &amp;quot;k&amp;quot;,&lt;br /&gt;
	[&amp;quot;λ&amp;quot;] = &amp;quot;l&amp;quot;,&lt;br /&gt;
	[&amp;quot;μ&amp;quot;] = &amp;quot;m&amp;quot;,&lt;br /&gt;
	[&amp;quot;ν&amp;quot;] = &amp;quot;n&amp;quot;,&lt;br /&gt;
	[&amp;quot;ξ&amp;quot;] = &amp;quot;x&amp;quot;,&lt;br /&gt;
	[&amp;quot;π&amp;quot;] = &amp;quot;p&amp;quot;,&lt;br /&gt;
	[&amp;quot;ρ&amp;quot;] = &amp;quot;r&amp;quot;,&lt;br /&gt;
	[&amp;quot;σ&amp;quot;] = &amp;quot;s&amp;quot;,&lt;br /&gt;
	[&amp;quot;ς&amp;quot;] = &amp;quot;s&amp;quot;,&lt;br /&gt;
	[&amp;quot;τ&amp;quot;] = &amp;quot;t&amp;quot;,&lt;br /&gt;
	[&amp;quot;φ&amp;quot;] = &amp;quot;ph&amp;quot;,&lt;br /&gt;
	[&amp;quot;ψ&amp;quot;] = &amp;quot;ps&amp;quot;,&lt;br /&gt;
	&lt;br /&gt;
	-- Archaic letters&lt;br /&gt;
	[&amp;quot;ϝ&amp;quot;] = &amp;quot;w&amp;quot;,&lt;br /&gt;
	[&amp;quot;ϻ&amp;quot;] = &amp;quot;ś&amp;quot;,&lt;br /&gt;
	[&amp;quot;ϙ&amp;quot;] = &amp;quot;q&amp;quot;,&lt;br /&gt;
	[&amp;quot;ϡ&amp;quot;] = &amp;quot;š&amp;quot;,&lt;br /&gt;
	[&amp;quot;ͷ&amp;quot;] = &amp;quot;v&amp;quot;,&lt;br /&gt;
	&lt;br /&gt;
	-- Diacritics&lt;br /&gt;
	[smooth] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[rough] = &amp;#039;&amp;#039;, -- h is added below in the `transliterate` function.&lt;br /&gt;
	[breve] = &amp;#039;&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local ALA_LC = {&lt;br /&gt;
	[&amp;quot;χ&amp;quot;] = &amp;quot;ch&amp;quot;,&lt;br /&gt;
	[acute] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[grave] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[circumflex] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[subscript] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[diaeresis] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[macron] = &amp;#039;&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local Wiktionary_transliteration = {&lt;br /&gt;
	[&amp;quot;χ&amp;quot;] = &amp;quot;kh&amp;quot;,&lt;br /&gt;
	[circumflex] = Latin_circumflex,&lt;br /&gt;
	[subscript] = &amp;#039;i&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function add_index_metamethod(t, index_metamethod)&lt;br /&gt;
	local mt = getmetatable(t)&lt;br /&gt;
	if not mt then&lt;br /&gt;
		mt = {}&lt;br /&gt;
		setmetatable(t, mt)&lt;br /&gt;
	end&lt;br /&gt;
	mt.__index = index_metamethod&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
		This breaks a word into meaningful &amp;quot;tokens&amp;quot;, which are&lt;br /&gt;
		individual letters or diphthongs with their diacritics.&lt;br /&gt;
		Used by [[Module:grc-accent]] and [[Module:grc-pronunciation]].&lt;br /&gt;
--]=]&lt;br /&gt;
local function tokenize(text)&lt;br /&gt;
	local tokens, vowel_info, prev_info = {}, {}, {}&lt;br /&gt;
	local token_i = 1&lt;br /&gt;
	local prev&lt;br /&gt;
	for character in string.gmatch(mw.ustring.toNFD(text), UTF8_char) do&lt;br /&gt;
		local curr_info = info[character]&lt;br /&gt;
		-- Split vowels between tokens if not a diphthong.&lt;br /&gt;
		if curr_info.vowel then&lt;br /&gt;
			if prev and (not (curr_info.offglide and prev_info.vowel)&lt;br /&gt;
					-- υυ → υ, υ&lt;br /&gt;
					-- ιυ → ι, υ&lt;br /&gt;
					or prev_info.offglide and curr_info == upsilon) then&lt;br /&gt;
				token_i = token_i + 1&lt;br /&gt;
			end&lt;br /&gt;
			tokens[token_i] = (tokens[token_i] or &amp;quot;&amp;quot;) .. character&lt;br /&gt;
			table.insert(vowel_info, { index = token_i })&lt;br /&gt;
		elseif curr_info.diacritic then&lt;br /&gt;
			tokens[token_i] = (tokens[token_i] or &amp;quot;&amp;quot;) .. character&lt;br /&gt;
			if prev_info.vowel or prev_info.diacritic then&lt;br /&gt;
				if character == diaeresis then&lt;br /&gt;
					-- Current token is vowel, vowel, possibly other diacritics,&lt;br /&gt;
					-- and a diaeresis.&lt;br /&gt;
					-- Split the current token into two:&lt;br /&gt;
					-- the first letter, then the second letter plus any diacritics.&lt;br /&gt;
					local previous_vowel, vowel_with_diaeresis = string.match(tokens[token_i], &amp;quot;^(&amp;quot; .. basic_Greek .. &amp;quot;)(&amp;quot; .. basic_Greek .. &amp;quot;.+)&amp;quot;)&lt;br /&gt;
					if previous_vowel then&lt;br /&gt;
						tokens[token_i], tokens[token_i + 1] = previous_vowel, vowel_with_diaeresis&lt;br /&gt;
						token_i = token_i + 1&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			elseif prev_info == rho then&lt;br /&gt;
				if curr_info ~= breathing then&lt;br /&gt;
					return string.format(&amp;quot;The character %s cannot have the accent %s on it.&amp;quot;, prev, &amp;quot;◌&amp;quot; .. character)&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				error(&amp;quot;The character &amp;quot; .. quote(prev) .. &amp;quot; cannot have a diacritic on it.&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif curr_info == rho then&lt;br /&gt;
			if prev and not (prev_info == breathing and info[string.match(tokens[token_i], &amp;quot;^&amp;quot; .. basic_Greek)] == rho) then&lt;br /&gt;
				token_i = token_i + 1&lt;br /&gt;
			end&lt;br /&gt;
			tokens[token_i] = (tokens[token_i] or &amp;quot;&amp;quot;) .. character&lt;br /&gt;
		else&lt;br /&gt;
			if prev then&lt;br /&gt;
				token_i = token_i + 1&lt;br /&gt;
			end&lt;br /&gt;
			tokens[token_i] = (tokens[token_i] or &amp;quot;&amp;quot;) .. character&lt;br /&gt;
		end&lt;br /&gt;
		prev = character&lt;br /&gt;
		prev_info = curr_info&lt;br /&gt;
	end&lt;br /&gt;
	return tokens&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.transliterate(text, system)&lt;br /&gt;
	add_index_metamethod(correspondences, system == &amp;quot;ALA-LC&amp;quot; and ALA_LC or Wiktionary_transliteration)&lt;br /&gt;
	&lt;br /&gt;
	if text == &amp;#039;῾&amp;#039; then&lt;br /&gt;
		return &amp;#039;h&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = mw.ustring.toNFD(text)&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Replace semicolon or Greek question mark with regular question mark,&lt;br /&gt;
		except after an ASCII alphanumeric character (to avoid converting&lt;br /&gt;
		semicolons in HTML entities).&lt;br /&gt;
	--]]&lt;br /&gt;
	text = mw.ustring.gsub(text, &amp;quot;([^A-Za-z0-9])[;&amp;quot; .. mw.ustring.char(0x37E) .. &amp;quot;]&amp;quot;, &amp;quot;%1?&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	-- Handle the middle dot. It is equivalent to semicolon or colon, but semicolon is probably more common.&lt;br /&gt;
	text = text:gsub(&amp;quot;·&amp;quot;, &amp;quot;;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local tokens = tokenize(text)&lt;br /&gt;
&lt;br /&gt;
	--now read the tokens&lt;br /&gt;
	local output = {}&lt;br /&gt;
	for i, token in pairs(tokens) do&lt;br /&gt;
		-- substitute each character in the token for its transliteration&lt;br /&gt;
		local translit = string.gsub(mw.ustring.lower(token), UTF8_char, correspondences)&lt;br /&gt;
		&lt;br /&gt;
		if token == &amp;#039;γ&amp;#039; and is_velar[tokens[i + 1]] then&lt;br /&gt;
			-- γ before a velar should be &amp;lt;n&amp;gt;&lt;br /&gt;
			translit = &amp;#039;n&amp;#039;&lt;br /&gt;
		elseif token == &amp;#039;ρ&amp;#039; and tokens[i - 1] == &amp;#039;ρ&amp;#039; then&lt;br /&gt;
			-- ρ after ρ should be &amp;lt;rh&amp;gt;&lt;br /&gt;
			translit = &amp;#039;rh&amp;#039;&lt;br /&gt;
		elseif system == &amp;quot;Wiktionary&amp;quot; and mw.ustring.find(token, &amp;#039;^[αΑ].*&amp;#039; .. subscript .. &amp;#039;$&amp;#039;) then&lt;br /&gt;
			-- add macron to ᾳ&lt;br /&gt;
			translit = mw.ustring.gsub(translit, &amp;#039;([aA])&amp;#039;, &amp;#039;%1&amp;#039; .. macron)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if token:find(rough) then&lt;br /&gt;
			if mw.ustring.find(token, &amp;#039;[Ρρ]&amp;#039;) then&lt;br /&gt;
				translit = translit .. &amp;#039;h&amp;#039;&lt;br /&gt;
			else -- vowel&lt;br /&gt;
				translit = &amp;#039;h&amp;#039; .. translit&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if system == &amp;quot;ALA-LC&amp;quot; and mw.ustring.find(token, &amp;#039;^[υΥ][^ιΙ]*$&amp;#039;) then&lt;br /&gt;
			translit = translit:gsub(&amp;#039;u&amp;#039;, &amp;#039;y&amp;#039;):gsub(&amp;#039;U&amp;#039;, &amp;#039;Y&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Remove macron from a vowel that has a circumflex.&lt;br /&gt;
		if mw.ustring.find(translit, macron_circumflex) then&lt;br /&gt;
			translit = translit:gsub(macron, &amp;#039;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Capitalize first character of transliteration.&lt;br /&gt;
		if token ~= mw.ustring.lower(token) then&lt;br /&gt;
			translit = mw.ustring.gsub(translit, &amp;quot;^.&amp;quot;, mw.ustring.upper)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(output, translit)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.translit(frame)&lt;br /&gt;
	local text = frame.args[1] or frame:getParent().args[1]&lt;br /&gt;
	&lt;br /&gt;
	local system = frame.args.system&lt;br /&gt;
	if system == nil or system == &amp;quot;&amp;quot; then&lt;br /&gt;
		system = &amp;quot;Wiktionary&amp;quot;&lt;br /&gt;
	elseif not (system == &amp;quot;ALA-LC&amp;quot; or system == &amp;quot;Wiktionary&amp;quot;) then&lt;br /&gt;
		error(&amp;#039;Transliteration system in |system= not recognized; choose between &amp;quot;ALA-LC&amp;quot; and &amp;quot;Wiktionary&amp;quot;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local transliteration = p.transliterate(text, system)&lt;br /&gt;
	return &amp;#039;&amp;lt;span title=&amp;quot;Ancient Greek transliteration&amp;quot; lang=&amp;quot;grc-Latn&amp;quot;&amp;gt;&amp;lt;i&amp;gt;&amp;#039; .. transliteration .. &amp;#039;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bare_translit(frame)&lt;br /&gt;
	return p.transliterate(frame.args[1] or frame:getParent().args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Fire</name></author>
	</entry>
</feed>