FANDOM


-- [[틀:포켓몬화면]]
-- @Author: [[User:Cafeinlove]] at ko.pokemon.wikia.com
-- @License: MIT License
 
local p = {}
 
-- Dependencies
local getArgs = getArgs or require( 'Module:Arguments' ).getArgs
local color = color or require( 'Module:Color' )
local scheme = scheme or mw.loadData( 'Module:Color/Scheme' )
local typeScheme = typeScheme or scheme.types
local moveScheme = moveScheme or scheme.moves
local pokedex = pokedex or require( 'Module:Pokedex' )
 
-- Common variables
local args
local game
local generation
local types, colorSet = {}, {}
local options = {
    animatedImage = false,
    flipImage = false,
    gender = true,
    ability = true,
    item = true,
    skillCategory = true
}
local blankStr = ''
local entry -- 출력할 HTML
 
-- 게임 약어 데이터 (도트이미지에 필요)
local gameAbbr = {
    ['적'] = '적녹',
    ['녹'] = '적녹',
    ['적녹'] = '적녹',
    ['청'] = '청',
    ['옐로'] = '옐로',
    ['피카츄'] = '피카',
    ['금'] = '금',
    ['은'] = '은',
    ['크리스탈'] = '크리스',
    ['크'] = '크리스',
    ['루비'] = '루사',
    ['루'] = '루사',
    ['사파이어'] = '루사',
    ['사'] = '루사',
    ['루사'] = '루사',
    ['에메랄드'] = '에메',
    ['에메'] = '에메',
    ['파레'] = '파레리그',
    ['리그'] = '파레리그',
    ['파레리그'] = '파레리그',
    ['파리'] = '파레리그',
    ['다이아몬드'] = '다펄',
    ['다'] = '다펄',
    ['펄'] = '다펄',
    ['다펄'] = '다펄',
    ['플라티나'] = '플라',
    ['플라'] = '플라',
    ['플'] = '플라',
    ['하트골드'] = '하골소실',
    ['하골'] = '하골소실',
    ['소울실버'] = '하골소실',
    ['소실'] = '하골소실',
    ['하골소실'] = '하골소실',
    ['하소'] = '하골소실',
    ['블화'] = '블화',
    ['블랙'] = '블화',
    ['화이트'] = '블화',
    ['블화2'] = '블화2',
    ['블랙2'] = '블화2',
    ['화이트2'] = '블화2',
}
local suffixes = {
    back = '뒷_',
    shiny = '_색다른',
    female = '_암컷'
}
 
--- getColorSet(): 타입에 맞는 색상표를 픽업
-- @param typeName{str}
local function getColorSet( key, colorTbl )
    local colorSet = blankStr
 
    if colorTbl[key] then
        colorSet = colorTbl[key]
    end
 
    return colorSet
end
 
--- setLeftColumn(): 좌측 열의 기본 데이터를 구성
local function setLeftColumn()
    local container
    local pGen, pGame, pIndex, pName, pForm, pGender, pLevel, pType, pAbil, pItem
    local image, imageExtension, isBack, isFemale, isShiny, shinyIcon
 
    container = mw.html.create( 'td' ):css( 'width', '170px' )
 
    -- 게임 데이터 처리
    pGame = game ~= blankStr and game .. '_' or game
 
    -- 번호, 데이터 처리
    if args['번호'] then
        pIndex = args['번호']
        pName = pokedex.getName( pIndex )
    else
        pIndex = blankStr
        pName = blankStr
    end
 
    -- 뒷모습 처리
    if options.flipImage == true then
        isBack = suffixes.back
        pGen = generation .. '세대_'
        pGame = blankStr
    else
        isBack = blankStr
        pGen = generation
    end
 
    -- 폼체인지 데이터 처리
    pForm = args['폼'] or blankStr
 
    -- 성별 데이터 처리
    pGender = args['성별']
 
    local genderFormat = {
        ['수'] = '<span style="color: skyblue">♂</span>',
        ['암'] = '<span style="color: red">♀</span>'
    }
    genderFormat['랜덤'] = genderFormat['수'] .. '/' .. genderFormat['암']
 
    pGender = genderFormat[pGender] or blankStr
    isFemale = args['도트성별'] == '암' and suffixes.female or blankStr
 
    -- 레벨 데이터 처리
    pLevel = args['레벨'] or '??'
 
    -- 이로치 데이터 처리
    if args['이로치'] then
        isShiny = suffixes.shiny
        shinyIcon = '[[파일:블화 이로치.png]]'
    else
        isShiny = blankStr
        shinyIcon = blankStr
    end
 
    -- 이미지 데이터
    imageExtension = options.animatedImage == true and '.gif' or '.png'
 
    if generation == '6' then
        pGen = '6'
        pGame = 'XY_'
    end
 
    image = '[[파일:도트_' .. isBack .. pGen .. pGame .. pIndex .. pForm .. isFemale .. isShiny .. imageExtension .. ']]'
 
    -- 이미지 셀 추가
    container
        :tag( 'div' )
            :addClass( 'bg-white text-center' )
            :css({
                ['border-radius'] = '5px',
                ['margin-bottom'] = '5px',
                ['min-height'] = '160px',
                ['position'] = 'relative'
            })
            :tag( 'div' )
                :addClass( 'centered text-nowrap' )
                :wikitext(
                    image .. '<br>'.. pName ..' ' .. pGender .. ' Lv.' .. pLevel .. shinyIcon
                )
 
    -- 타입, 특성, 도구 행 추가
    local function addDataRow( thData, tdData )
        local row = container:tag( 'div' )
 
        row
            :addClass( 'w-100 text-left group' )
            :tag( 'div' )
                :addClass( 'float-left pr-1 text-right text-small font-weight-bold' )
                :css({
                    ['width'] = '3em',
                    ['line-height'] = '1.6rem'
                })
                :wikitext( thData .. ':' )
        row
            :tag( 'div' )
                :addClass( 'float-left' )
                :wikitext( tdData )
    end
 
    -- 타입 추가
    pType = color.toTypeLink( types[1], types[2] )
 
    addDataRow( '타입', pType )
 
    -- 특성 추가
    if options.ability == true then
        local abilities = { args['특성1'], args['특성2'] }
 
        if #abilities == 0 then
            pAbil = '특성 없음'
        else
            pAbil = blankStr
 
            for i = 1, #abilities do
                pAbil = pAbil .. '<div>'
                    .. color.toLink( '111', abilities[i] ) .. '</div>'
            end
        end
 
        addDataRow( '특성', pAbil )
    end
 
    -- 도구 추가
    if options.item == true then
        local item = args['도구']
 
        if item then
            pItem = '[[파일:도트_아이콘_' .. item .. '.png]]'
                .. color.toLink( '111', item )
        else
            pItem = '도구 없음'
        end
 
        addDataRow( '도구', pItem )
    end
 
   return container
