Vorlagenprogrammierung Diskussionen Lua Test Unterseiten
Modul Deutsch English

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


--[=[ Bibel 2023-01-21
	Module for various provider bible references
	Autor: Vollbracht
]=]

local transCode = {
	-- book number by automatically simplified name entry = bookData key
	-- noncanonical books not (to be) simplified
	tcBk = {
		['1CHR'] = 13, ['1COR'] = 56, ['1Chr'] = 13, ['1Cor'] = 56,
		['1JOH'] = 72, ['1Joh'] = 72, ['1KGS'] = 11, ['1Kgs'] = 11,
		['1KOR'] = 56, ['1Kor'] = 56, ['1KÖN'] = 11, ['1Kön'] = 11,
		['1MAK'] = 45, ['1MO'] = 1, ['1Mak'] = 45, ['1Mo'] = 1,
		['1PAR'] = 13, ['1PET'] = 70, ['1Par'] = 13, ['1Pet'] = 70,
		['1SAM'] = 9, ['1Sam'] = 9, ['1THE'] = 62, ['1TIM'] = 64, ['1The'] = 62,
		['1Tim'] = 64, ['2CHR'] = 14, ['2COR'] = 57, ['2Chr'] = 14,
		['2Cor'] = 57, ['2JOH'] = 73,  ['2Joh'] = 73, ['2KGS'] = 12,
		['2KOR'] = 57, ['2Kgs'] = 12, ['2Kor'] = 57, ['2KÖN'] = 12,
		['2Kön'] = 12, ['2MAK'] = 46, ['2MO'] = 2, ['2Mak'] = 46, ['2Mo'] = 2,
		['2PAR'] = 14, ['2PET'] = 71, ['2Par'] = 14, ['2Pet'] = 71,
		['2SAM'] = 10, ['2Sam'] = 10, ['2THE'] = 63, ['2TIM'] = 65,
		['2The'] = 63, ['2Tim'] = 65, ['3ESD'] = 89, ['3ESR'] = 89,
		['3Esd'] = 89, ['3Esr'] = 89, ['3JOH'] = 74, ['3Joh'] = 74,
		['3MAK'] = 87, ['3MO'] = 3, ['3Mak'] = 87, ['3Mo'] = 3,
		['4MAK'] = 88, ['4MO'] = 4, ['4Mak'] = 88, ['4Mo'] = 4,
		['5MO'] = 5, ['5Mo'] = 5,
		ACT = 54, AM = 30, APG = 54, Act = 54, Am = 30, Apg = 54, Apo = 54,
		BAR = 44, BEL = 86, Bar = 44, Bel = 86,
		CAN = 22, COL = 61, Can = 22, Col = 61,
		DAN = 27, DEU = 5, Dan = 27, Deu = 5, Dtn = 5,
		EPH = 59, ESR = 15, EST = 17, EX = 2, EZ = 26, EZR = 15,
		Ecc = 21, Eph = 59, Esr = 15, Est = 17, Ex = 2, Ez = 26, Ezr = 15,
		GAL = 58, GEN = 1,
		Gal = 58, ['Gebet Manasses'] = 49, ['Gebet von Manasse'] = 49, Gen = 1,
		HAB = 35, HAG = 37, HEB = 68, HES = 26, HI = 18, HLD = 22, HOH = 22,
		HOS = 28, Hab = 35, Hag = 37, Heb = 68, Hes = 26, Hi = 18, Hld = 22,
		Hoh = 22, Hos = 28,
		IJOB = 18, Ijob = 18, Ion = 32, Isa = 23,
		JAK = 69, JDT = 40, JER = 24, JES = 23, JOEL = 29, JOH = 53, JON = 32,
		JOS = 6, JUD = 75, Jak = 69, Jam = 69, Jas = 69, Jdt = 40, Jer = 24,
		Jes = 23, Job = 18, Joel = 29, Joh = 53, Jon = 32, Jos = 6, Jud = 75,
		Judg = 7, Judi = 40,
		KLA = 25, KLG = 25, KOH = 21, KOL = 61,
		Kla = 25, Klg = 25, Koh = 21, Kol = 61,
		LEV = 3, LK = 52, LUK = 52, Lam = 25, Lev = 3, Lk = 52, Luk = 52,
		MAL = 39, MAT = 50, MAR = 51, MI = 33, MT = 50, MK = 51,
		Mal = 39, Mat = 50, Mar = 51, Mi = 33, Mt = 50, Mk = 51,
		NAH = 34, NEH = 16, NUM = 4, Nah = 34, Neh = 16, Num = 4,
		OBA = 31, OBD = 31, OFF = 76, Oba = 31, Obd = 31, Off = 76,
		PHI = 60, PHLM = 67, PRD = 21, PRE = 21, PRO = 20, PS = 19,
		Phi = 60, Phlm = 67, Prd = 21, Pre = 21, Pro = 20, Prv = 20, Ps = 19,
		RI = 7, RU = 8, Rev = 76, Ri = 7, Rom = 55, Ru = 8, ['RÖM'] = 55,
		['Röm'] = 55,
		SAC = 38, SIR = 43, SPR = 20,
		Sac = 38, Sap = 41, Sir = 43, Sofia = 41, Sofonias = 42, Son = 22,
		Sophia = 41, Sophonias = 36, Spr = 20, ['Stücke zu Daniel'] = 48,
		['Stücke zu Ester'] = 47, Su = 85,
		TIT = 66, TOB = 42, Tit = 66, Tob = 42,
		WEI = 41, Wei = 41, Wis = 41,
		ZEF = 36, ZEP = 36, Zac = 38, Zec = 38, Zef = 36, Zep = 36
	},
	-- variant keys for provider selection
	tcPrv = {
		1, 2, 3,
		BS = 2, BW = 1, DBG = 1, ERF = 2, Q875742 = 1, Q1275774 = 2,
		Q7860447 = 3, STEP = 3, TH = 3,
		bs = 2, -- published
		bw = 1, -- published
		dbg = 1, -- Deutsche Bibelgesellschaft = bibelwissenschaft.de
		erf = 2, -- erf = bibleserver.com
		step = 3, -- published
		th = 3 -- Tyndale House = stepbible.org
	}
}

