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 531: Baris 531:


/* ==========================================================
/* ==========================================================
   🚀 MIPPEDIA DATA - AUTO-LINKER (API DETECTOR MODE)
   🚀 MIPPEDIA DATA - AUTO-LINKER ENGINE (FIXED)
  Fungsi: Scan teks di #mip-auto-description & ubah jadi Link Biru
   ========================================================== */
   ========================================================== */
(function() {
(function() {
     async function processTextToLinks($container) {
     async function transformToLinks() {
         var originalText = $container.text();
         var $container = $('#mip-auto-description');
         if (!originalText || $container.data('linked') === 'yes') return;
       
 
        // Cek apakah kontainer sudah ada isinya tapi belum diproses
        // Ambil kata-kata yang diawali huruf kapital (potensi Nama/Judul)
         if ($container.length && $container.text().trim() !== "" && $container.attr('data-linked') !== 'yes') {
        var potentialTitles = originalText.match(/[A-Z][a-z]+(?:\s[A-Z][a-z]+)*/g);
           
        if (!potentialTitles) return;
            var originalText = $container.text();
            // Ambil semua kata/frasa yang diawali huruf Kapital (Nama/Istilah penting)
            var matches = originalText.match(/[A-Z][a-z]+(?:\s[A-Z][a-z]+)*/g);
           
            if (!matches) return;
            var uniqueMatches = [...new Set(matches)];
            var linkedText = originalText;


        // Hilangkan duplikat
            for (var title of uniqueMatches) {
        var uniqueTitles = [...new Set(potentialTitles)];
                try {
        var linkedText = originalText;
                    // Tanya ke API Mippedia Data: "Halaman ini ada gak?"
                    var res = await $.getJSON(mw.util.wikiScript('api'), {
                        action: 'query',
                        titles: title,
                        format: 'json'
                    });


        for (var title of uniqueTitles) {
                    // Jika ID halamannya bukan -1 (artinya ADA di Mippedia Data)
            try {
                    if (!res.query.pages["-1"]) {
                // Cek apakah judul ini ada halamannya di Mippedia Data
                        // Bungkus jadi link biru Mippedia Data
                var response = await $.getJSON(mw.util.wikiScript('api'), {
                        var regex = new RegExp('\\b' + title + '\\b', 'g');
                    action: 'query',
                        linkedText = linkedText.replace(regex, '<a href="/wiki/' + title.replace(/ /g, '_') + '" style="color: #0645ad; text-decoration: none;" title="' + title + '">' + title + '</a>');
                    titles: title,
                     }
                     format: 'json'
                 } catch (e) { }
                 });
            }


                if (!response.query.pages["-1"]) {
            // Suntik balik teks yang sudah jadi link
                    // Jika ada, ganti teks biasa jadi link biru (HTML)
            $container.html(linkedText);
                    var regex = new RegExp('\\b' + title + '\\b', 'g');
            $container.attr('data-linked', 'yes'); // Tandai biar gak looping
                    linkedText = linkedText.replace(regex, '<a href="/wiki/' + title.replace(/ /g, '_') + '" title="' + title + '">' + title + '</a>');
                }
            } catch (e) { console.error("Linker Error:", e); }
         }
         }
    }


        $container.html(linkedText);
    // Pakai Observer karena deskripsi lo munculnya "telat" (nunggu API Mippedia Artikel)
         $container.data('linked', 'yes'); // Tandai agar tidak loop terus
    var linkerObserver = new MutationObserver(function(mutations) {
     }
         transformToLinks();
     });


     // Karena deskripsi lo muncul otomatis (AJAX), kita pake Observer
     $(document).ready(function() {
    var observer = new MutationObserver(function(mutations) {
         var target = document.body;
        // Cari container deskripsi di dalam Infobox otomatis lo
        linkerObserver.observe(target, { childList: true, subtree: true });
        // Sesuaikan selector di bawah ini dengan class tempat deskripsi itu muncul
         var $descBox = $('.mw-parser-output .infobox, .mippedia-description-box');  
          
          
         if ($descBox.length) {
         // Jalankan sekali lagi pas awal buat jaga-jaga
            processTextToLinks($descBox);
        setTimeout(transformToLinks, 2000);
        }
     });
     });
    observer.observe(document.body, { childList: true, subtree: true });
})();
})();