Module:Comics/Sandbox

local p = {} local h = require("Module:HF") local SC = require("Module:StaffCorrection") local standart = require("Module:StandardizedName") local m = require("Module:Month") local border_color = '#B5B7CF' local background_color = '#EFF0FF' 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"}--, "Directors", "Producers", "CCO"} local staff_category_needed = {true, true, true, true, true, false, true, true, true} local staff_infobox_link = {true, true, true, true, true, true, true, true, true} local page = '' local pagename = '' local sortname = '' local title = {} local title_volume = '' local main_cover = '' local main_cover_textless = '' local categories = {} local box = {} local stories = {} local canceled = false local released = true local published_category = '' local published_link = '' local recent = true local year = '' local month = '' local season = '' local releasedate = '' local releaseweek = '' local covers = {} local captions = {}

function p.infobox(frame) local getArgs = require('Dev:Arguments').getArgs local args = getArgs (frame) local reprint_title = {} local reprint_story = {} local storytitles = {} local appearances = {} local synopses = {} local contributors = {} local staff = {} local editor_in_chief = '' local cover_artists = {} local reprint = '' local reprints_content = {} local reprint_storytitles = {} local previous_issue = '' local next_issue = '' local details1 = {} local details2 = {} local publisher = '' local main_image = '' local s = '' local n = '' local i = 0 local j = 0 local j = 0 local body = {} local categorize = true page = mw.title.getCurrentTitle pagename = page.text title = { standart.lua_get_title_volume_issue(pagename) } title_volume = title[1]..' Vol '..title[2] sortname = standart.lua_standardized_name_for_sorting(pagename,'Comics') main_cover = title[5]..' Vol '..title[2]..' '..title[3]..'.jpg' main_cover_textless = title[5]..' Vol '..title[2]..' '..title[3]..' Textless.jpg'

table.insert(categories, 'Comics' ) -- PUBLISHER (Category:Comics by Publisher) publisher = args['Publisher'] or 'Marvel Comics' --shouldn't they all be in this category? if h.isempty(publisher) == false then table.insert(categories, publisher ) end if string.find(pagename, ' Annual ') then table.insert(categories, 'Annuals' ) end if string.find(pagename, ' Handbook ') then table.insert(categories, 'Handbooks' ) end -- VOLUME (category) table.insert(categories, title_volume ) --MAIN IMAGE main_image = args['Image'] if h.isempty(main_image) then if p.lua_fileexist(main_cover) then main_image = main_cover elseif p.lua_fileexist(main_cover_textless) then main_image = main_cover_textless else main_image = 'No Image Cover.jpg' table.insert(categories, 'Cover Image Needed') end else if main_image ~= main_cover and main_image ~= main_cover_textless then table.insert(categories, 'Cover Image Correction Needed‎') end if main_image == 'No Image Cover.jpg' then table.insert(categories, 'Cover Image Needed') end end s = args['ImageSize'] or '300px' table.insert(box, '' ) s = '' -- ALTERNATE COVERS for i = 2,200 do       if h.isempty(args['Image'..i]) == false then table.insert( covers, args['Image'..i]) table.insert( captions, args['Image'..i..'Text'] or '') end end table.insert(box, p.lua_alternate_covers )

-- VOLUME (link) table.insert(box, p.lua_infobox_line(,,h.Link(title_volume, title_volume)..' #'..title[3]) )

-- PUBLICATION AND RELEASE DATES if h.isempty(args['Canceled']) == true then canceled = false -- not canceled else canceled = true -- canceled table.insert(categories, 'Canceled Comics') end releasedate = args['ReleaseDate'] year = args['Year'] month = args['Month'] season = args['Season'] if h.isempty(releasedate) == false then releasedate = p.lua_date_converter(releasedate, 'F j, Y') released = p.lua_date_comparison(releasedate) releaseweek = 'Week '..p.lua_date_converter(releasedate, 'W')..', '..p.lua_date_converter(releasedate, 'Y') table.insert(categories, releaseweek) if not released then table.insert(categories, 'Solicitations') end end