--[[
	biblical book data
	Entry numbers are a foreign key. Do not alter (remove or insert elements
	atween) unless you know what you are doing!
	key (number)	Bibelwissenschaft.de key by Deutsche Bibelgesellschaft
					and transCode.tcBk number
	vl1		array of currently up to three values:
			  Q875742: Bibelwissenschaft.de key by Deutsche Bibelgesellschaft
			  Q7860447: STEPbible.org key by Tyndale House, Cambridge
			  Q1275774: bibleserver.de key by Evangeliumsrundfunk erf
	wd		Wikidata key
	group	one out of currently 5 values:
			  Q19786: OT, canonical
			  Q18813: NT, canonical
			  Q201410: OT, deuterocanonical
			  Q29334: Septuaginta ("LXX", OT), not canonical
			  Q116215829: Stuttgart Vulgata V, not canonical
	de		title with link
]]
local bookData = {
	-- group = 'Q19786' is OT, canonical
	{ -- 1
		vl1 = { Q875742 = 'GEN', Q7860447 = 'Gen', Q1275774 = 'Gen' },
		vl2 = 'Genesis', wd = 'Q9184', group = 'Q19786', wp = 'Genesis (Bibel)',
		de = "Buch [[Genesis]] (1. Buch Mose)"
	},
	{ -- 2
		vl1 = { Q875742 = 'EXO', Q7860447 = 'Exod', Q1275774 = 'Ex' },
		vl2 = 'Exodus', wd = 'Q9190', group = 'Q19786', wp = 'Exodus (Bibel)',
		de = "Buch [[Exodus (Bibel)|Exodus]] (2. Buch Mose)"
	},
	{ -- 3
		vl1 = { Q875742 = 'LEV', Q7860447 = 'Lev', Q1275774 = 'Lev' },
		vl2 = 'Levitikus', wd = 'Q41490', group = 'Q19786', wp = 'Levitikus',
		de = "Buch [[Levitikus]] (3. Buch Mose)"
	},
	{ -- 4
		vl1 = { Q875742 = 'NUM', Q7860447 = 'Num', Q1275774 = 'Num' },
		vl2 = 'Numeri', wd = 'Q43099', group = 'Q19786', wp = 'Numeri',
		de = "Buch [[Numeri]] (4. Buch Mose)"
	},
	{ -- 5
		vl1 = { Q875742 = 'DEU', Q7860447 = 'Deut', Q1275774 = 'Dtn' },
		vl2 = 'Deuteronomium', wd = 'Q42614', group = 'Q19786',
		wp = 'Deuteronomium', de= "[[Deuteronomium]] (5. Buch Mose)"
	},
	{ -- 6
		vl1 = { Q875742 = 'JOS', Q7860447 = 'Josh', Q1275774 = 'Jos' },
		vl2 = 'Josua', wd = 'Q47680', group = 'Q19786', wp = 'Buch Josua',
		de = "[[Buch Josua]]"
	},
	{ -- 7
		vl1 = { Q875742 = 'JDG', Q7860447 = 'Judg', Q1275774 = 'Ri' },
		vl2 = 'Richter', wd = 'Q81240', group = 'Q19786',
		wp = 'Buch der Richter', de = "[[Buch der Richter]]"
	},
	{ -- 8
		vl1 = { Q875742 = 'RUT', Q7860447 = 'Ruth', Q1275774 = 'Rut' },
		vl2 = 'Rut', wd = 'Q80038', group = 'Q19786', wp = 'Buch Rut',
		de = "[[Buch Rut]]"
	},
	{ -- 9
		vl1 = { Q875742 = '1SA', Q7860447 = '1Sam', Q1275774 = '1.Sam' },
		vl2 = '1.Samuel', wd = 'Q1975029', group = 'Q19786',
		wp = '1. Buch Samuel', de = "[[1. Buch Samuel]]"
	},
	{ -- 10
		vl1 = { Q875742 = '2SA', Q7860447 = '2Sam', Q1275774 = '2.Sam' },
		vl2 = '2.Samuel', wd = 'Q209719', group = 'Q19786',
		wp = '2. Buch Samuel', de = "[[2. Buch Samuel]]"
	},
	{ -- 11
		vl1 = { Q875742 = '1KI', Q7860447 = '1Kgs', Q1275774 = '1.Kng' },
		vl2 = '1.Könige', wd = 'Q131066', group = 'Q19786',
		wp = '1. Buch der Könige', de= "[[1. Buch der Könige]]"
	},
	{ -- 12
		vl1 = { Q875742 = '2KI', Q7860447 = '2Kgs', Q1275774 = '2.Kng' },
		vl2 = '2.Könige', wd = 'Q209746', group = 'Q19786',
		wp = '2. Buch der Könige', de= "[[2. Buch der Könige]]"
	},
	{ -- 13
		vl1 = { Q875742 = '1CH', Q7860447 = '1Chr', Q1275774 = '1.Chr' },
		vl2 = '1.Chronik', wd = 'Q9813916', group = 'Q19786',
		wp = '1. Buch der Chronik', de= "[[1. Buch der Chronik]]"
	},
	{ -- 14
		vl1 = { Q875742 = '2CH', Q7860447 = '2Chr', Q1275774 = '2.Chr' },
		vl2 = '2.Chronik', wd = 'Q209720', group = 'Q19786',
		wp = '2. Buch der Chronik', de= "[[2. Buch der Chronik]]"
	},
	{ -- 15
		vl1 = { Q875742 = 'EZR', Q7860447 = 'Ezra', Q1275774 = 'Esra' },
		vl2 = 'Esra', wd = 'Q131635', group = 'Q19786', wp = 'Buch Esra',
		de= "[[Buch Esra]]"
	},
	{ -- 16
		vl1 = { Q875742 = 'NEH', Q7860447 = 'Neh', Q1275774 = 'Neh' },
		vl2 = 'Nehemia', wd = 'Q131640', group = 'Q19786', wp = 'Buch Nehemia',
		de= "[[Buch Nehemia]]"
	},
	{ -- 17
		vl1 = { Q875742 = 'EST', Q7860447 = 'Esth', Q1275774 = 'Est' },
		vl2 = 'Ester', wd = 'Q131068', group = 'Q19786', wp = 'Buch Ester',
		de = "[[Buch Ester]]"
	},
	{ -- 18
		vl1 = { Q875742 = 'JOB', Q7860447 = 'Job', Q1275774 = 'Hiob' },
		vl2 = 'Ijob', wd = 'Q4577', group = 'Q19786', wp = 'Ijob',
		de = "Buch [[Ijob]]"
	},
	{ -- 19
		vl1 = { Q875742 = 'PSA', Q7860447 = 'Ps', Q1275774 = 'Ps' },
		vl2 = 'Psalm', wd = 'Q41064', group = 'Q19786',
		wp = 'Buch der Psalmen', de = "[[Buch der Psalmen]]"
	},
	{ -- 20
		vl1 = { Q875742 = 'PRO', Q7860447 = 'Prov', Q1275774 = 'Spr' },
		vl2 = 'Sprüche', wd = 'Q4579', group = 'Q19786',
		wp = 'Buch der Sprichwörter',
		de = "[[Buch der Sprichwörter]] (Sprüche Salomos)"
	},
	{ -- 21
		vl1 = { Q875742 = 'ECC', Q7860447 = 'Eccl', Q1275774 = 'Pred' },
		vl2 = 'Prediger', wd = 'Q131072', group = 'Q19786', wp = 'Kohelet',
		de = "Buch [[Kohelet]] (Prediger Salomo)"
	},
	{ -- 22
		vl1 = { Q875742 = 'SNG', Q7860447 = 'Hld', Q1275774 = 'Hld' },
		vl2 = 'Hoheslied', wd = 'Q51670', group = 'Q19786', wp = 'Hoheslied',
		de = "[[Hoheslied|Hohelied]] Salomos (Lied der Lieder)"
	},
	{ -- 23
		vl1 = { Q875742 = 'ISA', Q7860447 = 'Isa', Q1275774 = 'Jes' },
		vl2 = 'Jesaja', wd = 'Q131458', group = 'Q19786', wp = 'Jesaja',
		de = "Buch [[Jesaja]]"
	},
	{ -- 24
		vl1 = { Q875742 = 'JER', Q7860447 = 'Jer', Q1275774 = 'Jer' },
		vl2 = 'Jeremia', wd = 'Q131590', group = 'Q19786', wp = 'Jeremia',
		de = "Buch [[Jeremia]]"
	},
	{ -- 25
		vl1 = { Q875742 = 'LAM', Q7860447 = 'Lam', Q1275774 = 'Klgl' },
		vl2 = 'Klagelieder', wd = 'Q179058', group = 'Q19786',
		wp = 'Klagelieder Jeremias',
		de = "Buch der [[Klagelieder Jeremias|Klagelieder]]"
	},
	{ -- 26
		vl1 = { Q875742 = 'EZK', Q7860447 = 'Ezek', Q1275774 = 'Hes' },
		vl2 = 'Ezechiel', wd = 'Q178390', group = 'Q19786', wp = 'Ezechiel',
		de = "Buch [[Ezechiel]] (Hesekiel)"
	},
	{ -- 27
		vl1 = { Q875742 = 'DAN', Q7860447 = 'Dan', Q1275774 = 'Dan' },
		vl2 = 'Daniel', wd = 'Q80115', group = 'Q19786', wp = 'Daniel',
		de = "Buch [[Daniel]]"
	},
	{ -- 28
		vl1 = { Q875742 = 'HOS', Q7860447 = 'Hos', Q1275774 = 'Hos' },
		vl2 = 'Hosea', wd = 'Q184030', group = 'Q19786', wp = 'Hosea',
		de = "Buch [[Hosea]]"
	},
	{ -- 29
		vl1 = { Q875742 = 'JOL', Q7860447 = 'Joel', Q1275774 = 'Joel' },
		vl2 = 'Joel', wd = 'Q131643', group = 'Q19786', wp = 'Joel',
		de = "Buch [[Joel]]"
	},
	{ -- 30
		vl1 = { Q875742 = 'AMO', Q7860447 = 'Amos', Q1275774 = 'Am' },
		vl2 = 'Amos', wd = 'Q174677', group = 'Q19786', wp = 'Amos',
		de = "Buch [[Amos]]"
	},
	{ -- 31
		vl1 = { Q875742 = 'OBA', Q7860447 = 'Obad', Q1275774 = 'Obd' },
		vl2 = 'Obadja', wd = 'Q174753', group = 'Q19786', wp = 'Obadja',
		de = "Buch [[Obadja]]"
	},
	{ -- 32
		vl1 = { Q875742 = 'JON', Q7860447 = 'Jonah', Q1275774 = 'Jona' },
		vl2 = 'Jona', wd = 'Q178819', group = 'Q19786', wp = 'Jona',
		de = "Buch [[Jona]]"
	},
	{ -- 33
		vl1 = { Q875742 = 'MIC', Q7860447 = 'Mic', Q1275774 = 'Mic' },
		vl2 = 'Micha', wd = 'Q178076', group = 'Q19786', wp = 'Micha',
		de = "Buch [[Micha]]"
	},
	{ -- 34
		vl1 = { Q875742 = 'NAM', Q7860447 = 'Nah', Q1275774 = 'Nah' },
		vl2 = 'Nahum', wd = 'Q179755', group = 'Q19786', wp = 'Nahum',
		de = "Buch [[Nahum]]"
	},
	{ -- 35
		vl1 = { Q875742 = 'HAB', Q7860447 = 'Hab', Q1275774 = 'Hab' },
		vl2 = 'Habakuk', wd = 'Q179760', group = 'Q19786', wp = 'Habakuk',
		de = "Buch [[Habakuk]]"
	},
	{ -- 36
		vl1 = { Q875742 = 'ZEP', Q7860447 = 'Zeph', Q1275774 = 'Zef' },
		vl2 = 'Zefanja', wd = 'Q188563', group = 'Q19786', wp = 'Zefanja',
		de = "Buch [[Zefanja]]"
	},
	{ -- 37
		vl1 = { Q875742 = 'HAG', Q7860447 = 'Hag', Q1275774 = 'Hag' },
		vl2 = 'Haggai', wd = 'Q178338', group = 'Q19786', wp = 'Haggai',
		de = "Buch [[Haggai]]"
	},
	{ -- 38
		vl1 = { Q875742 = 'ZEC', Q7860447 = 'Zech', Q1275774 = 'Sac' },
		vl2 = 'Sacharja', wd = 'Q179769', group = 'Q19786', wp = 'Sacharja',
		de = "Buch [[Sacharja]]"
	},
	{ -- 39
		vl1 = { Q875742 = 'MAL', Q7860447 = 'Mal', Q1275774 = 'Mal' },
		vl2 = 'Maleachi', wd = 'Q51675', group = 'Q19786', wp = 'Maleachi',
		de = "Buch [[Maleachi]]"
	},
	-- group = 'Q201410' is OT deuterocanonical'
	{ -- 40
		vl1 = { Q875742 = 'JDT', Q1275774 = 'Judit' },
		vl2 = 'Judit', wd = 'Q41064', group = 'Q201410', wp = 'Buch Judit',
		de = "[[Buch Judit]]"
	},
	{ -- 41
		vl1 = { Q875742 = 'WIS', Q7860447 = 'Weisheit', Q1275774 = 'Weisheit' },
		vl2 = 'Weisheit', wd = 'Q202135', group = 'Q201410',
		wp = 'Buch der Weisheit', de = "[[Buch der Weisheit]] Salomos"
	},
	{ -- 42
		vl1 = { Q875742 = 'TOB', Q7860447 = 'Tobit', Q1275774 = 'Tobit' },
		vl2 = 'Tobit', wd = 'Q131737', group = 'Q201410', wp = 'Buch Tobit',
		de = "[[Buch Tobit]]"
	},
	{ -- 43
		vl1 = { Q875742 = 'SIR', Q7860447 = 'Sirach', Q1275774 = 'Sirach' },
		vl2 = 'Sirach', wd = 'Q155980', group = 'Q201410', wp = 'Jesus Sirach',
		de = "Buch [[Jesus Sirach]] (Weisheit Sirachs)"
	},
	{ -- 44
		vl1 = { Q875742 = 'BAR', Q1275774 = 'Baruch' },
		vl2 = 'Baruch', wd = 'Q211746', group = 'Q201410', wp = 'Baruch',
		de = "Buch [[Baruch]]"
	},
	{ -- 45
		vl1 = { Q875742 = '1MA', Q1275774 = '1.Mak' },
		vl2 = '1.Makkabäer', wd = 'Q161985', group = 'Q201410',
		wp = '1. Buch der Makkabäer', de = "[[1. Buch der Makkabäer]]"
	},
	{ -- 46
		vl1 = { Q875742 = '2MA', Q1275774 = '2.Mak' },
		vl2 = '2.Makkabäer', wd = 'Q209748', group = 'Q201410',
		wp = '2. Buch der Makkabäer', de = "[[2. Buch der Makkabäer]]"
	},
	{ -- 47
		vl1 = { Q875742 = 'ESG' },
		vl2 = 'Stücke zu Ester', wd = 'Q5615312', group = 'Q201410',
		wp = 'Stücke zum Buch Ester', de = "[[Stücke zum Buch Ester]]"
	},
	{ -- 48
		vl1 = { Q875742 = 'DAG' },
		vl2 = 'Stücke zu Daniel', wd = 'Q116199760', group = 'Q29334',
		wp = 'Daniel#Christentum',
		de = "Stücke zum Buch [[Daniel#Christentum|Daniel]]"
	},
	-- group = Q29334 is LXX, not canonical
	{ -- 49
		vl1 = { Q875742 = 'MAN' },
		vl2 = 'Gebet Manasses', wd = 'Q41064', group = 'Q29334',
		wp = 'Gebet des Manasse', de = "[[Gebet des Manasse]]"
	},
	-- group = Q18813 is NT, canonical
	{ -- 50
		vl1 = { Q875742 = 'MAT', Q7860447 = 'Matt', Q1275774 = 'Mt' },
		vl2 = 'Matthäus', wd = 'Q392302', group = 'Q18813',
		wp = 'Evangelium nach Matthäus',
		de = "[[Evangelium nach Matthäus]]"
	},
	{ -- 51
		vl1 = { Q875742 = 'MRK', Q7860447 = 'Mark', Q1275774 = 'Mk' },
		vl2 = 'Markus', wd = 'Q107388', group = 'Q18813',
		wp = 'Evangelium nach Markus',
		de = "[[Evangelium nach Markus]]"
	},
	{ -- 52
		vl1 = { Q875742 = 'LUK', Q7860447 = 'Luke', Q1275774 = 'Lk' },
		vl2 = 'Lukas', wd = 'Q39939', group = 'Q18813',
		wp = 'Evangelium nach Lukas', de = "[[Evangelium nach Lukas]]"
	},
	{ -- 53
		vl1 = { Q875742 = 'JHN', Q7860447 = 'John', Q1275774 = 'Joh' },
		vl2 = 'Johannes', wd = 'Q36766', group = 'Q18813',
		wp = 'Evangelium nach Johannes',
		de = "[[Evangelium nach Johannes]]"
	},
	{ -- 54
		vl1 = { Q875742 = 'ACT', Q7860447 = 'Acts', Q1275774 = 'Apg' },
		vl2 = 'Apostelgeschichte', wd = 'Q41064', group = 'Q18813',
		wp = 'Apostelgeschichte des Lukas',
		de = "[[Apostelgeschichte des Lukas]]"
	},
	{ -- 55
		vl1 = { Q875742 = 'ROM', Q7860447 = 'Rom', Q1275774 = 'Rom' },
		vl2 = 'Römer', wd = 'Q48203', group = 'Q18813',
		wp = 'Brief des Paulus an die Römer',
		de = "[[Brief des Paulus an die Römer]]"
	},
	{ -- 56
		vl1 = { Q875742 = '1CO', Q7860447 = '1Cor', Q1275774 = '1.Kor' },
		vl2 = '1.Korinther', wd = 'Q80355', group = 'Q18813',
		wp = '1. Brief des Paulus an die Korinther',
		de = "[[1. Brief des Paulus an die Korinther]]"
	},
	{ -- 57
		vl1 = { Q875742 = '2CO', Q7860447 = '2Cor', Q1275774 = '2.Kor' },
		vl2 = '2.Korinther', wd = 'Q123808', group = 'Q18813',
		wp = '2. Brief des Paulus an die Korinther',
		de = "[[2. Brief des Paulus an die Korinther]]"
	},
	{ -- 58
		vl1 = { Q875742 = 'GAL', Q7860447 = 'Gal', Q1275774 = 'Gal' },
		vl2 = 'Galater', wd = 'Q128620', group = 'Q18813',
		wp = 'Brief des Paulus an die Galater',
		de = "[[Brief des Paulus an die Galater]]"
	},
	{ -- 59
		vl1 = { Q875742 = 'EPH', Q7860447 = 'Eph', Q1275774 = 'Eph' },
		vl2 = 'Epheser', wd = 'Q408673', group = 'Q18813',
		wp = 'Brief des Paulus an die Epheser',
		de = "[[Brief des Paulus an die Epheser]]"
	},
	{ -- 60
		vl1 = { Q875742 = 'PHP', Q7860447 = 'Phil', Q1275774 = 'Phil' },
		vl2 = 'Philipper', wd = 'Q51613', group = 'Q18813',
		wp = 'Brief des Paulus an die Philipper',
		de = "[[Brief des Paulus an die Philipper]]"
	},
	{ -- 61
		vl1 = { Q875742 = 'COL', Q7860447 = 'Col', Q1275774 = 'Kol' },
		vl2 = 'Kolosser', wd = 'Q131095', group = 'Q18813',
		wp = 'Brief des Paulus an die Kolosser',
		de = "[[Brief des Paulus an die Kolosser]]"
	},
	{ -- 62
		vl1 = { Q875742 = '1TH', Q7860447 = '1Thess', Q1275774 = '1.Thes' },
		vl2 = '1.Thessalonicher', wd = 'Q131115', group = 'Q18813',
		wp = '1. Brief des Paulus an die Thessalonicher',
		de = "[[1. Brief des Paulus an die Thessalonicher]]"
	},
	{ -- 63
		vl1 = { Q875742 = '2TH', Q7860447 = '2Thess', Q1275774 = '2.Thes' },
		vl2 = '2.Thessalonicher', wd = 'Q131107', group = 'Q18813',
		wp = '2. Brief des Paulus an die Thessalonicher',
		de = "[[2. Brief des Paulus an die Thessalonicher]]"
	},
	{ -- 64
		vl1 = { Q875742 = '1TI', Q7860447 = '1Tim', Q1275774 = '1.Tim' },
		vl2 = '1.Timotheus', wd = 'Q131180', group = 'Q18813',
		wp = '1. Brief des Paulus an Timotheus',
		de = "[[1. Brief des Paulus an Timotheus]]"
	},
	{ -- 65
		vl1 = { Q875742 = '2TI', Q7860447 = '2Tim', Q1275774 = '2.Tim' },
		vl2 = '2.Timotheus', wd = 'Q131489', group = 'Q18813',
		wp = '2. Brief des Paulus an Timotheus',
		de = "[[2. Brief des Paulus an Timotheus]]"
	},
	{ -- 66
		vl1 = { Q875742 = 'TIT', Q7860447 = 'Titus', Q1275774 = 'Tit' },
		vl2 = 'Titus', wd = 'Q131493', group = 'Q18813',
		wp = 'Brief des Paulus an Titus',
		de = "[[Brief des Paulus an Titus]]"
	},
	{ -- 67
		vl1 = { Q875742 = 'PHM', Q7860447 = 'Phlm', Q1275774 = 'Phlm' },
		vl2 = 'Philemon', wd = 'Q131104', group = 'Q18813',
		wp = 'Brief des Paulus an Philemon',
		de = "[[Brief des Paulus an Philemon]]"
	},
	{ -- 68
		vl1 = { Q875742 = 'HEB', Q7860447 = 'Heb', Q1275774 = 'Heb' },
		vl2 = 'Hebräer', wd = 'Q128608', group = 'Q18813',
		wp = 'Brief an die Hebräer', de = "[[Brief an die Hebräer]]"
	},
	{ -- 69
		vl1 = { Q875742 = 'JAS', Q7860447 = 'Jas', Q1275774 = 'Jak' },
		vl2 = 'Jakobus', wd = 'Q131097', group = 'Q18813',
		wp = 'Brief des Jakobus', de = "[[Brief des Jakobus]]"
	},
	{ -- 70
		vl1 = { Q875742 = '1PE', Q7860447 = '1Pet', Q1275774 = '1.Pet' },
		vl2 = '1.Petrus', wd = 'Q131119', group = 'Q18813',
		wp = '1. Brief des Petrus', de = "[[1. Brief des Petrus]]"
	},
	{ -- 71
		vl1 = { Q875742 = '2PE', Q7860447 = '2Pet', Q1275774 = '2.Pet' },
		vl2 = '2.Petrus', wd = 'Q131178', group = 'Q18813',
		wp = '2. Brief des Petrus', de = "[[2. Brief des Petrus]]"
	},
	{ -- 72
		vl1 = { Q875742 = '1JN', Q7860447 = '1John', Q1275774 = '1.Joh' },
		vl2 = '1.Johannes', wd = 'Q131101', group = 'Q18813',
		wp = '1. Brief des Johannes', de = "[[1. Brief des Johannes]]"
	},
	{ -- 73
		vl1 = { Q875742 = '2JN', Q7860447 = '2John', Q1275774 = '2.Joh' },
		vl2 = '2.Johannes', wd = 'Q131453', group = 'Q18813',
		wp = '2. Brief des Johannes', de = "[[2. Brief des Johannes]]"
	},
	{ -- 74
		vl1 = { Q875742 = '3JN', Q7860447 = '3John', Q1275774 = '3.Joh' },
		vl2 = '3.Johannes', wd = 'Q131462', group = 'Q18813',
		wp = '3. Brief des Johannes', de = "[[3. Brief des Johannes]]"
	},
	{ -- 75
		vl1 = { Q875742 = 'JUD', Q7860447 = 'Jude', Q1275774 = 'Judas' },
		vl2 = 'Judas', wd = 'Q131466', group = 'Q18813',
		wp = 'Brief des Judas', de = "[[Brief des Judas]]"
	},
	{ -- 76
		vl1 = { Q875742 = 'REV', Q7860447 = 'Rev', Q1275774 = 'Offb' },
		vl2 = 'Offenbarung', wd = 'Q42040', group = 'Q18813',
		wp = 'Offenbarung des Johannes',
		de = "[[Offenbarung des Johannes]]"
	},
	-- group = Q29334 is LXX, non canonical
	[85] = { -- 85: Daniel 13
		vl1 = { Q875742 = 'SUS' },
		vl2 = 'Susanna', wd = Q16930210, group = Q29334,
		wp = 'Susanna im Bade',
		de = "Kapitel von [[Susanna im Bade]] (Daniel 13)"
	},
	[86] = { -- 86: Daniel 14
		vl1 = { Q875742 = 'BEL' },
		vl2 = 'Bel und Drache', wd = Q218087, group = Q29334,
		wp = 'Bel und der Drache',
		de =	"Kapitel von [[Bel und der Drache|Bel und dem Drachen]] (Daniel"
			..	" 14)"
	},
	[87] = { -- 87: 3. Makkabäer
		vl1 = { Q875742 = '3MA' },
		vl2 = '3.Makkabäer', wd = Q223169, group = Q29334,
		wp = '3. Buch der Makkabäer', de = "[[3. Buch der Makkabäer]]"
	},
	[88] = { -- 88: 4. Makkabäer
		vl1 = { Q875742 = '4MA' },
		vl2 = '4.Makkabäer', wd = Q230255, group = Q29334,
		wp = '4. Buch der Makkabäer', de = "[[4. Buch der Makkabäer]]"
	},
	[89] = { -- 89: 3. Esra (Vul) is 1. Esdras, (LXX) as well
		vl1 = { Q875742 = '1ES' },
		vl2 = '3.Esra', wd = Q1200049, group = Q29334, wp = '3. Esra',
		de = "[[3. Esra|3. Buch Esra]] (1. Esdras)"
	},
	[90] = { -- 90: 4. Esra: Vul only, 2. part of 1. Esdras (LXX) as well
		vl1 = { Q875742 = '2ES' },
		vl2 = '4.Esra', wd = Q1200049, group = Q116215829,
		wp = '4. Buch Esra', de = "[[4. Buch Esra]]"
	},
	[91] = { -- 91:
		vl1 = { Q875742 = 'PSS' }, -- LXX only
		vl2 = 'Psalmen Salomos', wd = Q1418058, group = Q116215829,
		wp = 'Psalmen Salomos', de = "[[Psalmen Salomos]]"
	},
	[92] = {
		vl1 = { Q875742 = 'LJE'},
		vl2 = 'Baruch 6', wd = Q757010, group = Q116215829,
		wp = 'Brief des Jeremia', de = "[[Brief des Jeremia]]"
	},
	[93] = { -- 91:
		vl1 = { Q875742 = 'PS2' }, -- occasionally integrated into psamls
		vl2 = 'Psalm 151', wd = Q1052253, group = Q116215829, wp = 'Psalm 151',
		de = "[[Psalm 151]]"
	},
	[94] = { -- 94:
		vl1 = { Q875742 = 'LAO' }, -- VUL only
		vl2 = 'Laodizener', wd = Q1052253, group = Q116215829,
		wp = 'Laodizenerbrief', de = "[[Laodizenerbrief]]"
	}
}

