Jump to content
Wikipedia The Free Encyclopedia

Module:AutosortTable

From Wikipedia, the free encyclopedia
Module documentation[view] [edit] [history] [purge]
This module is rated as ready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing.

Usage

[edit ]

This module helps create data tables in an automatically sorted order. As of this writing it is used primarily for the generation of the huge, dynamic tables at list of Wikipedias and Wikipedia:List of Wikipedias. For the Wikipedia editions table, the module is invoked directly to create the framework for the table, followed by content for the rows within the module's invocation. For the Edition details table, the module is invoked directly to create the framework for the table while the template {{Wikipedia stats}} generates content for the individual rows, also within the module's invocation. The template {{Wikipedia stats}} is intended to be called as an argument within the module's invocation, as it does not produce the regular wikitable (or any standard table) code itself.

The module's arguments are:

{{#invoke:AutosortTable|create|class=|style=|separator=|order=|numeric=|descending=|hidden=|caption=|rowheader=
|header = 
|footer = 
|colstyle = 
}}
Module arguments
Argument Example Notes
function create The argument create is the only function of this module, and is required.
class class=wikitable Class for the entire table. Table can be made user-sortable by including the class "sortable", but does not need to be.
style style=width: 50%; CSS for the entire table
separator separator=-- Separator string used to separate cells in the data definition. The pipe (|) is an invalid separator for this module.
order order=3, 2 Order for auto-sorting preference, takes a comma-separated list of column numbers. In the example here, the table will be sorted by column 3 first, then by column 2.
numeric numeric=2 Columns which use numeric sorting when auto-sorted. Takes comma-separated list of column numbers.
descending descending=3 Columns for which the auto-sort order should be descending (otherwise, ascending is used). Takes comma-separated list of column numbers. Here, only the third column will be auto-sorted in descending order (e.g., Zebra, Walrus, Muskrat, Emu, etc., or 12, 9, 6, 4).
hidden hidden=2 Columns which are not to be displayed (even though they may be used for row-sorting purposes). Takes comma-separated list of column numbers. Here, the second column will not be shown.
caption caption=Notable people by age Caption to be used for the table, per MOS:ACCESS
rowheader rowheader=1 Cell(s) in each non-header row to be emitted as row header, per MOS:ACCESS. Usually 1, and only 1, but accepts comma-separated list of column numbers. Causes !scope="row" to be used in the HTML for the cells specified.
header header = -- Name -- Age These are the column headings. In this example there are two columns with headings, the first is "Name", the second, "Age". Note the separators (--) which match the separator value above.
footer footer =-- Country -- Population -- Density Table footer, typically a duplication of header (see header argument above). Here, the first three columns have the footer labels shown.
colstyle colstyle = -- text-align:left; -- text-align:right; -- -- -- Adds the specified CSS styling to entire columns. Here, the first column will be left-aligned, the second column will be right-aligned, and the next three columns (with no CSS specified) will use the default styling. Note the separators (--) which match the separator value above.

Styling tricks

[edit ]

While there appear to be no ways to style an individual cell when using this module, styling particular rows, columns, or the entire table can be done using CSS.

Styling the table

[edit ]

The style argument allows the entire table to use a default styling. For example, |style=width:70%; text-align:center; would constrain the table width to 70% of the available window, and center the text (not including column and row headers) by default. When using multiple properties, the semicolon is necessary to separate them. Do not use the quotation marks ordinarily required in CSS or wikitable markup (as in "|style=width:70%; text-align:center;"), as it causes the CSS to be disregarded. A reminder: use CSS to constrain tables sparingly, as reduced font-size or unexpected table widths may cause accessibility problems or irritate readers.

Styling a row

[edit ]

An individual row can be styled separately by including CSS prior to the first data cell. Consider this example table:

