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 849: Baris 849:
         var summaryParts = [];
         var summaryParts = [];


         // --- 1. GLOBAL ENGINE: MAINTENANCE (FITUR ASLI - JANGAN DIHAPUS) ---
         // --- 1. GLOBAL ENGINE: MAINTENANCE (FITUR ASLI) ---
         if ((!page.categories || page.categories.length === 0) && !/\{\{Butuh Kategori/i.test(content) && !/\[\[Kategori:/i.test(content)) {
         if ((!page.categories || page.categories.length === 0) && !/\{\{Butuh Kategori/i.test(content) && !/\[\[Kategori:/i.test(content)) {
             content = '{{Butuh Kategori|date=April 2026}}\n' + content;
             content = '{{Butuh Kategori|date=April 2026}}\n' + content;
             summaryParts.push('+Cat');
             summaryParts.push('+Cat');
         }
         }
       
        // --- UPGRADE ENGINE: DETEKSI SMART STUB PARAMETER & POSISI BAWAH ---
         var wordCount = rawContent.trim().split(/\s+/).length;
         var wordCount = rawContent.trim().split(/\s+/).length;
         if (wordCount < 200 && !/\{\{Artikel Rintisan/i.test(content)) {
         if (wordCount < 200 && !/\{\{Stub/i.test(content) && !/\{\{Artikel Rintisan/i.test(content)) {
             content = '{{Artikel Rintisan}}\n' + content;
             var lowerContent = rawContent.toLowerCase();
             summaryParts.push('+Stub');
            var stubParam = '';
 
            // Mapping Otak Pintar berdasarkan Kata Kunci Semantik (19 Parameter)
            if (/\b(lahir|wafat|tokoh|pria|wanita|biografi|sosok|pahlawan|presiden|menteri)\b/i.test(lowerContent)) {
                stubParam = 'biografi tokoh';
            } else if (/\b(musik|lagu|album|konser|penyanyi|band|vokal|gitar|single|nada)\b/i.test(lowerContent)) {
                stubParam = 'musik';
            } else if (/\b(geografi|negara|kota|desa|kecamatan|kabupaten|provinsi|pulau|gunung|sungai)\b/i.test(lowerContent)) {
                stubParam = 'geografi';
            } else if (/\b(teknologi|komputer|aplikasi|software|hardware|internet|digital|android|sistem|gawai)\b/i.test(lowerContent)) {
                stubParam = 'teknologi';
            } else if (/\b(sejarah|kerajaan|perang|prasasti|arkeo|masa lalu|kuno|dinasti|peristiwa|abad)\b/i.test(lowerContent)) {
                stubParam = 'sejarah';
            } else if (/\b(olahraga|atlet|sepak|bola|stadion|juara|klub|tanding|liga|olimpiade)\b/i.test(lowerContent)) {
                stubParam = 'olahraga';
            } else if (/\b(film|bioskop|aktor|aktris|sutradara|drama|sinema|serial|movie|tayang)\b/i.test(lowerContent)) {
                stubParam = 'film';
            } else if (/\b(perusahaan|pt|perbangkan|bisnis|saham|industri|korporasi|merek|ceo|didirikan)\b/i.test(lowerContent)) {
                stubParam = 'perusahaan';
            } else if (/\b(ilmu pengetahuan|sains|kimia|fisika|matematika|biologi|riset|laboratorium|teori|molekul)\b/i.test(lowerContent)) {
                stubParam = 'ilmu pengetahuan';
            } else if (/\b(seni|lukisan|patung|pameran|budaya|teater|rupa|desain|kriya|estetika)\b/i.test(lowerContent)) {
                stubParam = 'seni';
            } else if (/\b(politik|partai|pemilu|dpr|pemerintah|kebijakan|demokrasi|suara|kampanye|negara)\b/i.test(lowerContent)) {
                stubParam = 'politik';
            } else if (/\b(militer|tni|tentara|perang|senjata|pasukan|jenderal|alutsista|batalyon|operasi)\b/i.test(lowerContent)) {
                stubParam = 'militer';
            } else if (/\b(transportasi|kereta|pesawat|mobil|kapal|bandara|stasiun|pelabuhan|rute|kendaraan)\b/i.test(lowerContent)) {
                stubParam = 'transportasi';
            } else if (/\b(literatur|buku|novel|puisi|sastra|penulis|penerbit|komik|cerpen|fiksi)\b/i.test(lowerContent)) {
                stubParam = 'literatur';
            } else if (/\b(makanan|kuliner|resep|masakan|minuman|rasa|koki|restoran|hidangan|bahan)\b/i.test(lowerContent)) {
                stubParam = 'makanan';
            } else if (/\b(kesehatan|medis|dokter|penyakit|obat|rumah sakit|klinik|terapi|virus|gejala)\b/i.test(lowerContent)) {
                stubParam = 'kesehatan';
            } else if (/\b(astronomi|bintang|planet|galaksi|teleskop|antariksa|nasa|komet|orbit|luar angkasa)\b/i.test(lowerContent)) {
                stubParam = 'astronomi';
            } else if (/\b(agama|ibadah|kitab|tuhan|nabi|gereja|masjid|pura|vihara|iman)\b/i.test(lowerContent)) {
                stubParam = 'agama';
            } else if (/\b(bahasa|dialek|aksara|kamus|linguistik|kata|kalimat|suku|ucapan|fonem)\b/i.test(lowerContent)) {
                stubParam = 'bahasa';
            } else if (/\b(hukum|undang|pasal|pengadilan|hakim|jaksa|pengacara|pidana|perdata|legal)\b/i.test(lowerContent)) {
                stubParam = 'hukum';
            }
 
            // Gabungkan teks template Stub pilihan di baris paling bawah artikel
            var stubTag = stubParam ? '{{Stub|' + stubParam + '}}' : '{{Stub}}';
            content = content.trim() + '\n\n' + stubTag;
             summaryParts.push('+SmartStub(' + (stubParam || 'umum') + ')');
         }
         }
         var promoList = ['memang hebat', 'terpercaya sekali', 'terbaik di dunia', 'hubungi nomor kami', 'harga murah', 'kualitas terjamin'];
         var promoList = ['memang hebat', 'terpercaya sekali', 'terbaik di dunia', 'hubungi nomor kami', 'harga murah', 'kualitas terjamin'];
         if (promoList.some(p => rawContent.toLowerCase().indexOf(p) !== -1) && !/\{\{Hapus/i.test(content)) {
         if (promoList.some(p => rawContent.toLowerCase().indexOf(p) !== -1) && !/\{\{Hapus/i.test(content)) {
Baris 866: Baris 917:


         // --- 2. SUPER INTELLIGENCE RELATED (UPGRADE OTAK V12) ---
         // --- 2. SUPER INTELLIGENCE RELATED (UPGRADE OTAK V12) ---
        // Cek jumlah related saat ini
         var currentRelatedMatch = content.match(/\{\{#related:.*?\}\}/g) || [];
         var currentRelatedMatch = content.match(/\{\{#related:.*?\}\}/g) || [];
          
          
        // Jika kurang dari 3, kita jalankan otak pencarian canggih
         if (currentRelatedMatch.length < 3) {
         if (currentRelatedMatch.length < 3) {
            // Hapus yang lama dulu agar tidak ada duplikat atau "pake yang bekas"
             content = content.replace(/\n*\{\{#related:.*?\}\}/g, '');
             content = content.replace(/\n*\{\{#related:.*?\}\}/g, '');


            // Langkah A: Ambil kandidat dari Search Engine (Ranking Skor)
             api.get({
             api.get({
                 action: 'query',
                 action: 'query',
                 list: 'search',
                 list: 'search',
                 srsearch: pageTitle, // Gunakan judul sebagai basis pencarian semantic
                 srsearch: pageTitle,
                 srlimit: 15,
                 srlimit: 15,
                 srprop: ''
                 srprop: ''
Baris 884: Baris 931:
                 var candidates = {};
                 var candidates = {};


                // Masukkan hasil pencarian ke pool skor
                 if (searchRes.query && searchRes.query.search) {
                 if (searchRes.query && searchRes.query.search) {
                     searchRes.query.search.forEach(function(item, index) {
                     searchRes.query.search.forEach(function(item, index) {
                         if (item.title === pageTitle) return;
                         if (item.title === pageTitle) return;
                         candidates[item.title] = (15 - index); // Skor berdasarkan urutan relevansi
                         candidates[item.title] = (15 - index);
                     });
                     });
                 }
                 }


                // Langkah B: Tambah skor jika artikel ada di daftar Link Internal
                 if (page.links) {
                 if (page.links) {
                     page.links.forEach(function(link) {
                     page.links.forEach(function(link) {
                         if (link.title === pageTitle) return;
                         if (link.title === pageTitle) return;
                         candidates[link.title] = (candidates[link.title] || 0) + 5; // Bonus skor link
                         candidates[link.title] = (candidates[link.title] || 0) + 5;
                     });
                     });
                 }
                 }


                // Langkah C: Urutkan berdasarkan skor tertinggi (yang paling nyambung)
                 var sortedTitles = Object.keys(candidates).sort(function(a, b) {
                 var sortedTitles = Object.keys(candidates).sort(function(a, b) {
                     return candidates[b] - candidates[a];
                     return candidates[b] - candidates[a];
                 });
                 });


                // Ambil TOP 3
                 var finalRelated = sortedTitles.filter(t => t.indexOf(':') === -1).slice(0, 3);
                 var finalRelated = sortedTitles.filter(t => t.indexOf(':') === -1).slice(0, 3);


Baris 924: Baris 967:
             if (isPatroli) {
             if (isPatroli) {
                 var placeholders = [];
                 var placeholders = [];
                // Lindungi Brankas: Template, Header, Kategori, Ref, dan Kalimat Pembuka
                 content = content.replace(/(\{\{[\s\S]*?\}\}|==+.*?==+|\[\[Kategori:.*?\]\]|<ref[\s\S]*?<\/ref>|^.*?adalah)/gi, function(match) {
                 content = content.replace(/(\{\{[\s\S]*?\}\}|==+.*?==+|\[\[Kategori:.*?\]\]|<ref[\s\S]*?<\/ref>|^.*?adalah)/gi, function(match) {
                     placeholders.push(match);
                     placeholders.push(match);
Baris 930: Baris 972:
                 });
                 });


                // Proses Auto-Link (Wajib ambil daftar AllPages dulu)
                 api.get({ action: 'query', list: 'allpages', apnamespace: 0, aplimit: 'max' }).done(function(apData) {
                 api.get({ action: 'query', list: 'allpages', apnamespace: 0, aplimit: 'max' }).done(function(apData) {
                     var allTitles = apData.query.allpages.map(p => p.title);
                     var allTitles = apData.query.allpages.map(p => p.title);
Baris 954: Baris 995:
                     content = tokens.join('');
                     content = tokens.join('');
                      
                      
                    // Kembalikan dari Brankas
                     content = content.replace(/___MIP_SKIP_(\d+)___/g, function(match, id) { return placeholders[id]; });
                     content = content.replace(/___MIP_SKIP_(\d+)___/g, function(match, id) { return placeholders[id]; });


                    // Bersihkan Link Merah
                     content = content.replace(/\[\[([^|\]:]+)\]\]/g, function(match, p1) {
                     content = content.replace(/\[\[([^|\]:]+)\]\]/g, function(match, p1) {
                         return lowerTitles.includes(p1.toLowerCase()) ? match : p1;
                         return lowerTitles.includes(p1.toLowerCase()) ? match : p1;