--[[
	translation data
	keys are shown as short link text
	title		verbous with link to source description if available
	default		provider if not explicitely selected
	available
		key is the provider offering this version
		value: available book groups in this version and access info for version
			<group key> = true - statements as of book data groups
			link	URL portion specific to provider and translation
]]
local translationData = {
	AKJV = {
		title = "[[King-James-Bibel]] 1611 ([[Amerikanisches Englisch|AE]]-Schr"
			..	"eibweise 1999)",
		available = {
			Q7860447 = { Q19786 = true, Q18813 = true, link = "AKJV" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "AKJV" },
			'Q7860447'
		}
	},
	BHS = {
		title = "[[Biblia Hebraica Stuttgartensia]]", 
		available = {
			Q875742 = {
				Q19786 = true, link = "BHS"
			}
		},
		default = {
			{ Q19786 = true, link = "BHS" },
			'Q875742'
		}
	},
	EU = {
		title = "[[Einheitsübersetzung]] 2016",
		available = {
			Q1275774 = {
				Q19786 = true, Q201410 = true, Q18813 = true, link = "EU"
			}
		},
		default = {
			{ Q19786 = true, Q201410 = true, Q18813 = true, link = "EU" },
			'Q1275774'
		}
	},
	Elb = {
		title = "Elberfelder Bibel 2006",
		available = {
			Q1275774 = { Q19786 = true, Q18813 = true, link = "ELB" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "ELB" },
			'Q1275774'
		}
	},
	ESV = {
		title = "English Standard Version 2016",
		available = {
			Q1275774 = { Q19786 = true, Q18813 = true, link = "ESV" },
			Q7860447 = { Q19786 = true, Q18813 = true, link = "ESV" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "ESV" }, 
			'Q7860447'
		}
	},
	ESV2002 = {
		title = "English Standard Version 2002",
		available = {
			Q875742 = {
				Q19786 = true, Q18813 = true,
				link = "english-standard-version"
			}
		},
		default = {
			{
				Q19786 = true, Q18813 = true, link = "english-standard-version"
			},
			'Q875742'
		}
	},
	GNT5 = {
		title = "United Bible Societies: ''Greek New Testament''. "
			..	"5. Aufl., 2014",
		available = {	Q875742 = { Q18813 = true, link = "UBS5" }	},
		default = {
			{ Q18813 = true, link = "UBS5" },
			'Q875742'
		}
	},
	GerLut1545 = {
		title = "[[Lutherbibel#Die kursächsische Normbibel von 1581|Luther]]-Va"
			..	"riante, nach 1581",
		available = {
			Q7860447 = { Q19786 = true, Q18813 = true, link = "GerLut1545" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "GerLut1545" },
			'Q7860447'
		}
	},
	GerGruenewald = {
		title = "Grünewaldübersetzung 1924",
		available = {
			Q7860447 = { Q19786 = true, Q18813 = true, link = "GerGruenewald" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "GerGruenewald" },
			'Q7860447'
		}
	},
	GerSch = {
		title = "[[Schlachter–Bibel]] 1951",
		available = {
			Q7860447 = { Q19786 = true, Q18813 = true, link = "GerSch" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "GerSch" },
			'Q7860447'
		}
	},
	Hfa = {
		title = "''[[Hoffnung für alle]]''– Übersetzung 2015",
		available = {
			Q1275774 = { Q19786 = true, Q18813 = true, link = "HFA" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "HFA" },
			'Q1275774'
		}
	},
	KJV = {
		title = "[[King-James-Bibel]] 1769",
		available = {
			Q875742 = {
				Q19786 = true, Q18813 = true, link = "king-james-version"
			},
			Q1275774 = { Q19786 = true, Q18813 = true, link = "KJV" },
			Q7860447 = { Q19786 = true, Q18813 = true, link = "KJV" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "KJV" },
			'Q7860447'
		}
	},
	KJVA = {
		title = "[[King-James-Bibel]] mit Apokryphen, 1769",
		available = {
			Q7860447 = {
				Q18813 = true, Q19786 = true, Q201410 = true, Q29334 = true,
				link = "KJVA"
			}
		},
		default = {
			{
				Q18813 = true, Q19786 = true, Q201410 = true, Q29334 = true,
				link = "KJVA"
			},
			'Q7860447'
		}
	},
	Lut = {
		title = "[[Lutherbibel]] 2017",
		available = {
			Q1275774 = {
				Q19786 = true, Q201410 = true, Q18813 = true, link = "LUT"
			},
			Q875742 = {
				Q19786 = true, Q201410 = true, Q18813 = true, link = "LU17"
			}
		},
		default = {
			{ Q19786 = true, Q201410 = true, Q18813 = true, link = "LUT" },
			'Q1275774'
		}
	},
	Lut1984 = {
		title = "[[Lutherbibel]] 1984",
		available = {
			Q875742 = {
				Q19786 = true, Q201410 = true, Q18813 = true,
				link = "LU84"
			}
		},
		default = {
			{
				Q19786 = true, Q201410 = true, Q18813 = true,
				link = "LU84"
			},
			'Q875742'
		}
	},
	LXX = {
		title = "[[Septuaginta]] (LXX)",
		available = {
			Q875742 = {
				Q19786 = true, Q201410 = true, Q29334 = true,
				link = "septuaginta-lxx"
			},
			Q7860447 = { Q19786 = true, link = "LXX" }
		},
		default = {
			{
				Q19786 = true, Q201410 = true, Q29334 = true,
				link = "septuaginta-lxx"
			},
			'Q875742'
		}
	},
	['NeÜ'] = {
		title = "Neue evangelistische Übersetzung",
		available = {
			Q1275774 = { Q19786 = true, Q18813 = true, link = "Ne%C3%9C" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "Ne%C3%9C" },
			'Q1275774'
		}
	},
	['NGÜ'] = {
		title = "[[Neue Genfer Übersetzung]]",
		available = {
			Q1275774 = { Q19786 = true, Q18813 = true, link = "NG%C3%9C" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "NG%C3%9C" },
			'Q1275774'
		}
	},
	NA28 = {
		title = "Nestle, Aland: ''[[Novum Testamentum Graece]]''. 28. Aufl., 2012",
		available = {
			Q875742 = {
				Q18813 = true, link = "NA28"
			}
		},
		default = {
			{
				Q18813 = true, link = "NA28"
			},
			'Q875742'
		}
	},
	NASB = {
		title = "[[New American Standard Bible]] 2020",
		available = {
			Q7860447 = { Q19786 = true, Q18813 = true, link = "NASB2020" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "NASB2020" },
			'Q7860447'
		}
	},
	NASB1995 = {
		title = "[[New American Standard Bible]] 1995",
		available = {
			Q7860447 = { Q19786 = true, Q18813 = true, link = "NASB1995" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "NASB1995" },
			'Q7860447'
		}
	},
	NIV = {
		title = "[[New International Version]] 2011",
		available = {
			Q1275774 = { Q19786 = true, Q18813 = true, link = "NIV" },
			Q7860447 = { Q19786 = true, Q18813 = true, link = "NIV" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "NIV" },
			'Q7860447'
		}
	},
	NIrV = {
		title = "New International Readers Version 2014/2021",
		available = {
			Q1275774 = { Q19786 = true, Q18813 = true, link = "NIRV" },
			Q7860447 = { Q19786 = true, Q18813 = true, link = "NIrV" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "NIV" },
			'Q7860447'
		}
	},
	OHB = {
		title = "[[Westminster Leningrad Codex]]",
		available = {
			Q7860447 = { Q19786 = true, link = "OHB" }
		},
		default = {
			{ Q19786 = true, link = "OHB" },
			'Q7860447'
		}
	},
	Slt = {
		title = "[[Schlachter-Bibel]] 2000",
		available = {
			Q1275774 = {
				Q19786 = true, Q201410 = true, Q18813 = true, link = "SLT"
			}
		},
		default = {
			{ Q19786 = true, Q201410 = true, Q18813 = true, link = "SLT" },
			'Q1275774'
		}
	},
	THGNT = {
		title = "Tyndale House [[Greek New Testament]], 2017",
		available = {
			Q7860447 = { Q18813 = true, link = "THGNT" }
		},
		default = {
			{ Q18813 = true, link = "THGNT" },
			'Q7860447'
		}
	},
	THOT = {
		title = "Translators Hebrew Old Testament, 2019",
		available = {
			Q7860447 = { Q19786 = true, link = "THOT" }
		},
		default = {
			{ Q19786 = true, link = "THOT" },
			'Q7860447'
		}
	},
	VulgCC = {
		title = "[[Vulgata Clementina]], ed. Conte 2009",
		available = {
			Q7860447 = { Q19786 = true, Q18813 = true, link = "VulgCC" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "VulgCC" },
			'Q7860447'
		}
	},
	VulgEQ = {
		title = "[[Vulgata]], ed. quinta 2007",
		available = {
			Q875742 = {
				Q19786 = true, Q18813 = true, Q201410 = true, Q29334 = true,
				Q116215829 = true, link = "biblia-sacra-vulgata"
			}
		},
		default = {
			{
				Q19786 = true, Q18813 = true, Q201410 = true, Q29334 = true,
				Q116215829 = true, link = "biblia-sacra-vulgata"
			},
			'Q875742'
		}
	},
	VulgJ = {
		title = "[[Vulgata]], Hieronimus 405",
		available = {
			Q7860447 = { Q19786 = true, Q18813 = true, link = "VulgJ" }
		},
		default = {
			{ Q19786 = true, Q18813 = true, link = "VulgJ" },
			'Q7860447'
		}
	},
	-- Wulfila = do not enter! no complete group available; usable w/o entering
	ZB = {
		title = "[[Zürcher Bibel]] 2007",
		available = {
			Q1275774 = {
				Q19786 = true, Q201410 = true, Q18813 = true, link = "ZB"
			}
		},
		default = {
			{ Q19786 = true, Q201410 = true, Q18813 = true, link = "ZB" },
			'Q1275774'
		}
	}
}
translationData.ELB = translationData.Elb
translationData.ESV2016 = translationData.ESV
translationData.KJB = translationData.KJV
translationData.HFA = translationData.Hfa
translationData.LUT = translationData.Lut
translationData.Lut1545 = translationData.GerLut1545
translationData.Lut2017 = translationData.Lut
translationData.LU17 = translationData.Lut
translationData.Lut84 = translationData.Lut1984
translationData.LU84 = translationData.Lut1984
translationData.NA = translationData.NA28
translationData.NASB2020 = translationData.NASB
translationData.NIRV = translationData.NIrV
translationData.SLT = translationData.Slt
translationData.Slt1951 = translationData.GerSch
translationData.Slt2000 = translationData.Slt
translationData.UBS5 = translationData.GNT5
translationData.Vg = translationData.VulgEQ
translationData.Vul = translationData.VulgCC
translationData.VUL = translationData.VulgCC
translationData.Vulg = translationData.VulgEQ
translationData.WLC = translationData.OHB


