ⵡⵉⴽⵉⴱⵉⴷⵢⴰ 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