Wikimedia thwikimedia https://th.wikimedia.org/wiki/%E0%B8%AB%E0%B8%99%E0%B9%89%E0%B8%B2%E0%B8%AB%E0%B8%A5%E0%B8%B1%E0%B8%81 MediaWiki 1.46.0-wmf.24 first-letter สื่อ พิเศษ พูดคุย ผู้ใช้ คุยกับผู้ใช้ วิกิมีเดียประเทศไทย พูดคุยเรื่องวิกิมีเดียประเทศไทย ไฟล์ คุยเรื่องไฟล์ มีเดียวิกิ คุยเรื่องมีเดียวิกิ แม่แบบ คุยเรื่องแม่แบบ วิธีใช้ คุยเรื่องวิธีใช้ หมวดหมู่ คุยเรื่องหมวดหมู่ TimedText TimedText talk มอดูล คุยเรื่องมอดูล Wikimedia Thailand/Activities 0 108 466 2026-04-27T06:27:26Z Azoma 208 สร้างหน้าด้วย "{{Navbox|name=Wikimedia Thailand/Activities|title=[[Wikimedia Thailand]] activities|titlestyle=background:#CEE0F2|state=expanded|style=width:100%;|image=[[File:Wikimedia Thailand-Logo-BW.svg|150px]]|groupstyle=text-align:right; background:#CEE0F2; font-size:85%; font-weight:bold; white-space:nowrap; padding:0 6px 0 6px;|abovestyle=text-align:center; background:#CEE0F2|belowstyle=text-align:center; background:#CEE0F2|above=Wikimedia Thailand/about|..." 466 wikitext text/x-wiki {{Navbox|name=Wikimedia Thailand/Activities|title=[[Wikimedia Thailand]] activities|titlestyle=background:#CEE0F2|state=expanded|style=width:100%;|image=[[File:Wikimedia Thailand-Logo-BW.svg|150px]]|groupstyle=text-align:right; background:#CEE0F2; font-size:85%; font-weight:bold; white-space:nowrap; padding:0 6px 0 6px;|abovestyle=text-align:center; background:#CEE0F2|belowstyle=text-align:center; background:#CEE0F2|above=[[Wikimedia Thailand/about|About]] • [[Wikimedia Thailand/Timeline|Timeline]] • [[Wikimedia Thailand/bylaws|Bylaws]]|group1=Meetups|list1={{Navbox subgroup |group1 = Mahidol University |list1 = [[Meetup/Mahidol University/1|1]] • [[Meetup/Mahidol University/2|2]] • [[Meetup/Mahidol University/3|3]] • [[Meetup/Mahidol University/4|4]] • [[Meetup/Mahidol University/5|5]] • [[Meetup/Mahidol University/6|6]] • [[Meetup/Mahidol University/7|7]] • [[Meetup/Mahidol University/8|8]] • [[Meetup/Mahidol University/9|9]] • [[Meetup/Mahidol University/10|10]] • [[Meetup/Mahidol University/11|11]] • [[Meetup/Mahidol University/12|12]] • [[Meetup/Mahidol University/13|13]] • [[Meetup/Mahidol University/14|14]] • [[Meetup/Mahidol University/15|15]] • [[Meetup/Mahidol University/16|16]] • [[Meetup/Mahidol University/17|17]] • [[Meetup/Mahidol University/18|18]] • [[Meetup/Mahidol University/19|19]] • [[Meetup/Mahidol University/20|20]] • [[Meetup/Mahidol University/21|21]] • [[Meetup/Mahidol University/22|22]] • [[Meetup/Mahidol University/23|23]] • [[Meetup/Mahidol University/24|24]] |group2 = Bangkok |list2 = [[Wikimedians in Thailand/July 2012 meetup|July 2012]] • [[Meetup/Bangkok/1|1]] • [[Meetup/Bangkok/2|2]] • [[Meetup/Bangkok/3|3]] • [[Meetup/Bangkok/4|4]] • [[Meetup/Bangkok/5|5]] |group3 = Regional |list3 = [[Meetup/Chiang Mai/1|Chiang Mai 1]] • [[Meetup/Chiang Mai/0|HubHug]] |group4 = Others | list4 = [[Meetup/Thailand/Online/1|Online 1]] • [[Meetup/Thailand/Online/2|Online 2]] • [[Wikimedia Thailand/Meetup/Melbourne/1|Oversea 1]] |group5 = WikiCamp | list5 = {{Navbox subgroup |group1 = BKKCamp |list1 = [[Wikimedia Thailand/WikiCamp 2023|1]] • [[Wikimedia Thailand/BKKCamp/2|2]] • [[Wikimedia Thailand/BKKCamp/3|3]] • [[Wikimedia Thailand/BKKCamp/4|4]] • [[Wikimedia Thailand/BKKCamp/5|5]] • [[Wikimedia_Thailand/WikiCamp_Bangkok_2026|6]] |group2 = Regional |list2 = [[Wikimedia Thailand/EasternCamp/1|Chonburi 2023]] • [[Wikimedia Thailand/WikiCamp Chiang Mai 2025|Chiang Mai 2025]] • [[Wikimedia Thailand/WikiCamp Chiang Mai 2026|Chiang Mai 2026]] }} |group6 = Photowalk |list6 = [[Wikimedia Thailand/Bangkok Photowalk 1|1]] • [[Wikimedia Thailand/Bangkok Photowalk 2|2]] • [[Wikimedia Thailand/Bangkok Photowalk 3|3]] • [[Wikimedia Thailand/Bangkok Photowalk 4|4]] |group7 = Others |list7 = [[Wikimedians in Thailand/2015 Smithsonian APA|2015 Smithsonian APA]] • [[Wikimedians in Thailand/Activities/Wiki4Women2019|Wiki4Women2019]] }}|group2=Photo Contests|list2={{Navbox subgroup | group1 = Wiki Loves Monuments | list1 = [[c:Commons:Wiki_Loves_Monuments_2013_in_Thailand|2013]] • [[c:Commons:Wiki_Loves_Monuments_2014_in_Thailand|2014]] • [[c:Commons:Wiki_Loves_Monuments_2015_in_Thailand|2015]] • [[c:Commons:Wiki_Loves_Monuments_2016_in_Thailand|2016]] • [[c:Commons:Wiki_Loves_Monuments_2017_in_Thailand|2017]] • [[c:Commons:Wiki_Loves_Monuments_2018_in_Thailand|2018]] • [[c:Commons:Wiki_Loves_Monuments_2019_in_Thailand|2019]] • [[c:Commons:Wiki_Loves_Monuments_2020_in_Thailand|2020]] • [[c:Commons:Wiki_Loves_Monuments_2022_in_Thailand|2022]] • [[c:Commons:Wiki_Loves_Monuments_2023_in_Thailand|2023]] • [[c:Commons:Wiki_Loves_Monuments_2024_in_Thailand|2024]] • [[c:Commons:Wiki_Loves_Monuments_2025_in_Thailand|2025]] | group2 = Wiki Loves Earth | list2 = [[c:Commons:Wiki_Loves_Earth_2015_in_Thailand|2015]] • [[c:Commons:Wiki_Loves_Earth_2016_in_Thailand|2016]] • [[c:Commons:Wiki_Loves_Earth_2017_in_Thailand|2017]] • [[c:Commons:Wiki_Loves_Earth_2018_in_Thailand|2018]] • [[c:Commons:Wiki_Loves_Earth_2019_in_Thailand|2019]] • [[c:Commons:Wiki_Loves_Earth_2020_in_Thailand|2020]] • [[c:Commons:Wiki_Loves_Earth_2022_in_Thailand|2022]] • [[c:Commons:Wiki_Loves_Earth_2023_in_Thailand|2023]] • [[c:Commons:Wiki_Loves_Earth_2024_in_Thailand|2024]] • [[c:Commons:Wiki_Loves_Earth_2025_in_Thailand|2025]] • [[c:Commons:Wiki Loves Earth Thailand 2026|2026]] | group3 = Wiki Science Competition | list3 = [[c:Commons:Wiki_Science_Competition_2017_in_Thailand|2017]] • [[c:Commons:Wiki_Science_Competition_2021_in_Thailand|2021]] }}|group3=Other Contest|list3={{Navbox subgroup | group1 = Wikigap | list1 = [[Wikimedians in Thailand/Activities/Wiki4Women2019|2019]] • [[Wikimedia Thailand/WikiGap 2022|2022]] • [[Wikimedia Thailand/WikiGap:_Girls_in_Digital_World|Girls in Digital World]] • [[Wikimedia Thailand/WikiGap 2024|2024]] • [[Wikimedia Thailand/WikiGap 2025|2025]] | group2 = Wiki Loves Food | list2 = [[Wikimedia Thailand/Wiki Loves Food|2022]] • [[Wikimedia Thailand/WikiFoodtival|2023]] • [[Wikimedia Thailand/WikiFoodtival 2025|2025]] | group3 = WikiDiversity | list3 = [[Wikimedia Thailand/WikiDiversity 2023|2023]] • [[Wikimedia Thailand/WikiDiversity 2024|2024]] • [[Wikimedia Thailand/WikiDiversity 2025|2025]] | group4 = Wikipedia Asian Month | list4 = [[:th:วิกิพีเดีย:Wikipedia Asian Month 2015 in Thailand|2015]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2016|2016]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2017|2017]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2018|2018]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2019|2019]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2020|2020]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2021|2021]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2022|2022]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2023|2023]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2024|2024]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2025|2025]] | group5 = GLAM | list5 = {{Navbox subgroup |group1 = Gallery |list1 = [[Wikimedia Thailand/GLAM–Gallery 2024|2024]] • [[Wikimedia Thailand/GLAM–Gallery 2025|2025]] |group2 = Library |list2 = [[Wikimedia Thailand/GLAM–Library 2024|2024]] • [[Wikimedia Thailand/GLAM–Library 2025|2025]] |group3 = Archive |list3 = [[Wikimedia Thailand/GLAM–Archive 2024|2024]] • [[Wikimedia Thailand/GLAM–Archive 2025|2025]] |group4 = Museum |list4 = [[Wikimedia Thailand/GLAM–Museum 2023|2023]] • [[Wikimedia Thailand/GLAM–Museum 2025|2025]] }} | group6 = Wikivoyage | list6 = [[Wikimedia Thailand/Wikivoyage 2023|2023]] | group7 = | list7 = [[:th:วิกิพีเดีย:โครงการวิกิแสนบทความกับวิกิพีเดียภาษาไทย|100k Articles Project]] • [[:th:โครงการเมนเทอร์|Mentor Project]] • [[:th:วิกิพีเดีย:โครงการหนึ่งบทความอย่างน้อยหนึ่งรูป|One Article, One or More Images Project]] • [[Wikimedia Thailand/WikiForHumanRights|WikiForHumanRights]] • [[:th:วิกิพีเดีย:รู้ไหมว่า/กิจกรรมสนับสนุน พ.ศ. 2567|Did You Know Article Promotion]] • [[:th:วิกิพีเดีย:บทความแนะนำ/กิจกรรมสนับสนุน พ.ศ. 2568|Recommended Article Promotion]] }}|group5=Grants|list5=[[Grants:PEG/UG TH/WLM 2014|2014]] • [[Grants:PEG/UG TH/Wiki Loves X in Thailand 2015|2015]] • [[Grants:Project/Rapid/Addis Wang - UGCN/Wikipedia Asian Month 2016|2016]] • [[Grants:Project/Rapid/WLX in Thailand 2017|2017]] • [[Grants:Project/Rapid/WLX and education projects in Thailand 2018|2018]] • [[Grants:Simple/Applications/Wikimedia Thailand/2020|2020]] • [[Grants:Programs/Wikimedia Community Fund/Wikimedia Thailand 2022|2022]]|group6=Grant Reports|list6=[[Grants:PEG/UG TH/WLM 2014/Report|2014]] • [[Grants:PEG/UG TH/Wiki Loves X in Thailand 2015/Report|2015]] • [[Grants:Project/Rapid/Addis Wang - UGCN/Wikipedia Asian Month 2016/Report|2016]] • [[Grants:Project/Rapid/WLX in Thailand 2017/Report|2017]] • [[Grants:Project/Rapid/WLX and education projects in Thailand 2018/Report|2018]] • [[Grants:Simple/Applications/Wikimedia Thailand/2020|2020]]|below=}} 4mdn6zoty7o1hntpncf8q35j8j1umt4 แม่แบบ:Navbox 10 109 467 2026-04-27T06:28:19Z Azoma 208 สร้างหน้าด้วย "{{#invoke: Navbox | navbox }}<noinclude>{{documentation}}</noinclude>" 467 wikitext text/x-wiki {{#invoke: Navbox | navbox }}<noinclude>{{documentation}}</noinclude> r559d18z5ouc3wiwuekakf5ihlqt7ws ผู้ใช้:Azoma 2 110 468 2026-04-27T06:33:53Z Azoma 208 สร้างหน้าด้วย "{{:Wikimedia Thailand/Activities}} {{:Wikimedians in Thailand/activities/th}}" 468 wikitext text/x-wiki {{:Wikimedia Thailand/Activities}} {{:Wikimedians in Thailand/activities/th}} sya6vvr8f01bmryjk5ux8lj6q7senfi Wikimedians in Thailand/activities/th 0 111 469 2026-04-27T06:34:29Z Azoma 208 สร้างหน้าด้วย "{{Navbox | name = | title = กิจกรรมของ[[Wikimedia Thailand/th|วิกิมีเดียประเทศไทย]] |titlestyle = background:#CEE0F2 | state = expanded |style = width:100%; |image = [[File:Wikimedia Thailand-Logo-BW.svg|150px]] |groupstyle = text-align:right; background:#CEE0F2; font-size:85%; font-weight:bold; white-space:nowrap; padding:0 6px 0 6px; |abovestyle = text-align:center; backgroun..." 469 wikitext text/x-wiki {{Navbox | name = | title = กิจกรรมของ[[Wikimedia Thailand/th|วิกิมีเดียประเทศไทย]] |titlestyle = background:#CEE0F2 | state = expanded |style = width:100%; |image = [[File:Wikimedia Thailand-Logo-BW.svg|150px]] |groupstyle = text-align:right; background:#CEE0F2; font-size:85%; font-weight:bold; white-space:nowrap; padding:0 6px 0 6px; |abovestyle = text-align:center; background:#CEE0F2 |belowstyle = text-align:center; background:#CEE0F2 | above = | group1 = การนัดหมาย | list1 = {{Navbox subgroup |group1 = มหาวิทยาลัยมหิดล |list1 = [[Meetup/Mahidol University/1|1]] • [[Meetup/Mahidol University/2|2]] • [[Meetup/Mahidol University/3|3]] • [[Meetup/Mahidol University/4|4]] • [[Meetup/Mahidol University/5|5]] • [[Meetup/Mahidol University/6|6]] • [[Meetup/Mahidol University/7|7]] • [[Meetup/Mahidol University/8|8]] • [[Meetup/Mahidol University/9|9]] • [[Meetup/Mahidol University/10|10]] • [[Meetup/Mahidol University/11|11]] • [[Meetup/Mahidol University/12|12]] • [[Meetup/Mahidol University/13|13]] • [[Meetup/Mahidol University/14|14]] • [[Meetup/Mahidol University/15|15]] • [[Meetup/Mahidol University/16|16]] • [[Meetup/Mahidol University/17|17]] • [[Meetup/Mahidol University/18|18]] • [[Meetup/Mahidol University/19|19]] • [[Meetup/Mahidol University/20|20]] |group2 = กรุงเทพมหานคร |list2 = [[Wikimedians in Thailand/July 2012 meetup|กรกฎาคม 2555]] • [[Meetup/Bangkok/1|1]] • [[Meetup/Bangkok/2|2]] • [[Meetup/Bangkok/3|3]] |group3 = ต่างประเทศ |list3 = [[Wikimedia Thailand/Meetup/Melbourne/1|1]] |group4 = ออนไลน์ | list4 = [[Meetup/Thailand/Online/1|1]] • [[Meetup/Thailand/Online/2|2]] |group5 = WikiCamp | list5 = {{Navbox subgroup |group1 = BKKCamp |list1 = [[Wikimedia Thailand/WikiCamp 2023|1]] • [[Wikimedia Thailand/BKKCamp/2|2]] |group2 = EasternCamp |list2 = [[Wikimedia Thailand/EasternCamp/1|1]] }} |group6 = Photowalk |list6 = [[Wikimedia Thailand/Bangkok Photowalk 1|1]] • [[Wikimedia Thailand/Bangkok Photowalk 2|2]] |group7 = อื่นๆ |list7 = [[Wikimedians in Thailand/2015 Smithsonian APA|2015 Smithsonian APA]] • [[Wikimedians in Thailand/Activities/Wiki4Women2019|Wiki4Women2019]] }} | group2 = ประกวดภาพถ่าย | list2 = {{Navbox subgroup | group1 = Wiki Loves Monuments | list1 = [[c:Commons:Wiki_Loves_Monuments_2013_in_Thailand|2556]] • [[c:Commons:Wiki_Loves_Monuments_2014_in_Thailand|2557]] • [[c:Commons:Wiki_Loves_Monuments_2015_in_Thailand|2558]] • [[c:Commons:Wiki_Loves_Monuments_2016_in_Thailand|2559]] • [[c:Commons:Wiki_Loves_Monuments_2017_in_Thailand|2560]] • [[c:Commons:Wiki_Loves_Monuments_2018_in_Thailand|2561]] • [[c:Commons:Wiki_Loves_Monuments_2019_in_Thailand|2562]] • [[c:Commons:Wiki_Loves_Monuments_2020_in_Thailand|2563]] • [[c:Commons:Wiki_Loves_Monuments_2022_in_Thailand|2565]] • [[c:Commons:Wiki_Loves_Monuments_2023_in_Thailand|2566]] | group2 = Wiki Loves Earth | list2 = [[c:Commons:Wiki_Loves_Earth_2015_in_Thailand|2558]] • [[c:Commons:Wiki_Loves_Earth_2016_in_Thailand|2559]] • [[c:Commons:Wiki_Loves_Earth_2017_in_Thailand|2560]] • [[c:Commons:Wiki_Loves_Earth_2018_in_Thailand|2561]] • [[c:Commons:Wiki_Loves_Earth_2019_in_Thailand|2562]] • [[c:Commons:Wiki_Loves_Earth_2020_in_Thailand|2563]] | group3 = Wiki Science Competition | list3 = [[c:Commons:Wiki_Science_Competition_2017_in_Thailand|2560]] • [[c:Commons:Wiki_Science_Competition_2021_in_Thailand|2564]] }} | group3 = การประกวดอื่น ๆ | list3 = {{Navbox subgroup | group1 = Wiki Loves Food | list1 = [[Wikimedia Thailand/Wiki Loves Food|2565]] • [[Wikimedia Thailand/WikiFoodtival|2566]] | group2 = WikiGap | list2 = [[Wikimedia Thailand/WikiGap 2022|2565]] | group3 = WikiDiversity | list3 = [[Wikimedia Thailand/WikiDiversity 2023|2566]] | group4 = เดือนแห่งเอเชีย | list4 = [[:th:วิกิพีเดีย:Wikipedia Asian Month 2015 in Thailand|2558]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2016|2559]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2017|2560]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2018|2561]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2019|2562]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2020|2563]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2021|2564]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2022|2565]] | group5 = GLAM | list5 = {{Navbox subgroup |group1 = Gallery |list1 = [[Wikimedia Thailand/GLAM–Gallery 2024|2567]] |group2 = Library |list2 = [[Wikimedia Thailand/GLAM–Library 2024|2567]] |group3 = Archive |list3 = [[Wikimedia Thailand/GLAM–Archive 2024|2567]] |group4 = Museum |list4 = [[Wikimedia Thailand/GLAM–Museum 2023|2566]] }} | group6 = วิกิท่องเที่ยว | list6 = [[Wikimedia Thailand/Wikivoyage 2023|2566]] | group7 = | list7 = [[:th:วิกิพีเดีย:โครงการวิกิแสนบทความกับวิกิพีเดียภาษาไทย|โครงการวิกิแสนบทความ]] • [[:th:โครงการเมนเทอร์|โครงการเมนเทอร์]] • [[:th:วิกิพีเดีย:โครงการหนึ่งบทความอย่างน้อยหนึ่งรูป|โครงการหนึ่งบทความอย่างน้อยหนึ่งรูป]] • [[Wikimedians in Thailand/Activities/Wiki4Women2019|Wiki4Women2019]] • [[Wikimedia Thailand/WikiForHumanRights|WikiForHumanRights]] }} | group4 = การขอเงินสนับสนุน | list4 = [[Grants:PEG/UG TH/WLM 2014|2557]] • [[Grants:PEG/UG TH/Wiki Loves X in Thailand 2015|2558]] • [[Grants:Project/Rapid/Addis Wang - UGCN/Wikipedia Asian Month 2016|2559]] • [[Grants:Project/Rapid/WLX in Thailand 2017|2560]] • [[Grants:Project/Rapid/WLX and education projects in Thailand 2018|2561]] • [[Grants:Simple/Applications/Wikimedia Thailand/2020|2563]] • [[Grants:Programs/Wikimedia Community Fund/Wikimedia Thailand 2022|2565]] | group5 = รายงานการขอเงินสนับสนุน | list5 = [[Grants:PEG/UG TH/WLM 2014/Report|2557]] • [[Grants:PEG/UG TH/Wiki Loves X in Thailand 2015/Report|2558]] • [[Grants:Project/Rapid/Addis Wang - UGCN/Wikipedia Asian Month 2016/Report|2559]] • [[Grants:Project/Rapid/WLX in Thailand 2017/Report|2560]] • [[Grants:Project/Rapid/WLX and education projects in Thailand 2018/Report|2561]] • [[Grants:Simple/Applications/Wikimedia Thailand/2020|2563]] | below = }} it543927ibpbwefi9ovrpo3nqc78da2 481 469 2026-04-27T11:08:24Z Tvcccp 23 481 wikitext text/x-wiki {{Navbox | name = | title = กิจกรรมของ[[meta:Wikimedia Thailand/th|วิกิมีเดียประเทศไทย]] |titlestyle = background:#CEE0F2 | state = expanded |style = width:100%; |image = [[File:Wikimedia Thailand-Logo-BW.svg|150px]] |groupstyle = text-align:right; background:#CEE0F2; font-size:85%; font-weight:bold; white-space:nowrap; padding:0 6px 0 6px; |abovestyle = text-align:center; background:#CEE0F2 |belowstyle = text-align:center; background:#CEE0F2 | above = | group1 = การนัดหมาย | list1 = {{Navbox subgroup |group1 = มหาวิทยาลัยมหิดล |list1 = [[Meetup/Mahidol University/1|1]] • [[Meetup/Mahidol University/2|2]] • [[Meetup/Mahidol University/3|3]] • [[Meetup/Mahidol University/4|4]] • [[Meetup/Mahidol University/5|5]] • [[Meetup/Mahidol University/6|6]] • [[Meetup/Mahidol University/7|7]] • [[Meetup/Mahidol University/8|8]] • [[Meetup/Mahidol University/9|9]] • [[Meetup/Mahidol University/10|10]] • [[Meetup/Mahidol University/11|11]] • [[Meetup/Mahidol University/12|12]] • [[Meetup/Mahidol University/13|13]] • [[Meetup/Mahidol University/14|14]] • [[Meetup/Mahidol University/15|15]] • [[Meetup/Mahidol University/16|16]] • [[Meetup/Mahidol University/17|17]] • [[Meetup/Mahidol University/18|18]] • [[Meetup/Mahidol University/19|19]] • [[Meetup/Mahidol University/20|20]] |group2 = กรุงเทพมหานคร |list2 = [[Wikimedians in Thailand/July 2012 meetup|กรกฎาคม 2555]] • [[Meetup/Bangkok/1|1]] • [[Meetup/Bangkok/2|2]] • [[Meetup/Bangkok/3|3]] |group3 = ต่างประเทศ |list3 = [[Wikimedia Thailand/Meetup/Melbourne/1|1]] |group4 = ออนไลน์ | list4 = [[Meetup/Thailand/Online/1|1]] • [[Meetup/Thailand/Online/2|2]] |group5 = WikiCamp | list5 = {{Navbox subgroup |group1 = BKKCamp |list1 = [[Wikimedia Thailand/WikiCamp 2023|1]] • [[Wikimedia Thailand/BKKCamp/2|2]] |group2 = EasternCamp |list2 = [[Wikimedia Thailand/EasternCamp/1|1]] }} |group6 = Photowalk |list6 = [[Wikimedia Thailand/Bangkok Photowalk 1|1]] • [[Wikimedia Thailand/Bangkok Photowalk 2|2]] |group7 = อื่นๆ |list7 = [[Wikimedians in Thailand/2015 Smithsonian APA|2015 Smithsonian APA]] • [[Wikimedians in Thailand/Activities/Wiki4Women2019|Wiki4Women2019]] }} | group2 = ประกวดภาพถ่าย | list2 = {{Navbox subgroup | group1 = Wiki Loves Monuments | list1 = [[c:Commons:Wiki_Loves_Monuments_2013_in_Thailand|2556]] • [[c:Commons:Wiki_Loves_Monuments_2014_in_Thailand|2557]] • [[c:Commons:Wiki_Loves_Monuments_2015_in_Thailand|2558]] • [[c:Commons:Wiki_Loves_Monuments_2016_in_Thailand|2559]] • [[c:Commons:Wiki_Loves_Monuments_2017_in_Thailand|2560]] • [[c:Commons:Wiki_Loves_Monuments_2018_in_Thailand|2561]] • [[c:Commons:Wiki_Loves_Monuments_2019_in_Thailand|2562]] • [[c:Commons:Wiki_Loves_Monuments_2020_in_Thailand|2563]] • [[c:Commons:Wiki_Loves_Monuments_2022_in_Thailand|2565]] • [[c:Commons:Wiki_Loves_Monuments_2023_in_Thailand|2566]] | group2 = Wiki Loves Earth | list2 = [[c:Commons:Wiki_Loves_Earth_2015_in_Thailand|2558]] • [[c:Commons:Wiki_Loves_Earth_2016_in_Thailand|2559]] • [[c:Commons:Wiki_Loves_Earth_2017_in_Thailand|2560]] • [[c:Commons:Wiki_Loves_Earth_2018_in_Thailand|2561]] • [[c:Commons:Wiki_Loves_Earth_2019_in_Thailand|2562]] • [[c:Commons:Wiki_Loves_Earth_2020_in_Thailand|2563]] | group3 = Wiki Science Competition | list3 = [[c:Commons:Wiki_Science_Competition_2017_in_Thailand|2560]] • [[c:Commons:Wiki_Science_Competition_2021_in_Thailand|2564]] }} | group3 = การประกวดอื่น ๆ | list3 = {{Navbox subgroup | group1 = Wiki Loves Food | list1 = [[Wikimedia Thailand/Wiki Loves Food|2565]] • [[Wikimedia Thailand/WikiFoodtival|2566]] | group2 = WikiGap | list2 = [[Wikimedia Thailand/WikiGap 2022|2565]] | group3 = WikiDiversity | list3 = [[Wikimedia Thailand/WikiDiversity 2023|2566]] | group4 = เดือนแห่งเอเชีย | list4 = [[:th:วิกิพีเดีย:Wikipedia Asian Month 2015 in Thailand|2558]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2016|2559]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2017|2560]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2018|2561]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2019|2562]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2020|2563]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2021|2564]] • [[:th:วิกิพีเดีย:Wikipedia Asian Month 2022|2565]] | group5 = GLAM | list5 = {{Navbox subgroup |group1 = Gallery |list1 = [[Wikimedia Thailand/GLAM–Gallery 2024|2567]] |group2 = Library |list2 = [[Wikimedia Thailand/GLAM–Library 2024|2567]] |group3 = Archive |list3 = [[Wikimedia Thailand/GLAM–Archive 2024|2567]] |group4 = Museum |list4 = [[Wikimedia Thailand/GLAM–Museum 2023|2566]] }} | group6 = วิกิท่องเที่ยว | list6 = [[Wikimedia Thailand/Wikivoyage 2023|2566]] | group7 = | list7 = [[:th:วิกิพีเดีย:โครงการวิกิแสนบทความกับวิกิพีเดียภาษาไทย|โครงการวิกิแสนบทความ]] • [[:th:โครงการเมนเทอร์|โครงการเมนเทอร์]] • [[:th:วิกิพีเดีย:โครงการหนึ่งบทความอย่างน้อยหนึ่งรูป|โครงการหนึ่งบทความอย่างน้อยหนึ่งรูป]] • [[Wikimedians in Thailand/Activities/Wiki4Women2019|Wiki4Women2019]] • [[Wikimedia Thailand/WikiForHumanRights|WikiForHumanRights]] }} | group4 = การขอเงินสนับสนุน | list4 = [[Grants:PEG/UG TH/WLM 2014|2557]] • [[Grants:PEG/UG TH/Wiki Loves X in Thailand 2015|2558]] • [[Grants:Project/Rapid/Addis Wang - UGCN/Wikipedia Asian Month 2016|2559]] • [[Grants:Project/Rapid/WLX in Thailand 2017|2560]] • [[Grants:Project/Rapid/WLX and education projects in Thailand 2018|2561]] • [[Grants:Simple/Applications/Wikimedia Thailand/2020|2563]] • [[Grants:Programs/Wikimedia Community Fund/Wikimedia Thailand 2022|2565]] | group5 = รายงานการขอเงินสนับสนุน | list5 = [[Grants:PEG/UG TH/WLM 2014/Report|2557]] • [[Grants:PEG/UG TH/Wiki Loves X in Thailand 2015/Report|2558]] • [[Grants:Project/Rapid/Addis Wang - UGCN/Wikipedia Asian Month 2016/Report|2559]] • [[Grants:Project/Rapid/WLX in Thailand 2017/Report|2560]] • [[Grants:Project/Rapid/WLX and education projects in Thailand 2018/Report|2561]] • [[Grants:Simple/Applications/Wikimedia Thailand/2020|2563]] | below = }} k9n2dr9dufhbosbzi55eg8pvmnz4vko มอดูล:Navbox 828 112 470 2026-04-27T06:38:32Z Azoma 208 สร้างหน้าด้วย "local p = {} local navbar = require('Module:Navbar')._navbar local cfg = mw.loadData('Module:Navbox/configuration') local getArgs -- lazily initialized local args local format = string.format local function striped(wikitext, border) -- Return wikitext with markers replaced for odd/even striping. -- Child (subgroup) navboxes are flagged with a category that is removed -- by parent navboxes. The result is that the category shows all pages -- wher..." 470 Scribunto text/plain local p = {} local navbar = require('Module:Navbar')._navbar local cfg = mw.loadData('Module:Navbox/configuration') local getArgs -- lazily initialized local args local format = string.format local function striped(wikitext, border) -- Return wikitext with markers replaced for odd/even striping. -- Child (subgroup) navboxes are flagged with a category that is removed -- by parent navboxes. The result is that the category shows all pages -- where a child navbox is not contained in a parent navbox. local orphanCat = cfg.category.orphan if border == cfg.keyword.border_subgroup and args[cfg.arg.orphan] ~= cfg.keyword.orphan_yes then -- No change; striping occurs in outermost navbox. return wikitext .. orphanCat end local first, second = cfg.class.navbox_odd_part, cfg.class.navbox_even_part if args[cfg.arg.evenodd] then if args[cfg.arg.evenodd] == cfg.keyword.evenodd_swap then first, second = second, first else first = args[cfg.arg.evenodd] second = first end end local changer if first == second then changer = first else local index = 0 changer = function (code) if code == '0' then -- Current occurrence is for a group before a nested table. -- Set it to first as a valid although pointless class. -- The next occurrence will be the first row after a title -- in a subgroup and will also be first. index = 0 return first end index = index + 1 return index % 2 == 1 and first or second end end local regex = orphanCat:gsub('([%[%]])', '%%%1') return (wikitext:gsub(regex, ''):gsub(cfg.marker.regex, changer)) -- () omits gsub count end local function processItem(item, nowrapitems) if item:sub(1, 2) == '{|' then -- Applying nowrap to lines in a table does not make sense. -- Add newlines to compensate for trim of x in |parm=x in a template. return '\n' .. item ..'\n' end if nowrapitems == cfg.keyword.nowrapitems_yes then local lines = {} for line in (item .. '\n'):gmatch('([^\n]*)\n') do local prefix, content = line:match('^([*:;#]+)%s*(.*)') if prefix and not content:match(cfg.pattern.nowrap) then line = format(cfg.nowrap_item, prefix, content) end table.insert(lines, line) end item = table.concat(lines, '\n') end if item:match('^[*:;#]') then return '\n' .. item ..'\n' end return item end local function has_navbar() return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off and args[cfg.arg.navbar] ~= cfg.keyword.navbar_plain and ( args[cfg.arg.name] or mw.getCurrentFrame():getParent():getTitle():gsub(cfg.pattern.sandbox, '') ~= cfg.pattern.navbox ) end local function renderNavBar(titleCell) if has_navbar() then titleCell:wikitext(navbar{ [cfg.navbar.name] = args[cfg.arg.name], [cfg.navbar.mini] = 1, [cfg.navbar.fontstyle] = (args[cfg.arg.basestyle] or '') .. ';' .. (args[cfg.arg.titlestyle] or '') .. ';background:none transparent;border:none;box-shadow:none;padding:0;' }) end end local function renderTitleRow(tbl) if not args[cfg.arg.title] then return end local titleRow = tbl:tag('tr') local titleCell = titleRow:tag('th'):attr('scope', 'col') local titleColspan = 2 if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end if args[cfg.arg.image] then titleColspan = titleColspan + 1 end titleCell :cssText(args[cfg.arg.basestyle]) :cssText(args[cfg.arg.titlestyle]) :addClass(cfg.class.navbox_title) :attr('colspan', titleColspan) renderNavBar(titleCell) titleCell :tag('div') -- id for aria-labelledby attribute :attr('id', mw.uri.anchorEncode(args[cfg.arg.title])) :addClass(args[cfg.arg.titleclass]) :css('font-size', '114%') :css('margin', '0 4em') :wikitext(processItem(args[cfg.arg.title])) end local function getAboveBelowColspan() local ret = 2 if args[cfg.arg.imageleft] then ret = ret + 1 end if args[cfg.arg.image] then ret = ret + 1 end return ret end local function renderAboveRow(tbl) if not args[cfg.arg.above] then return end tbl:tag('tr') :tag('td') :addClass(cfg.class.navbox_abovebelow) :addClass(args[cfg.arg.aboveclass]) :cssText(args[cfg.arg.basestyle]) :cssText(args[cfg.arg.abovestyle]) :attr('colspan', getAboveBelowColspan()) :tag('div') -- id for aria-labelledby attribute, if no title :attr('id', args[cfg.arg.title] and nil or mw.uri.anchorEncode(args[cfg.arg.above])) :wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems])) end local function renderBelowRow(tbl) if not args[cfg.arg.below] then return end tbl:tag('tr') :tag('td') :addClass(cfg.class.navbox_abovebelow) :addClass(args[cfg.arg.belowclass]) :cssText(args[cfg.arg.basestyle]) :cssText(args[cfg.arg.belowstyle]) :attr('colspan', getAboveBelowColspan()) :tag('div') :wikitext(processItem(args[cfg.arg.below], args[cfg.arg.nowrapitems])) end local function renderListRow(tbl, index, listnum, listnums_size) local row = tbl:tag('tr') if index == 1 and args[cfg.arg.imageleft] then row :tag('td') :addClass(cfg.class.noviewer) :addClass(cfg.class.navbox_image) :addClass(args[cfg.arg.imageclass]) :css('width', '1px') -- Minimize width :css('padding', '0 2px 0 0') :cssText(args[cfg.arg.imageleftstyle]) :attr('rowspan', listnums_size) :tag('div') :wikitext(processItem(args[cfg.arg.imageleft])) end local group_and_num = format(cfg.arg.group_and_num, listnum) local groupstyle_and_num = format(cfg.arg.groupstyle_and_num, listnum) if args[group_and_num] then local groupCell = row:tag('th') -- id for aria-labelledby attribute, if lone group with no title or above if listnum == 1 and not (args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group2]) then groupCell :attr('id', mw.uri.anchorEncode(args[cfg.arg.group1])) end groupCell :attr('scope', 'row') :addClass(cfg.class.navbox_group) :addClass(args[cfg.arg.groupclass]) :cssText(args[cfg.arg.basestyle]) -- If groupwidth not specified, minimize width :css('width', args[cfg.arg.groupwidth] or '1%') groupCell :cssText(args[cfg.arg.groupstyle]) :cssText(args[groupstyle_and_num]) :wikitext(args[group_and_num]) end local listCell = row:tag('td') if args[group_and_num] then listCell :addClass(cfg.class.navbox_list_with_group) else listCell:attr('colspan', 2) end if not args[cfg.arg.groupwidth] then listCell:css('width', '100%') end local rowstyle -- usually nil so cssText(rowstyle) usually adds nothing if index % 2 == 1 then rowstyle = args[cfg.arg.oddstyle] else rowstyle = args[cfg.arg.evenstyle] end local list_and_num = format(cfg.arg.list_and_num, listnum) local listText = args[list_and_num] local oddEven = cfg.marker.oddeven if listText:sub(1, 12) == '</div><table' then -- Assume list text is for a subgroup navbox so no automatic striping for this row. oddEven = listText:find(cfg.pattern.navbox_title) and cfg.marker.restart or cfg.class.navbox_odd_part end local liststyle_and_num = format(cfg.arg.liststyle_and_num, listnum) local listclass_and_num = format(cfg.arg.listclass_and_num, listnum) listCell :css('padding', '0') :cssText(args[cfg.arg.liststyle]) :cssText(rowstyle) :cssText(args[liststyle_and_num]) :addClass(cfg.class.navbox_list) :addClass(cfg.class.navbox_part .. oddEven) :addClass(args[cfg.arg.listclass]) :addClass(args[listclass_and_num]) :tag('div') :css('padding', (index == 1 and args[cfg.arg.list1padding]) or args[cfg.arg.listpadding] or '0 0.25em' ) :wikitext(processItem(listText, args[cfg.arg.nowrapitems])) if index == 1 and args[cfg.arg.image] then row :tag('td') :addClass(cfg.class.noviewer) :addClass(cfg.class.navbox_image) :addClass(args[cfg.arg.imageclass]) :css('width', '1px') -- Minimize width :css('padding', '0 0 0 2px') :cssText(args[cfg.arg.imagestyle]) :attr('rowspan', listnums_size) :tag('div') :wikitext(processItem(args[cfg.arg.image])) end end local function has_list_class(htmlclass) local patterns = { '^' .. htmlclass .. '$', '%s' .. htmlclass .. '$', '^' .. htmlclass .. '%s', '%s' .. htmlclass .. '%s' } for arg, _ in pairs(args) do if type(arg) == 'string' and mw.ustring.find(arg, cfg.pattern.class) then for _, pattern in ipairs(patterns) do if mw.ustring.find(args[arg] or '', pattern) then return true end end end end return false end -- there are a lot of list classes in the wild, so we add their TemplateStyles local function add_list_styles() local frame = mw.getCurrentFrame() local function add_list_templatestyles(htmlclass, templatestyles) if has_list_class(htmlclass) then return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles } } else return '' end end local hlist_styles = add_list_templatestyles('hlist', cfg.hlist_templatestyles) local plainlist_styles = add_list_templatestyles('plainlist', cfg.plainlist_templatestyles) -- a second workaround for [[phab:T303378]] -- when that issue is fixed, we can actually use has_navbar not to emit the -- tag here if we want if has_navbar() and hlist_styles == '' then hlist_styles = frame:extensionTag{ name = 'templatestyles', args = { src = cfg.hlist_templatestyles } } end -- hlist -> plainlist is best-effort to preserve old Common.css ordering. -- this ordering is not a guarantee because most navboxes will emit only -- one of these classes [hlist_note] return hlist_styles .. plainlist_styles end local function needsHorizontalLists(border) if border == cfg.keyword.border_subgroup or args[cfg.arg.tracking] == cfg.keyword.tracking_no then return false end return not has_list_class(cfg.pattern.hlist) and not has_list_class(cfg.pattern.plainlist) end local function hasBackgroundColors() for _, key in ipairs({cfg.arg.titlestyle, cfg.arg.groupstyle, cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do if tostring(args[key]):find('background', 1, true) then return true end end return false end local function hasBorders() for _, key in ipairs({cfg.arg.groupstyle, cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do if tostring(args[key]):find('border', 1, true) then return true end end return false end local function isIllegible() local styleratio = require('Module:Color contrast')._styleratio for key, style in pairs(args) do if tostring(key):match(cfg.pattern.style) then if styleratio{mw.text.unstripNoWiki(style)} < 4.5 then return true end end end return false end local function getTrackingCategories(border) local cats = {} if needsHorizontalLists(border) then table.insert(cats, cfg.category.horizontal_lists) end if hasBackgroundColors() then table.insert(cats, cfg.category.background_colors) end if isIllegible() then table.insert(cats, cfg.category.illegible) end if hasBorders() then table.insert(cats, cfg.category.borders) end return cats end local function renderTrackingCategories(builder, border) local title = mw.title.getCurrentTitle() if title.namespace ~= 10 then return end -- not in template space local subpage = title.subpageText if subpage == cfg.keyword.subpage_doc or subpage == cfg.keyword.subpage_sandbox or subpage == cfg.keyword.subpage_testcases then return end for _, cat in ipairs(getTrackingCategories(border)) do builder:wikitext('[[Category:' .. cat .. ']]') end end local function renderMainTable(border, listnums) local tbl = mw.html.create('table') :addClass(cfg.class.nowraplinks) :addClass(args[cfg.arg.bodyclass]) local state = args[cfg.arg.state] if args[cfg.arg.title] and state ~= cfg.keyword.state_plain and state ~= cfg.keyword.state_off then if state == cfg.keyword.state_collapsed then state = cfg.class.collapsed end tbl :addClass(cfg.class.collapsible) :addClass(state or cfg.class.autocollapse) end tbl:css('border-spacing', 0) if border == cfg.keyword.border_subgroup or border == cfg.keyword.border_none then tbl :addClass(cfg.class.navbox_subgroup) :cssText(args[cfg.arg.bodystyle]) :cssText(args[cfg.arg.style]) else -- regular navbox - bodystyle and style will be applied to the wrapper table tbl :addClass(cfg.class.navbox_inner) :css('background', 'transparent') :css('color', 'inherit') end tbl:cssText(args[cfg.arg.innerstyle]) renderTitleRow(tbl) renderAboveRow(tbl) local listnums_size = #listnums for i, listnum in ipairs(listnums) do renderListRow(tbl, i, listnum, listnums_size) end renderBelowRow(tbl) return tbl end local function add_navbox_styles(hiding_templatestyles) local frame = mw.getCurrentFrame() -- This is a lambda so that it doesn't need the frame as a parameter local function add_user_styles(templatestyles) if templatestyles and templatestyles ~= '' then return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles } } end return '' end -- get templatestyles. load base from config so that Lua only needs to do -- the work once of parser tag expansion local base_templatestyles = cfg.templatestyles local templatestyles = add_user_styles(args[cfg.arg.templatestyles]) local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles]) -- The 'navbox-styles' div exists to wrap the styles to work around T200206 -- more elegantly. Instead of combinatorial rules, this ends up being linear -- number of CSS rules. return mw.html.create('div') :addClass(cfg.class.navbox_styles) :wikitext( add_list_styles() .. -- see [hlist_note] applied to 'before base_templatestyles' base_templatestyles .. templatestyles .. child_templatestyles .. table.concat(hiding_templatestyles) ) :done() end -- work around [[phab:T303378]] -- for each arg: find all the templatestyles strip markers, insert them into a -- table. then remove all templatestyles markers from the arg local function move_hiding_templatestyles(args) local gfind = string.gfind local gsub = string.gsub local templatestyles_markers = {} local strip_marker_pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)' for k, arg in pairs(args) do for marker in gfind(arg, strip_marker_pattern) do table.insert(templatestyles_markers, marker) end args[k] = gsub(arg, strip_marker_pattern, '') end return templatestyles_markers end function p._navbox(navboxArgs) args = navboxArgs local hiding_templatestyles = move_hiding_templatestyles(args) local listnums = {} for k, _ in pairs(args) do if type(k) == 'string' then local listnum = k:match(cfg.pattern.listnum) if listnum then table.insert(listnums, tonumber(listnum)) end end end table.sort(listnums) local border = mw.text.trim(args[cfg.arg.border] or args[1] or '') if border == cfg.keyword.border_child then border = cfg.keyword.border_subgroup end -- render the main body of the navbox local tbl = renderMainTable(border, listnums) local res = mw.html.create() -- render the appropriate wrapper for the navbox, based on the border param if border == cfg.keyword.border_none then res:node(add_navbox_styles(hiding_templatestyles)) local nav = res:tag('div') :attr('role', 'navigation') :node(tbl) -- aria-labelledby title, otherwise above, otherwise lone group if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then nav:attr( 'aria-labelledby', mw.uri.anchorEncode( args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1] ) ) else nav:attr('aria-label', cfg.aria_label) end elseif border == cfg.keyword.border_subgroup then -- We assume that this navbox is being rendered in a list cell of a -- parent navbox, and is therefore inside a div with padding:0em 0.25em. -- We start with a </div> to avoid the padding being applied, and at the -- end add a <div> to balance out the parent's </div> res :wikitext('</div>') :node(tbl) :wikitext('<div>') else res:node(add_navbox_styles(hiding_templatestyles)) local nav = res:tag('div') :attr('role', 'navigation') :addClass(cfg.class.navbox) :addClass(args[cfg.arg.navboxclass]) :cssText(args[cfg.arg.bodystyle]) :cssText(args[cfg.arg.style]) :css('padding', '3px') :node(tbl) -- aria-labelledby title, otherwise above, otherwise lone group if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then nav:attr( 'aria-labelledby', mw.uri.anchorEncode(args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]) ) else nav:attr('aria-label', cfg.aria_label) end end if (args[cfg.arg.nocat] or cfg.keyword.nocat_false):lower() == cfg.keyword.nocat_false then renderTrackingCategories(res, border) end return striped(tostring(res), border) end function p.navbox(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end args = getArgs(frame, {wrappers = {cfg.pattern.navbox}}) -- Read the arguments in the order they'll be output in, to make references -- number in the right order. local _ _ = args[cfg.arg.title] _ = args[cfg.arg.above] -- Limit this to 20 as covering 'most' cases (that's a SWAG) and because -- iterator approach won't work here for i = 1, 20 do _ = args[format(cfg.arg.group_and_num, i)] _ = args[format(cfg.arg.list_and_num, i)] end _ = args[cfg.arg.below] return p._navbox(args) end return p t7wpbpsk2issbvsmbic7keehrtse5wh มอดูล:Navbox/doc 828 113 471 2026-04-27T06:40:48Z Azoma 208 สร้างหน้าด้วย "<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> {{Uses TemplateStyles|Template:Flatlist/styles.css|Template:Plainlist/styles.css|noprotcat=yes}} This module implements {{tlx|Navbox}}. Supported parameters in this version (preliminary documentation): {{clear}} <div style="border:1px solid #AAA;padding:1ex;{{column-width|24em}}{{column-gap|2ex}}{{column-rule|1px solid #AAA}}"> ; For main navboxes :* dir=l..." 471 wikitext text/x-wiki <!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> {{Uses TemplateStyles|Template:Flatlist/styles.css|Template:Plainlist/styles.css|noprotcat=yes}} This module implements {{tlx|Navbox}}. Supported parameters in this version (preliminary documentation): {{clear}} <div style="border:1px solid #AAA;padding:1ex;{{column-width|24em}}{{column-gap|2ex}}{{column-rule|1px solid #AAA}}"> ; For main navboxes :* dir=ltr ''or'' rtl (optional, default is ltr) :* name=''pagename'' (of template) :* state=[collapsed|autocollapse] :* border=[none|plain] :* bodyclass=, bodystyle=, style= :* innerstyle= :* basestyle= (for all cells) : '''title cell''' :* titleclass=, titlestyle= :* title=''title'' (required, not collapsible) :* navbar=[off|plain] (if name specified) ; For inner navboxes :* name=''pagename'' (if in a subtemplate) :* border=subgroup|child :* bodyclass=, bodystyle=, style= :* innerstyle= :* basestyle= (for all cells) : '''title cell (optional, in row 1)''' :* titlegroupclass=, titlegroupstyle= :* titlegroup=''subtitle'' :* navbar=[off|plain] (if name specified) ; Content cell above the list of groups :* aboveclass=, abovestyle= :* above=''content'' ; Styles of group headers :* groupclass=, groupstyle= :* groupwidth= ; Styles of group lists :* listclass=, liststyle= :* evenstyle=, oddstyle= :* list1padding=[yes], listpadding=[yes] ; Images in row 1, spanning all rows except title :* imageclass= :* imageleftstyle=, imageleft= :* imagestyle=, image= ; For each group (''n''>=1) :* group''n''=''header'' :* list''n''style= :* list''n''=''list content'' or<br />''inner navbox'' ; Content cell below the list of groups :* belowclass=, belowstyle= :* below=''content'' </div> <includeonly>{{Sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> [[Category:Modules{{#translation:}}]] }}</includeonly><noinclude> [[Category:Module documentation pages{{#translation:}}]] </noinclude> f8a3zbb65x6x5sgdjcy1kajm3eg1pbo มอดูล:Navbar 828 114 472 2026-04-27T10:50:26Z Tvcccp 23 สร้างหน้าด้วย "local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, tr..." 472 Scribunto text/plain local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false, false} if template then show[2] = false show[3] = false local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} -- TODO: Consider removing TableTools dependency. for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end local remove_edit_link = args.noedit if remove_edit_link then show[3] = false end return show end local function add_link(link_description, ul, is_mini, font_style) local l if link_description.url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-' .. link_description.full) :wikitext(l[1] .. link_description.link .. l[2]) :tag(is_mini and 'abbr' or 'span') :attr('title', link_description.html_title) :cssText(font_style) :wikitext(is_mini and link_description.mini or link_description.full) :done() :wikitext(l[3]) :done() end local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) if not title then error(cfg.invalid_title .. title_text) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' -- TODO: Get link_descriptions and show into the configuration module. -- link_descriptions should be easier... local link_descriptions = { { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['link'] = title:fullUrl('action=edit'), ['url'] = true }, { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['link'] = title:fullUrl('action=history'), ['url'] = true }, { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['link'] = title:fullUrl('action=watch'), ['url'] = true } } local ul = mw.html.create('ul') if has_brackets then ul:addClass(cfg.classes.brackets) :cssText(font_style) end for i, _ in ipairs(displayed_links) do if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end end return ul:done() end function p._navbar(args) -- TODO: We probably don't need both fontstyle and fontcolor... local font_style = args.fontstyle local font_color = args.fontcolor local is_collapsible = args.collapsible local is_mini = args.mini local is_plain = args.plain local collapsible_class = nil if is_collapsible then collapsible_class = cfg.classes.collapsible if not is_plain then is_mini = 1 end if font_color then font_style = (font_style or '') .. '; color: ' .. font_color .. ';' end end local navbar_style = args.style local div = mw.html.create():tag('div') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end local box_text = (args.text or cfg.box_text) .. ' ' -- the concatenated space guarantees the box text is separated if not (is_mini or is_plain) then div :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) end local template = args.template local displayed_links = choose_links(template, args) local has_brackets = args.brackets local title_arg = get_title_arg(is_collapsible, template) local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) div:node(list) if is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end local frame = mw.getCurrentFrame() -- hlist -> navbar is best-effort to preserve old Common.css ordering. return frame:extensionTag{ name = 'templatestyles', args = { src = cfg.hlist_templatestyles } } .. frame:extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p e8x4gsvao3bejgs0lle5fr5bug7ym1j มอดูล:Navbar/configuration 828 115 473 2026-04-27T10:54:03Z Tvcccp 23 สร้างหน้าด้วย "return { ['templatestyles'] = 'Module:Navbar/styles.css', ['hlist_templatestyles'] = 'Flatlist/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = '..." 473 Scribunto text/plain return { ['templatestyles'] = 'Module:Navbar/styles.css', ['hlist_templatestyles'] = 'Flatlist/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } df3ufsfbua9z8ppazx2wr006mwe2xjx มอดูล:Navbar/styles.css 828 116 474 2026-04-27T10:58:51Z Tvcccp 23 สร้างหน้าด้วย "/* {{pp-template}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } ...." 474 sanitized-css text/css /* {{pp-template}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar a > span, .navbar a > abbr { text-decoration: inherit; } .navbar-mini abbr { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } nd76zw6ebwbmn1d6uemkc8fxy45i51m มอดูล:Navbox/styles.css 828 117 475 2026-04-27T10:59:44Z Tvcccp 23 สร้างหน้าด้วย ".navbox { box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%; clear: both; font-size: 88%; text-align: center; padding: 1px; margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */ } .navbox .navbox { margin-top: 0; /* No top margin for nested navboxes */ } .navbox + .navbox-styles + .navbox { margin-top: -1px; /* Single pixel border between adjacent navboxes */ } .navbox-inner, .navbox-subgroup { widt..." 475 sanitized-css text/css .navbox { box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%; clear: both; font-size: 88%; text-align: center; padding: 1px; margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */ } .navbox .navbox { margin-top: 0; /* No top margin for nested navboxes */ } .navbox + .navbox-styles + .navbox { margin-top: -1px; /* Single pixel border between adjacent navboxes */ } .navbox-inner, .navbox-subgroup { width: 100%; } .navbox-group, .navbox-title, .navbox-abovebelow { padding: 0.25em 1em; line-height: 1.5em; text-align: center; } .navbox-group { white-space: nowrap; text-align: right; } .navbox, .navbox-subgroup { background-color: #fdfdfd; } .navbox-list { line-height: 1.5em; border-color: #fdfdfd; /* Must match background color */ } .navbox-list-with-group { text-align: left; border-left-width: 2px; border-left-style: solid; } /* cell spacing for navbox cells */ /* Borders above 2nd, 3rd, etc. rows */ /* TODO: figure out how to replace tr as structure; * with div structure it should be just a matter of first-child */ tr + tr > .navbox-abovebelow, tr + tr > .navbox-group, tr + tr > .navbox-image, tr + tr > .navbox-list { border-top: 2px solid #fdfdfd; /* Must match background color */ } .navbox-title { /* Level 1 color */ background-color: #ccf; } .navbox-abovebelow, .navbox-group, .navbox-subgroup .navbox-title { /* Level 2 color */ background-color: #ddf; } .navbox-subgroup .navbox-group, .navbox-subgroup .navbox-abovebelow { /* Level 3 color */ background-color: #e6e6ff; } .navbox-even { background-color: #f7f7f7; } .navbox-odd { background-color: transparent; } /* TODO: figure out how to remove reliance on td as structure */ .navbox .hlist td dl, .navbox .hlist td ol, .navbox .hlist td ul, .navbox td.hlist dl, .navbox td.hlist ol, .navbox td.hlist ul { padding: 0.125em 0; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { float: left; text-align: left; margin-right: 0.5em; } ld6tqz3c8swwnagxxwnk8hm7iwkmo06 มอดูล:Navbox/configuration 828 118 476 2026-04-27T11:02:02Z Tvcccp 23 สร้างหน้าด้วย "return { aria_label = 'Navbox', nowrap_item = '%s<span class="nowrap">%s</span>', templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Navbox/styles.css' } }, hlist_templatestyles = 'Flatlist/styles.css', --Follow mw: rather than w:en: plainlist_templatestyles = 'Plainlist/styles.css', -- do not localize marker table marker = { oddeven = '\127_ODDEVEN_\127', restart = '\127_ODDEVEN0_\127',..." 476 Scribunto text/plain return { aria_label = 'Navbox', nowrap_item = '%s<span class="nowrap">%s</span>', templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Navbox/styles.css' } }, hlist_templatestyles = 'Flatlist/styles.css', --Follow mw: rather than w:en: plainlist_templatestyles = 'Plainlist/styles.css', -- do not localize marker table marker = { oddeven = '\127_ODDEVEN_\127', restart = '\127_ODDEVEN0_\127', regex = '\127_ODDEVEN(%d?)_\127' }, category = { orphan = '[[Category:Navbox orphans]]', horizontal_lists = 'Navigational boxes without horizontal lists', background_colors = 'Navboxes using background colours', illegible = 'Potentially illegible navboxes', borders = 'Navboxes using borders', }, keyword = { border_subgroup = 'subgroup', border_child = 'child', border_none = 'none', evenodd_swap = 'swap', navbar_off = 'off', navbar_plain = 'plain', nocat_false = 'false', nowrapitems_yes = 'yes', orphan_yes = 'yes', state_collapsed = 'collapsed', state_off = 'off', state_plain = 'plain', subpage_doc = 'doc', subpage_sandbox = 'sandbox', subpage_testcases = 'testcases', tracking_no = 'no' }, class = { autocollapse = 'autocollapse', collapsible = 'mw-collapsible', collapsed = 'mw-collapsed', -- Warning navbox = 'navbox', -- WMF currently hides 'navbox' from mobile, -- so you probably shouldn't change the navbox class. navbox_abovebelow = 'navbox-abovebelow', navbox_group = 'navbox-group', navbox_image = 'navbox-image', navbox_inner = 'navbox-inner', navbox_list = 'navbox-list', navbox_list_with_group = 'navbox-list-with-group', navbox_part = 'navbox-', -- do not l10n navbox_styles = 'navbox-styles', navbox_subgroup = 'navbox-subgroup', navbox_title = 'navbox-title', -- l10n only if you change pattern.navbox_title below navbox_odd_part = 'odd', -- do not l10n navbox_even_part = 'even', -- do not l10n nomobile = 'nomobile', nowraplinks = 'nowraplinks', noviewer = 'noviewer' -- used to remove images from MediaViewer }, pattern = { listnum = '^list(%d+)$', class = 'class', sandbox = '/sandbox$', navbox = 'Template:Navbox', nowrap = '^<span class="nowrap">', style = 'style$', navbox_title = '<th[^>]*"navbox%-title"', hlist = 'hlist', plainlist = 'plainlist', }, arg = { above = 'above', aboveclass = 'aboveclass', abovestyle = 'abovestyle', basestyle = 'basestyle', bodyclass = 'bodyclass', bodystyle = 'bodystyle', border = 'border', below = 'below', belowclass = 'belowclass', belowstyle = 'belowstyle', evenodd = 'evenodd', evenstyle = 'evenstyle', group1 = 'group1', group2 = 'group2', group_and_num = 'group%d', groupstyle_and_num = 'group%dstyle', groupclass = 'groupclass', groupstyle = 'groupstyle', groupwidth = 'groupwidth', innerstyle = 'innerstyle', image = 'image', imageclass = 'imageclass', imageleft = 'imageleft', imageleftstyle = 'imageleftstyle', imagesetyle = 'imagestyle', list_and_num = 'list%d', listclass_and_num = 'list%dclass', liststyle_and_num = 'list%dstyle', list1padding = 'list1padding', listclass = 'listclass', listpadding = 'listpadding', liststyle = 'liststyle', name = 'name', navbar = 'navbar', navboxclass = 'navboxclass', nocat = 'nocat', nowrapitems = 'nowrapitems', oddstyle = 'oddstyle', orphan = 'orphan', state = 'state', style = 'style', templatestyles = 'templatestyles', child_templatestyles = 'child templatestyles', title = 'title', titleclass = 'titleclass', titlestyle = 'titlestyle', tracking = 'tracking' }, -- names of navbar arguments navbar = { name = 1, fontstyle = 'fontstyle', mini = 'mini' } } hn82escy25lhi2t2i9yb2irmzfxj02i แม่แบบ:Flatlist/styles.css 10 119 477 2026-04-27T11:04:27Z Tvcccp 23 สร้างหน้าด้วย "/* {{pp-template}} */ /** * Style for horizontal lists (separator following item). * @source https://www.mediawiki.org/wiki/Snippets/Horizontal_lists * @revision 9 (2016-08-10) * @author [[User:Edokter]] */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { margin: 0; display: inline; } /* Display nested lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline o..." 477 sanitized-css text/css /* {{pp-template}} */ /** * Style for horizontal lists (separator following item). * @source https://www.mediawiki.org/wiki/Snippets/Horizontal_lists * @revision 9 (2016-08-10) * @author [[User:Edokter]] */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { margin: 0; display: inline; } /* Display nested lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li, .hlist .mw-empty-elt { display: none; } /* Generate interpuncts */ .hlist dt:after { content: ": "; } .hlist dd:after, .hlist li:after { content: " · "; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) "\a0"; } a4wyf051b7o8tplxd2sf168cj98zrj2 แม่แบบ:Flatlist 10 120 478 2026-04-27T11:04:55Z Tvcccp 23 สร้างหน้าด้วย "<onlyinclude><templatestyles src="Template:Flatlist/styles.css"/><div class="hlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}| {{{1}}} </div>}}" 478 wikitext text/x-wiki <onlyinclude><templatestyles src="Template:Flatlist/styles.css"/><div class="hlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}| {{{1}}} </div>}} q69rbqpw0qao0tagdie1tmm11nib52l แม่แบบ:Navbox subgroup 10 121 479 2026-04-27T11:05:48Z Tvcccp 23 สร้างหน้าด้วย "{{Navbox |name = {{{name|}}} |state = {{{state|}}} |navbar = {{{navbar|}}} |border = {{#if:{{{border|}}}|{{{border}}}|child}} |title = {{{title|}}} |above = {{{above|}}} |below = {{{below|}}} |image = {{{image|}}} |imageleft = {{{imageleft|}}} |groupwidth = {{{groupwidth|}}} |group1 = {{#if:{{{group1|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group1}}}</div>}} |group2 = {{#if:{{{group2|}}}|<div style="padding:{{{grouppadding|0em 0...." 479 wikitext text/x-wiki {{Navbox |name = {{{name|}}} |state = {{{state|}}} |navbar = {{{navbar|}}} |border = {{#if:{{{border|}}}|{{{border}}}|child}} |title = {{{title|}}} |above = {{{above|}}} |below = {{{below|}}} |image = {{{image|}}} |imageleft = {{{imageleft|}}} |groupwidth = {{{groupwidth|}}} |group1 = {{#if:{{{group1|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group1}}}</div>}} |group2 = {{#if:{{{group2|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group2}}}</div>}} |group3 = {{#if:{{{group3|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group3}}}</div>}} |group4 = {{#if:{{{group4|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group4}}}</div>}} |group5 = {{#if:{{{group5|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group5}}}</div>}} |group6 = {{#if:{{{group6|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group6}}}</div>}} |group7 = {{#if:{{{group7|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group7}}}</div>}} |group8 = {{#if:{{{group8|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group8}}}</div>}} |group9 = {{#if:{{{group9|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group9}}}</div>}} |group10 = {{#if:{{{group10|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group10}}}</div>}} |group11 = {{#if:{{{group11|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group11}}}</div>}} |group12 = {{#if:{{{group12|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group12}}}</div>}} |group13 = {{#if:{{{group13|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group13}}}</div>}} |group14 = {{#if:{{{group14|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group14}}}</div>}} |group15 = {{#if:{{{group15|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group15}}}</div>}} |group16 = {{#if:{{{group16|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group16}}}</div>}} |group17 = {{#if:{{{group17|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group17}}}</div>}} |group18 = {{#if:{{{group18|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group18}}}</div>}} |group19 = {{#if:{{{group19|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group19}}}</div>}} |group20 = {{#if:{{{group20|}}}|<div style="padding:{{{grouppadding|0em 0.75em;}}}">{{{group20}}}</div>}} |list1 = {{{list1|}}} |list2 = {{{list2|}}} |list3 = {{{list3|}}} |list4 = {{{list4|}}} |list5 = {{{list5|}}} |list6 = {{{list6|}}} |list7 = {{{list7|}}} |list8 = {{{list8|}}} |list9 = {{{list9|}}} |list10 = {{{list10|}}} |list11 = {{{list11|}}} |list12 = {{{list12|}}} |list13 = {{{list13|}}} |list14 = {{{list14|}}} |list15 = {{{list15|}}} |list16 = {{{list16|}}} |list17 = {{{list17|}}} |list18 = {{{list18|}}} |list19 = {{{list19|}}} |list20 = {{{list20|}}} |bodyclass = {{{bodyclass|}}} |titleclass = {{{titleclass|}}} |aboveclass = {{{aboveclass|}}} |belowclass = {{{belowclass|}}} |groupclass = {{{groupclass|}}} |listclass = {{{listclass|}}} |style = {{{style|}}}{{{bodystyle|}}} |imageleftstyle = {{{imageleftstyle|}}} |imagestyle = {{{imagestyle|}}} |titlestyle = {{{titlestyle|}}} |basestyle = {{{basestyle|}}} |abovestyle = {{{abovestyle|}}} |belowstyle = {{{belowstyle|}}} |groupstyle = padding-left:0;padding-right:0;{{{groupstyle|}}} |liststyle = {{{liststyle|}}} |evenstyle = {{{evenstyle|}}} |oddstyle = {{{oddstyle|}}} |group1style = {{{group1style|}}} |group2style = {{{group2style|}}} |group3style = {{{group3style|}}} |group4style = {{{group4style|}}} |group5style = {{{group5style|}}} |group6style = {{{group6style|}}} |group7style = {{{group7style|}}} |group8style = {{{group8style|}}} |group9style = {{{group9style|}}} |group10style = {{{group10style|}}} |group11style = {{{group11style|}}} |group12style = {{{group12style|}}} |group13style = {{{group13style|}}} |group14style = {{{group14style|}}} |group15style = {{{group15style|}}} |group16style = {{{group16style|}}} |group17style = {{{group17style|}}} |group18style = {{{group18style|}}} |group19style = {{{group19style|}}} |group20style = {{{group20style|}}} |list1style = {{{list1style|}}} |list2style = {{{list2style|}}} |list3style = {{{list3style|}}} |list4style = {{{list4style|}}} |list5style = {{{list5style|}}} |list6style = {{{list6style|}}} |list7style = {{{list7style|}}} |list8style = {{{list8style|}}} |list9style = {{{list9style|}}} |list10style = {{{list10style|}}} |list11style = {{{list11style|}}} |list12style = {{{list12style|}}} |list13style = {{{list13style|}}} |list14style = {{{list14style|}}} |list15style = {{{list15style|}}} |list16style = {{{list16style|}}} |list17style = {{{list17style|}}} |list18style = {{{list18style|}}} |list19style = {{{list19style|}}} |list20style = {{{list20style|}}} |evenodd = {{{evenodd|}}} |listpadding = {{{listpadding|}}} }}<noinclude> 4352admt48jguxcnufx5g3gs729t7o1 มอดูล:Color contrast 828 122 480 2026-04-27T11:06:30Z Tvcccp 23 สร้างหน้าด้วย "-- -- This module implements -- {{Color contrast ratio}} -- {{Greater color contrast ratio}} -- {{ColorToLum}} -- {{RGBColorToLum}} -- local p = {} local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' ) local function sRGB ( v ) if (v <= 0.03928) then v = v / 12.92 else v = math.pow((v+0.055)/1.055, 2.4) end return v end local function rgbdec2lum( R, G, B ) if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B <..." 480 Scribunto text/plain -- -- This module implements -- {{Color contrast ratio}} -- {{Greater color contrast ratio}} -- {{ColorToLum}} -- {{RGBColorToLum}} -- local p = {} local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' ) local function sRGB ( v ) if (v <= 0.03928) then v = v / 12.92 else v = math.pow((v+0.055)/1.055, 2.4) end return v end local function rgbdec2lum( R, G, B ) if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255) else return '' end end local function hsl2lum( h, s, l ) if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then local c = (1 - math.abs(2*l - 1))*s local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) ) local m = l - c/2 local r, g, b = m, m, m if( 0 <= h and h < 60 ) then r = r + c g = g + x elseif( 60 <= h and h < 120 ) then r = r + x g = g + c elseif( 120 <= h and h < 180 ) then g = g + c b = b + x elseif( 180 <= h and h < 240 ) then g = g + x b = b + c elseif( 240 <= h and h < 300 ) then r = r + x b = b + c elseif( 300 <= h and h < 360 ) then r = r + c b = b + x end return rgbdec2lum(255*r, 255*g, 255*b) else return '' end end local function color2lum( c ) if (c == nil) then return '' end -- whitespace c = c:match( '^%s*(.-)[%s;]*$' ) -- unstrip nowiki strip markers c = mw.text.unstripNoWiki(c) -- lowercase c = c:lower() -- first try to look it up local L = HTMLcolor[c] if (L ~= nil) then return L end -- convert from hsl if mw.ustring.match(c,'^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then local h, s, l = mw.ustring.match(c,'^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$') return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100) end -- convert from rgb if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$') then local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$') return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B)) end -- convert from rgb percent if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$') return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100) end -- remove leading # (if there is one) and whitespace c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s]*$') -- split into rgb local cs = mw.text.split(c or '', '') if( #cs == 6 ) then local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2]) local G = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4]) local B = 16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6]) return rgbdec2lum(R, G, B) elseif ( #cs == 3 ) then local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[1]) local G = 16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2]) local B = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3]) return rgbdec2lum(R, G, B) end -- failure, return blank return '' end function p._greatercontrast(args) local bias = tonumber(args['bias'] or '0') or 0 local v1 = color2lum(args[1] or '') local c2 = args[2] or '#FFFFFF' local v2 = color2lum(c2) local c3 = args[3] or '#000000' local v3 = color2lum(c3) local ratio1 = 0; local ratio2 = 0; if (type(v1) == 'number' and type(v2) == 'number') then ratio1 = (v2 + 0.05)/(v1 + 0.05) ratio1 = (ratio1 < 1) and 1/ratio1 or ratio1 end if (type(v1) == 'number' and type(v3) == 'number') then ratio2 = (v3 + 0.05)/(v1 + 0.05) ratio2 = (ratio2 < 1) and 1/ratio2 or ratio2 end return (ratio1 + bias > ratio2) and c2 or c3 end function p._ratio(args) local v1 = color2lum(args[1]) local v2 = color2lum(args[2]) if (type(v1) == 'number' and type(v2) == 'number') then -- v1 should be the brighter of the two. if v2 > v1 then v1, v2 = v2, v1 end return (v1 + 0.05)/(v2 + 0.05) else return args['error'] or '?' end end function p._styleratio(args) local style = (args[1] or ''):lower() local bg, fg = 'white', 'black' local lum_bg, lum_fg = 1, 0 if args[2] then local lum = color2lum(args[2]) if lum ~= '' then bg, lum_bg = args[2], lum end end if args[3] then local lum = color2lum(args[3]) if lum ~= '' then fg, lum_fg = args[3], lum end end local slist = mw.text.split(style or '', ';') for k = 1,#slist do s = slist[k] local k,v = s:match( '^[%s]*([^:]-):([^:]-)[%s;]*$' ) k = k or '' v = v or '' if (k:match('^[%s]*(background)[%s]*$') or k:match('^[%s]*(background%-color)[%s]*$')) then local lum = color2lum(v) if( lum ~= '' ) then bg, lum_bg = v, lum end elseif (k:match('^[%s]*(color)[%s]*$')) then local lum = color2lum(v) if( lum ~= '' ) then bg, lum_fg = v, lum end end end if lum_bg > lum_fg then return (lum_bg + 0.05)/(lum_fg + 0.05) else return (lum_fg + 0.05)/(lum_bg + 0.05) end end function p.lum(frame) return color2lum(frame.args[1] or frame:getParent().args[1]) end function p.ratio(frame) local args = frame.args[1] and frame.args or frame:getParent().args return p._ratio(args) end function p.styleratio(frame) local args = frame.args[1] and frame.args or frame:getParent().args return p._styleratio(args) end function p.greatercontrast(frame) local args = frame.args[1] and frame.args or frame:getParent().args return p._greatercontrast(args) end return p hvtmcsb4mviz7lzj6tgvyp5kohk0vr7