Gadget kitchen
Selamat datang di gadget kitchen. Tutorial ini menjelaskan cara membuat dan menggunakan gadget serta skrip pengguna dalam JavaScript.
Apa itu gadget dan skrip pengguna?
MediaWiki memungkinkan siapa saja untuk menulis kode JavaScript publik guna langsung mengubah perilaku perangkat lunak. Kode ini dapat dibagikan dengan pengguna lain. Kode ini terletak di halaman wiki.
- Skrip pengguna dapat diedit oleh penulis aslinya (jika disimpan dalam ruang nama
Pengguna:
) dan oleh siapa saja yang memiliki hak pengguna "edituserjs" (biasanya hanya pengurus antarmuka). Kode tersebut biasanya disimpan pada subhalaman dari halaman pengguna Anda. Misalnya: XTools/ArticleInfo.js dan m:User:Hoo man/useful links.js. Skrip pengguna mirip dengan halaman JavaScript pribadi seperti Special:MyPage/common.js, tetapi memungkinkan potongan kode tertentu untuk dibagikan dengan pengguna lain. - Gadget adalah skrip pengguna yang telah "dipromosikan" oleh seorang pengurus antarmuka dengan menambahkannya ke MediaWiki:Gadgets-definition. Pengguna yang sudah masuk log dapat mengaktifkan gadget di tab "Gadgets" dalam preferensi pengguna mereka. "Gadget dibuat dan dikelola oleh pengurus antarmuka."
- Untuk kelengkapan: Ada juga JavaScript di seluruh situs yang terletak di MediaWiki:Common.js serta beberapa halaman lainnya. JavaScript di halaman-halaman tersebut memengaruhi semua orang dan dijalankan secara otomatis baik untuk pengguna yang keluar log maupun yang masuk log. Pengurus antarmuka dapat mengubahnya. Baca Manual:Interface/JavaScript untuk informasi lebih detail.
Jika Anda menjalankan salinan MediaWiki sendiri, $wgAllowUserJs
perlu diaktifkan agar skrip pengguna dapat berfungsi, dan ekstensi Gadgets harus dipasang untuk memungkinkan promosi skrip individu menjadi gadget.
Untuk pengalaman pengembangan yang lebih baik, pastikan ekstensi CodeEditor terpasang di wiki Anda.
Membuat skrip pengguna pertamamu
Di bagian ini, kamu akan membuat contoh skrip pengguna yang menghitung perkiraan waktu membaca sebuah halaman wiki.
- Pastikan kamu sudah masuk log.
- Kunjungi Special:MyPage/common.js. Halaman ini menyimpan JavaScript pribadimu yang dimuat pada setiap tampilan halaman (kecuali untuk Special:Preferences).
- Buat halaman tersebut atau sunting jika sudah ada.
- Salin enam baris berikut dan tempelkan ke dalam halaman:
const numWords = $( '#mw-content-text > div' ).text().split( ' ' ).length; const headerWords = $( 'h1' ).text().split( ' ' ).length; const totalWords = numWords + headerWords; const timeInMinutes = totalWords / 200; const header = $( 'h1' ).text(); $( 'h1' ).text( header + ' (it will take you ' + timeInMinutes + ' minutes to read this page)' );
- Klik "Terbitkan perubahan".
- Buka halaman mana saja dan perhatikan judulnya.
Contoh skrip pengguna ini diambil dari ChickTech High School Kickoff 2017/Tasks . Ada lebih banyak contoh skrip pengguna sederhana di halaman tersebut.
Contoh skrip pengguna yang lebih kompleks
Periksa MediaWiki:Tutorial-QuickRC.js yang menggunakan mw.loader, mw.util, mw.html, mw.user dari ResourceLoader, MediaWiki Action API, dialog jQuery UI, jQuery AJAX, dan pengikatan event jQuery.
Salin dan tempel isi dari MediaWiki:Tutorial-QuickRC.js ke dalam Special:MyPage/common.js mu.
Hasilnya seharusnya sama seperti di atas, tetapi sekarang kamu dapat memodifikasi skrip, bereksperimen dengannya, atau mengganti sepenuhnya dengan sesuatu yang lain.
Memuat skrip pengguna yang sudah ada
Di bagian sebelumnya, Anda telah menyalin isi dari sebuah skrip pengguna. Di bagian ini, kamu akan memuat skrip MediaWiki:Tutorial-QuickRC.js yang sudah ada sebagai gantinya.
- Pastikan kamu sudah masuk log.
- Kunjungi Special:MyPage/common.js. Halaman ini menyimpan JavaScript pribadimu yang dimuat pada setiap tampilan halaman (kecuali untuk Special:Preferences).
- Buat halaman tersebut atau sunting jika sudah ada.
- Salin teks berikut dan tempelkan ke halaman:
mw.loader.load( '//www.mediawiki.org/w/index.php?title=MediaWiki:Tutorial-QuickRC.js&action=raw&ctype=text/javascript' );
- Klik "Terbitkan perubahan". Kamu sekarang harus memiliki tautan di bagian "Perkakas" yang disebut "Pengganti Cepat".
- Klik "Quick changelog". Kamu akan melihat jendela pop-up. Ini menampilkan sebagian dari perubahan terbaru di situs ini.
Menggunakan skrip di Wiki Wikimedia lain
Jika kamu ingin menggunakan skrip di situs Wikimedia lain (misalnya Wikipedia bahasa Inggris alih-alih MediaWiki.org), ikuti langkah yang sama seperti di atas: beri tahu ResourceLoader untuk memuat kodemu. Kunjungi common.js mu di Wikipedia bahasa Inggris, lalu tambahkan teks berikut:
mw.loader.load( '//www.mediawiki.org/w/index.php?title=MediaWiki:Tutorial-QuickRC.js&action=raw&ctype=text/javascript' );
Kamu juga dapat memuat skrip pengguna yang baru saja Anda buat di atas dengan mengganti MediaWiki:Tutorial-QuickRC.js
pada baris sebelumnya dengan Pengguna:YourName/YourScript.js
(gantikan YourName
dan YourScript
sesuai kebutuhan).
Ini mengharuskan kamu untuk tidak menyimpan kode skrip pengguna di Special:MyPage/common.js itu sendiri, melainkan di subhalaman terpisah dari halaman penggunamu."
Ini juga membantu menyimpan kode di satu tempat, sehingga Anda hanya perlu memperbarui kode di satu lokasi.
Mengembangkan skrip pengguna dan gadget
Bagian ini mencantumkan sumber daya yang diperlukan atau berguna untuk skrip pengguna yang tidak sederhana.
ResourceLoader
Gadget harus menggunakan ResourceLoader. ResourceLoader adalah fitur inti MediaWiki yang secara cerdas mendistribusikan aset JavaScript dan CSS kepada pengguna serta pembaca. Karena Gadget dikodekan dalam JavaScript, sebagai pengembang Gadget, kamu pasti akan berinteraksi dengan ResourceLoader.
Gadget kamu harus memuat modul ResourceLoader yang berguna.
- Modul — Daftar pustaka JavaScript, plugin jQuery, dan utilitas MediaWiki yang sudah tersedia di dalam ResourceLoader untuk kamu gunakan kembali.
- Lihat dokumentasi jQuery untuk informasi bagaimana menggunakan jQuery di MediaWiki.
- Mengembangkan dengan ResourceLoader — Daftar praktik berguna, seperti mengaktifkan mode debug dan bantuan untuk debugging.
- Lihat juga praktik terbaik ResourceLoader.
OOUI
OOUI adalah pustaka JavaScript dengan elemen antarmuka pengguna (misalnya jendela pop-up) yang dirancang khusus untuk digunakan di MediaWiki. Pustaka Menggunakan OOUI di MediaWiki#Gadgets dapat digunakan dalam gadget.
MediaWiki Action API
Dalam konteks situs MediaWiki, Action API dapat diakses dari JavaScript melalui API JavaScript mw.Api. (mw.ForeignApi untuk permintaan lintas situs yang diizinkan, misalnya antara wiki WMF.) Lihat API untuk informasi lebih lanjut.
?callback=?
" ke URL API jika Anda mencoba melakukan permintaan yang melanggar kebijakan same-origin (misalnya, melakukan permintaan ke API Commons dari Wikipedia). Ini akan memicu penggunaan JSONP dan memberlakukan beberapa pembatasan.VisualEditor
Lihat VisualEditor/Gadgets untuk tutorial khusus tentang gadget VisualEditor.
Debugging gadget dan skrip pengguna
- Gadget biasanya dipadatkan oleh ResourceLoader, diminimalkan, dan digabungkan. Gunakan parameter URI
debug=true
(tentu saja didahului oleh?
atau&
) untuk meminta versi halaman yang tidak dipadatkan dan memuat "bentuk sumber asli" dari gadget Anda. Lihat juga Mengembangkan dengan ResourceLoader untuk informasi lebih lanjut. - Pelajari cara menggunakan Developer Tools di browser Anda (misalnya, cara menonaktifkan tembolok di browser). Lihat dokumentasi terkait: Chrome/Chromium, Firefox, Internet Explorer, Opera, Safari.
- Jika gadget yang ada mengalami masalah, Anda juga dapat menggunakan halaman Special:Gadgets untuk menemukan lokasi kode sumbernya.
Privasi dan konten eksternal
Anda sebaiknya tidak memuat sumber daya eksternal yang dapat membahayakan privasi pengguna. Di wiki Wikimedia, domain berikut dianggap aman:
- *.wiktionary.org
- *.wikimedia.org
- *.wikibooks.org
- *.wikisource.org
- *.wikiversity.org
- *.wikinews.org
- *.wikiquote.org
- *.wikidata.org
- *.wikivoyage.org
- www.mediawiki.org
Menjalankan kode saat halaman dimuat
Tugas umum menjalankan kode segera setelah halaman dimuat memiliki beberapa kendala yang bahkan dapat menjebak pengguna berpengalaman.
- Pertama-tama, ketika kode Anda berinteraksi dengan elemen DOM, jalankan saat halaman dimuat. Jika tidak, kode Anda mungkin berjalan terlalu cepat. Cara umum untuk melakukannya adalah dengan menggunakan fungsi
$()
dari jQuery, yang memiliki fungsi yang sama seperti$(document).ready()
. - Namun, jika kode Anda berinteraksi dengan bagian konten halaman (elemen
#mw-content-text
), sebaiknya gunakan hook'wikipage.content'
sebagai gantinya. Dengan cara ini, kode Anda akan dapat memproses ulang halaman dengan sukses ketika halaman diperbarui secara asinkron dan hook dipicu kembali. Ada banyak tool yang melakukan ini, mulai dari pratinjau suntingan hingga pembaruan otomatis daftar pantauan. - Pastikan untuk hanya bekerja dengan turunan elemen
$content
yang diterima oleh fungsi penangan Anda, bukan seluruh halaman. Jika tidak, Anda mungkin menjalankan kode yang sama untuk elemen yang sama berulang kali. Perlu diperhatikan bahwa hook'wikipage.content'
dapat dipicu sangat banyak kali. - Berhati-hatilah dengan apa yang masuk dalam argumen
$content
pada fungsi penangan. Jangan berasumsi bahwa itu adalah elemen#mw-content-text
. Itu bisa saja hanya sebagian kecil dari halaman, misalnya saat halaman dipratinjau.
Kode yang berinteraksi dengan konten halaman dan menghindari kendala yang telah disebutkan sebelumnya dapat terlihat seperti ini:
mw.hook( 'wikipage.content' ).add( ( $content ) => {
const $target = $content.find( '.targetClass' );
if ( $target.length ) {
// Lakukan sesuatu dengan $target.
}
// Hanya lakukan beberapa operasi jika argumen tersebut adalah #mw-content-text.
if ( $content.is( '#mw-content-text' ) ) {
const $note = $( '<div>' )
.addClass( 'myScript-note' )
.text( 'MyScript has successfully processed the content!' );
$content.prepend( $note );
}
} );
Jika kodemu berinteraksi dengan konten halaman dan menambahkan penanganan event ke elemen DOM, daripada mengaitkan ke 'wikipage.content'
dan mencari elemen untuk menambahkan event listener setiap kali dipicu, kamu dapat menggunakan event delegation: tambahkan satu event listener ke elemen di luar area konten atau ke seluruh document
, tetapi saring event berdasarkan selektor (lihat dokumentasi jQuery).
Dengan kata lain, daripada menulis $content.find( '.targetClass' ).on( 'click', ... )
, kamu bisa menulis $( document ).on( 'click', '.targetClass', ... )
.
Recording metrics
Some gadgets are serious business. When your gadget gets serious, you might want to instrument it for analytics purposes, for example to measure the click rate of specific UI elements added to a page by the gadget.
Lain-lain
- Kode gadget tidak harus mengikuti konvensi penulisan kode JavaScript untuk MediaWiki, tetapi jika kamu mengharapkan orang lain untuk mengedit kodemu, konvensi tersebut dapat dijadikan referensi.
- Jika kamu mengembangkan di dalam IDE seperti VS Code, kamu bisa menggunakan definisi tipe untuk MediaWiki, OOjs, OOUI, dan jQuery guna mendukung pelengkapan kode dan pemeriksaan tipe.
Kelemahan dan masalah gadget
- Gadget dikembangkan oleh anggota komunitas. Hingga saat ini, tidak ada proses tinjauan kode formal yang diwajibkan untuk gadget di situs Wikimedia (lihat phab:T71445). Harap ikuti praktik terbaik yang tercantum di halaman ini.
- Di situs Wikimedia, proses untuk "mempromosikan" skrip pengguna menjadi gadget di tab "Gadgets" dalam preferensi pengguna tidak selalu jelas. Anda perlu mencari seorang pengurus antarmuka dan mungkin harus memberikan instruksi penerapan kepada mereka.
- Wikimedia belum memiliki proses sistematis untuk menggunakan kembali, memodifikasi, dan berkontribusi pada skrip pengguna dan gadget yang sudah ada.
Ide untuk dikerjakan
Beberapa anggota komunitas Wikimedia mungkin membagikan ide mereka tentang fitur yang ingin mereka lihat diimplementasikan oleh orang lain.
- phabricator:tag/wikidata-gadgets/ - Anda dapat melakukan perbaikan kecil pada gadget yang sudah ada atau mengerjakan proposal.
- Gadget Kitchen/Requests - Halaman ini jarang dikunjungi, sehingga upaya Anda mungkin tidak mendapatkan banyak perhatian.
- w:Wikipedia:User scripts/Requests - untuk Wikipedia bahasa Inggris
Menerapkan atau mengaktifkan gadget
Jika skrip penggunamu ingin dijadikan gadget (lihat definisi di atas) di sebuah wiki, langkah-langkah berikut perlu dilakukan:
- Langkah-langkah untuk penulis skrip pengguna:
- Cari pengembang berpengalaman untuk meninjau kode gadgetmu. Tidak ada proses formal untuk melakukannya.
- Diskusikan dengan anggota komunitas untuk memastikan tidak ada keberatan sebelum mengaktifkan gadget di wiki. Untuk situs MediaWiki.org sendiri, diskusi dapat dilakukan di Project:Village Pump.
- Cari pengurus situs yang memiliki hak antarmuka. Lihat halaman Special:ListUsers/interface-admin di wiki Anda.
- Langkah-langkah untuk pengurus antarmuka:
- Salin file JS & CSS Anda ke dalam ruang nama
MediaWiki:
di wiki Anda, dan pastikan nama halaman memiliki prefiksGadget-
.
Contoh:MediaWiki:Gadget-userfeedback.js
- Definisikan gadget tersebut pada halaman MediaWiki:Gadgets-definition di wiki Anda. Itu mencakup modul yang digunakan, dependensi, nama file JS dan CSS, serta lainnya. Hal ini akan memungkinkan pengguna untuk mengaktifkan gadget di halaman Special:Preferences wiki Anda.
Contoh:userfeedback[ResourceLoader|default|dependencies=ext.eventLogging]|userfeedback.js|userfeedback.css
- Buat halaman untuk gadget di ruang nama
MediaWiki:
dengan awalanGadget-
. Ini akan menghasilkan label untuk gadget di halaman Special:Preferences di wiki Anda.
Contoh:MediaWiki:Gadget-userfeedback
- Salin file JS & CSS Anda ke dalam ruang nama
Berkontribusi pada Skrip Pengguna
Jika sebuah skrip pengguna dibuat oleh pengguna lain, kamu mungkin dapat berkontribusi dalam pengembangannya. Kamu dapat melakukannya dengan menyalin skrip pengguna sebagai subhalaman di halaman penggunamu sendiri. Kemudian gantilah skrip pengguna asli yang telah kamu aktifkan dengan yang ada di halaman penggunamu di common.js. Lanjutkan dengan mengedit salinan skrip sesuai keinginanmu. Jika kamu ingin skrip asli memuat perubahan yang telah kamu buat pada salinan skrip kamu, sebaiknya ping penulis skrip tersebut di halaman diskusi skrip pengguna asli. Sertakan tautan ke halaman yang berisi perubahanmu dan minta mereka untuk menambahkan perubahan tersebut. Jika pengguna tersebut sudah tidak aktif, sebaiknya beri tahu komunitas bahwa versi skrip kamu tersedia dengan menautkannya ke daftar skrip di wiki kamu.
Halaman terkait
- Wikipedia:User scripts di Wikipedia bahasa Inggris dan versi alternatifnya dalam berbagai bahasa merupakan pusat utama untuk pengembangan skrip pengguna dan gadget di Wikipedia.
- Panduan skrip pengguna di Wikipedia bahasa Inggris berisi banyak informasi berguna untuk memulai.
- Halaman Wikipedia:Gadget di Wikipedia bahasa Inggris.
- Salindia untuk lokakarya pengenalan dasar skrip pengguna dan gadget (bagian dari meta:Small wiki toolkits).
- Daftar gadget berdasarkan popularitas di seluruh proyek Wikimedia.
- Untuk situs web tertentu, lihat Special:GadgetUsage untuk mengetahui jumlah pengguna setiap gadget.
- Kompatibilitas - Dukungan JavaScript MediaWiki berdasarkan browser dan versi browser.
- A video tutorial from the year 2012 regarding gadgets and user scripts. Informasi ini agak usang dan kualitasnya bisa lebih baik, tetapi tetap berguna untuk memahami cara menggunakan alat pengembang, dan lainnya.
- Lihat Extension:EventLogging untuk mekanisme mengumpulkan data dari interaksi pengguna dengan sebuah gadget.
- Category:Snippets with JavaScript – kumpulan cuplikan JavaScript yang berguna.