انتقل إلى المحتوى

ميدياويكي:Common.js: الفرق بين النسختين

من Dbspedia
لا ملخص تعديل
لا ملخص تعديل
سطر ١: سطر ١:
/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */
/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */


/* 1. جلب وتنسيق جدول المعرفات والأسماء السيمانتيكية (الأقنعة) محلياً وبشكل صارم */
// 1. معالجة وتنسيق صفحة المعرفات برمجياً بالاعتماد على النصوص الحية
$(document).ready(function() {
if (window.location.href.indexOf('%D8%A7%D9%84%D9%85%D8%B9%D8%B1%D9%81%D8%A7%D8%AA') !== -1 || document.title.indexOf('المعرفات') !== -1) {
    if (mw.config.get('wgPageName') === 'المعرفات') {
    window.addEventListener('DOMContentLoaded', function() {
         // تغيير رؤوس الأعمدة تلقائياً برمجياً لتطابق المسميات الجديدة
         // تغيير رؤوس الأعمدة فوراً لتطابق الترتيب الجديد
         var $table = $('#table-ids-mw');
         var table = document.getElementById('table-ids-mw');
         if ($table.length > 0) {
         if (table) {
             $table.find('th').eq(0).text('اسم الصفحة (page_id)');
             var ths = table.getElementsByTagName('th');
             $table.find('th').eq(1).text('اسم الصفحة (القناع)');
            if (ths.length >= 2) {
        }
                ths[0].textContent = 'اسم الصفحة (page_id)';
                ths[1].textContent = 'اسم الصفحة (القناع)';
             }
 
            // فحص خلية تلو الأخرى وتبديل القيم بناءً على الروابط
            var rows = table.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
            for (var i = 0; i < rows.length; i++) {
                var tds = rows[i].getElementsByTagName('td');
                if (tds.length >= 2) {
                    var link = tds[0].getElementsByTagName('a')[0];
                    if (link) {
                        var rawTitle = link.textContent || link.innerText;
                        var rawId = tds[1].textContent || tds[1].innerText;
 
                        // وضع اسم الصفحة البرمجي (Person:ID) في العمود الأيمن
                        if (rawTitle.indexOf('Person:') === -1 && !isNaN(rawId.trim())) {
                            link.textContent = 'Person:' + rawId.trim();
                        }


        // استعلام محلي شامل ومباشر عبر الـ API
                        // وضع اسم القناع النقي في العمود الأيسر باللون الأخضر المميز
        var askQuery = "[[معرف الشخص::+]] OR [[معرف_الشخص::+]]|?Display title of|limit=500";
                        var cleanMask = rawTitle.replace(/Person:/g, '').replace(/\s*\(.*?\)\s*/g, '').trim();
        var apiUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent(askQuery);
                        tds[1].textContent = cleanMask;
       
                        tds[1].style.color = '#27ae60';
        $.getJSON(apiUrl, function(data) {
                         tds[1].style.fontWeight = 'bold';
            var rowsHtml = '';
            var results = data.query ? data.query.results : null;
           
            if (results && Object.keys(results).length > 0) {
                $.each(results, function(title, pageData) {
                    if (title === 'المعرفات') return;
                   
                    var pageTitleId = title; // اسم الصفحة البرمجي (مثل Person:23)
                    var displayMask = '';
                   
                    // محاولة قراءة الحقل دلالياً
                    if (pageData.printouts && pageData.printouts["Display title of"] && pageData.printouts["Display title of"].length > 0) {
                         displayMask = pageData.printouts["Display title of"][0].fulltext || pageData.printouts["Display title of"][0];
                     }
                     }
                   
                 }
                    // تحصين الكود: إذا كان فارغاً نأخذ اسم العنوان وننظفه
                    if (!displayMask || !isNaN(displayMask) || displayMask.indexOf('Person:') !== -1) {
                        displayMask = title;
                    }
                   
                    // تنظيف كامل لاسم القناع
                    displayMask = displayMask.replace(/Person:/g, '').replace(/\s*\(.*?\)\s*/g, '').trim();
 
                    rowsHtml += '<tr>' +
                                '<td style="padding: 8px 12px; font-family: monospace; font-size: 14px; font-weight: bold;"><a href="/index.php?title=' + encodeURIComponent(title) + '" style="color: #2a4b7c;">' + pageTitleId + '</a></td>' +
                                '<td style="padding: 8px 12px; font-weight: bold; color: #27ae60;">' + displayMask + '</td>' +
                                '</tr>';
                 });
                $('#table-ids-mw tbody').html(rowsHtml);
                if ($.fn.tablesorter) { $("#table-ids-mw").tablesorter(); }
             }
             }
         });
         }
     }
     });
});
}


