FANDOM


local p = {}
local h = require("Module:HF")
local SC = require("Module:StaffCorrection")
local standart = require("Module:StandardizedName")
local monthData = mw.loadData( 'Module:Month/data' )
local monthAliases = monthData[1]
local monthNumbers = monthData[2]
 
local staff_fieldname = {"Writer", "Penciler", "Inker", "Colourist", "Letterer", "AdaptedFrom", "Editor", "CoverArtist", "Editor-in-Chief" }
local staff_singular = {"Writer", "Penciler", "Inker", "Colourist", "Letterer", "Adapted from original material by", "Editor", "Cover Artist", "Editor-in-Chief"}
local staff_plural = {"Writers", "Pencilers", "Inkers", "Colourists", "Letterers", "Adapted Stories", "Editors", "Cover Artists", "Editors-in-Chief"}
 
local volume_date_first = ''
local volume_date_last = ''
 
function p.test(frame)
    local getArgs = require('Dev:Arguments').getArgs
    local args = getArgs (frame)
    local dates = { args['Year'], args['Month'], args['Season'], args['ReleaseDate'] }
    local canceled = args['Canceled']
    local reprint_title = {}
    local reprint_story = {}
    local storytitles = {}
    local s = ''
    local n = ''
    local page = mw.title.getCurrentTitle()
 
    for i = 1,80 do
        table.insert( reprint_title, standart.lua_standardized_comics_name( args['ReprintOf'..i] ) )
        table.insert( reprint_story, args['ReprintOfStory'..i] )
    end
 
    for i = 1,80 do
        if h.isempty(reprint_title[i]) == false
            then 
                n = reprint_story[i] or '1'
                s = standart.lua_standardized_comics_name(reprint_title[i])
                s = mw.title.new(s):getContent()
                if h.isempty(s) == false
                    then storytitles[i] = string.match(s, '|%s+StoryTitle'..n..'%s+=%s+(.-)\n')
                end
        end
    end
 
    return page.text
    --return p.lua_link_to_publication_category(dates[1], dates[2], dates[3])
    --return mw.text.listToText( storytitles )
    --return mw.text.listToText( reprint_title )
end
 
 
function p.appearances_needed(frame)
    local getArgs = require('Dev:Arguments').getArgs
    local args = getArgs (frame)
    local s = args['Appearing'] or ''
    s = mw.text.split(s, '\n', true)
    local output = 0
 
    local empty = { "'''Featured Characters:'''", "* <br/>", "'''Supporting Characters:'''", "* <br/>", 
                    "'''Antagonists:'''", "* <br/>", "'''Other Characters:'''", "* <br/>",
                    "'''Locations:'''", "* <br/>", "'''Items:'''", "* <br/>",
                    "'''Vehicles:'''", "* <br/>"
                  }
    if #s == 14
        then
            for i = 1, #s do
                if s[i] == empty[i]
                    then output = output + 1
                end
            end
    end
 
    if output < 14
        then output = false
        else output = true
    end
 
    return output
