Module:Bibleverse
لاسوند لپاره ددې موډيول کېدای سی په Module:Bibleverse/لاسوند کي وي
-- This module implements Template:Bibleverse.
local numConv = require('Module:Numeral converter').convert
local yesno = require('Module:Yesno')
local p = {}
--codes from bvf that may be in use
local version_num_codes = {
[9] = 'kjv', [31] = 'niv', [45] = 'amp', [49] = 'nasb', [64] = 'nivuk',
[51] = 'nlt', [65] = 'msg', [76] = 'nirv', [105] = 'he', [104] = 'jps',
[120] = 'opb', [121] = 'bb', [122] = 'bbc', [123] = 'bbl', [131] = 'nrsv',
}
--possible book inputs, based on Chicago Manual
local book_aliases = {
['genesis'] = {'gen', 'gn', 'پيدايښت', 'برشیت'}, --old testament/tanakh
['exodus'] = {'exod', 'ex', 'خروج', 'شموت'},
['leviticus'] = {'lev', 'lv', 'لاویان', 'وییقرا'},
['numbers'] = {'num', 'nm', 'اعداد', 'بمدیبار'},
['deuteronomy'] = {'deut', 'dt', 'تثنیه', 'دواریم'},
['joshua'] = {'josh' , 'jo', 'یوشع'},
['judges'] = {'judg', 'jgs', 'نياوکوونکي', 'قضات', 'شفتیم'},
['ruth'] = {'ru', 'روت', 'راعوت'},
['1_samuel'] = {'1sam', '1sm', 'سموئیل ۱', 'سموئیل۱'},
['2_samuel'] = {'2sam', '2sm', 'سموئیل ۲', 'سموئیل۲'},
['1_kings'] = {'1kgs', 'پاچاهان ۱', 'پاچاهان۱'},
['2_kings'] = {'2kgs', 'پاچاهان ۲', 'پاچاهان۲'},
['1_chronicles'] = {'1chron', '1chr', 'تواریخ ۱', 'تواریخ۱'},
['2_chronicles'] = {'2chron', '2chr', 'تواریخ ۲', 'تواریخ۲'},
['ezra'] = {'ezr', 'عزرا'},
['nehemiah'] = {'neh', 'نحمیا'},
['esther'] = {'est', 'استر', 'مگیلا'},
['job'] = {'jb', 'ایوب'},
['psalms'] = {'ps', 'pss', 'psalm', 'مزامیر', 'تهیلم', 'زبور داوود'},
['proverbs'] = {'prov', 'prv', 'امثال سلیمان'},
['ecclesiastes'] = {'eccles', 'eccl', 'qoheleth', 'جامعه بن داود', 'جامعه', 'کوهلت'},
['song_of_solomon'] = {'songofsol', 'songofsongs', 'song', 'sg', 'canticles', 'canticleofcanticles', 'غزل د سليمان ترانې', 'غزل غزلونه', 'نشیدالأنشاد', 'شر هاشریم'},
['isaiah'] = {'isa', 'is', 'اشعیا'},
['jeremiah'] = {'jer', 'ارمیا'},
['lamentations'] = {'lam', 'مراثی', 'ایکا'},
['ezekiel'] = {'ezek', 'ez', 'حزقیال'},
['daniel'] = {'dan', 'dn', 'دانیال'},
['hosea'] = {'hos', 'هوشع'},
['joel'] = {'jl', 'یوئیل'},
['amos'] = {'am', 'عاموس'},
['obadiah'] = {'obad', 'ob', 'عوبدیا'},
['jonah'] = {'jon', 'یونس'},
['micah'] = {'mic', 'mi', 'میکاه'},
['nahum'] = {'nah', 'na', 'ناحوم'},
['habakkuk'] = {'hab', 'hb', 'حبقوق'},
['zephaniah'] = {'zeph', 'zep', 'صفنیا'},
['haggai'] = {'hag', 'hg', 'حجی'},
['zechariah'] = {'zech', 'zec', 'زکریا'},
['malachi'] = {'mal', 'ملاکی', 'ملاخی'},
['baruch'] = {'bar', 'باروخ'}, --apocrypha/deuterocanon
['ecclesiasticus'] = {'ecclus', 'wisdomofsirach', 'sirach', 'sir', 'حکمت یشوع بن سیراخ'},
['1_esdras'] = {'1esd', 'اسدرس ۱', 'اسدرس۱'},
['2_esdras'] = {'2esd', 'اسدرس ۲', 'اسدرس۲'},
['judith'] = {'jth', 'jdt', 'جودیت', 'یهودیه بنت مراری'},
['1_maccabees'] = {'1macc', '1mc', 'لومړی مکابيان'},
['2_maccabees'] = {'2macc', '2mc', 'دوهم مکابيان'},
['3_maccabees'] = {'3macc', '3mc', 'دريم مکابيان'},
['4_maccabees'] = {'4macc', '4mc', 'څلورم مکابيان '},
['prayer_of_manasseh'] = {'profman', 'prayerofmanasses', 'دعای مناسه'},
['susanna'] = {'sus', 'سوسن'},
['tobit'] = {'tob', 'tb', 'توبیاس', 'توبیت'},
['wisdom_of_solomon'] = {'ws', 'wisdom', 'wisofsol', 'حکمت', 'حکمت سلیمان'},
['prayer_of_azariah'] = {'prayerofazariahandhymnofthethreechildren', 'ازریهوه'},
['rest_of_esther'] = {'additionstoesther', 'باقی استر'},
['bel_and_the_dragon'] = {'bel', 'بل و اژدها'},
['epistle_of_jeremiah'] = {'letterofjeremiah', 'نامه ارمیا'},
['matthew'] = {'matt', 'mt', 'متی'}, --new testament
['mark'] = {'mk', 'مرقس'},
['luke'] = {'lk', 'لوقا'},
['john'] = {'jn', 'یوحنا'},
['acts'] = {'actsoftheapostles', 'اعمال', 'پيغمبرانو کړنې'},
['romans'] = {'rom', 'رومیان'},
['1_corinthians'] = {'1cor', 'قرنتیان ۱', 'قرنتیان۱'},
['2_corinthians'] = {'2cor', 'قرنتیان ۲', 'قرنتیان۲'},
['galatians'] = {'gal', 'غلاطیان', 'گالاتیان'},
['ephesians'] = {'eph', 'افسسیان'},
['philippians'] = {'phil', 'فيليپیان'},
['colossians'] = {'col', 'کولسيان'},
['1_thessalonians'] = {'1thess', '1thes', 'تسالونيکيان ته لومړی ليک', 'تسالونیکیان ۱', 'تسالونیکیان۱'},
['2_thessalonians'] = {'2thess', '2thes', 'تسالونيکيان ته دوهم ليک', 'تسالونیکیان ۲', 'تسالونیکیان۲'},
['1_timothy'] = {'1tim', '1tm', 'تيموتاس ته لومړی ليک', 'تیموتاوس ۱', 'تیموتاوس۱'},
['2_timothy'] = {'2tim', '2tm', 'تيموتاس ته دوهم ليک', 'تیموتاوس ۱', 'تیموتاوس۲'},
['titus'] = {'ti', 'تيتوس ته ليک', 'تيتيس ته ليک', 'تیتوس', 'تیطس'},
['philemon'] = {'philem', 'phlm', 'فيلمون ته ليک', 'فیلمون'},
['hebrews'] = {'heb', 'عبرانيانو ته ليک', 'عبرانیان'},
['james'] = {'jas', 'يعقوب', 'يعقوب ليک'},
['1_peter'] = {'1pet', '1pt', 'پېترس ۱', 'پېترس۱', 'پېترس لومړی ليک'},
['2_peter'] = {'2pet', '2pt', 'پېترس ۲', 'پېترس۲', 'پېترس دوهم ليک'},
['1_john'] = {'1jn', 'يوحنا لومړی ليک', 'یوحنا ۱', 'یوحنا۱'},
['2_john'] = {'2jn', 'يوحنا دوهم ليک', 'یوحنا ۲', 'یوحنا۲'},
['3_john'] = {'3jn', 'يوحنا دريم ليک', 'یوحنا ۳', 'یوحنا۳'},
['jude'] = {'jude', 'یهودا', 'يهودا ليک'},
['revelation'] = {'rev', 'apocalypse', 'apoc', 'rv', 'يوحنا وحي', 'وحې'},
}
local apoc = {
['1_esdras'] = true, ['2_esdras'] = true, ['judith'] = true, ['1_maccabees'] = true,
['2_maccabees'] = true, ['3_maccabees'] = true, ['4_maccabees'] = true,
['prayer_of_manasseh'] = true, ['susanna'] = true, ['tobit'] = true,
['wisdom_of_solomon'] = true, ['prayer_of_azariah'] = true, ['rest_of_esther'] = true,
['bel_and_the_dragon'] = true, ['epistle_of_jeremiah'] = true,
['sirach'] = true, ['ecclesiasticus'] = true,
}
--these books only have one chapter, have to be handled differently
local no_chapters = {
['obadiah'] = true, ['epistle_of_jeremiah'] = true, ['prayer_of_azariah'] = true,
['susanna'] = true, ['bel_and_the_dragon'] = true, ['prayer_of_manasseh'] = true,
['philemon'] = true, ['2_john'] = true, ['3_john'] = true, ['jude'] = true,
}
--sets the website to be used for each version, biblegateway is the fallback so don't define any for it
local site_tbl = {
nrsv = 'oremus', nrsvae = 'oremus',
kjv = 'wikisource', asv = 'wikisource',
he = 'mechon_mamre', jps = 'mechon_mamre',
niv = 'biblica', nivuk = 'biblica', amp = 'biblica', ab = 'biblica',
msg = 'biblica', nlt = 'biblica', nirv = 'biblica',
nab = 'usccb',
bb = 'bible_hub', bbc = 'bible_hub', bbl = 'bible_hub', opb = 'bible_hub',
esv = 'esv_bible',
}
--pattern for the url of each site using _book etc. (underscore then letters [a-z]) for variables
local urlpat_tbl = {
oremus = 'https://bible.oremus.org/?passage=_book%20_vrange&version=_version',
wikisource = 's:Bible (_version)/_book#_schap:_svers',
mechon_mamre = 'https://mechon-mamre.org/_version_book_schap.htm#_svers',
biblica = 'https://www.biblica.com/bible/?osis=_version:_book%20_vrange',
usccb = 'https://bible.usccb.org/bible/_book/_schap?_svers',
biblegateway = 'https://www.biblegateway.com/passage/?search=_book+_vrange&version=_version',
bible_hub = 'https://_version/_book/_schap-_svers.htm',
esv_bible = 'https://www.esv.org/_book+_schap:_svers',
}
--changes book name to use in url for each site, only if necessary
local site_book_tbl = {
oremus = {
['epistle_of_jeremiah'] = 'letter of jeremiah',
},
usccb = {
['song_of_solomon'] = 'song_of_songs',
['wisdom_of_solomon'] = 'wisdom',
['ecclesiasticus'] = 'sirach',
},
mechon_mamre = {
['genesis'] = '01', ['exodus'] = '02', ['leviticus'] = '03',
['numbers'] = '04', ['deuteronomy'] = '05', ['joshua'] = '06',
['judges'] = '07', ['1_samuel'] = '08a', ['2_samuel'] = '08b',
['1_kings'] = '09a', ['2_kings'] = '09b', ['isaiah'] = '10',
['jeremiah'] = '11', ['ezekiel'] = '12', ['hosea'] = '13',
['joel'] = '14', ['amos'] = '15', ['obadiah'] = '16', ['jonah'] = '17',
['micah'] = '18', ['nahum'] = '19', ['habakkuk'] = '20',
['zephaniah'] = '21', ['haggai'] = '22', ['zechariah'] = '23',
['malachi'] = '24', ['1_chronicles'] = '25a', ['2_chronicles'] = '25b',
['psalms'] = '26', ['job'] = '27', ['proverbs'] = '28', ['ruth'] = '29',
['song_of_solomon'] = '30', ['ecclesiastes'] = '31', ['lamentations'] = '32',
['esther'] = '33', ['daniel'] = '34', ['ezra'] = '35a', ['nehemiah'] = '35b',
}
}
--changes to the version name to be used in urls, only if necessary
local site_version_tbl = {
mechon_mamre = {
he = 'p/pt/pt',
jps = 'e/et/et',
},
wikisource = {
kjv = 'King James', ['9'] = 'King James',
asv = 'American Standard',
},
bible_hub = {
bb = 'biblebrowser.com',
bbc = 'biblecommenter.com',
bbl = 'scripturetext.com',
opb = 'bible.cc',
}
}
local function trimArg(text)
if type(text) == 'string' then
text = text:match('(%S.-)%s*$') --trimmed text or nil if empty
end
return text
end
local function valueExists(tbl, value)
for _, v in pairs(tbl) do
if value == v then
return true
end
end
return false
end
local function titlecase(arg)
-- http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html
-- recommended by The U.S. Government Printing Office Style Manual:
-- 'Capitalize all words in titles of publications and documents,
-- except a, an, the, at, by, for, in, of, on, to, up, and, as, but, or, and nor.'
local alwayslower = {
['a'] = true, ['an'] = true, ['the'] = true,
['and'] = true, ['but'] = true, ['or'] = true, ['for'] = true,
['nor'] = true, ['on'] = true, ['in'] = true, ['at'] = true, ['to'] = true,
['from'] = true, ['by'] = true, ['of'] = true, ['up'] = true,
}
local words = mw.text.split(mw.text.trim(arg or ''), '_')
for i, s in ipairs(words) do
s = string.lower(s)
if i > 1 then
if not alwayslower[s] then
s = mw.getContentLanguage():ucfirst(s)
end
else
s = mw.getContentLanguage():ucfirst(s)
end
words[i] = s
end
return table.concat(words, '_')
end
function p.main(frame)
local targs = frame:getParent().args
if targs['بې کتابه'] then targs['nobook'] = targs['بې کتابه'] end
if targs['ويکيتړ'] then targs['wlink'] = targs['ويکيتړ'] end
if targs['ويکيتړ'] then targs['wlink'] = targs['ويکيتړ'] end
local args = {}
for _, param in ipairs({1, 2, 3, 4, 5, 'nobook', 'بې کتابه', 'wlink', 'ويکيتړ', 'ويکيتړ'}) do
args[param] = trimArg(targs[param])
end
local default_version = 'nrsv'
local input_book = ''
local ref = ''
local version = ''
local version_num
local text = ''
local wikilink = ''
local mainspace = mw.title.getCurrentTitle():inNamespaces(0)
if args[1] == nil or args[2] == nil or tonumber(numConv('en', args[1])) ~= nil then
-- first argument is a numeric prefix and second is book name
input_book = trimArg((args[1] or '') .. ' ' .. (args[2] or '')) or ''
wikilink = trimArg((args[1] or 'Book of') .. ' ' .. (args[2] or '')) or ''
ref = args[3] or ''
version = mw.ustring.lower(args[4] or default_version)
text = args[5] or trimArg((input_book .. ' ' .. ref))
else
-- first argument is the whole book name
input_book = args[1] or ''
wikilink = 'کتاب ' .. args[1]
ref = args[2] or ''
version = mw.ustring.lower(args[3] or default_version)
text = args[4] or (input_book .. ' ' .. ref)
end
if yesno(args.nobook) == 'yes' then
text = ref
end
if yesno(args.wlink) == 'yes' then
text = ref
wikilink = '[[' .. wikilink .. '|' .. input_book .. ']] '
else
wikilink = ''
end
text = mw.ustring.gsub(text, '-', '–') --change hyphens to en dashes (3:2-5 → 3:2–5)
if tonumber(numConv('en', version)) then
version = version_num_codes[tonumber(numConv('en', version))] or version
version_num = true
end
local errors = {}
if version == 'jpr' or version == 'jp' then --chabad doesn't work so reroute
version = 'he'
if mainspace then
table.insert(errors, '[[وېشنيزه:د بايبل نسخې تېروتنې سره مخونه ]]')
end
end
local book = mw.ustring.gsub(mw.ustring.gsub(input_book, '%p', ''), ' ', '_')
book = mw.ustring.lower(book)
local book_found = false
local standard = mw.ustring.gsub(book, '_', '')
for full_book, aliases in pairs(book_aliases) do
if standard == mw.ustring.gsub(full_book, '_', '') or valueExists(aliases, standard) then
book = full_book
book_found = true
break
end
end
local site = site_tbl[version] or 'biblegateway' --fall back on biblegateway for unrecognized version because it has so many versions
if apoc[book] and version == 'nrsv' and site == 'oremus' then --oremus's nrsv doesn't have the apocrypha
version = 'nrsvae' --the anglicized version does
end
local urlpat = urlpat_tbl[site]
local split_ref = mw.text.split(ref, '[-–—]') --split the ref into the part before and after the dash/hyphen
local s_ref = mw.text.split(split_ref[1], '%p') --any punctuation can be used to separate chapter from verse
local e_ref = split_ref[2] or split_ref[1]
e_ref = mw.text.split(e_ref, '%p')
for i, v in ipairs(s_ref) do s_ref[i] = v:gsub('%D', '') end --remove any non-numeric character (such as f)
for i, v in ipairs(e_ref) do e_ref[i] = v:gsub('%D', '') end
local e_chap, e_vers, s_chap, s_vers
local chapter_only = not s_ref[2]
if no_chapters[book] then
chapter_only = false
s_chap = 1
s_vers = s_ref[2] or s_ref[1] or 1 --verse 3 can be specified as "3" or "1:3"
e_chap = 1
e_vers = e_ref[2] or e_ref[1] or 1
else
s_chap = s_ref[1] or 1
s_vers = s_ref[2] or 1
if e_ref[2] or not s_ref[2] then --chapter-chapter or chapter(:verse)?-chapter:verse
e_chap = e_ref[1] or s_chap
else --chapter:verse-verse
e_chap = s_chap
end
e_vers = e_ref[2] or e_ref[1] or s_vers
end
if type(site_book_tbl[site]) == 'table' then
book = site_book_tbl[site][book] or book
end
book = titlecase(book) --title case looks better at oremus where they display the input
if site == 'mechon_mamre' then --special case handling for components of the url
if not tonumber(numConv('en', s_chap)) then --non-numeric characters were omitted above so this may not be what was entered
error('د بايبل ايتونو تېروتنه: څپرکي پيل بايد شمېره وي:' .. s_chap, 0)
end
s_chap = mw.ustring.format('%x', s_chap/10) .. (s_chap % 10)
elseif site == 'biblica' or site == 'oremus' then
book = mw.ustring.gsub(book, '_', '%%20')
elseif site == 'esv_bible' or site == 'biblegateway' then
book = mw.ustring.gsub(book, '_', '+')
elseif site == 'bible_hub' then
book = mw.ustring.lower(book)
elseif site == 'usccb' then
book = mw.ustring.gsub(book, '_', '')
end
if type(site_version_tbl[site]) == 'table' then
version = site_version_tbl[site][version]
end
local v_range
if chapter_only then
if e_chap == s_chap then
v_range = s_chap
else
v_range = s_chap .. '–' .. e_chap
end
else
if e_chap == s_chap and e_vers == s_vers then
v_range = s_chap ..':' .. s_vers
elseif e_chap == s_chap then
v_range = s_chap .. ':' .. s_vers .. '–' .. e_vers
else
v_range = s_chap .. ':' .. s_vers .. '–' .. e_chap .. ':' .. e_vers
end
end
local url = mw.ustring.gsub(urlpat, '_%l+', { --get the components into the url
_book = book,
_schap = s_chap,
_svers = s_vers,
_echap = e_chap,
_evers = e_vers,
_vrange = v_range,
_version = version,
})
local fulllink
if site == 'wikisource' then --interwikilink
fulllink = wikilink .. '[[' .. url .. '|' .. text .. ']]'
else
fulllink = wikilink .. '[' .. url .. ' ' .. text .. ']'
end
if mainspace then
if not book_found then
table.insert(errors, '<span style="color:red">کينډۍ:بايبل له ناسم کتاب سره</span>[[وېشنيزه:د بايبل نسخې تېروتنې سره مخونه]]')
end
if version_num then
table.insert(errors, '[[وېشنيزه:هغه مخونه چې د بايبل ايتونو ته عددي حوالې پکې ورکړل شوي]]')
end
end
return fulllink .. table.concat(errors)
end
return p