/* 2. محرك شجرة الأنساب التكراري المستقل والمحمي ضد التعليق */
// 2. محرك شجرة الأنساب التكراري المطور والمحمي ضد التعليق
$(document).ready(function() {
window.addEventListener('DOMContentLoaded', function() {
     if ($('.family-tree-api-render').length === 0) return;
     var containers = document.getElementsByClassName('family-tree-api-render');
    if (containers.length === 0) return;


     $('.family-tree-api-render').each(function() {
     for (var i = 0; i < containers.length; i++) {
        var $container = $(this);
        (function(container) {
        var rootId = parseInt($container.data('rootid'), 10);
            var rootId = parseInt(container.getAttribute('data-rootid'), 10);
        if (!rootId) return;
            if (!rootId) return;


        var maxGenerations = 12;
            var pageTitle = (document.getElementById('firstHeading') || document.querySelector('.firstHeading')).textContent.trim();
        var pageTitle = mw.config.get("wgPageName").replace(/_/g, " ");
            var apiUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent('[[معرف الأب::+]] OR [[معرف_الأب::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display title of|limit=500');


        var askQuery = "[[معرف الأب::+]] OR [[معرف_الأب::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display title of|limit=500";
            var xhr = new XMLHttpRequest();
        var apiUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent(askQuery);
            xhr.open('GET', apiUrl, true);
            xhr.onload = function() {
                if (xhr.status >= 200 && xhr.status < 400) {
                    var data = JSON.parse(xhr.responseText);
                    var results = (data && data.query && data.query.results) ? data.query.results : null;


        $.getJSON(apiUrl, function(data) {
                    if (results && Object.keys(results).length > 0) {
            var results = (data && data.query && data.query.results) ? data.query.results : null;
                        var rawNodes = [];


            if (results && Object.keys(results).length > 0) {
                        Object.keys(results).forEach(function(title) {
                var rawNodes = [];
                            var pageData = results[title];
                            var printouts = pageData.printouts || {};


                $.each(results, function(title, pageData) {
                            var cleanName = '';
                    var pageId = parseInt(pageData.pageid, 10);
                            if (printouts["Display title of"] && printouts["Display title of"].length > 0) {
                    var printouts = pageData.printouts || {};
                                cleanName = printouts["Display title of"][0].fulltext || printouts["Display title of"][0];
                   
                            }
                    var cleanName = '';
                            if (!cleanName || !isNaN(cleanName)) {
                    if (printouts["Display title of"] && printouts["Display title of"].length > 0) {
                                cleanName = title;
                        cleanName = printouts["Display title of"][0].fulltext || printouts["Display title of"][0];
                            }
                    }
                            cleanName = cleanName.replace(/Person:/g, '').replace(/\s*\(.*?\)\s*/g, '').trim();
                   
                    if (!cleanName || !isNaN(cleanName)) {
                        cleanName = title;
                    }
                    cleanName = cleanName.replace(/Person:/g, '').replace(/\s*\(.*?\)\s*/g, '').trim();


                    var currentIdAttr = printouts["معرف الشخص"] || printouts["معرف_الشخص"];
                            var currentIdAttr = printouts["معرف الشخص"] || printouts["معرف_الشخص"];
                    var currentId = (currentIdAttr && currentIdAttr.length > 0) ? parseInt(currentIdAttr[0].fulltext || currentIdAttr[0], 10) : pageId;
                            var currentId = (currentIdAttr && currentIdAttr.length > 0) ? parseInt(currentIdAttr[0].fulltext || currentIdAttr[0], 10) : parseInt(pageData.pageid, 10);


                    var fatherIdAttr = printouts["معرف الأب"] || printouts["معرف_الأب"];
                            var fatherIdAttr = printouts["معرف الأب"] || printouts["معرف_الأب"];
                    var fatherId = null;
                            var fatherId = null;
                    if (fatherIdAttr && fatherIdAttr.length > 0) {
                            if (fatherIdAttr && fatherIdAttr.length > 0) {
                        fatherId = parseInt(fatherIdAttr[0].fulltext || fatherIdAttr[0], 10);
                                fatherId = parseInt(fatherIdAttr[0].fulltext || fatherIdAttr[0], 10);
                    }
                            }


                    if (currentId && fatherId && !isNaN(fatherId)) {
                            if (currentId && fatherId && !isNaN(fatherId)) {
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });
                                rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });
                    }
                            }
                });
                        });


                function buildTreeHtml(currentParentId, depth) {
                        function buildTreeHtml(currentParentId, depth) {
                    if (depth > maxGenerations) return "";
                            if (depth > 12) return "";
                   
                            var children = rawNodes.filter(function(node) { return node.parentId === currentParentId; });
                    var children = rawNodes.filter(function(node) { return node.parentId === currentParentId; });
                            if (children.length === 0) return "";
                    if (children.length === 0) return "";


                    children.sort(function(a, b) { return a.title.localeCompare(b.title, 'ar'); });
                            children.sort(function(a, b) { return a.title.localeCompare(b.title, 'ar'); });


                    var html = "";
                            var html = "";
                    var indent = Array(depth + 1).join("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
                            var indent = Array(depth + 1).join("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");


                    children.forEach(function(child) {
                            children.forEach(function(child) {
                        html += "<br />" + indent + "←&nbsp;<a href='/index.php?title=" + encodeURIComponent(child.pageName) + "' style='color: #2a4b7c; font-weight: bold;'> " + child.title + "</a>";
                                html += "<br />" + indent + "←&nbsp;<a href='/index.php?title=" + encodeURIComponent(child.pageName) + "' style='color: #2a4b7c; font-weight: bold;'> " + child.title + "</a>";
                        html += buildTreeHtml(child.id, depth + 1);
                                html += buildTreeHtml(child.id, depth + 1);
                    });
                            });
                    return html;
                            return html;
                }
                        }


                var rootCleanTitle = pageTitle.replace(/Person:/g, '');
                        var rootCleanTitle = pageTitle.replace(/Person:/g, '');
                var childrenHtml = buildTreeHtml(rootId, 1);
                        var childrenHtml = buildTreeHtml(rootId, 1);
                var finalHtml = "• '''" + rootCleanTitle + "'''";
                        var finalHtml = "• '''" + rootCleanTitle + "'''";


                if (childrenHtml) {
                        if (childrenHtml) {
                    $container.html(finalHtml + childrenHtml);
                            container.innerHTML = finalHtml + childrenHtml;
                } else {
                        } else {
                    $container.html(finalHtml + "<br />&nbsp;&nbsp;←&nbsp;<span style='color:#666;'>لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.</span>");
                            container.innerHTML = finalHtml + "<br />&nbsp;&nbsp;←&nbsp;<span style='color:#666;'>لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.</span>";
                        }
                    } else {
                        container.innerHTML = "• '''" + pageTitle.replace(/Person:/g, '') + "'''<br />&nbsp;&nbsp;←&nbsp;<span style='color:#666;'>لا توجد فروع مسجلة حالياً في النظام المحلي.</span>";
                    }
                 }
                 }
             } else {
             };
                var rootCleanTitle = pageTitle.replace(/Person:/g, '');
            xhr.send();
                $container.html("• '''" + rootCleanTitle + "'''<br />&nbsp;&nbsp;←&nbsp;<span style='color:#666;'>لا توجد فروع مسجلة حالياً في النظام المحلي.</span>");
         })(containers[i]);
            }
     }
         }).fail(function() {
            var rootCleanTitle = pageTitle.replace(/Person:/g, '');
            $container.html("• '''" + rootCleanTitle + "'''<br />&nbsp;&nbsp;←&nbsp;<span style='color:red;'>❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.</span>");
        });
     });
});
});