if h.isempty(month) == true then if h.isempty(season) == true then month = '' else month = season end end

if h.isempty(year) == false then sortname = p.lua_date_converter(m.month({month or '1'})..' '..year, 'Ymd')..sortname end p.lua_published table.insert(box, p.links_to_release_publication_dates)

-- ISSUE DETAILS table.insert(details1, { args['Pages'], 'Pages' } ) table.insert(details1, { args['Rating'], 'Rating' } ) table.insert(details1, { args['OriginalPrice'], 'Original Price' } ) table.insert(details1, { args['UPC'], 'UPC Number' } ) table.insert(details1, { args['ISSN'], 'ISSN' }) --table.insert(details1, args['Rating']) Production1_1 - Production1_5 --table.insert(details1, args['Rating']) Publisher1_1 - Publisher1_5 --table.insert(details1, args['Rating']) President1_1 - President1_5 table.insert(details1, { args['CCO'], 'Chief Creative Officer' } ) for i = 1, #details1 do       if h.isempty(details1[i][1]) == false then if i == 2 then table.insert(details2, p.lua_rating(details1[i][1]) ) else table.insert(details2, p.lua_infobox_line( details1[i][2], details1[i][1] ) ) end end end if h.isempty( details2 ) == false then table.insert(box, p.show_hide({ collapsed  = true, titlestyle = 'font-size: 10px;', extrastyle = 'width:100%; margin:0px; border:none; border-top:2px solid '..border_color..'; text-align:left; font-size: 10px;', title      = 'Issue Details', body       = table.concat(details2) }) )   end

for j = 1,#staff_fieldname-1 do       table.insert( staff, {} ) end -- STORIES for i = 1,80 do       table.insert( reprint_title, args['ReprintOf'..i] or '' ) table.insert( reprint_story, args['ReprintOfStory'..i] or '' ) table.insert( storytitles, args['StoryTitle'..i] or '' )

if h.isempty(reprint_title[i]) == false then if p.lua_count_inlist(categories, 'Reprints') == 0 then table.insert(categories, 'Reprints' ) end n = reprint_story[i] or '1' s = standart.lua_standardized_comics_name(reprint_title[i]) --checks if the same comics issue is reprinted several times, if it is, then its content is retrieved from the table, if not, then it returned by getContent - to prevent using getContent several times for the same comics issue --if p.lua_count_inlist(reprint_title, s)>1 --   then --       reprints_content[i] = reprints_content[p.lua_find_inlist(reprint_title, s)] --       reprint = reprints_content[i] --   else reprint = mw.title.new(s):getContent --       table.insert(reprints_content, reprint) table.insert(categories, s..'/Reprints') --end if h.isempty(reprint) == false then s = string.match(reprint, '|%s-StoryTitle'..n..'%s-=%s-(.-)\n') reprint_storytitles[i] = s or '' for j = 1,#staff_fieldname-2 do                           for k = 1,50 do                                s = string.match(reprint, '|%s-'..staff_fieldname[j]..n..'_'..k..'%s-=%s-(.-)\n') staff[j][k] = h.trim(s) or '' end end appearances[i] = p.lua_reprint_appearances( string.match(reprint, '|%s-Appearing'..n..'%s-=%s-(.-)\n|'), pagename ) synopses[i] = string.match(reprint, '|%s-Synopsis'..n..'%s-=%s-(.-)\n|') categorize = false else appearances[i] = '' synopses[i] = '' end else table.insert( appearances, args['Appearing'..i] or '' ) table.insert( synopses, args['Synopsis'..i] or '' ) categorize = true for j = 1,#staff_fieldname-2 do                   for k = 1,50 do                         staff[j][k] = args[staff_fieldname[j]..i..'_'..k] or '' end end end

