Wicidestun
cywikisource
https://cy.wikisource.org/wiki/Hafan
MediaWiki 1.46.0-wmf.21
first-letter
Media
Arbennig
Sgwrs
Defnyddiwr
Sgwrs Defnyddiwr
Wicidestun
Sgwrs Wicidestun
Delwedd
Sgwrs Delwedd
MediaWici
Sgwrs MediaWici
Nodyn
Sgwrs Nodyn
Cymorth
Sgwrs Cymorth
Categori
Sgwrs Categori
Tudalen
Sgwrs Tudalen
Indecs
Sgwrs Indecs
TimedText
TimedText talk
Modiwl
Sgwrs modiwl
Event
Event talk
Nodyn:Para
10
42781
161561
87904
2026-03-27T01:20:09Z
AlwynapHuw
1710
161561
wikitext
text/x-wiki
<code><nowiki>|</nowiki>{{#if:{{{1|}}}|<span style="white-space:nowrap;">{{{1}}}</span><nowiki>=</nowiki>|}}{{{2|}}}</code><noinclude>
{{Documentation}}
</noinclude>
69rq4aouqbrjassmelr1rjvzmlm3c3o
Nodyn:Fmbox
10
46141
161557
95131
2026-03-27T01:10:20Z
AlwynapHuw
1710
Yn ailgyfeirio at [[Nodyn:Dolengyfeirio]]
161557
wikitext
text/x-wiki
#ailgyfeirio [[Nodyn:Dolengyfeirio]]
6vfct4gq7aibgizvx5tm73z80un5bev
161558
161557
2026-03-27T01:11:08Z
AlwynapHuw
1710
Wedi dileu ailgyfeiriad i [[Nodyn:Dolengyfeirio]]
161558
wikitext
text/x-wiki
{{#invoke:Message box|fmbox|plainlinks={{{plainlinks|yes}}}}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
oieddw57hf0pjq1rxypu544i15g9gwn
Nodyn:Music
10
82674
161549
2026-03-27T00:11:01Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "<includeonly><span class="music-symbol" style="font-family: Arial Unicode MS, Lucida Sans Unicode;">{{#switch: {{lc:{{{1}}}}} | ♭ | b | flat = ♭ | 𝄫 | bb | double flat | doubleflat = [[File:Doubleflat.svg|{{{size|x12px}}}|double flat]] | bbb | triple flat | tripleflat = [[File:Llpd-3.svg|{{{size|x12px}}}|triple flat]] | d | half flat | halfflat = [[File:Llpd-½.svg|{{{size|x12px}}}|half flat]] | flat stroke | flatstroke = File:Arabi..."
161549
wikitext
text/x-wiki
<includeonly><span class="music-symbol" style="font-family: Arial Unicode MS, Lucida Sans Unicode;">{{#switch: {{lc:{{{1}}}}}
| ♭
| b
| flat = ♭
| 𝄫
| bb
| double flat
| doubleflat = [[File:Doubleflat.svg|{{{size|x12px}}}|double flat]]
| bbb
| triple flat
| tripleflat = [[File:Llpd-3.svg|{{{size|x12px}}}|triple flat]]
| d
| half flat
| halfflat = [[File:Llpd-½.svg|{{{size|x12px}}}|half flat]]
| flat stroke
| flatstroke = [[File:Arabic music notation half flat.svg|{{{size|x12px}}}|flat stroke]]
| db
| three quarter flat
| threequarterflat = [[File:Three quarter flat.svg|{{{size|x12px}}}|three quarter flat]]
| doubleflat stroke
| double flat stroke
| double flatstroke
| doubleflatstroke = [[File:Llpd-1½ var.svg|{{{size|x12px}}}|double flat stroke]]
| ♮
| natural = ♮
| ♯
| #
| sharp = ♯
| 𝄪
| x
| ##
| double sharp
| doublesharp = [[File:DoubleSharp.svg|{{{size|x8px}}}|double sharp]]
| ###
| #x
| x#
| triple sharp
| triplesharp = ♯[[File:DoubleSharp.svg|{{{size|x8px}}}|triple sharp]]
| t
| half sharp
| halfsharp = [[File:Arabic music notation half sharp.svg|{{{size|x12px}}}|half sharp]]
| #t
| three quarter sharp
| threequartersharp = [[File:Llpd+1½.svg|{{{size|x12px}}}|three quarter sharp]]
| 7
| septimal
| septimal quarter tone -
| septimal quarter tone -49
| septimal quarter tone (-49)<!-- distance the harmonic seventh (7:4) differs from the large just minor seventh (9:5)-->
| septimalquartertone- = [[File:7 rightside up.png|{{{size|x16px}}}|7]]
| l<!-- for L, only lowercases in this list -->
| septimal+
| septimal quarter tone (+49)
| septimal quarter tone +49
| septimal quarter tone +
| septimalquartertone+ = [[File:7 upside down.png|{{{size|x16px}}}|7 upside-down]]
| eleventh partial (+)<!--[difference between 11:8 & 4:3]-->
| eleventh partial +
| eleventhpartial+
| 11+
| 11 up
| 11up
| up = ↑
| eleventh partial (-)
| eleventh partial -
| eleventhpartial-
| 11-
| 11 down
| 11down
| down = ↓
| thirteenth partial (+)<!--[difference between 13:8 & 8:5]-->
| thirteenth partial +
| thirteenthpartial+
| 13 = [[File:13 rightside up.png|x12px|13]]
| 13upsidedown
| 13 upsidedown
| 13 upside down
| thirteenth partial (-)
| thirteenth partial -
| thirteenthpartial-
| 13U
| E1
| 13upsidedown = [[File:13 upside down.png|{{{size|x12px}}}|13 upside down]]
| 17 = [[File:17 rightside up.png|x12px|17]]
| 17U
| L1
| 17 upsidedown
| 17 upside down
| 17upsidedown= [[File:17 upside down.png|{{{size|x12px}}}|17 upside down]]
| 19 = [[File:19 rightside up.png|{{{size|x12px}}}|19]]
| 19U
| 19 upsidedown
| 19 upside down
| 19upsidedown= [[File:19 upside down.png|{{{size|x12px}}}|19U]]
| 23= <sup>23</sup>
| 29= <sup>29</sup>
| 31= <sup>31</sup>
| 31U
| 1E
| 31 upside down = <sup>1E</sup>
| wholenote
| whole note
| whole
| semibreve = [[File:Figure rythmique ronde.svg|{{{size|10px}}}|whole note]]<!--File:WholeNote.svg doesn't match the others here-->
| halfnote
| half note
| half
| minim = [[File:Figure rythmique blanche hampe haut.svg|{{{size|6px}}}|half note]]<!--File:Half note with upwards stem.svg doesn't match the others here-->
| quarternote
| quarter note
| quarter
| crotchet = [[File:Figure rythmique noire hampe haut.svg|{{{size|6px}}}|quarter note]]<!--File:Quarter note with upwards stem.svg doesn't match the others here-->
| eighthnote
| eighth note
| eighth
| quaver = [[File:Figure rythmique croche hampe haut.svg|{{{size|10px}}}|eighth note]]
| eighthnotebeam
| eighth note beam
| eighthbeam
| eighth beam
| quaverbeam
| quaver beam = [[File:Figure rythmique deux croches lien haut.svg|{{{size|20px}}}|beamed eighth notes]]
| sixteenthnote
| sixteenth note
| sixteenth
| semiquaver = [[File:Figure rythmique double croche hampe haut.svg|{{{size|10px}}}|sixteenth note]]
| sixteenthnotebeam
| sixteenth note beam
| sixteenthbeam
| sixteenth beam
| semiquaverbeam
| semiquaver beam = [[File:Figure rythmique deux double croches lien haut.svg|{{{size|20px}}}|beamed sixteenth notes]]
| thirtysecondnote
| thirtysecond note
| thirty-secondnote
| thirty-second note
| thirtysecond
| thirty-second
| demisemiquaver = [[File:Figure rythmique triple croche hampe haut.svg|{{{size|10px}}}|thirty-second note]]
| sixtyfourthnote
| sixtyfourth note
| sixty-fourthnote
| sixty-fourth note
| sixtyfourth
| sixty-fourth
| hemidemisemiquaver = [[File:64th note.svg|{{{size|10px}}}|sixty-fourth note]]
| dot
| dot = .
| dottedquarter
| dotted quarter
| dottedcrotchet
| dotted crotchet = <span class="nowrap">[[File:Figure rythmique noire hampe haut.svg|{{{size|6px}}}|dotted quarter note]].</span><!--File:Dotted quarter note.png doesn't match the others here due to its ledger line-->
| dottedhalf
| dotted half
| dottedminim
| dotted minim = <span class="nowrap">[[File:Figure rythmique blanche hampe haut.svg|{{{size|6px}}}|dotted half note]].</span>
| wholerest
| semibreverest
| semibreve rest
| whole rest = [[File:Whole rest.svg|{{{size|18px}}}|whole rest]]
| halfrest
| minimrest
| minim rest
| half rest = [[File:Half rest.svg|{{{size|18px}}}|half rest]]
| quarterrest
| quarter rest
| crotchet rest
| crotchetrest = [[File:QuarterRest.svg|{{{size|10px}}}|quarter rest]]
| eighthrest
| eighth rest
| quaver rest
| quaverrest = [[File:8thRest.svg|{{{size|10px}}}|eighth rest]]
| sixteenthrest
| semiquaver rest
| sixteenth rest
| semiquaverrest = [[File:16th rest.svg|{{{size|7px}}}|sixteenth rest]]
| thirtysecondrest
| thirtysecond rest
| thirty-secondrest
| thirty-second rest
| demisemiquaver rest
| demisemiquaverrest = [[File:32nd rest.svg|{{{size|9px}}}|thirty-second rest]]
| treble
| treble clef
| trebleclef = [[File:GClef.svg|{{{size|16px}}}|treble clef]]
| g clef
| gclef = [[File:GClef.svg|{{{size|16px}}}|G clef]]
| alto
| alto clef
| altoclef = [[File:CClef.svg|{{{size|16px}}}|alto clef]]
| tenor
| tenor clef
| tenorclef = [[File:CClef.svg|{{{size|16px}}}|tenor clef]]
| c clef
| cclef = [[File:CClef.svg|{{{size|16px}}}|C clef]]
| bass
| bass clef
| bassclef = [[File:FClef.svg|{{{size|16px}}}|bass clef]]
| f clef
| fclef = [[File:FClef.svg|{{{size|16px}}}|F clef]]
| neutral
| neutralclef
| neutral clef = ||
| common-time = [[File:Commontime.svg|{{{size|11px}}}|common time]]
| alla-breve
| cut-time = [[File:Allabreve.svg|{{{size|11px}}}|cut time]]
| scale = [[File:Scale deg {{{2}}}.svg|8px|scale degree {{{2}}}]]
| time
| timesig
| time sig
| timesignature
| time signature = {{Time signature|{{{2}}}|{{{3}}}}}
| °
| diminished
| dim = <sup>o</sup>
| dimdeg = °
| ø
| halfdim
| half dim
| halfdiminished
| half diminished
| dimslash = <sup>ø</sup>
| +
| aug
| augmented = <sup>+</sup>
| δ <!-- lowercase, for Δ -->
| maj
| major
| delta = Δ
| 64 = {{sup sub | 6 | 4}}
| 64 chord = {{sup sub | 6 | 4}}
| 63 = {{sup sub | 6 | 3}}
| 63 chord = {{sup sub | 6 | 3}}
| 53 = {{sup sub | 5 | 3}}
| 53 chord = {{sup sub | 5 | 3}}
| c major = [[File:C-major a-minor.svg|{{{size|54px}}}|C major]]
| a minor = [[File:C-major a-minor.svg|{{{size|54px}}}|A minor]]
| f major = [[File:F-major d-minor.svg|{{{size|54px}}}|F major]]
| d minor = [[File:F-major d-minor.svg|{{{size|54px}}}|D minor]]
| b-flat major = [[File:B-flat-major g-minor.svg|{{{size|54px}}}|B-flat major]]
| g minor = [[File:B-flat-major g-minor.svg|{{{size|54px}}}|G minor]]
| e-flat major = [[File:E-flat-major c-minor.svg|{{{size|54px}}}|E-flat minor]]
| c minor = [[File:E-flat-major c-minor.svg|{{{size|54px}}}|C minor]]
| a-flat major = [[File:A-flat-major f-minor.svg|{{{size|54px}}}|A-flat major]]
| f minor = [[File:A-flat-major f-minor.svg|{{{size|54px}}}|F minor]]
| d-flat major = [[File:D-flat-major b-flat-minor.svg|{{{size|54px}}}|D-flat major]]
| b-flat minor = [[File:D-flat-major b-flat-minor.svg|{{{size|54px}}}|B-flat minor]]
| g-flat major = [[File:G-flat-major e-flat-minor.svg|{{{size|54px}}}|G-flat major]]
| e-flat minor = [[File:G-flat-major e-flat-minor.svg|{{{size|54px}}}|E-flat minor]]
| c-flat major = [[File:C-flat-major a-flat-minor.svg|{{{size|54px}}}|C-flat major]]
| a-flat minor = [[File:C-flat-major a-flat-minor.svg|{{{size|54px}}}|A-flat minor]]
| g major = [[File:G-major e-minor.svg|{{{size|54px}}}|G major]]
| e minor = [[File:G-major e-minor.svg|{{{size|54px}}}|E minor]]
| d major = [[File:D-major b-minor.svg|{{{size|54px}}}|D major]]
| b minor = [[File:D-major b-minor.svg|{{{size|54px}}}|B minor]]
| a major = [[File:A-major f-sharp-minor.svg|{{{size|54px}}}|A major]]
| f-sharp minor = [[File:A-major f-sharp-minor.svg|{{{size|54px}}}|F-sharp minor]]
| e major = [[File:E-major c-sharp-minor.svg|{{{size|54px}}}|E major]]
| c-sharp minor = [[File:E-major c-sharp-minor.svg|{{{size|54px}}}|C-sharp minor]]
| b major = [[File:B-major g-sharp-minor.svg|{{{size|54px}}}|B major]]
| g-sharp minor = [[File:B-major g-sharp-minor.svg|{{{size|54px}}}|G-sharp minor]]
| f-sharp major = [[File:F-sharp-major d-sharp-minor.svg|{{{size|54px}}}|F-sharp major]]
| d-sharp minor = [[File:F-sharp-major d-sharp-minor.svg|{{{size|54px}}}|D-sharp minor]]
| c-sharp major = [[File:C-sharp-major a-sharp-minor.svg|{{{size|54px}}}|C-sharp major]]
| a-sharp minor = [[File:C-sharp-major a-sharp-minor.svg|{{{size|54px}}}|A-sharp minor]]
| left repeat
| leftrepeat = [[File:Ritornello 1.JPG|{{{size|x20px}}}|left repeat]]
| right repeat
| rightrepeat = [[File:Ritornello 2.JPG|{{{size|x20px}}}|right repeat]]
| #default = {{error|Error using {{tlx|music}}: unable to parse music symbol "{{{1|}}}"|tag=span}}
}}</span></includeonly><noinclude>
{{Documentation}}
<!-- PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS -->
</noinclude>
t7vieche2lubcto11qq3ub5lslh15ti
Nodyn:((
10
82675
161550
2026-03-27T00:12:18Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "{{<noinclude> {{documentation}} </noinclude>"
161550
wikitext
text/x-wiki
{{<noinclude>
{{documentation}}
</noinclude>
7ddca00qmssfls0dctzbj32xy1q28ir
Nodyn:))
10
82676
161551
2026-03-27T00:17:23Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "}}<noinclude> {{documentation}} </noinclude>"
161551
wikitext
text/x-wiki
}}<noinclude>
{{documentation}}
</noinclude>
fmm8htexq13hwrjrvzcsiy59gv65l36
Nodyn:Distinguish
10
82677
161552
2026-03-27T00:22:07Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "{{Hatnote|Peidiwch â drysu'r pwnc hwn â [[:{{{1}}}]]{{ #if: {{{3|}}}{{{4|}}} | , [[:{{{2}}}]], {{ #if: {{{4|}}} | [[:{{{3}}}]], neu [[:{{{4}}}]] | neu [[:{{{3}}}]] }} | {{ #if: {{{2|}}} | neu [[:{{{2}}}]] }} }}.}}<noinclude><!-- splitting these lines causes {{Documentation}} template to terminate green shading when Distinguish is used in /doc pages. --> {{Documentation}} <!-- Add categories to the /doc..."
161552
wikitext
text/x-wiki
{{Hatnote|Peidiwch â drysu'r pwnc hwn â [[:{{{1}}}]]{{
#if: {{{3|}}}{{{4|}}}
| , [[:{{{2}}}]], {{
#if: {{{4|}}}
| [[:{{{3}}}]], neu [[:{{{4}}}]]
| neu [[:{{{3}}}]]
}}
| {{
#if: {{{2|}}}
| neu [[:{{{2}}}]]
}}
}}.}}<noinclude><!-- splitting these lines causes {{Documentation}} template to terminate green shading when Distinguish is used in /doc pages. -->
{{Documentation}}
<!-- Add categories to the /doc subpage and interwikis to Wikidata, not here! -->
</noinclude>
00ic6z7p98vtw40jw73rxt4i6pkwpza
Modiwl:Yesno
828
82678
161553
2026-03-27T00:34:52Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "-- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y'..."
161553
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or val == 'on'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or val == 'off'
or tonumber(val) == 0
then
return false
else
return default
end
end
swdskn7svew8i9wuydn9uj5l3r2ghcs
Nodyn:Documentation/docspace
10
82679
161554
2026-03-27T00:36:43Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "{{#switch: {{SUBJECTSPACE}} | {{ns:0}} | {{ns:File}} | {{ns:MediaWiki}} | {{ns:Category}} = {{TALKSPACE}} | #default = {{SUBJECTSPACE}} }}<noinclude> {{documentation|content= This subtemplate of {{tl|documentation}} is used to determine the namespace of the documentation page. }}</noinclude>"
161554
wikitext
text/x-wiki
{{#switch: {{SUBJECTSPACE}}
| {{ns:0}}
| {{ns:File}}
| {{ns:MediaWiki}}
| {{ns:Category}} = {{TALKSPACE}}
| #default = {{SUBJECTSPACE}}
}}<noinclude>
{{documentation|content=
This subtemplate of {{tl|documentation}} is used to determine the namespace of the documentation page.
}}</noinclude>
7f8iymss9sr4v7f4t5pza1arwjogrv3
Nodyn:Documentation/template page
10
82680
161555
2026-03-27T00:39:37Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "{{#switch: {{SUBPAGENAME}} | sandbox | testcases = {{BASEPAGENAME}} | #default = {{PAGENAME}} }}<noinclude>{{documentation|content= This subtemplate of {{tl|documentation}} is used to determine the template page name. }}</noinclude>"
161555
wikitext
text/x-wiki
{{#switch: {{SUBPAGENAME}}
| sandbox
| testcases = {{BASEPAGENAME}}
| #default = {{PAGENAME}}
}}<noinclude>{{documentation|content=
This subtemplate of {{tl|documentation}} is used to determine the template page name.
}}</noinclude>
fenc3r6oe2sito28b1d8xgyo9gpq5uf
Nodyn:Dolengyfeirio
10
82681
161556
2026-03-27T00:53:33Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "<includeonly>{{#invoke:Hatnote|hatnote}}</includeonly><noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude>"
161556
wikitext
text/x-wiki
<includeonly>{{#invoke:Hatnote|hatnote}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
8nnude79i1y2v6yy2z7j285k1k4v8p3
Nodyn:Hatnote
10
82682
161559
2026-03-27T01:11:58Z
AlwynapHuw
1710
Yn ailgyfeirio at [[Nodyn:Dolengyfeirio]]
161559
wikitext
text/x-wiki
#ailgyfeirio [[Nodyn:Dolengyfeirio]]
6vfct4gq7aibgizvx5tm73z80un5bev
Nodyn:Music/doc
10
82683
161560
2026-03-27T01:14:25Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "{{documentation subpage}} {{Distinguish|Template:Music topics}} {{Commons|Template:Music}} <!--Hopefully the inline style attribute will be replace by a class reference to "accidental" in [[MediaWiki:Common.css]]--> {{tl|Music}} renders Western music notation of various types into Wikipedia and improves cross-browser support for music symbols. Per [[Wikipedia:Manual of Style (music)#Accidentals]] this template (or the terms "flat", etc.) should be used in pref..."
161560
wikitext
text/x-wiki
{{documentation subpage}}
{{Distinguish|Template:Music topics}}
{{Commons|Template:Music}}
<!--Hopefully the inline style attribute will be replace by a class reference to "accidental" in [[MediaWiki:Common.css]]-->
{{tl|Music}} renders Western music notation of various types into Wikipedia and improves cross-browser support for music symbols. Per [[Wikipedia:Manual of Style (music)#Accidentals]] this template (or the terms "flat", etc.) should be used in preference to the lowercase letter "b" and the number sign (#).
The images used here are categorized at [[:commons:Category:Template:Music]], so if you change an image used please try and remember to update the categorization.
==Accidentals==
The template correctly renders Unicode sharps ({{music|sharp}}), flats ({{music|flat}}), and natural signs ({{music|natural}}) in [[Internet Explorer]] which would otherwise display [[Mojibake|empty squares]] unless a full Unicode font is chosen in its Preferences. The choice of fonts also improves the rendering in other browsers on [[Microsoft Windows]] such as [[Mozilla Firefox]]. See the tables below to compare the results in your current browser. The template makes use of [[Scalable Vector Graphics|SVG]] to display double flat ({{music|doubleflat}}), double sharp ({{music|doublesharp}}), and microtonal signs since the corresponding Unicode characters are not widely supported.
{| class="wikitable" style="text-align: center;"
! style="width:6em;" | Symbol
! style="width:6em;" | Unicode<br/>entity
! style="width:6em;" | Unicode<br/>result
! style="width:18em;" | Template<br/>text
! style="width:6em;" | Template<br/>result
|-
! [[Flat (music)|Flat]]
| <code>&#x266d;</code> || ♭
| {{tlc|music|flat}}<br/>''or'' {{tlc|music|b}}<br/>''or'' {{tlc|music|♭}}<br/> ''or'' {{tlc|flat}} || {{music|flat}}
|-
! [[Natural (music)|Natural]]
| <code>&#x266e;</code> || ♮
| {{tlc|music|natural}}<br/>''or'' {{tlc|music|♮}} || {{music|natural}}
|-
! [[Sharp (music)|Sharp]]
| <code>&#x266f;</code> || ♯
| {{tlc|music|sharp}}<br/>''or'' {{tlc|music|#}}<br/>''or'' {{tlc|music|♯}}<br/> ''or'' {{tlc|sharp}} || {{music|sharp}}
|-
! Double<br/>flat
| <code>&#x1D12B;</code> || 𝄫
| {{tlc|music|doubleflat}}<br/>''or'' {{tlc|music|bb}}<br/>''or'' {{tlc|music|𝄫}} || {{music|doubleflat}}
|-
! Double sharp
| <code>&#x1D12A;</code> || 𝄪
| {{tlc|music|doublesharp}}<br/>''or'' {{tlc|music|##}}<br/>''or'' {{tlc|music|x}}<br/>''or'' {{tlc|music|𝄪}} || {{music|doublesharp}}
|-
! Triple flat|Triple<br />flat
| <code> </code> ||
| {{tlc|music|tripleflat}}<br/>''or'' {{tlc|music|bbb}} || {{music|tripleflat}}
|-
! Triple sharp
| <code> </code> ||
| {{tlc|music|triplesharp}}<br/>''or'' {{tlc|music|###}}<br/> ''or'' {{tlc|music|#x}} || {{music|triplesharp}}
|-
! Half flat|Half<br/>flat
| <code>&#x1D133;</code> || 𝄳
| {{tlc|music|halfflat}}<br/>''or'' {{tlc|music|d}} || {{music|halfflat}}
|-
! Half sharp|Half<br/>sharp
| <code>&#x1D132;</code> || 𝄲
| {{tlc|music|halfsharp}}<br/>''or'' {{tlc|music|t}} || {{music|halfsharp}}
|-
! Flat<br/>stroke
| <code>&#x1D133;</code> || 𝄳
| {{tlc|music|flatstroke}} || {{music|flatstroke}}
|-
! Double<br/>flat<br/>stroke
| <code> </code> ||
| {{tlc|music|doubleflatstroke}} || {{music|doubleflatstroke}}
|-
! [[Three quarter flat]]
| <code> </code> ||
| {{tlc|music|threequarterflat}}<br/>''or'' {{tlc|music|db}} || {{music|threequarterflat}}
|-
! [[Three quarter sharp]]
| <code> </code> ||
| {{tlc|music|threequartersharp}}<br/>''or'' {{tlc|music|#t}} || {{music|threequartersharp}}
|-
! [[Septimal quarter tone]] (-)
| <code> </code> ||
| {{tlc|music|7}} ''or''<br/>{{tlc|music|septimal}} || {{music|7}}
|-
! Septimal quarter tone (+)
| <code> </code> ||
| {{tlc|music|L}} ''or''<br/>{{tlc|music|septimal+}} || {{music|L}}
|-
! [[11th partial]] [53 cents] (-)
| <code> </code> ||
| {{tlc|music|down}}<br/>''or'' {{tlc|music|11U}} || {{music|down}}
|-
! 11th partial [difference between 11:8 & 4:3] (+)
| <code> </code> ||
| {{tlc|music|up}}<br/>''or'' {{tlc|music|11}} || {{music|up}}
|-
! [[13th partial]] [26.8 cents] (-)
| <code> </code> ||
| {{tlc|music|E1}} ''or''<br/> {{tlc|music|13 upside down}}<br/>''or'' {{tlc|music|13U}} || {{music|13upsidedown}}
|-
! 13th partial [difference between 13:8 & 8:5] (+)
| <code> </code> ||
| {{tlc|music|13}} ''or''<br/>{{tlc|music|thirteen}} || {{music|13}}
|-
! [[17th partial]] [34.28 cents] (-)
| <code> </code> ||
| {{tlc|music|17 upside down}}<br/>''or'' {{tlc|music|L1}}<br/>''or'' {{tlc|music|17U}} || {{music|17upsidedown}}
|-
! 17th partial [difference between 17:16 & 25:24] (+)
| <code> </code> ||
| {{tlc|music|17}} || {{music|17}}
|-
! [[19th partial]] [18.13 cents] (-)
| <code> </code> ||
| {{tlc|music|19}} || {{music|19}}
|-
! 19th partial [difference between 19:16 & 6:5] (+)
| <code> </code> ||
| {{tlc|music|19 upside down}}<br/> ''or'' {{tlc|music|19U}} || {{music|19upsidedown}}
|-
! [[:en:Twenty-third partial|23rd partial]] [38.05 cents] (+)
| <code> </code> ||
| {{tlc|music|23}} || {{music|23}}
|-
! [[:en:Twenty-ninth partial|29th partial]] [11.98 cents] (+)
| <code> </code> ||
| {{tlc|music|29}} || {{music|29}}
|-
! [[:en:Thirty-first partial|31st partial]] [-56.77 cents] (-)
| <code> </code> ||
| {{tlc|music|1E}} ''or''<br/>{{tlc|music|31U}} ''or''<br/>{{tlc|31upsidedown}} || {{music|31 upside down}}
|-
! 31st partial [56.77 cents] (+)
| <code> </code> ||
| {{tlc|music|31}} || {{music|31}}
|}
;Sample text
The C{{music|#}} crops up very early in Beethoven's Symphony No. 3 in E{{music|b}}.
==Notes and rests==
{| class="wikitable" style="text-align: center;"
! style="width:6em;" | Symbol
! style="width:6em;" | Unicode<br/>entity
! style="width:6em;" | Unicode<br/>result
! style="width:18em;" | Template<br/>text
! style="width:6em;" | Template<br/>result
|-
! Whole<br/>note
| <code>&#x1d15d;</code> || 𝅝
| {{tlc|music|wholenote}}<br/>''or'' {{tlc|music|whole}}<br/>''or'' {{tlc|music|semibreve}} || {{music|whole}}
|-
! Half<br/>note
| <code>&#x1d15e;</code> || 𝅗𝅥
| {{tlc|music|halfnote}}<br/>''or'' {{tlc|music|half}}<br/>''or'' {{tlc|music|minim}} || {{music|half}}
|-
! Quarter<br/>note
| <code>&#x1d15f;</code> || 𝅘𝅥
| {{tlc|music|quarternote}}<br/>''or'' {{tlc|music|quarter}}<br/>''or'' {{tlc|music|crotchet}} || {{music|quarter}}
|-
! Eighth<br/>note
| <code>&#x1d160;</code> || 𝅘𝅥𝅮
| {{tlc|music|eighthnote}}<br/>''or'' {{tlc|music|eighth}}<br/>''or'' {{tlc|music|quaver}} || {{music|eighth}}
|-
! Beamed<br/>eighth<br/>notes
| ||
| {{tlc|music|eighthnotebeam}}<br/>''or'' {{tlc|music|eighthbeam}}<br/>''or'' {{tlc|music|quaverbeam}} || {{music|eighthbeam}}
|-
! Sixteenth<br/>note
| <code>&#x1d161;</code> || 𝅘𝅥𝅯
| {{tlc|music|sixteenthnote}}<br/>''or'' {{tlc|music|sixteenth}}<br/>''or'' {{tlc|music|semiquaver}} || {{music|sixteenth}}
|-
! Beamed<br/>sixteenth<br/>notes
| ||
| {{tlc|music|sixteenthnotebeam}}<br/>''or'' {{tlc|music|sixteenthbeam}}<br/>''or'' {{tlc|music|semiquaverbeam}} || {{music|sixteenthbeam}}
|-
! Thirty-<br/>second<br/>note
| ||
| {{tlc|music|thirty-secondnote}}<br/>''or'' {{tlc|music|thirty-second}}<br/>''or'' {{tlc|music|demisemiquaver}} || {{music|thirty-second}}
|-
! Dot
| . || .
| {{tlc|music|dot}} || {{music|dot}}
|-
! Dotted quarter<br/>note
| <code>&#x1d161;</code>. || 𝅘𝅥𝅯.
| {{tlc|music|dottedquarter}}<br/>''or'' {{tlc|music|dottedcrotchet}} || {{music|dottedquarter}}
|-
! Dotted half<br/>note
| <code>&#x1d15e;</code>. || 𝅗𝅥.
| {{tlc|music|dottedhalf}}<br/>''or'' {{tlc|music|dottedminim}} || {{music|dottedhalf}}
|-
! Whole<br/>rest
| <code>&#x1d13b;</code> || 𝄻
| {{tlc|music|wholerest}}<br/>''or'' {{tlc|music|semibreverest}} || {{music|wholerest}}
|-
! Half<br/>rest
| <code>&#x1d13c;</code> || 𝄼
| {{tlc|music|halfrest}}<br/>''or'' {{tlc|music|minimrest}} || {{music|halfrest}}
|-
! Quarter<br/>rest
| <code>&#x1d13d;</code> || 𝄽
| {{tlc|music|quarterrest}}<br/>''or'' {{tlc|music|crotchetrest}} || {{music|quarterrest}}
|-
! Eighth<br/>rest
| <code>&#x1d13e;</code> || 𝄾
| {{tlc|music|eighthrest}}<br/>''or'' {{tlc|music|quaverrest}} || {{music|eighthrest}}
|-
! Sixteenth<br/>rest
| <code>&#x1d13f;</code> || 𝄿
| {{tlc|music|sixteenthrest}}<br/>''or'' {{tlc|music|semiquaverrest}} || {{music|sixteenthrest}}
|-
! Thirty-<br/>second<br/>rest
| ||
| {{tlc|music|thirtysecondrest}}<br/>''or'' {{tlc|music|demisemiquaverrest}} || {{music|thirtysecondrest}}
|}
Some browsers and typefaces support <code>&#x2669;</code> (♩) and <code>&#x266a;</code> (♪) for quarter and eighth notes, as well as <code>&#x266b;</code> (♫) and <code>&#x266c;</code> (♬) for beamed eighth-note and sixteenth-note pairs respectively, but since the display of these characters does not match any of the other (non-supported) notes and rests, this template does not use these characters.
;Sample text
In place of the single whole note ({{music|semibreve}}), Chopin writes {{music|eighthrest}} {{music|halfnote}} {{music|quarter}} {{music|eighth}}, completely changing the profile of the music.
==Clefs==
{| class="wikitable" style="text-align: center;"
! style="width:6em;" | Symbol
! style="width:16em;" | Template<br/>text
! style="width:6em;" | Template<br/>result
|-
! Treble clef</br>''or'' G-clef
| {{tlc|music|treble}}<br/>''or'' {{tlc|music|trebleclef}}<br/>''or'' {{tlc|music|gclef}} || {{music|trebleclef}}
|-
! Alto<br/>clef
| {{tlc|music|alto}}<br/>''or'' {{tlc|music|altoclef}} || {{music|altoclef}}
|-
! Tenor<br/>clef
| {{tlc|music|tenor}}<br/>''or'' {{tlc|music|tenorclef}} || {{music|tenorclef}}
|-
! C-clef
| {{tlc|music|cclef}} || {{music|cclef}}
|-
! Bass clef</br>''or'' F-clef
| {{tlc|music|bass}}<br/>''or'' {{tlc|music|bassclef}}</br>''or'' {{tlc|music|fclef}} || {{music|bassclef}}
|-
! Neutral clef
| {{tlc|music|neutral}}<br/>''or'' {{tlc|music|neutralclef}}</br> || {{music|neutralclef}}
|}
Note that there is no graphical distinction between treble clef and G-clef; alto clef, tenor clef and C-clef; bass clef and F-clef. The names preserve a difference in meaning and make the caption text (for screen readers) different.
== Time signatures ==
{| class="wikitable" style="text-align: center;"
! style="width:6em;" | Symbol
! style="width:16em;" | Template<br/>text
! style="width:6em;" | Template<br/>result
|-
! common-time
| {{tlc|music|common-time}} || {{music|common-time}}
|-
! cut-time
| {{tlc|music|cut-time}}<br/>''or'' {{tlc|music|alla-breve}} || {{music|cut-time}}
|-
! 2/4
| {{tlc|music|time|2|4}} || {{music|time|2|4}}
|-
! 3/4
| {{tlc|music|time|3|4}} || {{music|time|3|4}}
|-
! 6/8
| {{tlc|music|time|6|8}} || {{music|time|6|8}}
|-
! 9/8
| {{tlc|music|time|9|8}} || {{music|time|9|8}}
|-
! 12/8
| {{tlc|music|time|12|8}} || {{music|time|12|8}}
|}
For a ''general'' time signature, use {{tlc|music|time|top number|bottom number}}. This makes use of [[Template:Time signature]], which should not be used on its own.
==Scale degrees==
Scale degrees are often represented as Arabic numerals with a hat on them and thus the root of a scale is <sub>{{music|scale|1}}</sub>.
{| class="wikitable" style="text-align: center;"
! style="width:6em;" | Scale degree
! style="width:16em;" | Template<br/>text
! style="width:6em;" | Template<br/>result
|-
! 1
| {{tlc|music|scale|1}} || {{music|scale|1}}
|-
! 2
| {{tlc|music|scale|2}} || {{music|scale|2}}
|-
! 3
| {{tlc|music|scale|3}} || {{music|scale|3}}
|-
! 4
| {{tlc|music|scale|4}} || {{music|scale|4}}
|-
! 5
| {{tlc|music|scale|5}} || {{music|scale|5}}
|-
! 6
| {{tlc|music|scale|6}} || {{music|scale|6}}
|-
! 7
| {{tlc|music|scale|7}} || {{music|scale|7}}
|-
! 8
| {{tlc|music|scale|8}} || {{music|scale|8}}
|-
! 9
| {{tlc|music|scale|9}} || {{music|scale|9}}
|}
;Sample text
A descending tetrachord could be written as <sub>{{music|scale|4}}</sub>-<sub>{{music|scale|3}}</sub>-<sub>{{music|scale|2}}</sub>-<sub>{{music|scale|1}}</sub>.
==Chord symbols==
{| class="wikitable" style="text-align: center;"
! style="width:9em;" | Chord
! style="width:16em;" | Template<br/>text
! style="width:6em;" | Template<br/>result
|-
! Diminished
| {{tlc|music|dim}}<br/>''or'' {{tlc|music|dimdeg}} || {{music|dim}}<br/>''or'' {{music|dimdeg}}
|-
! Half-diminished
| {{tlc|music|halfdim}}<br/>''or'' {{tlc|music|dimslash}} || {{music|halfdim}}
|-
! Augmented
| {{tlc|music|+}}<br/>''or'' {{tlc|music|aug}} || {{music|aug}}
|-
! Major
| {{tlc|music|Δ}}<br/>''or'' {{tlc|music|delta}}<br/>''or'' {{tlc|music|major}}<br/>''or'' {{tlc|music|maj}} || {{music|major}}
|-
! Root position
| {{tlc|music|53}}<br/>''or'' {{tlc|music|53 chord}} || {{music|53}}
|-
! First inversion
| {{tlc|music|63}}<br/>''or'' {{tlc|music|63 chord}} || {{music|63}}
|-
! Second inversion
| {{tlc|music|64}}<br/>''or'' {{tlc|music|64 chord}} || {{music|64}}
|}
;Sample text
vii{{music|dim}} becomes vii{{music|dimslash}} in B{{music|flat}} minor by raising the G{{music|b}} to G{{music|natural}}.
III becomes III{{music|aug}} in G{{music|#}} minor by raising the F{{music|#}} to F{{music|x}}.
The F{{music|#}}{{music|major}}<sup>7</sup> is used to great effect in the last measure of the piece.
==Key signatures==
Key signatures must be typed in using the names of the articles themselves on keys. Note that there is no visual difference between the major and minor key signatures, but the alt text is different.
{| class="wikitable" style="text-align: center;"
! Sharps/Flats
! style="width:9em;" | Key signature (major)
! style="width:16em;" | Template<br/>text
! style="width:6em;" | Template<br/>result
! style="width:9em;" | Key signature (minor)
! style="width:16em; | Template<br/>text
! style="width:6em;" | Template<br/>result
|-
! 7{{music|#}}
! [[C-sharp major|C{{music|#}} major]]
| {{tlc|music|c-sharp major}} || {{music|c-sharp major}}
! [[A-sharp minor|A{{music|#}} minor]]
| {{tlc|music|a-sharp minor}} || {{music|a-sharp minor}}
|-
! 6{{music|#}}
! [[F-sharp major|F{{music|#}} major]]
| {{tlc|music|f-sharp major}} || {{music|f-sharp major}}
! [[D-sharp minor|D{{music|#}} minor]]
| {{tlc|music|d-sharp minor}} || {{music|d-sharp minor}}
|-
! 5{{music|#}}
! [[B major]]
| {{tlc|music|b major}} || {{music|b major}}
! [[G-sharp minor|G{{music|#}} minor]]
| {{tlc|music|g-sharp minor}} || {{music|g-sharp minor}}
|-
! 4{{music|#}}
! [[E major]]
| {{tlc|music|e major}} || {{music|e major}}
! [[C-sharp minor|C{{music|#}} minor]]
| {{tlc|music|c-sharp minor}} || {{music|c-sharp minor}}
|-
! 3{{music|#}}
! [[A major]]
| {{tlc|music|a major}} || {{music|a major}}
! [[F-sharp minor|F{{music|#}} minor]]
| {{tlc|music|f-sharp minor}} || {{music|f-sharp minor}}
|-
! 2{{music|#}}
! [[D major]]
| {{tlc|music|d major}} || {{music|d major}}
! [[B minor]]
| {{tlc|music|b minor}} || {{music|b minor}}
|-
! 1{{music|#}}
! [[G major]]
| {{tlc|music|g major}} || {{music|g major}}
! [[E minor]]
| {{tlc|music|e minor}} || {{music|e minor}}
|-
! 0
! [[C major]]
| {{tlc|music|c major}} || {{music|c major}}
! [[A minor]]
| {{tlc|music|a minor}} || {{music|a minor}}
|-
! 1{{music|b}}
! [[F major]]
| {{tlc|music|f major}} || {{music|f major}}
! [[D minor]]
| {{tlc|music|d minor}} || {{music|d minor}}
|-
! 2{{music|b}}
! [[B-flat major|B{{music|b}} major]]
| {{tlc|music|b-flat major}} || {{music|b-flat major}}
! [[G minor]]
| {{tlc|music|g minor}} || {{music|g minor}}
|-
! 3{{music|b}}
! [[E-flat major|E{{music|b}} major]]
| {{tlc|music|e-flat major}} || {{music|e-flat major}}
! [[C minor]]
| {{tlc|music|c minor}} || {{music|c minor}}
|-
! 4{{music|b}}
! [[A-flat major|A{{music|b}} major]]
| {{tlc|music|a-flat major}} || {{music|a-flat major}}
! [[F minor]]
| {{tlc|music|f minor}} || {{music|f minor}}
|-
! 5{{music|b}}
! [[D-flat major|D{{music|b}} major]]
| {{tlc|music|d-flat major}} || {{music|d-flat major}}
! [[B-flat minor|B{{music|b}} minor]]
| {{tlc|music|b-flat minor}} || {{music|b-flat minor}}
|-
! 6{{music|b}}
! [[G-flat major|G{{music|b}} major]]
| {{tlc|music|g-flat major}} || {{music|g-flat major}}
! [[E-flat minor|E{{music|b}} minor]]
| {{tlc|music|e-flat minor}} || {{music|e-flat minor}}
|-
! 7{{music|b}}
! [[C-flat major|C{{music|b}} major]]
| {{tlc|music|c-flat major}} || {{music|c-flat major}}
! [[A-flat minor|A{{music|b}} minor]]
| {{tlc|music|a-flat minor}} || {{music|a-flat minor}}
|}
==Bars==
{| class="wikitable" style="text-align: center;"
|-
! style="width:6em;" | Symbol
! style="width:6em;" | Unicode<br/>entity
! style="width:6em;" | Unicode<br/>result
! style="width:18em;" | Template<br/>text
! style="width:6em;" | Template<br/>result
|-
| '''Left repeat'''
| &#x1D106;
| 𝄆
| {{Tlc|Music|left repeat}}
| {{Music|left repeat}}
|-
| '''Right repeat'''
| &#x1D107;
| 𝄇
| {{Tlc|Music|right repeat}}
| {{Music|right repeat}}
|}
==Changing the size==
Most symbols generated by this template, including double flats and sharps, notes, rests and key signatures, use images, as corresponding Unicode characters either don't exist or are not supported by all browsers. Unlike characters, images don't scale along with the surrounding text. To change the size of an image, to match the font size of the text in which it is placed, use the {{para|size}} parameter. Example:
*<code><span style="font-size:80%">G{{((}}music|bb|size=x8px{{))}}</span></code> → <span style="font-size:80%">G{{music|bb|size=x8px}}</span>
==See also==
*[[:Template:MusicScore]]
*[[:commons:Template:Music]]
*[[Help:Score]] and [[mw:Extension:Score]]
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox |
| <!-- Categories below this line, please: -->
[[Category:Music templates|{{BASEPAGENAME}}]]
[[Category:MSIE font fix templates|{{BASEPAGENAME}}]]
}}</includeonly>
hu3xnu0qnaetf7ulbun5ps8vn5b5r06
Nodyn:Puro
10
82684
161562
2026-03-27T01:21:38Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "{{#invoke:Purge|main}}<noinclude> {{documentation}} </noinclude>"
161562
wikitext
text/x-wiki
{{#invoke:Purge|main}}<noinclude>
{{documentation}}
</noinclude>
jp4ln3hv505tbr6kcpy61x7wo9joahj
Nodyn:Su
10
82685
161563
2026-03-27T01:28:52Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "<noinclude>{{documentation}}<!-- PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS Normally, the code for the template is included, but this template is too complex to do that. --></noinclude><includeonly>{{#if:{{{p|}}}|{{#if:{{{b|}}}|<span style="display:-moz-inline-box;-moz-box-orient:vertical;display:inline-block;vertical-align:bottom;min-height:1em;{{#ifeq:{{{w|}}}|f|font-family:monospace;}}font-size:80%;line-height:1;margin-bottom:-0.1em;ove..."
161563
wikitext
text/x-wiki
<noinclude>{{documentation}}<!--
PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS
Normally, the code for the template is included, but this template is too complex to do that.
--></noinclude><includeonly>{{#if:{{{p|}}}|{{#if:{{{b|}}}|<span style="display:-moz-inline-box;-moz-box-orient:vertical;display:inline-block;vertical-align:bottom;min-height:1em;{{#ifeq:{{{w|}}}|f|font-family:monospace;}}font-size:80%;line-height:1;margin-bottom:-0.1em;overflow:visible;text-align:{{#switch:{{{a|}}}|r=right|c=center|left}}"><span style="display:block;min-height:1em;margin-top:-1.1em;line-height:1;background:transparent;overflow:visible">{{{p|super}}}</span><span style="display:block;min-height:1em;background:transparent;line-height:1;overflow:visible">{{{b|sub}}}</span></span>|{{sup|{{{p|}}}}}}}|{{sub|{{{b|}}}}}}}</includeonly>
9fetsyfvgzccxz0h2p5ksro2v2hvpkq
Nodyn:Sup sub
10
82686
161564
2026-03-27T01:29:45Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "{{su|p={{{1}}}|b={{{2}}}|fontsize=1.5ex}}<noinclude> {{Documentation}} </noinclude>"
161564
wikitext
text/x-wiki
{{su|p={{{1}}}|b={{{2}}}|fontsize=1.5ex}}<noinclude>
{{Documentation}}
</noinclude>
funcio8qkgof67xvjemjx90ta928inr
Nodyn:Template link
10
82687
161565
2026-03-27T01:30:58Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "<span class="nowrap">{{</span>[[Template:{{{1}}}|{{{1}}}]]<span class="nowrap">}}</span><noinclude> {{documentation}} <!-- Categories go on the /doc subpage and interwikis go on Wikidata. --> </noinclude>"
161565
wikitext
text/x-wiki
<span class="nowrap">{{</span>[[Template:{{{1}}}|{{{1}}}]]<span class="nowrap">}}</span><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
kkhg4xclyf9r0bcl7ypdd0yuh41mfu9
Nodyn:Time signature
10
82688
161566
2026-03-27T01:32:52Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "{{su|a=c|p={{{1}}}|b={{{2}}}}}<noinclude> {{Documentation}} </noinclude>"
161566
wikitext
text/x-wiki
{{su|a=c|p={{{1}}}|b={{{2}}}}}<noinclude>
{{Documentation}}
</noinclude>
tmas82lao4qqsa0pbw78o7br48hhshq
Modiwl:Hatnote
828
82689
161567
2026-03-27T01:41:14Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "-------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the {{hatnote}} and {{format link}} meta-templates and includes -- -- helper functions for other Lua hatnote modules...."
161567
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote --
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules. --
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
function p.findNamespaceId(link, removeColon)
-- Finds the namespace id (namespace number) of a link or a pagename. This
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to false.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
if removeColon ~= false then
link = removeInitialColon(link)
end
local namespace = link:match('^(.-):')
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
return 0
end
function p.formatPages(...)
-- Formats a list of pages using formatLink and returns it as an array. Nil
-- values are not allowed.
local pages = {...}
local ret = {}
for i, page in ipairs(pages) do
ret[i] = p._formatLink{link = page}
end
return ret
end
function p.formatPageTables(...)
-- Takes a list of page/display tables and returns it as a list of
-- formatted links. Nil values are not allowed.
local pages = {...}
local links = {}
for i, t in ipairs(pages) do
checkType('formatPageTables', i, t, 'table')
local link = t[1]
local display = t[2]
links[i] = p._formatLink{link = link, display = display}
end
return links
end
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
-- Formats an error message to be returned to wikitext. If
-- addTrackingCategory is not false after being returned from
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
-- is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
-- Make the help link text.
local helpText
if helpLink then
helpText = ' ([[' .. helpLink .. '|help]])'
else
helpText = ''
end
-- Make the category text.
local category
if not title.isTalkPage -- Don't categorise talk pages
and title.namespace ~= 2 -- Don't categorise userspace
and yesno(addTrackingCategory) ~= false -- Allow opting out
then
category = 'Hatnote templates with errors'
category = string.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
category = ''
end
return string.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
category
)
end
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return string.format('%s (%s)', page, disambiguator)
end
--------------------------------------------------------------------------------
-- Format link
--
-- Makes a wikilink from the given link and display values. Links are escaped
-- with colons if necessary, and links to sections are detected and displayed
-- with " § " as a separator rather than the standard MediaWiki "#". Used in
-- the {{format link}} template.
--------------------------------------------------------------------------------
function p.formatLink(frame)
-- The formatLink export function, for use in templates.
yesno = require('Module:Yesno')
local args = getArgs(frame)
local link = args[1]
if not link then
return p.makeWikitextError(
'no link specified',
'Template:Format link#Errors',
args.category
)
end
return p._formatLink{
link = link,
display = args[2],
italicizePage = yesno(args.italicizepage),
italicizeSection = yesno(args.italicizesection),
}
end
local function italicize(s)
-- Italicize a string.
return '<i>' .. s .. '</i>'
end
local function maybeItalicize(s, shouldItalicize)
-- italicize s if s is a string and the shouldItalicize parameter is true.
if s and shouldItalicize then
return italicize(s)
else
return s
end
end
local function parseLink(link)
-- Parse a link and return a table with the link's components.
-- These components are:
-- - link: the link, stripped of any initial colon (always present)
-- - page: the page name (always present)
-- - section: the page name (may be nil)
-- - display: the display text, if manually entered after a pipe (may be nil)
link = removeInitialColon(link)
-- Find whether a faux display value has been added with the {{!}} magic
-- word.
local prePipe, display = link:match('^(.-)|(.*)$')
link = prePipe or link
-- Find the page, if it exists.
-- For links like [[#Bar]], the page will be nil.
local preHash, postHash = link:match('^(.-)#(.*)$')
local page
if not preHash then
-- We have a link like [[Foo]].
page = link
elseif preHash ~= '' then
-- We have a link like [[Foo#Bar]].
page = preHash
end
-- Find the section, if it exists.
local section
if postHash and postHash ~= '' then
section = postHash
end
return {
link = link,
page = page,
section = section,
display = display,
}
end
function p._formatLink(options)
-- The formatLink export function, for use in modules.
checkType('_formatLink', 1, options, 'table')
checkTypeForNamedArg('_formatLink', 'link', options.link, 'string', false)
checkTypeForNamedArg(
'_formatLink',
'display',
options.display,
'string',
true
)
checkTypeForNamedArg(
'_formatLink',
'italicizePage',
options.italicizePage,
'boolean',
true
)
checkTypeForNamedArg(
'_formatLink',
'italicizeSection',
options.italicizeSection,
'boolean',
true
)
local parsed = parseLink(options.link)
local display = options.display or parsed.display
-- Deal with the case where we don't have to pipe the link
if not display and not parsed.section and not options.italicizePage then
return string.format('[[:%s]]', parsed.link)
end
-- Find the display text for piped links
if not display then
local page = maybeItalicize(parsed.page, options.italicizePage)
local section = maybeItalicize(parsed.section, options.italicizeSection)
if not page then
display = string.format('§ %s', section)
elseif section then
display = string.format('%s § %s', page, section)
else
display = page
end
end
return string.format('[[:%s|%s]]', parsed.link, display)
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
local options = {}
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
)
end
options.extraclasses = args.extraclasses
options.selfref = args.selfref
return p._hatnote(s, options)
end
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local classes = {'hatnote', 'navigation-not-searchable'}
local extraclasses = options.extraclasses
local selfref = options.selfref
if type(extraclasses) == 'string' then
classes[#classes + 1] = extraclasses
end
if selfref then
classes[#classes + 1] = 'selfref'
end
return string.format(
'%s<div role="note" class="%s">%s</div>',
mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
},
table.concat(classes, ' '),
s
)
end
return p
8jl4tbplx9vbofd81vddfc42fqmupj3
Modiwl:Hatnote/styles.css
828
82690
161568
2026-03-27T01:45:21Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "/* {{pp|small=y}} */ .hatnote { font-style: italic; } /* Limit structure CSS to divs because of [[Module:Hatnote inline]] */ div.hatnote { /* @noflip */ padding-left: 1.6em; margin-bottom: 0.5em; } .hatnote i { font-style: normal; } /* The templatestyles element inserts a link element before hatnotes. * TODO: Remove link if/when WMF resolves T200206 */ .hatnote + link + .hatnote { margin-top: -0.5em; } @media print { body.ns-0 .hatnote { display:..."
161568
sanitized-css
text/css
/* {{pp|small=y}} */
.hatnote {
font-style: italic;
}
/* Limit structure CSS to divs because of [[Module:Hatnote inline]] */
div.hatnote {
/* @noflip */
padding-left: 1.6em;
margin-bottom: 0.5em;
}
.hatnote i {
font-style: normal;
}
/* The templatestyles element inserts a link element before hatnotes.
* TODO: Remove link if/when WMF resolves T200206 */
.hatnote + link + .hatnote {
margin-top: -0.5em;
}
@media print {
body.ns-0 .hatnote {
display: none !important;
}
}
jwhkjblpyf93ejffkuu68hxj9zpt08y
Modiwl:Message box/configuration
828
82691
161569
2026-03-27T01:49:02Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "require('strict') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -----------------------------------------------------------------..."
161569
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
self.typeImageNeedsLink = typeData.imageNeedsLink
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage
or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" )
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
m4s7cflge0qvr0ardrqg93lmo6zfhji
Modiwl:Message box/fmbox.css
828
82692
161570
2026-03-27T01:50:48Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "/* {{pp|small=y}} */ .fmbox { clear: both; margin: 0.2em 0; width: 100%; border: 1px solid #a2a9b1; background-color: var(--background-color-interactive-subtle, #f8f9fa); box-sizing: border-box; color: var(--color-base, #202122); } .fmbox-warning { border: 1px solid #bb7070; /* Dark pink */ background-color: #ffdbdb; /* Pink */ } .fmbox-editnotice { background-color: transparent; } .fmbox .mbox-text { border: none; /* @noflip */ paddi..."
161570
sanitized-css
text/css
/* {{pp|small=y}} */
.fmbox {
clear: both;
margin: 0.2em 0;
width: 100%;
border: 1px solid #a2a9b1;
background-color: var(--background-color-interactive-subtle, #f8f9fa);
box-sizing: border-box;
color: var(--color-base, #202122);
}
.fmbox-warning {
border: 1px solid #bb7070; /* Dark pink */
background-color: #ffdbdb; /* Pink */
}
.fmbox-editnotice {
background-color: transparent;
}
.fmbox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.9em;
width: 100%;
}
.fmbox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.fmbox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
.fmbox .mbox-invalid-type {
text-align: center;
}
@media screen {
html.skin-theme-clientpref-night .fmbox-warning {
background-color: #683131; /* Reddish, same hue/saturation as light */
}
}
@media screen and ( prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .fmbox-warning {
background-color: #683131; /* Reddish, same hue/saturation as light */
}
}
13ao9jm7723i16efwyjzjw0zpma8wx8
Modiwl:Purge
828
82693
161571
2026-03-27T01:51:56Z
AlwynapHuw
1710
Dechrau tudalen newydd gyda "-- This module implements [[Template:Purge]]. local p = {} local function makeUrlLink(url, display) return string.format('[%s %s]', url, display) end function p._main(args) -- Make the URL local url do local title if args.page then title = mw.title.new(args.page) if not title then error(string.format( "'%s' is not a valid page name", args.page ), 2) end else title = mw.title.getCurrentTitle() end if args.anchor the..."
161571
Scribunto
text/plain
-- This module implements [[Template:Purge]].
local p = {}
local function makeUrlLink(url, display)
return string.format('[%s %s]', url, display)
end
function p._main(args)
-- Make the URL
local url
do
local title
if args.page then
title = mw.title.new(args.page)
if not title then
error(string.format(
"'%s' is not a valid page name",
args.page
), 2)
end
else
title = mw.title.getCurrentTitle()
end
if args.anchor then
title.fragment = args.anchor
end
url = title:fullUrl{action = 'purge'}
end
-- Make the display
local display
if args.page then
display = args[1] or 'Purge'
else
display = mw.html.create('span')
display
:attr('title', 'Purge this page')
:wikitext(args[1] or 'Purge')
display = tostring(display)
end
-- Output the HTML
local root = mw.html.create('span')
root
:addClass('noprint')
:addClass('plainlinks')
:addClass('purgelink')
:wikitext(makeUrlLink(url, display))
return tostring(root)
end
function p.main(frame)
local args = frame:getParent().args
return p._main(args)
end
return p
7zn4wpraqp0o2q6ovvb2j9zno19p3zp