<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AAlhatorah%2Fsandbox</id>
	<title>Module:Alhatorah/sandbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AAlhatorah%2Fsandbox"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Alhatorah/sandbox&amp;action=history"/>
	<updated>2026-05-28T08:14:59Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Alhatorah/sandbox&amp;diff=135201&amp;oldid=prev</id>
		<title>imported&gt;Ar2332 at 16:43, 23 June 2021</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Alhatorah/sandbox&amp;diff=135201&amp;oldid=prev"/>
		<updated>2021-06-23T16:43:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module implements Template:Alhatorah. Based on Template:Bibleverse&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--possible book inputs, based on Chicago Manual&lt;br /&gt;
local book_aliases = {&lt;br /&gt;
	[&amp;#039;Bereshit&amp;#039;] = {&amp;#039;genesis&amp;#039;, &amp;#039;gen&amp;#039;, &amp;#039;gn&amp;#039;},&lt;br /&gt;
	[&amp;#039;Shemot&amp;#039;] = {&amp;#039;exodus&amp;#039;, &amp;#039;exod&amp;#039;, &amp;#039;ex&amp;#039;},&lt;br /&gt;
	[&amp;#039;Vayikra&amp;#039;] = {&amp;#039;leviticus&amp;#039;, &amp;#039;lev&amp;#039;, &amp;#039;lv&amp;#039;},&lt;br /&gt;
	[&amp;#039;Bemidbar&amp;#039;] = {&amp;#039;numbers&amp;#039;, &amp;#039;num&amp;#039;, &amp;#039;nm&amp;#039;},&lt;br /&gt;
	[&amp;#039;Devarim&amp;#039;] = {&amp;#039;deuteronomy&amp;#039;, &amp;#039;deut&amp;#039;, &amp;#039;dt&amp;#039;},&lt;br /&gt;
	[&amp;#039;Yehoshua&amp;#039;] = {&amp;#039;joshua&amp;#039;, &amp;#039;josh&amp;#039; , &amp;#039;jo&amp;#039;},&lt;br /&gt;
	[&amp;#039;Shofetim&amp;#039;] = {&amp;#039;judges&amp;#039;, &amp;#039;judg&amp;#039;, &amp;#039;jgs&amp;#039;},&lt;br /&gt;
	[&amp;#039;Shemuel I&amp;#039;] = {&amp;#039;1_samuel&amp;#039;, &amp;#039;1sam&amp;#039;, &amp;#039;1sm&amp;#039;, &amp;#039;I_samuel&amp;#039;},&lt;br /&gt;
	[&amp;#039;Shemuel II&amp;#039;] = {&amp;#039;2_samuel&amp;#039;, &amp;#039;2sam&amp;#039;, &amp;#039;2sm&amp;#039;, &amp;#039;II_samuel&amp;#039;},&lt;br /&gt;
	[&amp;#039;Melakhim I&amp;#039;] = {&amp;#039;1_kings&amp;#039;, &amp;#039;1kgs&amp;#039;, &amp;#039;I_kings&amp;#039;},&lt;br /&gt;
	[&amp;#039;Melakhim II&amp;#039;] = {&amp;#039;2_kings&amp;#039;, &amp;#039;2kgs&amp;#039;, &amp;#039;II_kings&amp;#039;},&lt;br /&gt;
	[&amp;#039;Yeshayahu&amp;#039;] = {&amp;#039;isaiah&amp;#039;, &amp;#039;isa&amp;#039;, &amp;#039;is&amp;#039;},&lt;br /&gt;
	[&amp;#039;Yirmeyahu&amp;#039;] = {&amp;#039;jeremiah&amp;#039;, &amp;#039;jer&amp;#039;},&lt;br /&gt;
	[&amp;#039;Yechezkel&amp;#039;] = {&amp;#039;ezekiel&amp;#039;, &amp;#039;ezek&amp;#039;, &amp;#039;ez&amp;#039;},&lt;br /&gt;
	[&amp;#039;Hoshea&amp;#039;] = {&amp;#039;hosea&amp;#039;, &amp;#039;hos&amp;#039;},&lt;br /&gt;
	[&amp;#039;Yoel&amp;#039;] = {&amp;#039;joel&amp;#039;, &amp;#039;jl&amp;#039;},&lt;br /&gt;
	[&amp;#039;Amos&amp;#039;] = {&amp;#039;amos&amp;#039;, &amp;#039;am&amp;#039;},&lt;br /&gt;
	[&amp;#039;Ovadyah&amp;#039;] = {&amp;#039;obadiah&amp;#039;, &amp;#039;obad&amp;#039;, &amp;#039;ob&amp;#039;},&lt;br /&gt;
	[&amp;#039;Yonah&amp;#039;] = {&amp;#039;jonah&amp;#039;, &amp;#039;jon&amp;#039;},&lt;br /&gt;
	[&amp;#039;Mikhah&amp;#039;] = {&amp;#039;micah&amp;#039;, &amp;#039;mic&amp;#039;, &amp;#039;mi&amp;#039;},&lt;br /&gt;
	[&amp;#039;Nachum&amp;#039;] = {&amp;#039;nahum&amp;#039;, &amp;#039;nah&amp;#039;, &amp;#039;na&amp;#039;},&lt;br /&gt;
	[&amp;#039;Chavakkuk&amp;#039;] = {&amp;#039;habakkuk&amp;#039;, &amp;#039;hab&amp;#039;, &amp;#039;hb&amp;#039;},&lt;br /&gt;
	[&amp;#039;Zephanyah&amp;#039;] = {&amp;#039;zephaniah&amp;#039;, &amp;#039;zeph&amp;#039;, &amp;#039;zep&amp;#039;},&lt;br /&gt;
	[&amp;#039;Chaggai&amp;#039;] = {&amp;#039;haggai&amp;#039;, &amp;#039;hag&amp;#039;, &amp;#039;hg&amp;#039;},&lt;br /&gt;
	[&amp;#039;Zekharyah&amp;#039;] = {&amp;#039;zechariah&amp;#039;, &amp;#039;zech&amp;#039;, &amp;#039;zec&amp;#039;},&lt;br /&gt;
	[&amp;#039;Malakhi&amp;#039;] = {&amp;#039;malachi&amp;#039;, &amp;#039;mal&amp;#039;},&lt;br /&gt;
	[&amp;#039;Tehillim&amp;#039;] = {&amp;#039;psalms&amp;#039;, &amp;#039;ps&amp;#039;, &amp;#039;pss&amp;#039;, &amp;#039;psalm&amp;#039;},&lt;br /&gt;
	[&amp;#039;Mishlei&amp;#039;] = {&amp;#039;proverbs&amp;#039;, &amp;#039;prov&amp;#039;, &amp;#039;prv&amp;#039;},&lt;br /&gt;
	[&amp;#039;Kohelet&amp;#039;] = {&amp;#039;ecclesiastes&amp;#039;, &amp;#039;eccles&amp;#039;, &amp;#039;eccl&amp;#039;, &amp;#039;qoheleth&amp;#039;},&lt;br /&gt;
	[&amp;#039;Shir HaShirim&amp;#039;] = {&amp;#039;song_of_solomon&amp;#039;, &amp;#039;songofsol&amp;#039;, &amp;#039;songofsongs&amp;#039;, &amp;#039;song&amp;#039;, &amp;#039;sg&amp;#039;, &amp;#039;canticles&amp;#039;, &amp;#039;canticleofcanticles&amp;#039;},&lt;br /&gt;
	[&amp;#039;Eikhah&amp;#039;] = {&amp;#039;lamentations&amp;#039;, &amp;#039;lam&amp;#039;},&lt;br /&gt;
	[&amp;#039;Rut&amp;#039;] = {&amp;#039;ruth&amp;#039;, &amp;#039;ru&amp;#039;},&lt;br /&gt;
	[&amp;#039;Esther&amp;#039;] = {&amp;#039;esther&amp;#039;, &amp;#039;est&amp;#039;},&lt;br /&gt;
	[&amp;#039;Iyyov&amp;#039;] = {&amp;#039;job&amp;#039;, &amp;#039;jb&amp;#039;},&lt;br /&gt;
	[&amp;#039;Daniel&amp;#039;] = {&amp;#039;daniel&amp;#039;, &amp;#039;dan&amp;#039;, &amp;#039;dn&amp;#039;},&lt;br /&gt;
	[&amp;#039;Divrei HaYamim I&amp;#039;] = {&amp;#039;1_chronicles&amp;#039;, &amp;#039;1chron&amp;#039;, &amp;#039;1chr&amp;#039;, &amp;#039;I_chronicles&amp;#039;},&lt;br /&gt;
	[&amp;#039;Divrei HaYamim II&amp;#039;] = {&amp;#039;2_chronicles&amp;#039;, &amp;#039;2chron&amp;#039;, &amp;#039;2chr&amp;#039;, &amp;#039;II_chronicles&amp;#039;},&lt;br /&gt;
	[&amp;#039;Ezra&amp;#039;] = {&amp;#039;ezra&amp;#039;, &amp;#039;ezr&amp;#039;},&lt;br /&gt;
	[&amp;#039;Nechemyah&amp;#039;] = {&amp;#039;nehemiah&amp;#039;, &amp;#039;neh&amp;#039;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--these books only have one chapter, have to be handled differently&lt;br /&gt;
local no_chapters = {&lt;br /&gt;
	[&amp;#039;obadiah&amp;#039;] = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--changes to the version name to be used in urls, only if necessary&lt;br /&gt;
local site_version_tbl = {&lt;br /&gt;
	mechon_mamre = {&lt;br /&gt;
		he = &amp;#039;p/pt/pt&amp;#039;,&lt;br /&gt;
		jps = &amp;#039;e/et/et&amp;#039;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function trimArg(text)&lt;br /&gt;
	if type(text) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		text = text:match(&amp;#039;(%S.-)%s*$&amp;#039;)  --trimmed text or nil if empty&lt;br /&gt;
	end&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function valueExists(tbl, value)&lt;br /&gt;
	for _, v in pairs(tbl) do&lt;br /&gt;
		if value == v then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function titlecase(arg)&lt;br /&gt;
	-- http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html&lt;br /&gt;
	-- recommended by The U.S. Government Printing Office Style Manual:&lt;br /&gt;
	-- &amp;#039;Capitalize all words in titles of publications and documents,&lt;br /&gt;
	-- except a, an, the, at, by, for, in, of, on, to, up, and, as, but, or, and nor.&amp;#039;&lt;br /&gt;
	local alwayslower = {&lt;br /&gt;
		[&amp;#039;a&amp;#039;] = true, [&amp;#039;an&amp;#039;] = true, [&amp;#039;the&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;and&amp;#039;] = true, [&amp;#039;but&amp;#039;] = true, [&amp;#039;or&amp;#039;] = true, [&amp;#039;for&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;nor&amp;#039;] = true, [&amp;#039;on&amp;#039;] = true, [&amp;#039;in&amp;#039;] = true, [&amp;#039;at&amp;#039;] = true, [&amp;#039;to&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;from&amp;#039;] = true, [&amp;#039;by&amp;#039;] = true, [&amp;#039;of&amp;#039;] = true, [&amp;#039;up&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
	local words = mw.text.split(mw.text.trim(arg or &amp;#039;&amp;#039;), &amp;#039;_&amp;#039;)&lt;br /&gt;
	for i, s in ipairs(words) do&lt;br /&gt;
		s = string.lower(s)&lt;br /&gt;
		if i &amp;gt; 1 then&lt;br /&gt;
			if not alwayslower[s] then&lt;br /&gt;
				s = mw.getContentLanguage():ucfirst(s)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			s = mw.getContentLanguage():ucfirst(s)&lt;br /&gt;
		end&lt;br /&gt;
		words[i] = s&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(words, &amp;#039;_&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local targs = frame:getParent().args&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for _, param in ipairs({1, 2, 3, 4, 5, &amp;#039;nobook&amp;#039;}) do&lt;br /&gt;
		args[param] = trimArg(targs[param])&lt;br /&gt;
	end&lt;br /&gt;
	local default_version = &amp;#039;nrsv&amp;#039;&lt;br /&gt;
	local input_book = &amp;#039;&amp;#039;&lt;br /&gt;
	local ref = &amp;#039;&amp;#039;&lt;br /&gt;
	local commentary = &amp;#039;&amp;#039;&lt;br /&gt;
	local text = &amp;#039;&amp;#039;&lt;br /&gt;
	local mainspace = mw.title.getCurrentTitle():inNamespaces(0)&lt;br /&gt;
	if args[1] == nil or args[2] == nil or tonumber(args[1]) ~= nil then&lt;br /&gt;
		-- first argument is a numeric prefix and second is book name&lt;br /&gt;
		input_book = trimArg((args[1] or &amp;#039;&amp;#039;) .. &amp;#039; &amp;#039; .. (args[2] or &amp;#039;&amp;#039;)) or &amp;#039;&amp;#039;&lt;br /&gt;
		ref = args[3] or &amp;#039;&amp;#039;&lt;br /&gt;
		commentary = args[4] or &amp;#039;&amp;#039;&lt;br /&gt;
		text = args[5] or trimArg((commentary .. &amp;#039; to &amp;#039; .. input_book .. &amp;#039; &amp;#039; .. ref))&lt;br /&gt;
	else&lt;br /&gt;
		-- first argument is the whole book name&lt;br /&gt;
		input_book = args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
		ref = args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
		commentary = args[3] or &amp;#039;&amp;#039;&lt;br /&gt;
		text = args[4] or (commentary .. &amp;#039; to &amp;#039; .. input_book .. &amp;#039; &amp;#039; .. ref)&lt;br /&gt;
	end&lt;br /&gt;
	if args.nobook == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		text = ref&lt;br /&gt;
	end&lt;br /&gt;
	text = text:gsub(&amp;#039;-&amp;#039;, &amp;#039;–&amp;#039;)  --change hyphens to en dashes (3:2-5 → 3:2–5)&lt;br /&gt;
&lt;br /&gt;
	local book = input_book:gsub(&amp;#039;%p&amp;#039;, &amp;#039;&amp;#039;):gsub(&amp;#039; &amp;#039;, &amp;#039;_&amp;#039;)&lt;br /&gt;
	book = mw.ustring.lower(book)&lt;br /&gt;
&lt;br /&gt;
	local book_found = false&lt;br /&gt;
	local standard = book:gsub(&amp;#039;_&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	for full_book, aliases in pairs(book_aliases) do&lt;br /&gt;
		if standard == full_book:gsub(&amp;#039;_&amp;#039;, &amp;#039;&amp;#039;) or valueExists(aliases, standard) then&lt;br /&gt;
			book = full_book&lt;br /&gt;
			book_found = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local urlpat = &amp;#039;https://mg.alhatorah.org/Dual/_commentary/_book/_schap._svers#m7e3n7&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local split_ref = mw.text.split(ref, &amp;#039;[-–—]&amp;#039;)       --split the ref into the part before and after the dash/hyphen&lt;br /&gt;
	local s_ref = mw.text.split(split_ref[1], &amp;#039;%p&amp;#039;)     --any punctuation can be used to separate chapter from verse&lt;br /&gt;
	local e_ref = split_ref[2] or split_ref[1]&lt;br /&gt;
	e_ref = mw.text.split(e_ref, &amp;#039;%p&amp;#039;)&lt;br /&gt;
	for i, v in ipairs(s_ref) do s_ref[i] = v:gsub(&amp;#039;%D&amp;#039;, &amp;#039;&amp;#039;) end  --remove any non-numeric character (such as f)&lt;br /&gt;
	for i, v in ipairs(e_ref) do e_ref[i] = v:gsub(&amp;#039;%D&amp;#039;, &amp;#039;&amp;#039;) end&lt;br /&gt;
&lt;br /&gt;
	local e_chap, e_vers, s_chap, s_vers&lt;br /&gt;
	local chapter_only = not s_ref[2]&lt;br /&gt;
	if no_chapters[book] then&lt;br /&gt;
		chapter_only = false&lt;br /&gt;
		s_chap = 1&lt;br /&gt;
		s_vers = s_ref[2] or s_ref[1] or 1   --verse 3 can be specified as &amp;quot;3&amp;quot; or &amp;quot;1:3&amp;quot;&lt;br /&gt;
		e_chap = 1&lt;br /&gt;
		e_vers = e_ref[2] or e_ref[1] or 1&lt;br /&gt;
	else&lt;br /&gt;
		s_chap = s_ref[1] or 1&lt;br /&gt;
		s_vers = s_ref[2] or 1&lt;br /&gt;
		if e_ref[2] or not s_ref[2] then     --chapter-chapter or chapter(:verse)?-chapter:verse&lt;br /&gt;
			e_chap = e_ref[1] or s_chap&lt;br /&gt;
		else                                 --chapter:verse-verse&lt;br /&gt;
			e_chap = s_chap&lt;br /&gt;
		end&lt;br /&gt;
		e_vers = e_ref[2] or e_ref[1] or s_vers&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	book = titlecase(book)  --title case looks better at oremus where they display the input&lt;br /&gt;
&lt;br /&gt;
	local v_range&lt;br /&gt;
	if chapter_only then&lt;br /&gt;
		if e_chap == s_chap then&lt;br /&gt;
			v_range = s_chap&lt;br /&gt;
		else&lt;br /&gt;
			v_range = s_chap .. &amp;#039;–&amp;#039; .. e_chap&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if e_chap == s_chap and e_vers == s_vers then&lt;br /&gt;
			v_range = s_chap ..&amp;#039;:&amp;#039; .. s_vers&lt;br /&gt;
		elseif e_chap == s_chap then&lt;br /&gt;
			v_range = s_chap .. &amp;#039;:&amp;#039; .. s_vers .. &amp;#039;–&amp;#039; .. e_vers&lt;br /&gt;
		else&lt;br /&gt;
			v_range = s_chap .. &amp;#039;:&amp;#039; .. s_vers .. &amp;#039;–&amp;#039; .. e_chap .. &amp;#039;:&amp;#039; .. e_vers&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local url = urlpat:gsub(&amp;#039;_%l+&amp;#039;, {  --get the components into the url&lt;br /&gt;
					_book    = book,&lt;br /&gt;
					_schap   = s_chap,&lt;br /&gt;
					_svers   = s_vers,&lt;br /&gt;
					_echap   = e_chap,&lt;br /&gt;
					_evers   = e_vers,&lt;br /&gt;
					_vrange  = v_range,&lt;br /&gt;
					_commentary = commentary,&lt;br /&gt;
				})&lt;br /&gt;
&lt;br /&gt;
	local fulllink&lt;br /&gt;
	fulllink = &amp;#039;[&amp;#039; .. url .. &amp;#039; &amp;#039; .. text .. &amp;#039;]&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	if mainspace then&lt;br /&gt;
		if not book_found then&lt;br /&gt;
			table.insert(errors, &amp;#039;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Template:Bibleverse with invalid book&amp;lt;/span&amp;gt;[[Category:Pages with Bible book errors]]&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if version_num then&lt;br /&gt;
			table.insert(errors, &amp;#039;[[Category:Pages with numeric Bible version references]]&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return fulllink --.. table.concat(errors)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Ar2332</name></author>
	</entry>
</feed>