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 549: Baris 549:
             'asal wilayah', 'daerah asal', 'negara sumber', 'kawasan',
             'asal wilayah', 'daerah asal', 'negara sumber', 'kawasan',
             // Sejarah & Bangunan
             // Sejarah & Bangunan
             'situs', 'letak', 'posisi', 'titik temu', 'orbit'
             'letak', 'posisi', 'titik temu', 'orbit'
         ];
         ];


Baris 613: Baris 613:


/* ==========================================================
/* ==========================================================
   MIPPEDIA DATA - ENTITY HISTORY TIMELINE
   🔗 MIPPEDIA DATA - AUTO API RELATION LINKER
   Otomatis menyusun kronologi berdasarkan tahun di tabel data
   Otomatis membuat link berdasarkan database judul halaman asli
   ========================================================== */
   ========================================================== */
(function() {
(function() {
     $(document).ready(function() {
     $(document).ready(function() {
         var events = [];
         var $content = $('#mw-content-text p'); // Target paragraf
          
         var currentTitle = mw.config.get('wgPageName').replace(/_/g, ' ');
         // Ambil data dari tabel (Infobox atau Wikitable)
        var api = new mw.Api();
         $('.infobox tr, .wikitable tr').each(function() {
 
             var label = $(this).find('th').text().trim();
         // 1. Ambil daftar semua judul halaman dari API
             var value = $(this).find('td').text().trim();
         api.get({
           
            action: 'query',
             // Cari angka tahun (19xx atau 20xx)
            list: 'allpages',
             var yearMatch = value.match(/\b(19|20)\d{2}\b/);
            aplimit: '500', // Ambil sampai 500 judul halaman
             if (yearMatch && label) {
            format: 'json'
                 events.push({
        }).done(function(data) {
                    year: yearMatch[0],
             var pages = data.query.allpages;
                    desc: label.replace(':', '') + ': ' + value
             var currentContentHtml = $content.html();
                });
 
            }
             // 2. Sorting judul dari yang terpanjang (biar gak bentrok)
        });
             pages.sort(function(a, b) { return b.title.length - a.title.length; });
 
             pages.forEach(function(page) {
                 var targetTitle = page.title;


        // Urutkan tahun dari yang terkecil
                // Jangan nge-link ke diri sendiri & minimal 3 karakter biar gak typo
        events.sort((a, b) => a.year - b.year);
                if (targetTitle !== currentTitle && targetTitle.length > 3) {
                   
                    // Regex pintar: Cari kata yang pas, bukan di dalam kata lain
                    // Misal: Cari "Mippedia", jangan sampai kena "MippediaCommunity"
                    var regex = new RegExp('\\b(' + targetTitle.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + ')\\b', 'gi');


        if (events.length > 0) {
                    $content.each(function() {
            var $timelineBox = $('<div>').css({
                        var $this = $(this);
                'margin-top': '30px',
                        var html = $this.html();
                'padding': '20px',
                'background': '#fdfdfd',
                'border': '1px solid #eee',
                'border-radius': '12px'
            });


            $timelineBox.append('<h3 style="margin-top:0; font-size:1.1em; color:#333; border-bottom:2px solid #6a5acd; display:inline-block;">⏳ Garis Waktu Entitas</h3>');
                        // Cek apakah kata itu sudah ada di dalam tag <a> (biar gak double link)
           
                        // Kita pakai trik: ganti hanya jika tidak berada di dalam tanda > <
            var $list = $('<div style="margin-top:15px; border-left: 2px solid #6a5acd; padding-left: 20px; margin-left: 10px;"></div>');
                        if (html.indexOf('href') === -1 || !new RegExp('<a[^>]*>.*' + targetTitle + '.*<\/a>', 'i').test(html)) {
           
                            var newHtml = html.replace(regex, function(match) {
            events.forEach(function(ev) {
                                return '<a href="/wiki/' + encodeURIComponent(targetTitle.replace(/ /g, '_')) + '" class="mip-auto-link">' + match + '</a>';
                var $item = $('<div style="position:relative; margin-bottom:15px;"></div>');
                            });
                $item.append('<div style="position:absolute; left:-27px; top:5px; width:12px; height:12px; background:#6a5acd; border-radius:50%; border:3px solid #fff;"></div>');
                            $this.html(newHtml);
                $item.append('<strong style="color:#6a5acd; display:block; font-size:1em;">' + ev.year + '</strong>');
                        }
                $item.append('<span style="font-size:0.9em; color:#555;">' + ev.desc + '</span>');
                    });
                 $list.append($item);
                 }
             });
             });


             $timelineBox.append($list);
            // 3. Tambahin CSS dikit biar tampilannya pro
           
             $('<style>')
            // Masukkan setelah bagian deskripsi atau di akhir konten
                .prop('type', 'text/css')
            $('#mw-content-text').append($timelineBox);
                .html('.mip-auto-link { color: #6a5acd; font-weight: 500; border-bottom: 1px dotted #6a5acd; text-decoration: none; transition: 0.2s; } .mip-auto-link:hover { background: rgba(106, 92, 205, 0.1); border-bottom: 1px solid #6a5acd; }')
         }
                .appendTo('head');
         });
     });
     });
})();
})();