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.45.0-wmf.23
first-letter
สื่อ
พิเศษ
พูดคุย
ผู้ใช้
คุยกับผู้ใช้
วิกิมีเดียประเทศไทย
พูดคุยเรื่องวิกิมีเดียประเทศไทย
ไฟล์
คุยเรื่องไฟล์
มีเดียวิกิ
คุยเรื่องมีเดียวิกิ
แม่แบบ
คุยเรื่องแม่แบบ
วิธีใช้
คุยเรื่องวิธีใช้
หมวดหมู่
คุยเรื่องหมวดหมู่
TimedText
TimedText talk
มอดูล
คุยเรื่องมอดูล
หน้าหลัก
0
1
139
62
2025-10-19T15:10:32Z
Wutkh
9
139
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}}
{|width="100%" border="0" cellspacing="2" cellpadding="2" style="align=center; MARGIN: 0px auto 0.5em;clear:both;border:1px solid Gold;background: Ivory;color:#000000"
|-
| width="60px" | [[ภาพ:WP25 Short lockup knockout.png|50px|วิกิพีเดีย 25]]
| [[25 ปีวิกิพีเดีย|ขอเชิญอาสาสมัครวิกิพีเดียร่วมเสนอความเห็นและเสนอตัวเป็นอาสาสมัครในการจัดกิจกรรมเฉลิมฉลองครบรอบ 25 ปีวิกิพีเดียในประเทศได้ที่นี่]]
|}
{{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/>โปรดศึกษารายละเอียดเพิ่มเติมใน[[วิกิมีเดียประเทศไทย:ข้อปฏิเสธความรับผิดชอบทั่วไป|หน้านี้]] ขอขอบคุณในความเข้าใจ
|}
quykbrrd8jzg35c74bxjyxwyxt0mhao
พูดคุย:หน้าหลัก
1
2
5
4
2025-09-22T12:16:10Z
Taweetham
7
5
wikitext
text/x-wiki
== Thank you for creating this WMTH wiki ==
I look forward to seeing more communication and fruitful work from WMTH and the Thai community on this site.
https://phabricator.wikimedia.org/T400001
--[[ผู้ใช้:Taweetham|Taweetham]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 19:15, 22 กันยายน 2568 (+07)
2nxjvjqa8zheleeahh0loeaswnjvb4v
แม่แบบ: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
ผู้ใช้:Octahedron80
2
7
12
2025-09-29T02:50:41Z
Octahedron80
26
สร้างหน้าด้วย "Hello, world. 👋"
12
wikitext
text/x-wiki
Hello, world. 👋
3k0nsls6w7snrqssja2mmtwytuodr6c
แม่แบบ: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
112
66
2025-10-17T16:16:48Z
Wutkh
9
112
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 = [[วิกิมีเดียประเทศไทย:ข้อปฏิเสธความรับผิดชอบทั่วไป|ข้อปฏิเสธความรับผิดชอบ]]
}}
</div>
m9nax6r3z1ya5bg9ih25a3bn20oqbty
มอดูล: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
63
58
2025-10-17T08:56:07Z
Wutkh
9
63
wikitext
text/x-wiki
__NOTOC__
วิกิพีเดียและโครงการพี่น้องอื่น ๆ ในกลุ่มขับเคลื่อนวิกิมีเดียประกอบด้วยเนื้อหาเสรีที่เกิดจากการร่วมเขียนออนไลน์ นั่นคือ การรวมตัวโดยใจสมัครของปัจเจกบุคคลและกลุ่มทำงานเพื่อพัฒนาทรัพยากรความรู้ของมนุษย์ที่เป็นของส่วนรวม โครงสร้างของวิกิมีเดียเปิดให้ทุกคนที่เชื่อมต่ออินเทอร์เน็ตเปลี่ยนแปลงเนื้อหาได้ โปรดทราบว่าไม่จำเป็นที่เนื้อหาใด ๆ ในวิกิมีเดียนี้จะได้รับการสอบทานจากนักวิชาชีพที่มีความเชี่ยวชาญพอจะนำเสนอสารสนเทศที่ครบถ้วน แม่นยำ หรือเชื่อถือได้แก่คุณ
ที่กล่าวมาข้างต้น มิใช่ว่าคุณไม่อาจพบสารสนเทศอันทรงคุณค่าและแม่นยำได้จากวิกิมีเดีย อย่างไรก็ดี '''วิกิมีเดียประเทศไทยไม่อาจรับประกันความถูกต้องแม่นยำของสารสนเทศในเว็บไซต์เหล่านี้ได้''' เพราะเนื้อหาอาจเพิ่งถูกแก้ไข เปลี่ยนแปลง หรือทำลาย โดยบุคคลผู้มีความเห็นไม่สอดคล้องกับสถานะองค์ความรู้ปัจจุบันในสาขาที่เกี่ยวข้อง หมายเหตุว่า สารานุกรมอื่น แหล่งข้อมูล และงานอ้างอิงส่วนใหญ่ยังมีข้อปฏิเสธความรับผิดชอบที่คล้ายกัน
jysdu7x2pjqpxt3sr6dt545k4q654o8
วิกิมีเดียประเทศไทย:โครงสร้าง
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">{{</span>[[แม่แบบ:{{{1}}}|{{{1}}}]]<span class="nowrap">}}</span><noinclude>"
115
wikitext
text/x-wiki
<span class="nowrap">{{</span>[[แม่แบบ:{{{1}}}|{{{1}}}]]<span class="nowrap">}}</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=]]''' {{{1|สำเร็จ}}}'''</span>{{{{{|safesubst:}}}#if:{{{2|{{{note|{{{reason|}}}}}}}}}|: {{{2|{{{note|{{{reason}}}}}}}}}}}<!--แม่แบบ:สำเร็จ--><noinclude> == วิธีใช้ == แม่แบบนี้ใช้สำหรับประกอบความคิดเห็นในหน้าพูดคุย โดยใส่..."
120
wikitext
text/x-wiki
<span class="nowrap">[[ไฟล์:Yes check.svg|18px|link=|alt=]]''' {{{1|สำเร็จ}}}'''</span>{{{{{|safesubst:}}}#if:{{{2|{{{note|{{{reason|}}}}}}}}}|: {{{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=]] '''{{{1|ไม่สำเร็จ}}}'''</span><!--แม่แบบ:ไม่สำเร็จ--> <noinclude> == วิธีใช้ == แม่แบบนี้ใช้สำหรับประกอบความคิดเห็นในหน้าพูดคุย โดยใส่ <pre> {{ไม่สำเร็จ}} หรือ {{ไม่สำเร็..."
122
wikitext
text/x-wiki
<span class="nowrap">[[ไฟล์:X mark.svg|18px|link=|alt=]] '''{{{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] = '​'
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=]] '''ความเห็น'''<noinclude>
== วิธีใช้ ==
แม่แบบนี้ใช้สำหรับ '''ออกความเห็น'''
โดยคัดลอกข้อความนี้
<pre>
* {{ความเห็น}} --~~~~
</pre>
จะได้ผลดังนี้
* {{ความเห็น}} ใส่ความเห็นตรงนี้ -- (ชื่อผู้ออกความเห็น)
== ดูเพิ่ม ==
* {{Tl|เห็นด้วย}} - {{เห็นด้วย}}
* {{Tl|เป็นกลาง}} - {{เป็นกลาง}}
* {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}}
* {{Tl|สำเร็จ}} - {{สำเร็จ}}
* {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}}
* {{Tl|ถาม}} - {{ถาม}}
* {{Tl|ตอบ}} - {{ตอบ}}
* {{Tl|ความคิด}} - {{ความคิด}}
</noinclude>
ci6nfjriybdqv19mcvbwr8dhlifz431
25 ปีวิกิพีเดีย
0
54
144
143
2025-10-20T15:38:26Z
Wutkh
9
/* แสดงความประสงค์ร่วมเป็นอาสาสมัครผู้จัดงาน ณ ที่ตั้ง */
144
wikitext
text/x-wiki
[[ไฟล์:WP25-TH-Full colour 01.svg|200px|frameless|center]]
ด้วยวิกิพีเดียจะมีอายุครบ 25 ปี (นับแต่วันก่อตั้ง) ในวันที่ 15 มกราคม พ.ศ. 2569
จึงขอเรียนเชิญอาสาสมัครวิกิพีเดียภาษาไทยร่วมกันเป็นส่วนหนึ่งในการจัดกิจกรรมเฉลิมฉลองในโอกาสดังกล่าว ดังนี้
* เสนอแนะกิจกรรมที่อยากให้จัดและคำแนะนำต่าง ๆ (ร่วมทั้งลงคะแนนเสียงเห็นด้วย/ไม่เห็นด้วย)
* เสนอตัวเองเป็นอาสาสมัครจัดกิจกรรม
มูลนิธิวิกิมีเดียและวิกิมีเดียประเทศไทยจะให้การสนับสนุนทุนในการจัดกิจกรรมและทรัพยากรในการเฉลิมฉลองโอกาสสำคัญนี้ เพียง'''ขอให้กล้า!'''
== กิจกรรมออนไลน์ ==
=== บนดิสคอร์ดชุมชนวิกิมีเดียภาษาไทย ===
* กิจกรรมตอบปัญหาแนวรายการ[[w:th:แฟนพันธุ์แท้|แฟนพันธุ์แท้]] --[[ผู้ใช้: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)
=== Edit-a-thon ===
* กิจกรรมสนับสนุน[[w:th:วิกิพีเดีย:วันนี้ในอดีต|บทความวันนี้ในอดีต]]
** {{เห็นด้วย}} ภาคต่อบทความรู้ไหมว่าและบทความแนะนำ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07)
=== ช่วงเวลาที่เหมาะสม ===
* {{ความเห็น}} ภายในไตรมาสแรก 15 ม.ค. ได้ยิ่งดี --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07)
=== แสดงความประสงค์ร่วมเป็นอาสาสมัครผู้จัดงานออนไลน์ ===
ขอความร่วมมือใช้ <nowiki>{{เห็นด้วย|ยินดี}}</nowiki> ในการลงชื่อ ณ จุดนี้
* {{เห็นด้วย|ยินดี}} ได้เสมอแต่มาคุยกันก่อน ไม่อยู่ในประเทศไทยประมาณเดือนเมษายนเป็นต้นไปครับ [[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07)
== กิจกรรมในสถานที่หนึ่งร่วมกัน (หรือกระจายตามภูมิภาค) ==
=== รูปแบบกิจกรรม ===
* สัมมนา [[w:th:ปัญญาประดิษฐ์|AI]] vs วิกิพีเดีย
** {{เห็นด้วย}} โลก AI มาแรง ทุกวันนี้ตรวจทานบทความก็ขอ AI มาช่วย ต้องสัมมนาฟังคนเก่ง ๆ มาคุยกันครับ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07)
* เสวนานักเขียน vs นักอ่าน
** {{เห็นด้วย}} มาปรับทัศนคติทั้งคู่กันครับ 555555 // จริง ๆ คืออยากดูความเห็นของแต่ละฝ่ายว่ามีคาดหวังหรือต้องการอะไร จะได้หาแนวทางกันและกัน ทุกคนสมประโยชน์ --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07)
=== ช่วงเวลาที่เหมาะสม ===
* {{ความเห็น}} ภายในไตรมาสแรก ใกล้วันที่ 15 ม.ค. ได้เท่าไหร่ยิ่งดี (แต่ต้องเป็นเสาร์-อาทิตย์ที่ไม่ใช่หยุดยาว) --[[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07)
=== แสดงความประสงค์ร่วมเป็นอาสาสมัครผู้จัดงานในสถานที่ใดที่หนึ่ง ===
ขอความร่วมมือใช้ <nowiki>{{เห็นด้วย|ยินดี}}</nowiki> ในการลงชื่อ ณ จุดนี้
* {{เห็นด้วย|ยินดี}} ได้จนถึงเมษายน เพราะจะไปเรียนต่อต่างประเทศครับ [[ผู้ใช้:Wutkh|Wutkh]] ([[คุยกับผู้ใช้:Wutkh|คุย]]) 22:07, 19 ตุลาคม 2568 (+07)
== ความคิดเห็นภาพรวม ==
# เป็นโอกาสอันดีที่จะทำให้เกิดผลกระทบและแรงกระเพื่อมให้ชุมชนอาสาสมัครในประเทศไทยรวมถึง movement ในระดับนานาชาติได้ ประเด็นสำคัญคือ 1. หาอาสาสมัครเพิ่ม 2. พัฒนาอาสาสมัครเดิมให้เข้มแข็ง และ 3.หาโอกาสพัฒนาการใช้งานโครงการของวิกิมีเดียให้มากขึ้นหรือในรูปแบบที่แตกต่างออกไปตามยุคสมัย (ยุค AI) --[[ผู้ใช้:Taweetham|Taweetham]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 20:03, 20 ตุลาคม 2568 (+07)
# เพื่อไม่ให้เป็น[[:w:th:การนำกระดิ่งไปแขวนคอแมว]] อยากให้ทุกท่านที่ลงชื่อสนับสนุนกิจกรรมระบุให้ชัดเจนเลยว่ายินดีอาสาลงแรงในกิจกรรมนั้นด้วยมากน้อยอย่างไร --[[ผู้ใช้:Taweetham|Taweetham]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 20:03, 20 ตุลาคม 2568 (+07)
# ในกรณีทรัพยากรไม่เพียงพอสำหรับทุกกิจกรรม (ไม่ได้หมายถึงเงินอย่างเดียว แต่หมายถึงคนอาสาสมัคร เวลา/โอกาส หรือพื้นที่) จะให้ลำดับความสำคัญของกิจกรรมใด ณ ช่องทางหรือสถานที่ใดมาก่อน หากท่านลงชื่อทุกกิจกรรมน่าจะมีลำดับความสำคัญได้ --[[ผู้ใช้:Taweetham|Taweetham]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 20:03, 20 ตุลาคม 2568 (+07)
== คำแนะนำ ==
* ท่านสามารถแสดงความคิดเห็นหรือเสนอตัวโดยการแก้ไขหน้านี้ได้โดยเสรีและเป็นไปตาม[[w:th:WP:5P|ห้าเสาหลัก]] และขอความร่วมมือให้ลงชื่อทุกครั้งโดยการพิมพ์ <nowiki>--~~~~</nowiki> ต่อท้ายข้อความเสมอ
* เพื่อความสะดวกและความเป็นระเบียบเรียบร้อย อาจพิจารณาใช้แม่แบบด้านล่างนี้เพื่อประกอบความคิดเห็นของท่าน
=== รวมแม่แบบความคิดเห็น ===
* {{Tl|เห็นด้วย}} - {{เห็นด้วย}}
* {{Tl|เป็นกลาง}} - {{เป็นกลาง}}
* {{Tl|ไม่เห็นด้วย}} - {{ไม่เห็นด้วย}}
* {{Tl|สำเร็จ}} - {{สำเร็จ}}
* {{Tl|ไม่สำเร็จ}} - {{ไม่สำเร็จ}}
* {{Tl|ถาม}} - {{ถาม}}
* {{Tl|ตอบ}} - {{ตอบ}}
* {{Tl|ความคิด}} - {{ความคิด}}
* {{Tl|ความเห็น}} - {{ความเห็น}}
f28mvahicxt7l6n3f5oms8i0lnirrpc