مراجعة ٠٦:٥٩، ١٥ أكتوبر ٢٠٢٦

/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */

// 1. معالجة وتنسيق صفحة المعرفات برمجياً بالاعتماد على النصوص الحية
if (window.location.href.indexOf('%D8%A7%D9%84%D9%85%D8%B9%D8%B1%D9%81%D8%A7%D8%AA') !== -1 || document.title.indexOf('المعرفات') !== -1) {
    window.addEventListener('DOMContentLoaded', function() {
        // تغيير رؤوس الأعمدة فوراً لتطابق الترتيب الجديد
        var table = document.getElementById('table-ids-mw');
        if (table) {
            var ths = table.getElementsByTagName('th');
            if (ths.length >= 2) {
                ths[0].textContent = 'اسم الصفحة (page_id)';
                ths[1].textContent = 'اسم الصفحة (القناع)';
            }

            // فحص خلية تلو الأخرى وتبديل القيم بناءً على الروابط
            var rows = table.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
            for (var i = 0; i < rows.length; i++) {
                var tds = rows[i].getElementsByTagName('td');
                if (tds.length >= 2) {
                    var link = tds[0].getElementsByTagName('a')[0];
                    if (link) {
                        var rawTitle = link.textContent || link.innerText;
                        var rawId = tds[1].textContent || tds[1].innerText;

                        // وضع اسم الصفحة البرمجي (Person:ID) في العمود الأيمن
                        if (rawTitle.indexOf('Person:') === -1 && !isNaN(rawId.trim())) {
                            link.textContent = 'Person:' + rawId.trim();
                        }

                        // وضع اسم القناع النقي في العمود الأيسر باللون الأخضر المميز
                        var cleanMask = rawTitle.replace(/Person:/g, '').replace(/\s*\(.*?\)\s*/g, '').trim();
                        tds[1].textContent = cleanMask;
                        tds[1].style.color = '#27ae60';
                        tds[1].style.fontWeight = 'bold';
                    }
                }
            }
        }
    });
}

