MediaWiki:Common.js: Perbedaan antara revisi

Tidak ada ringkasan suntingan
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
Tidak ada ringkasan suntingan
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
Baris 1.338: Baris 1.338:


/* ==========================================================
/* ==========================================================
   🚀 MIPPEDIA METADATA GUARD - ANTI-MANUAL SYSTEM
   🚀 MIPPEDIA METADATA GUARD - HARD LOCK SYSTEM (V2)
   Fungsi: Melindungi kode {{SHORTDESC:}} dari perubahan manual.
   Status: Anti-Manual | All-User | Deep Validation
   ========================================================== */
   ========================================================== */
(function() {
(function($, mw) {
     "use strict";
     "use strict";


     function handleMetadataGuard(e) {
     // 1. Ambil state awal saat halaman editor dibuka
        var ns = mw.config.get('wgNamespaceNumber');
    var ns = mw.config.get('wgNamespaceNumber');
        if (ns !== 0 || mw.config.get('wgIsMainPage')) return;
    if (ns !== 0 || mw.config.get('wgIsMainPage')) return;


        var $textbox = $('#wpTextbox1, .editor-container textarea, textarea.mw-ui-input');
    // Ambil konten asli artikel dari textarea saat pertama kali load
        if (!$textbox.length) return;
    var originalContent = $('#wpTextbox1').val() || "";
    var shortDescRegex = /\{\{SHORTDESC:.*?\}\}/gi;
    var originalMatch = originalContent.match(shortDescRegex);
    var originalShortDesc = originalMatch ? originalMatch[0] : null;


        // 1. Ambil konten lama (dari server) dan konten baru (dari textbox)
    // 2. Fungsi Validasi Inti
         var oldContent = mw.config.get('wgCurRevisionId') ? "" : ""; // Fallback
    function validateMetadata() {
         var newContent = $textbox.val() || "";
         var $textbox = $('#wpTextbox1');
         if (!$textbox.length) return true;


         // Regex canggih: Mendeteksi {{SHORTDESC:deskripsi}} dalam bentuk apapun
         var currentContent = $textbox.val();
         var shortDescRegex = /\{\{SHORTDESC:.*?\}\}/gi;
         var currentMatch = currentContent.match(shortDescRegex);
        var currentShortDesc = currentMatch ? currentMatch[0] : null;


         // Ambil string SHORTDESC dari konten baru
         // CEK: Apakah SHORTDESC dihapus, ditambah, atau diubah isinya secara manual?
         var newShortDescMatch = newContent.match(shortDescRegex);
        // Kita bandingkan string SHORTDESC lama vs baru.
         var newShortDescStr = newShortDescMatch ? newShortDescMatch[0] : "";
         if (originalShortDesc !== currentShortDesc) {
            window.alert(
                "❌ SUNTINGAN DITOLAK SISTEM!\n\n" +
                "Anda mencoba mengubah kode {{SHORTDESC:}} secara manual.\n" +
                "Metadata ini hanya boleh dikelola otomatis oleh Mippedia Data.\n\n" +
                "Silakan kembalikan kode tersebut ke kondisi semula untuk dapat menyimpan."
            );
            return false; // Gagalkan simpan
         }
        return true; // Izinkan simpan
    }


        // 2. LOGIKA CEGAH MANUAL
    // 3. Masuk ke Hook Validasi MediaWiki (Paling Ampuh)
        // Kita bandingkan: Jika user mencoba menghapus atau merubah paksa kodenya secara manual
    mw.hook('editform.setup').add(function($editForm) {
        // Sistem otomatis kita akan selalu menyisipkan kode ini di baris paling atas/bawah.
        $editForm.on('submit', function(e) {
       
             if (!validateMetadata()) {
        // Cek apakah user sedang menghapus kode yang seharusnya ada
                e.preventDefault();
        // (Logika: Jika kode dihapus total atau tulisan "SHORTDESC" diubah secara manual)
                 return false;
        var isTryingToEditManual = false;
 
        // Kita biarkan save HANYA JIKA kode SHORTDESC tidak disentuh atau
        // jika penambahannya dilakukan oleh script (script biasanya jalan di latar belakang).
        // Tapi karena ini di sisi browser user, kita kasih peringatan keras.
 
        // Jika user sengaja menambah kode SHORTDESC: manual tanpa lewat sistem
        if (newContent.toLowerCase().includes('shortdesc:') && !window.mippediaAutoSyncActive) {
            // Kita izinkan jika formatnya benar, TAPI kita blokir jika user mencoba merusak format resmi
             if (!/\{\{SHORTDESC:.*?\}\}/i.test(newContent)) {
                 isTryingToEditManual = true;
             }
             }
         }
         });
    });


         if (isTryingToEditManual) {
    // Jalankan juga di tombol-tombol khusus (Opal/VE)
    $(document).on('click', '#wpSave, #wpPreview, #wpDiff', function(e) {
         if (!validateMetadata()) {
             e.preventDefault();
             e.preventDefault();
            e.stopPropagation();
             e.stopImmediatePropagation();
             e.stopImmediatePropagation();
            window.alert("PERINGATAN SISTEM MIPPEDIA!\n\nAnda dilarang menambah, mengubah, atau menghapus kode {{SHORTDESC:}} secara manual.\n\nMetadata deskripsi singkat dikelola secara otomatis oleh Mippedia Data. Perubahan manual akan merusak sinkronisasi ekosistem.");
             return false;
             return false;
         }
         }
     }
     });
 
    // Jalankan proteksi pada tombol simpan
    $(document).on('click mousedown touchstart',
        '#wpSave, .editor-save, .mw-ui-button.primary, button[type="submit"], .save-button, .header-action button',
        function(e) {
            handleMetadataGuard(e);
        }
    );


    window.addEventListener('submit', function(e) {
})(jQuery, mediaWiki);
        handleMetadataGuard(e);
    }, true);
})();