if h.isempty(storytitles[i]) == false or           h.isempty(reprint_storytitles[i]) == false or           h.isempty(reprint_title[i]) == false or           h.isempty(appearances[i]) == false or           h.isempty(synopses[i]) == false or           i == 1 then stories[i] = true else stories[i] = false end if stories[i] == true then storytitles[i] = p.lua_StoryTitle( i, storytitles[i], reprint_storytitles[i] )

body = {} for j = 1,#staff_fieldname-2 do                   table.insert(body, p.lua_infobox_line_staff(staff[j], j, categorize) ) end body = table.concat(body) contributors[i] = p.lua_story_contributors( storytitles[i], body ) --if not a reprint and appearances section is empty or filled only with sub-headers, then add into 'Appearances Needed' category if h.isempty(appearances[i]) == true or (h.isempty(reprint_title[i]) == true and p.lua_appearances_isempty(appearances[i]) == true) then appearances[i] = '\n* Appearances not yet listed' if not canceled then table.insert(categories, 'Appearances Needed') end end if h.isempty(synopses[i]) == true then synopses[i] = '\n* Synopsis not yet written' if not canceled then table.insert(categories, 'Comic Synopsis Needed') end end end table.insert(box, contributors[i]) end -- cover artists for k = 1,50 do       s = args[staff_fieldname[#staff_fieldname-1]..k]        if h.isempty(s) == false then s = SC.Correction(s) else s = '' end table.insert( cover_artists, s ) end -- editor-in-chief s = args["Editor-in-Chief"] if h.isempty(s) == false then s = SC.Correction(s) else s = '' end editor_in_chief = ''

for i = 1,#categories do       categories[i] = h.CategoryLink(categories[i], sortname) end

previous_issue = args['PreviousIssue'] or standart.lua_standardized_link(title_volume..' '..tonumber(title[3])-1, 'Comics') next_issue = args['NextIssue'] or standart.lua_standardized_link(title_volume..' '..tonumber(title[3])+1, 'Comics') table.insert(box, p.lua_infobox_line_horizontal('Previous Issue', previous_issue, 'Next Issue', next_issue))

return table.concat(box) --return mw.text.listToText( staff[1] ), "_", mw.text.listToText( staff[2] ) --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.lua_story_contributors(storytitle, text) local output = '' if h.isempty(text) == false then output = p.show_hide({           collapsed   = false,            titlestyle  = 'width:88%; text-align:left;',            extrastyle  = 'width:100%; center; margin:0px; border:none; border-top:2px solid '..border_color..'; text-align:left;',            title       = h.Link(page.prefixedText..'#Appearing in '..storytitle, storytitle),             body        = text        }) end return output end

--transform the list of contributors into infobox line with or without categorization function p.lua_infobox_line_staff(list, n, cat) local i   local name = '' local corrected = '' local job = '' local output = ''

if h.isempty(list) == false then if staff_infobox_link[n] == true then job = ..staff_singular[n].. else job = staff_plural[n] end for i = 1, #list do               v = list[i] if h.isempty(v) == false then c = SC.Correction(v) if string.lower(v) == 'uncredited' or string.lower(v) == 'n/a' then list[i] = '\nUncredited' else list[i] = '\n'..h.Link(c, v)--..' ' if cat == "yes" then table.insert(categories, c..'/'..staff_plural[n]) end end end end list = table.concat(list) if h.isempty(list) == false then output = p.lua_infobox_line( job, list ) end elseif staff_category_needed[n] == true --and released == true then table.insert(categories, staff_singular[n]..' Needed') end return output 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 = ..t.. end l = p.lua_StoryContributors(l, t, cat) if h.isempty(l) == false then return frame:preprocess( '' ) elseif cat == 'yes' and needed ~= 'no' then return '' else return '' end end

function p.lua_appearances_isempty(appearances) local s = appearances or '' s = mw.text.split(s, '\n', true) local output = 0 local empty = { "Featured Characters:", "* ", "Supporting Characters:", "* ", "Antagonists:", "* ", "Other Characters:", "* ", "Locations:", "* ", "Items:", "* ", "Vehicles:", "* " }   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 --not empty else output = true --empty 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(date, format) local l = mw.language.new('en') local s = {} --1 = year, 2 = month, 3 = day local i = 0 local j = 0 local output = '' --'To comma' = 'F j, Y', "dash" = 'm-d-Y' format = format or 'Ymd'

