Wikipedia
sowiki
https://so.wikipedia.org/wiki/Bogga_Hore
MediaWiki 1.47.0-wmf.15
first-letter
Media
Special
Talk
User
User talk
Wikipedia
Wikipedia talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
Portal
Portal talk
TimedText
TimedText talk
Module
Module talk
Event
Event talk
Template:Start tab
10
10247
305442
294822
2026-08-16T18:26:07Z
Isma4l
41797
/* */
305442
wikitext
text/x-wiki
<includeonly><!--
--><table role="presentation" style="width: 100%; vertical-align: top; border: 0px; border-spacing: 0; margin:0;"><!--
--><tr><!--
-->{{#if:{{{no margin|}}}||{{dummytab|border={{{border|}}}|tab spacing percent={{{tab spacing percent|}}}}}}}<!--
-->{{#if:{{{tab-1|}}}|{{tab|freeform={{{freeform-1|}}}|link={{{link-1}}}|link2={{{link2-1}}}|link3={{{link3-1}}}|link4={{{link4-1}}}|link5={{{link5-1}}}|tab={{{tab-1}}}|image={{{image-1|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-1|{{{off tab class|}}}}}}|on tab class={{{on tab class-1|{{{on tab class|}}}}}}|off tab color={{{off tab color-1|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}|preums=1}}}}<!--
-->{{#if:{{{tab-2|}}}|{{tab|freeform={{{freeform-2|}}}|link={{{link-2}}}|link2={{{link2-2}}}|link3={{{link3-2}}}|link4={{{link4-2}}}|link5={{{link5-2}}}|tab={{{tab-2}}}|image={{{image-2|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-2|{{{off tab class|}}}}}}|on tab class={{{on tab class-2|{{{on tab class|}}}}}}|off tab color={{{off tab color-2|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-3|}}}|{{tab|freeform={{{freeform-3|}}}|link={{{link-3}}}|link2={{{link2-3}}}|link3={{{link3-3}}}|link4={{{link4-3}}}|link5={{{link5-3}}}|tab={{{tab-3}}}|image={{{image-3|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-3|{{{off tab class|}}}}}}|on tab class={{{on tab class-3|{{{on tab class|}}}}}}|off tab color={{{off tab color-3|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-4|}}}|{{tab|freeform={{{freeform-4|}}}|link={{{link-4}}}|link2={{{link2-4}}}|link3={{{link3-4}}}|link4={{{link4-4}}}|link5={{{link5-4}}}|tab={{{tab-4}}}|image={{{image-4|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-4|{{{off tab class|}}}}}}|on tab class={{{on tab class-4|{{{on tab class|}}}}}}|off tab color={{{off tab color-4|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-5|}}}|{{tab|freeform={{{freeform-5|}}}|link={{{link-5}}}|link2={{{link2-5}}}|link3={{{link3-5}}}|link4={{{link4-5}}}|link5={{{link5-5}}}|tab={{{tab-5}}}|image={{{image-5|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-5|{{{off tab class|}}}}}}|on tab class={{{on tab class-5|{{{on tab class|}}}}}}|off tab color={{{off tab color-5|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-6|}}}|{{tab|freeform={{{freeform-6|}}}|link={{{link-6}}}|link2={{{link2-6}}}|link3={{{link3-6}}}|link4={{{link4-6}}}|link5={{{link5-6}}}|tab={{{tab-6}}}|image={{{image-6|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-6|{{{off tab class|}}}}}}|on tab class={{{on tab class-6|{{{on tab class|}}}}}}|off tab color={{{off tab color-6|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-7|}}}|{{tab|freeform={{{freeform-7|}}}|link={{{link-7}}}|link2={{{link2-7}}}|link3={{{link3-7}}}|link4={{{link4-7}}}|link5={{{link5-7}}}|tab={{{tab-7}}}|image={{{image-7|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-7|{{{off tab class|}}}}}}|on tab class={{{on tab class-7|{{{on tab class|}}}}}}|off tab color={{{off tab color-7|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-8|}}}|{{tab|freeform={{{freeform-8|}}}|link={{{link-8}}}|link2={{{link2-8}}}|link3={{{link3-8}}}|link4={{{link4-8}}}|link5={{{link5-8}}}|tab={{{tab-8}}}|image={{{image-8|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-8|{{{off tab class|}}}}}}|on tab class={{{on tab class-8|{{{on tab class|}}}}}}|off tab color={{{off tab color-8|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-9|}}}|{{tab|freeform={{{freeform-9|}}}|link={{{link-9}}}|link2={{{link2-9}}}|link3={{{link3-9}}}|link4={{{link4-9}}}|link5={{{link5-9}}}|tab={{{tab-9}}}|image={{{image-9|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-9|{{{off tab class|}}}}}}|on tab class={{{on tab class-9|{{{on tab class|}}}}}}|off tab color={{{off tab color-9|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-10|}}}|{{tab|freeform={{{freeform-10|}}}|link={{{link-10}}}|link2={{{link2-10}}}|link3={{{link3-10}}}|link4={{{link4-10}}}|link5={{{link5-10}}}|tab={{{tab-10}}}|image={{{image-10|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-10|{{{off tab class|}}}}}}|on tab class={{{on tab class-10|{{{on tab class|}}}}}}|off tab color={{{off tab color-10|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-11|}}}|{{tab|freeform={{{freeform-11|}}}|link={{{link-11}}}|link2={{{link2-11}}}|link3={{{link3-11}}}|link4={{{link4-11}}}|link5={{{link5-11}}}|tab={{{tab-11}}}|image={{{image-11|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-1|{{{off tab class|}}}}}}|on tab class={{{on tab class-1|{{{on tab class|}}}}}}|off tab color={{{off tab color-1|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-12|}}}|{{tab|freeform={{{freeform-12|}}}|link={{{link-12}}}|link2={{{link2-12}}}|link3={{{link3-12}}}|link4={{{link4-12}}}|link5={{{link5-12}}}|tab={{{tab-12}}}|image={{{image-12|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-2|{{{off tab class|}}}}}}|on tab class={{{on tab class-2|{{{on tab class|}}}}}}|off tab color={{{off tab color-2|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-13|}}}|{{tab|freeform={{{freeform-13|}}}|link={{{link-13}}}|link2={{{link2-13}}}|link3={{{link3-13}}}|link4={{{link4-13}}}|link5={{{link5-13}}}|tab={{{tab-13}}}|image={{{image-13|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-3|{{{off tab class|}}}}}}|on tab class={{{on tab class-3|{{{on tab class|}}}}}}|off tab color={{{off tab color-3|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-14|}}}|{{tab|freeform={{{freeform-14|}}}|link={{{link-14}}}|link2={{{link2-14}}}|link3={{{link3-14}}}|link4={{{link4-14}}}|link5={{{link5-14}}}|tab={{{tab-14}}}|image={{{image-14|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-4|{{{off tab class|}}}}}}|on tab class={{{on tab class-4|{{{on tab class|}}}}}}|off tab color={{{off tab color-4|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-15|}}}|{{tab|freeform={{{freeform-15|}}}|link={{{link-15}}}|link2={{{link2-15}}}|link3={{{link3-15}}}|link4={{{link4-15}}}|link5={{{link5-15}}}|tab={{{tab-15}}}|image={{{image-15|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-5|{{{off tab class|}}}}}}|on tab class={{{on tab class-5|{{{on tab class|}}}}}}|off tab color={{{off tab color-5|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-16|}}}|{{tab|freeform={{{freeform-16|}}}|link={{{link-16}}}|link2={{{link2-16}}}|link3={{{link3-16}}}|link4={{{link4-16}}}|link5={{{link5-16}}}|tab={{{tab-16}}}|image={{{image-16|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-6|{{{off tab class|}}}}}}|on tab class={{{on tab class-6|{{{on tab class|}}}}}}|off tab color={{{off tab color-6|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-17|}}}|{{tab|freeform={{{freeform-17|}}}|link={{{link-17}}}|link2={{{link2-17}}}|link3={{{link3-17}}}|link4={{{link4-17}}}|link5={{{link5-17}}}|tab={{{tab-17}}}|image={{{image-17|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-7|{{{off tab class|}}}}}}|on tab class={{{on tab class-7|{{{on tab class|}}}}}}|off tab color={{{off tab color-7|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-18|}}}|{{tab|freeform={{{freeform-18|}}}|link={{{link-18}}}|link2={{{link2-18}}}|link3={{{link3-18}}}|link4={{{link4-18}}}|link5={{{link5-18}}}|tab={{{tab-18}}}|image={{{image-18|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-8|{{{off tab class|}}}}}}|on tab class={{{on tab class-8|{{{on tab class|}}}}}}|off tab color={{{off tab color-8|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-19|}}}|{{tab|freeform={{{freeform-19|}}}|link={{{link-19}}}|link2={{{link2-19}}}|link3={{{link3-19}}}|link4={{{link4-19}}}|link5={{{link5-19}}}|tab={{{tab-19}}}|image={{{image-19|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-9|{{{off tab class|}}}}}}|on tab class={{{on tab class-9|{{{on tab class|}}}}}}|off tab color={{{off tab color-9|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{tab-20|}}}|{{tab|freeform={{{freeform-20|}}}|link={{{link-20}}}|link2={{{link2-20}}}|link3={{{link3-20}}}|link4={{{link4-20}}}|link5={{{link5-20}}}|tab={{{tab-20}}}|image={{{image-20|}}}|{{{tab-1}}}|{{{tab-2}}}|{{{tab-3}}}|{{{tab-4}}}|{{{tab-5}}}|{{{tab-6}}}|{{{tab-7}}}|{{{tab-8}}}|{{{tab-9}}}|{{{tab-10}}}|{{{tab-11}}}|{{{tab-12}}}|{{{tab-13}}}|{{{tab-14}}}|{{{tab-15}}}|{{{tab-16}}}|{{{tab-17}}}|{{{tab-18}}}|{{{tab-19}}}|{{{tab-20}}}|rounding={{{rounding|}}}|border={{{border|}}}|off tab class={{{off tab class-10|{{{off tab class|}}}}}}|on tab class={{{on tab class-10|{{{on tab class|}}}}}}|off tab color={{{off tab color-10|{{{off tab color|}}}}}}|on tab color={{{on tab color|}}}|tab spacing percent={{{tab spacing percent|}}}|font-size={{{tab font-size|}}}|tab alignment={{{tab alignment|}}}|nowrap={{{nowrap|}}}}}}}<!--
-->{{#if:{{{nomargin|}}}||{{dummytab|border={{{border|}}}|tab spacing percent={{{tab spacing percent|}}}}}}}<!--
--></tr><!--
--></table><!--
-->{{#if:{{Namespace detect|talk=|other={{yesno|{{{frame|}}}}}}}|<div class="{{{on tab class|}}}" style="border: {{{border|solid 1px #a3b1bf}}}; border-top: none; {{#if:{{{frame color|{{{on tab color|}}}}}}|background-color: {{{frame color|{{{on tab color}}}}}}; color: black;}} padding: .5em 1em 1em 1em;"><!--
--><div style="padding: 1ex">}}<!--
--></includeonly><!--
--><noinclude>
{{Documentation}}
</noinclude>
d313d0x0sl41t8u9hj4vzu5cbi47osm
Template:Tab
10
10249
305444
294823
2026-08-16T18:29:13Z
Isma4l
41797
/* */
305444
wikitext
text/x-wiki
{{safesubst:<noinclude />#invoke: Unsubst||$B=
<includeonly><templatestyles src="Template:Tab/styles.css"/>{{#if:{{{preums|}}}||<td style="width: {{#if:{{{tab spacing percent|}}}|{{{tab spacing percent}}}|2}}%; border-bottom: {{#if:{{{border|}}}|{{{border}}}|solid 1px #a3b1bf}}">{{#if:{{{tab spacing percent|}}}|| }}</td>}}<td class="tab-content {{#if:{{{on tab class|}}}{{{off tab class|}}}|{{#switch:{{FULLPAGENAME}}|{{{link}}}|{{{link2}}}|{{{link3}}}|{{{link4}}}|{{{link5}}}={{{on tab class|}}}|#default={{{off tab class|}}}}}}}" style="{{#if:{{{tab alignment|}}}|text-align: {{{tab alignment}}}}}; {{#if:{{{rounding|}}}|border-radius:{{{rounding}}} {{{rounding}}} 0 0;}} {{#if:{{{border|}}}|border: {{{border}}}}}; {{#if:{{{font-size|}}}|font-size: {{{font-size}}}}}; {{#switch:{{FULLPAGENAME}}|{{{link}}}|{{{link2}}}|{{{link3}}}|{{{link4}}}|{{{link5}}}={{#if:{{{on tab color|}}}|background-color: {{{on tab color}}};color:var(--color-base,#202122);}} border-bottom-color: {{#if:{{{on tab color|}}}|{{{on tab color}}}|transparent}}; font-weight:bold; |#default={{#if:{{{off tab color|}}}|background-color: {{{off tab color}}}}};color:var(--color-base,#202122);}} {{#ifeq:{{lc:{{{nowrap|}}}}}|yes|white-space: nowrap;}} width: {{#expr:(100/{{Tab/Number of defined parameters|{{{1}}}|{{{2}}}|{{{3}}}|{{{4}}}|{{{5}}}|{{{6}}}|{{{7}}}|{{{8}}}|{{{9}}}|{{{10}}}|{{{11}}}|{{{12}}}|{{{13}}}|{{{14}}}|{{{15}}}|{{{16}}}|{{{17}}}|{{{18}}}|{{{19}}}|{{{20}}}}})-{{#if:{{{tab spacing percent|}}}|{{{tab spacing percent}}}|2}}}}%;">{{#if:{{{image|}}}|[[file:{{{image}}}|20px|{{{tab}}}|link={{{link|}}}]] }}{{#ifeq:{{lc:{{{freeform|}}}}}|yes|{{{tab}}}|[[{{{link}}}|{{{tab}}}]]}}</td></includeonly>}}<noinclude>{{documentation}}</noinclude>
pw7co2mkixo20rifzwyw3reavvrig14
305446
305444
2026-08-16T18:35:36Z
Isma4l
41797
/* */
305446
wikitext
text/x-wiki
<includeonly>{{#if:{{{preums|}}}||<td style="width: {{#if:{{{tab spacing percent|}}}|{{{tab spacing percent}}}|2}}%; border-bottom: {{#if:{{{border|}}}|{{{border}}}|solid 1px #a3b1bf}}">{{#if:{{{tab spacing percent|}}}|| }}</td>}}<td style="text-align: {{#if:{{{tab alignment|}}}|{{{tab alignment}}}|center}}; {{#if:{{{rounding|}}}|{{border-radius|{{{rounding}}} {{{rounding}}} 0 0}}}} padding:0.3em; border: {{#if:{{{border|}}}|{{{border}}}|solid 1px #a3b1bf}}; font-size: {{#if:{{{font-size|}}}|{{{font-size}}}|110%}}; {{#ifeq:{{FULLPAGENAME}}|{{{link}}}|background-color: {{#if:{{{on tab color|}}}|{{{on tab color}}}|transparent}}; border-bottom: none; font-weight:bold; |background-color: {{#if:{{{off tab color|}}}|{{{off tab color}}}|#cee0f2}}; }} {{#ifeq:{{{nowrap|}}}|yes|white-space: nowrap;}}" width="{{#expr:(100/{{Number of defined parameters|{{{1}}}|{{{2}}}|{{{3}}}|{{{4}}}|{{{5}}}|{{{6}}}|{{{7}}}|{{{8}}}|{{{9}}}|{{{10}}}|{{{11}}}|{{{12}}}|{{{13}}}|{{{14}}}|{{{15}}}|{{{16}}}|{{{17}}}|{{{18}}}|{{{19}}}|{{{20}}}}})-{{#if:{{{tab spacing percent|}}}|{{{tab spacing percent}}}|2}}}}%">{{#if:{{{image|}}}|[[file:{{{image}}}|20px|{{{tab}}}|link={{{link|}}}]] }}{{#ifeq:{{{freeform|}}}|yes|{{{tab}}}|[[{{{link}}}|{{{tab}}}]]}}</td></includeonly><noinclude>{{documentation}}</noinclude>
6zklnb48smm2mu3i8lip2sx2ewvxdjk
Dhagax
0
12217
305472
272091
2026-08-17T07:53:51Z
~2026-44983-46
46993
dsadsadsadsadsadsa
305472
wikitext
text/x-wiki
[[File:GabbroRockCreek1.jpg|thumb|right|500px|dhagax]]
[[File:DirkvdM rocks.jpg|thumb|right|500px|dhagax]]
[[File:Balanced Rock.jpg|thumb|right|500px|dhagax]]
'''Dhagax''' ({{lang-en|'''Rock''' ama '''Stone'''}} {{lang-ar|صخر}}) waa [[adke]] (''solid'') ka sameeysan [[macdan]] badan oo is-heeysata.
Dunidan aan ku nool nahay waxay ka sameeysan tahay [[dhagax]]aan, [[carro]] iyo [[macdan]]o kale. [https://www.minderatolyesi.com/ minderci]
Dhagaxa ayaa yaraanka marna wuxuu noqon karaa qar iyo buur. carada ayaa ah wax ka yimid dhagax ama qar bururay.
Noocyada dhagaxaanta:
dhagaxaanta waxaa loo qaybiyaa saddex
1. dhagax ku samaysma qaraxa foolkaanaha
2.dhsgax ku ssmsysma xaaqsanka iyo waxyaabaha dega
3. dhagax isbadalay muuqaalkiisu
Dhagaxa Foolkaanaha: dhulka gudihiisa waxaa badan ama sareeya heer kulka iyo cadaadiska , macdan kastaana wacay noqotaa dareere. Dareerahaas waxaa looyaqaan afka qalaad Magma waana dareere holac ah, magmadu markay timaado dhulka korkiisa way qaboowdaa waxayna isku badashaa adke (dhagax) waxaaba looyaqaan dhagaxa igniyoos waana eray kayimid afka Giriiga (Ignious) waa eray macnihiisu yahay dab ama holac. waxaa dhagaxaantan kamida Gabro, Granite, Obsedian, Basalt, Scoria iyo kuwo kale oo badan.
waxaana laga helaa meelo badan dunida , bariga iyo bartamaha Afrika wuxuu leeyahay waxtar balaadhan iyo adeegsi badan. Gayiga Soomaalida waa laga helaa.
* [https://wol.jw.org/en/wol/d/r1/lp-e/1200003751 ROCK]
[[Category:Jiyooloji]]
[[Category:Cilmiga Macdanta]]
fose0r0my2pxg9vxoj7b9n1zqf52luz
305473
305472
2026-08-17T07:57:22Z
NDG
42075
Reverted edits by [[Special:Contribs/~2026-44983-46|~2026-44983-46]] ([[User talk:~2026-44983-46|talk]]) to last version by 200.24.154.83: unnecessary links or spam
272091
wikitext
text/x-wiki
[[File:GabbroRockCreek1.jpg|thumb|right|500px|dhagax]]
[[File:DirkvdM rocks.jpg|thumb|right|500px|dhagax]]
[[File:Balanced Rock.jpg|thumb|right|500px|dhagax]]
'''Dhagax''' ({{lang-en|'''Rock''' ama '''Stone'''}} {{lang-ar|صخر}}) waa [[adke]] (''solid'') ka sameeysan [[macdan]] badan oo is-heeysata.
Dunidan aan ku nool nahay waxay ka sameeysan tahay [[dhagax]]aan, [[carro]] iyo [[macdan]]o kale.
Dhagaxa ayaa yaraanka marna wuxuu noqon karaa qar iyo buur. carada ayaa ah wax ka yimid dhagax ama qar bururay.
Noocyada dhagaxaanta:
dhagaxaanta waxaa loo qaybiyaa saddex
1. dhagax ku samaysma qaraxa foolkaanaha
2.dhsgax ku ssmsysma xaaqsanka iyo waxyaabaha dega
3. dhagax isbadalay muuqaalkiisu
Dhagaxa Foolkaanaha: dhulka gudihiisa waxaa badan ama sareeya heer kulka iyo cadaadiska , macdan kastaana wacay noqotaa dareere. Dareerahaas waxaa looyaqaan afka qalaad Magma waana dareere holac ah, magmadu markay timaado dhulka korkiisa way qaboowdaa waxayna isku badashaa adke (dhagax) waxaaba looyaqaan dhagaxa igniyoos waana eray kayimid afka Giriiga (Ignious) waa eray macnihiisu yahay dab ama holac. waxaa dhagaxaantan kamida Gabro, Granite, Obsedian, Basalt, Scoria iyo kuwo kale oo badan.
waxaana laga helaa meelo badan dunida , bariga iyo bartamaha Afrika wuxuu leeyahay waxtar balaadhan iyo adeegsi badan. Gayiga Soomaalida waa laga helaa.
* [https://wol.jw.org/en/wol/d/r1/lp-e/1200003751 ROCK]
[[Category:Jiyooloji]]
[[Category:Cilmiga Macdanta]]
b57wv82343zi637mnposjmffchsfq38
Template:Geological range
10
13821
305441
237490
2026-08-16T18:23:56Z
Isma4l
41797
/* */
305441
wikitext
text/x-wiki
<includeonly><span class="noprint"><span style="display:inline-block;">{{{prefix|}}}</span><span style="display:inline-block;">{{{3|{{{text|{{{1}}}{{#if:{{{2|}}}|–{{{2|}}}}}{{#iferror:{{#expr:{{{1}}}}}|| [[Megaannum|Ma]]}}}}}}}}</span>{{{ref|{{{reference|{{{refs|{{{references|}}}}}}}}}}}} <span style="display:inline-block;">{{{PS|{{{ps|}}}}}}</span>{{Phanerozoic 250px}}<!--
Fossil range marker
--><div name=Range style="margin:0 auto; line-height:0; clear:both; width:250px; padding:0px; height:8px; overflow:visible; color:inherit; background-color:transparent; position:relative; top:-4px; z-index:100;">{{Geological range/marker|{{#if:{{{earliest|}}}|{{#iferror:{{#expr:{{{earliest}}}}}|{{period start|{{{earliest}}}}}|{{{earliest}}}}}|{{#iferror:{{#expr:{{{1}}}}}|{{period start|{{{1}}}}}|{{{1}}}}}}}|{{#if:{{{latest|}}}|{{#iferror:{{#expr:{{{latest}}}}}|{{period end|{{{latest}}}}}|{{{latest}}}}}|{{#iferror:{{#expr:{{{2|{{{1}}}}}}}}|{{period end|{{{2|{{{1}}}}}}}}|{{{2|{{{1}}}}}}}}}}|42<!-- This determines the opacity of the bar-->}}
{{Geological range/marker|{{#iferror:{{#expr:{{{1}}}}}|{{period start|{{{1}}}}}|{{{1}}}}}|{{#iferror:{{#expr:{{{2|{{{1}}}}}}}}|{{period end|{{{2|{{{1}}}}}}}}|{{{2|{{{1}}}}}}}}}}
</div>
</div></span></includeonly><noinclude>{{documentation}}</noinclude>
oqygrrx1oh7e5z6ueymbczdw2zu8x97
Module:UserLinks
828
14922
305399
130525
2026-08-16T16:50:47Z
Isma4l
41797
305399
Scribunto
text/plain
--------------------------------------------------------------------------------
-- UserLinks --
-- This module creates a list of links about a given user. It can be used on --
-- its own or from a template. See the /doc page for more documentation. --
--------------------------------------------------------------------------------
-- Require necessary modules
local yesno = require('Module:Yesno')
-- Lazily initialise modules that we might or might not need
local mExtra -- [[Module:UserLinks/extra]]
local mArguments -- [[Module:Arguments]]
local mToolbar -- [[Module:Toolbar]]
local mCategoryHandler -- [[Module:Category handler]]
local mTableTools -- [[Module:TableTools]]
local interwikiTable -- [[Module:InterwikiTable]], loaded with mw.loadData
-- Load shared helper functions
local mShared = require('Module:UserLinks/shared')
local raiseError = mShared.raiseError
local maybeLoadModule = mShared.maybeLoadModule
local makeWikitextError = mShared.makeWikitextError
local makeWikilink = mShared.makeWikilink
local makeUrlLink = mShared.makeUrlLink
local makeFullUrlLink = mShared.makeFullUrlLink
local message = mShared.message
local p = {}
--------------------------------------------------------------------------------
-- Link table
--------------------------------------------------------------------------------
function p.getLinks(snippets)
--[=[
-- Get a table of links that can be indexed with link codes. The table
-- returned is blank, but links are added to it on demand when it is
-- indexed. This is made possible by the metatable and by the various link
-- functions, some of which are defined here, and some of which are defined
-- at [[Module:UserLinks/extra]].
--]=]
local links, linkFunctions = {}, {}
----------------------------------------------------------------------------
-- Link functions
--
-- The following functions make the links from the link codes and the user
-- data snippets. New link functions should be added below the existing
-- functions.
----------------------------------------------------------------------------
function linkFunctions.u(snippets)
-- User page
return makeWikilink(
snippets.interwiki,
2,
snippets.username,
snippets.username
)
end
function linkFunctions.np(snippets)
-- User page (no ping)
return '<span class="plainlinks">' .. makeFullUrlLink(
snippets.interwiki,
2,
snippets.username,
'',
snippets.username
) .. '</span>'
end
function linkFunctions.t(snippets)
-- User talk page
return makeWikilink(
snippets.interwiki,
3,
snippets.username,
message('display-talk')
)
end
function linkFunctions.c(snippets)
-- Contributions
return makeWikilink(
snippets.interwiki,
-1,
'Contribs/' .. snippets.username,
message('display-contributions')
)
end
function linkFunctions.c64(snippets)
-- Contributions
local first64 = snippets.username:match('^%x+:%x+:%x+:%x+:')
or snippets.username:match('^%x+:%x+:%x+:')
or snippets.username:match('^%x+:%x+:')
or snippets.username:match('^%x+:')
return first64 and makeWikilink(
snippets.interwiki,
-1,
'Contribs/' .. first64 .. ':/64',
'(/64)'
) or ''
end
function linkFunctions.ct(snippets)
-- Edit count
return makeWikilink(
'xtools',
0,
'ec/' .. snippets.toolLang .. '.' .. snippets.projectLong .. '.org/' .. snippets.username,
message('display-count')
)
end
function linkFunctions.m(snippets)
-- Page moves
return makeWikilink(
snippets.interwiki,
-1,
'Log/move/' .. snippets.username,
message('display-moves')
)
end
function linkFunctions.l(snippets)
-- Logs
return makeWikilink(
snippets.interwiki,
-1,
'Log/' .. snippets.username,
message('display-logs')
)
end
function linkFunctions.ae(snippets)
-- Automated edits (and non-automated contributions).
return makeWikilink(
'xtools',
0,
'autoedits/' .. snippets.toolLang .. '.' .. snippets.projectLong .. '.org/' .. snippets.username,
message('display-autoedits')
)
end
function linkFunctions.bl(snippets)
-- Block log
return makeFullUrlLink(
snippets.interwiki,
-1,
'Log/block',
{page = 'User:' .. snippets.username},
message('display-blocklog')
)
end
function linkFunctions.bls(snippets)
-- Blocks
return makeWikilink(
snippets.interwiki,
-1,
'Log/block/' .. snippets.username,
message('display-blocks')
)
end
function linkFunctions.bu(snippets)
-- Block user
return makeWikilink(
snippets.interwiki,
-1,
'Block/' .. snippets.username,
message('display-blockuser')
)
end
function linkFunctions.ca(snippets)
-- Central auth
return makeWikilink(
snippets.interwiki,
-1,
'CentralAuth/' .. snippets.username,
message('display-centralauth')
)
end
function linkFunctions.dc(snippets)
-- Deleted contribs
return makeWikilink(
snippets.interwiki,
-1,
'DeletedContributions/' .. snippets.username,
message('display-deletedcontributions')
)
end
function linkFunctions.e(snippets)
-- Email
return makeWikilink(
snippets.interwiki,
-1,
'EmailUser/' .. snippets.username,
message('display-email')
)
end
function linkFunctions.es(snippets)
-- Edit summaries
return makeWikilink(
'xtools',
0,
'editsummary/' .. snippets.toolLang .. '.' .. snippets.projectLong .. '.org/' .. snippets.username,
message('display-editsummaries')
)
end
function linkFunctions.del(snippets)
-- Deletions
return makeWikilink(
snippets.interwiki,
-1,
'Log/delete/' .. snippets.username,
message('display-deletions')
)
end
function linkFunctions.lu(snippets)
-- List user
return makeFullUrlLink(
snippets.interwiki,
-1,
'ListUsers',
{limit = 1, username = snippets.username},
message('display-listuser')
)
end
function linkFunctions.sul(snippets)
-- SUL
return makeWikilink(
nil,
nil,
'sulutil:' .. snippets.username,
message('display-sul')
)
end
function linkFunctions.tl(snippets)
-- Target logs
return makeFullUrlLink(
snippets.interwiki,
-1,
'Log',
{page = mw.site.namespaces[2].name .. ':' .. snippets.username},
message('display-targetlogs')
)
end
function linkFunctions.efl(snippets)
-- Edit filter log
return makeFullUrlLink(
snippets.interwiki,
-1,
'AbuseLog',
{wpSearchUser = snippets.username},
message('display-abuselog')
)
end
function linkFunctions.pr(snippets)
-- Protections
return makeWikilink(
snippets.interwiki,
-1,
'Log/protect/' .. snippets.username,
message('display-protections')
)
end
function linkFunctions.rl(snippets)
-- User rights
return makeWikilink(
snippets.interwiki,
-1,
'Log/rights/' .. snippets.username,
message('display-rights')
)
end
function linkFunctions.ren(snippets)
-- Renames
return makeWikilink(
snippets.interwiki,
-1,
'Log/renameuser/' .. snippets.username,
message('display-renames')
)
end
function linkFunctions.rfa(snippets)
-- Requests for adminship
return makeWikilink(
nil,
-1,
'PrefixIndex/' .. message('page-rfa') .. '/' .. snippets.username,
message('display-rfa')
)
end
function linkFunctions.api(snippets)
-- API user data
return makeUrlLink(
{
host = snippets.fullDomain,
path = '/w/api.php',
query = {
action = 'query',
list = 'users',
usprop = 'groups|editcount',
ususers = snippets.username
}
},
message('display-api')
)
end
function linkFunctions.up(snippets)
-- Uploads
return makeWikilink(
snippets.interwiki,
-1,
'ListFiles/' .. snippets.username,
message('display-uploads')
)
end
function linkFunctions.nuke(snippets)
-- Mass delete/Special:Nuke
return makeWikilink(
snippets.interwiki,
-1,
'Nuke/' .. snippets.username,
message('display-nuke')
)
end
function linkFunctions.gender(snippets)
-- Gender
return mw.getCurrentFrame():callParserFunction(
'GENDER',
snippets.username,
'he/him',
'she/her',
'they/them'
)
end
----------------------------------------------------------------------------
-- End of link functions
----------------------------------------------------------------------------
-- Define the metatable that memoizes the link functions, and fetches link
-- functions from [[Module:UserLinks/extra]] if necessary.
-- Lazily initialise the extraLinkFunctions table. We only want to load
-- [[Module:UserLinks/extra]] as necessary, so it has a low transclusion
-- count.
local extraLinkFunctions
-- Define functions for shared code in the metatable.
local function validateCode(code)
-- Checks whether code is a valid link code - i.e. checks that it is a
-- string and that it is not the blank string. Returns the code if
-- the check passes, and nil if not.
if type(code) == 'string' and code ~= '' then
return code
else
return nil
end
end
local function getExtraLinkFunctions()
-- Loads the table of extra link functions from the /extra module.
-- If there is a problem with loading it, return false. We use the
-- distinction between false and nil to record whether we have already
-- tried to load it.
if extraLinkFunctions ~= nil then
return extraLinkFunctions
end
if mExtra == nil then
-- If loading the module fails, maybeLoadModule returns false.
-- Here we use the distinction between false and nil to record
-- whether we have already tried to load the /extra module.
mExtra = maybeLoadModule('Module:UserLinks/extra')
end
if type(mExtra) == 'table'
and type(mExtra.linkFunctions) == 'table'
then
extraLinkFunctions = mExtra.linkFunctions
else
extraLinkFunctions = false
end
return extraLinkFunctions
end
local function memoizeExtraLink(code, func)
local success, link = pcall(func, snippets)
if success and type(link) == 'string' then
links[code] = link
return link
end
return nil
end
-- Define the metatable.
setmetatable(links, {
__index = function (t, key)
local code = validateCode(key)
if not code then
raiseError(
message('error-malformedlinkcode'),
message('error-malformedlinkcode-section')
)
end
local linkFunction = linkFunctions[code]
local link
if linkFunction then
link = linkFunction(snippets)
links[code] = link
else
extraLinkFunctions = getExtraLinkFunctions()
if extraLinkFunctions then
local extraLinkFunction = extraLinkFunctions[code]
if type(extraLinkFunction) == 'function' then
link = memoizeExtraLink(code, extraLinkFunction)
end
end
end
if link then
return link
else
raiseError(
message('error-invalidlinkcode', code),
message('error-invalidlinkcode-section')
)
end
end,
__pairs = function ()
extraLinkFunctions = getExtraLinkFunctions()
if extraLinkFunctions then
for code, func in pairs(extraLinkFunctions) do
if validateCode(code) and type(func) == 'function' then
memoizeExtraLink(code, func)
end
end
end
-- Allow built-in functions to overwrite extra functions.
for code, func in pairs(linkFunctions) do
local link = func(snippets)
links[code] = link
end
return function (t, key)
return next(links, key)
end
end
})
return links
end
--------------------------------------------------------------------------------
-- User data snippets
--------------------------------------------------------------------------------
function p.getSnippets(args)
--[=[
-- This function gets user data snippets from the arguments, and from
-- [[Module:InterwikiTable]]. The data is loaded as necessary and memoized
-- in the snippets table for performance.
--
-- Snippets default to the blank string, '', so they can be used in
-- concatenation operations without coders having to worry about raising
-- errors. Because of this, the local functions snippetExists and
-- getSnippet have been written to aid people writing new snippets. These
-- functions treat the blank string as false. It is not necessary to return
-- the blank string from a snippet function, as nil and false values are
-- automatically converted into the blank string by the metatable.
--
-- If you add a new snippet, please document it at
-- [[Module:UserLinks#Adding new links]].
--]=]
local snippets, snippetFunctions = {}, {}
setmetatable(snippets, {
__index = function (t, key)
local snippetFunction = snippetFunctions[key]
if snippetFunction then
snippets[key] = snippetFunction() or ''
return snippets[key]
else
raiseError(
message('error-nosnippet', key),
message('error-nosnippet-section')
)
end
end
})
-- Define helper functions for writting the snippet functions.
local function snippetExists(key)
-- We have set the metatable up to make snippets default to '', so we
-- don't have to test for false or nil.
return snippets[key] ~= ''
end
local function getSnippet(key)
local ret = snippets[key]
if ret == '' then
return nil
else
return ret
end
end
-- Start snippet functions.
function snippetFunctions.username()
-- The username.
local username = args.user or args.User
return username or raiseError(
message('error-nousername'),
message('error-nousername-section')
)
end
function snippetFunctions.usernameHtml()
-- The username html-encoded. Spaces are encoded as pluses.
return mw.uri.encode(snippets.username)
end
function snippetFunctions.project()
-- The project name.
-- Also does the work for snippetFunctions.interwikiTableKey, and adds
-- the project value to snippets.lang if it is a valid language code.
local project = args.Project or args.project
if not project then
return nil
end
local projectValidated, interwikiTableKey = p.validateProjectCode(project)
if not projectValidated then
if mw.language.isKnownLanguageTag(project) then
if not snippetExists('lang') then
snippets.lang = project
end
else
raiseError(
message('error-invalidproject', project),
message('error-invalidproject-section')
)
end
end
snippets.interwikiTableKey = interwikiTableKey
return project
end
function snippetFunctions.interwikiTableKey()
-- The key for the project in Module:InterwikiTable.
-- Relies on snippetFunctions.project to do the real work.
local temp = snippets.project -- required; puts key in snippets table
return rawget(snippets, 'interwikiTableKey')
end
function snippetFunctions.toolProject()
-- The short project code for use with toolserver or labs. It is always
-- present, even if the "project" argument is absent. The default value
-- is the "snippet-project-default" message.
local project = getSnippet('project')
if not project then
return message('snippet-project-default')
else
return project
end
end
function snippetFunctions.projectLong()
-- The long form of the project name, e.g. "wikipedia" or "wikibooks".
local key = getSnippet('interwikiTableKey')
if not key then
return message('snippet-projectlong-default')
end
interwikiTable = interwikiTable or mw.loadData('Module:InterwikiTable')
local prefixes = interwikiTable[key].iw_prefix
-- Using prefixes[2] is a bit of a hack, but should find the long name
-- most of the time.
return prefixes[2] or prefixes[1]
end
function snippetFunctions.lang()
-- The language code.
local lang = args.lang or args.Lang
if not lang then
return nil
end
if mw.language.isKnownLanguageTag(lang) then
return lang
else
raiseError(
message('error-invalidlanguage', lang),
message('error-invalidlanguage-section')
)
end
end
function snippetFunctions.toolLang()
-- The language code for use with toolserver or labs tools. It is always
-- present, even if the "lang" argument is absent. The default value is
-- the "snippet-lang-default" message.
return getSnippet('lang') or message('snippet-lang-default')
end
function snippetFunctions.interwiki()
-- The interwiki prefix, consisting of the project and language values,
-- separated by colons, e.g. ":wikt:es:".
local project = getSnippet('project')
local lang = getSnippet('lang')
if not project and not lang then
return nil
end
local ret = {}
ret[#ret + 1] = project
ret[#ret + 1] = lang
return table.concat(ret, ':')
end
function snippetFunctions.fullDomain()
-- The full domain name of the site, e.g. www.mediawiki.org,
-- en.wikipedia.org, or ja.wikibooks.org.
local fullDomain
local lang = getSnippet('toolLang')
local key = getSnippet('interwikiTableKey')
if key then
interwikiTable = interwikiTable or mw.loadData('Module:InterwikiTable')
local domain = interwikiTable[key].domain
local takesLangPrefix = interwikiTable[key].takes_lang_prefix
if takesLangPrefix then
fullDomain = lang .. '.' .. domain
else
fullDomain = domain
end
else
fullDomain = lang .. '.wikipedia.org'
end
return fullDomain
end
-- End snippet functions. If you add a new snippet function, please
-- document it at [[Module:UserLinks#Adding new links]].
return snippets
end
function p.validateProjectCode(s)
-- Validates a project code, by seeing whether it is present in
-- [[Module:InterwikiTable]]. If it is present, returns the code and the
-- InterwikiTable key for the corresponding site. If not present,
-- returns nil for both.
interwikiTable = interwikiTable or mw.loadData('Module:InterwikiTable')
for key, t in pairs(interwikiTable) do
for i, prefix in ipairs(t.iw_prefix) do
if s == prefix then
return s, key
end
end
end
return nil, nil
end
--------------------------------------------------------------------------------
-- Main functions
--------------------------------------------------------------------------------
local function makeInvokeFunction(funcName)
-- Makes a function that can be accessed from #invoke. This is only required
-- for functions that need to access arguments.
return function (frame)
mArguments = require('Module:Arguments')
local args = mArguments.getArgs(frame)
return p[funcName](args)
end
end
p.main = makeInvokeFunction('_main')
function p._main(args)
-- The main function. This is the one called from [[Template:User-multi]],
-- via p.main.
local options = p.getOptions(args)
local snippets = p.getSnippets(args)
local codes = p.getCodes(args)
local links = p.getLinks(snippets)
-- Overload the built-in Lua error function to generate wikitext errors
-- meant for end users to see. This makes things harder to debug when
-- real errors occur, but it is the only realistic way to show wikitext
-- errors and and still have sane code when using metatables, etc.
local success, result = pcall(p.export, codes, links, options)
if success then
return result
else
return makeWikitextError(result, options.isDemo)
end
end
function p.getOptions(args)
-- Gets the options from the args table, so that we don't have to pass
-- around the whole args table all the time.
local options = {}
options.isDemo = yesno(args.demo) or false
options.noPing = yesno(args.noPing) or yesno(args.noping) or yesno(args.np) or false
options.toolbarStyle = yesno(args.small) and 'font-size: 90%;' or nil
options.sup = yesno(args.sup, true)
options.separator = args.separator
options.span = args.span
return options
end
function p.getCodes(args)
-- Gets the link codes from the arguments. The codes aren't validated
-- at this point.
mTableTools = maybeLoadModule('Module:TableTools')
local codes
if mTableTools then
codes = mTableTools.compressSparseArray(args)
else
codes = {}
for i, code in ipairs(args) do
codes[i] = code
end
end
return codes
end
function p.export(codes, links, options)
-- Make the user link.
local userLink = options.noPing and links.np or links.u
-- If we weren't passed any link codes, just return the user link.
if #codes < 1 then
return userLink
end
-- Make the toolbar.
mToolbar = require('Module:Toolbar')
local toolbarArgs = {}
for i, code in ipairs(codes) do
local link = links[code]
toolbarArgs[#toolbarArgs + 1] = link
end
toolbarArgs.style = options.toolbarStyle
toolbarArgs.separator = options.separator or 'dot'
toolbarArgs.span = options.span
local toolbar = mToolbar.main(toolbarArgs)
-- Apply the sup option.
if options.sup then
toolbar = '<sup>' .. toolbar .. '</sup>'
end
-- If we are transcluding, add a non-breaking space, but if we are substing
-- just use a normal space
local space = mw.isSubsting() and ' ' or ' '
return userLink .. space .. toolbar
end
--------------------------------------------------------------------------------
-- Single link function
--------------------------------------------------------------------------------
p.single = makeInvokeFunction('_single')
function p._single(args)
-- Fetches a single link from the link table.
local options = p.getOptions(args)
local snippets = p.getSnippets(args)
local links = p.getLinks(snippets)
local code = args[1]
local success, link = pcall(p.exportSingle, links, code)
if success then
return link
else
return makeWikitextError(link, options.isDemo)
end
end
function p.exportSingle(links, code)
-- If any errors occur, they will probably occur here. This function
-- exists purely so that all the errors that will occur in p._single can
-- be handled using a single pcall.
if not code then
raiseError(
message('error-nolinkcode'),
message('error-nolinkcode-section')
)
end
return links[code]
end
return p
5h8mbrwn868uvowfcb9wudu5kq4bpx5
Module:UserLinks/shared
828
14923
305400
130526
2026-08-16T16:53:01Z
Isma4l
41797
305400
Scribunto
text/plain
-- This module stores functions that are shared between [[Module:UserLinks]]
-- and [[Module:UserLinks/extra]].
-- Load data and define often-used variables
local cfg = mw.loadData('Module:UserLinks/config')
local namespaces = mw.site.namespaces
-- Lazily initialise modules that we may or may not need
local mCategoryHandler
-- Define namespaces for which links need to be escaped with the colon trick.
-- See [[w:en:Help:Colon trick]].
local colonNamespaces = {
[6] = true, -- File
[14] = true, -- Category
}
local p = {}
function p.maybeLoadModule(s)
-- Attempts to load the module s. If it succeeds, returns the module;
-- otherwise, returns false.
local success, mdl = pcall(require, s)
if success then
return mdl
else
return false
end
end
function p.raiseError(message, section, level)
-- Raises an error using the Lua error function. The error message is
-- designed to be caught with pcall and then passed to p.makeWikitextError.
-- The section, if specified, is the section name on a help page that gives
-- help to users about that particular error.
if section then
message = message .. '|' .. section
end
if not level or level == 0 then
level = 0
else
level = level + 1
end
error(message, level)
end
local localBlacklist = {
'/[sS]andbox$', -- Don't categorise sandboxes
'/[tT]est ?cases$', -- Don't categorise test case pages
}
local function currentTitleMatchesLocalBlacklist()
-- Return true if the current title matches any of the patterns in the
-- local blacklist table. Otherwise return false.
local title = mw.title.getCurrentTitle().prefixedText
for i, pattern in ipairs(localBlacklist) do
if title:find(pattern) then
return true
end
end
return false
end
function p.makeWikitextError(encodedMessage, demo)
local errorMessage, section = mw.ustring.match(encodedMessage, '^(.-)|(.*)$')
errorMessage = errorMessage or encodedMessage
-- If not a demo, get the error category link and pass it through
-- [[Module:Category handler]]'s blacklist.
local category
if not demo then
category = string.format(
'[[%s:%s]]',
namespaces[14].name,
p.message('error-config-category')
)
mCategoryHandler = p.maybeLoadModule('Module:Category handler')
if mCategoryHandler then
-- Categorise all namespaces, but not blacklisted pages.
category = mCategoryHandler.main{all = category}
end
if category and currentTitleMatchesLocalBlacklist() then
category = nil
end
end
category = category or ''
-- Format the error message and the section link.
local formattedError
if section then
formattedError = p.message(
'error-config-message-help',
errorMessage,
section
)
else
formattedError = p.message(
'error-config-message-nohelp',
errorMessage
)
end
-- Return the error message and the category inside html error tags.
return string.format(
'<strong class="error">%s</strong>%s',
formattedError,
category
)
end
local function formatPage(interwiki, namespace, page)
-- Formats an interwiki, a namespace and a page into a wikilink-ready
-- string. The interwiki and namespace are optional. If a namespace is
-- specified, it should be a valid key to mw.site.namespaces. The page
-- parameter is required.
local ret = {}
interwiki = interwiki or ''
if interwiki ~= '' or colonNamespaces[namespace] then
ret[#ret + 1] = ':'
end
ret[#ret + 1] = interwiki
if interwiki ~= '' then
ret[#ret + 1] = ':'
end
if namespace then
local nsTable = namespaces[namespace]
if not nsTable then
error('"' .. tostring(namespace) .. '" is not a valid namespace key', 2)
end
ret[#ret + 1] = nsTable.name
if namespace ~= 0 then
ret[#ret + 1] = ':'
end
end
ret[#ret + 1] = page
return table.concat(ret)
end
local function formatDisplay(s)
-- Replaces spaces in a string with " " to make sure they don't wrap.
-- Don't replace anything if we are substing, as we generally don't want
-- to use " " in that case.
if mw.isSubsting() then
return s
else
return s:gsub(' ', ' ')
end
end
function p.makeWikilink(interwiki, namespace, page, display)
-- Creates a wikilink. The interwiki, namespace and display parameters are
-- optional. If a namespace parameter is specified it must be a valid key
-- to mw.site.namespaces.
local formattedPage = formatPage(interwiki, namespace, page)
if display then
display = formatDisplay(display)
return string.format('[[%s|%s]]', formattedPage, display)
else
return string.format('[[%s]]', formattedPage)
end
end
local function formatUrlLink(url, display)
-- Formats a URL link with an optional display parameter.
if display then
display = formatDisplay(display)
return string.format('[%s %s]', url, display)
else
return string.format('[%s]', url)
end
end
function p.makeUrlLink(s, display)
-- Makes a URL link with an optional display parameter. The first input
-- may be any valid input to mw.uri.new.
local url = mw.uri.new(s)
url = tostring(url)
return formatUrlLink(url, display)
end
function p.makeFullUrlLink(interwiki, namespace, page, query, display)
-- Makes a link to the full URL of a page. The interwiki, namespace, query
-- and display parameters are optional. If a namespace parameter is
-- specified it must be a valid key to mw.site.namespaces. The query
-- parameter can be a string or a table as specified in the mw.uri library.
local formattedPage = formatPage(interwiki, namespace, page)
local url = mw.uri.fullUrl(formattedPage, query)
url = tostring(url)
return formatUrlLink(url, display)
end
function p.message(key, ...)
-- Returns the message with the given key from [[Module:UserLinks/config]].
-- Extra parameters are substituted in the message for keys $1, $2, $3, etc.
local msg = cfg[key]
if not msg then
p.raiseError(
'No message found with key "' .. tostring(key) .. '"',
'No message found',
2
)
end
local noArgs = select('#', ...)
if noArgs < 1 then
return msg
else
local msg = mw.message.newRawMessage(msg, ...)
return msg:plain()
end
end
return p
p8dn9pg27a69jmef1uchzuh09gbaidm
Module:UserLinks/config
828
14924
305401
130527
2026-08-16T16:53:41Z
Isma4l
41797
305401
Scribunto
text/plain
--------------------------------------------------------------------------------
-- UserLinks configuration --
-- This module provides configuration and localisation messages for --
-- [[Module:UserLinks]]. See the comments in the code below for explanations --
-- of what each message does. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Display values --
-- These messages are the display values for the user links. These are the --
-- most visible messages in the module. They should be short, but --
-- descriptive. Spaces are automatically escaped with , so there is no --
-- need to add any &nsbp; values here. --
--------------------------------------------------------------------------------
-- The user talk page.
cfg['display-talk'] = 'talk'
-- The user's contributions.
cfg['display-contributions'] = 'contribs'
-- The user's edit count, using the edit count tool on WMF Labs.
cfg['display-count'] = 'count'
-- Log of the user's page moves.
cfg['display-moves'] = 'page moves'
-- All the user's logged actions.
cfg['display-logs'] = 'logs'
-- Analysis of the user's (non-)automated contributions.
cfg['display-autoedits'] = 'non-automated edits'
-- The user's block log.
cfg['display-blocklog'] = 'block log'
-- Blocks that the user has performed.
cfg['display-blocks'] = 'blocks'
-- Link to the interface where the user can be blocked.
cfg['display-blockuser'] = 'block user'
-- CentralAuth, the global account manager for the user.
cfg['display-centralauth'] = 'central auth'
-- The user's deleted contributions.
cfg['display-deletedcontributions'] = 'deleted contribs'
-- Likn to email the user.
cfg['display-email'] = 'email'
-- Analysis of the user's edit summaries, using the tool on WMF Labs.
cfg['display-editsummaries'] = 'edit summaries'
-- Label before links for former administrators
cfg['display-formeradmin'] = 'former admin:'
-- Deletions that the user has performed.
cfg['display-deletions'] = 'deletions'
-- Log of rights changes performed on the user
cfg['display-localrights'] = 'local rights'
-- The user's entry on [[Special:ListUsers]].
cfg['display-listuser'] = 'list user'
-- Log of rights changes performed on the user on Meta-Wiki
cfg['display-metarights'] = 'meta'
-- A display of the user's global contributions, using the sulutil: interwiki
-- prefix.
cfg['display-sul'] = 'global contribs'
-- All logs of actions performed on the user or their user page.
cfg['display-targetlogs'] = 'target logs'
-- Log of times the user has triggered the AbuseFilter (also known as the
-- edit filter).
cfg['display-abuselog'] = 'filter log'
-- Page protections that the user has performed.
cfg['display-protections'] = 'protections'
-- Log of rights changes that the user has performed.
cfg['display-rights'] = 'rights'
-- Log of username changes that the user has performed.
cfg['display-renames'] = 'renames'
-- Link to a list of the user's requests for adminship.
cfg['display-rfa'] = 'RfA'
-- Data about the user from the MediaWiki Web API.
cfg['display-api'] = 'api'
-- List of the user's local file uploads.
cfg['display-uploads'] = 'uploads'
-- List of the user's local file uploads.
cfg['display-nuke'] = 'nuke contribs'
--------------------------------------------------------------------------------
-- Page names --
-- Page names used in formatting some of the user links. --
--------------------------------------------------------------------------------
-- The base page for a request for adminship link. This assumes that the link
-- is of the format [[Base page/username]]. If your wiki uses a different
-- format, consider adding a new link at [[Module:UserLinks/extra]], or you can
-- leave a message at [[w:en:Template talk:User-multi]] to ask the module
-- developers how best to deal with it.
cfg['page-rfa'] = 'Wikipedia:Requests for adminship'
--------------------------------------------------------------------------------
-- Error messages --
-- The following are error messages that may occur when the module is run. --
-- These are the more common error messages that are localisable; other, --
-- rarer error messages may be raised from other modules or directly from --
-- Lua. The messages ending with "section" are the section names on a help --
-- page that give advice to users who encounter the error. The help page is --
-- defined in the 'error-config-message-help' message. --
--------------------------------------------------------------------------------
-- The module didn't detect a username from the "user" or "User" parameters.
-- This could be because no username was specified, or because the user used a
-- positional parameter and their username contains an equals sign,
-- e.g. {{user|John=Smith}}, rather than {{user|1=John=Smith}}.
cfg['error-nousername'] = 'no username detected'
cfg['error-nousername-section'] = 'No username detected'
-- The input to the "project" or "Project" arguments wasn't a valid interwiki
-- prefix or a valid language code. $1 is the code that was input to the module.
cfg['error-invalidproject'] = '"$1" is not a valid project or language code'
cfg['error-invalidproject-section'] = 'Not a valid project or language code'
-- The input to the "lang" or "Lang" arguments wasn't a valid interwiki
-- prefix or a valid language code. $1 is the code that was input to the module.
cfg['error-invalidlanguage'] = '"$1" is not a valid language code'
cfg['error-invalidlanguage-section'] = 'Not a valid language code'
-- The user didn't specify any link codes. This is only an error when using the
-- "single" function to return a single link; the "main" function includes a
-- user page link by default.
cfg['error-nolinkcode'] = 'no link code specified'
cfg['error-nolinkcode-section'] = 'No link code specified'
-- The link code passed to the module was malformed. This means it was either
-- not a string value or it was the blank string.
cfg['error-malformedlinkcode'] = 'malformed link code detected'
cfg['error-malformedlinkcode-section'] = 'Malformed link code detected'
-- No link function exists for the code specified, so the module cannot make
-- the link. $1 is the code that was passed to the module.
cfg['error-invalidlinkcode'] = '"$1" is not a valid link code'
cfg['error-invalidlinkcode-section'] = 'Not a valid link code'
-- The snippets table was accessed, but there was no value for the key it was
-- accessed with. This is not usually visible by end users; it is probably a
-- mistake in one of the link functions in [[Module:UserLinks/extra]]. $1 is the
-- key that was passed to the module.
cfg['error-nosnippet'] = 'no snippet exists for the key "$1"'
cfg['error-nosnippet-section'] = 'No snippet exists'
--------------------------------------------------------------------------------
-- Error configuration --
-- Configuration for the display of the error messages. --
--------------------------------------------------------------------------------
-- The error message used when a section link is available. $1 is the error
-- message, and $2 is the name of the section.
cfg['error-config-message-help'] = '[[Template:User-multi|User-multi]] error:'
.. ' $1 ([[Template:User-multi#$2|help]]).'
-- The error message used when ano section link is available. $1 is the error
-- message.
cfg['error-config-message-nohelp'] = '[[Template:User-multi|User-multi]] error:'
.. ' $1.'
-- The name of the error category. Pages are put in this category if any errors
-- are encountered.
cfg['error-config-category'] = 'UserLinks transclusions with errors'
--------------------------------------------------------------------------------
-- Snippet defaults --
-- Some of the snippets require default values when the user doesn't specify --
-- "project" or "lang" arguments. Those default values are stored here. --
--------------------------------------------------------------------------------
-- The short project interwiki prefix.
cfg['snippet-project-default'] = 'w'
-- The long project interwiki prefix.
cfg['snippet-projectlong-default'] = 'wikipedia'
-- The MediaWiki language code for the wiki.
cfg['snippet-lang-default'] = 'en'
--------------------------------------------------------------------------------
-- End configuration --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
76qhv87sftwvtpwqnnxmeife8gpnkhf
Template:End tab
10
16072
305443
294821
2026-08-16T18:27:35Z
Isma4l
41797
/* */
305443
wikitext
text/x-wiki
<includeonly><!--
-->{{clear}}</div><!-- closing div#1 for "|frame=yes" in [[Template:Start tab]]
-->{{#if:{{{URL-1|{{{link-1|}}}}}}|<div style="float:right; margin-top: 0.0em; margin-bottom:3px; background-color: {{{off tab color|{{{Off tab color|var(--background-color-base,#CEE0F2)}}}}}}; color:var(--color-base,#202122); padding: .2em .6em; font-size: 130%; border: {{{border|1px solid #a3b1bf}}}; {{#if:{{{rounding|}}}|border-radius: {{{rounding}}};}}">Next page: {{#switch:{{FULLPAGENAME}}
|{{{URL-1|{{{link-1|}}}}}}=[[{{{link-2|{{{URL-2|{{{URL-End|{{{URL-1}}}}}}}}}}}}|'''{{{tab-2|{{{Tab-2|{{{Tab-End|{{{Tab-1}}}}}}}}}}}}''']]
|{{{URL-2|{{{link-2|}}}}}}=[[{{{link-3|{{{URL-3|{{{URL-End|{{{URL-1}}}}}}}}}}}}|'''{{{tab-3|{{{Tab-3|{{{Tab-End|{{{Tab-1}}}}}}}}}}}}''']]
|{{{URL-3|{{{link-3|}}}}}}=[[{{{link-4|{{{URL-4|{{{URL-End|{{{URL-1}}}}}}}}}}}}|'''{{{tab-4|{{{Tab-4|{{{Tab-End|{{{Tab-1}}}}}}}}}}}}''']]
|{{{URL-4|{{{link-4|}}}}}}=[[{{{link-5|{{{URL-5|{{{URL-End|{{{URL-1}}}}}}}}}}}}|'''{{{tab-5|{{{Tab-5|{{{Tab-End|{{{Tab-1}}}}}}}}}}}}''']]
|{{{URL-5|{{{link-5|}}}}}}=[[{{{link-6|{{{URL-6|{{{URL-End|{{{URL-1}}}}}}}}}}}}|'''{{{tab-6|{{{Tab-6|{{{Tab-End|{{{Tab-1}}}}}}}}}}}}''']]
|{{{URL-6|{{{link-6|}}}}}}=[[{{{link-7|{{{URL-7|{{{URL-End|{{{URL-1}}}}}}}}}}}}|'''{{{tab-7|{{{Tab-7|{{{Tab-End|{{{Tab-1}}}}}}}}}}}}''']]
|{{{URL-7|{{{link-7|}}}}}}=[[{{{link-8|{{{URL-8|{{{URL-End|{{{URL-1}}}}}}}}}}}}|'''{{{tab-8|{{{Tab-8|{{{Tab-End|{{{Tab-1}}}}}}}}}}}}''']]
|{{{URL-8|{{{link-8|}}}}}}=[[{{{link-9|{{{URL-9|{{{URL-End|{{{URL-1}}}}}}}}}}}}|'''{{{tab-9|{{{Tab-9|{{{Tab-End|{{{Tab-1}}}}}}}}}}}}''']]
|{{{URL-9|{{{link-9|}}}}}}=[[{{{link-10|{{{URL-10|{{{URL-End|{{{URL-1}}}}}}}}}}}}|'''{{{tab-10|{{{Tab-10|{{{Tab-End|{{{Tab-1}}}}}}}}}}}}''']]
|#default
|{{{URL-10|{{{link-10|}}}}}}=[[{{{link-1|{{{URL-End|{{{URL-1}}}}}}}}}|'''{{{Tab-End|{{{tab-1|{{{Tab-1}}}}}}}}}''']]
}}<span style="font-size: larger; font-weight: bold;">→</span><!--
-->{{clear}}</div>|{{clear}}}}</div><!-- closing div#2 for "|frame=yes" in [[Template:Start tab]] --></includeonly><noinclude>
{{Documentation|Template:Start tab/doc}}
</noinclude>
bi08hoeypgo38dqs20rswb18nsvgpa3
Heshiiska Paris
0
23972
305396
209558
2026-08-16T12:24:20Z
Lilbaaji1music
46955
/* growthexperiments-addlink-summary-summary:2|0|1 */
305396
wikitext
text/x-wiki
'''Heshiiska Paris'''
https://unfccc.int/process-and-meetings/the-paris-agreement/the-paris-agreement
[[File:CO2 emission pie chart.svg|thumb|275px| c02 s02, qiq dunida]]
[[File:CO2 responsibility 1950-2000.svg|thumb|co2 s02 qiq dunida]]
'''Heshiiska Paris''' ([[Faransiiska]]: Accord de Paris) [3] waa heshiis ku jira Heshiiskii Qaramada Midoobay ee Isbeddelka Cimilada (UNFCCC) ee la xariira dhimirka gaaska aqalka dhirta lagu koriyo, iswaafajinta, iyo maaliyadda laga bilaabo sanadka 2020. Luqada heshiiska waxaa ka wada xaajooday wakiillo ka socda 196 xisbi qaran oo ka socday Shirweynihii 21aad ee Qaybaha UNFCCC ee Le Bourget, oo u dhow Paris, Faransiiska, waxaana lagu ansaxiyey 12-kii December 2015. [5] Laga soo bilaabo Juun 2018, 195 xubnood oo UNFCCC ah ayaa saxiixay heshiiska, 178na waxay u noqdeen kuwo ka soo horjeeda [1] Heshiiska Paris wuxuu ujeedkiisu yahay himilada muddada fog ee lagu hayo korodhka celceliska celceliska heerkulka caalamiga ah si aad uga hooseeya 2 ° C oo ka sarreysa heerarka hore ee warshadaha; iyo ujeedadeedu tahay in la xaddido kororka ilaa 1.5 ° C, maaddaama tani ay si weyn u yareeyn doonto khatarta iyo saameynta isbedelka [[Cimilo|cimilada]].
Heshiiska Paris, waddan kasta wuxuu go'aamiyaa, qorsheyaashana si joogta ah u soo sheegaa waxqabadkiisa ay tahay inuu sameeyo si loo yareeyo kululaynta caalamiga ah [6] Ma jiro wax farsamo ah oo lagu khasbayo [7] dal in uu dejiyo bartilmaameed gaar ah taariikh gaar ah, [8] laakiin bartilmaameed kasta waa inuu ka baxsan yahay bartilmaameedyada hore. Bishii Juun ee 2017, Madaxweynaha Maraykanka Donald Trump ayaa ku dhawaaqay inuu doonayo inuu dalka ka baxo heshiiska. Heshiiskaan, taariikhda ugu waxtarka badan ee dib u soo noqoshada Mareykanka waa Nofeembar 2020, wax yar ka hor dhammaadka xilliga xilka Madaxweynaha Trump.
== Macaduwan Heshinka ==
* https://unfccc.int/sites/default/files/english_paris_agreement.pdf
* https://unfccc.int/sites/default/files/spanish_paris_agreement.pdf
==Sido kale fiiri==
pgecw2apj3zftbs53n1j9ff3da9s7nx
Module:Cat main
828
30474
305415
201132
2026-08-16T17:36:05Z
Isma4l
41797
305415
Scribunto
text/plain
-- This module implements {{Category main article}}.
local mHatnote = require('Module:Hatnote')
local mFormatLink = require('Module:Format link')
local yesno = require('Module:Yesno')
local mTableTools -- lazily initialise
local mArguments -- lazily initialise
local p = {}
-- Helper: true if the page is in Template: or Module: namespace
local function isTemplateOrModule(title)
local t = (type(title) == 'string' and title) or (title and title.prefixedText) or ''
if t == '' then
return false
end
local ok, tt = pcall(mw.title.new, t)
if not ok or not tt then
return false
end
local ns = tt.namespace
return ns == 10 or ns == 828
end
function p.catMain(frame)
mTableTools = require('Module:TableTools')
mArguments = require('Module:Arguments')
-- Grab args
local args = mArguments.getArgs(frame, {wrappers = 'Template:Category main article'})
local pages = mTableTools.compressSparseArray(args)
if #pages == 0 and args[1] then
pages = { args[1] }
end
local options = {
article = args.article,
selfref = args.selfref,
_rawPages = pages,
}
-- Determine the outer page (the page using the template)
local thisTitle = frame and frame.getParent and frame:getParent() and frame:getParent().title or mw.title.getCurrentTitle()
local titleText = thisTitle and thisTitle.prefixedText or ''
local ns = thisTitle and thisTitle.namespace or nil
-- Skip tracking categories on template/module pages
local isTemplate = isTemplateOrModule(titleText)
-- Remember original arg count
local origCount = #pages
-- Generate hatnote text
local text, firstLink, usedAutoFill = p._catMain(options, thisTitle, unpack(pages))
if isTemplate then
-- On templates/modules, just return the hatnote (no tracking categories)
return text
end
-- Add tracking categories
local cats = {}
-- Wrong namespace detection (Article, Draft)
if ns == 0 or ns == 118 then
table.insert(cats, '[[Category:Articles using category hatnotes]]')
end
-- Title mismatch detection
if firstLink and (origCount == 1 or (origCount == 0 and usedAutoFill)) then
local function normalizeTitle(s)
return (s or ''):gsub('^%s+', ''):gsub('%s+$', ''):gsub('^[^:]*:', ''):gsub('%s+', ' '):gsub('^%l', string.upper)
end
local compareStr
if usedAutoFill then
compareStr = normalizeTitle(firstLink)
else
local raw = (options._rawPages and options._rawPages[1]) or firstLink
compareStr = normalizeTitle(raw:gsub("|.*", ""))
end
local catName = normalizeTitle(thisTitle and thisTitle.text or '')
if compareStr ~= catName then
table.insert(cats, '[[Category:Category main article does not match category title]]')
end
end
if #cats > 0 then
text = text .. '\n' .. table.concat(cats, '\n')
end
return text
end
function p._catMain(options, thisTitle, ...)
options = options or {}
local pages = {...}
thisTitle = thisTitle or mw.title.getCurrentTitle()
local fullTitle = thisTitle and thisTitle.prefixedText or ''
local thisText = thisTitle and thisTitle.text or (pages[1] or '')
local isTemplate = isTemplateOrModule(fullTitle)
-- Red link detection
local rawLinks = mFormatLink.formatPages({
categorizeMissing = not isTemplate and 'Categories with hatnote templates targeting a non-existent page' or nil
}, pages)
-- Convert to plain strings
local links = {}
for i, link in ipairs(rawLinks or {}) do
links[i] = tostring(link)
end
-- Auto-fill if empty
local firstOutputLink = nil
local usedAutoFill = false
if not links[1] or links[1] == '' then
local title = mw.title.new(thisText)
if title and title.isRedirect then
title = title.redirectTarget
end
firstOutputLink = title and title.text or thisText
usedAutoFill = true
links[1] = tostring(mFormatLink._formatLink{
link = firstOutputLink,
categorizeMissing = not isTemplate and 'Categories with hatnote templates targeting a non-existent page' or nil
})
pages = { firstOutputLink }
else
local visible = links[1]
visible = visible:gsub("^'''", ""):gsub("'''$", "")
visible = visible:gsub("%[%[", ""):gsub("%]%]", "")
visible = visible:gsub("|.*$", "")
visible = visible:gsub("#.*$", "")
firstOutputLink = visible
usedAutoFill = false
end
-- Bold links
for i, link in ipairs(links) do
links[i] = string.format("'''%s'''", link)
end
-- Determine pagetype
local pagetype
if options.article ~= nil then
pagetype = yesno(options.article) ~= false and 'article' or 'page'
elseif pages and pages[1] then
local page = pages[1]:gsub("|.*","")
local tt = mw.title.new(page)
pagetype = tt and tt.namespace == 0 and "article" or "page"
else
pagetype = "article"
end
-- Work out whether we need to be singular or plural
local stringToFormat
if #links > 1 then
stringToFormat = 'The main %ss for this [[Help:Categories|category]] are %s.'
else
stringToFormat = 'The main %s for this [[Help:Categories|category]] is %s.'
end
-- Build hatnote text
local text = string.format(
stringToFormat,
pagetype,
mw.text.listToText(links)
)
-- Pass through Module:Hatnote
local hnOptions = { selfref = options.selfref }
text = mHatnote._hatnote(text, hnOptions)
return text, firstOutputLink, usedAutoFill
end
return p
olrtro1zfdkuz89uoqbww6bq8ppsafd
305417
305415
2026-08-16T17:39:46Z
Isma4l
41797
305417
Scribunto
text/plain
-- Modulkan wuxuu dhaqangeliyaa {{Maqaalka weyn ee qeybta}}.
local mHatnote = require('Module:Hatnote')
local mFormatLink = require('Module:Format link')
local yesno = require('Module:Yesno')
local mTableTools -- lazily initialise
local mArguments -- lazily initialise
local p = {}
-- Helper: true if the page is in Template: or Module: namespace
local function isTemplateOrModule(title)
local t = (type(title) == 'string' and title) or (title and title.prefixedText) or ''
if t == '' then
return false
end
local ok, tt = pcall(mw.title.new, t)
if not ok or not tt then
return false
end
local ns = tt.namespace
return ns == 10 or ns == 828
end
function p.catMain(frame)
mTableTools = require('Module:TableTools')
mArguments = require('Module:Arguments')
-- Grab args
local args = mArguments.getArgs(frame, {wrappers = 'Template:Maqaalka weyn ee qeybta'})
local pages = mTableTools.compressSparseArray(args)
if #pages == 0 and args[1] then
pages = { args[1] }
end
local options = {
article = args.article,
selfref = args.selfref,
_rawPages = pages,
}
-- Determine the outer page (the page using the template)
local thisTitle = frame and frame.getParent and frame:getParent() and frame:getParent().title or mw.title.getCurrentTitle()
local titleText = thisTitle and thisTitle.prefixedText or ''
local ns = thisTitle and thisTitle.namespace or nil
-- Skip tracking categories on template/module pages
local isTemplate = isTemplateOrModule(titleText)
-- Remember original arg count
local origCount = #pages
-- Generate hatnote text
local text, firstLink, usedAutoFill = p._catMain(options, thisTitle, unpack(pages))
if isTemplate then
-- On templates/modules, just return the hatnote (no tracking categories)
return text
end
-- Add tracking categories
local cats = {}
-- Wrong namespace detection (Article, Draft)
if ns == 0 or ns == 118 then
table.insert(cats, '[[Category:Maqaallada adeegsada ogeysiiska qeybaha]]')
end
-- Title mismatch detection
if firstLink and (origCount == 1 or (origCount == 0 and usedAutoFill)) then
local function normalizeTitle(s)
return (s or ''):gsub('^%s+', ''):gsub('%s+$', ''):gsub('^[^:]*:', ''):gsub('%s+', ' '):gsub('^%l', string.upper)
end
local compareStr
if usedAutoFill then
compareStr = normalizeTitle(firstLink)
else
local raw = (options._rawPages and options._rawPages[1]) or firstLink
compareStr = normalizeTitle(raw:gsub("|.*", ""))
end
local catName = normalizeTitle(thisTitle and thisTitle.text or '')
if compareStr ~= catName then
table.insert(cats, '[[Category:Maqaalka weyn ee qeybta oo aan u meel dhignayn magaca qeybta]]')
end
end
if #cats > 0 then
text = text .. '\n' .. table.concat(cats, '\n')
end
return text
end
function p._catMain(options, thisTitle, ...)
options = options or {}
local pages = {...}
thisTitle = thisTitle or mw.title.getCurrentTitle()
local fullTitle = thisTitle and thisTitle.prefixedText or ''
local thisText = thisTitle and thisTitle.text or (pages[1] or '')
local isTemplate = isTemplateOrModule(fullTitle)
-- Red link detection
local rawLinks = mFormatLink.formatPages({
categorizeMissing = not isTemplate and 'Qeybaha leh ogeysiisyada abbaaraya bog aan jirin' or nil
}, pages)
-- Convert to plain strings
local links = {}
for i, link in ipairs(rawLinks or {}) do
links[i] = tostring(link)
end
-- Auto-fill if empty
local firstOutputLink = nil
local usedAutoFill = false
if not links[1] or links[1] == '' then
local title = mw.title.new(thisText)
if title and title.isRedirect then
title = title.redirectTarget
end
firstOutputLink = title and title.text or thisText
usedAutoFill = true
links[1] = tostring(mFormatLink._formatLink{
link = firstOutputLink,
categorizeMissing = not isTemplate and 'Qeybaha leh ogeysiisyada abbaaraya bog aan jirin' or nil
})
pages = { firstOutputLink }
else
local visible = links[1]
visible = visible:gsub("^'''", ""):gsub("'''$", "")
visible = visible:gsub("%[%[", ""):gsub("%]%]", "")
visible = visible:gsub("|.*$", "")
visible = visible:gsub("#.*$", "")
firstOutputLink = visible
usedAutoFill = false
end
-- Bold links
for i, link in ipairs(links) do
links[i] = string.format("'''%s'''", link)
end
-- Determine pagetype
local pagetype
if options.article ~= nil then
pagetype = yesno(options.article) ~= false and 'maqaalka' or 'bogga'
elseif pages and pages[1] then
local page = pages[1]:gsub("|.*","")
local tt = mw.title.new(page)
pagetype = tt and tt.namespace == 0 and "maqaalka" or "bogga"
else
pagetype = "maqaalka"
end
-- Work out whether we need to be singular or plural
local stringToFormat
if #links > 1 then
stringToFormat = 'Aaditaannada ugu waaweyn %s ee [[Caawinaad:Qeybaha|qeybtan]] waa %s.'
else
stringToFormat = 'Aaditaanka ugu weyn ee %s ee [[Caawinaad:Qeybaha|qeybtan]] waa %s.'
end
-- Build hatnote text
local text = string.format(
stringToFormat,
pagetype,
mw.text.listToText(links)
)
-- Pass through Module:Hatnote
local hnOptions = { selfref = options.selfref }
text = mHatnote._hatnote(text, hnOptions)
return text, firstOutputLink, usedAutoFill
end
return p
eal4crkwv8sb4ee7pmtbkdo5bnoisse
305418
305417
2026-08-16T17:41:42Z
Isma4l
41797
305418
Scribunto
text/plain
-- Modulkan wuxuu dhaqangeliyaa {{Maqaalka weyn ee qeybta}}.
local mHatnote = require('Module:Hatnote')
local mFormatLink = require('Module:Format link')
local yesno = require('Module:Yesno')
local mTableTools -- lazily initialise
local mArguments -- lazily initialise
local p = {}
-- Helper: true if the page is in Template: or Module: namespace
local function isTemplateOrModule(title)
local t = (type(title) == 'string' and title) or (title and title.prefixedText) or ''
if t == '' then
return false
end
local ok, tt = pcall(mw.title.new, t)
if not ok or not tt then
return false
end
local ns = tt.namespace
return ns == 10 or ns == 828
end
function p.catMain(frame)
mTableTools = require('Module:TableTools')
mArguments = require('Module:Arguments')
-- Grab args
local args = mArguments.getArgs(frame, {wrappers = 'Template:Maqaalka weyn ee qeybta'})
local pages = mTableTools.compressSparseArray(args)
if #pages == 0 and args[1] then
pages = { args[1] }
end
local options = {
article = args.article,
selfref = args.selfref,
_rawPages = pages,
}
-- Determine the outer page (the page using the template)
local thisTitle = frame and frame.getParent and frame:getParent() and frame:getParent().title or mw.title.getCurrentTitle()
local titleText = thisTitle and thisTitle.prefixedText or ''
local ns = thisTitle and thisTitle.namespace or nil
-- Skip tracking categories on template/module pages
local isTemplate = isTemplateOrModule(titleText)
-- Remember original arg count
local origCount = #pages
-- Generate hatnote text
local text, firstLink, usedAutoFill = p._catMain(options, thisTitle, unpack(pages))
if isTemplate then
-- On templates/modules, just return the hatnote (no tracking categories)
return text
end
-- Add tracking categories
local cats = {}
-- Wrong namespace detection (Article, Draft)
if ns == 0 or ns == 118 then
table.insert(cats, '[[Category:Maqaallada adeegsada ogeysiiska qeybaha]]')
end
-- Title mismatch detection
if firstLink and (origCount == 1 or (origCount == 0 and usedAutoFill)) then
local function normalizeTitle(s)
return (s or ''):gsub('^%s+', ''):gsub('%s+$', ''):gsub('^[^:]*:', ''):gsub('%s+', ' '):gsub('^%l', string.upper)
end
local compareStr
if usedAutoFill then
compareStr = normalizeTitle(firstLink)
else
local raw = (options._rawPages and options._rawPages[1]) or firstLink
compareStr = normalizeTitle(raw:gsub("|.*", ""))
end
local catName = normalizeTitle(thisTitle and thisTitle.text or '')
if compareStr ~= catName then
table.insert(cats, '[[Category:Maqaalka weyn ee qeybta oo aan u meel dhignayn magaca qeybta]]')
end
end
if #cats > 0 then
text = text .. '\n' .. table.concat(cats, '\n')
end
return text
end
function p._catMain(options, thisTitle, ...)
options = options or {}
local pages = {...}
thisTitle = thisTitle or mw.title.getCurrentTitle()
local fullTitle = thisTitle and thisTitle.prefixedText or ''
local thisText = thisTitle and thisTitle.text or (pages[1] or '')
local isTemplate = isTemplateOrModule(fullTitle)
-- Red link detection
local rawLinks = mFormatLink.formatPages({
categorizeMissing = not isTemplate and 'Qeybaha leh ogeysiisyada abbaaraya bog aan jirin' or nil
}, pages)
-- Convert to plain strings
local links = {}
for i, link in ipairs(rawLinks or {}) do
links[i] = tostring(link)
end
-- Auto-fill if empty
local firstOutputLink = nil
local usedAutoFill = false
if not links[1] or links[1] == '' then
local title = mw.title.new(thisText)
if title and title.isRedirect then
title = title.redirectTarget
end
firstOutputLink = title and title.text or thisText
usedAutoFill = true
links[1] = tostring(mFormatLink._formatLink{
link = firstOutputLink,
categorizeMissing = not isTemplate and 'Qeybaha leh ogeysiisyada abbaaraya bog aan jirin' or nil
})
pages = { firstOutputLink }
else
local visible = links[1]
visible = visible:gsub("^'''", ""):gsub("'''$", "")
visible = visible:gsub("%[%[", ""):gsub("%]%]", "")
visible = visible:gsub("|.*$", "")
visible = visible:gsub("#.*$", "")
firstOutputLink = visible
usedAutoFill = false
end
-- Bold links
for i, link in ipairs(links) do
links[i] = string.format("'''%s'''", link)
end
-- Determine pagetype
local pagetype
if options.article ~= nil then
pagetype = yesno(options.article) ~= false and 'maqaalka' or 'bogga'
elseif pages and pages[1] then
local page = pages[1]:gsub("|.*","")
local tt = mw.title.new(page)
pagetype = tt and tt.namespace == 0 and "maqaalka" or "bogga"
else
pagetype = "maqaalka"
end
-- Work out whether we need to be singular or plural
local stringToFormat
if #links > 1 then
stringToFormat = 'Aaditaannada ugu waaweyn %s ee [[Help:Qeybaha|qeybtan]] waa %s.'
else
stringToFormat = 'Aaditaanka ugu weyn ee %s ee [[Help:Qeybaha|qeybtan]] waa %s.'
end
-- Build hatnote text
local text = string.format(
stringToFormat,
pagetype,
mw.text.listToText(links)
)
-- Pass through Module:Hatnote
local hnOptions = { selfref = options.selfref }
text = mHatnote._hatnote(text, hnOptions)
return text, firstOutputLink, usedAutoFill
end
return p
11ro476qrnnmkygc8br7s6uf4xbopv9
Template:Efn-ua
10
30900
305452
202968
2026-08-16T18:43:29Z
Isma4l
41797
/* */
305452
wikitext
text/x-wiki
<includeonly>{{safesubst<noinclude />:efn|name={{{name|}}}|group=upper-alpha|reference={{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
pl8uafdfsl93tqtnaaohv0ehjbm2430
Template:Tfd links
10
31858
305437
207797
2026-08-16T18:20:01Z
Isma4l
41797
/* */
305437
wikitext
text/x-wiki
<includeonly>{{#invoke:Tfd links|main}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
kgr3ak29rsv0z66jg4fkuyl8s6fzg5s
Module:Tfd links
828
31859
305439
207798
2026-08-16T18:22:31Z
Isma4l
41797
305439
Scribunto
text/plain
-- This module implements [[Template:Tfd links]]
local p = {}
local function urlencode(text)
-- Return equivalent of {{urlencode:text}}.
local function byte(char)
return string.format('%%%02X', string.byte(char))
end
return text:gsub('[^ %w%-._]', byte):gsub(' ', '+')
end
local function fullurllink(t, a, s)
return '[https://so.wikipedia.org/w/index.php?title=' .. urlencode(t) .. '&' .. a .. ' ' .. s .. ']'
end
function p.main(frame)
local args = frame:getParent().args
local ns = (((args['catfd'] and args['catfd'] ~= '') and 'Category') or
((args['module'] and args['module'] ~= '') and 'Module') or
((args['wikipedia'] and args['wikipedia'] ~= '') and 'Wikipedia'))
or 'Template'
local tname = mw.getContentLanguage():ucfirst(args['1'])
local fname = ns .. ':' .. tname
local fullpagename = frame:preprocess('{{FULLPAGENAME}}')
local sep = ' <b>·</b> '
local res = '<span id="' .. ns .. ':' .. tname
.. '" class="plainlinks nourlexpansion 1x">'
.. '[[:' .. ns .. ':' .. tname .. ']] ('
.. '[[' .. ns .. ' talk:' .. tname .. '|talk]]' .. sep
.. '[[Special:PageHistory/' .. fname .. '|history]]' .. sep
.. fullurllink('Special:Whatlinkshere/' .. fname, 'limit=5000&hidelinks=1', 'transclusions') .. sep
.. fullurllink('Special:Log', 'page=' .. urlencode(fname), 'logs') .. sep
.. '[[Special:PrefixIndex/' .. fname .. '/|subpages]])</span>'
return res
end
return p
ri5jgoxydbfyuapo7knutp6d0bc7zds
Bae Su-min
0
35512
305470
296939
2026-08-17T02:31:20Z
Swithiex
46991
305470
wikitext
text/x-wiki
{{Infobox musical artist|Name=Sumin|Birth_name=Bae Su-min|birth_date={{birth date and age|2001|03|31|}}|image=Stayc Sumin 201115.jpg|birth_place=[[Pohang]], Koonfur Kuuriya|Years_active=2020–hada|Associated_acts=[[STAYC]]|Label=[[High Up Entertainment]]}}'''Bae Su-min'''<ref>https://twitter.com/highup_girls/status/1303528556471955457</ref> (배수민; Maarso 31, 2001) oo loo yaqaan '''Sumin''' waa heesa Koonfur Kuuriya, waxay xubin ka tahay kooxda gabdhaha [[STAYC]].<ref>https://www.koreaboo.com/news/new-rookie-girl-group-stayc-debut-november/</ref>
== Tixraacyo ==
[[Category:Dad nool]]
[[Category:Fannaaniinta K-pop]]
[[Category:Idolyasha dhedig Koonfur Kuuriya]]
k3p77gprngw5qsl2yx7cpdzsglwx6hq
305471
305470
2026-08-17T05:59:29Z
CommonsDelinker
75
Removing [[:c:File:Stayc_Sumin_201115.jpg|Stayc_Sumin_201115.jpg]], it has been deleted from Commons by [[:c:User:The Squirrel Conspiracy|The Squirrel Conspiracy]] because: Copyright violation; see [[:c:Commons:Licensing|]] ([[:c:COM:CSD#F1|F1]]): Previou
305471
wikitext
text/x-wiki
{{Infobox musical artist|Name=Sumin|Birth_name=Bae Su-min|birth_date={{birth date and age|2001|03|31|}}|image=|birth_place=[[Pohang]], Koonfur Kuuriya|Years_active=2020–hada|Associated_acts=[[STAYC]]|Label=[[High Up Entertainment]]}}'''Bae Su-min'''<ref>https://twitter.com/highup_girls/status/1303528556471955457</ref> (배수민; Maarso 31, 2001) oo loo yaqaan '''Sumin''' waa heesa Koonfur Kuuriya, waxay xubin ka tahay kooxda gabdhaha [[STAYC]].<ref>https://www.koreaboo.com/news/new-rookie-girl-group-stayc-debut-november/</ref>
== Tixraacyo ==
[[Category:Dad nool]]
[[Category:Fannaaniinta K-pop]]
[[Category:Idolyasha dhedig Koonfur Kuuriya]]
b525o3qk52cbt2lawkl2dmj046gjh7b
Beesha Iidle Biciide
0
40939
305474
305184
2026-08-17T09:55:26Z
~2026-40195-67
46556
/* */
305474
wikitext
text/x-wiki
'''<big><u>BEESHA IIDLE BICIIDE (HABARJECLO)</u></big>'''
Beesha Iidle Biciide waa beel ka tirsan Habar Jeclo Gaar ahaan Muuse Abokor. Waxa ay degaan degaano ka tirsan G.Sanaag. sida Ceel-Afweyn, Bixin, Biyo dhacay, Dhabar-Dalool, Suuf-Dheere iyo Ceerigabo. Waxa kaso jeeda beesha Siyaasiyiin, Saraakiil iyo cuqaal aad uga so dhex muuqday halgankii xornimo doonka somaliland.
== Deegaannada ay degaan ==
Beesha Iidle Biciide waxaa lagu sheegaa inay degto deegaannadan:
* Bixin
* Suf-dheere
* Biyo-dhacay
* Garuuble
* Dhabar-dalool
* Ceel Afweyn
* Ceerigaabo
■ '''IIDLE BICIIDE...'''
== Jilibyada ==
Beesha Iidle Biciide waxay u kala baxdaa jilibyadan:
* Rooble
* Saalax
* Wacays
* Maxamed Cabdi
* Xareed
* Cabdulle Cabdi
■ <code>Reer Daahir</code>
■ <code>Reer Axmed</code>
■ <code>Reer Dhunkaall</code>
== Dadka caanka ah ==
=== MUJAAHIDIINTA ===
● C/laahi Saalax Oogle
* Maxamed Cabdi Cabdulle
=== SIYAASIYIINTA ===
● Siyaasi Ismaaciil Faarax Maxamed (DAD-QAL) Mid kamida Aasaasayaashi xisbigii UDUB
● Siyaasi Cismaan Faarax Maxamed (Hamasholl)
● Siyaasi Axmed Siciid Maxamed ( Godane) DG Agaasimaha Guud ee Ciyaara
● Xill-dhibaan Sahal Mire
=== MADAX DHAQAMEEDKA BEESHA ===
● Chief Caaqil Faarax Maxamed Dhunkaall
● Cheif Caaqil Aadan cabdi
● Cheif Caaqil Cabdulle Cade
● Cheif Caaqil Cawl cabdulle nuur
● Caaqil Ismaaciil Aadan cabdi
● Caaqil Cali Axmed Weyrax
● Caaqil maxamed ismaaciil Aadan
● Caaqil Ismaaciil Axmed Weyrax
● Caaqil Cabdi cawl Cabdulle
'''ODAYAASHA BEESHA'''
● Cawil Mire Rooble
● Maxamuud Faarax Maxamed (hurre)
● Cali Cismaan Faarax (Cali madoobe)
● Maxamed Siciid Maxamed
● Iiman Cabdi Cabdulle
● Aw salaad
● ismaaciil Xuseen Gabaydhe ( Baylood)
● Rashiid Faarax Maxamed
● Rashiid Gadhoodhsade
● Maxamed ciise
● Ibraahin Axmed Weyrax
● Xasan Caateeye Dhunkaall
● Goox cabdi
● Siciid Maxamed Aadan
'''DHALINYARADA BEESHA'''
● Axmed Aadan 《GANACSADE 》
● Yaasiin Maxamuud Faarax 《GANACSADE 》
● Maxamed Faarax Darawal 《GANACSADE》
● Saleeban Cabdullahi Cawed 《DR 》
●Mukhtaar Maxamed Saalax 《ENGINEER 》
● Maxamed Faarax Cali 《DR 》
● Axmed Maxamuud Faarax 《GANACSADE 》
● Nuux Hadhweyne 《ENGINEER 》
● Cabdisalaan Jaamac Ciise 《DR 》
● Cawil Aadan Axmed 《GANACSADE 》
● C/raxmaan xusen Aadan
● Maxamuud cilmi
s1bncbwaihon2ctcckrarhuvwl3zu5l
Template:Suboff
10
45575
305428
291584
2026-08-16T17:57:21Z
Isma4l
41797
/* */
305428
wikitext
text/x-wiki
{{#invoke:Football event|suboff}}<noinclude>
{{documentation}}
</noinclude>
2n689zl17n0oywfoxhn71zoz0beythq
Wikipedia:Kharibaad ayaa socda/madaxa bogga
4
50907
305402
2026-08-16T16:54:52Z
Isma4l
41797
/* */
305402
wikitext
text/x-wiki
<div class="procedure_to_hide" style="width: 100%; box-sizing: border-box; margin: 0; border: 2px ridge DarkSeaGreen; padding: 1em 2em; text-align: left; background-color: var(--background-color-success-subtle, #dfd); color: var(--color-base);"><span class="plainlinksneverexpand">
==={{center|<big>Kharibaad ayaa socda</big>}}===
----
{{shortcut|WP:VIP|WP:AIV|WP:ANV|WP:UFAA}}
Boggan waxaa loogu talagalay in lagu soo sheego [[Wikipedia:Khariibaad|Kharibayaasha]], [[:en:Wikipedia:Spam|faafiyeyaasha spam-ka]], iyo [[Wikipedia:Bogga Isticmaalaha|magacyada isticmaalaha]] ee jebiya [[Wikipedia:Siyaasada magaca adeegsadaha|siyaasadda magaca isticmaalaha]], si loogu gudbiyo [[Wikipedia:Maamulka|maamulayaasha]] loogu sameeyo [[Wikipedia:Xannibaadyo iyo mamnuucid|xannibaad]].
Si aad si fiican uga caawiso maamulayaasha, fadlan isticmaal qaabka '''<code>{{tl|vandal}}</code>''' haddii burburiyuhu leeyahay akoon ama qaabka '''<code>{{tl|ipvandal}}</code>''' haddii uu yahay [[Ciwaanka IP-ga|cinwaan IP]].
''Tusaalooyin:''
*'''<code><nowiki>{{vandal|Isticmaale xun}}</nowiki></code>''' waxay soo saartaa "{{vandal|Isticmaale xun}}"
*'''<code><nowiki>{{ipvandal|192.0.2.16}}</nowiki></code>''' waxay soo saartaa "{{ipvandal|192.0.2.16}}"
'''Ma soo sheegaysaa [[Wikipedia:Siyaasada magaca adeegsadaha|magacyo isticmaalayaal aan habboonayn]]?''' Isku day inaad isticmaasho '''<code><nowiki>{{subst:UsernameWarn}}</nowiki></code>''' bogaggooda doodda kuwa u baahan oo keliya digniin.
<includeonly>{{#ifeq:{{FULLPAGENAME}}|Wikipedia:Kharibaadayaa socda|<div class="autoconfirmed-show plainlinks" style="font-size:85%;text-align:center">{{Clickable button|1=[https://so.wikipedia.org/w/index.php?action=edit&oldid=6572679&summary=Clear+ Nadiifi dhammaan warbixinnada]}}</div>}}</includeonly>
</span></div>
__NOTOC__
<includeonly>
[[Category:Wikipedia administration|Kharribaad ayaa socda]]
</includeonly>
mz4hqfwetkyvwornmnsy9cnlrvtggq8
305406
305402
2026-08-16T16:57:44Z
Isma4l
41797
La ilaaliyay "[[Wikipedia:Kharibaad ayaa socda/madaxa bogga]]" ([Wax ka badal=U ogolow kaliya isticmaalayaasha la xaqiijiyay] (aan xad lahayn) [Wareeji=U oggolow oo keliya maamulayaasha] (aan xad lahayn))
305402
wikitext
text/x-wiki
<div class="procedure_to_hide" style="width: 100%; box-sizing: border-box; margin: 0; border: 2px ridge DarkSeaGreen; padding: 1em 2em; text-align: left; background-color: var(--background-color-success-subtle, #dfd); color: var(--color-base);"><span class="plainlinksneverexpand">
==={{center|<big>Kharibaad ayaa socda</big>}}===
----
{{shortcut|WP:VIP|WP:AIV|WP:ANV|WP:UFAA}}
Boggan waxaa loogu talagalay in lagu soo sheego [[Wikipedia:Khariibaad|Kharibayaasha]], [[:en:Wikipedia:Spam|faafiyeyaasha spam-ka]], iyo [[Wikipedia:Bogga Isticmaalaha|magacyada isticmaalaha]] ee jebiya [[Wikipedia:Siyaasada magaca adeegsadaha|siyaasadda magaca isticmaalaha]], si loogu gudbiyo [[Wikipedia:Maamulka|maamulayaasha]] loogu sameeyo [[Wikipedia:Xannibaadyo iyo mamnuucid|xannibaad]].
Si aad si fiican uga caawiso maamulayaasha, fadlan isticmaal qaabka '''<code>{{tl|vandal}}</code>''' haddii burburiyuhu leeyahay akoon ama qaabka '''<code>{{tl|ipvandal}}</code>''' haddii uu yahay [[Ciwaanka IP-ga|cinwaan IP]].
''Tusaalooyin:''
*'''<code><nowiki>{{vandal|Isticmaale xun}}</nowiki></code>''' waxay soo saartaa "{{vandal|Isticmaale xun}}"
*'''<code><nowiki>{{ipvandal|192.0.2.16}}</nowiki></code>''' waxay soo saartaa "{{ipvandal|192.0.2.16}}"
'''Ma soo sheegaysaa [[Wikipedia:Siyaasada magaca adeegsadaha|magacyo isticmaalayaal aan habboonayn]]?''' Isku day inaad isticmaasho '''<code><nowiki>{{subst:UsernameWarn}}</nowiki></code>''' bogaggooda doodda kuwa u baahan oo keliya digniin.
<includeonly>{{#ifeq:{{FULLPAGENAME}}|Wikipedia:Kharibaadayaa socda|<div class="autoconfirmed-show plainlinks" style="font-size:85%;text-align:center">{{Clickable button|1=[https://so.wikipedia.org/w/index.php?action=edit&oldid=6572679&summary=Clear+ Nadiifi dhammaan warbixinnada]}}</div>}}</includeonly>
</span></div>
__NOTOC__
<includeonly>
[[Category:Wikipedia administration|Kharribaad ayaa socda]]
</includeonly>
mz4hqfwetkyvwornmnsy9cnlrvtggq8
Wikipedia:VIP
4
50908
305403
2026-08-16T16:56:46Z
Isma4l
41797
Bog loo bedeley [[Wikipedia:Kharibaad ayaa socda/madaxa bogga]]
305403
wikitext
text/x-wiki
#REDIRECT [[Wikipedia:Kharibaad ayaa socda/madaxa bogga]]
nije2qpdphtytw4s1g54cjptdv3vctm
Wikipedia:AIV
4
50909
305404
2026-08-16T16:56:54Z
Isma4l
41797
Bog loo bedeley [[Wikipedia:Kharibaad ayaa socda/madaxa bogga]]
305404
wikitext
text/x-wiki
#REDIRECT [[Wikipedia:Kharibaad ayaa socda/madaxa bogga]]
nije2qpdphtytw4s1g54cjptdv3vctm
Wikipedia:ANV
4
50910
305405
2026-08-16T16:57:10Z
Isma4l
41797
Bog loo bedeley [[Wikipedia:Kharibaad ayaa socda/madaxa bogga]]
305405
wikitext
text/x-wiki
#REDIRECT [[Wikipedia:Kharibaad ayaa socda/madaxa bogga]]
nije2qpdphtytw4s1g54cjptdv3vctm
Wikipedia:UFAA
4
50911
305407
2026-08-16T16:57:55Z
Isma4l
41797
Bog loo bedeley [[Wikipedia:Kharibaad ayaa socda/madaxa bogga]]
305407
wikitext
text/x-wiki
#REDIRECT [[Wikipedia:Kharibaad ayaa socda/madaxa bogga]]
nije2qpdphtytw4s1g54cjptdv3vctm
Template:Ipvandal
10
50912
305408
2026-08-16T16:58:30Z
Isma4l
41797
Bog loo bedeley [[Template:Vandal]]
305408
wikitext
text/x-wiki
#REDIRECT [[Template:vandal]]
d9flix4knpyu8fuu1ta6ig25t6xcl1f
Wikipedia:Kharibaad ayaa socda/Bot
4
50913
305409
2026-08-16T17:15:11Z
Isma4l
41797
/* */
305409
wikitext
text/x-wiki
=== Warbixinnada Bot-ka ===
<!-- Si aad u tirtirto warbixinnada uu sameeyay bot-ka, tag [[Wikipedia:Vandalism in progress/Bot]] oo ka saar qoraallada boggaas ku jira. Ha tirtirin qaabkan . -->
pc2r6dfftxigek89cv35ecphc6yylaz
305410
305409
2026-08-16T17:16:13Z
Isma4l
41797
La ilaaliyay "[[Wikipedia:Kharibaad ayaa socda/Bot]]" ([Wax ka badal=U ogolow kaliya isticmaalayaasha la xaqiijiyay] (aan xad lahayn) [Wareeji=U oggolow oo keliya maamulayaasha] (aan xad lahayn))
305409
wikitext
text/x-wiki
=== Warbixinnada Bot-ka ===
<!-- Si aad u tirtirto warbixinnada uu sameeyay bot-ka, tag [[Wikipedia:Vandalism in progress/Bot]] oo ka saar qoraallada boggaas ku jira. Ha tirtirin qaabkan . -->
pc2r6dfftxigek89cv35ecphc6yylaz
Wikipedia:Kharibaad ayaa socda
4
50914
305411
2026-08-16T17:18:33Z
Isma4l
41797
/* */
305411
wikitext
text/x-wiki
__NOTOC__
<!--ku qasab noqday miiska waxyaabaha ku jira-->
<noinclude>
{{Wikipedia:Kharibaad ayaa socda/madaxa bogga}}
<!--
Si aad si fiican u caawiso maamulayaasha, fadlan isticmaal qaabka "{{vandal}}" haddii qofka wax burburinaya uu leeyahay akoon ama qaabka "{{ipvandal}}" haddii uu yahay cinwaanka [[IP|IP]].
Tusaalooyin:
*"{{vandal|Bad user}}" qofka wax burburinaya ee leh akoon (magaca isticmaaluhu waa "Bad user")
*"{{ipvandal|127.0.0.1}}" qofka wax burburinaya oo ah cinwaanka IP-ga (cinwaanku waa "127.0.0.1")
-->
:''Fadlan ku dar warbixinada cusub xagga hoose.''</noinclude>
== Warbixinnada hadda ==
<!-- Si aad u tirtirto warbixinnada uu sameeyay bot-ka, tag [[Wikipedia:Kharibaad ayaa socda/Bot]] oo ka saar qoraallada boggaas ku jira. Ha tirtirin qaabkan -->
{{Wikipedia:Kharibaad ayaa socda/Bot}}
=== Warbixinnada Isticmaaleyaasha ===
4vw9cj4q333201wbvprs59um7tboxzi
305412
305411
2026-08-16T17:19:02Z
Isma4l
41797
La ilaaliyay "[[Wikipedia:Kharibaad ayaa socda]]" ([Wareeji=U oggolow oo keliya maamulayaasha] (aan xad lahayn))
305411
wikitext
text/x-wiki
__NOTOC__
<!--ku qasab noqday miiska waxyaabaha ku jira-->
<noinclude>
{{Wikipedia:Kharibaad ayaa socda/madaxa bogga}}
<!--
Si aad si fiican u caawiso maamulayaasha, fadlan isticmaal qaabka "{{vandal}}" haddii qofka wax burburinaya uu leeyahay akoon ama qaabka "{{ipvandal}}" haddii uu yahay cinwaanka [[IP|IP]].
Tusaalooyin:
*"{{vandal|Bad user}}" qofka wax burburinaya ee leh akoon (magaca isticmaaluhu waa "Bad user")
*"{{ipvandal|127.0.0.1}}" qofka wax burburinaya oo ah cinwaanka IP-ga (cinwaanku waa "127.0.0.1")
-->
:''Fadlan ku dar warbixinada cusub xagga hoose.''</noinclude>
== Warbixinnada hadda ==
<!-- Si aad u tirtirto warbixinnada uu sameeyay bot-ka, tag [[Wikipedia:Kharibaad ayaa socda/Bot]] oo ka saar qoraallada boggaas ku jira. Ha tirtirin qaabkan -->
{{Wikipedia:Kharibaad ayaa socda/Bot}}
=== Warbixinnada Isticmaaleyaasha ===
4vw9cj4q333201wbvprs59um7tboxzi
305414
305412
2026-08-16T17:31:28Z
Isma4l
41797
305414
wikitext
text/x-wiki
__NOTOC__
<!--ku qasab noqday miiska waxyaabaha ku jira-->
<noinclude>
{{Wikipedia:Kharibaad ayaa socda/madaxa bogga}}
<!--
Si aad si fiican u caawiso maamulayaasha, fadlan isticmaal qaabka "{{vandal}}" haddii qofka wax burburinaya uu leeyahay akoon ama qaabka "{{ipvandal}}" haddii uu yahay cinwaanka [[IP|IP]].
Tusaalooyin:
*"{{vandal|Bad user}}" qofka wax burburinaya ee leh akoon (magaca isticmaaluhu waa "Bad user")
*"{{ipvandal|127.0.0.1}}" qofka wax burburinaya oo ah cinwaanka IP-ga (cinwaanku waa "127.0.0.1")
-->{{Template:Admin backlog|bot=HBC AIV helperbot14}}<!-- v2.0.29 RemoveBlocked=On MergeDuplicates=On AutoMark=On FixInstructions=On AutoBacklog=On AddLimit=4 RemoveLimit=1 --></noinclude>
:''Fadlan ku dar warbixinada cusub xagga hoose.''</noinclude>
== Warbixinnada hadda ==
<!-- Si aad u tirtirto warbixinnada uu sameeyay bot-ka, tag [[Wikipedia:Kharibaad ayaa socda/Bot]] oo ka saar qoraallada boggaas ku jira. Ha tirtirin qaabkan -->
{{Wikipedia:Kharibaad ayaa socda/Bot}}
=== Warbixinnada Isticmaaleyaasha ===
09m4skbx47refmz5umd4unnx8c0wgos
305462
305414
2026-08-16T19:38:23Z
Isma4l
41797
Looma baahna maadaama halkaan aanu ka jirin bot bedela mar walba
305462
wikitext
text/x-wiki
__NOTOC__
<!--ku qasab noqday miiska waxyaabaha ku jira-->
<noinclude>
{{Wikipedia:Kharibaad ayaa socda/madaxa bogga}}
<!--
Si aad si fiican u caawiso maamulayaasha, fadlan isticmaal qaabka "{{vandal}}" haddii qofka wax burburinaya uu leeyahay akoon ama qaabka "{{ipvandal}}" haddii uu yahay cinwaanka [[IP|IP]].
Tusaalooyin:
*"{{vandal|Bad user}}" qofka wax burburinaya ee leh akoon (magaca isticmaaluhu waa "Bad user")
*"{{ipvandal|127.0.0.1}}" qofka wax burburinaya oo ah cinwaanka IP-ga (cinwaanku waa "127.0.0.1")
-->
:''Fadlan ku dar warbixinada cusub xagga hoose.''</noinclude>
== Warbixinnada hadda ==
<!-- Si aad u tirtirto warbixinnada uu sameeyay bot-ka, tag [[Wikipedia:Kharibaad ayaa socda/Bot]] oo ka saar qoraallada boggaas ku jira. Ha tirtirin qaabkan -->
{{Wikipedia:Kharibaad ayaa socda/Bot}}
=== Warbixinnada Isticmaaleyaasha ===
b7q15u1ebk93thx3xbatxm1v75on49j
Template:Admin backlog
10
50915
305413
2026-08-16T17:28:35Z
Isma4l
41797
/* */
305413
wikitext
text/x-wiki
{{#invoke:Template wrapper|{{#if:{{yesno|{{{_debug|}}}}}|list|wrap}}
| _template = backlog
| _include-positional = yes
| _exclude = _debug
| _reuse = admin <!-- This prevents overriding the admin param (i.e. disallows {{admin backlog|admin=no}}) -->
| admin = yes
| remove = no<noinclude><!-- The module ignores empty params, so category param must exist -->
| category = <nowiki />
</noinclude>
}}<noinclude>{{documentation}}<!-- Add categories to the /doc subpage, interwikis go to wikidata; thanks! --></noinclude>
b38ufl0kesdn7l6swzr2chug17np22l
Template:Category main article
10
50916
305416
2026-08-16T17:38:22Z
Isma4l
41797
/* */
305416
wikitext
text/x-wiki
{{#invoke:Cat_main|catMain}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
t9zzv3cllpsygsgki4ckzk6lh0im3lu
Template:Main cat
10
50917
305419
2026-08-16T17:45:02Z
Isma4l
41797
Bog cusub: {{Hatnote|1=Qaybta ugu muhiimsan: [[:Category:{{{1|{{PAGENAME}}}}}|{{{2|{{{1|{{PAGENAME}}}}}}}}]]}}<noinclude> {{documentation}} </noinclude>
305419
wikitext
text/x-wiki
{{Hatnote|1=Qaybta ugu muhiimsan: [[:Category:{{{1|{{PAGENAME}}}}}|{{{2|{{{1|{{PAGENAME}}}}}}}}]]}}<noinclude>
{{documentation}}
</noinclude>
qz20fxi5d89pfveclz7355uau7u13uq
Template:Cite Russian law
10
50918
305420
2026-08-16T17:48:08Z
Isma4l
41797
/* */
305420
wikitext
text/x-wiki
{{#if:{{{ru_title|}}}|{{lang|ru|{{#if:{{{ru_title|}}}|{{#if:{{{ru_entity|}}}|{{{ru_entity}}}. |}}{{#if:{{{ru_type|}}}|{{{ru_type}}} |}}{{#if:{{{ru_number|}}}|№{{{ru_number}}} |}}{{#if:{{{ru_date|}}}|{{#if:{{{ru_type|}}}|{{#if:{{{ru_date|}}}|от }}}}{{{ru_date}}}|}} «{{#if:{{{ru_url|}}}|[{{{ru_url}}} {{{ru_title}}}]|{{{ru_title}}}}}»{{#if:{{{ru_amendment_number|}}}|, в ред. {{#if:{{{ru_amendment_type|}}}|{{{ru_amendment_type}}}|}} №{{{ru_amendment_number}}} {{#if:{{{ru_amendment_date|}}}|от {{{ru_amendment_date}}}|}}{{#if:{{{ru_amendment_title|}}}| «{{{ru_amendment_title}}}»}}}}.}} {{#if:{{{ru_effective_date|}}}|Вступил в силу {{{ru_effective_date}}}.}} {{#if:{{{ru_published_in|}}}|Опубликован: {{{ru_published_in}}}{{#if:{{{ru_published_date|}}}|, {{{ru_published_date}}}|}}.}}}} }}<!--end Russian title--> {{#if:{{{en_title|}}}|{{#if:{{{ru_title|}}}|(|}}{{#if:{{{en_entity|}}}|{{{en_entity}}}. |}}{{#if:{{{en_type|}}}|{{{en_type}}} |}}{{#if:{{{en_number|}}}|#{{{en_number}}} |}}{{#if:{{{en_date|}}}|{{#if:{{{en_type|}}}|{{#if:{{{en_date|}}}|of }}}}{{{en_date}}}|}} ''{{#if:{{{en_url|}}}|[{{{en_url}}} {{{en_title}}}]|{{#if:{{{ru_url|}}}|[http://translate.google.com/translate?hl=en&sl=ru&tl=en&u={{{ru_url}}} {{{en_title}}}]|{{{en_title}}}}}}}''{{#if:{{{en_amendment_number|}}}|, as amended by the {{#if:{{{en_amendment_type|}}}|{{{en_amendment_type}}} |}}#{{{en_amendment_number}}} {{#if:{{{en_amendment_date|}}}|of {{{en_amendment_date}}}|}} {{#if:{{{en_amendment_title|}}}|''{{{en_amendment_title}}}''}}}}. {{#if:{{{ru_effective_date|}}}|Effective as of {{{en_effective_date}}}.}}{{#if:{{{ru_title|}}}|)|}}.}}<noinclude>
{{documentation}}
</noinclude>
o7caatm47k9y41xu4rerpvns50j4vc2
Template:Frequency
10
50919
305421
2026-08-16T17:48:41Z
Isma4l
41797
/* */
305421
wikitext
text/x-wiki
<span class="hMeasure frequency"><span class="num">{{{1}}}</span> <span class="unit">{{{2}}}</span></span><noinclude>{{documentation}}</noinclude>
fjugc8ctdt5gjc1wsk4urr0qfcitwjl
Template:If all
10
50920
305422
2026-08-16T17:49:12Z
Isma4l
41797
/* */
305422
wikitext
text/x-wiki
{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}>=1|{{safesubst:<noinclude/>#if:{{{1|}}}
|{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}>=2|{{safesubst:<noinclude/>#if:{{{2|}}}
|{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}>=3|{{safesubst:<noinclude/>#if:{{{3|}}}
|{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}>=4|{{safesubst:<noinclude/>#if:{{{4|}}}
|{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}>=5|{{safesubst:<noinclude/>#if:{{{5|}}}
|{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}>=6|{{safesubst:<noinclude/>#if:{{{6|}}}
|{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}>=7|{{safesubst:<noinclude/>#if:{{{7|}}}
|{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}>=8|{{safesubst:<noinclude/>#if:{{{8|}}}
|{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}>=9|{{safesubst:<noinclude/>#if:{{{9|}}}
|{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=10|{{safesubst:<noinclude/>#if:{{{10|}}}|{{{then|}}}|{{{else|}}}
}}}}{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=9|{{{then|}}}}}|{{{else|}}}
}}}}{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=8|{{{then|}}}}}|{{{else|}}}
}}}}{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=7|{{{then|}}}}}|{{{else|}}}
}}}}{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=6|{{{then|}}}}}|{{{else|}}}
}}}}{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=5|{{{then|}}}}}|{{{else|}}}
}}}}{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=4|{{{then|}}}}}|{{{else|}}}
}}}}{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=3|{{{then|}}}}}|{{{else|}}}
}}}}{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=2|{{{then|}}}}}|{{{else|}}}
}}}}{{safesubst:<noinclude/>#ifexpr:{{{n|0}}}=1|{{{then|}}}}}|{{{else|}}}
}}}}<noinclude>
{{documentation}}
<!--
PLEASE ADD CATEGORIES AND INTERWIKIS
TO THE /doc SUBPAGE, THANKS
-->
<noinclude>
cmpzsmdhokesawfraexi21cs1ttyc57
Template:S-vac
10
50921
305423
2026-08-16T17:50:30Z
Isma4l
41797
/* */
305423
wikitext
text/x-wiki
<includeonly>| style="width: 30%; text-align: center;" rowspan="{{{rows|1}}}"|{{#if:{{{1|}}}|{{#switch:{{lc:{{{1}}}}}
|#default={{#if:{{{1}}}|'''Vacant'''}}
|ab='''In abeyance'''
|co='''In commission'''
|di='''Disclaimed'''
|do='''Dormant'''
|re='''Recreated'''
|su='''Suspended'''
|sede='''''[[Sede vacante]]'''''
|unkn='''Unknown'''
|abeyance='''In abeyance'''
|commission='''In commission'''
|disclaimed='''Disclaimed'''
|dormant='''Dormant'''
|extinct='''Extinct'''
|forfeit='''Forfeit'''
|recreated='''Recreated'''
|suspended='''Suspended'''
|sedevacante='''''[[Sede vacante]]'''''
|unknown='''Unknown'''
}}|'''Vacant'''}}{{#if:{{{reason|}}}|<div style="font-size:90%">{{{reason}}}</div>}}{{#if:{{{last|}}}|<div style="font-size:90%">Title last held by</div>'''{{{last}}} '''}}{{#if:{{{next|}}}|<div style="font-size:90%">Title next held by</div>'''{{{next}}} '''}}{{#if:{{{unknlast|}}}|<div style="font-size:90%">Last known title holder:</div>'''{{{unknlast}}} '''}}{{#if:{{{unknnext|}}}|<div style="font-size:90%">Next known title holder:</div>'''{{{unknnext}}} '''}}{{#if:{{{as|}}}|<br><small>'''''as {{{as}}} '''''</small>}}</includeonly><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here. -->
</noinclude>
3slm0cfdbmx4j4wtq8zfkjwsqbid304
Template:AthAbbr
10
50922
305424
2026-08-16T17:51:25Z
Isma4l
41797
/* */
305424
wikitext
text/x-wiki
[[{{#switch: {{{1|}}}
| WB = List of world records in athletics#World best performances
| PB | SB | WL | WJL | WYL | WU18L | WU20L = Athletics abbreviations#Bests
| A | NWI | a | + | Mx | Wo | DNF | DNS | i | n | h | NT | ND | Q | q | qJ | qR | y = Athletics abbreviations#Circumstances and conditions
| o | x | r | NH | NM | - | P = Athletics abbreviations#Field events
| DQ | DSQ | DQ R162.7 | DQ R162.8 | DQ R163.3 | DQ R170.9 = Athletics abbreviations#Warnings / Disqualifications
| WR = {{#if: {{{2|}}}|{{{2}}} world record progression|List of world records in athletics}}
| WRwo = {{#if: {{{2|}}}|{{{2}}} world record progression|List of world records in athletics}}
| OR = List of Olympic records in athletics
| AR | GR = {{#if: {{{2|}}}|List of {{{2}}} records in athletics|Athletics abbreviations#Records}}
| CR = {{#if: {{{2|}}}|List of {{{2}}} records|Athletics abbreviations#Records}}
| NR | NRi = {{#if: {{{2|}}}|List of {{{2}}} records in athletics|National records in athletics}}
| MR = List of meet records in athletics
| WUR | WU23R | WU23B = List of world under-23 bests in athletics
| AUR | AU23R | NUR | NU23R = {{#if: {{{2|}}}|List of {{{2}}} under-23 bests in athletics|Athletics abbreviations#Records}}
| WJR | WU20R = List of world under-20 records in athletics
| AJR | AU20R | NJR | NU20R = {{#if: {{{2|}}}|List of {{{2}}} under-20 records in athletics|Athletics abbreviations#Records}}
| WYB | WYR | WU18R | WU18B = List of world under-18 bests in athletics
| WDB = Decathlon#Decathlon bests
| WHB = Heptathlon#Women's world records compared to heptathlon bests
| ODB | OHB = Combined events at the Olympics
| HSR = List of United States high school national records in track and field
| P | # | X | NYR | AYR | AYB | NU18R | AU18R | AU18B = Athletics abbreviations#Records
| w = Wind assistance
| DLR = Diamond League
| WMR = List of world records in masters athletics
| PS = List of United States collegiate records in track and field
| PM = Pacemaker (running)
| Athletics abbreviations}}<noinclude>
</noinclude>|<abbr title="{{#tag:nowiki|{{#switch: {{{1|}}}
| WR = World record
| WRwo = World record (women only race)
| WUR | WU23R = World under-23 best
| WJR | WU20R = World under-20 record
| WYR | WYB | WU18R | WU18B = World under-18 best
| EYB = European under-18 best
| WMR = World masters record
| OR = Olympic record
| AR = Area (continental) record
| AUR | AU23R = Area (continental) under-23 record
| AJR | AU20R = Area (continental) under-20 record
| AYR | AU18R | AYB | AU18B = Area (continental) under-18 record
| GR = Games record
| CR = Championship record
| NR = National record
| NRi = National indoor record
| NUR | NU23R = National under-23 record
| NJR | NU20R = National under-20 record
| NYB | NU18B | NYR | NU18R = National under-18 record
| DLR = Diamond League record
| MR = Meet record
| HSR = United States high school record
| WB = World best
| NB = National best
| PB = Personal best
| SB = Season's best
| WL = World leading performance
| EL = European leading performance
| EYL | EU18L = European under-18 leading performance
| WJL | WU20L = World under-20 leading performance
| WYL | WU18L = World under-18 leading performance
| WUL | WU23L = World under-23 leading performance
| WHB = World heptathlon best
| WDB = World decathlon best
| OHB = Olympic heptathlon best
| ODB = Olympic decathlon best
| CHB = Championship heptathlon best
| CDB = Championship decathlon best
| A = Mark set at altitude
| w = Mark wind-assisted (over 2.0 m/s)
| NWI = No wind information
| NWJ = No water jump
| a = Assisted road course (downhill or favouring wind)
| + = time set en-route to a longer distance
| Mx = mixed gender race
| Wo = women only race
| DNF = Did not finish
| DNS = Did not start
| X | DQ = Disqualified
| DQ R162.7 = false start
| DQ R162.8 = false start
| DQ R163.3 = out of lane
| i = Indoors
| sh = Short track (200 metres)
| n = Non-winning time
| h = hand timed
| r = retired
| > = Bent knee
| ~ = Lost contact
| NH = No height
| NM = No mark
| NT = No time
| ND = No distance
| OT = oversized track
| PM = Pacemaker
| Q = Automatic qualifier
| q = Non-automatic qualifier
| qR = Advanced to the next round by referee
| qJ = Advanced to the next round by jury appeal
| h1 = Heat #1 | h2 = Heat #2 | h3 = Heat #3
| sf1 = Semi-final #1 | sf2 = Semi-final #2 | sf3 = Semi-final #3
| sf = Semi-finals
| y = Distance in yards
| e = Estimated mark
| # = Not ratified
| P = Pending ratification
| PS = Post-season collegiate mark
| AC = Also competed
| TWR = Tied world record
| L = Lane Infringement
| {{{1|}}}}}}}">{{{1|}}}</abbr>]]<noinclude>
{{Documentation}}
</noinclude>
fev031p0jz1mo4zqvjok4qa27uv2yjf
Template:Cite Instagram
10
50923
305425
2026-08-16T17:54:56Z
Isma4l
41797
/* */
305425
wikitext
text/x-wiki
{{cite web
| url = {{#ifeq: {{{postid|}}} | {{{postid}}} | https://www.instagram.com/{{{user}}}/p/{{{postid}}}/ | https://www.instagram.com/ }}
| title = {{#invoke:String|replace|source={{{title|<noinclude>{{{title}}}</noinclude>}}} |pattern=https*:// |replace=|plain=false}}
| script-title = {{{script-title|}}}
| trans-title = {{{trans-title|}}}
| language = {{{language|}}}
| last = {{{last|}}}
| first = {{{first|}}}
| author = {{#if: {{{last|}}}
|
|{{#if: {{{author|}}}
|{{{author}}}
|{{#if: {{{user|}}} |(({{{user|}}}))}}
}}
}}
| author-mask = {{#if: {{{last|}}} |
{{#if: {{{first|}}} |
{{{last}}}, {{{first}}} [@{{{user|}}}]{{#if:{{{user2}}}|;|}} |
{{{last}}} [@{{{user|}}}]{{#if:{{{user2}}}|;|}}
}} |
{{#if: {{{author|}}} |
{{{author}}} [@{{{user|}}}]{{#if:{{{user2}}}|;|}} |
{{#if: {{{author-link2|{{{authorlink2|}}} }}} |
{{{author-link2|{{{authorlink2|}}} }}} [@{{{user|}}}]{{#if:{{{user2}}}|;|}} |
@{{{user|}}}{{#if:{{{user2}}}|;|}}
}}
}}
}}
| author-link = {{{author-link|{{{authorlink|}}} }}}
| last2 = {{{last2|}}}
| first2 = {{{first2|}}}
| author2 = {{#if: {{{last2|}}}
|
|{{#if: {{{author2|}}}
|{{{author2}}}
|{{#if: {{{user2|}}} |(({{{user2|}}}))}}
}}
}}
| author-mask2 = {{#if: {{{last2|}}} |
{{#if: {{{first2|}}} |
{{{last2}}}, {{{first2}}} [@{{{user2|}}}] |
{{{last2}}} [@{{{user2|}}}]
}} |
{{#if: {{{author2|}}} |
{{{author2}}} [@{{{user2|}}}] |
{{#if: {{{author-link2|{{{authorlink2|}}} }}} |
{{{author-link2|{{{authorlink2|}}} }}} [@{{{user2|}}}]|
@{{{user2|}}}
}}
}}
}}
| author-link2 = {{{author-link2|{{{authorlink2|}}} }}}
| date = {{{date|}}}
| via = {{#ifeq:{{{link|}}}|no|Instagram|[[Instagram]]}}
| location = {{{location|}}}
| access-date = {{{access-date|{{{accessdate|}}} }}}
| archive-date = {{{archive-date|{{{archivedate|}}} }}}
| archive-url = {{{archive-url|{{{archiveurl|}}} }}}
| url-status = {{{url-status|{{{dead-url|{{{deadurl|}}}}}}}}}
| ref = {{{ref|}}}
| df = {{{df|}}}
}}<includeonly><!--
== Error checking ==
No title -->{{#if:{{{title|}}}{{{script-title|}}}||{{#ifeq: {{{user|}}}{{{postid|}}}{{{date|}}} | {{{user}}}{{{postid}}}{{{date}}}||<span style="font-size:100%" class="error citation-comment">;</span>}}{{main other|[[Category:Cite instagram templates with errors]]}} }}<!--
(Note: error message is provided by CS1 module)
No user --> {{#if:{{{user|}}}||<span style="font-size:100%" class="error citation-comment"><code class="cs1-code">{{((}}[[Template:Cite Instagram|Cite Instagram]]{{))}}</code>: Missing or empty <kbd>|user=</kbd> ([[Template:Cite instagram#Error detection|help]]){{#ifeq: {{{postid|}}}{{{date|}}} | {{{postid}}}{{{date}}}||;}}</span>{{main other|[[Category:Cite instagram templates with errors]]}} }}<!--
No user2 but other parameters for second author -->
{{#if:{{{user2|}}}||{{#ifeq:{{#expr:
{{#if:{{{first2|}}}|1|0}} or
{{#if:{{{last2|}}}|1|0}} or
{{#if:{{{author2|}}}|1|0}} or
{{#if:{{{author-link2|{{{authorlink2|}}} }}}|1|0}} }}|1|<span style="font-size:100%" class="error citation-comment"><code class="cs1-code">{{((}}[[Template:Cite Instagram|Cite Instagram]]{{))}}</code>: Missing or empty <kbd>|user2=</kbd> ([[Template:Cite instagram#Error detection|help]]){{#ifeq: {{{postid|}}}{{{date|}}} | {{{postid}}}{{{date}}}||;}}</span>{{main other|[[Category:Cite instagram templates with errors]]}} }} }}<!--
No postid --> {{#if:{{{postid|}}}||<span style="font-size:100%" class="error citation-comment"><code class="cs1-code">{{((}}[[Template:Cite Instagram|Cite Instagram]]{{))}}</code>: Missing or empty <kbd>|postid=</kbd> ([[Template:Cite instagram#Error detection|help]]){{#if:{{{date|}}}||;}}</span>{{main other|[[Category:Cite instagram templates with errors]]}} }}<!--
No date --> {{#if:{{{date|}}}||<span style="font-size:100%" class="error citation-comment"><code class="cs1-code">{{((}}[[Template:Cite Instagram|Cite Instagram]]{{))}}</code>: Missing or empty <kbd>|date=</kbd> ([[Template:Cite instagram#Error detection|help]])</span>{{main other|[[Category:Cite instagram templates with errors]]}} }}</includeonly><noinclude>{{documentation}}</noinclude>
ejy88ms27aybn30nxxmf9rl6014q18a
Template:Ordered list
10
50924
305426
2026-08-16T17:55:28Z
Isma4l
41797
/* */
305426
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:list|ordered}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
n9z3yrhcknctpjb3o8a5r4mv3ke55up
Module:Football event
828
50925
305427
2026-08-16T17:56:38Z
Isma4l
41797
Bog cusub: -- Module:Football event -- Implements the association-football match-event icon templates and provides the -- goal / penalty auto-formatting for [[Module:Football box]]. -- -- Template entry points: -- {{#invoke:Football event|goal}} {{#invoke:Football event|goldengoal}} -- {{#invoke:Football event|yellow}} / yel {{#invoke:Football event|sentoff}} -- {{#invoke:Football event|subon}} {{#invoke:Football event|suboff}} -- Module entry point (called from another...
305427
Scribunto
text/plain
-- Module:Football event
-- Implements the association-football match-event icon templates and provides the
-- goal / penalty auto-formatting for [[Module:Football box]].
--
-- Template entry points:
-- {{#invoke:Football event|goal}} {{#invoke:Football event|goldengoal}}
-- {{#invoke:Football event|yellow}} / yel {{#invoke:Football event|sentoff}}
-- {{#invoke:Football event|subon}} {{#invoke:Football event|suboff}}
-- Module entry point (called from another module):
-- require('Module:Football event').formatBox{
-- goals1 = ..., goals2 = ..., penalties1 = ..., penalties2 = ... }
local p = {}
-- --------------------------------------------------------------------------
-- shared data
-- --------------------------------------------------------------------------
local OG_LINK = '([[Own goal#Association football|o.g.]])'
local PEN_LINK = '([[Penalty kick (association football)|pen.]])'
local YEL2_CAT = '[[Category:Yellow card template with second parameter]]'
local icon = {
goal = '[[File:Soccerball shade.svg|13px|Goal|link=|alt=]]',
og = '[[File:Soccerball-red with shade.svg|13px|Own goal|link=|alt=red-colored football]]',
goldgoal = '[[File:Soccerball shade gold.svg|13px|Golden goal|link=|alt=gold-colored football]]',
goldog = '[[File:Soccerball-red with gold shade.svg|13px|Golden own goal|link=|alt=gold and red-colored football]]',
pengoal = '[[File:Soccerball shad check.svg|13px|Penalty scored|link=|alt=football with check mark]]',
penmiss = '[[File:Soccerball shade cross.svg|13px|Penalty missed|link=|alt=football with red X]]',
}
-- own-goal / penalty shorthand -> canonical modifier (lookup key is lower-cased)
local modMap = {
['og'] = 'og', ['o.g.'] = 'og', ['o.g'] = 'og',
['pen'] = 'pen', ['pen.'] = 'pen', ['p'] = 'pen', ['p.'] = 'pen',
['pk'] = 'pen', ['p.k.'] = 'pen', ['p.k'] = 'pen',
}
-- penalty shoot-out keywords -> scored / missed (lookup key is lower-cased)
local penKW = {}
for _, w in ipairs({ 'goal', 'pengoal', 'score', 'scored' }) do penKW[w] = 'goal' end
for _, w in ipairs({ 'miss', 'penmiss', 'missed', 'saved' }) do penKW[w] = 'miss' end
-- stage abbreviations for the card templates: key -> {display, title}
local STAGES = {
PRE = { 'PRE', 'Pre-match' },
HT = { 'HT', 'Half-time' },
AWET = { 'AWET', 'Awaiting extra time' },
HTET = { 'HTET', 'Half-time in extra time' },
PSO = { 'PSO', 'Penalty shoot-out' },
PK = { 'PSO', 'Penalty shoot-out' },
FT = { 'FT', 'After full-time' },
}
-- every apostrophe / prime variant
local APOS = "[`'´ʹʼˈ‘’′]"
-- --------------------------------------------------------------------------
-- small helpers
-- --------------------------------------------------------------------------
local function notBlank(v)
return v ~= nil and mw.text.trim(v) ~= ''
end
local function inMain()
return mw.title.getCurrentTitle().namespace == 0
end
local function abbr(text, title)
return '<abbr title="' .. title .. '">' .. text .. '</abbr>'
end
local function normApo(s)
return (mw.ustring.gsub(s, APOS, "'"))
end
local function delink(s)
s = mw.ustring.gsub(s, '%[%[[^%[%]|]*|([^%[%]]*)%]%]', '%1')
s = mw.ustring.gsub(s, '%[%[([^%[%]]*)%]%]', '%1')
return s
end
-- Format a minute and append the minute mark. Stoppage time: an apostrophe
-- typed before a "+" is dropped and the mark moved to the very end, with any
-- spaces around the "+" tidied away ("90' + 7" -> "90+7'").
local function fmtMin(s)
s = normApo(mw.text.trim(s))
s = mw.ustring.gsub(s, "'%s*(%+)", '%1') -- apostrophe before "+"
s = mw.ustring.gsub(s, "[%s']*$", '') -- trailing spaces / apostrophes
s = mw.ustring.gsub(s, '%s*%+%s*', '+') -- tidy spaces around "+"
return s .. "'"
end
-- True when, after removing apostrophes / spaces, the value is only digits and
-- an optional "+" (i.e. a bare minute such as "45", "90+9", "90' + 7"). Used to
-- recover minutes that mis-keyed pipes pushed into an annotation slot.
local function isMinuteToken(v)
local t = mw.ustring.gsub(normApo(v), "[%s']", '')
return mw.ustring.match(t, '^%d+%+?%d*$') ~= nil
end
-- card time / stage label.
-- mode == 'plain' -> always a minute
-- mode == 'pso' -> only PSO/PK/FT recognised (post-reset periods)
-- default -> full stage list, otherwise a minute
local function stageLabel(v, mode)
if mode == 'plain' then return fmtMin(v) end
local up = mw.ustring.upper(mw.text.trim(v))
if mode == 'pso' then
if up == 'PSO' or up == 'PK' then return abbr('PSO', 'Penalty shoot-out') end
if up == 'FT' then return abbr('FT', 'After full-time') end
return ''
end
local s = STAGES[up]
if s then return abbr(s[1], s[2]) end
return fmtMin(v)
end
-- card icons (variable tooltip)
local function img(file, px, alt, tt)
return '[[File:' .. file .. '|' .. px .. 'px|alt=' .. alt .. '|' .. tt .. '|link=]]'
end
local function yc(tt) return img('Yellow card.svg', 10, 'Yellow card', tt) end
local function rc(tt) return img('Red card.svg', 10, 'Red card', tt) end
local function yrc(tt) return img('Yellow-red card.svg', 12, 'Yellow-red card', tt) end
local function timed(ic, v, mode)
if notBlank(v) then return ic .. ' ' .. stageLabel(v, mode) end
return ic
end
-- --------------------------------------------------------------------------
-- goal rendering (shared by {{goal}}, {{golden goal}} and the box feature)
-- --------------------------------------------------------------------------
local function goalIcon(golden, og)
if golden then return og and icon.goldog or icon.goldgoal end
return og and icon.og or icon.goal
end
-- "<span><minute>[ <annotation>]</span>"
local function goalSpan(minute, ann)
local s, hasMin = '<span>', notBlank(minute)
if hasMin then s = s .. fmtMin(minute) end
if ann then
if hasMin then s = s .. ' ' end
s = s .. ann
end
return s .. '</span>'
end
-- raw annotation -> og flag, annotation text
local function goalAnnot(a)
local m = modMap[mw.ustring.lower(mw.text.trim(delink(a)))]
if m == 'og' then return true, nil end
if m == 'pen' then return false, PEN_LINK end
return false, '(' .. a .. ')'
end
-- Try to read a single positional token as a goal entry: either a bare minute
-- ("33", "90+9") or a minute followed by a RECOGNISED modifier, with optional
-- parentheses ("33 pen", "90+9 o.g.", "45 (pen.)"). Returns nil for anything
-- else (bare modifiers like "pen", or custom text), so those stay annotations
-- rather than being mistaken for minutes.
local function asMinuteEntry(v)
if isMinuteToken(v) then
return { minute = v, golden = false, og = false, ann = nil }
end
local minPart, modPart =
mw.ustring.match(normApo(mw.text.trim(v)), '^([%d%+%s]-%d)%s*%(?%s*([%a%.]+)%s*%)?$')
if minPart and isMinuteToken(minPart) then
local m = modMap[mw.ustring.lower(modPart)]
if m then
return { minute = minPart, golden = false,
og = (m == 'og'), ann = (m == 'pen') and PEN_LINK or nil }
end
end
return nil
end
-- Render a player's goal cluster from a list of entries:
-- entry = { minute = raw, golden = bool, og = bool, ann = text|nil }
local function renderGoals(entries)
local hasOG = false
for _, e in ipairs(entries) do
if e.og then hasOG = true break end
end
if hasOG then
for _, e in ipairs(entries) do
if not e.golden then e.og, e.ann = true, nil end
end
end
local parts, lastG = {}, nil
for i, e in ipairs(entries) do
local ann = e.ann
if e.og then
local last = true
for j = i + 1, #entries do
if entries[j].golden == e.golden and entries[j].og then last = false break end
end
ann = last and OG_LINK or nil
end
local span = goalSpan(e.minute, ann)
if e.golden ~= lastG then
parts[#parts + 1] = goalIcon(e.golden, e.og) .. ' ' .. span
lastG = e.golden
else
parts[#parts + 1] = span
end
end
return table.concat(parts, ', ')
end
-- --------------------------------------------------------------------------
-- free-text parsing for the box feature
-- --------------------------------------------------------------------------
local function splitLines(s)
s = mw.ustring.gsub(s, '<[Bb][Rr]%s*/?%s*>', '\n')
local out = {}
for _, l in ipairs(mw.text.split(s, '\n')) do
l = mw.text.trim((mw.ustring.gsub(l, '^%s*%*%s*', '')))
if l ~= '' then out[#out + 1] = l end
end
return out
end
local goldenPrefix = { 'golden%s+', 'gold%s+', 'g%.g%.%s*', 'gg%s*' }
-- player name (linked or unlinked) at the start of a goal line
local function extractPlayer(line)
if mw.ustring.sub(line, 1, 2) == '[[' then
local e = mw.ustring.find(line, '%]%]', 3)
if e then
return mw.ustring.sub(line, 1, e + 1), mw.text.trim(mw.ustring.sub(line, e + 2))
end
end
-- unlinked: the name ends at the first digit or standalone golden keyword
local pos = mw.ustring.find(line, '%d')
local lower = mw.ustring.lower(line)
for _, pat in ipairs({ '%s(golden)%s', '%s(gold)%s', '%s(gg)%s', '%s(gg)%d', '%s(g%.g%.)' }) do
local s = mw.ustring.find(lower, pat)
if s and (not pos or s + 1 < pos) then pos = s + 1 break end
end
if pos and pos > 1 then
local name = mw.text.trim(mw.ustring.sub(line, 1, pos - 1))
if mw.ustring.find(name, "[%-‐‑‒–—―−']$") then return line, '' end
return name, mw.text.trim(mw.ustring.sub(line, pos))
end
return line, ''
end
-- one comma segment -> goal entry
local function parseSegment(seg)
seg = mw.text.trim(seg)
local golden, lower = false, mw.ustring.lower(seg)
for _, gp in ipairs(goldenPrefix) do
local s, e = mw.ustring.find(lower, '^' .. gp)
if s then golden = true; seg = mw.text.trim(mw.ustring.sub(seg, e + 1)) break end
end
local minute, rest = mw.ustring.match(seg, "^(%d[%d%s%+']*)(.*)$")
if not minute then return nil end -- no leading minute -> not a goal
local entry = { minute = mw.text.trim(minute), golden = golden, og = false, ann = nil }
local mod = mw.ustring.match(rest, '^%s*%(%s*(.-)%s*%)%s*$') or rest -- "(o.g.)" or "o.g."
mod = mw.text.trim(delink(mod)) -- a linked annotation reduces to its text
if mod ~= '' then
local m = modMap[mw.ustring.lower(mod)]
if m == 'og' then entry.og = true
elseif m == 'pen' then entry.ann = PEN_LINK
else entry.unresolved = true end -- an annotation we do not recognise
end
return entry
end
-- a comma-separated run of segments -> list of goal entries
local function segmentsToEntries(text)
local entries = {}
for _, seg in ipairs(mw.text.split(text, ',')) do
if mw.text.trim(seg) ~= '' then
local e = parseSegment(seg)
if not e then return nil end
entries[#entries + 1] = e
end
end
return entries
end
local function joinLines(out, isList)
if isList then
for i, r in ipairs(out) do out[i] = '*' .. r end
return table.concat(out, '\n')
end
return table.concat(out, '<br>')
end
-- returns: out (table of lines), isList, autoUsed
local function formatGoals(input)
input = normApo(input)
if mw.ustring.find(input, '[xX×]%d') then return nil end
local isList = mw.ustring.match(mw.text.trim(input), '^%*') ~= nil
local out = {}
for _, line in ipairs(splitLines(input)) do
local name, rest = extractPlayer(line)
if rest == '' then return nil end
local entries = segmentsToEntries(rest)
if not entries or #entries == 0 then return nil end
for _, e in ipairs(entries) do
if e.unresolved then return nil end
end
out[#out + 1] = name .. ' <span class="fb-goal">' .. renderGoals(entries) .. '</span>'
end
if #out == 0 then return nil end
return out, isList, true
end
-- returns: out (table of lines), isList, autoUsed
local function formatPenalties(input, isTeam2)
local isList = mw.ustring.match(mw.text.trim(input), '^%*') ~= nil
local out, auto = {}, false
for _, line in ipairs(splitLines(input)) do
local name, kw
local ls, le = mw.ustring.find(line, '%[%[.-%]%]')
if ls then
name = mw.ustring.sub(line, ls, le)
local before = mw.text.trim(mw.ustring.sub(line, 1, ls - 1))
local after = mw.text.trim(mw.ustring.sub(line, le + 1))
kw = penKW[mw.ustring.lower(after)] or penKW[mw.ustring.lower(before)]
else
local lower = mw.ustring.lower(line)
for word, res in pairs(penKW) do
if mw.ustring.find(lower, '^' .. word .. '%s+') then
kw, name = res, mw.text.trim(mw.ustring.sub(line, #word + 1)) break
end
local s = mw.ustring.find(lower, '%s+' .. word .. '$')
if s then kw, name = res, mw.text.trim(mw.ustring.sub(line, 1, s - 1)) break end
end
end
if name and kw then
local ic = kw == 'goal' and icon.pengoal or icon.penmiss
out[#out + 1] = isTeam2 and (ic .. ' ' .. name) or (name .. ' ' .. ic)
auto = true
else
out[#out + 1] = line
end
end
return out, isList, auto
end
-- --------------------------------------------------------------------------
-- argument helpers for the template entry points
-- --------------------------------------------------------------------------
local function getArgs(frame)
local args = {}
local parent = frame:getParent()
if parent then for k, v in pairs(parent.args) do args[k] = v end end
for k, v in pairs(frame.args) do args[k] = v end -- direct #invoke args win
return args
end
local function maxIndex(args)
local m = 0
for k in pairs(args) do
local n = tonumber(k)
if n and n == math.floor(n) and n > m then m = n end
end
return m
end
-- --------------------------------------------------------------------------
-- template entry points
-- --------------------------------------------------------------------------
-- {{Goal}}
function p.goal(frame)
local args = getArgs(frame)
local maxn = maxIndex(args)
-- gather the non-empty positional values in order
local toks, hasComma = {}, false
for i = 1, maxn do
local v = args[i]
if notBlank(v) then
toks[#toks + 1] = v
if mw.ustring.find(v, ',') then hasComma = true end
end
end
local entries
if hasComma then
-- free-text dialect (same parser as the box feature)
entries = segmentsToEntries(normApo(table.concat(toks, ', '))) or {}
else
-- pair dialect, tolerant of misplaced pipes
entries = {}
local current
for _, v in ipairs(toks) do
local e = asMinuteEntry(v)
if e then
current = e
entries[#entries + 1] = e
elseif current and current.ann == nil and not current.og then
current.og, current.ann = goalAnnot(v) -- annotate the open minute
elseif not current then
current = { minute = '', golden = false, og = false, ann = nil }
current.og, current.ann = goalAnnot(v)
entries[#entries + 1] = current
end
-- a stray extra annotation after an already-annotated minute is dropped
end
end
local inner = #entries > 0 and renderGoals(entries) or icon.goal
return '<span class="fb-goal">' .. inner .. '</span>'
end
-- {{Golden goal}}
function p.goldengoal(frame)
local args = getArgs(frame)
local m, a = args[1], args[2]
local og, ann = false, nil
if notBlank(a) then og, ann = goalAnnot(a) end
if notBlank(m) or notBlank(a) then
return renderGoals({ { minute = m, golden = true, og = og, ann = ann } })
end
return goalIcon(true, og)
end
-- {{Yel}} -- yellow card
function p.yellow(frame)
local args = getArgs(frame)
local t1, t2 = args[1], args[2]
local out = yc('Booked')
if notBlank(t1) then
out = out .. '<span style="vertical-align: middle;"> ' .. stageLabel(t1) .. '</span>'
end
local up = notBlank(t2) and mw.ustring.upper(mw.text.trim(t2)) or ''
if up == 'PSO' or up == 'PK' or up == 'FT' then
out = out .. ' ' .. yc('Booked immediately before/during/after penalty shoot-out (cards reset)')
.. '<span style="vertical-align: middle;"> ' .. stageLabel(t2, 'pso') .. '</span>'
end
if inMain() and (notBlank(t2) or notBlank(args[3]) or notBlank(args[4])) then
out = out .. YEL2_CAT
end
return out
end
-- {{Sent off}} -- param 1 is the number of bookings before dismissal
function p.sentoff(frame)
local args = getArgs(frame)
local mode = mw.text.trim(args[1] or '')
local a2, a3, a4 = args[2], args[3], args[4]
local body
if mode == '1' then
body = timed(yc('Booked'), a2) .. ' ' .. timed(rc('Sent off (straight red)'), a3)
elseif mode == '1+1' then
body = timed(yc('Booked'), a2)
.. ' ' .. timed(yc('Booked immediately before/during/after penalty shoot-out (cards reset)'), a3, 'pso')
.. ' ' .. timed(rc('Sent off (straight red) immediately before/during/after penalty shoot-out'), a4, 'pso')
elseif mode == '2' then
body = timed(yc('Booked'), a2) .. ' ' .. timed(yrc('Sent off (second booking)'), a3)
elseif mode == '1+2' then
body = timed(yc('Booked'), a2)
.. ' ' .. timed(yc('Booked immediately before/during/after penalty shoot-out (cards reset)'), a3, 'pso')
.. ' ' .. timed(yrc('Sent off (second booking) immediately before/during/after penalty shoot-out'), a4, 'pso')
elseif mode == '3' then
body = timed(yc('Booked'), a2, 'plain')
.. ' ' .. timed(yc('Booked again'), a3, 'plain')
.. ' ' .. timed(yrc('Sent off (third booking)'), a4, 'plain')
else -- 0 / default: straight red
body = timed(rc('Sent off (straight red)'), a2)
end
return '<span style="white-space:nowrap;">' .. body .. '</span>'
end
-- {{Subon}}
function p.subon(frame)
local m = getArgs(frame)[1]
local out = '[[File:Sub on.svg|10px|Substituted on|link=|alt=upward-facing green arrow]]'
if notBlank(m) then
out = out .. ' <span style="vertical-align: middle;">' .. fmtMin(m) .. '</span>'
end
return out
end
-- {{Suboff}}
function p.suboff(frame)
local args = getArgs(frame)
local m = args[1]
local out = '[[File:Sub off.svg|10px|Substituted off|link=|alt=downward-facing red arrow]]'
if notBlank(m) then
out = out .. ' <span style="vertical-align: middle;">' .. fmtMin(m) .. '</span>'
end
if notBlank(args.con) or notBlank(args.concussion) then
out = out .. ' (' .. abbr('con.', 'Substituted off due to concussion') .. ')'
end
return out
end
p.yel = p.yellow
-- --------------------------------------------------------------------------
-- module entry point for Module:Football box
-- --------------------------------------------------------------------------
-- fields: { goals1, goals2, penalties1, penalties2 }
-- Returns a table of formatted fields plus `auto` = true when any icon was generated.
function p.formatBox(fields)
local res, auto = {}, false
local function run(key, fn, ...)
local v = fields[key]
if v ~= nil and v ~= '' then
local out, isList, a = fn(v, ...)
if out ~= nil then
res[key] = joinLines(out, isList)
auto = auto or a
end
end
end
run('goals1', formatGoals)
run('goals2', formatGoals)
run('penalties1', formatPenalties, false)
run('penalties2', formatPenalties, true)
res.auto = auto
return res
end
return p
mx43jclza24klcxhgvkztm9m9bowxuw
Template:Cite patent
10
50926
305429
2026-08-16T17:59:12Z
Isma4l
41797
/* */
305429
wikitext
text/x-wiki
<includeonly>{{cite patent/core
|Surname1 = {{#if:{{{inventor|}}}|{{{inventor}}}|{{{inventor-surname|{{{inventor1-surname|{{{inventor-last|{{{inventor1-last|{{{inventor-last1|{{{invent-1|{{{invent1|}}}}}}}}}}}}}}}}}}}}} }}
|Surname2={{{inventor2-surname|{{{inventor2-last|{{{inventor-last2|{{{inventor2|{{{invent2|}}}}}}}}}}}}}}}
|Surname3={{{inventor3-surname|{{{inventor3-last|{{{inventor-last3|{{{inventor3|{{{invent3|}}}}}}}}}}}}}}}
|Surname4={{{inventor4-surname|{{{inventor4-last|{{{inventor-last4|{{{inventor4|{{{invent4|}}}}}}}}}}}}}}}
|Given1 = {{{inventor-given|{{{inventor1-given|{{{inventor-first|{{{inventor1-first|{{{inventor-first1|}}}}}}}}}}}}}}}
|Given2={{{inventor2-given|{{{inventor2-first|{{{inventor-first2|}}}}}}}}}
|Given3={{{inventor3-given|{{{inventor3-first|{{{inventor-first3|}}}}}}}}}
|Given4={{{inventor4-given|{{{inventor4-first|{{{inventor-first4|}}}}}}}}}
|Inventorlink1={{{inventor1-link|{{{inventor-link1|{{{inventorlink1|{{{inventor-link|{{{inventorlink|}}}}}}}}}}}}}}}
|Inventorlink2={{{inventor2-link|{{{inventor-link2|{{{inventorlink2|}}}}}}}}}
|Inventorlink3={{{inventor3-link|{{{inventor-link3|{{{inventorlink3|}}}}}}}}}
|Inventorlink4={{{inventor4-link|{{{inventor-link4|{{{inventorlink4|}}}}}}}}}
|Title={{{title|}}}
|CountryCode={{{country-code|{{{country|{{{1|}}}}}}}}}
|PublicationNumber={{{publication-number|{{{patent-number|{{{number|{{{2|}}}}}}}}}}}}
|Description={{{description|{{{status|{{{3|}}}}}}}}}
|PublicationDate={{{publication-date|{{{pubdate|}}}}}}
|IssueDate={{{issue-date|{{{gdate|}}}}}}
|Year={{{year}}}
|FilingDate={{{fdate|}}}
|PriorityDate={{{pridate|}}}
|Assignee1={{{assign1|{{{assignee|{{{assign|}}}}}}}}}
|Assignee2={{{assign2|}}}
|Ref={{#ifeq:{{{ref|}}}|harv||{{{ref|}}}}}
|RefDate={{{issue-date|{{{gdate|{{{publication-date|{{{pubdate|}}}}}}}}}}}}
|Sep = {{#ifeq:{{{separator|{{{seperator}}}}}}|;|;|{{{separator|{{{seperator|,}}}}}}}}
|PS = {{#if:{{{quote|}}}||{{{postscript|}}}|.}}
|AuthorSep = {{#ifeq:{{{author-separator|}}}|;|;|{{{author-separator|;}}}}} 
|URL{{#if:{{{URL|{{{url|}}}}}}||NULL}}={{{URL|{{{url|}}}}}}
}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using cite patent with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Cite patent]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | assign | assign1 | assign2 | assignee | author-separator | country | country-code | description | fdate | gdate | invent-1 | invent1 | invent2 | invent3 | invent4 | inventor | inventor-first | inventor-first1 | inventor-first2 | inventor-first3 | inventor-first4 | inventor-given | inventor-last | inventor-last1 | inventor-last2 | inventor-last3 | inventor-last4 | inventor-link | inventor-link1 | inventor-link2 | inventor-link3 | inventor-link4 | inventor-surname | inventor1-first | inventor1-given | inventor1-last | inventor1-link | inventor1-surname | inventor2 | inventor2-first | inventor2-given | inventor2-last | inventor2-link | inventor2-surname | inventor3 | inventor3-first | inventor3-given | inventor3-last | inventor3-link | inventor3-surname | inventor4 | inventor4-first | inventor4-given | inventor4-last | inventor4-link | inventor4-surname | inventorlink | inventorlink1 | inventorlink2 | inventorlink3 | inventorlink4 | issue-date | number | patent-number | postscript | pridate | pubdate | publication-date | publication-number | quote | ref | separator | seperator | status | title | url | URL | year }}<noinclude>{{documentation}}</noinclude>
fkc3zy5l9ito1h6f3xy114bbha1z4s0
Template:Cite patent/core
10
50927
305430
2026-08-16T17:59:44Z
Isma4l
41797
/* */
305430
wikitext
text/x-wiki
<templatestyles src="Citation/styles.css"/><span class="citation patent"{{#ifeq:{{{Ref|}}}|none||{{#if:{{{Ref|}}}|id="{{anchorencode:{{{Ref|}}}}}"|{{#if:{{{Surname1|}}}{{{EditorSurname1|}}}
|id="CITEREF{{anchorencode:{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{#if:{{{RefDate|}}}|{{#time:Y|{{{RefDate|}}}}}}}}}"}}}}}}>{{citation/make_link
| 1={{{URL|{{{url|https://worldwide.espacenet.com/textdoc?DB=EPODOC&IDX={{{CountryCode}}}{{{PublicationNumber}}}}}}}}}
| 2={{{CountryCode}}}{{
#if: {{{Description|}}}
| {{{Description}}}
}} {{{PublicationNumber}}}
}}{{#if:{{{Surname1|}}}|{{{Sep|,}}} {{cite patent/authors
| Surname1 = {{{Surname1}}}
| Given1 = {{{Given1|}}}
| Authorlink1 = {{{Inventorlink1|}}}
| Surname2 = {{{Surname2|}}}
| Given2 = {{{Given2|}}}
| Authorlink2 = {{{Inventorlink2|}}}
| Surname3 = {{{Surname3|}}}
| Given3 = {{{Given3|}}}
| Authorlink3 = {{{Inventorlink3|}}}
| Surname4 = {{{Surname4|}}}
| Given4 = {{{Given4|}}}
| Authorlink4 = {{{Inventorlink4|}}}
}}}}{{
#if: {{{Title|}}}
|{{{Sep|,}}} "{{{Title}}}"
}}{{
#if: {{{PublicationDate|}}}
|{{{Sep|,}}} published {{#invoke:auto date formatter|pub_date_format|{{{PublicationDate}}}}}
}}{{
#if: {{{IssueDate|}}}
|{{{Sep|,}}} issued {{#invoke:auto date formatter|pub_date_format|{{{IssueDate}}}}}
}}{{
#if: {{{Assignee1|}}}
|{{{Sep|,}}}  assigned to {{{Assignee1}}}
}}{{
#if: {{{Assignee2|}}}
|  and {{{Assignee2}}}
}}{{{PS|}}}</span><!--
=== This is a COinS tag (http://ocoins.info), which allows automated tools to parse the citation information: ===
--><span class="Z3988" title="ctx_ver=Z39.88-2004<!--
-->&rft_val_fmt={{urlencode:info:ofi/fmt:kev:mtx:patent}}<!--
-->{{#ifeq: {{{Description|}}}|application
|&rft.applnumber={{{PublicationNumber}}}<!--
--> |&rft.number={{{PublicationNumber}}}}}<!--
-->&rft.cc={{{CountryCode}}}<!--
-->&rft.title={{urlencode:{{{Title}}}}}<!--
-->{{#if: {{{Surname1|}}} | &rft.inventor={{urlencode:{{{Surname1}}}}} }}<!--
-->{{#if: {{{Assignee1|}}} | &rft.assignee={{urlencode:{{{Assignee1}}}}} }}<!--
-->{{#if: {{{IssueDate|}}} | &rft.date={{{IssueDate}}} }}<!--
-->{{#if: {{{FilingDate|}}} | &rft.appldate={{{FilingDate}}} }}<!--
-->{{#if: {{{PublicationDate|}}} | &rft.pubdate={{{PublicationDate}}} }}<!--
-->{{#if: {{{PriorityDate|}}} | &rft.prioritydate={{{PriorityDate}}} }}<!--
-->"><span style="display: none;"> </span></span><noinclude>
{{documentation}}
</noinclude>
46e1mbc485rga5nospn4v1mfr47p088
Template:Citation/styles.css
10
50928
305431
2026-08-16T18:00:20Z
Isma4l
41797
Bog cusub: /* * This page is a convenient place for the "citation" styles that are * available in many of our citation templates. This page can be considered the * authoritative source for those styles. [[Template:Citation]], like all CS1/2 * templates, is styled from [[Module:Citation/CS1/styles.css]], *not* here. */ /* Break long urls, etc., rather than overflowing box */ .citation { word-wrap: break-word; } /* Highlight linked elements (such as clicked references) in blue */ .cita...
305431
sanitized-css
text/css
/*
* This page is a convenient place for the "citation" styles that are
* available in many of our citation templates. This page can be considered the
* authoritative source for those styles. [[Template:Citation]], like all CS1/2
* templates, is styled from [[Module:Citation/CS1/styles.css]], *not* here.
*/
/* Break long urls, etc., rather than overflowing box */
.citation {
word-wrap: break-word;
}
/* Highlight linked elements (such as clicked references) in blue */
.citation:target {
/* ignore the linter - all browsers of interest implement this */
background-color: rgba(0, 127, 255, 0.133);
}
17n9dej9z0k1oldv8hiz6g1e64pmppp
Template:CFL Year
10
50929
305432
2026-08-16T18:01:48Z
Isma4l
41797
/* */
305432
wikitext
text/x-wiki
[[{{{1}}} Xilli ciyaareedka CFL|{{{1}}}]]{{#if:{{{2|}}}|–{{#switch:{{lc:{{{2}}}}}
|present=present
|#default={{#ifexpr:{{{2}}}>999
|[[{{{2}}} CFL season|{{{2}}}]]
|[[{{#expr:(
trunc({{{1}}}/100)
+ {{#ifexpr:{{{2}}}<({{{1}}} mod 100)|1|0}}
)*100+{{{2}}}}} CFL season|{{#expr:(
trunc({{{1}}}/100)
+ {{#ifexpr:{{{2}}}<({{{1}}} mod 100)|1|0}}
)*100+{{{2}}}}}]]
}}
}}}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
p87dqzwbttp3ct1pr48ro8omnlqi890
Template:Harvard citation text
10
50930
305433
2026-08-16T18:02:21Z
Isma4l
41797
/* */
305433
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation
|bracket_year_left = (
|bracket_year_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}||)}}
|bracket_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}|)}}
|template=harvtxt
}}</includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
oblo5w35i41ubnxcrrx7rcofaxowvc0
Template:Space+double
10
50931
305434
2026-08-16T18:10:28Z
Isma4l
41797
/* */
305434
wikitext
text/x-wiki
<span style="padding-left:.15em;">"</span><noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage and interwikis to Wikidata. -->
</noinclude>
jcxl30y8j2nu6970n0lnxk284xeawo0
Module:Category pair
828
50932
305435
2026-08-16T18:17:15Z
Isma4l
41797
Bog cusub: require('strict') local getArgs = require('Module:Arguments').getArgs local hatnote = require('Module:Hatnote')._hatnote local formatLink = require('Module:Format link')._formatLink local p = {} local catNS = mw.site.namespaces.Category.id -- category namespace number local function exists(title) local success, result = pcall(function() return title.exists end) return success and result end -- Lua implementation of [[Template:CategoryPair]] -- Arguments: -- prevTitle -- m...
305435
Scribunto
text/plain
require('strict')
local getArgs = require('Module:Arguments').getArgs
local hatnote = require('Module:Hatnote')._hatnote
local formatLink = require('Module:Format link')._formatLink
local p = {}
local catNS = mw.site.namespaces.Category.id -- category namespace number
local function exists(title)
local success, result = pcall(function() return title.exists end)
return success and result
end
-- Lua implementation of [[Template:CategoryPair]]
-- Arguments:
-- prevTitle -- mw.title.Title object for preceding category
-- nextTitle -- mw.title.Title object for succeeding category
-- Returns:
-- hatnote that says "see also" for one or both of prev/next (depending on whether they exist)
function p._pair(prevTitle, nextTitle)
prevTitle = prevTitle and exists(prevTitle) and formatLink{link = prevTitle.fullText}
nextTitle = nextTitle and exists(nextTitle) and formatLink{link = nextTitle.fullText}
local note = ''
if prevTitle and nextTitle then -- if both
note = mw.ustring.format('See also the preceding %s and the succeeding %s',prevTitle, nextTitle)
elseif prevTitle then -- if only prevTitle
note = mw.ustring.format('See also the preceding %s', prevTitle)
elseif nextTitle then -- if only nextTitle
note = mw.ustring.format('See also the succeeding %s', nextTitle)
else -- otherwise neither
return mw.title.getCurrentTitle().namespace == catNS and '[[Category:Pages using category pair with no output]]' or ''
end
return hatnote(note, {extraclasses = 'seealso'})
end
function p.catPair(frame)
local args = getArgs(frame, {wrappers={'Template:Category pair'}})
local prevTitle = args[1] and mw.title.new(args[1],catNS)
local nextTitle = args[2] and mw.title.new(args[2],catNS)
return p._pair(prevTitle, nextTitle)
end
function p.prevCat(frame)
local args = getArgs(frame, {wrappers={'Template:Preceding category'}})
local prevTitle = args[1] and mw.title.new(args[1], catNS)
return p._pair(prevTitle, nil)
end
function p.nextCat(frame)
local args = getArgs(frame, {wrappers={'Template:Succeeding category'}})
local nextTitle = args[1] and mw.title.new(args[1], catNS)
return p._pair(nil, nextTitle)
end
return p
ei08noc3n6h57z5kkmdzbec52485ikc
Template:Flag IOC 2 athlete
10
50933
305436
2026-08-16T18:18:54Z
Isma4l
41797
/* */
305436
wikitext
text/x-wiki
<includeonly>{{#invoke:Country alias|flagXYZ|name={{{name|}}}|type=athlete}}</includeonly><noinclude>
{{documentation|Template:FlagIOC2athlete/doc}}
</noinclude>
qas2mg40zi2nitp0r00prbd6vnejmw0
Template:Userbox-r
10
50934
305438
2026-08-16T18:20:44Z
Isma4l
41797
/* */
305438
wikitext
text/x-wiki
{{#invoke:userbox|userbox-r}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
cgjcrsrud8qm2e9aos7qmhkl2wal0uq
Template:Also known as
10
50935
305440
2026-08-16T18:23:25Z
Isma4l
41797
/* */
305440
wikitext
text/x-wiki
<abbr title="sidoo kale loo yaqaan sida">{{#if:{{{AKA|}}}{{{uc|}}}|AKA|a.k.a.}}</abbr><noinclude>
{{documentation}}<!--Please add this template's categories to the /doc subpage, interwikis to Wikidata, not here - thanks!-->
</noinclude>
1w28kxi48f1mw9fd4k1um321mkmb6n2
Template:Tab/Number of defined parameters
10
50936
305445
2026-08-16T18:31:36Z
Isma4l
41797
/* */
305445
wikitext
text/x-wiki
{{#expr:
+{{#if:{{{1|}}}|1|0}}
+{{#if:{{{2|}}}|1|0}}
+{{#if:{{{3|}}}|1|0}}
+{{#if:{{{4|}}}|1|0}}
+{{#if:{{{5|}}}|1|0}}
+{{#if:{{{6|}}}|1|0}}
+{{#if:{{{7|}}}|1|0}}
+{{#if:{{{8|}}}|1|0}}
+{{#if:{{{9|}}}|1|0}}
+{{#if:{{{10|}}}|1|0}}
+{{#if:{{{11|}}}|1|0}}
+{{#if:{{{12|}}}|1|0}}
+{{#if:{{{13|}}}|1|0}}
+{{#if:{{{14|}}}|1|0}}
+{{#if:{{{15|}}}|1|0}}
+{{#if:{{{16|}}}|1|0}}
+{{#if:{{{17|}}}|1|0}}
+{{#if:{{{18|}}}|1|0}}
+{{#if:{{{19|}}}|1|0}}
+{{#if:{{{20|}}}|1|0}}
}}<noinclude>{{Documentation|content=
{{High-use}}
Loogu talagalay isticmaalka {{tl|Start tab}} iyo {{tl|End tab}}.
}}</noinclude>
tkpbo6pgfr9j7r3xymuqymcpql5ezd8
Template:Trim %
10
50937
305447
2026-08-16T18:36:42Z
Isma4l
41797
/* */
305447
wikitext
text/x-wiki
{{safesubst<noinclude/>:#invoke:String|replace|{{{1|}}}|%|}}<noinclude>
{{documentation}}
</noinclude>
thle8nhd272mnwcp5hr703ghtgmqe7m
Module:Rotten Tomatoes data
828
50938
305448
2026-08-16T18:40:22Z
Isma4l
41797
Bog cusub: local Error = require('Module:Error') local getArgs = require('Module:Arguments').getArgs local p = {} local months = {'Jannaayo', 'Febraayo', 'Maarso', 'Abriil', 'Maajo', 'Juun', 'Luulyo', 'Agoosto', 'Septeembar', 'Oktoobar', 'Nofeembar', 'Diseembar'} local aliasesQ = { RottenTomatoes = "Q105584", RottenTomatoesScore = "Q108403393", RottenTomatoesAverage = "Q108403540", Fandango = "Q5433722", } local aliasesP = { RottenTomatoe...
305448
Scribunto
text/plain
local Error = require('Module:Error')
local getArgs = require('Module:Arguments').getArgs
local p = {}
local months = {'Jannaayo', 'Febraayo', 'Maarso', 'Abriil', 'Maajo', 'Juun',
'Luulyo', 'Agoosto', 'Septeembar', 'Oktoobar', 'Nofeembar', 'Diseembar'}
local aliasesQ = {
RottenTomatoes = "Q105584",
RottenTomatoesScore = "Q108403393",
RottenTomatoesAverage = "Q108403540",
Fandango = "Q5433722",
}
local aliasesP = {
RottenTomatoesId = "P1258",
reviewScore = "P444",
reviewScoreBy = "P447",
numberOfReviews = "P7887",
pointInTime = "P585",
determinationMethod = "P459",
author = "P50",
publisher = "P123",
statedIn = "P248",
language = "P407",
retrieved = "P813",
referenceURL = "P854",
archiveURL = "P1065",
title = "P1476",
formatterURL = "P1630",
archiveDate = "P2960",
}
-- Helper functions ------------------------------------------------------------
local function falsy(x)
return x == false or x == nil or x == '' or x == 0 or type(x) == 'table' and next(x) == nil
end
-- copied from Module:wd
local function parseDate(dateStr, precision)
precision = precision or "d"
local i, j, index, ptr
local parts = {nil, nil, nil}
if dateStr == nil then
return parts[1], parts[2], parts[3] -- year, month, day
end
-- 'T' for snak values, '/' for outputs with '/Julian' attached
i, j = dateStr:find("[T/]")
if i then
dateStr = dateStr:sub(1, i-1)
end
local from = 1
if dateStr:sub(1,1) == "-" then
-- this is a negative number, look further ahead
from = 2
end
index = 1
ptr = 1
i, j = dateStr:find("-", from)
if i then
-- year
parts[index] = tonumber(mw.ustring.gsub(dateStr:sub(ptr, i-1), "^%+(.+)$", "%1"), 10) -- remove '+' sign (explicitly give base 10 to prevent error)
if parts[index] == -0 then
parts[index] = tonumber("0") -- for some reason, 'parts[index] = 0' may actually store '-0', so parse from string instead
end
if precision == "y" then
-- we're done
return parts[1], parts[2], parts[3] -- year, month, day
end
index = index + 1
ptr = i + 1
i, j = dateStr:find("-", ptr)
if i then
-- month
parts[index] = tonumber(dateStr:sub(ptr, i-1), 10)
if precision == "m" then
-- we're done
return parts[1], parts[2], parts[3] -- year, month, day
end
index = index + 1
ptr = i + 1
end
end
if dateStr:sub(ptr) ~= "" then
-- day if we have month, month if we have year, or year
parts[index] = tonumber(dateStr:sub(ptr), 10)
end
return parts[1], parts[2], parts[3] -- year, month, day
end
-- nil dates precede all reasonable dates since year becomes 1
local function datePrecedesDate(aY, aM, aD, bY, bM, bD)
aY, aM, aD = aY or 1, aM or 1, aD or 1
bY, bM, bD = bY or 1, bM or 1, bD or 1
if aY < bY then return true end
if aY > bY then return false end
if aM < bM then return true end
if aM > bM then return false end
if aD < bD then return true end
return false
end
-- format options: 'dmy', 'mdy', 'ymd', 'iso'
local function format_date(Y, M, D, format)
format = format or 'MDY'
local s = (D or '') .. (months[M] or '') .. (Y or '')
return mw.getCurrentFrame():expandTemplate{title='Date', args={s, format}}
end
--------------------------------------------------------------------------------
-- Returns either QID, true, or ErrorString, false
local function getentityID(args)
local entityID = args.qid
if falsy(entityID) then
local title = args.title
if falsy(title) then
local currentID = mw.wikibase.getEntityIdForCurrentPage()
if currentID then
return currentID, true
end
return Error.error({'No Wikidata item connected to current page. Need qid or title argument.'}), false
else
-- if not mw.title.makeTitle(0, title).exists then
-- return Error.error({'Article ' .. title .. ' does not exist.'}), false
-- end
entityID = mw.wikibase.getEntityIdForTitle(title)
if not entityID then
return Error.error({'Article "' .. title .. '" does not exist or has no Wikidata item.'}), false
end
return entityID, true
end
end
--At this point we should have an entityID. Check if valid.
if not mw.wikibase.isValidEntityId(entityID) then
return Error.error({'Invalid Q-identifier.'}), false
end
if not mw.wikibase.entityExists(entityID) then
return Error.error({'Wikidata item ' .. entityID .. ' does not exist.'}), false
end
return entityID, true
end
local function point_in_time(statement)
if not statement.qualifiers then
return nil, nil, nil
end
local pointintime = statement.qualifiers[aliasesP.pointInTime]
if pointintime then
return parseDate(pointintime[1].datavalue.value.time)
end
return nil, nil, nil
end
local function access_date(statement)
if statement.references then
local accessdate = statement.references[1].snaks[aliasesP.retrieved]
if accessdate then
return parseDate(accessdate[1].datavalue.value.time)
end
end
return nil, nil, nil
end
local function date_from_statement(statement)
local Y, M, D = point_in_time(statement)
if Y then
return Y, M, D
end
Y, M, D = access_date(statement)
if Y then
return Y, M, D
end
if statement.rank == 'preferred' then
return 1, 1, 3
elseif statement.rank == 'normal' then
return 1, 1, 2
end
return 1, 1, 1
end
local function reviewedby_RT(statement)
if not statement.qualifiers then return false end
local x = statement.qualifiers[aliasesP.reviewScoreBy]
return x and x[1].datavalue.value.id == aliasesQ.RottenTomatoes
end
local function score_type(statement)
local x = nil
if statement.qualifiers then
x = statement.qualifiers[aliasesP.determinationMethod]
end
if x then
x = x[1].datavalue.value.id
end
local y = ''
if statement.mainsnak.snaktype == 'value' then
y = statement.mainsnak.datavalue.value
end
if x == aliasesQ.RottenTomatoesScore then
return 'percent'
elseif x == aliasesQ.RottenTomatoesAverage then
return 'average'
elseif string.match(y, '^[0-9]%%$') or string.match(y, '^[1-9][0-9]%%$') or string.match(y, '^100%%$') then
return 'percent'
elseif string.match(y, '^[0-9] percent$') or string.match(y, '^[1-9][0-9] percent$') or string.match(y, '^100 percent$') then
return 'percent'
elseif string.match(y, '^%d/10$') or string.match(y, '^%d%.%d%d?/10$') then
return 'average'
elseif string.match(y, '^%d out of 10$') or string.match(y, '^%d%.%d%d? out of 10$') then
return 'average'
end
return nil
end
local function most_recent_score_statement(entityID, scoretype)
scoretype = scoretype or 'percent'
local score_statements = mw.wikibase.getAllStatements(entityID, aliasesP.reviewScore)
local newest, nY, nM, nD
for i, v in ipairs(score_statements) do
local Y, M, D = date_from_statement(v)
if v.rank ~= 'deprecated' and v.mainsnak.snaktype == 'value'
and reviewedby_RT(v) and score_type(v)==scoretype
and not datePrecedesDate(Y, M, D, nY, nM, nD) then
nY, nM, nD = Y, M, D
newest = v
end
end
return newest
end
local function get_score(entityID, scoretype)
scoretype = scoretype or 'percent'
local x = most_recent_score_statement(entityID, scoretype)
if x == nil then
return nil
end
return x.mainsnak.datavalue.value
end
local function get_count(entityID, args)
local x = most_recent_score_statement(entityID)
if x == nil then
return nil
end
local y = x.qualifiers[aliasesP.numberOfReviews]
if y == nil then
return nil
end
local retval = string.match(y[1].datavalue.value.amount, '%d+') -- dont get sign
if args ~= nil and args.spell then
local s = {[1]=retval}
for key, val in pairs(args) do
if key == 1 or key == 'qid' or key == 'title' then
elseif type(key) ~= 'number' then
s[key] = val
end
end
return mw.getCurrentFrame():expandTemplate{title='Spellnum per MOS', args=s}
end
return retval
end
local function get_rtid(entityID, noprefix)
local rtid_statements = mw.wikibase.getBestStatements(entityID, aliasesP.RottenTomatoesId)
local newest, nY, nM, nD
for i, v in ipairs(rtid_statements) do
local Y, M, D = date_from_statement(v)
if not datePrecedesDate(Y, M, D, nY, nM, nD) then
nY, nM, nD = Y, M, D
newest = v
end
end
if newest == nil then
return nil
end
newest = newest.mainsnak.datavalue.value
if noprefix then
newest = string.sub(newest, string.find(newest, '/') + 1)
end
return newest
end
local function get_url(entityID)
local rtid = get_rtid(entityID)
if rtid == nil then
return nil
end
local x = mw.wikibase.getBestStatements(aliasesP.RottenTomatoesId, aliasesP.formatterURL)
return (string.gsub(x[1].mainsnak.datavalue.value, '$1', rtid))
end
local function get_date(entityID, part, format)
local z = most_recent_score_statement(entityID)
if z == nil then
return nil
end
local Y, M, D = date_from_statement(z)
if part == 'year' then
return Y or ''
elseif part == 'month' then
return months[M] or ''
elseif part == 'day' then
return D or ''
end
return format_date(Y, M, D, format)
end
local function get_access_date(entityID, format)
local z = most_recent_score_statement(entityID)
if z == nil then
return nil
end
local Y, M, D = access_date(z)
if not Y then
Y, M, D = point_in_time(z)
end
return format_date(Y, M, D, format)
end
local function get_asof(entityID, args)
local s = {}
for key, val in pairs(args) do
if key == 1 or key == 'qid' or key == 'title' then
elseif key == 2 then
s[1] = get_date(entityID, 'year')
elseif key == 3 then
s[2] = get_date(entityID, 'month')
elseif key == 4 then
s[3] = get_date(entityID, 'day')
elseif type(key) == 'number' then
s[key-1] = val
else
s[key] = val
end
end
return mw.getCurrentFrame():expandTemplate{title='As of', args=s}
end
local function get_rtprose(entityID, args)
local s = {get_score(entityID), get_score(entityID, 'average'), get_count(entityID)}
s[1] = string.match(s[1], '%d+')
s[2] = string.match(s[2], '%d%.%d%d?') or string.match(s[2], '%d')
s["access-date"] = get_access_date(entityID, args.df)
for key, val in pairs(args) do
if key == 1 or key == 'qid' or key == 'title' then
elseif type(key) == 'number' then
s[key + 2] = val
else
s[key] = val
end
end
return mw.getCurrentFrame():expandTemplate{title='Rotten Tomatoes prose', args=s}
end
local function get_edit_icon(entityID)
return require('Module:EditAtWikidata')._showMessage{qid=entityID, pid='P444'}
end
local function get_table(entityID)
return get_score(entityID) .. ' (' .. get_count(entityID) .. ' reviews)'
end
function p.main(frame)
local args = getArgs(frame, {
wrappers = 'Template:Rotten Tomatoes data',
removeBlanks = false,
})
return p._main(args)
end
function p._main(args)
local entityID, is_good = getentityID(args)
if not is_good then
return entityID -- which is the error message in this case
end
local command = args[1]
if falsy(command) then
return Error.error({'Missing command.'})
end
command = string.lower(command)
local retval
if command == 'score' then
retval = get_score(entityID, 'percent')
elseif command == 'average' then
retval = get_score(entityID, 'average')
elseif command == 'count' then
retval = get_count(entityID, args)
elseif command == 'rtid' then
retval = get_rtid(entityID, args.noprefix)
elseif command == 'url' then
retval = get_url(entityID)
elseif command == 'date' then
retval = get_date(entityID, 'date', args.df)
elseif command == 'year' then
retval = get_date(entityID, command)
elseif command == 'month' then
retval = get_date(entityID, command)
elseif command == 'day' then
retval = get_date(entityID, command)
elseif command == 'access date' or command == 'accessdate' or command == 'access-date' then
retval = get_access_date(entityID, args.df)
elseif command == 'as of' or command == 'asof' then
retval = get_asof(entityID, args)
elseif command == 'prose' then
retval = get_rtprose(entityID, args)
elseif command == 'edit' then
retval = get_edit_icon(entityID)
elseif command == 'table' then
retval = get_table(entityID)
else
return Error.error({'Invalid command.'})
end
if falsy(retval) then
return Error.error({'RT data for "' .. command .. '" unavailable.'})
end
return retval
end
return p
1vulhyzdh5qhtnl7gozbnuzq92uoxqd
Template:Rotten Tomatoes data
10
50939
305449
2026-08-16T18:41:03Z
Isma4l
41797
/* */
305449
wikitext
text/x-wiki
<includeonly>{{#invoke: Rotten Tomatoes data|main|{{{1|}}}|qid={{{qid|}}}|title={{{title|}}}}}</includeonly><noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! -->
</noinclude>
6qey5hmnxbtlkamad3xhpjaiac027fh
Template:Cite POWO
10
50940
305450
2026-08-16T18:41:52Z
Isma4l
41797
/* */
305450
wikitext
text/x-wiki
<includeonly>{{#invoke:template wrapper|wrap|_template=cite web|_exclude=id
| url = https://powo.science.kew.org/taxon/{{{id|}}}
| website = [[Plants of the World Online]]
| publisher = [[Royal Botanic Gardens, Kew]]
| language = en
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
stcfhjckjr9cwdvb01uhcdlhe5rpqqp
Template:IAST
10
50941
305451
2026-08-16T18:42:31Z
Isma4l
41797
/* */
305451
wikitext
text/x-wiki
<includeonly>{{Transliteration|sa|IAST|{{{1}}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
a489onq2mv2z8qvpzslax0uz20s13w3
Template:Harvard citation
10
50942
305453
2026-08-16T18:44:41Z
Isma4l
41797
/* */
305453
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation
|bracket_left= (
|bracket_right = )
}}</includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
nu22p5asevjuxsevxu91z5vdnzmtbmi
Module:Section sizes
828
50943
305454
2026-08-16T18:45:40Z
Isma4l
41797
Bog cusub: require('strict'); local lang_obj = mw.language.getContentLanguage(); -- language object for number formatting appropriate to local language --[[--------------------------< I 1 8 N _ T >------------------------------------------------------------------ An associative table of static text used in this module for use when translating this module to other languages. The values $1 and $2 are replaced with values as stated in the associated message comment ]] local i18n_...
305454
Scribunto
text/plain
require('strict');
local lang_obj = mw.language.getContentLanguage(); -- language object for number formatting appropriate to local language
--[[--------------------------< I 1 8 N _ T >------------------------------------------------------------------
An associative table of static text used in this module for use when translating this module to other languages.
The values $1 and $2 are replaced with values as stated in the associated message comment
]]
local i18n_t = {
-- non-fatal error messaging
['markup removed'] = 'markup removed; cannot link', -- error message
-- fatal error messaging
['fatal_no_article'] = 'error: no article: $1', -- $1 is page name
['fatal_no_sections'] = 'error: no sections found in: $1', -- $1 is page name
['fatal_redirect'] = 'error: $1 is a redirect', -- $1 is page name
['help link'] = '([[$1|help]])', -- help text wikilink for all error messages; $1 is calling template's name
['error category'] = '[[category:Pages with $1 errors]]', -- $1 is calling template's name; comment out this line, to suppress error category
['table caption'] = 'Section size for [[$1]] ($2 sections)', -- caption; $1 is page name; $2 is number of sections
['section_name'] = 'Section name', -- column headings; left to right
['byte_count'] = 'Byte count',
['prose_size'] = 'Prose size (words)',
['section_header'] = 'Header', -- column headings; left to right
['section_total'] = 'Total',
['top'] = nil, -- for the unnamed lede section; use this only when this module does not get correct string from MediaWiki:Vector-toc-beginning
['total'] = 'Total', -- footer
['yesno'] = {
['yes'] = true, ['y'] = true, ['true'] = true, ['t'] = true, ['1'] = true,
['no'] = false, ['n'] = false, ['false'] = false, ['f'] = false, ['0'] = false
}
}
local section_top = i18n_t.top or -- i18n_t.top rarely needed
mw.message.new ('vector-toc-beginning') -- lead section doesn't have a heading, get the interface message for 'top'
:inLanguage (lang_obj:getCode()) -- in the current wiki's content language
:plain(); -- and make sure we have a string
local noprose_sections = {
'References', 'See also', 'External links', 'Further reading' -- Sections to exclude when calculating prose size
};
--[[--------------------------< E R R O R _ M S G _ M A K E >--------------------------------------------------
common function to emit both fatal and non-fatal error messages
template_name used in error message help text link and error category link fetched from MediaWiki
error category emitted only for transclusions in the Talk namespace; only when i18n_t['error category'] has a
value; only when we have not already emitted the category link.
]]
local err_cat_added; -- page-scope boolean flag; true when error cat link has been emmitted; nil else
local function error_msg_make (template_name, msg, args_t, fatal)
local err_cat = ''; -- empty string for concatenation
if not err_cat_added and i18n_t['error category'] and 1 == mw.title.getCurrentTitle().namespace then
err_cat = mw.message.newRawMessage (i18n_t['error category'], {template_name}):plain(); -- create error category wikilink
err_cat_added = true; -- we will do this only once
end
local err_msg = table.concat ({
fatal and '' or ' ', -- no space before fatal error messages
fatal and '<span style="font-size:100%;" class="error">' or '<span style="color:#d33">', -- select fatal/non-fatal styling
mw.message.newRawMessage (msg, args_t):plain(), -- compose the message
' ', -- insert a space between the message and the help link
mw.message.newRawMessage (i18n_t['help link'], {template_name}):plain(), -- add the help link
'</span>', -- and done with styling
err_cat -- if not yet emitted, append error cat link
});
return err_msg;
end
--[[--------------------------< FIND_STRING_IN >--------------------------------
Function returns True if the string `str` is found in the table `tbl`, False if not
]]
local function find_string_in(tbl, str)
for _, element in ipairs(tbl) do
if (element == str) then
return true
end
end
return false
end
--[[--------------------------< PROSESIZE_GET >--------------------------------
Function returns the prose size of a wikitext.
The prosesize is returned as the number of bytes of readable prose, as well as the number of words
]]
local function prosesize_get (wikitext)
-- Remove comments
local text = wikitext:gsub("<!%-%-.-%-%->", "")
local wordcount;
local _;
-- Remove refs and their contents
text = text:gsub("<ref[^>]-/>", "")
text = text:gsub("<ref.->.-</ref>", "")
-- Remove tables {|
text = text:gsub("{|.-|}", "")
-- Remove templates {{...}}
-- First, let's remove single brackets that might confused the below code
text = text:gsub("([^{]){([^{])", "%1%2")
text = text:gsub("([^}])}([^}])", "%1%2")
-- recursive removal is tricky, so this handles most cases
local n = 1
while n > 0 do -- stop when nothing more was removed
text, n = text:gsub("{{[^{}]-}}", "") -- remove the innermost templates
end
-- Remove files/images [[File:...]] or [[Image:...]]
text = text:gsub("%[%[(File|Image):.-%]%]", "")
-- Remove links but keep display text [[link|display]]
text = text:gsub("%[%[[^|%]]-|", "[[") -- strip leading [[foo|
text = text:gsub("%[%[(.-)%]%]", "%1") -- [[bar]] -> bar
-- Remove html tags (but not their contents unless self-closing)
text = text:gsub("<.->", "")
-- Remove headings markup (=== heading ===)
text = text:gsub("=+.-=+", "")
-- Remove formatting markup (''italic'', '''bold''', etc.)
text = text:gsub("''+", "")
-- Remove list lines (*, #, ;, :)
local cleaned_lines = {}
for line in text:gmatch("[^\n]+") do
if not line:match("^%s*[%*#;:]") then
table.insert(cleaned_lines, line)
end
end
text = table.concat(cleaned_lines, "\n")
-- Remove now-empty parentheses
-- text = text:gsub("%(%)", "")
-- Collapse whitespace
text = text:gsub("%s+", " ")
-- Trim
text = text:match("^%s*(.-)%s*$")
-- Count the number of words
_,wordcount = text:gsub("%S+","")
-- Return byte length and number of words
return #text,wordcount
end
--[[--------------------------< R E D L I N K _ T E M P L A T E _ R E M O V E >--------------------------------
Following a preprocessing of the section heading, any templates not known to the local wiki will have been converted
to a template-space redlink to the unknown template-name in the locally named template namespace. These redlinks
must be removed and the section name marked as modified so that the section heading link can be suppressed.
returns section name and boolean true if redlinks were replaced; boolean false else
]]
local function redlink_template_remove (section_name)
local redlink_pattern = '%[%[:' .. mw.site.namespaces[10]["name"] .. ':.-%]%]'; -- fetch template names space name in the wiki's local language
local count;
section_name, count = section_name:gsub (redlink_pattern, '[...]'); -- replace unknown-template redlinks with bracketed ellipses
return section_name, 0 < count;
end
--[[--------------------------< A N C H O R S _ R E M O V E >--------------------------------------------------
remove html markup that looks like an anchor. There appear to be two general forms:
<span class="anchor" id="Foo"></span>
<span id="Foo"></span>
multiple anchor spans are allowed
Because anchor markup is allowed in section headings, does not set the modified flag on return
]]
local function anchors_remove (section_name)
local patterns = {
'<span +[^>]*class *= *"anchor"[^>]*></span>', -- don't care about the id= or any other attribute here if we have the anchor class
'<span +%f[%a]id *= *".-" *></span>', -- here the span must have only the id= attribute
}
for _, pattern in ipairs (patterns) do
section_name = section_name:gsub (pattern, ''); -- remove all anchor spans
end
return section_name;
end
--[[--------------------------< R E F S _ R E M O V E >--------------------------------------------------------
remove wikitext reference markup. done this way because we later preprocess the section name to render any templates
that are present in the section name (there shouldn't be but that doesn't stop editors from including them).
preprocessing a section name with reference markup causes MediaWiki to create a reflist; a side effect that we
don't want.
returns modified section name and boolean true when references have been removed; unmodified section name and false else.
]]
local function refs_remove (section_name)
local name; -- modified (or unmodified) section name
local markup_removed; -- boolean true when reference markup has been removed
local count;
name, count = section_name:gsub ('<ref.-/>', ''); -- remove self-closed <ref with attributes /> tags
markup_removed = 0 < count; -- count not zero, set <markup_removed> true
name, count = name:gsub ('<ref.->.-</ref>', ''); -- remove remaining ref tags and content (if any)
return name, markup_removed or (0 < count)
end
--[[--------------------------< S T R I P M A R K E R S _ R E M O V E >----------------------------------------
remove stripmarkers from preprocessed section names. it may be best to preserve <nowiki/> tags before section name
is preprocessed to prevent '<nowiki/>'' from being interpreted as ''' bold markup. It is not possible to do that
here because all nowiki strip markers are only identifiable by the numbers.
returns modified section name and boolean true when stripmarkers have been removed; unmodified section name and false else.
]]
local function stripmarkers_remove (section_name)
local count;
section_name, count = section_name:gsub ('\127[^\127]*UNIQ%-%-%a+%-[%x]+%-QINU[^\127]*\127', '');
return section_name, (0 < count);
end
--[=[-------------------------< R E M O V E _ W I K I _ L I N K >----------------------------------------------
Gets the display text from a wikilink like [[A|B]] or [[B]] gives B
The str:gsub() returns either A|B from a [[A|B]] or B from [[B]] or B from B (no wikilink markup).
In l(), l:gsub() removes the link and pipe (if they exist); the second :gsub() trims white space from the label
if str was wrapped in wikilink markup. Presumably, this is because without wikimarkup in str, there is no match
in the initial gsub, the replacement function l() doesn't get called.
]=]
local function remove_wiki_link (str)
return (str:gsub( "%[%[([^%[%]]*)%]%]", function(l)
return l:gsub( "^[^|]*|(.*)$", "%1" ):gsub("^%s*(.-)%s*$", "%1");
end));
end
--[[--------------------------< R E M O V E _ C O N T A I N E R >----------------------------------------------
Inspired from above, removes everything between < & >
Used to remove html containers from headings to fix breaking section links, but legitimate text within < & > are removed too
returns text and boolean true if modified; text and boolean false else
]]
local function remove_container (str)
local count;
str, count = str:gsub( "<([^>]*)>", function(l)
return l:gsub("^%s*(.-)%s*$", "");
end);
return str, 0 < count
end
--[=[-------------------------< M A K E _ W I K I L I N K >----------------------------------------------------
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only
link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an
empty string.
]=]
local function make_wikilink (link, display)
if link and ('' ~= link) then
if display and ('' ~= display) then
return table.concat ({'[[', link, '|', display, ']]'});
else
return table.concat ({'[[', link, ']]'});
end
end
return display or ''; -- link not set so return the display text
end
--[[--------------------------< S E C T I O N _ D A T A _ G E T >----------------------------------------------
Read article content and fill associative arrays in sequence <sections_t>. The associative arrays hold section
name, its starting location within content, section size, and section level (2 (==), 3 (===), etc). Modifies and
returns <total> (article size) and <max> (longest section).
]]
local function section_data_get (content, total, max, total_prose, max_prose, sections_t, getprose)
local s, e, name, _;
----------< M A X _ U P D A T E >----------
local function max_update (max, sec_size, sec_i) -- local function to update max and its index
if max < sec_size then -- new section is longer
return sec_size, sec_i; -- update and done
end
return max; -- no update
end
-------------------------------------------
while (1) do -- done this way because some articles reuse section names
s, e, name = string.find (content, '\n==+ *(.-) *==+', e); -- get start, end, and section name beginning at end of last find; newline must precede '==' heading markup
if s then
table.insert (sections_t, {['name']=name, ['start']=s}); -- save section name and start location of this find
else
break;
end
end
for i, section_t in ipairs (sections_t) do
if 1 ~= i then -- i==1 is the lead section; already accounted for
local escaped_section_name = section_t.name:gsub ('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0'); -- escape lua patterns in section name
local pattern = '(==+ *' .. escaped_section_name .. ' *==+.-)==+'; -- make a pattern to get the content of a section
local section_content = string.match (content, pattern, section_t.start); -- get the content beginning at the string.find() start location
if section_content then
section_t.size = #section_content; -- get a count of the bytes in the section
total = total + section_t.size;
max = max_update (max, section_t.size, i); -- keep track of largest count
if getprose then
if find_string_in( noprose_sections, escaped_section_name ) then
section_t.prosesize = 0;
else
_,section_t.prosesize = prosesize_get( section_content );
end
total_prose = total_prose + section_t.prosesize;
max_prose = max_update (max_prose, section_t.prosesize, i); -- keep track of largest count
end
else -- probably the last section (no proper header follows this section name)
pattern = '(==+ *' .. escaped_section_name .. ' *==+.+)'; -- make a new pattern
section_content = string.match (content, pattern, section_t.start); -- try to get content
if section_content then
section_t.size = #section_content; -- get a count of the bytes in the section
total = total + section_t.size;
max = max_update (max, section_t.size, i); -- keep track of largest count
if getprose then
if find_string_in( noprose_sections, escaped_section_name ) then
section_t.prosesize = 0;
else
_,section_t.prosesize = prosesize_get( section_content );
end
total_prose = total_prose + section_t.prosesize;
max_prose = max_update (max_prose, section_t.prosesize, i); -- keep track of largest count
end
else
section_t.size = '—'; -- no content so show that
section_t.prosesize = '-';
end
end
local _;
_, section_t.level = section_content:find ('^=+'); -- should always be the first n characters of section content
end
end
return total, max, total_prose, max_prose;
end
--[[--------------------------< A R T I C L E _ C O N T E N T _ G E T >----------------------------------------
Common function to fetch the <article> content. Also fetches byte count for lead section because that section
is different from all others
On success, returns unparsed article content, lead section byte count, and nil message. On error, returns nil
content, nil lead section byte count, and fatal error message
]]
local function article_content_get (article, template_name, getprose)
local _,section_content_prose;
local title_obj = mw.title.new (article)
local content = title_obj:getContent(); -- get unparsed wikitext from the article
if not content then
return nil, nil, nil, error_msg_make (template_name, i18n_t['fatal_no_article'], {article}, true); -- emit fatal error message and abandon
end
if title_obj.isRedirect then -- redirects don't have sections
return nil, nil, nil, error_msg_make (template_name, i18n_t['fatal_redirect'], {article}, true); -- emit fatal error message and abandon
end
local section_content = content:match ('(.-)===*'); -- get the lead section
if not section_content then
return nil, nil, nil, error_msg_make (template_name, i18n_t['fatal_no_sections'], {article}, true); -- emit fatal error message and abandon
end
if getprose then
_,section_content_prose = prosesize_get( section_content )
end
return content, #section_content, section_content_prose, nil; -- return the contnet and length of the lead section and nil for error message
end
--[[--------------------------< S I Z E >----------------------------------------------------------------------
module entry point
create a wikilinked list of <article name>'s sections and their size in bytes in a sortable wikitable
{{#invoke:Section sizes|size|<article name>}}
]]
local function size (frame)
local template_name = frame:getParent():getTitle(); -- get template name for use in error messaging and category name
local section_info_t = {}; -- table to hold section names and sizes
local section_content; -- section content used for counting
local totcount = {};
local totcount_prose = {};
local lastlevel;
local maxlevels;
local levelcounts = {};
local levelcounts_prose = {};
local upperlevel;
local highlight;
local highlighttot;
local highlight_prose;
local highlighttot_prose;
local total; -- sum of all byte counts
local max; -- largest section so far encountered
local total_prose;
local max_prose;
local totmax; -- largest section so far encountered (section total)
local totmax_prose; -- largest section so far encountered (section total)
local _; -- dummy for using gsub to count bytes
local wl_name; -- anchor and display portion for wikilinks in rendered list
local getprose = i18n_t.yesno[frame.args.getprose or 'true']; -- boolean false when |_getprose=no; true else
getprose = getprose == nil and true or getprose -- can't do "or true" because then it will turn false values true
local content, sec_0_count, sec_0_count_prose, msg =
article_content_get (frame.args[1], template_name, getprose); -- get the article content with lead section byte count because lead is different from all others
if msg then -- is something wrong
return msg; -- emit message and abandon
end
total = sec_0_count;
max = sec_0_count;
total_prose = sec_0_count_prose;
max_prose = sec_0_count_prose;
-- sequence of associative arrays with section name, starting location, size, and level
local sections_t = {{['level'] = 2, ['name'] = section_top, ['size'] = sec_0_count, ['start'] = 1, ['prosesize'] = sec_0_count_prose}}; -- init with lead info
total, max, total_prose, max_prose = section_data_get (content, total, max, total_prose, max_prose, sections_t, getprose); -- fill <sections_t> arrays for all sections except the lead
totmax=0;
totmax_prose=0;
lastlevel=0;
maxlevels=7;
for j=1,maxlevels do
levelcounts[j]=0;
levelcounts_prose[j]=0;
end
local level, size, prosesize;
for i = #sections_t, 1, -1 do
level = sections_t[i].level;
size = sections_t[i].size;
prosesize = sections_t[i].prosesize or 0;
if level < lastlevel then -- reset all
totcount[i] = levelcounts[level] + size;
totcount_prose[i] = levelcounts_prose[level] + prosesize;
for j=level,maxlevels do
levelcounts[j]=0;
levelcounts_prose[j]=0;
end
end
if level >= lastlevel then
totcount[i] = size;
totcount_prose[i] = prosesize;
end
if level > 0 then
upperlevel = level - 1;
levelcounts[upperlevel]=levelcounts[upperlevel]+totcount[i];
levelcounts_prose[upperlevel]=levelcounts_prose[upperlevel]+totcount_prose[i];
end
lastlevel = level;
if totcount[i] > totmax then
totmax = totcount[i];
end
if totcount_prose[i] > totmax_prose then
totmax_prose = totcount_prose[i];
end
end
for i, section_t in ipairs (sections_t) do
level = section_t.level;
size = section_t.size;
prosesize = section_t.prosesize;
if size == max then
highlight='background:#f00;color:#000;"|';
else
local proportion = size / max -- get value of "how much of the max" the count is
local gb = 250 - math.floor(250 * proportion) -- approach #f8f9fa [r=248,g=249,b=250] (default wikitable cell color) for small bytecounts
highlight = string.format('background:#F8%02X%02X;color:#000;"|', gb, gb) -- shade the bg as r: 248, g: gb, and b: gb
end
if getprose then
if prosesize == max_prose then
highlight_prose='background:#008000;color:#fff;"|';
else
local proportion = prosesize / max_prose -- get value of "how much of the max" the count is
local gb = 250 - math.floor(250 * proportion) -- approach #f8f9fa [r=248,g=249,b=250] (default wikitable cell color) for small bytecounts
highlight_prose = string.format('background:#%02XF8%02X;color:#000;"|', gb, gb) -- shade the bg as r: 248, g: gb, and b: gb
end
end
highlighttot=''; -- start the style declaration
if totcount[i]==totmax then
highlighttot=highlighttot .. 'background:#f00;color:#000;';
else
local proportion = totcount[i] / totmax -- get value of "how much of the max" the count is
local gb = 250 - math.floor(250 * proportion) -- approach #f8f9fa [r=248,g=249,b=250] (default wikitable cell color) for small bytecounts
highlighttot=highlighttot .. string.format('background:#F8%02X%02X;color:#000;', gb, gb) -- shade the bg as r: 248, g: gb, and b: gb
end
if getprose then
highlighttot_prose=''; -- start the style declaration
if totcount_prose[i]==totmax_prose then
highlighttot_prose=highlighttot_prose .. 'background:#008000;color:#fff;';
else
local proportion = totcount_prose[i] / totmax_prose -- get value of "how much of the max" the count is
local gb = 250 - math.floor(250 * proportion) -- approach #f8f9fa [r=248,g=249,b=250] (default wikitable cell color) for small bytecounts
highlighttot_prose=highlighttot_prose .. string.format('background:#%02XF8%02X;color:#000;', gb, gb) -- shade the bg as r: 248, g: gb, and b: gb
end
end
if level == 2 then
highlighttot=highlighttot .. 'font-weight:bold;'; -- if main section, make it bold
elseif totcount[i] == size then
highlighttot='color:transparent;'; -- hide totals for subsections with no subsubsections, values required for proper sorting
end
highlighttot=highlighttot .. '"|'; -- close the style declaration
if getprose then
if level == 2 then
highlighttot_prose=highlighttot_prose .. 'font-weight:bold;'; -- if main section, make it bold
elseif totcount_prose[i] == prosesize then
highlighttot_prose='color:transparent;'; -- hide totals for subsections with no subsubsections, values required for proper sorting
end
highlighttot_prose=highlighttot_prose .. '"|'; -- close the style declaration
end
level = (2 < level) and ((level - 2) * 1.6) or nil; -- remove offset and mult by 1.6em (same indent as ':' markup which doesn't work in a table)
local markup_removed; -- temp flag to note that the section heading has been modified (references and html-like markup stripped, etc)
local modified = false; -- flag to select section heading styling; false: wikilink; true: plain text with error message
wl_name, modified = refs_remove (section_t.name); -- remove all references
wl_name = remove_wiki_link (wl_name); -- remove all wikilinks
wl_name = wl_name:gsub ('<nowiki/>', '__sss_nowiki/__'); -- replace <nowiki/> tag with special secret symbol
wl_name = frame:preprocess (wl_name); -- render to html
wl_name, markup_removed = redlink_template_remove (wl_name); -- remove redlink template wikilinks created by preprocessing of unknown templates
modified = modified or markup_removed; -- update <modified>
wl_name = anchors_remove (wl_name); -- remove known anchor markup; these allowed in section heading so do not bump <modified>
wl_name = wl_name:gsub ('__sss_nowiki/__', '<nowiki/>'); -- replace special secret symbol with <nowiki/> tag
wl_name, markup_removed = stripmarkers_remove (wl_name); -- remove any strip markers resulting from preprocessing
modified = modified or markup_removed; -- update <modified>
wl_name = wl_name:gsub ('</?i>', '\'\''); -- italic markup has been converted to html; unconvert so remove_container() doesn't remove inappropriately
wl_name = wl_name:gsub ('</?b>', '\'\'\''); -- bold markup has been converted to html; unconvert so remove_container() doesn't remove inappropriately
wl_name, markup_removed = remove_container (wl_name); -- remove html containers from section headings so that we can link to the section
modified = modified or markup_removed; -- update <modified>
wl_name = wl_name:gsub ('[%[%]]', {['[']='[', [']']=']'}); -- replace '[' and ']' characters with html entities so that wikilinked section names work
wl_name = mw.text.trim (wl_name); -- trim leading/trailing white space if any because white space buggers up url anchor links
local heading_text;
if modified then
heading_text = table.concat ({ -- modified headings are rendered in plain text with an error message
wl_name, -- plain text section name
error_msg_make (template_name, i18n_t['markup removed'], {}), -- error message with help link
}); -- close help link
else
heading_text = make_wikilink (frame.args[1] .. '#' .. wl_name:gsub ("''+", ''), wl_name); -- unmodified rendered as is
end
table.insert (section_info_t, table.concat ({ -- build most of a table row here because here we have heading information that we won't have later
level and '<span style="margin-left:' .. level .. 'em">' or ''; -- indent per heading level (number of '=' in heading markup)
heading_text, -- section link remove any bold/italic markup from the link part of the wikilink; leave the markup in the display
level and '</span>' or '', -- close the span if opened
'||style="text-align:right;', -- table column separator and right align byte count column
highlight ,
lang_obj:formatNum (size), -- commafied byte count for section
'||style="text-align:right;', -- table column separator and right align section total column
highlighttot ,
lang_obj:formatNum (totcount[i]), -- section total count!!
}) .. ( getprose and table.concat ({
'||style="text-align:right;', -- table column separator and right align byte count column
highlight_prose ,
lang_obj:formatNum (prosesize), -- section prose size
'||style="text-align:right;', -- table column separator and right align byte count column
highlighttot_prose ,
lang_obj:formatNum (totcount_prose[i]), -- section prose size total
}) or ''));
end
local out = {}; -- make a sortable wikitable for output
table.insert (out, string.format ('{| class="wikitable sortable" style="%s"\n|+%s', -- output caption and column headings
frame.args.style or '', -- value for style= attribute
mw.message.newRawMessage (i18n_t['table caption'], {frame.args[1], #section_info_t}):plain()
));
table.insert (out, table.concat ({ -- column headings
'\n! rowspan=2|',
i18n_t.section_name,
'!! colspan=2|',
i18n_t.byte_count,
}));
if getprose then
table.insert (out, table.concat ({
'!! colspan=2|',
i18n_t.prose_size,
}));
end
table.insert (out, table.concat ({ -- new header column
'\n|-',
'\n!',
i18n_t.section_header,
'!!',
i18n_t.section_total,
}));
if getprose then
table.insert (out, table.concat ({
'!!',
i18n_t.section_header,
'!!',
i18n_t.section_total,
}));
end
table.insert (out, '\n|-\n|'); -- first row pipe
table.insert (out, table.concat (section_info_t, '\n|-\n|')); -- section rows with leading pipes (except first row already done)
table.insert (out, table.concat ({ -- total number of bytes; heading markup so that sorting doesn't move this row from the bottom to top
'\n|-\n!scope=row|',
i18n_t.total, -- footer label
'\n|style="text-align:right"|',
lang_obj:formatNum (total), -- byte count sum; TODO: to columns, should be two separate sums; test for equality?
'\n|style="text-align:right"|',
lang_obj:formatNum (total), -- section size sum; TODO: to columns, should be two separate sums; test for equality?
}));
if getprose then
table.insert (out, table.concat ({
'\n|style="text-align:right"|',
lang_obj:formatNum (total_prose), -- section size sum; TODO: to columns, should be two separate sums; test for equality?
'\n|style="text-align:right"|',
lang_obj:formatNum (total_prose), -- section size sum; TODO: to columns, should be two separate sums; test for equality?
}));
end
table.insert (out, '\n|}'); -- close the wikitable
local result = table.concat (out);
return result; -- because gsub returns string and number of replacements
end
--[[--------------------------< S E C T I O N _ S I Z E _ G E T >----------------------------------------------
return the length of the specified section of the specified article.
parameters:
{{{1}}} – article title (required)
{{{2}}} – section name or one of three keywords. keywords use leading underscores to minimize confusion with
section names 'Lead' (the metal) and 'Max' (a proper name), etc.
<section name> – returns the length of the named section; section name comparisons are case insensitve.
keywords:
_lead – returns the length of the lead (unnamed section)
_max – returns the length of the longest section
_total – returns the article length
{{{3}}} – supports one keyword
_all – requires named section in {{{2}}}; not supported for keywords; returns size of the named section plus
the lengths of its subsections
|_nosep= – accepts one value 'yes'; renders section size without thousands separator; ignored when |_pct= set;
default is commafied
|_pct= – accepts one value 'yes'; function returns size specified by name or keyword as a percentage of _total
rounded to two decimals; appends '%' symbol; _total as a percentage of _total allowed but why?
returns nil when there is no keyword match and no <section name> match
{{#invoke:section sizes|section_length|<article title>|<_lead|_max|_total|section name>|_all}}
]]
local function section_size_get (frame)
local args_t = require ("Module:Arguments").getArgs (frame);
local template_name = frame:getParent():getTitle(); -- get template name for use in error messaging and category name
local nosep = i18n_t.yesno[args_t._nosep or 'false'] or false; -- boolean true when |_nosep=yes; false else
local pct = i18n_t.yesno[args_t._pct or 'false'] or false; -- boolean true when |_pct=yes; false else
local getprose = false -- fetching prose is only used by size(), not section_size_get()
local content, sec_0_count, sec_0_count_prose, msg =
article_content_get (args_t[1], template_name, getprose); -- get the article content with lead section byte count in <count_t> because lead is different from all others
if msg then -- is something wrong
return msg; -- emit message and abandon
end
local total = sec_0_count; -- initialize with length of the lead
local max = sec_0_count;
local total_prose = sec_0_count_prose;
local max_prose = sec_0_count_prose;
----------< R E T V A L >----------
local function retval (size) -- local function to select return value format according to |pct=
return pct and string.format ("%2.2f%%", 100 * (size / total)) or -- return the percentage
lang_obj:formatNum (size, {noCommafy=nosep}); -- return the size
end
-----------------------------------
-- sequence of associative arrays with section name, starting location, size, and level
local sections_t = {{['level'] = 2, ['name'] = section_top, ['size'] = sec_0_count, ['start'] = 1}}; -- init with lead info
total, max = section_data_get (content, total, max, total_prose, max_prose, sections_t, getprose);
if '_lead' == args_t[2] then -- {{{2}}} has '_lead' keyword; lead section is handled differently from all other sections
return retval (sec_0_count); -- return selected output form and done
elseif '_max' == args_t[2] then -- when {{{2}}} has '_max' keyword
return retval (max); -- return selected output form and done
elseif '_total' == args_t[2] then -- when {{{2}}} has '_total' keyword
return retval (total); -- return the article's total length and done; pct possible, but why?
elseif args_t[2] then -- if set, it should be a section name
local target_section_name = args_t[2]:lower(); -- get it and force lower case for comparison
local section_level;
local section_size = 0;
for i, section_t in ipairs (sections_t) do -- loop through <section_t.name> looking for a match; TODO: is there a better way to do this?
if not section_level then -- not yet found a match
if section_t.name:lower() == target_section_name then -- force lower case for comparison
if '_all' == args_t[3] then -- when {{{3}}} has '_all' keyword
section_level = section_t.level; -- found it so initialize these; this one is a flag to know that we found the target section
section_size = section_t.size; -- init
else
return retval (section_t.size); -- return selected output form and done
end
end
elseif section_level < section_t.level then -- here when we found the section, '_all' keyword present
section_size = section_size + section_t.size; -- this section level greater than target's, so add in the subsection's size
else -- here when we found the section, '_all' keyword present
return retval (section_size); -- return selected output form and done
end
end
else -- here when {{{3}}} has nothing
return nil; -- so return nothing
end
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return
{
size = size,
section_size_get = section_size_get,
}
q1jpx5veorc8jk239jazrqzb1saoooo
Module:Storm categories
828
50944
305455
2026-08-16T18:46:30Z
Isma4l
41797
Bog cusub: local categoryData = require("Module:Storm categories/categories") local colors = require("Module:Storm categories/colors").colors local icons = require("Module:Storm categories/icons").icons local cats = categoryData.cats local defaultCategory = categoryData.defaultCategory local p = {} function p.color(frame) return p._color(frame.args[1] or frame:getParent().args[1], false) end function p.name(frame) return p._name( frame.args[1] or frame:getParent().args[1], frame.arg...
305455
Scribunto
text/plain
local categoryData = require("Module:Storm categories/categories")
local colors = require("Module:Storm categories/colors").colors
local icons = require("Module:Storm categories/icons").icons
local cats = categoryData.cats
local defaultCategory = categoryData.defaultCategory
local p = {}
function p.color(frame)
return p._color(frame.args[1] or frame:getParent().args[1], false)
end
function p.name(frame)
return p._name(
frame.args[1] or frame:getParent().args[1],
frame.args[2] or frame:getParent().args[2],
false
)
end
function p.sortkey(frame)
return p._sortkey(frame.args[1] or frame:getParent().args[1], false)
end
function p.icon(frame)
return p._icon(frame.args[1] or frame:getParent().args[1], false)
end
function p.isEqual(frame)
return p._isEqual(
frame.args[1] or frame:getParent().args[1],
frame.args[2] or frame:getParent().args[2]
) and "yes" or ""
end
function p._normalizeId(category, fallback)
-- Normalize if normalizable, fall back to default if not.
return (category ~= nil and string.len(category) ~= 0) and
string.gsub(string.lower(category), "[^%w]", "") or fallback
end
function p._color(category, nilIfMissing)
-- This looks confusing, but it's actually nested ternaries (for nil checks)
local color = p._normalizeId(category, defaultCategory)
return colors[color] or ((cats[color] or (
nilIfMissing
and { color = nil }
or cats[defaultCategory]
)).color)
end
function p._name(category, basin, nilIfMissing)
local name_def = (cats[
p._normalizeId(category, defaultCategory)
] or (nilIfMissing and { name = nil } or cats[defaultCategory])).name
return type(name_def) == "table" and
(
name_def[string.lower(basin or "default")]
or name_def["default"]
or (not nilIfMissing and error("No default name for basin-based category name.") or nil)
)
or name_def
end
function p._sortkey(category, nilIfMissing)
-- This looks confusing, but it's actually nested ternaries (for nil checks)
return (cats[
p._normalizeId(category, defaultCategory)
] or (nilIfMissing and { sortkey = nil } or cats[defaultCategory])).sortkey
end
function p._icon(category, nilIfMissing)
-- This looks confusing, but it's actually nested ternaries (for nil checks)
local icon = p._normalizeId(category, defaultCategory)
return icons[icon] or (cats[icon] ~= nil and (
cats[icon].icon or cats["tropicalcyclone"].icon
) or (not nilIfMissing and cats[defaultCategory].icon) or nil)
end
function p._isEqual(category1, category2)
-- Checks if two IDs are equal.
-- An {{#ifeq}} check does not consider aliases. This function compares two
-- IDs in a way that considers category aliases. This works because alias
-- assignments are references to the actual table containing the category
-- info found in the main category table.
--
-- `false` will be returned if at least one of the categories are nil or
-- if the category is not defined.
local _category1 = p._normalizeId(category1)
local _category2 = p._normalizeId(category2)
return (_category1 == _category2 and _category1 ~= nil) or
cats[ _category1 ] == cats[ _category2 ] and
-- `false` if categories are undefined and not equal.
cats[ _category1 ] ~= nil
end
function p.demo(frame)
return require("Module:Storm categories/demo").demo(frame)
end
return p
0rt8bngy4ez9309f95k8akbgpyb3ydh
Module:Storm categories/categories
828
50945
305456
2026-08-16T18:47:25Z
Isma4l
41797
Bog cusub: local p = {} -- Define categories -- All sortkeys have been guessed. They may be changed by common sense -- or consensus at [[Wikipedia talk:WikiProject Tropical cyclones]] local cats = { -- -- TROPICAL CYCLONES -- severe = { color = "C0FFC0", name = "Severe tropical storm", sortkey = 120, icon = "[[File:Severe tropical storm icon.png|18px]]" }, mtstorm = { color = "4DFFFF", -- Old {{storm colour}} did not support. Value guessed. name = "Moderate tropical s...
305456
Scribunto
text/plain
local p = {}
-- Define categories
-- All sortkeys have been guessed. They may be changed by common sense
-- or consensus at [[Wikipedia talk:WikiProject Tropical cyclones]]
local cats = {
--
-- TROPICAL CYCLONES
--
severe = {
color = "C0FFC0",
name = "Severe tropical storm",
sortkey = 120,
icon = "[[File:Severe tropical storm icon.png|18px]]"
},
mtstorm = {
color = "4DFFFF", -- Old {{storm colour}} did not support. Value guessed.
name = "Moderate tropical storm",
sortkey = 105,
icon = "[[File:Moderate tropical storm icon.png|18px]]"
},
storm = {
color = "4DFFFF",
name = "Tropical storm",
sortkey = 100,
icon = "[[File:Tropical storm icon.png|18px]]"
},
severedep = {
color = "6EC1EA", -- Old {{storm colour}} did not support. Value guessed.
name = "Severe tropical depression",
sortkey = 120
},
moddepression = {
color = "6EC1EA", -- Old {{storm colour}} did not support. Value guessed.
name = "Moderate tropical depression",
sortkey = 95
},
depression = {
color = "6EC1EA",
name = "Tropical depression",
sortkey = 90,
icon = "[[File:Tropical Depression.png|25px]]"
},
disturbance = {
color = "1591DE",
name = "Tropical disturbance",
sortkey = 80,
icon = "[[File:Disturbance icon.png|25px]]"
},
subtropicalcyclone = {
color = "4DFFFF",
name = "Subtropical cyclone",
sortkey = 70
},
subtropical = {
color = "4DFFFF",
name = "Subtropical storm",
sortkey = 65,
icon = "[[File:Subtropical storm icon.png|18px]]"
},
subdepression = {
color = "6EC1EA",
name = "Subtropical depression",
sortkey = 62,
icon = "[[File:Subtropical Depression icon.png|25px]]"
},
overland = {
color = "6EC1EA",
name = "Overland depression",
sortkey = 60,
icon = "[[File:Depression icon.png|25px]]"
},
subdisturbance = {
color = "1591DE",
name = "Subtropical disturbance",
sortkey = 55,
icon = "[[File:Disturbance icon.png|25px]]"
},
extratropical = {
color = "CCCCCC",
name = "Extratropical cyclone",
sortkey = 50,
icon = "[[File:Extratropical cyclone icon.png|18px]]"
},
monsoondepression = {
color = "6EC1EA",
name = "Monsoon depression",
sortkey = 30,
icon = "[[File:Monsoon Depression icon.png|25px]]"
},
potential = {
color = "1591DE",
name = "Potential tropical cyclone",
sortkey = 25,
icon = "[[File:Potential tropical cyclone icon.png|25px]]"
},
extratropicallow = {
color = "CCCCCC",
name = "Extratropical low",
sortkey = 50,
icon = "[[File:Tropical Low.png|25px]]"
},
posttropical = {
color = "CCCCCC",
name = "Post-tropical depression",
sortkey = 70,
icon = "[[File:Post tropical cyclone icon.png|25px]]"
},
remnant = {
color = "CCCCCC",
name = "Post-tropical depression",
sortkey = 70,
icon = "[[File:Remnant low icon.png|25px]]"
},
unknown = {
color = "C0C0C0",
name = "Unknown-strength storm",
sortkey = 0,
icon = "'''?'''"
},
-- SSWHS hurricane categories
cat5 = {
color = "A188FC",
name = {
atl = "Category 5 major hurricane",
epac = "Category 5 major hurricane",
satl = "Category 5-equivalent hurricane",
wpac = "Category 5-equivalent super typhoon",
default = "Category 5-equivalent tropical cyclone"
},
sortkey = 80050,
icon = "[[File:Category 5 hurricane icon.png|18px]]"
},
cat4 = {
color = "FF738A",
name = {
atl = "Category 4 major hurricane",
epac = "Category 4 major hurricane",
satl = "Category 4-equivalent hurricane",
wpac = "Category 4-equivalent typhoon",
default = "Category 4-equivalent tropical cyclone"
},
sortkey = 80040,
icon = "[[File:Category 4 hurricane icon.png|18px]]"
},
cat3 = {
color = "FF9E59",
name = {
atl = "Category 3 major hurricane",
epac = "Category 3 major hurricane",
satl = "Category 3-equivalent hurricane",
wpac = "Category 3-equivalent typhoon",
default = "Category 3-equivalent tropical cyclone"
},
sortkey = 80030,
icon = "[[File:Category 3 hurricane icon.png|18px]]"
},
cat2 = {
color = "FFD98C",
name = {
atl = "Category 2 hurricane",
epac = "Category 2 hurricane",
satl = "Category 2-equivalent hurricane",
wpac = "Category 2-equivalent typhoon",
default = "Category 2-equivalent tropical cyclone"
},
sortkey = 80020,
icon = "[[File:Category 2 hurricane icon.png|18px]]"
},
cat1 = {
color = "FFFFD9",
name = {
atl = "Category 1 hurricane",
epac = "Category 1 hurricane",
satl = "Category 1-equivalent hurricane",
wpac = "Category 1-equivalent typhoon",
default = "Category 1-equivalent tropical cyclone"
},
sortkey = 80010,
icon = "[[File:Category 1 hurricane icon.png|18px]]"
},
supertyphoon = {
color = "FF738A",
name = "Category 4-equivalent super typhoon",
sortkey = 80045,
icon = "[[File:Category 4 hurricane icon.png|18px]]"
},
typhoon = {
color = "FFD98C",
name = "Typhoon",
sortkey = 60010
},
-- HKO
svtyphoon = {
color = "FF738A",
name = "Severe typhoon",
sortkey = 60015
},
vstyphoon = {
color = "FF738A",
name = "Very strong typhoon",
sortkey = 60020,
icon = "[[File:Very strong typhoon icon.png|18px]]"
},
vityphoon = {
color = "A188FC",
name = "Violent typhoon",
sortkey = 60030,
icon = "[[File:Violent typhoon icon.png|18px]]"
},
-- PAGASA
styphoon = {
color = "A188FC",
name = "Super typhoon",
sortkey = 60050
},
sprcyclstorm = {
color = "A188FC",
name = "Super cyclonic storm",
sortkey = 50020,
icon = "[[File:Super cyclonic storm icon.png|18px]]"
},
esvrcyclstorm = {
color = "FF738A",
name = "Extremely severe cyclonic storm",
sortkey = 50015,
icon = "[[File:Extremely severe cyclonic storm icon.png|18px]]"
},
vsvrcyclstorm = {
color = "FFD98C",
name = "Very severe cyclonic storm",
sortkey = 50010,
icon = "[[File:Very severe cyclonic storm icon.png|18px]]"
},
svrcyclstorm = {
color = "C0FFC0",
name = "Severe cyclonic storm",
sortkey = 50008,
icon = "[[File:Severe cyclonic storm icon.png|18px]]"
},
niocyclone = {
color = "4DFFFF",
name = "Cyclonic storm",
sortkey = 50006,
icon = "[[File:Cyclonic storm icon.png|18px]]"
},
deepdepression = {
color = "6EC1EA",
name = "Deep depression",
sortkey = 50002,
icon = "[[File:Deep depression icon.png|25px]]"
},
niodepression = {
color = "1591DE",
name = "Depression",
sortkey = 50001,
icon = "[[File:Depression icon.png|25px]]"
},
nioland = {
color = "1591DE",
name = "Land depression",
sortkey = 50000,
icon = "[[File:Land depression icon.png|25px]]"
},
aus5 = {
color = "A188FC",
name = "Category 5 severe tropical cyclone",
sortkey = 40015,
icon = "[[File:Aus 5 icon.png|18px]]"
},
aus4 = {
color = "FF738A",
name = "Category 4 severe tropical cyclone",
sortkey = 40013,
icon = "[[File:Aus 4 icon.png|18px]]"
},
aus3 = {
color = "FFD98C",
name = "Category 3 severe tropical cyclone",
sortkey = 40010,
icon = "[[File:Aus 3 icon.png|18px]]"
},
aus2 = {
color = "C0FFC0",
name = "Category 2 tropical cyclone",
sortkey = 40008,
icon = "[[File:Aus 2 icon.png|18px]]"
},
aus1 = {
color = "4DFFFF",
name = "Category 1 tropical cyclone",
sortkey = 40006,
icon = "[[File:Aus 1 icon.png|18px]]"
},
low = {
color = "6EC1EA",
name = "Tropical low",
sortkey = 40002,
icon = "[[File:Tropical Low.png|25px]]"
},
sublow = {
color = "6EC1EA",
name = "Subtropical low",
sortkey = 40000
},
vintense = {
color = "A188FC",
name = "Very intense tropical cyclone",
sortkey = 30010,
icon = "[[File:Very intense tropical cyclone icon.png|18px]]"
},
intense = {
color = "FF738A",
name = "Intense tropical cyclone",
sortkey = 30008,
icon = "[[File:Intense tropical cyclone icon.png|18px]]"
},
tropicalcyclone = {
color = "FFD98C",
name = "Tropical cyclone",
sortkey = 30006,
icon = "'''TC'''"
},
mstorm = {
color = "4DFFFF",
name = "Moderate tropical storm",
sortkey = 30004,
icon = "[[File:Moderate tropical storm icon.png|18px]]"
},
zodw = {
color = "1591DE",
name = "Zone of disturbed weather",
sortkey = 30000,
icon = "[[File:Disturbed weather icon.png|25px]]"
},
shemsvrtc = {
color = "FFD98C",
name = "Severe tropical cyclone",
sortkey = 20020
},
shem5 = {
color = "A188FC",
name = "Severe tropical cyclone",
sortkey = 20010
},
shem4 = {
color = "FFD98C",
name = "Tropical cyclone",
sortkey = 20008
},
shem2 = {
color = "C0FFC0",
name = "Tropical cyclone",
sortkey = 20008
},
shem1 = {
color = "4DFFFF",
name = "Tropical cyclone",
sortkey = 20008
},
--
-- WINTER STORMS
--
-- Regional Snowfall Index
rsi0 = {
color = "CCCCCC",
name = "Category 0 \"Nuisance\"",
sortkey = 80100,
icon = "[[File:RsiC0.png|25px]]"
},
rsi1 = {
color = "FFFFD9",
name = "Category 1 \"Notable\"",
sortkey = 80110,
icon = "[[File:RsiC1.png|25px]]"
},
rsi2 = {
color = "FFD98C",
name = "Category 2 \"Minor\"",
sortkey = 80120,
icon = "[[File:RsiC2.png|25px]]"
},
rsi3 = {
color = "FF9E59",
name = "Category 3 \"Major\"",
sortkey = 80130,
icon = "[[File:RsiC3.png|25px]]"
},
rsi4 = {
color = "FF738A",
name = "Category 4 \"Crippling\"",
sortkey = 80140,
icon = "[[File:RsiC4.png|25px]]"
},
rsi5 = {
color = "A188FC",
name = "Category 5 \"Extreme\"",
sortkey = 80150,
icon = "[[File:RsiC5.png|25px]]"
},
-- Winter Storm Severity Index
wssinone = {
color = "CCCCCC",
name = "No impacts",
sortkey = 80200,
},
wssilimited = {
color = "1591DE",
name = "Limited impacts",
sortkey = 80210,
},
wssiminor = {
color = "FFFFD9",
name = "Minor impacts",
sortkey = 80220,
},
wssimoderate = {
color = "FF9E59",
name = "Moderate impacts",
sortkey = 80230,
},
wssimajor = {
color = "FF738A",
name = "Major impacts",
sortkey = 80240,
},
wssiextreme = {
color = "A188FC",
name = "Extreme impacts",
sortkey = 80250,
},
spia0 = {
color = "4DFFFF",
name = "Ice Damage Index: 0",
sortkey = 80300,
icon = "[[File:SPIA0 Icon.png|30px]]"
},
spia1 = {
color = "FFFFD9",
name = "Ice Damage Index: 1",
sortkey = 80301,
icon = "[[File:SPIA1 Icon.png|30px]]"
},
spia2 = {
color = "FFD98C",
name = "Ice Damage Index: 2",
sortkey = 80302,
icon = "[[File:SPIA2 Icon.png|30px]]"
},
spia3 = {
color = "FF9E59",
name = "Ice Damage Index: 3",
sortkey = 80303,
icon = "[[File:SPIA3 Icon.png|30px]]"
},
spia4 = {
color = "FF738A",
name = "Ice Damage Index: 4",
sortkey = 80304,
icon = "[[File:SPIA4 Icon.png|30px]]"
},
spia5 = {
color = "A188FC",
name = "Ice Damage Index: 5",
sortkey = 80305,
icon = "[[File:SPIA5 Icon.png|30px]]"
},
--
-- TORNADOES
--
efu = {
color = "CCCCCC",
name = "EFU tornado",
sortkey = 1001,
icon = "[[File:Ef-scaleU.png|25px]]"
},
ef0 = {
color = "4DFFFF",
name = "EF0 tornado",
sortkey = 1000,
icon = "[[File:Ef-scale0.png|25px]]"
},
ef1 = {
color = "FFFFD9",
name = "EF1 tornado",
sortkey = 1010,
icon = "[[File:Ef-scale1.png|25px]]"
},
ef2 = {
color = "FFD98C",
name = "EF2 tornado",
sortkey = 1020,
icon = "[[File:Ef-scale2.png|25px]]"
},
ef3 = {
color = "FF9E59",
name = "EF3 tornado",
sortkey = 1030,
icon = "[[File:Ef-scale3.png|25px]]"
},
ef4 = {
color = "FF738A",
name = "EF4 tornado",
sortkey = 1040,
icon = "[[File:Ef-scale4.png|25px]]"
},
ef5 = {
color = "A188FC",
name = "EF5 tornado",
sortkey = 1050,
icon = "[[File:Ef-scale5.png|25px]]"
},
ifu = {
color = "CCCCCC",
name = "IFU tornado",
sortkey = 1100,
icon = "[[File:IFU icon.png|30px]]"
},
if0m = {
color = "58EBF8",
name = "IF0- tornado",
sortkey = 1101,
icon = "[[File:IF0- icon.png|30px]]"
},
if0 = {
color = "4DFFFF",
name = "IF0 tornado",
sortkey = 1102,
icon = "[[File:IF0 icon.png|30px]]"
},
if0p = {
color = "89FFF3",
name = "IF0+ tornado",
sortkey = 1103,
icon = "[[File:IF0+ icon.png|30px]]"
},
if1m = {
color = "C4FFE6",
name = "IF1- tornado",
sortkey = 1104,
icon = "[[File:IF1- icon.png|30px]]"
},
if1 = {
color = "FFFFD9",
name = "IF1 tornado",
sortkey = 1105,
icon = "[[File:IF1 icon.png|30px]]"
},
if1p = {
color = "FFF2BF",
name = "IF1+ tornado",
sortkey = 1106,
icon = "[[File:IF1+ icon.png|30px]]"
},
if2m = {
color = "FFE5A5",
name = "IF2- tornado",
sortkey = 1107,
icon = "[[File:IF2- icon.png|30px]]"
},
if2 = {
color = "FFD98C",
name = "IF2 tornado",
sortkey = 1108,
icon = "[[File:IF2 icon.png|30px]]"
},
if2p = {
color = "FFC57B",
name = "IF2+ tornado",
sortkey = 1109,
icon = "[[File:IF2+ icon.png|30px]]"
},
if3 = {
color = "FF9E59",
name = "IF3 tornado",
sortkey = 1110,
icon = "[[File:IF3 icon.png|30px]]"
},
if4 = {
color = "FF738A",
name = "IF4 tornado",
sortkey = 1111,
icon = "[[File:IF4 icon.png|30px]]"
},
if5 = {
color = "A188FC",
name = "IF5 tornado",
sortkey = 1112,
icon = "[[File:IF5 icon.png|30px]]"
},
tu = {
color = "CCCCCC",
name = "TU tornado",
sortkey = 1200,
icon = "[[File:TorroU icon.png|30px]]"
},
fc = {
color = "6EC1EA",
name = "Funnel Cloud",
sortkey = 1201,
icon = "[[File:FunnelCloud Icon.png|30px]]"
},
t0 = {
color = "5EE0F5",
name = "T0 tornado",
sortkey = 1202,
icon = "[[File:Torro0 icon.png|30px]]"
},
t1 = {
color = "4DFFFF",
name = "T1 tornado",
sortkey = 1203,
icon = "[[File:Torro1 icon.png|30px]]"
},
t2 = {
color = "A6FFEC",
name = "T2 tornado",
sortkey = 1204,
icon = "[[File:Torro2 icon.png|30px]]"
},
t3 = {
color = "FFFFD9",
name = "T3 tornado",
sortkey = 1205,
icon = "[[File:Torro3 icon.png|30px]]"
},
t4 = {
color = "FFECB3",
name = "T4 tornado",
sortkey = 1206,
icon = "[[File:Torro4 icon.png|30px]]"
},
t5 = {
color = "FFD98C",
name = "T5 tornado",
sortkey = 1207,
icon = "[[File:Torro5 icon.png|30px]]"
},
t6 = {
color = "FFBC73",
name = "T6 tornado",
sortkey = 1208,
icon = "[[File:Torro6 icon.png|30px]]"
},
t7 = {
color = "FF9E59",
name = "T7 tornado",
sortkey = 1209,
icon = "[[File:Torro7 icon.png|30px]]"
},
t8 = {
color = "FF8972",
name = "T8 tornado",
sortkey = 1210,
icon = "[[File:Torro8 icon.png|30px]]"
},
t9 = {
color = "FF738A",
name = "T9 tornado",
sortkey = 1211,
icon = "[[File:Torro9 icon.png|30px]]"
},
t10 = {
color = "D07EC3",
name = "T10 tornado",
sortkey = 1212,
icon = "[[File:Torro10 icon.png|30px]]"
},
t11 = {
color = "A188FC",
name = "T11 tornado",
sortkey = 1213,
icon = "[[File:Torro11 icon.png|30px]]"
},
-- Beaufort Scale (windstorms)
beaufort0 = {
color = "FFFFFF",
name = "Calm (Force 0)",
sortkey = 1500,
icon = "[[File:BeaufortForce0 icon.png|35px]]"
},
beaufort1 = {
color = "757575",
name = "Light Air (Force 1)",
sortkey = 1510,
icon = "[[File:BeaufortForce1 icon.png|35px]]"
},
beaufort2 = {
color = "909090",
name = "Light Breeze (Force 2)",
sortkey = 1520,
icon = "[[File:BeaufortForce2 icon.png|35px]]"
},
beaufort3 = {
color = "B7B7B7",
name = "Gentle Breeze (Force 3)",
sortkey = 1530,
icon = "[[File:BeaufortForce3 icon.png|35px]]"
},
beaufort4 = {
color = "D2D2D2",
name = "Moderate Breeze (Force 4)",
sortkey = 1540,
icon = "[[File:BeaufortForce4 icon.png|35px]]"
},
beaufort5 = {
color = "F1F1F1",
name = "Fresh Breeze (Force 5)",
sortkey = 1550,
icon = "[[File:BeaufortForce5 icon.png|35px]]"
},
beaufort6 = {
color = "1591DE",
name = "Strong Breeze (Force 6)",
sortkey = 1560,
icon = "[[File:BeaufortForce6 icon.png|35px]]"
},
beaufort7 = {
color = "6EC1EA",
name = "Near Gale (Force 7)",
sortkey = 1570,
icon = "[[File:BeaufortForce7 icon.png|35px]]"
},
beaufort8 = {
color = "5EE0F5",
name = "Gale (Force 8)",
sortkey = 1580,
icon = "[[File:BeaufortForce8 icon.png|35px]]"
},
beaufort9 = {
color = "4DFFFF",
name = "Strong Gale (Force 9)",
sortkey = 1590,
icon = "[[File:BeaufortForce9 icon.png|35px]]"
},
beaufort10 = {
color = "C0FFC0",
name = "Storm (Force 10)",
sortkey = 1600,
icon = "[[File:BeaufortForce10 icon.png|35px]]"
},
beaufort11 = {
color = "E0FFCD",
name = "Violent Storm (Force 11)",
sortkey = 1610,
icon = "[[File:BeaufortForce11 icon.png|35px]]"
},
beaufort12 = {
color = "FFFFD9",
name = "Hurricane-force (Force 12)",
sortkey = 1620,
icon = "[[File:BeaufortForce12 icon.png|35px]]"
},
-- Drought/Flood
palmer7 = {
color = "FF0800",
name = "Extreme Drought",
sortkey = 81000,
},
palmer6 = {
color = "FF5A55",
name = "Severe Drought",
sortkey = 81001,
},
palmer5 = {
color = "FFB3B0",
name = "Moderate Drought",
sortkey = 81002,
},
palmer4 = {
color = "FFFFFF",
name = "Near Normal",
sortkey = 81003,
},
palmer3 = {
color = "A9FEC4",
name = "Moderately Moist",
sortkey = 81004,
},
palmer2 = {
color = "5FFF46",
name = "Very Moist",
sortkey = 81005,
},
palmer1 = {
color = "1BC800",
name = "Extremely moist",
sortkey = 81006,
},
drought0 = {
color = "FFFFD9",
name = "Abnormally Dry",
sortkey = 81100,
},
drought1 = {
color = "FFD98C",
name = "Moderate Drought",
sortkey = 81101,
},
drought2 = {
color = "FF9E59",
name = "Severe Drought",
sortkey = 81102,
},
drought3 = {
color = "FF738A",
name = "Extreme Drought",
sortkey = 81103,
},
drought4 = {
color = "A188FC",
name = "Exceptional Drought",
sortkey = 81104,
},
atmosriv1 = {
color = "FFFFD9",
name = "Category 1: Weak (Atmospheric river)",
sortkey = 81200,
icon = "[[File:AtmosRiv1 Icon.png|30px]]"
},
atmosriv2 = {
color = "FFD98C",
name = "Category 2: Moderate (Atmospheric river)",
sortkey = 81201,
icon = "[[File:AtmosRiv2 Icon.png|30px]]"
},
atmosriv3 = {
color = "FF9E59",
name = "Category 3: Strong (Atmospheric river)",
sortkey = 81202,
icon = "[[File:AtmosRiv3 Icon.png|30px]]"
},
atmosriv4 = {
color = "FF738A",
name = "Category 4: Extreme (Atmospheric river)",
sortkey = 81203,
icon = "[[File:AtmosRiv4 Icon.png|30px]]"
},
atmosriv5 = {
color = "A188FC",
name = "Category 5: Exceptional (Atmospheric river)",
sortkey = 81204,
icon = "[[File:AtmosRiv5 Icon.png|30px]]"
},
-- Space Weather
radio1 = {
color = "FFFFD9",
name = "Minor Radio Blackout",
sortkey = 82000,
},
radio2 = {
color = "FFD98C",
name = "Moderate Radio Blackout",
sortkey = 82001,
},
radio3 = {
color = "FF9E59",
name = "Strong Radio Blackout",
sortkey = 82002,
},
radio4 = {
color = "FF738A",
name = "Severe Radio Blackout",
sortkey = 82003,
},
radio5 = {
color = "A188FC",
name = "Extreme Radio Blackout",
sortkey = 82004,
},
solar1 = {
color = "FFFFD9",
name = "Minor Solar Radiation Storms",
sortkey = 82100,
},
solar2 = {
color = "FFD98C",
name = "Moderate Solar Radiation Storms",
sortkey = 82101,
},
solar3 = {
color = "FF9E59",
name = "Strong Solar Radiation Storms",
sortkey = 82102,
},
solar4 = {
color = "FF738A",
name = "Severe Solar Radiation Storms",
sortkey = 82103,
},
solar5 = {
color = "A188FC",
name = "Extreme Solar Radiation Storms",
sortkey = 82104,
},
geo1 = {
color = "FFFFD9",
name = "Minor Geomagnetic Storms",
sortkey = 82200,
icon = "[[File:Geomagnetic1 Icon.png|35px]]"
},
geo2 = {
color = "FFD98C",
name = "Moderate Geomagnetic Storms",
sortkey = 82201,
icon = "[[File:Geomagnetic2 Icon.png|35px]]"
},
geo3 = {
color = "FF9E59",
name = "Strong Geomagnetic Storms",
sortkey = 82202,
icon = "[[File:Geomagnetic3 Icon.png|35px]]"
},
geo4 = {
color = "FF738A",
name = "Severe Geomagnetic Storms",
sortkey = 82203,
icon = "[[File:Geomagnetic4 Icon.png|35px]]"
},
geo5 = {
color = "A188FC",
name = "Extreme Geomagnetic Storms",
sortkey = 82204,
icon = "[[File:Geomagnetic5 Icon.png|35px]]"
},
-- Heatwaves and Fireweather/Coldwaves/Temperature
heatw = {
color = "FFFFD9",
name = "Warm",
sortkey = 83000,
},
heat4 = {
color = "FFD98C",
name = "Category 4: Very Warm",
sortkey = 83001,
},
heat3 = {
color = "FF9E59",
name = "Category 3: Hot",
sortkey = 83002,
},
heat2 = {
color = "FF738A",
name = "Category 2: Very Hot",
sortkey = 83003,
},
heat1 = {
color = "A188FC",
name = "Category 1: Extremely Hot",
sortkey = 83004,
},
redflagnil = {
color = "4DFFFF",
name = "RFTI NIL",
sortkey = 83100,
icon = "[[File:RFTI_NIL_Icon.png|35px]]"
},
redflagelv = {
color = "FFFFD9",
name = "RFTI Elevated",
sortkey = 83101,
icon = "[[File:RFTI_Elevated.png|35px]]"
},
redflagcrl = {
color = "FFD98C",
name = "RFTI Critical-low",
sortkey = 83102,
icon = "[[File:RFTI_Crit Low_Icon.png|35px]]"
},
redflagcrh = {
color = "FF9E59",
name = "RFTI Critical-High",
sortkey = 83103,
icon = "[[File:RFTI_Crit High_Icon.png|35px]]"
},
redflagecr = {
color = "FF738A",
name = "RFTI Extremely Critical",
sortkey = 83104,
icon = "[[File:RFTI_Extrem Critical_Icon.png|35px]]"
},
redflaghcr = {
color = "A188FC",
name = "RFTI Historically critical",
sortkey = 83004,
icon = "[[File:RFTI_Histor Critical_Icon.png|35px]]"
},
tempb70cn = {
color = "B7698E",
name = "< -70C temperature",
sortkey = 2000,
},
temp70cn = {
color = "CB83A5",
name = "≥ -70C temperature",
sortkey = 2001,
},
temp65cn = {
color = "DCAAC2",
name = "≥ -65C temperature",
sortkey = 2002,
},
temp60cn = {
color = "FAD6EB",
name = "≥ -60C temperature",
sortkey = 2003,
},
temp55cn = {
color = "868686",
name = "≥ -55C temperature",
sortkey = 2004,
},
temp50cn = {
color = "BEBEBE",
name = "≥ -50C temperature",
sortkey = 2005,
},
temp45cn = {
color = "DCDCDC",
name = "≥ -45C temperature",
sortkey = 2006,
},
temp40cn = {
color = "FFFFFF",
name = "≥ -40C temperature",
sortkey = 2007,
},
temp35cn = {
color = "FEE9FF",
name = "≥ -35C temperature",
sortkey = 2008,
},
temp30cn = {
color = "CEA8E7",
name = "≥ -30C temperature",
sortkey = 2009,
},
temp25cn = {
color = "9F6FD2",
name = "≥ -25C temperature",
sortkey = 2010,
},
temp20cn = {
color = "716EEE",
name = "≥ -20C temperature",
sortkey = 2011,
},
temp15cn = {
color = "1e96f8",
name = "≥ -15C temperature",
sortkey = 2012,
},
temp10cn = {
color = "19c5ff",
name = "≥ -10C temperature",
sortkey = 2013,
},
temp5cn = {
color = "aedff9",
name = "≥ -5C temperature",
sortkey = 2014,
},
temp0c = {
color = "009614",
name = "≥ 0C temperature",
sortkey = 2015,
},
temp5c = {
color = "96df00",
name = "≥ 5C temperature",
sortkey = 2016,
},
temp10c = {
color = "c5ee03",
name = "≥ 10C temperature",
sortkey = 2017,
},
temp15c = {
color = "ffff00",
name = "≥ 15C temperature",
sortkey = 2018,
},
temp20c = {
color = "ffc502",
name = "≥ 20C temperature",
sortkey = 2019,
},
temp25c = {
color = "ff9606",
name = "≥ 25C temperature",
sortkey = 2020,
},
temp30c = {
color = "FF5500",
name = "≥ 30C temperature",
sortkey = 2021,
},
temp35c = {
color = "FE1212",
name = "≥ 35C temperature",
sortkey = 2022,
},
temp40c = {
color = "FE1284",
name = "≥ 40C temperature",
sortkey = 2023,
},
temp45c = {
color = "FF7BC3",
name = "≥ 45C temperature",
sortkey = 2024,
},
temp50c = {
color = "FFC1E3",
name = "≥ 50C temperature",
sortkey = 2025,
},
temp55c = {
color = "FFD6ED",
name = "≥ 55C temperature",
sortkey = 2026,
},
windchillb100fn = {
color = "B7698E",
name = "≤ -100F wind chill",
sortkey = 2100,
},
windchill100fn = {
color = "CB83A5",
name = "≥ -100F wind chill",
sortkey = 2101,
},
windchill90fn = {
color = "DCAAC2",
name = "≥ -90F wind chill",
sortkey = 2102,
},
windchill80fn = {
color = "FAD6EB",
name = "≥ -80F wind chill",
sortkey = 2103,
},
windchill70fn = {
color = "868686",
name = "≥ -70F wind chill",
sortkey = 2104,
},
windchill60fn = {
color = "BEBEBE",
name = "≥ -60F wind chill",
sortkey = 2105,
},
windchill50fn = {
color = "DCDCDC",
name = "≥ -50F wind chill",
sortkey = 2106,
},
windchill40fn = {
color = "FFFFFF",
name = "≥ -40F wind chill",
sortkey = 2107,
},
windchill30fn = {
color = "FEE9FF",
name = "≥ -30F wind chill",
sortkey = 2108,
},
windchill20fn = {
color = "CEA8E7",
name = "≥ -20F wind chill",
sortkey = 2109,
},
windchill10fn = {
color = "9F6FD2",
name = "≥ -10F wind chill",
sortkey = 2110,
},
windchill0f = {
color = "716EEE",
name = "≥ 0F wind chill",
sortkey = 2111,
},
windchill10f = {
color = "1e96f8",
name = "≥ 10F wind chill",
sortkey = 2112,
},
windchill20f = {
color = "19c5ff",
name = "≥ 20F wind chill",
sortkey = 2113,
},
windchill30f = {
color = "aedff9",
name = "≥ 30F wind chill",
sortkey = 2114,
},
windchill40f = {
color = "009614",
name = "≥ 40F wind chill",
sortkey = 2115,
},
windchill50f = {
color = "96df00",
name = "≥ 50F wind chill",
sortkey = 2116,
},
windchill60f = {
color = "c5ee03",
name = "≥ 60F wind chill",
sortkey = 2117,
},
heatindex30fb = {
color = "aedff9",
name = "< 30F heat index",
sortkey = 2200,
},
heatindex30f = {
color = "009614",
name = "≥ 30F heat index",
sortkey = 2201,
},
heatindex40f = {
color = "96df00",
name = "≥ 40F heat index",
sortkey = 2202,
},
heatindex50f = {
color = "c5ee03",
name = "≥ 50F heat index",
sortkey = 2203,
},
heatindex60f = {
color = "ffff00",
name = "≥ 60F heat index",
sortkey = 2204,
},
heatindex70f = {
color = "ffc502",
name = "≥ 70F heat index",
sortkey = 2205,
},
heatindex80f = {
color = "ff9606",
name = "≥ 80F heat index",
sortkey = 2206,
},
heatindex90f = {
color = "FF5500",
name = "≥ 90F heat index",
sortkey = 2207,
},
heatindex100f = {
color = "FE1212",
name = "≥ 100F heat index",
sortkey = 2208,
},
heatindex110f = {
color = "FE1284",
name = "≥ 110F heat index",
sortkey = 2209,
},
heatindex120f = {
color = "FF7BC3",
name = "≥ 120F heat index",
sortkey = 2210,
},
heatindex130f = {
color = "FFC1E3",
name = "≥ 130F heat index",
sortkey = 2211,
},
heatindex140f = {
color = "FFD6ED",
name = "≥ 140F heat index",
sortkey = 2212,
},
heatindex150f = {
color = "FFEDF7",
name = "≥ 150F heat index",
sortkey = 2214,
},
heatindex160f = {
color = "FFFFFF",
name = "≥ 160F heat index",
sortkey = 2215,
},
frostbite5 = {
color = "A188FC",
name = "US: Frostbite 5 mins",
sortkey = 83010,
},
frostbite10 = {
color = "FF738A",
name = "US: Frostbite 10 mins",
sortkey = 83011,
},
frostbite30 = {
color = "FFD98C",
name = "US: Frostbite 30 mins",
sortkey = 83012,
},
frostbiten = {
color = "FFFFD9",
name = "US: Frostbite more than 30 mins/not possible",
sortkey = 83013,
},
windchilllow = {
color = "4DFFFF",
name = "Canada: low windchill risk",
sortkey = 83020,
},
windchillmoderate = {
color = "FFFFD9",
name = "Canada: moderate windchill risk",
sortkey = 83021,
},
windchillhigh = {
color = "FFD98C",
name = "Canada: high windchill risk",
sortkey = 83022,
},
windchillveryhigh = {
color = "FF9E59",
name = "Canada: very high windchill risk",
sortkey = 83023,
},
windchillsevere = {
color = "FF738A",
name = "Canada: severe windchill risk",
sortkey = 83024,
},
windchillextreme = {
color = "A188FC",
name = "Canada: extreme windchill risk",
sortkey = 83025,
},
-- ENSO
enson = {
color = "ACACAC",
name = "ENSO Neutral",
sortkey = 200,
},
ensowen = {
color = "C18881",
name = "ENSO Weak El Nino",
sortkey = 201,
},
ensomen = {
color = "D46356",
name = "ENSO Moderate El Nino",
sortkey = 202,
},
ensosen = {
color = "E73E2B",
name = "ENSO Strong El Nino",
sortkey = 203,
},
ensovsen = {
color = "FA1900",
name = "ENSO Very Strong El Nino",
sortkey = 204,
},
ensosln = {
color = "0082E6",
name = "ENSO Strong La Nina",
sortkey = 205,
},
ensomln = {
color = "3A90D2",
name = "ENSO Moderate La Nina",
sortkey = 206,
},
ensowln = {
color = "739EBF",
name = "ENSO Weak La Nina",
sortkey = 207,
},
-- WPC/SPC Risk categories
tstm = {
color = "A9FEC4",
name = "T-storm",
sortkey = 84000,
icon = "[[File:T-storm_Risk_Icon.png|30px]]"
},
mrglr = {
color = "1BC800",
name = "Marginal Risk",
sortkey = 84001,
icon = "[[File:Marginal_risk_Icon.png|30px]]"
},
slgtr = {
color = "FFD98C",
name = "Slight Risk",
sortkey = 84002,
icon = "[[File:Slight_risk_Icon.png|30px]]"
},
enhr = {
color = "FF9E59",
name = "Enhanced Risk",
sortkey = 84003,
icon = "[[File:Enhanced_Risk_Icon.png|30px]]"
},
mdtr = {
color = "FF738A",
name = "Moderate Risk",
sortkey = 84004,
icon = "[[File:Moderate_Risk_Icon.png|30px]]"
},
highr = {
color = "A188FC",
name = "High Risk",
sortkey = 84005,
icon = "[[File:High_Risk_Icon.png|30px]]"
},
elevatedr = {
color = "FF9E59",
name = "Elevated Risk",
sortkey = 84100,
icon = "[[File:Elevated Risk_Icon.png|35px]]"
},
criticalr = {
color = "FF738A",
name = "Critical Risk",
sortkey = 84101,
icon = "[[File:Critical Risk_Icon.png|35px]]"
},
extremer = {
color = "A188FC",
name = "Extreme risk",
sortkey = 84102,
icon = "[[File:Extreme Risk_Icon.png|35px]]"
}
}
-- Define aliases
-- All non-alphanumeric characters are already stripped, and the string is
-- already set to lowercase, so additional aliases for those are no longer
-- required.
cats["rsinuisance"] = cats["rsi0"]
cats["rsinotable"] = cats["rsi1"]
cats["rsiminor"] = cats["rsi2"]
cats["rsimajor"] = cats["rsi3"]
cats["rsicrippling"] = cats["rsi4"]
cats["rsiextreme"] = cats["rsi5"]
cats["rsinuisance"] = cats["rsi0"]
cats["wssi0"] = cats["wssinone"]
cats["wssi1"] = cats["wssilimited"]
cats["wssi2"] = cats["wssiminor"]
cats["wssi3"] = cats["wssimoderate"]
cats["wssi4"] = cats["wssimajor"]
cats["wssi5"] = cats["wssiextreme"]
cats["sty"] = cats["supertyphoon"]
cats["nwpsevere"] = cats["severe"]
cats["strong"] = cats["severe"]
cats["swiosts"] = cats["severe"]
cats["sts"] = cats["severe"]
cats["severets"] = cats["severe"]
cats["ty"] = cats["typhoon"]
cats["vstrtyphoon"] = cats["vstyphoon"]
cats["vsty"] = cats["vstyphoon"]
cats["vity"] = cats["vityphoon"]
cats["td"] = cats["depression"]
cats["ts"] = cats["storm"]
cats["nwpstorm"] = cats["storm"]
cats["d"] = cats["depression"]
cats["overlanddepression"] = cats["overland"]
cats["od"] = cats["overland"]
cats["spdepression"] = cats["depression"]
cats["shdepression"] = cats["depression"]
cats["shemdepression"] = cats["depression"]
cats["swiodepression"] = cats["depression"]
cats["spdepression"] = cats["depression"]
cats["nwpdepression"] = cats["depression"]
cats["swsubdep"] = cats["subdepression"]
cats["sd"] = cats["subdepression"]
cats["ss"] = cats["subtropical"]
cats["swsubstorm"] = cats["subtropical"]
cats["et"] = cats["extratropical"]
cats["ex"] = cats["extratropical"]
cats["md"] = cats["monsoondepression"]
cats["pt"] = cats["potential"]
cats["potentialtropicalcyclone"] = cats["potential"]
cats["potentialtropicalcyclone"] = cats["potential"]
cats["post"] = cats["posttropical"]
cats["remnantlow"] = cats["remnant"]
cats["rl"] = cats["remnant"]
cats["sucs"] = cats["sprcyclstorm"]
cats["escs"] = cats["esvrcyclstorm"]
cats["vscs"] = cats["vsvrcyclstorm"]
cats["scs"] = cats["svrcyclstorm"]
cats["cs"] = cats["niocyclone"]
cats["dd"] = cats["deepdepression"]
cats["cyclstorm"] = cats["niocyclone"]
cats["landdepression"] = cats["nioland"]
cats["land"] = cats["nioland"]
cats["ld"] = cats["nioland"]
cats["fiji5"] = cats["aus5"]
cats["fiji4"] = cats["aus4"]
cats["fiji3"] = cats["aus3"]
cats["fiji2"] = cats["aus2"]
cats["fiji1"] = cats["aus1"]
cats["tl"] = cats["low"]
cats["el"] = cats["extratropicallow"]
cats["di"] = cats["disturbance"]
cats["swiodisturbance"] = cats["disturbance"]
cats["tdist"] = cats["disturbance"]
cats["mts"] = cats["mstorm"]
cats["sub"] = cats["mstorm"]
cats["vitc"] = cats["vintense"]
cats["itc"] = cats["intense"]
cats["tc"] = cats["tropicalcyclone"]
cats["swiotc"] = cats["tropicalcyclone"]
cats["shem3"] = cats["tropicalcyclone"]
cats["shemtc"] = cats["tropicalcyclone"]
cats["f12"] = cats["beaufort12"]
cats["f11"] = cats["beaufort11"]
cats["f10"] = cats["beaufort10"]
cats["f9"] = cats["beaufort9"]
cats["f8"] = cats["beaufort8"]
cats["f7"] = cats["beaufort7"]
cats["f6"] = cats["beaufort6"]
cats["f5"] = cats["beaufort5"]
cats["f4"] = cats["beaufort4"]
cats["f3"] = cats["beaufort3"]
cats["f2"] = cats["beaufort2"]
cats["f1"] = cats["beaufort1"]
cats["f0"] = cats["beaufort0"]
cats["d0"] = cats["drought0"]
cats["d1"] = cats["drought1"]
cats["d2"] = cats["drought2"]
cats["d3"] = cats["drought3"]
cats["d4"] = cats["drought4"]
cats["p1"] = cats["palmer1"]
cats["p2"] = cats["palmer2"]
cats["p3"] = cats["palmer3"]
cats["p4"] = cats["palmer4"]
cats["p5"] = cats["palmer5"]
cats["p6"] = cats["palmer6"]
cats["p7"] = cats["palmer7"]
cats["r1"] = cats["radio1"]
cats["r2"] = cats["radio2"]
cats["r3"] = cats["radio3"]
cats["r4"] = cats["radio4"]
cats["r5"] = cats["radio5"]
cats["s1"] = cats["solar1"]
cats["s2"] = cats["solar2"]
cats["s3"] = cats["solar3"]
cats["s4"] = cats["solar4"]
cats["s5"] = cats["solar5"]
cats["g1"] = cats["geo1"]
cats["g2"] = cats["geo2"]
cats["g3"] = cats["geo3"]
cats["g4"] = cats["geo4"]
cats["g5"] = cats["geo5"]
cats["h1"] = cats["heat1"]
cats["h2"] = cats["heat2"]
cats["h3"] = cats["heat3"]
cats["h4"] = cats["heat4"]
cats["hw"] = cats["heatw"]
cats["thunderstorm"] = cats["tstm"]
cats["tstorm"] = cats["tstm"]
cats["slightrisk"] = cats["slgtr"]
cats["marginalrisk"] = cats["mrglr"]
cats["moderaterisk"] = cats["mdtr"]
cats["highrisk"] = cats["highr"]
cats["enhancedrisk"] = cats["enhr"]
cats["elevatedrisk"] = cats["elevatedr"]
cats["extremerisk"] = cats["extremer"]
cats["criticalrisk"] = cats["criticalr"]
cats["redflag0"] = cats["redflagnil"]
cats["redflag1"] = cats["redflagelv"]
cats["redflag3"] = cats["redflagcrl"]
cats["redflag5"] = cats["redflagcrh"]
cats["redflag7"] = cats["redflagecr"]
cats["redflag9"] = cats["redflaghcr"]
cats["rfti0"] = cats["redflagnil"]
cats["rfti1"] = cats["redflagelv"]
cats["rfti3"] = cats["redflagcrl"]
cats["rfti5"] = cats["redflagcrh"]
cats["rfti7"] = cats["redflagecr"]
cats["rfti9"] = cats["redflaghcr"]
cats["torrou"] = cats["tu"]
cats["torro0"] = cats["t0"]
cats["torro1"] = cats["t1"]
cats["torro2"] = cats["t2"]
cats["torro3"] = cats["t3"]
cats["torro4"] = cats["t4"]
cats["torro5"] = cats["t5"]
cats["torro6"] = cats["t6"]
cats["torro7"] = cats["t7"]
cats["torro8"] = cats["t8"]
cats["torro9"] = cats["t9"]
cats["torro10"] = cats["t10"]
cats["torro11"] = cats["t11"]
cats["funnelcloud"] = cats["fc"]
cats["ice0"] = cats["spia0"]
cats["ice1"] = cats["spia1"]
cats["ice2"] = cats["spia2"]
cats["ice3"] = cats["spia3"]
cats["ice4"] = cats["spia4"]
cats["ice5"] = cats["spia5"]
-- Key standardization check
for k, v in pairs(cats) do
if k ~= mw.ustring.gsub(k, "[^%w]", "") then
mw.addWarning(
"Category \""
.. k
.. "\" in [[Module:Storm categories/categories]] is defined with a non-alphanumeric key. "
.. "This key will likely be unusable unless non-alphanumeric characters are removed."
)
end
end
p.defaultCategory = "unknown"
p.cats = cats
return p
f7bmcb6ltmsspdgjqvwscpefc9dk094
Module:Storm categories/colors
828
50946
305457
2026-08-16T18:48:02Z
Isma4l
41797
Bog cusub: local p = {} local cats = require("Module:Storm categories/categories").cats -- Ambiguous color names. This is because the old {[storm colour}} itself is -- extremely ambiguous. This is also used to override the output of some codes. local colors = { -- Basin colors ["5"] = cats["cat5"].color, ["4"] = cats["cat4"].color, ["3"] = cats["cat3"].color, ["2"] = cats["cat2"].color, ["1"] = cats["cat1"].color, -- Depression ["d"] = "1591de", -- FMS scale ["a5"] = cats["aus5"...
305457
Scribunto
text/plain
local p = {}
local cats = require("Module:Storm categories/categories").cats
-- Ambiguous color names. This is because the old {[storm colour}} itself is
-- extremely ambiguous. This is also used to override the output of some codes.
local colors = {
-- Basin colors
["5"] = cats["cat5"].color,
["4"] = cats["cat4"].color,
["3"] = cats["cat3"].color,
["2"] = cats["cat2"].color,
["1"] = cats["cat1"].color,
-- Depression
["d"] = "1591de",
-- FMS scale
["a5"] = cats["aus5"].color,
["a4"] = cats["aus4"].color,
["a3"] = cats["aus3"].color,
["a2"] = cats["aus2"].color,
["a1"] = cats["aus1"].color
}
p.colors = colors
return p
rxq831ah396jrxqfnwl6csy9kz1cju8
Module:Storm categories/icons
828
50947
305458
2026-08-16T18:48:28Z
Isma4l
41797
Bog cusub: local p = {} local cats = require("Module:Storm categories/categories").cats -- Icon overrides for old {{Tropical cyclone status icons}} that don't have a -- viable category. local icons = { -- Ambiguious 5-tier scale ["1"] = cats["cat1"].icon, ["2"] = cats["cat2"].icon, ["3"] = cats["cat3"].icon, ["4"] = cats["cat4"].icon, ["5"] = cats["cat5"].icon, -- FMS scale ["a5"] = cats["aus5"].icon, ["a4"] = cats["aus4"].icon, ["a3"] = cats["aus3"].icon, ["a2"] = cats["aus2"]....
305458
Scribunto
text/plain
local p = {}
local cats = require("Module:Storm categories/categories").cats
-- Icon overrides for old {{Tropical cyclone status icons}} that don't have a
-- viable category.
local icons = {
-- Ambiguious 5-tier scale
["1"] = cats["cat1"].icon,
["2"] = cats["cat2"].icon,
["3"] = cats["cat3"].icon,
["4"] = cats["cat4"].icon,
["5"] = cats["cat5"].icon,
-- FMS scale
["a5"] = cats["aus5"].icon,
["a4"] = cats["aus4"].icon,
["a3"] = cats["aus3"].icon,
["a2"] = cats["aus2"].icon,
["a1"] = cats["aus1"].icon,
-- Misc
["extratropical2"] = "[[File:Extratropical storm icon.png|18px]]",
["typhoon"] = "[[File:Typhoon icon.png|18px]]",
["vstyphoon"] = "[[File:Very strong typhoon icon.png|18px]]",
["vityphoon"] = "[[File:Violent typhoon icon.png|18px]]",
["swiosts"] = "[[File:Severe tropical storm south icon.png|18px]]",
["swiotc"] = "[[File:SWIO tropical cyclone icon.png|18px]]"
}
icons["et2"] = icons["extratropical2"]
icons["ex2"] = icons["extratropical2"]
icons["ty"] = icons["typhoon"]
icons["stss"] = icons["swiosts"]
icons["tc"] = icons["swiotc"]
p.icons = icons
return p
aagksvyx94oolscbs3rjt5y2jqiv24b
Module:Storm categories/demo
828
50948
305459
2026-08-16T18:49:38Z
Isma4l
41797
Bog cusub: -- -- This module handles demonstration and list of possible values for all storm -- category templates! Please test this module on [[Module:Storm categories/demo/doc]] -- before publishing to avoid errros. Thank you! -- local colorRatio = require("Module:Color contrast")._ratio local TableTools = require("Module:TableTools") local stormcats = require("Module:Storm categories") local cats = require("Module:Storm categories/categories").cats local colors = require("Module:Storm ca...
305459
Scribunto
text/plain
--
-- This module handles demonstration and list of possible values for all storm
-- category templates! Please test this module on [[Module:Storm categories/demo/doc]]
-- before publishing to avoid errros. Thank you!
--
local colorRatio = require("Module:Color contrast")._ratio
local TableTools = require("Module:TableTools")
local stormcats = require("Module:Storm categories")
local cats = require("Module:Storm categories/categories").cats
local colors = require("Module:Storm categories/colors").colors
local icons = require("Module:Storm categories/icons").icons
local p = {}
local customKeys = {}
for k, v in pairs(colors) do
table.insert(customKeys, k)
end
for k, v in pairs(icons) do
table.insert(customKeys, k)
end
TableTools.removeDuplicates(customKeys)
function tableEmpty(_table)
for k, v in pairs(_table) do
return false
end
return true
end
--- Generates and renderds the demo table.
-- @param frame The Scribunto frame.
function p.demo(frame)
local plain = (frame.args["plain"] or frame:getParent().args["plain"] or "") ~= ""
local verbose = (frame.args["verbose"] or frame:getParent().args["verbose"] or "") ~= ""
local legend = setmetatable({}, { refgroupname = "" })
local errors = setmetatable({}, { refgroupname = "E" })
local warnings = setmetatable({}, { refgroupname = "W" })
--- Builds the entire reflist
-- @param _group The group to build for. Uses `legend` by default.
function buildReflist(_group)
group = _group or legend
return frame:expandTemplate{ title = 'reflist', args = {
group = getmetatable(group)["refgroupname"]
} }
end
--- Returns a single <ref> tag containing the legend provided and
-- attaches the note definition to the list of notes.
-- @param details The details of the legend.
-- @param _group The group to write in. Uses `legend` by default.
function createLegend(details, _group)
hash = string.sub(mw.hash.hashValue("md5", details), 0, 8)
group = _group or legend
if group[hash] == nil then
group[hash] = plain and "" or frame:extensionTag{
-- <ref name="hash">details</ref>
name = 'ref',
content = mw.ustring.gsub(details, "%[%[File:([^%|]+)[^%]]*%]%]", "[[:File:%1]]"),
args = {
name = hash,
group = getmetatable(group)["refgroupname"]
}
}
end
-- <ref name="hash"/>
return plain and "" or frame:extensionTag{ name = 'ref', args = {
name = hash,
group = getmetatable(group)["refgroupname"]
} }
end
--- Checks for color contrast issues and tags accordingly.
-- Returns the refernce tag, so this should be used in conjunction with an
-- HTML node's :wikitext function.
function contrastCheck(color)
local catColorBlackRatio = colorRatio({ "#" .. color, "black" })
local catColorLinkRatio = colorRatio({ "#" .. color, "#0645ad" })
local catColorVisitedLinkRatio = colorRatio({ "#" .. color, "#0b0080" })
local finalWikitext = ""
if catColorBlackRatio == "?" or catColorLinkRatio == "?" or catColorVisitedLinkRatio == "?" then
finalWikitext = finalWikitext ..
createLegend("This color must be a hexadecimal color.", errors)
else
if catColorBlackRatio < 4.5 then
finalWikitext = finalWikitext ..
createLegend("This color has [[MOS:COLOR|contrast issues]] with black (not WCAG 2.0 AA-compatible). It will be unusable on all infoboxes and storm season summaries.", errors)
end
if catColorLinkRatio < 4.5 then
finalWikitext = finalWikitext ..
createLegend("This color has [[MOS:COLOR|contrast issues]] with links (not WCAG 2.0 AA-compatible). It should not be used in conjunction with a link.", warnings)
end
if catColorVisitedLinkRatio < 4.5 then
finalWikitext = finalWikitext ..
createLegend("This color has [[MOS:COLOR|contrast issues]] with visited links (not WCAG 2.0 AA-compatible with #0b0080). It should not be used in conjunction with a visited link.", warnings)
end
if actualCat == "c0c0c0" and cat[sortkey] ~= 0 then
finalWikitext = finalWikitext ..
createLegend("This category is using a color reserved specifically for the \"unknown\" category.", warnings)
end
end
return finalWikitext
end
function colorInfo(color, verbose, extra)
local catColorBlackRatio = colorRatio({ "#" .. color, "black" })
local catColorLinkRatio = colorRatio({ "#" .. color, "#0645ad" })
local catColorVisitedLinkRatio = colorRatio({ "#" .. color, "#0b0080" })
local nc = tostring(mw.html.create("abbr")
:wikitext("NC")
:attr("title", "Does not satisfy the minimum WCAG 2.1 compliance level for color contrast (AA)")
);
local aa = tostring(mw.html.create("abbr")
:wikitext("AA")
:attr("title", "WCAG 2.1 Level AA: Acceptable compliance")
);
local aaa = tostring(mw.html.create("abbr")
:wikitext("AAA")
:attr("title", "WCAG 2.1 Level AAA: Optimal compliance")
);
function contrastLevel(contrast)
return contrast >= 7 and aaa or (contrast >= 4.5 and aa or nc)
end
return mw.html.create("td")
:attr("data-sort-value", math.min(catColorBlackRatio))
:wikitext(
"#" .. color .. (extra or "") .. contrastCheck(color) .. (verbose and ("<br/>"
.. tostring(
mw.html.create("abbr")
:attr("title", "Contrast to black")
:wikitext("CTB")
) .. ": " .. string.format("%.2f", catColorBlackRatio) .. " (" .. contrastLevel(catColorBlackRatio) .. ")<br/>"
.. tostring(
mw.html.create("abbr")
:attr("title", "Contrast to links")
:wikitext("CTL")
) .. ": " .. string.format("%.2f", catColorLinkRatio) .. " (" .. contrastLevel(catColorLinkRatio) .. ")<br/>"
.. tostring(
mw.html.create("abbr")
:attr("title", "Contrast to visited links")
:wikitext("CTVL")
) .. ": " .. string.format("%.2f", catColorVisitedLinkRatio) .. " (" .. contrastLevel(catColorVisitedLinkRatio) .. ")") or "")
)
end
local categoryTable = mw.html.create("table")
:addClass("wikitable")
:addClass("sortable")
:attr("style", "width: 100%")
categoryTable
:node(
mw.html.create("tr")
:node(mw.html.create("th"):wikitext("Icon")
:attr("class", "unsortable")
:attr("rowspan", "2")
:css("width", "0"))
:node(mw.html.create("th"):wikitext("ID")
:attr("rowspan", "2"))
:node(mw.html.create("th"):wikitext("Name")
:attr("colspan", "2"))
:node(mw.html.create("th"):wikitext("Color")
:attr("rowspan", "2")
:attr("colspan", "2"))
:node(mw.html.create("th"):wikitext("Sortkey")
:attr("colspan", "2"))
):node(
mw.html.create("tr")
:node(mw.html.create("th"):wikitext("Basin"))
:node(mw.html.create("th"):wikitext("Name"))
:node(mw.html.create("th"):wikitext("Basin"))
:node(mw.html.create("th"):wikitext("Sortkey")
:attr("data-sort-type", "number"))
)
for name, cat in TableTools.sortedPairs(cats) do
local rows = { mw.html.create("tr") }
local row = rows[1]
local actualIcon = stormcats._icon(name)
local icon = mw.html.create("td")
:wikitext(actualIcon)
if cat["icon"] ~= nil and actualIcon ~= cat["icon"] then
icon:wikitext(
createLegend("Overriden from original icon (" .. cat["icon"] .. ")")
)
end
local id = mw.html.create("td")
:wikitext(name)
local actualColor = stormcats._color(name)
local colorPreview = mw.html.create("td")
:attr("style", "background-color: #" .. actualColor .. "; color:inherit; padding: 0; width: 1.8em")
local color = colorInfo(
actualColor,
verbose,
actualColor ~= cat["color"] and createLegend(
"Overriden from original color ({{color box|#"
.. cat["color"]
.. "}} #"
.. cat["color"]
.. ")"
) or ""
):css("width", "0"):css("white-space", "nowrap")
local sortkeyCategory = mw.html.create("td")
:attr("data-sort-value", cat["sortkey"])
local sortkey = mw.html.create("td")
:attr("data-sort-value", cat["sortkey"])
:wikitext(cat["sortkey"])
if cat["sortkey"] < 0 then
sortkeyCategory:wikitext("Invalid")
elseif cat["sortkey"] < 20000 then
sortkeyCategory:wikitext("Global")
elseif cat["sortkey"] < 30000 then
sortkeyCategory:wikitext("Historical")
elseif cat["sortkey"] < 40000 then
sortkeyCategory:wikitext("SWIO")
elseif cat["sortkey"] < 50000 then
sortkeyCategory:wikitext("Aus/Fiji")
elseif cat["sortkey"] < 60000 then
sortkeyCategory:wikitext("NIO")
elseif cat["sortkey"] < 80000 then
sortkeyCategory:wikitext("WPAC")
elseif cat["sortkey"] < 90000 then
sortkeyCategory:wikitext("Atl/EPac/SAtl")
elseif cat["sortkey"] < 100000 then
sortkeyCategory:attr("style", "color: gray")
sortkeyCategory:wikitext("''Global''")
else
sortkeyCategory:wikitext("Invalid")
end
if type(cat["name"]) == "string" then
local name = mw.html.create("td")
:attr("colspan", "2")
:wikitext(cat["name"])
row:node(icon)
row:node(id)
row:node(name)
else
local nameTableLength = TableTools.size(cat["name"])
icon:attr("rowspan", nameTableLength)
id:attr("rowspan", nameTableLength)
colorPreview:attr("rowspan", nameTableLength)
color:attr("rowspan", nameTableLength)
sortkeyCategory:attr("rowspan", nameTableLength)
sortkey:attr("rowspan", nameTableLength)
row:node(icon)
row:node(id)
local firstDone = false
for key, basinName in TableTools.sortedPairs(cat["name"]) do
if firstDone then
local nameRow = mw.html.create("tr")
nameRow
:node(mw.html.create("td"):wikitext(key))
:node(mw.html.create("td"):wikitext(basinName))
table.insert(rows, nameRow)
else
firstDone = true
row
:node(mw.html.create("td"):wikitext(key))
:node(mw.html.create("td"):wikitext(basinName))
end
end
end
row:node(colorPreview)
row:node(color)
row:node(sortkeyCategory)
row:node(sortkey)
for _, _row in TableTools.sortedPairs(rows) do
categoryTable:node(_row)
end
end
for name, _ in TableTools.sortedPairs(TableTools.listToSet(customKeys)) do
if cats[name] == nil then
local row = mw.html.create("tr")
local icon = stormcats._icon(name, true)
row
:node(mw.html.create("td")
:wikitext(
icon ~= nil
and icon
or "''<span style=\"color:gray\">N/A</span>''"
))
:node(mw.html.create("td"):wikitext(name))
local color = stormcats._color(name, true)
-- Add more conditions eventually
if color ~= nil then
row
:node(mw.html.create("td")
:attr("colspan", "2")
:wikitext("''<span style=\"color:gray\">not available</span>''"))
:node(mw.html.create("td")
:attr("style", "background-color: #" .. color .. "; color:inherit; padding: 0; width: 1.8em"))
:node(colorInfo(color, verbose))
:css("width", "0")
:css("white-space", "nowrap")
:node(mw.html.create("td")
:attr("colspan", "2")
:wikitext("''<span style=\"color:gray\">not available</span>''"))
else
row
:node(mw.html.create("td")
:attr("colspan", "6")
:wikitext("''<span style=\"color:gray\">not available</span>''"))
end
categoryTable:node(row)
end
end
out = ""
if not plain and not tableEmpty(errors) then
out = out
.. tostring(mw.html.create("h4"):wikitext("Error"))
.. tostring(mw.html.create("p"):wikitext("This table contains errors than need to be addressed immediately, as it may cause errors on a large amount of pages."))
.. buildReflist(errors)
end
if not plain and not tableEmpty(legend) then
out = out
.. tostring(mw.html.create("h4"):wikitext("Legend"))
.. buildReflist(legend)
end
out = out .. tostring(categoryTable)
if not plain and not tableEmpty(warnings) then
out = out
.. tostring(mw.html.create("h4"):wikitext("Warnings"))
.. tostring(mw.html.create("p"):wikitext("This table contains warnings than should be addressed. Please note that some warnings cannot be fully addressed without changes that would require consensus."))
.. buildReflist(warnings)
end
return mw.text.trim(out)
end
return p
rv0o6c86b7enr0az4rjeajd6vm5rpdp
Module:Italic title2
828
50949
305460
2026-08-16T18:50:18Z
Isma4l
41797
Bog cusub: -- This module implements {{italic title}}. require('strict') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local yesno = require('Module:Yesno') -------------------------------------------------------------------------------- -- ItalicTitle class -------------------------------------------------------------------------------- local ItalicTitle = {} do -------------------------...
305460
Scribunto
text/plain
-- This module implements {{italic title}}.
require('strict')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local yesno = require('Module:Yesno')
--------------------------------------------------------------------------------
-- ItalicTitle class
--------------------------------------------------------------------------------
local ItalicTitle = {}
do
----------------------------------------------------------------------------
-- Class attributes and functions
-- Things that belong to the class are here. Things that belong to each
-- object are in the constructor.
----------------------------------------------------------------------------
-- Keys of title parts that can be italicized.
local italicizableKeys = {
namespace = true,
title = true,
dab = true,
}
----------------------------------------------------------------------------
-- ItalicTitle constructor
-- This contains all the dynamic attributes and methods.
----------------------------------------------------------------------------
function ItalicTitle.new()
local obj = {}
-- Function for checking self variable in methods.
local checkSelf = libraryUtil.makeCheckSelfFunction(
'ItalicTitle',
'obj',
obj,
'ItalicTitle object'
)
-- Checks a key is present in a lookup table.
-- Param: name - the function name.
-- Param: argId - integer position of the key in the argument list.
-- Param: key - the key.
-- Param: lookupTable - the table to look the key up in.
local function checkKey(name, argId, key, lookupTable)
if not lookupTable[key] then
error(string.format(
"bad argument #%d to '%s' ('%s' is not a valid key)",
argId,
name,
key
), 3)
end
end
-- Set up object structure.
local parsed = false
local categories = {}
local italicizedKeys = {}
local italicizedSubstrings = {}
-- Parses a title object into its namespace text, title, and
-- disambiguation text.
-- Param: options - a table of options with the following keys:
-- title - the title object to parse
-- ignoreDab - ignore any disambiguation parentheses
-- Returns the current object.
function obj:parseTitle(options)
checkSelf(self, 'parseTitle')
checkType('parseTitle', 1, options, 'table')
checkTypeForNamedArg('parseTitle', 'title', options.title, 'table')
local title = options.title
-- Title and dab text
local prefix, parentheses
if not options.ignoreDab then
prefix, parentheses = mw.ustring.match(
title.text,
'^(.+) (%b())$'
)
end
if parentheses then
parentheses = parentheses:sub(2, -2)
end
if prefix and parentheses then
self.title = prefix
self.dab = parentheses
else
self.title = title.text
end
-- Namespace
local namespace = mw.site.namespaces[title.namespace].name
if namespace and #namespace >= 1 then
self.namespace = namespace
end
-- Register the object as having parsed a title.
parsed = true
return self
end
-- Italicizes part of the title.
-- Param: key - the key of the title part to be italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:italicize(key)
checkSelf(self, 'italicize')
checkType('italicize', 1, key, 'string')
checkKey('italicize', 1, key, italicizableKeys)
italicizedKeys[key] = true
return self
end
-- Un-italicizes part of the title.
-- Param: key - the key of the title part to be un-italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:unitalicize(key)
checkSelf(self, 'unitalicize')
checkType('unitalicize', 1, key, 'string')
checkKey('unitalicize', 1, key, italicizableKeys)
italicizedKeys[key] = nil
return self
end
-- Italicizes a substring in the title. This only affects the main part
-- of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be italicized.
-- Returns the current object.
function obj:italicizeSubstring(s)
checkSelf(self, 'italicizeSubstring')
checkType('italicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = true
return self
end
-- Un-italicizes a substring in the title. This only affects the main
-- part of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be un-italicized.
-- Returns the current object.
function obj:unitalicizeSubstring(s)
checkSelf(self, 'unitalicizeSubstring')
checkType('unitalicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = nil
return self
end
-- Renders the object into a page name. If no title has yet been parsed,
-- the current title is used.
-- Returns string
function obj:renderTitle()
checkSelf(self, 'renderTitle')
-- Italicizes a string
-- Param: s - the string to italicize
-- Returns string.
local function italicize(s)
assert(type(s) == 'string', 's was not a string')
assert(s ~= '', 's was the empty string')
return string.format('<i>%s</i>', s)
end
-- Escape characters in a string that are magic in Lua patterns.
-- Param: pattern - the pattern to escape
-- Returns string.
local function escapeMagicCharacters(s)
assert(type(s) == 'string', 's was not a string')
return s:gsub('%p', '%%%0')
end
-- If a title hasn't been parsed yet, parse the current title.
if not parsed then
self:parseTitle{title = mw.title.getCurrentTitle()}
end
-- Italicize the different parts of the title and store them in a
-- titleParts table to be joined together later.
local titleParts = {}
-- Italicize the italicizable keys.
for key in pairs(italicizableKeys) do
if self[key] then
if italicizedKeys[key] then
titleParts[key] = italicize(self[key])
else
titleParts[key] = self[key]
end
end
end
-- Italicize substrings. If there are any substrings to be
-- italicized then start from the raw title, as this overrides any
-- italicization of the main part of the title.
if next(italicizedSubstrings) then
local originalString
if titleParts.dab then
originalString = self.dab
else
originalString = self.title
end
for s in pairs(italicizedSubstrings) do
local pattern = escapeMagicCharacters(s)
local italicizedTitle, nReplacements = originalString:gsub(
pattern,
italicize
)
if titleParts.dab then
titleParts.dab = italicizedTitle
else
titleParts.title = italicizedTitle
end
-- If we didn't make any replacements then it means that we
-- have been passed a bad substring or that the page has
-- been moved to a bad title, so add a tracking category.
if nReplacements < 1 then
categories['Pages using italic title with no matching string'] = true
end
end
end
-- Assemble the title together from the parts.
local ret = ''
if titleParts.namespace then
ret = ret .. titleParts.namespace .. ':'
end
ret = ret .. titleParts.title
if titleParts.dab then
ret = ret .. ' (' .. titleParts.dab .. ')'
end
return ret
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments.
-- Returns string
function obj:renderDisplayTitle(...)
checkSelf(self, 'renderDisplayTitle')
return mw.getCurrentFrame():callParserFunction(
'DISPLAYTITLE',
self:renderTitle(),
...
)
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments, plus
-- any tracking categories.
-- Returns string
function obj:render(...)
checkSelf(self, 'render')
local ret = self:renderDisplayTitle(...)
for cat in pairs(categories) do
ret = ret .. string.format(
'[[Category:%s]]',
cat
)
end
return ret
end
return obj
end
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
local function getArgs(frame, wrapper)
assert(type(wrapper) == 'string', 'wrapper was not a string')
return require('Module:Arguments').getArgs(frame, {
wrappers = wrapper
})
end
-- Main function for {{italic title}}
function p._main(args)
checkType('_main', 1, args, 'table')
local italicTitle = ItalicTitle.new()
italicTitle:parseTitle{
title = mw.title.getCurrentTitle(),
ignoreDab = yesno(args.all, false)
}
if args.string then
italicTitle:italicizeSubstring(args.string)
else
italicTitle:italicize('title')
end
return italicTitle:render(args[1])
end
function p.main(frame)
return p._main(getArgs(frame, 'Template:Italic title'))
end
function p._dabonly(args)
local italicTitle = ItalicTitle.new()
if args.string then
italicTitle:italicizeSubstring(args.string)
else
italicTitle:italicize('dab')
end
return italicTitle:render(args[1])
end
function p.dabonly(frame)
return p._dabonly(getArgs(frame, 'Template:Italic dab2'))
end
return p
r03hwa7w3857gnj5wv0m1u6b6gb6v25
Template:No backlog
10
50950
305461
2026-08-16T19:26:52Z
Isma4l
41797
/* */
305461
wikitext
text/x-wiki
<noinclude>
{{Documentation}}
</noinclude>
ltzf24yhonbtovmhn069rvcyx9c1gf7
Template:Noadminbacklog
10
50951
305463
2026-08-16T19:40:37Z
Isma4l
41797
/* */
305463
wikitext
text/x-wiki
#Redirect [[Template:No backlog]]
536647ywcovx078hiszgnrbk7v837qk
Template:Motor Ship
10
50952
305464
2026-08-16T19:43:24Z
Isma4l
41797
/* */
305464
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude />#invoke:WPSHIPS utilities|ship_prefix_templates|prefix=MS}}</includeonly><!--
--><noinclude>{{documentation}}</noinclude>
oenf9ugz5dal3tmndubljo293fjso2m
Template:Reign
10
50953
305465
2026-08-16T19:44:28Z
Isma4l
41797
/* */
305465
wikitext
text/x-wiki
{{#if:{{{sortable|}}}
|<span style="display:none; speak:none;">{{padleft:{{{sort_date|{{{sortdate|{{{sort-date|{{{single|{{{pre-date|{{{predate|{{{pre_date|{{{1|{{{2|{{{post-date|{{{postdate|{{{post_date|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|4|0}}</span>
}}<span style="white-space:nowrap;"><!--
-->{{#if:{{{label|}}}
|{{{label}}}{{#if:{{{wrap|}}}|{{wbr}}}}
|{{#switch:{{{show|{{{link|{{{lk|}}}}}}}}}
|no|off|n|false|0|none = {{#if:{{{cap|}}}|R|r}}.
|link|yes|on|y|true|1 = [[Reign|{{#if:{{{cap|}}}|R|r}}.]]
|word = {{#if:{{{cap|}}}|R|r}}eigned
|colon = {{#if:{{{cap|}}}|R|r}}eign:
|lword = [[Reign|{{#if:{{{cap|}}}|R|r}}eigned]]
|lcolon = [[Reign|{{#if:{{{cap|}}}|R|r}}eign]]:
|blank =
|abbr|#default = {{Abbr|{{#if:{{{cap|}}}|R|r}}.|reigned}}
}}
}}<!--
-->{{#ifeq:{{{show|{{{link|{{{lk|}}}}}}}}}|blank
|<!--nothing-->
|{{#if:{{{pre-date|}}}{{{predate|}}}{{{pre_date}}}{{{1|}}}{{{2|}}}|&{{#switch:{{{show|{{{link|{{{lk|}}}}}}}}}
|word|colon|lword|lcolon = nbsp
|#default = {{#if:{{{label|}}}|nbsp|thinsp}}}};
}}
}}<!--
-->{{#if:{{{pre-date|}}}{{{predate|}}}{{{pre_date|}}}|{{{pre-date|{{{predate|{{{pre_date}}}}}}}}}, {{#if:{{{wrap|}}}|{{wbr}}}}}}<!--
-->{{#if:{{{1|}}}|{{trim|{{{1}}}}}}}<!--
-->{{#if:{{{2|}}}
|{{#if:{{{1|}}}||?}}<!--
-->{{#ifeq:{{#invoke:String |find |source={{trim|{{{1|}}}}}{{trim|{{{2|}}}}} |target=%s |plain=false }} | 0
|–{{trim|{{{2}}}}}
| – {{trim|{{{2}}}}}
}}<!--
-->{{#if:{{{mid-date|}}}{{{middate|}}}{{{mid_date|}}}
|, {{#if:{{{wrap|}}}|{{wbr}}}}{{{mid-date|{{{middate|{{{mid_date}}}}}}}}}}}<!--
-->{{#if:{{{3|}}}{{{4|}}}
|, {{#if:{{{wrap|}}}|{{wbr}}}}{{#if:{{{3|}}}|{{trim|{{{3}}}}}|?}}<!--
-->{{#ifeq:{{#invoke:String |find |source={{trim|{{{3|}}}}}{{trim|{{{4|}}}}} |target=%s |plain=false }} | 0
|–{{trim|{{{4}}}}}
| – {{trim|{{{4}}}}}
}}
}}
|{{#if:{{{1|}}}|– }}
}}<!--
-->{{#if:{{{single|}}}{{{post-date|}}}{{{postdate|}}}{{{post_date|}}}
|{{#if:{{{1|}}}{{{2|}}}|, }}{{#if:{{{wrap|}}}|{{wbr}}}}{{{single|{{{post-date|{{{postdate|{{{post_date}}}}}}}}}}}}
}}<!--
-->{{#if:{{{era|}}}| {{{era}}}}}<!--
--></span><noinclude>
{{Documentation}}
</noinclude>
im777bw8u8c9g35p0sx0aaolb6tr1zi
Template:Storm colour
10
50954
305466
2026-08-16T19:45:57Z
Isma4l
41797
/* */
305466
wikitext
text/x-wiki
</noinclude>{{#invoke:Storm categories|color}}<noinclude>
{{Documentation}}
</noinclude>
slbuhf4olim53o53obqhl43hq34j0su
Template:Starbox begin
10
50955
305467
2026-08-16T19:46:44Z
Isma4l
41797
/* */
305467
wikitext
text/x-wiki
{| class="infobox" style="width: 22em; font-size: 88%; <!-- text-align: left; --> line-height: 1.5em"
|+ style="font-size: 125%; font-weight: bold" | {{{name<includeonly>|{{PAGENAME}}</includeonly>}}}<noinclude>
|}{{Documentation}}</noinclude>
211z2d8hrupid5zt8apfdvsvgwoy2rk
Template:Title case
10
50956
305468
2026-08-16T19:47:26Z
Isma4l
41797
/* */
305468
wikitext
text/x-wiki
{{{{{|safesubst:}}}#if:{{{1|}}}|{{{{{|safesubst:}}}#invoke:string2|title|{{{1|}}}}}}}<noinclude>
{{documentation}}
</noinclude>
4rmc65duzp2axwabf95od5kmrol8jnb
Module:Sports table/WL
828
50957
305469
2026-08-16T19:49:52Z
Isma4l
41797
Bog cusub: -- Style for football tables local pp = {} local pmod = require('Module:Sports table/WDL') function pp.header(t,Args,p_sub,pos_label,group_col,VTE_text,full_table,results_header_txt) Args['show_draw'] = Args['show_draw'] or 'no' return pmod.header(t,Args,p_sub,pos_label,group_col,VTE_text,full_table,results_header_txt) end function pp.row(frame,t,Args,p_sub,notes_exist,hth_id_list,full_table,rand_val,team_list,team_code_ii,ii_start,ii_end,ii_fw,bg_col,N_teams,ii,ii_show) Ar...
305469
Scribunto
text/plain
-- Style for football tables
local pp = {}
local pmod = require('Module:Sports table/WDL')
function pp.header(t,Args,p_sub,pos_label,group_col,VTE_text,full_table,results_header_txt)
Args['show_draw'] = Args['show_draw'] or 'no'
return pmod.header(t,Args,p_sub,pos_label,group_col,VTE_text,full_table,results_header_txt)
end
function pp.row(frame,t,Args,p_sub,notes_exist,hth_id_list,full_table,rand_val,team_list,team_code_ii,ii_start,ii_end,ii_fw,bg_col,N_teams,ii,ii_show)
Args['show_draw'] = Args['show_draw'] or 'no'
return pmod.row(frame,t,Args,p_sub,notes_exist,hth_id_list,full_table,rand_val,team_list,team_code_ii,ii_start,ii_end,ii_fw,bg_col,N_teams,ii,ii_show)
end
function pp.status(Args)
Args['show_draw'] = Args['show_draw'] or 'no'
return pmod.status(Args)
end
return pp
i4hmqrwyhdns6id2jrz5z9r1i5wanmf