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.165: Baris 1.165:


/* ==========================================================
/* ==========================================================
   🛡️ MIPPEDIA PATROLI - SMART NEURAL ENGINE (V3)
   🛡️ MIPPEDIA SYSTEM - ULTIMATE INTEGRATION
   Fitur: Auto-Link, Link Cleaner, & Sensible Typo Fixer
  1. Patroli Engine (User: Mippedia Patroli)
   2. Related Engine (All Users - New/Edit Article)
   ========================================================== */
   ========================================================== */
mw.hook('postEdit').add(function() {
mw.hook('postEdit').add(function() {
     var currentUser = mw.config.get('wgUserName');
     var currentUser = mw.config.get('wgUserName');
     if (!currentUser || currentUser.replace(/_/g, ' ') !== 'Mippedia Patroli') return;
     if (!currentUser) return;
     if (mw.config.get('wgNamespaceNumber') !== 0) return;
   
    var normalizedUser = currentUser.replace(/_/g, ' ');
    var isPatroli = (normalizedUser === 'Mippedia Patroli');
     var isMainNamespace = (mw.config.get('wgNamespaceNumber') === 0);
   
    if (!isMainNamespace) return;


     var api = new mw.Api();
     var api = new mw.Api();
     var pageTitle = mw.config.get('wgPageName');
     var pageTitle = mw.config.get('wgPageName').replace(/_/g, ' ');


     api.get({
     api.get({
Baris 1.195: Baris 1.201:
             var rawContent = page.revisions[0]['*'];
             var rawContent = page.revisions[0]['*'];
             var content = rawContent;
             var content = rawContent;
            var summary = [];


             // --- 1. CLEANER: COPOT LINK MERAH ---
             // --- BAGIAN 1: RELATED ARTICLES (UNTUK SEMUA AKUN) ---
             content = content.replace(/\[\[([^|\]]+)\]\]/g, function(match, p1) {
             if (content.indexOf('{{#related:') === -1) {
                 return lowerTitles.includes(p1.toLowerCase()) ? match : p1;
                 // Cari artikel yang punya kemiripan kata kunci dengan judul sekarang
            });
                var relatedCount = 0;
                var currentKeywords = pageTitle.split(' ');
                var foundRelated = [];


            // --- 2. THE BRAIN: PROSES KATA PER KATA ---
                for (var k = 0; k < allTitles.length; k++) {
            var tokens = content.split(/(\s+|\[\[|\]\])/);
                    var otherTitle = allTitles[k];
            var inLink = false;
                    if (otherTitle === pageTitle) continue;
                   
                    // Logika Pintar: Cek apakah ada kata yang sama di judul lain
                    var isRelated = currentKeywords.some(kw =>
                        kw.length > 3 && otherTitle.toLowerCase().indexOf(kw.toLowerCase()) !== -1
                    );


            for (var i = 0; i < tokens.length; i++) {
                    if (isRelated) {
                if (tokens[i] === '[[' ) { inLink = true; continue; }
                        foundRelated.push('{{#related: ' + otherTitle + '}}');
                if (tokens[i] === ']]' ) { inLink = false; continue; }
                        relatedCount++;
                 if (inLink || tokens[i].trim().length < 3) continue;
                    }
                    if (relatedCount >= 3) break;
                }
 
                 if (foundRelated.length > 0) {
                    content += '\n\n' + foundRelated.join('\n');
                    summary.push('Added related articles');
                }
            }


                 var word = tokens[i].replace(/[^\w]/g, '');
            // --- BAGIAN 2: FITUR KHUSUS MIPPEDIA PATROLI ---
                var lowerWord = word.toLowerCase();
            if (isPatroli) {
                // A. Bersihkan Link Merah
                 content = content.replace(/\[\[([^|\]]+)\]\]/g, function(match, p1) {
                    return lowerTitles.includes(p1.toLowerCase()) ? match : p1;
                });


                 // A. Kalau cocok persis judul artikel -> Langsung kasih [[ ]]
                 // B. Auto-Link (LOGIKA ANTI-JUDUL & ANTI-HEADER)
                 var exactIdx = lowerTitles.indexOf(lowerWord);
                var tokens = content.split(/(\n==+.*?==+\n|\s+|\[\[|\]\])/);
                if (exactIdx !== -1) {
                 var inLink = false;
                     tokens[i] = tokens[i].replace(word, '[[' + allTitles[exactIdx] + '|' + word + ']]');
 
                     continue;
                for (var i = 0; i < tokens.length; i++) {
                }
                    // Jangan sentuh Header (== Judul ==)
                     if (tokens[i].startsWith('\n==')) continue;
                    if (tokens[i] === '[[' ) { inLink = true; continue; }
                    if (tokens[i] === ']]' ) { inLink = false; continue; }
                     if (inLink || tokens[i].trim().length < 3) continue;
 
                    var wordMatch = tokens[i].match(/\b\w+\b/g);
                    if (!wordMatch) continue;


                // B. TYPO FIXER: Cari yang miriiiiip banget (Hanya beda 1 huruf)
                    wordMatch.forEach(function(word) {
                for (var j = 0; j < allTitles.length; j++) {
                        var lowerWord = word.toLowerCase();
                    var title = allTitles[j];
                        // JANGAN link kalau kata itu adalah Judul Halaman itu sendiri (biar gak tebel/jelek)
                    if (Math.abs(word.length - title.length) > 1) continue;
                        if (lowerWord === pageTitle.toLowerCase()) return;


                    var dist = levenshtein(lowerWord, title.toLowerCase());
                        var idx = lowerTitles.indexOf(lowerWord);
                    // Jarak 1 artinya cuma typo 1 huruf (msik -> musik). Ini "Masuk Akal".
                        if (idx !== -1) {
                    if (dist === 1) {
                            var titleOriginal = allTitles[idx];
                        tokens[i] = tokens[i].replace(word, '[[' + title + ']]');
                            var regex = new RegExp('\\b' + word + '\\b', 'g');
                        break;  
                            tokens[i] = tokens[i].replace(regex, '[[' + titleOriginal + '|' + word + ']]');
                     }
                        } else {
                            // C. Typo Fixer Masuk Akal (Jarak 1 huruf)
                            for (var j = 0; j < allTitles.length; j++) {
                                if (Math.abs(word.length - allTitles[j].length) === 1) {
                                    if (levenshtein(lowerWord, allTitles[j].toLowerCase()) === 1) {
                                        tokens[i] = tokens[i].replace(word, '[[' + allTitles[j] + ']]');
                                        break;
                                    }
                                }
                            }
                        }
                     });
                 }
                 }
            }
                content = tokens.join('');
            content = tokens.join('');


            // --- 3. CATEGORY WATCHDOG ---
                // D. Kategori Watchdog
            if ((!page.categories || page.categories.length === 0) && !/\{\{Tanpa kategori/i.test(content)) {
                if ((!page.categories || page.categories.length === 0) && !/\{\{Tanpa kategori/i.test(content)) {
                content = '{{Tanpa kategori|date=April 2026}}\n' + content;
                    content = '{{Tanpa kategori|date=April 2026}}\n' + content;
                    summary.push('Added category tag');
                }
             }
             }


             // --- FINISH ---
             // --- EKSEKUSI FINAL ---
             if (content !== rawContent) {
             if (content !== rawContent) {
                 api.postWithToken('edit', {
                 api.postWithToken('edit', {
Baris 1.246: Baris 1.291:
                     title: pageTitle,
                     title: pageTitle,
                     text: content,
                     text: content,
                     summary: 'Mippedia Patroli: Optimalisasi otomatis (Typo & Link)',
                     summary: 'Mippedia System: ' + summary.join(', '),
                     bot: true, markasbot: true
                     bot: true, markasbot: true
                 }).done(function() { location.reload(); });
                 }).done(function() { location.reload(); });