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|}}}||&nbsp;}}</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|}}}]]&nbsp;}}{{#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|}}}||&nbsp;}}</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|}}}]]&nbsp;}}{{#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}}}}}||&nbsp;[[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 '&nbsp;' 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 "&nbsp;" to make sure they don't wrap. -- Don't replace anything if we are substing, as we generally don't want -- to use "&nbsp;" in that case. if mw.isSubsting() then return s else return s:gsub(' ', '&nbsp;') 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 &nbsp;, 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;">&rarr;</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 = '&nbsp;<b>·</b> ' local res = '<span id="' .. ns .. ':' .. tname .. '" class="plainlinks nourlexpansion 1x">' .. '[[:' .. ns .. ':' .. tname .. ']]&nbsp;(' .. '[[' .. 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}}}.&nbsp;|}}{{#if:{{{ru_type|}}}|{{{ru_type}}}&nbsp;|}}{{#if:{{{ru_number|}}}|№{{{ru_number}}}&nbsp;|}}{{#if:{{{ru_date|}}}|{{#if:{{{ru_type|}}}|{{#if:{{{ru_date|}}}|от&nbsp;}}}}{{{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|}}}|от&nbsp;{{{ru_amendment_date}}}|}}{{#if:{{{ru_amendment_title|}}}|&nbsp;«{{{ru_amendment_title}}}»}}}}.}} {{#if:{{{ru_effective_date|}}}|Вступил в силу&nbsp;{{{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}}}.&nbsp;|}}{{#if:{{{en_type|}}}|{{{en_type}}}&nbsp;|}}{{#if:{{{en_number|}}}|&#x023;{{{en_number}}}&nbsp;|}}{{#if:{{{en_date|}}}|{{#if:{{{en_type|}}}|{{#if:{{{en_date|}}}|of&nbsp;}}}}{{{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}}}&nbsp;|}}&#x023;{{{en_amendment_number}}} {{#if:{{{en_amendment_date|}}}|of&nbsp;{{{en_amendment_date}}}|}} {{#if:{{{en_amendment_title|}}}|''{{{en_amendment_title}}}''}}}}. {{#if:{{{ru_effective_date|}}}|Effective as of&nbsp;{{{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>&#123;&#123;&#123;title&#125;&#125;&#125;</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}}}|&#59;|}} | {{{last}}} [@{{{user|}}}]{{#if:{{{user2}}}|&#59;|}} }} | {{#if: {{{author|}}} | {{{author}}} [@{{{user|}}}]{{#if:{{{user2}}}|&#59;|}} | {{#if: {{{author-link2|{{{authorlink2|}}} }}} | {{{author-link2|{{{authorlink2|}}} }}} [@{{{user|}}}]{{#if:{{{user2}}}|&#59;|}} | @{{{user|}}}{{#if:{{{user2}}}|&#59;|}} }} }} }} | 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">&#59;</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>&#124;user=</kbd> ([[Template:Cite instagram#Error detection|help]]){{#ifeq: {{{postid|}}}{{{date|}}} | {{{postid}}}{{{date}}}||&#59;}}</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>&#124;user2=</kbd> ([[Template:Cite instagram#Error detection|help]]){{#ifeq: {{{postid|}}}{{{date|}}} | {{{postid}}}{{{date}}}||&#59;}}</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>&#124;postid=</kbd> ([[Template:Cite instagram#Error detection|help]]){{#if:{{{date|}}}||&#59;}}</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>&#124;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 .. '&nbsp;' .. 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>[&nbsp;<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 .. '&nbsp;' 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) .. '&#32;' .. 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;">&nbsp;' .. 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 .. '&nbsp;' .. yc('Booked immediately before/during/after penalty shoot-out (cards reset)') .. '<span style="vertical-align: middle;">&nbsp;' .. 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) .. '&nbsp;' .. timed(rc('Sent off (straight red)'), a3) elseif mode == '1+1' then body = timed(yc('Booked'), a2) .. '&nbsp;' .. timed(yc('Booked immediately before/during/after penalty shoot-out (cards reset)'), a3, 'pso') .. '&nbsp;' .. timed(rc('Sent off (straight red) immediately before/during/after penalty shoot-out'), a4, 'pso') elseif mode == '2' then body = timed(yc('Booked'), a2) .. '&nbsp;' .. timed(yrc('Sent off (second booking)'), a3) elseif mode == '1+2' then body = timed(yc('Booked'), a2) .. '&nbsp;' .. timed(yc('Booked immediately before/during/after penalty shoot-out (cards reset)'), a3, 'pso') .. '&nbsp;' .. 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') .. '&nbsp;' .. timed(yc('Booked again'), a3, 'plain') .. '&nbsp;' .. 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 .. '&nbsp;<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 .. '&nbsp;<span style="vertical-align: middle;">' .. fmtMin(m) .. '</span>' end if notBlank(args.con) or notBlank(args.concussion) then out = out .. '&nbsp;(' .. 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}}}}}}|;|&#059;|{{{separator|{{{seperator|,}}}}}}}} |PS = {{#if:{{{quote|}}}||{{{postscript|}}}|.}} |AuthorSep = {{#ifeq:{{{author-separator|}}}|;|&#059;|{{{author-separator|&#059;}}}}}&#32; |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|}}} |&#32;{{{Description}}} }} {{{PublicationNumber}}} }}{{#if:{{{Surname1|}}}|{{{Sep|,}}}&#32;{{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|,}}}&#32;"{{{Title}}}" }}{{ #if: {{{PublicationDate|}}} |{{{Sep|,}}}&#32;published {{#invoke:auto date formatter|pub_date_format|{{{PublicationDate}}}}} }}{{ #if: {{{IssueDate|}}} |{{{Sep|,}}}&#32;issued {{#invoke:auto date formatter|pub_date_format|{{{IssueDate}}}}} }}{{ #if: {{{Assignee1|}}} |{{{Sep|,}}}&#32; assigned to {{{Assignee1}}} }}{{ #if: {{{Assignee2|}}} | &#32;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;">&nbsp;</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 ('[%[%]]', {['[']='&#91;', [']']='&#93;'}); -- 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}}}}}}}}},&nbsp;{{#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}}}}} |&nbsp;–&nbsp;{{trim|{{{2}}}}} }}<!-- -->{{#if:{{{mid-date|}}}{{{middate|}}}{{{mid_date|}}} |,&nbsp;{{#if:{{{wrap|}}}|{{wbr}}}}{{{mid-date|{{{middate|{{{mid_date}}}}}}}}}}}<!-- -->{{#if:{{{3|}}}{{{4|}}} |,&nbsp;{{#if:{{{wrap|}}}|{{wbr}}}}{{#if:{{{3|}}}|{{trim|{{{3}}}}}|?}}<!-- -->{{#ifeq:{{#invoke:String |find |source={{trim|{{{3|}}}}}{{trim|{{{4|}}}}} |target=%s |plain=false }} | 0 |–{{trim|{{{4}}}}} |&nbsp;–&nbsp;{{trim|{{{4}}}}} }} }} |{{#if:{{{1|}}}|–&nbsp;}} }}<!-- -->{{#if:{{{single|}}}{{{post-date|}}}{{{postdate|}}}{{{post_date|}}} |{{#if:{{{1|}}}{{{2|}}}|,&nbsp;}}{{#if:{{{wrap|}}}|{{wbr}}}}{{{single|{{{post-date|{{{postdate|{{{post_date}}}}}}}}}}}} }}<!-- -->{{#if:{{{era|}}}|&nbsp;{{{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