Infobox

모듈:Infobox는 } 틀을 구현하는 모듈입니다.

local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern1 = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local category_in_empty_row_pattern2 = '%[%[%s*분류%s*:[^]]*]]' local has_rows = false local lists = { plainlist_t = { patterns = { '^plainlist$', '%splainlist$', '^plainlist%s', '%splainlist%s' }, found = false, styles = 'Plainlist/styles.css' }, hlist_t = { patterns = { '^hlist$', '%shlist$', '^hlist%s', '%shlist%s' }, found = false, styles = 'Hlist/styles.css' } }  local function has_list_class(args_to_check) for _, list in pairs(lists) do if not list.found then for _, arg in pairs(args_to_check) do for _, pattern in ipairs(list.patterns) do if mw.ustring.find(arg or '', pattern) then list.found = true break end end if list.found then break end end end end end  local param_ko = { ['이름'] = 'name', ['주제'] = 'header', ['주제id'] = 'headerid', ['주제속성'] = 'headerclass', ['주제모양'] = 'headerstyle', ['항목'] = 'label', ['항목id'] = 'labelid', ['항목모양'] = 'labelstyle', ['내용'] = 'data', ['내용id'] = 'dataid', ['내용모양'] = 'datastyle', ['속성'] = 'class', ['행id'] = 'rowid', ['행속성'] = 'rowclass', ['행모양'] = 'rowstyle', ['행셀모양'] = 'rowcellstyle', ['큰제목'] = 'title', ['큰제목속성'] = 'titleclass', ['큰제목모양'] = 'titlestyle', ['제목'] = 'above', ['제목속성'] = 'aboveclass', ['제목모양'] = 'abovestyle', ['아랫글'] = 'below', ['아랫글속성'] = 'belowclass', ['아랫글모양'] = 'belowstyle', ['작은제목'] = 'subheader', ['작은제목모양'] = 'subheaderstyle', ['작은제목속성'] = 'subheaderclass', ['작은제목행속성'] = 'subheaderrowclass', ['그림'] = 'image', ['설명'] = 'caption', ['그림설명'] = 'caption', ['그림모양'] = 'imagestyle', ['그림속성'] = 'imageclass', ['그림행속성'] = 'imagerowclass', ['그림설명모양'] = 'captionstyle', ['전체속성'] = 'bodyclass', ['전체모양'] = 'bodystyle', }  for i = 1, 200 do param_ko['작은제목' .. i] = 'subheader' .. i param_ko['작은제목행속성' .. i] = 'subheaderrowclass' .. i param_ko['그림' .. i] = 'image' .. i param_ko['설명' .. i] = 'caption' .. i param_ko['그림설명' .. i] = 'caption' .. i param_ko['주제' .. i] = 'header' .. i param_ko['항목' .. i] = 'label' .. i param_ko['내용' .. i] = 'data' .. i param_ko['내용모양' .. i] = 'datastyle' .. i param_ko['속성' .. i] = 'class' .. i param_ko['행속성' .. i] = 'rowclass' .. i param_ko['행모양' .. i] = 'rowstyle' .. i param_ko['행셀모양' .. i] = 'rowcellstyle' .. i param_ko['내용id' .. i] = 'dataid' .. i param_ko['항목id' .. i] = 'labelid' .. i param_ko['주제id' .. i] = 'headerid' .. i param_ko['행id' .. i] = 'rowid' .. i end  local function localname(parameter) return param_ko[parameter] or parameter end  local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end  if notempty(sval) then local marker = '' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(%s*)(%[%[%s*분류%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(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, '(%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*)', '%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 .. '>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = ''end s = s .. ' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<' .. tt .. ' colspan=2>\n' .. subcells[k] .. ' .. tt .. '>' 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  -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, ']*>%s*', '') end end  -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2)  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  -- 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 function getArgNums(prefix) 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  -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs)  if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass })  root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox- .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[분류:무시된 데이터 셀이 있는 정보상자 틀을 사용하는 문서]]' ) end elseif rowArgs.data and ( rowArgs.data:gsub(category_in_empty_row_pattern1, ''):match('^%S') or rowArgs.data:gsub(category_in_empty_row_pattern2, ''):match('^%S') ) then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class })  local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox- .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end  local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox- .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end  local function renderTitle() if not args.title then return end  has_rows = true has_list_class({args.titleclass})  root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox- .infobox-title :cssText(args.titlestyle) :wikitext(args.title)  end  local function renderAboveRow() if not args.above then return end  has_rows = true has_list_class({ args.aboveclass })  root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox- .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end  local function renderBelowRow() if not args.below then return end  has_rows = true has_list_class({ args.belowclass })  root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox- .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end  local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and ( subheaderArgs.data:gsub(category_in_empty_row_pattern1, ''):match('^%S') or  subheaderArgs.data:gsub(category_in_empty_row_pattern2, ''):match('^%S') ) then has_rows = true has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })  local row = root:tag('tr') row:addClass(subheaderArgs.rowclass)  local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end  local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox- .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end  local function addImageRow(imageArgs)  if imageArgs.data and ( imageArgs.data:gsub(category_in_empty_row_pattern1, ''):match('^%S') or imageArgs.data:gsub(category_in_empty_row_pattern2, ''):match('^%S') ) then  has_rows = true has_list_class({ imageArgs.rowclass, imageArgs.class })  local row = root:tag('tr') row:addClass(imageArgs.rowclass)  local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end  local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox- .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox- .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end  -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end  local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and ( args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern1, '' ):match('^%S') or args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern2, '' ):match('^%S') ) then local data = args['data' .. tostring(num)] if ( data:gsub(category_in_empty_row_pattern1, ''):match('%S') or data:gsub(category_in_empty_row_pattern2, ''):match('%S') ) then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end  -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows()  local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox- rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end  local function renderNavBar() if not args.name then return end  has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, 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(require('Module:Italic title')._main({})) end end  -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end  -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[분류:제목 변수가 있는 내포된 정보상자 틀을 사용하는 문서]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[분류:내용 없이 정보상자 틀을 사용한 문서]]') end end  --[=[ Loads the templatestyles for the infobox.  TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar.  ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame()  local hlist_templatestyles = '' if lists.hlist_t.found then hlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.hlist_t.styles } } end  local plainlist_templatestyles = '' if lists.plainlist_t.found then plainlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.plainlist_t.styles } } end  -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } }  local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end  local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end  local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end  return table.concat({ -- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering. -- this ordering is not a guarantee because the rows of interest invoking -- each class may not be on a specific page hlist_templatestyles, plainlist_templatestyles, base_templatestyles, templatestyles, child_templatestyles, grandchild_templatestyles }) end  -- common functions between the child and non child cases local function structure_infobox common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end  -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table')  root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox- :cssText(args.bodystyle)  has_list_class({ args.bodyclass })  renderTitle() renderAboveRow() else root = mw.html.create()  root :wikitext(args.title) end structure_infobox common()  return loadTemplateStyles() .. root end  -- 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. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end  -- 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. local function preprocessArgs(prefixTable, step) 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 -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true 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  -- 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. local function parseDataParameters()  preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end  -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end  local parent_args = origArgs for k, v in pairs(parent_args) do if v ~= '' then origArgs[localname(k)] = v end end  parseDataParameters()  return _infobox() end  -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end  parseDataParameters()  return _infobox() end return p 

Tags:

틀:정보상자

🔥 Trending searches on Wiki 한국어:

오르가슴이영준 (축구 선수)국가별 국가 코드 목록마침표노량 해전강수연김상순 (배우)식이 섬유메멘토 모리인류의 진화이제훈7인의 부활칭기즈 칸정조광명진언박지원 (아나운서)크리스털 케이서울대학교방준혁DAY6김유신정원철 (음악가)빅히트 뮤직호랑이대한민국 민법 제1112조박찬홍국민방송인스타그램어도어 (기업)정도전브라질소향압둘라 빈 칼리파 스타디움캐나다측천무후KBO 리그 영구 결번 목록LE SSERAFIM온실 기체김남국DNA대한민국 민법 제1113조대연각호텔 화재가야개혁신당 (2024년)국제단위계이정후고종 (대한제국)전주 이씨파이썬류현진중화민국몰디브김영임 (국악인)이상용 (영화 감독)현대 유니콘스김정난문재인심혜진이춘석스트라이크아웃 낫아웃앤잭 데이비비 (대한민국의 가수)쿠팡DPR 이안목성쏘스뮤직G7신태용각속도거버넌스카와키타 사이카의 작품 목록Aespa사와이 안나도영김영임부여아리랑🡆 More