// 2. محرك شجرة الأنساب التكراري المطور والمحمي ضد التعليق
window.addEventListener('DOMContentLoaded', function() {
    var containers = document.getElementsByClassName('family-tree-api-render');
    if (containers.length === 0) return;

    for (var i = 0; i < containers.length; i++) {
        (function(container) {
            var rootId = parseInt(container.getAttribute('data-rootid'), 10);
            if (!rootId) return;

            var pageTitle = (document.getElementById('firstHeading') || document.querySelector('.firstHeading')).textContent.trim();
            var apiUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent('[[معرف الأب::+]] OR [[معرف_الأب::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display title of|limit=500');

            var xhr = new XMLHttpRequest();
            xhr.open('GET', apiUrl, true);
            xhr.onload = function() {
                if (xhr.status >= 200 && xhr.status < 400) {
                    var data = JSON.parse(xhr.responseText);
                    var results = (data && data.query && data.query.results) ? data.query.results : null;

                    if (results && Object.keys(results).length > 0) {
                        var rawNodes = [];

                        Object.keys(results).forEach(function(title) {
                            var pageData = results[title];
                            var printouts = pageData.printouts || {};

                            var cleanName = '';
                            if (printouts["Display title of"] && printouts["Display title of"].length > 0) {
                                cleanName = printouts["Display title of"][0].fulltext || printouts["Display title of"][0];
                            }
                            if (!cleanName || !isNaN(cleanName)) {
                                cleanName = title;
                            }
                            cleanName = cleanName.replace(/Person:/g, '').replace(/\s*\(.*?\)\s*/g, '').trim();

                            var currentIdAttr = printouts["معرف الشخص"] || printouts["معرف_الشخص"];
                            var currentId = (currentIdAttr && currentIdAttr.length > 0) ? parseInt(currentIdAttr[0].fulltext || currentIdAttr[0], 10) : parseInt(pageData.pageid, 10);

                            var fatherIdAttr = printouts["معرف الأب"] || printouts["معرف_الأب"];
                            var fatherId = null;
                            if (fatherIdAttr && fatherIdAttr.length > 0) {
                                fatherId = parseInt(fatherIdAttr[0].fulltext || fatherIdAttr[0], 10);
                            }

                            if (currentId && fatherId && !isNaN(fatherId)) {
                                rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });
                            }
                        });

                        function buildTreeHtml(currentParentId, depth) {
                            if (depth > 12) return "";
                            var children = rawNodes.filter(function(node) { return node.parentId === currentParentId; });
                            if (children.length === 0) return "";

                            children.sort(function(a, b) { return a.title.localeCompare(b.title, 'ar'); });

                            var html = "";
                            var indent = Array(depth + 1).join("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");

                            children.forEach(function(child) {
                                html += "<br />" + indent + "←&nbsp;<a href='/index.php?title=" + encodeURIComponent(child.pageName) + "' style='color: #2a4b7c; font-weight: bold;'> " + child.title + "</a>";
                                html += buildTreeHtml(child.id, depth + 1);
                            });
                            return html;
                        }

                        var rootCleanTitle = pageTitle.replace(/Person:/g, '');
                        var childrenHtml = buildTreeHtml(rootId, 1);
                        var finalHtml = "• '''" + rootCleanTitle + "'''";

                        if (childrenHtml) {
                            container.innerHTML = finalHtml + childrenHtml;
                        } else {
                            container.innerHTML = finalHtml + "<br />&nbsp;&nbsp;←&nbsp;<span style='color:#666;'>لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.</span>";
                        }
                    } else {
                        container.innerHTML = "• '''" + pageTitle.replace(/Person:/g, '') + "'''<br />&nbsp;&nbsp;←&nbsp;<span style='color:#666;'>لا توجد فروع مسجلة حالياً في النظام المحلي.</span>";
                    }
                }
            };
            xhr.send();
        })(containers[i]);
    }
});