--[[
	Provider
	bible text provider data object
	known entities: Q875742, Q1275774 and Q7860447 (constant members)
	fields:
		key			Wikidata item key
		name		domain name to be used for display as well
		urlForm		string for generating link
	methods:
		getPosition(chapter, verses)
			provider specific way of generating a position representation to be
			passed to the provider via URL (chapter + verses)
			parameters:
				chapter	number (mandantory)
				verses	optional 1-2 numbers hyphen separated
			returns:	single string representation for position
		getErrorMsg(base)
			generate error messages based on provider name and base infos
			parameters:
				base.err	error number 
				base.title	(err = 4, 5) title of a version
				base.vl3	(err = 5) title of a book
]]
local Provider = {
	-- Methods --
	getErrorMsg = function(this, base)
		if base.err < 4 then
			return base.full .. '[[Kategorie:Wikipedia:Qualitätssicherung Vorla'
				.. 'geneinbindung fehlerhaft]]'
		elseif Base.err == 4 then
			return 'Für ' .. base.title .. ' stellt ' .. this.name
				.. ' keine Daten bereit.[[Kategorie:Wikipedia:Qualitätssicherun'
				.. 'g Vorlageneinbindung fehlerhaft]]'
		elseif Base.err == 5 then
			return base.vl3 .. ' ist in der von ' .. this.name .. ' bereitgeste'
				.. 'llten ' .. base.title .. 'nicht verfügbar.[[Kategorie:Wikip'
				.. 'edia:Qualitätssicherung Vorlageneinbindung fehlerhaft]]'
		end
	end
}

