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: | // 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( | 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 | // --- 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() { | ||
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 { | ||
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); } | ||
}); | }); | ||
} | } | ||
// | // --- 🧠 2. ANTRIAN PRIORITAS DENGAN VALIDASI INTERWIKI DARI ID & CONCISE --- | ||
function fetchPriorityData(index, newTS, img) { | function fetchPriorityData(index, newTS, img) { | ||
if (index >= projects.length) return; | if (index >= projects.length) return; | ||
var p = projects[index]; | var p = projects[index]; | ||
$.ajax({ | |||
url: p.url, | if (p.id === 'en') { | ||
// JIKA BELUM DAPAT INTERWIKI DARI WIKI ID: Kita coba cari interwiki dari Mippedia Concise sebelum menembak Wiki EN | |||
if (!globalEnTitle) { | |||
$.ajax({ | |||
url: 'https://concise.mippedia.org/api.php', | |||
data: { action: 'query', prop: 'langlinks', lllang: 'en', titles: pageTitle, format: 'json', origin: '*' }, | |||
dataType: 'json', | |||
async: false, // Force check sejenak demi keakuratan data | |||
success: function(cRes) { | |||
var cPg = cRes.query.pages, cId = Object.keys(cPg)[0]; | |||
if (cId != "-1" && cPg[cId].langlinks && cPg[cId].langlinks[0]) { | |||
globalEnTitle = cPg[cId].langlinks[0]['*']; | |||
} | |||
} | |||
}); | |||
} | |||
} else { | |||
// Jika interwiki Inggris ditemukan di salah satu dari kedua wiki lokal tersebut | |||
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); | |||
} | } | ||
} | } | ||
} | }); | ||
} | } | ||
} | } | ||
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="' + | 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) | ||