end
 
--- addSkill(): 기술표를 추가
local function addSkill( data, index )
    local tbl = mw.html.create( 'table' )
    local sName, sType, sCat
    local sNameFormat, sTypeFormat, sCatFormat = '--', blankStr, blankStr
    local typeColor = 'transparent' --typeScheme['???'][2]
 
    if data then
        sName, sType, sCat = data[1], data[2], data[3]
        typeColor = getColorSet( sType, typeScheme )[2]
 
        if sName then sNameFormat = color.toLink( '111', sName ) end
        if sType then sTypeFormat = color.toTypeLink( sType ) end
        if sCat then sCatFormat = color.toMoveText( sCat ) end
    else
        tbl:css( 'padding', '.5em 0' )
    end
 
    if index ~= 1 then
        tbl:css( 'margin', '5px 0 0' )
    end
 
    tbl
        :addClass( 'w-100 bg-white' )
        :css({
            ['border'] = '2px solid ' .. typeColor,
            ['border-radius'] = '5px',
            ['border-spacing'] = 0
        })
 
    local firstRowCell = tbl:tag( 'tr' ):tag( 'td' )
    local secondRow = tbl:tag( 'tr' ):css( 'font-size', '12px' )
 
    firstRowCell
        :addClass( 'text-nowrap' )
        :css( 'padding', '.2em 0' )
        :wikitext( sNameFormat )
 
    if data then
        secondRow
            :tag( 'td' )
                :wikitext( sTypeFormat )
 
        if options.skillCategory == true then
            firstRowCell
                :attr( 'colspan', 2 )
 
            secondRow
                :tag( 'td' )
                    :addClass( 'w-50' )
                    :wikitext( sCatFormat )
        end
    end
 
    return tbl
end
 
--- setRightColumn(): 우측 열의 기술표를 구성
local function setRightColumn()
    local container = mw.html.create( 'td' )
    local skills = {}
 
    container
        :addClass( 'text-center' )
 
    for k, v in pairs( args ) do
        local cat, num = tostring( k ):match('^(기술.*)([1-9]%d*)$')
 
        num = tonumber( num )
        if cat and not skills[num] then skills[num] = {} end
 
        if cat == '기술' then
            skills[num][1] = v
        elseif cat == '기술타입' then
            skills[num][2] = v
        elseif cat == '기술분류' then
            skills[num][3] = v
        end
    end
 
    for i = 1, 4 do
        local skill = addSkill( skills[i], i )
        container:node( skill )
    end
 
    return container
end
 
--- buildOut(): 출력할 HTML을 구성
local function buildOut()
    entry = mw.html.create( 'table' )
        :addClass( 'rounded' )
        :css({
            background = colorSet[1][1],
            border = '3px solid ' .. colorSet[2][2],
            margin = '2px 0',
            padding = '2px',
            width = '330px'
        })
 
    local leftColumn = setLeftColumn()
    local rightColumn = setRightColumn()
 
    entry
        :tag( 'tr' )
        :addClass( 'align-top' )
            :node( leftColumn )
            :node( rightColumn )
end
 
-- processArgs(): 파라미터를 프로세스
local function processArgs()
    -- 세대에 따라 옵션 변경
    generation = args['세대'] or '7'
 
    local _generation = tonumber( generation )
 
    if _generation < 2 then
        options.gender = false
        options.item = false
    end
    if _generation < 3 then
        options.ability = false
    end
    if _generation < 4 then
        options.skillCategory = false
    end
 
    -- 게임타이틀에 따라 옵션 변경
    local _game = args['게임']
    local useAnimation = { '크리스', '에메', '블화2' }
 
    if _generation < 6 then
        game = gameAbbr[_game] or blankStr
 
        for i = 1, #useAnimation do
            if useAnimation[i] == game then
                options.animatedImage = true
            end
        end
 
        if args['앞뒤'] == '뒤' then
            options.animatedImage = false
        end
    else
        game = '모델링'
        options.animatedImage = true
    end
 
    -- 뒷모습
    if args['앞뒤'] == '뒤' then
        options.flipImage = true
    end
 
    -- 타입 데이터를 이용해 색상표 정의
    types[1] = args['타입1'] or '???'
    types[2] = args['타입2'] or types[1]
 
    for i = 1, #types do
        colorSet[i] = getColorSet( types[i], typeScheme )
    end
end
 
-- Main function
function p.main( frame )
    args = getArgs( frame )
 
    processArgs() -- 파라미터를 프로세스
    buildOut() -- 출력할 HTML을 구성
 
    return entry:done()
end
 
return p
Community content is available under CC-BY-SA unless otherwise noted.