--[[
	constructor
	Provider objects are constant members of Provider table
	parameters:
		o	all object data in a predefined struct
	returns:	the struct enriched by a method and 'self' access
]]
function Provider:new(o)
	if not o or not o.urlForm or not o.getPosition then return nil end
	local result = o
	setmetatable(result, self)
	self.__index = self
	table.insert(Provider, result) -- for numeric access
	return result
end

-- functions --

--[[
	get provider Object(<provider entry>)
	interface between transCode.tcPrv, users provider selection and provider
	object
	Parameters:
		bkEntry	distinct string representation of a provider name: shortening of
				provider or domain name or Wikidata key
	returns:	provider object (selected - not newly created)
]]
local getProviderObject = function(input)
	if not input then return nil end
	local result = transCode.tcPrv[input]
	if not result then return nil end
	return Provider[result]
end

-- provider data:
Provider.Q875742 = Provider:new({
		key = 'Q875742',
		name = 'bibelwissenschaft.de',
		getPosition = function(chapter, verses)
			if not chapter then return '1' end
			-- cannot handle pan chapter span
			while type(chapter) == 'table' do chapter = chapter[1] end
			-- limited verses handling available at bibelwissenschaft.de
			if verses then
				if type(verses) == 'string' then
					local v = { verses:match('(%d+)%s*%-%s*(%d+)') }
					if v and v[2] then
						return chapter .. '.' .. v[1]
					end
					v = {verses:match('(%d+)%s*(f+)')}
					if v and v[1] then
						return chapter .. '.' .. v[1]
					end
					return chapter .. '.' .. verses:match('%d+')
				elseif type(verses) == 'number' then
					return chapter .. '.' .. verses
				end
				return chapter
			end
			return chapter
		end,
		-- urlForm: parameters: <version link>, <book link>, <position link>
		urlForm = {	'https://www.bibelwissenschaft.de/bibel/',
					'/', '.', '' },
		-- default version: parameters: struct (with book and position)
		defaultVer = function(bookPos)
			if type(bookPos) == 'table' then
				bookPos.version = 'Lut'
				bookPos.link = 'LU17'
				bookPos.title = translationData.Lut.title
			end
			return bookPos
		end
	})
