<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ar">
	<id>https://dbspedia.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Dbspedia - مساهمات المستخدم [ar]</title>
	<link rel="self" type="application/atom+xml" href="https://dbspedia.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php/%D8%AE%D8%A7%D8%B5:%D9%85%D8%B3%D8%A7%D9%87%D9%85%D8%A7%D8%AA/Admin"/>
	<updated>2026-10-20T02:47:49Z</updated>
	<subtitle>مساهمات المستخدم</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.css&amp;diff=497</id>
		<title>ميدياويكي:Common.css</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.css&amp;diff=497"/>
		<updated>2026-10-19T23:47:31Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 🌟 تمكين التحكم اليدوي الحر في تصغير وتوسيع صندوق المحرر المرئي داخل الاستمارات */&lt;br /&gt;
.ve-area-wrapper {&lt;br /&gt;
    resize: vertical !important;&lt;br /&gt;
    overflow: auto !important;&lt;br /&gt;
    min-height: 350px !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=496</id>
		<title>استمارة:Person</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=496"/>
		<updated>2026-10-19T23:45:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
استمارة إضافة وتعديل أفراد العائلة تلقائياً بالمعرفات الرقمية.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{{info|add title=إضافة فرد جديد|edit title=تعديل بيانات الفرد}}}&lt;br /&gt;
&lt;br /&gt;
{{{for template|Person}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- صندوق النبذة التاريخية --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%; margin-bottom: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;نبذة وتاريخ (اكتب النص هنا في الأعلى):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{{field|Bio|input type=textarea|editor=visualeditor|class=toolbarOnTop|rows=12}}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;formtable&amp;quot; style=&amp;quot;width: 100% !important; table-layout: fixed;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | اسم الشخص الفعلي:&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 70%;&amp;quot; | {{{field|اسم_الشخص|input type=text|size=50|mandatory|placeholder=اكتب الاسم المرئي النقي هنا (مثال: عبدالله)|default={{PAGENAME}}}}}&lt;br /&gt;
|-&lt;br /&gt;
! معرف الأب الرقمي (ID) اختياري:&lt;br /&gt;
&lt;br /&gt;
| {{{field|Father_ID|input type=text|size=50|placeholder=اكتب رقم page_id الخاص بالأب لربطه برمجياً، أو اتركه فارغاً ليكون جذراً جديداً}}}&lt;br /&gt;
|-&lt;br /&gt;
! اسم الأم (اختياري):&lt;br /&gt;
&lt;br /&gt;
| {{{field|Mother|input type=text|size=50|placeholder=اكتب اسم الأم (اختياري)}}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{{end template}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=495</id>
		<title>استمارة:Person</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=495"/>
		<updated>2026-10-19T23:42:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
استمارة إضافة وتعديل أفراد العائلة تلقائياً بالمعرفات الرقمية.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{{info|add title=إضافة فرد جديد|edit title=تعديل بيانات الفرد}}}&lt;br /&gt;
&lt;br /&gt;
{{{for template|Person}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- صندوق النبذة التاريخية --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%; margin-bottom: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;نبذة وتاريخ (اكتب النص هنا في الأعلى):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{{field|Bio|input type=textarea|editor=visualeditor|class=toolbarOnTop|rows=12|style=resize: vertical !important; display: block !important;}}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;formtable&amp;quot; style=&amp;quot;width: 100% !important; table-layout: fixed;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | اسم الشخص الفعلي:&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 70%;&amp;quot; | {{{field|اسم_الشخص|input type=text|size=50|mandatory|placeholder=اكتب الاسم المرئي النقي هنا (مثال: عبدالله)|default={{PAGENAME}}}}}&lt;br /&gt;
|-&lt;br /&gt;
! معرف الأب الرقمي (ID) اختياري:&lt;br /&gt;
&lt;br /&gt;
| {{{field|Father_ID|input type=text|size=50|placeholder=اكتب رقم page_id الخاص بالأب لربطه برمجياً، أو اتركه فارغاً ليكون جذراً جديداً}}}&lt;br /&gt;
|-&lt;br /&gt;
! اسم الأم (اختياري):&lt;br /&gt;
&lt;br /&gt;
| {{{field|Mother|input type=text|size=50|placeholder=اكتب اسم الأم (اختياري)}}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{{end template}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=494</id>
		<title>استمارة:Person</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=494"/>
		<updated>2026-10-19T23:40:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
استمارة إضافة وتعديل أفراد العائلة تلقائياً بالمعرفات الرقمية.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{{info|add title=إضافة فرد جديد|edit title=تعديل بيانات الفرد}}}&lt;br /&gt;
&lt;br /&gt;
{{{for template|Person}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- صندوق النبذة التاريخية --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%; margin-bottom: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;نبذة وتاريخ (اكتب النص هنا في الأعلى):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{{field|Bio|input type=textarea|editor=visualeditor|class=toolbarOnTop|max height=600|rows=12}}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;formtable&amp;quot; style=&amp;quot;width: 100% !important; table-layout: fixed;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | اسم الشخص الفعلي:&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 70%;&amp;quot; | {{{field|اسم_الشخص|input type=text|size=50|mandatory|placeholder=اكتب الاسم المرئي النقي هنا (مثال: عبدالله)|default={{PAGENAME}}}}}&lt;br /&gt;
|-&lt;br /&gt;
! معرف الأب الرقمي (ID) اختياري:&lt;br /&gt;
&lt;br /&gt;
| {{{field|Father_ID|input type=text|size=50|placeholder=اكتب رقم page_id الخاص بالأب لربطه برمجياً، أو اتركه فارغاً ليكون جذراً جديداً}}}&lt;br /&gt;
|-&lt;br /&gt;
! اسم الأم (اختياري):&lt;br /&gt;
&lt;br /&gt;
| {{{field|Mother|input type=text|size=50|placeholder=اكتب اسم الأم (اختياري)}}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{{end template}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=493</id>
		<title>استمارة:Person</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=493"/>
		<updated>2026-10-19T23:20:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
استمارة إضافة وتعديل أفراد العائلة تلقائياً بالمعرفات الرقمية.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{{info|add title=إضافة فرد جديد|edit title=تعديل بيانات الفرد}}}&lt;br /&gt;
&lt;br /&gt;
{{{for template|Person}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- صندوق النبذة التاريخية --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%; margin-bottom: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;نبذة وتاريخ (اكتب النص هنا في الأعلى):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{{field|Bio|input type=textarea|editor=visualeditor|class=toolbarOnTop|rows=12}}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;formtable&amp;quot; style=&amp;quot;width: 100% !important; table-layout: fixed;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | اسم الشخص الفعلي:&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 70%;&amp;quot; | {{{field|اسم_الشخص|input type=text|size=50|mandatory|placeholder=اكتب الاسم المرئي النقي هنا (مثال: عبدالله)|default={{PAGENAME}}}}}&lt;br /&gt;
|-&lt;br /&gt;
! معرف الأب الرقمي (ID) اختياري:&lt;br /&gt;
&lt;br /&gt;
| {{{field|Father_ID|input type=text|size=50|placeholder=اكتب رقم page_id الخاص بالأب لربطه برمجياً، أو اتركه فارغاً ليكون جذراً جديداً}}}&lt;br /&gt;
|-&lt;br /&gt;
! اسم الأم (اختياري):&lt;br /&gt;
&lt;br /&gt;
| {{{field|Mother|input type=text|size=50|placeholder=اكتب اسم الأم (اختياري)}}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{{end template}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=492</id>
		<title>استمارة:Person</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=492"/>
		<updated>2026-10-19T22:20:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
استمارة إضافة وتعديل أفراد العائلة تلقائياً بالمعرفات الرقمية.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{{info|add title=إضافة فرد جديد|edit title=تعديل بيانات الفرد}}}&lt;br /&gt;
&lt;br /&gt;
{{{for template|Person}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- صندوق النبذة التاريخية --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%; margin-bottom: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;نبذة وتاريخ (اكتب النص هنا في الأعلى):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| {{{field|Bio|input type=textarea|editor=visualeditor|rows=12}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;formtable&amp;quot; style=&amp;quot;width: 100% !important; table-layout: fixed;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | اسم الشخص الفعلي:&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 70%;&amp;quot; | {{{field|اسم_الشخص|input type=text|size=50|mandatory|placeholder=اكتب الاسم المرئي النقي هنا (مثال: عبدالله)|default={{PAGENAME}}}}}&lt;br /&gt;
|-&lt;br /&gt;
! معرف الأب الرقمي (ID) اختياري:&lt;br /&gt;
&lt;br /&gt;
| {{{field|Father_ID|input type=text|size=50|placeholder=اكتب رقم page_id الخاص بالأب لربطه برمجياً، أو اتركه فارغاً ليكون جذراً جديداً}}}&lt;br /&gt;
|-&lt;br /&gt;
! اسم الأم (اختياري):&lt;br /&gt;
&lt;br /&gt;
| {{{field|Mother|input type=text|size=50|placeholder=اكتب اسم الأم (اختياري)}}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{{end template}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=491</id>
		<title>استمارة:Person</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9:Person&amp;diff=491"/>
		<updated>2026-10-19T22:09:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
استمارة إضافة وتعديل أفراد العائلة تلقائياً بالمعرفات الرقمية.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{{info|add title=إضافة فرد جديد|edit title=تعديل بيانات الفرد}}}&lt;br /&gt;
&lt;br /&gt;
{{{for template|Person}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- صندوق النبذة التاريخية --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%; margin-bottom: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;نبذة وتاريخ (اكتب النص هنا في الأعلى):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
| {{{field|Bio|input type=textarea|editor=visualeditor|autocomplete|rows=12|style=width: 100% !important; max-width: 100% !important; display: block !important;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;formtable&amp;quot; style=&amp;quot;width: 100% !important; table-layout: fixed;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | اسم الشخص الفعلي:&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 70%;&amp;quot; | {{{field|اسم_الشخص|input type=text|size=50|mandatory|placeholder=اكتب الاسم المرئي النقي هنا (مثال: عبدالله)|default={{PAGENAME}}}}}&lt;br /&gt;
|-&lt;br /&gt;
! معرف الأب الرقمي (ID) اختياري:&lt;br /&gt;
&lt;br /&gt;
| {{{field|Father_ID|input type=text|size=50|placeholder=اكتب رقم page_id الخاص بالأب لربطه برمجياً، أو اتركه فارغاً ليكون جذراً جديداً}}}&lt;br /&gt;
|-&lt;br /&gt;
! اسم الأم (اختياري):&lt;br /&gt;
&lt;br /&gt;
| {{{field|Mother|input type=text|size=50|placeholder=اكتب اسم الأم (اختياري)}}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{{end template}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA&amp;diff=490</id>
		<title>الاختبارات</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA&amp;diff=490"/>
		<updated>2026-10-19T16:47:49Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ صفحة فارغة&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9&amp;diff=489</id>
		<title>الصفحة الرئيسية</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9&amp;diff=489"/>
		<updated>2026-10-18T22:27:35Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;موسوعة أسرة الدباسا &amp;quot;الدباسي&amp;quot;&amp;lt;/big&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;هذه هي موسوعة الأسرة التي ستضم بمشاركة جميع افراد الاسرة المهتمين و الراغبين في المساهمة في بناء هذه الموسوعة المباركة بإذن الله تعالى كل ما له علاقة بالاسرة و رجالاتها و افرادها و تاريخها.&amp;lt;/big&amp;gt;&lt;br /&gt;
[[ملف:شعار الاسرة.jpg|مركز|لاإطار|450x450بك]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=488</id>
		<title>مشجرة الدباسي الموسوعية</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=488"/>
		<updated>2026-10-18T22:23:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
=== مشجرة العائلة البانورامية الشاملة ===&lt;br /&gt;
فيما يلي العرض البصري الهرمي المتكامل لكافة جذور و فروع العائلة، ممتداً ديناميكياً من الجد الأكبر (بني تميم). يمكنك تحريك اللوحة بالماوس وتكبيرها وتصغيرها بسلاسة تامة.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- حاوية المشجرة البانورامية التفاعلية الذكية --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;global-family-tree-panzoom&amp;quot; style=&amp;quot;width: 100%; height: 700px; border: 1px solid #dddddd; background-color: #fcfcfc; border-radius: 8px; position: relative; overflow: hidden; box-shadow: inset 0 0 10px rgba(0,0,0,0.02); margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;tree-loading-overlay&amp;quot; style=&amp;quot;position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #666; font-weight: bold; text-align: center; font-size: 16px;&amp;quot;&amp;gt;&lt;br /&gt;
        🔄 جاري مسح قاعدة البيانات وبناء المشجرة البانورامية الشاملة...&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;tree-canvas-holder&amp;quot; style=&amp;quot;width: 100%; height: 100%;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=487</id>
		<title>ميدياويكي:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=487"/>
		<updated>2026-10-18T22:21:49Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** مشجرة الدباسي الموسوعية|مشجرة الدباسي الموسوعية&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
** خاص:FormStart/Person|إضافة شخص جديد تلقائياً&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=486</id>
		<title>مشجرة الدباسي الموسوعية</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=486"/>
		<updated>2026-10-18T22:21:04Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
=== مشجرة العائلة البانورامية الشاملة ===&lt;br /&gt;
فيما يلي العرض البصري الهرمي المتكامل لكافة فروع وجذور العائلة، ممتداً ديناميكياً من الجد الأكبر (بني تميم). يمكنك تحريك اللوحة بالماوس وتكبيرها وتصغيرها بسلاسة تامة، وهي تتحدث تلقائياً مع كل إضافة جديدة عبر الاستمارة.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- حاوية المشجرة البانورامية التفاعلية الذكية --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;global-family-tree-panzoom&amp;quot; style=&amp;quot;width: 100%; height: 700px; border: 1px solid #dddddd; background-color: #fcfcfc; border-radius: 8px; position: relative; overflow: hidden; box-shadow: inset 0 0 10px rgba(0,0,0,0.02); margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;tree-loading-overlay&amp;quot; style=&amp;quot;position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #666; font-weight: bold; text-align: center; font-size: 16px;&amp;quot;&amp;gt;&lt;br /&gt;
        🔄 جاري مسح قاعدة البيانات وبناء المشجرة البانورامية الشاملة...&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;tree-canvas-holder&amp;quot; style=&amp;quot;width: 100%; height: 100%;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=485</id>
		<title>ميدياويكي:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=485"/>
		<updated>2026-10-18T22:19:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** مشجرة الدباسي الموسوعية|المشجرة الكبرى البانورامية&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
** خاص:FormStart/Person|إضافة شخص جديد تلقائياً&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=484</id>
		<title>ميدياويكي:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=484"/>
		<updated>2026-10-18T22:17:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** المشجرة الكبرى|المشجرة الكبرى البانورامية&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
** خاص:FormStart/Person|إضافة شخص جديد تلقائياً&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=483</id>
		<title>ميدياويكي:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=483"/>
		<updated>2026-10-18T22:16:50Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** المشجرة الكبرى|مشجرة الدباسي الموسوعية&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
** خاص:FormStart/Person|إضافة شخص جديد تلقائياً&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=482</id>
		<title>ميدياويكي:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Sidebar&amp;diff=482"/>
		<updated>2026-10-18T22:15:48Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** المشجرة الكبرى|المشجرة الكبرى البانورامية&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** specialpages-url|specialpages&lt;br /&gt;
** خاص:FormStart/Person|إضافة شخص جديد تلقائياً&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=481</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=481"/>
		<updated>2026-10-18T22:08:48Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة المطور لتوسيع كافة الصناديق بالستايل الصريح */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                // 🌟 إنشاء كلاسات صريحة وموسعة بالـ padding لضمان قراءتها في كافة مستويات الشجرة&lt;br /&gt;
                mermaidCode += &amp;quot;classDef familyNode fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:15px,padding:15px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:16px,font-weight:bolder,padding:15px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                        // 🌟 سطر القوة: إلزام المحرك بتطبيق كلاس التوسيع الصريح على جميع الأبناء والأحفاد تلقائياً&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; familyNode;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // نظام التحريك والتكبير بالماوس الحصري&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=480</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=480"/>
		<updated>2026-10-18T22:04:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة المصحح مع ميزة التوسيع التلقائي للصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:14px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:16px,font-weight:bolder,padding:15px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    // 🌟 التعديل الحاسم: إضافة مسافات نصية عادية مريحة حول الاسم لإجبار الصندوق على التمدد أفقياً وحماية الحروف من الاقتصاص&lt;br /&gt;
                    var expandedTitle = &amp;quot;    &amp;quot; + node.title + &amp;quot;    &amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + expandedTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل نظام التحريك والتكبير بالماوس الحصري&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.css&amp;diff=479</id>
		<title>ميدياويكي:Common.css</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.css&amp;diff=479"/>
		<updated>2026-10-18T22:03:12Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=478</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=478"/>
		<updated>2026-10-18T21:56:12Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة المصحح والمطابق للمصفوفات المحلية */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:14px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:16px,font-weight:bolder,padding:15px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل نظام التحريك والتكبير بالماوس الحصري&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=477</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=477"/>
		<updated>2026-10-18T21:44:18Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة الخفيف والمضمون 100% دون تهنيج */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // القراءة القياسية والخفيفة جداً للأسماء المطابقة تماماً لكودك القديم الناجح 100%&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr.fulltext || blobAttr; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr.fulltext || currentIdAttr || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr.fulltext || fatherIdAttr || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId &amp;amp;&amp;amp; cleanName) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // صياغة شفرة الهرم البانورامي الكلي بنقاء وسرعة فائقة&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:14px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:15px,font-weight:bold;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot; &amp;quot; + node.title + &amp;quot; \&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تشغيل فوري لنظام التحريك والتكبير بالماوس دون تأخير&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 800);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=476</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=476"/>
		<updated>2026-10-18T21:42:34Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة المطور لحل مشكلة قراءة الأسماء */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        // استعلام شامل يجلب كافة الأفراد المسجلين مع قنص مصفوفة الأسماء الصافية&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // القنص الاحترافي والآمن للاسم العربي الفعلي من مصفوفات الـ API المحلية لضمان عدم ضياع الأسماء&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    } else if (blobAttr) {&lt;br /&gt;
                        cleanName = blobAttr.fulltext || blobAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (Array.isArray(currentIdAttr) &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0];&lt;br /&gt;
                    } else if (currentIdAttr) {&lt;br /&gt;
                        currentId = currentIdAttr.fulltext || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr) {&lt;br /&gt;
                        var rawFather = Array.isArray(fatherIdAttr) ? (fatherIdAttr[0].fulltext || fatherIdAttr[0]) : (fatherIdAttr.fulltext || fatherIdAttr);&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId &amp;amp;&amp;amp; cleanName) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // صياغة اللوحة البانورامية الكبرى بالرموز المفتوحة والآمنة&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:14px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:15px,font-weight:bold;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    // حماية الأسماء العربية بإضافة مسافات عادية آمنة لفرش الخلايا تلقائياً&lt;br /&gt;
                    var spacedTitle = &amp;quot; &amp;quot; + node.title + &amp;quot; &amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + spacedTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تشغيل نظام التحريك الفخم والتكبير الحر (Pan &amp;amp; Zoom)&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=475</id>
		<title>مشجرة الدباسي الموسوعية</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=475"/>
		<updated>2026-10-18T21:42:00Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
=== لوحة مشجرة الأنساب العامة البانورامية الشاملة ===&lt;br /&gt;
فيما يلي العرض البصري الهرمي المتكامل لكافة فروع وجذور العائلة، ممتداً ديناميكياً من الجد الأكبر (بني تميم). يمكنك تحريك اللوحة بالماوس وتكبيرها وتصغيرها بسلاسة تامة، وهي تتحدث تلقائياً مع كل إضافة جديدة عبر الاستمارة.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- حاوية المشجرة البانورامية التفاعلية الذكية --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;global-family-tree-panzoom&amp;quot; style=&amp;quot;width: 100%; height: 700px; border: 1px solid #dddddd; background-color: #fcfcfc; border-radius: 8px; position: relative; overflow: hidden; box-shadow: inset 0 0 10px rgba(0,0,0,0.02); margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;tree-loading-overlay&amp;quot; style=&amp;quot;position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #666; font-weight: bold; text-align: center; font-size: 16px;&amp;quot;&amp;gt;&lt;br /&gt;
        🔄 جاري مسح قاعدة البيانات وبناء المشجرة البانورامية الشاملة...&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;tree-canvas-holder&amp;quot; style=&amp;quot;width: 100%; height: 100%;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=474</id>
		<title>مشجرة الدباسي الموسوعية</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=474"/>
		<updated>2026-10-18T21:40:39Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
=== لوحة مشجرة الأنساب العامة البانورامية الشاملة ===&lt;br /&gt;
فيما يلي العرض البصري الهرمي المتكامل لكافة فروع وجذور العائلة، ممتداً ديناميكياً من الجد الأكبر (بني تميم). تتميز هذه اللوحة بالتحديث التلقائي اللحظي مع كل فرد جديد يتم إضافته عبر الاستمارة.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%; min-height: 500px; background-color: #ffffff; padding: 25px; border: 1px solid #dddddd; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.01); direction: rtl; font-size: 16px; line-height: 2.2;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#ask: [[معرف الشخص::+]]&lt;br /&gt;
|?معرف_الأب&lt;br /&gt;
|format=tree&lt;br /&gt;
|parent=معرف_الأب&lt;br /&gt;
|order=ascending&lt;br /&gt;
|limit=2000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=473</id>
		<title>مشجرة الدباسي الموسوعية</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=473"/>
		<updated>2026-10-18T21:39:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
=== لوحة مشجرة الأنساب العامة البانورامية الشاملة ===&lt;br /&gt;
فيما يلي العرض البصري الهرمي المتكامل لكافة فروع وجذور العائلة، ممتداً ديناميكياً من الجد الأكبر (بني تميم). تتميز هذه اللوحة بالتحديث التلقائي اللحظي مع كل فرد جديد يتم إضافته عبر الاستمارة.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 100%; min-height: 500px; background-color: #ffffff; padding: 25px; border: 1px solid #dddddd; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.01); direction: rtl; font-size: 16px; line-height: 2.2;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#ask: [[معرف الشخص::+]] [[Display_title_of::بني تميم]]&lt;br /&gt;
|?معرف الشخص&lt;br /&gt;
|format=tree&lt;br /&gt;
|parent=معرف_الأب&lt;br /&gt;
|template=Person&lt;br /&gt;
|order=ascending&lt;br /&gt;
|limit=2000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.css&amp;diff=472</id>
		<title>ميدياويكي:Common.css</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.css&amp;diff=472"/>
		<updated>2026-10-18T21:36:17Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039;/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */        /* توسيع وتكبير صناديق مشجرة الأنساب تلقائياً لمنع اقتصاص الأسماء العربية */ .mermaid svg .node rect {     padding: 10px 25px !important;     rx: 6px !important; /* جعل حواف المربعات دائرية وأنيقة */     ry: 6px !important; }  .mermaid svg .node .label, .mermaid svg ....&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* توسيع وتكبير صناديق مشجرة الأنساب تلقائياً لمنع اقتصاص الأسماء العربية */&lt;br /&gt;
.mermaid svg .node rect {&lt;br /&gt;
    padding: 10px 25px !important;&lt;br /&gt;
    rx: 6px !important; /* جعل حواف المربعات دائرية وأنيقة */&lt;br /&gt;
    ry: 6px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mermaid svg .node .label, .mermaid svg .node text {&lt;br /&gt;
    font-size: 15px !important;&lt;br /&gt;
    font-weight: bold !important;&lt;br /&gt;
    font-family: sans-serif, Tahoma !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=471</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=471"/>
		<updated>2026-10-18T21:35:38Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة المستقر والأصلي 100% */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr.fulltext || blobAttr; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr.fulltext || currentIdAttr || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr.fulltext || fatherIdAttr || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:13px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:13px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // نظام التحريك والتكبير بالماوس الحر&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=470</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=470"/>
		<updated>2026-10-18T21:34:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة مع خدعة المسافات لتوسيع الصناديق تلقائياً */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr.fulltext || blobAttr; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr.fulltext || currentIdAttr || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr.fulltext || fatherIdAttr || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                // العودة الكاملة لأسطر ستايل كودك الأصلي الناجح 100% لضمان استقرار الرسم الفوري&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:13px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:13px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    // 🌟 إضافة مسافات أفقية برمجية آمنة حول الاسم لإجبار الصندوق على التمدد أفقياً ومنع اختناق الحروف&lt;br /&gt;
                    var paddedTitle = &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot; + node.title + &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + paddedTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل نظام التحريك والتكبير الحر بالماوس&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=469</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=469"/>
		<updated>2026-10-18T17:25:50Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة المعتمد مع ستايل التوسيع الخارجي الآمن */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr.fulltext || blobAttr; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr.fulltext || currentIdAttr || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr.fulltext || fatherIdAttr || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                // 🌟 العودة الصارمة لأسطر ستايل كودك الأصلي الناجح 100% دون أي تعديل داخلي لمنع الانهيار&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:13px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:13px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل نظام التحريك والتركيز بالماوس&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        &lt;br /&gt;
                        // 🌟 الحل السحري: إجبار المتصفح يدوياً على توسيع خلايا وصناديق الـ SVG وتكبير الخطوط العربية بوضوح تامة&lt;br /&gt;
                        $svg.find(&#039;g.node rect&#039;).each(function() {&lt;br /&gt;
                            var currentWidth = parseFloat($(this).attr(&#039;width&#039;));&lt;br /&gt;
                            var currentHeight = parseFloat($(this).attr(&#039;height&#039;));&lt;br /&gt;
                            var currentX = parseFloat($(this).attr(&#039;x&#039;));&lt;br /&gt;
                            &lt;br /&gt;
                            // توسيع الصندوق أفقياً بمقدار 50 بكسل إضافية لمنع اختناق الاسم واقتطاعه&lt;br /&gt;
                            $(this).attr(&#039;width&#039;, currentWidth + 50);&lt;br /&gt;
                            $(this).attr(&#039;x&#039;, currentX - 25); &lt;br /&gt;
                            $(this).css({ &#039;fill&#039;: &#039;#ffffff&#039;, &#039;stroke-width&#039;: &#039;2px&#039; });&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        // تكبير ونقل النصوص العربية لتتوسط الصناديق الموسعة بنقاء كامل&lt;br /&gt;
                        $svg.find(&#039;g.node .label&#039;).css({ &#039;font-size&#039;: &#039;16px&#039;, &#039;font-weight&#039;: &#039;bold&#039;, &#039;font-family&#039;: &#039;inherit&#039; });&lt;br /&gt;
                        $svg.find(&#039;g.node.topRoot rect&#039;).css({ &#039;fill&#039;: &#039;#f4f7fb&#039;, &#039;stroke&#039;: &#039;#2a4b7c&#039; });&lt;br /&gt;
&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=468</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=468"/>
		<updated>2026-10-18T17:20:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة مع توسيع آمن ومضمون لأبعاد الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr.fulltext || blobAttr; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr.fulltext || currentIdAttr || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr.fulltext || fatherIdAttr || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                // 🌟 استخدام خاصية padding الموحدة والآمنة لمنع انهيار الـ SVG&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:16px,padding:12px 35px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:18px,font-weight:bold,padding:15px 40px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل نظام التحريك والتكبير بالماوس الحصري&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        // 🌟 إعطاء مساحة أفقية إضافية مريحة لجميع النصوص داخل الـ SVG لمنع اختناقها&lt;br /&gt;
                        $svg.find(&#039;.node label, .node text&#039;).css({ &#039;font-family&#039;: &#039;inherit&#039;, &#039;letter-spacing&#039;: &#039;0.5px&#039; });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=467</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=467"/>
		<updated>2026-10-18T17:16:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة مع تكبير وتوسيع الصناديق أفقياً لحماية الأسماء العربية */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr.fulltext || blobAttr; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr.fulltext || currentIdAttr || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr.fulltext || fatherIdAttr || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                // 🌟 زيادة مساحة الـ padding أفقياً وعمودياً ورفع حجم الخط لضمان عدم اقتطاع الحروف&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bolder,font-size:16px,padding-left:25px,padding-right:25px,padding-top:12px,padding-bottom:12px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:18px,font-weight:bolder,padding-left:30px,padding-right:30px,padding-top:15px,padding-bottom:15px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل نظام التحريك والتكبير بالماوس الحصري&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=466</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=466"/>
		<updated>2026-10-18T17:11:17Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة المصحح والمطابق للمصفوفات المحلية */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:14px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:16px,font-weight:bolder,padding:15px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل نظام التحريك والتكبير بالماوس الحصري&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return;&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=465</id>
		<title>مشجرة الدباسي الموسوعية</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D8%B4%D8%AC%D8%B1%D8%A9_%D8%A7%D9%84%D8%AF%D8%A8%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%88%D8%B9%D9%8A%D8%A9&amp;diff=465"/>
		<updated>2026-10-18T17:08:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039; __NOTOC__ __NOEDITSECTION__ === لوحة مشجرة الأنساب العامة البانورامية === فيما يلي عرض شامل وتفاعلي لكافة فروع وجذور العائلة، ممتداً من الجد الأكبر (بني تميم). يمكنك تحريك الشجرة بالماوس وتكبيرها وتصغيرها، وهي تتحدث تلقائياً مع كل إضافة جديدة.  &amp;lt;!-- حاوية المشجرة البانورامي...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
=== لوحة مشجرة الأنساب العامة البانورامية ===&lt;br /&gt;
فيما يلي عرض شامل وتفاعلي لكافة فروع وجذور العائلة، ممتداً من الجد الأكبر (بني تميم). يمكنك تحريك الشجرة بالماوس وتكبيرها وتصغيرها، وهي تتحدث تلقائياً مع كل إضافة جديدة.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- حاوية المشجرة البانورامية التفاعلية الذكية --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;global-family-tree-panzoom&amp;quot; style=&amp;quot;width: 100%; height: 700px; border: 1px solid #dddddd; background-color: #fcfcfc; border-radius: 8px; position: relative; overflow: hidden; box-shadow: inset 0 0 10px rgba(0,0,0,0.02); margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;tree-loading-overlay&amp;quot; style=&amp;quot;position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #666; font-weight: bold; text-align: center; font-size: 16px;&amp;quot;&amp;gt;&lt;br /&gt;
        🔄 جاري مسح قاعدة البيانات وبناء المشجرة البانورامية الشاملة...&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;tree-canvas-holder&amp;quot; style=&amp;quot;width: 100%; height: 100%;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=464</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=464"/>
		<updated>2026-10-18T16:54:07Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 5. محرك المشجرة الكبرى البانورامية الشاملة مع ميزة التحريك والتكبير التلقائي (Pan &amp;amp; Zoom) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if ($(&#039;#global-family-tree-panzoom&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // استدعاء مكتبة Mermaid وتأمينها لتوليد الشفرة الكبرى&lt;br /&gt;
    mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=2000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                // جرد كافة أفراد الموسوعة دلالياً&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr.fulltext || blobAttr; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr.fulltext || currentIdAttr) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr.fulltext || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // صياغة الشجرة الكلية الممتدة من قمة الهرم صعوداً ونزولاً لقاعدة البيانات بالكامل&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-weight:bold,font-size:14px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef topRoot fill:#f4f7fb,stroke:#2a4b7c,stroke-width:3px,color:#2a4b7c,font-size:16px,font-weight:bolder,padding:15px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                // العثور على الجد الأكبر الافتراضي (الذي ليس له أب مسجل في المنظومة ليكون قمة الشجرة)&lt;br /&gt;
                var registeredIds = rawNodes.map(function(n) { return n.id; });&lt;br /&gt;
                &lt;br /&gt;
                rawNodes.forEach(function(node) {&lt;br /&gt;
                    // تعريف العقدة والربط بالرابط التفاعلي&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // إذا كان له أب مسجل، نربطه به تلقائياً&lt;br /&gt;
                    if (node.parentId &amp;amp;&amp;amp; registeredIds.indexOf(node.parentId) !== -1) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        // تلوين الأجداد الكبار المشتركين في قمة الشجرة بلون مميز&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; topRoot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // بناء عنصر الـ pre الحاضن للشفرة وحقنه ديناميكياً&lt;br /&gt;
                $(&#039;#tree-canvas-holder&#039;).html(&#039;&amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;background:none; border:none; text-align:center; margin:0; padding:20px;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&#039;);&lt;br /&gt;
                var $pre = $(&#039;#tree-canvas-holder&#039;).find(&#039;pre.mermaid&#039;);&lt;br /&gt;
                &lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                // تشغيل محرك الرندرة الرسمي&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                    mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // 🌟 حقن سكريبت التحكم الحركي بالتكبير والتحريك الذكي بالماوس (Pan &amp;amp; Zoom) للحاوية&lt;br /&gt;
                setTimeout(function() {&lt;br /&gt;
                    var $svg = $(&#039;#tree-canvas-holder&#039;).find(&#039;svg&#039;);&lt;br /&gt;
                    if ($svg.length &amp;gt; 0) {&lt;br /&gt;
                        $svg.css({ &#039;transform-origin&#039;: &#039;top center&#039;, &#039;cursor&#039;: &#039;grab&#039;, &#039;transition&#039;: &#039;transform 0.1s ease-out&#039; });&lt;br /&gt;
                        var scale = 1, isDragging = false, startX, startY, translateX = 0, translateY = 0;&lt;br /&gt;
&lt;br /&gt;
                        // ميزة التحريك بالسحب بالماوس&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;mousedown&#039;, function(e) {&lt;br /&gt;
                            if ($(e.target).closest(&#039;a&#039;).length &amp;gt; 0) return; // الحفاظ على حيوية الروابط&lt;br /&gt;
                            isDragging = true;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grabbing&#039;);&lt;br /&gt;
                            startX = e.clientX - translateX;&lt;br /&gt;
                            startY = e.clientY - translateY;&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        $(document).on(&#039;mousemove&#039;, function(e) {&lt;br /&gt;
                            if (!isDragging) return;&lt;br /&gt;
                            translateX = e.clientX - startX;&lt;br /&gt;
                            translateY = e.clientY - startY;&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        }).on(&#039;mouseup&#039;, function() {&lt;br /&gt;
                            isDragging = false;&lt;br /&gt;
                            $svg.css(&#039;cursor&#039;, &#039;grab&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        // ميزة التكبير والتصغير بعجلة الماوس (Scroll Wheel)&lt;br /&gt;
                        $(&#039;#global-family-tree-panzoom&#039;).on(&#039;wheel&#039;, function(e) {&lt;br /&gt;
                            e.preventDefault();&lt;br /&gt;
                            var delta = e.originalEvent.deltaY;&lt;br /&gt;
                            if (delta &amp;lt; 0) { scale = Math.min(scale + 0.08, 3); } &lt;br /&gt;
                            else { scale = Math.max(scale - 0.08, 0.3); }&lt;br /&gt;
                            $svg.css(&#039;transform&#039;, &#039;translate(&#039; + translateX + &#039;px, &#039; + translateY + &#039;px) scale(&#039; + scale + &#039;)&#039;);&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                }, 1200);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;⚠️ لم يتم العثور على أي بيانات أفراد مسجلة لبناء المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $(&#039;.tree-loading-overlay&#039;).html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد المشجرة الكبرى.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=463</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=463"/>
		<updated>2026-10-18T16:46:47Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 التعديل التجميلي الحصري: زيادة حجم الخط والـ padding لتكبير المربعات وحماية الأسماء من الانضغاط&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=462</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=462"/>
		<updated>2026-10-18T16:43:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم وتكبير الصناديق */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr.fulltext || blobAttr; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr.fulltext || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr.fulltext || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    // 🌟 الأسطر المطورة لتكبير الصناديق وتوسيع المساحة الداخلية (Padding) للأسماء الفخمة&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:15px,padding:12px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:15px,font-weight:bold,padding:15px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:18px,font-weight:bolder,padding:18px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:15px,font-weight:bold,padding:12px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%82%D8%A7%D9%84%D8%A8:Person&amp;diff=461</id>
		<title>قالب:Person</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%82%D8%A7%D9%84%D8%A8:Person&amp;diff=461"/>
		<updated>2026-10-18T16:38:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
هذا قالب معلومات أفراد العائلة مع بطاقة الفرد المرجعية واستعلام المشجرة الممتد لـ 12 جيلاً عبر الـ API المباشر.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- 1. تفويض ميدياويكي الرسمي لإخفاء العنوان الرقمي وعرض الاسم العربي النقي للزوار --&amp;gt;&lt;br /&gt;
{{#if:{{{اسم_الشخص|}}}|{{DISPLAYTITLE:{{{اسم_الشخص|}}}}}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- زر التعديل بالاستمارة في أعلى المقالة --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom: 15px;&amp;quot;&amp;gt;{{#formlink:form=Person|link text=عدل بالاستمارة|link type=button|target={{PAGENAME}}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- بطاقة الفرد المرجعية المحصنة والمطهرة بالكامل من تشوه الأسطر --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: left; margin: 0 0 15px 15px; clear: left;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 280px; text-align: right; font-size: 90%; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;بطاقة الفرد المرجعية&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 45%; background-color: #f2f2f2;&amp;quot; | الاسم الكامل&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 55%; font-weight: bold;&amp;quot; | {{#if:{{{اسم_الشخص|}}}|{{{اسم_الشخص|}}}|[[{{PAGENAME}}]]}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color: #f2f2f2;&amp;quot; | معرف الشخص&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;font-family: monospace; font-weight: bold; color: #2a4b7c;&amp;quot; | {{PAGEID}}&lt;br /&gt;
{{#if:{{{اسم_الأب|{{{اسم_الاب|{{{Father|}}}}}}}}}|{{!}}-&lt;br /&gt;
! style=&amp;quot;background-color: #f2f2f2;&amp;quot; {{!}} الأب&lt;br /&gt;
{{!}} style=&amp;quot;font-weight: bold;&amp;quot; {{!}} {{{اسم_الأب|{{{اسم_الاب|{{{Father|}}}}}}}}} }}&lt;br /&gt;
{{#if:{{{Mother|}}}|{{!}}-&lt;br /&gt;
! style=&amp;quot;background-color: #f2f2f2;&amp;quot; {{!}} الأم&lt;br /&gt;
{{!}} style=&amp;quot;font-weight: bold;&amp;quot; {{!}} {{{Mother|}}} }}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- عرض النبذة التاريخية في المنتصف فوق المشجرة --&amp;gt;&lt;br /&gt;
{{#if:{{{Bio|}}}|{{{Bio}}}&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br /&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- 2. منطقة تسجيل صلات القرابة دلالياً في قاعدة البيانات السيمانتيكية (خلف الكواليس 100%) --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:none;&amp;quot;&amp;gt;&lt;br /&gt;
[[معرف_الشخص::{{PAGEID}}|]]&lt;br /&gt;
{{#if:{{{Father_ID|}}}|[[معرف_الأب::{{{Father_ID|}}}|]]}}&lt;br /&gt;
{{#if:{{{Mother|}}}|[[الأم::{{{Mother|}}}|]]}}&lt;br /&gt;
&amp;lt;!-- قنص وتحصين الاسم الفعلي النقي لصفحة المعرفات وشجرة الـ API بالصيغتين بالمسافة والشرطة معاً --&amp;gt;&lt;br /&gt;
{{#if:{{{اسم_الشخص|}}}|[[Display_title_of::{{{اسم_الشخص|}}}|]][[Display title of::{{{اسم_الشخص|}}}|]]|[[Display_title_of::{{PAGENAME}}|]][[Display title of::{{PAGENAME}}|]]}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- مشجرة النسب الدلالية (أسفل النص والبطاقة المرجعية) --&amp;gt;&lt;br /&gt;
=== مشجرة النسب الدلالية ===&lt;br /&gt;
&lt;br /&gt;
==== 1. الأجداد والآباء (صعوداً) ====&lt;br /&gt;
{{#if:{{{Father_ID|}}}|والد {{#if:{{{اسم_الشخص|}}}|{{{اسم_الشخص|}}}|{{PAGENAME}}}} هو: {{#ask: [[معرف_الشخص::{{{Father_ID|}}}]] |link=all |default=معرف غير معروف}}|غير معروف}}&lt;br /&gt;
&lt;br /&gt;
==== 2. الفروع والأبناء (نزولاً إلى 12 جيلاً منسقاً) ====&lt;br /&gt;
شجرة الأنساب والذرية الممتدة لـ 12 جيلاً:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- حاوية برمجية آمنة تمرر الرقم المعرف الحالي ليتعرف عليه الـ API دون تعديل --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;family-tree-api-render&amp;quot; data-rootid=&amp;quot;{{PAGEID}}&amp;quot;&amp;gt;&lt;br /&gt;
    • &#039;&#039;&#039;{{#if:{{{اسم_الشخص|}}}|{{{اسم_الشخص|}}}|{{PAGENAME}}}}&#039;&#039;&#039;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&amp;quot;color:#666;&amp;quot;&amp;gt;جاري تحميل شجرة الأنساب تلقائياً من قاعدة البيانات...&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- 🌟 القسم الثالث: لوحة مشجرة النسب الهرمية التفاعلية 🌟 --&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== لوحة مشجرة النسب الهرمية ===&lt;br /&gt;
فيما يلي العرض البصري الهرمي التفاعلي للشخص (النسب الصافي صعوداً والتفريع الكامل نزولاً):&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;family-tree-mermaid-render&amp;quot; data-personid=&amp;quot;{{PAGEID}}&amp;quot; data-fatherid=&amp;quot;{{{Father_ID|}}}&amp;quot; style=&amp;quot;width:100%; overflow-x:auto; background-color:#ffffff; padding:15px; border:1px solid #dddddd; border-radius:5px; margin-top:10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;mermaid-loader&amp;quot; style=&amp;quot;color:#666; text-align:center; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
        🔄 جاري معالجة وتوليد اللوحة الهرمية التفاعلية...&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;display:none; background:none; border:none; padding:0; margin:0; text-align:center;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=Person:33&amp;diff=460</id>
		<title>Person:33</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=Person:33&amp;diff=460"/>
		<updated>2026-10-18T16:23:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Person&lt;br /&gt;
|اسم_الشخص=حمد&lt;br /&gt;
|Father_ID=32&lt;br /&gt;
|Father=صالح&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== لوحة مشجرة النسب الهرمية التجريبية ===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;family-tree-mermaid-render&amp;quot; data-personid=&amp;quot;33&amp;quot; data-fatherid=&amp;quot;صالح&amp;quot; style=&amp;quot;width:100%; overflow-x:auto; background-color:#ffffff; padding:15px; border:1px solid #dddddd; border-radius:5px; margin-top:10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;mermaid-loader&amp;quot; style=&amp;quot;color:#666; text-align:center; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
        🔄 جاري معالجة وتوليد اللوحة الهرمية التفاعلية...&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;pre class=&amp;quot;mermaid&amp;quot; style=&amp;quot;display:none; background:none; border:none; padding:0; margin:0; text-align:center;&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=459</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=459"/>
		<updated>2026-10-18T16:21:03Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل مع استدعاء مكتبة الرسم */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        // تأمين تحميل مكتبة Mermaid وتفعيلها في المتصفح فوراً قبل بناء الاستعلام&lt;br /&gt;
        mw.loader.using([&#039;ext.mermaid&#039;]).then(function() {&lt;br /&gt;
&lt;br /&gt;
            var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
            var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(apiUrl, function(data) {&lt;br /&gt;
                var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
                if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                    var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                    $.each(results, function(title, pageData) {&lt;br /&gt;
                        var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                        var printouts = pageData.printouts || {};&lt;br /&gt;
                        &lt;br /&gt;
                        var cleanName = &#039;&#039;;&lt;br /&gt;
                        var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                        if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                        else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                        &lt;br /&gt;
                        if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                            cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
                        if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                            cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                        var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr) : pageId;&lt;br /&gt;
                        currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                        var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                        var fatherId = null;&lt;br /&gt;
                        if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                            var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                            fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                            if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        if (currentId) {&lt;br /&gt;
                            rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                    var ancestorNodes = [];&lt;br /&gt;
                    var ancestorIds = new Set();&lt;br /&gt;
                    var loopId = currentPersonId;&lt;br /&gt;
                    var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                    while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                        var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                        if (matchedNode) {&lt;br /&gt;
                            if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                                ancestorNodes.push(matchedNode);&lt;br /&gt;
                                ancestorIds.add(matchedNode.id);&lt;br /&gt;
                            }&lt;br /&gt;
                            loopId = matchedNode.parentId;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            loopId = null;&lt;br /&gt;
                        }&lt;br /&gt;
                        safetyGuard++;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var descendantNodes = [];&lt;br /&gt;
                    var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                    function collectDescendants(parentId) {&lt;br /&gt;
                        var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                        children.forEach(function(child) {&lt;br /&gt;
                            if (!descendantIds.has(child.id)) {&lt;br /&gt;
                                descendantNodes.push(child);&lt;br /&gt;
                                descendantIds.add(child.id);&lt;br /&gt;
                                collectDescendants(child.id);&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                    var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:13px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:13px;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:15px,font-weight:bolder;\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:13px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                        ancestorNodes.reverse();&lt;br /&gt;
                        for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                            var node = ancestorNodes[i];&lt;br /&gt;
                            var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                    var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                    mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                    mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                        descendantNodes.forEach(function(node) {&lt;br /&gt;
                            mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                            mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    $loader.hide();&lt;br /&gt;
                    $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                    // استدعاء نظام الإنعاش وإعادة الرسم الشجري في المتصفح فوراً&lt;br /&gt;
                    if (window.mermaid) {&lt;br /&gt;
                        window.mermaid.init(undefined, $pre);&lt;br /&gt;
                    } else if (typeof mermaid !== &#039;undefined&#039;) {&lt;br /&gt;
                        mermaid.init(undefined, $pre);&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=458</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=458"/>
		<updated>2026-10-18T16:18:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 4. محرك شجرة الأنساب الهرمية التفاعلية (Mermaid) الشامل للصعود والنزول المتزامن */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-mermaid-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $pre = $container.find(&#039;pre.mermaid&#039;);&lt;br /&gt;
        var $loader = $container.find(&#039;.mermaid-loader&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var currentPersonId = parseInt($container.data(&#039;personid&#039;), 10);&lt;br /&gt;
        if (!currentPersonId || isNaN(currentPersonId)) return;&lt;br /&gt;
&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=1000&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                // 1. جرد وتطهير كافة البيانات من قاعدة البيانات الدلالية&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) { cleanName = blobAttr[1]; }&lt;br /&gt;
                    else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) { cleanName = blobAttr[0].fulltext || blobAttr[0]; }&lt;br /&gt;
                    &lt;br /&gt;
                    if (cleanName &amp;amp;&amp;amp; typeof cleanName === &#039;string&#039;) {&lt;br /&gt;
                        cleanName = cleanName.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) ? (currentIdAttr[0].fulltext || currentIdAttr[0]) : pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0];&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // 2. تتبع وبناء حبل الصعود المباشر (الأجداد الصافيين فقط)&lt;br /&gt;
                var ancestorNodes = [];&lt;br /&gt;
                var ancestorIds = new Set();&lt;br /&gt;
                var loopId = currentPersonId;&lt;br /&gt;
                var safetyGuard = 0;&lt;br /&gt;
&lt;br /&gt;
                while (loopId &amp;amp;&amp;amp; safetyGuard &amp;lt; 25) {&lt;br /&gt;
                    var matchedNode = rawNodes.find(function(n) { return n.id == loopId; });&lt;br /&gt;
                    if (matchedNode) {&lt;br /&gt;
                        if (matchedNode.id !== currentPersonId) {&lt;br /&gt;
                            ancestorNodes.push(matchedNode);&lt;br /&gt;
                            ancestorIds.add(matchedNode.id);&lt;br /&gt;
                        }&lt;br /&gt;
                        loopId = matchedNode.parentId; // الانتقال للأب صعوداً&lt;br /&gt;
                    } else {&lt;br /&gt;
                        loopId = null;&lt;br /&gt;
                    }&lt;br /&gt;
                    safetyGuard++;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // 3. تتبع وبناء الفروع نزولاً (الذرية والأبناء كاملة)&lt;br /&gt;
                var descendantNodes = [];&lt;br /&gt;
                var descendantIds = new Set();&lt;br /&gt;
&lt;br /&gt;
                function collectDescendants(parentId) {&lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == parentId; });&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        if (!descendantIds.has(child.id)) {&lt;br /&gt;
                            descendantNodes.push(child);&lt;br /&gt;
                            descendantIds.add(child.id);&lt;br /&gt;
                            collectDescendants(child.id); // تكرار النزول للأجيال القادمة&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
                collectDescendants(currentPersonId);&lt;br /&gt;
&lt;br /&gt;
                // 4. صياغة كود شفرة هرم الـ Mermaid التفاعلي&lt;br /&gt;
                var mermaidCode = &amp;quot;graph TD\n&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                // تعريف وتلوين الستايلات الفخمة للأزرار والخلايا&lt;br /&gt;
                mermaidCode += &amp;quot;classDef default fill:#f8f9fa,stroke:#dddddd,stroke-width:1px,color:#2c3e50,font-weight:bold,font-size:13px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef ancestor fill:#f4f7fb,stroke:#2a4b7c,stroke-width:2px,color:#2a4b7c,font-size:13px;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef current fill:#27ae60,stroke:#219653,stroke-width:3px,color:#ffffff,font-size:15px,font-weight:bolder;\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;classDef descendant fill:#ffffff,stroke:#27ae60,stroke-width:2px,color:#2c3e50,font-size:13px;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                // أ- ربط الجذور والأجداد صعوداً بشكل عمودي مستقيم&lt;br /&gt;
                if (ancestorNodes.length &amp;gt; 0) {&lt;br /&gt;
                    // عكس المصفوفة لتبدأ الرسم التراتبي من الجد الأكبر (بني تميم) لأسفل&lt;br /&gt;
                    ancestorNodes.reverse();&lt;br /&gt;
                    for (var i = 0; i &amp;lt; ancestorNodes.length; i++) {&lt;br /&gt;
                        var node = ancestorNodes[i];&lt;br /&gt;
                        var nextNodeId = (i === ancestorNodes.length - 1) ? currentPersonId : ancestorNodes[i+1].id;&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;] --&amp;gt; N&amp;quot; + nextNodeId + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; ancestor;\n&amp;quot;;&lt;br /&gt;
                        mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // ب- تعريف خلية الشخص الحالي (حمد) وتلوينها بالأخضر المشع المميز&lt;br /&gt;
                var currNode = rawNodes.find(function(n) { return n.id == currentPersonId; });&lt;br /&gt;
                var currTitle = currNode ? currNode.title : $(&#039;#firstHeading&#039;).text().trim();&lt;br /&gt;
                mermaidCode += &amp;quot;  N&amp;quot; + currentPersonId + &amp;quot;[\&amp;quot;&amp;quot; + currTitle + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                mermaidCode += &amp;quot;  class N&amp;quot; + currentPersonId + &amp;quot; current;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                // ج- ربط الأبناء والذرية التنازلية&lt;br /&gt;
                if (descendantNodes.length &amp;gt; 0) {&lt;br /&gt;
                    descendantNodes.forEach(function(node) {&lt;br /&gt;
                        mermaidCode += &amp;quot;  N&amp;quot; + node.parentId + &amp;quot; --&amp;gt; N&amp;quot; + node.id + &amp;quot;[\&amp;quot;&amp;quot; + node.title + &amp;quot;\&amp;quot;]\n&amp;quot;;&lt;br /&gt;
                        mermaidCode += &amp;quot;  class N&amp;quot; + node.id + &amp;quot; descendant;\n&amp;quot;;&lt;br /&gt;
                        mermaidCode += &amp;quot;  click N&amp;quot; + node.id + &amp;quot; \&amp;quot;/index.php?title=&amp;quot; + encodeURIComponent(node.pageName) + &amp;quot;\&amp;quot; \&amp;quot;تصفح صفحة &amp;quot; + node.title + &amp;quot;\&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // 5. حقن الشفرة وتوجيه إضافة الـ Mermaid لإعادة رسم اللوحة في المتصفح&lt;br /&gt;
                $loader.hide();&lt;br /&gt;
                $pre.text(mermaidCode).show();&lt;br /&gt;
&lt;br /&gt;
                if (window.mermaid) {&lt;br /&gt;
                    window.mermaid.init(undefined, $pre);&lt;br /&gt;
                }&lt;br /&gt;
            } else {&lt;br /&gt;
                $loader.html(&amp;quot;⚠️ لا توجد صلات قرابة مسجلة لهذا المعرف.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $loader.html(&amp;quot;❌ فشل الاتصال بقاعدة البيانات لتوليد اللوحة الهرمية.&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=Person:87&amp;diff=457</id>
		<title>Person:87</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=Person:87&amp;diff=457"/>
		<updated>2026-10-17T21:06:50Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039;{{Person |اسم_الشخص=عبدالله |Father_ID=85 }}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Person&lt;br /&gt;
|اسم_الشخص=عبدالله&lt;br /&gt;
|Father_ID=85&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=Person:86&amp;diff=456</id>
		<title>Person:86</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=Person:86&amp;diff=456"/>
		<updated>2026-10-17T21:05:37Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039;{{Person |اسم_الشخص=محمد |Father_ID=84 }}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Person&lt;br /&gt;
|اسم_الشخص=محمد&lt;br /&gt;
|Father_ID=84&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=455</id>
		<title>ميدياويكي:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Common.js&amp;diff=455"/>
		<updated>2026-10-17T21:00:27Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* أي جافاسكريبت هنا سيتم تحميلها لكل المستخدمين مع كل تحميل للصفحة. */&lt;br /&gt;
&lt;br /&gt;
/* 1. محرك جدول المعرفات السيمانتكي الديناميكي والجميل بالكامل (محلي ومستقل 100% بدون أي كود خارجي) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-ids-mw&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            // تنسيق رؤوس الجدول وإعطاؤها لمسة احترافية&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(0).text(&#039;معرف الصفحة (ID)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            $table.find(&#039;th&#039;).eq(1).text(&#039;اسم الشخص (القناع)&#039;).css({&#039;background-color&#039;: &#039;#2a4b7c&#039;, &#039;color&#039;: &#039;#ffffff&#039;, &#039;text-align&#039;: &#039;right&#039;, &#039;padding&#039;: &#039;10px&#039;});&lt;br /&gt;
            &lt;br /&gt;
            // إضافة خاصية التنسيق العام لـ وبنية الجدول&lt;br /&gt;
            $table.css({&#039;border-collapse&#039;: &#039;collapse&#039;, &#039;width&#039;: &#039;100%&#039;, &#039;margin-top&#039;: &#039;15px&#039;});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // استعلام دلالي موسع يدعم الفحص بالشرطة والمسافة لحماية المعرفات&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?Display_title_of|?Display title of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
        &lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query) ? data.query.results : null;&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rowsHtml = &#039;&#039;;&lt;br /&gt;
                &lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    if (title === &#039;المعرفات&#039; || title.indexOf(&#039;قالب:&#039;) !== -1) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 فصل وتأمين رقم الـ ID النقي مباشرة من عنوان الويكي الفعلي لحل خلل الفراغ&lt;br /&gt;
                    var pageId = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
                    pageId = pageId.toString().replace(/[^0-9]/g, &#039;&#039;).trim();&lt;br /&gt;
                    &lt;br /&gt;
                    var pageTitleId = &amp;quot;Person:&amp;quot; + pageId;&lt;br /&gt;
                    &lt;br /&gt;
                    // 💡 طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي بدعم كامل لكافة التحديثات الدلالية للنظام&lt;br /&gt;
                    var displayMask = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr) {&lt;br /&gt;
                        if (Array.isArray(blobAttr) &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                            // إذا كانت مصفوفة كائنات، نلتقط النص أو الخانة الصافية المتاحة&lt;br /&gt;
                            var firstObj = blobAttr[1] || blobAttr[0];&lt;br /&gt;
                            displayMask = (firstObj &amp;amp;&amp;amp; typeof firstObj === &#039;object&#039;) ? (firstObj.fulltext || firstObj.text || &#039;&#039;) : firstObj;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;object&#039; &amp;amp;&amp;amp; blobAttr.fulltext) {&lt;br /&gt;
                            displayMask = blobAttr.fulltext;&lt;br /&gt;
                        } else if (typeof blobAttr === &#039;string&#039;) {&lt;br /&gt;
                            displayMask = blobAttr;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // تنظيف الاسم المستخرج من أي لواحق أو عناوين برمجية متبقية&lt;br /&gt;
                    if (displayMask &amp;amp;&amp;amp; typeof displayMask === &#039;string&#039;) {&lt;br /&gt;
                        displayMask = displayMask.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!displayMask || displayMask === &#039;&#039; || !isNaN(displayMask) || displayMask.indexOf(&#039;Person:&#039;) !== -1) {&lt;br /&gt;
                        displayMask = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                        if (!isNaN(displayMask) &amp;amp;&amp;amp; displayMask !== &#039;&#039;) {&lt;br /&gt;
                            displayMask = &amp;quot;فرد رقم (&amp;quot; + displayMask + &amp;quot;)&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // بناء الأسطر وتلوين الخلايا بشكل منسق ومريح للعين عند القراءة والفرز&lt;br /&gt;
                    rowsHtml += &#039;&amp;lt;tr style=&amp;quot;border-bottom: 1px solid #dddddd;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-family: monospace; font-size: 14px; font-weight: bold; width: 40%;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php?title=&#039; + encodeURIComponent(title) + &#039;&amp;quot; style=&amp;quot;color: #2a4b7c; text-decoration: none;&amp;quot;&amp;gt;&#039; + pageTitleId + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;td style=&amp;quot;padding: 10px 12px; font-weight: bold; color: #27ae60; font-size: 14px; width: 60%;&amp;quot;&amp;gt;&#039; + displayMask + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                &lt;br /&gt;
                // تفعيل الفرز التلقائي والمؤثرات الجمالية عند تمرير الماوس فوق الأسطر&lt;br /&gt;
                $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                    function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                );&lt;br /&gt;
                if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 2. محرك شجرة الأنساب التكراري المطور والآمن المتكامل مع تميز الصفحة الحالية (مستقر 100% وبدون مسميات مختلطة) */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.family-tree-api-render&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var rootId = $container.data(&#039;rootid&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // تطهير المعرف للتأكد من أنه رقم مجرد تماماً ومتوافق مع قاعدة البيانات&lt;br /&gt;
        if (rootId) {&lt;br /&gt;
            rootId = parseInt(rootId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
        }&lt;br /&gt;
        if (!rootId || isNaN(rootId)) return;&lt;br /&gt;
&lt;br /&gt;
        var maxGenerations = 20;&lt;br /&gt;
        var pageTitle = mw.config.get(&amp;quot;wgPageName&amp;quot;).replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم المقالة الحالية الصريح من نظام ميدياويكي للمطابقة الدقيقة&lt;br /&gt;
        var currentPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // التقاط اسم رأس الشجرة (الجذر) الافتراضي من عنوان المتصفح المرئي فوراً لضمان الثبات الكامل&lt;br /&gt;
        var rootCleanTitle = $(&#039;#firstHeading&#039;).text().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        if (!rootCleanTitle || rootCleanTitle === &#039;&#039; || !isNaN(rootCleanTitle)) {&lt;br /&gt;
            rootCleanTitle = pageTitle.replace(/Person:/g, &#039;&#039;).trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // الاستعلام الدلالي الشامل والموسع لـ 500 عنصر بالمسافات والشرطات معاً لضمان الأمان البنيوي&lt;br /&gt;
        var askQuery = &amp;quot;[[معرف الشخص::+]]|[[معرف_الشخص::+]]|?معرف الشخص|?معرف_الشخص|?معرف الأب|?معرف_الأب|?Display_title_of|limit=500&amp;quot;;&lt;br /&gt;
        var apiUrl = &#039;/api.php?action=ask&amp;amp;format=json&amp;amp;query=&#039; + encodeURIComponent(askQuery);&lt;br /&gt;
&lt;br /&gt;
        $.getJSON(apiUrl, function(data) {&lt;br /&gt;
            var results = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.results) ? data.query.results : null;&lt;br /&gt;
&lt;br /&gt;
            if (results &amp;amp;&amp;amp; Object.keys(results).length &amp;gt; 0) {&lt;br /&gt;
                var rawNodes = [];&lt;br /&gt;
&lt;br /&gt;
                $.each(results, function(title, pageData) {&lt;br /&gt;
                    var pageId = parseInt(pageData.pageid || pageData.id, 10);&lt;br /&gt;
                    var printouts = pageData.printouts || {};&lt;br /&gt;
                    &lt;br /&gt;
                    // طريقتك الذهبية الثابتة والناجحة: قنص واصطياد الاسم العربي النقي من الخانة الثانية داخل مصفوفة الـ BLOB&lt;br /&gt;
                    var cleanName = &#039;&#039;;&lt;br /&gt;
                    var blobAttr = printouts[&amp;quot;Display_title_of&amp;quot;] || printouts[&amp;quot;Display title of&amp;quot;];&lt;br /&gt;
                    &lt;br /&gt;
                    if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 1) {&lt;br /&gt;
                        cleanName = blobAttr[1]; // استخلاص الكلمة العربية الصافية مباشرة بنجاح مؤكد&lt;br /&gt;
                    } else if (blobAttr &amp;amp;&amp;amp; blobAttr.length &amp;gt; 0) {&lt;br /&gt;
                        cleanName = blobAttr[0].fulltext || blobAttr[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // خطة احتياطية فورية: تنظيف عنوان الصفحة الفعلي إذا كان حقل مصفوفة الـ BLOB فارغاً&lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039; || !isNaN(cleanName)) {&lt;br /&gt;
                        cleanName = title.replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // تنظيف النص النهائي المستخرج تماماً لضمان إزالة الصيغ البرمجية المختلطة مثل &amp;quot;Person:ID&amp;quot;&lt;br /&gt;
                    if (cleanName) {&lt;br /&gt;
                        cleanName = cleanName.toString().replace(/Person_/g, &#039;&#039;).replace(/Person:/g, &#039;&#039;).replace(/\s*\(.*?\)\s*/g, &#039;&#039;).replace(/^[0-9]+$/g, &#039;&#039;).trim();&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (!cleanName || cleanName === &#039;&#039;) {&lt;br /&gt;
                        cleanName = &amp;quot;فرد رقم (&amp;quot; + pageId + &amp;quot;)&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    // شرطك المرن المبتكر: التحقق مما إذا كان المتغير &amp;quot;معرف الشخص&amp;quot; بالمسافة أو بالشرطة السفلية&lt;br /&gt;
                    var currentIdAttr = printouts[&amp;quot;معرف الشخص&amp;quot;] || printouts[&amp;quot;معرف_الشخص&amp;quot;];&lt;br /&gt;
                    var currentId = null;&lt;br /&gt;
                    if (currentIdAttr &amp;amp;&amp;amp; currentIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        currentId = currentIdAttr[0].fulltext || currentIdAttr[0] || currentIdAttr;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (!currentId) currentId = pageId;&lt;br /&gt;
                    currentId = parseInt(currentId.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
&lt;br /&gt;
                    // نفس الشرط المرن المبتكر لحماية متغير &amp;quot;معرف الأب&amp;quot; بالمسافة أو بالشرطة السفلية صراحة&lt;br /&gt;
                    var fatherIdAttr = printouts[&amp;quot;معرف الأب&amp;quot;] || printouts[&amp;quot;معرف_الأب&amp;quot;];&lt;br /&gt;
                    var fatherId = null;&lt;br /&gt;
                    if (fatherIdAttr &amp;amp;&amp;amp; fatherIdAttr.length &amp;gt; 0) {&lt;br /&gt;
                        var rawFather = fatherIdAttr[0].fulltext || fatherIdAttr[0] || fatherIdAttr;&lt;br /&gt;
                        fatherId = parseInt(rawFather.toString().replace(/[^0-9]/g, &#039;&#039;), 10);&lt;br /&gt;
                        if (isNaN(fatherId)) fatherId = null;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (currentId) {&lt;br /&gt;
                        rawNodes.push({ id: currentId, parentId: fatherId, title: cleanName, pageName: title });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // تحديث اسم الجذر (رأس الشجرة الحالية) إذا توازى المعرف مع عناصر الذاكرة لزيادة الكفاءة&lt;br /&gt;
                var rootNodeInfo = rawNodes.find(function(n) { return n.id == rootId; });&lt;br /&gt;
                if (rootNodeInfo) {&lt;br /&gt;
                    rootCleanTitle = rootNodeInfo.title;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // دالة البناء التكراري ورسم الأفرع والتسلسلات الشجرية الفورية عالية الكفاءة في ذاكرة المتصفح&lt;br /&gt;
                function buildTreeHtml(currentParentId, depth) {&lt;br /&gt;
                    if (depth &amp;gt; maxGenerations) return &amp;quot;&amp;quot;;&lt;br /&gt;
                    &lt;br /&gt;
                    var children = rawNodes.filter(function(node) { return node.parentId == currentParentId; });&lt;br /&gt;
                    if (children.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    children.sort(function(a, b) { return a.title.localeCompare(b.title, &#039;ar&#039;); });&lt;br /&gt;
&lt;br /&gt;
                    var html = &amp;quot;&amp;quot;;&lt;br /&gt;
                    var indent = Array(depth + 1).join(&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    children.forEach(function(child) {&lt;br /&gt;
                        // المطابقة المرنة بالـ ID الرقمي لـ تميز الأبناء إذا كان أحدهم هو الصفحة الحالية&lt;br /&gt;
                        if (child.id == rootId || child.pageName === currentPageName) {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important; display: inline-block;&#039;&amp;gt;&amp;quot; + child.title + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            html += &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; + indent + &amp;quot;←&amp;amp;nbsp;&amp;lt;a href=&#039;/index.php?title=&amp;quot; + encodeURIComponent(child.pageName) + &amp;quot;&#039; style=&#039;color: #2a4b7c; font-weight: bold;&#039; data-personid=&#039;&amp;quot; + child.id + &amp;quot;&#039;&amp;gt; &amp;quot; + child.title + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                        html += buildTreeHtml(child.id, depth + 1);&lt;br /&gt;
                    });&lt;br /&gt;
                    return html;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var childrenHtml = buildTreeHtml(rootId, 1);&lt;br /&gt;
                &lt;br /&gt;
                // صياغة رأس الشجرة (الجذر الأكبر) بهيكلية ثابتة وتلوينها بالأخضر عند دخول صفحتها&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;lt;span class=&#039;tree-root-span&#039;&amp;gt;&amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
                if (childrenHtml) {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + childrenHtml);&lt;br /&gt;
                } else {&lt;br /&gt;
                    $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد فروع أو ذرية مسجلة نزولاً لهذا المعرف الرقمي في النظام.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // تفعيل التلوين الأخضر والتكبير الصارم بعد استقرار ومزامنة بناء كامل فروع الشجرة بالكامل في المتصفح&lt;br /&gt;
                if (rootId == parseInt(currentPageName.replace(/[^0-9]/g, &#039;&#039;), 10) || pageTitle === rootCleanTitle || currentPageName.indexOf(rootId.toString()) !== -1) {&lt;br /&gt;
                    $container.find(&#039;.tree-root-span&#039;).css({&lt;br /&gt;
                        &#039;color&#039;: &#039;#27ae60&#039;,&lt;br /&gt;
                        &#039;font-weight&#039;: &#039;bolder&#039;,&lt;br /&gt;
                        &#039;font-size&#039;: &#039;115%&#039;,&lt;br /&gt;
                        &#039;display&#039;: &#039;inline-block&#039;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                var finalRootTitleHtml = &amp;quot;• &amp;lt;span style=&#039;color: #27ae60 !important; font-weight: bolder !important; font-size: 115% !important;&#039;&amp;gt; &amp;quot; + rootCleanTitle + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
                $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:#666;&#039;&amp;gt;لا توجد نتائج مسجلة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            var finalRootTitleHtml = &amp;quot;• &#039;&#039;&#039;&amp;quot; + rootCleanTitle + &amp;quot;&#039;&#039;&#039;&amp;quot;;&lt;br /&gt;
            $container.html(finalRootTitleHtml + &amp;quot;&amp;lt;br /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;←&amp;amp;nbsp;&amp;lt;span style=&#039;color:red;&#039;&amp;gt;❌ فشل جلب الشجرة عبر الـ API المحلي للموسوعة.&amp;lt;/span&amp;gt;&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* 3. محرك جلب وعرض جداول قاعدة البيانات الكلية من ملف الـ PHP مباشرة لصفحة كل المعرفات */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;كل_المعرفات&#039;) {&lt;br /&gt;
        var $table = $(&#039;#table-all-database-ids&#039;);&lt;br /&gt;
        if ($table.length &amp;gt; 0) {&lt;br /&gt;
            &lt;br /&gt;
            // سحب محتوى الأسطر الصافية من ملف الـ PHP مباشرة وحقنها في الذاكرة اللحظية&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: &#039;/all-ids.php&#039;,&lt;br /&gt;
                type: &#039;GET&#039;,&lt;br /&gt;
                cache: false,&lt;br /&gt;
                success: function(rowsHtml) {&lt;br /&gt;
                    if (rowsHtml &amp;amp;&amp;amp; rowsHtml.trim() !== &#039;&#039;) {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(rowsHtml);&lt;br /&gt;
                        &lt;br /&gt;
                        // تفعيل تأثيرات التمرير الجمالية فوق الأسطر&lt;br /&gt;
                        $table.find(&#039;tbody tr&#039;).hover(&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;#f5f7fa&#039;); },&lt;br /&gt;
                            function() { $(this).css(&#039;background-color&#039;, &#039;transparent&#039;); }&lt;br /&gt;
                        );&lt;br /&gt;
                        // تفعيل الفرز التلقائي الفوري للأعمدة&lt;br /&gt;
                        if ($.fn.tablesorter) { $table.tablesorter(); }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ عجز النظام عن العثور على أسطر صالحة في قاعدة البيانات.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function() {&lt;br /&gt;
                    $table.find(&#039;tbody&#039;).html(&#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center; color:red;&amp;quot;&amp;gt;❌ فشل الاتصال بملف all-ids.php في السيرفر.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=Person:85&amp;diff=454</id>
		<title>Person:85</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=Person:85&amp;diff=454"/>
		<updated>2026-10-17T20:58:36Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039;{{Person |اسم_الشخص=ابراهيم |Father_ID=53 }}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Person&lt;br /&gt;
|اسم_الشخص=ابراهيم&lt;br /&gt;
|Father_ID=53&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=Person:84&amp;diff=453</id>
		<title>Person:84</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=Person:84&amp;diff=453"/>
		<updated>2026-10-17T20:58:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039;{{Person |اسم_الشخص=مبارك |Father_ID=53 }}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Person&lt;br /&gt;
|اسم_الشخص=مبارك&lt;br /&gt;
|Father_ID=53&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=Person:83&amp;diff=452</id>
		<title>Person:83</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=Person:83&amp;diff=452"/>
		<updated>2026-10-17T20:55:07Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039;{{Person |اسم_الشخص=يحيى |Father_ID=80 }}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Person&lt;br /&gt;
|اسم_الشخص=يحيى&lt;br /&gt;
|Father_ID=80&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=Person:82&amp;diff=451</id>
		<title>Person:82</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=Person:82&amp;diff=451"/>
		<updated>2026-10-17T20:54:11Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039;{{Person |اسم_الشخص=عبدالله |Father_ID=80 }}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Person&lt;br /&gt;
|اسم_الشخص=عبدالله&lt;br /&gt;
|Father_ID=80&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=Person:81&amp;diff=450</id>
		<title>Person:81</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=Person:81&amp;diff=450"/>
		<updated>2026-10-17T20:53:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039;{{Person |اسم_الشخص=عبدالعزيز |Father_ID=80 }}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Person&lt;br /&gt;
|اسم_الشخص=عبدالعزيز&lt;br /&gt;
|Father_ID=80&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=Person:80&amp;diff=449</id>
		<title>Person:80</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=Person:80&amp;diff=449"/>
		<updated>2026-10-17T20:49:36Z</updated>

		<summary type="html">&lt;p&gt;Admin: أنشأ الصفحة ب&amp;#039;{{Person |اسم_الشخص=محمد |Father_ID=51 }}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Person&lt;br /&gt;
|اسم_الشخص=محمد&lt;br /&gt;
|Father_ID=51&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://dbspedia.org/index.php?title=%D9%83%D9%84_%D8%A7%D9%84%D9%85%D8%B9%D8%B1%D9%81%D8%A7%D8%AA&amp;diff=448</id>
		<title>كل المعرفات</title>
		<link rel="alternate" type="text/html" href="https://dbspedia.org/index.php?title=%D9%83%D9%84_%D8%A7%D9%84%D9%85%D8%B9%D8%B1%D9%81%D8%A7%D8%AA&amp;diff=448"/>
		<updated>2026-10-17T16:35:05Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
تُظهر هذه الصفحة جردًا شاملاً ومباشرًا لكافة العناوين الأصلية المخزنة في قاعدة البيانات (page_title) مقترنة بأرقامها التعريفية الفريدة (page_id).&lt;br /&gt;
&lt;br /&gt;
{| id=&amp;quot;table-all-database-ids&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width: 100%; border-collapse: collapse; margin-top: 15px; box-shadow: 0 2px 5px rgba(0,0,0,0.05); font-size: 14px; text-align: right;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color: #2a4b7c; color: #ffffff; padding: 10px; font-weight: bold; width: 50%;&amp;quot; | عنوان الصفحة في قاعدة البيانات (page_title)&lt;br /&gt;
! style=&amp;quot;background-color: #2a4b7c; color: #ffffff; padding: 10px; font-weight: bold; width: 50%;&amp;quot; | الرقم التعريفي للمقالة (page_id)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center; color: #666; padding: 15px;&amp;quot; | جاري سحب جداول قاعدة البيانات الشاملة بالملي...&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>