if h.isempty(date) == true then output = l:formatDate(format) else i = string.find(date, '-',1,true) j = string.find(date, ', ',1,true) if i ~= nil then j = string.find(date, '-',i+1,true) s[2] = m.month({ string.sub(date, 1, i-1) }) s[3] = string.sub(date, i+1, j-1) if #s[3] == 1 then s[3] = '0'..s[3] end s[1] = string.sub(date, j+1, #s) output = l:formatDate(format, s[2]..' '..s[3]..' '..s[1]) elseif j ~= nil then s[1] = string.sub(date, j+2, #date) i = string.find(date, ' ',1,true) s[2] = m.month({ string.sub(date, 1, i-1) }) s[3] = string.sub(date, i+1, j-1) if #s[3] == 1 then s[3] = '0'..s[3] end output = l:formatDate(format, s[2]..' '..s[3]..' '..s[1]) else output = l:formatDate(format, date) end end return output end

--compares two dates. Return "true" if 1st date is before the 2nd date, and "false" otherwise. function p.lua_date_comparison(date1, date2) date1 = p.lua_date_converter(date1, 'Ymd') date2 = p.lua_date_converter(date2 or 'now', 'Ymd') --If 2nd date is ommited, then current date is used for comparison.

if date1<=date2 then return true else return false end 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

--check if comics is recently released/published function p.lua_recent(releasedate, month, year, season, canceled) local current = p.lua_date_converter local output = false local s = '-4 months' if h.isempty(canceled) == true then if h.isempty(month) == true then if h.isempty(season) == true then month = '1' else month = season end end month = m.month({month}) if h.isempty(releasedate) == true and h.isempty(year) == false then releasedate = month..' 01 '..year s = '-2 months' end releasedate = p.lua_date_converter(releasedate, 'Ymd') if releasedate>=p.lua_date_converter(s, 'Ymd') and releasedate<=current then output = true end end return output end

--returns publication category function p.lua_published local month2 = m.month({month or '1'}) --local output = ''

if h.isempty(year) == false then sortname = p.lua_date_converter(month2..' '..year, 'Ymd')..sortname table.insert(categories, year) published_category = year published_link = year if h.isempty(month) == false then month = m.month({month}) published_category = year..', '..month published_link = month..', '..year table.insert(categories, published_category) end table.insert(categories, p.lua_era) else table.insert(categories, 'Need Comic Dates' ) end --return output 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 = m.month({month}) s = ..month..', '..year.. else s = ..year.. end end return s end

--returns era based on year function p.lua_era(t) local output = '' year = tonumber(year) if h.isempty(year) == false then if h.isempty(t) == true then t = '' else t = ' '..t           end if year<1955 then output = 'Golden-Age'..t end if year>=1955 and year<1970 then output = 'Silver-Age'..t end if year>=1970 and year<1983 then output = 'Bronze-Age'..t end if year>=1983 and year<1992 then output = 'Copper-Age'..t end if year>=1992 then output = 'Modern-Age'..t end end return output end

function p.links_to_release_publication_dates local release = h.Link(':Category:'..releaseweek, releasedate) local published = h.Link(':Category:'..published_category, published_link) local output = '' local s1 = '' local s2 = '' if canceled then s1 = 'Intended Publication Date' s2 = 'Intended Release Date' else s1 = 'Published' s2 = 'Released' end

