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 49: Baris 49:
         }
         }


         function buildSmartLinks(currentId) {
        // --- 🧠 1. SMART LINKS PORTAL BERBASIS INTERWIKI VALID ---
         function buildSmartLinks(currentId, validatedEnTitle) {
             $portalLinks.empty();
             $portalLinks.empty();
             var validLinks = [];
             var validLinks = [];
           
             var checkRequests = projects.filter(p => p.id !== currentId).map(function(p) {
             var checkRequests = projects.filter(p => p.id !== currentId).map(function(p) {
                 return $.ajax({ url: p.url, data: { action: 'query', titles: pageTitle, format: 'json', origin: '*' }, dataType: 'json' })
                // Jika target ke Mippedia Inggris, gunakan judul interwiki yang sudah divalidasi sistem
                     .then(function(data) { if (data.query.pages["-1"] === undefined) { validLinks.push('<a href="' + p.base + encodeURIComponent(pageTitle) + '" target="_blank" style="color: #6a5acd; text-decoration: underline; font-weight: bold;">' + p.label + '</a>'); } });
                var targetTitle = (p.id === 'en' && validatedEnTitle) ? validatedEnTitle : pageTitle;
               
                // Proteksi: Jika ke Wiki EN tapi link interwikinya gak ada, skip check agar tidak memunculkan link rusak
                if (p.id === 'en' && !validatedEnTitle) return $.Deferred().resolve();
 
                 return $.ajax({ url: p.url, data: { action: 'query', titles: targetTitle, format: 'json', origin: '*' }, dataType: 'json' })
                     .then(function(data) {  
                        if (data.query.pages["-1"] === undefined) {  
                            validLinks.push('<a href="' + p.base + encodeURIComponent(targetTitle) + '" target="_blank" style="color: #6a5acd; text-decoration: underline; font-weight: bold;">' + p.label + '</a>');  
                        }  
                    });
             });
             });
             $.when.apply($, checkRequests).done(function() {
             $.when.apply($, checkRequests).done(function() {
                 if (validLinks.length > 0) { $portalLinks.html(validLinks.join(' <span style="color:#ccc; margin: 0 5px;">•</span> ')); $projectPortal.fadeIn(); }
                 if (validLinks.length > 0) { $portalLinks.html(validLinks.join(' <span style="color:#ccc; margin: 0 5px;">•</span> ')); $projectPortal.fadeIn(); }
Baris 61: Baris 74:
         }
         }


         // --- SISTEM PRIORITAS BARU (MIPPEDIA ID > EN > CONCISE) ---
         // --- SISTEM PRIORITAS (MIPPEDIA ID > EN > CONCISE) ---
         var cached = JSON.parse(localStorage.getItem(cacheKey) || "{}");
         var cached = JSON.parse(localStorage.getItem(cacheKey) || "{}");
        var globalEnTitle = cached.enTitle || ""; // Menyimpan judul interwiki global


         function init() {
         function init() {
            // Kita cek ke ID dulu (Prioritas 1) untuk dapet timestamp & thumbnail
             var pPrimary = projects[0];  
             var pPrimary = projects[0];  
             $.ajax({
             $.ajax({
                 url: pPrimary.url,
                 url: pPrimary.url,
                 data: { action: 'query', prop: 'revisions|pageimages', rvprop: 'timestamp', piprop: 'thumbnail', pithumbsize: 150, titles: pageTitle, format: 'json', origin: '*' },
                 data: { action: 'query', prop: 'revisions|pageimages|langlinks', lllang: 'en', rvprop: 'timestamp', piprop: 'thumbnail', pithumbsize: 150, titles: pageTitle, format: 'json', origin: '*' },
                 dataType: 'json',
                 dataType: 'json',
                 success: function(res) {
                 success: function(res) {
Baris 75: Baris 88:
                     var latestTS = (id != "-1") ? pg[id].revisions[0].timestamp : "0";
                     var latestTS = (id != "-1") ? pg[id].revisions[0].timestamp : "0";
                     var thumbUrl = (id != "-1" && pg[id].thumbnail) ? pg[id].thumbnail.source : "";
                     var thumbUrl = (id != "-1" && pg[id].thumbnail) ? pg[id].thumbnail.source : "";
                   
                    // Cek & simpan judul interwiki Inggris dari Mippedia ID jika ada
                    if (id != "-1" && pg[id].langlinks && pg[id].langlinks[0]) {
                        globalEnTitle = pg[id].langlinks[0]['*'];
                    }


                     if (cached.content && cached.ts === latestTS && latestTS !== "0") {
                     if (cached.content && cached.ts === latestTS && latestTS !== "0") {
                         renderAll(cached.p, cached.content, cached.isTrans, cached.orig, cached.img);
                         renderAll(cached.p, cached.content, cached.isTrans, cached.orig, cached.img, cached.customUrl, cached.enTitle);
                     } else {  
                     } else {  
                        // Jika cache basi atau gak ada, jalankan antrean prioritas
                         fetchPriorityData(0, latestTS, thumbUrl);  
                         fetchPriorityData(0, latestTS, thumbUrl);  
                     }
                     }
                 },
                 },
                 error: function() { if (cached.content) renderAll(cached.p, cached.content, cached.isTrans, cached.orig, cached.img); }
                 error: function() { if (cached.content) renderAll(cached.p, cached.content, cached.isTrans, cached.orig, cached.img, cached.customUrl, cached.enTitle); }
             });
             });
         }
         }


         // FUNGSI INI ADALAH INTI DARI PERUBAHAN PRIORITAS
         // --- 🧠 2. ANTRIAN PRIORITAS DENGAN VALIDASI INTERWIKI DARI ID & CONCISE ---
         function fetchPriorityData(index, newTS, img) {
         function fetchPriorityData(index, newTS, img) {
             if (index >= projects.length) return; // Stop kalau sudah lewat semua proyek
             if (index >= projects.length) return;


             var p = projects[index];
             var p = projects[index];
             $.ajax({
 
                 url: p.url,
             if (p.id === 'en') {
                data: { action: 'query', prop: 'extracts', exintro: 1, explaintext: 1, titles: pageTitle, format: 'json', origin: '*' },
                // JIKA BELUM DAPAT INTERWIKI DARI WIKI ID: Kita coba cari interwiki dari Mippedia Concise sebelum menembak Wiki EN
                dataType: 'json',
                if (!globalEnTitle) {
                success: function(data) {
                    $.ajax({
                    var pages = data.query.pages, pageId = Object.keys(pages)[0];
                        url: 'https://concise.mippedia.org/api.php',
                   
                        data: { action: 'query', prop: 'langlinks', lllang: 'en', titles: pageTitle, format: 'json', origin: '*' },
                    // Jika artikel ditemukan dan ada extract-nya
                        dataType: 'json',
                    if (pageId != "-1" && pages[pageId].extract) {
                        async: false, // Force check sejenak demi keakuratan data
                        var extract = cleanExtract(pages[pageId].extract);
                        success: function(cRes) {
                          
                            var cPg = cRes.query.pages, cId = Object.keys(cPg)[0];
                         if (p.id === 'en') {
                            if (cId != "-1" && cPg[cId].langlinks && cPg[cId].langlinks[0]) {
                            // Proses Translate jika dapetnya dari EN
                                globalEnTitle = cPg[cId].langlinks[0]['*'];
                            $.ajax({ url: "https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=id&dt=t&q=" + encodeURIComponent(extract), success: function(res) {  
                            }
                                var trans = ""; res[0].forEach(s => { if (s[0]) trans += s[0]; });
                        }
                                finalize(p, trans, true, extract, newTS, img);
                    });
                            }});
                }
                         } else {  
 
                             // Langsung render jika dapet dari ID atau Concise
                // Jika interwiki Inggris ditemukan di salah satu dari kedua wiki lokal tersebut
                            finalize(p, extract, false, "", newTS, img);  
                 if (globalEnTitle) {
                    $.ajax({
                        url: p.url,
                        data: { action: 'query', prop: 'extracts', exintro: 1, explaintext: 1, titles: globalEnTitle, format: 'json', origin: '*' },
                        dataType: 'json',
                        success: function(data) {
                            var pages = data.query.pages, pageId = Object.keys(pages)[0];
                            if (pageId != "-1" && pages[pageId].extract) {
                                var extract = cleanExtract(pages[pageId].extract);
                                finalize(p, extract, false, "", newTS, img, p.base + encodeURIComponent(globalEnTitle), globalEnTitle);
                            } else {
                                fetchPriorityData(index + 1, newTS, img);
                            }
                         },
                         error: function() { fetchPriorityData(index + 1, newTS, img); }
                    });
                } else {
                    // Gak ada interwiki resmi terdaftar, langsung skip Wiki EN demi keamanan tautan
                    fetchPriorityData(index + 1, newTS, img);
                }
            } else {
                // Untuk ID dan Concise jalankan pencarian langsung (Normal)
                $.ajax({
                    url: p.url,
                    data: { action: 'query', prop: 'extracts', exintro: 1, explaintext: 1, titles: pageTitle, format: 'json', origin: '*' },
                    dataType: 'json',
                    success: function(data) {
                        var pages = data.query.pages, pageId = Object.keys(pages)[0];
                        if (pageId != "-1" && pages[pageId].extract) {
                            var extract = cleanExtract(pages[pageId].extract);
                            finalize(p, extract, false, "", newTS, img, p.base + encodeURIComponent(pageTitle), globalEnTitle);  
                         } else {
                             fetchPriorityData(index + 1, newTS, img);
                         }
                         }
                    } else {
                        // JIKA TIDAK ADA: Lanjut ke proyek berikutnya sesuai urutan (ID -> EN -> CONCISE)
                        fetchPriorityData(index + 1, newTS, img);
                     }
                     }
                 }
                 });
             });
             }
         }
         }


         function finalize(p, c, t, o, ts, img) {
         function finalize(p, c, t, o, ts, img, customUrl, enTitle) {
             localStorage.setItem(cacheKey, JSON.stringify({p:p, content:c, isTrans:t, orig:o, ts:ts, img:img}));
             localStorage.setItem(cacheKey, JSON.stringify({p:p, content:c, isTrans:t, orig:o, ts:ts, img:img, customUrl: customUrl, enTitle: enTitle}));
             renderAll(p, c, t, o, img);
             renderAll(p, c, t, o, img, customUrl, enTitle);
         }
         }


         function renderAll(p, currentText, isTranslated, originalText, img) {
         function renderAll(p, currentText, isTranslated, originalText, img, customUrl, enTitle) {
             var processedText = applyAutoBold(applyDynamicContext(currentText));
             var processedText = applyAutoBold(applyDynamicContext(currentText));
             var thumbHtml = img ? '<div style="float: right; margin-left: 15px; margin-bottom: 10px; border: 1px solid #ddd; padding: 3px; background: #fff; border-radius: 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"><img src="'+img+'" style="max-width: 100px; display: block; height: auto;"></div>' : '';
             var thumbHtml = img ? '<div style="float: right; margin-left: 15px; margin-bottom: 10px; border: 1px solid #ddd; padding: 3px; background: #fff; border-radius: 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"><img src="'+img+'" style="max-width: 100px; display: block; height: auto;"></div>' : '';
Baris 133: Baris 179:
             $descBox.show().html(thumbHtml + applySummary(processedText) + '<div style="clear:both;"></div>');
             $descBox.show().html(thumbHtml + applySummary(processedText) + '<div style="clear:both;"></div>');
              
              
             var footer = '<div style="font-size: 0.9em; color: #777;">Sumber : <a href="' + p.base + encodeURIComponent(pageTitle) + '" target="_blank" style="color: #6a5acd; font-weight: bold; text-decoration: none;">' + p.name + '.</a>';
            var targetLink = customUrl ? customUrl : p.base + encodeURIComponent(pageTitle);
             var footer = '<div style="font-size: 0.9em; color: #777;">Sumber : <a href="' + targetLink + '" target="_blank" style="color: #6a5acd; font-weight: bold; text-decoration: none;">' + p.name + '.</a>';
             if (isTranslated) { footer += '<br><span style="font-size: 0.85em; font-style: italic;">(Diterjemahkan secara otomatis)</span> <span id="mip-toggle-orig" style="color: #6a5acd; cursor: pointer; text-decoration: underline; margin-left: 5px;">Tampilkan versi asli</span>'; }
             if (isTranslated) { footer += '<br><span style="font-size: 0.85em; font-style: italic;">(Diterjemahkan secara otomatis)</span> <span id="mip-toggle-orig" style="color: #6a5acd; cursor: pointer; text-decoration: underline; margin-left: 5px;">Tampilkan versi asli</span>'; }
             $sourceInfo.show().html(footer);
             $sourceInfo.show().html(footer);
              
              
             buildSmartLinks(p.id);
            // Kirim judul interwiki terverifikasi ke portal links
             buildSmartLinks(p.id, enTitle);
              
              
             // Handlers (TETAP UTUH)
             // Handlers (TETAP UTUH)