경고: 이 문서의 오래된 판을 편집하고 있습니다. 이것을 게시하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!-- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args['주제속성']) :css('text-align', 'center') :cssText(args['주제모양']) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args['항목모양']) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args['큰제목'] then return end root :tag('caption') :addClass(args['큰제목속성']) :cssText(args['큰제목모양']) :wikitext(args['큰제목']) end local function renderAboveRow() -- 제목 표시 if not args['제목'] then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args['제목속성']) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args['제목모양']) :wikitext(fixChildBoxes(args['제목'],'th')) end local function renderBelowRow() if not args['아랫글'] then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args['아랫글속성']) :css('text-align', 'center') :cssText(args['아랫글모양']) :wikitext(fixChildBoxes(args['아랫글'],'td')) end local function renderSubheaders() if args['작은제목'] then args['작은제목1'] = args['작은제목'] end if args['작은제목행속성'] then args['작은제목행속성1'] = args['작은제목행속성'] end local subheadernums = getArgNums('작은제목') for k, num in ipairs(subheadernums) do addRow({ data = args['작은제목' .. tostring(num)], datastyle = args['작은제목모양'], rowcellstyle = args['작은제목모양' .. tostring(num)], class = args['작은제목속성'], rowclass = args['작은제목행속성' .. tostring(num)] }) end end local function renderImages() if args['그림'] then args['그림1'] = args['그림'] end if args['그림설명'] then args['그림설명1'] = args['그림설명'] end local imagenums = getArgNums('그림') for k, num in ipairs(imagenums) do local caption = args['그림설명' .. tostring(num)] local data = mw.html.create():wikitext(args['그림' .. tostring(num)]) if caption then data :tag('div') :cssText(args['그림설명모양']) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args['그림모양'], class = args['그림속성'], rowclass = args['그림행속성' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('주제'), getArgNums('내용')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['주제' .. tostring(num)], label = args['항목' .. tostring(num)], data = args['내용' .. tostring(num)], datastyle = args['내용모양'], class = args['속성' .. tostring(num)], rowclass = args['행속성' .. tostring(num)], rowstyle = args['행모양' .. tostring(num)], rowcellstyle = args['행셀모양' .. tostring(num)], dataid = args['내용id' .. tostring(num)], labelid = args['항목id' .. tostring(num)], headerid = args['주제id' .. tostring(num)], rowid = args['행id' .. tostring(num)] }) end end local function renderNavBar() if not args['이름'] then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args['이름'], mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[분류:제목 변수가 있는 내포된 정보상자 틀을 사용하는 문서]]') end elseif #(getArgNums('내용')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[분류:내용 없이 정보상자 틀을 사용한 문서]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args['전체속성']) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args['전체모양']) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args['큰제목']) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('전체속성') preprocessSingleArg('subbox') preprocessSingleArg('전체모양') preprocessSingleArg('큰제목') preprocessSingleArg('큰제목속성') preprocessSingleArg('큰제목모양') preprocessSingleArg('제목') preprocessSingleArg('제목속성') preprocessSingleArg('제목모양') preprocessArgs({ {prefix = '작은제목', depend = {'작은제목모양', '작은제목행속성'}} }, 10) preprocessSingleArg('작은제목모양') preprocessSingleArg('작은제목속성') preprocessArgs({ {prefix = '그림', depend = {'그림설명', '그림행속성'}} }, 10) preprocessSingleArg('그림설명모양') preprocessSingleArg('그림모양') preprocessSingleArg('그림속성') preprocessArgs({ {prefix = '주제'}, {prefix = '내용', depend = {'항목'}}, {prefix = '행속성'}, {prefix = '행모양'}, {prefix = '행셀모양'}, {prefix = '속성'}, {prefix = '내용id'}, {prefix = '항목id'}, {prefix = '주제id'}, {prefix = '행id'} }, 50) preprocessSingleArg('주제속성') preprocessSingleArg('주제모양') preprocessSingleArg('항목모양') preprocessSingleArg('내용모양') preprocessSingleArg('아랫글') preprocessSingleArg('아랫글속성') preprocessSingleArg('아랫글모양') preprocessSingleArg('이름') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 편집 요약 가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 취소 편집 도움말 (새 창에서 열림) 이 문서에서 사용한 틀: 모듈:Infobox/설명문서 (편집)