Provider.Q1275774 = Provider:new({
		key = 'Q1275774',
		name = 'bibleserver.com',
		getPosition = function(chapter, verses)
			local position = ''
			if not chapter then return '1' end
			-- handle pan chapter span
			if type(chapter) == 'table' then
				local s = chapter[1]
				local e = chapter[2]
				return s[1] .. ',' .. s[2] .. 'ff'
			end
			position = chapter
			if verses then
				verses = verses:gsub('%s', '')
				return position .. ',' .. verses
			end
			return position
		end,
		-- urlForm: parameters: <version link>, <book link>, <position link>
		urlForm = {	'https://www.bibleserver.com/', '/', '%20', '' },
		-- default version: parameters: struct with book (and position)
		defaultVer = function(bookPos)
			if type(bookPos) == 'table' then
				local td = translationData.EU
				if td.available['Q1275774'][bookPos.book.group] then
					bookPos.version = 'EU'
					bookPos.link = td.default[1].link
					bookPos.title = td.title
					return bookPos
				end
				return frameRed(bookPos.book.de
						  ..	' ist auf bibleserver.com nicht verfügbar.')
			end
			return bookPos
		end
	})
Provider.Q7860447 = Provider:new({
		key = 'Q7860447',
		name = 'stepbible.org',
		getPosition = function(chapter, verses)
			local position = ''
			if not chapter then return '1' end
			-- handle pan chapter span
			if type(chapter) == 'table' then
				local s = chapter[1]
				local e = chapter[2]
				return s[1] .. ':' .. s[2] .. '-' .. e[1] .. ':' .. e[2]
			end
			position = chapter
			if verses then
				verses = verses:gsub('%s', '')
				return position .. ':' .. verses
			end
			return position:gsub(',', ':')
		end,
		urlForm = {	"https://www.stepbible.org/?q=version=", "%7Creference=",
					'%20', "&display=INTERLEAVED" },
		-- default version: parameters: struct with book (and position)
		defaultVer = function(bookPos)
			if type(bookPos) == 'table' then
				if bookPos.book.group == 'Q19786' then
					bookPos.link = 'OHB%7Cversion=NASB2020%7Cversion=GerSch'
				elseif bookPos.book.group == 'Q18813' then
					bookPos.link = 'THGNT%7Cversion=NASB2020%7Cversion=GerSch'
				else
					return frameRed(bookPos.book.de
						  ..	' ist auf STEPbible.org nicht verfügbar.')
				end
				bookPos.version = 'interlinear'
				bookPos.title = 'Interlinearübersetzung'
				return bookPos
			end
			return bookPos
		end
	})

--[[
	Book object
	fields:
		number	as of as of bookData / bibelwissenschaft.de key
		vl1		URL book representation (array with one value per provider)
		vl2		book label (short form)
		de		book title (long form with link to wiki)
		wd		Wikidata item key (currently unused)
		group	most significant Wikidata item P361 (part of) property value
	Methods:
		Book:versionLists(version) - description below
]]
local Book = {
	--[[
		Book:versionLists(version)
		parses and refines version string
		parameters:
			this	Book object or bookData entry
			version	comma separated list of version keys
		returns:	struct with version link portion per provider or 
					struct with err message
	]]
	versionLists = function(this, version)
		if version and version ~= '' then
			local list = mw.text.split(version, '%p%s?')
			if #list == 1 then
				local td = translationData[version]
				if td then
					local result = {
						err =	this.de .. ' steht in ' .. version
							..	' nicht zur Verfügung.'
					}
					for k, list in pairs(td.available) do
						if list[this.group] then
							result[k] = list.link
							result.err = nil
						end
					end
					return result
				end
				-- single unknown version (not in bibelwissenschaft.de)
				return { Q7860447 = version, Q1275774 = version }
			end
			-- multiple versions (not in bibelwissenschaft.de)
			local prov = { Q7860447 = {}, Q1275774 = {} }
			for _, ver in ipairs(list) do
				local td = translationData[ver]
				if td then
					-- test found known version for providing this book
					for k, __ in pairs(prov) do
						local groups = td.available[k]
						if groups and groups[this.group] then
							table.insert(prov[k], ver)
						else
							prov[k] = nil
							if not prov.Q7860447 and not prov.Q1275774 then
								return { err = 'Kein Anbieter stellt '
											.. table.concat(list, '.')
											.. ' mit [[' .. this.wp
											.. ']] zur Verfügung!' }
							end
						end
					end
				else
					-- add unknown version
					if prov.Q7860447 then table.insert(prov.Q7860447, ver) end
					if prov.Q1275774 then table.insert(prov.Q1275774, ver) end
				end
			end
			if prov.Q7860447 then
			  prov.Q7860447 = table.concat(prov.Q7860447, '%7Cversion=')
			end
			if prov.Q1275774 then
				prov.Q1275774 = table.concat(prov.Q1275774, '.')
			end
			return prov
		else
			-- no version given; return all available
			-- (unused; not needed yet)
			return nil
		end
	end
}

