Module:BibleQuote2

From BibleVerseWiki
Revision as of 18:56, 22 May 2024 by Kelvin (talk | contribs)

Documentation for this module may be created at Module:BibleQuote2/doc

local p = {} --p stands for package
local getArgs = require('Module:Arguments').getArgs

local function getVerseNamespace()
    return "VerseTemplate"
end

local function removePilcrow(verse)
    return (string.gsub(verse, "^<span class=\"pilcrow\">¶</span>%s*", ""))
end

-- local function addSingleSpace(verse)
--     return (string.gsub(verse, "^", "<br>"))
-- end

local function addDoubleSpace(verse)
    return (string.gsub(verse, "^", "<br><br>"))
end

local function addIndent(verse)
    return (string.gsub(verse, "^", "&nbsp;&nbsp;&nbsp;&nbsp;"))
end

local function parseVerseSpec(verseSpec)
    local book, chapter, startVerse, stopVerse
    if string.find(verseSpec, "-") then
        _, _, book, chapter, startVerse, stopVerse =
            string.find(verseSpec, "%s-(.+)%s+(%d+):(%d+)-(%d+)")
    else
        _, _, book, chapter, startVerse =
            string.find(verseSpec, "%s-(.+)%s+(%d+):(%d+)")
    end
    return book, chapter, startVerse, stopVerse
end

local function renderQuote(quote, spec, book, chapter, startVerse)
    local formatString = [=[
        <blockquote>%s
            <div style="text-align: right">
                <span class="navigation-not-searchable">[[%s#%s-%s|%s]]</span>
            </div>
        </blockquote>
    ]=]
    return string.format(formatString, quote, book, chapter, startVerse, spec)
end

local function getWikiText(pageTitle)
    return mw.title.new(pageTitle, getVerseNamespace()):getContent()
end

local function getPageTitle(book, chapter, verseNumber)
    return string.format("%s %s:%s", book, chapter, verseNumber)
end

local function addVerseNumber(wikiText, chapter, verseNumber)
    if verseNumber == 1 then
        return (string.gsub(wikiText, "^", string.format("<big>'''%s'''</big> ", chapter)))
    end
    return (string.gsub(wikiText, "^", string.format("<sup>'''%s'''</sup> ", verseNumber)))
end

local function renderVerse(book, chapter, verseNumber, showPilcrow, showVerseNumber)
    local pageTitle = getPageTitle(book, chapter, verseNumber)
    local wikiText = getWikiText(pageTitle)
    if not wikiText then
        error("Invalid Verse Number: " .. pageTitle)
    end
    if not showPilcrow then
        wikiText = removePilcrow(wikiText)
    end
    if showVerseNumber then
        wikiText = addVerseNumber(wikiText, chapter, verseNumber)
    end
    return wikiText
end

local function renderConcat(indent)
    local separator = ""
    if indent then
        separator = addIndent(separator)
    end
    separator = addDoubleSpace(separator)
    return separator
end

local function renderVerses(verses, indent)
    if indent then
        return addIndent(table.concat(verses, renderConcat()))
    end
    return table.concat(verses, renderConcat())
end

local function renderVerseSpec(verseSpec, showVerseNumber, showPilcrow, singleSpace, doubleSpace, indent)
    local book, chapter, startVerse, stopVerse = parseVerseSpec(verseSpec)
    local verses = {}
    for i = startVerse, (stopVerse and stopVerse or startVerse) do
        table.insert(verses, renderVerse(book, chapter, i, showPilcrow, stopVerse))
    end
    return renderQuote(renderVerses(verses, indent), verseSpec, book, chapter, startVerse)
end

function p.main(frame)
    local args = getArgs(frame)
    local stringToBoolean = { ["true"] = true, ["false"] = false }
    return renderVerseSpec(
        args[1]
        , stringToBoolean[args.showVerseNumber]
        , stringToBoolean[args.showPilcrow]
        , stringToBoolean[args.singleSpace]
        , stringToBoolean[args.doubleSpace]
        , stringToBoolean[args.indent]
    )
end

return p