Wikimedia thwikimedia https://th.wikimedia.org/wiki/%E0%B8%AB%E0%B8%99%E0%B9%89%E0%B8%B2%E0%B8%AB%E0%B8%A5%E0%B8%B1%E0%B8%81 MediaWiki 1.46.0-wmf.7 first-letter สื่อ พิเศษ พูดคุย ผู้ใช้ คุยกับผู้ใช้ วิกิมีเดียประเทศไทย พูดคุยเรื่องวิกิมีเดียประเทศไทย ไฟล์ คุยเรื่องไฟล์ มีเดียวิกิ คุยเรื่องมีเดียวิกิ แม่แบบ คุยเรื่องแม่แบบ วิธีใช้ คุยเรื่องวิธีใช้ หมวดหมู่ คุยเรื่องหมวดหมู่ TimedText TimedText talk มอดูล คุยเรื่องมอดูล หน้าหลัก 0 1 187 139 2025-11-13T11:20:36Z Wutkh 9 187 wikitext text/x-wiki <div class="plainlinks" id="megaheader" style="padding-bottom: 10px;"> [[File:Wikimedia Thailand Horizontal Logo.svg|200px|center]] </div> <div class="plainlinks" id="megaheader"> [[File:Wiki Loves Monuments 2023 promo.jpg|1000px|center]] </div> {{Header|active=1}} {{center|เนื่องจากปัจจุบันอยู่ระหว่างการโอนถ่ายข้อมูลจากเมทาวิกิ}} {{center|ขอให้ผู้เยี่ยมชมติดตามข้อมูลฉบับเต็มได้บน[[meta:Wikimedia Thailand|หน้าเมทาวิกิ]]}} {{โครงการพี่น้อง}} {|width="100%" border="0" cellspacing="2" cellpadding="2" style="align=center; MARGIN: 10px auto 0.5em;clear:both;border:1px solid silver; background:whitesmoke; color:#000000; font-size:75%; text-align: center;" |- | '''โปรดทราบ'''<br/>แม้ว่าวิกิมีเดียประเทศไทยจะได้รับเงินสนับสนุนจากมูลนิธิวิกิมีเดีย แต่วิกิมีเดียประเทศไทยเป็นองค์กรเอกเทศ มิได้เป็นสาขาย่อยในเชิงโครงสร้างการบริหารของมูลนิธิวิกิมีเดีย<br/>วิกิมีเดียประเทศไทยไม่อาจรับผิดชอบต่อเนื้อหาใด ๆ บนวิกิพีเดียและโครงการพี่น้องทุกโครงการบนกลุ่มขับเคลื่อนวิกิมีเดีย<br/>โปรดศึกษารายละเอียดเพิ่มเติมใน[[วิกิมีเดียประเทศไทย:ข้อปฏิเสธความรับผิดชอบทั่วไป|หน้านี้]] ขอขอบคุณในความเข้าใจ |} lxtwmfbhfymvn49vtbz1vhd2p7197gd แม่แบบ:Center 10 3 6 2025-09-27T15:21:42Z Sarawut.Kha 3 สร้างหน้าด้วย "<includeonly><div class="center" style="width:auto; margin-left:auto; margin-right:auto;{{#if: {{{style|}}} | {{{style}}};}}">{{{1|[[หมวดหมู่:Pages using center with no arguments]]}}}</div></includeonly>" 6 wikitext text/x-wiki <includeonly><div class="center" style="width:auto; margin-left:auto; margin-right:auto;{{#if: {{{style|}}} | {{{style}}};}}">{{{1|[[หมวดหมู่:Pages using center with no arguments]]}}}</div></includeonly> 9m7wkxngft5w7spz4jwegk657xtfb4i แม่แบบ:โครงการพี่น้อง 10 4 9 7 2025-09-27T15:36:44Z Sarawut.Kha 3 9 wikitext text/x-wiki <templatestyles src="โครงการพี่น้อง/styles.css"/> <div class="plainlinks nomobile" style="margin-top:30px; padding-top:15px; border-top:3px double #CCC; color:#222;"> <div style="background:white; width:45px; height:45px; margin:0 auto; margin-top:-40px;">[[File:Wikimedia-logo black.svg|45px|center|link=]]</div> <div style="color:#222; font-size:110%; text-align:center; margin-bottom:2.5em; padding-top:10px;">วิกิมีเดียประเทศไทยเป็นองค์กรสาขาที่ได้รับการยอมรับจาก[https://wikimediafoundation.org/ มูลนิธิวิกิมีเดีย]องค์กรไม่แสวงผลกำไร ผู้ดำเนินการอีกหลาย[https://wikimediafoundation.org/what-we-do/wikimedia-projects/ โครงการ] ได้แก่</div> {|class="layout sisterproject" width="100%" align="center" cellpadding="4" style="text-align:left; background-color: transparent;" | align = "center" | <imagemap>ไฟล์:Wikipedia-logo.svg|35px|วิกิพีเดีย default [[w:หน้าหลัก|วิกิพีเดีย]] desc none</imagemap> | width = "33%" | '''<span class="plainlinks">[http://th.wikipedia.org/wiki/หน้าหลัก วิกิพีเดีย]</span>'''<br />สารานุกรมเสรี | align = "center" | <imagemap>ไฟล์:Commons-logo.svg|35px|คอมมอนส์ default [[commons:หน้าหลัก|คอมมอนส์]] desc none</imagemap> | width = "33%" | '''<span class="plainlinks">[http://commons.wikimedia.org/wiki/หน้าหลัก คอมมอนส์]</span>'''<br />คลังสื่อเสรี | align = "center" | <imagemap>ไฟล์:MediaWiki-2020-icon.svg|40px|มีเดียวิกิ default [[mw:|มีเดียวิกิ]] desc none</imagemap> | width = "33%" | '''<span class="plainlinks">[http://www.mediawiki.org/wiki/MediaWiki มีเดียวิกิ]</span>'''<br />การพัฒนาซอฟต์แวร์วิกิ |- | align = "center" | <imagemap>ไฟล์:Wikimedia Community Logo.svg|35px|เมทาวิกิ default [[m:หน้าหลัก|เมต้าวิกิ]] desc none</imagemap> | '''<span class="plainlinks">[http://meta.wikimedia.org/wiki/หน้าหลัก เมทาวิกิ]</span>'''<br />ศูนย์ประสานงานโครงการวิกิมีเดีย | align = "center" | <imagemap>ไฟล์:Wikibooks-logo.svg|35px|วิกิตำรา default [[b:|วิกิตำรา]] desc none</imagemap> | width = "33%"| '''<span class="plainlinks">[http://th.wikibooks.org/ วิกิตำรา]</span>'''<br />ตำราและคู่มือเสรี | align = "center" | <imagemap>ไฟล์:Wikidata-logo.svg|47px|วิกิสนเทศ default [[d:|วิกิสนเทศ]] desc none</imagemap> | width = "33%"| '''<span class="plainlinks">[http://www.wikidata.org/wiki/Wikidata:หน้าหลัก วิกิสนเทศ]</span>'''<br />ฐานความรู้เสรี |- | align = "center" | <imagemap>ไฟล์:Wikiquote-logo.svg|35px|วิกิคำคม default [[q:|วิกิคำคม]] desc none</imagemap> | width = "33%" | '''<span class="plainlinks">[http://th.wikiquote.org/ วิกิคำคม]</span>'''<br />แหล่งรวบรวมคำพูดเสรี | align = "center" | <imagemap>ไฟล์:Wikisource-logo.svg|40px|วิกิซอร์ซ default [[s:|วิกิซอร์ซ]] desc none</imagemap> | width = "33%"| '''<span class="plainlinks">[http://th.wikisource.org/ วิกิซอร์ซ]</span>'''<br />เอกสารต้นฉบับเสรี | align = "center" | <imagemap>ไฟล์:Wikispecies-logo.svg|47px|วิกิสปีชีส์ default [[wikispecies:หน้าหลัก|วิกิสปีชีส์]] desc none</imagemap> | '''<span class="plainlinks">[http://species.wikimedia.org/wiki/หน้าหลัก วิกิสปีชีส์]</span>'''<br />สารบบอนุกรมวิธานเสรี |- | align = "center" | <imagemap>ไฟล์:Wiktionary-logo-v2.svg|47px|วิกิพจนานุกรม default [[wikt:|วิกิพจนานุกรม]] desc none</imagemap> | width = "33%" | '''<span class="plainlinks">[http://th.wiktionary.org/ วิกิพจนานุกรม]</span>'''<br />พจนานุกรมและอรรถาภิธานเสรี | align = "center" | <imagemap>ไฟล์:Wikivoyage-Logo-v3-icon.svg|35px|วิกิท่องเที่ยว default [[:voy:|วิกิท่องเที่ยว]] desc none</imagemap> | width = "33%" | '''<span class="plainlinks">[http://incubator.wikimedia.org/wiki/Wy/th/หน้าหลัก วิกิท่องเที่ยว]</span>'''<br />คู่มือท่องเที่ยวเสรี |} 7kz81e7c31h53kgxlwtaxfn8kf4i236 แม่แบบ:โครงการพี่น้อง/styles.css 10 5 8 2025-09-27T15:26:30Z Sarawut.Kha 3 สร้างหน้าด้วย "@media screen and ( max-width: 720px ) { .sisterproject tr { display: block } .sisterproject td:nth-child(odd) { display: inline-block; width: 30%; min-width: 50px; } .sisterproject td:nth-child(even) { display: inline-block; width: 60%; } }" 8 sanitized-css text/css @media screen and ( max-width: 720px ) { .sisterproject tr { display: block } .sisterproject td:nth-child(odd) { display: inline-block; width: 30%; min-width: 50px; } .sisterproject td:nth-child(even) { display: inline-block; width: 60%; } } dhlfny7br04rwew9r09c8cs1hgbg90d วิกิมีเดียประเทศไทย:เกี่ยวกับ 4 6 64 32 2025-10-17T08:56:34Z Wutkh 9 64 wikitext text/x-wiki {{Header|active=2}} <div class="plainlinks" id="megaheader"> [[File:Wiki Loves Monuments 2023 promo.jpg|1000px|center]] {{center|ภาพถ่ายจากกิจกรรม Wiki Loves Monuments ในประเทศไทย}}<br/> </div> [[ไฟล์:Wikimedia Thailand-Logo-BW.svg|200px|frameless|left]] '''วิกิมีเดียประเทศไทย''' เป็นสาขาของวิกิมีเดียในประเทศไทยที่มูลนิธิวิกิมีเดียให้การรับรอง เป็นหน่วยงานที่จัดกิจกรรมเชิงรุกสู่ภายนอกที่หลากหลายเพื่อส่งเสริมการสร้างและการเข้าถึงความรู้เสรีโดยความร่วมมือของพันธมิตรต่าง ๆ ทั้งในประเทศและนอกประเทศ ซึ่งรวมไปถึงมูลนิธิวิกิมีเดียด้วย โดยได้ก่อตั้งขึ้นเมื่อ พ.ศ. 2551 ในฐานะของกลุ่มผู้ใช้ และได้รับการแต่งตั้งเป็นสาขาวิกิมีเดียใน พ.ศ. 2562 เป้าหมายของเราคือสนับสนุนการสร้าง การพัฒนา และการบำรุงรักษาโครงการวิกิมีเดียภาคภาษาไทย มีบทบาทที่ช่วยเหลือกิจกรรมดังกล่าว ตลอดจนส่งเสริมความรู้ของสาธารณะ d00cvpbug1r17va1oei799oy3h4usfv แม่แบบ:Mainpage/styles.css 10 8 22 18 2025-10-11T15:39:31Z Wutkh 9 22 sanitized-css text/css .mp-outer { width: 100%; min-height: calc(100vh - 8em); background-color: var(--background-color-base, #fff); color: inherit; position: relative; } .mp { max-width: 76em; min-height: 19em; margin: 0 auto 5em; position: relative; width: 100%; } .mp, .mp * { box-sizing: border-box; } /* Hero */ .mp-hero { background-color: #e0e0d8; border-radius: 0.3rem; overflow: hidden; } .mp-hero-image { overflow: hidden; position: relative; display: flex; flex-direction: column-reverse; } @media screen and (min-width: 740px) { .mp-hero-image { align-items: flex-end; flex-direction: row; background-color: #333; } .mp-hero-image.mp-hero-image { height: 56vw; max-height: 36rem; } .mp-hero-image>span>.mw-file-description { position: absolute; top: 0; left: 0; right: 0; bottom: 0; } .mp-hero-image>span>.mw-file-description>img { height: 100% !important; max-height: 100% !important; } .mp-hero-image .mp-hero-label { position: relative; background-color: rgba(255, 255, 255, 0.88); padding: 1.8em; margin: 8rem auto 2rem 0; max-width: 57rem; display: flex; align-items: center; border-radius: 0 0.3rem 0.3rem 0; margin: 8rem auto 2rem 0; background-color: rgba(255, 255, 255, 0.88); padding-top: 1.8em; } } .mp-hero-image>span>.mw-file-description>img { height: auto; max-height: 24rem; width: 100% !important; display: block; object-fit: cover; } .mp-hero-label { position: relative; max-width: 57rem; background-color: var(--background-color-base, #fff); color: inherit; padding: 1.2rem 1.8rem; padding-top: 0; } .mp-hero-label-logo>a { display: block; width: calc(4rem + 5vw); max-width: 10rem; margin-right: 1.8rem; } .mp-hero-label-logo>a>img { max-width: 100%; height: auto; } .mp-hero-pretitle { font-size: 1.125rem; line-height: 1.3em; text-transform: uppercase; color: black; } .mp-hero-title { font-size: calc(1rem + .03 * (100vw - 176px)); font-family: "Linux Libertine", Georgia, serif; color: #900000; line-height: 1.04em; } body.skin-minerva .mp-hero-title { font-size: calc(1rem + 3vw); } /* Grid */ .mp-grid { display: flex; margin-right: -2rem; margin-bottom: -2rem; flex-wrap: wrap; } .mp-grid>* { flex: 0 0; flex-basis: calc(100% - 2rem); margin-right: 2rem; margin-bottom: 2rem; } .mp-box-marginal>.mp-grid { min-height: calc(100% + 2rem); } .mp-grid-w1 { flex-basis: calc(1 / 12 * (100% - 24rem) + 0rem); } .mp-grid-w2 { flex-basis: calc(2 / 12 * (100% - 24rem) + 2rem); } .mp-grid-w3 { flex-basis: calc(3 / 12 * (100% - 24rem) + 4rem); } .mp-grid-w4 { flex-basis: calc(4 / 12 * (100% - 24rem) + 6rem); } .mp-grid-w5 { flex-basis: calc(5 / 12 * (100% - 24rem) + 8rem); } .mp-grid-w6 { flex-basis: calc(6 / 12 * (100% - 24rem) + 10rem); } .mp-grid-w7 { flex-basis: calc(7 / 12 * (100% - 24rem) + 12rem); } .mp-grid-w8 { flex-basis: calc(8 / 12 * (100% - 24rem) + 14rem); } .mp-grid-w9 { flex-basis: calc(9 / 12 * (100% - 24rem) + 16rem); } .mp-grid-w10 { flex-basis: calc(10 / 12 * (100% - 24rem) + 18rem); } .mp-grid-w11 { flex-basis: calc(11 / 12 * (100% - 24rem) + 20rem); } .mp-grid-w12 { flex-basis: calc(12 / 12 * (100% - 24rem) + 22rem); } @media screen and (min-width: 450px) { .mp-grid-s-w1 { flex-basis: calc(1 / 12 * (100% - 24rem) + 0rem); } .mp-grid-s-w2 { flex-basis: calc(2 / 12 * (100% - 24rem) + 2rem); } .mp-grid-s-w3 { flex-basis: calc(3 / 12 * (100% - 24rem) + 4rem); } .mp-grid-s-w4 { flex-basis: calc(4 / 12 * (100% - 24rem) + 6rem); } .mp-grid-s-w5 { flex-basis: calc(5 / 12 * (100% - 24rem) + 8rem); } .mp-grid-s-w6 { flex-basis: calc(6 / 12 * (100% - 24rem) + 10rem); } .mp-grid-s-w7 { flex-basis: calc(7 / 12 * (100% - 24rem) + 12rem); } .mp-grid-s-w8 { flex-basis: calc(8 / 12 * (100% - 24rem) + 14rem); } .mp-grid-s-w9 { flex-basis: calc(9 / 12 * (100% - 24rem) + 16rem); } .mp-grid-s-w10 { flex-basis: calc(10 / 12 * (100% - 24rem) + 18rem); } .mp-grid-s-w11 { flex-basis: calc(11 / 12 * (100% - 24rem) + 20rem); } .mp-grid-s-w12 { flex-basis: calc(12 / 12 * (100% - 24rem) + 22rem); } .mp-hidden-up-s { display: none !important; } } @media screen and (max-width: 449px) { .mp-hidden-down-s { display: none !important; } } @media screen and (min-width: 640px) { .mp-grid-m-w1 { flex-basis: calc(1 / 12 * (100% - 24rem) + 0rem); } .mp-grid-m-w2 { flex-basis: calc(2 / 12 * (100% - 24rem) + 2rem); } .mp-grid-m-w3 { flex-basis: calc(3 / 12 * (100% - 24rem) + 4rem); } .mp-grid-m-w4 { flex-basis: calc(4 / 12 * (100% - 24rem) + 6rem); } .mp-grid-m-w5 { flex-basis: calc(5 / 12 * (100% - 24rem) + 8rem); } .mp-grid-m-w6 { flex-basis: calc(6 / 12 * (100% - 24rem) + 10rem); } .mp-grid-m-w7 { flex-basis: calc(7 / 12 * (100% - 24rem) + 12rem); } .mp-grid-m-w8 { flex-basis: calc(8 / 12 * (100% - 24rem) + 14rem); } .mp-grid-m-w9 { flex-basis: calc(9 / 12 * (100% - 24rem) + 16rem); } .mp-grid-m-w10 { flex-basis: calc(10 / 12 * (100% - 24rem) + 18rem); } .mp-grid-m-w11 { flex-basis: calc(11 / 12 * (100% - 24rem) + 20rem); } .mp-grid-m-w12 { flex-basis: calc(12 / 12 * (100% - 24rem) + 22rem); } .mp-hidden-up-m { display: none !important; } } @media screen and (max-width: 639px) { .mp-hidden-down-m { display: none !important; } } @media screen and (min-width: 940px) { .mp-grid-l-w1 { flex-basis: calc(1 / 12 * (100% - 24rem) + 0rem); } .mp-grid-l-w2 { flex-basis: calc(2 / 12 * (100% - 24rem) + 2rem); } .mp-grid-l-w3 { flex-basis: calc(3 / 12 * (100% - 24rem) + 4rem); } .mp-grid-l-w4 { flex-basis: calc(4 / 12 * (100% - 24rem) + 6rem); } .mp-grid-l-w5 { flex-basis: calc(5 / 12 * (100% - 24rem) + 8rem); } .mp-grid-l-w6 { flex-basis: calc(6 / 12 * (100% - 24rem) + 10rem); } .mp-grid-l-w7 { flex-basis: calc(7 / 12 * (100% - 24rem) + 12rem); } .mp-grid-l-w8 { flex-basis: calc(8 / 12 * (100% - 24rem) + 14rem); } .mp-grid-l-w9 { flex-basis: calc(9 / 12 * (100% - 24rem) + 16rem); } .mp-grid-l-w10 { flex-basis: calc(10 / 12 * (100% - 24rem) + 18rem); } .mp-grid-l-w11 { flex-basis: calc(11 / 12 * (100% - 24rem) + 20rem); } .mp-grid-l-w12 { flex-basis: calc(12 / 12 * (100% - 24rem) + 22rem); } .mp-hidden-up-l { display: none !important; } } @media screen and (max-width: 939px) { .mp-hidden-down-l { display: none !important; } } @media screen and (min-width: 1200px) { .mp-grid-xl-w1 { flex-basis: calc(1 / 12 * (100% - 24rem) + 0rem); } .mp-grid-xl-w2 { flex-basis: calc(2 / 12 * (100% - 24rem) + 2rem); } .mp-grid-xl-w3 { flex-basis: calc(3 / 12 * (100% - 24rem) + 4rem); } .mp-grid-xl-w4 { flex-basis: calc(4 / 12 * (100% - 24rem) + 6rem); } .mp-grid-xl-w5 { flex-basis: calc(5 / 12 * (100% - 24rem) + 8rem); } .mp-grid-xl-w6 { flex-basis: calc(6 / 12 * (100% - 24rem) + 10rem); } .mp-grid-xl-w7 { flex-basis: calc(7 / 12 * (100% - 24rem) + 12rem); } .mp-grid-xl-w8 { flex-basis: calc(8 / 12 * (100% - 24rem) + 14rem); } .mp-grid-xl-w9 { flex-basis: calc(9 / 12 * (100% - 24rem) + 16rem); } .mp-grid-xl-w10 { flex-basis: calc(10 / 12 * (100% - 24rem) + 18rem); } .mp-grid-xl-w11 { flex-basis: calc(11 / 12 * (100% - 24rem) + 20rem); } .mp-grid-xl-w12 { flex-basis: calc(12 / 12 * (100% - 24rem) + 22rem); } .mp-hidden-up-xl { display: none !important; } } @media screen and (max-width: 1199px) { .mp-hidden-down-xl { display: none !important; } } .mp-hidden { display: none !important; } eld3ftm4frju8snigzgd5spi5k7ywyr แม่แบบ:Header 10 9 166 112 2025-10-24T13:45:52Z Wutkh 9 166 wikitext text/x-wiki <div style="margin-left:auto; margin-right:auto; text-align:center; font-size:clamp(10px, 20px); font-family:'Sarabun', sans-serif; text-transform:uppercase; margin-top:{{{margin-top|0}}}"> {{Portal navigation | portalname = วิกิมีเดียประเทศไทย | themecolor = #333333 | active = {{{active|}}} | icon1 = [[File:Home font awesome.svg|x25px|link=]] | tab1 = [[หน้าหลัก]] | icon2 = [[File:User font awesome.svg|x25px|link=]] | tab2 = [[วิกิมีเดียประเทศไทย:เกี่ยวกับ|เกี่ยวกับเรา]] | subtab2-1 = [[วิกิมีเดียประเทศไทย:เส้นเวลา|เส้นเวลา]] | subtab2-2 = [[วิกิมีเดียประเทศไทย:โครงสร้าง|โครงสร้าง]] | subtab2-3 = [[วิกิมีเดียประเทศไทย:ข้อปฏิเสธความรับผิดชอบทั่วไป|ข้อปฏิเสธความรับผิดชอบ]] | icon3 = [[File:Bullhorn font awesome.svg|x25px|link=]] | tab3 = [[วิกิมีเดียประเทศไทย:กิจกรรม|กิจกรรม]] | subtab3-1 = [[25 ปีวิกิพีเดีย]] }} </div> 39sfeedu23fenrx9soexxgrfnw1aqyo มอดูล:Portal navigation 828 10 25 2025-10-14T13:46:23Z Wutkh 9 สร้างหน้าด้วย "local p = {} lang = mw.getCurrentFrame():preprocess('{{int:lang}}') pagelang = mw.getCurrentFrame():preprocess('{{PAGELANGUAGE}}') is_rtl = require('Module:Is rtl') function get_directionality(dir, ff) if is_rtl[lang] == true and ff == true then if dir == 'left' then return 'right' end return 'left' end return dir end function get_portalicon(portalicon, ff) if portalicon == nil then return '' end ret = '<span style="padding:0.3em..." 25 Scribunto text/plain local p = {} lang = mw.getCurrentFrame():preprocess('{{int:lang}}') pagelang = mw.getCurrentFrame():preprocess('{{PAGELANGUAGE}}') is_rtl = require('Module:Is rtl') function get_directionality(dir, ff) if is_rtl[lang] == true and ff == true then if dir == 'left' then return 'right' end return 'left' end return dir end function get_portalicon(portalicon, ff) if portalicon == nil then return '' end ret = '<span style="padding:0.3em; display:inline-block;' -- UNCLOSED TAG if is_rtl[pagelang] == true or (ff == true and is_rtl[lang]) == true then ret = ret .. ' margin-left:0.5em;' else ret = ret .. ' margin-right:0.5em;' end ret = ret .. '">' .. portalicon .. '</span>' return ret end function converttolinearrgb(c) c = tonumber(c, 16) c = c / 255.0 if c <= 0.03928 then c = c/12.92 else c = ((c+0.055)/1.055) ^ 2.4 end return c end function p.render(frame) -- Default values portalname = 'Portal' tabs = {} subtabs = {} wrc = 0 -- Default values (customizations) themecolor = '#54595d' headerstyle = '' tabsicons = {} ff = nil wrcadditional = nil -- Populating variables for key, value in pairs(frame:getParent().args) do if key == 'portalname' then portalname = value elseif key == 'portalicon' then portalicon = value elseif key == 'active' then active = tonumber(value) elseif key == 'wrc' then wrc = value elseif key == 'themecolor' then themecolor = value elseif key == 'headerstyle' then headerstyle = value elseif key == 'forceflip' then ff = value elseif key == 'hidenav' then hidenav = value elseif key == 'hidesubnav' then hidesubnav = value elseif key == 'wrcadditional' then wrcadditional = value elseif string.find(key, 'tab') ~= nil and string.find(key, 'subtab') == nil then -- matches tab1, tab2, ... id = string.gsub(key, 'tab', '') id = tonumber(id) tabs[id] = value elseif string.find(key, 'icon') ~= nil then -- matches icon1, icon2, etc. id = string.gsub(key, 'icon', '') id = tonumber(id) tabsicons[id] = value elseif string.find(key, 'subtab') ~= nil then -- matches subtab1-1, etc. id = string.gsub(key, 'subtab', '') -- Subtab params take the form [prime tab]-[sub tab] id = mw.text.split(id, '-') primetab = tonumber(id[1]) subtab = tonumber(id[2]) if subtabs[primetab] == nil then subtabs[primetab] = {} end subtabs[primetab][subtab] = value end end if ff == 'yes' or ff == 'true' or ff == '1' then ff = true end if hidenav == 'yes' or hidenav == 'true' or hidenav == '1' then hidenav = true end if hidesubnav == 'yes' or hidesubnav == 'true' or hidesubnav == '1' then hidesubnav = true end -- Constructing header -- Relevant variables: portalname, wrc, themecolor, headerstyle -- The text color in the header is automatically chosen based on the best contrast -- https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color headertextcolor = '#fff' rgb = string.gsub(themecolor, '#', '') rgb = mw.text.split(rgb, '') if #rgb == 6 then r = rgb[1] .. rgb[2] g = rgb[3] .. rgb[4] b = rgb[5] .. rgb[6] elseif #rgb == 3 then r = rgb[1] .. rgb[1] g = rgb[2] .. rgb[2] b = rgb[3] .. rgb[3] end r = converttolinearrgb(r) g = converttolinearrgb(g) b = converttolinearrgb(b) luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b if luminance > 0.179 then headertextcolor = '#000' end -- Applying customizations to headerstyle if headerstyle ~= '' then headerstyle = ' ' .. headerstyle end headerstyle = 'font-size:1.6875em; border-radius:2px; font-weight:bold;' .. 'background:' .. themecolor .. '; color:' .. headertextcolor .. '; padding:0.25em;'.. headerstyle if ff == true then headerstyle = headerstyle .. 'text-align:' .. get_directionality('left', ff) .. ';' end header = '<div style="' .. headerstyle .. '">' if ff ~= true or (ff == true and is_rtl[lang] == nil) then header = header .. get_portalicon(portalicon, ff) .. portalname .. '</div>' else header = header .. portalname .. get_portalicon(portalicon, ff) .. '</div>' end if wrc == '1' or wrc == 1 or wrc == 'true' or wrc == true or wrc == 'yes' then badgeargs = {} if ff == true then badgeargs['forceflip'] = ff end if wrcadditional ~= nil then badgeargs['additional'] = wrcadditional end header = frame:expandTemplate{ title = 'Wikimedia Resource Center badge', args = badgeargs } .. '\n\n' .. header end -- Constructing the rest -- Relevant variables: themecolor tabs tabsicons active subtabs body = '' if hidenav ~= true then body = body .. '<div style="font-size:1.125em; margin-bottom:1.125em;' -- UNCLOSED TAG if ff == true then body = body .. ' text-align:' .. get_directionality('left', ff) .. ';' end body = body .. '">' for index, pagelink in ipairs(tabs) do -- Open TOC entry container containerstyle = 'display:inline-block; position:relative; vertical-align:top;' if ff == true then containerstyle = containerstyle .. ' float:' .. get_directionality('left', ff) .. ';' end body = body .. '<div style="' .. containerstyle .. '">' -- Create the tab itself entrystyle = 'display:inline-block; margin:1em; padding-bottom:0.5em; font-weight:bold;' if index == active then if subtabs[index] == nil or hidesubnav == true then entrystyle = entrystyle .. ' border-bottom:0.3em solid ' .. themecolor .. ';' else entrystyle = entrystyle .. ' margin-bottom:0;' end else entrystyle = entrystyle .. ' border-bottom:0.3em solid #c8ccd1;' end icon = '' if tabsicons[index] ~= nil then if ff == true then icon = '<span style="margin-' .. get_directionality('right', ff) .. ':0.75em;">' else icon = '<span style="margin-right:0.75em;">' end icon = icon .. tabsicons[index] .. '</span>' end body = body .. '<span style="' .. entrystyle .. '">' .. icon .. pagelink .. '</span>' -- If the tab is active, show the subnav if there is any if index == active and subtabs[index] ~= nil and hidesubnav ~= true then body = body .. '<div style="font-size:95%; margin-left:1em; margin-right:1em; padding-top:1.125em; padding-bottom:1.125em; border-top:0.35em solid ' .. themecolor .. '; border-bottom:0.35em solid' .. themecolor .. ';">' for subindex, subpagelink in ipairs(subtabs[index]) do body = body .. subpagelink if subindex ~= #subtabs[index] then body = body .. '<br />' end end body = body .. '</div>' end -- Close TOC entry container body = body .. '</div>' end body = body .. '</div>' end return '<div>' .. header .. body .. '</div><div style="clear:both;"></div>' end return p 87x25b23jo6d82u74e2ql2oiq1sd46w มอดูล:Portal navigation/doc 828 11 26 2025-10-14T13:46:59Z Wutkh 9 สร้างหน้าด้วย "<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == This module has one method, '''render''': <code><nowiki>{{#invoke:Portal navigation|render| ... }}</nowiki></code>. For more information, see [[Template:Portal navigation/doc]]. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeo..." 26 wikitext text/x-wiki <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == This module has one method, '''render''': <code><nowiki>{{#invoke:Portal navigation|render| ... }}</nowiki></code>. For more information, see [[Template:Portal navigation/doc]]. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly> mn29kbptnr64ec3aqlpnq5y5xyoaqps แม่แบบ:Portal navigation 10 12 27 2025-10-14T13:47:25Z Wutkh 9 สร้างหน้าด้วย "{{#invoke:Portal navigation|render}}<noinclude> {{Documentation}} </noinclude>" 27 wikitext text/x-wiki {{#invoke:Portal navigation|render}}<noinclude> {{Documentation}} </noinclude> migvhqm18sh7wqcmrdm4p62edciezd4 มอดูล:Is rtl 828 13 28 2025-10-14T13:49:07Z Wutkh 9 สร้างหน้าด้วย "return { -- If a language is RTL, include its language code here and set it to true ar = true, arc = true, arz = true, azb = true, bcc = true, ckb = true, bqi = true, dv = true, fa = true, ['fa-af'] = true, glk = true, ha = true, he = true, ['kk-arab'] = true, ['kk-cn'] = true, ks = true, ['ku-arab'] = true, mzn = true, pnb = true, prd = true, ps = true, sd = true, ug = true, ur = true, ydd = true, yi = true, }" 28 Scribunto text/plain return { -- If a language is RTL, include its language code here and set it to true ar = true, arc = true, arz = true, azb = true, bcc = true, ckb = true, bqi = true, dv = true, fa = true, ['fa-af'] = true, glk = true, ha = true, he = true, ['kk-arab'] = true, ['kk-cn'] = true, ks = true, ['ku-arab'] = true, mzn = true, pnb = true, prd = true, ps = true, sd = true, ug = true, ur = true, ydd = true, yi = true, } k6343d5i7j78jfub9nn7g6fxyrrdsq2 วิกิมีเดียประเทศไทย:เส้นเวลา 4 14 110 61 2025-10-17T15:54:20Z Wutkh 9 /* พ.ศ. 2554 */ 110 wikitext text/x-wiki {{Header|active=2}} == ก่อน พ.ศ. 2554 == * '''[http://web.archive.org/web/*/www.wikithaiforum.com วิกิไทยฟอรั่ม]'''เป็น[[:w:en:Internet forum|กระดานข้อความออนไลน์]]สำหรับผู้ที่มีความสนใจในวิกิตั้งแต่ พ.ศ. 2551–2554 โดยมากเป็นอาสาสมัครบนวิกิพีเดียและไร้สารานุกรมภาษาไทย โดยที่มิได้มีความเชื่อมโยงกับมูลนิธิวิกิมีเดีย (WMF) หรือมีความคิดริเริ่มที่จะจัดตั้งองค์กรแต่อย่างใด โดยมากใช้เป็นพื้นที่แลกเปลี่ยนเรียนรู้ทางเทคนิคและการสนทนาเรื่องสัพเพเหระ (ซึ่งอาจนอกประเด็น) บนวิกิพีเดียภาษาไทยและโครงการพี่น้องต่าง ๆ == พ.ศ. 2554 == * ในเดือนสิงหาคม มีวิกิมีเดียชาวไทยท่านหนึ่งเข้าร่วมงาน[[:w:Wikimania 2011|วิกิเมเนีย 2011 ในเมืองไฮฟา]] โดยได้แนวคิดการจัดตั้งกลุ่มอาสาสมัครขึ้นจากการเข้าร่วมงานดังกล่าว และยังมีการระดมความคิดในการจัดกิจกรรมในที่ตั้งและออนไลน์ (ดูที่ [[w:th:วิกิพีเดีย:สภากาแฟ/อภิปราย/Wikimania11|วิกิพีเดีย:ศาลาชุมชน/อภิปราย/Wikimania11]]) เช่น ** สร้างรายการรับอีเมลของวิกิมีเดียประเทศไทย ** แต่งตั้งผู้ดูแลระบบเพื่อทดแทนผู้ที่ไม่มีความเคลื่อนไหวและปรับปรุงโครงการอื่นนอกเหนือวิกิพีเดีย ** [[:w:th:วิกิพีเดีย:การเลือกตั้งคณะอนุญาโตตุลาการ_ธันวาคม_2554|เลือกตั้งคณะอนุญาโตตุลาการชุดแรก]]บนวิกิพีเดียภาษาไทย ** มีความพยายามที่จะจัดตั้งโครงการ[[meta:Wikimedians_in_Thailand/Wikiclubs_in_schools/th|ชมรมวิกิในสถานศึกษา]] ซึ่งได้รับการสนับสนุนของที่ระลึกจาก WMF เพื่อการดังกล่าว แต่ได้เกิด[[w:th:อุทกภัยในประเทศไทย พ.ศ. 2554|มหาอุทกภัยในประเทศไทย]]ทำให้โครงการถูกเลื่อนและล้มเลิกไปในเวลาต่อมา == 2555 == * 2012-01 Designed and received approval for Wikimedia Thailand logo. [[meta:Wikimedians in Thailand/Logo|Wikimedians in Thailand/Logo]] * 2012-07 After recovering from the flood, there was a meetup in Bangkok to revitalize the movement. ([[meta:Wikimedians in Thailand/July 2012 meetup|Wikimedians in Thailand/July 2012 meetup]]) * 2012-11 [[meta:Wikimedians in Thailand/mailing list|WMTH mailing list]] has gone public and opened for new subscriptions. == 2556 == * 2013-03 standardized [[meta:Wikimedians in Thailand/Wikimedia project names in Thai|Thai names for Wikimedia projects]] * Since 2013-03, we have stated [[:wikivoyage:th:|Thai Wikivoyage on incubator]]. * 2013-03 We had a discussion with WMF's legal team on an undisclosed matter. * 2013-05 A Thai Wikimedian went to Hackathon 2013 in Amsterdam. We quickly picked up on Wiki Loves Monuments (WLM) project. ([[w:th:วิกิพีเดีย:ศาลาชุมชน/อภิปราย/Amsterdam Hackathon 2013]]) * WLM 2013 in Thailand is our first successful public activity. We won an international prize and secured limited support from two local partners as well as a mini-grant from the international team. ([[:commons:Commons:Wiki_Loves_Monuments_2013_in_Thailand]]) We contacted many organizations and individuals but it was difficult to get a sponsorship as we are not incorporated and not recognized by the WMF. * Since 2013-07, we have been working with the visual editor team (Patrick Earley) to report bugs and launch its beta version on Thai Wikipedia. * 2013-12-04 We had the first visit by an WMF employee (Carolynne Schloeder). We launched Wikipedia zero together. ** PR in Thai “ทำดีเพื่อพ่อ” ตามโครงการ ‘100,000 ชั่วโมง ร่วมกันทำดี’: [http://www.dtac.co.th/pressroom/news/DoGoodfortheKing.html] [http://www.mobileasia.net/?p=2412] * 2013-12-20 We discussed further collaboration with the mobile operator. ([[:File:WM-TH_dtac_meeting_2013-12-20.JPG]]) * 2013-12 Another batch of Wikimedia Merchandise was sent to us for our activities in Thailand.([[:File:Wikimedia_Merchandise_sent_to_WMTH_Dec_2013.jpg]]) == 2557 == * WMF recognition ** 2014-02-12 An application for "Wikimedians in Thailand" user group recognition was submitted to the [[meta:Affiliations_Committee|AffCom]]. ** 2014-04-28 "Wikimedians in Thailand User Group is recognized as a Wikimedia User Group for a one-year renewable period that becomes effective when the [[meta:Wikimedia_User_Group_Agreement|Wikimedia User Group agreement]] is signed." See [[meta:Affiliations_Committee/Resolutions/Wikimedians_in_Thailand_-_April_2014]]. ** 2014-07-11 received the final agreement back from WMF. (Effective date 14 June 2014) * We are in touch with WMF mobile programs and a mobile operator (dtac). ([[meta:Wikimedians in Thailand/The 2014 dtac Project|Full report]], [[:commons:Category:DTAC_Collaboration_With_WMTH|Commons photos]], [[:w:th:วิกิพีเดีย:ศาลาชุมชน/อภิปราย/โครงการแปลบทความวิกิพีเดียโดย_dtac|discussions on Thai Wikipedia]], and [[:w:th:วิกิพีเดีย:ศาลาชุมชน/อภิปราย/โครงการแปลบทความวิกิพีเดียโดย dtac/ตารางสรุป|A detailed list of users and articles on Thai Wikipedia]]) ** Online meeting with Indrid Flores (WMF employee) on the 15th of Jan. ** Meeting/workshop with the mobile operator on the 10th of Feb (meeting), the 10th of March (workshop) and 19th of March (workshop). Three long-term Wikipedians were physically present and few other online volunteers were helping with admin requests/tool development e.g. Visual Editor and specialized tools at WMF labs. ** The [[:w:th:ราชาธิปไตยของสหราชอาณาจักร|first article]] from this collaboration was shown on the first page of Thai Wikipedia under DYK section on 18th of March. ** The mobile operator officially launched its 2014 Wikipedia contribution program in April. *** PR in English: [http://www.telenor.com/media/articles/2014/dtac-ignites-mass-translation-efforts-for-thai-internet/ See telenor/dtac press release dated 11th of April.] *** PR in Thai: [http://www.dailynews.co.th/Content/IT/233072/%E0%B8%94%E0%B8%B5%E0%B9%81%E0%B8%97%E0%B8%84%E0%B9%80%E0%B8%9B%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B8%B1%E0%B8%A7%E0%B8%81%E0%B8%B4%E0%B8%88%E0%B8%81%E0%B8%A3%E0%B8%A3%E0%B8%A1+%E2%80%9C%E0%B9%80%E0%B8%9E%E0%B8%B4%E0%B9%88%E0%B8%A1%E0%B8%9E%E0%B8%B9%E0%B8%99%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%A3%E0%B8%B9%E0%B9%89%E0%B9%83%E0%B8%AB%E0%B9%89%E0%B8%AA%E0%B8%B1%E0%B8%87%E0%B8%84%E0%B8%A1%E0%B9%84%E0%B8%97%E0%B8%A2%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%A7%E0%B8%B4%E0%B8%81%E0%B8%B4%E0%B8%9E%E0%B8%B5%E0%B9%80%E0%B8%94%E0%B8%B5%E0%B8%A2%E2%80%9D] [http://www.mxphone.net/250414-dtac-wikipedia/] ** More workshops were held on 10th, 23rd and 30th of April. Our volunteers (three physical+some online support) were in touch with the mobile operator and helped coach the workshop. The last workshop was held at Srinakarin Road on 9th May. * 2014-08 We have a representative attending [[:w:Wikimania 2014|Wikimania 2014 in London]]. ([[meta:Grants:TPS/Taweetham/Wikimania/2014/Report|Report]]) * We have successfully organised [[:commons:Commons:Wiki_Loves_Monuments_2014_in_Thailand|Wiki Loves Monument 2014 in Thailand]]. This is the second time in Thailand. We have increased number of photo submissions and expanded our base of local partners. ([[:commons:Commons:Wiki Loves Monuments 2014 in Thailand|competition page]], [[meta:Grants:PEG/UG TH/WLM 2014|PEG proposal]], [[meta:Grants:PEG/UG TH/WLM 2014/Report|PEG report]]) * 2014-10-20 We have a visit form WMF education program manager (Anna Koval) which led to a pilot Wikipedia Education Program at Mahidol University. ([[:w:Education_Program:Mahidol_University_International_College/ICCH444_(2014-15_T1)|Wikipedia course page]], [[outreach:Education/Countries/Thailand|outreach page]]) == 2558 == * '''Wiki Loves X in Thailand''' ** 2015-01-02 [[meta:Grants:PEG/UG TH/Wiki Loves X in Thailand 2015|PEG grant application]] submitted. ** 2015-02-17 [[meta:Grants:PEG/UG TH/Wiki Loves X in Thailand 2015|PEG grant application]] approved. ** 2015-02-18 received grant agreement. ** 2015-02-26 returned grant agreement. ** 2015-03-06 dtac confirmed its sponsorship for the project. ** 2015-03-06 Siam Society confirmed its sponsorship for the project. ** 2015-03-09 [[meta:Grants:PEG/UG TH/Wiki Loves X in Thailand 2015|PEG grant application]] fund arrived. ** 2015-03-13 Meeting with BMN-MRT representatives to discuss collaboration on WLX projects ** 2015-03-14 Volunteer meeting at Mahidol University, Salaya to discuss general directions of WLX and 100K article project ** 2015-04-22 CCHT confirmed its sponsorship for the project. ** 2015-05-01 Launched [[:commons:Commons:Wiki_Loves_Earth_2015_in_Thailand|Wiki Loves Earth 2015 in Thailand]]. ** 2015-06-01 Launched [[:w:th:วิกิพีเดีย:โครงการ WLX ประกวดบทความท้องถิ่นประเทศไทย‎|Article contest (WLX)]]. ** 2015-07-01 Launched [[w:th:WP:TWA|the Thai version]] of [[:en:WP:TWA]] for article contest training. ** 2015-07-27 Pantip.com confirmed its sponsorship for the project. ** 2015 Jul-Aug Concluding the first WLE2015 in Thailand + The beginning of training program for WLX ** 2015-09-01 Launched [[:commons:Commons:Wiki_Loves_Monuments_2015_in_Thailand|Wiki Loves Monuments 2015 in Thailand]]. * '''Other programs''' ** 2015-01-26 [[:w:th:วิกิพีเดีย:โครงการวิกิแสนบทความกับวิกิพีเดียภาษาไทย|100K article project]] was [[meta:Grants:PEG/UG_TH/WLM_2014/Report|approved by WMF]] using remaining fund from WLM 2014. ** 2015-05 Launched [[:w:Education Program:Mahidol University International College/ICCH224 (T3/2014-2015)|new pilot education program at Mahidol University]]. ** 2015-09-09 Meeting at dtac to prepare for [[meta:Wikimedians in Thailand/2015 Smithsonian APA|Wikimedians in Thailand/2015 Smithsonian APA]] ** 2015-09-26 Edit-a-thon/Meet-up [[meta:Wikimedians in Thailand/2015 Smithsonian APA|Wikimedians in Thailand/2015 Smithsonian APA]] ** 2015 [[meta:Wikipedia Asian Month]] * '''Representations/Visits''' ** 2015-05 Wikimedia conference 2015 - We sent [[meta:Wikimedia_Conference_2015/Participants|a representative]] to the conference in Berlin. ** 2015-07 Wikimania 2015- We sent [[meta:Grants:TPS/Wikimania_scholars|a representative]] to the conference in Mexico City. (([[meta:Grants:TPS/Taweetham/Wikimania/2015/Report|Report]])) ** 2015-11-23 Free basics by Dtac (Wikipedia Zero)- We sent two representatives to a launch event of Free Basics program by Dtac. ;2015 Photo gallery <gallery> File:WikiAPA event in Bangkok 2015 8.JPG|Meet-up Wikimedians in Thailand/2015 Smithsonian APA 26 SEP File:WikiAPA event in Bangkok 2015 7.JPG|Meet-up Wikimedians in Thailand/2015 Smithsonian APA 26 SEP File:Free Basics by Facebook in Thailand with Dtac 2015.JPG|Launch event of Dtac's Free Basics including 23 NOV File: WLM2015TH Awards2.jpg|WLMTH2015 awards </gallery> == 2559 == * '''Wiki Loves X in Thailand''' ** 2016-04-27 [[meta:Grants:PEG/UG TH/WLX in Thailand 2016|2016 PEG grant application]] submitted. ** 2016-05-04 [[meta:Grants:PEG/UG TH/Wiki Loves X in Thailand 2015/Report|2015 PEG grant report]] submitted. ** 2016-05-12 [[meta:Grants talk:PEG/UG TH/Wiki Loves X in Thailand 2015/Report|2015 PEG grant report]] approved. ** 2016-05-18 [[meta:Grants:PEG/UG TH/WLX in Thailand 2016|2016 PEG grant application]] approved as requested. ** 2016-05-19 Pantip.com and Siam society confirmed their partnerships with us. ** 2016-05-20 WLX2016 grant agreement received. ** 2016-05-22 WLX2016 grant agreement signed and returned to WMF. ** 2016-05-27 WLX2016 fund transfer failed. ** 2016-06-01 WLE2016 in Thailand commenced. ** 2016-06-25 Second meet-up at Mahidol University ** 2016-06-29 WLX2016 received grant money of THB60,312.40 into the usergroup account. * '''Other programs''' ** 2016-01 New Year Thank you programme - Wikipedia T-shirts for admin and long-term contributors as a gesture of appreciation for their invaluable volunteer work. ** 2016-01-15 [[meta:Wikipedia 15/Events/Bangkok]] (Meetups) *** [[meta:Grants:IdeaLab/Wikimedians in Thailand 2016 Initiative]] ** 2016-01-30 Thai Wikipedia has reached 100,000 articles. The 100,000th article is [[:w:th:คริสต์ทศวรรษ 1940]] ** 2016-03-09 [[:en:Wikipedia:Meetup/Mahidol_University/1|Wikipedia:Meetup/Mahidol University/1]] (Meetups) * '''Representations/Visits''' ** 2016-04 [[:mw:Wikimedia Hackathon 2016|Wikimedia Hackathon 2016]] in Jerusalem [https://phabricator.wikimedia.org/T96826] (30 March - 3 April, 2016) - We applied for travel scholarship but did not get it. [https://lists.wikimedia.org/pipermail/wikimedia-th/Week-of-Mon-20160215/000116.html] ** 2016-04 [[meta:Wikimedia Conference 2016|Wikimedia conference 2016]] in Berlin (April 20-24, 2016) - We sent [[meta:Wikimedia Conference 2016/Participants' List|one representative]] to the conference in Berlin. ** 2016-06 [https://wikimania2016.wikimedia.org/wiki/Main_Page Wikimania 2016 in Esino Lario] (June 21-28, 2016) - We applied for travel scholarship and received one scholarship. [https://lists.wikimedia.org/pipermail/wikimedia-th/Week-of-Mon-20160229/000119.html] ([[meta:Grants:TPS/B20180/Wikimania/2016/Report|Report]]) ;2016 Photo gallery <gallery> File:Wikipedia 15 Thaniland.gif|Wikipedia 15 Thailand logo File:Wikimedia 15 Thailand at MUIC.jpg|Celebrating the 15th aniversary of the English Wikipedia File:Postcards from Wikimedians in Thailand.JPG|Postcards from Wikimedians in Thailand File:Wikipedia session at Mahidol University 2.JPG|Wikipedia session at Mahidol University, Salaya File:Wikimedia_Conference_2016_–_Group_photo.jpg|Wikimedia Conference 2016, Berlin, Germany </gallery> == 2560 == * '''Wiki Loves X in Thailand''' ** 2017-04-01 [[meta:Grants:PEG/UG_TH/WLX_in_Thailand_2016/Report|PEG Grant report]] submitted. ** 2017-04-01 [[meta:Grants:Project/Rapid/WLX in Thailand 2017|Individual rapid grant application]] submitted. ** 2017-04-07 [[meta:Grants:PEG/UG_TH/WLX_in_Thailand_2016/Report|PEG Grant report]] approved. ** 2017-04-07 [[meta:Grants:Project/Rapid/WLX in Thailand 2017|Individual rapid grant application]] approved. * '''Representations/Visits''' ** 2017-03/2017-04 [[meta:Wikimedia Conference 2017]], Berlin, Germany (March 31 to April 2 2017) - We sent one representative to this conference. Another person was invited for the strategy track. This is the first year that we have two representatives in WMCON. ** 2017-05 [[:mw:Wikimedia_Hackathon_2017|Vienna Hackathon]] https://phabricator.wikimedia.org/T127050 (May 19-21) - We applied for a scholarship but did not receive it. ** 2017-08 [[meta:Wikimania 2017]] Montréal, Canada (August 9-13) - We applied for WMF scholarships but did not receive it. ** 2017-10 [[:d:Wikidata:WikidataCon 2017|WikidataCon 2017]] Berlin, Germany (October 28–29) - We applied for a scholarship but did not receive it. ** 2017-11 [[meta:Wikimedia Diversity Conference 2017]] Stockholm, Sweden (November 3–5) - We sent one representative to this conference. * '''Strategy 2017''' ([[:w:th:วิกิพีเดีย:กลยุทธ์วิกิมีเดีย ค.ศ. 2017|on Thai Wikipedia]]) == 2561 == * 2018-09-26 [[w:th:วิกิพีเดีย:สภากาแฟ/อภิปราย/ร่วมลงนามเพื่อสนับสนุนการจัดตั้ง Wikimedia Thailand|ลงนามเพื่อสนับสนุนการจัดตั้ง Wikimedia Thailand]] * '''Wiki Loves X in Thailand''' ** [[meta:Grants:Project/Rapid/WLX and education projects in Thailand 2018]] * '''Other Projects''' ** 2018-04-01 Launched [[:w:th:วิกิพีเดีย:โครงการเมนเทอร์|Mentor Project]] ** 2018-05-01 Launched [[:w:th:วิกิพีเดีย:โครงการหนึ่งบทความอย่างน้อยหนึ่งรูป|One Article, One or More Images Project]] * '''Representations/Visits''' ** 2018-04 [[meta:Wikimedia Conference 2018]], Berlin, Germany (20–22 April 2018) - We sent two representatives to this conference, see the [[meta:Wikimedians in Thailand/Reports/WMCON18|report]] (in Thai). ** 2018-05 [[meta:ESEAP Conference 2018]], Bali, Indonesia (5–6 May 2018) - We sent four representatives to this conference. ** 2018-05 [[:mw:Wikimedia_Hackathon_2018|Barcelona Hackathon]], Barcelona, Spain (May 18–20 2018) ** 2018-07 [[meta:Wikimania 2018]], Cape Town, South Africa (July 18–22 2018) - At least two community members have received full scholarship. ** 2018-11 [[meta:GLAMTLV2018/Welcome|GLAMWiki Conference 2018]], Tel Aviv, Israel (3–5 November 2018) == 2562 == * 2019-01-03 [[meta:Wikimedians in Thailand/Chapter Application|Wikimedia Thailand]]'s chapter application * 2019-03-08 [[meta:Wikimedians in Thailand/Activities/Wiki4Women2019|Wiki4Women 2019]] workshop and edit-a-thon at UNESCO Bangkok * 2019-03-29 [[meta:Wikimedia Summit 2019]] - We are sending one representative to this conference. * 2019-04-05 [[meta:Wikimedia+Education Conference 2019]] - One community member received full scholarship to attend. * 2019-06-01 [[C:commons:Wiki Loves Earth 2019 in Thailand|Wiki Loves Earth 2019 in Thailand]] * 2019-06-02 [[meta:Wikimania 2019]] - Two community members will attend Wikimania 2019. One has received full scholarship. Another is attending on behalf of Wikimania 2020 organising team * 2019-06-09 [[meta:Grants:Project/Rapid/WLX and education projects in Thailand 2018/Report|Grant report submitted]] * 2019-06-14 [[foundation:Recognition_of_Wikimedians_in_Thailand_User_Group_as_a_Wikimedia_Chapter|WMF recognised Wikimedians in Thailand as chapter]]. * 2019-06-29 [[meta:ESEAP Strategy Summit 2019]] takes place in Bangkok * 2019 Preparation for Wikimania 2020 in Bangkok == 2563 == * 2020 Preparation for Wikimania 2020 in Bangkok * 2020-03-12 Wikimania 2020 is postponed to an unspecified date in the future due to Coronavirus outbreak. * 2020-06-01 [[commons:Commons:Wiki Loves Earth 2020 in Thailand|Wiki Loves Earth 2020 in Thailand]] * 2020-09-01 [[commons:Commons:Wiki Loves Monuments 2020 in Thailand|Wiki Loves Monuments 2020 in Thailand]] * 2020-09-12 Wikipedia Education (ICCH103 2020–21 T1) * 2020-10-24 – The community's Discord channel is launched. == 2564 == * 2021-02-21 Wikipedia Education (ICCH454 2020–21 T2) * 2021-11-01 – [[w:th:วิกิพีเดีย:Wikipedia Asian Month 2021|Wikipedia Asian Month 2021]] * 2021-11-15 [[:commons:Commons:Wiki_Science_Competition_2021_in_Thailand|Wiki Science Competition]] * 2021-12-10 [[meta:Grants:Programs/Wikimedia_Community_Fund/Wikimedia_Thailand_2022|2022 Grant draft]] == 2565 == * 2022-01-18 [[meta:Grants_talk:Programs/Wikimedia_Community_Fund/Wikimedia_Thailand_2022|2022 Grant funded]] * [[meta:Grants:Simple/Applications/Wikimedia_Thailand/2020#Final_report|2020-21 Grant report's Final report]] * 2022-03 [[meta:Wikimedia Thailand/WikiGap 2022|WikiGap 2022]] * 2022-04 [[meta:Wikimedia Thailand/WikiForHumanRights|WikiForHumanRights 2022]] * 2022-10 External review of WLX eight-year activities. A [[:File:2015-2022 WLX review in Thailand.pdf|report]] is available in Thai. * 2022-11 – [[w:th:วิกิพีเดีย:Wikipedia Asian Month 2022|Wikipedia Asian Month 2022]] * 2022-12-11 – [[meta:Wikimedia Thailand/Wiki Loves Food|Wiki Loves Food]] == 2566 == * 2023-02-(25-26) – [[meta:Wikimedia Thailand/Digital Security|Digital Security workshop]] * 2023-03-11 – [[meta:Wikimedia Thailand/WikiCamp 2023|1st WikiCamp 2023]] * 2023-08-22 – [[meta:Wikimedia Thailand/BKKCamp/2|2nd WikiCamp 2023]] * 2023-08-26 – [[meta:Meetup/Bangkok/3|3rd Bangkok Meetup]] * 2023-08-30 – [[meta:Wikimedia Thailand/EasternCamp/1|EasternCamp 2023]] * 2023-09-01 – [[commons:Commons:Wiki Loves Monuments 2023 in Thailand|Wiki Loves Monuments 2023 in Thailand]] * 2023-10-08 – [[meta:Wikimedia Thailand/Bangkok Photowalk 1|Bangkok Photowalk 1]] * 2023-10-19 – [[meta:Wikimedia Thailand/Wikivoyage 2023|Wikivoyage 2023]] and [[meta:Wikimedia Thailand/GLAM–Museum 2023|GLAM–Museum 2023]] * 2023-11-01 – [[w:th:วิกิพีเดีย:Wikipedia Asian Month 2023|Wikipedia Asian Month 2023]] * 2023-11-04 – [[meta:Wikimedia Thailand/Bangkok Photowalk 2|Bangkok Photowalk 2]] * 2023-12-11 – [[meta:Wikimedia Thailand/WikiFoodtival|WikiFoodtival (Wiki Loves Food 2)]] ;2023 Photo gallery <gallery> File:WikiCamp 2023 Bangkok en.png|Poster of the First BKK WikiCamp File:WikiCamp BKKCAMP 2-2.jpg|2nd BKK WikiCamp Group Photo File:3rd Meetup Bangkok 26.08.2023 (3).jpg|Meetup at Siam Society File:Bangkok Photowalk 1, Bangkok 08.10.2023 (11).jpg|1st Photowalk at Siriraj Museum </gallery> == 2567 == * 2024-01-24 – [[meta:Wikimedia Thailand/GLAM–Gallery 2024|GLAM–Gallery 2024]] * 2024-02-10 – [[meta:Wikimedia Thailand/Bangkok Photowalk 3|Photowalk 3 วิทยาศาสตร์@ท้องฟ้าจำลอง]] * 2024-03-08 – [[meta:Wikimedia Thailand/WikiGap 2024|WikiGap 2024]] * 2024-03-16 – [[meta:Wikimedia Thailand/BKKCamp/3|Wikicamp BKKCamp 3]] * 2024-04-15 – [[meta:Wikimedia Thailand/GLAM–Archive 2024|GLAM–Archive 2024]] * 2024-06-01 – [[commons:Commons:Wiki Loves Earth 2024 in Thailand|Wiki Loves Earth 2024 in Thailand]] * 2024-06-01 – [[meta:Wikimedia Thailand/WikiDiversity 2024|WikiDiversity 2024]] * 2024-07-17 – [[meta:Wikimedia Thailand/GLAM–Library 2024|GLAM–Library 2024]] * 2024-08-01 – [[w:th:วิกิพีเดีย:รู้ไหมว่า/กิจกรรมสนับสนุน พ.ศ. 2567|Did You Know Article Promotion Campaign 2024]] * 2024-10-01 – [[commons:Commons:Wiki Loves Monuments 2024 in Thailand|Wiki Loves Monuments 2024 in Thailand]] * 2024-11-01 – [[w:th:วิกิพีเดีย:Wikipedia Asian Month 2024|Wikipedia Asian Month 2024]] * 2024-11-26 – [[meta:Wikimedia Thailand/BKKCamp/4|Wikicamp BKKCamp 4]] * 2024-12-14 – [[meta:Wikimedia Thailand/Bangkok Photowalk 4|Photowalk 4 Art@ปทุมวัน]] <gallery> File:WikiCamp BKK3 group photo 2024.jpg|3rd BKK WikiCamp Group Photo File:WikiCamp4 at Chulalongkorn University 2024 2.jpg|4th BKK WikiCamp Group Photo File:Photowalk_4_Art@ปทุมวัน_One_Bangkok_Group_Photo_(14.12.2024).jpg|Photowalk 4 Group Photo </gallery> == 2568 และต่อไป == * 2025-01-01 – [[meta:Wikimedia Thailand/GLAM–Gallery 2025|GLAM–Gallery 2025]] * 2025-01-25 – [[meta:Wikimedia Thailand/WikiCamp Chiang Mai 2025|WikiCamp Chiang Mai 2025]] * 2025-03-08 – [[meta:Wikimedia Thailand/WikiGap 2025|WikiGap 2025]] * 2025-04-01 – [[w:th:วิกิพีเดีย:บทความแนะนำ/กิจกรรมสนับสนุน พ.ศ. 2568|Recommended Article Promotional Event]] * 2025-04-01 – [[meta:Wikimedia Thailand/GLAM–Library 2025|GLAM–Library 2025]] * 2025-04-28 – [[meta:Wikimedia Thailand/BKKCamp/5|Wikicamp BKKCamp 5]] * 2025-06-01 – [[meta:Wikimedia Thailand/WikiDiversity 2025|WikiDiversity 2025]] * 2025-07-01 – [[meta:Wikimedia Thailand/GLAM–Archive 2025|GLAM–Archive 2025]] * 2025-07-01 – [[commons:Commons:Wiki Loves Earth 2025 in Thailand|Wiki Loves Earth 2025 in Thailand]] * 2025-08 – [[meta:Wikimania 2025|Wikimania 2025]] ([[meta:Wikimedia_Thailand/Wikimania_2025_scholarships#รายงานของผู้เข้าร่วม|Report from delegates]]) * 2025-09-06 – [[meta:Meetup/Mahidol University/24|Meetup/Mahidol University/24]] * 2025-10-01 – [[meta:Wikimedia Thailand/GLAM–Museum 2025|GLAM–Museum 2025]] * 2025-10-01 – [[commons:Commons:Wiki Loves Monuments 2025 in Thailand|Wiki Loves Monuments 2025 in Thailand]] <gallery> File:WikiCamp Chiang Mai 2025 01.jpg|WikiCamp Chiang Mai Group Photo File:Bkkcamp 5@KMUTT 15.jpg|5th BKK WikiCamp at King Mongkut's University of Technology Thonburi File:Thai Wikimedians delegates in Kenya 2025.jpg|Thai delegates in Wikimania 2025 at Nairobi, Kenya </gallery> bswxi15u1lr1soki18ndgeffb1yhi07 วิกิมีเดียประเทศไทย:ข้อปฏิเสธความรับผิดชอบทั่วไป 4 15 310 309 2025-11-24T04:59:19Z Taweetham 7 310 wikitext text/x-wiki __NOTOC__ วิกิพีเดียและโครงการพี่น้องอื่น ๆ ในกลุ่มขับเคลื่อนวิกิมีเดียประกอบด้วยเนื้อหาเสรีที่เกิดจากการร่วมเขียนออนไลน์ นั่นคือ การรวมตัวโดยใจสมัครของปัจเจกบุคคลและกลุ่มทำงานเพื่อพัฒนาทรัพยากรความรู้ของมนุษย์ที่เป็นของส่วนรวม โครงสร้างของวิกิมีเดียเปิดให้ทุกคนที่เชื่อมต่ออินเทอร์เน็ตเปลี่ยนแปลงเนื้อหาได้ โปรดทราบว่าไม่จำเป็นที่เนื้อหาใด ๆ ในวิกิมีเดียนี้จะได้รับการสอบทานจากนักวิชาชีพที่มีความเชี่ยวชาญพอจะนำเสนอสารสนเทศที่ครบถ้วน แม่นยำ หรือเชื่อถือได้แก่คุณ ที่กล่าวมาข้างต้น มิใช่ว่าคุณไม่อาจพบสารสนเทศอันทรงคุณค่าและแม่นยำได้จากวิกิมีเดีย อย่างไรก็ดี '''วิกิมีเดียประเทศไทยไม่อาจรับประกันความถูกต้องแม่นยำของสารสนเทศในเว็บไซต์เหล่านี้ได้''' เพราะเนื้อหาอาจเพิ่งถูกแก้ไข เปลี่ยนแปลง เพิ่มเข้าหรือตัดออก โดยบุคคลผู้มีความเห็นไม่สอดคล้องกับสถานะองค์ความรู้ปัจจุบันในสาขาที่เกี่ยวข้อง <u>หมายเหตุ</u> สารานุกรมอื่น แหล่งข้อมูล และงานอ้างอิงส่วนใหญ่มีข้อปฏิเสธความรับผิดชอบที่คล้ายกันนี้ rh8y8jtmifju3eomxuopmzq6rm87rkd วิกิมีเดียประเทศไทย:โครงสร้าง 4 16 114 113 2025-10-18T14:55:50Z Wutkh 9 /* กรรมการที่เคยเป็นผู้ขอรับทุนสนับสนุนจากวิกิมีเดียในนามวิกิมีเดียประเทศไทยและกรรมการอื่น */ 114 wikitext text/x-wiki {{Header|active=2}} วิกิมีเดียประเทศไทยขับเคลื่อนด้วยกลุ่มอาสาสมัครในประเทศไทยเพื่อสนับสนุนภารกิจของกลุ่มขับเคลื่อนวิกิมีเดีย แม้ว่าจะได้รับเงินสนับสนุนรายปีจากมูลนิธิวิกิมีเดีย แต่ผู้ปฏิบัติงานในวิกิมีเดียประเทศไทยทุกท่านมิได้รับเงินเดือนจากมูลนิธิวิกิมีเดียในฐานะพนักงานประจำและปฏิบัติหน้าที่ในลักษณะอาสาสมัคร == คณะทำงาน == ณ เดือนกันยายน พ.ศ. 2568 มีกรรมการทั้งหมด 4 ท่าน {| class="wikitable" |+ คณะกรรมการวิกิมีเดียประเทศไทย (ณ เดือนกันยายน พ.ศ. 2568) |- ! ชื่อผู้ใช้ ! ตำแหน่งในคณะกรรมการ ! ตำแหน่งอื่นในกลุ่มขับเคลื่อนวิกิมีเดีย |- ! [[w:th:ผู้ใช้:Manop|ผู้ใช้:Manop]] | ประธาน | อดีตผู้ดูแลระบบ[[w:th:วิกิพีเดียภาษาไทย|วิกิพีเดียภาษาไทย]] |- ! [[w:th:ผู้ใช้:KhanitthaAnnie|ผู้ใช้:KhanitthaAnnie]] | กรรมการ | |- ! [[ผู้ใช้:Tvcccp]] | กรรมการ | ผู้ดูแลระบบ[[q:th:วิกิคำคม|วิกิคำคม]]ภาษาไทยชั่วคราว 3 วาระ |- ! [[meta:User:Azoma|ผู้ใช้:Azoma]] | กรรมการ | อดีตผู้ดูแลระบบวิกิพีเดียภาษาไทย |} == กรรมการที่เคยเป็นผู้ขอรับทุนสนับสนุนจากวิกิมีเดียในนามวิกิมีเดียประเทศไทยและกรรมการอื่น == {{กำลังปรับปรุง}} นอกจากนี้ ยังมีกรรมการท่านอื่นที่เคยเป็นผู้ขอรับทุนสนับสนุนจากมูลนิธิวิกิมีเดียในนามวิกิมีเดียประเทศไทยและกรรมการอื่นที่มิได้มีชื่อเป็นผู้ขอรับทุนฯ แต่มีคุณูปการต่อวิกิมีเดียประเทศไทย ดังนี้ {| class="wikitable" |+ กรรมการที่เคยเป็นผู้ขอรับทุนสนับสนุนจากวิกิมีเดียในนามวิกิมีเดียประเทศไทยและกรรมการอื่น (ณ เดือนกันยายน พ.ศ. 2568) |- ! ชื่อผู้ใช้ ! ตำแหน่งในคณะกรรมการ ! ตำแหน่งอื่นในกลุ่มขับเคลื่อนวิกิมีเดีย |- ! [[ผู้ใช้:Taweetham]] | อดีตประธานกรรมการ (พ.ศ. 2557 – 2560) | กรรมการกระจายทรัพยากรระดับโลกของวิกิมีเดีย<br/>อดีตกรรมการทุนภูมิภาคเอเชียตะวันออก เอเชียตะวันออกเฉียงใต้ และแปซิฟิกของวิกิมีเดีย<br/>อดีตผู้ดูแลระบบวิกิพีเดียภาษาไทย |- ! [[meta:User:Athikhun.suw|ผู้ใช้:Athikhun.suw]] | อดีตประธานกรรมการ (พ.ศ. 2560 – 2568) | อดีต [[outreach:Education/Ambassadors|Wikipedia Campus Ambassador]] |- ! [[meta:User:2ndoct|ผู้ใช้:2ndoct]] | กรรมการ | |- ! Piyathida T. | กรรมการ<br/>Campaign coordinator | |- ! [[meta:User:Karto01|ผู้ใช้:Karto01]] | กรรมการ<br/>Competition coordinator | |- ! [[meta:User:Tanapatjms|ผู้ใช้:Tanapatjms]] | กรรมการ | |- ! [[ผู้ใช้:B20180]] | กรรมการ | ผู้ดูแลระบบวิกิพีเดียและโครงการพี่น้องในภาษาไทย<br/>ผู้รับรางวัล [[meta:Wikimedia Foundation/Communications/WikiCelebrate/B20180|WikiCelebrate]] |- ! [[meta:User:OraMAAG|ผู้ใช้:OraMAAG]] | กรรมการ | |} ta5wd6vf0hf2jkcnj0gc06ss3w5dmyv แม่แบบ:กำลังปรับปรุง 10 17 68 2025-10-17T08:59:50Z Wutkh 9 สร้างหน้าด้วย "{{mbox | type = notice | image = {{#if:{{{altimage|}}}|{{{altimage|}}}|[[File:Ambox warning blue construction.svg|50x40px|link=|หน้านี้กำลังอยู่ระหว่างการปรับปรุงขยายเนื้อหาเพื่มเติม]]}} | text = หน้านี้{{#if:{{{nosection|}}}||หรือส่วนนี้}}'''อยู่ระหว่างการปรับปรุ..." 68 wikitext text/x-wiki {{mbox | type = notice | image = {{#if:{{{altimage|}}}|{{{altimage|}}}|[[File:Ambox warning blue construction.svg|50x40px|link=|หน้านี้กำลังอยู่ระหว่างการปรับปรุงขยายเนื้อหาเพื่มเติม]]}} | text = หน้านี้{{#if:{{{nosection|}}}||หรือส่วนนี้}}'''อยู่ระหว่างการปรับปรุงขยายเนื้อหาเพื่มเติมอย่างต่อเนื่อง'''{{#if:{{{notready|}}} | แต่ยังไม่พร้อมสำหรับการใช้งาน }} ท่านสามารถร่วมปรับปรุงได้เช่นเดียวกัน อย่างไรก็ดีหากหน้านี้ <span class="plainlinks">[{{SERVER}}{{localurl:{{NAMESPACE}}:{{PAGENAME}}|action=history}}</span> ไม่ได้รับการแก้ไขภายในช่วงนี้] กรุณานำป้ายนี้ออก<br /> {{small|{{last edited by}}}} }}{{#if:{{{comment|}}} |{{mbox | type = notice | image = none | text = '''บันทึก''': {{{comment}}} }} }}<includeonly>{{#ifeq:{{{nocat|}}}|true||{{{category|{{#switch:{{NAMESPACE}} |{{ns:2}} |{{ns:3}}=<!-- no category for user/talk pages--> |#default=[[หมวดหมู่:หน้าที่กำลังปรับปรุงอยู่]] }}}}} }} err5p20sapp2kqhpbmy9f7fd1oa6wk0 แม่แบบ:Mbox 10 18 89 69 2025-10-17T09:19:34Z Wutkh 9 ป้องกัน "[[แม่แบบ:Mbox]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 69 wikitext text/x-wiki {{#invoke:Message box|mbox}} sl4s23vzv7gf305o2mbhlujimgvrnqi มอดูล:Message box 828 19 90 70 2025-10-17T09:19:52Z Wutkh 9 ป้องกัน "[[มอดูล:Message box]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 70 Scribunto text/plain require('strict') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[หมวดหมู่:%s|%s]]', cat, sort) else cat = string.format('[[หมวดหมู่:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^([tT][eE][mM][pP][lL][aA][tT][eE]|แม่แบบ)[%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'แม่แบบ:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = (cfg.sectionDefault or 'หน้า') .. 'นี้' elseif type(args.sect) == 'string' then sect = args.sect .. 'นี้' end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, '') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|อภิปราย]])', talkLink) else talkText = 'การอภิปรายที่อาจเกี่ยวข้องอาจพบได้ที่' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s[[%s#%s|หน้าอภิปรายของหน้านี้]]', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- set templatestyles self.base_templatestyles = cfg.templatestyles self.templatestyles = args.templatestyles end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'ตั้งแต่' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s%s%s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('หมวดหมู่:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'แม่แบบ <code>%s[[แม่แบบ:%s|%s]]%s</code> ถูก subst อย่างไม่ถูกต้อง', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end local frame = mw.getCurrentFrame() root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.base_templatestyles }, }) -- Add support for a single custom templatestyles sheet. Undocumented as -- need should be limited and many templates using mbox are substed; we -- don't want to spread templatestyles sheets around to arbitrary places if self.templatestyles then root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.templatestyles }, }) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('span') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :addClass('mbox-invalid-type') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) h5r0zq4bmcyrfj7m30daxf8jbhvjgek มอดูล:Yesno 828 20 91 71 2025-10-17T09:20:04Z Wutkh 9 ป้องกัน "[[มอดูล:Yesno]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 71 Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or val == 't' or val == 'on' or val == 'ใช่' or val == 'จริง' or val == 'ถูก' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or val == 'f' or val == 'off' or val == 'ไม่' or val == 'ไม่ใช่' or val == 'เท็จ' or val == 'ผิด' or tonumber(val) == 0 then return false else return default end end inuxunk9sf5wtkait1yjf8m94ynrwyp มอดูล:Arguments 828 21 92 72 2025-10-17T09:25:08Z Wutkh 9 ป้องกัน "[[มอดูล:Arguments]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 72 Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end local function matchesTitle(given, title) local tp = type( given ) return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title end local translate_mt = { __index = function(t, k) return k end } function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Set up argument translation. --]] options.translate = options.translate or {} if getmetatable(options.translate) == nil then setmetatable(options.translate, translate_mt) end if options.backtranslate == nil then options.backtranslate = {} for k,v in pairs(options.translate) do options.backtranslate[v] = k end end if options.backtranslate and getmetatable(options.backtranslate) == nil then setmetatable(options.backtranslate, { __index = function(t, k) if options.translate[k] ~= k then return nil else return k end end }) end --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if matchesTitle(options.wrappers, title) then found = true elseif type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if matchesTitle(v, title) then found = true break end end end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table. If a value is already present it is not overwritten; -- tables listed earlier have precedence. We are also memoizing nil -- values, which can be overwritten if they are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in pairs(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] if type(key) == 'string' then key = options.translate[key] end local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if type(key) == 'string' then key = options.translate[key] end if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end local function translatenext(invariant) local k, v = next(invariant.t, invariant.k) invariant.k = k if k == nil then return nil elseif type(k) ~= 'string' or not options.backtranslate then return k, v else local backtranslate = options.backtranslate[k] if backtranslate == nil then -- Skip this one. This is a tail call, so this won't cause stack overflow return translatenext(invariant) else return backtranslate, v end end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(argTables) metatable.donePairs = true end return translatenext, { t = metaArgs } end local function inext(t, i) -- This uses our __index metamethod local v = t[i + 1] if v ~= nil then return i + 1, v end end metatable.__ipairs = function (t) -- Called when ipairs is run on the args table. return inext, t, 0 end return args end return arguments 5qx9tzlul9ser30uxj9nbasjt92cevn มอดูล:Message box/configuration 828 22 93 73 2025-10-17T09:25:24Z Wutkh 9 ป้องกัน "[[มอดูล:Message box/configuration]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 73 Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[มอดูล:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'บทความ', allowMainspaceCategories = true, templateCategory = 'แม่แบบสารบทความ', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '<small>[[วิธีใช้:การนำแม่แบบบำรุงรักษาออก|เรียนรู้ว่าจะนำสารแม่แบบนี้ออกได้อย่างไรและเมื่อไร]]</small>', templatestyles = 'มอดูล:Message box/ambox.css' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true, templatestyles = 'มอดูล:Message box/cmbox.css' }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false, templatestyles = 'มอดูล:Message box/fmbox.css' }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'กล่องสารไฟล์', templatestyles = 'มอดูล:Message box/imbox.css' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true, templatestyles = 'มอดูล:Message box/ombox.css' }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, templateCategory = 'กล่องสารพูดคุย', templatestyles = 'มอดูล:Message box/tmbox.css' } } heuiseja3vte9u3zj5xnxlvfk2p4qym มอดูล:Message box/ombox.css 828 23 94 74 2025-10-17T09:25:38Z Wutkh 9 ป้องกัน "[[มอดูล:Message box/ombox.css]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 74 sanitized-css text/css /* {{pp|small=y}} */ .ombox { margin: 4px 0; border-collapse: collapse; border: 1px solid #a2a9b1; /* Default "notice" gray */ background-color: var(--background-color-neutral-subtle, #f8f9fa); box-sizing: border-box; color: var(--color-base, #202122); } /* For the "small=yes" option. */ .ombox.mbox-small { font-size: 88%; line-height: 1.25em; } .ombox-speedy { border: 2px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ombox-delete { border: 2px solid #b32424; /* Red */ } .ombox-content { border: 1px solid #f28500; /* Orange */ } .ombox-style { border: 1px solid #fc3; /* Yellow */ } .ombox-move { border: 1px solid #9932cc; /* Purple */ } .ombox-protection { border: 2px solid #a2a9b1; /* Gray-gold */ } .ombox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.9em; width: 100%; } .ombox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.9em; text-align: center; } .ombox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.9em 2px 0; text-align: center; } /* An empty narrow cell */ .ombox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .ombox .mbox-invalid-type { text-align: center; } @media (min-width: 720px) { .ombox { margin: 4px 10%; } .ombox.mbox-small { /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; width: 238px; } } /** T367463 */ body.skin--responsive table.ombox img { max-width: none !important; } @media screen { html.skin-theme-clientpref-night .ombox-speedy { background-color: #310402; /* Dark red, same hue/saturation as light */ } } @media screen and ( prefers-color-scheme: dark) { html.skin-theme-clientpref-os .ombox-speedy { background-color: #310402; /* Dark red, same hue/saturation as light */ } } 94fgri006ezjuf8buhmwait7x4j84mj แม่แบบ:Small 10 24 75 2025-10-17T09:07:28Z Wutkh 9 สร้างหน้าด้วย "<span style="font-size:85%;">{{{1}}}</span><includeonly>{{SAFESUBST:#if:{{{1|}}}||[[Category:หน้าที่ใช้แม่แบบ small ที่พารามิเตอร์นำเข้าว่างเปล่า]]}}</includeonly>" 75 wikitext text/x-wiki <span style="font-size:85%;">{{{1}}}</span><includeonly>{{SAFESUBST:#if:{{{1|}}}||[[Category:หน้าที่ใช้แม่แบบ small ที่พารามิเตอร์นำเข้าว่างเปล่า]]}}</includeonly> 0u56etu41sjk1qa0bw19yxuyc2tsfb3 แม่แบบ:Last edited by 10 25 95 76 2025-10-17T09:26:27Z Wutkh 9 ป้องกัน "[[แม่แบบ:Last edited by]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 76 wikitext text/x-wiki <span class="plainlinks">ผู้แก้ไข{{pagetype|subjectspace=yes}}นี้คน[{{fullurl:{{FULLPAGENAME}}|diff=cur}} ล่าสุด] คือ [[User:{{REVISIONUSER}}|{{REVISIONUSER}}]] {{Toolbar|[[User talk:{{REVISIONUSER}}|พูดคุย]]|[[Special:Contributions/{{REVISIONUSER}}|เรื่องที่เขียน]]}} เมื่อ {{time ago|{{REVISIONTIMESTAMP}}|tz_offset=yes}} <font size="1">''([{{fullurl:{{FULLPAGENAMEE}}|action=purge}} ล้างแคช])''</font></span> ko5wdo669qu0b989u3drhfluhjvqo9y แม่แบบ:Pagetype 10 26 96 77 2025-10-17T09:27:15Z Wutkh 9 ป้องกัน "[[แม่แบบ:Pagetype]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) [ต่อเรียง] 77 wikitext text/x-wiki {{<includeonly>safesubst:</includeonly>#invoke:pagetype|main}} nyusyoazwf6aluu0ws2bc8inh9cf10o มอดูล:Pagetype 828 27 97 78 2025-10-17T09:27:30Z Wutkh 9 ป้องกัน "[[มอดูล:Pagetype]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) [ต่อเรียง] 78 Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- PAGETYPE -- -- -- -- This is a meta-module intended to replace {{pagetype}} and similar -- -- templates. It automatically detects namespaces, and allows for a -- -- great deal of customisation. It can easily be ported to other -- -- wikis by changing the values in the [[Module:Pagetype/config]]. -- -- -- -------------------------------------------------------------------------------- -- Load config. local cfg = mw.loadData('Module:Pagetype/config') -- Load required modules. local getArgs = require('Module:Arguments').getArgs local yesno = require('Module:Yesno') local nsDetectModule = require('Module:Namespace detect') local nsDetect = nsDetectModule._main local getParamMappings = nsDetectModule.getParamMappings local getPageObject = nsDetectModule.getPageObject local p = {} local function shallowCopy(t) -- Makes a shallow copy of a table. local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end local function checkPagetypeInput(namespace, val) -- Checks to see whether we need the default value for the given namespace, -- and if so gets it from the pagetypes table. -- The yesno function returns true/false for "yes", "no", etc., and returns -- val for other input. local ret = yesno(val, val) if ret and type(ret) ~= 'string' then ret = cfg.pagetypes[namespace] end return ret end local function getPagetypeFromClass(class, param, aliasTable, default) -- Gets the pagetype from a class specified from the first positional -- parameter. param = yesno(param, param) if param ~= false then -- No check if specifically disallowed. for _, alias in ipairs(aliasTable) do if class == alias then if type(param) == 'string' then return param else return default end end end end end local function getNsDetectValue(args) -- Builds the arguments to pass to [[Module:Namespace detect]] and returns -- the result. -- Get the default values. local ndArgs = {} local defaultns = args[cfg.defaultns] if defaultns == cfg.defaultnsAll then ndArgs = shallowCopy(cfg.pagetypes) else local defaultnsArray if defaultns == cfg.defaultnsExtended then defaultnsArray = cfg.extendedNamespaces elseif defaultns == cfg.defaultnsNone then defaultnsArray = {} else defaultnsArray = cfg.defaultNamespaces end for _, namespace in ipairs(defaultnsArray) do ndArgs[namespace] = cfg.pagetypes[namespace] end end --[[ -- Add custom values passed in from the arguments. These overwrite the -- defaults. The possible argument names are fetched from -- Module:Namespace detect automatically in case new namespaces are -- added. Although we accept namespace aliases as parameters, we only pass -- the local namespace name as a parameter to Module:Namespace detect. -- This means that the "image" parameter can overwrite defaults for the -- File: namespace, which wouldn't work if we passed the parameters through -- separately. --]] local mappings = getParamMappings() for ns, paramAliases in pairs(mappings) do -- Copy the aliases table, as # doesn't work with tables returned from -- mw.loadData. paramAliases = shallowCopy(paramAliases) local paramName = paramAliases[1] -- Iterate backwards along the array so that any values for the local -- namespace names overwrite those for namespace aliases. for i = #paramAliases, 1, -1 do local paramAlias = paramAliases[i] local ndArg = checkPagetypeInput(paramAlias, args[paramAlias]) if ndArg == false then -- If any arguments are false, convert them to nil to protect -- against breakage by future changes to -- [[Module:Namespace detect]]. ndArgs[paramName] = nil elseif ndArg then ndArgs[paramName] = ndArg end end end -- Check for disambiguation-class and N/A-class pages in mainspace. if ndArgs.main then local class = args[1] if type(class) == 'string' then -- Put in lower case so e.g. "Dab" and "dab" will both match. class = mw.ustring.lower(class) end local dab = getPagetypeFromClass( class, args[cfg.dab], cfg.dabAliases, cfg.dabDefault ) if dab then ndArgs.main = dab else local na = getPagetypeFromClass( class, args[cfg.na], cfg.naAliases, cfg.naDefault ) if na then ndArgs.main = na end end end -- If there is no talk value specified, use the corresponding subject -- namespace for talk pages. if not ndArgs.talk then ndArgs.subjectns = true end -- Add the fallback value. This can also be customised, but it cannot be -- disabled. local other = args[cfg.other] -- We will ignore true/false/nil results from yesno here, but using it -- anyway for consistency. other = yesno(other, other) if type(other) == 'string' then ndArgs.other = other else ndArgs.other = cfg.otherDefault end -- Allow custom page values. ndArgs.page = args.page return nsDetect(ndArgs) end local function detectRedirects(args) local redirect = args[cfg.redirect] -- The yesno function returns true/false for "yes", "no", etc., and returns -- redirect for other input. redirect = yesno(redirect, redirect) if redirect == false then -- Detect redirects unless they have been explicitly disallowed with -- "redirect=no" or similar. return end local pageObject = getPageObject(args.page) -- If we are using subject namespaces elsewhere, do so here as well. if pageObject and not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll then pageObject = getPageObject( pageObject.subjectNsText .. ':' .. pageObject.text ) end -- Allow custom values for redirects. if pageObject and pageObject.isRedirect then if type(redirect) == 'string' then return redirect else return cfg.redirectDefault end end end function p._main(args) local redirect = detectRedirects(args) if redirect then return redirect else return getNsDetectValue(args) end end function p.main(frame) local args = getArgs(frame) return p._main(args) end return p 95yj90zj7nf2doh38om166uuyivtaoq มอดูล:Pagetype/config 828 28 79 2025-10-17T09:10:08Z Wutkh 9 สร้างหน้าด้วย "-------------------------------------------------------------------------------- -- Module:Pagetype configuration data -- -- This page holds localisation and configuration data for Module:Pagetype. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- --..." 79 Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Pagetype configuration data -- -- This page holds localisation and configuration data for Module:Pagetype. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -- This table holds the values to use for "main=true", "user=true", etc. Keys to -- this table should be namespace parameters that can be used with -- [[Module:Namespace detect]]. cfg.pagetypes = { ['main'] = 'บทความ', ['user'] = 'หน้าผู้ใช้', ['project'] = 'หน้าโครงการ', ['wikipedia'] = 'หน้าโครงการ', ['wp'] = 'หน้าโครงการ', ['file'] = 'ไฟล์', ['image'] = 'ไฟล์', ['mediawiki'] = 'หน้าอินเตอร์เฟซ', ['template'] = 'แม่แบบ', ['help'] = 'หน้าวิธีใช้', ['category'] = 'หมวดหมู่', ['portal'] = 'สถานีย่อย', ['book'] = 'book', ['draft'] = 'draft', ['education program'] = 'education program page', ['timedtext'] = 'Timed Text page', ['module'] = 'module', ['talk'] = 'หน้าพูดคุย', ['special'] = 'หน้าพิเศษ', ['media'] = 'ไฟล์' } -- This table holds the names of the namespaces to be looked up from -- cfg.pagetypes by default. cfg.defaultNamespaces = { 'main', 'file', 'template', 'category', 'module', 'book' } -- This table holds the names of the namespaces to be looked up from -- cfg.pagetypes if cfg.defaultnsExtended is set. cfg.extendedNamespaces = { 'main', 'user', 'project', 'file', 'mediawiki', 'template', 'category', 'help', 'portal', 'module', 'book', 'draft' } -- The parameter name to set which default namespace values to be looked up from -- cfg.pagetypes. cfg.defaultns = 'defaultns' -- The value of cfg.defaultns to set all namespaces, including talk. cfg.defaultnsAll = 'all' -- The value of cfg.defaultns to set the namespaces listed in -- cfg.extendedNamespaces cfg.defaultnsExtended = 'extended' -- The value of cfg.defaultns to set no default namespaces. cfg.defaultnsNone = 'none' -- The parameter name to use for disambiguation pages page. cfg.dab = 'dab' -- This table holds the different possible aliases for disambiguation-class -- pages. These should be lower-case. cfg.dabAliases = { 'disambiguation', 'disambig', 'disamb', 'dab' } -- The default value for disambiguation pages. cfg.dabDefault = 'หน้า' -- The parameter name to use for N/A-class page. cfg.na = 'na' -- This table holds the different possible aliases for N/A-class pages. These -- should be lower-case. cfg.naAliases = {'na', 'n/a'} -- The default value for N/A-class pages. cfg.naDefault = 'หน้า' -- The parameter name to use for redirects. cfg.redirect = 'หน้าเปลี่ยนทาง' -- The default value to use for redirects. cfg.redirectDefault = 'หน้าเปลี่ยนทาง' -- The parameter name for undefined namespaces. cfg.other = 'other' -- The value used if the module detects an undefined namespace. cfg.otherDefault = 'หน้า' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line 6szohvh8h7tekl3r046qsjwp1vvcx15 มอดูล:Namespace detect 828 29 98 80 2025-10-17T09:28:08Z Wutkh 9 ป้องกัน "[[มอดูล:Namespace detect]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) [ต่อเรียง] 80 Scribunto text/plain --[[ -------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a -- -- few improvements: all namespaces and all namespace aliases are supported, -- -- and namespace names are detected automatically for the local wiki. The -- -- module can also use the corresponding subject namespace value if it is -- -- used on a talk page. Parameter names can be configured for different wikis -- -- by altering the values in the "cfg" table in -- -- Module:Namespace detect/config. -- -- -- -------------------------------------------------------------------------------- --]] local data = mw.loadData('Module:Namespace detect/data') local argKeys = data.argKeys local cfg = data.cfg local mappings = data.mappings local yesno = require('Module:Yesno') local mArguments -- Lazily initialise Module:Arguments local mTableTools -- Lazily initilalise Module:TableTools local ustringLower = mw.ustring.lower local p = {} local function fetchValue(t1, t2) -- Fetches a value from the table t1 for the first key in array t2 where -- a non-nil value of t1 exists. for i, key in ipairs(t2) do local value = t1[key] if value ~= nil then return value end end return nil end local function equalsArrayValue(t, value) -- Returns true if value equals a value in the array t. Otherwise -- returns false. for i, arrayValue in ipairs(t) do if value == arrayValue then return true end end return false end function p.getPageObject(page) -- Get the page object, passing the function through pcall in case of -- errors, e.g. being over the expensive function count limit. if page then local success, pageObject = pcall(mw.title.new, page) if success then return pageObject else return nil end else return mw.title.getCurrentTitle() end end -- Provided for backward compatibility with other modules function p.getParamMappings() return mappings end local function getNamespace(args) -- This function gets the namespace name from the page object. local page = fetchValue(args, argKeys.demopage) if page == '' then page = nil end local demospace = fetchValue(args, argKeys.demospace) if demospace == '' then demospace = nil end local subjectns = fetchValue(args, argKeys.subjectns) local ret if demospace then -- Handle "demospace = main" properly. if equalsArrayValue(argKeys.main, ustringLower(demospace)) then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- Get the subject namespace if the option is set, -- otherwise use "talk". if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = 'talk' end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end ret = ret:gsub('_', ' ') return ustringLower(ret) end function p._main(args) -- Check the parameters stored in the mappings table for any matches. local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys local params = mappings[namespace] or {} local ret = fetchValue(args, params) --[[ -- If there were no matches, return parameters for other namespaces. -- This happens if there was no text specified for the namespace that -- was detected or if the demospace parameter is not a valid -- namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. --]] if ret == nil then ret = fetchValue(args, argKeys.other) end return ret end function p.main(frame) mArguments = require('Module:Arguments') local args = mArguments.getArgs(frame, {removeBlanks = false}) local ret = p._main(args) return ret or '' end function p.table(frame) --[[ -- Create a wikitable of all subject namespace parameters, for -- documentation purposes. The talk parameter is optional, in case it -- needs to be excluded in the documentation. --]] -- Load modules and initialise variables. mTableTools = require('Module:TableTools') local namespaces = mw.site.namespaces local cfg = data.cfg local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and yesno(frame.args.talk) -- Whether to use the talk parameter. -- Get the header names. local function checkValue(value, default) if type(value) == 'string' then return value else return default end end local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace') local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases') -- Put the namespaces in order. local mappingsOrdered = {} for nsname, params in pairs(mappings) do if useTalk or nsname ~= 'talk' then local nsid = namespaces[nsname].id -- Add 1, as the array must start with 1; nsid 0 would be lost otherwise. nsid = nsid + 1 mappingsOrdered[nsid] = params end end mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered) -- Build the table. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. nsHeader .. '\n! ' .. aliasesHeader for i, params in ipairs(mappingsOrdered) do for j, param in ipairs(params) do if j == 1 then ret = ret .. '\n|-' .. '\n| <code>' .. param .. '</code>' .. '\n| ' elseif j == 2 then ret = ret .. '<code>' .. param .. '</code>' else ret = ret .. ', <code>' .. param .. '</code>' end end end ret = ret .. '\n|-' .. '\n|}' return ret end return p j7kygz1y56jpz4doq0m2c6x1td5d8ar มอดูล:Namespace detect/data 828 30 81 2025-10-17T09:11:55Z Wutkh 9 สร้างหน้าด้วย "-------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/co..." 81 Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local defaultKeys = { 'main', 'talk', 'other', 'subjectns', 'demospace', 'demopage' } local argKeys = {} for i, defaultKey in ipairs(defaultKeys) do argKeys[defaultKey] = {defaultKey} end for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } ojp6d3pc8mql5nufaqdg576c9so3479 มอดูล:Namespace detect/config 828 31 82 2025-10-17T09:12:30Z Wutkh 9 สร้างหน้าด้วย "-------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- --..." 82 Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 1o6ozz56i8q0xgyl6xa41n2v7kelhli แม่แบบ:Toolbar 10 32 99 83 2025-10-17T09:45:42Z Wutkh 9 ป้องกัน "[[แม่แบบ:Toolbar]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) [ต่อเรียง] 83 wikitext text/x-wiki {{<includeonly>safesubst:</includeonly>#invoke:Toolbar|main}} n7mmsprh0m93zpo1y8z9fixfm319ihy มอดูล:Toolbar 828 33 100 84 2025-10-17T09:45:59Z Wutkh 9 ป้องกัน "[[มอดูล:Toolbar]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) [ต่อเรียง] 84 Scribunto text/plain -- This module implements {{toolbar}}. local mArguments -- Lazily initialise [[Module:Arguments]] local mTableTools = require('Module:TableTools') local yesno = require('Module:Yesno') local p = {} function p.main(frame) mArguments = require('Module:Arguments') local args = mArguments.getArgs(frame) return p._main(args) end function p._main(args) local toolbarItems = p.makeToolbarItems(args) if not toolbarItems then -- Return the blank string if no arguments were specified, rather than -- returning empty brackets. return '' elseif yesno(args.span) == false then return string.format( '(%s)', toolbarItems ) else return string.format( '<span class="plainlinks%s"%s>(%s)</span>', type(args.class) == 'string' and ' ' .. args.class or '', type(args.style) == 'string' and string.format(' style="%s"', args.style) or '', toolbarItems ) end end function p.makeToolbarItems(args) local nums = mTableTools.numKeys(args) local sep = (args.separator or 'pipe') .. '-separator' sep = mw.message.new(sep):plain() local ret = {} for i, v in ipairs(nums) do ret[#ret + 1] = args[v] end if #ret > 0 then return table.concat(ret, sep) else return nil end end return p ailtbbbycxvrr21mi50uvpehmddg0lm มอดูล:TableTools 828 34 85 2025-10-17T09:15:20Z Wutkh 9 สร้างหน้าด้วย "------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #..." 85 Scribunto text/plain ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke. -- ------------------------------------------------------------------------------------ local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false if -- not. Although it doesn't operate on tables, it is included here as it is useful -- for determining whether a value can be a valid table key. Lua will generate an -- error if a NaN is used as a table key. ------------------------------------------------------------------------------------ function p.isNan(v) return type(v) == 'number' and v ~= v end ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ function p.shallowClone(t) checkType('shallowClone', 1, t, 'table') local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ function p.removeDuplicates(arr) checkType('removeDuplicates', 1, arr, 'table') local isNan = p.isNan local ret, exists = {}, {} for _, v in ipairs(arr) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v elseif not exists[v] then ret[#ret + 1] = v exists[v] = true end end return ret end ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return -- {1, 3, 6}. ------------------------------------------------------------------------------------ function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table -- of subtables in the format -- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}. -- Keys that don't end with an integer are stored in a subtable named "other". The -- compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ function p.size(t) checkType('size', 1, t, 'table') local i = 0 for _ in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then return tostring(item1) < tostring(item2) else return item1 < item2 end end ------------------------------------------------------------------------------------ -- keysToList -- -- Returns an array of the keys in a table, sorted using either a default -- comparison function or a custom keySort function. ------------------------------------------------------------------------------------ function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'}) end local arr = {} local index = 1 for k in pairs(t) do arr[index] = k index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(arr, keySort) end return arr end ------------------------------------------------------------------------------------ -- sortedPairs -- -- Iterates through a table, with the keys sorted using the keysToList function. -- If there are only numerical keys, sparseIpairs is probably more efficient. ------------------------------------------------------------------------------------ function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local arr = p.keysToList(t, keySort, true) local i = 0 return function () i = i + 1 local key = arr[i] if key ~= nil then return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- isArray -- -- Returns true if the given value is a table and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArray(v) if type(v) ~= 'table' then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- isArrayLike -- -- Returns true if the given value is iterable and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArrayLike(v) if not pcall(pairs, v) then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- invert -- -- Transposes the keys and values in an array. For example, {"a", "b", "c"} -> -- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to -- the index of the last duplicate) and NaN values are ignored. ------------------------------------------------------------------------------------ function p.invert(arr) checkType("invert", 1, arr, "table") local isNan = p.isNan local map = {} for i, v in ipairs(arr) do if not isNan(v) then map[v] = i end end return map end ------------------------------------------------------------------------------------ -- listToSet -- -- Creates a set from the array part of the table. Indexing the set by any of the -- values of the array returns true. For example, {"a", "b", "c"} -> -- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them -- never equal to any value (including other NaNs or even themselves). ------------------------------------------------------------------------------------ function p.listToSet(arr) checkType("listToSet", 1, arr, "table") local isNan = p.isNan local set = {} for _, v in ipairs(arr) do if not isNan(v) then set[v] = true end end return set end ------------------------------------------------------------------------------------ -- deepCopy -- -- Recursive deep copy function. Preserves identities of subtables. ------------------------------------------------------------------------------------ local function _deepCopy(orig, includeMetatable, already_seen) if type(orig) ~= "table" then return orig end -- already_seen stores copies of tables indexed by the original table. local copy = already_seen[orig] if copy ~= nil then return copy end copy = {} already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops for orig_key, orig_value in pairs(orig) do copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen) end if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then setmetatable(copy, _deepCopy(mt, true, already_seen)) end end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen or {}) end ------------------------------------------------------------------------------------ -- sparseConcat -- -- Concatenates all values in the table that are indexed by a number, in order. -- sparseConcat{a, nil, c, d} => "acd" -- sparseConcat{nil, b, c, d} => "bcd" ------------------------------------------------------------------------------------ function p.sparseConcat(t, sep, i, j) local arr = {} local arr_i = 0 for _, v in p.sparseIpairs(t) do arr_i = arr_i + 1 arr[arr_i] = v end return table.concat(arr, sep, i, j) end ------------------------------------------------------------------------------------ -- length -- -- Finds the length of an array, or of a quasi-array with keys such as "data1", -- "data2", etc., using an exponential search algorithm. It is similar to the -- operator #, but may return a different value when there are gaps in the array -- portion of the table. Intended to be used on data loaded with mw.loadData. For -- other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of the number -- of unnamed template parameters, so use this function for frame.args. ------------------------------------------------------------------------------------ function p.length(t, prefix) -- requiring module inline so that [[Module:Exponential search]] which is -- only needed by this one function doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function (i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end ------------------------------------------------------------------------------------ -- inArray -- -- Returns true if searchElement is a member of the array, and false otherwise. -- Equivalent to JavaScript array.includes(searchElement) or -- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed ------------------------------------------------------------------------------------ function p.inArray(array, searchElement, fromIndex) checkType("inArray", 1, array, "table") -- if searchElement is nil, error? fromIndex = tonumber(fromIndex) if fromIndex then if (fromIndex < 0) then fromIndex = #array + fromIndex + 1 end if fromIndex < 1 then fromIndex = 1 end for _, v in ipairs({unpack(array, fromIndex)}) do if v == searchElement then return true end end else for _, v in pairs(array) do if v == searchElement then return true end end end return false end ------------------------------------------------------------------------------------ -- merge -- -- Given the arrays, returns an array containing the elements of each input array -- in sequence. ------------------------------------------------------------------------------------ function p.merge(...) local arrays = {...} local ret = {} for i, arr in ipairs(arrays) do checkType('merge', i, arr, 'table') for _, v in ipairs(arr) do ret[#ret + 1] = v end end return ret end ------------------------------------------------------------------------------------ -- extend -- -- Extends the first array in place by appending all elements from the second -- array. ------------------------------------------------------------------------------------ function p.extend(arr1, arr2) checkType('extend', 1, arr1, 'table') checkType('extend', 2, arr2, 'table') for _, v in ipairs(arr2) do arr1[#arr1 + 1] = v end end return p 4n03zk6kcoeg4gz82mieeh94c1szcjy แม่แบบ:Time ago 10 35 86 2025-10-17T09:16:44Z Wutkh 9 สร้างหน้าด้วย "{{#invoke:TimeAgo|main}}" 86 wikitext text/x-wiki {{#invoke:TimeAgo|main}} 3te5uex5o6wlzora948obtb3n2yif73 มอดูล:TimeAgo 828 36 101 87 2025-10-17T09:48:27Z Wutkh 9 ป้องกัน "[[มอดูล:TimeAgo]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 87 Scribunto text/plain -- Replacement for [[Template:Time ago]] local getArgs = require('Module:Arguments').getArgs local p = {} function p.main( frame ) local args = getArgs( frame, { valueFunc = function( k, v ) if v then v = v:match( '^%s*(.-)%s*$' ) -- Trim whitespace. if k == 'ก่อน' or v ~= '' then return v end end return nil end }) return p._main( args ) end function p._main( args ) -- Initialize variables local lang = mw.language.getContentLanguage() local ago local auto_magnitude_num local min_magnitude_num local result local result_unit local magnitude = args.magnitude local min_magnitude = args.min_magnitude local purge = args.purge -- Generate the "ago" string. If ago is the blank string, do nothing - this allows overriding of args.ago -- in cases where the module is used to generate something like "where he has worked for the past 20 years." ago = args.ago if not ago then ago = 'ก่อน' end -- Add a purge link if something (usually "yes") is entered into the purge parameter if purge then purge = ' <span class="plainlinks">([' .. mw.title.getCurrentTitle():fullUrl('action=purge') .. ' purge])</span>' else purge = '' end -- Check that the entered timestamp is valid. If it isn't, then give an error message. local noError, inputTime = pcall( lang.formatDate, lang, 'U', args[1] ) if not noError then return '<strong class="error">Error: first parameter cannot be parsed as a date or time.</strong>' end -- Store the difference between the current time and the inputted time, as well as its absolute value. local timeDiff = lang:formatDate( 'U' ) - inputTime if args.tz_offset == "yes" then timeDiff = timeDiff + lang:formatDate( 'Z', nil, true ) end local absTimeDiff = math.abs( timeDiff ) if magnitude then auto_magnitude_num = 0 min_magnitude_num = timeText[magnitude] else -- Calculate the appropriate unit of time if it was not specified as an argument. local autoMagnitudeData = { {denom = 63115200, amn = 31557600}, {denom = 5356800, amn = 2678400}, {denom = 172800, amn = 86400}, {denom = 7200, amn = 3600}, {denom = 120, amn = 60} } for i, t in ipairs(autoMagnitudeData) do if absTimeDiff / t.denom >= 1 then auto_magnitude_num = t.amn break end end auto_magnitude_num = auto_magnitude_num or 1 if min_magnitude then min_magnitude_num = timeText[min_magnitude] else min_magnitude_num = -1 end end if not min_magnitude_num then -- Default to seconds if an invalid magnitude is entered. min_magnitude_num = 1 end local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num ) local result_num = math.floor ( absTimeDiff / magnitude_num ) if timeDiff >= 0 then -- Past if result_num == 1 then result_unit = timeUnits[ magnitude_num ][1] else result_unit = timeUnits[ magnitude_num ][2] end result = result_num .. ' ' .. result_unit .. ago -- Spaces for "ago" are added earlier. else -- Future if result_num == 1 then result_unit = timeUnits[ magnitude_num ][3] else result_unit = timeUnits[ magnitude_num ][4] end result = 'อีก ' .. result_num .. ' ' .. result_unit end return result .. purge end -- Table to convert entered text values to numeric values. timeText = { ['seconds'] = 1, ['minutes'] = 60, ['hours'] = 3600, ['days'] = 86400, ['weeks'] = 604800, ['months'] = 2678400, ['years'] = 31557600 } -- Table containing tables of possible units to use in output. timeUnits = { [1] = { 'วินาที', 'วินาที', "วินาที", "วินาที" }, [60] = { 'นาที', 'นาที', "นาที", "นาที" }, [3600] = { 'ชั่วโมง', 'ชั่วโมง', "ชั่วโมง", "ชั่วโมง" }, [86400] = { 'วัน', 'วัน', "วัน", "วัน" }, [604800] = { 'สัปดาห์', 'สัปดาห์', "สัปดาห์", "สัปดาห์" }, [2678400] = { 'เดือน', 'เดือน', "เดือน", "เดือน" }, [31557600] = { 'ปี', 'ปี', "ปี", "ปี" } } return p i36mrwb26qb0j4ofwg7yny47vpa7gnq มีเดียวิกิ:Protect-dropdown 8 37 88 2025-10-17T09:19:17Z Wutkh 9 สร้างหน้าด้วย "* เหตุผลการป้องกันหน้าทั่วไป ** การก่อกวนจำนวนมาก ** สแปมจำนวนมาก ** สงครามการแก้ไขที่ไม่สร้างสรรค์ ** หน้าที่มีการเข้าชมมาก ** แม่แบบ/มอดูลสำคัญ" 88 wikitext text/x-wiki * เหตุผลการป้องกันหน้าทั่วไป ** การก่อกวนจำนวนมาก ** สแปมจำนวนมาก ** สงครามการแก้ไขที่ไม่สร้างสรรค์ ** หน้าที่มีการเข้าชมมาก ** แม่แบบ/มอดูลสำคัญ sl87tkjfbjx8j5qsokwkx8gvqmv5nq2 วิกิมีเดียประเทศไทย:ติดต่อ 4 38 107 2025-10-17T15:42:35Z Wutkh 9 สร้างหน้าด้วย "{{Header}} [[w:th:สื่อสังคม|สื่อสังคม]]: [[File:Facebook f logo (2019).svg|20x20px|link=]] [https://www.facebook.com/WikimediaThailand/ @WikimediaThailand], [https://www.facebook.com/profile.php?id=61556992116885 เพจเฟซบุ๊กทางการของวิกิพีเดียภาษาไทย] [[File:Instagram logo 2022.svg|20x20px|link=]] [https://www.instagram.com/WikimediaThailand/..." 107 wikitext text/x-wiki {{Header}} [[w:th:สื่อสังคม|สื่อสังคม]]: [[File:Facebook f logo (2019).svg|20x20px|link=]] [https://www.facebook.com/WikimediaThailand/ @WikimediaThailand], [https://www.facebook.com/profile.php?id=61556992116885 เพจเฟซบุ๊กทางการของวิกิพีเดียภาษาไทย] [[File:Instagram logo 2022.svg|20x20px|link=]] [https://www.instagram.com/WikimediaThailand/ @WikimediaThailand] {|width="100%" border="0" cellspacing="2" cellpadding="2" style="align=center; MARGIN: 10px auto 0.5em;clear:both;border:1px solid gold; background:ivory; color:#000000; text-align: center;" |- | '''โปรดทราบ'''<br/>แม้ว่าวิกิมีเดียประเทศไทยจะได้รับเงินสนับสนุนจากมูลนิธิวิกิมีเดีย แต่วิกิมีเดียประเทศไทยเป็นองค์กรเอกเทศ มิได้เป็นสาขาย่อยในเชิงโครงสร้างการบริหารของมูลนิธิวิกิมีเดีย<br/>วิกิมีเดียประเทศไทยไม่อาจรับผิดชอบต่อเนื้อหาใด ๆ บนวิกิพีเดียและโครงการพี่น้องทุกโครงการบนกลุ่มขับเคลื่อนวิกิมีเดีย<br/>โปรดศึกษารายละเอียดเพิ่มเติมใน[[วิกิมีเดียประเทศไทย:ข้อปฏิเสธความรับผิดชอบทั่วไป|หน้านี้]] ขอขอบคุณในความเข้าใจ |} dbsrmkme97mypud4fjrce8j25tfmqvz แม่แบบ:Template link 10 39 115 2025-10-19T07:16:05Z Wutkh 9 สร้างหน้าด้วย "<span class="nowrap">&#123;&#123;</span>[[แม่แบบ:{{{1}}}|{{{1}}}]]<span class="nowrap">&#125;&#125;</span><noinclude>" 115 wikitext text/x-wiki <span class="nowrap">&#123;&#123;</span>[[แม่แบบ:{{{1}}}|{{{1}}}]]<span class="nowrap">&#125;&#125;</span><noinclude> q3arnqpblx6qlvz4s68qem0mimxpeqo แม่แบบ:Tl 10 40 116 2025-10-19T07:17:05Z Wutkh 9 เปลี่ยนทางหน้าไปยัง [[แม่แบบ:Template link]] 116 wikitext text/x-wiki #เปลี่ยนทาง [[แม่แบบ:Template link]] af0ekeyk9c7jdgdwckm4179ublk9bws แม่แบบ:เห็นด้วย 10 41 117 2025-10-19T07:18:20Z Wutkh 9 สร้างหน้าด้วย "[[ภาพ:Symbol support vote.svg|15px]] '''{{{2|เห็นด้วย}}}''' {{{1|}}} <noinclude><br/> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ลงคะแนนโหวต''' <u>ในหน้าลงคะแนนโหวต</u> กรณีที่เห็นด้วย โดยคัดลอกข้อความนี้ <pre> * {{เห็นด้วย|ความเห..." 117 wikitext text/x-wiki [[ภาพ:Symbol support vote.svg|15px]] '''{{{2|เห็นด้วย}}}''' {{{1|}}} <noinclude><br/> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ลงคะแนนโหวต''' <u>ในหน้าลงคะแนนโหวต</u> กรณีที่เห็นด้วย โดยคัดลอกข้อความนี้ <pre> * {{เห็นด้วย|ความเห็นเพิ่มเติมถ้ามี}} --~~~~ </pre> วางเป็นรายการของผู้ที่แสดงความเห็น จะได้ผลดังนี้ * {{เห็นด้วย|ความเห็นเพิ่มเติมถ้ามี}} --(ชื่อผู้ลงคะแนน) == ดูเพิ่ม == * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความคิด}} - {{ความคิด}} * {{Tl|ความเห็น}} - {{ความเห็น}} </noinclude> 0tga2sagqyscwcu1rvnsvagheivulsh แม่แบบ:เป็นกลาง 10 42 118 2025-10-19T07:18:50Z Wutkh 9 สร้างหน้าด้วย "[[ภาพ:Symbol neutral vote.svg|15px]] '''{{{2|เป็นกลาง}}}''' {{{1|}}} <noinclude><br/> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ลงคะแนนโหวต''' <u>ในหน้าลงคะแนนโหวต</u> กรณีที่เป็นกลาง ไม่มีการสนับสนุน หรือคัดค้าน โดยคัดลอกข..." 118 wikitext text/x-wiki [[ภาพ:Symbol neutral vote.svg|15px]] '''{{{2|เป็นกลาง}}}''' {{{1|}}} <noinclude><br/> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ลงคะแนนโหวต''' <u>ในหน้าลงคะแนนโหวต</u> กรณีที่เป็นกลาง ไม่มีการสนับสนุน หรือคัดค้าน โดยคัดลอกข้อความนี้ <pre> * {{เป็นกลาง|ความเห็นเพิ่มเติมถ้ามี}} --~~~~ </pre> วางเป็นรายการของผู้ที่แสดงความเห็น จะได้ผลดังนี้ * {{เป็นกลาง|ความเห็นเพิ่มเติมถ้ามี}} -- (ชื่อผู้ลงคะแนน) == ดูเพิ่ม == * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความคิด}} - {{ความคิด}} * {{Tl|ความเห็น}} - {{ความเห็น}} </noinclude> ksqcr6ejnyfsvovesawc0406jj4a7jt แม่แบบ:ไม่เห็นด้วย 10 43 119 2025-10-19T07:19:55Z Wutkh 9 สร้างหน้าด้วย "[[ภาพ:Symbol oppose vote.svg|15px]] '''{{{2|ไม่เห็นด้วย}}}''' {{{1|}}} <noinclude><br/> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ลงคะแนนโหวต''' <u>ในหน้าลงคะแนนโหวต</u> กรณีที่ไม่เห็นด้วย โดยคัดลอกข้อความนี้ <pre> * {{ไม่เห็นด้..." 119 wikitext text/x-wiki [[ภาพ:Symbol oppose vote.svg|15px]] '''{{{2|ไม่เห็นด้วย}}}''' {{{1|}}} <noinclude><br/> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ลงคะแนนโหวต''' <u>ในหน้าลงคะแนนโหวต</u> กรณีที่ไม่เห็นด้วย โดยคัดลอกข้อความนี้ <pre> * {{ไม่เห็นด้วย|ความเห็นเพิ่มเติมถ้ามี}} --~~~~ </pre> วางเป็นรายการของผู้ที่แสดงความเห็น จะได้ผลดังนี้ * {{ไม่เห็นด้วย|ความเห็นเพิ่มเติมถ้ามี}} --(ชื่อผู้ลงคะแนน) == ดูเพิ่ม == * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความคิด}} - {{ความคิด}} * {{Tl|ความเห็น}} - {{ความเห็น}} </noinclude> rswl6d9hf0d95np2w052d8cn0wqs44a แม่แบบ:สำเร็จ 10 44 120 2025-10-19T07:21:03Z Wutkh 9 สร้างหน้าด้วย "<span class="nowrap">[[ไฟล์:Yes check.svg|18px|link=|alt=]]'''&nbsp;{{{1|สำเร็จ}}}'''</span>{{{{{|safesubst:}}}#if:{{{2|{{{note|{{{reason|}}}}}}}}}|&#58; {{{2|{{{note|{{{reason}}}}}}}}}}}<!--แม่แบบ:สำเร็จ--><noinclude> == วิธีใช้ == แม่แบบนี้ใช้สำหรับประกอบความคิดเห็นในหน้าพูดคุย โดยใส่..." 120 wikitext text/x-wiki <span class="nowrap">[[ไฟล์:Yes check.svg|18px|link=|alt=]]'''&nbsp;{{{1|สำเร็จ}}}'''</span>{{{{{|safesubst:}}}#if:{{{2|{{{note|{{{reason|}}}}}}}}}|&#58; {{{2|{{{note|{{{reason}}}}}}}}}}}<!--แม่แบบ:สำเร็จ--><noinclude> == วิธีใช้ == แม่แบบนี้ใช้สำหรับประกอบความคิดเห็นในหน้าพูดคุย โดยใส่ <pre> {{สำเร็จ}} หรือ {{สำเร็จ|ความเห็นเพิ่มเติม}} </pre> โดยจะแสดงผลเป็น {{สำเร็จ}} หรือ {{สำเร็จ|ความเห็นเพิ่มเติม}} == ดูเพิ่ม == * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|กำลังทำ}} - {{กำลังทำ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความคิด}} - {{ความคิด}} * {{Tl|ความเห็น}} - {{ความเห็น}} </noinclude> gz3xg25i5jv70nyee9eksdqnvyn1l61 แม่แบบ:กำลังทำ 10 45 121 2025-10-19T07:23:19Z Wutkh 9 สร้างหน้าด้วย "[[ไฟล์:Pictogram voting wait.svg|20px|link=|alt=]] '''{{{1|กำลังทำ}}}...''' <noinclude> == วิธีใช้ == == ดูเพิ่ม == * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่ส..." 121 wikitext text/x-wiki [[ไฟล์:Pictogram voting wait.svg|20px|link=|alt=]] '''{{{1|กำลังทำ}}}...''' <noinclude> == วิธีใช้ == == ดูเพิ่ม == * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความคิด}} - {{ความคิด}} * {{Tl|ความเห็น}} - {{ความเห็น}} </noinclude> fza0m7fbytwf8z8y0znwndzqnzad5ew แม่แบบ:ไม่สำเร็จ 10 46 122 2025-10-19T07:24:40Z Wutkh 9 สร้างหน้าด้วย "<span class="nowrap">[[ไฟล์:X mark.svg|18px|link=|alt=]]&nbsp;'''{{{1|ไม่สำเร็จ}}}'''</span><!--แม่แบบ:ไม่สำเร็จ--> <noinclude> == วิธีใช้ == แม่แบบนี้ใช้สำหรับประกอบความคิดเห็นในหน้าพูดคุย โดยใส่ <pre> {{ไม่สำเร็จ}} หรือ {{ไม่สำเร็..." 122 wikitext text/x-wiki <span class="nowrap">[[ไฟล์:X mark.svg|18px|link=|alt=]]&nbsp;'''{{{1|ไม่สำเร็จ}}}'''</span><!--แม่แบบ:ไม่สำเร็จ--> <noinclude> == วิธีใช้ == แม่แบบนี้ใช้สำหรับประกอบความคิดเห็นในหน้าพูดคุย โดยใส่ <pre> {{ไม่สำเร็จ}} หรือ {{ไม่สำเร็จ|ความเห็นเพิ่มเติม}} </pre> โดยจะแสดงผลเป็น {{ไม่สำเร็จ}} หรือ {{ไม่สำเร็จ|ความเห็นเพิ่มเติม}} == ดูเพิ่ม == * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความคิด}} - {{ความคิด}} * {{Tl|ความเห็น}} - {{ความเห็น}} </noinclude> pofuhlnn60mx92yngjqea5l466a8aw8 แม่แบบ:ตอบถึง 10 47 127 123 2025-10-19T14:45:01Z Wutkh 9 ป้องกัน "[[แม่แบบ:ตอบถึง]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 123 wikitext text/x-wiki {{{{{|safesubst:}}}#invoke:Reply to|replyto|<noinclude>example=Example</noinclude>|max=50}} bixtml41n5q9dp0ay8hdxh7aaodhzzg มอดูล:Reply to 828 48 124 2025-10-19T14:43:59Z Wutkh 9 สร้างหน้าด้วย "local p = {} function p.replyto(frame) local origArgs = frame:getParent().args local args = {} local maxArg = 1 local usernames = 0 for k, v in pairs(origArgs) do if type(k) == 'number' then if mw.ustring.match(v,'%S') then if k > maxArg then maxArg = k end usernames = usernames + 1 local title = mw.title.new(v) if not title then return '<strong class="error">Error in [[Template:Reply to]]: Input contains forbidden charact..." 124 Scribunto text/plain local p = {} function p.replyto(frame) local origArgs = frame:getParent().args local args = {} local maxArg = 1 local usernames = 0 for k, v in pairs(origArgs) do if type(k) == 'number' then if mw.ustring.match(v,'%S') then if k > maxArg then maxArg = k end usernames = usernames + 1 local title = mw.title.new(v) if not title then return '<strong class="error">Error in [[Template:Reply to]]: Input contains forbidden characters.</strong>' end args[k] = title.rootText end elseif v == '' and k:sub(0,5) == 'label' then args[k] = '&#x200B;' else args[k] = v end end if usernames > (tonumber(frame.args.max) or 50) then return string.format( '<strong class="error">Error in [[Template:Reply to]]: More than %s names specified.</strong>', tostring(frame.args.max or 50) ) else if usernames < 1 then if frame.args.example then args[1] = frame.args.example else return '<strong class="error">Error in [[Template:Reply to]]: Username not given.</strong>' end end local isfirst = true local outStr = '' for i = 1, maxArg do if args[i] then if isfirst then outStr = string.format( '<span class="template-ping">%s[[User:%s|%s]]', args['prefix'] or '@', args[i], (args['label1'] or args['label']) or args[i] ) isfirst = false else if ( (usernames > 2) or ((usernames == 2) and (args['c'] == '')) ) then outStr = outStr..',' end if i == maxArg then outStr = outStr..' '..(args['c'] or 'และ') end outStr = string.format( '%s [[User:%s|%s]]', outStr, args[i], args['label'..tostring(i)] or args[i] ) end end end outStr = outStr..(args['p'] or ':')..'</span>' return outStr end end return p m8durk5psqx3atoijjk8fv7t964gq4f แม่แบบ:Ping 10 49 126 125 2025-10-19T14:44:50Z Wutkh 9 ป้องกัน "[[แม่แบบ:Ping]]" แล้ว: แม่แบบ/มอดูลสำคัญ ([แก้ไข:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด) [ย้าย:อนุญาตเฉพาะผู้ดูแลระบบ] (ไม่มีกำหนด)) 125 wikitext text/x-wiki #เปลี่ยนทาง [[แม่แบบ:ตอบถึง]] 6ch1qupiy10sa3rd4ekq66hls6qr8ys แม่แบบ:ถาม 10 50 129 128 2025-10-19T14:48:16Z Wutkh 9 129 wikitext text/x-wiki [[ภาพ:Symbol question.svg|15px]] {{{1|}}} <noinclude><br/> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ถามคำถาม''' <u>ในหน้าขอความเห็น</u> โดยคัดลอกข้อความนี้ <pre> * {{ถาม|ถามคำถาม}} --~~~~ </pre> วางเป็นรายการของผู้ที่แสดงความเห็น จะได้ผลดังนี้ * {{ถาม|ถามคำถาม}} --(ชื่อผู้ลงคะแนน) == ดูเพิ่ม == * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความคิด}} - {{ความคิด}} * {{Tl|ความเห็น}} - {{ความเห็น}} </noinclude> 582i8x9rcy72osoxfy53y8mnptojofv แม่แบบ:ตอบ 10 51 130 2025-10-19T14:51:10Z Wutkh 9 สร้างหน้าด้วย "[[ภาพ:Symbol reply.svg|15px]] {{{1|}}} <noinclude><br/> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ตอบคำถาม''' <u>ในหน้าเสนอชื่อเพื่อเป็นผู้ดูแล</u> โดยคัดลอกข้อความนี้ <pre> * {{ตอบ|ตอบคำถาม}} --~~~~ </pre> วางเป็นรายการของผู..." 130 wikitext text/x-wiki [[ภาพ:Symbol reply.svg|15px]] {{{1|}}} <noinclude><br/> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ตอบคำถาม''' <u>ในหน้าเสนอชื่อเพื่อเป็นผู้ดูแล</u> โดยคัดลอกข้อความนี้ <pre> * {{ตอบ|ตอบคำถาม}} --~~~~ </pre> วางเป็นรายการของผู้ที่แสดงความเห็น จะได้ผลดังนี้ * {{ตอบ|ตอบคำถาม}} --(ชื่อผู้ลงคะแนน) == ดูเพิ่ม == * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ความคิด}} - {{ความคิด}} * {{Tl|ความเห็น}} - {{ความเห็น}} </noinclude> fnbnsbyicg2enqnkx4vt40ynrkxmym3 แม่แบบ:ความคิด 10 52 133 132 2025-10-19T14:56:04Z Wutkh 9 133 wikitext text/x-wiki [[File:Bulbgraph.svg|18px|link=|alt=]] '''{{{1|คิดว่า:}}}'''<!--แม่แบบ:ความคิด--><noinclude> == การใช้งาน == แม่แบบนี้ใช้สำหรับ '''ออกความคิดเห็น''' {| class="wikitable" !Template !! Result |- |{{tl|ความคิด}} || {{ความคิด}} |- |<nowiki>{{ความคิด|ใส่ความคิดเห็นตรงนี้}}</nowiki> || {{ความคิด|ใส่ความคิดเห็นตรงนี้}} |} ตัวอย่างเช่น * {{ความคิด|ถ้าสร้างแม่แบบความคิดน่าจะดี}} --[[ผู้ใช้:Example|Example]] * {{ความคิด}} ถ้าสร้างแม่แบบความคิดน่าจะดี --[[ผู้ใช้:Example|Example]] == ดูเพิ่ม == * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความเห็น}} - {{ความเห็น}} </noinclude> cq58bdn22mngo8fjqsfz2t1dqi9bjfj แม่แบบ:ความเห็น 10 53 135 134 2025-10-19T15:05:35Z Wutkh 9 135 wikitext text/x-wiki [[File:Pictogram voting comment.svg|15px|link=]]&nbsp;'''ความเห็น'''<noinclude> == วิธีใช้ == แม่แบบนี้ใช้สำหรับ '''ออกความเห็น''' โดยคัดลอกข้อความนี้ <pre> * {{ความเห็น}} --~~~~ </pre> จะได้ผลดังนี้ * {{ความเห็น}} ใส่ความเห็นตรงนี้ -- (ชื่อผู้ออกความเห็น) == ดูเพิ่ม == * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความคิด}} - {{ความคิด}} </noinclude> ci6nfjriybdqv19mcvbwr8dhlifz431 25 ปีวิกิพีเดีย 0 54 434 264 2025-12-28T08:57:47Z Wutkh 9 434 wikitext text/x-wiki {{กรุ}} <span style="color:red;">สรุป: เนื่องจากไม่มีจำนวนอาสาสมัครลงนามเพียงพอตามเกณฑ์พิจารณา จึงส่งเรื่องคืนให้วิกิมีเดียประเทศไทยพิจารณาแนวทางการจัดกิจกรรมเพื่อเฉลิมฉลองอื่นตามสมควรต่อไป หากจะจัดกิจกรรมใดแล้ว วิกิมีเดียประเทศไทยจะได้เรียนแจ้งให้ทราบในโอกาสต่อไป ขอขอบคุณอาสาสมัครทุกท่านที่ร่วมเสนอแนะความคิดเห็น ณ โอกาสนี้ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 15:57, 28 ธันวาคม 2568 (+07)</span> [[ไฟล์:WP25-TH-Full colour 01.svg|200px|frameless|center]] ด้วย[[meta:Wikipedia 25|วิกิพีเดียจะมีอายุครบ 25 ปี]] (นับแต่วันก่อตั้ง) ในวันที่ 15 มกราคม พ.ศ. 2569 จึงขอเรียนเชิญอาสาสมัครวิกิพีเดียภาษาไทยร่วมกันเป็นส่วนหนึ่งในการจัดกิจกรรมเฉลิมฉลองในโอกาสดังกล่าว ดังนี้ * เสนอแนะกิจกรรมที่อยากให้จัดและคำแนะนำต่าง ๆ (ร่วมทั้งลงคะแนนเสียงเห็นด้วย/ไม่เห็นด้วย) * เสนอตัวเองเป็นอาสาสมัครจัดกิจกรรม มูลนิธิวิกิมีเดียและวิกิมีเดียประเทศไทย[[#การสนับสนุนจากมูลนิธิวิกิมีเดียและวิกิมีเดียประเทศไทย|จะให้การสนับสนุน]]ทุนในการจัดกิจกรรมและทรัพยากรในการเฉลิมฉลองโอกาสสำคัญนี้ เพียง'''ขอให้กล้า!''' == เกณฑ์การพิจารณาดำเนินการกิจกรรม == * เกณฑ์เชิงปริมาณ ณ วันที่ 9 พฤศจิกายน พ.ศ. 2568 ** มีผู้สนับสนุนไม่น้อยกว่า 5 คน ** มีอาสาสมัครผู้จัดไม่น้อยกว่าจำนวนที่กำหนด คือ *** กิจกรรมออนไลน์ 2 คน *** กิจกรรมในสถานที่ฯ (ออนไซต์) และกิจกรรมผสมผสาน 3 คน * เกณฑ์เชิงคุณภาพ ** มีความคุ้มค่าต่องบประมาณที่ลงทุน ** สร้างแรงกระทบต่อชุมชนวิกิพีเดียโดยรวมได้ == กิจกรรมออนไลน์ == {| class="wikitable" |+ กิจกรรมออนไลน์ |- ! กิจกรรมพร้อมรายละเอียด ! ความเห็น ! ประสงค์เป็นผู้จัด |- style="vertical-align: top;" | * '''กิจกรรมตอบปัญหา'''แนวรายการ[[w:th:แฟนพันธุ์แท้|แฟนพันธุ์แท้]]บนดิสคอร์ดชุมชนวิกิมีเดียภาษาไทย (15 มกราคม พ.ศ. 2569 หรือวันที่ใกล้เคียง) --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) | * {{เห็นด้วย}} ใช้ต้นทุนน้อย สร้าง engagement และมีทรัพยากรบุคคลที่ดีอย่าง {{ตอบถึง|Tvcccp}} ชำนาญในเรื่องนี้ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Tvcccp|Tvcccp]] ([[คุยกับผู้ใช้:Tvcccp|คุย]]) 22:08, 19 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Ddjingjing|Ddjingjing]] ([[คุยกับผู้ใช้:Ddjingjing|คุย]]) 07:42, 31 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Waniosa Amedestir|Waniosa Amedestir]] ([[คุยกับผู้ใช้:Waniosa Amedestir|คุย]]) 18:01, 9 พฤศจิกายน 2568 (+07) | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}} ได้เสมอแต่มาคุยกันก่อน ไม่อยู่ในประเทศไทยประมาณเดือนเมษายนเป็นต้นไปครับ [[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) |- style="vertical-align: top;" | * '''กิจกรรมสนับสนุน[[w:th:วิกิพีเดีย:วันนี้ในอดีต|บทความวันนี้ในอดีต]]''' (ไตรมาสแรก พ.ศ. 2569) --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) | * {{เห็นด้วย}} ภาคต่อบทความรู้ไหมว่าและบทความแนะนำ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:บุญพฤทธิ์ ทวนทัย|บุญพฤทธิ์ ทวนทัย]] ([[คุยกับผู้ใช้:บุญพฤทธิ์ ทวนทัย|คุย]]) 16:35, 21 ตุลาคม 2568 (+07) * {{เห็นด้วย}}--[[ผู้ใช้:Angkun-ane|Angkun-ane]] ([[คุยกับผู้ใช้:Angkun-ane|คุย]]) 16:47, 21 ตุลาคม 2568 (+07) *{{เห็นด้วย}} --[[ผู้ใช้:JustRandomThai|JustRandomThai]] ([[คุยกับผู้ใช้:JustRandomThai|คุย]]) 10:53, 22 ตุลาคม 2568 (+07) *{{เห็นด้วย}} — [[ผู้ใช้:PolaX3|<span style="color: darkgreen">Pola</span><span style="color: darkred">X</span><span style="color: darkgreen">3</span>]] [[คุยกับผู้ใช้:PolaX3|💬]]|[[พิเศษ:เรื่องที่เขียน/PolaX3|📝]] 22:37, 22 ตุลาคม 2568 (+07) *{{เห็นด้วย}} --[[ผู้ใช้:Ddjingjing|Ddjingjing]] ([[คุยกับผู้ใช้:Ddjingjing|คุย]]) 07:42, 31 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Waniosa Amedestir|Waniosa Amedestir]] ([[คุยกับผู้ใช้:Waniosa Amedestir|คุย]]) 18:01, 9 พฤศจิกายน 2568 (+07) | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}} ได้เสมอแต่มาคุยกันก่อน ไม่อยู่ในประเทศไทยประมาณเดือนเมษายนเป็นต้นไปครับ [[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) |- style="vertical-align: top;" | * '''กิจกรรมหา[[meta:Wikipedia 25/Easter egg experiments|ไข่อีสเตอร์]]''' (15 มกราคม - 15 กุมภาพันธ์ พ.ศ. 2569) --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 20:56, 22 ตุลาคม 2568 (+07) | * {{เห็นด้วย}} น่าจะสนุกแน่นอน / รับทราบเรื่องนี้จาก staff ของ WMF ซึ่งน่าสนใจมาก โดยเน้นย้ำว่าไม่บดบังเหนือซ่อนเร้นเนื้อหาใดและไม่ใช้คุกกี้มากกว่าที่เคยใช้แน่นอน แต่ต้องขอแรงสนับสนุนจากชุมชนเพื่อแจ้งต่อ WMF ต่อไป --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 20:56, 22 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Tvcccp|Tvcccp]] ([[คุยกับผู้ใช้:Tvcccp|คุย]]) 11:16, 24 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:แอนเดอร์สัน|แอนเดอร์สัน]] ([[คุยกับผู้ใช้:แอนเดอร์สัน|คุย]]) 00:21, 31 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Ddjingjing|Ddjingjing]] ([[คุยกับผู้ใช้:Ddjingjing|คุย]]) 07:42, 31 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Siam2019|Siam2019]] ([[คุยกับผู้ใช้:Siam2019|คุย]]) 14:44, 1 พฤศจิกายน 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Waniosa Amedestir|Waniosa Amedestir]] ([[คุยกับผู้ใช้:Waniosa Amedestir|คุย]]) 18:01, 9 พฤศจิกายน 2568 (+07) | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}} รับเป็นผู้ประสานงานกับทาง WMF เพื่อให้ดำเนินงานได้ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 20:56, 22 ตุลาคม 2568 (+07) |- <!--คัดลอกบรรทัดนี้จนถึงบรรทัดที่ระบุเพื่อแนะนำกิจกรรมใหม่ --> style="vertical-align: top;" | * '''ตัวอย่างชื่อกิจกรรม''' แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki> | <!-- หากประสงค์จะแสดงความคิดเห็น โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย}} กรณีเห็นด้วย แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki> * {{ไม่เห็นด้วย}} กรณีไม่เห็นด้วย แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki> | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}} กรณีประสงค์เป็นอาสาสมัคร (กรุณาระบุข้อจำกัดด้วย) แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki><!--คัดลอกจนถึงบรรทัดนี้เพื่อแนะนำกิจกรรมใหม่ --> |} == กิจกรรมในสถานที่หนึ่งร่วมกัน (หรือกระจายตามภูมิภาค) == {| class="wikitable" |+ กิจกรรมในสถานที่หนึ่งร่วมกัน |- ! กิจกรรมพร้อมรายละเอียด ! ความเห็น ! ประสงค์เป็นผู้จัด |- style="vertical-align: top;" | * '''สัมมนา [[w:th:ปัญญาประดิษฐ์|AI]] vs วิกิพีเดีย''' (ภายในเดือนมกราคม พ.ศ. 2569) --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) | * {{เห็นด้วย}} โลก AI มาแรง ทุกวันนี้ตรวจทานบทความก็ขอ AI มาช่วย ต้องสัมมนาฟังคนเก่ง ๆ มาคุยกันครับ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) * {{เห็นด้วย}}--[[ผู้ใช้:Angkun-ane|Angkun-ane]] ([[คุยกับผู้ใช้:Angkun-ane|คุย]]) 16:47, 21 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Tvcccp|Tvcccp]] ([[คุยกับผู้ใช้:Tvcccp|คุย]]) 06:29, 26 ตุลาคม 2568 (+07) * {{เห็นด้วย}} -[[ผู้ใช้:Ddjingjing|Ddjingjing]] ([[คุยกับผู้ใช้:Ddjingjing|คุย]]) 07:48, 31 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Waniosa Amedestir|Waniosa Amedestir]] ([[คุยกับผู้ใช้:Waniosa Amedestir|คุย]]) 18:00, 9 พฤศจิกายน 2568 (+07) | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}} ได้จนถึงเมษายน เพราะจะไปเรียนต่อต่างประเทศครับ [[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) |- style="vertical-align: top;" | * '''เสวนานักเขียน vs นักอ่าน''' (ภายในเดือนมกราคม พ.ศ. 2569) --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) | * {{เห็นด้วย}} มาปรับทัศนคติทั้งคู่กันครับ 555555 // จริง ๆ คืออยากดูความเห็นของแต่ละฝ่ายว่ามีคาดหวังหรือต้องการอะไร จะได้หาแนวทางกันและกัน ทุกคนสมประโยชน์ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}} ได้จนถึงเมษายน เพราะจะไปเรียนต่อต่างประเทศครับ [[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) |- style="vertical-align: top;" | * '''Meetup and Photowalk''' (ภายในไตรมาสแรก) --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07) | * {{เห็นด้วย}} งานสเกลเล็ก วิกิมีเดียประเทศไทยมีประสบการณ์ และ {{ความคิด|เสนอว่าจัด 4 ภาค}}เพื่อให้มีโอกาสได้พบเจอกับอาสาสมัครหลาย ๆ ที่ เพิ่มเนื้อหาในวิกิพีเดีย และเปิดโอกาสทำประชาพิจารณ์แบบพบปะได้ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 20:57, 23 ตุลาคม 2568 (+07) * {{เห็นด้วย}} -[[ผู้ใช้:Ddjingjing|Ddjingjing]] ([[คุยกับผู้ใช้:Ddjingjing|คุย]]) 07:48, 31 ตุลาคม 2568 (+07) | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}} ได้จนถึงเมษายน เพราะจะไปเรียนต่อต่างประเทศครับ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 20:57, 23 ตุลาคม 2568 (+07) |- style="vertical-align: top;" | * '''Photowalk Nonthaburi: Wikipedia 25 Edition''' (ภายในธันวาคม 2568 - มกราคม 2569) --[[ผู้ใช้:Tvcccp|Tvcccp]] ([[คุยกับผู้ใช้:Tvcccp|คุย]]) 06:29, 26 ตุลาคม 2568 (+07) | <!-- หากประสงค์จะแสดงความคิดเห็น โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย}} เป็นงานสเกลเล็ก จากพิพิธภัณฑ์ราชทัณฑ์ กรมราชทัณฑ์ ถึงพิพิธภัณฑ์จังหวัดนนทบุรี (จัดครึ่งวัน) --[[ผู้ใช้:Tvcccp|Tvcccp]] ([[คุยกับผู้ใช้:Tvcccp|คุย]]) 06:29, 26 ตุลาคม 2568 (+07) * {{เห็นด้วย}} ของกินอร่อย เรื่องราวน่าสนใจ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 13:30, 28 ตุลาคม 2568 (+07) * {{เห็นด้วย}} ถ้ามีโอกาสก็อยากไปเยี่ยมชมสถานที่ดังกล่าวครับ -[[ผู้ใช้:Ddjingjing|Ddjingjing]] ([[คุยกับผู้ใช้:Ddjingjing|คุย]]) 07:48, 31 ตุลาคม 2568 (+07) * {{เห็นด้วย}} --[[ผู้ใช้:Waniosa Amedestir|Waniosa Amedestir]] ([[คุยกับผู้ใช้:Waniosa Amedestir|คุย]]) 18:00, 9 พฤศจิกายน 2568 (+07) | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}}ประสงค์ที่จะลงดูพื้นที่สถานที่ล่วงหน้าเพื่อเตรียมความพร้อมในเส้นทาง จุดพักและจุดนัดพบ --[[ผู้ใช้:Tvcccp|Tvcccp]] ([[คุยกับผู้ใช้:Tvcccp|คุย]]) 06:29, 26 ตุลาคม 2568 (+07) * {{เห็นด้วย|ยินดี}} เช่นเดียวกับที่ได้กล่าวไปก่อนหน้านี้ครับ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 13:30, 28 ตุลาคม 2568 (+07) |- <!--คัดลอกบรรทัดนี้จนถึงบรรทัดที่ระบุเพื่อแนะนำกิจกรรมใหม่ --> style="vertical-align: top;" | * '''ตัวอย่างชื่อกิจกรรม''' แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki> | <!-- หากประสงค์จะแสดงความคิดเห็น โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย}} กรณีเห็นด้วย แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki> * {{ไม่เห็นด้วย}} กรณีไม่เห็นด้วย แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki> | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}} กรณีประสงค์เป็นอาสาสมัคร (กรุณาระบุข้อจำกัดด้วย) แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki><!--คัดลอกจนถึงบรรทัดนี้เพื่อแนะนำกิจกรรมใหม่ --> |} == กิจกรรมผสมแบบออนไลน์และในพื้นที่ร่วมกัน ณ เวลาเดียวกัน (hybrid) == ในข้อนี้หมายถึงยุบออนไลน์และกิจกรรมในพื้นที่มาไว้รวมกัน อย่างที่เคยเห็นในการประชุมช่วงโควิด มักจัดในสถานที่มีความพร้อมทางเทคนิคและใช้บุคลากรที่มีความเชี่ยวชาญ (มีต้นทุนสูง) หากไม่พร้อมหรือไม่เชี่ยวชาญมักจะเกิดปัญหาติดขัดดูไม่เป็นมืออาชีพ ในเบื้องต้นเฉพาะสำหรับงานนี้ด้วยทรัพยากรที่มีอยู่ ผมไม่เห็นด้วยให้ทำ hybrid เพราะว่ายังไม่พร้อมหรือยังไม่คุ้ม เสนอให้ดำเนินการได้ทั้งสองอย่างข้างต้นแยกกัน (หรือให้คนที่ไม่เข้ามาร่วมอัดเทปมาเสนอได้ในงานในพื้นที่) หรือ เลือกจัดเพียงวิธีเดียวไปก่อนก็ได้ตามความเหมาะสม ป.ล. ได้เสนอความเห็นนี้ปากเปล่าไปแล้ว เสนออีกครั้งในรูปแบบข้อความให้ชัดเจนอีกครั้งเพื่อเป็นหลักฐาน ยินดีรับความคิดเห็นต่าง รวมทั้งอาสาสมัครหรือผู้สนับสนุนที่จะทำให้ hybrid เป็นจริงได้ --[[ผู้ใช้:Taweetham|Taweetham]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 07:30, 23 ตุลาคม 2568 (+07) :รับทราบและขอบคุณสำหรับความเห็นครับ {{เห็นด้วย}} ในแง่ที่จะควรแยกกันด้วยข้อจำกัดหลายประการ ผมขออนุญาตจัดทำตารางส่วนของกิจกรรม hybrid ด้านล่างนี้เพื่อเปิดโอกาสให้ได้เสนอกันครับ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 20:50, 23 ตุลาคม 2568 (+07) {| class="wikitable" |+ กิจกรรมแบบผสม |- ! กิจกรรมพร้อมรายละเอียด ! ความเห็น ! ประสงค์เป็นผู้จัด |- <!--คัดลอกบรรทัดนี้จนถึงบรรทัดที่ระบุเพื่อแนะนำกิจกรรมใหม่ --> style="vertical-align: top;" | * '''ตัวอย่างชื่อกิจกรรม''' แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki> | <!-- หากประสงค์จะแสดงความคิดเห็น โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย}} กรณีเห็นด้วย แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki> * {{ไม่เห็นด้วย}} กรณีไม่เห็นด้วย แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki> | <!-- หากประสงค์เป็นอาสาสมัครจัดกิจกรรม โปรดลงชื่อช่องนี้ --> * {{เห็นด้วย|ยินดี}} กรณีประสงค์เป็นอาสาสมัคร (กรุณาระบุข้อจำกัดด้วย) แล้วลงชื่อด้วย <nowiki>--~~~~</nowiki><!--คัดลอกจนถึงบรรทัดนี้เพื่อแนะนำกิจกรรมใหม่ --> |} == ความคิดเห็นภาพรวม == # เป็นโอกาสอันดีที่จะทำให้เกิดผลกระทบและแรงกระเพื่อมให้ชุมชนอาสาสมัครในประเทศไทยรวมถึง movement ในระดับนานาชาติได้ ประเด็นสำคัญคือ 1. หาอาสาสมัครเพิ่ม 2. พัฒนาอาสาสมัครเดิมให้เข้มแข็ง และ 3.หาโอกาสพัฒนาการใช้งานโครงการของวิกิมีเดียให้มากขึ้นหรือในรูปแบบที่แตกต่างออกไปตามยุคสมัย (ยุค AI) --[[ผู้ใช้:Taweetham|Taweetham]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 20:03, 20 ตุลาคม 2568 (+07) # เพื่อไม่ให้เป็น[[:w:th:การนำกระดิ่งไปแขวนคอแมว|การนำกระดิ่งไปแขวนคอแมว]] อยากให้ทุกท่านที่ลงชื่อสนับสนุนกิจกรรมระบุให้ชัดเจนเลยว่ายินดีอาสาลงแรงในกิจกรรมนั้นด้วยมากน้อยอย่างไร --[[ผู้ใช้:Taweetham|Taweetham]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 20:03, 20 ตุลาคม 2568 (+07) # ในกรณีทรัพยากรไม่เพียงพอสำหรับทุกกิจกรรม (ไม่ได้หมายถึงเงินอย่างเดียว แต่หมายถึงคนอาสาสมัคร เวลา/โอกาส หรือพื้นที่) จะให้ลำดับความสำคัญของกิจกรรมใด ณ ช่องทางหรือสถานที่ใดมาก่อน หากท่านลงชื่อทุกกิจกรรมน่าจะมีลำดับความสำคัญได้ (เช่น เอากิจกรรมในลักษณะ hybrid ไว้ลำดับความสำคัญแรกสุดหรือท้ายสุด เนื่องจากแต่ละคนมองความยากง่ายของการจัด hybrid ไม่เหมือนกันควรจะแถลงออกมาให้ชัดเจน) --[[ผู้ใช้:Taweetham|Taweetham]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 20:03, 20 ตุลาคม 2568 (+07) #:ขอขอบคุณสำหรับคำแนะนำนะครับ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 15:28, 21 ตุลาคม 2568 (+07) #:: {{ping|Wutkh}} ดูน่ากังวลว่าการมีส่วนร่วมจากที่ลงชื่อด้านบนยังค่อนข้างน้อย และยังไม่มีอาสาสมัครท่านอื่นลงชื่อเป็นผู้จัดร่วมด้วยเลยนะครับ เสนอว่า ก. อาจจะต้องยุบเหลือออนไลน์อย่างเดียวหากไม่มีผู้ลงชื่อถึงจำนวนที่คาดหมาย และ ข. สื่อสารประชาสัมพันธ์ไปให้ทราบทั่วกันว่าจะตั้งเป้าคนลงชื่อที่จำนวนขั้นต่ำ x ภายในวันที่ y เพื่อให้การจัดกิจกรรมดำเนินต่อไปได้ --[[ผู้ใช้:Taweetham|Taweetham]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 10:37, 30 ตุลาคม 2568 (+07) #:::{{ตอบถึง|Taweetham}} ขอบคุณครับ คงขอขยายเวลาไปอีก 1 สัปดาห์ ทำโฆษณาแบบเจาะกลุ่มเป้าหมาย และจำกัดกิจกรรมไปที่ที่มีอาสาสมัครผู้จัดมากกว่า 2 ท่านเป็นหลักครับ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 17:58, 30 ตุลาคม 2568 (+07) == คำแนะนำ == * ท่านสามารถแสดงความคิดเห็นหรือเสนอตัวโดยการแก้ไขหน้านี้ได้โดยเสรีและเป็นไปตาม[[w:th:WP:5P|ห้าเสาหลัก]] และขอความร่วมมือให้ลงชื่อทุกครั้งโดยการพิมพ์ <nowiki>--~~~~</nowiki> ต่อท้ายข้อความเสมอ * เพื่อความสะดวกและความเป็นระเบียบเรียบร้อย อาจพิจารณาใช้แม่แบบด้านล่างนี้เพื่อประกอบความคิดเห็นของท่าน === รวมแม่แบบความคิดเห็น === * {{Tl|เห็นด้วย}} - {{เห็นด้วย}} * {{Tl|เป็นกลาง}} - {{เป็นกลาง}} * {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}} * {{Tl|สำเร็จ}} - {{สำเร็จ}} * {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}} * {{Tl|ถาม}} - {{ถาม}} * {{Tl|ตอบ}} - {{ตอบ}} * {{Tl|ความคิด}} - {{ความคิด}} * {{Tl|ความเห็น}} - {{ความเห็น}} == การสนับสนุนจากมูลนิธิวิกิมีเดียและวิกิมีเดียประเทศไทย == ในโอกาสอันสำคัญนี้ มูลนิธิวิกิมีเดียและวิกิมีเดียประเทศไทยยินดีให้การสนับสนุนงบประมาณและทรัพยากรต่าง ๆ ตามสมควร โดยผู้ที่ประสงค์จะขอทุนสนับสนุนจากมูลนิธิวิกิมีเดียสามารถศึกษารายละเอียดเพิ่มเติมได้ที่[[meta:Wikipedia 25/Grants|เมทาวิกิ]] โดยรอบการขอทุนรอบที่หนึ่ง<span style="color:red;">จะสิ้นสุดลงในวันที่ 1 พฤศจิกายน พ.ศ. 2568</span> {{Ping|Wutkh}} จะเป็นอาสาสมัครที่ให้ผู้ประสานงานหลักเบื้องต้นสำหรับการติดต่อระหว่างวิกิมีเดียประเทศไทยกับอาสาสมัครในเรื่องนี้ ltu0hmkdffvz9x4m0ka3a1frk02th5j วิกิมีเดียประเทศไทย:กิจกรรม 4 57 167 2025-10-24T13:49:47Z Wutkh 9 สร้างหน้าด้วย "{{Header}} == กิจกรรมในขณะนี้ == * 19 ตุลาคม — อภิปรายการจัดกิจกรรม [[25 ปีวิกิพีเดีย]] (อภิปรายถึง 2 พฤศจิกายน พ.ศ. 2568) * 1 ตุลาคม — เริ่มกิจกรรม [[m:Wikimedia Thailand/GLAM–Museum 2025|GLAM–Museum 2025]] (ปิดรับบทความ 31 ธัน..." 167 wikitext text/x-wiki {{Header}} == กิจกรรมในขณะนี้ == * 19 ตุลาคม — อภิปรายการจัดกิจกรรม [[25 ปีวิกิพีเดีย]] (อภิปรายถึง 2 พฤศจิกายน พ.ศ. 2568) * 1 ตุลาคม — เริ่มกิจกรรม [[m:Wikimedia Thailand/GLAM–Museum 2025|GLAM–Museum 2025]] (ปิดรับบทความ 31 ธันวาคม 2568) * 10 กันยายน — เปิดรับสมัคร[[wikimania:2026:Scholarships|ทุนเดินทางวิกิเมเนีย 2026]] (ปิดรับสมัคร 31 ตุลาคม 2568) == กิจกรรมที่ผ่านมา == โปรดดูเพิ่มเติม[[วิกิมีเดียประเทศไทย:เส้นเวลา]] 94ort9ezzesky60dof146913xaje889 25 ปีวิกิพีเดีย/ปฏิทิน 0 59 433 432 2025-12-14T09:46:07Z Taweetham 7 /* รูปแบบปฏิทิน */ 433 wikitext text/x-wiki [[ไฟล์:WP25-TH-Full colour 01.svg|200px|frameless|center]] เนื่องในวาระดิถึขึ้นปีใหม่ พ.ศ. 2569 วิกิมีเดียประเทศไทยได้สนับสนุนปฏิทินตั้งโต๊ะขนาด 6" × 8" แก่อาสาสมัครในชุมชนวิกิพีเดียและโครงการพี่น้องภาษาไทยรวมถึงภาคส่วนที่เกี่ยวเนื่องกัน จึงขอเรียนเชิญทุกท่านโปรดลงชื่อเพื่อแสดงความจำนงขอรับปฏิทินจัดส่งถึงที่อยู่ในประเทศไทยโดยไม่มีค่าใช้จ่ายใด ๆ ทั้งสิ้น ตั้งแต่บัดนี้ถึงวันอาทิตย์ที่ 30 พฤศจิกายน พ.ศ. 2568 (23:59 น. UTC+7) ที่ด้านล่างของหน้านี้ ทั้งนี้ เรายินดีเป็นอย่างยิ่งที่ท่านจะได้สร้างกัลยาณมิตรและเครือข่ายให้แก่ตัวท่านเองและวิกิมีเดียประเทศไทยด้วยการใช้ปฏิทินเป็นสื่อกลาง เนื่องจากปฏิทินผลิตจำนวนจำกัดในโอกาสเฉลิมฉลองครบรอบ 25 ปีวิกิพีเดีย ตามประมาณการเบื้องต้นขอจำกัดจำนวนผู้ลงชื่อไม่เกิน 50 ท่าน ท่านละไม่เกิน 5 เล่ม <small> * ท่านไม่สามารถรับปฏิทินด้วยตนเอง วิกิมีเดียประเทศไทยจะจัดส่งให้ท่านทางไปรษณีย์ไทยหรือขนส่งเอกชนเท่านั้น โดยใช้บริการระดับลงทะเบียนหรือเทียบเท่าที่สามารถตรวจสอบสถานะการจัดส่งได้ทางอินเทอร์เน็ต * กรณีที่มีผู้ลงชื่อเกิน 50 ท่าน จะพิจารณาจัดสรรตามความเหมาะสม แม้จะมีผู้ลงชื่อไม่เกิน 50 ท่าน ขอสงวนสิทธิ์จัดสรรให้มากหรือน้อยกว่าจำนวนที่ท่านแจ้งความประสงค์ดั้งเดิมด้วยเหตุผลทางการปฏิบัติการ * มิได้กีดกันการจัดส่งไปต่างประเทศแต่ต้องพิจารณาตามความจำเป็นและเหมาะสมให้รอบคอบ โดยเฉพาะต้องคำนึงถึงการปฏิบัติตามพิธีการศุลกากรของประเทศปลายทางและต้นทุนการจัดส่งด้วย </small> == ลงชื่อขอรับปฏิทิน == {{:25 ปีวิกิพีเดีย/ปฏิทิน/หน้าย่อย}} วิธีการลงชื่อ ให้ท่านลงชื่อด้วยการลงในจำนวนท่านต้องการ (จำกัดสูงสุดที่ 5 เล่มต่อท่าน) *เมื่อท่านแก้ไขด้วยเมนู "แก้ไขต้นฉบับ" (Text editor) ให้พิมพ์ <nowiki># ~~~~</nowiki> ที่บรรทัดใหม่ต่อจากคนล่าสุดในจำนวนที่ต้องการ *เมื่อท่านแก้ไขด้วยเมนู "แก้ไข" (Visual editor) แทรกลายเซ็นด้วยกดปุ่ม แทรก > ลายเซ็น ที่บรรทัดใหม่ต่อจากคนล่าสุดในจำนวนที่ต้องการ (ต้องมีเลขลำดับที่นำหน้าโดยการกดขึ้นบรรทัดใหม่จากท้ายคนก่อนหน้า) การลงชื่อจะสมบูรณ์เมื่อปรากฏลายเซ็นของท่าน (ค่าเริ่มต้น จะเป็นชื่อผู้ใช้ (คุย) ตามด้วยวันและเวลาที่ลงชื่อ) และสงวนสิทธิ์ให้ลงชื่อเฉพาะผู้ใช้ที่มีบัญชีผู้ใช้ของวิกิมีเดีย (วิกิพีเดียและโครงการพี่น้อง) เท่านั้น <small><small> ;1 เล่ม # [[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 10:44, 16 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Patsagorn Y.|Patsagorn Y.]] ([[คุยกับผู้ใช้:Patsagorn Y.|คุย]]) 16:16, 16 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Chainwit.|Chainwit.]] ([[คุยกับผู้ใช้:Chainwit.|คุย]]) 16:28, 16 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:วณิพก|วณิพก]] ([[คุยกับผู้ใช้:วณิพก|คุย]]) 15:03, 17 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Guntipet|Guntipet]] ([[คุยกับผู้ใช้:Guntipet|คุย]]) 21:12, 18 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:ไทๆ|ไทๆ]] ([[คุยกับผู้ใช้:ไทๆ|คุย]]) 05:15, 20 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Sawasdeeee|Sawasdeeee]] ([[คุยกับผู้ใช้:Sawasdeeee|คุย]]) 19:55, 20 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Supphachoke Sukjamlong|Supphachoke Sukjamlong]] ([[คุยกับผู้ใช้:Supphachoke Sukjamlong|คุย]]) 22:47, 20 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:NiratLover|NiratLover]] ([[คุยกับผู้ใช้:NiratLover|คุย]]) 00:00, 21 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:PPichit|PPichit]] ([[คุยกับผู้ใช้:PPichit|คุย]]) 13:38, 24 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Waniosa Amedestir|Waniosa Amedestir]] ([[คุยกับผู้ใช้:Waniosa Amedestir|คุย]]) 13:21, 28 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:GinkoLusitania|GinkoLusitania]] ([[คุยกับผู้ใช้:GinkoLusitania|คุย]]) 13:28, 28 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Minener&#39;s|Minener&#39;s]] ([[คุยกับผู้ใช้:Minener&#39;s|คุย]]) 21:29, 30 พฤศจิกายน 2568 (+07) ;2 เล่ม # [[ผู้ใช้:Tvcccp|Tvcccp]] ([[คุยกับผู้ใช้:Tvcccp|คุย]]) 11:24, 16 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Kaojinapong|Kaojinapong]] ([[คุยกับผู้ใช้:Kaojinapong|คุย]]) 12:25, 16 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Poonpun2016|Poonpun2016]] ([[คุยกับผู้ใช้:Poonpun2016|คุย]]) 20:49, 16 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Just Sayori|Just Sayori]] ([[คุยกับผู้ใช้:Just Sayori|คุย]]) 22:01, 16 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:ร้อยตรี โชคดี|ร้อยตรี โชคดี]] ([[คุยกับผู้ใช้:ร้อยตรี โชคดี|คุย]]) 00:25, 19 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:JustRandomThai|Thailand2763]] ([[คุยกับผู้ใช้:JustRandomThai|Talk?]]) 08:33, 19 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:แอนเดอร์สัน|แอนเดอร์สัน]] ([[คุยกับผู้ใช้:แอนเดอร์สัน|คุย]]) 23:05, 25 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Bank0303|Bank0303]] ([[คุยกับผู้ใช้:Bank0303|คุย]]) 13:15, 27 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Jothefiredragon|Jothefiredragon]] ([[คุยกับผู้ใช้:Jothefiredragon|คุย]]) 19:46, 27 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Ekminarin|Ekminarin]] ([[คุยกับผู้ใช้:Ekminarin|คุย]]) 12:57, 29 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:Siam2019|Siam2019]] ([[คุยกับผู้ใช้:Siam2019|คุย]]) 14:20, 29 พฤศจิกายน 2568 (+07) ;3 เล่ม # [[ผู้ใช้:Edigines|Edigines]] ([[คุยกับผู้ใช้:Edigines|คุย]]) 02:29, 30 พฤศจิกายน 2568 (+07) ;4 เล่ม # ;5 เล่ม # [[ผู้ใช้:Tadano Earth|Tadano Earth]] ([[คุยกับผู้ใช้:Tadano Earth|คุย]]) 06:40, 24 พฤศจิกายน 2568 (+07) # [[ผู้ใช้:PloveShin|PloveShin]] ([[คุยกับผู้ใช้:PloveShin|คุย]]) 13:49, 28 พฤศจิกายน 2568 (+07) </small></small> == การจัดสรร == ภายในวันที่ 3 ธันวาคม พ.ศ. 2568 โปรดตรวจสอบรายชื่อการจัดสรรปฏิทินที่หน้านี้อีกครั้ง * โปรดเปิดรับวิกิเมล เราจะส่งลิงก์ให้ท่านทางอีเมลเท่านั้น * สรุปรายชื่อผู้รับการจัดสรรจะมีสถานะดังตารางด้านล่างนี้ โดยท่านจะต้องยืนยันสิทธิ์โดยการแจ้งข้อมูลการจัดส่ง (ชื่อและที่อยู่ของผู้รับ สำหรับขนส่งเอกชนอาจต้องใช้หมายเลขโทรศัพท์ด้วย รวมถึงตอบ[[25 ปีวิกิพีเดีย/ปฏิทิน/แบบสำรวจ|แบบสำรวจ]]เกี่ยวกับของที่ระลึกที่ผลิตโดย WMTH) ภายใน 7 ธันวาคม พ.ศ. 2568 เวลา 12:00 น. (เที่ยงวัน UTC+7) หากมีผู้ไม่ยืนยันสิทธิ์ในเวลาที่กำหนดบางท่านอาจได้รับเล่มมากกว่าที่จัดสรรเบื้องต้นเนื่องจากปฏิทิน พ.ศ. 2569 เป็น ''perishable inventory'' ที่ต้องแจกจ่ายในเวลาจำกัด (ก่อนสิ้น พ.ศ. 2568) ;ตารางสถานะการจัดสรร {{:25 ปีวิกิพีเดีย/ปฏิทิน/สถานะ}} ;แจ้งเพื่อโปรดทราบ {{Ping|Wutkh|Patsagorn Y.|Chainwit.|วณิพก|Guntipet|ไทๆ|Sawasdeeee|Supphachoke Sukjamlong|NiratLover|PPichit|Waniosa Amedestir|GinkoLusitania|Minener's|Tvcccp|Kaojinapong|Just Sayori|ร้อยตรี โชคดี|JustRandomThai|แอนเดอร์สัน|Bank0303|Jothefiredragon|Ekminarin|Siam2019|Edigines|Tadano Earth|PloveShin}} วิกิมีเดียประเทศไทยได้แจ้งพัสดุให้ท่านทราบทางอีเมลที่ท่านแจ้งแล้ว โปรดสอบสอบกล่องขาเข้า (inbox) หรือกล่องขาเข้าของจดหมายขยะ (junk/spam) ในกรณีที่ใช้ Gmail หรือมีการรักษาความปลอดภัยของอีเมลบางประการ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 15:45, 8 ธันวาคม 2568 (+07) == รูปแบบปฏิทิน == [[ไฟล์:Calendar 2026 (create outline) from Wikimedia Thailand.pdf|thumb|center|ปฏิทินจากวิกิมีเดียประเทศไทย ประจำ พ.ศ. 2569]] ปฏิทินจากวิกิมีเดียประเทศไทย ประจำ พ.ศ. 2569 เป็นปฏิทินตั้งโต๊ะขนาด 6" × 8" ออกแบบโดยใช้กราฟิกจาก[[meta:Wikipedia 25|การเฉลิมฉลองครบรอบ 25 ปีวิกิพีเดีย]]ที่เป็นรูปจิ๊กซอว์ โดยแต่ละเดือนแสดงถึงวิกิพีเดีย โครงการพี่น้อง วิกิเมเนีย และวิกิมีเดียประเทศไทย โดยเลือกสรรบทความหรือองค์ประกอบอันเกี่ยวเนื่องกับ[[th:w:สมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ พระบรมราชชนนีพันปีหลวง|สมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ พระบรมราชชนนีพันปีหลวง]] เพื่อน้อมรำลึกในพระมหากรุณาธิคุณ ตั้งแต่เดือนมกราคมจนถึงเดือนตุลาคม และสงวนสองเดือนหลังสำหรับ[[:th:w:กลุ่มขับเคลื่อนวิกิมีเดีย|กลุ่มขับเคลื่อนวิกิมีเดีย]]ในประเทศไทย ทั้งนี้ภาพประกอบได้เลือกให้มีความหลากหลายในแง่ของอาสาสมัครผู้บันทึกหรือจัดทำภาพนั้น ดังนี้ {| class="wikitable" |+ ปฏิทินวิกิมีเดียประเทศไทย พ.ศ. ๒๕๖๙ |- ! เดือน !! โครงการ !! บทความ !! รายละเอียด |- | มกราคม || [[:th:w:วิกิพีเดีย:บทความคัดสรร|บทความคัดสรร]][[:th:w:วิกิพีเดีย|วิกิพีเดีย]] || '''[[:th:w:วัดพระศรีรัตนศาสดาราม|วัดพระศรีรัตนศาสดาราม]]''' || วัดในรั้วเขตพระบรมมหาราชวัง ซึ่งสมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ พระบรมราชชนนีพันปีหลวงเสร็จมาประกอบพระราชพิธีต่าง ๆ โดยเสด็จพระบาทสมเด็จพระเจ้าอยู่หัว รัชกาลที่ ๙ จนทรงพระประชวรที่คณะแพทย์ถวายคำแนะนำให้งดทรงงาน |- | กุมภาพันธ์ || [[:th:w:วิกิพีเดีย:บทความแนะนำ|บทความแนะนำ]]วิกิพีเดีย || '''[[:th:w:พระเมรุมาศ|พระเมรุมาศ]]''' || งานสถาปัตยกรรมในพระราชพิธีถวายพระเพลิงพระบรมศพ ส่วนหนึ่งของ[[:th:w:การสวรรคตของสมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ พระบรมราชชนนีพันปีหลวง|การสวรรคตของสมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ พระบรมราชชนนีพันปีหลวง]] |- | มีนาคม || [[:th:w:วิกิพีเดีย:บทความคุณภาพ|บทความคุณภาพ]]วิกิพีเดีย || '''[[:th:w:เรือหลวงจักรีนฤเบศร|เรือหลวงจักรีนฤเบศร]]''' || สมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ พระบรมราชชนนีพันปีหลวงเสด็จไปทรงประกอบพิธีปล่อยเรือลงน้ำเมื่อ พ.ศ. 2539 |- | เมษายน || [[:w:th:วิกิพจนานุกรม|วิกิพจนานุกรม]] || '''[[:wiktionary:th:แม่ทัพ|แม่ทัพ]]''' || เป็นลูกคำของคำว่า "[[:wiktionary:th:แม่|แม่]]" ในฐานะทรงเป็น "แม่แห่งแผ่นดิน" และเข้ากับบริบทบ้านเมืองที่อยู่ท่ามกลาง[[:w:th:วิกฤตการณ์ชายแดนไทย–กัมพูชา พ.ศ. 2568|ความขัดแย้งกับประเทศเพื่อนบ้าน]]จนต้อง[[:w:th:เหตุปะทะไทย–กัมพูชา พ.ศ. 2568|ใช้กำลังทหาร]] |- | พฤษภาคม || [[:w:th:วิกิคำคม|วิกิคำคม]] || '''[[:wikiquote:th:ธงไชย แมคอินไตย์|ธงไชย แมคอินไตย์]]''' || นักร้องที่มีชื่อเสียงมากในประเทศไทย ขับร้องบทเพลงเทิดพระเกียรติในหลายโอกาส และมีคำคมที่กล่าวถึงบุพการี (เช่นเดียวกับเดือนเมษายน) |- | มิถุนายน || [[:w:th:วิกิซอร์ซ|วิกิซอร์ซ]] || '''[[:wikisource:th:หนังสือสัญญากรุงเทพมหานครกับกรุงอังกริษเปนทางไมตรีค้าขายกัน/ส่วนที่_1|หนังสือสัญญากรุงเทพมหานครกับกรุงอังกริษเปนทางไมตรีค้าขายกัน]]''' (สนธิสัญญาเบาว์ริง) || สมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ พระบรมราชชนนีพันปีหลวงทรงมีพระราชเสาวนีย์ให้มีการศึกษาประวัติศาสตร์ชาติไทย |- | กรกฎาคม || [[:w:th:วิกิมีเดียคอมมอนส์|วิกิมีเดียคอมมอนส์]] || '''[[:commons:Category:Bang Pa In Royal Palace|พระราชวังบางปะอิน]]''' || มีประวัติศาสตร์ยาวนานนับแต่สมัยอยุธยา (เช่นเดียวกับเดือนมิถุนายน) |- | สิงหาคม || [[:w:th:วิกิสปีชีส์|วิกิสปีชีส์]] || '''''[[:species:Mussaenda philippica|Mussaenda philippica]]''''' (ดอนญ่า) || มีสายพันธุ์ย่อย "Queen Sirikit" (ดูเพิ่มในบทความ[[:w:th:ดอนญ่าควีนสิริกิติ์|ดอนญ่าควีนสิริกิติ์]]บนวิกิพีเดียภาษาไทย) |- | กันยายน || [[:w:th:วิกิตำรา|วิกิตำรา]] || '''[[:wikibooks:th:ภาษาไทย/ภาคผนวก/คำที่มักเขียนผิด|คำที่มักเขียนผิดในภาษาไทย]]''' แสดงเฉพาะคำ "[[:w:th:ทศกัณฐ์|ทศกัณฐ์]]" || ตัวละครจาก[[:w:th:รามเกียรติ์|รามเกียรติ์]]อันเป็นบทละครที่แสดงในโขน[[:w:th:มูลนิธิส่งเสริมศิลปาชีพ ในสมเด็จพระบรมราชชนนีพันปีหลวง|มูลนิธิส่งเสริมศิลปาชีพ ในสมเด็จพระบรมราชชนนีพันปีหลวง]] |- | ตุลาคม || [[:w:th:วิกิสนเทศ|วิกิสนเทศ]] || '''[[wikidata:Q64691173|ชุดไทยอัมรินทร์]]''' || หนึ่งในชุดไทยพระราชนิยมที่สมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ พระบรมราชชนนีพันปีหลวงทรงพระกรุณาโปรดฯ ให้จัดทำขึ้นเป็นชุดประจำชาติ โดยเลือกภาพเมื่อครั้ง[[:w:th:พระราชพิธีพระราชทานเพลิงพระศพสมเด็จเจ้าฟ้าฯ กรมพระนราธิวาสราชนครินทร์ บดินทรเชษฐภคินี|พระราชพิธีพระราชทานเพลิงพระศพสมเด็จเจ้าฟ้าฯ กรมพระนราธิวาสราชนครินทร์ บดินทรเชษฐภคินี]] ให้สอดคล้องกับการคาดการณ์พระราชพิธีถวายพระเพลิงพระบรมศพสมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ พระบรมราชชนนีพันปีหลวง |- | พฤศจิกายน || [[:w:th:วิกิเมเนีย|วิกิเมเนีย]] || '''[[:wikimania:2026|วิกิเมเนีย 2026]]''' || งานพบปะที่ใหญ่ที่สุดของกลุ่มขับเคลื่อนวิกิมีเดีย |- | ธันวาคม || วิกิมีเดียประเทศไทย || '''วิกิมีเดียประเทศไทย''' || องค์กรสาขาของกลุ่มขับเคลื่อนวิกิมีเดียในประเทศไทย |} <small> ; ผิดตกแก้ไข * erratum หน้าสุดท้าย ๒๕๖๙ 2026 -> ๒๕๗๐ 2027 (รวมถึงแก้ไขลูกศรชี้ให้สอดคล้องกับปีที่ติดกัน) * erratum หน้า 24 Wikimania 2025 talk by James Forrester.jpg, Sdkb, CC BY-SA 4.0 -> Wikimania 2025 Participants 31.jpg, Guillermo Carlos Gómez, CC BY-SA 4.0 * addendum รอประกาศวันพืชมงคลสำหรับ พ.ศ. ๒๕๖๙ และวันหยุดพิเศษ (ถ้ามี) [https://www.thaipbs.or.th/program/clip/watch/jj7mx1matoiu] ; น้ำหนักและการจัดส่ง ปฏิทินมีน้ำหนักสุทธิต่อเล่ม 202 กรัม ไม่รวมหีบห่อ * จัดส่งตามจำนวนที่ร้องขอหากไม่ยินดีรับเพิ่ม หรือ * จัดส่งประมาณสองเท่าของจำนวนที่ร้องขอตามพิกัดการขนส่ง (หากไม่เลือกขนส่งจะใช้วิธีการที่ถูกที่สุดตามพิกัดดังรายการด้านล่างซึ่งพิจารณาน้ำหนักรวมหีบห่อ หากเลือกขนส่งจะจัดให้ตามที่แจ้งความจำนงมา) ** 1 เล่ม เหมาะสำหรับไปรษณีย์ไทย eCo-post 26 บาท หรือ ลงทะเบียน (พื้นที่พิเศษไม่บวกเพิ่มค่าส่ง) 30 บาท พิกัด 250 กรัม (สำหรับผู้ระบุ 1 เล่มโดยไม่รับเพิ่ม) ** 2 เล่ม เหมาะสำหรับไปรษณีย์ไทย eCo-post 30 บาท หรือ ลงทะเบียน (พื้นที่พิเศษไม่บวกเพิ่มค่าส่ง) 36 บาท หรือ ขนส่งเอกชน (ส่งกรุงเทพมหานครและปริมณฑล) 30* บาท พิกัด 500 กรัม ** 4 เล่มพร้อมหีบห่อ เหมาะสำหรับไปรษณีย์ไทย eCo-post (ส่งต่างจังหวัดทั่วไป) 40 บาท หรือ ลงทะเบียน (พื้นที่พิเศษไม่บวกเพิ่มค่าส่ง) 53 บาท หรือ ขนส่งเอกชน (ส่งกรุงเทพมหานครและปริมณฑล) 30* บาท พิกัด 1,000 กรัม ** 9 เล่มพร้อมหีบห่อ เหมาะสำหรับขนส่งเอกชน (ส่งกรุงเทพมหานครและปริมณฑล) 35* บาท (ส่งต่างจังหวัดทั่วไป) 45* บาท พิกัด 2,000 กรัม หมายเหตุ *เมื่อส่งจริงมีการเรียกเก็บ fuel surcharge เพิ่ม 2-3 บาท แต่ใช้ซองและวัสดุกันกระแทกได้ที่ร้านเลยไม่มีค่าใช้จ่ายเพิ่มเติม (ซองพลาสติกกันน้ำได้) # ดำเนินการส่งก่อนเที่ยง จันทร์ 8 ธันวาคม 2568 พร้อมแจ้งหมายเลขติดตามพัสดุรายบุคคลทุกราย # สถานะเช้าวันที่ 9 ธันวาคม 2568 (ก่อน 8:00 น.)/ ไปรษณีย์ไทยอยู่ที่ศูนย์คัดแยก 10010 - ศป.หลักสี่ / ขนส่งเอกชนจะนำส่งในวันที่ 9 ธันวาคม # สถานะเย็นวันที่ 9 ธันวาคม 2568 (ประมาณ 18:00 น.) / ไปรษณีย์ไทยยังคงอยู่ที่ศูนย์คัดแยก 10010 - ศป.หลักสี่ ยกเว้นรายหนึ่งที่กำลังเดินทางยังไปรษณีย์ปลายทางแล้วเนื่องจากอยู่ในเขตกรุงเทพฯ / ขนส่งเอกชนนำส่งสำเร็จแทบทั้งหมดแล้ว ยกเว้นรายหนึ่งที่ผู้จัดส่งยังไม่ติดต่อจัดส่งกับผู้รับ # สถานะเย็นวันที่ 10 ธันวาคม 2568 (ประมาณ 17:00 น.) / ไปรษณีย์ไทยสามารถจัดส่งพัสดุไปยังปลายทางในเขตกรุงเทพฯ และจังหวัดใกล้เคียง บางส่วนยังตกค้างในศูนย์คัดแยกหลักสี่ บางส่วนส่งออกไปยังศูนย์คัดแยกปลายทางหรือไปรษณีย์สาขาปลายทาง / ขนส่งเอกชนนำส่งสำเร็จทั้งหมดแล้ว # สถานะเย็นวันที่ 12 ธันวาคม 2568 (ประมาณ 18:00 น.) / ไปรษณีย์ไทยสามารถจัดส่งพัสดุไปยังปลายทางทุกพื้นที่แล้ว ยกเว้นรายหนึ่งที่ ปณท. ได้ออกใบนำจ่าย จึงได้ติดต่อผู้ใช้รายดังกล่าวให้ติดต่อกับ ปณท. เพื่อจัดการโดยตรง ;คำแนะนำเพิ่มเติม * พิจารณาจัดส่งโดยใช้ซองกันน้ำหรือห่อหุ้มภายในด้วยวัสดุกันน้ำ โดยเฉพาะปลายทางที่อยู่ในเขตฝนตก เนื่องจากมีผู้ได้รับพัสดุที่อยู่ในเขตพื้นที่ได้รับหย่อมกดอากาศต่ำ<ref>https://tmd.go.th/warning-and-events/warning-storm/%E0%B8%9D%E0%B8%99%E0%B8%95%E0%B8%81%E0%B8%AB%E0%B8%99%E0%B8%81%E0%B8%96%E0%B8%87%E0%B8%AB%E0%B8%99%E0%B8%81%E0%B8%A1%E0%B8%B2%E0%B8%81%E0%B8%9A%E0%B8%A3%E0%B9%80%E0%B8%A7%E0%B8%93%E0%B8%A0%E0%B8%B2%E0%B8%84%E0%B9%83%E0%B8%95-%E0%B9%81%E0%B8%A5%E0%B8%B0%E0%B8%84%E0%B8%A5%E0%B8%99%E0%B8%A5%E0%B8%A1%E0%B9%81%E0%B8%A3%E0%B8%87%E0%B8%9A%E0%B8%A3%E0%B9%80%E0%B8%A7%E0%B8%93%E0%B8%AD%E0%B8%B2%E0%B8%A7%E0%B9%84%E0%B8%97%E0%B8%A2-%E0%B8%A1%E0%B8%9C%E0%B8%A5%E0%B8%81%E0%B8%A3%E0%B8%B0%E0%B8%97%E0%B8%9A%E0%B8%88%E0%B8%99%E0%B8%96%E0%B8%87%E0%B8%A7%E0%B8%99%E0%B8%97-12-16-%E0%B8%98%E0%B8%99%E0%B8%A7%E0%B8%B2%E0%B8%84%E0%B8%A1-2568-%E0%B8%89%E0%B8%9A%E0%B8%9A%E0%B8%97-16-389-2568</ref>แจ้งว่าปฏิทินเปียกน้ำ * จัดพิมพ์ล่วงหน้าเป็นเวลานานขึ้น และให้ผู้ใช้ลงชื่อไว้ก่อนแล้วทำการเขียนบทความให้ถึงยอดที่กำหนดค่อยจัดส่งต่อไปเป็นรายเดือนเดือนละหนึ่งรอบ </small> imp1qbn58xrre9jna2h1puxhzp6t3ha 25 ปีวิกิพีเดีย/ปฏิทิน/หน้าย่อย 0 61 307 284 2025-11-24T04:45:44Z Taweetham 7 ตามลำดับที่พบได้บ่อย 307 wikitext text/x-wiki <div class="anonymous-show boilerplate metadata" style="background:#dee; border:1px solid #00c; margin:0.5em; padding:0.5em;; padding: 1em; width:70%">ขออภัย [[:w:th:WP:IP|ผู้ใช้ยังไม่มีบัญชีวิกิมีเดีย]]ไม่สามารถดำเนินการต่อได้เนื่องจากข้อจำกัดทางเทคนิค ;โปรดดำเนินการ # รีเฟรช (F5) หน้าใหม่อีกครั้ง หากเคยล็อกอินแล้วแต่เมื่อกดลิงก์ข้ามมาใช้ที่วิกินี้เป็นครั้งแรกแล้วระบบยังไม่ได้ล็อกอินให้อัตโนมัติ เมื่อล็อกอินแล้วข้อความเตือนนี้จะหายไปเองและมีข้อความยืนยันขึ้นมาแทน # [[พิเศษ:ล็อกอิน|ล็อกอิน]]ในกรณีที่ท่านมีบัญชีแล้วแต่ยังไม่ได้ล็อกอิน<sup>*</sup> # สร้างบัญชีผู้ใช้ใหม่[[พิเศษ:สร้างบัญชีผู้ใช้ใหม่|ที่วิกิมีเดียประเทศไทย]]<sup>*</sup> <sup>*</sup>เมื่อดำเนินการตาม 2-3 เสร็จแล้วสามารถกดย้อนกลับ (back/backspace) มาที่หน้านี้แล้วรีเฟรช (F5) หน้าใหม่อีกครั้งได้ตามข้อ 1 </div><div class="user-show" style="background:#dee; border:1px solid #00c; margin:0.5em; padding:0.5em;; padding: 1em; width:70%"> ท่านกำลังใช้งานบัญชีผู้ใช้ (มีสถานะล็อกอินแล้วพร้อมดำเนินการต่อ) โปรดดูให้แน่ใจว่าใช่บัญชีผู้ใช้ของท่านก่อนดำเนินการต่อ </div> d886l59d4apaiuno3ulpho8zfo1oyo5 มีเดียวิกิ:Common.css 8 63 249 2025-11-23T06:27:27Z Wutkh 9 สร้างหน้าด้วย "/* <syntaxhighlight lang="css"> */ /* Source of code, if not stated, usually comes from English Wikipedia. */ /* เริ่ม: แสดงผลภาษาไทย */ /* เว้นย่อหน้า ตามการเขียนแบบไทย */ p { text-indent: 2.5em; } p.catlinks, td p, .dt-init-replylink-buttons { text-indent: 0; } /* จบ: แสดงผลภาษาไทย */ sup, sub { line-height: 1e..." 249 css text/css /* <syntaxhighlight lang="css"> */ /* Source of code, if not stated, usually comes from English Wikipedia. */ /* เริ่ม: แสดงผลภาษาไทย */ /* เว้นย่อหน้า ตามการเขียนแบบไทย */ p { text-indent: 2.5em; } p.catlinks, td p, .dt-init-replylink-buttons { text-indent: 0; } /* จบ: แสดงผลภาษาไทย */ sup, sub { line-height: 1em; /* Reduce line-height for <sup> and <sub> */ } .page-หน้าหลัก #mp-topbanner { clear: both; } #interwiki-completelist { font-weight: bold; } /* ลดระยะย่อหน้าของ bullet ในหน้าหลัก (โดยคุณ Octahedron80) */ body.page-หน้าหลัก #content ul, body.page-หน้าหลัก #content ol { margin-left: 2em; } /* ยกเว้น .non-indented, p.catlink, td > p (โดยคุณ Patsagorn Y.) */ .non-indent p, p.catlinks, td p, .mw-ui-button { text-indent: initial; } /* Bold 'edit this page' link to encourage newcomers */ #ca-edit a { font-weight: bold !important; } /* Ensure refs in table headers and the like aren't bold or italic */ sup.reference { font-weight: normal; font-style: normal; } /* Styling for citations */ span.citation, cite { font-style: normal; word-wrap: break-word; } /* Recentchanges box. Style adapted from fr.wikipedia.org */ .rcoptions { margin: 0 0 2px 0; padding:.5em; border:1px solid #aaa; border-left:10px solid #ccccff; background-color: #FFFFFF; font-size: 90% } #catlinks { border: 0px; border-top: 2px dotted #aaaaaa; } /* ทำให้ {{มบ|Coord}} แสดงผลเป็น dec หรือ dms เพียงอย่างใดอย่างหนึ่งเท่านั้น ทำให้พิกัดที่ได้จากแม่แบบไม่ยาวเกินไป โดยคุณ Nullzero */ .geo-default, .geo-dms, .geo-dec { display: inline; } .geo-nondefault, .geo-multi-punct { display: none; } .longitude, .latitude { white-space: nowrap; } /* wikitable/prettytable class for skinning normal tables */ /* Make the list of references smaller */ ol.references, div.reflist, div.refbegin { font-size: 90%; /* Default font-size */ } div.reflist ol.references { font-size: 100%; /* Reset font-size when nested in div.reflist */ list-style-type: inherit; /* Enable custom list style types */ } .references-small { font-size: 90%;} .references-2column { font-size: 90%; -moz-column-count:2; column-count:2; } /* Consistent size for <small>, <sub> and <sup> */ small { font-size: 85%; } .mw-body-content sub, .mw-body-content sup { font-size: 80%; } .same-bg { background: none; } /* Highlight clicked reference in blue to help navigation */ ol.references > li:target { background-color: #DEF; } /* T156351: Support for Parsoid's Cite implementation @counter-style custom-group-label-thai { system: alphabetic; symbols: 'ก' 'ข' 'ค' 'ง' 'จ' 'ฉ' 'ช' 'ซ' 'ด' 'ต' 'ถ' 'ท' 'น' 'บ' 'ป' 'ผ' 'ฝ' 'พ' 'ฟ' 'ม' 'ย' 'ร' 'ว' 'ส' 'อ' 'ฮ'; }*/ /* Styling for citations */ span.citation, cite { font-style: normal; word-wrap: break-word; } /* Styling for citations (CSS3). Breaks long urls, etc., rather than overflowing box */ .citation { word-wrap: break-word; } /* Default style for navigation boxes */ .navbox { /* Navbox container style */ box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%; clear: both; font-size: 88%; text-align: center; padding: 1px; margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */ } .navbox .navbox { margin-top: 0; /* No top margin for nested navboxes */ } .navbox + .navbox { margin-top: -1px; /* Single pixel border between adjacent navboxes */ } .navbox-inner, .navbox-subgroup { width: 100%; } .navbox-group, .navbox-title, .navbox-abovebelow { padding: 0.25em 1em; /* Title, group and above/below styles */ line-height: 1.5em; text-align: center; } th.navbox-group { /* Group style */ white-space: nowrap; /* @noflip */ text-align: right; } .navbox, .navbox-subgroup { background-color: #fdfdfd; /* Background color */ } .navbox-list { line-height: 1.5em; border-color: #fdfdfd; /* Must match background color */ } /* cell spacing for navbox cells */ tr + tr > .navbox-abovebelow, tr + tr > .navbox-group, tr + tr > .navbox-image, tr + tr > .navbox-list { /* Borders above 2nd, 3rd, etc. rows */ border-top: 2px solid #fdfdfd; /* Must match background color */ } .navbox th, .navbox-title { background-color: #ccccff; /* Level 1 color */ } .navbox-abovebelow, th.navbox-group, .navbox-subgroup .navbox-title { background-color: #ddddff; /* Level 2 color */ } .navbox-subgroup .navbox-group, .navbox-subgroup .navbox-abovebelow { background-color: #e6e6ff; /* Level 3 color */ } .navbox-even { background-color: #f7f7f7; /* Even row striping */ } .navbox-odd { background-color: transparent; /* Odd row striping */ } /* Default styling for Navbar template */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline; white-space: nowrap; } .navbar li { word-spacing: -0.125em; } .navbar.mini li span { font-variant: small-caps; } /* Navbar styling when nested in infobox and navbox */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; width: 6em; } /* 'show'/'hide' buttons created dynamically by the CollapsibleTables javascript in [[MediaWiki:Common.js]] are styled here so they can be customised. */ .collapseButton { /* @noflip */ float: right; font-weight: normal; /* @noflip */ margin-left: 0.5em; /* @noflip */ text-align: right; width: auto; } /* In navboxes, the show/hide button balances the v·d·e links from [[Template:Navbar]], so they need to be the same width. */ .navbox .collapseButton { width: 6em; } /* Styling for JQuery makeCollapsible, matching that of collapseButton */ .mw-parser-output .mw-collapsible-toggle { font-weight: normal; /* @noflip */ text-align: right; } .navbox .mw-collapsible-toggle { width: 6em; } /* Style for "notices" */ .notice { margin: 1em; padding: 0.2em; } #disambig { border-top: 3px double #cccccc; border-bottom: 3px double #cccccc; } #spoiler { /* border-top: 2px solid #ddd; border-bottom:2px solid #ddd;*/ } /* Standard talk template style */ .Talk-Notice { border: 1px solid #C0C090; background-color: #F8EABA; margin-bottom: 3px; width: 85%; border-spacing: 3px; margin-left: auto; margin-right: auto; } /* Make template background appear correctly on all browsers */ .Talk-Notice td { background: inherit; } /*Add formatting to make sure that "external references" from [[Template:Ref]] do not get URL expansion, not even when printed. The mechanism up to MediaWiki 1.4 was that the HTML code contained a SPAN following the anchor A; this SPAN had the class "urlexpansion", which was not displayed on screen, but was shown when the medium was "print". The rules below ensure (a) that there is no extra padding to the right of the anchor (displayed as "[<number>]"), (b) that there is no "external link arrow" for the link, and (c) that this SPAN of class "urlexpansion" is never shown. ~~~~ */ .plainlinksneverexpand { background: none ! important; padding: 0 ! important; } .plainlinksneverexpand .urlexpansion { display : none ! important; } /* Make sure that ext links displayed within "plainlinksneverexpand" don't get the arrow... */ .plainlinksneverexpand a { background: none !important; padding: 0 !important } /* With MediaWiki 1.5, the mechanism has changed: instead of a SPAN of class "urlexpansion" following the anchor A, the anchor itself now has class "external autonumber" and the expansion is inserted when printing (see the common printing style sheet at //en.wikipedia.org/w/skins/common/commonPrint.css) using the ":after" pseudo- element of CSS. We have to switch this off for links due to Template:Ref! ~~~~ */ .plainlinksneverexpand a.external.text:after { display: none !important; } .plainlinksneverexpand a.external.autonumber:after { display: none !important; } /* Merge template style */ .amboxtalk { clear:left; text-align:left; width: 80%; margin: 0 auto; padding: 0.5em; border-collapse: collapse; background: #FBFBFB; border: 1px solid #aaa; border-left: 10px solid #1e90ff; } .mw-body-content .messagebox { border: 1px solid #aaaaaa; background-color: #f9f9f9; width: 85%; margin: 0 auto 1em auto; padding: .2em; text-align: left; } .messagebox.merge { border: 1px solid #cf9fff; background-color: #f5edf5; text-align: center; } .messagebox.cleanup { border: 1px solid #9f9fff; background-color: #efefff; text-align: center; } .messagebox.standard-talk { border: 1px solid #c0c090; background-color: #f8eaba; } /* Infobox template style */ .infobox { border: 1px solid #aaa; background-color: #f9f9f9; color: black; margin: 0.5em 0 0.5em 1em; padding: 0.2em; /* @noflip */ float: right; /* @noflip */ clear: right; text-align: left; font-size: 88%; line-height: 1.5em; } .infobox caption { font-size: 125%; font-weight: bold; } .infobox td, .infobox th { vertical-align: top; } .infobox.bordered { border-collapse: collapse; } .infobox.bordered td, .infobox.bordered th { border: 1px solid #aaa; } .infobox.bordered .borderless td, .infobox.bordered .borderless th { border: 0; } .infobox.sisterproject { width: 20em; font-size: 90%; } .infobox.standard-talk { border: 1px solid #c0c090; background-color: #f8eaba; } .infobox.standard-talk.bordered td, .infobox.standard-talk.bordered th { border: 1px solid #c0c090; } /* styles for bordered infobox with merged rows */ .infobox.bordered .mergedtoprow td, .infobox.bordered .mergedtoprow th { border: 0; border-top: 1px solid #aaa; border-right: 1px solid #aaa; } .infobox.bordered .mergedrow td, .infobox.bordered .mergedrow th { border: 0; border-right: 1px solid #aaa; } /* Styles for geography infoboxes, eg countries, country subdivisions, cities, etc. */ .infobox.geography { /* @noflip */ text-align: left; border-collapse: collapse; line-height: 1.2em; font-size: 90%; } .infobox.geography td, .infobox.geography th { border-top: 1px solid #aaa; padding: 0.4em 0.6em 0.4em 0.6em; } .infobox.geography .mergedtoprow td, .infobox.geography .mergedtoprow th { border-top: 1px solid #aaa; padding: 0.4em 0.6em 0.2em 0.6em; } .infobox.geography .mergedrow td, .infobox.geography .mergedrow th { border: 0; padding: 0 0.6em 0.2em 0.6em; } .infobox.geography .mergedbottomrow td, .infobox.geography .mergedbottomrow th { border-top: 0; border-bottom: 1px solid #aaa; padding: 0 0.6em 0.4em 0.6em; } .infobox.geography .maptable td, .infobox.geography .maptable th { border: 0; padding: 0; } /* Normal font styling for wikitable row headers with scope="row" tag */ .wikitable.plainrowheaders th[scope=row], .wikitable.plainrowheaders th[scope=rowgroup] { font-weight: normal; /* @noflip */ text-align: left; } /* Lists in wikitable data cells are always left-aligned */ .wikitable td ul, .wikitable td ol, .wikitable td dl { /* @noflip */ text-align: left; } #wpSave { font-weight: bold; } /* hiddenStructure from Monobook - allows selective hiding of markup in templates */ .hiddenStructure { display: none; } /* CSS for testing a new Main Page design, see [[Wikipedia:WikiProject Usability/Main Page]] */ #ThWpMainPage { width: 100%; margin-top: 1em; } #ThWpMainPage h2 { font-size: 130%; font-weight: bold; margin: 0; padding: 0; border: 0; } #ThWpMpMargin { margin-right: 13.8em; } #ThWpMpCol1 { float: left; clear: left; width: 50%; } #ThWpMpCol2 { width: 49.9%; float: left; } #ThWpMpBrowse { background: #f8fcff url(//upload.wikimedia.org/wikipedia/en/9/9f/MP-three-books.png) no-repeat 180% 9%; border: 1px solid #c7c7c7; } #ThWpMpBrowseCats li { font-size: 85%; margin-left: 1em; line-height: 1.5; } #ThWpMpBrowseCats h3 { font-size: 120%; margin: .2em 0 .1em -.8em; padding: 0; font-weight: normal; } #ThWpMpBrowseCats h3 a { font-weight: bold; } #ThWpMpBook { background-image: url(//upload.wikimedia.org/wikipedia/en/7/7e/MP-open-book.png); } #ThWpMpFeaturedPic { text-align: center; margin: 0 0 .5em; font-size: 85%; font-weight: bold; } #ThWpMpFeaturedPic h2 { font-size: 145%; text-align: left; } .ThWpMpBrowseRight { float: right; width: 12.7em; } .ThWpMpBrowseBottom { margin: 1em 0; } .ThWpMpBrowseBottom #EnWpMpBrowseCats li, .EnWpMpBrowseBottom #EnWpMpUsefulLinks, .EnWpMpBrowseBottom #ThWpMpFeaturedPic { float: left; width: 24%; margin: 0; line-height: auto; } .ThWpMpBrowseBottom #EnWpMpBrowseCats h3 { margin-left: 0; } #ThWpMpUsefulLinks { clear: left; } #ThWpMpSearch { background: url(//upload.wikimedia.org/wikipedia/en/a/ae/MP-magnifying-glass.png) no-repeat top right; } #ThWpMpSearch input { vertical-align: middle; } #ThWpMpSearchInner { float: right; width: 20em; text-align: center; } #bodySearchMP { margin: 0; padding: 0; } #bodySearchMP .bodySearchWrap { float: right; width: 17.5em; text-align: left; padding: .8em 0; } #bodySearchMP label { display: block; font-size: 95%; font-weight: bold; margin-bottom: -.2em; } #bodySearchMP .bodySearchIput { opacity: .85; filter: alpha(opacity=85); } #bodySearchMP .bodySearchBtnGo { font-weight: bold; padding-left: .3em; padding-right: .3em; margin-left: .5em; } .ThWpMpContentBox { border: 1px solid; margin-bottom: .9em; } #ThWpMpCol2 .EnWpMpContentBox { margin-left: .9em; } .ThWpMpImage { float: right; margin: 0 0 .2em .2em; } .ThWpMpImage img { position: relative; z-index: 3; } #ThWpMpSisterProjects { float: left; width: 49%; } .ThWpMpSisterProject { float: left; width: 17em; margin: 0; height: 5.5em; margin: 0; } .ThWpMpSisterImg { float: left; width: 40px; height: 100%; } #ThWpMpOtherLangs { margin-left: 50%; } #ThWpMainPageNoCSS { display: none; } /* Icons for medialist templates [[Template:Listen]], [[Template:Multi-listen_start]], [[Template:Video]], [[Template:Multi-video_start]] */ div.listenlist { background: url("//upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Gnome-speakernotes.png/30px-Gnome-speakernotes.png"); padding-left: 40px; } div.videolist, div.multivideolist { background: url("//upload.wikimedia.org/wikipedia/en/thumb/2/20/Tango-video-x-generic.png/40px-Tango-video-x-generic.png"); padding-left: 50px; } div.user-block { padding: 5px; border: 1px solid #A9A9A9; background-color: #FFEFD5; } /* Style rules for media list templates */ div.medialist { min-height: 50px; margin: 1em; background-position: top left; background-repeat: no-repeat; } div.medialist ul { list-style-type: none; list-style-image: none; margin: 0; } div.medialist ul li { padding-bottom: 0.5em; } div.medialist ul li li { font-size: 91%; padding-bottom: 0; } /* Coloured watchlist numbers */ .mw-plusminus-pos { color:darkgreen; } .mw-plusminus-neg { color:darkred; } /* Persondata and other (future) metadata */ table.InChI, /* temporary */ table.persondata { border: 1px solid #aaa; display: none; speak: none; } .InChI-label, /* temporary */ .persondata-label { color: #aaa; } /* เพิ่มความเข้มของเส้นกรอบรูป */ /* Change the external link icon to an Adobe icon for all PDF files */ /* (in browsers that support these CSS selectors, like Mozilla and Opera) */ #bodyContent a[href$=".pdf"].external, #bodyContent a[href*=".pdf?"].external, #bodyContent a[href*=".pdf#"].external, #bodyContent a[href$=".PDF"].external, #bodyContent a[href*=".PDF?"].external, #bodyContent a[href*=".PDF#"].external, #mw_content a[href$=".pdf"].external, #mw_content a[href*=".pdf?"].external, #mw_content a[href*=".pdf#"].external, #mw_content a[href$=".PDF"].external, #mw_content a[href*=".PDF?"].external, #mw_content a[href*=".PDF#"].external { background: url(//upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif) center right no-repeat; padding-right: 16px; } /* Change the external link icon to an Adobe icon anywhere the PDFlink class */ /* is used (notably Template:PDFlink). This works in IE, unlike the above. */ span.PDFlink a { background: url(//upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif) center right no-repeat !important; padding-right: 17px !important; } span.geolink a { background: url(//upload.wikimedia.org/wikipedia/en/a/a7/Monobook-globe.png) center right no-repeat !important; padding-right: 11px !important; } /* รายการแสดงเป็นบล็อก */ .wikiblocklist ul{margin: 0; padding: 0;} .wikiblocklist li{list-style: none;border-bottom: #e2eef2 solid 1px; padding: 0 5px;} .wikiblocklist a{color: #000; display: block;} .wikiblocklist li:hover{ background: #e2eef2;} /* เริ่มแม่แบบ Metabox */ .mbButton { background-color: #d0b0ff; /* 4 */ border: 0.15em solid #000000; border-color: #f0d0ff #b090e0 #9070c0 #f0d0ff; /* 5 3 3 5 */ border-radius-topleft: .5em; border-radius-topright: .5em; -moz-border-radius: .5em .5em 0em 0em; cursor:pointer; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative;} .mbButton a, .mbButton strong { background: none !important; color:#7050a0 !important; /* 1 */ font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbButton a:hover, .mbButton strong:hover { color: black !important; text-decoration: underline !important;} .mbButtonSel{ background-color: #9070c0; /* 2 */ border: 0.15em solid #000000; border-color: #b090e0 #7050a0 #9070c0 #b090e0; /* 3 1 2 3 */ border-radius-topleft: .5em; border-radius-topright: .5em; -moz-border-radius: .5em .5em 0em 0em; cursor: default; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative; color:white;} .mbButtonSela { background: none !important; color:white !important; cursor: default; font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbContent { background-color: #f8f8ff; border: 0.2em solid #9070c0; /* 2 */ border-color: #9070c0 #7050a0 #7050a0 #9070c0 ; /* 2 1 1 2 */ -moz-border-radius: 0em .5em .5em 0em; border-radius-topright: .5em; border-radius-bottomright: .5em; padding: 1em; position: static; /* Si hi posem relative falla amb MSIE */} .mbTab { background-color: #f8f8ff; border-color: #7050a0 #b090e0 #b090e0 #7050a0; /* 1 3 3 1 */ width: 100%; } /* สั่งทำงานสีเขียว 1;60b030 2;75c045 3;90d060 4;a5e085 5;c0f090 */ .mbGreen .mbButton { background-color: #a5e085; /* 4 */ border-color: #c0f090 #90d060 #75c045 #c0f090; /* 5 3 2 5 */} .mbGreen .mbButton a, .mbGreen .mbButton strong { color:#60b030 !important; /* 1 */ font-size:90%} .mbGreen .mbButton a:hover, .mbGreen .mbButton strong:hover { color: black !important; text-decoration: underline;} .mbGreen .mbButtonSel{ background-color: #75c045; /* 2 */ border-color: #90d060 #60b030 #75c045 #90d060; /* 3 1 2 3 */} .mbGreen .mbContent { background-color: #f5fffa; border-color: #75c045 #60b030 #60b030 #75c045 ; /* 2 1 1 2 */} .mbGreen .mbTab { background-color: #f5fffa; border-color: #60b030 #90d060 #90d060 #60b030; /* 1 3 3 1 */} /* สั่งทำงานสีแดง 1;CC0000 2;FF0000 3;FF8888 4;FFAAAA 5;FFCCCC */ .mbRed .mbButton { background-color: #FFAAAA; /* 4 */ border-color: #FFCCCC #FF8888 #FF0000 #FFCCCC; /* 5 3 2 5 */} .mbRed .mbButton a, .mbRed .mbButton strong { color:#CC0000 !important; /* 1 */ font-size:90%} .mbRed .mbButton a:hover .mbRed .mbButton strong:hover { color: black !important; text-decoration: underline;} .mbRed .mbButtonSel{ background-color: #FF0000; /* 2 */ border-color: #FF8888 #CC0000 #FF0000 #FF8888; /* 3 1 2 3 */} .mbRed .mbContent { background-color: #fffafa; border-color: #FF0000 #CC0000 #CC0000 #FF0000; /* 2 1 1 2 */} .mbRed .mbTab { background-color: #fffafa; border-color: #CC0000 #FF0000 #FF0000 #CC0000; /* 1 3 3 1 */} /* สั่งทำงานสีฟ้า 1;3379de 2;5b8dd6 3;88abde 4;a7c1e6 5;c8d6e9 */ .mbBlue .mbButton { background-color: #a7c1e6; /* 4 */ border-color: #c8d6e9 #88abde #5b8dd6 #c8d6e9; /* 5 3 2 5 */} .mbBlue .mbButton a, .mbBlue .mbButton strong { color:#3379de !important; /* 1 */ font-size:90%} .mbBlue .mbButton a:hover .mbBlue .mbButton strong:hover { color: black !important; text-decoration: underline;} .mbBlue .mbButtonSel{ background-color: #5b8dd6; /* 2 */ border-color: #88abde #3379de #5b8dd6 #88abde; /* 3 1 2 3 */} .mbBlue .mbContent { background-color: #f0f8ff; border-color: #5b8dd6 #3379de #3379de #5b8dd6; /* 2 1 1 2 */} .mbBlue .mbTab { background-color: #f0f8ff; border-color: #3379de #88abde #88abde #3379de; /* 1 3 3 1 */} /* สั่งทำงานสีเหลือง 1;ffd813 2;ffe147 3;ffe977 4;fff1a4 5;fef4bc */ .mbYellow .mbButton { background-color: #fff1a4; /* 4 */ border-color: #fef4bc #ffe977 #ffe147 #fef4bc; /* 5 3 2 5 */} .mbYellow .mbButton a, .mbYellow .mbButton strong { color:#ffd813 !important; /* 1 */ font-size:90%} .mbYellow .mbButton a:hover .mbYellow .mbButton strong:hover { color: black !important; text-decoration: underline;} .mbYellow .mbButtonSel{ background-color: #ffe147; /* 2 */ border-color: #ffe977 #ffd813 #ffe147 #ffe977; /* 3 1 2 3 */} .mbYellow .mbContent { background-color: #fffce8; border-color: #ffe147 #ffd813 #ffd813 #ffe147; /* 2 1 1 2 */} .mbYellow .mbTab { background-color: #fffce8; border-color: #ffd813 #88abde #88abde #ffd813; /* 1 3 3 1 */} /* สั่งทำงานสีส้ม 1;ff820e 2;ff9d42 3;ffac5d 4;ffbd7f 5;ffd0a4 6;ffeedd */ .mbOrange .mbButton { background-color: #ffbd7f; /* 4 */ border-color: #ffd0a4 #ffac5d #ff9d42 #ffd0a4; /* 5 3 2 5 */} .mbOrange .mbButton a, .mbOrange .mbButton strong { color:#ff820e !important; /* 1 */ font-size:90%} .mbOrange .mbButton a:hover .mbOrange .mbButton strong:hover { color: black !important; text-decoration: underline;} .mbOrange .mbButtonSel{ background-color: #ff9d42; /* 2 */ border-color: #ffac5d #ff820e #ff9d42 #ffac5d; /* 3 1 2 3 */} .mbOrange .mbContent { background-color: #ffeedd; /* 6 */ border-color: #ff9d42 #ff820e #ff820e #ff9d42; /* 2 1 1 2 */} .mbOrange .mbTab { background-color: #ffeedd; /* 6 */ border-color: #ff820e #ffac5d #ffac5d #ff820e; /* 1 3 3 1 */} /* จบการใช้สีต่าง ๆ สำหรับแม่แบบ:Metabox */ /* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */ th.mbox-text, td.mbox-text { /* The message body cell(s) */ border: none; padding: 0.25em 0.9em; /* 0.9em left/right */ width: 100%; /* Make all mboxes the same width regardless of text length */ } td.mbox-image { /* The left image cell */ border: none; padding: 2px 0 2px 0.9em; /* 0.9em left, 0px right */ text-align: center; } td.mbox-imageright { /* The right image cell */ border: none; padding: 2px 0.9em 2px 0; /* 0px left, 0.9em right */ text-align: center; } /* Article message box styles */ table.ambox { margin: 0px 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #aaa; border-left: 10px solid #1e90ff; /* Default "notice" blue */ background: #fbfbfb; } table.ambox + table.ambox { /* Single border between stacked boxes. */ margin-top: -1px; } .ambox th.mbox-text, .ambox td.mbox-text { /* The message body cell(s) */ padding: 0.25em 0.5em; /* 0.5em left/right */ } .ambox td.mbox-image { /* The left image cell */ padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */ } .ambox td.mbox-imageright { /* The right image cell */ padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */ } table.ambox-notice { border-left: 10px solid #1e90ff; /* Blue */ } table.ambox-speedy { border-left: 10px solid #b22222; /* Red */ background: #fee; /* Pink */ } table.ambox-delete { border-left: 10px solid #b22222; /* Red */ } table.ambox-content { border-left: 10px solid #f28500; /* Orange */ } table.ambox-style { border-left: 10px solid #f4c430; /* Yellow */ } table.ambox-move { border-left: 10px solid #9932cc; /* Purple */ } table.ambox-protection { border-left: 10px solid #bba; /* Gray-gold */ } /* Image message box styles */ table.imbox { margin: 4px 10%; border-collapse: collapse; border: 3px solid #1e90ff; /* Default "notice" blue */ background: #fbfbfb; } .imbox .mbox-text .imbox { /* For imboxes inside imbox-text cells. */ margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */ } .mbox-inside .imbox { /* For imboxes inside other templates. */ margin: 4px; } table.imbox-notice { border: 3px solid #1e90ff; /* Blue */ } table.imbox-speedy { border: 3px solid #b22222; /* Red */ background: #fee; /* Pink */ } table.imbox-delete { border: 3px solid #b22222; /* Red */ } table.imbox-content { border: 3px solid #f28500; /* Orange */ } table.imbox-style { border: 3px solid #f4c430; /* Yellow */ } table.imbox-move { border: 3px solid #9932cc; /* Purple */ } table.imbox-protection { border: 3px solid #bba; /* Gray-gold */ } table.imbox-license { border: 3px solid #88a; /* Dark gray */ background: #f7f8ff; /* Light gray */ } table.imbox-featured { border: 3px solid #cba135; /* Brown-gold */ } /* Category message box styles */ table.cmbox { margin: 3px 10%; border-collapse: collapse; border: 1px solid #aaa; background: #DFE8FF; /* Default "notice" blue */ } table.cmbox-notice { background: #D8E8FF; /* Blue */ } table.cmbox-speedy { margin-top: 4px; margin-bottom: 4px; border: 4px solid #b22222; /* Red */ background: #FFDBDB; /* Pink */ } table.cmbox-delete { background: #FFDBDB; /* Red */ } table.cmbox-content { background: #FFE7CE; /* Orange */ } table.cmbox-style { background: #FFF9DB; /* Yellow */ } table.cmbox-move { background: #E4D8FF; /* Purple */ } table.cmbox-protection { background: #EFEFE1; /* Gray-gold */ } /* Other pages message box styles */ table.ombox { margin: 4px 10%; border-collapse: collapse; border: 1px solid #aaa; /* Default "notice" gray */ background: #f9f9f9; } table.ombox-notice { border: 1px solid #aaa; /* Gray */ } table.ombox-speedy { border: 2px solid #b22222; /* Red */ background: #fee; /* Pink */ } table.ombox-delete { border: 2px solid #b22222; /* Red */ } table.ombox-content { border: 1px solid #f28500; /* Orange */ } table.ombox-style { border: 1px solid #f4c430; /* Yellow */ } table.ombox-move { border: 1px solid #9932cc; /* Purple */ } table.ombox-protection { border: 2px solid #bba; /* Gray-gold */ } /* Talk page message box styles */ table.tmbox { margin: 4px 10%; border-collapse: collapse; border: 1px solid #c0c090; /* Default "notice" gray-brown */ background: #f8eaba; } .mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The "mediawiki" */ margin: 2px 0; /* class ensures that this declaration overrides other */ width: 100%; /* For Safari and Opera */ /* styles (including mbox-small above) */ } .mbox-inside .tmbox.mbox-small { /* "small" tmboxes should not be small when */ line-height: 1.5em; /* also "nested", so reset styles that are */ font-size: 100%; /* set in "mbox-small" above. */ } table.tmbox-speedy { border: 2px solid #b22222; /* Red */ background: #fee; /* Pink */ } table.tmbox-delete { border: 2px solid #b22222; /* Red */ } table.tmbox-content { border: 2px solid #f28500; /* Orange */ } table.tmbox-style { border: 2px solid #f4c430; /* Yellow */ } table.tmbox-move { border: 2px solid #9932cc; /* Purple */ } table.tmbox-protection, table.tmbox-notice { border: 1px solid #c0c090; /* Gray-brown */ } /* Disambig and set index box styles */ table.dmbox { clear: both; margin: 0.9em 1em; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; background: transparent; } /* Footer and header message box styles */ table.fmbox { clear: both; margin: 0.2em 0; width: 100%; border: 1px solid #aaa; background: #f9f9f9; /* Default "system" gray */ } table.fmbox-system { background: #f9f9f9; } table.fmbox-warning { border: 1px solid #bb7070; /* Dark pink */ background: #ffdbdb; /* Pink */ } table.fmbox-editnotice { background: transparent; } /* For template documentation */ .template-documentation { clear: both; margin: 1em 0 0 0; border: 1px solid #aaa; background-color: #ecfcf4; padding: 1em; } .thumbinner { min-width: 100px; } /* Fix so <tt>, <code> and <pre> tags get normal text size also in some versions of Firefox, Safari, Konqueror, Chrome etc. */ tt, code, pre { font-family: monospace, sans-serif; } /* Fix so <syntaxhighlight> tags and .css and .js pages get normal text size. [[Bugzilla:26204]]. See also [[Wikipedia:Typography#The monospace 'bug']] */ div.mw-geshi div, div.mw-geshi div pre, span.mw-geshi, pre.source-css, pre.source-javascript, pre.source-lua { font-family: monospace, Courier !important; } /* End fix <syntaxhighlight> */ /* No linewrap on the labels of the login/signup page */ body.page-Special_UserLogin .mw-label label, body.page-Special_UserLogin_signup .mw-label label { white-space : nowrap; } /* Makes redirects appear in italics on [[Special:Allpages]] */ .allpagesredirect { font-style: italic; } /* Removes underlines from links */ .nounderlines a { text-decoration: none; } /* Remove underline from IPA links */ .IPA a:link, .IPA a:visited { text-decoration: none; } /* Allow limiting of which header levels are shown in a TOC; <div class="toclimit-3">, for instance, will limit to showing ==headings== and ===headings=== but no further (as long as there are no =headings= on the page, which there shouldn't be according to the MoS). */ .toclimit-2 .toclevel-1 ul, .toclimit-3 .toclevel-2 ul, .toclimit-4 .toclevel-3 ul, .toclimit-5 .toclevel-4 ul, .toclimit-6 .toclevel-5 ul, .toclimit-7 .toclevel-6 ul { display: none; } /* Prevents line breaks in 1) Where desired 2) Links when we don't want them to 3) Bold "links" to the page itself 4) HTML formulae 5) Ref tags with group names <ref group="Note"> --> "[Note 1]" */ .nowrap, .nowraplinks a, .nowraplinks .selflink, span.texhtml, sup.reference a { white-space: nowrap; } /* DIVERS */ .globegris { background: url(//upload.wikimedia.org/wikipedia/commons/1/10/Wikipedia-logo-v2-200px-transparent.png) } /* from fr.wikipedia.org */ /* Remove default styles for [[MediaWiki:Noarticletext]]. */ div.noarticletext { border: none; background: transparent; padding: 0; } /* Prevent floating boxes from overlapping any category listings, file histories, edit previews, and edit [Show changes] views */ #mw-subcategories, #mw-pages, #mw-category-media, #filehistory, #wikiPreview, #wikiDiff { clear: both; } /* Special characters list below edit window works better without underlining */ #editpage-specialchars a { text-decoration: none; } #editpage-specialchars a:hover { text-decoration: underline; } /* Hide charinsert base for those not using the gadget */ #editpage-specialchars { display: none; } /* Put a checker background at the image description page only visible if the image has transparent background */ #file img {background: url(//upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png) repeat} /* These mbox-small classes must be placed after all other ambox/tmbox/ombox etc classes. "body.mediawiki" is so they override "table.ambox + table.ambox" above. */ body.mediawiki table.mbox-small { /* For the "small=yes" option. */ /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; width: 238px; font-size: 88%; line-height: 1.25em; } body.mediawiki table.mbox-small-left { /* For the "small=left" option. */ margin: 4px 1em 4px 0; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } /* Styling for Abuse Filter tags */ .mw-tag-markers { font-style:italic; font-size:90%; } /* Reduce line-height for <sup> and <sub> */ sup, sub { line-height: 1em; } /* A request by octahedron80 19:13, 7 ธันวาคม 2554 (ICT) */ .mw-content-ltr dd, .mw-content-rtl .mw-content-ltr dd { margin-left: 2.5em; } .mw-content-ltr ul, .mw-content-rtl .mw-content-ltr ul { margin-left: 2.5em; } .mw-content-ltr ol, .mw-content-rtl .mw-content-ltr ol { margin-left: 2.5em; } /* Hatnotes and disambiguation notices */ .rellink, .dablink, .hatnote { font-style: italic; /* @noflip */ padding-left: 2.5em; margin-bottom: 0.5em; } .rellink i, .dablink i, .hatnote i { font-style: normal; } /* Hide stuff meant for accounts with special permissions. Made visible again in [[MediaWiki:Group-sysop.css]], [[MediaWiki:Group-patroller.css]], [[MediaWiki:Group-templateeditor.css]], [[MediaWiki:Group-extendedmover.css]] and [[Mediawiki:Group-autoconfirmed.css]]. */ .sysop-show, .templateeditor-show, .extendedmover-show, .patroller-show, .autoconfirmed-show, .user-show { display: none; } /* Gallery styles background changes are restricted to screen view. In printing we should avoid applying backgrounds. */ @media screen { /* The backgrounds for galleries. */ #content .gallerybox div.thumb { /* Light gray padding */ background-color: #f8f9fa; } /* Put a chequered background behind images, only visible if they have transparency. '.filehistory a img' and '#file img:hover' are handled by MediaWiki core (as of 1.19) */ .gallerybox .thumb img { background: #fff url(//upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png) repeat; } /* But not on articles, user pages, portals or with opt-out. */ .ns-0 .gallerybox .thumb img, .ns-2 .gallerybox .thumb img, .ns-100 .gallerybox .thumb img, .nochecker .gallerybox .thumb img { background: #fff; } /* T178626 */ #contentSub:empty, #contentSub2:empty { display: block !important; } #contentSub:empty ~ #jump-to-nav, #contentSub2:empty ~ #jump-to-nav { margin-top: -1.4em !important; margin-bottom: 1.4em !important; } } /* แสดงไอคอน GA สำหรับลิงก์ข้ามภาษา (ดูการอภิปรายที่ https://th.wikipedia.org/wiki/วิกิพีเดีย:สภากาแฟ/อภิปราย/ไอคอนแสดง_FA/GA_ในภาษาอื่น)*/ li.badge-goodarticle { list-style-image:url("//upload.wikimedia.org/wikipedia/commons/4/4a/Monobook-bullet-plus.png"); } /* แก้ไขปัญหาแสดงผลจาก มีเดียวิกิ:Sitenotice ไม่พอดีกับหน้า (คำแนะนำจาก ผู้ใช้:Nullzero) */ .mw-dismissable-notice .mw-dismissable-notice-body { margin-left: 0; margin-right: 0; } /* </syntaxhighlight> */ sbwsocxghx915x6q1jd18hr77i49g8y มีเดียวิกิ:Group-autoconfirmed.css 8 64 251 2025-11-23T06:33:13Z Wutkh 9 สร้างหน้าด้วย "/* Show hidden items that have class="autoconfirmed-show". */ div.autoconfirmed-show, p.autoconfirmed-show { display: block !important; } span.autoconfirmed-show, small.autoconfirmed-show { display: inline !important; } table.autoconfirmed-show { display: table !important; } li.autoconfirmed-show { display: list-item !important; } .unconfirmed-show { display: none !important; }" 251 css text/css /* Show hidden items that have class="autoconfirmed-show". */ div.autoconfirmed-show, p.autoconfirmed-show { display: block !important; } span.autoconfirmed-show, small.autoconfirmed-show { display: inline !important; } table.autoconfirmed-show { display: table !important; } li.autoconfirmed-show { display: list-item !important; } .unconfirmed-show { display: none !important; } fdie8qno2w2cmw1xdyo10fd0wual6dy มีเดียวิกิ:Group-user.css 8 65 252 2025-11-23T06:34:13Z Wutkh 9 สร้างหน้าด้วย "/* CSS placed here will affect registered users only */ .anonymous-show { display: none !important; } div.user-show, p.user-show { display: block !important; } span.user-show, small.user-show { display: inline !important; } table.user-show { display: table !important; } li.user-show { display: list-item !important; }" 252 css text/css /* CSS placed here will affect registered users only */ .anonymous-show { display: none !important; } div.user-show, p.user-show { display: block !important; } span.user-show, small.user-show { display: inline !important; } table.user-show { display: table !important; } li.user-show { display: list-item !important; } 8ikg6i5mvdujxmbimqbgv2op84c6zu4 แม่แบบ:กรุ 10 66 280 277 2025-11-23T09:10:07Z Taweetham 7 280 wikitext text/x-wiki {{#invoke:กรุ|aan|start={{{start|}}}}}<includeonly>{{#ifeq:{{{Redirect category|}}}|no||{{#if:{{เป็นหน้าเปลี่ยนทาง|{{FULLBASEPAGENAME}}|talk=yes}}{{เป็นหน้าเปลี่ยนทาง|{{#invoke:String|replace|{{FULLPAGENAME}}|/กรุ.*||plain=false}}|talk=yes}} |[[Category:หน้ากรุที่มีหน้าหลักเป็นหน้าเปลี่ยนทาง]] |}}}}</includeonly><noinclude> {{คู่มือการใช้งาน}}</noinclude> 6h8mfl4xlr2nr051297r1346jhoyd11 มอดูล:กรุ 828 67 263 2025-11-23T08:56:33Z Taweetham 7 จากวิกิพีเดีย 263 Scribunto text/plain ------------------------------------------------------------------------------- -- Automatic archive navigator -- -- This module produces a talk archive banner, together with an automatically- -- generated list of navigation links to other archives of the talk page in -- question. It implements {{Automatic archive navigator}} and -- {{Talk archive navigation}}. ------------------------------------------------------------------------------- local yesno = require('Module:Yesno') ------------------------------------------------------------------------------- -- Helper functions ------------------------------------------------------------------------------- local function makeWikilink(page, display) if display then return string.format('[[%s|%s]]', page, display) else return string.format('[[%s]]', page) end end local function escapePattern(s) -- Escape punctuation in a string so it can be used in a Lua pattern. s = s:gsub('%p', '%%%0') return s end ------------------------------------------------------------------------------- -- Navigator class ------------------------------------------------------------------------------- local Navigator = {} Navigator.__index = Navigator function Navigator.new(args, cfg, currentTitle) local obj = setmetatable({}, Navigator) -- Set inputs obj.args = args obj.cfg = cfg obj.currentTitle = currentTitle -- Archive prefix -- Decode HTML entities so users can enter things like "Archive&#32;" from -- wikitext. obj.archivePrefix = obj.args.prefix or obj:message('archive-prefix') obj.archivePrefix = mw.text.decode(obj.archivePrefix) -- Current archive number do local pattern = string.format( '^%s([1-9][0-9]*)$', escapePattern(obj.archivePrefix) ) obj.currentArchiveNum = obj.currentTitle.subpageText:match(pattern) obj.currentArchiveNum = tonumber(obj.currentArchiveNum) end -- Highest archive number obj.highestArchiveNum = require('Module:Highest archive number')._main( obj.currentTitle.nsText .. ':' .. obj.currentTitle.baseText .. '/' .. obj.archivePrefix ) return obj end function Navigator:message(key, ...) local msg = self.cfg[key] if select('#', ...) > 0 then return mw.message.newRawMessage(msg, ...):plain() else return msg end end function Navigator:makeBlurb() local args = self.args if args[1] == '1' then -- The old template used "|1" to suppress the blurb. return '' else local ret if args.text then ret = args.text else local talkPage = self.currentTitle.nsText .. ':' .. self.currentTitle.baseText if args.period then ret = self:message('blurb-period', talkPage, args.period) else ret = self:message('blurb-noperiod', talkPage) end end return ret end end function Navigator:makeMessageBox() local args = self.args local image if args.image then image = args.image else local icon = args.icon or self:message('default-icon') image = string.format( '[[File:%s|%s|alt=|link=]]', icon, self:message('image-size') ) end local mbox = require('Module:Message box').main('tmbox', { image = image, imageright = args.imageright, style = args.style or 'width:80%;margin-left:auto;margin-right:auto', textstyle = args.textstyle or 'text-align:center', text = self:makeBlurb() }) return mbox end function Navigator:getArchiveNums() -- Returns an array of the archive numbers to format. local noLinks = tonumber(self.args.links) or self:message('default-link-count') noLinks = math.floor(noLinks) -- If |noredlinks is "yes", true or absent, don't allow red links. If it is -- 'no' or false, allow red links. local allowRedLinks = yesno(self.args.noredlinks) == false local current = self.currentArchiveNum local highest = self.highestArchiveNum if not current or not highest or noLinks < 1 then return {} elseif noLinks == 1 then return {current} end local function getNum(i, current) -- Gets an archive number given i, the position in the array away from -- the current archive, and the current archive number. The first two -- offsets are consecutive; the third offset is rounded up to the -- nearest 5; and the fourth and subsequent offsets are rounded up to -- the nearest 10. The offsets are calculated in such a way that archive -- numbers will not be duplicated. if -2 <= i and i <= 2 then return current + i elseif -3 <= i and i <= 3 then return current + 2 - (current + 2) % 5 + (i / 3) * 5 elseif 4 <= i then return current + 7 - (current + 7) % 10 + (i - 3) * 10 else return current + 2 - (current + 2) % 10 + (i + 3) * 10 end end local nums = {} -- Archive nums lower than the current page. for i = -1, -math.floor((noLinks - 1) / 2), -1 do local num = getNum(i, current) if num <= 1 then table.insert(nums, 1, 1) break else table.insert(nums, 1, num) end end -- Current page. if nums[#nums] < current then table.insert(nums, current) end -- Higher archive nums. for i = 1, math.ceil((noLinks - 1) / 2) do local num = getNum(i, current) if num <= highest then table.insert(nums, num) elseif allowRedLinks and (i <= 2 or i <= 3 and num == nums[#nums] + 1) then -- Only insert one red link, and only if it is consecutive. table.insert(nums, highest + 1) break elseif nums[#nums] < highest then -- Insert the highest archive number if it isn't already there. table.insert(nums, highest) break else break end end return nums end function Navigator:makeArchiveLinksWikitable() local lang = mw.language.getContentLanguage() local nums = self:getArchiveNums() local noLinks = #nums if noLinks < 1 then return '' end -- Make the table of links. local links = {} local isCompact = noLinks > 7 local currentIndex for i, num in ipairs(nums) do local subpage = self.archivePrefix .. tostring(num) local display if isCompact then display = tostring(num) else display = self:message('archive-link-display', num) end local link = makeWikilink('../' .. subpage, display) if num == self.currentArchiveNum then link = string.format('<span style="font-size:115%%;">%s</span>', link) currentIndex = i end table.insert(links, link) end -- Add the arrows. -- We must do the forwards arrow first as we are adding elements to the -- links table. If we did the backwards arrow first the index for the -- current archive would be wrong. currentIndex = currentIndex or math.ceil(#links / 2) for i = currentIndex + 1, #links do if nums[i] - nums[i - 1] > 1 then table.insert(links, i, lang:getArrow('forwards')) break end end for i = currentIndex - 1, 1, -1 do if nums[i + 1] - nums[i] > 1 then table.insert(links, i + 1, lang:getArrow('backwards')) break end end -- Output the wikitable. local ret = {} local width if noLinks <= 3 then width = string.format('%dem', noLinks * 10) elseif noLinks <= 7 then width = string.format('%dem', (noLinks + 3) * 5) else width = '50em' end ret[#ret + 1] = string.format( '{| style="width:%s;background:transparent;' .. 'margin:0 auto 0.5em;text-align:center"', width ) for i, s in ipairs(links) do if i % 20 == 1 then ret[#ret + 1] = '\n|-' end ret[#ret + 1] = '\n| ' ret[#ret + 1] = s end ret[#ret + 1] = '\n|}' return table.concat(ret) end function Navigator:__tostring() return self:makeMessageBox() .. '\n' .. self:makeArchiveLinksWikitable() .. ' __NONEWSECTIONLINK__ __NOEDITSECTION__' end ------------------------------------------------------------------------------- -- Exports ------------------------------------------------------------------------------- local p = {} function p._exportClasses() return { Navigator = Navigator } end function p._aan(args, cfg, currentTitle) cfg = cfg or mw.loadData('Module:Automatic archive navigator/config') currentTitle = currentTitle or mw.title.getCurrentTitle() local aan = Navigator.new(args, cfg, currentTitle) return tostring(aan) end function p.aan(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Automatic archive navigator', }) return p._aan(args) end return p 9lfvlakldw2rxv72z3j7je49k90g7ya มอดูล:Automatic archive navigator/config 828 68 265 2025-11-23T08:57:50Z Taweetham 7 จากวิกิพีเดีย 265 Scribunto text/plain -------------------------------------------------------------------------------- -- Configuration for Module:Automatic archive navigator -- -- This module contains configuration data for -- [[Module:Automatic archive navigator]]. It can be used to easily translate the -- module for use on other wikis, as well as changing settings like the default -- archive prefix and the default link count. -------------------------------------------------------------------------------- return { -------------------------------------------------------------------------------- -- Blurb -------------------------------------------------------------------------------- -- The blurbs to use for the archive banner. If the "period" argument is -- specified, the "blurb-period" message is used; otherwise the "blurb-noperiod" -- message is used. -- $1 - the full page name of the current talk page (assumed to be the base -- page of the archive pages. -- $2 - the value of the "period" argument. ['blurb-period'] = "หน้านี้เป็นหน้า'''[[วิธีใช้:กรุ|กรุ]]'''" .. "ของการอภิปรายอภิปรายในอดีต '''สำหรับช่วง $2'''<br />'''อย่าแก้ไข" .. "เนื้อหาของหน้านี้''' หากต้องการเริ่มการอภิปรายใหม่หรือ" .. "รื้อฟื้นการอภิปรายเดิม โปรดใช้[[$1|หน้าพูดคุยปัจจุบัน]]ของหน้านี้", ['blurb-noperiod'] = "หน้านี้เป็นหน้า'''[[วิธีใช้:กรุ|กรุ]]'''" .. "ของการอภิปรายอภิปรายในอดีต '''อย่าแก้ไขเนื้อหาของหน้านี้''' หาก" .. "ต้องการเริ่มการอภิปรายใหม่หรือรื้อฟื้นการอภิปรายเดิม" .. "โปรดใช้[[$1|หน้าพูดคุยปัจจุบัน]]ของหน้านี้", -------------------------------------------------------------------------------- -- Image -------------------------------------------------------------------------------- -- The default icon for the archive banner. ['default-icon'] = 'Replacement filing cabinet.svg', -- The image size, unless a custom image is specified with the "image" -- parameter. ['image-size'] = '40x40px', -------------------------------------------------------------------------------- -- Archive links -------------------------------------------------------------------------------- -- The default prefix for archive pages on this wiki. This is the subpage text -- minus the archive number itself. So if the full page name of a typical -- archive was "Talk:France/Archive 12", the prefix would be "Archive ". This -- message is used to detect whether the current page is an archive page. ['archive-prefix'] = 'กรุ ', -- The display value to use for long archive links. These are used if seven or -- less links are output. -- $1 - The archive number. ['archive-link-display'] = 'กรุ&nbsp;$1', -- The default number of archive links to output. ['default-link-count'] = 7 } dm8iou663kg3be8u41nbze3qbvxik0z มอดูล:Automatic archive navigator 828 69 266 2025-11-23T08:59:08Z Taweetham 7 จากวิกิพีเดีย 266 Scribunto text/plain return require [[มอดูล:กรุ]] aysgtrdcokl9x9l14ixt050ytu3v2lu มอดูล:Highest archive number 828 70 267 2025-11-23T08:59:55Z Taweetham 7 จากวิกิพีเดีย 267 Scribunto text/plain -- This module finds the highest existing archive number for a set of talk -- archive pages. local expSearch = require('Module:Exponential search') local p = {} local function raiseStartNumberError(start) error(string.format( 'Invalid start number "%s" supplied to [[Module:Highest archive number]] (must be an integer)', tostring(start) ), 3) end local function pageExists(page) local success, exists = pcall(function() return mw.title.new(page).exists end) return success and exists end function p._main(prefix, start) -- Check our inputs if type(prefix) ~= 'string' or not prefix:find('%S') then error('No prefix supplied to [[Module:Highest archive number]]', 2) end if start ~= nil and (type(start) ~= "number" or math.floor(start) ~= start) then raiseStartNumberError(start) end start = start or 1 -- Do an exponential search for the highest archive number local result = expSearch(function (i) local archiveNumber = i + start - 1 local page = prefix .. tostring(archiveNumber) return pageExists(page) end, 10) if result == nil then -- We didn't find any archives for our prefix + start number return nil else -- We found the highest archive, but the number is always 1-based, so -- adjust it for our start number return result + start - 1 end end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { trim = false, removeBlanks = false, wrappers = 'Template:Highest archive number' }) local prefix = args[1] -- Get the start archive number, if specified. local start = args.start if start == "" then start = nil elseif start then start = tonumber(start) if not start then raiseStartNumberError(args.start) end end return p._main(prefix, start) end return p h3czqly5m6n03xkq0oyziwlta1lovvd มอดูล:Exponential search 828 71 268 2025-11-23T09:01:16Z Taweetham 7 จากวิกิพีเดีย 268 Scribunto text/plain -- This module provides a generic exponential search algorithm. require[[strict]] local checkType = require('libraryUtil').checkType local floor = math.floor local function midPoint(lower, upper) return floor(lower + (upper - lower) / 2) end local function search(testFunc, i, lower, upper) if testFunc(i) then if i + 1 == upper then return i end lower = i if upper then i = midPoint(lower, upper) else i = i * 2 end return search(testFunc, i, lower, upper) else upper = i i = midPoint(lower, upper) return search(testFunc, i, lower, upper) end end return function (testFunc, init) checkType('Exponential search', 1, testFunc, 'function') checkType('Exponential search', 2, init, 'number', true) if init and (init < 1 or init ~= floor(init) or init == math.huge) then error(string.format( "invalid init value '%s' detected in argument #2 to " .. "'Exponential search' (init value must be a positive integer)", tostring(init) ), 2) end init = init or 2 if not testFunc(1) then return nil end return search(testFunc, init, 1, nil) end jqqi8l27tb73lglksbukg2g3bzt3fmv แม่แบบ:คู่มือการใช้งาน 10 72 269 2025-11-23T09:02:23Z Taweetham 7 จากวิกิพีเดีย 269 wikitext text/x-wiki {{#invoke:documentation|main|_content={{ {{#invoke:documentation|contentTitle}}}}}}<noinclude> <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> o4ddn701tao1ufdnkxe1wdgz5b5ga84 มอดูล:Documentation 828 73 270 2025-11-23T09:02:58Z Taweetham 7 สร้างหน้าด้วย "-- This module implements {{documentation}}. -- Get required modules. local getArgs = require('Module:Arguments').getArgs -- Get the config table. local cfg = mw.loadData('Module:Documentation/config') local p = {} -- Often-used functions. local ugsub = mw.ustring.gsub local format = mw.ustring.format ---------------------------------------------------------------------------- -- Helper functions -- -- These are defined as local functions, but..." 270 Scribunto text/plain -- This module implements {{documentation}}. -- Get required modules. local getArgs = require('Module:Arguments').getArgs -- Get the config table. local cfg = mw.loadData('Module:Documentation/config') local p = {} -- Often-used functions. local ugsub = mw.ustring.gsub local format = mw.ustring.format ---------------------------------------------------------------------------- -- Helper functions -- -- These are defined as local functions, but are made available in the p -- table for testing purposes. ---------------------------------------------------------------------------- local function message(cfgKey, valArray, expectType) --[[ -- Gets a message from the cfg table and formats it if appropriate. -- The function raises an error if the value from the cfg table is not -- of the type expectType. The default type for expectType is 'string'. -- If the table valArray is present, strings such as $1, $2 etc. in the -- message are substituted with values from the table keys [1], [2] etc. -- For example, if the message "foo-message" had the value 'Foo $2 bar $1.', -- message('foo-message', {'baz', 'qux'}) would return "Foo qux bar baz." --]] local msg = cfg[cfgKey] expectType = expectType or 'string' if type(msg) ~= expectType then error('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2) end if not valArray then return msg end local function getMessageVal(match) match = tonumber(match) return valArray[match] or error('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4) end return ugsub(msg, '$([1-9][0-9]*)', getMessageVal) end p.message = message local function makeWikilink(page, display) if display then return format('[[%s|%s]]', page, display) else return format('[[%s]]', page) end end p.makeWikilink = makeWikilink local function makeCategoryLink(cat, sort) local catns = mw.site.namespaces[14].name return makeWikilink(catns .. ':' .. cat, sort) end p.makeCategoryLink = makeCategoryLink local function makeUrlLink(url, display) return format('[%s %s]', url, display) end p.makeUrlLink = makeUrlLink local function makeToolbar(...) local ret = {} local lim = select('#', ...) if lim < 1 then return nil end for i = 1, lim do ret[#ret + 1] = select(i, ...) end -- 'documentation-toolbar' return format( '<span class="%s">(%s)</span>', message('toolbar-class'), table.concat(ret, ' &#124; ') ) end p.makeToolbar = makeToolbar ---------------------------------------------------------------------------- -- Argument processing ---------------------------------------------------------------------------- local function makeInvokeFunc(funcName) return function (frame) local args = getArgs(frame, { valueFunc = function (key, value) if type(value) == 'string' then value = value:match('^%s*(.-)%s*$') -- Remove whitespace. if key == 'heading' or value ~= '' then return value else return nil end else return value end end }) return p[funcName](args) end end ---------------------------------------------------------------------------- -- Entry points ---------------------------------------------------------------------------- function p.nonexistent(frame) if mw.title.getCurrentTitle().subpageText == 'testcases' then return frame:expandTemplate{title = 'module test cases notice'} else return p.main(frame) end end p.main = makeInvokeFunc('_main') function p._main(args) --[[ -- This function defines logic flow for the module. -- @args - table of arguments passed by the user --]] local env = p.getEnvironment(args) local root = mw.html.create() root :wikitext(p._getModuleWikitext(args, env)) :wikitext(p.protectionTemplate(env)) :wikitext(p.sandboxNotice(args, env)) :tag('div') -- 'documentation-container' :addClass(message('container')) :attr('role', 'complementary') :attr('aria-labelledby', args.heading ~= '' and 'documentation-heading' or nil) :attr('aria-label', args.heading == '' and 'Documentation' or nil) :newline() :tag('div') -- 'documentation' :addClass(message('main-div-classes')) :newline() :wikitext(p._startBox(args, env)) :wikitext(p._content(args, env)) :tag('div') -- 'documentation-clear' :addClass(message('clear')) :done() :newline() :done() :wikitext(p._endBox(args, env)) :done() :wikitext(p.addTrackingCategories(env)) -- 'Module:Documentation/styles.css' return mw.getCurrentFrame():extensionTag ( 'templatestyles', '', {src=cfg['templatestyles'] }) .. tostring(root) end ---------------------------------------------------------------------------- -- Environment settings ---------------------------------------------------------------------------- function p.getEnvironment(args) --[[ -- Returns a table with information about the environment, including title -- objects and other namespace- or path-related data. -- @args - table of arguments passed by the user -- -- Title objects include: -- env.title - the page we are making documentation for (usually the current title) -- env.templateTitle - the template (or module, file, etc.) -- env.docTitle - the /doc subpage. -- env.sandboxTitle - the /sandbox subpage. -- env.testcasesTitle - the /testcases subpage. -- -- Data includes: -- env.protectionLevels - the protection levels table of the title object. -- env.subjectSpace - the number of the title's subject namespace. -- env.docSpace - the number of the namespace the title puts its documentation in. -- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace. -- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template. -- -- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value -- returned will be nil. --]] local env, envFuncs = {}, {} -- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value -- returned by that function is memoized in the env table so that we don't call any of the functions -- more than once. (Nils won't be memoized.) setmetatable(env, { __index = function (t, key) local envFunc = envFuncs[key] if envFunc then local success, val = pcall(envFunc) if success then env[key] = val -- Memoise the value. return val end end return nil end }) function envFuncs.title() -- The title object for the current page, or a test page passed with args.page. local title local titleArg = args.page if titleArg then title = mw.title.new(titleArg) else title = mw.title.getCurrentTitle() end return title end function envFuncs.templateTitle() --[[ -- The template (or module, etc.) title object. -- Messages: -- 'sandbox-subpage' --> 'sandbox' -- 'testcases-subpage' --> 'testcases' --]] local subjectSpace = env.subjectSpace local title = env.title local subpage = title.subpageText if subpage == message('sandbox-subpage') or subpage == message('testcases-subpage') then return mw.title.makeTitle(subjectSpace, title.baseText) else return mw.title.makeTitle(subjectSpace, title.text) end end function envFuncs.docTitle() --[[ -- Title object of the /doc subpage. -- Messages: -- 'doc-subpage' --> 'doc' --]] local title = env.title local docname = args[1] -- User-specified doc page. local docpage if docname then docpage = docname else docpage = env.docpageBase .. '/' .. message('doc-subpage') end return mw.title.new(docpage) end function envFuncs.sandboxTitle() --[[ -- Title object for the /sandbox subpage. -- Messages: -- 'sandbox-subpage' --> 'sandbox' --]] return mw.title.new(env.docpageBase .. '/' .. message('sandbox-subpage')) end function envFuncs.testcasesTitle() --[[ -- Title object for the /testcases subpage. -- Messages: -- 'testcases-subpage' --> 'testcases' --]] return mw.title.new(env.docpageBase .. '/' .. message('testcases-subpage')) end function envFuncs.protectionLevels() -- The protection levels table of the title object. return env.title.protectionLevels end function envFuncs.subjectSpace() -- The subject namespace number. return mw.site.namespaces[env.title.namespace].subject.id end function envFuncs.docSpace() -- The documentation namespace number. For most namespaces this is the -- same as the subject namespace. However, pages in the Article, File, -- MediaWiki or Category namespaces must have their /doc, /sandbox and -- /testcases pages in talk space. local subjectSpace = env.subjectSpace if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then return subjectSpace + 1 else return subjectSpace end end function envFuncs.docpageBase() -- The base page of the /doc, /sandbox, and /testcases subpages. -- For some namespaces this is the talk page, rather than the template page. local templateTitle = env.templateTitle local docSpace = env.docSpace local docSpaceText = mw.site.namespaces[docSpace].name -- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon. return docSpaceText .. ':' .. templateTitle.text end function envFuncs.compareUrl() -- Diff link between the sandbox and the main template using [[Special:ComparePages]]. local templateTitle = env.templateTitle local sandboxTitle = env.sandboxTitle if templateTitle.exists and sandboxTitle.exists then local compareUrl = mw.uri.canonicalUrl( 'Special:ComparePages', { page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText} ) return tostring(compareUrl) else return nil end end return env end ---------------------------------------------------------------------------- -- Auxiliary templates ---------------------------------------------------------------------------- p.getModuleWikitext = makeInvokeFunc('_getModuleWikitext') function p._getModuleWikitext(args, env) local currentTitle = mw.title.getCurrentTitle() if currentTitle.contentModel ~= 'Scribunto' then return end pcall(require, currentTitle.prefixedText) -- if it fails, we don't care local moduleWikitext = package.loaded["Module:Module wikitext"] if moduleWikitext then return moduleWikitext.main() end end function p.sandboxNotice(args, env) --[=[ -- Generates a sandbox notice for display above sandbox pages. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- Messages: -- 'sandbox-notice-image' --> '[[File:Sandbox.svg|50px|alt=|link=]]' -- 'sandbox-notice-blurb' --> 'This is the $1 for $2.' -- 'sandbox-notice-diff-blurb' --> 'This is the $1 for $2 ($3).' -- 'sandbox-notice-pagetype-template' --> '[[Wikipedia:Template test cases|template sandbox]] page' -- 'sandbox-notice-pagetype-module' --> '[[Wikipedia:Template test cases|module sandbox]] page' -- 'sandbox-notice-pagetype-other' --> 'sandbox page' -- 'sandbox-notice-compare-link-display' --> 'diff' -- 'sandbox-notice-testcases-blurb' --> 'See also the companion subpage for $1.' -- 'sandbox-notice-testcases-link-display' --> 'test cases' -- 'sandbox-category' --> 'Template sandboxes' -- 'module-sandbox-category' --> 'Module sandboxes' -- 'other-sandbox-category' --> 'Sandboxes outside of template or module namespace' --]=] local title = env.title local sandboxTitle = env.sandboxTitle local templateTitle = env.templateTitle local subjectSpace = env.subjectSpace if not (subjectSpace and title and sandboxTitle and templateTitle and mw.title.equals(title, sandboxTitle)) then return nil end -- Build the table of arguments to pass to {{ombox}}. We need just two fields, "image" and "text". local omargs = {} omargs.image = message('sandbox-notice-image') -- Get the text. We start with the opening blurb, which is something like -- "This is the template sandbox for [[Template:Foo]] (diff)." local text = '__EXPECTUNUSEDTEMPLATE__' local pagetype, sandboxCat if subjectSpace == 10 then pagetype = message('sandbox-notice-pagetype-template') sandboxCat = message('sandbox-category') elseif subjectSpace == 828 then pagetype = message('sandbox-notice-pagetype-module') sandboxCat = message('module-sandbox-category') else pagetype = message('sandbox-notice-pagetype-other') sandboxCat = message('other-sandbox-category') end local templateLink = makeWikilink(templateTitle.prefixedText) local compareUrl = env.compareUrl if compareUrl then local compareDisplay = message('sandbox-notice-compare-link-display') local compareLink = makeUrlLink(compareUrl, compareDisplay) text = text .. message('sandbox-notice-diff-blurb', {pagetype, templateLink, compareLink}) else text = text .. message('sandbox-notice-blurb', {pagetype, templateLink}) end -- Get the test cases page blurb if the page exists. This is something like -- "See also the companion subpage for [[Template:Foo/testcases|test cases]]." local testcasesTitle = env.testcasesTitle if testcasesTitle and testcasesTitle.exists then if testcasesTitle.contentModel == "Scribunto" then local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display') local testcasesRunLinkDisplay = message('sandbox-notice-testcases-run-link-display') local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay) local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay) text = text .. '<br />' .. message('sandbox-notice-testcases-run-blurb', {testcasesLink, testcasesRunLink}) else local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display') local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay) text = text .. '<br />' .. message('sandbox-notice-testcases-blurb', {testcasesLink}) end end -- Add the sandbox to the sandbox category. omargs.text = text .. makeCategoryLink(sandboxCat) -- 'documentation-clear' return '<div class="' .. message('clear') .. '"></div>' .. require('Module:Message box').main('ombox', omargs) end function p.protectionTemplate(env) -- Generates the padlock icon in the top right. -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- Messages: -- 'protection-template' --> 'pp-template' -- 'protection-template-args' --> {docusage = 'yes'} local protectionLevels = env.protectionLevels if not protectionLevels then return nil end local editProt = protectionLevels.edit and protectionLevels.edit[1] local moveProt = protectionLevels.move and protectionLevels.move[1] if editProt then -- The page is edit-protected. return require('Module:Protection banner')._main{ message('protection-reason-edit'), small = true } elseif moveProt and moveProt ~= 'autoconfirmed' then -- The page is move-protected but not edit-protected. Exclude move -- protection with the level "autoconfirmed", as this is equivalent to -- no move protection at all. return require('Module:Protection banner')._main{ action = 'move', small = true } else return nil end end ---------------------------------------------------------------------------- -- Start box ---------------------------------------------------------------------------- p.startBox = makeInvokeFunc('_startBox') function p._startBox(args, env) --[[ -- This function generates the start box. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make -- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox -- which generate the box HTML. --]] env = env or p.getEnvironment(args) local links local content = args.content if not content or args[1] then -- No need to include the links if the documentation is on the template page itself. local linksData = p.makeStartBoxLinksData(args, env) if linksData then links = p.renderStartBoxLinks(linksData) end end -- Generate the start box html. local data = p.makeStartBoxData(args, env, links) if data then return p.renderStartBox(data) else -- User specified no heading. return nil end end function p.makeStartBoxLinksData(args, env) --[[ -- Does initial processing of data to make the [view] [edit] [history] [purge] links. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- Messages: -- 'view-link-display' --> 'view' -- 'edit-link-display' --> 'edit' -- 'history-link-display' --> 'history' -- 'purge-link-display' --> 'purge' -- 'module-preload' --> 'Template:Documentation/preload-module-doc' -- 'docpage-preload' --> 'Template:Documentation/preload' -- 'create-link-display' --> 'create' --]] local subjectSpace = env.subjectSpace local title = env.title local docTitle = env.docTitle if not title or not docTitle then return nil end if docTitle.isRedirect then docTitle = docTitle.redirectTarget end -- Create link if /doc doesn't exist. local preload = args.preload if not preload then if subjectSpace == 828 then -- Module namespace preload = message('module-preload') else preload = message('docpage-preload') end end return { title = title, docTitle = docTitle, -- View, display, edit, and purge links if /doc exists. viewLinkDisplay = message('view-link-display'), editLinkDisplay = message('edit-link-display'), historyLinkDisplay = message('history-link-display'), purgeLinkDisplay = message('purge-link-display'), preload = preload, createLinkDisplay = message('create-link-display') } end function p.renderStartBoxLinks(data) --[[ -- Generates the [view][edit][history][purge] or [create][purge] links from the data table. -- @data - a table of data generated by p.makeStartBoxLinksData --]] local docTitle = data.docTitle -- yes, we do intend to purge the template page on which the documentation appears local purgeLink = makeWikilink("Special:Purge/" .. data.title.prefixedText, data.purgeLinkDisplay) if docTitle.exists then local viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay) local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, data.editLinkDisplay) local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, data.historyLinkDisplay) return "&#91;" .. viewLink .. "&#93; &#91;" .. editLink .. "&#93; &#91;" .. historyLink .. "&#93; &#91;" .. purgeLink .. "&#93;" else local createLink = makeUrlLink(docTitle:canonicalUrl{action = 'edit', preload = data.preload}, data.createLinkDisplay) return "&#91;" .. createLink .. "&#93; &#91;" .. purgeLink .. "&#93;" end return ret end function p.makeStartBoxData(args, env, links) --[=[ -- Does initial processing of data to pass to the start-box render function, p.renderStartBox. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- @links - a string containing the [view][edit][history][purge] links - could be nil if there's an error. -- -- Messages: -- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]' -- 'template-namespace-heading' --> 'Template documentation' -- 'module-namespace-heading' --> 'Module documentation' -- 'file-namespace-heading' --> 'Summary' -- 'other-namespaces-heading' --> 'Documentation' -- 'testcases-create-link-display' --> 'create' --]=] local subjectSpace = env.subjectSpace if not subjectSpace then -- Default to an "other namespaces" namespace, so that we get at least some output -- if an error occurs. subjectSpace = 2 end local data = {} -- Heading local heading = args.heading -- Blank values are not removed. if heading == '' then -- Don't display the start box if the heading arg is defined but blank. return nil end if heading then data.heading = heading elseif subjectSpace == 10 then -- Template namespace data.heading = message('documentation-icon-wikitext') .. ' ' .. message('template-namespace-heading') elseif subjectSpace == 828 then -- Module namespace data.heading = message('documentation-icon-wikitext') .. ' ' .. message('module-namespace-heading') elseif subjectSpace == 6 then -- File namespace data.heading = message('file-namespace-heading') else data.heading = message('other-namespaces-heading') end -- Heading CSS local headingStyle = args['heading-style'] if headingStyle then data.headingStyleText = headingStyle else -- 'documentation-heading' data.headingClass = message('main-div-heading-class') end -- Data for the [view][edit][history][purge] or [create] links. if links then -- 'mw-editsection-like plainlinks' data.linksClass = message('start-box-link-classes') data.links = links end return data end function p.renderStartBox(data) -- Renders the start box html. -- @data - a table of data generated by p.makeStartBoxData. local sbox = mw.html.create('div') sbox -- 'documentation-startbox' :addClass(message('start-box-class')) :newline() :tag('span') :addClass(data.headingClass) :attr('id', 'documentation-heading') :cssText(data.headingStyleText) :wikitext(data.heading) local links = data.links if links then sbox:tag('span') :addClass(data.linksClass) :attr('id', data.linksId) :wikitext(links) end return tostring(sbox) end ---------------------------------------------------------------------------- -- Documentation content ---------------------------------------------------------------------------- p.content = makeInvokeFunc('_content') function p._content(args, env) -- Displays the documentation contents -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment env = env or p.getEnvironment(args) local docTitle = env.docTitle local content = args.content if not content and docTitle and docTitle.exists then content = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText} end -- The line breaks below are necessary so that "=== Headings ===" at the start and end -- of docs are interpreted correctly. return '\n' .. (content or '') .. '\n' end p.contentTitle = makeInvokeFunc('_contentTitle') function p._contentTitle(args, env) env = env or p.getEnvironment(args) local docTitle = env.docTitle if not args.content and docTitle and docTitle.exists then return docTitle.prefixedText else return '' end end ---------------------------------------------------------------------------- -- End box ---------------------------------------------------------------------------- p.endBox = makeInvokeFunc('_endBox') function p._endBox(args, env) --[=[ -- This function generates the end box (also known as the link box). -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- --]=] -- Get environment data. env = env or p.getEnvironment(args) local subjectSpace = env.subjectSpace local docTitle = env.docTitle if not subjectSpace or not docTitle then return nil end -- Check whether we should output the end box at all. Add the end -- box by default if the documentation exists or if we are in the -- user, module or template namespaces. local linkBox = args['link box'] if linkBox == 'off' or not ( docTitle.exists or subjectSpace == 2 or subjectSpace == 828 or subjectSpace == 10 ) then return nil end -- Assemble the link box. local text = '' if linkBox then text = text .. linkBox else text = text .. (p.makeDocPageBlurb(args, env) or '') -- "This documentation is transcluded from [[Foo]]." if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then -- We are in the user, template or module namespaces. -- Add sandbox and testcases links. -- "Editors can experiment in this template's sandbox and testcases pages." text = text .. (p.makeExperimentBlurb(args, env) or '') .. '<br />' if not args.content and not args[1] then -- "Please add categories to the /doc subpage." -- Don't show this message with inline docs or with an explicitly specified doc page, -- as then it is unclear where to add the categories. text = text .. (p.makeCategoriesBlurb(args, env) or '') end text = text .. ' ' .. (p.makeSubpagesBlurb(args, env) or '') --"Subpages of this template" end end local box = mw.html.create('div') -- 'documentation-metadata' box:attr('role', 'note') :addClass(message('end-box-class')) -- 'plainlinks' :addClass(message('end-box-plainlinks')) :wikitext(text) :done() return '\n' .. tostring(box) end function p.makeDocPageBlurb(args, env) --[=[ -- Makes the blurb "This documentation is transcluded from [[Template:Foo]] (edit, history)". -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- Messages: -- 'edit-link-display' --> 'edit' -- 'history-link-display' --> 'history' -- 'transcluded-from-blurb' --> -- 'The above [[Wikipedia:Template documentation|documentation]] -- is [[Help:Transclusion|transcluded]] from $1.' -- 'module-preload' --> 'Template:Documentation/preload-module-doc' -- 'create-link-display' --> 'create' -- 'create-module-doc-blurb' --> -- 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].' --]=] local docTitle = env.docTitle if not docTitle then return nil end if docTitle.exists then -- /doc exists; link to it. local docLink = makeWikilink(docTitle.prefixedText) local editDisplay = message('edit-link-display') local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, editDisplay) local historyDisplay = message('history-link-display') local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, historyDisplay) return message('transcluded-from-blurb', {docLink}) .. ' ' .. makeToolbar(editLink, historyLink) .. '<br />' elseif env.subjectSpace == 828 then -- /doc does not exist; ask to create it. local createUrl = docTitle:canonicalUrl{action = 'edit', preload = message('module-preload')} local createDisplay = message('create-link-display') local createLink = makeUrlLink(createUrl, createDisplay) return message('create-module-doc-blurb', {createLink}) .. '<br />' end end function p.makeExperimentBlurb(args, env) --[[ -- Renders the text "Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages." -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- Messages: -- 'sandbox-link-display' --> 'sandbox' -- 'sandbox-edit-link-display' --> 'edit' -- 'compare-link-display' --> 'diff' -- 'module-sandbox-preload' --> 'Template:Documentation/preload-module-sandbox' -- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox' -- 'sandbox-create-link-display' --> 'create' -- 'mirror-edit-summary' --> 'Create sandbox version of $1' -- 'mirror-link-display' --> 'mirror' -- 'mirror-link-preload' --> 'Template:Documentation/mirror' -- 'sandbox-link-display' --> 'sandbox' -- 'testcases-link-display' --> 'testcases' -- 'testcases-edit-link-display'--> 'edit' -- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox' -- 'testcases-create-link-display' --> 'create' -- 'testcases-link-display' --> 'testcases' -- 'testcases-edit-link-display' --> 'edit' -- 'module-testcases-preload' --> 'Template:Documentation/preload-module-testcases' -- 'template-testcases-preload' --> 'Template:Documentation/preload-testcases' -- 'experiment-blurb-module' --> 'Editors can experiment in this module's $1 and $2 pages.' -- 'experiment-blurb-template' --> 'Editors can experiment in this template's $1 and $2 pages.' --]] local subjectSpace = env.subjectSpace local templateTitle = env.templateTitle local sandboxTitle = env.sandboxTitle local testcasesTitle = env.testcasesTitle local templatePage = templateTitle.prefixedText if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then return nil end -- Make links. local sandboxLinks, testcasesLinks if sandboxTitle.exists then local sandboxPage = sandboxTitle.prefixedText local sandboxDisplay = message('sandbox-link-display') local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay) local sandboxEditDisplay = message('sandbox-edit-link-display') local sandboxEditLink = makeWikilink("Special:EditPage/" .. sandboxPage, sandboxEditDisplay) local compareUrl = env.compareUrl local compareLink if compareUrl then local compareDisplay = message('compare-link-display') compareLink = makeUrlLink(compareUrl, compareDisplay) end sandboxLinks = sandboxLink .. ' ' .. makeToolbar(sandboxEditLink, compareLink) else local sandboxPreload if subjectSpace == 828 then sandboxPreload = message('module-sandbox-preload') else sandboxPreload = message('template-sandbox-preload') end local sandboxCreateUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = sandboxPreload} local sandboxCreateDisplay = message('sandbox-create-link-display') local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay) local mirrorSummary = message('mirror-edit-summary', {makeWikilink(templatePage)}) local mirrorPreload = message('mirror-link-preload') local mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary} if subjectSpace == 828 then mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = templateTitle.prefixedText, summary = mirrorSummary} end local mirrorDisplay = message('mirror-link-display') local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay) sandboxLinks = message('sandbox-link-display') .. ' ' .. makeToolbar(sandboxCreateLink, mirrorLink) end if testcasesTitle.exists then local testcasesPage = testcasesTitle.prefixedText local testcasesDisplay = message('testcases-link-display') local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay) local testcasesEditUrl = testcasesTitle:canonicalUrl{action = 'edit'} local testcasesEditDisplay = message('testcases-edit-link-display') local testcasesEditLink = makeWikilink("Special:EditPage/" .. testcasesPage, testcasesEditDisplay) -- for Modules, add testcases run link if exists if testcasesTitle.contentModel == "Scribunto" and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists then local testcasesRunLinkDisplay = message('testcases-run-link-display') local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay) testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink, testcasesRunLink) else testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink) end else local testcasesPreload if subjectSpace == 828 then testcasesPreload = message('module-testcases-preload') else testcasesPreload = message('template-testcases-preload') end local testcasesCreateUrl = testcasesTitle:canonicalUrl{action = 'edit', preload = testcasesPreload} local testcasesCreateDisplay = message('testcases-create-link-display') local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay) testcasesLinks = message('testcases-link-display') .. ' ' .. makeToolbar(testcasesCreateLink) end local messageName if subjectSpace == 828 then messageName = 'experiment-blurb-module' else messageName = 'experiment-blurb-template' end return message(messageName, {sandboxLinks, testcasesLinks}) end function p.makeCategoriesBlurb(args, env) --[[ -- Generates the text "Please add categories to the /doc subpage." -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- Messages: -- 'doc-link-display' --> '/doc' -- 'add-categories-blurb' --> 'Please add categories to the $1 subpage.' --]] local docTitle = env.docTitle if not docTitle then return nil end local docPathLink = makeWikilink(docTitle.prefixedText, message('doc-link-display')) return message('add-categories-blurb', {docPathLink}) end function p.makeSubpagesBlurb(args, env) --[[ -- Generates the "Subpages of this template" link. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- Messages: -- 'template-pagetype' --> 'template' -- 'module-pagetype' --> 'module' -- 'default-pagetype' --> 'page' -- 'subpages-link-display' --> 'Subpages of this $1' --]] local subjectSpace = env.subjectSpace local templateTitle = env.templateTitle if not subjectSpace or not templateTitle then return nil end local pagetype if subjectSpace == 10 then pagetype = message('template-pagetype') elseif subjectSpace == 828 then pagetype = message('module-pagetype') else pagetype = message('default-pagetype') end local subpagesLink = makeWikilink( 'Special:PrefixIndex/' .. templateTitle.prefixedText .. '/', message('subpages-link-display', {pagetype}) ) return message('subpages-blurb', {subpagesLink}) end ---------------------------------------------------------------------------- -- Tracking categories ---------------------------------------------------------------------------- function p.addTrackingCategories(env) --[[ -- Check if {{documentation}} is transcluded on a /doc or /testcases page. -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- Messages: -- 'display-strange-usage-category' --> true -- 'doc-subpage' --> 'doc' -- 'testcases-subpage' --> 'testcases' -- 'strange-usage-category' --> 'Wikipedia pages with strange ((documentation)) usage' -- -- /testcases pages in the module namespace are not categorised, as they may have -- {{documentation}} transcluded automatically. --]] local title = env.title local subjectSpace = env.subjectSpace if not title or not subjectSpace then return nil end local subpage = title.subpageText if message('display-strange-usage-category', nil, 'boolean') and ( subpage == message('doc-subpage') or subjectSpace ~= 828 and subpage == message('testcases-subpage') ) then return makeCategoryLink(message('strange-usage-category')) end return '' end return p ky7myqtha9rjaznz4jxomjtdpuanlqs มอดูล:Documentation/config 828 74 271 2025-11-23T09:04:02Z Taweetham 7 Thai Wikipedia 271 Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- -- Configuration for Module:Documentation -- -- Here you can set the values of the parameters and messages used in Module:Documentation to -- localise it to your wiki and your language. Unless specified otherwise, values given here -- should be string values. ---------------------------------------------------------------------------------------------------- local cfg = {} -- Do not edit this line. ---------------------------------------------------------------------------------------------------- -- Protection template configuration ---------------------------------------------------------------------------------------------------- -- cfg['protection-reason-edit'] -- The protection reason for edit-protected templates to pass to -- [[Module:Protection banner]]. cfg['protection-reason-edit'] = 'template' --[[ ---------------------------------------------------------------------------------------------------- -- Sandbox notice configuration -- -- On sandbox pages the module can display a template notifying users that the current page is a -- sandbox, and the location of test cases pages, etc. The module decides whether the page is a -- sandbox or not based on the value of cfg['sandbox-subpage']. The following settings configure the -- messages that the notices contains. ---------------------------------------------------------------------------------------------------- --]] -- cfg['sandbox-notice-image'] -- The image displayed in the sandbox notice. cfg['sandbox-notice-image'] = '[[File:Sandbox.svg|50px|alt=|link=]]' --[[ -- cfg['sandbox-notice-pagetype-template'] -- cfg['sandbox-notice-pagetype-module'] -- cfg['sandbox-notice-pagetype-other'] -- The page type of the sandbox page. The message that is displayed depends on the current subject -- namespace. This message is used in either cfg['sandbox-notice-blurb'] or -- cfg['sandbox-notice-diff-blurb']. --]] cfg['sandbox-notice-pagetype-template'] = 'หน้า[[:en:Wikipedia:Template test cases|กระบะทรายแม่แบบ]]' cfg['sandbox-notice-pagetype-module'] = 'หน้า[[:en:Wikipedia:Template test cases|กระบะทรายมอดูล]]' cfg['sandbox-notice-pagetype-other'] = 'หน้ากระบะทราย' --[[ -- cfg['sandbox-notice-blurb'] -- cfg['sandbox-notice-diff-blurb'] -- cfg['sandbox-notice-diff-display'] -- Either cfg['sandbox-notice-blurb'] or cfg['sandbox-notice-diff-blurb'] is the opening sentence -- of the sandbox notice. The latter has a diff link, but the former does not. $1 is the page -- type, which is either cfg['sandbox-notice-pagetype-template'], -- cfg['sandbox-notice-pagetype-module'] or cfg['sandbox-notice-pagetype-other'] depending what -- namespace we are in. $2 is a link to the main template page, and $3 is a diff link between -- the sandbox and the main template. The display value of the diff link is set by -- cfg['sandbox-notice-compare-link-display']. --]] cfg['sandbox-notice-blurb'] = 'หน้านี้คือ$1ของ $2' cfg['sandbox-notice-diff-blurb'] = 'หน้านี้คือ$1ของ $2 ($3)' cfg['sandbox-notice-compare-link-display'] = 'ดูความแตกต่าง' --[[ -- cfg['sandbox-notice-testcases-blurb'] -- cfg['sandbox-notice-testcases-link-display'] -- cfg['sandbox-notice-testcases-run-blurb'] -- cfg['sandbox-notice-testcases-run-link-display'] -- cfg['sandbox-notice-testcases-blurb'] is a sentence notifying the user that there is a test cases page -- corresponding to this sandbox that they can edit. $1 is a link to the test cases page. -- cfg['sandbox-notice-testcases-link-display'] is the display value for that link. -- cfg['sandbox-notice-testcases-run-blurb'] is a sentence notifying the user that there is a test cases page -- corresponding to this sandbox that they can edit, along with a link to run it. $1 is a link to the test -- cases page, and $2 is a link to the page to run it. -- cfg['sandbox-notice-testcases-run-link-display'] is the display value for the link to run the test -- cases. --]] cfg['sandbox-notice-testcases-blurb'] = 'ดูเพิ่มที่หน้าย่อย$1' cfg['sandbox-notice-testcases-link-display'] = 'ชุดทดสอบ' cfg['sandbox-notice-testcases-run-blurb'] = 'ดูเพิ่มที่หน้าย่อย$1 ($2)' cfg['sandbox-notice-testcases-run-link-display'] = 'ดูผล' -- cfg['sandbox-category'] - A category to add to all template sandboxes. -- cfg['module-sandbox-category'] - A category to add to all module sandboxes. -- cfg['module-sandbox-category'] - A category to add to all sandboxe not in templates or modules. cfg['sandbox-category'] = 'กระบะทรายแม่แบบ' cfg['module-sandbox-category'] = 'กระบะทรายมอดูล' cfg['other-sandbox-category'] = 'หน้ากระบะทรายนอกเนมสเปซแม่แบบหรือมอดูล' ---------------------------------------------------------------------------------------------------- -- Start box configuration ---------------------------------------------------------------------------------------------------- -- cfg['documentation-icon-wikitext'] -- The wikitext for the icon shown at the top of the template. cfg['documentation-icon-wikitext'] = '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]' -- cfg['template-namespace-heading'] -- The heading shown in the template namespace. cfg['template-namespace-heading'] = 'คู่มือการใช้งานแม่แบบ' -- cfg['module-namespace-heading'] -- The heading shown in the module namespace. cfg['module-namespace-heading'] = 'คู่มือการใช้งานมอดูล' -- cfg['file-namespace-heading'] -- The heading shown in the file namespace. cfg['file-namespace-heading'] = 'ข้อบ่งชี้การใช้งาน' -- cfg['other-namespaces-heading'] -- The heading shown in other namespaces. cfg['other-namespaces-heading'] = 'คู่มือการใช้งาน' -- cfg['view-link-display'] -- The text to display for "view" links. cfg['view-link-display'] = 'ดู' -- cfg['edit-link-display'] -- The text to display for "edit" links. cfg['edit-link-display'] = 'แก้' -- cfg['history-link-display'] -- The text to display for "history" links. cfg['history-link-display'] = 'ประวัติ' -- cfg['purge-link-display'] -- The text to display for "purge" links. cfg['purge-link-display'] = 'ล้างแคช' -- cfg['create-link-display'] -- The text to display for "create" links. cfg['create-link-display'] = 'สร้าง' ---------------------------------------------------------------------------------------------------- -- Link box (end box) configuration ---------------------------------------------------------------------------------------------------- -- cfg['transcluded-from-blurb'] -- Notice displayed when the docs are transcluded from another page. $1 is a wikilink to that page. cfg['transcluded-from-blurb'] = '[[:en:Wikipedia:Template documentation|คู่มือการใช้งาน]]ที่ปรากฏด้านบนนี้ดึงมาจาก $1' --[[ -- cfg['create-module-doc-blurb'] -- Notice displayed in the module namespace when the documentation subpage does not exist. -- $1 is a link to create the documentation page with the preload cfg['module-preload'] and the -- display cfg['create-link-display']. --]] cfg['create-module-doc-blurb'] = 'คุณอาจจะต้องการ$1คู่มือการใช้งานของ[[WP:LUA|มอดูล]]นี้' ---------------------------------------------------------------------------------------------------- -- Experiment blurb configuration ---------------------------------------------------------------------------------------------------- --[[ -- cfg['experiment-blurb-template'] -- cfg['experiment-blurb-module'] -- The experiment blurb is the text inviting editors to experiment in sandbox and test cases pages. -- It is only shown in the template and module namespaces. With the default English settings, it -- might look like this: -- -- Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages. -- -- In this example, "sandbox", "edit", "diff", "testcases", and "edit" would all be links. -- -- There are two versions, cfg['experiment-blurb-template'] and cfg['experiment-blurb-module'], depending -- on what namespace we are in. -- -- Parameters: -- -- $1 is a link to the sandbox page. If the sandbox exists, it is in the following format: -- -- cfg['sandbox-link-display'] (cfg['sandbox-edit-link-display'] | cfg['compare-link-display']) -- -- If the sandbox doesn't exist, it is in the format: -- -- cfg['sandbox-link-display'] (cfg['sandbox-create-link-display'] | cfg['mirror-link-display']) -- -- The link for cfg['sandbox-create-link-display'] link preloads the page with cfg['template-sandbox-preload'] -- or cfg['module-sandbox-preload'], depending on the current namespace. The link for cfg['mirror-link-display'] -- loads a default edit summary of cfg['mirror-edit-summary']. -- -- $2 is a link to the test cases page. If the test cases page exists, it is in the following format: -- -- cfg['testcases-link-display'] (cfg['testcases-edit-link-display'] | cfg['testcases-run-link-display']) -- -- If the test cases page doesn't exist, it is in the format: -- -- cfg['testcases-link-display'] (cfg['testcases-create-link-display']) -- -- If the test cases page doesn't exist, the link for cfg['testcases-create-link-display'] preloads the -- page with cfg['template-testcases-preload'] or cfg['module-testcases-preload'], depending on the current -- namespace. --]] cfg['experiment-blurb-template'] = "ผู้เขียนสามารถทำการทดลองได้ที่$1 และ$2 ของแม่แบบนี้" cfg['experiment-blurb-module'] = "ผู้เขียนสามารถทำการทดลองได้ที่$1 และ$2 ของมอดูลนี้" ---------------------------------------------------------------------------------------------------- -- Sandbox link configuration ---------------------------------------------------------------------------------------------------- -- cfg['sandbox-subpage'] -- The name of the template subpage typically used for sandboxes. cfg['sandbox-subpage'] = 'sandbox' -- cfg['template-sandbox-preload'] -- Preload file for template sandbox pages. cfg['template-sandbox-preload'] = 'แม่แบบ:คู่มือการใช้งาน/ข้อความล่วงหน้ากระบะทราย' -- cfg['module-sandbox-preload'] -- Preload file for Lua module sandbox pages. cfg['module-sandbox-preload'] = 'แม่แบบ:คู่มือการใช้งาน/ข้อความล่วงหน้ากระบะทรายมอดูล' -- cfg['sandbox-link-display'] -- The text to display for "sandbox" links. cfg['sandbox-link-display'] = 'กระบะทราย' -- cfg['sandbox-edit-link-display'] -- The text to display for sandbox "edit" links. cfg['sandbox-edit-link-display'] = 'แก้' -- cfg['sandbox-create-link-display'] -- The text to display for sandbox "create" links. cfg['sandbox-create-link-display'] = 'สร้าง' -- cfg['compare-link-display'] -- The text to display for "compare" links. cfg['compare-link-display'] = 'ดูความแตกต่าง' -- cfg['mirror-edit-summary'] -- The default edit summary to use when a user clicks the "mirror" link. $1 is a wikilink to the -- template page. cfg['mirror-edit-summary'] = 'สร้างหน้ากระบะทรายของ $1' -- cfg['mirror-link-display'] -- The text to display for "mirror" links. cfg['mirror-link-display'] = 'คัดลอก' -- cfg['mirror-link-preload'] -- The page to preload when a user clicks the "mirror" link. cfg['mirror-link-preload'] = 'Template:Documentation/mirror' ---------------------------------------------------------------------------------------------------- -- Test cases link configuration ---------------------------------------------------------------------------------------------------- -- cfg['testcases-subpage'] -- The name of the template subpage typically used for test cases. cfg['testcases-subpage'] = 'testcases' -- cfg['template-testcases-preload'] -- Preload file for template test cases pages. cfg['template-testcases-preload'] = 'แม่แบบ:คู่มือการใช้งาน/ข้อความล่วงหน้าชุดทดสอบ' -- cfg['module-testcases-preload'] -- Preload file for Lua module test cases pages. cfg['module-testcases-preload'] = 'แม่แบบ:คู่มือการใช้งาน/ข้อความล่วงหน้าชุดทดสอบมอดูล' -- cfg['testcases-link-display'] -- The text to display for "testcases" links. cfg['testcases-link-display'] = 'ชุดทดสอบ' -- cfg['testcases-edit-link-display'] -- The text to display for test cases "edit" links. cfg['testcases-edit-link-display'] = 'แก้' -- cfg['testcases-run-link-display'] -- The text to display for test cases "run" links. cfg['testcases-run-link-display'] = 'ดูผล' -- cfg['testcases-create-link-display'] -- The text to display for test cases "create" links. cfg['testcases-create-link-display'] = 'สร้าง' ---------------------------------------------------------------------------------------------------- -- Add categories blurb configuration ---------------------------------------------------------------------------------------------------- --[[ -- cfg['add-categories-blurb'] -- Text to direct users to add categories to the /doc subpage. Not used if the "content" or -- "docname fed" arguments are set, as then it is not clear where to add the categories. $1 is a -- link to the /doc subpage with a display value of cfg['doc-link-display']. --]] cfg['add-categories-blurb'] = 'โปรดเพิ่มหมวดหมู่ไปที่หน้าย่อย $1' -- cfg['doc-link-display'] -- The text to display when linking to the /doc subpage. cfg['doc-link-display'] = '/doc' ---------------------------------------------------------------------------------------------------- -- Subpages link configuration ---------------------------------------------------------------------------------------------------- --[[ -- cfg['subpages-blurb'] -- The "Subpages of this template" blurb. $1 is a link to the main template's subpages with a -- display value of cfg['subpages-link-display']. In the English version this blurb is simply -- the link followed by a period, and the link display provides the actual text. --]] cfg['subpages-blurb'] = '$1' --[[ -- cfg['subpages-link-display'] -- The text to display for the "subpages of this page" link. $1 is cfg['template-pagetype'], -- cfg['module-pagetype'] or cfg['default-pagetype'], depending on whether the current page is in -- the template namespace, the module namespace, or another namespace. --]] cfg['subpages-link-display'] = 'หน้าย่อยของ$1นี้' -- cfg['template-pagetype'] -- The pagetype to display for template pages. cfg['template-pagetype'] = 'แม่แบบ' -- cfg['module-pagetype'] -- The pagetype to display for Lua module pages. cfg['module-pagetype'] = 'มอดูล' -- cfg['default-pagetype'] -- The pagetype to display for pages other than templates or Lua modules. cfg['default-pagetype'] = 'หน้า' ---------------------------------------------------------------------------------------------------- -- Doc link configuration ---------------------------------------------------------------------------------------------------- -- cfg['doc-subpage'] -- The name of the subpage typically used for documentation pages. cfg['doc-subpage'] = 'doc' -- cfg['file-docpage-preload'] -- Preload file for documentation page in the file namespace. cfg['file-docpage-preload'] = 'แม่แบบ:คู่มือการใช้งาน/ข้อความล่วงหน้าไฟล์' -- cfg['docpage-preload'] -- Preload file for template documentation pages in all namespaces. cfg['docpage-preload'] = 'Template:Documentation/preload' -- cfg['module-preload'] -- Preload file for Lua module documentation pages. cfg['module-preload'] = 'Template:Documentation/preload-module-doc' ---------------------------------------------------------------------------------------------------- -- HTML and CSS configuration ---------------------------------------------------------------------------------------------------- -- cfg['templatestyles'] -- The name of the TemplateStyles page where CSS is kept. -- Sandbox CSS will be at Module:Documentation/sandbox/styles.css when needed. cfg['templatestyles'] = 'Module:Documentation/styles.css' -- cfg['container'] -- Class which can be used to set flex or grid CSS on the -- two child divs documentation and documentation-metadata cfg['container'] = 'documentation-container' -- cfg['main-div-classes'] -- Classes added to the main HTML "div" tag. cfg['main-div-classes'] = 'documentation' -- cfg['main-div-heading-class'] -- Class for the main heading for templates and modules and assoc. talk spaces cfg['main-div-heading-class'] = 'documentation-heading' -- cfg['start-box-class'] -- Class for the start box cfg['start-box-class'] = 'documentation-startbox' -- cfg['start-box-link-classes'] -- Classes used for the [view][edit][history] or [create] links in the start box. -- mw-editsection-like is per [[Wikipedia:Village pump (technical)/Archive 117]] cfg['start-box-link-classes'] = 'mw-editsection-like plainlinks' -- cfg['end-box-class'] -- Class for the end box. cfg['end-box-class'] = 'documentation-metadata' -- cfg['end-box-plainlinks'] -- Plainlinks cfg['end-box-plainlinks'] = 'plainlinks' -- cfg['toolbar-class'] -- Class added for toolbar links. cfg['toolbar-class'] = 'documentation-toolbar' -- cfg['clear'] -- Just used to clear things. cfg['clear'] = 'documentation-clear' ---------------------------------------------------------------------------------------------------- -- Tracking category configuration ---------------------------------------------------------------------------------------------------- -- cfg['display-strange-usage-category'] -- Set to true to enable output of cfg['strange-usage-category'] if the module is used on a /doc subpage -- or a /testcases subpage. This should be a boolean value (either true or false). cfg['display-strange-usage-category'] = true -- cfg['strange-usage-category'] -- Category to output if cfg['display-strange-usage-category'] is set to true and the module is used on a -- /doc subpage or a /testcases subpage. cfg['strange-usage-category'] = 'หน้าวิกิพีเดียที่ใช้งานแม่แบบคู่มือการใช้งานแปลก' --[[ ---------------------------------------------------------------------------------------------------- -- End configuration -- -- Don't edit anything below this line. ---------------------------------------------------------------------------------------------------- --]] return cfg kr0f0ngztyiirzx9pplahbia6gzljqp มอดูล:Category handler 828 75 272 2025-11-23T09:04:53Z Taweetham 7 Thai Wikipedia 272 Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace aliases -- -- are supported, and namespace names are detected automatically for -- -- the local wiki. This module requires [[Module:Namespace detect]] -- -- and [[Module:Yesno]] to be available on the local wiki. It can be -- -- configured for different wikis by altering the values in -- -- [[Module:Category handler/config]], and pages can be blacklisted -- -- from categorisation by using [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Load required modules local yesno = require('Module:Yesno') -- Lazily load things we don't always need local mShared, mappings local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function trimWhitespace(s, removeBlanks) if type(s) ~= 'string' then return s end s = s:match('^%s*(.-)%s*$') if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- CategoryHandler class -------------------------------------------------------------------------------- local CategoryHandler = {} CategoryHandler.__index = CategoryHandler function CategoryHandler.new(data, args) local obj = setmetatable({ _data = data, _args = args }, CategoryHandler) -- Set the title object do local pagename = obj:parameter('demopage') local success, titleObj if pagename then success, titleObj = pcall(mw.title.new, pagename) end if success and titleObj then obj.title = titleObj if titleObj == mw.title.getCurrentTitle() then obj._usesCurrentTitle = true end else obj.title = mw.title.getCurrentTitle() obj._usesCurrentTitle = true end end -- Set suppression parameter values for _, key in ipairs{'nocat', 'categories'} do local value = obj:parameter(key) value = trimWhitespace(value, true) obj['_' .. key] = yesno(value) end do local subpage = obj:parameter('subpage') local category2 = obj:parameter('category2') if type(subpage) == 'string' then subpage = mw.ustring.lower(subpage) end if type(category2) == 'string' then subpage = mw.ustring.lower(category2) end obj._subpage = trimWhitespace(subpage, true) obj._category2 = trimWhitespace(category2) -- don't remove blank values end return obj end function CategoryHandler:parameter(key) local parameterNames = self._data.parameters[key] local pntype = type(parameterNames) if pntype == 'string' or pntype == 'number' then return self._args[parameterNames] elseif pntype == 'table' then for _, name in ipairs(parameterNames) do local value = self._args[name] if value ~= nil then return value end end return nil else error(string.format( 'invalid config key "%s"', tostring(key) ), 2) end end function CategoryHandler:isSuppressedByArguments() return -- See if a category suppression argument has been set. self._nocat == true or self._categories == false or ( self._category2 and self._category2 ~= self._data.category2Yes and self._category2 ~= self._data.category2Negative ) -- Check whether we are on a subpage, and see if categories are -- suppressed based on our subpage status. or self._subpage == self._data.subpageNo and self.title.isSubpage or self._subpage == self._data.subpageOnly and not self.title.isSubpage end function CategoryHandler:shouldSkipBlacklistCheck() -- Check whether the category suppression arguments indicate we -- should skip the blacklist check. return self._nocat == false or self._categories == true or self._category2 == self._data.category2Yes end function CategoryHandler:matchesBlacklist() if self._usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared or require('Module:Category handler/shared') return mShared.matchesBlacklist( self.title.prefixedText, mw.loadData('Module:Category handler/blacklist') ) end end function CategoryHandler:isSuppressed() -- Find if categories are suppressed by either the arguments or by -- matching the blacklist. return self:isSuppressedByArguments() or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist() end function CategoryHandler:getNamespaceParameters() if self._usesCurrentTitle then return self._data.currentTitleNamespaceParameters else if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end return mShared.getNamespaceParameters( self.title, mappings ) end end function CategoryHandler:namespaceParametersExist() -- Find whether any namespace parameters have been specified. -- We use the order "all" --> namespace params --> "other" as this is what -- the old template did. if self:parameter('all') then return true end if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if self._args[param] then return true end end end if self:parameter('other') then return true end return false end function CategoryHandler:getCategories() local params = self:getNamespaceParameters() local nsCategory for i, param in ipairs(params) do local value = self._args[param] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self:namespaceParametersExist() then -- Namespace parameters exist - advanced usage. if nsCategory == nil then nsCategory = self:parameter('other') end local ret = {self:parameter('all')} local numParam = tonumber(nsCategory) if numParam and numParam >= 1 and math.floor(numParam) == numParam then -- nsCategory is an integer ret[#ret + 1] = self._args[numParam] else ret[#ret + 1] = nsCategory end if #ret < 1 then return nil else return table.concat(ret) end elseif self._data.defaultNamespaces[self.title.namespace] then -- Namespace parameters don't exist, simple usage. return self._args[1] end return nil end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- Used for testing purposes. return { CategoryHandler = CategoryHandler } end function p._main(args, data) data = data or mw.loadData('Module:Category handler/data') local handler = CategoryHandler.new(data, args) if handler:isSuppressed() then return nil end return handler:getCategories() end function p.main(frame, data) data = data or mw.loadData('Module:Category handler/data') local args = require('Module:Arguments').getArgs(frame, { wrappers = data.wrappers, valueFunc = function (k, v) v = trimWhitespace(v) if type(k) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p._main(args, data) end return p letwavu3yvlayfzew66uuwixmwebq5b มอดูล:Documentation/styles.css 828 76 274 2025-11-23T09:06:12Z Taweetham 7 Wikipedia 274 sanitized-css text/css /* {{pp|small=yes}} */ .documentation, .documentation-metadata { border: 1px solid #a2a9b1; background-color: #ecfcf4; clear: both; } .documentation { margin: 1em 0 0 0; padding: 1em; } .documentation-metadata { margin: 0.2em 0; /* same margin left-right as .documentation */ font-style: italic; padding: 0.4em 1em; /* same padding left-right as .documentation */ } .documentation-startbox { padding-bottom: 3px; border-bottom: 1px solid #aaa; margin-bottom: 1ex; } .documentation-heading { font-weight: bold; font-size: 125%; } .documentation-clear { /* Don't want things to stick out where they shouldn't. */ clear: both; } .documentation-toolbar { font-style: normal; font-size: 85%; } @media screen { html.skin-theme-clientpref-night .documentation, html.skin-theme-clientpref-night .documentation-metadata { background-color: #0b1e1c; } } @media screen and ( prefers-color-scheme: dark) { html.skin-theme-clientpref-os .documentation, html.skin-theme-clientpref-os .documentation-metadata { background-color: #0b1e1c; } } 3igw4iwzymtlarkxz89qi8dgj0mdzjy มอดูล:Category handler/data 828 77 275 2025-11-23T09:06:45Z Taweetham 7 Thai Wikipedia 275 Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist( title.prefixedText, blacklist ) data.currentTitleNamespaceParameters = mShared.getNamespaceParameters( title, mShared.getParamMappings() ) return data k26mwixuaeijisfddb0sxkg82iux8v4 มอดูล:Category handler/config 828 78 276 2025-11-23T09:07:29Z Taweetham 7 Thai Wikpedia 276 Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno() Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno() Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. The keys are the -- -- namespace numbers. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- Wrappers -- -- This is a wrapper template or a list of wrapper templates to be passed to -- -- [[Module:Arguments]]. -- -------------------------------------------------------------------------------- cfg.wrappers = 'แม่แบบ:Category handler' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. qr2ozvh9742cm6z37gujtffmx78xdmc มอดูล:Category handler/shared 828 79 278 2025-11-23T09:08:41Z Taweetham 7 thai wikpedia 278 Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return require(dataPage).mappings end end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey if titleObj.isTalkPage then mappingsKey = 'talk' else mappingsKey = mw.site.namespaces[titleObj.namespace].name end mappingsKey = mw.ustring.lower(mappingsKey) return mappings[mappingsKey] or {} end return p omlsnhudxz6juptvtxz7ns97jutbzc5 มอดูล:Category handler/blacklist 828 80 279 2025-11-23T09:09:15Z Taweetham 7 Thai Wikipedia 279 Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', '^วิกิพีเดีย:กล่องผู้ใช้%f[/\0]', -- ตัวอย่างกล่องผู้ใช้ -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive', -- Don't categorise archives. '/กรุ', '/กรุ .*', -- กรุ 1, กรุ 15, กรุ ฮกหด, ฯลฯ '^หน้าหลัก$' -- ไม่จัดหน้าหลัก, } g69dfbf87ovz2no9v00z4lcbvvhz7im มอดูล:Message box/tmbox.css 828 81 281 2025-11-23T09:10:33Z Taweetham 7 Thai Wikpedia 281 sanitized-css text/css /* {{pp|small=y}} */ .tmbox { margin: 4px 0; border-collapse: collapse; border: 1px solid #c0c090; /* Default "notice" gray-brown */ background-color: #f8eaba; box-sizing: border-box; } /* For the "small=yes" option. */ .tmbox.mbox-small { font-size: 88%; line-height: 1.25em; } .tmbox-speedy { border: 2px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .tmbox-delete { border: 2px solid #b32424; /* Red */ } .tmbox-content { border: 2px solid #f28500; /* Orange */ } .tmbox-style { border: 2px solid #fc3; /* Yellow */ } .tmbox-move { border: 2px solid #9932cc; /* Purple */ } .tmbox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.9em; width: 100%; } .tmbox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.9em; text-align: center; } .tmbox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.9em 2px 0; text-align: center; } /* An empty narrow cell */ .tmbox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .tmbox .mbox-invalid-type { text-align: center; } @media (min-width: 720px) { .tmbox { margin: 4px 10%; } .tmbox.mbox-small { /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; width: 238px; } } @media screen { html.skin-theme-clientpref-night .tmbox { background-color: #2e2505; /* Dark brown, same hue/saturation as light */ } html.skin-theme-clientpref-night .tmbox-speedy { background-color: #310402; /* Dark red, same hue/saturation as light */ } } @media screen and ( prefers-color-scheme: dark) { html.skin-theme-clientpref-os .tmbox { background-color: #2e2505; /* Dark brown, same hue/saturation as light */ } html.skin-theme-clientpref-os .tmbox-speedy { background-color: #310402; /* Dark red, same hue/saturation as light */ } } /** T367463 */ body.skin--responsive table.tmbox img { max-width: none !important; } rfgc7ll3u9xqbcynuop86eq5pxfhf7o วิธีใช้:กรุ 12 82 282 2025-11-23T09:11:37Z Taweetham 7 Thai Wikpedia 282 wikitext text/x-wiki {{บอกวิธีวิกิพีเดีย|WP:ARCHIVE}} '''กรุ''' เป็นหน้าบทความในวิกิพีเดียสำหรับเก็บรักษาข้อมูลการพูดคุยที่ผ่านและจบไปแล้วซึ่งมีเนื้อหาที่ยาวมาก และต้องการเก็บแยกออกเป็นหน้าอื่น เก็บไว้ให้ผู้อื่นใช้สำหรับศึกษาหรืออ้างอิง โดยทั่วไปแล้วหน้ากรุนี้จะไม่มีทำการแก้ไขภายหลังจากที่ได้จัดเก็บ หน้าพูดคุยปกติจะไม่เก็บเข้ากรุถ้าหน้าพูดคุยนั้นยังสั้นอยู่ == วิธีการเก็บเข้ากรุ == วิธีการเก็บเข้ากรุนั้น สามารถทำได้ 2 วิธี คือ (1) วิธีการเปลี่ยนชื่อหน้า วิธีนี้จะเก็บข้อมูลได้ครบถ้วนซึ่งรวมถึงประวัติการแก้ไขของหน้า แต่จะมีขั้นตอนที่ซับซ้อนเพิ่มขึ้นมา (2) วิธีการคัดลอก วิธีนี้เป็นวิธีที่ง่ายกว่าการเปลี่ยนชื่อหน้า แต่จะมีข้อเสียคือประวัติของหน้าไม่ได้ถูกย้ายตามไปด้วย ''หมายเหตุ: ที่ยกตัวอย่างด้านล่างนี้เป็นการย้ายหน้าคุยกับผู้ใช้ แต่สามารถใช้ได้กับหน้าพูดคุยของเนมสเปซอื่น ๆ ก็ได้'' === วิธีการเก็บเข้ากรุแบบเปลี่ยนชื่อหน้า === # ไปที่หน้าพูดคุยที่ต้องการเก็บข้อมูลเข้ากรุ # ไปที่สัญลักษณ์ลูกศรด้านบน จะเห็น "เปลี่ยนชื่อ" แล้วกดเพื่อทำการเปลี่ยนชื่อหน้าพูดคุยเป็นหน้ากรุ โดยใช้ชื่อใหม่ตามหลังด้วยคำว่า "/กรุ" และให้เว้นวรรคและตามด้วยตัวเลขลำดับ ตัวอย่างเช่น "คุยกับผู้ใช้:เด็กชายวิกิพีเดีย/กรุ 1" # เข้าไปที่หน้ากรุที่สร้างมาใหม่ ให้ใส่แม่แบบ <tt><nowiki>{{กรุ}}</nowiki></tt> ไว้ด้านบนของหน้า เพื่อแจ้งกับผู้อื่นว่าหน้านี้คือกรุ และไม่ควรแก้ไข # เข้าไปหน้าพูดคุยเดิม ซึ่งปัจจุบันจะกลายเป็น[[วิกิพีเดีย:หน้าเปลี่ยนทาง|หน้าเปลี่ยนทาง]] เมื่อเข้าไปให้เลือกตรงด้านซ้ายบนของบทความ ตรงคำว่า "เปลี่ยนทางมาจาก ___" โดยกดเลือกเข้าไป # แก้ไขหน้าพูดคุยเดิม แก้ไขจากหน้าเปลี่ยนทางเป็นหน้าพูดคุยปกติ โดยลบคำว่า "<tt><nowiki>#REDIRECT [[___]]</nowiki></tt>" หรือ "<tt><nowiki>#เปลี่ยนทาง [[___]]</nowiki></tt>" ออก # ทำลิงก์จากหน้าพูดคุยไปยังกรุ เพื่อให้ผู้อื่นสามารถเข้าไปอ่านได้ หรือเพียงแค่ใส่แม่แบบ <tt><nowiki>{{กล่องกรุ|auto=short}}</nowiki></tt> หรือ <tt><nowiki>{{กล่องกรุ/หน้าใน}}</nowiki></tt> === วิธีการเก็บเข้ากรุแบบคัดลอก === # ไปที่หน้าพูดคุยที่ต้องการเก็บข้อมูลเข้ากรุ # กด "แก้ไข" ด้านบนและทำการคัดลอกข้อมูลทั้งหมด # สร้างหน้าใหม่โดยใช้ "/กรุ" เว้นวรรคและตามด้วยตัวเลขลำดับ เช่น "คุยกับผู้ใช้:เด็กชายวิกิพีเดีย/กรุ 1" # ทำการคัดลอกข้อมูลเดิมใส่ในหน้ากรุ เข้าไปที่หน้ากรุที่สร้างมาใหม่ ให้ใส่แม่แบบ <nowiki>{{กรุ}}</nowiki> ไว้ด้านบนของหน้า เพื่อแจ้งกับผู้อื่นว่าหน้านี้คือกรุ และไม่ควรแก้ไข # ทำลิงก์จากหน้าพูดคุยไปยังกรุ เพื่อให้ผู้อื่นสามารถเข้าไปอ่านได้ {{หน้าวิธีใช้วิกิพีเดีย}} [[หมวดหมู่:การบริหารวิกิพีเดีย|กรุ]] mo44cyyh2v8wshlthkr7l1wntl8e5j6 แม่แบบ:Col-begin 10 83 291 287 2025-11-23T14:41:41Z Taweetham 7 291 wikitext text/x-wiki <templatestyles src="Col-begin/styles.css"/><div> {| class="{{{class|}}} col-begin {{#if:{{{small|}}}|col-begin-small}}" role="presentation" {{#if:{{{bgColor|{{{bgcolor|}}}}}}{{{border|}}}{{{width|}}}{{{style|}}}|style="{{#if:{{{bgColor|{{{bgcolor|}}}}}}|background: {{{bgColor|{{{bgcolor}}}}}};}}{{#if:{{{border|}}}|border: {{{border}}};}}{{#if:{{{width|}}}|width: {{{width}}};}}{{#if:{{{style|}}}|{{{style}}}}}" }} <noinclude> |- | |} </div> {{documentation}} <!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --> </noinclude> cn7cif9cisd67c5k8tflma66wj4nd8h แม่แบบ:Col-end 10 84 292 288 2025-11-23T14:42:08Z Taweetham 7 292 wikitext text/x-wiki <includeonly>&#32; |}</div></includeonly><noinclude> {{documentation}} <!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --> </noinclude> k24bcp3cs0m8f59jwmhng1acd8tpifu แม่แบบ:Col-break 10 85 293 289 2025-11-23T14:42:39Z Taweetham 7 293 wikitext text/x-wiki <noinclude/> | class="col-break {{{class|}}}"<!-- see [[Template:Col-begin/styles.css]] --> {{#if:{{{width|}}}{{{align|}}}{{{gap|}}}{{{valign|}}}{{{style|}}}|style="{{#if:{{{width|}}}|width: {{{width}}};}}{{#if:{{{align|}}}|text-align: {{{align}}};}} {{#if: {{{gap|}}}|padding-left: {{{gap}}};}}{{#if:{{{valign|}}}|vertical-align: {{{valign}}};}}{{#if:{{{style|}}}|{{{style}}}}}"}} | <noinclude> {{Documentation}} <!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --> </noinclude> b15qry9zw34ptvgx6i3is7gdtqlz2zj แม่แบบ:Col-begin/styles.css 10 86 294 2025-11-23T14:43:45Z Taweetham 7 สร้างหน้าด้วย "/* {{pp-template|small=yes}} */ .col-begin { border-collapse: collapse; padding: 0; color: inherit; /* dark mode friendly if color is set */ width: 100%; border: 0; margin: 0; } .col-begin-small { font-size: 90%; } .col-break { vertical-align: top; text-align: left; } .col-break-2 { width: 50%; } .col-break-3 { width: 33.3%; } .col-break-4 { width: 25%; } .col-break-5 { width: 20%; } @media (max-width: 720px) { /* override poten..." 294 sanitized-css text/css /* {{pp-template|small=yes}} */ .col-begin { border-collapse: collapse; padding: 0; color: inherit; /* dark mode friendly if color is set */ width: 100%; border: 0; margin: 0; } .col-begin-small { font-size: 90%; } .col-break { vertical-align: top; text-align: left; } .col-break-2 { width: 50%; } .col-break-3 { width: 33.3%; } .col-break-4 { width: 25%; } .col-break-5 { width: 20%; } @media (max-width: 720px) { /* override potentially set width */ /* wonder if table cells can display: flex with wrapping */ .col-begin, .col-begin > tbody, .col-begin > tbody > tr, .col-begin > tbody > tr > td { display: block !important; width: 100% !important; } .col-break { padding-left: 0 !important; } } h6jpr16puwsamsk3tp6hsk74zoib6it แม่แบบ:Test1 10 88 329 325 2025-11-29T04:58:31Z Taweetham 7 329 wikitext text/x-wiki <noinclude> <!--สคริปต์จัดให้ได้ออกแบบให้ทำงานร่วมกับรูปแบบตามแม่แบบนี้ หากมีการเปลี่ยนแปลงรูปแบบไปจากเดิมอย่างมาก รบกวนช่วยแจ้งที่หน้าพูดคุย สคริปต์จัดให้ ขอขอบคุณ--> </noinclude>{| id="t-test" class="noprint" style=" width: 80%; margin: 0 auto; border-collapse: collapse; background: #fbfbfb; border: 1px solid #aaa; border-left: 10px solid #1e90ff;" |- | style="padding: 0.25em 0.5em;" width="60px" | [[ภาพ:Info Simple.svg|40px]] | style="color:#333333;" | <span style="font-size:135%;">ขอขอบคุณที่ทดลองแก้ไขบทความในวิกิพีเดีย แต่การแก้ไขของคุณได้ถูกย้อนกลับหรือลบไปแล้ว <br />สำหรับการทดลองเขียน กรุณาใช้[[:w:th:วิกิพีเดีย:ทดลองเขียน|หน้าทดลองเขียน]]</span><br><br>ดูรายละเอียดเกี่ยวกับการร่วมแก้ไขในวิกิพีเดียได้ที่ [[:w:th:วิกิพีเดีย:เริ่มต้น|การเริ่มต้นวิกิพีเดีย]] [[:w:th:วิกิพีเดีย:นโยบาย|นโยบายวิกิพีเดีย]] และ[[:w:th:วิกิพีเดีย:อะไรที่ไม่ใช่วิกิพีเดีย|อะไรที่ไม่ใช่วิกิพีเดีย]]<br />ถามเกี่ยวกับการใช้งานวิกิพีเดียได้ที่[[:w:th:วิกิพีเดีย:แผนกช่วยเหลือ|แผนกช่วยเหลือ]] และสำหรับคำถามอื่น ๆ สามารถถามได้ที่[[:w:th:วิกิพีเดีย:ปุจฉา-วิสัชนา|ปุจฉา-วิสัชนา]]<br /> '''กรุณาอย่าสร้างบทความใหม่เพียงเพื่อถามคำถาม มีเนื้อหาสั้นไม่เกินประโยค โฆษณา หรือคัดลอกข้อมูลจากแหล่งอื่น'''<br>'''และกรุณาอย่านำใส่หรือนำออกซึ่งเนื้อหาในวิกิพีเดีย โดยไม่เป็นการช่วยเหลือหรือเกี่ยวข้องกับบทความ หรือเป็นเรื่องไร้สาระ''' |}<noinclude> {{doc}} </noinclude> 7597q92hwa608k3m8688j2txp4fjvut 25 ปีวิกิพีเดีย/ปฏิทิน/แบบสำรวจ 0 90 352 351 2025-11-30T07:18:34Z Wutkh 9 352 wikitext text/x-wiki # ชื่อบัญชีผู้ใช้ # ชื่อผู้รับ # ที่อยู่ผู้รับ #* (บรรทัดที่ 1, เลขที่ห้อง เลขที่ตั้ง ชื่ออาคาร/หมู่บ้าน หมู่ ซอย ถนน) #* (บรรทัดที่ 2, ตำบลและอำเภอ หรือ แขวงและเขต สำหรับ กทม.) #* (บรรทัดที่ 3, เฉพาะจังหวัดและรหัสไปรษณีย์) # เลือกประเภทขนส่ง #* ไปรษณีย์ไทย #* ขนส่งเอกชนกรุณาระบุ หมายเลขโทรศัพท์ #* ไม่จำกัดประเภทขนส่งกรุณาระบุ หมายเลขโทรศัพท์ # อีเมลสำหรับติดต่อแจ้งเลข tracking (verified) # ยินดีรับการจัดสรรมากกว่าที่เคยขอไว้ (เช่น ลงชื่อรับไว้ 2 เล่ม แต่ยินดีรับได้ไม่เกิน 5 เล่มเพื่อส่งต่อความรู้เสรีแก่ผู้อื่น) ---- ; แบบสำรวจ (1) ภายใต้งบประมาณการผลิต 50-200 บาท โปรดระบุความสนใจและความคุ้มค่า ในระดับคะแนน 1-5 สำหรับสิ่งต่อไปนี้ ที่มีสัญลักษณ์ของวิกิมีเดียประเทศไทย (rating) ''กลุ่มคงทนถาวร'' * เสื้อกันหนาวหรือเสื้อ Jacket (ขนาดเดียว) * เสื้อยืด (ต้องจัดทำหลายขนาดและอาจมีปัญหาไม่สามารถแจกในขนาดที่ต้องการได้) * กระบอกน้ำ (พลาสติก แก้ว หรือ สแตนเลส) แก้วน้ำ (เซรามิก แก้ว หรือเมลามีน) พร้อมแผ่นรองแก้ว จัดเป็นชุด gift set รวมกันตามความเหมาะสม * ย่าม กระเป๋า รวมถึงถุงผ้า จัดเป็นชุด gift set รวมกันตามความเหมาะสม * flash drive แผ่นรองเมาส์ และแท่นวางโทรศัพท์เคลื่อนที่ จัดเป็นชุด gift set รวมกันตามความเหมาะสม * ร่มกันแดดกันฝน (เฉพาะชนิดพับได้เพื่อง่ายต่อการขนส่ง) * เข็มกลัด พวงกุญแจ สติกเกอร์ แผ่นแม่เหล็กติดฝาตู้เย็นหรือพื้นผิวโลหะ จัดเป็นชุด gift set รวมกันตามความเหมาะสม ''กลุ่มใช้แล้วหมดไป'' * ปฏิทินตั้งโต๊ะ (ผลิตปีต่อปีเท่านั้น) * planner สมุดจดบันทึก (ขนาดไม่เกิน 128 แผ่น = 256 หน้า ที่มีปฏิทินล่วงหน้า 3-5 ปี มีเลขหน้าและข้อความที่ใช้คล้ายกับไดอารี่แต่ให้เติมวันที่ลงได้เองเพื่อเก็บไว้ใช้งานได้ข้ามปี) * face mask หน้ากากสำหรับกันฝุ่นหรือเชื้อโรค (ชนิดใช้แล้วทิ้ง ไม่สามารถซักใหม่) (หนึ่งแพ็คอาจมี 5-20 ชิ้น) * ปากกา ดินสอ กระดาษ post-it จัดเป็นชุด gift set รวมกันตามความเหมาะสม (2) หากวิกิมีเดียประเทศไทยต้องการสะสมของที่ระลึกคงคลังไว้ไม่เกิน 5 SKUs (เสื้อที่มีหลายขนาดจะนับ SKU แยกกันสำหรับทุกขนาดที่ต้องเก็บไว้ในคลัง) ขอให้เลือกจากรายการข้างต้นไม่เกิน 5 รายการ (check box) (3) ท่านเคยได้รับของที่ระลึกจากวิกิมีเดียประเทศไทยมาก่อนหรือไม่ และมีความคิดเห็นอย่างไรกับของที่ท่านได้รับ (free text) k08kpoe7sb9l06fufg48n7r8wuz2hoz 25 ปีวิกิพีเดีย/ปฏิทิน/สถานะ 0 91 430 427 2025-12-12T11:14:18Z Wutkh 9 430 wikitext text/x-wiki {| class="wikitable sortable" |+ สถานะการจัดสรรปฏิทิน พ.ศ. 2569 (Manual update) |- ! ชื่อผู้ใช้ !! สถานะ |- | [[ผู้ใช้:Wutkh|Wutkh]] || จัดส่งสำเร็จแล้วเมื่อ 12/12/2568 |- | [[ผู้ใช้:Patsagorn Y.|Patsagorn Y.]] || จัดส่งสำเร็จแล้วเมื่อ 12/12/2568 |- | [[ผู้ใช้:Chainwit.|Chainwit.]] || จัดส่งสำเร็จแล้วเมื่อ 09/12/2568 |- | [[ผู้ใช้:วณิพก|วณิพก]] || จัดส่งสำเร็จแล้วเมื่อ 11/12/2568 |- | [[ผู้ใช้:Guntipet|Guntipet]] || จัดส่งสำเร็จแล้วเมื่อ 10/12/2568 |- | [[ผู้ใช้:ไทๆ|ไทๆ]] || จัดส่งสำเร็จแล้วเมื่อ 11/12/2568 |- | [[ผู้ใช้:Sawasdeeee|Sawasdeeee]] || จัดส่งสำเร็จแล้วเมื่อ 11/12/2568 |- | [[ผู้ใช้:Supphachoke Sukjamlong|Supphachoke Sukjamlong]] || จัดส่งสำเร็จแล้วเมื่อ 10/12/2568 |- | [[ผู้ใช้:NiratLover|NiratLover]] || จัดส่งสำเร็จแล้วเมื่อ 11/12/2568 |- | [[ผู้ใช้:PPichit|PPichit]] || จัดส่งสำเร็จแล้วเมื่อ 09/12/2568 |- | [[ผู้ใช้:Waniosa Amedestir|Waniosa Amedestir]] || จัดส่งสำเร็จแล้วเมื่อ 12/12/2568 |- | [[ผู้ใช้:GinkoLusitania|GinkoLusitania]] || จัดส่งสำเร็จแล้วเมื่อ 11/12/2568 |- | [[ผู้ใช้:Minener&#39;s|Minener&#39;s]] || จัดส่งสำเร็จแล้วเมื่อ 10/12/2568 |- | [[ผู้ใช้:Tvcccp|Tvcccp]] || จัดส่งสำเร็จแล้วเมื่อ 10/12/2568 |- | [[ผู้ใช้:Kaojinapong|Kaojinapong]] || จัดส่งสำเร็จแล้วเมื่อ 10/12/2568 |- | [[ผู้ใช้:Poonpun2016|Poonpun2016]] || ''งดจัดสรร''<ref>เนื่องจากไม่มีการติดต่อภายในเวลาที่กำหนด เมื่อ 07/12/2568</ref> |- | [[ผู้ใช้:Just Sayori|Just Sayori]] || จัดส่งสำเร็จแล้วเมื่อ 10/12/2568 |- | [[ผู้ใช้:ร้อยตรี โชคดี|ร้อยตรี โชคดี]] || จัดส่งสำเร็จแล้วเมื่อ 12/12/2568 |- | [[ผู้ใช้:JustRandomThai|JustRandomThai]] || จัดส่งสำเร็จแล้วเมื่อ 11/12/2568 |- | [[ผู้ใช้:แอนเดอร์สัน|แอนเดอร์สัน]] || กรณีพิเศษ - จัดส่งไม่สำเร็จเมื่อ 11/12/2568 |- | [[ผู้ใช้:Bank0303|Bank0303]] || จัดส่งสำเร็จแล้วเมื่อ 10/12/2568 |- | [[ผู้ใช้:Jothefiredragon|Jothefiredragon]] || จัดส่งสำเร็จแล้วเมื่อ 09/12/2568 |- | [[ผู้ใช้:Ekminarin|Ekminarin]] || จัดส่งสำเร็จแล้วเมื่อ 12/12/2568 |- | [[ผู้ใช้:Siam2019|Siam2019]] || จัดส่งสำเร็จแล้วเมื่อ 10/12/2568 |- | [[ผู้ใช้:Edigines|Edigines]] || จัดส่งสำเร็จแล้วเมื่อ 09/12/2568 |- | [[ผู้ใช้:Tadano Earth|Tadano Earth]] || จัดส่งสำเร็จแล้วเมื่อ 09/12/2568 |- | [[ผู้ใช้:PloveShin|PloveShin]] || จัดส่งสำเร็จแล้วเมื่อ 12/12/2568 |} <noinclude>ชื่อบัญชีผู้ใช้ มีสิทธิรับจัดสรร/? ส่งอีเมลแล้ว/ส่งอีเมลไม่สำเร็จ แจ้งหมายเลขพัสดุแล้ว/ข้อมูลไม่ครบถ้วนรอแก้ไข จัดส่งแล้ว/? แจ้ง tracking no. แล้ว/? จัดส่งสำเร็จแล้ว/?</noinclude> mxxsbz9xxl7xyqan3fs010bkbeu9v56