Wikipédia
banwiki
https://ban.wikipedia.org/wiki/Kaca_Utama
MediaWiki 1.47.0-wmf.23
first-letter
Média
Kusus
Pabligbagan
Sang Anganggé
Pabligbagan Sang Anganggé
Wikipédia
Pabligbagan Wikipédia
Berkas
Pabligbagan Berkas
MédiaWiki
Pabligbagan MédiaWiki
Mal
Pabligbagan Mal
Wantuan
Pabligbagan Wantuan
Kategori
Pabligbagan Kategori
TimedText
TimedText talk
Modul
Pabligbagan Modul
Acara
Pembicaraan Acara
Wikipédia:Pasangkepan
4
2609
283261
282157
2026-10-09T09:28:40Z
MediaWiki message delivery
209
/* Wikidata Sitelink changes in Recent Changes and Watchlist */ wagian anyar
283261
wikitext
text/x-wiki
{{Kori Sekaa}}
{{Pasangkepan}}
__NEWSECTIONLINK__
<noinclude>{{Pintas|WP:SANGKEP|WP:WK|WP:WARKOP}}{{bukan bak pasir}}</noinclude>
== Feminism and Folklore 2026 starts soon ==
<div style="border:8px maroon ridge;padding:6px;">
[[File:Feminism and Folklore 2026 logo.svg|centre|550px|frameless]]
::<div lang="en" dir="ltr" class="mw-content-ltr">
<div style="text-align: center; width: 100%;">''{{int:please-translate}}''</div>
;Invitation to Organize Feminism and Folklore 2026
Dear Wiki Community,
We are pleased to invite Wikimedia communities, affiliates, and independent contributors to organize the '''[[:m:Feminism and Folklore 2026|Feminism and Folklore 2026]]''' writing competition on your local Wikipedia.
The international campaign will run from '''1 February to 31 March 2026''' and aims to improve coverage of feminism, women’s histories, gender-related topics, and folk culture across Wikipedia projects.
;About the Campaign
'''Feminism and Folklore''' is a global writing initiative that complements the '''[[:c:Commons:Wiki Loves Folklore 2026|Wiki Loves Folklore]]''' photography competition. While Wiki Loves Folklore focuses on visual documentation, this writing campaign addresses the '''gender gap on Wikipedia''' by improving encyclopedic content related to folk culture and marginalized voices.
;What Can Participants Write About?
Communities can contribute by creating, expanding, or translating articles related to:
* Folk festivals, rituals, and celebrations
* Folk dances, music, and traditional performances
* Women and queer figures in folklore
* Women in mythology and oral traditions
* Women warriors, witches, and witch-hunting narratives
* Fairy tales, folk stories, and legends
* Folk games, sports, and cultural practices
Participants may work from curated article lists or generate new article suggestions using campaign tools.
;How to Sign Up as an Organizer
Organizers are requested to complete the following steps to register their community:
# Create a local project page on your wiki [[:m:Feminism and Folklore/Sample|(see sample)]]
# Set up the campaign using the '''CampWiz''' tool
# Prepare a local article list and clearly mention:
#* Campaign timeline
#* Local and international prizes
# Request a site notice from local administrators [[:mr:Template:SN-FNF|(see sample)]]
# Add your local project page and CampWiz link to the '''[[:m:Feminism and Folklore 2026/Project Page|Meta project page]]'''
;Campaign Tools
The Wiki Loves Folklore Tech Team has introduced tools to support organizers and participants:
* '''Article List Generator by Topic''' – Helps identify articles available on English Wikipedia but missing in your local language Wikipedia. The tool allows customized filters and provides downloadable article lists in CSV and wikitable formats.
* '''CampWiz''' – Enables communities to manage writing campaigns effectively, including jury-based evaluation. This will be the third year CampWiz is officially used for Feminism and Folklore.
Both tools are now available for use in the campaign. '''[https://tools.wikilovesfolklore.org/ Click here to access the tools]'''
;Learn More & Get Support
For detailed information about rules, timelines, and prizes, please visit the
'''[[:m:Feminism and Folklore 2026|Feminism and Folklore 2026 project page]]'''.
If you have any questions or need assistance, feel free to reach out via:
* '''[[:m:Talk:Feminism and Folklore 2026/Project Page|Meta talk page]]'''
* Email us using details on the contact page.
;Join Us
We look forward to your collaboration and coordination in making Feminism and Folklore 2026 a meaningful and impactful campaign for closing gender gaps and enriching folk culture content on Wikipedia.
Thank you and best wishes,
'''[[:m:Feminism and Folklore 2026|Feminism and Folklore 2026 International Team]]'''
----
''Stay connected:''
[[File:B&W Facebook icon.png|link=https://www.facebook.com/feminismandfolklore/|30x30px]]
[[File:B&W Twitter icon.png|link=https://twitter.com/wikifolklore|30x30px]]
</div></div>
== Invitation to Host Wiki Loves Folklore 2026 in Your Country ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<div style="text-align: center; width: 100%;">''{{int:please-translate}}''</div>
[[File:Wiki Loves Folklore Logo.svg|right|150px|frameless]]
Hello everyone,
We are delighted to invite Wikimedia affiliates, user groups, and community organizations worldwide to participate in '''Wiki Loves Folklore 2026''', an international initiative dedicated to documenting and celebrating folk culture across the globe.
;About Wiki Loves Folklore
'''Wiki Loves Folklore''' is an annual international photography competition hosted on Wikimedia Commons. The campaign runs from '''1 February to 31 March 2026''' and encourages photographers, cultural enthusiasts, and community members to contribute photographs that highlight:
* Folk traditions and rituals
* Cultural festivals and celebrations
* Traditional attire and crafts
* Performing arts, music, and dance
* Everyday practices rooted in folk heritage
Through this campaign, we aim to preserve and promote diverse folk cultures and make them freely accessible to the world.
[[:c:Commons:Wiki_Loves_Folklore_2026|Project page on Wikimedia Commons]]
; Host a Local Edition
As we celebrate the '''eight edition''' of Wiki Loves Folklore, we warmly invite communities to organize a local edition in their country or region. Hosting a local campaign is a great opportunity to:
* Increase visibility of your region’s folk culture
* Engage new contributors in your community
* Enrich Wikimedia Commons with high-quality cultural content
'''[[:c:Commons:Wiki_Loves_Folklore_2026/Organize|Sign up to organize]]:'''
If your team prefers to organize the competition in ''either February or March only'', please feel free to let us know.
If you are unable to organize, we encourage you to share this opportunity with other interested groups or organizations in your region.
;Get in Touch
If you have any questions, need support, or would like to explore collaboration opportunities, please feel free to contact us via:
* The project Talk pages
* Email: '''support@wikilovesfolklore.org'''
We are also happy to connect via an online meeting if your team would like to discuss planning or coordination in more detail.
Warm regards,
'''The Wiki Loves Folklore International Team'''
</div>
[[Sang Anganggé:MediaWiki message delivery|MediaWiki message delivery]] ([[Pabligbagan Sang Anganggé:MediaWiki message delivery|pabligbagan]]) 18 Januari 2026 21.20 (WITA)
<!-- Pesan dikirim oleh Pengguna:Tiven2240@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery/Wikipedia&oldid=29228188 -->
== <span lang="id" dir="ltr">Tinjauan tahunan untuk Kode Etik Universal dan Panduan Penegakan</span> ==
<div lang="id" dir="ltr">
<section begin="announcement-content" />
Saya ingin menyampaikan bahwa periode peninjauan tahunan Kode Etik Universal dan Pedoman Penegakannya saat ini telah dibuka. Usulan perubahan dapat diajukan hingga 9 Februari 2026. Tahap ini merupakan langkah awal dari rangkaian proses peninjauan tahunan yang akan dilakukan.[[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Informasi lengkap dan ruang diskusi tersedia di halaman UCoC di Meta]].
[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Komite Pengarah Kode Etik Universal]] (U4C) adalah grup global yang didedikasikan untuk memberikan implementasi yang adil dan konsisten dari UCoC. Tinjauan tahunan ini telah direncanakan dan diimplementasikan oleh U4C. Untuk informasi dan tanggung jawab U4C lebih lanjut, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|Anda dapat meninjaunya pada piagam U4C]].
Mohon bagikan informasi ini pada anggota lain di komunitas Anda di mana pun yang mungkin sesuai.
-- Bekerja sama dengan U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|bicara]])<section end="announcement-content" />
</div>
20 Januari 2026 05.01 (WITA)
<!-- Pesan dikirim oleh Pengguna:Keegan (WMF)@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== Konsensus untuk pemasangan spanduk ==
''Nyuwun ampura dumun tasih anggén basa Inggris utawi basa Indonésia.''.
{{Letterhead start}}
Apakah komunitas Wikipedia Bahasa Bali memutuskan ingin memasang spanduk terkait pembatasan akses wiki di Indonesia? (Untuk pembahasan isu ini selengkapnya dapat disimak/berpartisipasi secara anonim di [[:id:Wikipedia:Permohonan pendapat/Pembatasan akses wiki di Indonesia (Februari 2026)#Konsensus untuk isi spanduk]]
Apabila mencapai konsensus, kita akan membawa hasil ini ke Meta untuk meminta supaya spanduk dipasang di situs-situs wiki bahasa-bahasa di Indonesia, untuk pembaca dari Indonesia, tanggal (tentatif) 23 Maret 2026, selama 31 hari (durasi paling lama), hingga 24 April 2026. Setelah itu, bisa diperpanjang melalui konsensus yang baru. [[Sang Anganggé:Bennylin|Bennylin]] ([[Pabligbagan Sang Anganggé:Bennylin|pabligbagan]]) 3 Maret 2026 02.57 (WITA) sebagai inisiator.
:Dalam pandangan saya; jujur, saya sudah sangat kecewa dengan WMID dan WMF. Sebenarnya pemerintah juga sudah membuka diskusi dan pendaftaran ini [https://peraturan.bpk.go.id/Details/122030/pp-no-71-tahun-2019 bertahun2 yang lalu (2019)], bukan tiba2 memblock begitu saja. Alih2 mereka yang digaji/dibayar seharusnya fokus mendiskusikan ini dan mendorong pemerintah dan lembaga2 terkait untuk membuka akses wikipedia justru malah terkesan tidak memiliki prioritas usaha bahkan setelah blokir terjadi, terbukti sibuk membuat proyek2 nirfaedah. Kita selaku sukarelawan yang justru tertimpa sialnya, bahkan harus sibuk inisiasi dan koordinasi hal2 seperti ini dengan langkah memasang spanduk, yg bukan juga tupoksinya dan lagi2 nirfaedah. Pemerintah tidak akan membaca spanduk tersebut, bahkan jika dibaca pun tidak akan peduli. Saya sendiri sudah tidak ingin banyak terlibat dalam diskusi2 seperti ini karena memilih hiatus dan hanya ingin tenang menyunting. Saya hanya akan sesekali membaca2 diskusi yang ada tanpa terlibat di dalamnya karena toh saya sudah pensiun juga dari sebagian besar wiki. Jadi selamat berjuang dan semoga tidak lelah. [[Sang Anganggé:Angayubagia|Angayubagia]] ([[Pabligbagan Sang Anganggé:Angayubagia|pabligbagan]]) 4 Maret 2026 08.38 (WITA)
::Sebenarnya sudah cukup jelas dari yang saya lihat/dengar, bahwa isi dari [https://id.wikisource.org/wiki/Indeks:Peraturan_Menteri_Komunikasi_dan_Informatika_Nomor_5_Tahun_2020.pdf Permenkominfo 5/2020] ini apabila diikuti oleh WMF akan berakibat data pengguna terkompromikan, dan saya menolak 100% data saya diserahkan ke pemerintah. Jadi jawaban WMF untuk Kominfo kurleb kalau saya bahasakan "to hell with your permen" dan ''move on''. Bu Meutya atau Pak Alexander yang tahu bahwa tidak mungkin mereka memblokir seluruh situs Wiki, kebakaran jenggot, kurang lebih begitu dramanya. Apakah dengan spanduk Pak Sabar akan berbalik menjilat ludah sendiri, ya tentu kita tahu itu hil yang mustahal. Jadi trus apa kita akan telan mentah-mentah blokir ini? Ya kan harus kita respons. Anda menyinggung WMID. WMID menurut Anda bisa apa? Wong yang punya situs, brand, server, itu WMF semua. Bukan membela WMF, tapi menurut saya proyek-proyek wiki yang nirlaba dan WMF yang tidak memasang spanduk donasi di Indonesia jangan dicari-cari kesalahannya lah. Kalau bli punya usul yang lebih baik selain spanduk, bisa didiskusikan kok. Memilih hiatus ataupun berfokus mengembangkan situs ini juga tidak masalah, kalau Anda tidak khawatir di masa depan tidak akan ada orang (awam) yang bisa mendaftar lagi di situs ban.wiki ini. Kami akan berjuang, dan kami tidak akan lelah 🙏. Suksma. [[Sang Anganggé:Bennylin|Bennylin]] ([[Pabligbagan Sang Anganggé:Bennylin|pabligbagan]]) 10 Maret 2026 01.16 (WITA)
:::Thanks bang @[[Sang Anganggé:Bennylin|Bennylin]] untuk respondnya, seperti biasa saya kagum dan Anda ini contoh terbaik wikipediawan senior yang saya kenal. Ada beberapa pernyataan Anda yang janggal.
:::Pertama, Anda mengatakan ''"saya menolak 100% data saya diserahkan ke pemerintah"'', tapi nyatanya KTP, NPWP, KK, SIM, PASPOR, dsb semua dibuat dan dipegang datanya oleh pemerintah kita, bahkan sebentar lagi ada sinkronisasi antara data2 ini dengan akun2 kita di bank dan datanya tersimpan diarsip2 mereka, jadi menolak data apa yg Anda maksud? [https://www.komdigi.go.id/berita/siaran-pers/detail/tegakkan-kedaulatan-digital-kementerian-komdigi-surati-25-pse-privat-yang-belum-terdaftar Akun2 media sosial kita] pun sudah tersinkronisasi koq karena secara resmi mereka sudah mendaftarkan dirinya. Jangan pungkiri kita hidup di Indonesia, tentu hukum Indonesia yg berlaku, bukan [https://en.wikipedia.org/wiki/Timeline_of_Wikipedia%E2%80%93U.S._government_conflicts# hukum USA] atau UK. Aneh rasanya jika [https://wikimediafoundation.org/news/2025/09/12/wikimedia-foundation-challenges-uk-online-safety-act-regulations/ WMF bisa bergerak di UK] tapi tidak di Indonesia.
:::Kedua, pernyataan ''"to hell with your permen"'' dari WMF juga tidak jelas dan tidak tertulis kan? Apakah mereka dengan sengaja tidak ingin mematuhi hukum Indonesia? Hanya asumsi Anda aja kan? Mengapa WMF (bisa dibantu WMID) tidak membuat pernyataan resmi jika menolak, membuka keran2 diskusi dan komunikasi dengan Komdigi setelah munculnya peraturan tersebut, mengapa terkesan diam dan tidak peduli bahkan setelah blokir terjadi? Lalu buat apa kita yg capek2 buat spanduk?
:::Ketiga, pernyataan ''"Apakah dengan spanduk Pak Sabar akan berbalik menjilat ludah sendiri, ya tentu kita tahu itu hil yang mustahal"'', Jadi Anda dengan terang benderang mengakui kegiatan ini akan percuma dan tidak berguna tapi tetap melakukannya? Wow, ini istilah tepat untuk "Spinning your wheels" atau "Flogging a dead horse". Dalam konteks psikologi, jika seseorang merasa harus melakukan tindakan tersebut meski tahu itu tidak berguna (dan merasa tidak tenang jika tidak melakukannya), ini bisa menjadi bentuk perilaku kompulsif atau bagian dari gejala OCD (Obsessive-Compulsive Disorder). Ini menurut keyakinan saya aja ya. [[Sang Anganggé:Angayubagia|Angayubagia]] ([[Pabligbagan Sang Anganggé:Angayubagia|pabligbagan]]) 10 Maret 2026 08.52 (WITA)
:(Opsional) Silakan menerjemahkan pesan ini ke bahasa Bali:
{{Quote|Sejak Februari 2026, akses pendaftaran dan masuk log ke Wikipedia serta proyek-proyek Wikimedia telah dibatasi di Indonesia. Kami mengajak Anda untuk mendorong Kemkomdigi mencabut pembatasan tersebut agar kita dapat bersama-sama terus membebaskan pengetahuan! Baca selengkapnya.}}
:Dalam bahasa Bali:
{{Quote|Ngawit Pébruari 2026, pendaftaran lan aksés masuk ring Wikipédia lan proyék Wikimédia sané lianan sampun kawatesin ring Indonésia. Titiang ngaptiang mangda semeton sareng sami ngaptiang Kementerian Komunikasi lan Teknologi Digital mangda ngicalang watesan punika mangda iraga prasida terus ngluputang kaweruhan sareng-sareng! Wacen malih.}}
:(Informasi tambahan 9 Maret): Saat ini pernyataan komunitas telah diterbitkan di https://id.wikipedia.org/wiki/Wikipedia:Pernyataan_resmi_komunitas_Wikipedia_bahasa_Indonesia_terhadap_pembatasan_akses_auth.wikimedia.org_di_Indonesia. Apabila Anda ingin mencantumkan nama komunitas ini di pernyataan bersama tersebut, Anda dapat menandatangani konsensus di bawah. [[Sang Anganggé:Bennylin|Bennylin]] ([[Pabligbagan Sang Anganggé:Bennylin|pabligbagan]]) 10 Maret 2026 01.16 (WITA)
=== Nyoblos (Voting) ===
Undangan ngerembug utawi diskusi/voting tasih sareng {{ping|Chinamoonroll|Putu Suhartawan|Siti Noviali|Luh Gede Krismayanti|Kadek Ayu Sulastri|Carma citrawati|Eka343|Anggabuana|David Wadie Fisher-Freberg|Medelam|Jon Harald Søby}}. Nyoblos mriki. Ten lali anggén <nowiki>~~~~</nowiki> dados ligga tangan.
* {{Ten cumpu}} Seperti alasan saya diatas, nirfaedah. Suksma. [[Sang Anganggé:Angayubagia|Angayubagia]] ([[Pabligbagan Sang Anganggé:Angayubagia|pabligbagan]]) 10 Maret 2026 09.52 (WITA)
* Abstain. [[Sang Anganggé:Medelam|Medelam]] ([[Pabligbagan Sang Anganggé:Medelam|pabligbagan]]) 10 Maret 2026 11.11 (WITA)
=== Yasa (Hasil) ===
Hasil pamuput puput. Ten wenten sane cumpu. Suksma.
{{Letterhead end}}
== Join the sixth Ukraine’s Cultural Diplomacy Month on Wikipedia! ==
<div lang="en" dir="ltr">
[[File:Ukraine’s Cultural Diplomacy Month on Wikipedia 2026.png|right|250px|thumb|link=https://meta.wikimedia.org/wiki/Ukraine%27s_Cultural_Diplomacy_Month_2026|Join our campaign!]]
{{int:please-translate}}
Dear Wikipedians!
[[:m:Special:MyLanguage/Wikimedia Ukraine|Wikimedia Ukraine]], in cooperation with the [[:en:Ministry of Foreign Affairs of Ukraine|MFA of Ukraine]] and [[:en:Ukrainian Institute|Ukrainian Institute]], has launched the sixth edition of writing challenge "'''[[:m:Special:MyLanguage/Ukraine's Cultural Diplomacy Month 2026|Ukraine's Cultural Diplomacy Month]]'''", which lasts from '''1st April''' until '''30th April 2026'''.
The initiative aims to promote knowledge about Ukrainian culture abroad by creating and improving Wikipedia articles in multiple languages. This year marks the sixth edition of the campaign, which will focus on contemporary culture, making today’s artistic voices and practices more visible to international audiences.
🧩'''How to participate?'''
Choose an article from the suggested list → Write an article in your language, or improve an existing one according to the rules → Add your contribution to the contest page and calculate your points → Win prizes and receive a certificate of participation → Become a promoter of truthful knowledge about Ukraine.
🧩'''[[m:Special:MyLanguage/Ukraine's Cultural Diplomacy Month 2026|Check our main page for more information]]'''.
'''If you are interested in coordinating long-term community engagement for the campaign and becoming a local ambassador, we would love to hear from you! Please let us know your interest.'''
If not, then we encourage you to translate the [[m:Special:MyLanguage/Ukraine's Cultural Diplomacy Month 2026|landing page of the contest]] and [https://meta.wikimedia.org/wiki/Special:MessageGroupStats?group=Centralnotice-tgroup-UCDM2026banner&messages=&language=en&x=D banner] into your own language.
Also, we set up a [[:m:CentralNotice/Request/Ukraine's Cultural Diplomacy Month 2026|banner]] to notify users of the possibility to participate in this challenge!
[[:m:User:OlesiaLukaniuk (WMUA)|OlesiaLukaniuk (WMUA)]] ([[:m:User talk:OlesiaLukaniuk (WMUA)|talk]]) 04:35, 1 April 2026 (UTC)
</div>
<!-- Pesan dikirim oleh Pengguna:OlesiaLukaniuk (WMUA)@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=User:OlesiaLukaniuk_(WMUA)/list_of_wikis&oldid=28552112 -->
== <span lang="en" dir="ltr">Migration to Parsoid</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
<em>[[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Parsoid Read Views/Read View Announcement|Read this in another language]]</em>
Hello everyone! I am glad to inform you that as the next step in the [[mw:Special:MyLanguage/Parsoid/Parser Unification|Parser Unification]] project, Parsoid will soon be turned on as the default article renderer on your wiki. We are gradually increasing the number of wikis using Parsoid, with the intention of making it the default wikitext parser for MediaWiki's next long-term support release. This will make our wikis more reliable and consistent for editors, readers, and tools to use, as well as making the development of future wikitext features easier.
If this disrupts your workflow, don’t worry! You can still opt out through a user preference or turn Parsoid off on the current page using the Tools submenu, as described in the [[mw:Special:MyLanguage/Help:Extension:ParserMigration|Extension:ParserMigration]] documentation.
There is [[mw:Special:MyLanguage/Parsoid/Parser Unification/Confidence Framework|more information about our roll-out strategy]] available, including the testing done before we turn on Parsoid for a new wiki.
To report bugs and issues, please look at our [[mw:Special:MyLanguage/Parsoid/Parser Unification/Known Issues|known issues]] documentation and if you found a new bug please create a phab ticket and tag the [[phab:project/view/5846|Content Transform Team in Phabricator]].
<section end="announcement-content" />
</div>
<bdi lang="en" dir="ltr">[[mw:User:CAnanian (WMF)|C. Scott Ananian]] (Parsoid technical lead)</bdi> 19 April 2026 00.48 (WITA)
<!-- Pesan dikirim oleh Pengguna:CAnanian (WMF)@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=Wikimedia_Foundation/Product_and_Technology/Parsoid_Read_Views/2026-04-20_Wikipedias&oldid=30424286 -->
:cc Bli @[[Sang Anganggé:Joseagush|Joseagush]]: https://phabricator.wikimedia.org/T423739 [[Sang Anganggé:Bennylin|Bennylin]] ([[Pabligbagan Sang Anganggé:Bennylin|pabligbagan]]) 27 April 2026 22.50 (WITA)
:juga cc Bli {{ping|Angayubagia}}. [[Sang Anganggé:Bennylin|Bennylin]] ([[Pabligbagan Sang Anganggé:Bennylin|pabligbagan]]) 28 April 2026 02.17 (WITA)
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[Sang Anganggé:MediaWiki message delivery|MediaWiki message delivery]] ([[Pabligbagan Sang Anganggé:MediaWiki message delivery|pabligbagan]]) 26 April 2026 08.57 (WITA)
</bdi>
<!-- Pesan dikirim oleh Pengguna:Codename Noreste@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
== [[MediaWiki:Sidebar]] ==
Perlu ditambahkan [[Wikipédia:Pasangkepan]] di sana untuk mempermudah mengakses Warung Kopi, bisa dengan kode:
* Wikipédia:Pasangkepan|Pasangkepan
Suksma. [[Sang Anganggé:Bennylin|Bennylin]] ([[Pabligbagan Sang Anganggé:Bennylin|pabligbagan]]) 27 April 2026 22.51 (WITA)
:Sudah bli @[[Sang Anganggé:Bennylin|Bennylin]], Trims. [[Sang Anganggé:Angayubagia|Angayubagia]] ([[Pabligbagan Sang Anganggé:Angayubagia|pabligbagan]]) 28 April 2026 14.29 (WITA)
== <span lang="id" dir="ltr">Pemungutan suara dalam pemilihan U4C 2026 kini telah dibuka</span> ==
<div lang="id" dir="ltr">
<section begin="announcement-content" />
Para pemilih yang memenuhi syarat diundang untuk berpartisipasi dalam pemilihan [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Komite Koordinasi Kode Etik Universal]] (U4C) tahun 2026. Informasi lebih lanjut, termasuk pemeriksaan kelayakan pemilih, tata cara pemungutan suara, informasi kandidat, dan pranala menuju halaman pemungutan suara, tersedia di Meta pada [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|halaman informasi Pemilihan 2026]]. Pemungutan suara akan ditutup pada 2 Juni 2026 [https://zonestamp.toolforge.org/1780358400 pukul 00.00 UTC].
Silakan memberikan suara apabila akun Anda memenuhi syarat. Hasil pemilihan akan diumumkan paling lambat pada 14 Juni 2026. — Bekerja sama dengan U4C,<section end="announcement-content" />
</div>
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 28 Méi 2026 01.14 (WITA)
<!-- Pesan dikirim oleh Pengguna:Keegan (WMF)@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== [https://www.mediawiki.org/wiki/Readers/Reader_Experience/Reading_lists Reading lists] feature not working ==
{{Tracked|T428002}}{{Tracked|T428079}}
Hi {{Ping|Bennylin|Keegan (WMF)|SPatel (WMF)|EBlackorby-WMF}}, thanks again for this awesome feature. But this feature is not working on this site. When we click the icon always coming with this message <code>An error has occurred: ⧼readinglists-db-error-no-such-project⧽</code> What should we do for that and how we solve this issue? Thanks in advance. [[Sang Anganggé:Angayubagia|Angayubagia]] ([[Pabligbagan Sang Anganggé:Angayubagia|pabligbagan]]) 3 Juni 2026 22.42 (WITA)
:Already working properly, thanks. [[Sang Anganggé:Angayubagia|Angayubagia]] ([[Pabligbagan Sang Anganggé:Angayubagia|pabligbagan]]) 20 Juni 2026 14.38 (WITA)
== Why does the Balinese converter exist? ==
<span lang="ban" dir="ltr">Ampura</span> for my bad Balinese, but the Balinese converter only converts from Aksara Bali to Aksara Latin and not from Aksara Latin to Aksara Bali. What is the use of it when most of the pages are in Latin script? <span lang="ban" dir="ltr">Suksma</span> in advance, <br/> [[Sang Anganggé:ङघिञ|<span style="color:orange;">'''ङघिञ'''</span>]] ([[Pabligbagan Sang Anganggé:ङघिञ|ᬧᬩ᭄ᬮᬶᬕ᭄ᬩᬕᬦ]]) 19 Juni 2026 15.49 (WITA)
:Hi @[[Sang Anganggé:ङघिञ|ङघिञ]], thanks for asking. This is actually coming from an assumption and data that [[:en:Balinese_script|many balinese people today not writing in the balinese script anymore]] and more likely can just read it on latin script. Even many balinese not speaking on balinese language in day to day basis. That is why the balinese converter only converts from Aksara Bali to Aksara Latin, the other reason is many balinese literature on [https://ban.wikisource.org/wiki/Kaca_Utama palm-leaf manuscripts] is written in balinese script but not many can read, nor write it anymore, so to make it easier to young generation who want to learn their local language we just converted it as it is. Thanks. [[Sang Anganggé:Angayubagia|Angayubagia]] ([[Pabligbagan Sang Anganggé:Angayubagia|pabligbagan]]) 20 Juni 2026 14.35 (WITA)
::Thanks for the speedy response, but can't it be adapted to convert from Aksara Latin to Aksara Bali also? Or is it really hard because [[ᬅᬓ᭄ᬲᬭᬩᬮᬶ|Balinese]] is an abugida without spaces? I'm not an advanced coder so I don't know that much of MediaWiki PHP where these converters are. [[Sang Anganggé:ङघिञ|<span style="color:orange;">'''ङघिञ'''</span>]] ([[Pabligbagan Sang Anganggé:ङघिञ|ᬧᬩ᭄ᬮᬶᬕ᭄ᬩᬕᬦ]]) 20 Juni 2026 14.52 (WITA)
:::Can be if there is any programmer want to do that, unfortunately I can't create such program as it is complex and need database of what can be done or not because writing on balinese script had to be many rules applied. Thanks. [[Sang Anganggé:Angayubagia|Angayubagia]] ([[Pabligbagan Sang Anganggé:Angayubagia|pabligbagan]]) 28 Agustus 2026 08.24 (WITA)
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|pabligbagan]])</bdi> 24 Juni 2026 01.11 (WITA)
<!-- Pesan dikirim oleh Pengguna:Codename Noreste@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== <span lang="id" dir="ltr">Penerapan halaman kontak Legal dan Keamanan di bagian bawah wiki Anda</span> ==
<div lang="id" dir="ltr">
<section begin="Message"/>
'''Kontak Legal dan Keamanan'''
Halo, rekan-rekan kontributor! Wikimedia Foundation telah menyediakan [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|halaman kontak legal dan keamanan]] yang akan ditambahkan di bagian bawah wiki. Halaman tersebut sudah diterjemahkan ke dalam bahasa Inggris, Italia, Jerman, Spanyol, dan sebagainya. Untuk bahasa lainnya akan segera tersedia. Silakan kunjungi [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|halaman proyek]] untuk informasi selengkapnya, serta kami harapkan kesediaannya untuk meninggalkan komentar di bawah ini atau di [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|halaman pembicaraan]].
<section end="Message"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 25 Juni 2026 21.29 (WITA)
<!-- Pesan dikirim oleh Pengguna:Sannita (WMF)@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}}
You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}}
[[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 24 Juli 2026 20.24 (WITA)
</bdi>
<!-- Pesan dikirim oleh Pengguna:DreamRimmer@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== Kami mengundang Anda untuk memberikan masukan terkait Daftar Harapan Komunitas 2027 ==
Halo, perkenalkan nama saya [[m:User:SPerry-WMF|Sonja]] dan saya memimpin beberapa [[mw:Contributors|tim]] di Wikimedia Foundation yang akan mengambil alih proses kerja dari Daftar Harapan Komunitas.
Seperti yang mungkin Anda ketahui, [[m:Community_Wishlist|Daftar Harapan Komunitas]] (''Community Wishlist'') bermula sebagai proses tahunan yakni kontributor Wikimedia mengirimkan dan menentukan ide untuk memperbarui pengalaman dalam berkontribusi di situs web Proyek Wikimedia. Setelah melalui proses pemilihan, maka tim dari Wikimedia Foundation akan berusaha untuk mengerjakan dan mengimplementasikan ide (yang telah dipilih) tersebut.
Beberapa tahun terakhir, proses di balik alur kerja daftar harapan telah diubah, serta kami mendengar dari Anda bahwa hal tersebut tidak memenuhi kebutuhan komunitas. Maka dari itu, Wikimedia Foundation bersama dengan kontributor Wikimedia sedang merancang alur kerja daftar harapan yang baru agar lebih transparan.
Saya mengusulkan kepada komunitas terkait tiga tahapan berikut:
* [[m:Community_Wishlist/Community_Wishlist_2027/id#Tahap_pertama:_pengelompokan|'''Tahap pengelompokan''']]: yakni bagaimana permohonan dikelompokkan dan disaring sebelum masuk ke tahap pemungutan suara.
** Kami merekomendasikan untuk membentuk kelompok kerja yang beranggotakan anggota komunitas dari berbagai proyek wiki dan staf Wikimedia Foundation.
* [[m:Community_Wishlist/Community_Wishlist_2027/id#Tahap_kedua:_pemungutan_suara|'''Tahap pemungutan suara''']]: termasuk siapa saja yang berhak ikut pemungutan suara, serta menyusun bagaimana prosesnya berlangsung.
* [[m:Community_Wishlist/Community_Wishlist_2027/id#Tahap_ketiga:_pasca_pemungutan_suara|'''Tahap pasca pemungutan suara''']]: termasuk mengutamakan prinsip keadilan terkait proyek yang diprioritaskan.
** Salah satu hal yang akan kami lakukan untuk mengurutkan permohonan adalah dengan membaginya jadi 3 kategori: Wikipedia dan wiki skala besar, Wikipedia skala kecil dan menengah, dan situs web kerabat.
Pengumuman ini adalah ringkasan dari proposal yang sudah kami terbitkan [[m:Community_Wishlist/Community_Wishlist_2027/id|'''di Meta-wiki''']]. Kami mengharapkan masukan Anda perihal apakah ini akan berhasil atau ada cara lain yang lebih sesuai. Sesi diskusi akan dibuka selama dua minggu, serta Anda dapat menyampaikannya di Meta atau balas pengumuman ini.
Untuk siklus tahun ini, [[m:Community_Wishlist/Community_Wishlist_2027/id#Rencana_linimasa|kami berencana]] untuk mengumumkan masa pengiriman permohonan pada akhir Oktober atau awal November, serta proses pengelompokan akan selesai pada akhir November. Agar tidak mengganggu masa liburan akhir tahun, sesi pemungutan suara akan berlangsung selama awal hingga pertengahan Januari.
Pada tahap ini dimaksudkan untuk langkah awal dalam mencoba proses yang baru, serta akan lebih banyak masukan selama ini berlangsung. Semoga kita sama-sama bisa menentukan dan menemukan proses yang sesuai untuk diterapkan pada tahun mendatang (dan seterusnya).
Salam,
[[meta:User:SPerry-WMF|SPerry-WMF]], 28 Agustus 2026 00.44 (WITA) (<small>''via'' [[Sang Anganggé:BAPerdana-WMF|BAPerdana-WMF]] ([[Pabligbagan Sang Anganggé:BAPerdana-WMF|pabligbagan]]) 28 Agustus 2026 00.44 (WITA)</small>)
== Your feedback wanted: Remove ''(Language link added:) and similar'' edits from Special:RecentChanges ==
''(Apologies for posting in English. You can help by translating it)''
Hello, I’m Danny from [[:en:w:Wikimedia_Deutschland|Wikimedia Deutschland’s]] [[m:Wikidata_For_Wikimedia_Projects|Wikidata For Wikimedia Projects]] team.<br/>
We have been investigating and examining how Wikidata’s use in the [[Special:RecentChanges]] and [[Special:Watchlist]] pages can be made to be more useful, or less ‘noisy’ (fewer edits that have little value to the reader).
We are currently exploring to make a change in the volume and the type of Wikidata edits that appear in these pages, and '''we need your feedback''' to help us ensure this is a positive change for the Wikis and won’t disrupt your workflows.<br/>
Language links are also known as sitelinks or interlanguage links and describe when a Wikidata item is connected to a Wiki, adding it to the language dropdown tool for other connected Wikis.
[[File:Types of Lang Link changes.png|x350px|frame|A variety of "Language Link" edits as seen in the Recent Changes feed]]
The request for feedback is whether you support the removal of these language link edits from the Recent Changes and Watchlist feed, or would you oppose such a change and if so, why?
Please share you thoughts on the dedicated '''[[m:Talk:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|metawiki Talk page]]'''.
Further information about this change: [[m:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|m:Wikidata_For_Wikimedia_Projects/Hide_Language_Link_edits]]
Thank you for any participation or feedback you give, -- [[m:User:Danny_Benjafield_(WMDE)|User:Danny Benjafield (WMDE)]] 21 Séptémber 2026 23.26 (WITA)
<!-- Pesan dikirim oleh Pengguna:Danny Benjafield (WMDE)@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_test_list&oldid=31067433 -->
== Wikidata Sitelink changes in Recent Changes and Watchlist ==
''(Apologies for cross-posting in English, translating it will help spread the message)''
Earlier last month, all Wikis were contacted for feedback on our proposal to remove language link changes, this change has already been deployed to Wikisource, Wikibooks, Wikivoyage, Wikiquote, Wikiversity and Wiktionary.
The same change is now being rolled out globally to all Wikipedias on '''October 13, 07:00 UTC'''. Editors will no longer see notifications after this time on their [[Special:RecentChanges|Recent Changes]] and [[Special:Watchlist|Watchlist]] when a link to ''another'' language version of a page is added, removed, or changed in its Wikidata item (it does not affect language link notifications to the home wiki). There will then be a two-week monitoring period to observe if a reduction of high-volume but low-value notifications takes place, or if higher-value changes become easier to identify. Editors who rely on these notifications should be aware of the change and can share feedback or concerns on the Wikidata For Wikimedia [[m:Talk:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|Projects talk page]].<br/>
Wikidata's own Recent Changes page is not affected as it serves as the repository for these changes.
Please reach out if you have any questions, or if your wiki would like to opt-out, thank you! -- [[User:Danny_Benjafield_(WMDE)|Danny Benjafield (WMDE)]] ([[User_talk:Danny_Benjafield_(WMDE)|talk]]) sent via [[Sang Anganggé:MediaWiki message delivery|MediaWiki message delivery]] ([[Pabligbagan Sang Anganggé:MediaWiki message delivery|pabligbagan]]) 9 Oktober 2026 17.28 (WITA)
<!-- Pesan dikirim oleh Pengguna:Danny Benjafield (WMDE)@metawiki dengan menggunakan daftar di https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_Test_List&oldid=31142775 -->
pbc1pemsbnahxu94fqzazgstljc53bj
Jean Couteau
0
12409
283259
245057
2026-10-09T05:48:24Z
Gabriel Laufer
114932
/* */
283259
wikitext
text/x-wiki
{{Infobox person
| name = Jean Couteau
| image = <!-- filename only, no "File:" or "Image:" prefix, and no enclosing [[brackets]] -->
| alt = <!-- descriptive text for use by speech synthesis (text-to-speech) software -->
| caption =
| birth_name =
| birth_date = <!-- {{Birth date and age|YYYY|MM|DD}} for living people supply only the year with {{Birth year and age|YYYY}} unless the exact date is already widely published, as per [[WP:DOB]]. For people who have died, use {{Birth date|YYYY|MM|DD}}. -->
| birth_place =
| death_date = <!-- {{Death date and age|YYYY|MM|DD|YYYY|MM|DD}} (DEATH date then BIRTH date) -->
| death_place =
| nationality = [[Prancis]]
| other_names =
| occupation =
| years_active =
| spouse =
| known_for = antropolog, budayawan
| notable_works =
}}
'''Jean Couteau''' (embas warsa 1945) inggih punika [[antropolog]] miwah budayawan saking [[Prancis]] sané sampun kasub.<ref>{{Cite web|url=http://satupena.id/anggota/jean-couteau/|title=Jean Couteau|last=Ahmad|first=Artie|date=2019-04-28|website=SATUPENA|language=en-US|access-date=2020-11-05|archive-date=2020-10-30|archive-url=https://web.archive.org/web/20201030013754/http://satupena.id/anggota/jean-couteau/|url-status=dead}}</ref> Dané sampun magenah ring Bali, [[Indonésia]] saking warsa 1972.<ref name="nowbali"/><ref>{{Cite web|url=https://www.detik.com/bali/berita/d-6750959/jean-couteau-budayawan-asal-prancis-yang-cinta-bali|title=Jean Couteau: Budayawan Asal Prancis yang Cinta Bali|last=Lubis|first=Hanna Patricia M.|website=detikbali|language=id-ID|access-date=2024-03-17}}{{Dead link|date=August 2025 |bot=InternetArchiveBot |fix-attempted=yes }}</ref>
Sane dados pengamat Bali sampun langkungan saking 40 warsa, Jean Couteau wantah lulusan Ecole des Hautes Etudes en Sciences Sociales lan mantan dosen ring Denpasar Institut Seni Indonesia. Ida wantah spesialis budaya Bali sane kasub, sampun ngawi: Puri Lukisan (2000), Un Autre Temps: Les Calendries Tika de Bali (2004) Galah, Upacara dan Pesta di Bali (2013, dengan Georges Breguet), lan Mitos, Sihir dan Misteri di Bali (2013), lan Mitos, Sihir dan Misteri di Bali ( na. Dane wantah pangawi sane madue makudang-kudang basa, mapica kontribusi ring koran nasional Indonesia, Kompas, antuk rubriknyane “Udar Rasa” sane kamedalang ring halaman budaya Minggu (ring Bahasa Indonesia). Dane taler nyumbang karya budaya bulanan antuk NOW! Bali.<ref>{{Cite web|url=https://www.nowbali.co.id/meet-bayoe-edan-the-digital-dalang-of-the-modern-age/|title=Jean Couteau, Author at NOW! Bali|last=Couteau|first=Jean|website=NOW! Bali|language=en-US|access-date=2026-10-09}}</ref>
Ring pangawit warsa 1980-an, Couteau matemu sareng mentor sane luar biasa, intelektual Protestan sane makarya ring sisi redaksi Bali Post. Ring galahe punika, Couteau sedek matungkasan sareng depresi, lan sawitrannyane sane sampun lingsir puniki ngambil dane ring sor kampidnyane. Dane ngawinang dane nyurat indik budaya Bali antuk basa Inggris, atenga santukan akidik pisan krama ring Bali sane ngamargiang kadi asapunika duk punika.<ref>{{Cite web|url=https://usadabali.com/bali-today-jean-couteau-and-the-art-of-seeing-bali/|title=Bali Today. Jean Couteau and the Art of Seeing Bali|last=Dewi|first=Dian|date=2026-09-07|website=Usada Bali|language=en-US|access-date=2026-10-09}}</ref>
Wenten asiki pikobet. Couteau nenten madue ijin nyurat ring basa Indonesia.
Solusinyane punika sanget mawiguna. Dané nyurat ring sor suksesi basa Indonesia miwah manggihin wasta, nerjemahang wastan ragannyané miwah ngambil wastan samaran sakadi Hans Messer, Tom Fink miwah sané lianan. Dane ngawitin nyumbang artikel ring napi sane dados seri basa Inggris sane nglimbakang kahuripan Bali saking perspektif sane nenten biasa.
Serial puniki nenten taen matetujon dados proyek siki jadma. Para pangawi Indonesia sane anom kautus medal mupulang satua, wenten sane mawali makta bahan sane mawiguna lan wenten sane ical dados pawiwahan. Sakéwanten, riantukan iklim politik sayan kawatesin ring sor rezim Orde Baru, Couteau manggihin ragannyané ngambil alih sayan akéh sasuratan.
Ia nulis enggal, sesai ngae artikel anggon koran di menit ane paling ungkur. Ring sampingnyane wenten seniman Wayan Sadha, sane pacang ngaryanin kartun lan ilustrasi anggen ngiringang satua-satua punika. Couteau lantas lakar ngaba motorne ane suba tua ane mawarna barak lan malancaran ngiterin Denpasar, ngrereh satua. Puniki Bali sane malianan pisan sareng sane kauningin mangkin.
Ngrereh Satua ring Genah Biasa
Couteau nlatarang galah rikala mamargi ngiterin Bali antuk sepeda motor lan wantah mabebaosan sareng jadma prasida mukak jelanan nuju jagat sane akehan nenten kacingak olih jadma jaba.
Ia mararian di warung-warung di sisin jalan, ngorta ngajak anak, nitenin kahuripan sarahina lan mupulang satua-satua cenik ane ngungkapang realitas sosial ane gedean. Para warung punika ngraga dados genah patemon, kadang-kadang kalaksanayang olih ibu-ibu sareng pianaknyane istri ngayahin pelanggan. Saking kahanan sane kacingak biasa punika medal carita indik paiketan, seks, kelas, pariwisata miwah kontradiksi aneh kahuripan krama Bali miwah perantau.
Sesuratan punika sering pisan nakal, kadang-kadang provokatif lan kadang-kadang sengaja nakal.
Nanging ring sor humor punika wenten sane lebih serius. Couteau nyurat salami masa Indonesia kakuasain olih rezim sane kadukung olih militer lan kritik politik terbuka prasida ngawetuang konsekuensi. Inggris ngicenin dane tingkat perlindungan santukan relatif akidik jadma sane prasida ngresepang napi sane kabaosang.
Sindiran dados cara dane mabebaosan.
Sindiran pinaka Cara Manggihin .
Silih sinunggil tema sane pinih nudut kayun ring acara petang wengi punika inggih punika paiketan kritik lan humor ring budaya Bali. Couteau nyinahang tradisi sindiran ring sajeroning sasolahan Bali, utamanyane parekan komik ring wayang, sane prasida ngritik raja-raja lan tokoh-tokoh sakti salami kritik punika rauh malarapan antuk humor. Dane nyingakin wenten paiketan tradisi puniki sareng kartun sane kakaryanin olih Wayan Sadha antuk serial Bali Today.
Ilustrasi Sadha mabuat pisan ring proyek punika. Ketimbang ngaturang Bali malarapan antuk pencitraan sane sampun ketah saking penari-penari sane becik, pura lan pemandangan sane idilis, ipun makta jadma biasa lan realitas sane nenten nyaman dados pandangan. Ipun nyihnayang Bali ring sor gambar wisata.
Silih sinunggil kartun, umpaminyane, ngambarang Brahmana sane katunasin nyapu lantai, ngenah ring sensitivitas sane ngiterin kasta lan hierarki sosial. Potongan-potongan sane lianan nglimbakang pariwisata, seksualitas, kelas lan patemon sane kadang-kadang canggung pantaraning krama Bali sareng asing.
Nenten samian sane ngajiang pikolihnyane.
Couteau majanten makarya ring wates napi sane prasida katerbitang, lan makudang-kudang carita lan kartun ngawinang reaksi sane kuat. Nanging indike punika dados pahan saking tatujonnyane. Tetujonnyane nenten ja jagi ngaryanin potret Bali sane kapolesin, nanging jagi ngambil kontradiksi saking suatu masyarakat sane bergerak.
Nglintangin “Bali Sane Jati”
Murda Ring Ngrereh “Bali Sane Sujati” ngawetuang pitaken sane sampun sinah: napike sujatinnyane “Bali sane sujati” punika maartos? Majeng ring Couteau, pasaurnyane nenten prasida kapanggihin ring gambaran romantis Bali pinaka surga bumi. Dane maosang indik ide sane sampun ketah indik kenyem Bali, mawinan sering kaanggen ring pariwisata anggen ngangganin karahayuan sane nenten ribet. Nanging kenyem punika prasida maartos akeh. Asapunika taler prasida keramahan, meneng, ritual lan sopan santun.
== Sasuratan ==
Jean nyurat makudang-kudang pustaka, luiripun:
* Couteau, J. (1995). Transformasi Struktural Masyarakat Bali. ''dalam Usadi Wiryatnaya dan Jean Couteau (ed), Bali di Persimpangan Jalan'', ''2''.
* Couteau, J. (1999). ''Museum Puri Lukisan''. Yayasan Rathna Warta.
* Couteau, J. (2003). Wacana Seni Rupa Bali Modern. ''Aspek-aspek visual''.
* ''"Bali Inspires: The Rudana Art Collection"'' (2011)
* ''"Time, Rites and Festivals in Bali"'' (2013)<ref>Darta, I. G. N., Couteau, J., & Breguet, G. (2013). ''Times, Rites, and Festivals in Bali''. BAB Books.</ref>
* ''"Lempad"'' (2014)<ref name="nowbali">{{Cite web|url=https://nowbali.co.id/jean-couteau-our-very-own-historian/|title=Jean Couteau - Our Very Own Historian|date=2015-08-01|website=NOW! Bali|language=en-US|access-date=2020-11-05}}</ref>
* ''"Bali Today: Love and Social Life"'' (2008)
* ''Buna: Suka Duka Sang Kelana‘ (2017)''
* Chambert-Loir, H., Guillot, C., & Couteau, J. (2007). ''Ziarah dan Wali di Dunia Islam''. Penerbit Serambi. dados panterjemah ring pustaka niki.
=== Esai ===
* ''Bali: crise en paradis.''<ref>{{Cite journal|last=Couteau|first=Jean|date=2002|title=Bali : crise en paradis|url=https://www.persee.fr/doc/arch_0044-8613_2002_num_64_1_3735|journal=Archipel|volume=64|issue=1|pages=231–254|doi=10.3406/arch.2002.3735}}</ref>
* ''Bali et l'islam : 1. Rencontre historique''<ref>{{Cite journal|last=Couteau|first=Jean|date=1999|title=Bali et l'islam : 1. Rencontre historique|url=https://www.persee.fr/doc/arch_0044-8613_1999_num_58_3_3540|journal=Archipel|volume=58|issue=3|pages=159–188|doi=10.3406/arch.1999.3540}}</ref>
* ''Bali et l'islam : 2. Coexistence et perspectives contemporaines''<ref>{{Cite journal|last=Couteau|first=Jean|date=2000|title=Bali et l'islam : 2. Coexistence et perspectives contemporaines|url=https://www.persee.fr/doc/arch_0044-8613_2000_num_60_4_3580|journal=Archipel|volume=60|issue=4|pages=45–64|doi=10.3406/arch.2000.3580}}</ref>
* ''After the Kuta Bombing: In Search of the Balinese Soul''<ref>{{Cite journal|last=Couteau|first=Jean|date=2014-07-23|title=After the Kuta Bombing: In Search of the Balinese Soul|url=http://www.ijil.ui.ac.id/index.php/jai/article/view/3454|journal=Antropologi Indonésia|language=en|doi=10.7454/ai.v0i70.3454|issn=1693-6086}}{{Dead link|date=November 2022 |bot=InternetArchiveBot |fix-attempted=yes }}</ref>
== Pustaka ==
{{Reflist}}
[[Kategori:Tokoh Bali|Couteau, Jean]]
[[Kategori:Tokoh Prancis|Couteau, Jean]]
7erb6a8tke00bouewc7ovp8xbvku31v
Perguruan tinggi negeri ring Indonésia
0
21789
283252
281302
2026-10-08T23:54:50Z
InternetArchiveBot
2766
Rescuing 0 sources and tagging 1 as dead.) #IABot (v2.0.9.6
283252
wikitext
text/x-wiki
{{Antuk|perguruan tinggi Islam, swasta miwah kedinasan|Perguruan tinggi ring Indonésia}}
Puniki suratan indik '''lis [[perguruan tinggi]] negeri ring [[Indonésia]]''' sané magenah ring sor pengelolaan [[Kementerian Pendidikan miwah Kebudayaan Républik Indonésia]] (Kemendikbud) ring kalpa 2014-2019 sadurungnyane tasih ring sor Kementerian Riset, Teknologi miwah Pendidikan Tinggi (Kemenristekdikti) miwah kadaptar ring pangkalan data pendidikan tinggi Direktorat Jenderal Pendidikan Tinggi (Ditjen Dikti) nganti warsa 2016.
Suratan lis puniki nenten rumasuk [[Lis perguruan tinggi Islam negeri ring Indonésia|perguruan tinggi Islam negeri]] sané wénten ring sor [[Kementerian Agama Indonésia|Kementerian Agama]] sané mawentuk [[Sekolah Tinggi Agama Islam Negeri]] (STAIN), [[Lis perguruan tinggi kedinasan ring Indonésia|perguruan tinggi kedinasan]] sané kakelola olih Departemen/Kementerian utawi [[Lembaga Pemerintah Non Departemen]] liyanan (conto: [[Perguruan tinggi swasta ring Indonésia|perguruan tinggi swasta]] wiadin [[perguruan tinggi Islam swasta ring Indonésia|perguruan tinggi Islam swasta]]), sané madué soang-soang [[perguruan tinggi ring Indonésia|lis liyanan]].
Manut Undang-undang Nomor 20 Tahun 2003 indik Sistem [[Pendidikan]] Nasional, perguruan tinggi dados mawentuk [[Univérsitas]], [[Institut]], [[Sekolah Tinggi]], [[Politéknik]], utawi [[Akademi]].
== Univérsitas Negeri ==
{| class="wikitable sortable" style="width:100%; text-align:center;"
|-
! Kode PT<br/>{{small|001-}}
! class="unsortable"| Logo
! Aran
! Ancengan
! data-sort-type=date| Tanggal Mawit
! Genah
! Akred.<ref name="banpt">{{Cite web|title=Badan Akreditasi Nasional–Perguruan Tinggi|trans-title=National Accreditation Organization for Higher Education|url=https://www.banpt.or.id/direktori/institusi/pencarian_institusi.php|access-date=2022-01-03}}</ref>
! class="unsortable"|Tautan
|-
| 001
| [[Berkas:Emblem of Universitas Gadjah Mada.svg|50px]]
| style="text-align:left;"| [[Univérsitas Gadjah Mada]]
| UGM
| 19 Desember 1949
| style="text-align:left;"| [[Daérah Istiméwa Yogyakarta]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [https://ugm.ac.id/id/]
|-
| 002
| [[Berkas:Makara of Universitas Indonésia.svg|50px]]
| style="text-align:left;"| [[Univérsitas Indonésia]]
| UI
| 2 Februari 1950
| style="text-align:left;"| [[DKI Jakarta]]{{Efn|Pasal 6 Peraturan Pemerintah (PP) Nomor 75 Tahun 2021.}}
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [https://www.ui.ac.id/] {{Webarchive|url=https://web.archive.org/web/20230711032353/https://www.ui.ac.id/ |date=2023-07-11 }}
|-
| 003
| [[File:Logo Universitas Sumatera Utara.svg|50px]]
| style="text-align:left;"| [[Univérsitas Sumatera Utara]]
| USU
| 20 Agustus 1952
| style="text-align:left;"| [[Sumatera Utara]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [https://www.usu.ac.id/id]
|-
| 004
| [[Berkas:Logo-Branding-UNAIR-biru.png|50px]]
| style="text-align:left;"| [[Univérsitas Airlangga]]
| UNAIR
| 1 November 1954
| style="text-align:left;"| [[Jawa Timur]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [https://unair.ac.id/]
|-
| 005
| [[Berkas:Logo-Resmi-Unhas-1.png|59x59px]]
| style="text-align:left;"| [[Univérsitas Hasanuddin]]
| UNHAS
| 10 September 1956
| style="text-align:left;"| [[Sulawesi Selatan]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unhas.ac.id/]
|-
| 006
|
| style="text-align:left;"| [[Univérsitas Andalas]]
| UNAND
| 13 September 1956
| style="text-align:left;"| [[Sumatera Barat]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unand.ac.id/]
|-
| 007
| [[Berkas:Lambang Universitas Padjadjaran.svg|50px]]
| style="text-align:left;"| [[Univérsitas Padjadjaran]]
| UNPAD
| 11 September 1957
| style="text-align:left;"| [[Jawa Barat]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unpad.ac.id/] {{Webarchive|url=https://web.archive.org/web/20080303121151/http://www.unpad.ac.id/ |date=2008-03-03 }}
|-
| 008
| [[Berkas:Undip.png|50px]]
| style="text-align:left;"| [[Univérsitas Diponegoro]]
| UNDIP
| 15 Oktober 1957
| style="text-align:left;"| [[Jawa Tengah]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.undip.ac.id/]
|-
| 009
| [[Berkas:LogoUNSRI.jpg|50px]]
| style="text-align:left;"| [[Univérsitas Sriwijaya]]
| UNSRI
| 29 Oktober 1960
| style="text-align:left;"| [[Sumatera Selatan]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unsri.ac.id/] {{Webarchive|url=https://web.archive.org/web/20100328175650/http://www.unsri.ac.id/ |date=2010-03-28 }}
|-
| 010
| [[Berkas:Universitas Lambung Mangkurat.png|50px]]
| style="text-align:left;"| [[Univérsitas Lambung Mangkurat]]
| ULM
| 01 Januari 1960
| style="text-align:left;"| [[Kalimantan Selatan]]
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.ulm.ac.id/] {{Webarchive|url=https://web.archive.org/web/20240225040449/http://www.ulm.ac.id/ |date=2024-02-25 }}
|-
| 011
| [[Berkas:Unsyiah.svg|50px]]
| style="text-align:left;"| [[Univérsitas Syiah Kuala]]
| USK
| 2 September 1961
| style="text-align:left;"| [[Aceh]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.usk.ac.id/]
|-
| 012
| [[Berkas:Logo unsrat.png|50px]]
| style="text-align:left;"| [[Univérsitas Sam Ratulangi]]
| UNSRAT
| 14 September 1961
| style="text-align:left;"| [[Sulawesi Utara]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unsrat.ac.id/]
|-
| 013
| [[Berkas:Logo-unud-baru.png|50px]]
| style="text-align:left;"| [[Univérsitas Udayana]]
| UNUD
| 29 September 1962
| style="text-align:left;"| [[Bali]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unud.ac.id/]
|-
| 014
| [[Berkas:Logo Undana.png|50px]]
| style="text-align:left;"| [[Univérsitas Nusa Cendana]]
| UNDANA
| 1 September 1962
| style="text-align:left;"| [[Nusa Tenggara Timur]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.undana.ac.id/]
|-
| 015
| [[Berkas:Unmul logo low.svg|50px]]
| style="text-align:left;"| [[Univérsitas Mulawarman]]
| UNMUL
| 27 September 1962
| style="text-align:left;"| [[Kalimantan Timur]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.unmul.ac.id/]
|-
| 016
| [[Berkas:LogoUnram.png|50px]]
| style="text-align:left;"| [[Univérsitas Mataram]]
| UNRAM
| 1 Oktober 1962
| style="text-align:left;"| [[Nusa Tenggara Barat]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.unram.ac.id/] {{Webarchive|url=https://web.archive.org/web/20210525074411/http://www.unram.ac.id/ |date=2021-05-25 }}
|-
| 017
| [[Berkas:Logo Universitas Riau.svg|50px]]
| style="text-align:left;"| [[Univérsitas Riau]]
| UNRI
| 1 Oktober 1962
| style="text-align:left;"| [[Riau]]<br>{{small|{{coord|0.4764|101.3806|}}}}
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.unri.ac.id/] {{Webarchive|url=https://web.archive.org/web/20061209022845/http://unri.ac.id/ |date=2006-12-09 }}
|-
| 018
| [[Berkas:Emblem of Cenderawasih University.svg|50px]]
| style="text-align:left;"| [[Univérsitas Cenderawasih]]
| style="text-align:center;"| UNCEN
| 10 November 1962
| style="text-align:left;"| [[Papua]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.uncen.ac.id/]
|-
| 019
| [[Berkas:Logo Universitas Brawijaya.svg|50px]]
| style="text-align:left;"| [[Univérsitas Brawijaya]]
| UB
| 5 Januari 1963
| style="text-align:left;"| [[Jawa Timur]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.ub.ac.id/] {{Webarchive|url=https://web.archive.org/web/20120714045345/http://www.ub.ac.id/ |date=2012-07-14 }}
|-
| 020
| [[Berkas:Logo Universitas Jambi terbaru.png|50px]]
| style="text-align:left;"| [[Univérsitas Jambi]]
| UNJA
| 23 Maret 1963
| style="text-align:left;"| [[Jambi]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.unja.ac.id/]
|-
| 021
| [[Berkas:LOGO-UNPATTI-200PX.png|50px]]
| style="text-align:left;"| [[Univérsitas Pattimura]]
| UNPATTI
| 20 Juli 1955
| style="text-align:left;"| [[Maluku]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.unpatti.ac.id/]
|-
| 022
| [[Berkas:Lambang Universitas Tanjungpura.png|50px]]
| style="text-align:left;"| [[Univérsitas Tanjungpura]]
| UNTAN
| 20 Mei 1959
| style="text-align:left;"| [[Kalimantan Barat]]
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.untan.ac.id/]
|-
| 023
| [[Berkas:Logo Unsoed.png|50px]]
| style="text-align:left;"| [[Univérsitas Jenderal Soedirman]]
| UNSOED
| 23 September 1963
| style="text-align:left;"| [[Jawa Tengah]]
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.unsoed.ac.id/] {{Webarchive|url=https://web.archive.org/web/20110326085300/http://akademik.unsoed.ac.id/ |date=2011-03-26 }}
|-
| 024
| [[Berkas:Logo Universitas Palangka Raya.png|50px]]
| style="text-align:left;"| [[Univérsitas Palangka Raya]]
| UPR
| 10 November 1963
| style="text-align:left;"| [[Kalimantan Tengah]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.upr.ac.id/] {{Webarchive|url=https://web.archive.org/web/20200706071308/http://www.upr.ac.id/ |date=2020-07-06 }}
|-
| 025
| [[Berkas:Logo unej.png|50px]]
| style="text-align:left;"| [[Univérsitas Jember]]
| UNEJ
| 10 November 1964
| style="text-align:left;"| [[Jawa Timur]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unej.ac.id/] {{Webarchive|url=https://web.archive.org/web/20220219015357/https://unej.ac.id/ |date=2022-02-19 }}
|-
| 026
| [[Berkas:Logo UnivLampung.png|50px]]
| style="text-align:left;"| [[Univérsitas Lampung]]
| UNILA
| 23 September 1965
| style="text-align:left;"| [[Lampung]]<br>{{small|{{coord|5|21|52.24|S|105|14|36.38|E|}}}}
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unila.ac.id/]
|-
| 027
| [[Berkas:Logo UNS.png|50px]]
| style="text-align:left;"| [[Univérsitas Sebelas Maret]]
| UNS
| 11 Maret 1976
| style="text-align:left;"| [[Jawa Tengah]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.uns.ac.id/] {{Webarchive|url=https://web.archive.org/web/20240716032044/https://uns.ac.id/ |date=2024-07-16 }}
|-
| 028
| [[Berkas:Logo Universitas Tadulako Palu.png|50px]]
| style="text-align:left;"| [[Univérsitas Tadulako]]
| UNTAD
| 4 Agustus 1981
| style="text-align:left;"| [[Sulawesi Tengah]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.untad.ac.id/]
|-
| 029
| [[Berkas:Logo Universitas Halu Oleo.png|50px]]
| style="text-align:left;"| [[Univérsitas Halu Oleo]]
| UHO
| 19 Agustus 1981
| style="text-align:left;"| [[Sulawesi Tenggara]]<br>{{small|{{coord|4|0|31.72|S|122|31|21.65|E|}}}}
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.uho.ac.id/] {{Webarchive|url=https://web.archive.org/web/20200815080228/https://uho.ac.id/ |date=2020-08-15 }}
|-
| 030
| [[Berkas:Logo UNIB.png|50px]]
| style="text-align:left;"| [[Univérsitas Bengkulu]]
| UNIB
| 24 April 1982
| style="text-align:left;"| [[Bengkulu]]<br>{{small|{{coord|3|45|35.27|S|102|16|20.8|E|}}}}
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.unib.ac.id/]
|-
| 031
| [[Berkas:Logo Universitas Terbuka.svg|50px]]
| style="text-align:left;"| [[Univérsitas Terbuka]]
| UT
| 4 September 1984
| style="text-align:left;"| [[Banten]]<br>{{small|{{coord|6| 20|41.6|S|106|45|29.11|E|}}}}
| data-sort-value="4" | A<br>{{rating|4|5|size=12px}}
| [http://www.ut.ac.id/]
|-
| 032
| [[Berkas:Padang State University logo.png|50px]]
| style="text-align:left;"| [[Univérsitas Negeri Padang]]
| UNP
| 23 Oktober 1954
| style="text-align:left;"| [[Sumatera Barat]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unp.ac.id/]
|-
| 033
| [[Berkas:Lambang Universitas Negeri Malang.jpg|50px]]
| style="text-align:left;"| [[Univérsitas Negeri Malang]]
| UM
| 18 Oktober 1954
| style="text-align:left;"| [[Jawa Timur]]<br>{{small|{{coord|7|57|46.78|S|112|37|6.41|E}}}}
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.um.ac.id/] {{Webarchive|url=https://web.archive.org/web/20210223154607/http://www.um.ac.id/ |date=2021-02-23 }}
|-
| 034
| [[Berkas:Logo Almamater UPI.svg|50px]]
| style="text-align:left;"| [[Univérsitas Pendidikan Indonésia]]
| UPI
| 20 Oktober 1954
| style="text-align:left;"| [[Jawa Barat]]<br>{{small|{{coord|6|51|48.24|S|107|35|39.48|E|}}}}
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.upi.edu/] {{Webarchive|url=https://web.archive.org/web/20230726045842/https://www.upi.edu/ |date=2023-07-26 }}
|-
| 035
| [[Berkas:Logo Universitas Negeri Manado.png|50px]]
| style="text-align:left;"| [[Univérsitas Negeri Manado]]
| UNIMA
| 22 September 1955
| style="text-align:left;"| [[Sulawesi Utara]]<br>{{small|{{coord|1|15|59.7|N|124|52|59.4|E|}}}}
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.unima.ac.id/] {{Webarchive|url=https://web.archive.org/web/20160128215444/http://www.unima.ac.id/ |date=2016-01-28 }}
|-
| 036
| [[Berkas:Logo Universitas Negeri Makassar.png|50px]]
| style="text-align:left;"| [[Univérsitas Negeri Makassar]]
| UNM
| 1 Agustus 1961
| style="text-align:left;"| [[Sulawesi Selatan]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unm.ac.id/]
|-
| 037
| [[Berkas:Lambang UNJ.svg|50px]]
| style="text-align:left;"| [[Univérsitas Negeri Jakarta]]
| UNJ
| 16 Mei 1964
| style="text-align:left;"| [[DKI Jakarta]]<br>{{small|{{coord|6|11|40.2|S|106|52|43.7|E|}}}}
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unj.ac.id/]
|-
| 038
| [[Berkas:Emblem of Yogyakarta State University.svg|50px]]
| style="text-align:left;"| [[Univérsitas Negeri Yogyakarta]]
| UNY
| 21 Mei 1964
| style="text-align:left;"| [[Daérah Istiméwa Yogyakarta]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.uny.ac.id/]
|-
| 039
| [[Berkas:State University of Surabaya logo.png|60x60px]]
| style="text-align:left;"| [[Univérsitas Negeri Surabaya]]
| UNESA
| 19 Desember 1964
| style="text-align:left;"| [[Jawa Timur]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unesa.ac.id/] {{Webarchive|url=https://web.archive.org/web/20110711013238/http://www.unesa.ac.id/ |date=2011-07-11 }}
|-
| 040
| [[Berkas:Lambang Universitas Negeri Medan.png|50px]]
| style="text-align:left;"| [[Univérsitas Negeri Medan]]
| UNIMED
| 23 Juni 1963
| style="text-align:left;"| [[Sumatera Utara]]
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.unimed.ac.id/]
|-
| 041
| [[Berkas:Logo Universitas Negeri Semarang.png|50px]]
| style="text-align:left;"| [[Univérsitas Negeri Semarang]]
| UNNES
| 14 September 1965
| style="text-align:left;"| [[Jawa Tengah]]<br>{{small|{{coord|7|2| 55.4|S|110|23|22.7|E|}}}}
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.unnes.ac.id/]
|-
| 042
| [[Berkas:Logo UNTIRTA.png|50px]]
| style="text-align:left;"| [[Univérsitas Sultan Ageng Tirtayasa]]
| UNTIRTA
| 1 Oktober 1981
| style="text-align:left;"| [[Banten]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.untirta.ac.id/] {{Webarchive|url=https://web.archive.org/web/20171023113323/http://ft-untirta.ac.id/ |date=2017-10-23 }}
|-
| 043
| [[Berkas:UTM DIKBUDRISTEK.png|50px]]
| style="text-align:left;"| [[Univérsitas Trunojoyo Madura]]
| UTM
| 23 Juli 2001
| style="text-align:left;"| [[Jawa Timur]]<br>{{small|{{Coord|7|7|39.9|S|112|43|23.1|E|}}}}
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.trunojoyo.ac.id/]
|-
| 044
| [[Berkas:Logo Universitas Khairun.png|50px]]
| style="text-align:left;"| [[Univérsitas Khairun]]
| UNKHAIR
| 15 Agustus 1964
| style="text-align:left;"| [[Maluku Utara]]<br>{{small|{{Coord|0|45|45.2|N|127|20|10.6|E}}}}
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.unkhair.ac.id/]
|-
| 045
| [[Berkas:Logo Universitas Papua.png|50px]]
| style="text-align:left;"| [[Univérsitas Papua]]
| UNIPA
| 3 November 2000
| style="text-align:left;"| [[Papua Barat]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.unipa.ac.id/]
|-
| 046
| [[Berkas:Logo-Unimal-Aceh Utara.png|50px]]
| style="text-align:left;"| [[Univérsitas Malikussaleh]]
| UNIMAL
| 12 Juni 1969
| style="text-align:left;"| [[Aceh]]<br>{{small|{{coord|5|14|2.56|N|96|59|14.22|E|}}}}
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.unimal.ac.id/] {{Webarchive|url=https://web.archive.org/web/20191029073736/http://www.unimal.ac.id/ |date=2019-10-29 }}
|-
| 047
| [[Berkas:1. UNG Warna.jpg|50px]]
| style="text-align:left;"| [[Univérsitas Negeri Gorontalo]]
| UNG
| 1 September 1963
| style="text-align:left;"| [[Gorontalo]]<br>{{small|{{coord|0|33|23.07|N|123|3|48.98|E|}}}}
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.ung.ac.id/] {{Webarchive|url=https://web.archive.org/web/20120427221935/http://www.ung.ac.id/ |date=2012-04-27 }}
|-
| 048
| [[Berkas:Logo undiksha.png|50px]]
| style="text-align:left;"| [[Univérsitas Pendidikan Ganesha]]
| UNDIKSHA
| 11 Mei 2006
| style="text-align:left;"| [[Bali]]
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.undiksha.ac.id/]{{Dead link|date=August 2025 |bot=InternetArchiveBot |fix-attempted=yes }}
|-
| 049
| [[Berkas:Logo UBB.png|50px]]
| style="text-align:left;"| [[Univérsitas Bangka Belitung]]
| UBB
| 12 April 2006
| style="text-align:left;"| [[Bangka Belitung]]<br>{{small|{{coord|2|4|11.8|S|106|4|38.7|E|}}}}
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.ubb.ac.id/]
|-
| 050
| [[Berkas:Logo Universitas Borneo Tarakan.png|50px]]
| style="text-align:left;"| [[Univérsitas Borneo Tarakan]]
| UBT
| 9 Oktober 1999
| style="text-align:left;"| [[Kalimantan Utara]]<br>{{small|{{coord|3|18|11.3|N|117|38|55.8|E|}}}}
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.ubt.ac.id/]
|-
| 051
| [[Berkas:Logo Unimmer.png|50px]]
| style="text-align:left;"| [[Univérsitas Musamus Merauke]]
| UNMUS
| 22 November 2010
| style="text-align:left;"| [[Papua Selatan]]<br>{{small|{{coord|8|31|54.7|S|140|25|1.5|E|}}}}
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.unmus.ac.id/]{{Dead link|date=March 2026 |bot=InternetArchiveBot |fix-attempted=yes }}
|-
| 052
| [[Berkas:Lambang Universitas Maritim Raja Ali Haji.png|50px]]
| style="text-align:left;"| [[Univérsitas Maritim Raja Ali Haji]]
| UMRAH
| 1 Agustus 2007
| style="text-align:left;"| [[Kepulauan Riau]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.umrah.ac.id/]
|-
| 053
| [[Berkas:Logo Universitas Samudra.png|50px]]
| style="text-align:left;"| [[Univérsitas Samudra]]
| UNSAM
| 1 Mei 1972
| style="text-align:left;"| [[Aceh]]<br>{{small|{{coord|4|27|27.4|N|97|58|17.3|E|}}}}
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.unsam.ac.id/] {{Webarchive|url=https://web.archive.org/web/20240722160644/https://unsam.ac.id/ |date=2024-07-22 }}
|-
| 054
| [[Berkas:Universitas Sulawesi Barat.jpg|50px]]
| style="text-align:left;"| [[Univérsitas Sulawesi Barat]]
| UNSULBAR
| 31 November 2007
| style="text-align:left;"| [[Sulawesi Barat]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://www.unsulbar.ac.id/]
|-
| 055
| [[Berkas:Logo USN Kolaka.png|50px]]
| style="text-align:left;"| [[Univérsitas Sembilanbelas November Kolaka|Univérsitas Sembilanbelas November]]
| USN
| 16 April 1984
| style="text-align:left;"| [[Sulawesi Tenggara]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://www.usn.ac.id/]{{Dead link|date=August 2024 |bot=InternetArchiveBot |fix-attempted=yes }}
|-
| 056
| [[Berkas:Logo Untidar.jpg|50px]]
| style="text-align:left;"| [[Univérsitas Tidar]]
| style="text-align:center;"| UNTIDAR
| 17 Juli 1979
| style="text-align:left;"| [[Jawa Tengah]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.untidar.ac.id/]
|-
| 057
| [[Berkas:Logo-Universitas-Siliwangi.png|50px]]
| style="text-align:left;"| [[Univérsitas Siliwangi]]
| UNSIL
| 1980
| style="text-align:left;"| [[Jawa Barat]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.unsil.ac.id/]
|-
| 058
| [[Berkas:Logo Universitas Teuku Umar.png|50px]]
| style="text-align:left;"| [[Univérsitas Teuku Umar]]
| UTU
| 10 November 2006
| style="text-align:left;"| [[Aceh]]<br>{{small|{{coord|4|8|44.2|N|96|11|50.4|E|}}}}
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.utu.ac.id/]
|-
| 059
| [[Berkas:Logo UPN Veteran Jawa Timur.png|50px]]
| style="text-align:left;"| [[Univérsitas Pembangunan Nasional "Veteran" Jawa Timur]]
| UPNVJT
| 5 Juli 1959
| style="text-align:left;"| [[Jawa Timur]]<br>{{small|{{coord|7|20|0| S|112|47|24|E|}}}}
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.upnjatim.ac.id/]
|-
| 060
| [[Berkas:Logo Universitas Timor.png|50px]]
| style="text-align:left;"| [[Univérsitas Timor]]
| UNIMOR
| 16 Juni 2000
| style="text-align:left;"| [[Nusa Tenggara Timur]]<br>{{small|{{Coord|9|30|45.7|S|124|30|41.8|E}}}}
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://www.unimor.ac.id/]
|-
| 061
| [[Berkas:Logo UPNVJ.png|50px]]
| style="text-align:left;"| [[Univérsitas Pembangunan Nasional "Veteran" Jakarta]]
| UPNVJ
| 21 Februari 1967
| style="text-align:left;"| [[DKI Jakarta]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.upnvj.ac.id/]
|-
| 062
| [[Berkas:Logo Universitas Pembangunan Nasional Veteran Yogyakarta.png|50px]]
| style="text-align:left;"| [[Univérsitas Pembangunan Nasional "Veteran" Yogyakarta]]
| UPNVYK
| 15 Desember 1958
| style="text-align:left;"| [[Daérah Istiméwa Yogyakarta]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.upnyk.ac.id/]
|-
| 063
| [[Berkas:Logo Universitas Singaperbangsa Karawang.png|50px]]
| style="text-align:left;"| [[Univérsitas Singaperbangsa Karawang]]
| UNSIKA
| 2 Februari 1982
| style="text-align:left;"| [[Jawa Barat]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.unsika.ac.id/]
|}
==Institut Negeri==
Terdapat 12 Institut Negeri di Indonésia: 5 Institut Teknologi, 1 Institut Pertanian, 4 Institut Seni (ISI), dan 3 Institut Seni Budaya (ISBI).
Dua Institut Seni Budaya lainnya direncanakan akan didirikan di Kalimantan Timur dan Sulawesi Selatan. Namun, embrio ISBI Kalimantan Timur dalam bentuk PSDKU (Program Studi di Luar Kampus Utama) ISI Yogyakarta menghadapi masalah dalam membangun kampusnya sendiri. Masalah yang dihadapi sangat berat sehingga PSDKU Kalimantan Timur dibekukan oleh Kementerian Pendidikan dan Kebudayaan. Sementara itu, Embrio ISBI Sulawesi Selatan dalam bentuk PSDKU ISI Surakarta belum memiliki kepastian waktu untuk memisahkan diri dari ISI Surakarta.
{| class="wikitable sortable" style="width:100%; text-align:center;"
|-
! Kode PT<br/>{{small|002-}}
! class="unsortable"|Logo
! Nama
! Singkatan
! data-sort-type=date| Tanggal Berdiri
! Lokasi
! Akred.<ref name="banpt"/>
! class="unsortable"|Tautan
|-
| 001
| [[Berkas:Logo Institut Teknologi Bandung.png|50px]]
| style="text-align:left;"| [[Institut Téknologi Bandung]]
| ITB
| 3 Juli 1920
| style="text-align:left;"| [[Jawa Barat]]<br>{{small|{{coord|6|53|27.25|S|107|36|37.36|E|name=Bandung Institute of Technology|}}}}
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.itb.ac.id/]
|-
| 002
| [[Berkas:Institut Téknologi Sepuluh Nopember seal.svg|50px]]
| style="text-align:left;"| [[Institut Téknologi Sepuluh Nopémber]]
| ITS
| 10 November 1957
| style="text-align:left;"| [[Jawa Timur]]<br>{{small|{{coord|7|16|54|S|112|47|41|E|name=Sepuluh Nopember Institute of Technology|}}}}
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.its.ac.id/]
|-
| 003
|
| style="text-align:left;"| [[Institut Pertanian Bogor]]
| IPB
| 1 September 1963
| style="text-align:left;"| [[Jawa Barat]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| style="text-align:center;"| [http://www.ipb.ac.id/] {{Webarchive|url=https://web.archive.org/web/20110818154527/http://ipb.ac.id/ |date=2011-08-18 }}
|-
| 005
| [[Berkas:Emblem of Institut Seni Indonésia Yogyakarta.png|50px]]
| style="text-align:left;"| [[Institut Seni Indonésia Yogyakarta]]
| ISI Yogyakarta
| 30 Mei 1984
| style="text-align:left;"| [[Daérah Istiméwa Yogyakarta]]<br>{{small|{{coord|7|51|08.6|S|110|21|21.21|E|name=Indonésian Institute of the Arts, Yogyakarta}}}}
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.isi.ac.id/]
|-
| 007
| [[Berkas:Logo ISI Denpasar.png|50px]]
| style="text-align:left;"| [[Institut Seni Indonésia Dénpasar]]
| ISI Dénpasar
| 28 Januari 1967
| style="text-align:left;"| [[Bali]]<br>{{small|{{coord|8|39|12.93|S|115|13|57.5|E|name=Indonésian Institute of the Arts, Denpasar|}}}}
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [https://www.isi-dps.ac.id]
|-
| 008
| [[Berkas:Isi-ver.01.png|50px]]
| style="text-align:left;"| [[Institut Seni Indonésia Surakarta]]
| ISI Surakarta
| 15 Juli 1964
| style="text-align:left;"| [[Jawa Tengah]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.isi-ska.ac.id/] {{Webarchive|url=https://web.archive.org/web/20230830055915/https://isi-ska.ac.id/ |date=2023-08-30 }}
|-
| 009
| [[Berkas:Logo Institut Seni Indonésia Padangpanjang.png|50px]]
| style="text-align:left;"| [[Institut Seni Indonésia Padang Panjang]]
| ISI Padang Panjang
| 22 Desember 1965
| style="text-align:left;"| [[Sumatera Barat]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.isi-padangpanjang.ac.id/]
|-
| 010
| [[Berkas:Logo Institut Seni Budaya Indonésia Bandung.png|50px]]
| style="text-align:left;"| [[Institut Seni Budaya Indonésia Bandung]]
| ISBI Bandung
| 31 Maret 1968
| style="text-align:left;"| [[Jawa Barat]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [https://www.isbi.ac.id]
|-
| 011
| [[Berkas:Logo Institut Seni Budaya Indonésia Aceh.png|50px]]
| style="text-align:left;"| [[Institut Seni Budaya Indonésia Aceh]]
| ISBI Aceh
| 6 Oktober 2014
| style="text-align:left;"| [[Aceh]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://isbiaceh.ac.id/]
|-
| 012
| [[Berkas:Logo ISBI Tanah Papua.png|50px]]
| style="text-align:left;"| [[Institut Seni Budaya Indonésia Tanah Papua]]
| ISBI Tanah Papua
| 09 Oktober 2014
| style="text-align:left;"| [[Papua]]
|
| [http://isbi-tanahpapua.ac.id/]
|-
| 013
|
| style="text-align:left;"| [[Institut Téknologi Kalimantan]]
| ITK
| 6 Oktober 2014
| style="text-align:left;"| [[Kalimantan Timur]]<br>{{small|{{coord|1|09|01.5|S|116|51|39.2|E|name=Kalimantan Institute of Technology|}}}}
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.itk.ac.id/] {{Webarchive|url=https://web.archive.org/web/20230811203227/https://itk.ac.id/ |date=2023-08-11 }}
|-
| 014
| [[Berkas:Logo ITERA.png|50px]]
| style="text-align:left;"| [[Institut Téknologi Sumatera]]
| ITERA
| 6 Oktober 2014
| style="text-align:left;"| [[Lampung]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://www.itera.ac.id/] {{Webarchive|url=https://web.archive.org/web/20230528135950/https://www.itera.ac.id/ |date=2023-05-28 }}
|-
| 015
| [[Berkas:Logo ith pare.png|50px]]
| style="text-align:left;"| [[Institut Téknologi Bacharuddin Jusuf Habibie]]
| ITH
| 17 Oktober 2014
| style="text-align:left;"| [[Sulawesi Selatan]]
|
| [http://www.ith.ac.id/] {{Webarchive|url=https://web.archive.org/web/20240527040436/https://ith.ac.id/ |date=2024-05-27 }}
|}
==Politeknik Negeri==
Saat ini, terdapat 44 Politeknik Negeri di Indonésia. Mereka terdiri dari 1 Politeknik Teknik Elektronika, 2 Politeknik Manufaktur, 1 Politeknik Kelautan, 1 Politeknik Perikanan, 1 Politeknik Perkapalan, 4 Politeknik Pertanian, dan 34 Politeknik Umum.
Politeknik pertama didirikan di Bandung sebagai hasil kerja sama antara Pemerintah Indonésia dan [[Swiss]]. Politeknik Mekanik Swiss-ITB atau PMS-ITB, sekarang Politeknik Manufaktur Bandung atau POLMAN Bandung, memulai kegiatan akademiknya pada bulan Januari 1976 dengan program Diploma III (Ahli Madya).
Dari keberhasilan pelaksanaan program pendidikan dan operasionalisasi Politeknik Mesin Swiss-ITB, maka dikembangkanlah 6 Politeknik baru dan Pusat Pengembangan Pendidikan Politeknik di Bandung dengan bantuan kredit dari [[Bank Dunia]], melalui Perjanjian Kredit IDA No. 869-IND tertanggal 29 Desember 1978 dan berlaku efektif sejak bulan Mei 1979, yang kemudian dikenal dengan sebutan '''Proyek Politeknik I'''.<ref>{{cite web|date=1979-01-27|title=Pembukann Program Pendidikan Diploma Dalam Bidang Teknik Dan Akuntansi Serta Pusat Pengembangan Pendidikan Ahli Teknik|url=http://siap.polinema.ac.id/file/03-DJ-KEP-79.pdf|access-date=2021-04-05|website=siap.polinema.ac.id}}{{Dead link|date=July 2024 |bot=InternetArchiveBot |fix-attempted=yes }}</ref>
Keberhasilan proyek ini, mendorong pemerintah untuk memulai '''Proyek Politeknik II''' dengan 80/DIKTI/KEP/1985, yang menyerukan untuk membangun 11 politeknik umum dan memperluas Proyek Politeknik I, melalui Perjanjian Pinjaman dengan Bank Dunia No. 2290-IND tertanggal 22 Juni 1983. Sebuah politeknik di Dili juga dibangun sebagai bagian dari Proyek Politeknik II, tetapi tidak termasuk dalam pendanaan Bank Dunia karena status pendudukan Indonésia di [[Timor Timur]]. Politeknik lain, [[Politeknik Elektronika Negeri Surabaya]] juga dibangun secara paralel dengan proyek perluasan Proyek Politeknik I yang bekerja sama dengan Pemerintah [[Jepang]].
Singkatnya:
* Politeknik Pertama - POLMAN Bandung
* Proyek Politeknik I - 6 Politeknik
* Proyek Politeknik II yang dibagi menjadi 2 sub-proyek:
# Program Diploma III Teknologi - 4 Politeknik
# Diploma II Teknologi dan Perdagangan - 7 Politeknik + Politeknik Dili (tidak termasuk secara resmi karena status hukum [[Timor Timur]]).
* Perluasan 6 Politeknik yang merupakan Proyek Politeknik I. Bersamaan dengan itu, sebuah politeknik baru berupa [[Politeknik Elektronika Negeri Surabaya|PENS]] juga dibangun
* Proyek Politeknik Pertanian - 6 Politeknik
{| class="wikitable sortable" style="width:100%; text-align:center;"
|-
! Kode PT<br/>{{small|005-}}
! class="unsortable"|Logo
! Nama
! Singkatan
! data-sort-type=date| Tanggal Berdiri
! Lokasi
! Akred.<ref name="banpt"/>
! class="unsortable"|Tautan
|-
| 001
| [[Berkas:Logo Polman Bandung.png|50px]]
| [[Politeknik Manufaktur Bandung]]
| POLMAN
| 24 Maret 1977
| [[Jawa Barat]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.polman-bandung.ac.id/] {{Webarchive|url=https://web.archive.org/web/20060718054419/http://www.polman-bandung.ac.id/ |date=2006-07-18 }}
|-
| 002
| [[Berkas:Logo Politeknik Negeri Jakarta.jpg|50px]]
| [[Politeknik Negeri Jakarta]]
| PNJ
| 20 September 1982
| [[Jawa Barat]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.pnj.ac.id/] {{Webarchive|url=https://web.archive.org/web/20110224084641/http://www.pnj.ac.id/ |date=2011-02-24 }}
|-
| 003
| [[Berkas:Logo Politeknik Negeri Medan.png|50px]]
| [[Politeknik Negeri Medan]]
| POLMED
| 20 September 1982
| [[Sumatera Utara]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.polmed.ac.id/]
|-
| 004
| [[Berkas:Logo Politeknik Negeri Bandung.svg|50px]]
| [[Politeknik Negeri Bandung]]
| POLBAN
| 27 Januari 1979
| [[Jawa Barat]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.polban.ac.id/]
|-
| 005
|
| [[Politeknik Negeri Semarang]]
| POLINES
| 06 Agustus 1982
| [[Jawa Tengah]]
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.polines.ac.id/]
|-
| 006
| [[Berkas:Politeknik Negeri Sriwijaya logo.svg|50px]]
| [[Politeknik Negeri Sriwijaya]]
| POLSRI
| 20 September 1982
| [[Sumatera Selatan]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.polsri.ac.id/]
|-
| 007
| [[Berkas:Polinela logo color 400.png|50px]]
| [[Politeknik Negeri Lampung]]
| POLINELA
| 7 April 1984
| [[Lampung]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.polinela.ac.id/]
|-
| 008
| [[Berkas:Logo Politeknik Negeri Ambon.png|center|50px]]
| [[Politeknik Negeri Ambon]]
| POLNAM
| 5 Oktober 1987
| [[Maluku]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.polnam.ac.id/]
|-
| 009
| [[Berkas:Logo Politeknik Negeri Padang (2014).svg|50px]]
| [[Politeknik Negeri Padang]]
| PNP
| 12 Maret 1985
| [[Sumatera Barat]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.pnp.ac.id/]
|-
| 010
| [[Berkas:Logo Politeknik Negeri Bali.png|50px]]
| [[Politeknik Negeri Bali]]
| PNB
| 3 Desember 1985
| [[Bali]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.pnb.ac.id/]{{Dead link|date=March 2026 |bot=InternetArchiveBot |fix-attempted=yes }}
|-
| 011
| [[Berkas:Logo Politeknik Negeri Pontianak.png|50px]]
| [[Politeknik Negeri Pontianak]]
| POLNEP
| 3 Desember 1985
| [[Kalimantan Barat]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.polnep.ac.id/]
|-
| 012
| [[Berkas:Logo PNUP.jpg|50px]]
| [[Politeknik Negeri Ujung Pandang]]
| PNUP
| 10 Mei 1987
| [[Sulawesi Selatan]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.poliupg.ac.id/] {{Webarchive|url=https://web.archive.org/web/20120704105945/http://www.poliupg.ac.id/ |date=2012-07-04 }}
|-
| 013
| [[Berkas:Logo Politeknik Negeri Manado.png|50px]]
| [[Politeknik Negeri Manado]]
| POLIMDO
| 9 November 1987
| [[Sulawesi Utara]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.polimdo.ac.id/] {{Webarchive|url=https://web.archive.org/web/20220929040702/https://polimdo.ac.id/ |date=2022-09-29 }}
|-
| 014
| [[Berkas:Logo PPNS.png|50px]]
| [[Politeknik Perkapalan Negeri Surabaya]]
| PPNS
| 1 April 1987
| [[Jawa Timur]]
| data-sort-value="2" | A<br>{{rating|4|5|size=12px}}
| [http://www.ppns.ac.id/] {{Dead link|date=October 2026 |bot=InternetArchiveBot |fix-attempted=yes }}
|-
| 015
| [[Berkas:Logo Poliban.png|50px]]
| [[Politeknik Negeri Banjarmasin]]
| POLIBAN
| 23 September 1987
| [[Kalimantan Selatan]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [https://www.poliban.ac.id/]
|-
| 016
| [[Berkas:Logo Politeknik Negeri Lhokseumawe.png|50px]]
| [[Politeknik Negeri Lhokseumawe]]
| PNL
| 5 Oktober 1985
| [[Aceh]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.pnl.ac.id/]{{Dead link|date=June 2026 |bot=InternetArchiveBot |fix-attempted=yes }}
|-
| 017
|
| [[Politeknik Negeri Kupang]]
| PNK
| 11 Maret 1985
| [[Nusa Tenggara Timur]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://www.pnk.ac.id/]
|-
| 018
| [[Berkas:Logo PENS.png|50px]]
| [[Politeknik Elektronika Negeri Surabaya]]
| PENS
| 29 Mei 1986
| [[Jawa Timur]]
| data-sort-value="1" | Unggul<br>{{rating|5|5|size=12px}}
| [http://www.pens.ac.id/]
|-
| 019
| [[Berkas:Polije.png|50px]]
| [[Politeknik Negeri Jember]]
| POLIJE
| 29 Oktober 1988
| [[Jawa Timur]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.polije.ac.id/]
|-
| 020
| [[Berkas:Logo Polipangkep.png|50px]]
| [[Politeknik Pertanian Negeri Pangkajene Kepulauan]]
| POLIPANGKEP
| 9 September 1990
| [[Sulawesi Selatan]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.politanipangkep.com/] {{Webarchive|url=https://web.archive.org/web/20240320085147/https://politanipangkep.com/ |date=2024-03-20 }}
|-
| 021
|
| [[Politeknik Pertanian Negeri Kupang]]
| POLITANIKOE
| 7 April 1984
| [[Nusa Tenggara Timur]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [https://politanikoe.ac.id/]
|-
| 022
| [[Berkas:Logo Polikant.png|50px]]
| [[Politeknik Perikanan Negeri Tual]]
| POLIKANT
| 18 Juli 1997
| [[Maluku]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.polikant.ac.id/] {{Webarchive|url=https://web.archive.org/web/20240715144000/https://polikant.ac.id/ |date=2024-07-15 }}
|-
| 023
| [[Berkas:Logo Politeknik Negeri Malang.png|50px]]
| [[Politeknik Negeri Malang]]
| POLINEMA
| 27 Januari 1979
| [[Jawa Timur]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.polinema.ac.id/]
|-
| 024
|
| [[Politeknik Pertanian Negeri Samarinda]]
| style="text-align:center;"| POLITANI Samarinda
| 28 April 1997
| [[Kalimantan Timur]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.politanisamarinda.ac.id/] {{Webarchive|url=https://web.archive.org/web/20240715225118/https://politanisamarinda.ac.id/ |date=2024-07-15 }}
|-
| 025
| [[Berkas:Politeknik Pertanian Negeri Payakumbuh.png|50px]]
| [[Politeknik Pertanian Negeri Payakumbuh]]
| PPNP
| 6 Februari 1989
| [[Sumatera Barat]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [https://ppnp.ac.id/] {{Webarchive|url=https://web.archive.org/web/20240616115931/https://ppnp.ac.id/ |date=2024-06-16 }}
|-
| 026
| [[Berkas:Logo Polnes 2015-sekarang.png|50px]]
| [[Politeknik Negeri Samarinda]]
| POLNES
| 3 Desember 1985
| [[Kalimantan Timur]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [https://www.polnes.ac.id/]
|-
| 027
| [[Berkas:Polimedia.png|50px]]
| [[Politeknik Negeri Media Kreatif]]
| POLIMEDIA
| 8 Oktober 2008
| [[DKI Jakarta]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.polimedia.ac.id/]
|-
| 028
| [[Berkas:Logo Politeknik Manufaktur Negeri Bangka Belitung.png|50px]]
| [[Politeknik Manufaktur Negeri Bangka Belitung]]
| POLMANBABEL
| 18 Oktober 2010
| [[Kepulauan Bangka Belitung]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [https://www.polman-babel.ac.id/]
|-
| 029
| [[Berkas:Politeknik Negeri Batam.png|50px]]
| [[Politeknik Negeri Batam]]
| POLIBATAM
| 18 Oktober 2010
| [[Kepulauan Riau]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [https://www.polibatam.ac.id/]
|-
| 030
| [[Berkas:Logo Politeknik Negeri Nusa Utara.png|50px]]
| [[Politeknik Negeri Nusa Utara]]
| POLNUSTAR
| 22 Juni 2011
| [[Sulawesi Utara]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [https://www.polnustar.ac.id/]
|-
| 031
| [[Berkas:Polbeng.png|50px]]
| [[Politeknik Negeri Bengkalis]]
| POLBENG
| 29 Juli 2011
| [[Riau]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.polbeng.ac.id/]
|-
| 032
|
| [[Politeknik Negeri Balikpapan]]
| POLTEKBA
| 9 September 2011
| [[Kalimantan Timur]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://poltekba.ac.id/website/] {{Webarchive|url=https://web.archive.org/web/20180318054528/http://poltekba.ac.id/website/ |date=2018-03-18 }}
|-
| 033
| [[Berkas:Badge POLTERA.png|50px]]
| [[Politeknik Negeri Madura]]
| POLTERA
| 29 Oktober 2012
| [[Jawa Timur]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [http://www.poltera.ac.id/]
|-
| 034
| [[Berkas:Logo Polimarin.png|50px]]
| [[Politeknik Maritim Negeri Indonésia]]
| POLIMARIN
| 19 September 2012
| [[Jawa Tengah]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [https://polimarin.ac.id/]
|-
| 035
| [[Berkas:Logo Politeknik Negeri Banyuwangi.png|50px]]
| [[Politeknik Negeri Banyuwangi]]
| POLIWANGI
| 4 Oktober 2013
| [[Jawa Timur]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [https://www.poliwangi.ac.id/]{{Dead link|date=August 2024 |bot=InternetArchiveBot |fix-attempted=yes }}
|-
| 036
| [[Berkas:Politeknik Negeri Madiun.png|50px]]
| [[Politeknik Negeri Madiun]]
| PNM
| 30 Oktober 2012
| [[Jawa Timur]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.pnm.ac.id/]
|-
| 037
| [[Berkas:Logo Politeknik Negeri Fakfak.png|50px]]
| [[Politeknik Negeri Fakfak]]
| POLINEF
| 30 Oktober 2012
| [[Papua Barat]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [https://polinef.ac.id/]
|-
| 038
| [[Berkas:Logo Politeknik Negeri Sambas.png|50px]]
| [[Politeknik Negeri Sambas]]
| POLTESA
| 22 Februari 2013
| [[Kalimantan Barat]]
| data-sort-value="3" | Baik Sekali<br>{{rating|3|5|size=12px}}
| [https://poltesa.ac.id/]
|-
| 039
| [[Berkas:Logo Politala segi lima.png|50px]]
| [[Politeknik Negeri Tanah Laut]]
| POLITALA
| 25 September 2009
| [[Kalimantan Selatan]]
| data-sort-value="4" | B<br>{{rating|2|5|size=12px}}
| [http://www.politala.ac.id/] {{Webarchive|url=https://web.archive.org/web/20141218164732/http://politala.ac.id/ |date=2014-12-18 }}
|-
| 040
| [[Berkas:Politeknik Negeri Subang.webp|50px]]
| [[Politeknik Negeri Subang]]
| POLSUB
| 2 April 2014
| [[Jawa Barat]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [https://www.polsub.ac.id/]
|-
| 041
| [[Berkas:Logo Politeknik Negeri Ketapang.png|50px]]
| [[Politeknik Negeri Ketapang]]
| POLITAP
| 8 April 2008
| [[Kalimantan Barat]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [https://politap.ac.id/]
|-
| 042
|
| [[Politeknik Negeri Cilacap]]
| PNC
| 8 Juli 2008
| [[Jawa Tengah]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [https://pnc.ac.id/] {{Webarchive|url=https://web.archive.org/web/20240723080651/https://pnc.ac.id/ |date=2024-07-23 }}
|-
| 043
| [[Berkas:Politeknik-Negeri-Indramayu.png|50px]]
| [[Politeknik Negeri Indramayu]]
| POLINDRA
| 8 Juli 2008
| [[Jawa Barat]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [https://www.polindra.ac.id/] {{Webarchive|url=https://web.archive.org/web/20240804165723/https://polindra.ac.id/ |date=2024-08-04 }}
|-
| 044
| [[Berkas:Logo Politeknik Negeri Nunukan.png|50px]]
| [[Politeknik Negeri Nunukan]]
| PNN
| 24 September 2020
| [[Kalimantan Utara]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [https://www.pnn.ac.id/]
|}
==Akademi Komunitas Negeri==
{| class="wikitable sortable" style="width:100%; text-align:center;"
|-
! Kode PT<br/>{{small|006-}}
! class="unsortable"|Logo
! Nama
! Singkatan
! data-sort-type=date| Tanggal Berdiri
! Lokasi
! Akred.<ref name="banpt"/>
! class="unsortable"|Tautan
|-
| 001
| [[Berkas:AKNPAcitan.png|50px]]
| style="text-align:left;"| [[Akademi Komunitas Negeri Pacitan]]
| AKN Pacitan
| 16 Oktober 2013
| style="text-align:left;"| [[Jawa Timur]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://aknpacitan.ac.id/]
|-
| 002
| [[Berkas:Logo Akademi Komunitas Negeri Putra Sang Fajar Blitar.png|50px]]
| style="text-align:left;"| [[Akademi Komunitas Negeri Putra Sang Fajar Blitar]]
| AKB
| 17 Oktober 2014
| style="text-align:left;"| [[Jawa Timur]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://www.akb.ac.id/]
|-
| 003
| [[Berkas:Logo AKN Aceh Barat.png|50px]]
| style="text-align:left;"| [[Akademi Komunitas Negeri Aceh Barat]]
| AKN Aceh Barat
| 17 Oktober 2014
| style="text-align:left;"| [[Aceh]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://www.aknacehbarat.ac.id/]
|-
| 004
| [[Berkas:Logo Akademi Komunitas Negeri Rejang Lebong.png|50px]]
| style="text-align:left;"| [[Akademi Komunitas Negeri Rejang Lebong]]
| AKREL
| 3 Februari 2016
| style="text-align:left;"| [[Bengkulu]]
| data-sort-value="5" | Baik<br>{{rating|1|5|size=12px}}
| [http://www.akrel.ac.id/]
|-
| 005
| [[Berkas:Logo AKN Seni dan Budaya Yogyakarta.png|50px]]
| style="text-align:left;"| [[Akademi Komunitas Negeri Seni dan Budaya Yogyakarta]]
| AKNSB Yogyakarta
| 3 Juli 2020
| style="text-align:left;"| [[Daérah Istiméwa Yogyakarta]]
|
| [http://www.aknyogya.ac.id/]
|}
== Cutetan ==
{{Notelist}}
== Cingak malih ==
* [[Perguruan tinggi keagamaan negeri ring Indonésia]]
* [[Perguruan tinggi swasta ring Indonésia]]
* [[Perguruan tinggi kedinasan ring Indonésia]]
* [[Perguruan Tinggi Negeri Badan Hukum]]
== Rujukan ==
{{Reflist}}
[[Kategori:Lis perguruan tinggi ring Indonésia|* Negeri]]
cua6df4aaubxjdcu6t3zikxs67ki2mq
Purwodadi, Blimbing, Malang
0
33483
283258
258843
2026-10-09T05:45:29Z
InternetArchiveBot
2766
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
283258
wikitext
text/x-wiki
{{Coord|-7.935652908166628|112.64544665871142|display=title}}
{{Suratan basa alus}}
{{Kelurahan
|nama = Purwodadi
|foto =
|keterangan = Kantor Kelurahan Purwodadi
|peta = <!-- Tuliskan nama berkas lengkap. -->
|propinsi = Jawa Timur
|dati2 = Kota
|nama dati2 = Malang
|dati3 = Kecamatan
|kecamatan = Blimbing
|nama pemimpin =
|kode pos = 65126
|luas =
|penduduk =
|kepadatan =
|kemendagri =
|RW =
|RT =
|KK =
|alamat =
|website =
}}
'''Purwodadi''' (aksara Bali: ᬧᬸᬃᬯᭀᬤᬤᬶ) inggih punika silih tunggil [[kelurahan]] sané magenah ring Kecamatan [[Blimbing, Malang|Blimbing]] ring wawengkon [[Kota Malang]], [[Jawa Timur]].<ref name="Permendagri-137-2017">{{cite web|url= https://archive.org/details/PermendagriNo.137Tahun2017 |title= Peraturan Menteri Dalam Negeri Nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 3 Oktober 2019 |archive-url= https://archive.org/details/PermendagriNo.137Tahun2017/mode/2up |archive-date= 29 Désémber 2018}}</ref><ref name="Permendagri-72-2019">{{cite web|url= http://jdih.setjen.kemendagri.go.id/pm/Permendagri%20No%2072%20Th%202019+lampiran.pdf |title= Peraturan Menteri Dalam Negeri Nomor 72 Tahun 2019 tentang Perubahan atas Permendagri nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |archive-url= https://archive.org/details/permendagriindonesia722019 |archive-date= 25 Oktober 2019 |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 15 Januari 2020}}</ref>
== Pustaka ==
{{reflist}}
=== Pranala jaba ===
* {{id}} [http://www.jatimprov.go.id/ Situs Resmi Pamréntahan Provinsi Jawa Timur] {{Webarchive|url=https://web.archive.org/web/20190806061058/http://www.jatimprov.go.id/ |date=2019-08-06 }}
* {{id}} [https://malangkota.bps.go.id/publication BPS Kota Malang]
* {{id}} [https://web.archive.org/web/20200828140100/https://malangkota.go.id/ Situs Resmi Pamréntahan Kota Malang]
* {{id}} [http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ Prodeskel Binapemdes Kemendagri] {{Webarchive|url=https://web.archive.org/web/20220401173302/http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ |date=2022-04-01 }}
{{Blimbing, Malang}}
{{Kota Malang}}
[[Kategori:Blimbing, Malang]]
[[Kategori:Kelurahan ring Kota Malang]]
{{Kelurahan-stub}}
2tfvz34vf03i9ulyvwqbclymutz2e0u
Purwantoro, Blimbing, Malang
0
33484
283257
258758
2026-10-09T05:40:38Z
InternetArchiveBot
2766
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
283257
wikitext
text/x-wiki
{{Coord|-7.9535075280265115|112.64786252555427|display=title}}
{{Suratan basa alus}}
{{Kelurahan
|nama = Purwantoro
|foto =
|keterangan = Kantor Kelurahan Purwantoro
|peta = <!-- Tuliskan nama berkas lengkap. -->
|propinsi = Jawa Timur
|dati2 = Kota
|nama dati2 = Malang
|dati3 = Kecamatan
|kecamatan = Blimbing
|nama pemimpin =
|kode pos = 65126
|luas =
|penduduk =
|kepadatan =
|kemendagri =
|RW =
|RT =
|KK =
|alamat =
|website =
}}
'''Purwantoro''' (aksara Bali: ᬧᬸᬃᬯᬦ᭄ᬢᭀᬭᭀ) inggih punika silih tunggil [[kelurahan]] sané magenah ring Kecamatan [[Blimbing, Malang|Blimbing]] ring wawengkon [[Kota Malang]], [[Jawa Timur]].<ref name="Permendagri-137-2017">{{cite web|url= https://archive.org/details/PermendagriNo.137Tahun2017 |title= Peraturan Menteri Dalam Negeri Nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 3 Oktober 2019 |archive-url= https://archive.org/details/PermendagriNo.137Tahun2017/mode/2up |archive-date= 29 Désémber 2018}}</ref><ref name="Permendagri-72-2019">{{cite web|url= http://jdih.setjen.kemendagri.go.id/pm/Permendagri%20No%2072%20Th%202019+lampiran.pdf |title= Peraturan Menteri Dalam Negeri Nomor 72 Tahun 2019 tentang Perubahan atas Permendagri nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |archive-url= https://archive.org/details/permendagriindonesia722019 |archive-date= 25 Oktober 2019 |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 15 Januari 2020}}</ref>
== Pustaka ==
{{reflist}}
=== Pranala jaba ===
* {{id}} [http://www.jatimprov.go.id/ Situs Resmi Pamréntahan Provinsi Jawa Timur] {{Webarchive|url=https://web.archive.org/web/20190806061058/http://www.jatimprov.go.id/ |date=2019-08-06 }}
* {{id}} [https://malangkota.bps.go.id/publication BPS Kota Malang]
* {{id}} [https://web.archive.org/web/20200828140100/https://malangkota.go.id/ Situs Resmi Pamréntahan Kota Malang]
* {{id}} [http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ Prodeskel Binapemdes Kemendagri] {{Webarchive|url=https://web.archive.org/web/20220401173302/http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ |date=2022-04-01 }}
{{Blimbing, Malang}}
{{Kota Malang}}
[[Kategori:Blimbing, Malang]]
[[Kategori:Kelurahan ring Kota Malang]]
{{Kelurahan-stub}}
5kxanu3i8v9e9tu7p10o9k1f4udj7tu
Polowijen, Blimbing, Malang
0
33485
283255
257548
2026-10-09T02:27:23Z
InternetArchiveBot
2766
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
283255
wikitext
text/x-wiki
{{Coord|-7.931245250804019|112.648143041627|display=title}}
{{Suratan basa alus}}
{{Kelurahan
|nama = Polowijen
|foto =
|keterangan = Kantor Kelurahan Polowijen
|peta = <!-- Tuliskan nama berkas lengkap. -->
|propinsi = Jawa Timur
|dati2 = Kota
|nama dati2 = Malang
|dati3 = Kecamatan
|kecamatan = Blimbing
|nama pemimpin =
|kode pos = 65126
|luas =
|penduduk =
|kepadatan =
|kemendagri =
|RW =
|RT =
|KK =
|alamat =
|website =
}}
'''Polowijen''' (aksara Bali: ᬧᭀᬮᭀᬯᬶᬚᬾᬦ᭄) inggih punika silih tunggil [[kelurahan]] sané magenah ring Kecamatan [[Blimbing, Malang|Blimbing]] ring wawengkon [[Kota Malang]], [[Jawa Timur]].<ref name="Permendagri-137-2017">{{cite web|url= https://archive.org/details/PermendagriNo.137Tahun2017 |title= Peraturan Menteri Dalam Negeri Nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 3 Oktober 2019 |archive-url= https://archive.org/details/PermendagriNo.137Tahun2017/mode/2up |archive-date= 29 Désémber 2018}}</ref><ref name="Permendagri-72-2019">{{cite web|url= http://jdih.setjen.kemendagri.go.id/pm/Permendagri%20No%2072%20Th%202019+lampiran.pdf |title= Peraturan Menteri Dalam Negeri Nomor 72 Tahun 2019 tentang Perubahan atas Permendagri nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |archive-url= https://archive.org/details/permendagriindonesia722019 |archive-date= 25 Oktober 2019 |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 15 Januari 2020}}</ref>
== Pustaka ==
{{reflist}}
=== Pranala jaba ===
* {{id}} [http://www.jatimprov.go.id/ Situs Resmi Pamréntahan Provinsi Jawa Timur] {{Webarchive|url=https://web.archive.org/web/20190806061058/http://www.jatimprov.go.id/ |date=2019-08-06 }}
* {{id}} [https://malangkota.bps.go.id/publication BPS Kota Malang]
* {{id}} [https://web.archive.org/web/20200828140100/https://malangkota.go.id/ Situs Resmi Pamréntahan Kota Malang]
* {{id}} [http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ Prodeskel Binapemdes Kemendagri] {{Webarchive|url=https://web.archive.org/web/20220401173302/http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ |date=2022-04-01 }}
{{Blimbing, Malang}}
{{Kota Malang}}
[[Kategori:Blimbing, Malang]]
[[Kategori:Kelurahan ring Kota Malang]]
{{Kelurahan-stub}}
4ejir7giavhvywpd6yb11144u25w6p0
Polehan, Blimbing, Malang
0
33486
283254
257546
2026-10-09T02:22:02Z
InternetArchiveBot
2766
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
283254
wikitext
text/x-wiki
{{Coord|-7.98756812209083|112.64505171075713|display=title}}
{{Suratan basa alus}}
{{Kelurahan
|nama = Polehan
|foto =
|keterangan = Kantor Kelurahan Polehan
|peta = <!-- Tuliskan nama berkas lengkap. -->
|propinsi = Jawa Timur
|dati2 = Kota
|nama dati2 = Malang
|dati3 = Kecamatan
|kecamatan = Blimbing
|nama pemimpin =
|kode pos = 65126
|luas =
|penduduk =
|kepadatan =
|kemendagri =
|RW =
|RT =
|KK =
|alamat =
|website =
}}
'''Polehan''' (aksara Bali: ᬧᭀᬮᬾᬳᬦ᭄) inggih punika silih tunggil [[kelurahan]] sané magenah ring Kecamatan [[Blimbing, Malang|Blimbing]] ring wawengkon [[Kota Malang]], [[Jawa Timur]].<ref name="Permendagri-137-2017">{{cite web|url= https://archive.org/details/PermendagriNo.137Tahun2017 |title= Peraturan Menteri Dalam Negeri Nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 3 Oktober 2019 |archive-url= https://archive.org/details/PermendagriNo.137Tahun2017/mode/2up |archive-date= 29 Désémber 2018}}</ref><ref name="Permendagri-72-2019">{{cite web|url= http://jdih.setjen.kemendagri.go.id/pm/Permendagri%20No%2072%20Th%202019+lampiran.pdf |title= Peraturan Menteri Dalam Negeri Nomor 72 Tahun 2019 tentang Perubahan atas Permendagri nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |archive-url= https://archive.org/details/permendagriindonesia722019 |archive-date= 25 Oktober 2019 |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 15 Januari 2020}}</ref>
== Pustaka ==
{{reflist}}
=== Pranala jaba ===
* {{id}} [http://www.jatimprov.go.id/ Situs Resmi Pamréntahan Provinsi Jawa Timur] {{Webarchive|url=https://web.archive.org/web/20190806061058/http://www.jatimprov.go.id/ |date=2019-08-06 }}
* {{id}} [https://malangkota.bps.go.id/publication BPS Kota Malang]
* {{id}} [https://web.archive.org/web/20200828140100/https://malangkota.go.id/ Situs Resmi Pamréntahan Kota Malang]
* {{id}} [http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ Prodeskel Binapemdes Kemendagri] {{Webarchive|url=https://web.archive.org/web/20220401173302/http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ |date=2022-04-01 }}
{{Blimbing, Malang}}
{{Kota Malang}}
[[Kategori:Blimbing, Malang]]
[[Kategori:Kelurahan ring Kota Malang]]
{{Kelurahan-stub}}
h3ejoougiprc1sip7tbp7m7v1te0so3
Pandanwangi, Blimbing, Malang
0
33487
283250
268227
2026-10-08T17:44:39Z
InternetArchiveBot
2766
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
283250
wikitext
text/x-wiki
{{Coord|-7.946283006324892|112.65846423525834|display=title}}
{{Suratan basa alus}}
{{Kelurahan
|nama = Pandanwangi
|foto =
|keterangan = Kantor Kelurahan Pandanwangi
|peta = <!-- Tuliskan nama berkas lengkap. -->
|propinsi = Jawa Timur
|dati2 = Kota
|nama dati2 = Malang
|dati3 = Kecamatan
|kecamatan = Blimbing
|nama pemimpin =
|kode pos = 65125
|luas =
|penduduk =
|kepadatan =
|kemendagri =
|RW =
|RT =
|KK =
|alamat =
|website =
}}
'''Pandanwangi''' (aksara Bali: ᬧᬦ᭄ᬤᬦ᭄ᬯᬗᬶ) inggih punika silih tunggil [[kelurahan]] sané magenah ring Kecamatan [[Blimbing, Malang|Blimbing]] ring wawengkon [[Kota Malang]], [[Jawa Timur]].<ref name="Permendagri-137-2017">{{cite web|url= https://archive.org/details/PermendagriNo.137Tahun2017 |title= Peraturan Menteri Dalam Negeri Nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 3 Oktober 2019 |archive-url= https://archive.org/details/PermendagriNo.137Tahun2017/mode/2up |archive-date= 29 Désémber 2018}}</ref><ref name="Permendagri-72-2019">{{cite web|url= http://jdih.setjen.kemendagri.go.id/pm/Permendagri%20No%2072%20Th%202019+lampiran.pdf |title= Peraturan Menteri Dalam Negeri Nomor 72 Tahun 2019 tentang Perubahan atas Permendagri nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |archive-url= https://archive.org/details/permendagriindonesia722019 |archive-date= 25 Oktober 2019 |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 15 Januari 2020}}</ref>
== Pustaka ==
{{reflist}}
=== Pranala jaba ===
* {{id}} [http://www.jatimprov.go.id/ Situs Resmi Pamréntahan Provinsi Jawa Timur] {{Webarchive|url=https://web.archive.org/web/20190806061058/http://www.jatimprov.go.id/ |date=2019-08-06 }}
* {{id}} [https://malangkota.bps.go.id/publication BPS Kota Malang]
* {{id}} [https://web.archive.org/web/20200828140100/https://malangkota.go.id/ Situs Resmi Pamréntahan Kota Malang]
* {{id}} [http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ Prodeskel Binapemdes Kemendagri] {{Webarchive|url=https://web.archive.org/web/20220401173302/http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ |date=2022-04-01 }}
{{Blimbing, Malang}}
{{Kota Malang}}
[[Kategori:Blimbing, Malang]]
[[Kategori:Kelurahan ring Kota Malang]]
{{Kelurahan-stub}}
3na7vy54cpixjmkrigfc5gucrx61klx
Samaan, Klojen, Malang
0
33576
283262
260204
2026-10-09T10:34:48Z
InternetArchiveBot
2766
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
283262
wikitext
text/x-wiki
{{Coord|-7.960710230851141|112.62810349160208|display=title}}
{{Suratan basa alus}}
{{Kelurahan
|nama = Samaan
|foto =
|keterangan = Kantor Kelurahan Samaan
|peta = <!-- Tuliskan nama berkas lengkap. -->
|propinsi = Jawa Timur
|dati2 = Kota
|nama dati2 = Malang
|dati3 = Kecamatan
|kecamatan = Klojen
|nama pemimpin =
|kode pos = 65112
|luas =
|penduduk =
|kepadatan =
|kemendagri =
|RW =
|RT =
|KK =
|alamat =
|website =
}}
'''Samaan''' (aksara Bali: ᬲᬫᬵᬦ᭄) inggih punika silih tunggil [[kelurahan]] sané magenah ring Kecamatan [[Klojen, Malang|Klojen]] ring wawengkon [[Kota Malang]], [[Jawa Timur]].<ref name="Permendagri-137-2017">{{cite web|url= https://archive.org/details/PermendagriNo.137Tahun2017 |title= Peraturan Menteri Dalam Negeri Nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 3 Oktober 2019 |archive-url= https://archive.org/details/PermendagriNo.137Tahun2017/mode/2up |archive-date= 29 Désémber 2018}}</ref><ref name="Permendagri-72-2019">{{cite web|url= http://jdih.setjen.kemendagri.go.id/pm/Permendagri%20No%2072%20Th%202019+lampiran.pdf |title= Peraturan Menteri Dalam Negeri Nomor 72 Tahun 2019 tentang Perubahan atas Permendagri nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |archive-url= https://archive.org/details/permendagriindonesia722019 |archive-date= 25 Oktober 2019 |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 15 Januari 2020}}</ref>
== Pustaka ==
{{reflist}}
=== Pranala jaba ===
* {{id}} [http://www.jatimprov.go.id/ Situs Resmi Pamréntahan Provinsi Jawa Timur] {{Webarchive|url=https://web.archive.org/web/20190806061058/http://www.jatimprov.go.id/ |date=2019-08-06 }}
* {{id}} [https://malangkota.bps.go.id/publication BPS Kota Malang]
* {{id}} [https://web.archive.org/web/20200828140100/https://malangkota.go.id/ Situs Resmi Pamréntahan Kota Malang]
* {{id}} [http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ Prodeskel Binapemdes Kemendagri] {{Webarchive|url=https://web.archive.org/web/20220401173302/http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ |date=2022-04-01 }}
{{Klojen, Malang}}
{{Kota Malang}}
[[Kategori:Klojen, Malang]]
[[Kategori:Kelurahan ring Kota Malang]]
{{Kelurahan-stub}}
ocmsnegsco8ppxyhd7t0zpwgoupchp0
Rampal Celaket, Klojen, Malang
0
33577
283260
259239
2026-10-09T06:56:29Z
InternetArchiveBot
2766
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
283260
wikitext
text/x-wiki
{{Coord|-7.963817483611519|112.6316410603859|display=title}}
{{Suratan basa alus}}
{{Kelurahan
|nama = Rampal Celaket
|foto =
|keterangan = Kantor Kelurahan Rampal Celaket
|peta = <!-- Tuliskan nama berkas lengkap. -->
|propinsi = Jawa Timur
|dati2 = Kota
|nama dati2 = Malang
|dati3 = Kecamatan
|kecamatan = Klojen
|nama pemimpin =
|kode pos = 65111
|luas =
|penduduk =
|kepadatan =
|kemendagri =
|RW =
|RT =
|KK =
|alamat =
|website =
}}
'''Rampal Celaket''' (aksara Bali: ᬭᬫ᭄ᬧᬮ᭄ᬘᬾᬮᬓᬾᬢ᭄) inggih punika silih tunggil [[kelurahan]] sané magenah ring Kecamatan [[Klojen, Malang|Klojen]] ring wawengkon [[Kota Malang]], [[Jawa Timur]].<ref name="Permendagri-137-2017">{{cite web|url= https://archive.org/details/PermendagriNo.137Tahun2017 |title= Peraturan Menteri Dalam Negeri Nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 3 Oktober 2019 |archive-url= https://archive.org/details/PermendagriNo.137Tahun2017/mode/2up |archive-date= 29 Désémber 2018}}</ref><ref name="Permendagri-72-2019">{{cite web|url= http://jdih.setjen.kemendagri.go.id/pm/Permendagri%20No%2072%20Th%202019+lampiran.pdf |title= Peraturan Menteri Dalam Negeri Nomor 72 Tahun 2019 tentang Perubahan atas Permendagri nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |archive-url= https://archive.org/details/permendagriindonesia722019 |archive-date= 25 Oktober 2019 |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 15 Januari 2020}}</ref>
== Pustaka ==
{{reflist}}
=== Pranala jaba ===
* {{id}} [http://www.jatimprov.go.id/ Situs Resmi Pamréntahan Provinsi Jawa Timur] {{Webarchive|url=https://web.archive.org/web/20190806061058/http://www.jatimprov.go.id/ |date=2019-08-06 }}
* {{id}} [https://malangkota.bps.go.id/publication BPS Kota Malang]
* {{id}} [https://web.archive.org/web/20200828140100/https://malangkota.go.id/ Situs Resmi Pamréntahan Kota Malang]
* {{id}} [http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ Prodeskel Binapemdes Kemendagri] {{Webarchive|url=https://web.archive.org/web/20220401173302/http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ |date=2022-04-01 }}
{{Klojen, Malang}}
{{Kota Malang}}
[[Kategori:Klojen, Malang]]
[[Kategori:Kelurahan ring Kota Malang]]
{{Kelurahan-stub}}
lxxlqxwfr7mb0c2npgqg64jcv8i4a4x
Penanggungan, Klojen, Malang
0
33578
283251
256793
2026-10-08T23:00:17Z
InternetArchiveBot
2766
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
283251
wikitext
text/x-wiki
{{Coord|-7.953725263711755|112.61797300882607|display=title}}
{{Suratan basa alus}}
{{Kelurahan
|nama = Penanggungan
|foto =
|keterangan = Kantor Kelurahan Penanggungan
|peta = <!-- Tuliskan nama berkas lengkap. -->
|propinsi = Jawa Timur
|dati2 = Kota
|nama dati2 = Malang
|dati3 = Kecamatan
|kecamatan = Klojen
|nama pemimpin =
|kode pos = 65113
|luas =
|penduduk =
|kepadatan =
|kemendagri =
|RW =
|RT =
|KK =
|alamat =
|website =
}}
'''Penanggungan''' (aksara Bali: ᬧᭂᬦᬂᬕᬸᬗᬦ᭄) inggih punika silih tunggil [[kelurahan]] sané magenah ring Kecamatan [[Klojen, Malang|Klojen]] ring wawengkon [[Kota Malang]], [[Jawa Timur]].<ref name="Permendagri-137-2017">{{cite web|url= https://archive.org/details/PermendagriNo.137Tahun2017 |title= Peraturan Menteri Dalam Negeri Nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 3 Oktober 2019 |archive-url= https://archive.org/details/PermendagriNo.137Tahun2017/mode/2up |archive-date= 29 Désémber 2018}}</ref><ref name="Permendagri-72-2019">{{cite web|url= http://jdih.setjen.kemendagri.go.id/pm/Permendagri%20No%2072%20Th%202019+lampiran.pdf |title= Peraturan Menteri Dalam Negeri Nomor 72 Tahun 2019 tentang Perubahan atas Permendagri nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |archive-url= https://archive.org/details/permendagriindonesia722019 |archive-date= 25 Oktober 2019 |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 15 Januari 2020}}</ref>
== Pustaka ==
{{reflist}}
=== Pranala jaba ===
* {{id}} [http://www.jatimprov.go.id/ Situs Resmi Pamréntahan Provinsi Jawa Timur] {{Webarchive|url=https://web.archive.org/web/20190806061058/http://www.jatimprov.go.id/ |date=2019-08-06 }}
* {{id}} [https://malangkota.bps.go.id/publication BPS Kota Malang]
* {{id}} [https://web.archive.org/web/20200828140100/https://malangkota.go.id/ Situs Resmi Pamréntahan Kota Malang]
* {{id}} [http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ Prodeskel Binapemdes Kemendagri] {{Webarchive|url=https://web.archive.org/web/20220401173302/http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ |date=2022-04-01 }}
{{Klojen, Malang}}
{{Kota Malang}}
[[Kategori:Klojen, Malang]]
[[Kategori:Kelurahan ring Kota Malang]]
{{Kelurahan-stub}}
opergacjkvd7cftnguzdcurytvuz31j
Pisangcandi, Sukun, Malang
0
33601
283253
257286
2026-10-09T01:28:58Z
InternetArchiveBot
2766
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
283253
wikitext
text/x-wiki
{{Coord|-7.9812606463408535|112.61299210408733|display=title}}
{{Suratan basa alus}}
{{Kelurahan
|nama = Pisangcandi
|foto =
|keterangan = Kantor Kelurahan Pisangcandi
|peta = <!-- Tuliskan nama berkas lengkap. -->
|propinsi = Jawa Timur
|dati2 = Kota
|nama dati2 = Malang
|dati3 = Kecamatan
|kecamatan = Sukun
|nama pemimpin =
|kode pos = 65146
|luas =
|penduduk =
|kepadatan =
|kemendagri =
|RW =
|RT =
|KK =
|alamat =
|website =
}}
'''Pisangcandi''' (aksara Bali: ᬧᬶᬲᬗᬦ᭄ᬤᬶ) inggih punika silih tunggil [[kelurahan]] sané magenah ring Kecamatan [[Sukun, Malang|Sukun]] ring wawengkon [[Kota Malang]], [[Jawa Timur]].<ref name="Permendagri-137-2017">{{cite web|url= https://archive.org/details/PermendagriNo.137Tahun2017 |title= Peraturan Menteri Dalam Negeri Nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 3 Oktober 2019 |archive-url= https://archive.org/details/PermendagriNo.137Tahun2017/mode/2up |archive-date= 29 Désémber 2018}}</ref><ref name="Permendagri-72-2019">{{cite web|url= http://jdih.setjen.kemendagri.go.id/pm/Permendagri%20No%2072%20Th%202019+lampiran.pdf |title= Peraturan Menteri Dalam Negeri Nomor 72 Tahun 2019 tentang Perubahan atas Permendagri nomor 137 Tahun 2017 tentang Kode dan Data Wilayah Administrasi Pemerintahan |archive-url= https://archive.org/details/permendagriindonesia722019 |archive-date= 25 Oktober 2019 |publisher= Kementerian Dalam Negeri Républik Indonésia |access-date= 15 Januari 2020}}</ref>
== Pustaka ==
{{reflist}}
=== Pranala jaba ===
* {{id}} [http://www.jatimprov.go.id/ Situs Resmi Pamréntahan Provinsi Jawa Timur] {{Webarchive|url=https://web.archive.org/web/20190806061058/http://www.jatimprov.go.id/ |date=2019-08-06 }}
* {{id}} [https://malangkota.bps.go.id/publication BPS Kota Malang]
* {{id}} [https://web.archive.org/web/20200828140100/https://malangkota.go.id/ Situs Resmi Pamréntahan Kota Malang]
* {{id}} [http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ Prodeskel Binapemdes Kemendagri] {{Webarchive|url=https://web.archive.org/web/20220401173302/http://www.prodeskel.binapemdes.kemendagri.go.id/mpublik/ |date=2022-04-01 }}
{{Sukun, Malang}}
{{Kota Malang}}
[[Kategori:Sukun, Malang]]
[[Kategori:Kelurahan ring Kota Malang]]
{{Kelurahan-stub}}
h9aeufgj7676xh7xfqvt7495duuchwh
Modul:Params
828
52544
283249
278267
2026-10-08T16:29:35Z
Grufo
40124
Update from [[d:Special:GoToLinkedPage/mediawikiwiki/Q122696746|master]] using [[mw:Synchronizer| #Synchronizer]]
283249
Scribunto
text/plain
require[[strict]]
--- ---
--- PRIVATE ENVIRONMENT ---
--- ________________________________ ---
--- ---
--[[ Abstract utilities ]]--
----------------------------
-- Helper function for `string.gsub()` (for managing zero-padded numbers)
local function zero_padded (str)
return ('%03d%s'):format(#str, str)
end
-- Helper function for `table.sort()` (for natural sorting)
local function natural_sort (var1, var2)
return var1:gsub('%d+', zero_padded) < var2:gsub('%d+', zero_padded)
end
-- Return a copy or a reference to a table
local function copy_or_ref_table (src, refonly)
if refonly then return src end
local newtab = {}
for key, val in pairs(src) do newtab[key] = val end
return newtab
end
-- Copy at most N items (of all kinds) from `src` to `dest` and return `dest`
local function copy_table_maxn (dest, src, len)
local idx = 1
for key, val in pairs(src) do
dest[key], idx = val, idx + 1
if idx > len then break end
end
return dest
end
-- Remove some numeric elements from a table, shifting everything to the left
local function remove_numeric_keys (tbl, idx, len)
local cache, tmp = {}, idx + len - 1
for key, val in pairs(tbl) do
if type(key) == 'number' and key >= idx then
if key > tmp then cache[key - len] = val end
tbl[key] = nil
end
end
for key, val in pairs(cache) do tbl[key] = val end
end
-- Make a reduced copy of a table (shifting in both directions if necessary)
local function copy_table_reduced (tbl, idx, len)
local ret, tmp = {}, idx + len - 1
if idx > 0 then
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key < idx then
ret[key] = val
elseif key > tmp then ret[key - len] = val end
end
elseif tmp > 0 then
local nshift = 1 - idx
for key, val in pairs(tbl) do
if type(key) ~= 'number' then ret[key] = val
elseif key > tmp then ret[key - tmp] = val
elseif key < idx then ret[key + nshift] = val end
end
else
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key > tmp then
ret[key] = val
elseif key < idx then ret[key + len] = val end
end
end
return ret
end
-- Make an expanded copy of a table (shifting in both directions if necessary)
local function copy_table_expanded (tbl, idx, len)
local ret, tmp = {}, idx + len - 1
if idx > 0 then
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key < idx then
ret[key] = val
else ret[key + len] = val end
end
elseif tmp > 0 then
local nshift = idx - 1
for key, val in pairs(tbl) do
if type(key) ~= 'number' then ret[key] = val
elseif key > 0 then ret[key + tmp] = val
elseif key < 1 then ret[key + nshift] = val end
end
else
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key > tmp then
ret[key] = val
else ret[key - len] = val end
end
end
return ret
end
-- Given a table, create two new tables containing the sorted list of keys
local function get_key_list_sorted (tbl, sort_fn)
local nums, words, nn, nw = {}, {}, 0, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
nn = nn + 1
nums[nn] = key
else
nw = nw + 1
words[nw] = key
end
end
table.sort(nums)
table.sort(words, sort_fn)
return nums, words, nn, nw
end
-- Parse a parameter name string and return it as a string or a number
local function get_parameter_name (par_str)
local ret = par_str:match'^%s*(.-)%s*$'
if ret ~= '0' and ret:find'^%-?[1-9]%d*$' == nil then return ret end
return tonumber(ret)
end
-- Move a key from a table to another, but only if under a different name and
-- always parsing numeric strings as numbers
local function steal_if_renamed (val, src, skey, dest, dkey)
local realkey = get_parameter_name(dkey)
if skey ~= realkey then dest[realkey], src[skey] = val, nil end
end
--[[ Public strings ]]--
------------------------
-- Special match keywords (functions and modifiers MUST avoid these names)
local mkeywords = {
['or'] = 0,
pattern = 1,
plain = 2,
strict = 3
}
-- Sort functions (functions and modifiers MUST avoid these names)
local sortfunctions = {
alphabetically = false,
naturally = natural_sort
}
-- Callback styles for the `mapping_*` and `renaming_*` class of modifiers
-- (functions and modifiers MUST avoid these names)
--[[
Meanings of the columns:
col[1] = Loop type (0-3)
col[2] = Number of module arguments that the style requires (1-3)
col[3] = Minimum number of sequential parameters passed to the callback
col[4] = Name of the callback parameter where to place each parameter name
col[5] = Name of the callback parameter where to place each parameter value
col[6] = Argument in the modifier's invocation that will override `col[4]`
col[7] = Argument in the modifier's invocation that will override `col[5]`
A value of `-1` indicates that no meaningful value is stored (i.e. `nil`)
]]--
local mapping_styles = {
names_and_values = { 3, 2, 2, 1, 2, -1, -1 },
values_and_names = { 3, 2, 2, 2, 1, -1, -1 },
values_only = { 1, 2, 1, -1, 1, -1, -1 },
names_only = { 2, 2, 1, 1, -1, -1, -1 },
names_and_values_as = { 3, 4, 0, -1, -1, 2, 3 },
names_only_as = { 2, 3, 0, -1, -1, 2, -1 },
values_only_as = { 1, 3, 0, -1, -1, -1, 2 },
blindly = { 0, 2, 0, -1, -1, -1, -1 }
}
-- Memory slots (functions and modifiers MUST avoid these names)
local memoryslots = {
h = 'header',
f = 'footer',
i = 'itersep',
l = 'lastsep',
n = 'ifngiven',
p = 'pairsep',
s = 'oxfordsep'
}
-- Possible trimming modes for the `parsing` modifier
local trim_parse_opts = {
trim_none = { false, false },
trim_positional = { false, true },
trim_named = { true, false },
trim_all = { true, true }
}
-- Possible string modes for the iteration separator in the `parsing` and
-- `reinterpreting` modifiers
local isep_parse_opts = {
splitter_pattern = false,
splitter_string = true
}
-- Possible string modes for the key-value separator in the `parsing` and
-- `reinterpreting` modifiers
local psep_parse_opts = {
setter_pattern = false,
setter_string = true
}
-- Possible position references for the `splicing` modifier
local position_references = {
add_nothing = 0,
add_smallest_number = 1,
add_last_of_sequence = 2,
add_largest_number = 3
}
-- Possible modes for the `reassigning` modifier
local a_modes = {
transfer = 0,
clone = 1,
rename = 2,
copy = 3,
sacrifice = 4,
provide = 5,
spare = 7
}
-- Functions and modifiers MUST avoid these names too: `here`, `in_substack`,
-- `let`, `expose`, `use`, `with_flushed_glue`, `without_flushed_glue`
-- `without_sorting`
--[[ Private constants ]]--
---------------------------
-- Hard-coded name of the module (to avoid going through `frame:getTitle()`)
local modulename = 'Module:Params'
-- The functions listed here declare that they don't need the `frame.args`
-- metatable to be copied into a regular table; if they are modifiers they also
-- guarantee that they will make their own (modified) copy available
local refpipe = {
call_for_each_group = true,
--coins = true,
count = true,
evaluating = true,
for_each = true,
list = true,
list_values = true,
list_maybe_with_names = true,
value_of = true
}
-- The functions listed here declare that they don't need the
-- `frame:getParent().args` metatable to be copied into a regular table; if
-- they are modifiers they also guarantee that they will make their own
-- (modified) copy available
local refparams = {
call_for_each_group = true,
combining = true,
combining_by_calling = true,
combining_values = true,
concat_and_call = true,
concat_and_invoke = true,
concat_and_magic = true,
count = true,
grouping_by_calling = true,
mixing_names_and_values = true,
keeping_at_most = true,
renaming_by_mixing = true,
renaming_to_sequence = true,
renaming_to_uppercase = true,
renaming_to_lowercase = true,
--renaming_to_values = true,
shifting = true,
splicing = true,
--swapping_names_and_values = true,
value_of = true,
with_name_matching = true
}
-- Maximum number of numeric parameters that can be filled, if missing (we
-- chose an arbitrary number for this constant; you can discuss about its
-- optimal value at Module talk:Params)
local maxfill = 1024
-- The private table of functions
local library = {}
-- Functions and modifiers that can only be invoked in first position
local static_iface = {}
--[[ Private functions ]]--
---------------------------
-- Create a new context
local function context_new (child_frame)
local main_frame = child_frame:getParent()
return {
frame = main_frame,
opipe = child_frame.args,
oparams = main_frame.args,
firstposonly = static_iface,
iterfunc = pairs,
sorttype = 0,
n_parents = 0,
n_children = 0,
n_available = maxfill
}
end
-- Move to the next action within the user-given list
local function context_iterate (ctx, n_forward)
local nextfn
if ctx.pipe[n_forward] ~= nil then
nextfn = ctx.pipe[n_forward]:match'^%s*(.*%S)'
end
if nextfn == nil then error(modulename ..
': You must specify a function to call', 0) end
if library[nextfn] == nil then
if ctx.firstposonly[nextfn] == nil then error(modulename ..
': The function ‘' .. nextfn .. '’ does not exist', 0)
else error(modulename .. ': The ‘' .. nextfn ..
'’ directive can only appear in first position', 0)
end
end
remove_numeric_keys(ctx.pipe, 1, n_forward)
return library[nextfn]
end
-- Main loop
local function main_loop (ctx, start_with)
local fn = start_with
repeat fn = fn(ctx) until not fn
if ctx.n_parents > 0 then error(modulename ..
': One or more ‘merging_substack’ directives are missing', 0) end
if ctx.n_children > 0 then error(modulename ..
', For some of the snapshots either the ‘flushing’ directive is missing or a group has not been properly closed with ‘merging_substack’', 0) end
end
-- Load a `setting`-like directive string into the `dest` table
local function set_strings_from_opts (dest, opts, start_from)
local cmd
if opts[start_from] == nil then return start_from - 1 end
cmd = opts[start_from]:gsub('%s+', ''):gsub('/+', '/')
:match'^/*(.*[^/])'
if cmd == nil then return start_from end
local vname, chr
local amap, sep, argc = {}, string.byte('/'), start_from + 1
for idx = 1, #cmd do
chr = cmd:byte(idx)
if chr == sep then
for key, val in ipairs(amap) do
dest[val], amap[key] = opts[argc], nil
end
argc = argc + 1
else
vname = memoryslots[string.char(chr)]
if vname == nil then error(modulename ..
', ‘setting’: Unknown slot ‘' ..
string.char(chr) .. '’', 0) end
table.insert(amap, vname)
end
end
for key, val in ipairs(amap) do dest[val] = opts[argc] end
return argc
end
-- Add a new stack of parameters to `ctx.children`
local function new_substack (ctx)
local currsnap, newparams = ctx.n_children + 1, {}
if ctx.children == nil then ctx.children = { newparams }
else ctx.children[currsnap] = newparams end
ctx.n_children = currsnap
return newparams
end
-- Parse a raw argument containing a `sortfunctions` directive, or
-- `'without_sorting'`, or `nil`
local function load_sort_opt (raw_arg)
if raw_arg == nil then return nil, 1, false end
local trarg = raw_arg:match'^%s*(.-)%s*$'
if trarg == 'without_sorting' then return nil, 2, false, trarg end
local tmp = sortfunctions[trarg]
if tmp == nil then return nil, 1, false, trarg end
return tmp or nil, 2, true, trarg
end
-- Parse optional user arguments of type `...|[let/use]|[...]|[let/use]|[...]|
-- [number of additional parameters]|[parameter 1]|[parameter 2]|[...]`
local function load_child_opts (src, start_from, append_after, params)
local tnamed, tmp1, tmp2
local pin, tbl, mem = start_from, {}, {}
while src[pin] ~= nil and src[pin + 1] ~= nil do
tmp1 = src[pin]:match'^%s*(.*%S)'
if tmp1 == 'let' and src[pin + 2] ~= nil then
tmp1 = get_parameter_name(src[pin + 1])
mem[tmp1], tbl[tmp1], pin = nil, src[pin + 2], pin + 3
--[[
elseif tmp1 == 'expose' then
tmp1 = get_parameter_name(src[pin + 1])
tmp2 = params[tmp1]
mem[tmp1], tbl[tmp1], pin = tmp2, tmp2, pin + 2
]]--
elseif tmp1 == 'use' and src[pin + 2] ~= nil then
tmp1 = get_parameter_name(src[pin + 2])
tmp2 = params[tmp1]
mem[tmp1], tbl[get_parameter_name(src[pin + 1])], pin =
tmp2, tmp2, pin + 3
else break end
end
local tnew = copy_or_ref_table(params, next(mem) == nil)
for key in pairs(mem) do tnew[key] = nil end
if pin ~= start_from then tnamed, tbl = tbl, {} end
tmp1 = tonumber(src[pin])
if tmp1 ~= nil and math.floor(tmp1) == tmp1 then
if tmp1 < 0 then tmp1 = -1 end
tmp2 = append_after - pin
for idx = pin + 1, pin + tmp1 do tbl[idx + tmp2] = src[idx] end
pin = pin + tmp1 + 1
end
if tnamed ~= nil then
for key, val in pairs(tnamed) do tbl[key] = val end
end
return tbl, pin, tnew, mem
end
-- Load the optional arguments of some of the `mapping_*` and `renaming_*`
-- class of modifiers
local function load_callback_opts (src, n_skip, default_style, params)
local style, shf
local tmp = src[n_skip + 1]
if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end
if style == nil then style, shf = default_style, n_skip - 1
else shf = n_skip end
local n_exist, karg, varg = style[3], style[4], style[5]
tmp = style[6]
if tmp > -1 then
karg = src[tmp + shf]:match'^%s*(.-)%s*$'
if karg == '0' or karg:find'^%-?[1-9]%d*$' ~= nil then
karg = tonumber(karg)
n_exist = math.max(n_exist, karg)
end
end
tmp = style[7]
if tmp > -1 then
varg = src[tmp + shf]:match'^%s*(.-)%s*$'
if varg == '0' or varg:find'^%-?[1-9]%d*$' ~= nil then
varg = tonumber(varg)
n_exist = math.max(n_exist, varg)
end
end
local dest, argc, tnew, mem = load_child_opts(src, style[2] + shf,
n_exist, params)
tmp = style[1]
if (tmp == 3 or tmp == 2) and dest[karg] ~= nil then
tmp = tmp - 2 end
if (tmp == 3 or tmp == 1) and dest[varg] ~= nil then
tmp = tmp - 1 end
return dest, argc, tmp, karg, varg, tnew, mem
end
-- Parse the arguments of some of the `mapping_*` and `renaming_*` class of
-- modifiers
local function load_replace_args (opts, whoami)
if opts[1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No pattern string was given', 0) end
if opts[2] == nil then error(modulename ..
', ‘' .. whoami .. '’: No replacement string was given', 0) end
local ptn, repl, nmax, argc = opts[1], opts[2], tonumber(opts[3]), 3
if nmax ~= nil or (opts[3] or ''):match'^%s*$' ~= nil then argc = 4 end
local flg = opts[argc]
if flg ~= nil then flg = mkeywords[flg:match'^%s*(.-)%s*$'] end
if flg == 0 then flg = nil elseif flg ~= nil then argc = argc + 1 end
return ptn, repl, nmax, flg, argc, (nmax ~= nil and nmax < 1) or
(flg == 3 and ptn == repl)
end
-- Parse the arguments of the `with_*_matching` class of modifiers
local function load_pattern_args (opts, whoami)
local keyw
local ptns, state, nptns, cnt = {}, 0, 0, 1
for _, val in ipairs(opts) do
if state == 0 then
nptns, state = nptns + 1, -1
ptns[nptns] = { val, false, false }
else
keyw = val:match'^%s*(.*%S)'
if keyw == nil or mkeywords[keyw] == nil or (
state > 0 and mkeywords[keyw] > 0
) then break
else
state = mkeywords[keyw]
if state > 1 then ptns[nptns][2] = true end
if state == 3 then ptns[nptns][3] = true end
end
end
cnt = cnt + 1
end
if state == 0 then error(modulename .. ', ‘' .. whoami ..
'’: No pattern was given', 0) end
return ptns, nptns, cnt
end
-- Load the optional arguments of the `parsing`, `reinterpreting` and
-- `evaluating` modifiers
local function load_parse_opts (opts, start_from, isp, psp)
local tmp
local optslots, noptslots, argc, trimn, trimu, iplain, pplain =
{ true, true, true }, 3, start_from, true, false, true, true
repeat
noptslots, tmp = noptslots - 1, opts[argc]
if tmp == nil then break end
tmp = tmp:match'^%s*(.-)%s*$'
if optslots[1] ~= nil and trim_parse_opts[tmp] ~= nil then
tmp = trim_parse_opts[tmp]
trimn, trimu, optslots[1] = tmp[1], tmp[2], nil
elseif optslots[2] ~= nil and isep_parse_opts[tmp] ~= nil then
argc = argc + 1
iplain, isp, optslots[2] = isep_parse_opts[tmp],
opts[argc], nil
elseif optslots[3] ~= nil and psep_parse_opts[tmp] ~= nil then
argc = argc + 1
pplain, psp, optslots[3] = psep_parse_opts[tmp],
opts[argc], nil
else break end
argc = argc + 1
until noptslots < 1
return isp, iplain, psp, pplain, trimn, trimu, argc
end
-- Map parameters' values using a custom callback and a referenced table
local value_maps = {
[0] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do tbl[key] = fn() end
end,
[1] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[varg] = val
tbl[key] = fn()
end
end,
[2] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do
margs[karg] = key
tbl[key] = fn()
end
end,
[3] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[karg], margs[varg] = key, val
tbl[key] = fn()
end
end
}
-- Private table for `map_names()`
local name_thieves = {
[0] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[1] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[varg] = val
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[2] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg] = key
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[3] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg], rargs[varg] = key, val
steal_if_renamed(val, tbl, key, cache, fn())
end
end
}
-- Map parameters' names using a custom callback and a referenced table
local function map_names (tbl, rargs, karg, varg, looptype, fn)
local cache = {}
name_thieves[looptype](cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(cache) do tbl[key] = val end
end
-- Return a new table that contains `src` regrouped according to the numeric
-- suffixes in its keys
local function make_groups (src)
-- NOTE: `src` might be the original metatable!
local prefix, gid
local groups = {}
for key, val in pairs(src) do
-- `key` must only be a string or a number...
if type(key) == 'string' then
prefix, gid = key:match'^%s*(.-)%s*(%-?%d*)%s*$'
gid = tonumber(gid) or ''
else
prefix, gid = '', key
end
if groups[gid] == nil then groups[gid] = {} end
if prefix == '0' or prefix:find'^%-?[1-9]%d*$' ~= nil then
prefix = tonumber(prefix)
if prefix < 1 then prefix = prefix - 1 end
end
groups[gid][prefix] = val
end
return groups
end
-- Split into parts a string containing the `$#` and `$@` placeholders and
-- return the information as a skeleton table, a canvas table and a length
local function parse_placeholder_string (target)
local idx, s_pos, skel, canvas = 1, 1, {}, {}
local e_pos = string.find(target, '%$[@#]', 1, false)
while e_pos ~= nil do
canvas[idx] = target:sub(s_pos, e_pos - 1)
skel[idx + 1] = target:sub(e_pos, e_pos + 1) == '$@'
idx = idx + 2
s_pos = e_pos + 2
e_pos = string.find(target, '%$[@#]', s_pos, false)
end
if (s_pos > target:len()) then idx = idx - 1
else canvas[idx] = target:sub(s_pos) end
return skel, canvas, idx
end
-- Populate a table by parsing a parameter string (heavy lifting for `parsing`,
-- `reinterpreting` and `evaluating`)
local function parse_parameter_string (tbl, str, isp, ipl, psp, ppl, trn, tru)
local key, val, spos1, spos2, pos1, pos2
local pos3, idx, lenplone = 0, 1, #str + 1
if isp == nil or isp == '' then
if psp == nil or psp == '' then
if tru then tbl[idx] = str:match'^%s*(.-)%s*$'
else tbl[idx] = str end
return idx
end
spos1, spos2 = str:find(psp, 1, ppl)
if spos1 == nil then
key = idx
if tru then val = str:match'^%s*(.-)%s*$'
else val = str end
idx = idx + 1
else
key = get_parameter_name(str:sub(1, spos1 - 1))
val = str:sub(spos2 + 1)
if trn then val = val:match'^%s*(.-)%s*$' end
end
tbl[key] = val
return idx
end
if psp == nil or psp == '' then
repeat
pos1 = pos3 + 1
pos2, pos3 = str:find(isp, pos1, ipl)
val = str:sub(pos1, (pos2 or lenplone) - 1)
if tru then val = val:match'^%s*(.-)%s*$' end
tbl[idx], idx = val, idx + 1
until pos2 == nil
return idx
end
repeat
pos1 = pos3 + 1
pos2, pos3 = str:find(isp, pos1, ipl)
val = str:sub(pos1, (pos2 or lenplone) - 1)
spos1, spos2 = val:find(psp, 1, ppl)
if spos1 == nil then
key = idx
if tru then val = val:match'^%s*(.-)%s*$' end
idx = idx + 1
else
key = get_parameter_name(val:sub(1, spos1 - 1))
val = val:sub(spos2 + 1)
if trn then val = val:match'^%s*(.-)%s*$' end
end
tbl[key] = val
until pos2 == nil
return idx
end
-- Heavy lifting for `snapshotting` and `remembering`
local function make_child (ctx, src, whoami)
local len = tonumber(ctx.pipe[1])
if len == nil or len == 0 then
local stack = new_substack(ctx)
for key, val in pairs(src) do stack[key] = val end
return len == nil and 1 or 2
end
if len < 0 or math.floor(len) ~= len then error(modulename ..
', ‘' .. whoami .. '’: The number of parameters to copy must be an integer greater than zero', 0) end
copy_table_maxn(new_substack(ctx), src, len)
return 2
end
-- Heavy lifting for `setting_by_flushing`, `combining` and `combining_values`
local function set_strings_from_substack (ctx, dest, whoami)
if ctx.n_children < 1 then error(modulename ..
', ‘' .. whoami .. '’: There are no substacks to flush', 0) end
local currsnap = ctx.n_children
local stack = ctx.children[currsnap]
for key, val in pairs(memoryslots) do
if stack[key] ~= nil then dest[val] = stack[key] end
end
ctx.children[currsnap], ctx.n_children = nil, currsnap - 1
end
-- Heavy lifting for `combining` and `combining_values`
local function combine_parameters (ctx, keyval_fn, whoami)
-- NOTE: `ctx.params` might be the original metatable! This function
-- MUST create a copy of it before returning
local opts = ctx.pipe
if ctx.pipe[1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No parameter name was provided', 0) end
local argc
local tbl, vars = ctx.params, {}
local sortfn, varsarg0, do_sort, tmp = load_sort_opt(opts[2])
if varsarg0 == 2 then tmp = opts[3] and opts[3]:match'^%s*(.-)%s*$' end
if tmp == 'with_flushed_glue' then
varsarg0 = varsarg0 + 1
argc = set_strings_from_opts(vars, opts, varsarg0 + 1)
set_strings_from_substack(ctx, vars, whoami)
else
if tmp == 'without_flushed_glue' then varsarg0 = varsarg0 + 1 end
argc = set_strings_from_opts(vars, opts, varsarg0 + 1)
end
if argc < varsarg0 then error(modulename ..
', ‘' .. whoami .. '’: No setting directive was given', 0) end
if next(tbl) == nil then
if vars.ifngiven ~= nil then ctx.params =
{ [get_parameter_name(ctx.pipe[1])] = vars.ifngiven }
elseif tbl == ctx.oparams then ctx.params = {} end
return argc
end
local cache, len
if do_sort then
local words
cache, words, len, tmp = get_key_list_sorted(tbl, sortfn)
for idx = 1, tmp do cache[len + idx] = words[idx] end
len = len + tmp
else
len, cache = 0, {}
for key in pairs(tbl) do
len = len + 1
cache[len] = key
end
end
local pmap, nss, kvs, pps = {}, 0, vars.pairsep or '', vars.itersep or ''
for idx = 1, len do
tmp, pmap[nss + 1] = cache[idx], pps
pmap[nss + 2] = keyval_fn(tmp, tbl[tmp], kvs)
nss = nss + 2
end
tmp = vars.oxfordsep or vars.lastsep
if tmp ~= nil and nss > 4 then pmap[nss - 1] = tmp
elseif nss > 2 and vars.lastsep ~= nil then
pmap[nss - 1] = vars.lastsep
end
pmap[1] = vars.header or ''
if vars.footer ~= nil then pmap[nss + 1] = vars.footer end
ctx.params = { [get_parameter_name(ctx.pipe[1])] = table.concat(pmap) }
return argc
end
-- Concatenate the numeric keys from the table of parameters to the numeric
-- keys from the table of options; non-numeric keys from the table of options
-- will prevail over colliding non-numeric keys from the table of parameters
local function concat_params (ctx)
local retval, tbl, nmax = {}, ctx.params, table.maxn(ctx.pipe)
if ctx.subset == 1 then
-- We need only the sequence
for key, val in ipairs(tbl) do retval[key + nmax] = val end
else
if ctx.subset == -1 then
for key in ipairs(tbl) do tbl[key] = nil end
end
for key, val in pairs(tbl) do
if type(key) == 'number' and key > 0 then
retval[key + nmax] = val
else retval[key] = val end
end
end
for key, val in pairs(ctx.pipe) do retval[key] = val end
return retval
end
-- Flush the parameters by calling a custom function for each value (after this
-- function has been invoked `ctx.params` will be no longer usable)
local function flush_params (ctx, fn)
local tmp
local tbl = ctx.params
if ctx.subset == -1 then
for key, val in ipairs(tbl) do tbl[key] = nil end
elseif ctx.subset == 1 then
if ctx.pins == nil then
for key, val in ipairs(tbl) do fn(key, val) end
return
end
tmp = {}
for key, val in ipairs(tbl) do tmp[key] = val end
tbl = tmp
end
if ctx.pins ~= nil then
local marker = ctx.sorttype < 1 and ctx.subset ~= -1 or nil
for idx = 1, #ctx.pins do
tmp = ctx.pins[idx]
if tbl[tmp] ~= nil then
fn(tmp, tbl[tmp])
tbl[tmp] = marker
end
end
if ctx.subset == 1 then
for key, val in ipairs(tbl) do
if val ~= true then fn(key, val) end
end
return
end
end
if ctx.sorttype > 0 then
local nums, words, nn, nw = get_key_list_sorted(tbl, natural_sort)
if ctx.sorttype == 2 then
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
return
end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
return
end
if ctx.subset == -1 or ctx.pins == nil then
for key, val in ipairs(tbl) do
fn(key, val)
tbl[key] = nil
end
for key, val in pairs(tbl) do fn(key, val) end
return
end
for key, val in ipairs(tbl) do
if val ~= true then fn(key, val) end
tbl[key] = nil
end
for key, val in pairs(tbl) do
if val ~= true then fn(key, val) end
end
end
-- Flush the parameters by calling one of two custom functions for each value
-- (after this function has been invoked `ctx.params` will be no longer usable)
local function mixed_flush_params (ctx, fn_seq, fn_oth)
if ctx.subset == 1 then
flush_params(ctx, fn_seq)
return
end
if ctx.subset == -1 then
flush_params(ctx, fn_oth)
return
end
local tbl = ctx.params
if ctx.pins == nil and ctx.sorttype < 1 then
for key, val in ipairs(tbl) do
fn_seq(key, val)
tbl[key] = nil
end
for key, val in pairs(tbl) do fn_oth(key, val) end
return
end
local tseq = {}
for key, val in ipairs(tbl) do tseq[key] = val end
if ctx.pins ~= nil then
local tmp
local marker = ctx.sorttype < 1 or nil
for idx = 1, #ctx.pins do
tmp = ctx.pins[idx]
if tseq[tmp] ~= nil then
fn_seq(tmp, tbl[tmp])
tbl[tmp], tseq[tmp] = nil, marker
elseif tbl[tmp] ~= nil then
fn_oth(tmp, tbl[tmp])
tbl[tmp] = nil
end
end
end
if ctx.sorttype > 0 then
local nums, words, nn, nw = get_key_list_sorted(tbl, natural_sort)
if ctx.sorttype == 2 then
for idx = 1, nw do fn_oth(words[idx], tbl[words[idx]]) end
end
for idx = 1, nn do
if tseq[nums[idx]] ~= nil then fn_seq(nums[idx], tseq[nums[idx]])
else fn_oth(nums[idx], tbl[nums[idx]]) end
end
if ctx.sorttype ~= 2 then
for idx = 1, nw do fn_oth(words[idx], tbl[words[idx]]) end
end
return
end
for key, val in ipairs(tseq) do
if val ~= true then
fn_seq(key, val)
tbl[key] = nil
end
end
for key, val in pairs(tbl) do fn_oth(key, val) end
end
-- Finalize and return a concatenated list
local function finalize_and_return_concatenated_list (ctx, lst, len, modsize)
if len > 0 then
local tmp = ctx.oxfordsep or ctx.lastsep
if tmp ~= nil and len > modsize * 2 then
lst[len - modsize + 1] = tmp
elseif len > modsize and ctx.lastsep ~= nil then
lst[len - modsize + 1] = ctx.lastsep
end
lst[1] = ctx.header or ''
if ctx.footer ~= nil then lst[len + 1] = ctx.footer end
ctx.text = table.concat(lst)
else ctx.text = ctx.ifngiven or '' end
end
--- ---
--- PUBLIC ENVIRONMENT ---
--- ________________________________ ---
--- ---
--[[ Modifiers ]]--
-------------------
-- Syntax: #invoke:params|sequential|pipe to
library.sequential = function (ctx)
if ctx.subset == 1 then error(modulename ..
': The ‘sequential’ directive has been provided more than once', 0) end
if ctx.subset == -1 then error(modulename ..
': The two directives ‘non-sequential’ and ‘sequential’ are in contradiction with each other', 0) end
if ctx.sorttype > 0 then error(modulename ..
': The ‘all_sorted’ and ‘reassorted’ directives are redundant when followed by ‘sequential’', 0) end
ctx.iterfunc, ctx.subset = ipairs, 1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|non-sequential|pipe to
library['non-sequential'] = function (ctx)
if ctx.subset == -1 then error(modulename ..
': The ‘non-sequential’ directive has been provided more than once', 0) end
if ctx.subset == 1 then error(modulename ..
': The two directives ‘sequential’ and ‘non-sequential’ are in contradiction with each other', 0) end
ctx.iterfunc, ctx.subset = pairs, -1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|all_sorted|pipe to
library.all_sorted = function (ctx)
if ctx.sorttype == 1 then error(modulename ..
': The ‘all_sorted’ directive has been provided more than once', 0) end
if ctx.subset == 1 then error(modulename ..
': The ‘all_sorted’ directive is redundant after ‘sequential’', 0) end
if ctx.sorttype == 2 then error(modulename ..
': The two directives ‘reassorted’ and ‘sequential’ are in contradiction with each other', 0) end
ctx.sorttype = 1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|reassorted|pipe to
library.reassorted = function (ctx)
if ctx.sorttype == 2 then error(modulename ..
': The ‘reassorted’ directive has been provided more than once', 0) end
if ctx.subset == 1 then error(modulename ..
': The ‘reassorted’ directive is redundant after ‘sequential’', 0) end
if ctx.sorttype == 1 then error(modulename ..
': The two directives ‘sequential’ and ‘reassorted’ are in contradiction with each other', 0) end
ctx.sorttype = 2
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|pinned_until|sentinel|[parameter name 1]|[parameter
-- name 2]|...|parameter name N|sentinel|pipe to
library.pinned_until = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘pinned_until’: No sentinel was provided', 0) end
local tmp, bucket, curr, ncurr
local sntl, idx = opts[1]:match'^%s*(.-)%s*$', 2
if ctx.pin_bucket == nil then
bucket, curr, ncurr = {}, {}, 0
ctx.pin_bucket, ctx.pins = bucket, curr
else bucket, curr, ncurr = ctx.pin_bucket, ctx.pins, ctx.npins end
while opts[idx] ~= nil do
tmp = opts[idx]:match'^%s*(.-)%s*$'
if tmp == sntl then
if idx == 2 then error(modulename ..
', ‘pinned_until’: No parameters to pin were provided', 0) end
ctx.npins = ncurr + idx - 2
return context_iterate(ctx, idx + 1)
end
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tmp = tonumber(tmp)
end
if bucket[tmp] then error(modulename ..
', ‘pinned_until’: Duplicate pinned parameter ‘' .. tostring(tmp) .. '’', 0) end
curr[ncurr + idx - 1], bucket[tmp], idx = tmp, true, idx + 1
end
error(modulename .. ', ‘pinned_until’: Missing sentinel in position #' .. tostring(idx), 0)
end
-- Syntax: #invoke:params|setting|directives|...|pipe to
library.setting = function (ctx)
local argc = set_strings_from_opts(ctx, ctx.pipe, 1)
if argc < 2 then error(modulename ..
', ‘setting’: No directive was given', 0) end
return context_iterate(ctx, argc + 1)
end
-- Syntax: #invoke:params|scoring|new parameter name|[container]|pipe to
library.scoring = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘scoring’: No parameter name was provided', 0) end
local tmp
local retval, opts = 0, ctx.pipe
for _ in pairs(ctx.params) do retval = retval + 1 end
if opts[2] ~= nil then tmp = opts[2]:match'^%s*(.*%S)' end
if tmp == 'in_substack' then
new_substack(ctx)[get_parameter_name(opts[1])] = tostring(retval)
return context_iterate(ctx, 3)
end
ctx.params[get_parameter_name(opts[1])] = tostring(retval)
return context_iterate(ctx, tmp == 'here' and 3 or 2)
end
-- Syntax: #invoke:params|squeezing|pipe to
library.squeezing = function (ctx)
local store, indices, tbl, newlen = {}, {}, ctx.params, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
newlen = newlen + 1
indices[newlen], store[key], tbl[key] = key, val, nil
end
end
table.sort(indices)
for idx = 1, newlen do tbl[idx] = store[indices[idx]] end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|filling_the_gaps|pipe to
library.filling_the_gaps = function (ctx)
local newval, tbl, tmp, nmin, nmax, nnums =
ctx.pipe[1], ctx.params, {}, 1, nil, -1
if newval == nil then error(modulename ..
', ‘filling_the_gaps’: No value was provided', 0) end
for key, val in pairs(tbl) do
if type(key) == 'number' then
if nmax == nil then
if key < nmin then nmin = key end
nmax = key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
tmp[key], nnums = val, nnums + 1
end
end
if nmax ~= nil and nmax - nmin > nnums then
ctx.n_available = ctx.n_available + nmin + nnums - nmax
if ctx.n_available < 0 then error(modulename ..
', ‘filling_the_gaps’: It is possible to fill at most ' ..
tostring(maxfill) .. ' parameters', 0) end
for idx = nmin, nmax, 1 do tbl[idx] = newval end
for key, val in pairs(tmp) do tbl[key] = val end
end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|clearing|pipe to
library.clearing = function (ctx)
local tbl, numerics = ctx.params, {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key], tbl[key] = val, nil
end
end
for key, val in ipairs(numerics) do tbl[key] = val end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|cutting|left cut|right cut|pipe to
library.cutting = function (ctx)
local lcut = tonumber(ctx.pipe[1])
if lcut == nil or math.floor(lcut) ~= lcut then error(modulename ..
', ‘cutting’: Left cut must be an integer number', 0) end
local rcut = tonumber(ctx.pipe[2])
if rcut == nil or math.floor(rcut) ~= rcut then error(modulename ..
', ‘cutting’: Right cut must be an integer number', 0) end
local tbl = ctx.params
local len = #tbl
if lcut < 0 then lcut = len + lcut end
if rcut < 0 then rcut = len + rcut end
local tot = lcut + rcut
if tot > 0 then
local cache = {}
if tot >= len then
for key in ipairs(tbl) do tbl[key] = nil end
tot = len
else
for idx = len - rcut + 1, len, 1 do tbl[idx] = nil end
for idx = 1, lcut, 1 do tbl[idx] = nil end
end
for key, val in pairs(tbl) do
if type(key) == 'number' and key > 0 then
if key > len then cache[key - tot] = val
else cache[key - lcut] = val end
tbl[key] = nil
end
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|cropping|left crop|right crop|pipe to
library.cropping = function (ctx)
local lcut = tonumber(ctx.pipe[1])
if lcut == nil or math.floor(lcut) ~= lcut then error(modulename ..
', ‘cropping’: Left crop must be an integer number', 0) end
local rcut = tonumber(ctx.pipe[2])
if rcut == nil or math.floor(rcut) ~= rcut then error(modulename ..
', ‘cropping’: Right crop must be an integer number', 0) end
local tbl = ctx.params
local nmin, nmax
for key in pairs(tbl) do
if type(key) == 'number' then
if nmin == nil then nmin, nmax = key, key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
end
end
if nmin ~= nil then
local len = nmax - nmin + 1
if lcut < 0 then lcut = len + lcut end
if rcut < 0 then rcut = len + rcut end
if lcut + rcut - len > -1 then
for key in pairs(tbl) do
if type(key) == 'number' then tbl[key] = nil end
end
elseif lcut + rcut > 0 then
for idx = nmax - rcut + 1, nmax do tbl[idx] = nil end
for idx = nmin, nmin + lcut - 1 do tbl[idx] = nil end
local lshift = nmin + lcut - 1
if lshift > 0 then
for idx = lshift + 1, nmax, 1 do
tbl[idx - lshift], tbl[idx] =
tbl[idx], nil
end
end
end
end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|purging|start offset|length|pipe to
library.purging = function (ctx)
local idx = tonumber(ctx.pipe[1])
if idx == nil or math.floor(idx) ~= idx then error(modulename ..
', ‘purging’: Start offset must be an integer number', 0) end
local len = tonumber(ctx.pipe[2])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘purging’: Length must be an integer number', 0) end
local tbl = ctx.params
if len < 1 then
len = len + table.maxn(tbl)
if idx > len then return context_iterate(ctx, 3) end
len = len - idx + 1
end
ctx.params = copy_table_reduced(tbl, idx, len)
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|backpurging|start offset|length|pipe to
library.backpurging = function (ctx)
local last = tonumber(ctx.pipe[1])
if last == nil or math.floor(last) ~= last then error(modulename ..
', ‘backpurging’: Start offset must be an integer number', 0) end
local len = tonumber(ctx.pipe[2])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘backpurging’: Length must be an integer number', 0) end
local idx
local tbl = ctx.params
if len > 0 then
idx = last - len + 1
else
for key in pairs(tbl) do
if type(key) == 'number' and (idx == nil or
key < idx) then idx = key end
end
if idx == nil then return context_iterate(ctx, 3) end
idx = idx - len
if last < idx then return context_iterate(ctx, 3) end
len = last - idx + 1
end
ctx.params = copy_table_reduced(ctx.params, idx, len)
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|shifting|addend|pipe to
library.shifting = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local nshift = tonumber(ctx.pipe[1])
if nshift == nil or nshift == 0 or math.floor(nshift) ~= nshift then
error(modulename .. ', ‘shifting’: A non-zero integer number must be provided', 0) end
local tbl = {}
for key, val in pairs(ctx.params) do
if type(key) == 'number' then tbl[key + nshift] = val
else tbl[key] = val end
end
ctx.params = tbl
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|reversing_numeric_names|pipe to
library.reversing_numeric_names = function (ctx)
local tbl, numerics, nmax = ctx.params, {}, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key], tbl[key] = val, nil
if key > nmax then nmax = key end
end
end
for key, val in pairs(numerics) do tbl[nmax - key + 1] = val end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|pivoting_numeric_names|pipe to
--[[
library.pivoting_numeric_names = function (ctx)
local tbl = ctx.params
local shift = #tbl + 1
if shift < 2 then return library.reversing_numeric_names(ctx) end
local numerics = {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = nil
end
end
for key, val in pairs(numerics) do tbl[shift - key] = val end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|mirroring_numeric_names|pipe to
--[[
library.mirroring_numeric_names = function (ctx)
local nmax, nmin
local tbl, numerics = ctx.params, {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = nil
if nmax == nil then nmin, nmax = key, key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
end
end
for key, val in pairs(numerics) do tbl[nmax + nmin - key] = val end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|swapping_numeric_names|pipe to
--[[
library.swapping_numeric_names = function (ctx)
local tmp
local tbl, cache, nsize = ctx.params, {}, 0
for key in pairs(tbl) do
if type(key) == 'number' then
nsize = nsize + 1
cache[nsize] = key
end
end
table.sort(cache)
for idx = math.floor(nsize / 2), 1, -1 do
tmp = tbl[cache[idx] ]
tbl[cache[idx] ] = tbl[cache[nsize - idx + 1] ]
tbl[cache[nsize - idx + 1] ] = tmp
end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|sorting_sequential_values|[criterion]|pipe to
library.sorting_sequential_values = function (ctx)
local sortfn
if ctx.pipe[1] ~= nil then
sortfn = sortfunctions[ctx.pipe[1]:match'^%s*(.-)%s*$']
end
if sortfn then table.sort(ctx.params, sortfn)
else table.sort(ctx.params) end -- i.e. either `false` or `nil`
if sortfn == nil then return context_iterate(ctx, 1) end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|splicing|[add to position]|position|increment|
-- [number of elements to write]|...|pipe to
library.splicing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tmp2, argc, pos, refp
local opts, tbl = ctx.pipe, ctx.params
local tmp1 = opts[1]
if tmp1 ~= nil then
tmp2 = tonumber(tmp1)
if tmp2 == nil or math.floor(tmp2) ~= tmp2 then
pos, argc, tmp2 = tonumber(opts[2]), 4,
tmp1:match'^%s*(.*%S)'
if tmp2 ~= nil then
refp = position_references[tmp2]
if refp == nil then error(modulename ..
', ‘splicing’: ‘' .. tostring(tmp2) ..
'’ is not a valid first argument', 0) end
else refp = 0 end
else pos, argc, refp = tmp2, 3, 0 end
else pos, argc, refp = tonumber(opts[2]), 4, 0 end
if pos == nil or math.floor(pos) ~= pos then error(modulename ..
', ‘splicing’: The position must be an integer number', 0) end
local len = tonumber(opts[argc - 1])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘splicing’: The increment must be an integer number', 0) end
local insn = tonumber(opts[argc])
if len == 0 and (insn == nil or insn < 1) then error(modulename ..
', ‘splicing’: When the increment is zero the number of elements to write cannot be zero', 0) end
if refp == 2 then
for _ in ipairs(tbl) do pos = pos + 1 end
refp = 0
end
tmp1, tmp2 = nil, nil
if refp ~= 0 or len ~= 0 then
for key, val in pairs(tbl) do
if type(key) == 'number' then
if tmp1 == nil then tmp1, tmp2 = key, key
elseif key < tmp1 then tmp1 = key
elseif key > tmp2 then tmp2 = key end
end
end
end
if tmp2 == nil then len = 0
elseif refp == 3 then pos = pos + tmp2
elseif refp == 1 then pos = pos + tmp1 end
if len > 0 and pos + len > tmp1 and pos <= tmp2 then
tbl = copy_table_expanded(tbl, pos, len)
elseif len < 0 and pos - len > tmp1 and pos <= tmp2 then
tbl = copy_table_reduced(tbl, pos, -len)
else tbl = copy_or_ref_table(tbl, tbl ~= ctx.oparams) end
ctx.params = tbl
if insn == nil or insn < 0 or math.floor(insn) ~= insn then
return context_iterate(ctx, argc)
end
tmp1 = argc - pos + 1
for key = pos, pos + insn - 1 do tbl[key] = opts[key + tmp1] end
return context_iterate(ctx, argc + insn + 1)
end
-- Syntax: #invoke:params|imposing|name|value|pipe to
library.imposing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘imposing’: Missing parameter name to impose', 0) end
ctx.params[get_parameter_name(ctx.pipe[1])] = ctx.pipe[2]
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|providing|name|value|pipe to
library.providing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘providing’: Missing parameter name to provide', 0) end
local key = get_parameter_name(ctx.pipe[1])
if ctx.params[key] == nil then ctx.params[key] = ctx.pipe[2] end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|reassigning|source|destination|[mode]|pipe to
library.reassigning = function (ctx)
local opts, tbl = ctx.pipe, ctx.params
if opts[1] == nil then error(modulename ..
', ‘reassigning’: Missing source parameter', 0) end
if opts[2] == nil then error(modulename ..
', ‘reassigning’: Missing destination parameter', 0) end
local mode, argc
local src = get_parameter_name(opts[1])
local val = tbl[src]
if opts[3] ~= nil then mode = a_modes[opts[3]:match'^%s*(.-)%s*$'] end
if mode == nil then mode, argc = 0, 3 else argc = 4 end
if val == nil and mode > 1 then return context_iterate(ctx, argc) end
local dest = get_parameter_name(opts[2])
local tmp = tbl[dest] == nil
if mode % 2 == 0 or (mode == 7 and tmp) then tbl[src] = nil end
if tmp or mode < 4 then tbl[dest] = val end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|discarding|name|[how many]|pipe to
library.discarding = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘discarding’: Missing parameter name to discard', 0) end
local len = tonumber(ctx.pipe[2])
if len == nil then
ctx.params[get_parameter_name(ctx.pipe[1])] = nil
return context_iterate(ctx, 2)
end
local key = tonumber(ctx.pipe[1])
if key == nil or math.floor(key) ~= key then error(modulename ..
', ‘discarding’: A range was provided, but the initial parameter name is not an integer number', 0) end
if len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘discarding’: A range can only be an integer number greater than zero', 0) end
for idx = key, key + len - 1 do ctx.params[idx] = nil end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|excluding_non-numeric_names|pipe to
library['excluding_non-numeric_names'] = function (ctx)
local tmp = ctx.params
for key, val in pairs(tmp) do
if type(key) ~= 'number' then tmp[key] = nil end
end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|excluding_numeric_names|pipe to
library.excluding_numeric_names = function (ctx)
local tmp = ctx.params
for key, val in pairs(tmp) do
if type(key) == 'number' then tmp[key] = nil end
end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|with_name_matching|target 1|[plain flag 1]|[or]|
-- [target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_name_matching = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tmp, ptn
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_name_matching')
local tbl, newparams = ctx.params, {}
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
tmp = ptn[1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tmp = tonumber(tmp)
end
newparams[tmp] = tbl[tmp]
else
for key, val in pairs(tbl) do
if tostring(key):find(ptn[1], 1, ptn[2]) then
newparams[key] = val
end
end
end
end
ctx.params = newparams
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_name_not_matching|target 1|[plain flag 1]|
-- [and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_name_not_matching = function (ctx)
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_name_not_matching')
local tbl = ctx.params
if nptns == 1 and targets[1][3] then
local tmp = targets[1][1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tbl[tonumber(tmp)] = nil
else tbl[tmp] = nil end
return context_iterate(ctx, argc)
end
local yesmatch, ptn
for key in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if tostring(key) ~= ptn[1] then
yesmatch = false
break
end
elseif not tostring(key):find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_value_matching|target 1|[plain flag 1]|[or]|
-- [target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_value_matching = function (ctx)
local nomatch, ptn
local tbl = ctx.params
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_value_matching')
for key, val in pairs(tbl) do
nomatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val == ptn[1] then
nomatch = false
break
end
elseif val:find(ptn[1], 1, ptn[2]) then
nomatch = false
break
end
end
if nomatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_value_not_matching|target 1|[plain flag 1]|
-- [and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_value_not_matching = function (ctx)
local yesmatch, ptn
local tbl = ctx.params
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_value_not_matching')
for key, val in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val ~= ptn[1] then
yesmatch = false
break
end
elseif not val:find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|keeping_at_most|number of parameters to pick|pipe to
library.keeping_at_most = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local len = tonumber(ctx.pipe[1])
if len == nil or len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘keeping_at_most’: The number of parameters to keep must be an integer greater than zero', 0) end
ctx.params = copy_table_maxn({}, ctx.params, len)
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|trimming_values|pipe to
library.trimming_values = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:match'^%s*(.-)%s*$' end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|mapping_to_lowercase|pipe to
library.mapping_to_lowercase = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:lower() end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|mapping_to_uppercase|pipe to
library.mapping_to_uppercase = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:upper() end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|mapping_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.mapping_by_calling = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘mapping_by_calling’: No template name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.values_only, ctx.params)
local model = { title = tname, args = margs }
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_invoking|module name|function name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_invoking = function (ctx)
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘mapping_by_invoking’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘mapping_by_invoking’: No function name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 2, mapping_styles.values_only, ctx.params)
local model = { title = 'Module:' .. mname, args = margs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
value_maps[looptype](tbl, margs, karg, varg, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_magic|parser function|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_magic = function (ctx)
local magic
local opts = ctx.pipe
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘mapping_by_magic’: No parser function was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.values_only, ctx.params)
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:callParserFunction(magic, margs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.mapping_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die =
load_replace_args(ctx.pipe, 'mapping_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if flg == 3 then
for key, val in pairs(tbl) do
if val == ptn then tbl[key] = repl end
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
for key, val in pairs(tbl) do
tbl[key] = val:gsub(ptn, repl, nmax)
end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_mixing|mixing string|pipe to
library.mapping_by_mixing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘mapping_by_mixing’: No mixing string was provided', 0) end
local tbl, mix = ctx.params, ctx.pipe[1]
if mix == '$#' then
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, 2)
end
local skel, cnv, n_parts = parse_placeholder_string(mix)
for key, val in pairs(tbl) do
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val
else cnv[idx] = tostring(key) end
end
tbl[key] = table.concat(cnv)
end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|mapping_to_names|pipe to
--[[
library.mapping_to_names = function (ctx)
local tbl = ctx.params
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|renaming_to_lowercase|pipe to
library.renaming_to_lowercase = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do
if type(key) == 'string' then cache[key:lower()] = val else
cache[key] = val end
end
ctx.params = cache
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|renaming_to_uppercase|pipe to
library.renaming_to_uppercase = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do
if type(key) == 'string' then cache[key:upper()] = val else
cache[key] = val end
end
ctx.params = cache
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|renaming_to_sequence|[sort order]|pipe to
library.renaming_to_sequence = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache, len
local tbl = ctx.params
local sortfn, argc, do_sort = load_sort_opt(ctx.pipe[1])
if do_sort then
local words, wl
cache, words, len, wl = get_key_list_sorted(tbl, sortfn)
for idx = 1, len do cache[idx] = tbl[cache[idx]] end
for idx = 1, wl do cache[len + idx] = tbl[words[idx]] end
else
len, cache = 0, {}
for _, val in pairs(tbl) do
len = len + 1
cache[len] = val
end
end
ctx.params = cache
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.renaming_by_calling = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘renaming_by_calling’: No template name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.names_only, ctx.params)
local model = { title = tname, args = rargs }
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_invoking|module name|function
-- name|[call style]|[let/use]|[...]|[let/use]|[...]|[number of
-- additional arguments]|[argument 1]|[argument 2]|[...]|[argument
-- N]|pipe to
library.renaming_by_invoking = function (ctx)
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘renaming_by_invoking’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘renaming_by_invoking’: No function name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 2, mapping_styles.names_only, ctx.params)
local model = { title = 'Module:' .. mname, args = rargs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘renaming_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
map_names(tbl, rargs, karg, varg, looptype, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_magic|parser function|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.renaming_by_magic = function (ctx)
local opts = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘renaming_by_magic’: No parser function was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.names_only, ctx.params)
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:callParserFunction(magic, rargs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.renaming_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die =
load_replace_args(ctx.pipe, 'renaming_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if flg == 3 then
ptn = get_parameter_name(ptn)
local val = tbl[ptn]
if val ~= nil then
tbl[ptn], tbl[get_parameter_name(repl)] = nil, val
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
local cache = {}
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache,
tostring(key):gsub(ptn, repl, nmax))
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_mixing|mixing string|pipe to
library.renaming_by_mixing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
if ctx.pipe[1] == nil then error(modulename ..
', ‘renaming_by_mixing’: No mixing string was provided', 0) end
local mix = ctx.pipe[1]:match'^%s*(.-)%s*$'
local cache = {}
if mix == '$@' then
for _, val in pairs(ctx.params) do
cache[get_parameter_name(val)] = val
end
else
local skel, canvas, n_parts = parse_placeholder_string(mix)
for key, val in pairs(ctx.params) do
for idx = 2, n_parts, 2 do
if skel[idx] then canvas[idx] = val
else canvas[idx] = tostring(key) end
end
cache[get_parameter_name(table.concat(canvas))] = val
end
end
ctx.params = cache
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|renaming_to_values|pipe to
--[[
library.renaming_to_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for _, val in pairs(ctx.params) do cache[val] = val end
ctx.params = cache
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|grouping_by_calling|template
-- name|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.grouping_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tmp, argc, tbl, mem = load_child_opts(ctx.pipe, 2, 0, ctx.params)
local gargs = {}
for key, val in pairs(tmp) do
if type(key) == 'number' and key < 1 then gargs[key - 1] = val
else gargs[key] = val end
end
tmp = ctx.pipe[1]
if tmp ~= nil then tmp = tmp:match'^%s*(.*%S)' end
if tmp == nil then error(modulename ..
', ‘grouping_by_calling’: No template name was provided', 0) end
local model = { title = tmp }
local groups = make_groups(tbl)
for gid, group in pairs(groups) do
for key, val in pairs(gargs) do group[key] = val end
group[0], model.args = gid, group
groups[gid] = ctx.frame:expandTemplate(model)
end
for key, val in pairs(mem) do groups[key] = val end
ctx.params = groups
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|parsing|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.parsing = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘parsing’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '|', '=')
parse_parameter_string(ctx.params, opts[1], isep, iplain, psep, pplain,
trimnamed, trimunnamed)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|reinterpreting|parameter to reinterpret|[trim
-- flag]|[iteration delimiter setter]|[...]|[key-value delimiter
-- setter]|[...]|pipe to
library.reinterpreting = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘reinterpreting’: No parameter to reinterpret was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '|', '=')
local tbl, tmp = ctx.params, get_parameter_name(opts[1])
local str = tbl[tmp]
if str ~= nil then
tbl[tmp] = nil
parse_parameter_string(tbl, str, isep, iplain, psep, pplain,
trimnamed, trimunnamed)
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|evaluating|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.evaluating = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘evaluating’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '!', ':')
if opts[1]:match'^%s*(.*%S)' == nil then
ctx.pipe = copy_or_ref_table(opts, opts ~= ctx.opipe)
return context_iterate(ctx, argc)
end
local new_opts, cache = {}, {}
local shift = parse_parameter_string(cache, opts[1], isep, iplain,
psep, pplain, trimnamed, trimunnamed) - argc
for key, val in pairs(opts) do
if type(key) ~= 'number' or key < 1 then new_opts[key] = val
elseif key >= argc then new_opts[key + shift] = val end
end
for key, val in pairs(cache) do new_opts[key] = val end
ctx.pipe = new_opts
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|mixing_names_and_values|mixing string|pipe to
library.mixing_names_and_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
if ctx.pipe[1] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter names', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter values', 0) end
local tmp
local mix_k = ctx.pipe[1]:match'^%s*(.-)%s*$'
local cache, mix_v = {}, ctx.pipe[2]
if mix_k == '$@' and mix_v == '$@' then
for _, val in pairs(ctx.params) do
cache[get_parameter_name(val)] = val
end
elseif mix_k == '$@' and mix_v == '$#' then
for key, val in pairs(ctx.params) do
cache[get_parameter_name(val)] = tostring(key)
end
elseif mix_k == '$#' and mix_v == '$#' then
for key in pairs(ctx.params) do cache[key] = tostring(key) end
else
local skel_k, cnv_k, n_parts_k = parse_placeholder_string(mix_k)
local skel_v, cnv_v, n_parts_v = parse_placeholder_string(mix_v)
for key, val in pairs(ctx.params) do
tmp = tostring(key)
for idx = 2, n_parts_k, 2 do
if skel_k[idx] then cnv_k[idx] = val else cnv_k[idx] = tmp end
end
for idx = 2, n_parts_v, 2 do
if skel_v[idx] then cnv_v[idx] = val else cnv_v[idx] = tmp end
end
cache[get_parameter_name(table.concat(cnv_k))] =
table.concat(cnv_v)
end
end
ctx.params = cache
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|swapping_names_and_values|pipe to
--[[
library.swapping_names_and_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do cache[val] = key end
ctx.params = cache
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|combining|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return key .. kvs .. val end,
'combining'
) + 1)
end
-- Syntax: #invoke:params|combining_values|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return val end,
'combining_values'
) + 1)
end
-- Syntax: #invoke:params|combining_by_calling|template name|new parameter
-- name|pipe to
library.combining_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tname = ctx.pipe[1]
if tname ~= nil then tname = tname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_calling’: No template name was provided', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘combining_by_calling’: No parameter name was provided', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[2])] = ctx.frame:expandTemplate{
title = tname,
args = ctx.params
}
}
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|combining_by_invoking|module name|function name|new
-- parameter name|pipe to
library.combining_by_invoking = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local mname = ctx.pipe[1]
if mname ~= nil then mname = mname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_invoking’: No module name was provided', 0) end
local fname = ctx.pipe[2]
if fname ~= nil then fname = fname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_invoking’: No function name was provided', 0) end
if ctx.pipe[3] == nil then error(modulename ..
', ‘combining_by_invoking’: No parameter name was provided', 0) end
local model = { title = 'Module:' .. mname, args = ctx.params }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[3])] =
tostring(mfunc(ctx.frame:newChild(model)))
}
return context_iterate(ctx, 4)
end
-- Syntax: #invoke:params|combining_by_magic|parser function|new parameter
-- name|pipe to
library.combining_by_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local magic = ctx.pipe[1]
if magic ~= nil then magic = magic:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_magic’: No parser function was provided', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘combining_by_magic’: No parameter name was provided', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[2])] =
ctx.frame:callParserFunction(magic, ctx.params)
}
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|snapshotting|[maximum number]|pipe to
library.snapshotting = function (ctx)
return context_iterate(ctx, make_child(ctx, ctx.params, 'snapshotting'))
end
-- Syntax: #invoke:params|remembering|[maximum number]|pipe to
library.remembering = function (ctx)
return context_iterate(ctx, make_child(ctx, ctx.oparams, 'remembering'))
end
-- Syntax: #invoke:params|entering_substack|[new]|pipe to
library.entering_substack = function (ctx)
local tbl, ncurrparent = ctx.params, ctx.n_parents + 1
if ctx.parents == nil then ctx.parents = { tbl }
else ctx.parents[ncurrparent] = tbl end
ctx.n_parents = ncurrparent
if ctx.pipe[1] ~= nil and ctx.pipe[1]:match'^%s*new%s*$' then
ctx.params = {}
return context_iterate(ctx, 2)
end
local currsnap = ctx.n_children
if currsnap > 0 then
ctx.params, ctx.children[currsnap], ctx.n_children =
ctx.children[currsnap], nil, currsnap - 1
else
local newparams = {}
for key, val in pairs(tbl) do newparams[key] = val end
ctx.params = newparams
end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|pulling|parameter name|pipe to
library.pulling = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘pulling’: No parameter to pull was provided', 0) end
local tmp = ctx.n_parents
local parent = tmp < 1 and ctx.oparams or ctx.parents[tmp]
tmp = get_parameter_name(opts[1])
if parent[tmp] ~= nil then ctx.params[tmp] = parent[tmp] end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|recalling|parameter name|pipe to
library.recalling = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘recalling’: No parameter to recall was provided', 0) end
local arg = get_parameter_name(opts[1])
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|finding|parameter name|pipe to
--[[
library.finding = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘finding’: No parameter to find was provided', 0) end
local arg = get_parameter_name(opts[1])
local parent
for idx = ctx.n_parents, 1, -1 do
parent = ctx.parents[idx]
if parent[arg] ~= nil then
ctx.params[arg] = parent[arg]
return context_iterate(ctx, 2)
end
end
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, 2)
end
]]--
-- Syntax: #invoke:params|picking|number of parameters to pick|pipe to
--[[
library.picking = function (ctx)
local len = tonumber(ctx.pipe[1])
if len == nil or len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘picking’: The number of parameters to pick must be an integer greater than zero', 0) end
if ctx.n_parents < 1 then copy_table_maxn(ctx.params, ctx.oparams, len)
else copy_table_maxn(ctx.params, ctx.parents[ctx.n_parents], len) end
return context_iterate(ctx, 2)
end
]]--
-- Syntax: #invoke:params|detaching_substack|pipe to
library.detaching_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘detaching_substack’: No substack has been created', 0) end
local parent = ctx.parents[ncurrparent]
for key in pairs(ctx.params) do parent[key] = nil end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|dropping_substack|pipe to
library.dropping_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘dropping_substack’: No substack has been created', 0) end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents =
ctx.parents[ncurrparent], nil, ncurrparent - 1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|leaving_substack|pipe to
library.leaving_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘leaving_substack’: No substack has been created', 0) end
local currsnap = ctx.n_children + 1
if ctx.children == nil then ctx.children = { ctx.params }
else ctx.children[currsnap] = ctx.params end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents, ctx.n_children =
ctx.parents[ncurrparent], nil, ncurrparent - 1, currsnap
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|merging_substack|pipe to
library.merging_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘merging_substack’: No substack has been created', 0) end
local parent, child = ctx.parents[ncurrparent], ctx.params
ctx.params, ctx.parents[ncurrparent], ctx.n_parents = parent, nil,
ncurrparent - 1
for key, val in pairs(child) do parent[key] = val end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|flushing|pipe to
library.flushing = function (ctx)
if ctx.n_children < 1 then error(modulename ..
', ‘flushing’: There are no substacks to flush', 0) end
local parent, currsnap = ctx.params, ctx.n_children
for key, val in pairs(ctx.children[currsnap]) do parent[key] = val end
ctx.children[currsnap], ctx.n_children = nil, currsnap - 1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|setting_by_flushing|pipe to
library.setting_by_flushing = function (ctx)
set_strings_from_substack(ctx, ctx, 'setting_by_flushing')
return context_iterate(ctx, 1)
end
--[[ Functions ]]--
-----------------------------
-- Syntax: #invoke:params|count
library.count = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local retval = 0
for _ in ctx.iterfunc(ctx.params) do retval = retval + 1 end
if ctx.subset == -1 then retval = retval - #ctx.params end
ctx.text = retval
return false
end
-- Syntax: #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2]|
-- [...]|[item n]|[named item 1=value 1]|[...]|[named item n=value
-- n]|[...]
library.concat_and_call = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘concat_and_call’: No template name was provided', 0) end
remove_numeric_keys(opts, 1, 1)
ctx.text = ctx.frame:expandTemplate{
title = tname,
args = concat_params(ctx)
}
return false
end
-- Syntax: #invoke:args|concat_and_invoke|module name|function name|[prepend
-- 1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named
-- item n=value n]|[...]
library.concat_and_invoke = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘concat_and_invoke’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘concat_and_invoke’: No function name was provided', 0) end
remove_numeric_keys(opts, 1, 2)
local mfunc = require('Module:' .. mname)[fname]
if mfunc == nil then error(modulename ..
', ‘concat_and_invoke’: The function ‘' .. fname ..
'’ does not exist', 0) end
ctx.text = mfunc(ctx.frame:newChild{
title = 'Module:' .. mname,
args = concat_params(ctx)
})
return false
end
-- Syntax: #invoke:args|concat_and_magic|parser function|[prepend 1]|[prepend
-- 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n=
-- value n]|[...]
library.concat_and_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local magic
local opts = ctx.pipe
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘concat_and_magic’: No parser function was provided', 0) end
remove_numeric_keys(opts, 1, 1)
ctx.text = ctx.frame:callParserFunction(magic, concat_params(ctx))
return false
end
-- Syntax: #invoke:params|value_of|parameter name
library.value_of = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘value_of’: No parameter name was provided', 0) end
local val
local key = opts[1]:match'^%s*(.-)%s*$'
if key == '0' or key:find'^%-?[1-9]%d*$' ~= nil then
key = tonumber(key)
val = ctx.params[key]
-- No worries: #ctx.params is unused when the modifier is in
-- first position (and therefore `ctx.params` is a metatable)
if val ~= nil and (
ctx.subset ~= -1 or key > #ctx.params or key < 1
) and (
ctx.subset ~= 1 or (key <= #ctx.params and key > 0)
) then
ctx.text = (ctx.header or '') .. val .. (ctx.footer or '')
else ctx.text = ctx.ifngiven or '' end
else
val = ctx.params[key]
if ctx.subset ~= 1 and val ~= nil then ctx.text = (ctx.header
or '') .. val .. (ctx.footer or '')
else ctx.text = ctx.ifngiven or '' end
end
return false
end
-- Syntax: #invoke:params|list
library.list = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or ''
flush_params(ctx, function (key, val)
ret[nss + 1], ret[nss + 2], ret[nss + 3], ret[nss + 4], nss =
pps, key, kvs, val, nss + 4
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 4)
return false
end
-- Syntax: #invoke:params|list_values
library.list_values = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
-- NOTE: `library.coins()` and `library.unique_coins()` rely on us
local ret, nss, pps = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
ret[nss + 1], ret[nss + 2], nss = pps, val, nss + 2
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|list_maybe_with_names
library.list_maybe_with_names = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or ''
mixed_flush_params(
ctx,
function (key, val)
ret[nss + 1], ret[nss + 2], ret[nss + 3],
ret[nss + 4], nss = pps, '', '', val, nss + 4
end,
function (key, val)
ret[nss + 1], ret[nss + 2], ret[nss + 3],
ret[nss + 4], nss = pps, key, kvs, val, nss + 4
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 4)
return false
end
-- Syntax: #invoke:params|coins|[first coin = value 1]|[second coin = value
-- 2]|[...]|[last coin = value N]
--[[
library.coins = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local opts, tbl = ctx.pipe, ctx.params
for key, val in pairs(tbl) do tbl[key] = opts[get_parameter_name(val)] end
return library.list_values(ctx)
end
]]--
-- Syntax: #invoke:params|unique_coins|[first coin = value 1]|[second coin =
-- value 2]|[...]|[last coin = value N]
--[[
library.unique_coins = function (ctx)
local tmp
local opts, tbl = ctx.pipe, ctx.params
for key, val in pairs(tbl) do
tmp = get_parameter_name(val)
tbl[key], opts[tmp] = opts[tmp], nil
end
return library.list_values(ctx)
end
]]
-- Syntax: #invoke:params|for_each|wikitext
library.for_each = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local ret, nss, pps, txt = {}, 0, ctx.itersep or '', ctx.pipe[1] or ''
local skel, cnv, n_parts = parse_placeholder_string(txt)
flush_params(ctx, function (key, val)
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val
else cnv[idx] = tostring(key) end
end
ret[nss + 1], nss = pps, nss + 2
ret[nss] = table.concat(cnv)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each|template name|[append 1]|[append 2]|
-- [...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘call_for_each’: No template name was provided', 0) end
local model = { title = tname, args = opts }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
table.insert(opts, 1, true)
flush_params(ctx, function (key, val)
opts[1], opts[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each|module name|module function|[append
-- 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|
-- [named param n=value n]|[...]
library.invoke_for_each = function (ctx)
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘invoke_for_each’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘invoke_for_each’: No function name was provided', 0) end
local model = { title = 'Module:' .. mname, args = opts }
local mfunc = require(model.title)[fname]
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
opts[1], opts[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = mfunc(ctx.frame:newChild(model))
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each|parser function|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.magic_for_each = function (ctx)
local magic
local opts = ctx.pipe
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘magic_for_each’: No parser function was provided', 0) end
local ret, nss, ccs = {}, 0, ctx.itersep or ''
table.insert(opts, 1, true)
flush_params(ctx, function (key, val)
opts[1], opts[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, opts)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_value|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_value = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘call_for_each_value’: No template name was provided', 0) end
local model = { title = tname, args = opts }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
opts[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each_value|module name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.invoke_for_each_value = function (ctx)
local opts = ctx.pipe
local mname, fname
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘invoke_for_each_value’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘invoke_for_each_value’: No function name was provided', 0) end
local model = { title = 'Module:' .. mname, args = opts }
local mfunc = require(model.title)[fname]
local ret, nss, ccs = {}, 0, ctx.itersep or ''
remove_numeric_keys(opts, 1, 1)
flush_params(ctx, function (key, val)
opts[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = mfunc(ctx.frame:newChild(model))
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each_value|parser function|[append 1]|
-- [append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named
-- param n=value n]|[...]
library.magic_for_each_value = function (ctx)
local opts = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘magic_for_each_value’: No parser function was provided', 0) end
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
opts[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, opts)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_group|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_group = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local tmp
if ctx.pipe[1] ~= nil then tmp = ctx.pipe[1]:match'^%s*(.*%S)' end
if tmp == nil then error(modulename ..
', ‘call_for_each_group’: No template name was provided', 0) end
local model = { title = tmp }
local opts, ret, nss, ccs = {}, {}, 0, ctx.itersep or ''
for key, val in pairs(ctx.pipe) do
if type(key) == 'number' then opts[key - 1] = val
else opts[key] = val end
end
ctx.pipe = opts
ctx.params = make_groups(ctx.params)
flush_params(ctx, function (gid, group)
for key, val in pairs(opts) do group[key] = val end
group[0], model.args, ret[nss + 1], nss = gid, group, ccs,
nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
--[[ First-position-only modifiers ]]--
---------------------------------------
-- Syntax: #invoke:params|new|pipe to
static_iface.new = function (child_frame)
local ctx = context_new(child_frame)
ctx.pipe = copy_or_ref_table(ctx.opipe, false)
ctx.params = {}
main_loop(ctx, context_iterate(ctx, 1))
return ctx.text
end
--[[ First-position-only functions ]]--
---------------------------------------
-- Syntax: #invoke:params|self
static_iface.self = function (frame)
return frame:getParent():getTitle()
end
--[[ Public metatable of functions ]]--
---------------------------------------
return setmetatable({}, {
__index = function (_, query)
local fname = query:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
': You must specify a function to call', 0) end
local func = static_iface[fname]
if func ~= nil then return func end
func = library[fname]
if func == nil then error(modulename ..
': The function ‘' .. fname .. '’ does not exist', 0) end
return function (child_frame)
local ctx = context_new(child_frame)
ctx.pipe = copy_or_ref_table(ctx.opipe, refpipe[fname])
ctx.params = copy_or_ref_table(ctx.oparams, refparams[fname])
main_loop(ctx, func)
return ctx.text
end
end
})
jd4jhydnyce3tw9c50qwx3yd53quopx
Port Harcourt
0
68546
283256
257960
2026-10-09T03:09:23Z
InternetArchiveBot
2766
Rescuing 0 sources and tagging 1 as dead.) #IABot (v2.0.9.6
283256
wikitext
text/x-wiki
'''Port Harcourt''' ([[Nigerian Pidgin|Pidgin]]: ''Po-ta-kot or Pi-ta-kwa)'' inggih punika ibu kota miwah kota sané pinih ageng ring [[Negara Wagian River]] ring Nigeria.<ref>{{Cite web |title=Port Harcourt {{!}} Location, Facts, & Population |url=https://www.britannica.com/place/Port-Harcourt |access-date=2022-03-04 |website=Britannica |language=en}}</ref> Puniki wantah [[Lis kota Nigeria manut populasi|kota sané pinih akéh populasiné kaping lima]] ring [[Nigeria]] risampuné [[Lagos]], [[Kano (kota)|Kano]], [[Ibadan]] miwah [[Kota Benin|Benin]].<ref name="world">{{Cite web|title=Population of Cities in Nigeria (2021)|url=https://worldpopulationreview.com/countries/cities/nigeria|access-date=2021-11-19|website=worldpopulationreview.com}}</ref><ref>{{Cite web|title=Nigeria: cities with the largest population 2021|url=https://www.statista.com/statistics/1121444/largest-cities-in-nigeria/|access-date=2021-11-19|website=Statista|language=en}}</ref> Puniki magenah ring salantang [[Tukad Bonny]] miwah magenah ring genah sané sugih antuk lengis [[Délta Niger|wawengkon Délta Niger]]. Ring warsa 2023, populasi ring kota Port Harcourt kirang langkung 3.480.000 diri.<ref>{{cite web | url=https://worldpopulationreview.com/world-cities/port-harcourt-population | title=Port Harcourt Population 2023 }}</ref> Populasi ring wewidangan Port Harcourt sampun akéhnyané kalih urban saking kotanyané antuk 2.344.000 diri ring warsa 2015.<ref name="UN Urbanization Prospects 2018">{{Cite web|title=World Urbanization Prospects 2018. Annual Population of Urban Agglomerations with 300,000 or more|url=https://population.un.org/wup/DataQuery/|access-date=2023-01-19|website=population.un.org|archive-date=2023-01-27|archive-url=https://web.archive.org/web/20230127201327/https://population.un.org/wup/DataQuery/|url-status=dead}}</ref> Daweg warsa 1950, populasi Port Harcourt inggih punika 59.752 diri.<ref>{{Cite web |title=Macrotrends {{!}} The Long Term Perspective on Markets |url=https://www.macrotrends.net/ |access-date=2025-01-30 |website=www.macrotrends.net}}</ref> Port Harcourt sampun ngelimbak 150.844 saking 2015, sané nujuang pagentosan nyabran warsa akéhné 4,99%.<ref>{{Cite web|title=Port Harcourt, Nigeria Metro Area Population 1950–2021|url=https://www.macrotrends.net/cities/22018/port-harcourt/population|access-date=2021-11-19|website=macrotrends.net}} {{Dead link|date=October 2026 |bot=InternetArchiveBot |fix-attempted=yes }}</ref>
m80zj8yd06r0hjrq1l4nbwrxxfwu4k0