{{#invoke:AutosortTable|create|class=wikitable plainrowheaders sortable|separator=--|order=2|numeric=2|descending=2|caption=Old friends|rowheader=1
|header = -- Name -- Age -- Diet <!-- Table header -->
| -- Maria -- 36 -- Vegan <!-- Row 1 -->
| -- Peter -- 35 -- Vegetarian <!-- Row 2 -->
| -- Julia -- 35 -- Meat <!-- Row 3 -->
| -- James -- 50 -- Vegan <!-- Row 4 -->
| background-color: #FFDDDD -- Henry -- 45 -- Meat <!-- Row 5, with CSS -->
| -- Ireni -- 47 -- Fish, no meat <!-- Row 6 -->
|colstyle = -- text-align:left; -- text-align:right; -- -- --
}}
Old friends
NameAgeDiet
James50Vegan
Ireni47Fish, no meat
Henry45Meat
Maria36Vegan
Peter35Vegetarian
Julia35Meat

The row for "Henry" gets a pink color (#FFDDDD), while the row header appropriately retains the gray formatting wikitables use for headers.

Styling a column

[edit ]

An individual column can be styled separately by using CSS in the colstyle argument. In the Old friends example just above, the alignment has been set to text-align:left; and text-align:right;, respectively. Consider this similar table:

{{#invoke:AutosortTable|create|class=wikitable plainrowheaders sortable|separator=--|order=2|numeric=2|descending=2|caption=Old friends again|rowheader=1
|header = -- Name -- Age -- Diet <!-- Table header -->
| -- Maria -- 36 -- Vegan <!-- Row 1 -->
| -- Peter -- 35 -- Vegetarian <!-- Row 2 -->
| -- Julia -- 35 -- Meat <!-- Row 3 -->
| -- James -- 50 -- Vegan <!-- Row 4 -->
| -- Henry -- 45 -- Meat <!-- Row 5 -->
| -- Ireni -- 47 -- Fish, no meat <!-- Row 6 -->
|colstyle = -- -- font-weight:bold; color:brown -- background-color:yellow
}}
Old friends again
NameAgeDiet
James50Vegan
Ireni47Fish, no meat
Henry45Meat
Maria36Vegan
Peter35Vegetarian
Julia35Meat

The "Age" column entries are now in bolded brown and no longer left-aligned as in the previous example. The "Diet" column here has the specified yellow background.

Sample tables

[edit ]

"Wikipedia editions" example

[edit ]

Here is an abbreviated version of the Wikipedia editions table at list of Wikipedias. It is a manually sortable wikitable which uses the class "plainrowheaders" (no bold, not centered) for row headers (specified here as only column 1). It is auto-sorted by the sixth column ("Active users"), which is a numeric field and should be auto-sorted in descending order (highest at the top). The content of each row in the table is entered as a separate argument (starting with a pipe [|] symbol) and includes text, wikilinks, and image file links. Please view the wikicode to see the details.

Wikipedia editions
Wikipedia name
in English
Wikipedia name
in native language
LanguageScript (ISO
15924
code)
WP
code
Active
users
Launch dateLogo
English Wikipedia English WikipediaEnglish Latn en 274,643 15 January 2001
Wikipedia logo showing "Wikipedia: The Free Encyclopedia" in English
French Wikipedia Wikipédia en françaisFrench Latn fr 38,458 23 March 2001
Wikipedia logo showing "Wikipedia: The Free Encyclopedia" in French
German Wikipedia Deutschsprachige WikipediaGerman Latn de 36,449 16 March 2001
Wikipedia logo showing "Wikipedia: The Free Encyclopedia" in German

"Edition details" example

[edit ]

Here is an abbreviated version of the Edition details table at Wikipedia:List of Wikipedias. This table uses templates (using this module) to produce the individual rows for the table which this module will generate.

Like the above example, this is a manually sortable wikitable which uses the class "plainrowheaders" (no bold, not centered) for row headers (specified here as only column 1). However, this table is auto-sorted by the thirteenth column (based on the number of articles) which is hidden (although the same values are used again — and shown — in column 4 as "Articles"), and which is a numeric field and should be used for auto-sorting in descending order (highest at the top). The content of each row in the table is generated by the template {{Wikipedia stats}} and the call to that template is entered as a separate argument (starting with a pipe [|] symbol).

This table has some special alignment requirements, as it contains several columns containing large numbers, so the colstyle argument is used extensively. Please view the wikicode to see the details.

Details of Wikipedia editions
LanguageLanguage (local)WikiArticlesAll pagesEditsAdminsUsersActive usersFilesDepthPercentage
English English en 7,194,053 65,761,333 1,354,134,834 814 53,230,360 274,643 969,667 1364.7510.64%
French français fr 2,763,495 14,002,406 236,492,854 143 5,865,746 38,458 78,858 279.354.09%
Dutch Nederlands nl 2,220,917 4,785,102 71,222,729 32 1,573,919 8,936 20 19.843.29%
Spanish español es 2,118,619 8,663,611 173,433,848 54 8,015,740 44,337 0 191.053.13%
Russian русский ru 2,105,041 8,510,321 153,197,959 63 3,987,054 18,641 265,855 166.673.11%
Chinese 中文 zh 1,539,288 8,408,965 92,718,829 61 4,111,362 14,454 70,269 219.612.28%
Japanese 日本語 ja 1,505,427 4,421,196 109,688,880 39 2,664,156 24,961 6,722 93.072.23%
Arabic العربية ar 1,318,451 9,148,579 75,219,518 24 2,939,097 6,558 56,388 289.991.95%
Portuguese português pt 1,174,929 6,119,074 72,229,808 51 3,430,450 7,909 67,995 209.021.74%
Korean 한국어 ko 749,306 3,542,235 41,839,157 23 1,021,957 6,191 15,410 164.11.11%
The above documentation is transcluded from Module:AutosortTable/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (edit | run) pages.
Subpages of this module.

 --[[
 AutosortTable: Creates a table which is automatically sorted

 Usage: (Remove the hidden comments before use)

 {{#invoke: AutosortTable|create

 | class = wikitable <!-- Class for the entire table -->
 | style = width: 50%; <!-- CSS for the entire table -->
 | separator = -- <!-- Separator string used to separate cells; pipe (|) invalid -->
 | order = 2, 1 <!-- Order for sorting preference, takes a comma-separated list of column numbers -->
 | numeric = 2 <!-- Columns which use numeric sorting. Takes comma-separated list of column numbers -->
 | descending = 1 <!-- Columns for which sort order should be descending. Takes comma-separated list of col numbers -->
 | hidden = 2 <!-- Columns which are not to be displayed. Takes comma-separated list of col numbers -->
 | rowheader = 1 <!-- Cell(s) in each non-header row to be emitted as row header, per WP:ACCESS#Data tables. Usually just 1, but accepts comma-separated list of col numbers -->
 | caption = Notable people by age <!-- Table caption per WP:ACCESS -->
 | header = -- Name -- Age <!-- Table header -->
 | footer = <!-- Table footer, typically a totals row or duplication of header -->
 | -- Bob -- 20 <!-- Row 1 -->
 | -- Peter -- 35 <!-- Row 2 -->
 | -- John -- 35 <!-- Row 3 -->
 | -- James -- 50 <!-- Row 4 -->
 | background-color: #FFDDDD -- Henry -- 45 <!-- Row 5, with CSS -->
 | colstyle = -- text-align:left; -- text-align:right; -- -- --
 											 <!-- CSS to be used on content of respective columns, here 1st & 2nd -->

 }}
 ]]

 local_module={}

 _module.create=function(frame)

 localargs=frame.args

 -- Named parameters

 localclass=args.class
 localstyle=args.style
 localsep=args.separator
 localorder=args.order
 localdesc=args.descendingor""
 localnsort=args.numericor""
 localhidden=args.hiddenor""
 localheader=args.header
 localfooter=args.footer
 localcolstyle=args.colstyle
 localrowheader=args.rowheaderor""
 localcaption=args.caption

 -- Frequently-used functions

 localstrIndexOf=mw.ustring.find
 localstrSplit=mw.text.split
 localstrSub=mw.ustring.sub
 localstrTrim=mw.text.trim

 localseplen=#sep
 localnsortLookup,descLookup,hiddenLookup,rowHeading={},{},{},{}

 -- Create the table

 localhtml=mw.html.create()
 localhtable=html:tag('table')
 ifclassthenhtable:attr('class',class)end
 ifstylethenhtable:attr('style',style)end
 ifcaptionthen
 localhcaption=htable:tag('caption')
 hcaption:wikitext(caption)
 end

 -- Parses a row string. The 'key' parameter is used to assign a unique key to the result so that equal rows do not cause sort errors.
 localparse=function(s,key)
 localcss
 localfirstSep=strIndexOf(s,sep,1,true)
 iffirstSep==1then-- no CSS
 css=nil
 s=strSub(s,seplen+1,-1)
 else-- CSS before first separator
 css=strSub(s,1,firstSep-1)
 s=strSub(s,firstSep+seplen,-1)
 end
 return{key=key,css=css,data=strSplit(s,sep,true)}
 end

 --[[
  Writes a row to the table.
  css: CSS to apply to the row
  data: The data (cells) of the row
  _type: Can be 'header', 'footer' or nil.
  ]]
 localwriteHtml=function(css,data,_type)
 localrow=htable:tag('tr')
 ifcssthenrow:attr('style',strTrim(css))end

 fori,vinipairs(data)do
 ifnothiddenLookup[i]then
 localcell
 if_type=='header'then
 -- Header: use the 'th' tag with scope="col"
 cell=row:tag('th')
 cell:attr('scope','col')
 elseif_type=='footer'then
 -- Footer: Mark as 'sortbottom' so that it does not sort when the table is made user-sortable
 -- with the 'wikitable sortable' class
 cell=row:tag('td')
 cell:attr('class','sortbottom')
 else
 ifrowHeading[i]then
 -- Cell is a row heading
 cell=row:tag('th')
 cell:attr('scope','row')
 else
 -- Ordinary cell
 cell=row:tag('td')
 end
 localcellCss=colstyleandcolstyle[i]
 ifcellCssthencell:attr('style',strTrim(cellCss))end-- Apply the column styling, if necessary
 end
 cell:wikitext(strTrim(v))
 end
 end
 returnrow
 end

 -- Parse the column styles
 ifcolstylethencolstyle=parse(colstyle,-1).dataend

 -- Write the header first
 ifheaderthen
 localheaderData=parse(header)
 writeHtml(headerData.css,headerData.data,'header')
 end

 -- Parse the data
 localdata={}
 fori,vinipairs(frame.args)dodata[i]=parse(v,i)end

 order=strSplit(order,'%s*,%s*')
 nsort=strSplit(nsort,'%s*,%s*')
 desc=strSplit(desc,'%s*,%s*')
 hidden=strSplit(hidden,'%s*,%s*')
 rowheader=strSplit(rowheader,'%s*,%s*')

 fori,vinipairs(order)doorder[i]=tonumber(v)end
 fori,vinipairs(nsort)donsortLookup[tonumber(v)or-1]=trueend
 fori,vinipairs(desc)dodescLookup[tonumber(v)or-1]=trueend
 fori,vinipairs(hidden)dohiddenLookup[tonumber(v)or-1]=trueend
 fori,vinipairs(rowheader)dorowHeading[tonumber(v)or-1]=trueend

 --Sorting comparator function.
 localsortFunc=function(a,b)
 localad,bd=a.data,b.data
 fori=1,#orderdo
 localindex=order[i]
 localai,bi=ad[index],bd[index]
 ifnsortLookup[index]then
 -- Numeric sort. Find the first occurrence of a number and use it. Decimal points are allowed. Scientific notation not supported.
 ai=tonumber((ai:find('.',1,true)andai:match('[+-]?%d*%.%d+')orai:match('[+-]?%d+'))or0)
 bi=tonumber((bi:find('.',1,true)andbi:match('[+-]?%d*%.%d+')orbi:match('[+-]?%d+'))or0)
 end
 ifai~=bithen
 ifdescLookup[index]thenreturnai>bielsereturnai<biend
 end
 end
 returna.key<b.key
 end
 table.sort(data,sortFunc)

 -- Write the sorted data to the HTML output
 fori,vinipairs(data)dowriteHtml(v.css,v.data,nil)end

 -- Write the footer
 iffooterthen
 localfooterData=parse(footer)
 writeHtml(footerData.css,footerData.data,'footer')
 end

 returntostring(html)
 end

 return_module

AltStyle によって変換されたページ (->オリジナル) /