end
 
 
------------------------------------------------------------------------------------------------
--takes a date and formats it according to the syntax - https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions##time
function p.lua_date_converter(s, t)
    local l = mw.language.new('en')
    local day
    local month
    local year
    local i = 0
    local j = 0
 
    --'To comma' = 'F j, Y', "dash" = 'm-d-Y'
    if h.isempty(t) == true 
        then t = 'Ymd'
    end
    if h.isempty(s) == true
        then s = l:formatDate(t)
        else
            i = string.find(s, '-',1,true)
            j = string.find(s, ', ',1,true)
            if i ~= nil 
                then
                    j = string.find(s, '-',i+1,true)
                    month = string.sub(s, 1, i-1)
                    month = monthNumbers[string.lower( month )] or month
                    day = string.sub(s, i+1, j-1)
                    if #day == 1 then day = "0"..day end
                    year = string.sub(s, j+1, #s)
                    s = l:formatDate(t, day.."-"..month.."-"..year)
                elseif j ~= nil then
                    year = string.sub(s, j+2, #s)
                    i = string.find(s, ' ',1,true)
                    month = string.sub(s, 1, i-1)
                    month = monthNumbers[string.lower( month )] or month
                    day = string.sub(s, i+1, j-1)
                    if #day == 1 then day = "0"..day end
                    s = l:formatDate(t, day.."-"..month.."-"..year)
                else
                    s = l:formatDate(t, s)
            end
    end
    return s
end
function p.date_converter(frame)
    return p.lua_date_converter(frame.args[1], frame.args[2])
end
 
 
--compares two dates. Return "true" if 1st date is before the 2nd date, and "false" otherwise.
function p.lua_date_comparison(d1, d2)
    d1 = p.lua_date_converter(d1, 'Ymd')
    if h.isempty(d2) == true
        then d2 = '@'..os.time() --If 2nd date is ommited, then current date is used for comparison.
    end
    d2 = p.lua_date_converter(d2, 'Ymd')
 
    if d1<=d2 
        then return true
        else return false
    end
end
function p.date_comparison(frame)
    return p.lua_date_comparison(frame.args[1], frame.args[2])
end
 
 
--check if comics is canceled or a solicitation
function p.lua_solicit_or_canceled(releasedate, canceled)
    if h.isempty(canceled) == false or (h.isempty(releasedate) == false and p.lua_date_comparison(releasedate) == false)
        then return true --it is canceled or a solicitation
        else return false 
    end
end
function p.solicit_or_canceled(frame)
    if p.lua_solicit_or_canceled(frame.args[1], frame.args[2]) == true
        then return 'yes'
        else return ''
    end
end
function p.not_solicit_or_canceled(frame)
    if p.lua_solicit_or_canceled(frame.args[1], frame.args[2]) == false
        then return 'yes'
        else return 'no'
    end
end
 
 
--check if comics is recently released/published
function p.lua_recent(releasedate, month, year, season, canceled)
    local l = mw.language.new('en')
    local current = l:formatDate('Ymd') 
    local s = ''
 
    if h.isempty(canceled) == true
        then 
            if h.isempty(month) == true and h.isempty(season) == false
                then month = season
            end
 
            if h.isempty(releasedate) == false
                then 
                    releasedate = p.lua_date_converter(releasedate, 'Ymd')
                    if releasedate>=l:formatDate('Ymd', '- 4 months') and releasedate<=current
                        then s = true
                    end
                elseif h.isempty(year) == false and h.isempty(month) == false 
                    then
                        releasedate = p.lua_date_converter(monthAliases[string.lower( month )]..' 1, '..year, 'Ymd')
                    if releasedate>=l:formatDate('Ymd', '- 2 months') and releasedate<=current
                        then s = true
                    end
            end
    end
    return s
end
function p.recent(frame)
    return p.lua_recent(frame.args[1], frame.args[2], frame.args[3], frame.args[4], frame.args[5])
end
 
 
--returns number of week
function p.lua_release_week(d, t)
    local y
    if h.isempty(t) == true
        then d = 'Week '..p.lua_date_converter(d, 'W')..', '..p.lua_date_converter(d, 'Y')
        else 
            d = (d-1) * 7 + 1
            y = '01-01-'..p.lua_date_converter('','Y')
            d = p.lua_date_converter(y..' + '..d..' days',  'F j, Y')
    end
    return d
end
 
 
--returns release week category
function p.release_week_category(frame)
    local d = frame.args[1] or ''
    if h.isempty(d) == false
        then return '[[Category:'..p.lua_release_week(d)..']]'
        else return ''
    end
end
 
 
--returns link to release week category
function p.lua_link_to_release_week_category(d)
    local w
 
    if h.isempty(d) == false
        then
            w = p.lua_release_week(d)
            d = p.lua_date_converter(d,  'F j, Y')
            return '[[:Category:'..w..'|'..d..']]'
        else
            return ''
    end
end
function p.link_to_release_week_category(frame)
    return p.lua_link_to_release_week_category(frame.args[1])
end
 
 
--returns publication category
function p.publication_category(frame)
    local year = frame.args[1]
    local month = frame.args[2]
    local season = frame.args[3]
    local pagename = standart.lua_remove_the(frame.args[4])
    local s = ''
 
    if h.isempty(month) == true and h.isempty(season) == false
        then month = season
    end
 
    if h.isempty(year) == false 
        then
            if h.isempty(month) == false
                then
                    month = monthAliases[string.lower( month )]
                    s = s..'[[Category:'..year..'|'..month..pagename..']][[Category:'..year..', '..month..']]'
                else
                    s = s..'[[Category:'..year..']]'
            end
            s = s..p.lua_era(year)
    end
 
    return s
end
 
 
--returns link to date of publication category
function p.lua_link_to_publication_category(year, month, season)
    local s = ''
 
    if h.isempty(month) == true and h.isempty(season) == false
        then month = season
    end
 
    if h.isempty(year) == false
        then
            if h.isempty(month) == false
                then
                    month = monthAliases[string.lower( month )]
                    s = '[[:Category:'..year..', '..month..'|'..month..']], [[:Category:'..year..'|'..year..']]'
                else
                    s = '[[:Category:'..year..'|'..year..']]'
            end
    end
 
    return s
end
function p.link_to_publication_category(frame)
    return p.lua_link_to_publication_category(frame.args[1], frame.args[2], frame.args[3])
end
 
 
--returns era based on year
function p.lua_era(year, t)
    if h.isempty(year) == false 
        then
            if h.isempty(t) == true
                then t = ''
                else t = ' '..t
            end
            year = tonumber(year)
 
            if year<1955 then return '[[Category:Golden-Age'..t..']]' end
            if year>=1955 and year<1970 then return '[[Category:Silver-Age'..t..']]' end
            if year>=1970 and year<1983 then return '[[Category:Bronze-Age'..t..']]' end
            if year>=1983 and year<1992 then return '[[Category:Copper-Age'..t..']]' end
            if year>=1992 then return '[[Category:Modern-Age'..t..']]' end
        else return ''
    end
end
function p.era(frame)
    return p.lua_era(frame.args[1], frame.args[2])
end
 
 
function p.links_to_release_publication_dates(frame)
    local year = frame.args[1]
    local month = frame.args[2]
    local season = frame.args[3]
    local release = p.lua_link_to_release_week_category(frame.args[4])
    local canceled = frame.args[5]
    local published = p.lua_link_to_publication_category(year, month, season)
    local s = ''
    local s1 = ''
    local s2 = ''
 
    if h.isempty(canceled) == false
        then
            s1 = 'Intended Publication Date'
            s2 = 'Intended Release Date'
        else
            s1 = 'Published'
            s2 = 'Released'
    end    
 
    if h.isempty(published) == false 
        then
            if h.isempty(release) == false
                then s = '<table style="width:100%; text-align: center;"><tr style="line-height:0.5em;"><td style="width:50%;">'..s1..'</td><td style="width:50%;">'..s2..'</td></tr><tr style=" font-size:12px;"><td>'..published..'</td><td>'..release..'</td></tr></table>'
                else s = '<table style="width:100%; text-align: center;"><tr style="line-height:0.5em;"><td>'..s1..'</td></tr><tr><td style=" font-size:12px;">'..published..'</td></tr></table>'
            end
        elseif h.isempty(release) == false
            then s = '<table style="width:100%; text-align: center;"><tr style="line-height:0.5em;"><td>'..s2..'</td></tr><tr><td style=" font-size:12px;">'..release..'</td></tr></table>'
    end
    return s
end
 
 
----------------------------------------------------------------------------------------------
--events, arcs, storylines
function p.events_and_arcs(frame)
    local events = mw.text.split( frame.args[1],"@@@",true )
    local events_names = mw.text.split( frame.args[2],"@@@",true )
    local arcs = mw.text.split( frame.args[3],"@@@",true )
    local arcs_names = mw.text.split( frame.args[4],"@@@",true )
    local storylines = mw.text.split( frame.args[5],"@@@",true )
    local storylines_names = mw.text.split( frame.args[6],"@@@",true ) 
    local i
    local j
    local e = {}
    local a = {}
    local sl = {}
    local s = ''
 
    j = 1
    for i = 1,#events do
        if h.isempty(events[i]) == false
            then
                if h.isempty(events_names[i]) == true
                    then events_names[i] = events[i]
                end
                e[j] = '"[['..events[i]..'|'..events_names[i]..']]"'
                j = j + 1
        end
    end
    if #e > 0 
        then
            s = '<div style="text-align:center; font-size:10px; font-weight:900; line-height:1em; padding:0.5em 0pt 0.5em 0pt;">Part of the '
            if #e > 1
                then s = s..mw.text.listToText( e )..' events'
                else s = s..e[1]..' event'
            end
            s = s..'</div>'
    end
 
    j = 1
    for i = 1,#arcs do
        if h.isempty(arcs[i]) == false
            then
                if h.isempty(arcs_names[i]) == true
                    then arcs_names[i] = arcs[i]
                end
                a[j] = '"[['..arcs[i]..'|'..arcs_names[i]..']]"[[Category:'..arcs[i]..']]'
                j = j + 1
        end
    end
    if #a > 0 
        then
            if s ~= '' then s = s..'<div style="clear:both;"></div>' end
            s = s..'<div style="text-align:center; font-size:10px; font-weight:900; line-height:1em; padding:0.5em 0pt 0.5em 0pt;">Part of the '
            if #a > 1
                then s = s..mw.text.listToText( a )..' story arcs'
                else s = s..a[1]..' story arc'
            end
            s = s..'</div>'
    end
 
    j = 1
    for i = 1,#storylines do
        if h.isempty(storylines[i]) == false
            then
                if h.isempty(storylines_names[i]) == true
                    then storylines_names[i] = storylines[i]
                end
                sl[j] = '"[['..storylines[i]..'|'..storylines_names[i]..']]"[[Category:'..storylines[i]..']]'
                j = j + 1
        end
    end
    if #sl > 0 
        then
            if s ~= '' then s = s..'<div style="clear:both;"></div>' end
            s = s..'<div style="text-align:center; font-size:10px; font-weight:900; line-height:1em; padding:0.5em 0pt 0.5em 0pt;">Part of the '
            if #sl > 1
                then s = s..mw.text.listToText( sl )..' storylines'
                else s = s..sl[1]..' storyline'
            end
            s = s..'</div>'
    end  
 
    return s
end
 
 
----------------------------------------------------------------------------------------------
function p.getComicsContent(s_page)
    --s_page = standart.lua_standardized_comics_name(s_page)
    local t = mw.title.new(s_page)
    local s = t:getContent()
    local a = {}
    local r_i = {}
    local r_s = {}
    local i = 0
    local j = 1
 
    i = string.find(s,'\n')
 
    while i ~= nil do
        table.insert(a,string.sub(s,j,i-1))
        j = i+1
        i = string.find(s,'\n',j)
    end
    j = 0
    for i=1,#a do
        j = string.find(a[i],'ReprintOf')
        if j ~= nil 
            then
                j = string.find(a[i],'ReprintOfStory')
                if j ~= nil
                    then
                        s = mw.text.trim( mw.ustring.gsub(a[i],'| ReprintOfStory%d+.+=', ''), "\t\r\n\f " )
                        table.insert(r_s, s )
                    else
                        s = mw.text.trim( mw.ustring.gsub(a[i],'| ReprintOf%d+.+=', ''), "\t\r\n\f " )
                        s = standart.lua_standardized_comics_name(s)
                        table.insert(r_i, s )
                end
        end
    end
 
    s = {}
    for i = 1,#r_i do 
        table.insert(s, {r_i[i], r_s[i]})
    end
    return s
end
 
 
function p.list_r(frame)
    local l = mw.text.split( frame.args[1],"@@@",true )
    local s_issue = standart.lua_standardized_comics_name(frame.args[2])
    local s_story = frame.args[3]
    local t = {}
    local res = {}
    local i
    local j
 
    for i = 1,#l-1 do
        t = p.getComicsContent(l[i])
        for j = 1,#t do
            if t[j][1] == s_issue and (h.isempty(s_story) == true or t[j][2] == s_story)
                then table.insert(res, '\n*[['..l[i]..']]')
            end
        end
    end
 
    return table.concat(res)
end
 
 
--forms a list of all reprints of specified comics 
function p.list_of_reprints(frame)
    local l = mw.text.split( frame.args[1],"*",true )
    local s_page = standart.lua_standardized_comics_name(frame.args[2])
    local i
    local j
    local l2 = {}
    local s
    local s2
 
    for i = 1,#l do
        s = mw.text.split( l[i],"@",true )
        for j = 2,79 do
            if h.isempty(s[j]) == false 
                then table.insert(l2, {standart.lua_standardized_comics_name(s[1]), standart.lua_standardized_comics_name(s[j])})
            end
        end
    end
 
    s = {}
    s2 = ''
    for i = 1,#l2 do
        if l2[i][2] == s_page 
           then table.insert(s, '\n*[['..l2[i][1]..']]')
        end
    end
 
    return table.concat(s)
end
 
 
--display a quote from the original comics without autocategorization 
function p.reprint_quote(frame)
    local l = mw.text.split( frame.args[1],"@@@",true )
    local q = l[1] or ''
    local s = l[2] or ''
    local bq = l[3] or ''
 
    if h.isempty(bq) == false 
        then 
            bq = mw.ustring.gsub(bq, '%[%[Category:.-%]%]', '' )
            return bq
        elseif h.isempty(q) == false 
            then return frame:preprocess( '{{Quote|'..q..'|'..s..'}}' )
            else return ''
    end
end
 
 
--returns story title, story title from reprint or story number if none of them exists
function p.StoryTitle(frame)
    local number = frame.args[1]
    local st = frame.args[2] or ''
    local reprint_st = frame.args[3] or ''
 
    if number % 10 == 1
        then number = number..'st'
        elseif number % 10 == 2-- in (2,22,32,42,52,62,72)
            then number = number..'nd'
            elseif number % 10 == 3 --in (3,23,33,43,53,63,73)
                then number = number..'rd'
                else number = number..'th'
    end
    number = number..' story'
 
    if h.isempty(st) == true
        then st = reprint_st
    end
 
    if h.isempty(st) == false
        then 
            if string.sub(st,1,1) ~= '"'
                then st = '"'..st..'"'
            end
        else
            st = number
    end
 
    return st
end
 
 
-- check if main/textless cover exists
function p.lua_cover(s_page, s_type)
    --s_page = string.gsub(s_page,'/',' ')
    --s_page = string.gsub(s_page,':','')
    title, volume, issue, padded_issue, padded_volume, title_for_files = standart.lua_get_title_volume_issue(s_page)
    volume = ' Vol '..volume..' '
    s_page = title_for_files..volume..issue
    if s_type == 'Textless'
        then s_page = s_page.." Textless.jpg"
        else s_page = s_page..".jpg"
    end
 
    if mw.title.new("File:"..s_page).exists == true
        then return s_page
        else return ''
    end
end
function p.cover(frame)
    local s_page = frame.args[1]
    local s_type = frame.args[2] or 'Textless'
 
    return p.lua_cover(s_page, s_type)
end
 
 
--get the list of general contributors (cover artists, editors-in-chief, etc.)
function p.GeneralContributors(frame)
 
    local l = mw.text.split( frame.args[1],"*",true )
    local t = frame.args[2]
    local cat = frame.args["category"]
    local link_name = frame.args["link_name"]
    local needed = frame.args["needed"]
    local t2
 
    if t == 'Editor-in-Chief'
        then t2 = 'Editors-in-Chief'
        else t2 = t..'s'
    end
 
    if h.isempty(link_name) == true
        then link_name = '[[:Category:Marvel Staff/'..t2..'|'..t..']]'
    end
    l = p.lua_StoryContributors(l, t, cat)
    if h.isempty(l) == false
        then return frame:preprocess( '{{Infobox Line|left = '..link_name..'|right = '..l..'}}' )
        elseif cat == 'yes' and needed ~= 'no'
            then return '[[Category:'..t..' Credit Needed]]'
            else return ''
    end
end
 
--get the list of general contributors (cover artists, editors-in-chief, etc.)
function p.StoryContributors(frame)
    local l = mw.text.split( frame.args[1],"@",true )
    local l2 = {}
    local t = {"Writer", "Penciler", "Inker", "Colourist", "Letterer", "Adapted Stories", "Editor"}
    local t2 = {}
    local cat = frame.args["category"]
    local needed = frame.args["needed"]
    local link_name
    local i
    local j
 
    for i = 1,7 do
        if cat == 'yes'
            then
                l2[i] = mw.text.split(l[i],"*",true )
            else
                l[i] = l[i].."|"
                l2[i] = mw.text.split(l[i],"|",true )
        end
        for j = 1,#l2[i] do
            l2[i][j] = mw.text.trim(l2[i][j])
        end        
        l2[i] = p.lua_StoryContributors(l2[i], t[i], cat)
        if i == 6 
            then t2[i] = '[[:Category:Marvel Staff/Adapted Stories|Adapted from original material by]]'
            else t2[i] = '[[:Category:Marvel Staff/'..t[i]..'s|'..t[i]..']]'
        end
    end
 
    l = ''
    if h.isempty(table.concat(l2)) == true 
        then 
            return ''
        else 
            for i = 1,7 do
                if h.isempty(l2[i]) == false
                    then l = l..frame:preprocess( '{{Infobox Line|left = '..t2[i]..'|right = '..l2[i]..'}}' )
                    elseif cat == 'yes' and i ~= 6 and needed ~= 'no'
                        then l = l..'[[Category:'..t[i]..' Credit Needed]]'
                end
            end
            return l
    end        
end
 
--transform the list of contributors into infobox lines with or without categorization
function p.lua_StoryContributors(l, t, cat)
    local i
    local v
    local c
 
    i = 1
    if h.isempty(l) == true
        then return ''
        else 
            while next(l,i) ~= nil do
                v = l[i]
                c = SC.Correction(v)
                if h.isempty(v) == false then 
                    if string.lower(v) == 'uncredited' or string.lower(v) == 'n/a'
                        then l[i] = 'Uncredited'
                        else 
                            l[i] = '[['..c..'|'..v..']]'
                            if cat == "yes" 
                                then l[i] = l[i]..'[[Category:'..c..'/'..t..']]<br>'
                                else l[i] = l[i]..'<br>'
                            end
                    end
                end
                i = i + 1
            end
            return table.concat(l) 
    end
end
 
-- get the list of images and captions and transform them into gallery of alternate covers
function p.covers(frame)
    local l_covers = mw.text.split( frame.args[1],"@@@",true )   
    local l_captions = mw.text.split( frame.args[2],"@@@",true )
    local s_page = frame.args[3]
    local l = {}
    local c = {}
    local i
    local j
    local k = 0
    local s
    local res = {}
 
    i = 1
    j = 1
 
    s_page = string.gsub(s_page,'/',' ')
    s_page = string.gsub(s_page,':','')
    s_page = string.gsub(s_page,'&#38;','&')
    s_page = string.gsub(s_page,'&#39;',"'")
    s_page = s_page.." Textless.jpg"
    while next(l_covers,i) ~= nil do
        if h.isempty(l_covers[i]) == false 
            then 
                l[j] = l_covers[i]
                c[j] = l_captions[i]
                j = j + 1
        end
        i = i + 1
    end
 
    if l[1] == s_page
        then c[1] = 'Textless'
    end    
 
    --if (j == 1 or l[1] ~= s_page) and mw.title.new("File:"..s_page).exists == true
    if l[1] ~= s_page and mw.title.new("File:"..s_page).exists == true
        then 
            table.insert(l, 1, s_page)
            table.insert(c, 1, 'Textless')
    end
 
    i = 1
    for j=1,#l do
        s = '<div style="float: left; width: 65px; margin: 2px 8px; border: 1px solid {{Theme.Default.Border}}; background: {{Theme.Default.BG}}; border-radius:10px; padding: 5px; text-align: center; font-size: 10px; font-weight: 900; line-height: 1.5em;">[[File:'..l[j]..'|65px]]'..c[j]..'</div>'
        if i == 3
            then
                s = s..'<br clear=left>'
                i = 1
            else
                i = i + 1
        end
        table.insert(res, s)
    end
    return table.concat(res)
end
 
-- get the list of appearances formed by dpl query from a comics issue and replace/move all tags to suppress all categoriztion.
function p.lua_reprint_appearances(l, pagename)
    local j
    local k
    local s1
    local s2
    local s3
 
    l = mw.ustring.gsub(l, '{{[Aa]|(%[%[.-%]%])}}', '%1' )
    l = mw.ustring.gsub(l, '{{[Aa]|(.-)}}', '[[%1]]' )
    l = mw.ustring.gsub(l, '{{[Aa]pn|(%[%[.-%]%]).-}}', '%1' )
    l = mw.ustring.gsub(l, '{{[Aa]pn||.-}}', '' )
    l = mw.ustring.gsub(l, '{{1stas|(%[%[.-%]%])|(.-)}}', '%1 {{g|First appearance as %2}}' )
    l = mw.ustring.gsub(l, '{{[Pp]ossessed|(%[%[.-%]%])|(.-)}}', '%1 {{g|Possessed by %2}}' )
    l = mw.ustring.gsub(l, '{{[Pp]ossessedBy|(%[%[.-%]%])|(.-)}}', '%1 {{g|Possessed by %2}}' )
    l = mw.ustring.gsub(l, '{{[Pp]ossesses|(%[%[.-%]%])|(.-)}}', '%1 {{g|Possesses %2}}' )
    l = mw.ustring.gsub(l, '{{[Ii]mpersonates|(.-)}}', '{{g|Impersonates %1}}' )
    l = mw.ustring.gsub(l, '{{[Mm]minor|||(.-)}}', '{{g|%1}}' )
    j, k = mw.ustring.find(string.lower(l), '{{minor|')
    if j ~= nil 
        then
            s1 = string.sub( l, 1, j-1 )
            i = mw.ustring.find(l, '}}')
            s2 = string.sub( l, k+1, i-1 )
            s3 = string.sub( l, i+2, #l )
            j = mw.ustring.find(s2, '[[',1,true)
            k = mw.ustring.find(s2, ']]',1,true)
            if j ~= nil 
                then
                    s2 = '[['..string.sub(s2, j+2, k-1 )..']]'
                else
                    s2 = mw.text.split( s2,"|",true )
                    if #s2 == 3
                        then s2 = '[['..s2[1]..'|'..s2[2]..']] {{g|'..s2[3]..'}}'
                        elseif #s2 == 2
                            then s2 = s2[1]..' {{g|'..s2[2]..'}}'
                            else s2 = s2[1]
                    end
            end
            l = s1..s2..s3
    end
    l = mw.ustring.gsub(l, '{{[Gg]|(%[%[.-%]%])|(.-)}}', '%1 {{g|%2}}' )
    l = mw.ustring.gsub(l, '{{[Gg]|(%[%[.-%]%])}}', '%1' )
    l = mw.ustring.gsub(l, '{{[Gg]reen|(%[%[.-%]%])|(.-)}}', '%1 {{g|%2}}' )    
    l = mw.ustring.gsub(l, '{{[Gg]reen|(%[%[.-%]%])}}', '%1' )
    l = mw.ustring.gsub(l, '({{.-)|(%[%[.-%]%])}}', '%2 %1}}' )
    l = mw.ustring.gsub(l, '{{[Cc]hronology}}', '{{g|[['..pagename..'#Chronology Notes|See chronology]]}}' )
    l = mw.ustring.gsub(l, '{{[Cc]hronoFB}}', '{{g|[['..pagename..'#Chronology Notes|Appears in flashback]]}}' )
    --l = mw.ustring.gsub(l, '{{g|[[#Continuity Notes|See Continuity Notes]]}}', '{{g|[['..pagename..'#Continuity Notes|See Continuity Notes]]}}' )
    j, k = mw.ustring.find(string.lower(l), '{{g|[[#Continuity Notes|See Continuity Notes]]}}',1,true)
    if j ~= nil 
        then
            s1 = string.sub( l, 1, j-1 )
            s2 = '{{g|[['..pagename..'#Continuity Notes|See Continuity Notes]]}}'
            s3 = string.sub( l, k+1, #l )
            l = s1..s2..s3
    end   
    l = mw.ustring.gsub(l, '%[%[Category:.-%]%]', '' )
    l = mw.ustring.gsub(l, '&lt;', '<' )
    l = mw.ustring.gsub(l, '&gt;', '>' )
    return l
end
 
function p.reprint_appearances(frame)
    local l = mw.text.unstrip( frame.args[1] )
    local pagename = frame.args[2] 
    local h = require("Module:HF")
    local j
    local k
 
    l = mw.text.split(l,'\n')
    for i = 1,#l do
        l[i] = '\n'..p.lua_reprint_appearances(l[i], pagename)
    end
    return frame:preprocess( table.concat(l) )
end
 
-- forms a gallery of comics issues in specified volume based on dpl query from vloume category
function p.volume(frame)
    local monthData = mw.loadData( 'Module:Month/data' )
    local monthAliases = monthData[1]
    local getArgs = require('Dev:Arguments').getArgs
    local args = getArgs (frame)
    local l = mw.text.split(args["list"],"@@@",true)
    local parts = {}
    local above = {}
    local below = {}
    local exclude = args["exclude"]
    local part
    local a
    local b
    local s_page
    local s_image
    local s_title
    local i, j, k, f
    local v
    local s
    local t = {}
    local t2 = {}
    local cover
    local textless
    local title = ''
    local volume = ''
    local issue = ''
    local padded_issue = ''
    local padded_volume = ''
    local title_for_files = ''
    local title_for_sorting = ''
    local publication_date = ''
    local link = ''
    local output = ''
    local tag = ''
 
    if h.isempty(exclude) == false
        then exclude = mw.text.split(exclude,";",true)
    end
 
    for i = 1,9 do
        table.insert(parts, tonumber(standart.lua_padded_issue(args['part'..i])))
        table.insert(above, args['part'..i..'_above'] or '')
        table.insert(below, args['part'..i..'_below'] or '')
    end
 
    i = 1
    while next(l,i) ~= nil do
        v = mw.text.split(l[i],"*",true)
        i = i + 1
        s_page = v[1]
        s_image = v[2]
        s_title = v[3]
        if h.inlist(exclude, s_page) == false
            then
                publication_date = p.lua_link_to_publication_category(v[4], v[5])
 
                title, volume, issue, padded_issue, padded_volume, title_for_files = standart.lua_get_title_volume_issue(s_page)
 
                link = standart.lua_standardized_link(s_page, 'Comics')
                tag = mw.html.create( 'span' )
                    :css( 'font-weight', 'bold' )
                    :wikitext (link)
                    :done()
                link = tostring(tag)
 
                title_for_files = title_for_files..' Vol '..volume..' '..issue
 
                cover = title_for_files..".jpg"
                textless = title_for_files.." Textless.jpg"
                if h.isempty(s_image) == true
                    then 
                        if mw.title.new("File:"..cover).exists == true
                            then s_image = cover
                            elseif mw.title.new("File:"..textless).exists == true
                                then s_image = textless
                                else s_image = "No Image Cover.jpg"
                        end
                end
 
                if h.isempty(s_title) == true
                    then s_title = ""
                    else s_title = '<br>"'..s_title..'"'
                end        
 
                s = padded_issue..'@@@'..s_image..'{{!}}'..link..s_title..'<br>('..publication_date..')\n'
                table.insert(t,s)
        end
    end
    table.sort(t)
 
    --volume_date_first = string.match(t[1],'<br>%((.+)%)\n')
    --volume_date_last = string.match(t[#t],'<br>%((.+)%)\n')
 
    part = tonumber(parts[1])
    i = 1
    while i <= #t do
        v = mw.text.split(t[i],"@@@",true)
        i = i + 1
        if h.isempty(part) == true or part == 0
            then table.insert(t2, v[2])  
            else table.insert(t2, {v[1], v[2]}) 
        end
    end
 
    if h.isempty(part) == true or part == 0
        then 
            a = above[1] or ''
            b = below[1] or ''
            output = a..frame:preprocess('{{#tag:gallery|'..table.concat(t2)..'|position=center|captionalign=center|hideaddbutton=true}}')..b
        else
            t = {}
            k = tonumber( t2[1][1] )
            f = parts[1]
            i = 1
            if parts[#parts] < tonumber( t2[#t2][1] )
                then table.insert(parts, tonumber( t2[#t2][1] ) )
            end
 
            while i <=#parts do
                part = tonumber(parts[i])
                if h.isempty(part) == true or part == 0
                    then break
                    else
                        a = above[i] or ''
                        b = below[i] or ''
                        part = {}
                        for j = 1, #t2 do
                            if tonumber( t2[j][1] ) >= tonumber (k) and tonumber( t2[j][1] ) <= tonumber (f)
                                then table.insert(part, t2[j][2])
                            end
                        end
                        i = i + 1
                        k = f+1
                        f = parts[i]
                        table.insert(t, a..frame:preprocess('{{#tag:gallery|'..table.concat(part)..'|position=center|captionalign=center|hideaddbutton=true}}')..b)
                        --table.insert(t, a..table.concat(part)..b)
                end
            end
        output = table.concat(t)
    end
 
    return output
end
 
function p.volume_dates(frame)
    return volume_date_first..'-'..volume_date_last
end
 
return p
Community content is available under CC-BY-SA unless otherwise noted.

Bring Your Marvel Movies Together