Modul:Class
Tampilan
| Modul Lua ini digunakan pada banyak halaman dan perubahannya kemungkinan memicu perubahan massal pada semua halaman yang menggunakannya. Uji cobalah di subhalaman /bak pasir atau /kasus uji Modul:Class, atau bak pasir modul Anda. Pertimbangkan untuk mendiskusikan perubahan di halaman pembicaraan sebelum mengimplementasikannya. |
| Modul ini menggunakan Lua: |
| Modul ini menggunakan TemplateStyles: |
Pengguna
[sunting sumber]Modul ini mengimplementasikan Templat:Class, Templat:Class/icon and Templat:Class/colour.
Dokumentasi untuk Modul:Class/definition.json
[sunting sumber]Berikut ini adalah catatan yang mendokumentasikan model untuk definisi kelas JSON.
- Objek JSON tingkat atas berisi sejumlah objek. Masing-masing merupakan definisi kelas atau alias. Kuncinya adalah "kode kelas" yang dapat digunakan sebagai input. Kunci yang berisi definisi kelas adalah kode kelas kanonik. Kode kelas harus huruf kecil. (kecuali kode khusus
DEFAULT) dan kode kelas kanonik, sejauh ini, sepenuhnya berdasarkan abjad (bplus, bukanb+) - Alias harus berupa objek dengan tepat satu properti
aliasyang berisi string kode kelas kanonik. - Definisi kelas dapat memiliki sejumlah properti:
categoryRoot- (string) Akar nama kategori untuk artikel dengan kelas kualitas. Misalnya, kategori tingkat atas untuk artikel unggulan adalah Kategori:Artikel kelas AP, dan kategori tingkat subjek mungkin ada di "Kategori:Kelas-AP subject artikel", jadi akarnya adalah
Kelas-AP. colour
- (object) Objek yang berisi properti terkait warna; setiap nilai di dalamnya harus berupa string yang dapat digunakan sebagai nilai warna CSS, e.g.
#6699ff
base- (string) untaian warna yang mencerminkan warna latar belakang dasar[model 1]
textOnBlack- (string) untaian warna yang mencerminkan warna yang cocok untuk digunakan sebagai teks pada latar belakang hitam
textOnWhite- (string) untaian warna yang mencerminkan warna yang cocok untuk digunakan sebagai teks pada latar belakang putih
icon- (object) Objek yang berisi properti terkait ikon:
file- (string) Nama file, tanpa
File:awalan, sebaiknya diformat dengan garis bawah,[model 2] e.g.Featured_article_star.svg default- (boolean) Apakah ikon harus ditampilkan secara default—biasanya hanya peringkat kualitas tinggi yang menampilkan ikon secara default
requiresAttribution- (boolean)
truejikafileproperti mengacu pada file yang bukan domain publik atau berlisensi CC0. Ketika sebuah file adalah PD/CC0 dan dengan demikian properti inifalse, kita dapat menonaktifkan tautan gambar dan teks alt, yang bagus untuk aksesibilitas untuk gambar yang murni dekoratif.
labels- (object) Objek yang berisi string label. Semua properti label bersifat tentatif..
adjective- (string) String label yang menjelaskan kata sifat yang dapat digunakan untuk menjelaskan halaman dengan kelas ini. Sebaiknya gunakan huruf kecil atau huruf kapital.[model 3] Properti ini sangat tentatif.
full- (string) String label yang mendeskripsikan frasa nomina yang dapat digunakan untuk mendeskripsikan halaman dengan kelas ini. Sebaiknya gunakan huruf kecil atau huruf kapital.[model 3] Properti ini sangat tentatif.
short- (string) String label yang menjelaskan nama singkat untuk kelas yang dapat digunakan dalam konteks. Ini mungkin sering kali sama dengan kode kelas, tetapi biasanya harus diawali dengan huruf kapital. (e.g.
RedirectatauAB). Satu preseden khusus yang diimpor ke properti ini adalah kode kelasunassesseduses???sebagai label pendeknya. Properti ini sangat tentatif. tooltip- (string) String label dengan keterangan alat yang harus digunakan untuk mendeskripsikan kelas jika detail lebih lanjut diperlukan. Properti ini opsional dan mungkin hanya boleh ditentukan jika diperlukan.
page- (string) Nama halaman lengkap dari halaman wiki yang menjelaskan kelas kualitas, sebaiknya diformat dengan spasi,[model 4] e.g.
Wikipedia:Artikel pilihan
- Saat ini, tidak ada definisi properti mana yang mungkin wajib atau opsional untuk definisi kelas; untuk saat ini, mungkin paling aman untuk berasumsi bahwa "label" properti adalah wajib.
- Tentatif khusus
DEFAULTObjek, menggunakan kapitalisasi untuk memisahkannya dari kunci lain, mendefinisikan nilai default yang dapat digunakan. Ini bisa berupa objek lengkap (semua properti wajib) atau alias untuk objek lengkap. Dalam kasus Wikipedia bahasa Inggris, ini saat ini merupakan alias untukunassesseddefinisi kelas.
Catatan model objek
[sunting sumber]- ^ Ini diasumsikan sebagai warna mode cahaya; mungkin diinginkan untuk membaginya menjadi properti mode terang dan gelap.
- ^ Garis bawah mungkin lebih baik untuk nama berkas karena lebih mudah digunakan di URL, dan tidak merusak apa pun yang digunakan dalam teks wiki..
- ^ a b Huruf kecil lebih baik untuk kata-kata lengkap atau umum, e.g. "featured", tetapi huruf besar pada judul lebih baik untuk nilai yang dibangun, e.g. "Start-Class".
- ^ Spasi mungkin lebih baik untuk merujuk ke halaman wiki karena mudah digunakan sebagai string atau dalam teks wiki; penggunaan di URL harus melakukan transformasi lain pula.
-- This module implements [[Template:Class]], [[Template:Class/icon]] and
-- [[Template:Class/colour]].
local mArguments -- lazily loaded
local definitions = mw.loadJsonData('Module:Class/definition.json')
local p = {}
--------------------------------------------------------------------------------
-- Local configuration and messages
--------------------------------------------------------------------------------
local cfg = {
defaultCode = 'DEFAULT',
classPrefix = 'assess-',
globalClass = 'assess',
defaultClassSuffix = 'default',
unboldClassSuffix = 'unbold',
catRootFormat = '%s %s',
catTopicFormat = '%s %s articles',
catBasicFormat = '%s articles',
categoryFormat = '[[:Category:%s|%s]]',
templateLocation = 'Templat:Class',
iconTemplateLocation = 'Template:Class/icon',
colourTemplateLocation = 'Templat:Class/colour',
stylesLocation = 'Modul:Class/styles.css',
baseColourPath = {'colour', 'base'},
iconPath = {"icon", "file"},
iconDefaultPath = {"icon", "default"},
iconAttribPath = {"icon", "requiresAttribution"},
fullLabelPath = {"labels", "full"},
shortLabelPath = {"labels", "short"},
categoryRootPath = {"categoryRoot"},
tooltipPath = {"labels", "tooltip"},
yes = "yes",
no = "no",
argumentNames = {
class = "kelas",
style = "style"
},
getOptions = {
--First item is localized argument name, second is case-sensitivity
bold = {"bold", false},
header = {"header", false},
image = {"image", false},
rowspan = {"rowspan", false},
fullcategory = {"fullcategory", true},
category = {"category", true},
topic = {"topic", true}
}
}
--------------------------------------------------------------------------------
-- Argument helper functions
--------------------------------------------------------------------------------
local function getRawArgs(frame, wrapper)
--Retrieves the arguments from the frame
mArguments = mArguments or require('Modul:Arguments')
return mArguments.getArgs(frame, {
wrappers = wrapper,
trim = false,
removeBlanks = false
})
end
local function makeInvokeFunction(func, wrapper)
--Wraps a general function into an invokable version
return function (frame)
local args = getRawArgs(frame, wrapper)
return func(args)
end
end
--------------------------------------------------------------------------------
-- String helper functions
--------------------------------------------------------------------------------
local function trim(str)
--Trims strings, passes through non-strings without modification
return (type(str) == 'string') and mw.text.trim(str) or str
end
local function normalizeValue(val)
--Normalizes strings, particularly class codes
if type(val) == 'string' then val = trim(val):lower() end
if val == '' then val = nil end
return val
end
local function ucfirst(str)
--Capitalizes the first character of a string
return mw.ustring.upper(mw.ustring.sub(str, 1, 1)) .. mw.ustring.sub(str, 2)
end
--------------------------------------------------------------------------------
-- Definition helper functions
--------------------------------------------------------------------------------
local function getDefinition(code)
--Retrieves the definition and canonical class code for a given code.
--Returns two values: the definition object and the canonical class code
--string.
local canonicalCode = normalizeValue(code)
if code == cfg.defaultCode then canonicalCode = code end
local class = definitions[canonicalCode]
while class and class.alias do
canonicalCode = class.alias
class = definitions[class.alias]
end
if not class then
return nil, nil
end
return class, canonicalCode
end
local function getDefault()
--Shortcut function for retrieving the default definition
return getDefinition(cfg.defaultCode) end
local function getProperty(class, default, map)
--Retrieves a given property from a string given a class definition, a
--default class definition, and a map for the path to traverse through the
--class object. The map should be a sequential table of string property
--names, e.g. {"colour", "base"} would retrieve someClass.colour.base
local prop, dProp = class, default
for k, v in ipairs(map) do
prop = ((type(prop) == 'table') or nil) and prop[v]
dProp = ((type(dProp) == 'table') or nil) and dProp[v]
end
if prop == nil then prop = dProp end
return prop
end
--------------------------------------------------------------------------------
-- Color functions
--------------------------------------------------------------------------------
function p._colour(code)
--Retrieves the base colour for a given code
return getProperty(getDefinition(code), getDefault(), cfg.baseColourPath)
end
function p.colour(frame)
--Retrieves the base colour for a given code; is invokable
local args = getRawArgs(frame, cfg.colourTemplateLocation)
-- Nowiki tags prevent output beginning with "#" from triggering bug 14974.
return frame:extensionTag('nowiki', p._colour(args[1]))
end
--------------------------------------------------------------------------------
-- Icon functions
--------------------------------------------------------------------------------
function p._icon(args)
--Retrieves an icon image and formats it as wikitext
local class = getDefinition(args[cfg.argumentNames.class] or args[1])
local default = getDefault()
local file = getProperty(class, default, cfg.iconPath)
local label =
getProperty(class, default, cfg.tooltipPath) or
ucfirst(getProperty(class, default, cfg.fullLabelPath))
local attrib = getProperty(class, default, cfg.iconAttribPath)
local size = args.size or '16px'
local span = mw.html.create('span')
span
:cssText(args[cfg.argumentNames.style])
:attr('title', label)
:wikitext(
string.format(
'[[File:%s|%s|' .. size .. '%s|class=noviewer|alt=]]',
file,
label,
attrib and '' or '|link='
)
)
return tostring(span)
end
p.icon = makeInvokeFunction(p._icon, cfg.iconTemplateLocation)
--Invokable version of p._icon
--------------------------------------------------------------------------------
-- Class functions
--------------------------------------------------------------------------------
function p._class(args)
--Parses its arguments into a table cell with an optional icon, a name
--linked to an appropriate category, and appropriate colour styling
local classDef, classCode =
getDefinition(args[cfg.argumentNames.class] or args[1])
local default = getDefault()
local iconDefault = getProperty(classDef, default, cfg.iconDefaultPath)
local shortLabel = getProperty(classDef, default, cfg.shortLabelPath)
local categoryRoot = getProperty(classDef, default, cfg.categoryRootPath)
--o is short for "options", go for "get options". Bool true → case-sensitive
local o, go = {}, cfg.getOptions
for k, v in pairs(go) do
o[k] = v[2] and trim(args[v[1]]) or normalizeValue(args[v[1]])
end
local cell = mw.html.create(o.header and 'th' or 'td')
--image=yes forces icon, image=no disables it, otherwise checks default
local icon = iconDefault and (o.image ~= cfg.no) or (o.image == cfg.yes)
icon = icon and p.icon(args) .. ' ' or ''
local category
if o.fullcategory then
category = o.fullcategory
elseif o.category then
category = string.format(cfg.catRootFormat, categoryRoot, o.category)
elseif o.topic then
category = string.format(cfg.catTopicFormat, categoryRoot, o.topic)
else
category = string.format(cfg.catBasicFormat, categoryRoot)
end
local text = string.format(cfg.categoryFormat, category, shortLabel)
cell
:addClass(cfg.globalClass)
:addClass(
o.bold == cfg.no and cfg.classPrefix .. cfg.unboldClassSuffix or nil
)
:addClass(cfg.classPrefix .. (classCode or cfg.defaultClassSuffix))
:attr('rowspan', tonumber(o.rowspan))
:wikitext(mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = {src = cfg.stylesLocation} }, icon, text)
return tostring(cell)
end
p.class = makeInvokeFunction(p._class, cfg.templateLocation)
--Invokable version of p._class
return p