ميدياويكي:Common.js: الفرق بين النسختين
المظهر
لا ملخص تعديل |
لا ملخص تعديل |
||
| سطر ١: | سطر ١: | ||
/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */ | /* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */ | ||
/* 1. جلب جدول المعرفات والأسماء | /* 1. جلب جدول المعرفات والأسماء السيمانتيكية النقية تلقائياً */ | ||
$(document).ready(function() { | $(document).ready(function() { | ||
if (mw.config.get('wgPageName') === 'المعرفات') { | if (mw.config.get('wgPageName') === 'المعرفات') { | ||
var apiUrl = '/api.php?action= | // استعلام سيمانتك ذكي لجلب العنوان الفعلي، رقم الصفحة، والاسم النقي المخزن بالداخل | ||
var askQuery = "[[Category:Person]]|?Display title of|limit=500"; | |||
var apiUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent(askQuery); | |||
$.getJSON(apiUrl, function(data) { | $.getJSON(apiUrl, function(data) { | ||
var rowsHtml = ''; | var rowsHtml = ''; | ||
var results = data.query ? data.query.results : null; | |||
if ( | if (results && Object.keys(results).length > 0) { | ||
$.each(results, function(title, pageData) { | |||
if ( | if (title === 'المعرفات') return; | ||
var pageId = pageData.pageid || (pageData.printouts && pageData.printouts["Display title of"] ? pageData.printouts["Display title of"][0] : 'N/A'); | |||
var displayTitle = (pageData.printouts && pageData.printouts["Display title of"] && pageData.printouts["Display title of"].length > 0) ? pageData.printouts["Display title of"][0].fulltext || pageData.printouts["Display title of"][0] : title; | |||
// تنظيف الاسم من الأقواس إن وجدت | |||
displayTitle = displayTitle.replace(/\s*\(.*?\)\s*/g, '').trim(); | |||
rowsHtml += '<tr>' + | rowsHtml += '<tr>' + | ||
'<td style="padding: 8px 12px; font-weight: bold;"><a href="/index.php?title=' + encodeURIComponent( | '<td style="padding: 8px 12px; font-weight: bold;"><a href="/index.php?title=' + encodeURIComponent(title) + '" style="color: #2a4b7c;">' + displayTitle + '</a></td>' + | ||
'<td style="padding: 8px 12px; font-family: monospace; font-size: 14px;">' + | '<td style="padding: 8px 12px; font-family: monospace; font-size: 14px;">' + pageId + '</td>' + | ||
'</tr>'; | '</tr>'; | ||
} | }); | ||
$('#table-ids-mw tbody').html(rowsHtml); | $('#table-ids-mw tbody').html(rowsHtml); | ||
if ($.fn.tablesorter) { $("#table-ids-mw").tablesorter(); } | |||
if ($.fn.tablesorter) { | |||
} else { | } else { | ||
$('#table-ids-mw tbody').html('<tr><td colspan="2" style="text-align: center; color: red;">لم يتم العثور على أي مقالات.</td></tr>'); | $('#table-ids-mw tbody').html('<tr><td colspan="2" style="text-align: center; color: red;">لم يتم العثور على أي مقالات.</td></tr>'); | ||
} | } | ||
}).fail(function() { | }).fail(function() { | ||
$('#table-ids-mw tbody').html('<tr><td colspan="2" style="text-align: center; color: red;">❌ فشل الاتصال بقاعدة البيانات.</td></tr>'); | $('#table-ids-mw tbody').html('<tr><td colspan="2" style="text-align: center; color: red;">❌ فشل الاتصال بقاعدة البيانات الدلالية.</td></tr>'); | ||
}); | }); | ||
} | } | ||
}); | }); | ||
/* 2. محرك شجرة الأنساب | |||
/* 2. محرك شجرة الأنساب الرسومية التفاعلية الفخمة عبر Mermaid.js بالتكامل السيمانتكي */ | |||
// تحميل مكتبة الرسوميات Mermaid تلقائياً من نظام خارجي آمن وسريع | |||
mw.loader.getScript('https://jsdelivr.net').then(function() { | |||
mermaid.initialize({ startOnLoad: false, theme: 'neutral', securityLevel: 'loose' }); | |||
$('.family-tree-api-render').each(function() { | $('.family-tree-api-render').each(function() { | ||
var $container = $(this); | var $container = $(this); | ||
| سطر ٣٩: | سطر ٤٨: | ||
if (!rootId) return; | if (!rootId) return; | ||
// تعديل الاستعلام البرميجي ليجلب خاصية الاسم الفعلي الذكي أيضاً لبناء الصناديق بالاسم النقي | |||
var askQuery = "[[معرف الأب::+]] OR [[معرف_الأب::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display title of"; | |||
var askQuery = "[[معرف الأب::+]] OR [[معرف_الأب::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب"; | |||
var apiUrl = '/api.php?action=query&list=smwquery&smwqquery=' + encodeURIComponent(askQuery) + '&format=json'; | var apiUrl = '/api.php?action=query&list=smwquery&smwqquery=' + encodeURIComponent(askQuery) + '&format=json'; | ||
var backupApiUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent(askQuery); | var backupApiUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent(askQuery); | ||
function loadTree(url) { | function loadTree(url) { | ||
$.getJSON(url, function(data) { | $.getJSON(url, function(data) { | ||
var results = null; | var results = null; | ||
if (data && data.query && data.query.smwquery && data.query.smwquery.results) { | if (data && data.query && data.query.smwquery && data.query.smwquery.results) { results = data.query.smwquery.results; } | ||
else if (data && data.query && data.query.results) { results = data.query.results; } | |||
else if (data && data.results) { results = data.results; } | |||
if (results) { | if (results) { | ||
var rawNodes = []; | var rawNodes = []; | ||
var rootTitle = "الجذر الفريد"; | |||
$.each(results, function(title, pageData) { | $.each(results, function(title, pageData) { | ||
| سطر ٦٨: | سطر ٦٨: | ||
var printouts = pageData.printouts || {}; | var printouts = pageData.printouts || {}; | ||
// | // سحب الاسم السيمانتكي الفعلي النقي، وإذا لم يوجد نعتمد على العنوان | ||
var cleanName = (printouts["Display title of"] && printouts["Display title of"].length > 0) ? printouts["Display title of"][0] : title; | |||
cleanName = cleanName.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) : pageId; | ||
var fatherIdAttr = printouts["معرف الأب"] || printouts["معرف_الأب"]; | var fatherIdAttr = printouts["معرف الأب"] || printouts["معرف_الأب"]; | ||
var fatherId = null; | var fatherId = null; | ||
if (fatherIdAttr && fatherIdAttr.length > 0) { fatherId = parseInt(fatherIdAttr[0].fulltext || fatherIdAttr[0], 10); } | |||
if (fatherIdAttr && fatherIdAttr.length > 0) { | |||
if (currentId === rootId) { rootTitle = cleanName; } | |||
if (currentId && fatherId && !isNaN(fatherId)) { | if (currentId && fatherId && !isNaN(fatherId)) { | ||
rawNodes.push({ id: currentId, parentId: fatherId, title: title }); | rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title }); | ||
} | } | ||
}); | }); | ||
// | // إذا كان الجذر مسجلاً كابن في الفروع، نستخرج اسمه الفعلي النقي | ||
function | var rootNodeInfo = rawNodes.find(function(n) { return n.id === rootId; }); | ||
if (rootNodeInfo) rootTitle = rootNodeInfo.title; | |||
// تحويل شجرة البيانات المنسدلة إلى أكواد رسم بياني ملون وصناديق تفاعلية (Mermaid Syntax) | |||
var mermaidConfig = "graph TD\n"; | |||
// تصميم صندوق الأب/الجد الأكبر باللون الأخضر الجميل | |||
mermaidConfig += "root(" + rootTitle + ")\nstyle root fill:#2ecc71,stroke:#27ae60,stroke-width:2px,color:#fff\n"; | |||
var hasChildren = false; | |||
function buildMermaidGraph(currentParentId, parentNodeName) { | |||
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; | ||
hasChildren = true; | |||
children.sort(function(a, b) { return a.title.localeCompare(b.title, 'ar'); }); | children.sort(function(a, b) { return a.title.localeCompare(b.title, 'ar'); }); | ||
children.forEach(function(child) { | children.forEach(function(child) { | ||
var childNodeName = "node" + child.id; | |||
// ربط الصناديق ببعضها مع تلوين صناديق الأبناء باللون الأزرق الأنيق المريح للعين | |||
mermaidConfig += parentNodeName + " --> " + childNodeName + "[" + child.title + "]\n"; | |||
mermaidConfig += "style " + childNodeName + " fill:#ecf0f1,stroke:#34495e,stroke-width:1px,color:#2c3e50\n"; | |||
// تحويل الصناديق لأزرار تفاعلية تأخذك لصفحة الشخص فور النقر عليها | |||
mermaidConfig += "click " + childNodeName + " \"/index.php?title=" + encodeURIComponent(child.pageName) + "\" \"انقر لعرض الملف\"\n"; | |||
buildMermaidGraph(child.id, childNodeName); | |||
}); | }); | ||
} | } | ||
buildMermaidGraph(rootId, "root"); | |||
if ( | if (hasChildren) { | ||
$container.html( | // حقن حاوية الـ رسم البياني وتفعيل تصيير المكتبة الرسومية داخل الصفحة | ||
var $graphContainer = $('<div class="mermaid"></div>').text(mermaidConfig); | |||
$container.html($graphContainer); | |||
mermaid.init(undefined, $graphContainer); | |||
} else { | } else { | ||
$container.html( | $container.html("• '''" + rootTitle + "'''<br /> ← <span style='color:#666;'>لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.</span>"); | ||
} | } | ||
} else { | } else { | ||
if (url !== backupApiUrl) { loadTree(backupApiUrl); } | |||
if (url !== backupApiUrl) { | else { $container.html("<span style='color:#666;'>لا توجد نتائج مسجلة.</span>"); } | ||
} | } | ||
}).fail(function() { | }).fail(function() { | ||
if (url !== backupApiUrl) { | if (url !== backupApiUrl) { loadTree(backupApiUrl); } | ||
else { $container.html("<span style='color:red;'>❌ فشل جلب الشجرة عبر الـ API.</span>"); } | |||
}); | }); | ||
} | } | ||
loadTree(apiUrl); | loadTree(apiUrl); | ||
}); | }); | ||
}); | }); | ||
مراجعة ٠٦:٠٧، ١٥ أكتوبر ٢٠٢٦
/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */
/* 1. جلب جدول المعرفات والأسماء السيمانتيكية النقية تلقائياً */
$(document).ready(function() {
if (mw.config.get('wgPageName') === 'المعرفات') {
// استعلام سيمانتك ذكي لجلب العنوان الفعلي، رقم الصفحة، والاسم النقي المخزن بالداخل
var askQuery = "[[Category:Person]]|?Display title of|limit=500";
var apiUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent(askQuery);
$.getJSON(apiUrl, function(data) {
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 pageId = pageData.pageid || (pageData.printouts && pageData.printouts["Display title of"] ? pageData.printouts["Display title of"][0] : 'N/A');
var displayTitle = (pageData.printouts && pageData.printouts["Display title of"] && pageData.printouts["Display title of"].length > 0) ? pageData.printouts["Display title of"][0].fulltext || pageData.printouts["Display title of"][0] : title;
// تنظيف الاسم من الأقواس إن وجدت
displayTitle = displayTitle.replace(/\s*\(.*?\)\s*/g, '').trim();
rowsHtml += '<tr>' +
'<td style="padding: 8px 12px; font-weight: bold;"><a href="/index.php?title=' + encodeURIComponent(title) + '" style="color: #2a4b7c;">' + displayTitle + '</a></td>' +
'<td style="padding: 8px 12px; font-family: monospace; font-size: 14px;">' + pageId + '</td>' +
'</tr>';
});
$('#table-ids-mw tbody').html(rowsHtml);
if ($.fn.tablesorter) { $("#table-ids-mw").tablesorter(); }
} else {
$('#table-ids-mw tbody').html('<tr><td colspan="2" style="text-align: center; color: red;">لم يتم العثور على أي مقالات.</td></tr>');
}
}).fail(function() {
$('#table-ids-mw tbody').html('<tr><td colspan="2" style="text-align: center; color: red;">❌ فشل الاتصال بقاعدة البيانات الدلالية.</td></tr>');
});
}
});
/* 2. محرك شجرة الأنساب الرسومية التفاعلية الفخمة عبر Mermaid.js بالتكامل السيمانتكي */
// تحميل مكتبة الرسوميات Mermaid تلقائياً من نظام خارجي آمن وسريع
mw.loader.getScript('https://jsdelivr.net').then(function() {
mermaid.initialize({ startOnLoad: false, theme: 'neutral', securityLevel: 'loose' });
$('.family-tree-api-render').each(function() {
var $container = $(this);
var rootId = parseInt($container.data('rootid'), 10);
if (!rootId) return;
// تعديل الاستعلام البرميجي ليجلب خاصية الاسم الفعلي الذكي أيضاً لبناء الصناديق بالاسم النقي
var askQuery = "[[معرف الأب::+]] OR [[معرف_الأب::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display title of";
var apiUrl = '/api.php?action=query&list=smwquery&smwqquery=' + encodeURIComponent(askQuery) + '&format=json';
var backupApiUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent(askQuery);
function loadTree(url) {
$.getJSON(url, function(data) {
var results = null;
if (data && data.query && data.query.smwquery && data.query.smwquery.results) { results = data.query.smwquery.results; }
else if (data && data.query && data.query.results) { results = data.query.results; }
else if (data && data.results) { results = data.results; }
if (results) {
var rawNodes = [];
var rootTitle = "الجذر الفريد";
$.each(results, function(title, pageData) {
var pageId = parseInt(pageData.pageid || pageData.id, 10);
var printouts = pageData.printouts || {};
// سحب الاسم السيمانتكي الفعلي النقي، وإذا لم يوجد نعتمد على العنوان
var cleanName = (printouts["Display title of"] && printouts["Display title of"].length > 0) ? printouts["Display title of"][0] : title;
cleanName = cleanName.replace(/\s*\(.*?\)\s*/g, '').trim();
var currentIdAttr = printouts["معرف الشخص"] || printouts["معرف_الشخص"];
var currentId = (currentIdAttr && currentIdAttr.length > 0) ? parseInt(currentIdAttr[0].fulltext || currentIdAttr[0], 10) : pageId;
var fatherIdAttr = printouts["معرف الأب"] || printouts["معرف_الأب"];
var fatherId = null;
if (fatherIdAttr && fatherIdAttr.length > 0) { fatherId = parseInt(fatherIdAttr[0].fulltext || fatherIdAttr[0], 10); }
if (currentId === rootId) { rootTitle = cleanName; }
if (currentId && fatherId && !isNaN(fatherId)) {
rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });
}
});
// إذا كان الجذر مسجلاً كابن في الفروع، نستخرج اسمه الفعلي النقي
var rootNodeInfo = rawNodes.find(function(n) { return n.id === rootId; });
if (rootNodeInfo) rootTitle = rootNodeInfo.title;
// تحويل شجرة البيانات المنسدلة إلى أكواد رسم بياني ملون وصناديق تفاعلية (Mermaid Syntax)
var mermaidConfig = "graph TD\n";
// تصميم صندوق الأب/الجد الأكبر باللون الأخضر الجميل
mermaidConfig += "root(" + rootTitle + ")\nstyle root fill:#2ecc71,stroke:#27ae60,stroke-width:2px,color:#fff\n";
var hasChildren = false;
function buildMermaidGraph(currentParentId, parentNodeName) {
var children = rawNodes.filter(function(node) { return node.parentId === currentParentId; });
if (children.length === 0) return;
hasChildren = true;
children.sort(function(a, b) { return a.title.localeCompare(b.title, 'ar'); });
children.forEach(function(child) {
var childNodeName = "node" + child.id;
// ربط الصناديق ببعضها مع تلوين صناديق الأبناء باللون الأزرق الأنيق المريح للعين
mermaidConfig += parentNodeName + " --> " + childNodeName + "[" + child.title + "]\n";
mermaidConfig += "style " + childNodeName + " fill:#ecf0f1,stroke:#34495e,stroke-width:1px,color:#2c3e50\n";
// تحويل الصناديق لأزرار تفاعلية تأخذك لصفحة الشخص فور النقر عليها
mermaidConfig += "click " + childNodeName + " \"/index.php?title=" + encodeURIComponent(child.pageName) + "\" \"انقر لعرض الملف\"\n";
buildMermaidGraph(child.id, childNodeName);
});
}
buildMermaidGraph(rootId, "root");
if (hasChildren) {
// حقن حاوية الـ رسم البياني وتفعيل تصيير المكتبة الرسومية داخل الصفحة
var $graphContainer = $('<div class="mermaid"></div>').text(mermaidConfig);
$container.html($graphContainer);
mermaid.init(undefined, $graphContainer);
} else {
$container.html("• '''" + rootTitle + "'''<br /> ← <span style='color:#666;'>لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.</span>");
}
} else {
if (url !== backupApiUrl) { loadTree(backupApiUrl); }
else { $container.html("<span style='color:#666;'>لا توجد نتائج مسجلة.</span>"); }
}
}).fail(function() {
if (url !== backupApiUrl) { loadTree(backupApiUrl); }
else { $container.html("<span style='color:red;'>❌ فشل جلب الشجرة عبر الـ API.</span>"); }
});
}
loadTree(apiUrl);
});
});