if h.isempty(published) == false then if h.isempty(releasedate) == false then output = p.lua_infobox_line_horizontal(s1, published, s2, release) else output = p.lua_infobox_line_horizontal(s1, published) end elseif h.isempty(releasedate) == false then output = p.lua_infobox_line_horizontal(s2, release) end return output 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_names[i]..'"' j = j + 1 end end if #e > 0 then s = 'Part of the ' if #e > 1 then s = s..mw.text.listToText( e )..' events' else s = s..e[1]..' event' end s = s..' ' 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_names[i]..'"' j = j + 1 end end if #a > 0 then if s ~= '' then s = s..' ' end s = s..'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..' ' 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_names[i]..'"' j = j + 1 end end if #sl > 0 then if s ~= '' then s = s..' ' end s = s..'Part of the ' if #sl > 1 then s = s..mw.text.listToText( sl )..' storylines' else s = s..sl[1]..' storyline' end s = s..' ' end

return 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( '"'..q..'"

- '..s..' ' )           else return ''    end end

--returns story title, story title from reprint or story number if none of them exists function p.lua_StoryTitle(number,st,reprint_st) number = tonumber(number) if number % 10 == 1 and number ~= 11 -- in (1,21,31,41,51,61,71) then number = number..'st' elseif number % 10 == 2 and number ~= 12 -- in (2,22,32,42,52,62,72) then number = number..'nd' elseif number % 10 == 3 and number ~= 13 --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_fileexist(file) return mw.title.new("File:"..file).exists end

-- get the list of images and captions and transform them into gallery of alternate covers function p.lua_alternate_covers local i = 1 local j = 1 local s = '' local output = {}

if (#covers == 0 or covers[1] ~= main_cover_textless) and p.lua_fileexist(main_cover_textless) then table.insert(covers, 1, main_cover_textless) table.insert(captions, 1, 'Textless') end if #covers > 0 and covers[1] == main_cover_textless and ( h.isempty(captions[1]) == true or captions[1] ~= 'Textless' ) then captions[1] = 'Textless' end

for j = 1,#covers do       s = tostring(mw.html.create( 'div' )                :css( 'float', 'left' )                :css( 'width', '65px' )                :css( 'text-align', 'center' )                :css( 'font-size', '10px' )                :css( 'font-weight', 'bold' )                :css( 'line-height', '1.5em' )                :css( 'margin', '2px 8px' )                :wikitext(''..captions[j])                :done ) --''..captions[j]..' ' if i == 3 then s = s..' ' i = 1 else i = i + 1 end table.insert(output, s)   end if #output > 0 then output = p.show_hide({           collapsed   = true,            titlestyle  = 'font-size:14px; text-align:left;',            extrastyle  = 'width:100%; border:none;',            extrastyle2 = 'font-size:11px;',            title       = h.Link(':Category:'..page.text..'/Images', 'Alternate Covers:'),             body        = table.concat(output)        }) else output = '' end return output 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    local n    list = mw.text.unstrip(l) list = mw.text.split(l,'\n') n = #list for i = 1,n do       l = list[i] l = mw.ustring.gsub(l, '', '%1' ) l = mw.ustring.gsub(l, '', '%1' ) l = mw.ustring.gsub(l, '', '%1' ) l = mw.ustring.gsub(l, ,  ) l = mw.ustring.gsub(l, '', '%1 ' ) l = mw.ustring.gsub(l, '', '%1 ' ) l = mw.ustring.gsub(l, '', '%1 ' ) l = mw.ustring.gsub(l, '', '%1 ' ) l = mw.ustring.gsub(l, ,  ) l = mw.ustring.gsub(l, ,  ) j, k = mw.ustring.find(string.lower(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[2]..' ' elseif #s2 == 2 then s2 = s2[1]..' ' else s2 = s2[1] end end l = s1..s2..s3       end l = mw.ustring.gsub(l, '', '%1 ' ) l = mw.ustring.gsub(l, '', '%1' ) l = mw.ustring.gsub(l, '', '%1 ' ) l = mw.ustring.gsub(l, '', '%1' ) l = mw.ustring.gsub(l, '(', '%2 %1}}' )       l = mw.ustring.gsub(l, ,  )        l = mw.ustring.gsub(l, ,  )        --l = mw.ustring.gsub(l, ,  )        j, k = mw.ustring.find(string.lower(l), ,1,true)        if j ~= nil             then                s1 = string.sub( l, 1, j-1 )                s2 =                 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;', '>' )        list[i] = '\n'..l    end    return table.concat(list) end

function p.lua_rating(rating) local output = {, } local ratings = { ['all ages'] = { 'All Ages (for all ages)', 'All Ages (for all ages)' }, ['a'] = { 'A (9 and up)', 'A (9 and up)' }, ['psr'] = { 'PSR (9 and up)', 'PSR (9 and up)' }, ['pg'] = { 'PG (9 and up)', 'PG (9 and up)' }, ['a-'] = { 'A- (9 and up)', 'A- (9 and up)' }, ['a+'] = { 'A+ (9 and up)', 'A+ (9 and up)' }, ['t'] = { 'T (13 and up)', 'T (13 and up)' }, ['teen'] = { 'Teen (13 and up)', 'T (13 and up)' }, ['psr+'] = { 'PSR+ (13 and up)', 'PSR+ (13 and up)' }, ['pg+'] = { 'PG+ (13 and up)', 'PG+ (13 and up)' }, ['t-'] = { 'T- (13 and up)', 'T- (13 and up)' }, ['t+'] = { 'T+ (13 and up)', 'T+ (13 and up)' }, ['pa'] = { 'Parental Advisory (15 and up)', 'Parental Advisory (15 and up)' }, ['parental advisory'] = { 'Parental Advisory (15 and up)', 'Parental Advisory (15 and up)' }, ['pa/ec'] = { 'Parental Advisory (15 and up)', 'PA/EC (15 and up)' }, ['explicit content'] = { 'Parental Advisory (15 and up)', 'Explicit Content (15 and up)' }, ['parental advisory/explicit content'] = { 'Parental Advisory (15 and up)', 'Parental Advisory/Explicit Content (15 and up)' }, ['mature'] = { 'MAX: Explicit Content (18 and up)', 'Mature' }, ['max'] = { 'MAX: Explicit Content (18 and up)', 'MAX: Explicit Content (18 and up)' }, ['maxx'] = { 'MAXX: Explicit Content (18 and up)', 'MAXX: Explicit Content (18 and up)' } }   if h.isempty(rating) == false then output = ratings[string.lower(rating)] or {rating, rating} table.insert(categories, output[1]) output = p.lua_infobox_line( 'Rating', h.Link(':Category:'..output[1], output[2]) ) end return output end

function p.show_hide(frame) local getArgs = require('Dev:Arguments').getArgs local args = getArgs (frame)

local title = args['title'] or args['header'] or ' ' local body = args['body'] or args['text'] or '' local collapsed = args['collapsed'] local clear = args['clear'] or 'both' local border = args['border'] or border_color local extrastyle = args['extrastyle'] or '' local extrastyle2 = args['extrastyle2'] or '' local extrastyle3 = args['extrastyle3'] or '' local width = args['width'] or '100%' local background = args['background'] or background_color local titlestyle = args['titlestyle'] or ''

if h.isempty(collapsed) or collapsed == 'true' or collapsed == true then collapsed = ' mw-collapsed' else collapsed = '' end

local tag_td = mw.html.create( 'td' ) :css( 'margin', '0.5em' ) :css( 'font-size', '1em' ) :wikitext(body) :done if h.isempty(extrastyle3) == false then tag_td:cssText (extrastyle3):done end tag_td = ' '..tostring(tag_td)..' '

local tag_div = mw.html.create( 'div' ) :css( 'font-weight', 'bold' ) :wikitext(title) :done if h.isempty(titlestyle) == false then tag_div:cssText (titlestyle):done end tag_div = tostring(tag_div) local tag_th = mw.html.create( 'th' ) :attr('colspan', '1') :css( 'background-color', background ) :css( 'font-size', '1.1em' ) :wikitext(tag_div) :done if h.isempty(extrastyle2) == false then tag_th:cssText (extrastyle2):done end tag_th = ' '..tostring(tag_th)..' ' local tag_table = mw.html.create( 'table' ) :addClass('mw-collapsible'..collapsed) :css( 'clear', clear ) :css( 'border', '1px solid '..border ) :css( 'font-size', '0.85em' ) :css( 'width', width ) :wikitext(tag_th..tag_td) :done if h.isempty(extrastyle) == false then tag_table:cssText (extrastyle):done end return tostring(tag_table) end

function p.lua_infobox_line(left, right, text, width_l, width_r) left = left or '' right = right or '' text = text or '' width_l = width_l or '100px' width_r = width_r or '190px' local tag_l = mw.html.create( 'div' ) :css( 'width', width_l ) :css( 'text-align', 'left' ) :css( 'float', 'left' ) :wikitext(left) :done local tag_r = mw.html.create( 'div' ) :css( 'width', width_r ) :css( 'text-align', 'right' ) :css( 'float', 'left' ) :wikitext(right) :done tag_l = tostring(tag_l) tag_r = tostring(tag_r) local tag = mw.html.create( 'div' ) :css( 'border-top', '1px solid '..border_color ) :css( 'text-align', 'center' ) :css( 'clear', 'left' ) :css( 'font-size', '10px' ) :wikitext(text..tag_l..tag_r) :done return tostring(tag) end

function p.lua_infobox_line_horizontal(leftheader, lefttext, rightheader, righttext, totalwidth) local output = ''

if h.isempty(totalwidth) == false then totalwidth = tostring(tonumber(totalwidth)/2)..'px' else totalwidth = '50%' end rightheader = rightheader or '' lefttext = lefttext or '' righttext = righttext or '' local tag_leftheader = mw.html.create( 'div' ) :css( 'width', totalwidth ) :css( 'float', 'left' ) :wikitext(leftheader) :done output = output..tostring(tag_leftheader) if h.isempty(righttext) == false then local tag_rightheader = mw.html.create( 'div' ) :css( 'width', totalwidth ) :css( 'float', 'left' ) :css( 'clear', 'right' ) :wikitext(rightheader) :done output = output..tostring(tag_rightheader) end output = output..' ' local tag_lefttext = mw.html.create( 'div' ) :css( 'width', totalwidth ) :css( 'float', 'left' ) :css( 'clear', 'left' ) :wikitext(lefttext) :done output = output..tostring(tag_lefttext) local tag_righttext = mw.html.create( 'div' ) :css( 'width', totalwidth ) :css( 'float', 'left' ) :wikitext(righttext) :done output = output..tostring(tag_righttext) local tag = mw.html.create( 'div' ) :css( 'border-top', '1px solid '..border_color ) :css( 'text-align', 'center' ) :css( 'clear', 'left' ) :css( 'font-size', '10px' ) :wikitext(output) :done

return tostring(tag) end

--counts how many times "text" is found in the "list" function p.lua_count_inlist(list, text) local output = 0 if h.isempty(list) == false and h.isempty(text) == false then for i, v in ipairs( list ) do               if v == text then output = output + 1 end end end return output end

--returns number of "text" element in the "list" function p.lua_find_inlist(list, text) local output = 0 if h.isempty(list) == false and h.isempty(text) == false then for i, v in ipairs( list ) do               if v == text then output = i                       break end end end return output end

-- forms a gallery of comics issues in specified volume based on dpl query from vloume category function p.volume(frame) 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 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 = ''

for i = 1,9 do       table.insert(parts, tonumber(standart.lua_padded_issue(args['part'..i]))) table.insert(above, args['part'..i..'_above']) table.insert(below, args['part'..i..'below']) 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]

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') 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 = ' "'..s_title..'"' end

s = padded_issue..'@@@'..s_image..'|'..link..s_title..' ('..publication_date..')\n' table.insert(t,s) end table.sort(t) 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 output = frame:preprocess('') --output = table.concat(t2) 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('')..b)                       --table.insert(t, a..table.concat(part)..b)                end end output = table.concat(t) end return output end

return p