--[[
	constructor
	parameters:
		name	<book entry> -	distinct string representation of a book name:
								short name or usual shortening
]]
function Book:new(name)
	-- get book number section:
	local defFull = name:match('%s?Buch d?e?r?%s?')
	if not defFull then defFull = name:match(' voll') end
	if defFull then name = name:gsub(defFull, ' ') end
	local n = transCode.tcBk[name]
	if not n then n = transCode.tcBk[mw.ustring.sub(name, 1, 4)] end
	if not n then n = transCode.tcBk[mw.ustring.sub(name, 1, 3)] end
	if not n then n = transCode.tcBk[mw.ustring.sub(name, 1, 2)] end
	if not n then
		local t = {mw.ustring.match(name, '(%d)%.?%s?(%u%l%l?)')}
		if t and t[2] then
			t = table.concat(t)
			n = transCode.tcBk[t]
			if not n then n = transCode.tcBk[t:sub(1, 3)] end
		end
	end
	if not n then n = transCode.tcBk[mw.ustring.match(name, '^%S+')] end
	if not n then return nil end
	-- object construction section
	local result = bookData[n]
	result.number = n
	if defFull then
		result.label = result.de
	else
		local n = #name - #result.vl2
		n = n * n
		if n < 2 then
			result.label = result.vl2
		else
			result.label = result.vl1.Q1275774
			if not result.label then result.label = result.vl1.Q7860447 end
			if not result.label then result.label = result.vl2 end
		end
	end
	local la = { result.label:match('(%d%.)(%u.*)') }
	if la[2] then result.label = la[1] .. '&nbsp;' .. la[2] end
	setmetatable(result, self)
	self.__index = self
	return result
end

--[[
	get a string for availability of providers
	parameters
		source		table with given keys
		indexList	source keys (optional)
					default: {Q875742, Q1275774, Q7860447} if nil
		available	indecating string or table of indicating strings
					default: 'x' if nil
		concatenator (optional) default: ' || ' if nil
]]
getAvailableString = function(source, indexList, available, concatenator)
	if source == nil then return ' interner Fehler: getAvailableString(nil)' end
	if type(source) ~= "table" then
		 return ' interner Fehler: getAvailableString(mono)'
	end
	if (indexList == nil) or (not indexList) then
		indexList = {"Q875742", "Q1275774", "Q7860447"}
	elseif type(indexList ~= table) then
		indexList = {indexList}
	end
	if concatenator == nil then concatenator = ' || ' end
	if (available == nil) or (not available) then
		available = {}
		for i, v in ipairs(indexList) do available[i] = 'x' end
	elseif type(available) ~= table then
		local a = available
		available = {}
		for i, v in ipairs(indexList) do available[i] = a end
	end
	local result = ""
	local s = source[indexList[1]]
	if s then result = available[1] end
	local i = 2
	while indexList[i] do
		if source[indexList[i]] then
			if result ~= "" or concatenator == ' || ' then
				result = result .. concatenator
			end
			result = result .. available[i]
		elseif concatenator == ' || ' then
			result = result .. ' || '
		end
		i = i + 1
	end
	return result
end

local p = {
}

