ⵡⵉⴽⵉⴱⵉⴷⵢⴰ
zghwiki
https://zgh.wikipedia.org/wiki/%E2%B5%9C%E2%B4%B0%E2%B5%99%E2%B5%8F%E2%B4%B0_%E2%B5%8F_%E2%B5%93%E2%B5%99%E2%B5%8F%E2%B5%93%E2%B4%B1%E2%B4%B3
MediaWiki 1.46.0-wmf.24
first-letter
ⵎⵉⴷⵢⴰ
ⴰⵎⵥⵍⵉ
ⴰⵎⵙⴳⴷⴰⵍ
ⴰⵏⵙⵙⵎⵔⵙ
ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ
ⵡⵉⴽⵉⴱⵉⴷⵢⴰ
ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵡⵉⴽⵉⴱⵉⴷⵢⴰ
ⴰⴼⴰⵢⵍⵓ
ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⴼⴰⵢⵍⵓ
ⵎⵉⴷⵢⴰⵡⵉⴽⵉ
ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵎⵉⴷⵢⴰⵡⵉⴽⵉ
ⴰⵍⴱⵓⴹ
ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵍⴱⵓⴹ
ⵜⵉⵡⵉⵙⵉ
ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵜⵡⵉⵙⵉ
ⴰⵙⵎⵉⵍ
ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵙⵎⵉⵍ
TimedText
TimedText talk
Module
Module talk
Event
Event talk
26 ⵉⴱⵔⵉⵔ
0
2808
175765
157265
2026-04-26T09:15:44Z
ABDELATIF ANADJAR
14
/* ⵜⵉⵎⵙⴰⵔⵉⵏ */
175765
wikitext
text/x-wiki
{{ⴰⵎⵏⵏⵉ ⵡⴰⵔ ⵉⵙⴰⵖⵓⵍⵏ}}
{{ⴰⵎⵓⴷ}}
{|class="infobox" style="width: 10em; border: 1px solid #CDDC39; border-spacing: 4px; background-color: #FCFFDA; color: black; margin: 0.5em [[0]] 0.5em 1em; padding: 0.5em; clear: right; font-size: 100%; line-height: 1.5em; text-align: left;"
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''26 ⵉⴱⵔⵉⵔ'''
|-
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''April 26''' ([[ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵏⴳⵍⵉⵣⵜ|ⵜⴰⵏⴳⵍⵉⵣⵜ]])
|-
|align="center" colspan="7"|[[ⴰⴼⴰⵢⵍⵓ:26-ⵉⴱⵔⵉⵔ.ZGH.png|thumb|280px|center|]]
|-
|align="center" colspan="7"|
|-
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''26 [[ⵉⴱⵔⵉⵔ]] ⴳ [[ⴰⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ|ⵓⵙⵎⵍⵓⵙⵙⴰⵏ]] (2023)'''
|-
|align="center" colspan="7"|
|-
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⵏⴰⵙ|ⴰⵙⵉⵏ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⴽⵔⴰⵙ|ⴰⴽⵔ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⴽⵡⴰⵙ|ⴰⴽⵡ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⵎⵡⴰⵙ|ⴰⵙⵉⵎ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⴹⵢⴰⵙ|ⴰⵙⵉⴹ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⴰⵎⴰⵙ|ⴰⵙⴰⵎ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵢⵏⴰⵙ|ⴰⵢⵏ]]
|-
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[1 ⵉⴱⵔⵉⵔ|1]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[2 ⵉⴱⵔⵉⵔ|2]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[3 ⵉⴱⵔⵉⵔ|3]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[4 ⵉⴱⵔⵉⵔ|4]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[5 ⵉⴱⵔⵉⵔ|5]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[6 ⵉⴱⵔⵉⵔ|6]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[7 ⵉⴱⵔⵉⵔ|7]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[8 ⵉⴱⵔⵉⵔ|8]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[9 ⵉⴱⵔⵉⵔ|9]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[10 ⵉⴱⵔⵉⵔ|10]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[11 ⵉⴱⵔⵉⵔ|11]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[12 ⵉⴱⵔⵉⵔ|12]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[13 ⵉⴱⵔⵉⵔ|13]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[14 ⵉⴱⵔⵉⵔ|14]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[15 ⵉⴱⵔⵉⵔ|15]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[16 ⵉⴱⵔⵉⵔ|16]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[17 ⵉⴱⵔⵉⵔ|17]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[18 ⵉⴱⵔⵉⵔ|18]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[19 ⵉⴱⵔⵉⵔ|19]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[20 ⵉⴱⵔⵉⵔ|20]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[21 ⵉⴱⵔⵉⵔ|21]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[22 ⵉⴱⵔⵉⵔ|22]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[23 ⵉⴱⵔⵉⵔ|23]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[24 ⵉⴱⵔⵉⵔ|24]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[25 ⵉⴱⵔⵉⵔ|25]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | ([[26 ⵉⴱⵔⵉⵔ|26]])
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[27 ⵉⴱⵔⵉⵔ|27]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[28 ⵉⴱⵔⵉⵔ|28]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[29 ⵉⴱⵔⵉⵔ|29]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[30 ⵉⴱⵔⵉⵔ|30]]
| style="border: 1px solid #CDDC39;" |
|-
|-style="background: #white;"
|align="center" colspan="7"|'''[[25 ⵉⴱⵔⵉⵔ|← 25 ⵉⴱⵔⵉⵔ]]''' [[File:Weather icon - full moon.svg|25px]] '''[[27 ⵉⴱⵔⵉⵔ|27 ⵉⴱⵔⵉⵔ →]]'''
|-
|}
'''26 ⵉⴱⵔⵉⵔ''' (ⵙ [[ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵏⴳⵍⵉⵣⵜ|ⵜⵏⴳⵍⵉⵣⵜ]]: ''April 26'') ⵉⴳⴰ [[ⴰⵙⵙ]] ⵡⵉⵙⵙ "[[26|ⵓⴳⵏⴰⵔ ⴷ ⵚⴹⵉⵚ]]" ⴳ ⵡⴰⵢⵢⵓⵔ ⵡⵉⵙⵙ ⴽⴽⵓⵥ ([[ⵉⴱⵔⵉⵔ]]) ⴳ [[ⴰⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ|ⵓⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ]], ⴷ ⴰⵔ ⴰⵙ ⵜⵜⵖⴰⵎⴰ 249 ⵏ [[ⵡⴰⵙⵙ]] ⵢ ⵜⴳⵉⵔⴰ ⵏ ⵓⵙⴳⴳⵯⴰⵙ.
==ⵜⵉⵎⵙⴰⵔⵉⵏ==
*[[1860]]: ⴰⵙⴳⵎⴹ ⵏ ⵜⵎⵢⴰⵇⵇⴰⵏⵜ ⵏ '''ⵡⴰⴷ ⵔⴰⵙ''' ⵏⴳⵔ [[ⵍⵎⵖⵔⵉⴱ]] ⴷ '''ⵙⴱⴰⵏⵢⴰ'''.
*[[1967]]: ⵜⵍⵓⵍ ⵜⵏⴰⵥⵓⵕⵜ ⵏ ⵡⴰⵟⵍⴰⵙ '''ⵛⵛⵔⵉⴼⴰ ⴳⵉⵔⵙⵉⵜ''' ⴳ ⵜⵎⴷⵉⵏⵜ ⵏ [[ⵅⵏⵉⴼⵕⴰ]].
==ⵉⵍⵉⵍⵉⵜⵏ==
==ⵉⵎⵜⵜⴰⵏⵏ==
==ⵥⵕ ⵓⴳⴳⴰⵔ==
==ⵉⵙⴰⵖⵓⵍⵏ==
{{ⵉⵙⴰⵖⵓⵍⵏ}}
{{ⴰⴱⴰⴹ ⵓⵏⵜⵉⵎ}}
{{ⴰⵙⵎⵉⵍ|ⴰⴽⵓⴷ|ⴰⵙⴰⴽⵓⴷ|ⵉⴱⵔⵉⵔ|ⵓⵙⵙⴰⵏ ⵏ ⵓⵙⴳⴳⵯⴰⵙ}}
osgjswv1ovd3px8jxh9vbcjalzv1scj
175766
175765
2026-04-26T09:16:24Z
ABDELATIF ANADJAR
14
175766
wikitext
text/x-wiki
{{ⴰⵎⵏⵏⵉ ⵡⴰⵔ ⵉⵙⴰⵖⵓⵍⵏ}}
{{ⴰⵎⵓⴷ}}
{|class="infobox" style="width: 10em; border: 1px solid #CDDC39; border-spacing: 4px; background-color: #FCFFDA; color: black; margin: 0.5em [[0]] 0.5em 1em; padding: 0.5em; clear: right; font-size: 100%; line-height: 1.5em; text-align: left;"
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''26 ⵉⴱⵔⵉⵔ'''
|-
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''April 26''' ([[ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵏⴳⵍⵉⵣⵜ|ⵜⴰⵏⴳⵍⵉⵣⵜ]])
|-
|align="center" colspan="7"|[[ⴰⴼⴰⵢⵍⵓ:26-ⵉⴱⵔⵉⵔ.ZGH.png|thumb|280px|center|]]
|-
|align="center" colspan="7"|
|-
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''26 [[ⵉⴱⵔⵉⵔ]] ⴳ [[ⴰⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ|ⵓⵙⵎⵍⵓⵙⵙⴰⵏ]] (2023)'''
|-
|align="center" colspan="7"|
|-
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⵏⴰⵙ|ⴰⵙⵉⵏ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⴽⵔⴰⵙ|ⴰⴽⵔ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⴽⵡⴰⵙ|ⴰⴽⵡ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⵎⵡⴰⵙ|ⴰⵙⵉⵎ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⴹⵢⴰⵙ|ⴰⵙⵉⴹ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⴰⵎⴰⵙ|ⴰⵙⴰⵎ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵢⵏⴰⵙ|ⴰⵢⵏ]]
|-
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[1 ⵉⴱⵔⵉⵔ|1]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[2 ⵉⴱⵔⵉⵔ|2]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[3 ⵉⴱⵔⵉⵔ|3]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[4 ⵉⴱⵔⵉⵔ|4]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[5 ⵉⴱⵔⵉⵔ|5]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[6 ⵉⴱⵔⵉⵔ|6]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[7 ⵉⴱⵔⵉⵔ|7]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[8 ⵉⴱⵔⵉⵔ|8]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[9 ⵉⴱⵔⵉⵔ|9]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[10 ⵉⴱⵔⵉⵔ|10]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[11 ⵉⴱⵔⵉⵔ|11]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[12 ⵉⴱⵔⵉⵔ|12]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[13 ⵉⴱⵔⵉⵔ|13]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[14 ⵉⴱⵔⵉⵔ|14]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[15 ⵉⴱⵔⵉⵔ|15]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[16 ⵉⴱⵔⵉⵔ|16]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[17 ⵉⴱⵔⵉⵔ|17]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[18 ⵉⴱⵔⵉⵔ|18]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[19 ⵉⴱⵔⵉⵔ|19]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[20 ⵉⴱⵔⵉⵔ|20]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[21 ⵉⴱⵔⵉⵔ|21]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[22 ⵉⴱⵔⵉⵔ|22]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[23 ⵉⴱⵔⵉⵔ|23]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[24 ⵉⴱⵔⵉⵔ|24]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[25 ⵉⴱⵔⵉⵔ|25]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | ([[26 ⵉⴱⵔⵉⵔ|26]])
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[27 ⵉⴱⵔⵉⵔ|27]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[28 ⵉⴱⵔⵉⵔ|28]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[29 ⵉⴱⵔⵉⵔ|29]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[30 ⵉⴱⵔⵉⵔ|30]]
| style="border: 1px solid #CDDC39;" |
|-
|-style="background: #white;"
|align="center" colspan="7"|'''[[25 ⵉⴱⵔⵉⵔ|← 25 ⵉⴱⵔⵉⵔ]]''' [[File:Weather icon - full moon.svg|25px]] '''[[27 ⵉⴱⵔⵉⵔ|27 ⵉⴱⵔⵉⵔ →]]'''
|-
|}
'''26 ⵉⴱⵔⵉⵔ''' (ⵙ [[ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵏⴳⵍⵉⵣⵜ|ⵜⵏⴳⵍⵉⵣⵜ]]: ''April 26'') ⵉⴳⴰ [[ⴰⵙⵙ]] ⵡⵉⵙⵙ "[[26|ⵓⴳⵏⴰⵔ ⴷ ⵚⴹⵉⵚ]]" ⴳ ⵡⴰⵢⵢⵓⵔ ⵡⵉⵙⵙ ⴽⴽⵓⵥ ([[ⵉⴱⵔⵉⵔ]]) ⴳ [[ⴰⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ|ⵓⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ]], ⴷ ⴰⵔ ⴰⵙ ⵜⵜⵖⴰⵎⴰ 249 ⵏ [[ⵡⴰⵙⵙ]] ⵢ ⵜⴳⵉⵔⴰ ⵏ ⵓⵙⴳⴳⵯⴰⵙ.
==ⵜⵉⵎⵙⴰⵔⵉⵏ==
*[[1860]]: ⴰⵙⴳⵎⴹ ⵏ ⵜⵎⵢⴰⵇⵇⴰⵏⵜ ⵏ '''ⵡⴰⴷ ⵔⴰⵙ''' ⵏⴳⵔ [[ⵍⵎⵖⵔⵉⴱ]] ⴷ '''ⵙⴱⴰⵏⵢⴰ'''.
*[[1967]]: ⵜⵍⵓⵍ ⵜⵏⴰⵥⵓⵕⵜ ⵏ ⵡⴰⵟⵍⴰⵙ '''ⵛⵛⵔⵉⴼⴰ ⴳⵉⵔⵙⵉⵜ''' ⴳ ⵜⵎⴷⵉⵏⵜ ⵏ [[ⵅⵏⵉⴼⵔⴰ]].
==ⵉⵍⵉⵍⵉⵜⵏ==
==ⵉⵎⵜⵜⴰⵏⵏ==
==ⵥⵕ ⵓⴳⴳⴰⵔ==
==ⵉⵙⴰⵖⵓⵍⵏ==
{{ⵉⵙⴰⵖⵓⵍⵏ}}
{{ⴰⴱⴰⴹ ⵓⵏⵜⵉⵎ}}
{{ⴰⵙⵎⵉⵍ|ⴰⴽⵓⴷ|ⴰⵙⴰⴽⵓⴷ|ⵉⴱⵔⵉⵔ|ⵓⵙⵙⴰⵏ ⵏ ⵓⵙⴳⴳⵯⴰⵙ}}
7aumep70o2daehnhda2ab0sav6bn5qf
27 ⵉⴱⵔⵉⵔ
0
2809
175769
157303
2026-04-26T09:24:50Z
ABDELATIF ANADJAR
14
/* ⵜⵉⵎⵙⴰⵔⵉⵏ */
175769
wikitext
text/x-wiki
{{ⴰⵎⵏⵏⵉ ⵡⴰⵔ ⵉⵙⴰⵖⵓⵍⵏ}}
{{ⴰⵎⵓⴷ}}
{|class="infobox" style="width: 10em; border: 1px solid #CDDC39; border-spacing: 4px; background-color: #FCFFDA; color: black; margin: 0.5em [[0]] 0.5em 1em; padding: 0.5em; clear: right; font-size: 100%; line-height: 1.5em; text-align: left;"
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''27 ⵉⴱⵔⵉⵔ'''
|-
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''April 27''' ([[ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵏⴳⵍⵉⵣⵜ|ⵜⴰⵏⴳⵍⵉⵣⵜ]])
|-
|align="center" colspan="7"|[[ⴰⴼⴰⵢⵍⵓ:27-ⵉⴱⵔⵉⵔ.ZGH.png|thumb|280px|center|]]
|-
|align="center" colspan="7"|
|-
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''27 [[ⵉⴱⵔⵉⵔ]] ⴳ [[ⴰⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ|ⵓⵙⵎⵍⵓⵙⵙⴰⵏ]] (2023)'''
|-
|align="center" colspan="7"|
|-
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⵏⴰⵙ|ⴰⵙⵉⵏ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⴽⵔⴰⵙ|ⴰⴽⵔ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⴽⵡⴰⵙ|ⴰⴽⵡ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⵎⵡⴰⵙ|ⴰⵙⵉⵎ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⴹⵢⴰⵙ|ⴰⵙⵉⴹ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⴰⵎⴰⵙ|ⴰⵙⴰⵎ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵢⵏⴰⵙ|ⴰⵢⵏ]]
|-
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[1 ⵉⴱⵔⵉⵔ|1]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[2 ⵉⴱⵔⵉⵔ|2]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[3 ⵉⴱⵔⵉⵔ|3]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[4 ⵉⴱⵔⵉⵔ|4]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[5 ⵉⴱⵔⵉⵔ|5]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[6 ⵉⴱⵔⵉⵔ|6]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[7 ⵉⴱⵔⵉⵔ|7]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[8 ⵉⴱⵔⵉⵔ|8]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[9 ⵉⴱⵔⵉⵔ|9]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[10 ⵉⴱⵔⵉⵔ|10]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[11 ⵉⴱⵔⵉⵔ|11]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[12 ⵉⴱⵔⵉⵔ|12]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[13 ⵉⴱⵔⵉⵔ|13]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[14 ⵉⴱⵔⵉⵔ|14]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[15 ⵉⴱⵔⵉⵔ|15]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[16 ⵉⴱⵔⵉⵔ|16]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[17 ⵉⴱⵔⵉⵔ|17]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[18 ⵉⴱⵔⵉⵔ|18]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[19 ⵉⴱⵔⵉⵔ|19]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[20 ⵉⴱⵔⵉⵔ|20]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[21 ⵉⴱⵔⵉⵔ|21]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[22 ⵉⴱⵔⵉⵔ|22]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[23 ⵉⴱⵔⵉⵔ|23]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[24 ⵉⴱⵔⵉⵔ|24]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[25 ⵉⴱⵔⵉⵔ|25]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[26 ⵉⴱⵔⵉⵔ|26]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | ([[27 ⵉⴱⵔⵉⵔ|27]])
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[28 ⵉⴱⵔⵉⵔ|28]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[29 ⵉⴱⵔⵉⵔ|29]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[30 ⵉⴱⵔⵉⵔ|30]]
| style="border: 1px solid #CDDC39;" |
|-
|-style="background: #white;"
|align="center" colspan="7"|'''[[26 ⵉⴱⵔⵉⵔ|← 26 ⵉⴱⵔⵉⵔ]]''' [[File:Weather icon - full moon.svg|25px]] '''[[28 ⵉⴱⵔⵉⵔ|28 ⵉⴱⵔⵉⵔ →]]'''
|-
|}
'''27 ⵉⴱⵔⵉⵔ''' (ⵙ [[ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵏⴳⵍⵉⵣⵜ|ⵜⵏⴳⵍⵉⵣⵜ]]: ''April 27'') ⵉⴳⴰ [[ⴰⵙⵙ]] ⵡⵉⵙⵙ "[[27|ⵓⴳⵏⴰⵔ ⴷ ⵙⴰ]]" ⴳ ⵡⴰⵢⵢⵓⵔ ⵡⵉⵙⵙ ⴽⴽⵓⵥ ([[ⵉⴱⵔⵉⵔ]]) ⴳ [[ⴰⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ|ⵓⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ]], ⴷ ⴰⵔ ⴰⵙ ⵜⵜⵖⴰⵎⴰ 248 ⵏ [[ⵡⴰⵙⵙ]] ⵢ ⵜⴳⵉⵔⴰ ⵏ ⵓⵙⴳⴳⵯⴰⵙ.
==ⵜⵉⵎⵙⴰⵔⵉⵏ==
*[[711]]: ⴰⵣⵓⴳⵣ ⵏ '''[[ⵟⴰⵔⵉⵇ ⴱⵏⵓ ⵣⵉⵢⵢⴰⴷ]]''' ⴷ ⵓⵙⵔⴷⴰⵙ ⵏⵏⵙ ⴳ ⵉⴱⵔⵉⵢⵉⵏ ⴷ ⵓⵙⵏⵜⵉ ⵏ ⵜⴼⵔⴽⵉⵡⵜ ⵏ [[ⵉⵏⴷⵍⴰⵙ]].
*[[1999]]: ⴰⵙⴱⴷⴷⵉ ⵏ ⵓⵏⴱⴰⴹ ⵏ '''ⵢⴰⵎⵉⵏ ⵣⵔⵡⴰⵍ''' ⴰⵏⵙⵙⵉⵅⴼ ⵏ ⵜⵎⵓⵔⵜ ⵏ '''[[ⴷⵣⴰⵢⵔ]]''' ⴰⴽⵓⴷ ⴰⵏⵏ.
==ⵉⵍⵉⵍⵉⵜⵏ==
==ⵉⵎⵜⵜⴰⵏⵏ==
==ⵥⵕ ⵓⴳⴳⴰⵔ==
==ⵉⵙⴰⵖⵓⵍⵏ==
{{ⵉⵙⴰⵖⵓⵍⵏ}}
{{ⴰⴱⴰⴹ ⵓⵏⵜⵉⵎ}}
{{ⴰⵙⵎⵉⵍ|ⴰⴽⵓⴷ|ⴰⵙⴰⴽⵓⴷ|ⵉⴱⵔⵉⵔ|ⵓⵙⵙⴰⵏ ⵏ ⵓⵙⴳⴳⵯⴰⵙ}}
dvg639qp3mc9g4wcs03ce7ayzu6ta95
30 ⵉⴱⵔⵉⵔ
0
2812
175772
157466
2026-04-26T09:39:33Z
ABDELATIF ANADJAR
14
/* ⵜⵉⵎⵙⴰⵔⵉⵏ */
175772
wikitext
text/x-wiki
{{ⴰⵎⵏⵏⵉ ⵡⴰⵔ ⵉⵙⴰⵖⵓⵍⵏ}}
{{ⴰⵎⵓⴷ}}
{|class="infobox" style="width: 10em; border: 1px solid #CDDC39; border-spacing: 4px; background-color: #FCFFDA; color: black; margin: 0.5em [[0]] 0.5em 1em; padding: 0.5em; clear: right; font-size: 100%; line-height: 1.5em; text-align: left;"
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''30 ⵉⴱⵔⵉⵔ'''
|-
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''April 30''' ([[ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵏⴳⵍⵉⵣⵜ|ⵜⴰⵏⴳⵍⵉⵣⵜ]])
|-
|align="center" colspan="7"|[[ⴰⴼⴰⵢⵍⵓ:30-ⵉⴱⵔⵉⵔ.ZGH.png|thumb|280px|center|]]
|-
|align="center" colspan="7"|
|-
|-style="background: #CDDC39;"
|align="center" colspan="7"|'''30 [[ⵉⴱⵔⵉⵔ]] ⴳ [[ⴰⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ|ⵓⵙⵎⵍⵓⵙⵙⴰⵏ]] (2023)'''
|-
|align="center" colspan="7"|
|-
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⵏⴰⵙ|ⴰⵙⵉⵏ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⴽⵔⴰⵙ|ⴰⴽⵔ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⴽⵡⴰⵙ|ⴰⴽⵡ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⵎⵡⴰⵙ|ⴰⵙⵉⵎ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⵉⴹⵢⴰⵙ|ⴰⵙⵉⴹ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵙⴰⵎⴰⵙ|ⴰⵙⴰⵎ]]
! style="border: 1px solid #CDDC39;" | [[ⴰⵢⵏⴰⵙ|ⴰⵢⵏ]]
|-
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39;" |
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[1 ⵉⴱⵔⵉⵔ|1]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[2 ⵉⴱⵔⵉⵔ|2]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[3 ⵉⴱⵔⵉⵔ|3]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[4 ⵉⴱⵔⵉⵔ|4]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[5 ⵉⴱⵔⵉⵔ|5]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[6 ⵉⴱⵔⵉⵔ|6]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[7 ⵉⴱⵔⵉⵔ|7]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[8 ⵉⴱⵔⵉⵔ|8]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[9 ⵉⴱⵔⵉⵔ|9]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[10 ⵉⴱⵔⵉⵔ|10]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[11 ⵉⴱⵔⵉⵔ|11]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[12 ⵉⴱⵔⵉⵔ|12]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[13 ⵉⴱⵔⵉⵔ|13]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[14 ⵉⴱⵔⵉⵔ|14]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[15 ⵉⴱⵔⵉⵔ|15]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[16 ⵉⴱⵔⵉⵔ|16]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[17 ⵉⴱⵔⵉⵔ|17]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[18 ⵉⴱⵔⵉⵔ|18]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[19 ⵉⴱⵔⵉⵔ|19]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[20 ⵉⴱⵔⵉⵔ|20]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[21 ⵉⴱⵔⵉⵔ|21]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[22 ⵉⴱⵔⵉⵔ|22]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[23 ⵉⴱⵔⵉⵔ|23]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[24 ⵉⴱⵔⵉⵔ|24]]
|-
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[25 ⵉⴱⵔⵉⵔ|25]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[26 ⵉⴱⵔⵉⵔ|26]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[27 ⵉⴱⵔⵉⵔ|27]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[28 ⵉⴱⵔⵉⵔ|28]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | [[29 ⵉⴱⵔⵉⵔ|29]]
| style="border: 1px solid #CDDC39; background-color:#FFFFEE;" | ([[30 ⵉⴱⵔⵉⵔ|30]])
| style="border: 1px solid #CDDC39;" |
|-
|-style="background: #white;"
|align="center" colspan="7"|'''[[29 ⵉⴱⵔⵉⵔ|← 29 ⵉⴱⵔⵉⵔ]]''' [[File:Weather icon - full moon.svg|25px]] '''[[1 ⵢⵓⵏⵢⵓ|1 ⵢⵓⵏⵢⵓ →]]'''
|-
|}
'''30 ⵉⴱⵔⵉⵔ''' (ⵙ [[ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵏⴳⵍⵉⵣⵜ|ⵜⵏⴳⵍⵉⵣⵜ]]: ''April 30'') ⵉⴳⴰ [[ⴰⵙⵙ]] ⴰⵎⴳⴳⴰⵔⵓ (ⵡⵉⵙⵙ "[[30|ⴽⵕⴰⵎⵔⴰⵡ]]") ⴳ ⵡⴰⵢⵢⵓⵔ ⵡⵉⵙⵙ ⴽⴽⵓⵥ ([[ⵉⴱⵔⵉⵔ]]) ⴳ [[ⴰⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ|ⵓⵙⵎⵍⵓⵙⵙⴰⵏ ⴰⴳⵔⵉⴳⵓⵔ]], ⴷ ⴰⵔ ⴰⵙ ⵜⵜⵖⴰⵎⴰ 245 ⵏ [[ⵡⴰⵙⵙ]] ⵢ ⵜⴳⵉⵔⴰ ⵏ ⵓⵙⴳⴳⵯⴰⵙ.
==ⵜⵉⵎⵙⴰⵔⵉⵏ==
*[[1789]]: ⵉⵖⵔⴰ '''ⵊⵓⵔⵊ ⵡⴰⵛⵉⵏⵟⵓⵏ''' ⵜⴰⴳⴰⵍⵍⵉⵜ ⵜⴰⴷⵓⵙⵜⵓⵔⵜ ⴰⵎ ⴰⵎⵣⵡⴰⵔⵓ ⵏ ⵉⵙⵍⵡⴰⵢⵏ ⵏ ⵉⵡⵓⵏⴰⴽ ⵎⵓⵏⵏⵉⵏ ⵉⵎⵉⵔⵉⴽⴰⵏⵉⵢⵏ ⴳ ⵏⵢⵓ ⵢⵓⵔⴽ, ⵉⵙⵔⵙ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ ⵜⴰⴷⵓⵙⵜⵓⵔⵜ ⴳ ⵓⵎⵣⵔⵓⵢ ⵏ ⵜⵎⵓⵔⵜ.
* 1975 - ⴰⵡⴹⵓ ⵏ ⵙⴰⵢⵖⵓⵏ ⴷ ⵜⵎⴷⵔⵓⵙⵜ ⵏ ⵉⵎⵏⵖⵉ ⵏ '''ⴱⵉⵜⵏⴰⵎ''', ⵜⵟⵟⴼ ⵉⴽⴰⴱⴰⵔⵏ ⵏ ⴱⵉⵜⵏⴰⵎ ⵏ ⵉⵣⴳⴳⴰⵔ ⵙⴰⵢⵖⵓⵏ, ⵜⴰⵎⴰⵣⵉⵔⵜ ⵜⴰⵎⴻⵇⵇⵔⴰⵏⵜ ⵏ ⵡⵉⵜⵏⴰⵎ ⵏ ⵉⴼⴼⵓⵙ, ⵉⵔⵏⴰ ⵉⵎⵏⵖⵉ ⵏ ⵡⵉⵜⵏⴰⵎ ⵉⵣⵔⵉⵏ ⵉⵙⴳⴳⵯⴰⵙⵏ. ⵢⵓⵍⵢ ⵓⵏⵛⵛⴰⵔ ⵏ ⵡⵉⵜⵏⴰⵎ ⵏ ⵉⵣⴳⴳⴰⵔ ⵅⴼ ⵜⴳⵎⵎⵉ ⵜⴰⵎⵇⵇⵔⴰⵏⵜ, ⵜⵜⵓⵙⵎⵖⵔ ⵜⵎⴷⵉⵏⵜ ⵙ "ⵀⵓ ⵜⵛⵉ ⵎⵉⵏⵀ".
* 1945 - ⵜⵉⵎⵏⵖⵉⵡⵜ ⵏ '''[[ⴰⴷⵓⵍⴼ ⵀⵉⵜⵍⵔ]]''' ⴷ ⵉⴼⴰ ⴱⵔⴰⵡⵏ, ⵍⵍⵉⵖ ⵇⵔⵔⴱⵏⵜ ⵉⴽⴰⴱⴰⵔⵏ ⵜⵉⵙⵓⴼⵢⴰⵜⵉⵏ ⵉ ⴱⵔⵍⵉⵏ, ⵉⵏⵖ ⴰⴷⵓⵍⴼ ⵀⵉⵜⵍⵔ ⴷ ⵜⵎⵖⴰⵔⵜ ⵏⵏⵙ '''ⵉⴼⴰ ⴱⵔⴰⵡⵏ''' ⵉⵅⴼ ⵏⵏⵙⵏ ⴳ ⵜⴰⴷⴷⴰⵔⵜ ⵏⵙⵏ. ⵢⵓⵎⵥ ⴽⴰⵔⵍ ⴷⵓⵏⵉⵜⵣ ⵜⴰⵎⴰⵙⴰⵢⵜ ⵏ ⵜⵎⵓⵔⵜ, ⵍⵍⵉⵖ ⵢⵓⵖⴰⵍ ⵊⵓⵣⵉⴼ ⴳⵓⴱⵍⵣ ⴷ ⴰⵎⴰⵡⴰⵢ, ⵎⴰⵛⴰ ⵢⵓⴹⴰ ⵕⴰⵢⵅ ⵡⵉⵙⵙ ⴽⵕⴰⴹ ⵙ ⵓⵎⴰⵜⴰ ⵖⵔ ⵉⵎⵉⴽ ⵏ ⵡⵓⵙⵙⴰⵏ.
* 1993: '''ⴰⵎⵍⴰⵖ ⵏ ⵓⴱⴰⵟⵍ ⵏ ⵉⵙⴰⵖⵓⵍⵏ ⵏ ⵓⵣⴳⴰⵔ ⴰⵎⴰⴹⵍⴰⵏ''' ⵜⵎⵍⴰ ⵜⵎⵔⵙⵍⵜ CERN ⵎⴰⵙ ⵉⵙⴰⵖⵓⵍⵏ ⵏ ⵓⵣⴳⴰⵔ ⴰⵎⴰⴹⵍⴰⵏ (World Wide Web) ⴰⴷ ⵇⵇⵉⵎⵏ ⴱⴰⵟⵍ ⴷ ⵍⵍⵓⵥⵏ ⵉ ⵓⵖⴱⴰⵍⵓ, ⵉⵎⵍⴰ ⴰⴱⵔⵉⴷ ⵉ ⵓⵙⵎⵖⵔ ⵏ ⵉⵏⵜⵔⵏⵉⵜ ⴰⵎ ⵎⴰⵎⵎⵛ ⵜ ⵏⵙⵙⵏ ⴰⵙⵙⴰ.
*[[2012]]: ⴰⵎⵉⵔⵉ ⵜⴰⴱⵕⵍⴰⵎⴰⵏⵉⵜ '''[[ⴼⴰⵟⵉⵎⴰ ⵜⴰⴱⴰⵄⵎⵕⴰⵏⵜ]]''' ⵜⵣⵔⵉ ⴰⵙⵇⵙⵉ ⴰⵎⵣⵡⴰⵔⵓ ⵙ ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵎⴰⵣⵉⵖⵜ ⴳ ⵓⵎⵣⵔⵓⵢ ⵏ [[ⴰⴱⵕⵍⴰⵎⴰⵏ ⴰⵎⵖⵔⵉⴱⵉ|ⵓⴱⵕⵍⴰⵎⴰⵏ ⴰⵎⵖⵔⵉⴱⵉ]].
*[[2012]]: ⴰⵙⵙⵏⵜⵉ ⵏ ⵉⴱⴷⴷⵉⵜⵏ ⴳ ⵓⵙⵙⵎⵔ ⵎⴳⴰⵍ ⴰⵏⵅⵅⴰⵍ ⴷ ⵉⵙⵙⵓⵔⵙⵏ ⵜⵉⴷⵎⵙⴰⵏⵉⵏ ⵏⵏⴰ ⵜⴷⵔⵜ ⵜⵎⵏⴰⴹⵜ ⵏ ⵓⵙⵙⴰⵎⵔ ⵙⵍⴰⵡⵏ ⴰⴽⴽⵯ [[ⵜⵉⵏⵖⵉⵔ]] ⴷ [[ⵜⴰⵣⴰⴳⵓⵔⵜ]].
==ⵉⵍⵉⵍⵉⵜⵏ==
==ⵉⵎⵜⵜⴰⵏⵏ==
==ⵥⵕ ⵓⴳⴳⴰⵔ==
==ⵉⵙⴰⵖⵓⵍⵏ==
{{ⵉⵙⴰⵖⵓⵍⵏ}}
{{ⴰⴱⴰⴹ ⵓⵏⵜⵉⵎ}}
{{ⴰⵙⵎⵉⵍ|ⴰⴽⵓⴷ|ⴰⵙⴰⴽⵓⴷ|ⵉⴱⵔⵉⵔ|ⵓⵙⵙⴰⵏ ⵏ ⵓⵙⴳⴳⵯⴰⵙ}}
p294aec5vv25tjks4nl7rthe690gf29
Module:Params
828
5490
175760
173857
2026-04-25T16:31:09Z
Grufo
1753
Upstream updates
175760
Scribunto
text/plain
require[[strict]]
--- ---
--- LOCAL ENVIRONMENT ---
--- ________________________________ ---
--- ---
--[[ Abstract utilities ]]--
----------------------------
-- Helper function for `string.gsub()` (for managing zero-padded numbers)
local function zero_padded (str)
return ('%03d%s'):format(#str, str)
end
-- Helper function for `table.sort()` (for natural sorting)
local function natural_sort (var1, var2)
return var1:gsub('%d+', zero_padded) < var2:gsub('%d+', zero_padded)
end
-- Parse a parameter name string and return it as a string or a number
local function get_parameter_name (par_str)
local ret = par_str:match'^%s*(.-)%s*$'
if ret ~= '0' and ret:find'^%-?[1-9]%d*$' == nil then return ret end
return tonumber(ret)
end
-- Return a copy or a reference to a table
local function copy_or_ref_table (src, refonly)
if refonly then return src end
local newtab = {}
for key, val in pairs(src) do newtab[key] = val end
return newtab
end
-- Remove some numeric elements from a table, shifting everything to the left
local function remove_numeric_keys (tbl, idx, len)
local cache, tmp = {}, idx + len - 1
for key, val in pairs(tbl) do
if type(key) == 'number' and key >= idx then
if key > tmp then cache[key - len] = val end
tbl[key] = nil
end
end
for key, val in pairs(cache) do tbl[key] = val end
end
-- Make a reduced copy of a table (shifting in both directions if necessary)
local function copy_table_reduced (tbl, idx, len)
local ret, tmp = {}, idx + len - 1
if idx > 0 then
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key < idx then
ret[key] = val
elseif key > tmp then ret[key - len] = val end
end
elseif tmp > 0 then
local nshift = 1 - idx
for key, val in pairs(tbl) do
if type(key) ~= 'number' then ret[key] = val
elseif key > tmp then ret[key - tmp] = val
elseif key < idx then ret[key + nshift] = val end
end
else
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key > tmp then
ret[key] = val
elseif key < idx then ret[key + len] = val end
end
end
return ret
end
-- Make an expanded copy of a table (shifting in both directions if necessary)
local function copy_table_expanded (tbl, idx, len)
local ret, tmp = {}, idx + len - 1
if idx > 0 then
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key < idx then
ret[key] = val
else ret[key + len] = val end
end
elseif tmp > 0 then
local nshift = idx - 1
for key, val in pairs(tbl) do
if type(key) ~= 'number' then ret[key] = val
elseif key > 0 then ret[key + tmp] = val
elseif key < 1 then ret[key + nshift] = val end
end
else
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key > tmp then
ret[key] = val
else ret[key - len] = val end
end
end
return ret
end
-- Move a key from a table to another, but only if under a different name and
-- always parsing numeric strings as numbers
local function steal_if_renamed (val, src, skey, dest, dkey)
local realkey = get_parameter_name(dkey)
if skey ~= realkey then
dest[realkey] = val
src[skey] = nil
end
end
-- Given a table, create two new tables containing the sorted list of keys
local function get_key_list_sorted (tbl, sort_fn)
local nums, words, nn, nw = {}, {}, 0, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
nn = nn + 1
nums[nn] = key
else
nw = nw + 1
words[nw] = key
end
end
table.sort(nums)
table.sort(words, sort_fn)
return nums, words, nn, nw
end
--[[ Public strings ]]--
------------------------
-- Special match keywords (functions and modifiers MUST avoid these names)
local mkeywords = {
['or'] = 0,
pattern = 1,
plain = 2,
strict = 3
}
-- Sort functions (functions and modifiers MUST avoid these names)
local sortfunctions = {
alphabetically = false,
naturally = natural_sort
}
-- Callback styles for the `mapping_*` and `renaming_*` class of modifiers
-- (functions and modifiers MUST avoid these names)
--[[
Meanings of the columns:
col[1] = Loop type (0-3)
col[2] = Number of module arguments that the style requires (1-3)
col[3] = Minimum number of sequential parameters passed to the callback
col[4] = Name of the callback parameter where to place each parameter name
col[5] = Name of the callback parameter where to place each parameter value
col[6] = Argument in the modifier's invocation that will override `col[4]`
col[7] = Argument in the modifier's invocation that will override `col[5]`
A value of `-1` indicates that no meaningful value is stored (i.e. `nil`)
]]--
local mapping_styles = {
names_and_values = { 3, 2, 2, 1, 2, -1, -1 },
values_and_names = { 3, 2, 2, 2, 1, -1, -1 },
values_only = { 1, 2, 1, -1, 1, -1, -1 },
names_only = { 2, 2, 1, 1, -1, -1, -1 },
names_and_values_as = { 3, 4, 0, -1, -1, 2, 3 },
names_only_as = { 2, 3, 0, -1, -1, 2, -1 },
values_only_as = { 1, 3, 0, -1, -1, -1, 2 },
blindly = { 0, 2, 0, -1, -1, -1, -1 }
}
-- Memory slots (functions and modifiers MUST avoid these names)
local memoryslots = {
h = 'header',
f = 'footer',
i = 'itersep',
l = 'lastsep',
n = 'ifngiven',
p = 'pairsep',
s = 'oxfordsep'
}
-- Possible trimming modes for the `parsing` modifier
local trim_parse_opts = {
trim_none = { false, false },
trim_positional = { false, true },
trim_named = { true, false },
trim_all = { true, true }
}
-- Possible string modes for the iteration separator in the `parsing` and
-- `reinterpreting` modifiers
local isep_parse_opts = {
splitter_pattern = false,
splitter_string = true
}
-- Possible string modes for the key-value separator in the `parsing` and
-- `reinterpreting` modifiers
local psep_parse_opts = {
setter_pattern = false,
setter_string = true
}
-- Possible position references for the `splicing` modifier
local position_references = {
add_nothing = 0,
add_smallest_number = 1,
add_last_of_sequence = 2,
add_largest_number = 3
}
-- Functions and modifiers MUST avoid these names too: `let`
--[[ Module's private environment ]]--
--------------------------------------
-- Hard-coded name of the module (to avoid going through `frame:getTitle()`)
local modulename = 'Module:Params'
-- The functions listed here declare that they don't need the `frame.args`
-- metatable to be copied into a regular table; if they are modifiers they also
-- guarantee that they will make their own (modified) copy available
local refpipe = {
call_for_each_group = true,
coins = true,
count = true,
evaluating = true,
for_each = true,
list = true,
list_values = true,
list_maybe_with_names = true,
value_of = true
}
-- The functions listed here declare that they don't need the
-- `frame:getParent().args` metatable to be copied into a regular table; if
-- they are modifiers they also guarantee that they will make their own
-- (modified) copy available
local refparams = {
call_for_each_group = true,
combining = true,
combining_by_calling = true,
combining_values = true,
concat_and_call = true,
concat_and_invoke = true,
concat_and_magic = true,
count = true,
grouping_by_calling = true,
mixing_names_and_values = true,
renaming_by_mixing = true,
renaming_to_sequence = true,
renaming_to_uppercase = true,
renaming_to_lowercase = true,
--renaming_to_values = true,
shifting = true,
splicing = true,
--swapping_names_and_values = true,
value_of = true,
with_name_matching = true
}
-- Maximum number of numeric parameters that can be filled, if missing (we
-- chose an arbitrary number for this constant; you can discuss about its
-- optimal value at Module talk:Params)
local maxfill = 1024
-- The private table of functions
local library = {}
-- Functions and modifiers that can only be invoked in first position
local static_iface = {}
-- Create a new context
local function context_new (child_frame)
local ctx = {}
ctx.frame = child_frame:getParent()
ctx.opipe = child_frame.args
ctx.oparams = ctx.frame.args
ctx.firstposonly = static_iface
ctx.iterfunc = pairs
ctx.sorttype = 0
ctx.n_parents = 0
ctx.n_children = 0
ctx.n_available = maxfill
return ctx
end
-- Move to the next action within the user-given list
local function context_iterate (ctx, n_forward)
local nextfn
if ctx.pipe[n_forward] ~= nil then
nextfn = ctx.pipe[n_forward]:match'^%s*(.*%S)'
end
if nextfn == nil then error(modulename ..
': You must specify a function to call', 0) end
if library[nextfn] == nil then
if ctx.firstposonly[nextfn] == nil then error(modulename ..
': The function ‘' .. nextfn .. '’ does not exist', 0)
else error(modulename .. ': The ‘' .. nextfn ..
'’ directive can only appear in first position', 0)
end
end
remove_numeric_keys(ctx.pipe, 1, n_forward)
return library[nextfn]
end
-- Main loop
local function main_loop (ctx, start_with)
local fn = start_with
repeat fn = fn(ctx) until not fn
if ctx.n_parents > 0 then error(modulename ..
': One or more ‘merging_substack’ directives are missing', 0) end
if ctx.n_children > 0 then error(modulename ..
', For some of the snapshots either the ‘flushing’ directive is missing or a group has not been properly closed with ‘merging_substack’', 0) end
end
-- Load a `setting`-like directive string into the `dest` table
local function set_strings (dest, opts, start_from)
local cmd
if opts[start_from] == nil then return start_from - 1 end
cmd = opts[start_from]:gsub('%s+', ''):gsub('/+', '/')
:match'^/*(.*[^/])'
if cmd == nil then return start_from end
local amap, sep, argc = {}, string.byte('/'), start_from + 1
local vname
local chr
for idx = 1, #cmd do
chr = cmd:byte(idx)
if chr == sep then
for key, val in ipairs(amap) do
dest[val] = opts[argc]
amap[key] = nil
end
argc = argc + 1
else
vname = memoryslots[string.char(chr)]
if vname == nil then error(modulename ..
', ‘setting’: Unknown slot ‘' ..
string.char(chr) .. '’', 0) end
table.insert(amap, vname)
end
end
for key, val in ipairs(amap) do dest[val] = opts[argc] end
return argc
end
-- Add a new stack of parameters to `ctx.children`
local function push_cloned_stack (ctx, tbl)
local newparams = {}
local currsnap = ctx.n_children + 1
if ctx.children == nil then ctx.children = { newparams }
else ctx.children[currsnap] = newparams end
for key, val in pairs(tbl) do newparams[key] = val end
ctx.n_children = currsnap
end
-- Parse a raw argument containing a `sortfunctions` directive, or
-- `'without_sorting'`, or `nil`
local function load_sort_opt (raw_arg)
if raw_arg == nil then return nil, 1, false end
local tmp = raw_arg:match'^%s*(.-)%s*$'
if tmp == 'without_sorting' then return nil, 2, false end
tmp = sortfunctions[tmp]
if tmp == nil then return nil, 1, false end
return tmp or nil, 2, true
end
-- Parse optional user arguments of type `...|[let]|[...][number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]`
local function load_child_opts (src, start_from, append_after)
local tbl, pin = {}, start_from
local names
if src[pin] ~= nil and src[pin]:match'^%s*let%s*$' and
src[pin + 1] ~= nil and src[pin + 2] ~= nil
then
names = {}
repeat
names[get_parameter_name(src[pin + 1])] = src[pin + 2]
pin = pin + 3
until src[pin] == nil or not src[pin]:match'^%s*let%s*$' or
src[pin + 1] == nil or src[pin + 2] == nil
end
local tmp = tonumber(src[pin])
if tmp ~= nil and math.floor(tmp) == tmp then
if tmp < 0 then tmp = -1 end
local shf = append_after - pin
for idx = pin + 1, pin + tmp do tbl[idx + shf] = src[idx] end
pin = pin + tmp + 1
end
if names ~= nil then
for key, val in pairs(names) do tbl[key] = val end
end
return tbl, pin
end
-- Load the optional arguments of some of the `mapping_*` and `renaming_*`
-- class of modifiers
local function load_callback_opts (src, n_skip, default_style)
local style
local shf
local tmp = src[n_skip + 1]
if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end
if style == nil then style, shf = default_style, n_skip - 1
else shf = n_skip end
local n_exist, karg, varg = style[3], style[4], style[5]
tmp = style[6]
if tmp > -1 then
karg = src[tmp + shf]:match'^%s*(.-)%s*$'
if karg == '0' or karg:find'^%-?[1-9]%d*$' ~= nil then
karg = tonumber(karg)
n_exist = math.max(n_exist, karg)
end
end
tmp = style[7]
if tmp > -1 then
varg = src[tmp + shf]:match'^%s*(.-)%s*$'
if varg == '0' or varg:find'^%-?[1-9]%d*$' ~= nil then
varg = tonumber(varg)
n_exist = math.max(n_exist, varg)
end
end
local dest, nargs = load_child_opts(src, style[2] + shf, n_exist)
tmp = style[1]
if (tmp == 3 or tmp == 2) and dest[karg] ~= nil then
tmp = tmp - 2 end
if (tmp == 3 or tmp == 1) and dest[varg] ~= nil then
tmp = tmp - 1 end
return dest, nargs, tmp, karg, varg
end
-- Parse the arguments of some of the `mapping_*` and `renaming_*` class of
-- modifiers
local function load_replace_args (opts, whoami)
if opts[1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No pattern string was given', 0) end
if opts[2] == nil then error(modulename ..
', ‘' .. whoami .. '’: No replacement string was given', 0) end
local ptn, repl, nmax, argc = opts[1], opts[2], tonumber(opts[3]), 3
if nmax ~= nil or (opts[3] or ''):match'^%s*$' ~= nil then argc = 4 end
local flg = opts[argc]
if flg ~= nil then flg = mkeywords[flg:match'^%s*(.-)%s*$'] end
if flg == 0 then flg = nil elseif flg ~= nil then argc = argc + 1 end
return ptn, repl, nmax, flg, argc, (nmax ~= nil and nmax < 1) or
(flg == 3 and ptn == repl)
end
-- Parse the arguments of the `with_*_matching` class of modifiers
local function load_pattern_args (opts, whoami)
local ptns, state, nptns, cnt = {}, 0, 0, 1
local keyw
for _, val in ipairs(opts) do
if state == 0 then
nptns, state = nptns + 1, -1
ptns[nptns] = { val, false, false }
else
keyw = val:match'^%s*(.*%S)'
if keyw == nil or mkeywords[keyw] == nil or (
state > 0 and mkeywords[keyw] > 0
) then break
else
state = mkeywords[keyw]
if state > 1 then ptns[nptns][2] = true end
if state == 3 then ptns[nptns][3] = true end
end
end
cnt = cnt + 1
end
if state == 0 then error(modulename .. ', ‘' .. whoami ..
'’: No pattern was given', 0) end
return ptns, nptns, cnt
end
-- Load the optional arguments of the `parsing` and `reinterpreting` modifiers
local function load_parse_opts (opts, start_from, isp, psp)
local tmp
local optslots, noptslots, argc = { true, true, true }, 3, start_from
local trimn, trimu, iplain, pplain = true, false, true, true
repeat
noptslots, tmp = noptslots - 1, opts[argc]
if tmp == nil then break end
tmp = tmp:match'^%s*(.-)%s*$'
if optslots[1] ~= nil and trim_parse_opts[tmp] ~= nil then
tmp = trim_parse_opts[tmp]
trimn, trimu = tmp[1], tmp[2]
optslots[1] = nil
elseif optslots[2] ~= nil and isep_parse_opts[tmp] ~= nil then
argc = argc + 1
iplain, isp = isep_parse_opts[tmp], opts[argc]
optslots[2] = nil
elseif optslots[3] ~= nil and psep_parse_opts[tmp] ~= nil then
argc = argc + 1
pplain, psp = psep_parse_opts[tmp], opts[argc]
optslots[3] = nil
else break end
argc = argc + 1
until noptslots < 1
return isp, iplain, psp, pplain, trimn, trimu, argc
end
-- Map parameters' values using a custom callback and a referenced table
local value_maps = {
[0] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do tbl[key] = fn() end
end,
[1] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[varg] = val
tbl[key] = fn()
end
end,
[2] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do
margs[karg] = key
tbl[key] = fn()
end
end,
[3] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[karg] = key
margs[varg] = val
tbl[key] = fn()
end
end
}
-- Private table for `map_names()`
local name_thieves = {
[0] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[1] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[varg] = val
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[2] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg] = key
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[3] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg] = key
rargs[varg] = val
steal_if_renamed(val, tbl, key, cache, fn())
end
end
}
-- Map parameters' names using a custom callback and a referenced table
local function map_names (tbl, rargs, karg, varg, looptype, fn)
local cache = {}
name_thieves[looptype](cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(cache) do tbl[key] = val end
end
-- Return a new table that contains `src` regrouped according to the numeric
-- suffixes in its keys
local function make_groups (src)
-- NOTE: `src` might be the original metatable!
local prefix
local gid
local groups = {}
for key, val in pairs(src) do
-- `key` must only be a string or a number...
if type(key) == 'string' then
prefix, gid = key:match'^%s*(.-)%s*(%-?%d*)%s*$'
gid = tonumber(gid) or ''
else
prefix = ''
gid = key
end
if groups[gid] == nil then groups[gid] = {} end
if prefix == '0' or prefix:find'^%-?[1-9]%d*$' ~= nil then
prefix = tonumber(prefix)
if prefix < 1 then prefix = prefix - 1 end
end
groups[gid][prefix] = val
end
return groups
end
-- Split into parts a string containing the `$#` and `$@` placeholders and
-- return the information as a skeleton table, a canvas table and a length
local function parse_placeholder_string (target)
local skel = {}
local canvas = {}
local idx = 1
local s_pos = 1
local e_pos = string.find(target, '%$[@#]', 1, false)
while e_pos ~= nil do
canvas[idx] = target:sub(s_pos, e_pos - 1)
skel[idx + 1] = target:sub(e_pos, e_pos + 1) == '$@'
idx = idx + 2
s_pos = e_pos + 2
e_pos = string.find(target, '%$[@#]', s_pos, false)
end
if (s_pos > target:len()) then idx = idx - 1
else canvas[idx] = target:sub(s_pos) end
return skel, canvas, idx
end
-- Populate a table by parsing a parameter string
local function parse_parameter_string (tbl, str, isp, ipl, psp, ppl, trn, tru)
local key
local val
local spos1
local spos2
local pos1
local pos2
local pos3 = 0
local idx = 1
local lenplone = #str + 1
if isp == nil or isp == '' then
if psp == nil or psp == '' then
if tru then tbl[idx] = str:match'^%s*(.-)%s*$'
else tbl[idx] = str end
return idx
end
spos1, spos2 = str:find(psp, 1, ppl)
if spos1 == nil then
key = idx
if tru then val = str:match'^%s*(.-)%s*$'
else val = str end
idx = idx + 1
else
key = get_parameter_name(str:sub(1, spos1 - 1))
val = str:sub(spos2 + 1)
if trn then val = val:match'^%s*(.-)%s*$' end
end
tbl[key] = val
return idx
end
if psp == nil or psp == '' then
repeat
pos1 = pos3 + 1
pos2, pos3 = str:find(isp, pos1, ipl)
val = str:sub(pos1, (pos2 or lenplone) - 1)
if tru then val = val:match'^%s*(.-)%s*$' end
tbl[idx] = val
idx = idx + 1
until pos2 == nil
return idx
end
repeat
pos1 = pos3 + 1
pos2, pos3 = str:find(isp, pos1, ipl)
val = str:sub(pos1, (pos2 or lenplone) - 1)
spos1, spos2 = val:find(psp, 1, ppl)
if spos1 == nil then
key = idx
if tru then val = val:match'^%s*(.-)%s*$' end
idx = idx + 1
else
key = get_parameter_name(val:sub(1, spos1 - 1))
val = val:sub(spos2 + 1)
if trn then val = val:match'^%s*(.-)%s*$' end
end
tbl[key] = val
until pos2 == nil
return idx
end
-- Heavy lifting for `combining` and `combining_values`
local function combine_parameters (ctx, keyval_fn, whoami)
-- NOTE: `ctx.params` might be the original metatable! This function
-- MUST create a copy of it before returning
local opts = ctx.pipe
if ctx.pipe[1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No parameter name was provided', 0) end
local tbl = ctx.params
local vars = {}
local sortfn, tmp, do_sort = load_sort_opt(opts[2])
local argc = set_strings(vars, opts, tmp + 1)
if argc < tmp then error(modulename ..
', ‘' .. whoami .. '’: No setting directive was given', 0) end
tmp = true
for _ in pairs(tbl) do
tmp = false
break
end
if tmp then
if vars.ifngiven ~= nil then
ctx.params = {
[get_parameter_name(ctx.pipe[1])] = vars.ifngiven
}
elseif tbl == ctx.oparams then ctx.params = {} end
return argc
end
local cache
local len
if do_sort then
local words
cache, words, len, tmp = get_key_list_sorted(tbl, sortfn)
for idx = 1, tmp do cache[len + idx] = words[idx] end
len = len + tmp
else
cache = {}
len = 0
for key in pairs(tbl) do
len = len + 1
cache[len] = key
end
end
local pmap, nss, kvs, pps = {}, 0, vars.pairsep or '', vars.itersep or ''
for idx = 1, len do
tmp = cache[idx]
pmap[nss + 1] = pps
pmap[nss + 2] = keyval_fn(tmp, tbl[tmp], kvs)
nss = nss + 2
end
tmp = vars.oxfordsep or vars.lastsep
if tmp ~= nil and nss > 4 then pmap[nss - 1] = tmp
elseif nss > 2 and vars.lastsep ~= nil then
pmap[nss - 1] = vars.lastsep
end
pmap[1] = vars.header or ''
if vars.footer ~= nil then pmap[nss + 1] = vars.footer end
ctx.params = { [get_parameter_name(ctx.pipe[1])] = table.concat(pmap) }
return argc
end
-- Concatenate the numeric keys from the table of parameters to the numeric
-- keys from the table of options; non-numeric keys from the table of options
-- will prevail over colliding non-numeric keys from the table of parameters
local function concat_params (ctx)
local retval, tbl, nmax = {}, ctx.params, table.maxn(ctx.pipe)
if ctx.subset == 1 then
-- We need only the sequence
for key, val in ipairs(tbl) do retval[key + nmax] = val end
else
if ctx.subset == -1 then
for key in ipairs(tbl) do tbl[key] = nil end
end
for key, val in pairs(tbl) do
if type(key) == 'number' and key > 0 then
retval[key + nmax] = val
else retval[key] = val end
end
end
for key, val in pairs(ctx.pipe) do retval[key] = val end
return retval
end
-- Flush the parameters by calling a custom function for each value (after this
-- function has been invoked `ctx.params` will be no longer usable)
local function flush_params (ctx, fn)
local tbl = ctx.params
if ctx.subset == 1 then
for key, val in ipairs(tbl) do fn(key, val) end
return
end
if ctx.subset == -1 then
for key, val in ipairs(tbl) do tbl[key] = nil end
end
if ctx.sorttype > 0 then
local nums, words, nn, nw = get_key_list_sorted(tbl, natural_sort)
if ctx.sorttype == 2 then
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
return
end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
return
end
if ctx.subset ~= -1 then
for key, val in ipairs(tbl) do
fn(key, val)
tbl[key] = nil
end
end
for key, val in pairs(tbl) do fn(key, val) end
end
-- Flush the parameters by calling one of two custom functions for each value
-- (after this function has been invoked `ctx.params` will be no longer usable)
local function mixed_flush_params (ctx, fn_seq, fn_oth)
if ctx.subset == 1 then
for key, val in ipairs(ctx.params) do fn_seq(key, val) end
return
end
if ctx.subset == -1 then
flush_params(ctx, fn_oth)
return
end
local tbl = ctx.params
if ctx.sorttype > 0 then
local nums, words, nn, nw = get_key_list_sorted(tbl, natural_sort)
local sequence = {}
for key, val in ipairs(tbl) do sequence[key] = val end
if ctx.sorttype == 2 then
for idx = 1, nw do fn_oth(words[idx], tbl[words[idx]]) end
end
for idx = 1, nn do
if sequence[nums[idx]] then
fn_seq(nums[idx], sequence[nums[idx]])
else
fn_oth(nums[idx], tbl[nums[idx]])
end
end
if ctx.sorttype ~= 2 then
for idx = 1, nw do fn_oth(words[idx], tbl[words[idx]]) end
end
return
end
for key, val in ipairs(tbl) do
fn_seq(key, val)
tbl[key] = nil
end
for key, val in pairs(tbl) do fn_oth(key, val) end
end
-- Finalize and return a concatenated list
local function finalize_and_return_concatenated_list (ctx, lst, len, modsize)
if len > 0 then
local tmp = ctx.oxfordsep or ctx.lastsep
if tmp ~= nil and len > modsize * 2 then
lst[len - modsize + 1] = tmp
elseif len > modsize and ctx.lastsep ~= nil then
lst[len - modsize + 1] = ctx.lastsep
end
lst[1] = ctx.header or ''
if ctx.footer ~= nil then lst[len + 1] = ctx.footer end
ctx.text = table.concat(lst)
else ctx.text = ctx.ifngiven or '' end
end
--[[ Modifiers ]]--
-----------------------------
-- Syntax: #invoke:params|sequential|pipe to
library.sequential = function (ctx)
if ctx.subset == -1 then error(modulename ..
': The two directives ‘non-sequential’ and ‘sequential’ are in contradiction with each other', 0) end
if ctx.sorttype > 0 then error(modulename ..
': The ‘all_sorted’ and ‘reassorted’ directives are redundant when followed by ‘sequential’', 0) end
ctx.iterfunc = ipairs
ctx.subset = 1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|non-sequential|pipe to
library['non-sequential'] = function (ctx)
if ctx.subset == 1 then error(modulename ..
': The two directives ‘sequential’ and ‘non-sequential’ are in contradiction with each other', 0) end
ctx.iterfunc = pairs
ctx.subset = -1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|all_sorted|pipe to
library.all_sorted = function (ctx)
if ctx.subset == 1 then error(modulename ..
': The ‘all_sorted’ directive is redundant after ‘sequential’', 0) end
if ctx.sorttype == 2 then error(modulename ..
': The two directives ‘reassorted’ and ‘sequential’ are in contradiction with each other', 0) end
ctx.sorttype = 1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|reassorted|pipe to
library.reassorted = function (ctx)
if ctx.subset == 1 then error(modulename ..
': The ‘reassorted’ directive is redundant after ‘sequential’', 0) end
if ctx.sorttype == 1 then error(modulename ..
': The two directives ‘sequential’ and ‘reassorted’ are in contradiction with each other', 0) end
ctx.sorttype = 2
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|setting|directives|...|pipe to
library.setting = function (ctx)
local argc = set_strings(ctx, ctx.pipe, 1)
if argc < 2 then error(modulename ..
', ‘setting’: No directive was given', 0) end
return context_iterate(ctx, argc + 1)
end
-- Syntax: #invoke:params|scoring|new parameter name|pipe to
--[[
library.scoring = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘scoring’: No parameter name was provided', 0) end
local retval = 0
for _ in pairs(ctx.params) do retval = retval + 1 end
ctx.params[ctx.pipe[1]:match'^%s*(.-)%s*$'] = tostring(retval)
return context_iterate(ctx, 2)
end
]]--
-- Syntax: #invoke:params|squeezing|pipe to
library.squeezing = function (ctx)
local store, indices, tbl, newlen = {}, {}, ctx.params, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
newlen = newlen + 1
indices[newlen] = key
store[key] = val
tbl[key] = nil
end
end
table.sort(indices)
for idx = 1, newlen do tbl[idx] = store[indices[idx]] end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|filling_the_gaps|pipe to
library.filling_the_gaps = function (ctx)
local tbl, tmp, nmin, nmax, nnums = ctx.params, {}, 1, nil, -1
for key, val in pairs(tbl) do
if type(key) == 'number' then
if nmax == nil then
if key < nmin then nmin = key end
nmax = key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
nnums = nnums + 1
tmp[key] = val
end
end
if nmax ~= nil and nmax - nmin > nnums then
ctx.n_available = ctx.n_available + nmin + nnums - nmax
if ctx.n_available < 0 then error(modulename ..
', ‘filling_the_gaps’: It is possible to fill at most ' ..
tostring(maxfill) .. ' parameters', 0) end
for idx = nmin, nmax, 1 do tbl[idx] = '' end
for key, val in pairs(tmp) do tbl[key] = val end
end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|clearing|pipe to
library.clearing = function (ctx)
local tbl = ctx.params
local numerics = {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = nil
end
end
for key, val in ipairs(numerics) do tbl[key] = val end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|cutting|left cut|right cut|pipe to
library.cutting = function (ctx)
local lcut = tonumber(ctx.pipe[1])
if lcut == nil or math.floor(lcut) ~= lcut then error(modulename ..
', ‘cutting’: Left cut must be an integer number', 0) end
local rcut = tonumber(ctx.pipe[2])
if rcut == nil or math.floor(rcut) ~= rcut then error(modulename ..
', ‘cutting’: Right cut must be an integer number', 0) end
local tbl = ctx.params
local len = #tbl
if lcut < 0 then lcut = len + lcut end
if rcut < 0 then rcut = len + rcut end
local tot = lcut + rcut
if tot > 0 then
local cache = {}
if tot >= len then
for key in ipairs(tbl) do tbl[key] = nil end
tot = len
else
for idx = len - rcut + 1, len, 1 do tbl[idx] = nil end
for idx = 1, lcut, 1 do tbl[idx] = nil end
end
for key, val in pairs(tbl) do
if type(key) == 'number' and key > 0 then
if key > len then cache[key - tot] = val
else cache[key - lcut] = val end
tbl[key] = nil
end
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|cropping|left crop|right crop|pipe to
library.cropping = function (ctx)
local lcut = tonumber(ctx.pipe[1])
if lcut == nil or math.floor(lcut) ~= lcut then error(modulename ..
', ‘cropping’: Left crop must be an integer number', 0) end
local rcut = tonumber(ctx.pipe[2])
if rcut == nil or math.floor(rcut) ~= rcut then error(modulename ..
', ‘cropping’: Right crop must be an integer number', 0) end
local tbl = ctx.params
local nmin
local nmax
for key in pairs(tbl) do
if type(key) == 'number' then
if nmin == nil then nmin, nmax = key, key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
end
end
if nmin ~= nil then
local len = nmax - nmin + 1
if lcut < 0 then lcut = len + lcut end
if rcut < 0 then rcut = len + rcut end
if lcut + rcut - len > -1 then
for key in pairs(tbl) do
if type(key) == 'number' then tbl[key] = nil end
end
elseif lcut + rcut > 0 then
for idx = nmax - rcut + 1, nmax do tbl[idx] = nil end
for idx = nmin, nmin + lcut - 1 do tbl[idx] = nil end
local lshift = nmin + lcut - 1
if lshift > 0 then
for idx = lshift + 1, nmax, 1 do
tbl[idx - lshift] = tbl[idx]
tbl[idx] = nil
end
end
end
end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|purging|start offset|length|pipe to
library.purging = function (ctx)
local idx = tonumber(ctx.pipe[1])
if idx == nil or math.floor(idx) ~= idx then error(modulename ..
', ‘purging’: Start offset must be an integer number', 0) end
local len = tonumber(ctx.pipe[2])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘purging’: Length must be an integer number', 0) end
local tbl = ctx.params
if len < 1 then
len = len + table.maxn(tbl)
if idx > len then return context_iterate(ctx, 3) end
len = len - idx + 1
end
ctx.params = copy_table_reduced(tbl, idx, len)
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|backpurging|start offset|length|pipe to
library.backpurging = function (ctx)
local last = tonumber(ctx.pipe[1])
if last == nil or math.floor(last) ~= last then error(modulename ..
', ‘backpurging’: Start offset must be an integer number', 0) end
local len = tonumber(ctx.pipe[2])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘backpurging’: Length must be an integer number', 0) end
local idx
local tbl = ctx.params
if len > 0 then
idx = last - len + 1
else
for key in pairs(tbl) do
if type(key) == 'number' and (idx == nil or
key < idx) then idx = key end
end
if idx == nil then return context_iterate(ctx, 3) end
idx = idx - len
if last < idx then return context_iterate(ctx, 3) end
len = last - idx + 1
end
ctx.params = copy_table_reduced(ctx.params, idx, len)
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|shifting|addend|pipe to
library.shifting = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local nshift = tonumber(ctx.pipe[1])
if nshift == nil or nshift == 0 or math.floor(nshift) ~= nshift then
error(modulename .. ', ‘shifting’: A non-zero integer number must be provided', 0) end
local tbl = {}
for key, val in pairs(ctx.params) do
if type(key) == 'number' then tbl[key + nshift] = val
else tbl[key] = val end
end
ctx.params = tbl
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|reversing_numeric_names|pipe to
library.reversing_numeric_names = function (ctx)
local tbl, numerics, nmax = ctx.params, {}, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = nil
if key > nmax then nmax = key end
end
end
for key, val in pairs(numerics) do tbl[nmax - key + 1] = val end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|pivoting_numeric_names|pipe to
--[[
library.pivoting_numeric_names = function (ctx)
local tbl = ctx.params
local shift = #tbl + 1
if shift < 2 then return library.reversing_numeric_names(ctx) end
local numerics = {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = nil
end
end
for key, val in pairs(numerics) do tbl[shift - key] = val end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|mirroring_numeric_names|pipe to
--[[
library.mirroring_numeric_names = function (ctx)
local tbl, numerics = ctx.params, {}
local nmax
local nmin
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = nil
if nmax == nil then nmin, nmax = key, key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
end
end
for key, val in pairs(numerics) do tbl[nmax + nmin - key] = val end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|swapping_numeric_names|pipe to
--[[
library.swapping_numeric_names = function (ctx)
local tbl, cache, nsize = ctx.params, {}, 0
local tmp
for key in pairs(tbl) do
if type(key) == 'number' then
nsize = nsize + 1
cache[nsize] = key
end
end
table.sort(cache)
for idx = math.floor(nsize / 2), 1, -1 do
tmp = tbl[cache[idx] ]
tbl[cache[idx] ] = tbl[cache[nsize - idx + 1] ]
tbl[cache[nsize - idx + 1] ] = tmp
end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|sorting_sequential_values|[criterion]|pipe to
library.sorting_sequential_values = function (ctx)
local sortfn
if ctx.pipe[1] ~= nil then
sortfn = sortfunctions[ctx.pipe[1]:match'^%s*(.-)%s*$']
end
if sortfn then table.sort(ctx.params, sortfn)
else table.sort(ctx.params) end -- i.e. either `false` or `nil`
if sortfn == nil then return context_iterate(ctx, 1) end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|splicing|[add to position]|position|increment|
-- [number of elements to write]|...|pipe to
library.splicing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, tbl = ctx.pipe, ctx.params
local tmp1 = opts[1]
local tmp2
local argc
local pos
local refp
if tmp1 ~= nil then
tmp2 = tonumber(tmp1)
if tmp2 == nil or math.floor(tmp2) ~= tmp2 then
pos, argc, tmp2 = tonumber(opts[2]), 4,
tmp1:match'^%s*(.*%S)'
if tmp2 ~= nil then
refp = position_references[tmp2]
if refp == nil then error(modulename ..
', ‘splicing’: ‘' .. tostring(tmp2) ..
'’ is not a valid first argument', 0) end
else refp = 0 end
else pos, argc, refp = tmp2, 3, 0 end
else pos, argc, refp = tonumber(opts[2]), 4, 0 end
if pos == nil or math.floor(pos) ~= pos then error(modulename ..
', ‘splicing’: The position must be an integer number', 0) end
local len = tonumber(opts[argc - 1])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘splicing’: The increment must be an integer number', 0) end
if refp == 2 then
for _ in ipairs(tbl) do pos = pos + 1 end
refp = 0
end
tmp1, tmp2 = nil, nil
if refp ~= 0 or len ~= 0 then
for key, val in pairs(tbl) do
if type(key) == 'number' then
if tmp1 == nil then tmp1, tmp2 = key, key
elseif key < tmp1 then tmp1 = key
elseif key > tmp2 then tmp2 = key end
end
end
end
if tmp2 == nil then len = 0
elseif refp == 3 then pos = pos + tmp2
elseif refp == 1 then pos = pos + tmp1 end
if len > 0 and pos + len > tmp1 and pos <= tmp2 then
tbl = copy_table_expanded(tbl, pos, len)
elseif len < 0 and pos - len > tmp1 and pos <= tmp2 then
tbl = copy_table_reduced(tbl, pos, -len)
else tbl = copy_or_ref_table(tbl, tbl ~= ctx.oparams) end
ctx.params = tbl
tmp1 = tonumber(opts[argc])
if len == 0 and (tmp1 == nil or tmp1 < 1) then error(modulename ..
', ‘splicing’: When the increment is zero the number of elements to add cannot be zero', 0) end
if tmp1 == nil or tmp1 < 0 or math.floor(tmp1) ~= tmp1 then
return context_iterate(ctx, argc)
end
tmp2 = argc - pos + 1
for key = pos, pos + tmp1 - 1 do tbl[key] = opts[key + tmp2] end
return context_iterate(ctx, argc + tmp1 + 1)
end
-- Syntax: #invoke:params|imposing|name|value|pipe to
library.imposing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘imposing’: Missing parameter name to impose', 0) end
ctx.params[get_parameter_name(ctx.pipe[1])] = ctx.pipe[2]
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|providing|name|value|pipe to
library.providing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘providing’: Missing parameter name to provide', 0) end
local key = get_parameter_name(ctx.pipe[1])
if ctx.params[key] == nil then ctx.params[key] = ctx.pipe[2] end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|discarding|name|[how many]|pipe to
library.discarding = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘discarding’: Missing parameter name to discard', 0) end
local len = tonumber(ctx.pipe[2])
if len == nil then
ctx.params[get_parameter_name(ctx.pipe[1])] = nil
return context_iterate(ctx, 2)
end
local key = tonumber(ctx.pipe[1])
if key == nil or math.floor(key) ~= key then error(modulename ..
', ‘discarding’: A range was provided, but the initial parameter name is not an integer number', 0) end
if len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘discarding’: A range can only be an integer number greater than zero', 0) end
for idx = key, key + len - 1 do ctx.params[idx] = nil end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|excluding_non-numeric_names|pipe to
library['excluding_non-numeric_names'] = function (ctx)
local tmp = ctx.params
for key, val in pairs(tmp) do
if type(key) ~= 'number' then tmp[key] = nil end
end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|excluding_numeric_names|pipe to
library.excluding_numeric_names = function (ctx)
local tmp = ctx.params
for key, val in pairs(tmp) do
if type(key) == 'number' then tmp[key] = nil end
end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|with_name_matching|target 1|[plain flag 1]|[or]
-- |[target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_name_matching = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_name_matching')
local tmp
local ptn
local tbl = ctx.params
local newparams = {}
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
tmp = ptn[1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tmp = tonumber(tmp)
end
newparams[tmp] = tbl[tmp]
else
for key, val in pairs(tbl) do
if tostring(key):find(ptn[1], 1, ptn[2]) then
newparams[key] = val
end
end
end
end
ctx.params = newparams
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_name_not_matching|target 1|[plain flag 1]
-- |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_name_not_matching = function (ctx)
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_name_not_matching')
local tbl = ctx.params
if nptns == 1 and targets[1][3] then
local tmp = targets[1][1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tbl[tonumber(tmp)] = nil
else tbl[tmp] = nil end
return context_iterate(ctx, argc)
end
local yesmatch
local ptn
for key in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if tostring(key) ~= ptn[1] then
yesmatch = false
break
end
elseif not tostring(key):find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_value_matching|target 1|[plain flag 1]|[or]
-- |[target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_value_matching = function (ctx)
local tbl = ctx.params
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_value_matching')
local nomatch
local ptn
for key, val in pairs(tbl) do
nomatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val == ptn[1] then
nomatch = false
break
end
elseif val:find(ptn[1], 1, ptn[2]) then
nomatch = false
break
end
end
if nomatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_value_not_matching|target 1|[plain flag 1]
-- |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_value_not_matching = function (ctx)
local tbl = ctx.params
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_value_not_matching')
local yesmatch
local ptn
for key, val in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val ~= ptn[1] then
yesmatch = false
break
end
elseif not val:find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|trimming_values|pipe to
library.trimming_values = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:match'^%s*(.-)%s*$' end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|mapping_to_lowercase|pipe to
library.mapping_to_lowercase = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:lower() end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|mapping_to_uppercase|pipe to
library.mapping_to_uppercase = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:upper() end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|mapping_by_calling|template name|[call
-- style]|[let]|[...][number of additional parameters]|[parameter
-- 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.mapping_by_calling = function (ctx)
local opts = ctx.pipe
local tname
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘mapping_by_calling’: No template name was provided', 0) end
local margs, argc, looptype, karg, varg = load_callback_opts(opts, 1,
mapping_styles.values_only)
local model = { title = tname, args = margs }
value_maps[looptype](ctx.params, margs, karg, varg, function ()
return ctx.frame:expandTemplate(model)
end)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_invoking|module name|function
-- name|[call style]|[let]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_invoking = function (ctx)
local opts = ctx.pipe
local mname
local fname
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘mapping_by_invoking’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘mapping_by_invoking’: No function name was provided', 0) end
local margs, argc, looptype, karg, varg = load_callback_opts(opts, 2,
mapping_styles.values_only)
local model = { title = 'Module:' .. mname, args = margs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
value_maps[looptype](ctx.params, margs, karg, varg, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_magic|parser function|[call
-- style]|[let]|[...][number of additional arguments]|[argument
-- 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_magic = function (ctx)
local opts = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘mapping_by_magic’: No parser function was provided', 0) end
local margs, argc, looptype, karg, varg = load_callback_opts(opts, 1,
mapping_styles.values_only)
value_maps[looptype](ctx.params, margs, karg, varg, function ()
return ctx.frame:callParserFunction(magic, margs)
end)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.mapping_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die =
load_replace_args(ctx.pipe, 'mapping_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if flg == 3 then
for key, val in pairs(tbl) do
if val == ptn then tbl[key] = repl end
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
for key, val in pairs(tbl) do
tbl[key] = val:gsub(ptn, repl, nmax)
end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_mixing|mixing string|pipe to
library.mapping_by_mixing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘mapping_by_mixing’: No mixing string was provided', 0) end
local mix = ctx.pipe[1]
local tbl = ctx.params
if mix == '$#' then
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, 2)
end
local skel, cnv, n_parts = parse_placeholder_string(mix)
for key, val in pairs(tbl) do
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val else cnv[idx] = tostring(key) end
end
tbl[key] = table.concat(cnv)
end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|mapping_to_names|pipe to
--[[
library.mapping_to_names = function (ctx)
local tbl = ctx.params
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|renaming_to_lowercase|pipe to
library.renaming_to_lowercase = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do
if type(key) == 'string' then cache[key:lower()] = val else
cache[key] = val end
end
ctx.params = cache
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|renaming_to_uppercase|pipe to
library.renaming_to_uppercase = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do
if type(key) == 'string' then cache[key:upper()] = val else
cache[key] = val end
end
ctx.params = cache
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|renaming_to_sequence|[sort order]|pipe to
library.renaming_to_sequence = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tbl = ctx.params
local sortfn, argc, do_sort = load_sort_opt(ctx.pipe[1])
local cache
local len
if do_sort then
local words
local wl
cache, words, len, wl = get_key_list_sorted(tbl, sortfn)
for idx = 1, len do cache[idx] = tbl[cache[idx]] end
for idx = 1, wl do cache[len + idx] = tbl[words[idx]] end
else
cache = {}
len = 0
for _, val in pairs(tbl) do
len = len + 1
cache[len] = val
end
end
ctx.params = cache
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_calling|template name|[call
-- style]|[let]|[...][number of additional parameters]|[parameter
-- 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.renaming_by_calling = function (ctx)
local opts = ctx.pipe
local tname
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘renaming_by_calling’: No template name was provided', 0) end
local rargs, argc, looptype, karg, varg = load_callback_opts(opts, 1,
mapping_styles.names_only)
local model = { title = tname, args = rargs }
map_names(ctx.params, rargs, karg, varg, looptype, function ()
return ctx.frame:expandTemplate(model)
end)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_invoking|module name|function
-- name|[call style]|[let]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.renaming_by_invoking = function (ctx)
local opts = ctx.pipe
local mname
local fname
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘renaming_by_invoking’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘renaming_by_invoking’: No function name was provided', 0) end
local rargs, argc, looptype, karg, varg = load_callback_opts(opts, 2,
mapping_styles.names_only)
local model = { title = 'Module:' .. mname, args = rargs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘renaming_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
map_names(ctx.params, rargs, karg, varg, looptype, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_magic|parser function|[call
-- style]|[let]|[...][number of additional arguments]|[argument
-- 1]|[argument 2]|[...]|[argument N]|pipe to
library.renaming_by_magic = function (ctx)
local opts = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘renaming_by_magic’: No parser function was provided', 0) end
local rargs, argc, looptype, karg, varg = load_callback_opts(opts, 1,
mapping_styles.names_only)
map_names(ctx.params, rargs, karg, varg, looptype, function ()
return ctx.frame:callParserFunction(magic, rargs)
end)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.renaming_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die =
load_replace_args(ctx.pipe, 'renaming_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if flg == 3 then
ptn = get_parameter_name(ptn)
local val = tbl[ptn]
if val ~= nil then
tbl[ptn] = nil
tbl[get_parameter_name(repl)] = val
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
local cache = {}
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache,
tostring(key):gsub(ptn, repl, nmax))
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_mixing|mixing string|pipe to
library.renaming_by_mixing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
if ctx.pipe[1] == nil then error(modulename ..
', ‘renaming_by_mixing’: No mixing string was provided', 0) end
local mix = ctx.pipe[1]:match'^%s*(.-)%s*$'
local cache = {}
local tmp
if mix == '$@' then
for _, val in pairs(ctx.params) do
cache[get_parameter_name(val)] = val
end
else
local skel, canvas, n_parts = parse_placeholder_string(mix)
for key, val in pairs(ctx.params) do
for idx = 2, n_parts, 2 do
if skel[idx] then canvas[idx] = val
else canvas[idx] = tostring(key) end
end
cache[get_parameter_name(table.concat(canvas))] = val
end
end
ctx.params = cache
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|renaming_to_values|pipe to
--[[
library.renaming_to_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for _, val in pairs(ctx.params) do cache[val] = val end
ctx.params = cache
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|grouping_by_calling|template
-- name|[let]|[...]|[number of additional arguments]|[argument
-- 1]|[argument 2]|[...]|[argument N]|pipe to
library.grouping_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts = ctx.pipe
local tmp
if opts[1] ~= nil then tmp = opts[1]:match'^%s*(.*%S)' end
if tmp == nil then error(modulename ..
', ‘grouping_by_calling’: No template name was provided', 0) end
local model = { title = tmp }
local tmp, argc = load_child_opts(opts, 2, 0)
local gargs = {}
for key, val in pairs(tmp) do
if type(key) == 'number' and key < 1 then gargs[key - 1] = val
else gargs[key] = val end
end
local groups = make_groups(ctx.params)
for gid, group in pairs(groups) do
for key, val in pairs(gargs) do group[key] = val end
group[0] = gid
model.args = group
groups[gid] = ctx.frame:expandTemplate(model)
end
ctx.params = groups
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|parsing|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.parsing = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘parsing’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '|', '=')
parse_parameter_string(ctx.params, opts[1], isep, iplain, psep, pplain,
trimnamed, trimunnamed)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|reinterpreting|parameter to reinterpret|[trim
-- flag]|[iteration delimiter setter]|[...]|[key-value delimiter
-- setter]|[...]|pipe to
library.reinterpreting = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘reinterpreting’: No parameter to reinterpret was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '|', '=')
local tbl, tmp = ctx.params, get_parameter_name(opts[1])
local str = tbl[tmp]
if str ~= nil then
tbl[tmp] = nil
parse_parameter_string(tbl, str, isep, iplain, psep, pplain,
trimnamed, trimunnamed)
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|evaluating|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.evaluating = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘evaluating’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '!', ':')
if opts[1]:match'^%s*(.*%S)' == nil then
ctx.pipe = copy_or_ref_table(opts, opts ~= ctx.opipe)
return context_iterate(ctx, argc)
end
local new_opts, cache = {}, {}
local shift = parse_parameter_string(cache, opts[1], isep, iplain,
psep, pplain, trimnamed, trimunnamed) - argc
for key, val in pairs(opts) do
if type(key) ~= 'number' or key < 1 then new_opts[key] = val
elseif key >= argc then new_opts[key + shift] = val end
end
for key, val in pairs(cache) do new_opts[key] = val end
ctx.pipe = new_opts
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|mixing_names_and_values|mixing string|pipe to
library.mixing_names_and_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
if ctx.pipe[1] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter names', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter values', 0) end
local cache = {}
local mix_k, mix_v = ctx.pipe[1]:match'^%s*(.-)%s*$', ctx.pipe[2]
local tmp
if mix_k == '$@' and mix_v == '$@' then
for _, val in pairs(ctx.params) do
cache[get_parameter_name(val)] = val
end
elseif mix_k == '$@' and mix_v == '$#' then
for key, val in pairs(ctx.params) do
cache[get_parameter_name(val)] = tostring(key)
end
elseif mix_k == '$#' and mix_v == '$#' then
for _, val in pairs(ctx.params) do cache[key] = tostring(key) end
else
local skel_k, cnv_k, n_parts_k = parse_placeholder_string(mix_k)
local skel_v, cnv_v, n_parts_v = parse_placeholder_string(mix_v)
for key, val in pairs(ctx.params) do
tmp = tostring(key)
for idx = 2, n_parts_k, 2 do
if skel_k[idx] then cnv_k[idx] = val else cnv_k[idx] = tmp end
end
for idx = 2, n_parts_v, 2 do
if skel_v[idx] then cnv_v[idx] = val else cnv_v[idx] = tmp end
end
cache[get_parameter_name(table.concat(cnv_k))] =
table.concat(cnv_v)
end
end
ctx.params = cache
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|swapping_names_and_values|pipe to
--[[
library.swapping_names_and_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do cache[val] = key end
ctx.params = cache
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|combining|new parameter name|[sort order]|setting
-- directives|...|pipe to
library.combining = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return key .. kvs .. val end,
'combining'
) + 1)
end
-- Syntax: #invoke:params|combining_values|new parameter name|[sort
-- order]|setting directives|...|pipe to
library.combining_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return val end,
'combining_values'
) + 1)
end
-- Syntax: #invoke:params|combining_by_calling|template name|new parameter
-- name|pipe to
library.combining_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tname = ctx.pipe[1]
if tname ~= nil then tname = tname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_calling’: No template name was provided', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘combining_by_calling’: No parameter name was provided', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[2])] = ctx.frame:expandTemplate{
title = tname,
args = ctx.params
}
}
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|combining_by_invoking|module name|function name|new
-- parameter name|pipe to
library.combining_by_invoking = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local mname = ctx.pipe[1]
if mname ~= nil then mname = mname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_invoking’: No module name was provided', 0) end
local fname = ctx.pipe[2]
if fname ~= nil then fname = fname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_invoking’: No function name was provided', 0) end
if ctx.pipe[3] == nil then error(modulename ..
', ‘combining_by_invoking’: No parameter name was provided', 0) end
local model = { title = 'Module:' .. mname, args = ctx.params }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[3])] =
tostring(mfunc(ctx.frame:newChild(model)))
}
return context_iterate(ctx, 4)
end
-- Syntax: #invoke:params|combining_by_magic|parser function|new parameter
-- name|pipe to
library.combining_by_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local magic = ctx.pipe[1]
if magic ~= nil then magic = magic:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_magic’: No parser function was provided', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘combining_by_magic’: No parameter name was provided', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[2])] =
ctx.frame:callParserFunction(magic, ctx.params)
}
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|snapshotting|pipe to
library.snapshotting = function (ctx)
push_cloned_stack(ctx, ctx.params)
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|remembering|pipe to
library.remembering = function (ctx)
push_cloned_stack(ctx, ctx.oparams)
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|entering_substack|[new]|pipe to
library.entering_substack = function (ctx)
local tbl = ctx.params
local ncurrparent = ctx.n_parents + 1
if ctx.parents == nil then ctx.parents = { tbl }
else ctx.parents[ncurrparent] = tbl end
ctx.n_parents = ncurrparent
if ctx.pipe[1] ~= nil and ctx.pipe[1]:match'^%s*new%s*$' then
ctx.params = {}
return context_iterate(ctx, 2)
end
local currsnap = ctx.n_children
if currsnap > 0 then
ctx.params = ctx.children[currsnap]
ctx.children[currsnap] = nil
ctx.n_children = currsnap - 1
else
local newparams = {}
for key, val in pairs(tbl) do newparams[key] = val end
ctx.params = newparams
end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|pulling|parameter name|pipe to
library.pulling = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘pulling’: No parameter to pull was provided', 0) end
local parent
local tmp = ctx.n_parents
if tmp < 1 then parent = ctx.oparams else parent = ctx.parents[tmp] end
tmp = get_parameter_name(opts[1])
if parent[tmp] ~= nil then ctx.params[tmp] = parent[tmp] end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|detaching_substack|pipe to
library.detaching_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘detaching_substack’: No substack has been created', 0) end
local parent = ctx.parents[ncurrparent]
for key in pairs(ctx.params) do parent[key] = nil end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|dropping_substack|pipe to
library.dropping_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘dropping_substack’: No substack has been created', 0) end
ctx.params = ctx.parents[ncurrparent]
ctx.parents[ncurrparent] = nil
ctx.n_parents = ncurrparent - 1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|leaving_substack|pipe to
library.leaving_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘leaving_substack’: No substack has been created', 0) end
local currsnap = ctx.n_children + 1
if ctx.children == nil then ctx.children = { ctx.params }
else ctx.children[currsnap] = ctx.params end
ctx.params = ctx.parents[ncurrparent]
ctx.parents[ncurrparent] = nil
ctx.n_parents = ncurrparent - 1
ctx.n_children = currsnap
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|merging_substack|pipe to
library.merging_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘merging_substack’: No substack has been created', 0) end
local parent = ctx.parents[ncurrparent]
local child = ctx.params
ctx.params = parent
ctx.parents[ncurrparent] = nil
ctx.n_parents = ncurrparent - 1
for key, val in pairs(child) do parent[key] = val end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|flushing|pipe to
library.flushing = function (ctx)
if ctx.n_children < 1 then error(modulename ..
', ‘flushing’: There are no substacks to flush', 0) end
local parent = ctx.params
local currsnap = ctx.n_children
for key, val in pairs(ctx.children[currsnap]) do parent[key] = val end
ctx.children[currsnap] = nil
ctx.n_children = currsnap - 1
return context_iterate(ctx, 1)
end
--[[ Functions ]]--
-----------------------------
-- Syntax: #invoke:params|count
library.count = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local retval = 0
for _ in ctx.iterfunc(ctx.params) do retval = retval + 1 end
if ctx.subset == -1 then retval = retval - #ctx.params end
ctx.text = retval
return false
end
-- Syntax: #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2]
-- |[...]|[item n]|[named item 1=value 1]|[...]|[named item n=value
-- n]|[...]
library.concat_and_call = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts = ctx.pipe
local tname
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘concat_and_call’: No template name was provided', 0) end
remove_numeric_keys(opts, 1, 1)
ctx.text = ctx.frame:expandTemplate{
title = tname,
args = concat_params(ctx)
}
return false
end
-- Syntax: #invoke:args|concat_and_invoke|module name|function name|[prepend
-- 1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named
-- item n=value n]|[...]
library.concat_and_invoke = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts = ctx.pipe
local mname
local fname
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘concat_and_invoke’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘concat_and_invoke’: No function name was provided', 0) end
remove_numeric_keys(opts, 1, 2)
local mfunc = require('Module:' .. mname)[fname]
if mfunc == nil then error(modulename ..
', ‘concat_and_invoke’: The function ‘' .. fname ..
'’ does not exist', 0) end
ctx.text = mfunc(ctx.frame:newChild{
title = 'Module:' .. mname,
args = concat_params(ctx)
})
return false
end
-- Syntax: #invoke:args|concat_and_magic|parser function|[prepend 1]|[prepend
-- 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n=
-- value n]|[...]
library.concat_and_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘concat_and_magic’: No parser function was provided', 0) end
remove_numeric_keys(opts, 1, 1)
ctx.text = ctx.frame:callParserFunction(magic, concat_params(ctx))
return false
end
-- Syntax: #invoke:params|value_of|parameter name
library.value_of = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘value_of’: No parameter name was provided', 0) end
local val
local key = opts[1]:match'^%s*(.-)%s*$'
if key == '0' or key:find'^%-?[1-9]%d*$' ~= nil then
key = tonumber(key)
val = ctx.params[key]
-- No worries: #ctx.params is unused if the modifier in first position
if val ~= nil and (
ctx.subset ~= -1 or key > #ctx.params or key < 1
) and (
ctx.subset ~= 1 or (key <= #ctx.params and key > 0)
) then
ctx.text = (ctx.header or '') .. val .. (ctx.footer or '')
else ctx.text = ctx.ifngiven or '' end
else
val = ctx.params[key]
if ctx.subset ~= 1 and val ~= nil then
ctx.text = (ctx.header or '') .. val .. (ctx.footer or '')
else ctx.text = ctx.ifngiven or '' end
end
return false
end
-- Syntax: #invoke:params|list
library.list = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or ''
flush_params(
ctx,
function (key, val)
ret[nss + 1] = pps
ret[nss + 2] = key
ret[nss + 3] = kvs
ret[nss + 4] = val
nss = nss + 4
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 4)
return false
end
-- Syntax: #invoke:params|list_values
library.list_values = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
-- NOTE: `library.coins()` and `library.unique_coins()` rely on us
local ret, nss, pps = {}, 0, ctx.itersep or ''
flush_params(
ctx,
function (key, val)
ret[nss + 1] = pps
ret[nss + 2] = val
nss = nss + 2
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|list_maybe_with_names
library.list_maybe_with_names = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or ''
mixed_flush_params(
ctx,
function (key, val)
ret[nss + 1] = pps
ret[nss + 2] = ''
ret[nss + 3] = ''
ret[nss + 4] = val
nss = nss + 4
end,
function (key, val)
ret[nss + 1] = pps
ret[nss + 2] = key
ret[nss + 3] = kvs
ret[nss + 4] = val
nss = nss + 4
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 4)
return false
end
-- Syntax: #invoke:params|coins|[first coin = value 1]|[second coin = value
-- 2]|[...]|[last coin = value N]
library.coins = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local opts, tbl = ctx.pipe, ctx.params
for key, val in pairs(tbl) do tbl[key] = opts[get_parameter_name(val)] end
return library.list_values(ctx)
end
-- Syntax: #invoke:params|unique_coins|[first coin = value 1]|[second coin =
-- value 2]|[...]|[last coin = value N]
library.unique_coins = function (ctx)
local opts, tbl = ctx.pipe, ctx.params
local tmp
for key, val in pairs(tbl) do
tmp = get_parameter_name(val)
tbl[key] = opts[tmp]
opts[tmp] = nil
end
return library.list_values(ctx)
end
-- Syntax: #invoke:params|for_each|wikitext
library.for_each = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local ret, nss, pps, txt = {}, 0, ctx.itersep or '', ctx.pipe[1] or ''
local skel, cnv, n_parts = parse_placeholder_string(txt)
flush_params(
ctx,
function (key, val)
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val
else cnv[idx] = tostring(key) end
end
ret[nss + 1] = pps
ret[nss + 2] = table.concat(cnv)
nss = nss + 2
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each|template name|[append 1]|[append 2]
-- |[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each = function (ctx)
local opts = ctx.pipe
local tname
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘call_for_each’: No template name was provided', 0) end
local model = { title = tname, args = opts }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
table.insert(opts, 1, true)
flush_params(
ctx,
function (key, val)
opts[1] = key
opts[2] = val
ret[nss + 1] = ccs
ret[nss + 2] = ctx.frame:expandTemplate(model)
nss = nss + 2
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each|module name|module function|[append
-- 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]
-- |[named param n=value n]|[...]
library.invoke_for_each = function (ctx)
local opts = ctx.pipe
local mname
local fname
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘invoke_for_each’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘invoke_for_each’: No function name was provided', 0) end
local model = { title = 'Module:' .. mname, args = opts }
local mfunc = require(model.title)[fname]
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(
ctx,
function (key, val)
opts[1] = key
opts[2] = val
ret[nss + 1] = ccs
ret[nss + 2] = mfunc(ctx.frame:newChild(model))
nss = nss + 2
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each|parser function|[append 1]|[append 2]
-- |[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.magic_for_each = function (ctx)
local opts = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘magic_for_each’: No parser function was provided', 0) end
local ret, nss, ccs = {}, 0, ctx.itersep or ''
table.insert(opts, 1, true)
flush_params(
ctx,
function (key, val)
opts[1] = key
opts[2] = val
ret[nss + 1] = ccs
ret[nss + 2] = ctx.frame:callParserFunction(magic, opts)
nss = nss + 2
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_value|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_value = function (ctx)
local opts = ctx.pipe
local tname
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘call_for_each_value’: No template name was provided', 0) end
local model = { title = tname, args = opts }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(
ctx,
function (key, val)
opts[1] = val
ret[nss + 1] = ccs
ret[nss + 2] = ctx.frame:expandTemplate(model)
nss = nss + 2
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each_value|module name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.invoke_for_each_value = function (ctx)
local opts = ctx.pipe
local mname
local fname
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘invoke_for_each_value’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘invoke_for_each_value’: No function name was provided', 0) end
local model = { title = 'Module:' .. mname, args = opts }
local mfunc = require(model.title)[fname]
local ret, nss, ccs = {}, 0, ctx.itersep or ''
remove_numeric_keys(opts, 1, 1)
flush_params(
ctx,
function (key, val)
opts[1] = val
ret[nss + 1] = ccs
ret[nss + 2] = mfunc(ctx.frame:newChild(model))
nss = nss + 2
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each_value|parser function|[append 1]
-- |[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named
-- param n=value n]|[...]
library.magic_for_each_value = function (ctx)
local opts = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘magic_for_each_value’: No parser function was provided', 0) end
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(
ctx,
function (key, val)
opts[1] = val
ret[nss + 1] = ccs
ret[nss + 2] = ctx.frame:callParserFunction(magic, opts)
nss = nss + 2
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_group|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_group = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local opts = ctx.pipe
local tmp
if opts[1] ~= nil then tmp = opts[1]:match'^%s*(.*%S)' end
if tmp == nil then error(modulename ..
', ‘call_for_each_group’: No template name was provided', 0) end
local model = { title = tmp }
local opts, ret, nss, ccs = {}, {}, 0, ctx.itersep or ''
for key, val in pairs(ctx.pipe) do
if type(key) == 'number' then opts[key - 1] = val
else opts[key] = val end
end
ctx.pipe = opts
ctx.params = make_groups(ctx.params)
flush_params(
ctx,
function (gid, group)
for key, val in pairs(opts) do group[key] = val end
group[0] = gid
model.args = group
ret[nss + 1] = ccs
ret[nss + 2] = ctx.frame:expandTemplate(model)
nss = nss + 2
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
--- ---
--- PUBLIC ENVIRONMENT ---
--- ________________________________ ---
--- ---
--[[ First-position-only modifiers ]]--
---------------------------------------
-- Syntax: #invoke:params|new|pipe to
static_iface.new = function (child_frame)
local ctx = context_new(child_frame)
ctx.pipe = copy_or_ref_table(ctx.opipe, false)
ctx.params = {}
main_loop(ctx, context_iterate(ctx, 1))
return ctx.text
end
--[[ First-position-only functions ]]--
---------------------------------------
-- Syntax: #invoke:params|self
static_iface.self = function (frame)
return frame:getParent():getTitle()
end
--[[ Public metatable of functions ]]--
---------------------------------------
return setmetatable({}, {
__index = function (_, query)
local fname = query:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
': You must specify a function to call', 0) end
local func = static_iface[fname]
if func ~= nil then return func end
func = library[fname]
if func == nil then error(modulename ..
': The function ‘' .. fname .. '’ does not exist', 0) end
return function (child_frame)
local ctx = context_new(child_frame)
ctx.pipe = copy_or_ref_table(ctx.opipe, refpipe[fname])
ctx.params = copy_or_ref_table(ctx.oparams, refparams[fname])
main_loop(ctx, func)
return ctx.text
end
end
})
0zh9yszcu1lo1rpmyh2ls1na8hemel4
ⵡⵉⴽⵉⴱⵉⴷⵢⴰ:ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/28 ⵉⴱⵔⵉⵔ
4
20348
175770
102157
2026-04-26T09:27:23Z
ABDELATIF ANADJAR
14
175770
wikitext
text/x-wiki
'''ⵉⴽⴽⴰ ⵜⵜ ⵉⵏⵏ ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ [[28 ⵉⴱⵔⵉⵔ]]:'''
*'''[[1945]]''' : ⴰⵙⵏⵖⵉ ⵏ ⵓⵎⵙⵙⵉⵡⵙ ⵏ ⵉⵟⴰⵍⵢⴰ '''ⴱⵉⵏⵉⵜⵓ ⵎⵓⵙⵓⵍⵉⵏⵉ''' ⵙⴳ ⵉⵎⵏⵖⵉ ⵉⵟⴰⵍⵢⴰⵏⵏ ⴷ ⵜⴰⵍⵍⵉⵜ ⵏⵏⵙ ⴽⵍⴰⵔⴰ ⴱⵉⵜⴰⵜⵛⵉ ⵜⴰⵎⴰ ⵏ ⵓⴳⵍⵎⴰⵎ ⵏ ⴽⵓⵎⵓ, ⵍⵍⵉⵖ ⵔⴰⵏ ⴰⴷ ⵔⵡⵍⵏ ⵖⵔ ⵙⵡⵉⵙⵔⴰ.
*'''[[1947]]''' : ⴰⵎⵙⴰⴼⵔ ⴰⵏⵔⵡⵉⵊⵉ '''ⵜⵓⵔ ⵀⴰⵢⵔⴷⴰⵍ''' ⵉⵙⵙⵏⵜⵉ ⴰⵎⵓⴷⴷⵓ ⵏⵏⵙ ⴰⵙⵏⴰⵎⵓⵔ ⵖⵉⴼ ⵜⴰⴼⵍⵓⴽⵜ "ⴽⵓⵏ ⵜⵉⴽⵉ" ⵙⴳ ⴱⵉⵔⵓ ⵖⵔ ⴱⵓⵍⵉⵏⵉⵣⵢⴰ, ⴱⴰⵛ ⴰⴷ ⵉⵙⵎⵍⵍ ⵎⴰⵙ ⵉⵎⵣⴷⴰⵖ ⵏ ⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⴱⵓⵍⵉⵏⵉⵣⵢⴰ ⵉⵣⵎⵔ ⴰⴷ ⴷ ⵓⵙⵉⵏ ⵙⴳ ⵜⴰⵎⵔⵉⴽⵜ ⵏ ⵓⵏⵥⵓⵍ.
*'''[[1952]]''' : ⴰⵙⵎⵔⵙ ⵏ ⵓⵎⵔⴰⵔⵓ ⵏ ⵙⴰⵏ ⴼⵔⴰⵏⵙⵉⵙⴽⵓ ⵉⴽⵛⵎ ⵖⵔ ⵜⴰⵙⵡⵓⵔⵉ, ⵉⵙⵙⵓⴼⵖ ⵙ ⵓⵎⴰⵜⴰ ⴰⴽⵛⵛⵓⵎ ⵏ ⵉⵎⵔⵉⴽⴰⵏ ⵉ [[ⵊⴰⴱⵓⵏ]] ⴷⴼⴼⵉⵔ ⵉⵎⵏⵖⵉ ⴰⵎⴰⴹⵍⴰⵏ ⵡⵉⵙⵙ ⵙⵉⵏ.
*'''[[1967]]''' : ⴰⵊⵉⵏⵉⵔⴰⵍ '''ⴷⵉⵖⵓⵍ''' ⵉⵏⵔⵓ ⵉⵣⵔⴼ ⵏ ⵓⵙⵓⵖⵍ ⴰⵙⵍⵡⴰⵢ ⵅⴼ ⴰⵙⵎⵔⵙ ⵏ ⵜⵣⵔⴼⵜ ⵏ ⵡⴰⵏⴰⴹ ⵉⵎⵙⵔⵙⵍⵏ ⴷⵉ ⴼⵕⴰⵏⵙⴰ.
*'''[[1996]]''' : ⵜⴰⵎⵏⵖⵉⵡⵜ ⵏ '''ⴱⵓⵔⵜ ⴰⵔⵜⵓⵔ''' ⴳ ⵜⴰⵙⵎⴰⵏⵉⴰ, ⵓⵙⵜⵔⴰⵍⵢⴰ, ⵎⴰⵏⵉ ⵉⵏⵖⴰ ⵢⴰⵏ ⵓⵎⵙⵍⵃ 35 ⵏ ⵎⵉⴷⴷⵏ ⵉⵥⵥⵓ 23 ⵡⵉⵢⴰⴹ, ⴰⵢⵏⵏⴰ ⵉⴷⴼⵄⵏ ⵓⵙⵜⵔⴰⵍⵢⴰ ⴰⴷ ⵜⵙⵏⴼⵍ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵙⵙⵉⵖ ⵏ ⵉⵎⴰⵙⵙⵏ ⵙ ⵜⵥⵓⵕⵉ.
[[ⴰⴼⴰⵢⵍⵓ:General Charles de Gaulle in 1945.jpg|'''ⵊⵉⵏⵉⵕⴰⵍ ⴷⵉⵖⵓⵍ'''|thumb|200px]]
*'''[[2001]]''' : ⴰⵎⵙⵎⵓⵏ ⴰⵎⵣⵡⴰⵔⵓ ⵏ ⵓⴹⴰⵢ, ⴰⵎⵔⵉⴽⴰⵏⵉ ⴷⵉⵏⵉⵙ ⵜⵉⵜⵓ, ⵉⴼⵜⵓ ⴳ ⵢⴰⵏ ⵓⵎⵓⴷⴷⵓ ⵖⵔ ⵜⵙⵀⵉⵍⵜ ⵏ ⵓⴹⴰⵢ ⵜⴰⵎⴰⴹⵍⴰⵏⵜ ⵖⵉⴼ ⵓⵙⵉⵏⵓ ⴰⵔⵓⵙⵉ.
60sp8c7y1pesr6vabk29fa7iivy28dg
ⵡⵉⴽⵉⴱⵉⴷⵢⴰ:ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/30 ⵉⴱⵔⵉⵔ
4
20367
175771
102207
2026-04-26T09:39:02Z
ABDELATIF ANADJAR
14
175771
wikitext
text/x-wiki
'''ⵉⴽⴽⴰ ⵜⵜ ⵉⵏⵏⵏⵏ ⴰⵎ ⵡⴰⵙⵙ [[30 ⵉⴱⵔⵉⵔ]]:'''
*[[1789]]: ⵉⵖⵔⴰ '''ⵊⵓⵔⵊ ⵡⴰⵛⵉⵏⵟⵓⵏ''' ⵜⴰⴳⴰⵍⵍⵉⵜ ⵜⴰⴷⵓⵙⵜⵓⵔⵜ ⴰⵎ ⴰⵎⵣⵡⴰⵔⵓ ⵏ ⵉⵙⵍⵡⴰⵢⵏ ⵏ ⵉⵡⵓⵏⴰⴽ ⵎⵓⵏⵏⵉⵏ ⵉⵎⵉⵔⵉⴽⴰⵏⵉⵢⵏ ⴳ ⵏⵢⵓ ⵢⵓⵔⴽ, ⵉⵙⵔⵙ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ ⵜⴰⴷⵓⵙⵜⵓⵔⵜ ⴳ ⵓⵎⵣⵔⵓⵢ ⵏ ⵜⵎⵓⵔⵜ.
* 1975 - ⴰⵡⴹⵓ ⵏ ⵙⴰⵢⵖⵓⵏ ⴷ ⵜⵎⴷⵔⵓⵙⵜ ⵏ ⵉⵎⵏⵖⵉ ⵏ '''ⴱⵉⵜⵏⴰⵎ''', ⵜⵟⵟⴼ ⵉⴽⴰⴱⴰⵔⵏ ⵏ ⴱⵉⵜⵏⴰⵎ ⵏ ⵉⵣⴳⴳⴰⵔ ⵙⴰⵢⵖⵓⵏ, ⵜⴰⵎⴰⵣⵉⵔⵜ ⵜⴰⵎⴻⵇⵇⵔⴰⵏⵜ ⵏ ⵡⵉⵜⵏⴰⵎ ⵏ ⵉⴼⴼⵓⵙ, ⵉⵔⵏⴰ ⵉⵎⵏⵖⵉ ⵏ ⵡⵉⵜⵏⴰⵎ ⵉⵣⵔⵉⵏ ⵉⵙⴳⴳⵯⴰⵙⵏ. ⵢⵓⵍⵢ ⵓⵏⵛⵛⴰⵔ ⵏ ⵡⵉⵜⵏⴰⵎ ⵏ ⵉⵣⴳⴳⴰⵔ ⵅⴼ ⵜⴳⵎⵎⵉ ⵜⴰⵎⵇⵇⵔⴰⵏⵜ, ⵜⵜⵓⵙⵎⵖⵔ ⵜⵎⴷⵉⵏⵜ ⵙ "ⵀⵓ ⵜⵛⵉ ⵎⵉⵏⵀ".
* 1945 - ⵜⵉⵎⵏⵖⵉⵡⵜ ⵏ '''[[ⴰⴷⵓⵍⴼ ⵀⵉⵜⵍⵔ]]''' ⴷ ⵉⴼⴰ ⴱⵔⴰⵡⵏ, ⵍⵍⵉⵖ ⵇⵔⵔⴱⵏⵜ ⵉⴽⴰⴱⴰⵔⵏ ⵜⵉⵙⵓⴼⵢⴰⵜⵉⵏ ⵉ ⴱⵔⵍⵉⵏ, ⵉⵏⵖ ⴰⴷⵓⵍⴼ ⵀⵉⵜⵍⵔ ⴷ ⵜⵎⵖⴰⵔⵜ ⵏⵏⵙ '''ⵉⴼⴰ ⴱⵔⴰⵡⵏ''' ⵉⵅⴼ ⵏⵏⵙⵏ ⴳ ⵜⴰⴷⴷⴰⵔⵜ ⵏⵙⵏ. ⵢⵓⵎⵥ ⴽⴰⵔⵍ ⴷⵓⵏⵉⵜⵣ ⵜⴰⵎⴰⵙⴰⵢⵜ ⵏ ⵜⵎⵓⵔⵜ, ⵍⵍⵉⵖ ⵢⵓⵖⴰⵍ ⵊⵓⵣⵉⴼ ⴳⵓⴱⵍⵣ ⴷ ⴰⵎⴰⵡⴰⵢ, ⵎⴰⵛⴰ ⵢⵓⴹⴰ ⵕⴰⵢⵅ ⵡⵉⵙⵙ ⴽⵕⴰⴹ ⵙ ⵓⵎⴰⵜⴰ ⵖⵔ ⵉⵎⵉⴽ ⵏ ⵡⵓⵙⵙⴰⵏ.
* 1993: '''ⴰⵎⵍⴰⵖ ⵏ ⵓⴱⴰⵟⵍ ⵏ ⵉⵙⴰⵖⵓⵍⵏ ⵏ ⵓⵣⴳⴰⵔ ⴰⵎⴰⴹⵍⴰⵏ''' ⵜⵎⵍⴰ ⵜⵎⵔⵙⵍⵜ CERN ⵎⴰⵙ ⵉⵙⴰⵖⵓⵍⵏ ⵏ ⵓⵣⴳⴰⵔ ⴰⵎⴰⴹⵍⴰⵏ (World Wide Web) ⴰⴷ ⵇⵇⵉⵎⵏ ⴱⴰⵟⵍ ⴷ ⵍⵍⵓⵥⵏ ⵉ ⵓⵖⴱⴰⵍⵓ, ⵉⵎⵍⴰ ⴰⴱⵔⵉⴷ ⵉ ⵓⵙⵎⵖⵔ ⵏ ⵉⵏⵜⵔⵏⵉⵜ ⴰⵎ ⵎⴰⵎⵎⵛ ⵜ ⵏⵙⵙⵏ ⴰⵙⵙⴰ.
*[[2012]]: ⴰⵎⵉⵔⵉ ⵜⴰⴱⵕⵍⴰⵎⴰⵏⵉⵜ '''[[ⴼⴰⵟⵉⵎⴰ ⵜⴰⴱⴰⵄⵎⵕⴰⵏⵜ]]''' ⵜⵣⵔⵉ ⴰⵙⵇⵙⵉ ⴰⵎⵣⵡⴰⵔⵓ ⵙ ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵎⴰⵣⵉⵖⵜ ⴳ ⵓⵎⵣⵔⵓⵢ ⵏ [[ⴰⴱⵕⵍⴰⵎⴰⵏ ⴰⵎⵖⵔⵉⴱⵉ|ⵓⴱⵕⵍⴰⵎⴰⵏ ⴰⵎⵖⵔⵉⴱⵉ]].
*[[2012]]: ⴰⵙⵙⵏⵜⵉ ⵏ ⵉⴱⴷⴷⵉⵜⵏ ⴳ ⵓⵙⵙⵎⵔ ⵎⴳⴰⵍ ⴰⵏⵅⵅⴰⵍ ⴷ ⵉⵙⵙⵓⵔⵙⵏ ⵜⵉⴷⵎⵙⴰⵏⵉⵏ ⵏⵏⴰ ⵜⴷⵔⵜ ⵜⵎⵏⴰⴹⵜ ⵏ ⵓⵙⵙⴰⵎⵔ ⵙⵍⴰⵡⵏ ⴰⴽⴽⵯ [[ⵜⵉⵏⵖⵉⵔ]] ⴷ [[ⵜⴰⵣⴰⴳⵓⵔⵜ]].
szwhtw7kquycbenhcsb7kimw97o41sc
ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Renamed user 7f087fbb89ddc81f16e4b43aaa9c6dff
3
29824
175759
114185
2026-04-25T13:29:59Z
AccountVanishRequests
2049
ⵉⵙⵎⵓⵜⵜⵉ AccountVanishRequests ⵜⴰⵙⵏⴰ [[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Джавахарлал]] ⵖⵔ [[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Renamed user 7f087fbb89ddc81f16e4b43aaa9c6dff]] ⵎⵉⵏ ⴰⴷ ⵉⴼⵍ redirect: Automatically moved page while renaming the user "[[Special:CentralAuth/Джавахарлал|Джавахарлал]]" to "[[Special:CentralAuth/Renamed user 7f087fbb89ddc81f16e4b43aaa9c6dff|Renamed user 7f087fbb89ddc81f16e4b43aaa9c6dff]]"
114185
wikitext
text/x-wiki
==ⴰⵙⴱⵔⵔⴽ ==
{{ⴰⵙⴱⵔⵔⴽ}}
--[[ⴰⵏⵙⵙⵎⵔⵙ:Amazigh Bot|Amazigh Bot]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Amazigh Bot|ⴰⵎⵙⴰⵡⴰⵍ]]) 08:12, 2 ⵖⵓⵛⵜ 2025 (+01)
b0i0isnisvnzyl8nellicss4a9es1x1
ⵡⵉⴽⵉⴱⵉⴷⵢⴰ:ⴰⵏⵎⵓⴳⴳⴰⵔ
4
43374
175761
175754
2026-04-25T21:53:22Z
ZacharyB
38
/* ⵜⵓⵜⵜⵔⴰ ⵏ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵎⵙⵙⵓⴳⵓⴳ (Adminship request) */ ⵔⴰⵔ
175761
wikitext
text/x-wiki
{{ⴰⵏⵎⵓⴳⴳⴰⵔ}}
{{ⴰⵍⴱⵓⴹ:ⵜⵉⴼⵉⵍⵜ ⵏ ⵓⵙⵡⵓⴷⴷⵓ}}
{{ⵏⴹⵓ |20px}}
<templatestyles src="Template:ⵜⴰⵙⵏⴰ/styles.css"/>
__TOC__
= 2026 =
== <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
</div>
22:02, 19 ⵉⵏⵏⴰⵢⵔ 2026 (+01)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== ⵜⵓⵜⵜⵔⴰ ⵏ ⵜⵎⵙⵙⵓⴳⵓⵔⵜ ==
ⴰⵣⵓⵍ ⵉⵎⴷⴷⵓⴽⴽⴰⵍ {{ⵉⵏⵙⵙⵎⵔⵙⵏ}}! ⴰⵔ ⵙⵙⵉⵜⵉⵎⵖ ⴰ ⵜⵉⵍⵉⵎ ⴰⴽⴽⵯ ⴳ ⵢⴰⵏ ⵡⴰⴷⴷⴰⴷ ⵉⵛⵏⴰⵏ, ⵉⴳⴰ ⵉⵢⵉ ⴰⴷⴷⵓⵔ ⴰⴷ ⵜⵜⵔⵖ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵎⵙⵙⵓⴳⵓⵔ. ⵉⴳ ⴰ ⵜⵜⴰⵏⵏⴰⵢⵎ ⵎⴰⵙ ⴷ ⵖⵉⵖ ⴰⴷ ⴼⴽⵖ ⵓⴳⴳⴰⵔ ⵉ ⵡⵉⴽⵉⴱⵉⴷⵢⴰ ⵜⴰⵎⴰⵣⵉⵖⵜ ⵉⴳ ⴳⵉⵖ ⴰⵎⵙⵙⵓⴳⵓⵔ ⴼⴽⴰⵜ ⵜⴰⵏⵏⴰⵢⵜ ⵏⵏⵓⵏ ⵙ ⵓⵙⵎⵔⵙ ⵏ {{ⴷⵉⴷⵙ}} ⵏⵖ {{ⵎⴳⴰⵍ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|Lhoussine AIT TAYFST]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|ⴰⵎⵙⴰⵡⴰⵍ]]) 21:06, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|Lhoussine AIT TAYFST]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|ⴰⵎⵙⴰⵡⴰⵍ]]) 21:06, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:04, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}}--[[ⴰⵏⵙⵙⵎⵔⵙ:Essaidib2|Essaidib2]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Essaidib2|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:50, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}}----[[ⴰⵏⵙⵙⵎⵔⵙ:ⵟⴰⵢⵢⵉⴱ ⵎⴰⵢⴰⵃ|ⵟⴰⵢⵢⵉⴱ ⵎⴰⵢⴰⵃ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⵟⴰⵢⵢⵉⴱ ⵎⴰⵢⴰⵃ|ⴰⵎⵙⴰⵡⴰⵍ]]) 23:12, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
:{{ⴷⵉⴷⵙ}} [[ⴰⵏⵙⵙⵎⵔⵙ:ⵕⴰⵊⵉ|ⵕⴰⵊⵉ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⵕⴰⵊⵉ|ⴰⵎⵙⴰⵡⴰⵍ]]) 23:57, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:ZacharyB|ZacharyB]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ZacharyB|ⴰⵎⵙⴰⵡⴰⵍ]]) 13:23, 1 ⵎⴰⵕⵚ 2026 (+00)
*{{ⴷⵉⴷⵙ}} [[ⴰⵏⵙⵙⵎⵔⵙ:ABDELATIF ANADJAR|ABDELATIF ANADJAR]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ABDELATIF ANADJAR|ⴰⵎⵙⴰⵡⴰⵍ]]) 14:15, 1 ⵎⴰⵕⵚ 2026 (+00)
*{{ⴷⵉⴷⵙ}}[[ⴰⵏⵙⵙⵎⵔⵙ:El Hassan BOUTSSAID|El Hassan BOUTSSAID]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:El Hassan BOUTSSAID|ⴰⵎⵙⴰⵡⴰⵍ]]) 10:27, 4 ⵎⴰⵕⵚ 2026 (+00)
*{{ⴷⵉⴷⵙ}} - [[ⴰⵏⵙⵙⵎⵔⵙ:Aksel Tinfat|Aksel Tinfat]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Aksel Tinfat|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:21, 4 ⵎⴰⵕⵚ 2026 (+00)
ⵜⴰⵏⵎⵎⵉⵔⵜ ⵏⵏⵓⵏ ⴰ ⵉⵎⴷⴷⵓⴽⴽⴰⵍ ⵅⴼ ⵜⵎⵢⵉⵎⴰⵏⵜ! ([https://meta.wikimedia.org/wiki/Steward_requests/Permissions#Lhoussine_AIT_TAYFST@zghwiki ⵥⵕ ⵜⵓⵜⵜⵔⴰ ⴳ ⵜⵙⵏⴰ ⵏ ⵎⵉⵜⴰ-ⵡⵉⴽⵉ]) --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|Lhoussine AIT TAYFST]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:22, 5 ⵎⴰⵕⵚ 2026 (+00)
''' ⴷⵉⴷⵙ''' [[ⴰⵏⵙⵙⵎⵔⵙ:Daoudsfouli|Daoudsfouli]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Daoudsfouli|ⴰⵎⵙⴰⵡⴰⵍ]]) 19:23, 5 ⵉⴱⵔⵉⵔ 2026 (+01)
== <span lang="en" dir="ltr">Migration to Parsoid</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
<em>[[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Parsoid Read Views/Read View Announcement|Read this in another language]]</em>
Hello everyone! I am glad to inform you that as the next step in the [[mw:Special:MyLanguage/Parsoid/Parser Unification|Parser Unification]] project, Parsoid will soon be turned on as the default article renderer on your wiki. We are gradually increasing the number of wikis using Parsoid, with the intention of making it the default wikitext parser for MediaWiki's next long-term support release. This will make our wikis more reliable and consistent for editors, readers, and tools to use, as well as making the development of future wikitext features easier.
If this disrupts your workflow, don’t worry! You can still opt out through a user preference or turn Parsoid off on the current page using the Tools submenu, as described in the [[mw:Special:MyLanguage/Help:Extension:ParserMigration|Extension:ParserMigration]] documentation.
There is [[mw:Special:MyLanguage/Parsoid/Parser Unification/Confidence Framework|more information about our roll-out strategy]] available, including the testing done before we turn on Parsoid for a new wiki.
To report bugs and issues, please look at our [[mw:Special:MyLanguage/Parsoid/Parser Unification/Known Issues|known issues]] documentation and if you found a new bug please create a phab ticket and tag the [[phab:project/view/5846|Content Transform Team in Phabricator]].
<section end="announcement-content" />
</div>
<bdi lang="en" dir="ltr">[[mw:User:CAnanian (WMF)|C. Scott Ananian]] (Parsoid technical lead)</bdi> 17:48, 18 ⵉⴱⵔⵉⵔ 2026 (+01)
<!-- Message sent by User:CAnanian (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Wikimedia_Foundation/Product_and_Technology/Parsoid_Read_Views/2026-04-20_Wikipedias&oldid=30424286 -->
== ⵜⵓⵜⵜⵔⴰ ⵏ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵎⵙⵙⵓⴳⵓⴳ (Adminship request) ==
ⴰⵣⵓⵍ ⵉⵎⴷⴷⵓⴽⴽⴰⵍ {{ⴰⵔⵇⵇⴰⵙ}}, ⵙⵙⵉⵜⵎⵖ ⴰⴷ ⴽⵯⵏ ⵜⴰⴼ ⵜⵓⵣⵉⵏⵜ ⴰⴷ ⴳ ⵜⵍⵡⵉⵜ ⴷ ⵓⴼⵔⴰ. ⵔⵉⵖ ⴰⴷ ⵉⵢⵉ ⵜⴼⴽⵉⵎ ⴰⵏⵏⴰⵍ ⵏⵏⵓⵏ ⴰⴷ ⴳⵖ ⴰⵎⵙⵙⵓⴳⵓⵔ ⴳ ⵡⵉⴽⵉ ⴰⴷ. ⵙⵙⵎⵔⵙⴰⵜ <code><nowiki>{{ⴷⵉⴷⵙ}}</nowiki></code> {{ⴷⵉⴷⵙ}} ⵏⵖ <code><nowiki>{{ⵎⴳⴰⵍ}}</nowiki></code> {{ⵎⴳⴰⵍ}} ⵜⴰⵏⵎⵎⵉⵔⵜ.--[[ⴰⵏⵙⵙⵎⵔⵙ:Essaidib2|Essaidib2]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Essaidib2|ⴰⵎⵙⴰⵡⴰⵍ]]) 01:02, 24 ⵉⴱⵔⵉⵔ 2026 (+01)
*{{ⴷⵉⴷⵙ}} [[ⴰⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵎⵙⴰⵡⴰⵍ]]) 09:14, 24 ⵉⴱⵔⵉⵔ 2026 (+01)
:{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine Bentayfaste|Lhoussine Bentayfaste]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine Bentayfaste|ⴰⵎⵙⴰⵡⴰⵍ]]) 11:11, 24 ⵉⴱⵔⵉⵔ 2026 (+01)
:{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:ZacharyB|ZacharyB]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ZacharyB|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:53, 25 ⵉⴱⵔⵉⵔ 2026 (+01)
6t300sn63yswn04m1lny7mkvui860ay
175762
175761
2026-04-26T00:58:20Z
MediaWiki message delivery
188
/* Request for comment (global AI policy) */ new section
175762
wikitext
text/x-wiki
{{ⴰⵏⵎⵓⴳⴳⴰⵔ}}
{{ⴰⵍⴱⵓⴹ:ⵜⵉⴼⵉⵍⵜ ⵏ ⵓⵙⵡⵓⴷⴷⵓ}}
{{ⵏⴹⵓ |20px}}
<templatestyles src="Template:ⵜⴰⵙⵏⴰ/styles.css"/>
__TOC__
= 2026 =
== <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
</div>
22:02, 19 ⵉⵏⵏⴰⵢⵔ 2026 (+01)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== ⵜⵓⵜⵜⵔⴰ ⵏ ⵜⵎⵙⵙⵓⴳⵓⵔⵜ ==
ⴰⵣⵓⵍ ⵉⵎⴷⴷⵓⴽⴽⴰⵍ {{ⵉⵏⵙⵙⵎⵔⵙⵏ}}! ⴰⵔ ⵙⵙⵉⵜⵉⵎⵖ ⴰ ⵜⵉⵍⵉⵎ ⴰⴽⴽⵯ ⴳ ⵢⴰⵏ ⵡⴰⴷⴷⴰⴷ ⵉⵛⵏⴰⵏ, ⵉⴳⴰ ⵉⵢⵉ ⴰⴷⴷⵓⵔ ⴰⴷ ⵜⵜⵔⵖ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵎⵙⵙⵓⴳⵓⵔ. ⵉⴳ ⴰ ⵜⵜⴰⵏⵏⴰⵢⵎ ⵎⴰⵙ ⴷ ⵖⵉⵖ ⴰⴷ ⴼⴽⵖ ⵓⴳⴳⴰⵔ ⵉ ⵡⵉⴽⵉⴱⵉⴷⵢⴰ ⵜⴰⵎⴰⵣⵉⵖⵜ ⵉⴳ ⴳⵉⵖ ⴰⵎⵙⵙⵓⴳⵓⵔ ⴼⴽⴰⵜ ⵜⴰⵏⵏⴰⵢⵜ ⵏⵏⵓⵏ ⵙ ⵓⵙⵎⵔⵙ ⵏ {{ⴷⵉⴷⵙ}} ⵏⵖ {{ⵎⴳⴰⵍ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|Lhoussine AIT TAYFST]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|ⴰⵎⵙⴰⵡⴰⵍ]]) 21:06, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|Lhoussine AIT TAYFST]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|ⴰⵎⵙⴰⵡⴰⵍ]]) 21:06, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:04, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}}--[[ⴰⵏⵙⵙⵎⵔⵙ:Essaidib2|Essaidib2]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Essaidib2|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:50, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}}----[[ⴰⵏⵙⵙⵎⵔⵙ:ⵟⴰⵢⵢⵉⴱ ⵎⴰⵢⴰⵃ|ⵟⴰⵢⵢⵉⴱ ⵎⴰⵢⴰⵃ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⵟⴰⵢⵢⵉⴱ ⵎⴰⵢⴰⵃ|ⴰⵎⵙⴰⵡⴰⵍ]]) 23:12, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
:{{ⴷⵉⴷⵙ}} [[ⴰⵏⵙⵙⵎⵔⵙ:ⵕⴰⵊⵉ|ⵕⴰⵊⵉ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⵕⴰⵊⵉ|ⴰⵎⵙⴰⵡⴰⵍ]]) 23:57, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:ZacharyB|ZacharyB]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ZacharyB|ⴰⵎⵙⴰⵡⴰⵍ]]) 13:23, 1 ⵎⴰⵕⵚ 2026 (+00)
*{{ⴷⵉⴷⵙ}} [[ⴰⵏⵙⵙⵎⵔⵙ:ABDELATIF ANADJAR|ABDELATIF ANADJAR]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ABDELATIF ANADJAR|ⴰⵎⵙⴰⵡⴰⵍ]]) 14:15, 1 ⵎⴰⵕⵚ 2026 (+00)
*{{ⴷⵉⴷⵙ}}[[ⴰⵏⵙⵙⵎⵔⵙ:El Hassan BOUTSSAID|El Hassan BOUTSSAID]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:El Hassan BOUTSSAID|ⴰⵎⵙⴰⵡⴰⵍ]]) 10:27, 4 ⵎⴰⵕⵚ 2026 (+00)
*{{ⴷⵉⴷⵙ}} - [[ⴰⵏⵙⵙⵎⵔⵙ:Aksel Tinfat|Aksel Tinfat]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Aksel Tinfat|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:21, 4 ⵎⴰⵕⵚ 2026 (+00)
ⵜⴰⵏⵎⵎⵉⵔⵜ ⵏⵏⵓⵏ ⴰ ⵉⵎⴷⴷⵓⴽⴽⴰⵍ ⵅⴼ ⵜⵎⵢⵉⵎⴰⵏⵜ! ([https://meta.wikimedia.org/wiki/Steward_requests/Permissions#Lhoussine_AIT_TAYFST@zghwiki ⵥⵕ ⵜⵓⵜⵜⵔⴰ ⴳ ⵜⵙⵏⴰ ⵏ ⵎⵉⵜⴰ-ⵡⵉⴽⵉ]) --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|Lhoussine AIT TAYFST]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:22, 5 ⵎⴰⵕⵚ 2026 (+00)
''' ⴷⵉⴷⵙ''' [[ⴰⵏⵙⵙⵎⵔⵙ:Daoudsfouli|Daoudsfouli]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Daoudsfouli|ⴰⵎⵙⴰⵡⴰⵍ]]) 19:23, 5 ⵉⴱⵔⵉⵔ 2026 (+01)
== <span lang="en" dir="ltr">Migration to Parsoid</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
<em>[[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Parsoid Read Views/Read View Announcement|Read this in another language]]</em>
Hello everyone! I am glad to inform you that as the next step in the [[mw:Special:MyLanguage/Parsoid/Parser Unification|Parser Unification]] project, Parsoid will soon be turned on as the default article renderer on your wiki. We are gradually increasing the number of wikis using Parsoid, with the intention of making it the default wikitext parser for MediaWiki's next long-term support release. This will make our wikis more reliable and consistent for editors, readers, and tools to use, as well as making the development of future wikitext features easier.
If this disrupts your workflow, don’t worry! You can still opt out through a user preference or turn Parsoid off on the current page using the Tools submenu, as described in the [[mw:Special:MyLanguage/Help:Extension:ParserMigration|Extension:ParserMigration]] documentation.
There is [[mw:Special:MyLanguage/Parsoid/Parser Unification/Confidence Framework|more information about our roll-out strategy]] available, including the testing done before we turn on Parsoid for a new wiki.
To report bugs and issues, please look at our [[mw:Special:MyLanguage/Parsoid/Parser Unification/Known Issues|known issues]] documentation and if you found a new bug please create a phab ticket and tag the [[phab:project/view/5846|Content Transform Team in Phabricator]].
<section end="announcement-content" />
</div>
<bdi lang="en" dir="ltr">[[mw:User:CAnanian (WMF)|C. Scott Ananian]] (Parsoid technical lead)</bdi> 17:48, 18 ⵉⴱⵔⵉⵔ 2026 (+01)
<!-- Message sent by User:CAnanian (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Wikimedia_Foundation/Product_and_Technology/Parsoid_Read_Views/2026-04-20_Wikipedias&oldid=30424286 -->
== ⵜⵓⵜⵜⵔⴰ ⵏ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵎⵙⵙⵓⴳⵓⴳ (Adminship request) ==
ⴰⵣⵓⵍ ⵉⵎⴷⴷⵓⴽⴽⴰⵍ {{ⴰⵔⵇⵇⴰⵙ}}, ⵙⵙⵉⵜⵎⵖ ⴰⴷ ⴽⵯⵏ ⵜⴰⴼ ⵜⵓⵣⵉⵏⵜ ⴰⴷ ⴳ ⵜⵍⵡⵉⵜ ⴷ ⵓⴼⵔⴰ. ⵔⵉⵖ ⴰⴷ ⵉⵢⵉ ⵜⴼⴽⵉⵎ ⴰⵏⵏⴰⵍ ⵏⵏⵓⵏ ⴰⴷ ⴳⵖ ⴰⵎⵙⵙⵓⴳⵓⵔ ⴳ ⵡⵉⴽⵉ ⴰⴷ. ⵙⵙⵎⵔⵙⴰⵜ <code><nowiki>{{ⴷⵉⴷⵙ}}</nowiki></code> {{ⴷⵉⴷⵙ}} ⵏⵖ <code><nowiki>{{ⵎⴳⴰⵍ}}</nowiki></code> {{ⵎⴳⴰⵍ}} ⵜⴰⵏⵎⵎⵉⵔⵜ.--[[ⴰⵏⵙⵙⵎⵔⵙ:Essaidib2|Essaidib2]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Essaidib2|ⴰⵎⵙⴰⵡⴰⵍ]]) 01:02, 24 ⵉⴱⵔⵉⵔ 2026 (+01)
*{{ⴷⵉⴷⵙ}} [[ⴰⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵎⵙⴰⵡⴰⵍ]]) 09:14, 24 ⵉⴱⵔⵉⵔ 2026 (+01)
:{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine Bentayfaste|Lhoussine Bentayfaste]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine Bentayfaste|ⴰⵎⵙⴰⵡⴰⵍ]]) 11:11, 24 ⵉⴱⵔⵉⵔ 2026 (+01)
:{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:ZacharyB|ZacharyB]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ZacharyB|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:53, 25 ⵉⴱⵔⵉⵔ 2026 (+01)
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[ⴰⵏⵙⵙⵎⵔⵙ:MediaWiki message delivery|MediaWiki message delivery]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:MediaWiki message delivery|ⴰⵎⵙⴰⵡⴰⵍ]]) 01:58, 26 ⵉⴱⵔⵉⵔ 2026 (+01)
</bdi>
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
m7ror378gzkqq5mmrhlvfcxcdxcqba0
175763
175762
2026-04-26T05:50:32Z
Aksel Tinfat
43
/* ⵜⵓⵜⵜⵔⴰ ⵏ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵎⵙⵙⵓⴳⵓⵔ (Adminship request) */
175763
wikitext
text/x-wiki
{{ⴰⵏⵎⵓⴳⴳⴰⵔ}}
{{ⴰⵍⴱⵓⴹ:ⵜⵉⴼⵉⵍⵜ ⵏ ⵓⵙⵡⵓⴷⴷⵓ}}
{{ⵏⴹⵓ |20px}}
<templatestyles src="Template:ⵜⴰⵙⵏⴰ/styles.css"/>
__TOC__
= 2026 =
== <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
</div>
22:02, 19 ⵉⵏⵏⴰⵢⵔ 2026 (+01)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== ⵜⵓⵜⵜⵔⴰ ⵏ ⵜⵎⵙⵙⵓⴳⵓⵔⵜ ==
ⴰⵣⵓⵍ ⵉⵎⴷⴷⵓⴽⴽⴰⵍ {{ⵉⵏⵙⵙⵎⵔⵙⵏ}}! ⴰⵔ ⵙⵙⵉⵜⵉⵎⵖ ⴰ ⵜⵉⵍⵉⵎ ⴰⴽⴽⵯ ⴳ ⵢⴰⵏ ⵡⴰⴷⴷⴰⴷ ⵉⵛⵏⴰⵏ, ⵉⴳⴰ ⵉⵢⵉ ⴰⴷⴷⵓⵔ ⴰⴷ ⵜⵜⵔⵖ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵎⵙⵙⵓⴳⵓⵔ. ⵉⴳ ⴰ ⵜⵜⴰⵏⵏⴰⵢⵎ ⵎⴰⵙ ⴷ ⵖⵉⵖ ⴰⴷ ⴼⴽⵖ ⵓⴳⴳⴰⵔ ⵉ ⵡⵉⴽⵉⴱⵉⴷⵢⴰ ⵜⴰⵎⴰⵣⵉⵖⵜ ⵉⴳ ⴳⵉⵖ ⴰⵎⵙⵙⵓⴳⵓⵔ ⴼⴽⴰⵜ ⵜⴰⵏⵏⴰⵢⵜ ⵏⵏⵓⵏ ⵙ ⵓⵙⵎⵔⵙ ⵏ {{ⴷⵉⴷⵙ}} ⵏⵖ {{ⵎⴳⴰⵍ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|Lhoussine AIT TAYFST]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|ⴰⵎⵙⴰⵡⴰⵍ]]) 21:06, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|Lhoussine AIT TAYFST]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|ⴰⵎⵙⴰⵡⴰⵍ]]) 21:06, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:04, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}}--[[ⴰⵏⵙⵙⵎⵔⵙ:Essaidib2|Essaidib2]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Essaidib2|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:50, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}}----[[ⴰⵏⵙⵙⵎⵔⵙ:ⵟⴰⵢⵢⵉⴱ ⵎⴰⵢⴰⵃ|ⵟⴰⵢⵢⵉⴱ ⵎⴰⵢⴰⵃ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⵟⴰⵢⵢⵉⴱ ⵎⴰⵢⴰⵃ|ⴰⵎⵙⴰⵡⴰⵍ]]) 23:12, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
:{{ⴷⵉⴷⵙ}} [[ⴰⵏⵙⵙⵎⵔⵙ:ⵕⴰⵊⵉ|ⵕⴰⵊⵉ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⵕⴰⵊⵉ|ⴰⵎⵙⴰⵡⴰⵍ]]) 23:57, 28 ⴱⵕⴰⵢⵕ 2026 (+00)
*{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:ZacharyB|ZacharyB]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ZacharyB|ⴰⵎⵙⴰⵡⴰⵍ]]) 13:23, 1 ⵎⴰⵕⵚ 2026 (+00)
*{{ⴷⵉⴷⵙ}} [[ⴰⵏⵙⵙⵎⵔⵙ:ABDELATIF ANADJAR|ABDELATIF ANADJAR]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ABDELATIF ANADJAR|ⴰⵎⵙⴰⵡⴰⵍ]]) 14:15, 1 ⵎⴰⵕⵚ 2026 (+00)
*{{ⴷⵉⴷⵙ}}[[ⴰⵏⵙⵙⵎⵔⵙ:El Hassan BOUTSSAID|El Hassan BOUTSSAID]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:El Hassan BOUTSSAID|ⴰⵎⵙⴰⵡⴰⵍ]]) 10:27, 4 ⵎⴰⵕⵚ 2026 (+00)
*{{ⴷⵉⴷⵙ}} - [[ⴰⵏⵙⵙⵎⵔⵙ:Aksel Tinfat|Aksel Tinfat]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Aksel Tinfat|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:21, 4 ⵎⴰⵕⵚ 2026 (+00)
ⵜⴰⵏⵎⵎⵉⵔⵜ ⵏⵏⵓⵏ ⴰ ⵉⵎⴷⴷⵓⴽⴽⴰⵍ ⵅⴼ ⵜⵎⵢⵉⵎⴰⵏⵜ! ([https://meta.wikimedia.org/wiki/Steward_requests/Permissions#Lhoussine_AIT_TAYFST@zghwiki ⵥⵕ ⵜⵓⵜⵜⵔⴰ ⴳ ⵜⵙⵏⴰ ⵏ ⵎⵉⵜⴰ-ⵡⵉⴽⵉ]) --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|Lhoussine AIT TAYFST]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine AIT TAYFST|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:22, 5 ⵎⴰⵕⵚ 2026 (+00)
''' ⴷⵉⴷⵙ''' [[ⴰⵏⵙⵙⵎⵔⵙ:Daoudsfouli|Daoudsfouli]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Daoudsfouli|ⴰⵎⵙⴰⵡⴰⵍ]]) 19:23, 5 ⵉⴱⵔⵉⵔ 2026 (+01)
== <span lang="en" dir="ltr">Migration to Parsoid</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
<em>[[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Parsoid Read Views/Read View Announcement|Read this in another language]]</em>
Hello everyone! I am glad to inform you that as the next step in the [[mw:Special:MyLanguage/Parsoid/Parser Unification|Parser Unification]] project, Parsoid will soon be turned on as the default article renderer on your wiki. We are gradually increasing the number of wikis using Parsoid, with the intention of making it the default wikitext parser for MediaWiki's next long-term support release. This will make our wikis more reliable and consistent for editors, readers, and tools to use, as well as making the development of future wikitext features easier.
If this disrupts your workflow, don’t worry! You can still opt out through a user preference or turn Parsoid off on the current page using the Tools submenu, as described in the [[mw:Special:MyLanguage/Help:Extension:ParserMigration|Extension:ParserMigration]] documentation.
There is [[mw:Special:MyLanguage/Parsoid/Parser Unification/Confidence Framework|more information about our roll-out strategy]] available, including the testing done before we turn on Parsoid for a new wiki.
To report bugs and issues, please look at our [[mw:Special:MyLanguage/Parsoid/Parser Unification/Known Issues|known issues]] documentation and if you found a new bug please create a phab ticket and tag the [[phab:project/view/5846|Content Transform Team in Phabricator]].
<section end="announcement-content" />
</div>
<bdi lang="en" dir="ltr">[[mw:User:CAnanian (WMF)|C. Scott Ananian]] (Parsoid technical lead)</bdi> 17:48, 18 ⵉⴱⵔⵉⵔ 2026 (+01)
<!-- Message sent by User:CAnanian (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Wikimedia_Foundation/Product_and_Technology/Parsoid_Read_Views/2026-04-20_Wikipedias&oldid=30424286 -->
== ⵜⵓⵜⵜⵔⴰ ⵏ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵎⵙⵙⵓⴳⵓⵔ (Adminship request) ==
ⴰⵣⵓⵍ ⵉⵎⴷⴷⵓⴽⴽⴰⵍ {{ⴰⵔⵇⵇⴰⵙ}}, ⵙⵙⵉⵜⵎⵖ ⴰⴷ ⴽⵯⵏ ⵜⴰⴼ ⵜⵓⵣⵉⵏⵜ ⴰⴷ ⴳ ⵜⵍⵡⵉⵜ ⴷ ⵓⴼⵔⴰ. ⵔⵉⵖ ⴰⴷ ⵉⵢⵉ ⵜⴼⴽⵉⵎ ⴰⵏⵏⴰⵍ ⵏⵏⵓⵏ ⴰⴷ ⴳⵖ ⴰⵎⵙⵙⵓⴳⵓⵔ ⴳ ⵡⵉⴽⵉ ⴰⴷ. ⵙⵙⵎⵔⵙⴰⵜ <code><nowiki>{{ⴷⵉⴷⵙ}}</nowiki></code> {{ⴷⵉⴷⵙ}} ⵏⵖ <code><nowiki>{{ⵎⴳⴰⵍ}}</nowiki></code> {{ⵎⴳⴰⵍ}} ⵜⴰⵏⵎⵎⵉⵔⵜ.--[[ⴰⵏⵙⵙⵎⵔⵙ:Essaidib2|Essaidib2]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Essaidib2|ⴰⵎⵙⴰⵡⴰⵍ]]) 01:02, 24 ⵉⴱⵔⵉⵔ 2026 (+01)
*{{ⴷⵉⴷⵙ}} [[ⴰⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ⴰⵏⴰⵙ ⵓⵍⵃⵍⵓ|ⴰⵎⵙⴰⵡⴰⵍ]]) 09:14, 24 ⵉⴱⵔⵉⵔ 2026 (+01)
:{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:Lhoussine Bentayfaste|Lhoussine Bentayfaste]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Lhoussine Bentayfaste|ⴰⵎⵙⴰⵡⴰⵍ]]) 11:11, 24 ⵉⴱⵔⵉⵔ 2026 (+01)
:{{ⴷⵉⴷⵙ}} --[[ⴰⵏⵙⵙⵎⵔⵙ:ZacharyB|ZacharyB]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:ZacharyB|ⴰⵎⵙⴰⵡⴰⵍ]]) 22:53, 25 ⵉⴱⵔⵉⵔ 2026 (+01)
:{{ⴷⵉⴷⵙ}} - [[ⴰⵏⵙⵙⵎⵔⵙ:Aksel Tinfat|Aksel Tinfat]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:Aksel Tinfat|ⴰⵎⵙⴰⵡⴰⵍ]]) 06:50, 26 ⵉⴱⵔⵉⵔ 2026 (+01)
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[ⴰⵏⵙⵙⵎⵔⵙ:MediaWiki message delivery|MediaWiki message delivery]] ([[ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ:MediaWiki message delivery|ⴰⵎⵙⴰⵡⴰⵍ]]) 01:58, 26 ⵉⴱⵔⵉⵔ 2026 (+01)
</bdi>
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
g5t57bifm4uj7pksw81oucb2ovqm8t7
ⵡⵉⴽⵉⴱⵉⴷⵢⴰ:ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/26 ⵉⴱⵔⵉⵔ
4
52638
175764
2026-04-26T09:15:00Z
ABDELATIF ANADJAR
14
Created page with "ⵉⵎⵙⴰⵔ ⴳ ⵣⵓⵏ ⴷ ⴰⵙⵙ ⴰⴷ: [[26 ⵉⴱⵔⵉⵔ]]. <!-- ⵉⵣⵎⵣⵣⴰ --> <!-- ⵜⵉⵎⵙⴰⵔⵉⵏ --> [[1860]]: ⴰⵙⴳⵎⴹ ⵏ ⵜⵎⵢⴰⵇⵇⴰⵏⵜ ⵏ '''ⵡⴰⴷ ⵔⴰⵙ''' ⵏⴳⵔ [[ⵍⵎⵖⵔⵉⴱ]] ⴷ '''ⵙⴱⴰⵏⵢⴰ'''. *[[1967]]: ⵜⵍⵓⵍ ⵜⵏⴰⵥⵓⵕⵜ ⵏ ⵡⴰⵟⵍⴰⵙ '''ⵛⵛⵔⵉⴼⴰ ⴳⵉⵔⵙⵉⵜ''' ⴳ ⵜⵎⴷⵉⵏⵜ ⵏ [[ⵅⵏⵉⴼⵕⴰ]]. {{ⴰⵎ ⵡⴰⵙⵙ..."
175764
wikitext
text/x-wiki
ⵉⵎⵙⴰⵔ ⴳ ⵣⵓⵏ ⴷ ⴰⵙⵙ ⴰⴷ: [[26 ⵉⴱⵔⵉⵔ]].
<!-- ⵉⵣⵎⵣⵣⴰ -->
<!-- ⵜⵉⵎⵙⴰⵔⵉⵏ -->
[[1860]]: ⴰⵙⴳⵎⴹ ⵏ ⵜⵎⵢⴰⵇⵇⴰⵏⵜ ⵏ '''ⵡⴰⴷ ⵔⴰⵙ''' ⵏⴳⵔ [[ⵍⵎⵖⵔⵉⴱ]] ⴷ '''ⵙⴱⴰⵏⵢⴰ'''.
*[[1967]]: ⵜⵍⵓⵍ ⵜⵏⴰⵥⵓⵕⵜ ⵏ ⵡⴰⵟⵍⴰⵙ '''ⵛⵛⵔⵉⴼⴰ ⴳⵉⵔⵙⵉⵜ''' ⴳ ⵜⵎⴷⵉⵏⵜ ⵏ [[ⵅⵏⵉⴼⵕⴰ]].
{{ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/ⵜⵓⵣⴷⵉⵔⵜ}}
{{ⵜⵓⵣⴷⵉⵔⵜ |[[ⵡⵉⴽⵉⴱⵉⴷⵢⴰ:ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/26 ⵉⴱⵔⵉⵔ|ⵙⵙⵏⴼⵍ]] }}
tjfcj3mwuef4fleydyxkqb4psm48656
175767
175764
2026-04-26T09:16:46Z
ABDELATIF ANADJAR
14
175767
wikitext
text/x-wiki
ⵉⵎⵙⴰⵔ ⴳ ⵣⵓⵏ ⴷ ⴰⵙⵙ ⴰⴷ: [[26 ⵉⴱⵔⵉⵔ]].
<!-- ⵉⵣⵎⵣⵣⴰ -->
<!-- ⵜⵉⵎⵙⴰⵔⵉⵏ -->
*[[1860]]: ⴰⵙⴳⵎⴹ ⵏ ⵜⵎⵢⴰⵇⵇⴰⵏⵜ ⵏ '''ⵡⴰⴷ ⵔⴰⵙ''' ⵏⴳⵔ [[ⵍⵎⵖⵔⵉⴱ]] ⴷ '''ⵙⴱⴰⵏⵢⴰ'''.
*[[1967]]: ⵜⵍⵓⵍ ⵜⵏⴰⵥⵓⵕⵜ ⵏ ⵡⴰⵟⵍⴰⵙ '''ⵛⵛⵔⵉⴼⴰ ⴳⵉⵔⵙⵉⵜ''' ⴳ ⵜⵎⴷⵉⵏⵜ ⵏ [[ⵅⵏⵉⴼⵔⴰ]].
{{ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/ⵜⵓⵣⴷⵉⵔⵜ}}
{{ⵜⵓⵣⴷⵉⵔⵜ |[[ⵡⵉⴽⵉⴱⵉⴷⵢⴰ:ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/26 ⵉⴱⵔⵉⵔ|ⵙⵙⵏⴼⵍ]] }}
mag5y432tqz0jv36c0ypqy6n1fyw062
ⵡⵉⴽⵉⴱⵉⴷⵢⴰ:ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/27 ⵉⴱⵔⵉⵔ
4
52639
175768
2026-04-26T09:24:27Z
ABDELATIF ANADJAR
14
Created page with "ⵉⵎⵙⴰⵔ ⴳ ⵣⵓⵏ ⴷ ⴰⵙⵙ ⴰⴷ: [[27 ⵉⴱⵔⵉⵔ]]. <!-- ⵉⵣⵎⵣⵣⴰ --> <!-- ⵜⵉⵎⵙⴰⵔⵉⵏ --> *[[711]]: ⴰⵣⵓⴳⵣ ⵏ '''[[ⵟⴰⵔⵉⵇ ⴱⵏⵓ ⵣⵉⵢⵢⴰⴷ]]''' ⴷ ⵓⵙⵔⴷⴰⵙ ⵏⵏⵙ ⴳ ⵉⴱⵔⵉⵢⵉⵏ ⴷ ⵓⵙⵏⵜⵉ ⵏ ⵜⴼⵔⴽⵉⵡⵜ ⵏ [[ⵉⵏⴷⵍⴰⵙ]]. *[[1999]]: ⴰⵙⴱⴷⴷⵉ ⵏ ⵓⵏⴱⴰⴹ ⵏ '''ⵢⴰⵎⵉⵏ ⵣⵔⵡⴰⵍ''' ⴰⵏⵙⵙⵉⵅⴼ ⵏ..."
175768
wikitext
text/x-wiki
ⵉⵎⵙⴰⵔ ⴳ ⵣⵓⵏ ⴷ ⴰⵙⵙ ⴰⴷ: [[27 ⵉⴱⵔⵉⵔ]].
<!-- ⵉⵣⵎⵣⵣⴰ -->
<!-- ⵜⵉⵎⵙⴰⵔⵉⵏ -->
*[[711]]: ⴰⵣⵓⴳⵣ ⵏ '''[[ⵟⴰⵔⵉⵇ ⴱⵏⵓ ⵣⵉⵢⵢⴰⴷ]]''' ⴷ ⵓⵙⵔⴷⴰⵙ ⵏⵏⵙ ⴳ ⵉⴱⵔⵉⵢⵉⵏ ⴷ ⵓⵙⵏⵜⵉ ⵏ ⵜⴼⵔⴽⵉⵡⵜ ⵏ [[ⵉⵏⴷⵍⴰⵙ]].
*[[1999]]: ⴰⵙⴱⴷⴷⵉ ⵏ ⵓⵏⴱⴰⴹ ⵏ '''ⵢⴰⵎⵉⵏ ⵣⵔⵡⴰⵍ''' ⴰⵏⵙⵙⵉⵅⴼ ⵏ ⵜⵎⵓⵔⵜ ⵏ '''[[ⴷⵣⴰⵢⵔ]]''' ⴰⴽⵓⴷ ⴰⵏⵏ.
{{ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/ⵜⵓⵣⴷⵉⵔⵜ}}
{{ⵜⵓⵣⴷⵉⵔⵜ |[[ⵡⵉⴽⵉⴱⵉⴷⵢⴰ:ⴰⵎ ⵡⴰⵙⵙ ⴰⴷ/27 ⵉⴱⵔⵉⵔ|ⵙⵙⵏⴼⵍ]] }}
hn0iekubja0dzjl6vk1gtb5y3iiqcx1