--[[
	{{#invoke:Bibel|allBooks}}
	list all books known to this module
]]
p.allBooks = function(frame)
	local result = '{| class="wikitable zebra references"\n|+ Liste der biblisc'
				.. 'hen und einiger [[Apokryphen|apokrypher]] Bücher'
				.. '\n! colspan="2" style="text-align:right;" | Verfügbarkeit:'
				.. '\n! rowspan="2" style="writing-mode: vertical-rl; text-ori'
				.. 'entation: mixed;padding: 0 1em 0 0;"|'
				.. Provider.Q875742.name
				.. '|| rowspan="2" style="writing-mode: vertical-rl; text-orie'
				.. 'ntation: mixed;padding: 0 1em 0 0;" |'
				.. Provider.Q1275774.name
				.. '|| rowspan="2" style="writing-mode: vertical-rl; text-orie'
				.. 'ntation: mixed;padding: 0 1em 0 0;" |'
				.. Provider.Q7860447.name .. '\n|-\n! Buch || Titel\n'
	for _, v in ipairs(bookData) do
		result =	result .. '\n|- id="' .. (v.vl1.Q1275774 or v.vl2 or ' ')
				..	'"\n| ' .. (v.vl1.Q1275774 or v.vl2 or ' ')
				..	' ||<span class="reference-text">' .. v.de .. '</span> || '
				..	getAvailableString(v.vl1)
	end
	for i = 85, 92 do
		local v = bookData[i]
		result =	result .. '\n|- id="' .. (v.vl1.Q1275774 or v.vl2 or ' ')
				..	'"\n| ' .. (v.vl1.Q1275774 or v.vl2 or ' ')
				..	' ||<span class="reference-text">' .. v.de .. '</span> || '
				..	getAvailableString(v.vl1)
	end
	return frame:preprocess(result .. '\n|}')
end

--[[
	{{#invoke:Bibel|validBk|<book name>}}
	list a single book if known to this module; error otherwise
]]
p.validBk = function(frame)
	local book = frame.args.book
	if not book then book = frame.args[1] end
	if not book then
		local args = frame:getParent().args
		book = args.book
		if not book then book = args[1] end
		if not book then return '<span style="color:red">Kein Buch angegeben.<'
							..	'/span>[[Kategorie:Wikipedia:Qualitätssicherun'
							..	'g Vorlageneinbindung fehlerhaft]]'
		end
	end
	local b = Book:new(book)
	if not b then
		return '<span style="color:red">Kein Buch "' .. book
			.. '" im Modul STEP bekannt!</span>[[Kategorie:'
			.. 'Wikipedia:Qualitätssicherung Vorlageneinbindung fehlerhaft]]'
	end
	local avStr = 	getAvailableString(	v.vl1, nil,
			  							{
			  								Provider.Q875742.name,
			  								Provider.Q1275774.name,
			  								Provider.Q7860447.name
			  							}, ' und ')
	local result =	'{{Literatur/mit Anker|Titel=' .. b.de .. ' |ID=' .. b.vl2
			  ..	' |Kommentar=Quellen '
	if avStr == '' then result = result .. 'bei keinem Anbieter verfügbar!}}'
	else result = result .. 'verfügbar unter ' .. avStr .. ' }}' end
	return frame:preprocess(result)
end

p.knownVersions = function(frame)
	local result = '{| class="wikitable zebra sortable references"\n|+ Liste d'
				.. 'er im Modul bereits bekannten Bibelversionen'
				.. '\n! colspan="2" style="text-align:right;" | Verfügbarkeit:'
				.. '\n! rowspan="2" style="writing-mode: vertical-rl; text-ori'
				.. 'entation: mixed;padding: 0 1em 0 0;"|'
				.. Provider.Q875742.name
				.. '|| rowspan="2" style="writing-mode: vertical-rl; text-orie'
				.. 'ntation: mixed;padding: 0 1em 0 0;" |'
				.. Provider.Q1275774.name
				.. '|| rowspan="2" style="writing-mode: vertical-rl; text-orie'
				.. 'ntation: mixed;padding: 0 1em 0 0;" |'
				.. Provider.Q7860447.name
				.. '\n|-\n! Schlüssel || Beschreibung\n'
	for k, v in pairs(translationData) do
		result =	result .. '\n|- id="' .. k .. '"\n| ' .. k
				..	' || class="reference-text" | ' ..	v.title .. ' || '
				..	getAvailableString(v.available)
	end
	return frame:preprocess(result .. '\n|}')
end

--[[
	frameRed(text)
	enrich an error text
	parameters:
		text	string to be enriched or
				table with an optional err field that has to be enriched
	returns:	table with an enriched err field or unalterred table
]]
local function frameRed(text)
	if type(text) ~= 'table' then
		return {
			err =	'<span style="color:red">' .. text
			  ..	'</span>[[Kategorie:Wikipedia:Qualitätssicherung Vorlagene'
			  ..	'inbindung fehlerhaft]]'
		}
	end
	if text.err and not text.err:find('color.red') then
		text.err =	'<span style="color:red">' .. text.err
			  ..	'</span>[[Kategorie:Wikipedia:Qualitätssicherung Vorlagene'
			  ..	'inbindung fehlerhaft]]'
	end
	return text
end

--[[
	handle named and unnamed args
	get necessary common data for link to bible full text
	parameters:
		version		optional short string key
					default: EU if within its scope; Lut1984 otherwise
		provider	optional Wikidata key for external link target domain
					default: wherever given version is available
		link		optional version url part if version is unknown here
					default: copy of version
	returns struct:
		vl1			book link for provider
		vl2			dep. short book name
		vl3			dep. full book name with link
		link		translation link
		version		short translation name
		title		full translation name with link
		provider	Wikidata key for external link target domain
		err			error number if not all other parameters could be provided
]]
local function parseArgs(frame)
	local result = {}
	local args = frame.args
	result.book = args.book
	local i = 1
	if args[1] and args[1]:find('%u') and not result.book then
		result.book = args[1]
		i = 2
	end
	if not result.book then
		args = frame:getParent().args
		result.book = args.book
		if args[1] and args[1]:find('%u') and not result.book then
			result.book = args[1]:match('^%s*(%S.*%S)%s*$')
			i = 2
		end
		if not result.book then return frameRed('Kein Buch angegeben.') end
	end
	local b = Book:new(result.book)
	if not b then
		return frameRed('Kein Buch "' .. result.book
					..	'" im Modul:Bibel bekannt!')
	end
	result.book = b
	result.chapter = args.chapter
	local vls = nil
	if result.chapter then result.verses = args.verses
	-- fetch chapter & verses by # only if book has been fetched by # as well:
	elseif i == 2 and args[2] then
		if args[2] then
			local s = mw.ustring.gsub(args[2], '–', '-')
			s = {
				s:match('^%s*(%d+[%,%:]?%s*%d*)[abc]?%s*%-?%s*(%d*[%,%:]?%s*%d*'
					..	')[abc]?%s*$')
			}
			if s and s[1] then
				-- chapter and possibly more found
				-- args[2] is chapter or complete position
				i = 3
				local s1 = { s[1]:match('(%d+)[%,%:]?%s*(%d*)[abc]?') }
				if s[2] == '' then
					-- single chapter or verse found (no span)
					result.chapter = s1[1]
					if s1[2] ~= '' then
						-- Single verse found. Don't ask for verses param!
						result.verses = s1[2]:match('%d+')
					elseif args[3] then
						-- test 3rd param on being verses param
						s = mw.ustring.gsub(args[3], '–', '-')
						s = {s:match('^%s*(%d+)[abc]?%s*%-?%s*(%d*)[abc]?%s*$')}
						if s and s[2] and s[2] ~= '' then
							result.verses = table.concat(s, '-')
							i = 4
						elseif s and s[1] then
							result.verses = s[1]
							i = 4
						elseif args[3]:match('%d.*[%.%;%,].*%d') then
							return frameRed('Falsches Format! Bitte keine Liste'
										..	'n angeben.')
						else
							s = {args[3]:match('(%d+)[abc]?%s*(f+)')}
							if s and s[2] then
								result.verses = table.concat(s)
								i = 4
							end
						end
					end
				else
					-- Span found. Test end on containing a chapter!
					local s2 = { s[2]:match('(%d+)[%,%:]?%s*(%d*)[ab]?') }
					if s2[2] == '' then
						-- End is verse in same chapter
						result.chapter = s1[1]
						result.verses = s1[2] .. '-' .. s2[1]
					else
						if s1[1] == s2[1] then
							-- End is verse in same chapter
							result.chapter = s1[1]
							result.verses = s1[2] .. '-' .. s2[2]
						else
							-- End is verse in another chapter
							result.chapter = { s1, s2 }
						end
					end
				end
			elseif args[2]:match('%d.*[%.%;].*%d') then
				-- args[2] is a list of positions. Use a list of calls instead!
				return frameRed('Falsches Format! Bitte keine Listen angeben.')
			end
			-- args[2] handled; must be position
		end
		-- omit empty numbered args
		while args[i] and (args[i] == '' or args[i]:find('^%s*$')) do
			i = i + 1
		end
		-- Next arg may be provider or version. If both, version is first.
		-- First ask for provider (version left out) because its distinct!
		result.provider = getProviderObject(args[i])
		if not result.provider then
			-- try reading version from same arg
			vls = result.book:versionLists(args[i])
			if vls then
				-- Din't throw vls.err here! (could be provider instead)
				-- But if not vls.err then use vls, reserve its arg and try
				-- using its successor for provider.
				if not vls.err then
					i = i + 1
					result.provider = getProviderObject(args[i])
				end
			else
				vls = result.book:versionLists(args.version)
				-- rare err: throw later
			end
		end
		if not result.provider then
			if args[i] then
				if vls and vls.err then return frameRed(vls.err) end
				-- args[i] for provider available but invalid
				return frameRed('Unbekannter Anbieter: ' .. args[i])
			end
			result.provider = getProviderObject(args.provider)
		end
	else
		vls = result.book:versionLists(args.version)
		result.provider = getProviderObject(args.provider)
	end
	if result.provider then
		-- args[i] available and valid provider
		result.vl1 = result.book.vl1[result.provider.key]
		if not result.vl1 then
			return frameRed(result.book.de .. ' steht bei '
						..	result.provider.name .. ' nicht zur Verfügung.')
		end
		if vls then
			assert(vls ~= nil)
			-- version(s) available
			result.link = vls[result.provider.key]
			if result.link then
				if result.link:find('version') then
					result.version = 'interlinear'
					result.title = "Interlinearübersetzung"
				else
					result.version = result.link
					local td = translationData[result.link]
					if td then result.title = td.title
					else result.title = result.link .. '(unbekannt)' end
				end
				return result
			end
			for _, v in pairs(vls) do
				return frameRed(result.book.de .. ' steht in der Version ' .. v
							..	' bei '.. result.provider.name
							..	' nicht zur Verfügung.')
			end
		end
		-- no version was given
		return result.provider.defaultVer(result)
	else
		-- -> no provider given
		if vls then
			-- version given
			if vls.err then return frameRed(vls.err) end
			-- return best provider
			if vls.Q7860447 then
				-- 1. interlinear available and biggest number of versions
				result.link = vls.Q7860447
				if result.link:find('version') then
					result.version = 'interlinear'
					result.title = "Interlinearübersetzung"
				else
					result.version = result.link
					local td = translationData[result.link]
					if td then result.title = td.title
					else result.title = result.link .. '(unbekannt)' end
				end
				result.provider = Provider.Q7860447
				result.vl1 = result.book.vl1.Q7860447
			elseif vls.Q1275774 then
				-- 2. best German translations readable side by side
				result.link = vls.Q1275774
				result.version = result.link
				if result.link:find('%p') then
					result.title = "Parallelanzeige"
				else
					local td = translationData[result.link]
					if td then result.title = td.title
					else result.title = result.link .. '(unbekannt)' end
				end
				result.provider = Provider.Q1275774
				result.vl1 = result.book.vl1.Q1275774
			else
				-- (happens for single known version only)
				-- 3. biggest number of books in high qualitiy versions
				local td = translationData[vls.Q875742]
				result.link = td.available.Q875742.link
				result.version = vls.Q875742
				result.title = td.title
				result.provider = Provider.Q875742
				result.vl1 = result.book.vl1.Q875742
			end
		-- no version given else cases:
		elseif result.book.group == 'Q19786'
		or result.book.group == 'Q18813'
		or result.book.group == 'Q201410' then
			local td = translationData.EU
			result.link = td.available.Q1275774.link
			result.version = 'EU'
			result.title = td.title
			result.provider = Provider.Q1275774
			result.vl1 = result.book.vl1.Q1275774
		else
			local td = translationData.Lut1984
			result.link = td.available.Q875742.link
			result.version = 'Lut1984'
			result.title = td.title
			result.provider = Provider.Q875742
			result.vl1 = result.book.vl1.Q875742
		end -- version or not; any book group
	end -- provider or not
	return result
end

--[[
	=> Vorlage:Bpur
	returns link only
]]
p.pur = function(frame)
	local base = parseArgs(frame)
	if base.err then return base.err end
	local pos = base.provider.getPosition(base.chapter, base.verses)
	local f = base.provider.urlForm
	return '<small class="noprint" title="' .. base.title .. ' bei '
		.. base.provider.name .. '">[' .. f[1] .. base.link .. f[2]
		.. base.vl1 .. f[3] .. pos .. f[4] .. ' '
		.. base.version .. ']</small>'
end

local function posLabel(pos)
	local result = pos:gsub(':', ',')
	result = mw.ustring.gsub(result, '(%d)%f[f]', '%1&nbsp;') 
	return mw.ustring.gsub(result, '-', '–') 
end

--[[
	=> Vorlage:BB
	returns pos and link
]]
p.pos = function(frame)
	local base = parseArgs(frame)
	if base.err then return base.err end
	local pos = base.provider.getPosition(base.chapter, base.verses)
	local f = base.provider.urlForm
	return posLabel(pos) .. ' <small class="noprint" title="' .. base.title
		.. ' bei ' .. base.provider.name .. '">[' .. f[1] .. base.link .. f[2]
		.. base.vl1 .. f[3] .. pos .. f[4] .. ' '
		.. base.version .. ']</small>'
end

--[[
	=> Vorlage:B
	returns book, pos and link
]]
p.Bpos = function(frame)
	local base = parseArgs(frame)
	if base.err then return base.err end
	local pos = base.provider.getPosition(base.chapter, base.verses)
	local f = base.provider.urlForm
	local result = ''
	local noSelf = ' '
	if (	base.book.wp ~= mw.title.getCurrentTitle().text
		and	base.book.wp ~= mw.title.getCurrentTitle().prefixedText
		and not base.book.label:find('%[%[')) then
		result = '[[' .. base.book.wp .. '|'
		noSelf = ']] '
	end
	result = result .. base.book.label .. noSelf .. posLabel(pos)
	return result .. ' <small class="noprint" title="' .. base.title
		.. ' bei ' .. base.provider.name .. '">[' .. f[1] .. base.link
		.. f[2] .. base.vl1 .. f[3] .. pos .. f[4] .. ' '
		.. base.version .. ']</small>'
end

return p