وحدة:Wikidata2

من موسوعة المزرعة
اذهب إلى التنقل اذهب إلى البحث

هذه الوحدة نسخت في البداية من sv:Modul:Wikidata2 ومن ثم تم تطويرها هنا. sv:Modul:Wikidata2

الاستخدامات[عدل]

أنظر قائمة قوالب تستخدم هذه الوحدة.

الوحدات الفرعية[عدل]

الاستعمال[عدل]

مثال

{{#invoke:Wikidata2|formatStatements|property=p17}}

الوسائط[عدل]

formatStatements[عدل]

  • |property= مطلوب الخاصية المطلوبة.
    • |entityId= أو |id= معرف عنصر ويكي بيانات.
    • |page= يمكن إستخدامه بدلاً من |entityId=Q805 كالتالي: |page=اليمن .
    • |enbarten= أو |firstvalue= يعرض أول قيمة فقط في الخاصية.
      • |firstvalue=2 يعرض القيمة الثانية في الخاصية إن كانت موجودة، يمكن استخدام هذا الخيار حتى رقم 9.
    • |numval= يعرض عدد محدد من القيم في الخاصية.
      • |numval=4 يعرض القيم الأربع الأولى في الخاصية إن كانت موجودة.
    • |prefix= بادئة
    • |suffix= لاحقة
    • |formatting= يحدد تنسيق القيم يستخدم مع ⧼datatypes-type-globe-coordinate⧽، و⧼datatypes-type-wikibase-item⧽، و⧼datatypes-type-wikibase-property⧽.
    • |label= اذا كنت تريد الاختيار كيفية ظهور الوصلات. مثلا [[شعار مقاطعة بليكينج|الشعار]] يمكن الحصول عليها عن طريق اضافة |label=الشعار تؤثر هذه المعلمة على وحدات القياس.
    • |raw= يعود بالنتيجة خام على شكل جداول (يستخدم من داخل وحدات لوا أخرى) ويمكن معاينة ما سيكون الناتج عليه عبر إضافة خيار |rawtolua=.

    فصل القيم[عدل]

    • |separator= فاصلة بين البنود | انظر أيضا conjunction
    • |conjunction= الفاصلة الأخيرة قبل اخر بند، افتراضي ، و .
    القيم الافتراضية
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P106|rank=all}}  
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    • |separator=br يضع القيم في أسطر.
    القيم الافتراضية
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P106|rank=all|separator=br}}  
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).
    • |separator=* يضع القيم في قائمة نقطية.
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P106|rank=all|separator=*}}  
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).

    تحديد عدد القيم[عدل]

    • |numval=2 عدد القيم المراد عرضها
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P106|rank=all|numval=2}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    رتبة القيم / rank[عدل]

  • |rank= يحدد نوع البيانات المطلوب عرضها:
    • |rank=all يظهر جميع البنود في الخاصية.
    • |rank=valid يظهر البنود المفضلة والتي بوضع "ترتيب عادي" ولكن لا يظهر المهملة.
    • |rank=best (افتراضي) يظهر القيم المفضلة.
  • فرز النتيجة / sort[عدل]

    • |sortbytime= الترتيب حسب الوقت يفيد هذا مع المعلمة |enbarten= أعلاه
      • |sortbytime=chronological ترتيب البنود حسب زمن التصفيات المذكورة.
      • |sortbytime=inverted عكس البند السابق.
    • |sortingproperty= تحديد الخواص المدعومة، الافتراضي هو:'P585','P571','P580','P569','P582','P570' بالترتيب، الخواص المعتمدة حالياً هي خواص الوقت. [[d:Property:P585|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P585)]] ،[[d:Property:P571|

    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P571)]] ،[[d:Property:P580|

    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P580)]] ،[[d:Property:P569|

    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P569)]] ،[[d:Property:P582|

    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P582)]] ،[[d:Property:P570|

    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P570)]].

    • |sortingproperty=sortbyarbitrary فرز القيم بواسطة تاريخ العناصر المرتبطة مثل تاريخ ولادة أبناء شخص "الأطفال". القيم المسموح بها هي:
      • |sortingproperty=chronological
      • |sortingproperty=inverted . وتعطى مع الخاصية المراد تفتيشها ' sortingproperty اعلاه'.

    المراجع / References / Sources[عدل]

  • |noref= أدخل قيمة في هذه المعلمة إذا كنت لا تريد جلب المصادر من ويكي بيانات.
  • |justref= أدخل قيمة في هذه المعلمة إذا كنت تريد جلب المصادر فقط دون ظهور القيمة!.
  • |onlyvaluewithref= لإظهار البيانات التي لها مراجع فقط.
  • |numberofreferences= لوضع حد أقصى للمراجع لكل قيمة، مثلاً عند تحديد |numberofreferences=1 يظهر مرجع واحد فقط في كل قيمة إن كان متوفراً.
  • صياغة النص[عدل]

    • |formatcharacters= تحديد صيغة اخراج القيمة، القيم المسموح بها هي: lc/uc/lcfirst/ucfirst/formatnum
      • |formatcharacters=lc: تحويل جميع أحرف النص الإنجليزي إلى حروف صغيرة.
      • |formatcharacters=lcfirst: تحويل الحرف الأول من النص الإنجليزي إلى حرف صغير.
      • |formatcharacters=uc : تحويل جميع أحرف النص الإنجليزي إلى حروف كبيرة.
      • |formatcharacters=ucfirst: تحويل الحرف الأول من النص الإنجليزي إلى حرف كبير.
      • |formatcharacters=formatnum: مشروحة في #كمية.

    تصفيات / Qualifiers[عدل]

  • |withdate= يضيف تصفية [[d:Property:P585|
  • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P585)]] إذا كانت موجودة.

    • |bothdates= يضيف تصفيات [[d:Property:P580|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P580)]] و[[d:Property:P582|

    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P582)]] إذا كانتا موجودتان كلاهما أو إحداهما.

      • |bothdates=line يضع سطر جديد قبل التاريخ، |bothdates=before يضع التاريخ قبل القيمة، |bothdates=after يضع التاريخ بعد القيمة.
    • |qual1= يضيف تصفية محددة.
      • |qual1=P1545 يضيف تصفية [[d:Property:P1545|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P1545)]] الى بنود الخاصية، مثال:منصب باراك أوباما + ترتيبه:

    فلترة النتائج[عدل]
    • |avoidqualifier= يتجاهل القيم التي تحتوي تصفيات معينة، مثل: |avoidqualifier=P518 يظهر البند الذي لا يحتوي على تصفية [[d:Property:P518|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P518)]].

      • بإستخدام |avoidqualifiervalue= مع |avoidqualifier= فإن ذلك يحدد قيمة التصفية إذا طابقت الوسيط |avoidqualifiervalue= فلن يتم إظهارها، وإذا لم تطابق فسيتم إظهارها، يدعم حالياً العناصر/items فقط.
    • |preferqualifier= تحديد خاصية تصفيات يجب أن تكون بيانات الخاصية متضمنتها.
      • |preferqualifiervalue= تحدد القيمة التي تناسب أعلاه. يدعم حالياً العناصر فقط.
    • |justthisqual= يظهر فقط التصفية، إذا لم تكن التصفية موجودة لن يظهر شيء.

    وسائط حسب نوع البيانات / datatype[عدل]

    ⧼datatypes-type-wikibase-item⧽ / item[عدل]
  • |nolink= يظهر النتيجة دون وصلات.
  • |formatting=raw يعرض القيمة بشكل Q505.
  • |formatting=sitelink ينتج الوصلة إذا كانت موجودة في الويكي العربية.
  • فلترة النتيجة[عدل]
    • |getonly= يستخدم هذا الوسيط إذا أردنا الحصول على عناصر معينة التي تكون قيمة [[d:Property:P31|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P31)]] فيها تساوي قيمة هذا الوسيط، مثال:

      • |getonly=Q5 للحصول على الأفراد فقط.
      • القيم المتعددة ممكنة، مثل :|getonly=Q127448,Q193556 للحصول على البلديات السويدية والمناظر الطبيعية.
    • |getonlyproperty= إذا أردنا استخدام خاصية أخرى بدلاً من [[d:Property:P31|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P31)]] في البند السابق.

    • |avoidvalue= يستخدم هذا الوسيط إذا أردنا أن نتجاهل أو نلغي ظهور عنصر معين، مثال عند وضع |avoidvalue=Q21769847 فتظهر النتائج دون ظهور (Q21769847).
    prefervalue[عدل]
    • |prefervalue= يستخدم هذا الوسيط بشكل معاكس للوسيط |avoidvalue= حيث نقوم بتحديد القيمة التي نريد ظهورها |prefervalue=Q19481 فتظهر النتيجة للعنصر (Q19481) فقط، ولكن الفائدة من إستخدام هذا الوسيط هي التأكد من وجود العنصر في هذه الخاصية أو للحصول على التصفيات، مثال يظهر عناصر [[d:Property:P1346|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P1346)]] مع تصفية [[d:Property:P1923|

    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P1923)]] بين قوسين.

    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q39052816|property=P1923|qual1=P1355}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    إذا كنا قد حصلنا عبر خاصية [[d:Property:P1346|

    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P1346)]] عن الفريق الفائز في (Q39052816). وأردنا الحصول على عدد مرات الفوز للفريق الفائز، من الجدول السابق ويتم ذلك بإستخدام الوسيط |justthisqual= ما ينتج:

    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q39052816|property=P1923|justthisqual=P1355}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).

    ولكننا نريد ظهور التصفية للفريق الفائز فقط وهو (Q50602):

    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q39052816|property=P1923|prefervalue=Q50602|qual1=P1355}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).
    {{#invoke:Wikidata2|formatStatements|entityId=Q39052816|property=P1923|prefervalue=Q50602|justthisqual=P1355}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    ⧼datatypes-type-commonsMedia⧽ / commonsMedia[عدل]
    • تظهر الصور افتراضياً كالتالي:

    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P18|noref=true|rank=best}} ينتج ← خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).

    • |image= عند استخدام هذا الوسيط في خواص الصور تظهر الصورة مباشرة.
    • |size= لتحديد حجم الصورة (60 افتراضياً)، ضع القيمة دون (بك/px إلخ).
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P18|image=true|noref=true|rank=best|size=100}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    • |center= لجعل الصورة في الوسط ضع قيمة هذا الخيار |center=yes.
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P18|image=true|noref=true|rank=best|size=100|center=yes}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    ⧼datatypes-type-globe-coordinate⧽ / coordinate[عدل]
    • |formatting=latitude يعرض خط العرض فقط.
    • |formatting=longitude يعرض خط الطول فقط.
    • |formatting=precision يعرض الدقة.
    • |formatting=globe يعرض عنصر الكوكب. مثال:
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P625|formatting=globe}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).
    {{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P625|formatting=longitude}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    نص أحادي اللغة / ⧼datatypes-type-monolingualtext⧽ / monolingualtext[عدل]
  • |langpref= في الوحدة، هناك مرشح يعطي أولوية للقيم التي تحتوي على "اللغة = العربية". أضف القيمة المطلوبة لتعطيل هذا الفلتر.
    • القيم المقبولة الأخرى هي : justlang و langcode
    • |langpref=justlang لإظهار لغة النص فقط دون النص، مثل الإنجليزية.
  • توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P1477|langpref=justlang}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


      • |langpref=justlang لإظهار رمز لغة النص فقط دون النص، مثل en.
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P1477|langpref=langcode}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P1477|showlang=true}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P1477|textformat=text}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    ⧼datatypes-type-quantity⧽ / quantity[عدل]
    • |nounitlink= يظهر وحدة القياس دون وصلة.

    *|nounitshort= لا يظهر وحدات القياس مختصرة. مثلاً لا يظهر كم بدلاً عن كيلومتر.

    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P2046|noref=t|firstvalue=y}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).
    • |formatcharacters=formatnum: تنسيق الأرقام بالفواصل.
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P2046|firstvalue=y|noref=t|formatcharacters=formatnum}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    • |nounit= لا يظهر وحدة القياس.
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P2046|noref=t|firstvalue=y|nounit=t}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    • مثال لاستخدام |unitshort= ومثال عند عدم استخدامه:
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q219635|property=P2295|unitshort=t}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).
    {{#invoke:Wikidata2|formatStatements|entityId=Q219635|property=P2295}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    ⧼datatypes-type-string⧽ / string[عدل]
    • |stringpattern= تنسيق النص في قالب أو وصلة أو ماشابه يتم استبدال القيمة بـ$1. مثل |pattern= لكن هنا تستخدم مع نوع البيانات string.
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q1133289|property=P1748|noref=t|stringpattern=[https://ncit.nci.nih.gov/ncitbrowser/ConceptReport.jsp?dictionary=NCI%20Thesaurus&code=$1 $1]}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    ⧼datatypes-type-time⧽ / time[عدل]
    • |modifytime= يحدد تنسيق الوقت أو التاريخ:
      • |modifytime=longdate يكتب التاريخ في شكل "25 أبريل 2024"
      • |modifytime=Y يكتب التاريخ في شكل "2024" يظهر فقط السنة.
      • |modifytime= F يكتب التاريخ في شكل "أبريل" يظهر فقط الشهر.
      • |modifytime= j يكتب التاريخ في شكل "25" يظهر فقط اليوم.
    • |modifyqualifiertime= تنسيق التاريخ على النحو الوارد أعلاه، ولكن يؤثر فقط على التصفيات. qualifier
    ⧼datatypes-type-external-id⧽ / external-id[عدل]
    افتراضي:
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P2002}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    • |pattern= طريقة عرض الخاصية مثلاً في وصلات الضبط الاستنادي $1 مثلاً: <nowiki>https://viaf.org/viaf/$1/</nowiki> .
    • |pattern=autourl من خواص البند أعلاه، لنمط مستخدم في الخاصية [[d:Property:P1630|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P1630)]] (تنسيق عنوان URL) للخاصية المطلوبة.

    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P2002|pattern=autourl}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    • |pattern=autourl2 كما سبق، يقدم وصلة من نوع <nowiki>[https://viaf.org/viaf/$1/ $1] </nowiki>
    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P2002|pattern=autourl2}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).


    ⧼datatypes-type-url⧽ / url[عدل]
    • |urllabel= وضع تسمية لتظهر بدلاً من الوصلة، كما في ⧼datatypes-type-external-id⧽ ولكن في خواص الروابط.
      • مثال عند استخدام [[d:Property:P856|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P856)]] ل (Q76) مع/بدون الوسيط |urllabel=الموقع الرسمي:

    توصيف يظهر
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P856}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).
    {{#invoke:Wikidata2|formatStatements|urllabel=الموقع الرسمي|entityId=Q76|property=P856}} 
    خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).
    • |displayformat= يقبل حالياً قيمة واحدة وهي |displayformat=weblink لاستخدام وحدة:weblink لعرض وصلة الموقع.
    {{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P856|displayformat=weblink}} ينتج ← خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).

    خيارات إضافية[عدل]

    • |NosValue= يستخدم لإظهار نتيجة ما عند عدم وجود قيمة محلية في وسيط |value= وعدم وجود قيمة في ويكي بيانات.

    property-(module/function) و claim-(module/function) و value-(module/function)[عدل]

    يتم دعم ثلاثة أنواع من معلمات الوظائف، والتي تشير أيضًا إلى كيفية تنسيق القيم:

    • |-module= عنوان الوحدة
    • |-function= عنوان الوظيفة
    property[عدل]
    fun( claims, options )
    • |property-module= عنوان الوحدة مثل |property-module=وحدة:Wikidata2/P54
    • |property-function= عنوان الوظيفة مثل |property-function=foot
    • تستخدم هذه الخيارات عند الحاجة لتنسيق قيم الخاصية بشكل كامل مثلاً لوضعها في جدول معين، أو فرزها بتنسيق خاص، مع إمكانية الحصول على التصفيات/qualifiers والمراجع/references وتنسيقها والتحكم بها.
    • أمثلة:
      • الوحدة وحدة:Wikidata2/P54 الخاصة بعرض فرق لاعبي كرة القدم، مثل أندية كرة القدم حيث يتم فصل المنتخبات عن الأندية.
    claim[عدل]
    fun( statement, options )
    • |claim-module= عنوان الوحدة مثل |claim-module=وحدة:Wikidata2/P39
    • |claim-function= عنوان الوظيفة مثل |claim-function=office3
    • تستخدم هذه الخيارات عند الحاجة لتنسيق قيم الخاصية بشكل منفرد، مع إمكانية الحصول على التصفيات/qualifiers والمراجع/references وتنسيقها والتحكم بها.
    • أمثلة:
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P39)]].

    value[عدل]
    fun( datavalue, datatype, options )
    • |value-module= عنوان الوحدة مثل |value-module=وحدة:Wikidata2/P106
    • |value-function= عنوان الوظيفة مثل |value-function=formatEntityWithGenderClaim
    • تستخدم هذه الخيارات عند الحاجة لتنسيق قيم الخاصية بشكل منفرد لكل قيمة مثلاً لأخذ تسمية الإناث عند إستخدام خاصية [[d:Property:P106|
    • عنصر قائمة منقطة
    1. تحويل قالب:تسمية
    Light Bulb Icon.svg
    هذه تحويلة لقالب:
    فضلًا اطلب حذف هذه التحويلة حذفًا سريعًا إن لم تكن ضرورية.
    طالع عدد استخدامات القالب في المقالات (من هنا)

    (P106)]]، لا نستطيع هنا الحصول على التصفيات/qualifiers والمراجع/references.

    pageId[عدل]

    {{#invoke:Wikidata2|pageId}}

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

    خطأ لوا في السطر 2010: attempt to index field 'wikibase' (a nil value).

    labelIn[عدل]

  • |1= اللغة مثل fr.
  • |2= عنصر ويكي بيانات مثل Q76.
  • مثال: {{#invoke:Wikidata2|labelIn|fa|Q76}} ينتج:

    descriptionIn[عدل]

  • |1= اللغة مثل fr.
  • |2= عنصر ويكي بيانات مثل Q76.
  • مثال: {{#invoke:Wikidata2|descriptionIn|en|Q76}} ينتج: خطأ لوا في السطر 487: attempt to index field 'wikibase' (a nil value).

    getSiteLink / وصلات المواقع[عدل]

  • |2= أو |site= الموقع مثل enwiki.
  • يتم أخذ عنصر ويكي بيانات من أحد الوسائط التالية:
    1. |1= أو |id= عنصر ويكي بيانات.
    2. |page= يمكن استخدام اسم الصفحة في هذه الويكي بدلاً من استخدام الوسيط |id=.
  • |countsitelinks= يستخدم فقط لإظهار عدد وصلات اللغات.
  • مثال: {{#invoke:Wikidata2|getSiteLink|Q76}} ينتج:

    مثال: {{#invoke:Wikidata2|getSiteLink|Q76|enwiki}} أو: {{#invoke:Wikidata2|getSiteLink|id=Q76|site=enwiki}}

    ينتج:

    أو:

    توصيف يظهر
    {{#invoke:Wikidata2
    |getSiteLink
    |page=اليمن
    |site=enwiki
    }}

    Dump[عدل]

    مثال: {{#invoke:Wikidata2|Dump|claims|P19}}

    مثال2: {{#invoke:Wikidata2|Dump|id=Q76|claims|P19}}
    -- local fallback = {'en', 'nb', 'da', 'nn', 'de', 'fr', 'es', 'it', 'pt'}
    local formatera = require('Module:Wikidata2/Math')
    local citetitle = 'Module:Cite'
    	if nil ~= string.find (mw.getCurrentFrame():getTitle(), 'ملعب', 1, true) then			-- did the {{#invoke:}} use sandbox version?
    		citetitle = 'Module:Cite/ملعب'		-- load sandbox versions of support modules
    	end
    	
    local weblink = require('Module:Weblink')
    local flags = require('Module:Wikidata2/Flags')
    local Infobox_Image = require('Module:InfoboxImage').Infobox_Image
    local p = {}
    local Frame;
    local Frame_args = {}
    local i18n = {
    	["errors"] = {
    		["property-param-not-provided"] = "وسيط property غير متوفر.",
    		["entity-not-found"] = "الكيان غير موجود.",
    		["unknown-claim-type"] = "نوع claim غير معروف.",
    		["unknown-snak-type"] = "نوع snak غير معروف.",
    		["unknown-datatype"] = "نوع data غير معروف.",
    		["unknown-entity-type"] = "نوع entity غير معروف.",
    		["unknown-value-module"] = "يجب عليك تعيين كل من  value-module و value-function.",
    		["unknown-claim-module"] = "يجب عليك تعيين كل من claim-module و claim-function.",
    		["unknown-property-module"] = "يجب عليك تعيين كل من property-module و property-function.",
    		["property-module-not-found"] =  "الوحدة المستخدمة في وسيط property-module غير موجودة.",
    		["property-function-not-found"] = "الوظيفة المستخدمة في وسيط property-function غير موجودة.",
    		["value-module-not-found"] = "الوحدة المستخدمة في وسيط value-module غير موجودة.",
    		["value-function-not-found"] = "الوظيفة المستخدمة في وسيط value-function غير موجودة.",
    		["claim-module-not-found"] = "الوحدة المستخدمة في وسيط claim-module غير موجودة.",
    		["claim-function-not-found"] = "الوظيفة المستخدمة في وسيط claim-function غير موجودة."
        },
    	["noarabiclabel"] = "تصنيف:صفحات_ويكي_بيانات_بحاجة_لتسمية_عربية",
    	["warnDump"] = "[[Category:Called function 'Dump' from module Wikidata]]",
    	["somevalue"] = "", --''غير محدد''
    	["novalue"] ="",--قيمة مجهولة
    	["cateref"] = "[[" .. "تصنيف:صفحات بها مراجع ويكي بيانات" .. "]]",
    	['to translate'] = 'صفحات تستعمل معطيات من ويكي بيانات بحاجة لترجمة',
    	["trackingcat"] = 'صفحات تستخدم خاصية $1',
    	['see-wikidata-value'] = "الاطلاع ومراجعة البيانات على ويكي داتا", 
    	['see-wikidata'] = "راجع العنصر من ويكي بيانات المقابل", 
    	['see-another-project'] = "مقالة على $1",
    	['see-another-language'] = "مقالة على ويكيبيديا $1",
    }
    local sortingproperties = {'P585','P571','P580','P569','P582','P570'}
    
    function No_Tracking_cat(options)
    	local notracking = options.notracking or Frame_args.notracking or ""
    	local raw = options.raw or Frame_args.raw or ""
    	local raw2 = options.raw2 or Frame_args.raw2 or ""
    	--mw.log("raw2" .. raw2 )
    	local nolink = options.nolink or Frame_args.nolink or ""
    	if notracking ~= ""  or raw ~= '' or raw2 ~= '' or nolink ~= '' 
    		then return true
    	end
    	return false
    end
    
    function addTrackingCategory(prop,options)
    	if No_Tracking_cat(options) then return prop end
    	local cat =  require('Module:Wikidata/تتبع').makecategory1
    	local category = cat(options)
    	local nbsp = "&nbsp;"
    	if options.nbsp and options.nbsp ~= "" then nbsp = "" end
    	if prop and prop ~= '' then
    		if category and category ~= '' then
    			return prop .. nbsp .. category
    		else 
    			return prop .. nbsp 
    		end
    	end
    end
    
    function catewikidatainfo(options)
    --[[  function to add tracking category ]] 
     	--if (options.raw and options.raw ~= '') or (options.notracking and options.notracking== true) then return "" end
    	if No_Tracking_cat(options) then return "" end
    	local prop = options.property
    	local cat = ' [[' .. 'تصنيف:صفحات بها بيانات ويكي بيانات|'.. (prop or 'wikidata') .. ']]'
    	if (not options.nolink or options.nolink == '')
    		then return cat else return ''
    	end
    end
    
    function countSiteLinks(id)
    	numb = 0
    	Table = {}
    	local entity = mw.wikibase.getEntityObject(id)
    	if entity and entity.sitelinks then
    		for i, v in pairs(entity.sitelinks) do 
    			Table[v.site] = v.title 
    			numb = numb +1
    		end
    		--return Frame:extensionTag("source", mw.dumpObject( Table ),{ lang= 'lua'})
    	end
    	return numb
    end
    			
    function make_format_num(String)
    	local line = String
    	line = mw.getCurrentFrame():preprocess("{{ {{{|safesubst:}}}formatnum: " .. String .. " }}")
    	line = mw.ustring.gsub( line , '٫', '.' )
    	line = mw.ustring.gsub( line , '٬', ',' )
    	return line 
    end
    
    --auktoritetsdata
    function formatcharacters(label, options)
    	local formatcharacters = options.formatcharacters
    	--if options.FormatfirstCharacter and options.num == 1 then 
    		--formatcharacters = options.FormatfirstCharacter 
    	--end
    	if options.illwd2y and options.illwd2y ~= '' then
    		String2 = mw.ustring.gsub( label , '–', '-' )
    		ca = mw.ustring.match( String2 , "%d%d%d%d%-%d%d%d%d", 1 ) or mw.ustring.match( String2 , "%d%d%-%d%d%d%d", 1 )
    		ca = ca or mw.ustring.match( String2 , "%d%d%d%d", 1 ) or mw.ustring.match( String2 , "%d%d%d%d%-%d%d", 1 )
    		ca = ca or mw.ustring.match( String2 , "%d%d%d%d", 1 ) or String
    		return ca
    	end
    	if not formatcharacters or formatcharacters == '' then
    		return label
    	end
    	if formatcharacters == 'lcfirst' then
    		return mw.getCurrentFrame():preprocess("{{lcfirst: " .. label .. " }}")
    	elseif formatcharacters == 'ucfirst' then
    		return mw.language.getContentLanguage():ucfirst( label )
    	elseif formatcharacters  == 'lc' then
    		return mw.getCurrentFrame():preprocess("{{lc: " .. label .. " }}")
    	elseif formatcharacters == 'uc' then
    		return mw.getCurrentFrame():preprocess("{{uc: " .. label .. " }}")
    	elseif formatcharacters == 'formatnum' then
    		return make_format_num( label )
    	end
    	return label
    end
    
    function getqualifierbysortingproperty(claim, sortingproperty)
    	for k, v in pairs(sortingproperty) do
    		if claim.qualifiers and claim.qualifiers[v] and claim.qualifiers[v][1].snaktype == 'value' then
    			return claim.qualifiers[v][1].datavalue.value.time 
    		end
    	end
    	return nil
    end
    
    function getDate(claim, options)
    	local sortingproperty = sortingproperties
    	if type(options.sortingproperty) == 'table' then
    		sortingproperty = options.sortingproperty
    	elseif type(options.sortingproperty) == 'string' and options.sortingproperty ~= '' then
    		sortingproperty = {options.sortingproperty}
    	end
    	return getqualifierbysortingproperty(claim, sortingproperty) 
    end
    
    function get_entityId(options)
    	local id = options.entityId or options["entityId"]
    	id = id or options.id or options["id"]
    	if not id or id == "" then
    		if options.page and options.page ~= "" then
    			id = mw.wikibase.getEntityIdForTitle( options.page )
    		end
    	end
    	--mw.log("id :" .. id)
    	return id or ""
    end
    
    function getDateArb(claim, options)
    	local sortingproperty = options.sortingproperty or 'P569'
    	if claim.mainsnak.snaktype == 'value' then
    		local item = claim.mainsnak.datavalue.value['numeric-id']
    		if claim.mainsnak.datavalue.value['entity-type'] == 'item' then
    			item = 'Q' .. item
    		elseif claim.mainsnak.datavalue.value['entity-type'] == 'property' then 
    			item = 'P' .. item
    		end
    		return formatStatements({property = sortingproperty, entityId = item, firstvalue = 'true', sortbytime = 'chronological', noref = 'true'})
    	end
    end
    
    function descriptionIn(langcode , id) -- returns item description for a given language
    	local lan = langcode or 'ar'
    	local entity = getEntityFromId(id)
    	--[[
    	local description, lange = mw.wikibase.getDescriptionWithLang( id )
    	--mw.log( "descriptionIn:description : " .. description ",lange : " .. lange ".")
    	if lange == lan
    	then
    		--return description
    		return mw.getCurrentFrame():extensionTag("source", mw.dumpObject( description ),{ lang= 'lua'})
    	else
    		--mw.log( "descriptionIn:langcode : " .. langcode ",lange : " .. lange ".")
    		--return nil
    		return mw.getCurrentFrame():extensionTag("source", mw.dumpObject( description ),{ lang= 'lua'})
    	--return str
    	end
    	]]
    	if entity and entity.descriptions then 
    		local description = entity.descriptions[lan]
    		if description and description.value 
    		then
    			-- return mw.getCurrentFrame():extensionTag("source", mw.dumpObject( description ),{ lang= 'lua'})
    			if description['language'] == lan then
    				return description.value
    			else return nil end
    		end
    	end
    	
    end
    
    function labelIn(langcode,id) -- returns item label for a given language
    	if not mw.wikibase then return nil end
    	local lang = langcode
    	if not langcode or langcode  == "" then lang  = "ar" end
    	if type(id) ~= "string" then id = tostring(id) end
    	local label = mw.wikibase.getLabelByLang( id , lang ) or nil
    	return label
    	--[[ 2nd old way
    	local label, lange = mw.wikibase.getLabelWithLang( id )
    	if lange == lang
    	then
    		return label
    	else
    		return nil
    	--return str
    	end ]]
    	--[[ old way
    	local entity = mw.wikibase.getEntityObject(id)
    		if entity
    		and entity.labels 
    		and entity.labels[''..lang..'']
    		and entity.labels[''..lang..''].value 
    		then
    			local lang = entity.labels[''..lang..'']
    				if lang['language'] == lang then
    				return entity.labels[''..lang..''].value
    				else return nil end
    		end
    	]]
    end
    
    function get_snak_id(snak)
    	if snak 
    	and snak.type 
    	and snak.type == "statement" 
    	and snak.mainsnak 
    	and snak.mainsnak.snaktype 
    	and snak.mainsnak.snaktype == "value" 
    	and snak.mainsnak.datavalue 
    	and snak.mainsnak.datavalue.type
    	and snak.mainsnak.datavalue.type == "wikibase-entityid" 
    	and snak.mainsnak.datavalue.value 
    	and snak.mainsnak.datavalue.value.id 
    	then	
    		--ID = 'Q' .. snak.datavalue.value['numeric-id']
    		ID = snak.mainsnak.datavalue.value.id 
    		return ID
    	end
    end
    
    function comparedates(a, b)  -- returns true if a is earlier than B or if a has a date but not b
    	if a and b then
    		return a > b
    	elseif a then
    		return true
    	end
    end
    
    function getonly(claims, options) 
    	-- options.getonly 
    	-- options.getonlyproperty 
    	local claims2 = {}
    	--mw.log("wikidata2 : getonly:" .. options.getonly )
    	for i, j in pairs(claims) do
    		local id = get_snak_id(j)
    		--if j.mainsnak and j.mainsnak.snaktype == 'value' and j.mainsnak.datavalue and j.mainsnak.datavalue.value and j.mainsnak.datavalue.value.id then
    			--local id = j.mainsnak.datavalue.value.id
    		if id then
    			local traff = false
    			local t2 = formatStatements( {property = (options.getonlyproperty or "P31"), entityId = id, noref = 'true', raw = 'true' })
    			if t2 and #t2 > 0 then
    				for k, state in pairs( t2 ) do
    					for j2, only in pairs(mw.text.split(options.getonly,',')) do
    						if state.item == only then
    							traff = true
    						end
    					end
    				end
    			end
    			if traff then
    				table.insert(claims2, j)
    			end
    		end
    	end
    	return claims2
    end
    
    function claimindex(claims, options)
    	local claims2 = {}
    	for j, index in pairs(mw.text.split(options.claimindex,',')) do
    		if tonumber(index) and #claims >= tonumber(index) then
    			table.insert(claims2, claims[tonumber(index)])
    		end
    	end
    	return claims2
    end
    
    function avoidvalue(claims, options)
    	-- options.avoidvalue 
    	-- to avoid values
    	local claims4 = {}
    	local add2claims
    	local avoidvalue
    	if(type(options.avoidvalue) == 'string') then avoidvalue = mw.text.split(options.avoidvalue,',')
    		elseif(type(options.avoidvalue) == 'table') then avoidvalue = options.avoidvalue
    			else return claims
    	end
    	--mw.log("avoidvalue: " .. mw.dumpobject(options.avoidvalue))
    	for i, j in pairs( claims ) do
    		--mw.log('t:' .. t)
    		ID = get_snak_id(j)
    		add2claims = true
    		if ID then
    		    for k, t in pairs(avoidvalue) do
    				--mw.log("ID: " .. ID)
    				if ID == t then
    					add2claims = false	
    				end
    			end
    			if add2claims then
    				table.insert( claims4, j)
    			end
    		end
    	end
    	return claims4
    end
    
    function prefervalue(claims, options)
    	local claims3 = {}
    	--mw.log("prefervalue: " .. mw.dumpobject(options.prefervalue))
    	local prefervalue
    	if(type(options.prefervalue) == 'string') then prefervalue = mw.text.split(options.prefervalue,',')
    		elseif(type(options.prefervalue) == 'table') then prefervalue = options.prefervalue
    			else return claims
    	end	
    	for k, t in pairs(prefervalue) do
    		--mw.log('t:' .. t)
    		for i, j in pairs( claims ) do
    			local active = false
    			ID = get_snak_id(j)
    			if ID then
    				--mw.log("ID: " .. ID)
    				if ID == t and not active then
    					table.insert( claims3, j)
    					active = true
    					--mw.log("ID == t" .. t)
    				end
    			end
    		end
    	end
    	return claims3
    end
    
    function preferqualifier(claims, options)
    	-- options.preferqualifier
    	-- options.preferqualifiervalue
    	mw.log("preferqualifier: " .. options.preferqualifier)
    	local claims2 = {}
    	for i, statement in pairs( claims ) do -- 
    		if statement.qualifiers and statement.qualifiers[options.preferqualifier:upper()] then
    			if options.preferqualifiervalue and options.preferqualifiervalue ~= '' then
    				local active = false
    				for k, t in pairs(mw.text.split(options.preferqualifiervalue,',')) do
    					--mw.log( "t " .. t )
    					--kaso = formatStatements({property=options.preferqualifier:upper(), raw = 'true',  formatting  = 'raw'}, statement.qualifiers)
    					----kaso = formatStatements({property=options.preferqualifier:upper(), formatting  = 'raw'}, statement.qualifiers)
    					----value = kaso
    					for ii, quall in pairs( statement.qualifiers[options.preferqualifier:upper()] ) do
    						--mw.log( "value " .. value )
    						snaktype = quall.snaktype
    						if snaktype == "value" then
    							ty = quall.datavalue.value['id'] 
    							if ty and ty == t  and not active then
    								--if value == t and not active then
    									table.insert( claims2, statement)
    									active = true
    								--end
    							end
    						end
    					end
    				end
    			else
    				table.insert( claims2, statement)
    			end
    		end
    	end
    	return claims2
    end
    
    function avoidqualifier(claims, options)
    	-- options.avoidqualifier
    	-- options.avoidqualifiervalue
    	if not options.avoidqualifier or options.avoidqualifier == "" then return claims end
    	local av = options.avoidqualifier:upper()
    	local claims2 = {}
    	for i, statement in pairs( claims ) do	
    		if not statement.qualifiers or not statement.qualifiers[options.avoidqualifier:upper()] then
    			table.insert( claims2, statement)
    		elseif statement.qualifiers and statement.qualifiers[av] then
    			if options.avoidqualifiervalue and options.avoidqualifiervalue ~= '' then
    				list = {}
    				if(type(options.avoidqualifiervalue) == 'string') then 
    					list = mw.text.split(options.avoidqualifiervalue,',')
    				elseif(type(options.avoidqualifiervalue) == 'table') then 
    					list = options.avoidqualifiervalue
    				end
    				local active = true
    				for k, t in pairs( list ) do
    					for ii, quall in pairs( statement.qualifiers[av] ) do
    						if quall.snaktype == "value" and quall.datavalue and quall.datavalue.value and quall.datavalue.value['id'] then
    							if quall.datavalue.value['id'] == t then
    								active = false
    							end
    						end
    					end
    				end
    				if active then 
    					table.insert( claims2, statement)
    				end
    			end
    		end
    	end
    	return claims2
    end
    
    function sortbyqualifier(claims, options)
    	table.sort(claims, function(a,b)
    		local timeA = getDate(a, options)
    		local timeB = getDate(b, options)
    		if options.sortbytime == 'inverted' then
    			return comparedates(timeB, timeA)
    		else
    			return comparedates(timeA, timeB)
    		end
    	end
    	)
    	return claims
    end
    
    function sortbyqualifiernumber(claims, options)
    	local sortingproperty = options.sortingproperty
    	if type(options.sortingproperty) == 'string' then
    		sortingproperty = {options.sortingproperty}
    	end
    	table.sort(claims, function(a,b)
    		local timeA = getqualifierbysortingproperty(a, sortingproperty)
    		local timeB = getqualifierbysortingproperty(b, sortingproperty)
    		if options.sortbynumber == 'inverted' then
    			return comparedates(timeB, timeA)
    		else
    			return comparedates(timeA, timeB)
    		end
    	end
    	)
    	return claims
    end
    
    function sortbyarb(claims, options)
    	--mw.log("sortbyarb: " .. options.sortbyarbitrary)
    	table.sort(claims, function(a,b)
    		local timeA = getDateArb(a, options)
    		local timeB = getDateArb(b, options)
    		if options.sortbyarbitrary == 'inverted' then
    			return comparedates(timeB, timeA)
    		else
    			return comparedates(timeA, timeB)
    		end
    	end
    	)
    	return claims
    end
    
    function getEntityFromId( id )
    	if id and id ~= "" then
    	--	if not(mw.wikibase.isValidEntityId(id)) or not(mw.wikibase.entityExists(id)) then
    		--	return false
    		--end
    		return mw.wikibase.getEntityObject( id )
    	else
    		return mw.wikibase.getEntityObject() 
    	end
    end
    
    function getEntityIdFromValue( value )
        if value['entity-type'] == 'item' then
            return 'Q' .. value['numeric-id']
        elseif value['entity-type'] == 'property' then
            return 'P' .. value['numeric-id']
        else
            return formatError( 'unknown-entity-type' )
        end
    end
     
    function formatError( key )
        return i18n.errors[key]
    end
    
    function Labelfunction( entityId, label ,labeloption , options) -- label with no arwiki sitelink
    	if options.illwd2nowd  and options.illwd2nowd  ~= '' then noWD='' else noWD='y' end
    	local jlabel = label --formatcharacters(label, options) -- The label
    	local ar = labelIn('ar',entityId ) -- The arabic label
    	--mw.log('ar'..ar)
    	local arlabel = ar --formatcharacters(ar, options) 
    	if labeloption and labeloption ~= '' then
    		jlabel = labeloption 
    	elseif options.illwd2 and options.illwd2  ~= '' and arlabel and arlabel ~= '' then
    			jlabel = mw.getCurrentFrame():expandTemplate{ title = 'Ill-WD2', args = {arlabel, fromlua="t", id=entityId, y = (options.illwd2y or '') } }
    			
    			--jlabel = arlabel
    		--elseif options.enlabelcate and options.enlabelcate  ~= '' then 
    			--jlabel  = mw.getCurrentFrame():expandTemplate{ title = 'Ill-WD2', args = {id=entityId, fromlua="t", target='en', y = (options.illwd2y or '') } }
    			--jlabel  = label
    		--end
    	elseif options.enlabelcate and options.enlabelcate  ~= '' then
    		if not arlabel or arlabel == '' then
    			jlabel = label --formatcharacters(label, options)
    			 if jlabel and jlabel ~= '' then
    				 jlabel = jlabel ..' [['.. i18n.noarabiclabel ..'|'.. entityId ..']]'
    			 end
    		else
    			jlabel = arlabel
    		end
    			
    	else--if options.justarabic and options.justarabic  ~= '' then
    		if arlabel and arlabel ~= ''
    			then jlabel = arlabel
    			else jlabel = nil
    		end
    	end
    	if jlabel and jlabel ~= ''
    	then
    		--mw.log('jlabel' .. jlabel )
    		return jlabel .. catewikidatainfo(options)
    	end
    end
    
    function formatOneStatement( statement ,ref ,  options)
    	local vava = nil
    	local stat = formatStatement( statement, options )
    	if stat then
    		if not stat.qualifiers then 
    			stat.qualifiers = {}
    		end
    		local s = stat.value
    		local P585 = stat.qualifiers.P585 or ""
    		local tf = stat.tifr
    		local awardqual = stat.foto
    		local pr = stat.pr
    		--local utgivort = stat.utgivort
    		local ro = stat.ro
    		local qp1a = stat.qp1a
    		local onlyqualifier = stat.onlyqualifier
    		local qp1 = stat.qp1
    		local qp2 = stat.qp2
    		local qp3 = stat.qp3
    		local qp4 = stat.qp4
    		local qp5 = stat.qp5
    		local reff  =stat.reff
    		local QPrefix 
    		local QSuffix
    		if s == '' then s = nil end
    		if s then
    			if reff and options.reff and options.reff ~= ''  then
    				s= s .. reff
    			end
    				if options.template and options.template ~= '' then
    						s = mw.getCurrentFrame():expandTemplate{ title = options.template 
    						, args ={stat.QQ1
    							,s
    							,stat.QQ2
    							,stat.QQ3
    							,stat.QQ4
    							,stat.QQ5
    							,stat.QQ6
    							,stat.QQ7
    							,stat.QQ8
    							,stat.QQ9
    							,stat.QQ10
    							,entityId = options.entityId
    							,id = stat.ID} }
    				end
    				if options.football and options.football ~= '' then
    					s =mw.getCurrentFrame():expandTemplate{ title = "صندوق معلومات سيرة كرة قدم/سطر فريق", args = {
    					stat.qualifiers.P580 or "",
    					stat.qualifiers.P582 or "",
    					s,
    					stat.amatch,
    					stat.goal
    					} }
    				end
    				
    				if options.office and options.office ~= '' then
    					s = mw.getCurrentFrame():expandTemplate{ title = "معلومات صاحب منصب/منصب ويكي بيانات/نواة", args = 
    					{office = s, 
    					termstart = stat.qualifiers.P580 or "", 
    					termend = stat.qualifiers.P582 or "", 
    					constituency = stat.qualifiers.P768 or "", 
    					predecessor = stat.qualifiers.P1365 or "", 
    					successor = stat.qualifiers.P1366 or "", 
    					series= stat.qualifiers.P1545 or "",
    					of=stat.qualifiers.P642 or "",
    					electedin=stat.qualifiers.P2715 or "",
    					jurisdiction=stat.qualifiers.P1001 or "",
    					employer=stat.qualifiers.P108 or "",
    					entityId=options.entityId
    					} } 
    				end
    			
    			function qoo(Prefix,qualpref,p,Suffix)
    				if p and p ~='' then 
    					stri = (Prefix or ' (').. (qualpref or '') .. p .. (Suffix or ')')
    					if options.nosmall and  options.nosmall ~= '' then
    						return stri
    					else
    						return mw.text.tag('small', {}, stri )
    					end
    				end
    			end
    			
    			QPrefix = options.qualifierprefix
    			QSuffix = options.qualifiersuffix
    			if qp1 and qp1 ~='' and options.qual1 and options.qual1 and qp1a and qp1a ~='' and options.qual1a and options.qual1a ~= ''
    			then
    				s = s .. qoo(QPrefix, options.qual1pref, qp1, QSuffix) .. qoo(QPrefix, options.qp1apref, qp1a, QSuffix)
    			elseif qp1 and qp1 ~='' and options.qual1 and options.qual1 ~= '' then
    				s = s .. qoo(QPrefix, options.qual1pref, qp1, QSuffix)
    			elseif qp1a and qp1a ~='' and options.qual1a and options.qual1a ~= '' then
    				s = s .. qoo(QPrefix, options.qp1apref, qp1a, QSuffix)
    			end
    			
    			if qp2 and qp2 ~='' and options.qual2 and options.qual2 ~= '' then 
    				s = s .. qoo(QPrefix, options.qual2pref, qp2, QSuffix) 
    			end
    			if qp3 and qp3 ~='' and options.qual3 and options.qual3 ~= '' then 
    				s = s .. qoo(QPrefix, options.qual3pref, qp3, QSuffix) 
    			end
    			if qp4 and qp4 ~='' and options.qual4 and options.qual4 ~= '' then 
    				s = s .. qoo(QPrefix, options.qual4pref, qp4, QSuffix) 
    			end
    			if qp5 and qp5 ~='' and options.qual5 and options.qual5 ~= '' then 
    				s = s .. qoo(QPrefix, options.qual5pref, qp5, QSuffix) 
    			end
    			if options.justthisqual and options.justthisqual ~= '' then 
    				if onlyqualifier then 
    					s = onlyqualifier 
    				else 
    					s = nil   -- We need only the qualifier 	
    				end 
    			end
    			if ro and ro ~='' and options.withro and options.withro ~= '' then s = s .. qoo(QPrefix, '' , ro, QSuffix) end
    			
    			if options.withdate and options.withdate ~= '' then
    				if P585 and P585 ~=''  then
    					if options.withdate == 'y' then 
    						s = s .. qoo(QPrefix, 'سنة ' , P585, QSuffix)
    					elseif options.withdate == 'before' then 
    						s = '*' .. P585 ..':' .. s..'\n'
    					else 
    						s = s .. qoo(QPrefix, '' , P585, QSuffix)
    					end
    				end
    			end
    			
    			if awardqual and options.awardqua and options.awardqua ~= '' then 
    				s = s .. qoo(QPrefix, '' , awardqual, QSuffix) 
    			end
    			local bothdates = options.withintervall or options.bothdates
    			if tf and bothdates and bothdates  ~= '' then
    				if bothdates == 'line' then
    					 s = s .. mw.text.tag('br') .. qoo(QPrefix, '' , tf, QSuffix)
    				elseif bothdates == 'before' then
    					 s = qoo(QPrefix, '' , tf, QSuffix) .. s
    				else 
    					s = s .. qoo(QPrefix, '' , tf, QSuffix)
    				end
    			end
    			--if utgivort and options.withutgivort and options.withutgivort ~= '' then
    				--if options.withutgivort == 'قوسين' then s = s .. ' ' .. qoo(QPrefix, '' , utgivort, QSuffix)
    					--else s = s .. ' ' .. utgivort
    				--end
    			--end
    			if pr and pr ~= '' and options.getsimpleproperty and options.getsimpleproperty ~= '' then
    				if options.getsimpleproperty == 'f?dd' then s = s .. ' ' .. qoo(QPrefix, 'f. ' , pr, QSuffix)
    					elseif options.getsimpleproperty == 'parentes' then s = s .. ' ' .. qoo(QPrefix, '' , pr, QSuffix)
    					elseif options.getsimpleproperty == 'avn?gon'  then s = s .. ' ' .. mw.text.tag('span', {}, ' av ' .. pr .. '')
    				end
    			end
    			
    			if type(ref) == 'table' or (options.noref and options.noref ~='') or (options.justthisqual and options.justthisqual ~='') 
    			then
    				--table.insert( formattedStatements, s )
    				vava =  s 
    			else
    				local t = formatReferences( statement, options )
    				stat.ref = t
    					if options.justref and options.justref ~= '' 
    					then
    						vava =  t
    					elseif options.onlyvaluewithref and options.onlyvaluewithref ~= '' then
    						if t and t ~= "" then
    							vava =  s .. t 
    						end
    					else 
    						vava =  s .. t 
    					end
    			end
    		end
    	--table.insert(statementsraw, stat)
    	end
    	return { v = vava , raw = stat}
    end
    
    function filter_claims( claims , options)
    	local claims = claims
    		--======================================================
    		if options.avoidqualifier and options.avoidqualifier ~= '' then 		-- to avoid value with a given qualifier
    			claims = avoidqualifier(claims, options)
    		end
    		--======================================================
    		if options.preferqualifier and options.preferqualifier ~= '' then
    			claims = preferqualifier(claims, options)
    		end
    		--======================================================
    		-- options.avoidvalue
    		if options.avoidvalue and options.avoidvalue ~= '' then
    			claims = avoidvalue(claims, options)
    		end
    		--======================================================
    		-- options.prefervalue
    		if options.prefervalue and options.prefervalue ~= '' then
    			claims = prefervalue(claims, options)
    		end
    		--======================================================
    		-- options.getonly
    		if options.getonly and options.getonly ~= '' then
    			claims = getonly(claims, options)
    		end
    		--======================================================
    		if not options.langpref or options.langpref == '' then
    			local claims7 = {}
    			for i, statement in pairs( claims ) do
    				if statement.qualifiers and statement.qualifiers.P407 then
    					for k, v in pairs( statement.qualifiers.P407 ) do
    						if v.snaktype == 'value' and v.datavalue.value['numeric-id'] == 13955 then -- Q13955 = 'العربية'
    							table.insert( claims7, statement )
    						end
    					end
    				elseif statement.qualifiers and statement.qualifiers.P282 then
    					for k, v in pairs( statement.qualifiers.P282 ) do
    						if v.snaktype == 'value' and v.datavalue.value['numeric-id'] == 8196 then -- Q8196 = 'أبجدية عربية'
    							table.insert( claims7, statement )
    						end
    					end
    				end
    			end
    			if #claims7 > 0 then
    				claims = claims7
    			end
    		end
    		--======================================================
    		if options.sortbytime == 'chronological' or options.sortbytime == 'inverted' then
    			claims = sortbyqualifier(claims, options)
    		elseif options.sortbynumber == 'chronological' or options.sortbynumber == 'inverted' then
    			claims = sortbyqualifiernumber(claims, options)
    		elseif options.sortbyarbitrary == 'chronological' or options.sortbyarbitrary == 'inverted' then
    			claims = sortbyarb(claims, options)
    		end
    		--======================================================
    	local firstvalue =  options.enbarten or  options.firstvalue
    	if firstvalue and firstvalue ~='' and #claims > 1 then
    		if firstvalue == '2' then
    			claims = {claims[2]}
    			elseif firstvalue == '3' and #claims > 2 then
    			claims = {claims[3]}
    			elseif firstvalue == '4' and #claims > 3 then
    			claims = {claims[4]}
    			elseif firstvalue == '5' and #claims > 4 then
    			claims = {claims[5]}
    			elseif firstvalue == '6' and #claims > 5 then
    			claims = {claims[6]}
    			elseif firstvalue == '7' and #claims > 6 then
    			claims = {claims[7]}
    			elseif firstvalue == '8' and #claims > 7 then
    			claims = {claims[8]}
    			elseif firstvalue == '9' and #claims > 8 then
    			claims = {claims[9]}
    			else
    			claims = {claims[1]}
    		end
    	end
    	local numval =  options.numval
    	if numval and type(numval) ~= "number" then 
    		numval = tonumber(numval)
    	end
    	if numval and type(numval) == "number" and #claims > 1 and #claims > numval then
    		local claimsnumval= {}
    		local ic = 1
    		while (numval >= ic) and (#claims >= ic) do
    			table.insert( claimsnumval, claims[ic] ) 
    			ic =ic +1
    		end
    		claims = claimsnumval;
    	end	
    	return claims
    end
    
    function formatStatements( options, ref )
       	local valuetable = {} -- formattedStatements
       	local claims = {}
       	if not options.property then return formatError( 'property-param-not-provided' ) end
    	
       	--[[functions = {
       		["P172"] = {["value-module"] ="Wikidata2/P172" ,["value-function"] ="get_P172_lab"} , 
       		["P106"] = {["value-module"] ="Wikidata2/P106" ,["value-function"] ="formatEntityWithGenderClaim"} , 
       	}
       	functions["P413"] = functions["P106"]
       	if ( not options["value-module"] or options["value-module"] == "" ) 
       			or ( not options["value-function"] or options["value-function"] == "" )
       		or  ( not options["property-module"] or options["property-module"] == "" ) 
       			or ( not options["property-function"] or options["property-function"] == "" )
       		or  ( not options["claim-module"] or options["claim-module"] == "" ) 
       			or ( not options["claim-function"] or options["claim-function"] == "" )
       	then 
    	   	if functions[options.property:upper()] then 
    	   		options["value-module"] = functions[options.property:upper()]["value-module"]
    	   		options["value-function"] = functions[options.property:upper()]["value-function"]
    	   	end
       	end]]
       	local option1 = options["option1"] or options.option1
       	if option1 and options["option1value"] then 
       		options[ option1 ] = options["option1value"] 
       		options['"' .. option1 .. '"'] = options["option1value"]
       		--mw.log( "option1: " .. option1 .. "value: " .. options["option1value"]  )
       		end
        if type(ref) == 'table' then -- f?r de fall d?r funktionen anropas och alla claims redan finns i en tabell
    		claims = ref[options.property] or {}
    	else
        	--Get entity
        	local entity = nil
        	if options.entity and type( options.entity ) == "table" then
            	entity = options.entity
        	else 
            	--entity = getEntityFromId( options.entityId )
            	id = get_entityId( options )
            	entity = getEntityFromId( id )
        	end
        	--local property = mw.wikibase.resolvePropertyId( options.property:upper() )
        	local property = options.property:upper()
        	--property = options.property:upper() 
     
        	if not entity then return '' end --TODO error? 
        	if not entity.claims or not entity.claims[property] then
        		if options.otherproperty and options.otherproperty ~= "" then 
    	    		options.property = options.otherproperty
    	    		property = options.otherproperty
    	    	end
        	end
        	if not entity.claims or not entity.claims[property] then
            	return '' --TODO error?
        	end
     
        	--Format statement and concat them cleanly
    		if options.rank == 'best' or not options.rank then 
    			--claims = entity:getAllStatements( property )
    			claims = entity:getBestStatements( property )
    			elseif options.rank == 'valid' then
    				for i, statement in pairs( entity.claims[ property ] ) do
    		    		if statement.rank == 'preferred' or statement.rank == 'normal' then
    	    				table.insert( claims, statement )
    	    			end
    				end
    			elseif options.rank == 'all' then
    				for i, statement in pairs( entity.claims[property] ) do
    					table.insert( claims, statement )
    				end
    		else
    			for i, statement in pairs( entity.claims[property] ) do
    				if statement.rank == options.rank then
    					table.insert( claims, statement )
    				end
    			end
    		end
    	end
    	claims = filter_claims( claims , options)
    	local statementsraw = {}
    	local All_claims = claims
    	if claims then
    			--==========================================
    		if options['property-module'] or options['property-function'] then
    			if not options['property-module'] or not options['property-function'] then
    				return formatError( 'unknown-property-module' )
    			end
    			local formatter = require ('Module:' .. options['property-module'])
    			if not formatter then
    				return formatError( 'property-module-not-found' )
    			end
    			local fun = formatter[options['property-function']]
    			if not fun then
    				return formatError( 'property-function-not-found' )
    			end
    
    			mw.log("work with property-module: " .. options['property-module'] .. "|" .. options['property-function'])
    			return fun( claims, options )
    		else 
    			--==========================================
    			for i, statement in pairs( claims ) do
    				options.num = i
    				local va = formatOneStatement( statement,ref, options )
    				if va.v then
    					table.insert( valuetable, va.v )
    				end
    				table.insert( statementsraw, va.raw )
    			end
    		end
    	end
    	local priff = ""
    	local Separator = options.separator-- or ""
    	local Conjunction = options.conjunction-- or ""
    	
    	--if Conjunction and Conjunction == "br" then Conjunction =  "\n" end
    	if (Separator and Separator == "br") or (Conjunction and Conjunction == "br")  then 
    		Separator = mw.text.tag('br')
    		Conjunction = mw.text.tag('br')
    	end
    	if Separator and Separator == "*"  then 
    		priff = "\n*" 
    		Separator = "\n*" 
    		Conjunction = "\n*" 
    	end
    	if Separator and Separator == "#"  then 
    		priff = "\n#" 
    		Separator = "\n#" 
    		Conjunction = "\n#" 
    	end
    	local tot = mw.text.listToText( valuetable, Separator, Conjunction )
    	if #valuetable > 1 then
    		tot = priff .. tot
    	end
    	
    	if tot == '' then tot = nil end
    	if options.raw and options.raw ~= '' then
    		if options.rawtolua and options.rawtolua ~= '' then
    			return  mw.getCurrentFrame():extensionTag("source", mw.dumpObject(statementsraw),{ lang= 'lua'})
    		end
    		return statementsraw
    	end
    	if options.returnnumberofvalues and (options.returnnumberofvalues ~= "" or options.returnnumberofvalues == true ) then
    		return tot, #valuetable
    	end
    	if options.numberofclaims and options.numberofclaims ~= '' then
    		return #All_claims
    	end
    	return tot
    end
    
    function p.formatAndCat(args)
    	if args then Frame_args = args end
    	if not args then return nil end
    	args.linkback = args.linkback or true
    	args.addcat = true
    	if args.value then
    		if args.value == '-' then return nil end
    		local val = args.value .. addTrackingCategory(args.property,args) --catewikidatainfo({property = args.property})
    		val = p.addLinkBack(val, args.entity, args.property)
    		return val
    	end 
    	return p.formatStatementsFromLua( args )
    end
    
    function formatReferences( statement, options )
    	local ic
    	local s
    	local statementreferences = statement.references
    	local reference = {}
    	local numberofref = tonumber(options.numberofreferences) or 7
    	if statementreferences then
    		local cite = require(  citetitle  )
    		ic = 1
    		for i, ref in pairs( statementreferences ) do
    			if ref.snaks then
    				if numberofref >= ic then
    					s =  cite.citeitem2(ref , options )
    					if s and s ~= "" then 
    						ic = ic + 1
    						table.insert(reference, s)
    					end
    				end
    			end
    		end
    	end
    	local final = table.concat(reference)
    		if final and final ~= '' then
    			final = final .. i18n.cateref
    		end
    	return final
    end
    
    function formatqualifiers( statement,s, options )
    	s.qualifiers = {}
    	function qua(p,firstvalue,modifytime)
    		if p and p ~='' then
    			vvv = formatStatements({property =p,enlabelcate = 't', firstvalue = (firstvalue or '')
    				,modifytime = (modifytime or 'longdate'), noref = 'true'}, statement.qualifiers) or ''
    			s.qualifiers[p] = vvv
    			return vvv
    		end
    	end
    	
    	if options.template and options.template ~= '' then
    		s.ID = getEntityIdFromValue(statement.mainsnak.datavalue.value)
    		s.QQ1 = qua(options.Q1)
    		s.QQ2 = qua(options.Q2)
    		s.QQ3 = qua(options.Q3)
    		s.QQ4 = qua(options.Q4)
    		s.QQ5 = qua(options.Q5)
    		s.QQ6 = qua(options.Q6)
    		s.QQ7 = qua(options.Q7)
    		s.QQ8 = qua(options.Q8)
    		s.QQ9 = qua(options.Q10)
    		s.QQ10 = qua(options.Q10)
    	end
    	if options.football and options.football ~= '' then
    		if statement.qualifiers.P1350 or statement.qualifiers.P1351 then
    			s.amatch = qua("P1350",'true')
    			s.goal = qua("P1351",'true')
    		end
    	end
    	if (options.football and options.football ~= '' ) or (options.office and options.office ~= '') then
    		s.start1 = qua("P580",'true')
    		
    		s.finish1 = qua("P582",'true')
    	end
    	if options.office and options.office ~= '' then
    		if statement.qualifiers.P580 or statement.qualifiers.P582 or statement.qualifiers.P1365 or statement.qualifiers.P1366 then
    			s.before1 = qua("P1365",'true')
    			s.after1 = qua("P1366",'true')
    			s.constituency1 = qua("P768")
    			s.series1 = qua("P1545")
    			s.electedin1 = qua("P2715",'')
    			s.pp1001 = qua("P1001")
    			s.pp108 = qua("P108")
    			s.pp642 = qua("P642")
    		end
    	end
    	
    	if options.withdate and options.withdate ~= '' then
    	--if statement.qualifiers.P585 then
    		s.P585 = qua("P585",'true',options.modifyqualifiertime)
    	end
        local qwe = options.qwer
    	if statement.qualifiers.qwe  then
    		s.ro = qua(qwe,'true')
    	end
    	--if statement.qualifiers.P574 then
    		--s.dateoftaxpub = qua("P574",'true',options.modifyqualifiertime)
    	--end
    	--[[
    	if statement.qualifiers.P405 then
    		local author = {}
    		for i, j in pairs(statement.qualifiers.P405) do
    			if j.snaktype == 'value' then
    				local item = 'Q' .. j.datavalue.value['numeric-id']
    				local authorname = formatStatements({property = "P428", entityId = item, noref = 'true', firstvalue = 'true'})
    				if author and authorname ~= '' then
    					table.insert(author, formatEntityId(item, {label = authorname }).value)
    				else
    					table.insert(author, formatEntityId(item, {}).value)
    				end
    			end
    		end
    		s.auktor = mw.text.listToText(author, ', ', ' & ')
    	end	
    	--]]
    	local bothdates_option = options.withintervall or options.bothdates
    	if  bothdates_option and bothdates_option  ~= '' then
    		if statement.qualifiers.P580 or statement.qualifiers.P582 then
    			local f = qua("P580",'true',options.modifyqualifiertime)
    			local t =  qua("P582",'true',options.modifyqualifiertime)
    				s.tifr = f .. '–' .. t
    				
    		end
    	end
    	if options.awardqua and options.awardqua ~= '' then 
    		if statement.qualifiers.P585 or statement.qualifiers.P1346 then
    			local fo = qua("P585",'true',options.modifyqualifiertime)
    			local to = qua('P1346','true')
    			s.foto = fo .. ' ' .. mw.text.tag('span', {}, ' ' .. to  .. '')
    		end
    	end
    	function quaaal(opti,options)
    		if opti and opti ~=''  and statement.qualifiers[opti] then
    			kkk = formatStatements({property = opti, noref = 'true', separator = options.qualifierseparator
    				, conjunction = options.qualifierconjunction,size =options.size,image =options.image
    				, modifytime = options.modifyqualifiertime,enlabelcate = 't',langpref = options.langpref,showlang = options.showlang}
    				, statement.qualifiers) or ''
    			
    			s.qualifiers[ opti ] = kkk
    			return kkk
    		end
    	end
    	--if statement.qualifiers.P291 then       -- خاصية بلد النشر
    		--s.utgivort = quaaal('P291',options)
    	--end
    	--if statement.qualifiers.P2096 then
    		--s.bildtext = formatStatements({property = "P2096", noref = 'true', langpref = (options.langpref or 'ar')}, statement.qualifiers)
    	--end
    	if options.justthisqual and options.justthisqual ~= '' and statement.qualifiers[options.justthisqual] then
    		s.onlyqualifier = quaaal(options.justthisqual,options)
    	end
    	if options.qual1 and options.qual1 ~= '' and statement.qualifiers[options.qual1] then
    		s.qp1 = quaaal(options.qual1,options) 
    	end
    	if options.qual1a and options.qual1a ~= '' and statement.qualifiers[options.qual1a] then
    		s.qp1a = quaaal(options.qual1a,options) 
    	end
    	if options.qual2 and options.qual2 ~= '' and statement.qualifiers[options.qual2] then 
    		s.qp2 = quaaal(options.qual2,options) 
    	end
    	if options.qual3 and options.qual3 ~= '' and statement.qualifiers[options.qual3] then
    		s.qp3 = quaaal(options.qual3,options) 
    	end
    	if options.qual4 and options.qual4 ~= '' and statement.qualifiers[options.qual4] then
    		s.qp4 =  quaaal(options.qual4,options) 
    	end
    	if options.qual5 and options.qual5 ~= '' and statement.qualifiers[options.qual5] then
    		s.qp5 = quaaal(options.qual5,options) 
    	end	
    end
    
    function formatStatement( statement, options )
        if options['claim-module'] or options['claim-function'] then
    		if not options['claim-module'] or not options['claim-function'] then
                return {value = formatError( 'unknown-claim-module' )}
            end
            local formatter = require ('Module:' .. options['claim-module'])
            if not formatter then
                return {value = formatError( 'claim-module-not-found' )}
            end
            local fun = formatter[options['claim-function']]
            if not fun then
                return {value = formatError( 'claim-function-not-found' )}
            end
            return {value = fun( statement, options )}
        
        elseif statement.type == 'statement' then
        	local s = formatSnak( statement.mainsnak, options ) 
    		if s and s ~= ''  then
    			s.qualifiers = {}
    			if statement.qualifiers then
    				qualu = formatqualifiers( statement,s, options )
    				--if qualu and qualu ~= '' then table.insert(qualu) end
    			end
    			if statement.references then
    				if options.reff and options.reff ~= ''  then
    					s.reff  = formatReferences( statement, options )
    				end 
    			end
    		end
    		return s
    	elseif not statement.type then
    		return formatSnak( statement, options )
        end
    	return {value = formatError( 'unknown-claim-type' )}
    end
     
    function formatSnak( snak, options )
        if snak.snaktype == 'somevalue' then
        	if options.somevalue then
        		if options.somevalue == '' then
        			return nil
        		else
        			return {value = options.somevalue}
        		end
        	end
            return {value =  i18n['somevalue']}
        elseif snak.snaktype == 'novalue' then
        	if options.novalue then
        		if options.novalue == '' then
        			return nil
        		else
        			return {value = options.novalue}
        		end
        	end
            return {value = i18n['novalue']}
        elseif snak.snaktype == 'value' then
        	local s = formatDatavalue( snak.datavalue, snak.datatype, options )
        	if s and s.value and options.prefix and options.prefix ~= '' then
        		s.value = options.prefix .. s.value
        	end
        	if s and s.value and options.suffix and options.suffix ~= '' then
        		s.value = s.value .. options.suffix
        	end
            if s and s.item and options.getsimpleproperty then
            	if options.getsimpleproperty ~= '' and options.getproperty and options.getproperty ~= '' then
            		local pr = formatStatements({property = options.getproperty, entityId = s.item, firstvalue = options.getenbarten
            			, noref = 'true', modifytime = options.getmodifytime, raw = options.getraw})
            	if pr then s.pr = pr end
            end
            end
            return s
        else
            return {value = formatError( 'unknown-snak-type' )}
        end
    end
    
    local skiip = {
    	["P106"] = {
    		"Q42857"  ,  -- prophet
    		"Q14886050"  , -- terrorist
    		"Q2159907"  , -- criminal
    	}}
    
    --[[
    
    function to get countries flags without reload large countries items
    
    ]]
    function get_property1(options , item)
    	local flagprop = { "p27","p1532","p17","p495","p1376" }
    	local work_flag = false
    	local property1 = options.property1 or options["property1"]
    	if string.lower(property1) == "p41" then
    		for k, l in pairs(flagprop) do
    			if string.lower(options.property) == l then 
    				work_flag = true
    			end
    		end
    	end
    	caca = ''
    	local size = options.size or ""
    	if size == "" then size = "20" end
    	if work_flag then
    		local flag = flags[item]
    		if not flag or flag == '' then
    			flag = formatStatements( {property = options.property1 or options["property1"]
    				, entityId = item
    				, noref =options.noref or options["noref"]
    				,rank=options.property1rank or options["property1rank"]
    				,pattern = options.property1pattern or options["property1pattern"]
    				,formatting=options.property1formatting or options["property1formatting"]
    				,noref='true'
    				,firstvalue ='true'
    			} )
    			--mw.log("get flag2 :" .. flag .. ", for item ".. item )
    		end
    		if flag and flag ~= '' then -- return real image
    			if options.image and options.image ~= '' then -- return real image
    				caca = '[[file:' .. flag  .. '|'.. size ..'px|'..'border'..']]' 
    				--caca = Infobox_Image( {image = flag, size = size, maxsize = "280x330px", center = options.center} )
    				mw.log("get flag :" .. flag .. ", for item ".. item )
    			end
    		end
    	end
    	if caca == "" then
    		caca = formatStatements( {property = options.property1 or options["property1"]
    			, entityId = item
    			, noref =options.noref or options["noref"]
    			,rank=options.property1rank or options["property1rank"]
    			,pattern = options.property1pattern or options["property1pattern"]
    			,formatting=options.property1formatting or options["property1formatting"]
    			,size =options.size or options["size"]
    			,image =options.image or options["image"]
    			,noref='true'
    			,firstvalue ='true'
    		}
    		)
    	end
    	return caca
    end
    
    function formatwikibaseitem( datavalue, datatype, options )
     --[[  datatype  wikibase-item   ]]
    
    	local item = getEntityIdFromValue( datavalue.value )
    	local itemValue = formatEntityId( item , options ).value
    	local Format = options.formatting or options["formatting"]
    	local Skipped = skiip[options.property] or {}
    	for k, v in pairs(Skipped) do
    		if datavalue.value.id == v then 
    			return {value = ""}    	
    		end
    	end
    	if Format and Format  ~= '' 
    	then
    		if Format == 'raw' then 
    			--mw.log("raw: " .. item )
    			return {value = item }
    		elseif Format == 'rawtotemplate' then 
    			--mw.log('options')
    			--mw.log(options)
    			if options.rawtotemplate  and options.rawtotemplate ~= ''  then 
    				return {value = mw.getCurrentFrame():expandTemplate{ title = options.rawtotemplate, args = {
    					q = item , no1 = options.no1 or '' , no2 = options.no2 or ''
    					
    				}} .. '\n'
    				}
    			end
    		elseif Format == 'fu' then 
    			fu_temp = "Cycling race/stageclassification1"
    			return {value = mw.getCurrentFrame():expandTemplate{ title = fu_temp , args = {item}} }
    		elseif Format == 'sitelink' then -- for Wikidata property giving Wikimedia list
    			return {value = formatsitelink(datavalue.value.id , options ) }
    		else
    			return {value = formatFromPattern( formatcharacters(datavalue.value, options), options )}
    		end
    	elseif options.property1 and options.property1 ~= '' and options.property1:upper():sub(1,1) =="P" 
    		then
    		for i, statement in pairs( datavalue ) do
    			caca = get_property1(options , item)
    			if itemValue and itemValue  ~= '' then
    				if caca and caca  ~= '' then 
    					cooooca = (options.property1pref or '') ..''.. caca ..''.. (options.property1suff or '')
    					if options.property1after and options.property1after ~= "" then
    						return {value = itemValue .. cooooca } 
    					else
    						return {value = cooooca .. ' '.. itemValue } 
    					end
    				else
    					return {value = itemValue  }
    				end
    			end
    		end 
    	elseif options.propertyimage and options.propertyimage ~= '' then
    		local p_f = options.propertyimageformatting or options.formattingpropertyimage
    		for i, statement in pairs( datavalue ) do
    			local vas = formatStatements( {
    				property =options.propertyimage 
    				,formatting = p_f
    				,entityId = item
    				,noref =options.noref 
    				,rank=options.rank
    				,pattern =options.pattern
    				,size =options.size
    				,image =options.image
    				,noref='true'
    				,avoidvalue = options.avoidvaluepropertyimage
    				,firstvalue ='true'
    				,nolink=options.nolink 
    			})
    			if vas and vas  ~= '' then 
    				return {value =  vas } 
    			else
    			end
    		end 
    	elseif options.property2 and options.property2 ~= '' then
    		for i, statement in pairs( datavalue ) do
    			local caca = formatStatements( 
    				{property =options.property2
    				, entityId = item
    				, noref =options.noref 
    				,rank=options.rank
    				,pattern =options.property2pattern
    				,size =options.size
    				,image =options.image
    				,propertyimage =options.property3
    				,firstvalue ='true'
    				})
    			if itemValue and itemValue  ~= '' then
    				if caca and caca  ~= '' then
    						return {value =  caca .. ' '.. itemValue  } 
    					else 
    						return {value = itemValue  } 
    				end
    			end	
    		end 
       else
    		return {value = formatEntityId( item, options ).value, item = item }    	
    	end
    end
    
    function formatwikibaseproperty( datavalue, datatype, options )
     --[[  datatype  wikibase-property   ]]
     
    	if options.formatting and options.formatting  ~= '' 
    		then
    			if options.formatting == 'raw' then 
    				tid = getEntityIdFromValue( datavalue.value )
    				else
    			end
    		else 
    		tid =  formatEntityId( getEntityIdFromValue( datavalue.value ), options ).value
    	end
    	return {value = tid}
    end
    
    function formattabulardata( datavalue, datatype, options )
     --[[  tabular-data ]]
    	data=  '[[commons:' .. datavalue.value .. '|' .. datavalue.value .. ']]'
    	return {value = data}
    end
    
    function formatgeoshape( datavalue, datatype, options )
     --[[  geo-shape  ]]
    	shape =  '[[commons:' .. datavalue.value .. '|' .. datavalue.value .. ']]'
    	return {value = shape}
    end
    function formatcommonsMedia( datavalue, datatype, options )
    
     --[[ commonsMedia ]]
    	local size = options.size or ""
    	if options.image and options.image ~= '' then -- return real image
    		--tid = '[[file:' .. datavalue.value  .. '|'.. (options.size or '60')..'px|'..'border'..']]' 
    		params = {
    			image = datavalue.value
    			, maxsize = "280x330px"
    			, center = options.center
    		}
    		if options.size and options.size ~= "" then params.size = size end
    		tid = Infobox_Image( params )
    		--tid = '[[file:' .. datavalue.value  .. '|'.. (options.size or '20')..'px|border]]' 
    		--if options.center and options.center ~= "" then
    			--tid = '[[file:' .. datavalue.value  .. '|'.. (options.size or '20')..'px|border|center]]' 
    		--end
    	else
    		tid =  formatcharacters(datavalue.value, options)
    	end
    	return {value = tid}
    end
    
    function formatmath( datavalue, datatype, options )
     --[[datatype math ]]
    		 --return	{value = mw.text.tag('math', {}, ''.. datavalue.value..'') } -- that doesn't work well
    		 return	{value =mw.getCurrentFrame():callParserFunction( '#tag:math', ''.. datavalue.value..'' ) }
    end
    
    function formatstring( datavalue, datatype, options )
     --[[  datatype  string  -  external-id  ]]
    	--old value: auktoritetsdata , auktoritetsdata2 , auktoritetsdata3
    	local par = options.pattern
    	if options.stringpattern and options.stringpattern ~= "" then
    		--mw.log(options.stringpattern)
    		tid = mw.ustring.gsub( options.stringpattern, '$1', datavalue.value ) 
    	elseif par and par ~= '' then
    		if par == "autourl" or par == "autourl2" or par == "autourl3" or par == "autourl4"
    		then 
    			tid =  formatcharacters(datavalue.value, options)
    		else 
    			tid = formatFromPattern( formatcharacters(datavalue.value, options), options )
    		end
    	else
    		 tid =  formatcharacters(datavalue.value, options)
    	end
    	return {value = tid}	
    end
    
    function formatexternalid( datavalue, datatype, options )
    	if options.pattern and options.pattern ~= '' 
    	then
    		par = options.pattern
    			local patter = formatStatements( {property = "P1630", entityId = options.property, firstvalue = 'true', noref = 'true',rank='all' }) -- get formatter URL
    			--mw.log( options.property .. ':' .. patter )
    			local pp = formatFromPattern( datavalue.value, {pattern = patter} )
    			local plabel = pp
            if mw.wikibase
    			then  plabel =  mw.wikibase.label( options.property ) or pp 
            end
            ppp = mw.ustring.gsub( pp, ' ', '_' )
    		if patter and patter ~= '' then   -- if P1630 are there
    				
    				if par == "autourl" then -- like http://example.com/$1.html
    					 tid =  ppp
    				elseif par ==  "autourl2" then  -- like [http://example.com/$1.html $1]
    					 tid =  '[' .. ppp .. ' ' .. datavalue.value .. ']' 
    				elseif par ==  "autourl3"  then  -- like [http://example.com/$1.html http://example.com/$1.html]
    					 tid =  '[' .. ppp .. ' ' .. ppp .. ']' 
    				elseif par == "autourl4"  then
    					 tid =  '[' .. ppp .. ' ' .. plabel .. ']' 
    				else
    					tid =  formatFromPattern( formatcharacters(datavalue.value, options), options )
    				end
    			else   --  P1630 are not there
    				if par ==  "autourl" or par ==  "autourl2" or par == "autourl3" or par == "autourl4"
    				then
    					tid =  formatcharacters(datavalue.value, options)  --just return value
    				else
    					tid =  formatFromPattern( formatcharacters(datavalue.value, options), options )
    				end
    			end
    	else
    		 tid =  formatcharacters(datavalue.value, options) --just return value
    	end
    	return {value = tid}	
    end
    
    function formattime( datavalue, datatype, options )
     --[[  datatype  time  ]]
            local ModuleTime = require 'Module:wikidata2/time'
            local timen = datavalue.value 
            local modifytime = (options.modifytime or '')
            local tid = ModuleTime.getdate( timen , options)
           -- local tid =  mw.getCurrentFrame():preprocess(mall)
            if options.modifytime and options.modifytime ~= '' then
    			if options.modifytime == 'q' then
    				local mall = datavalue.value.time
    				tid = mw.getCurrentFrame():preprocess(mall)
    			elseif options.modifytime == 'precision' then
    				local mall = datavalue.value.precision
    				tid = mw.getCurrentFrame():preprocess(mall)
    			end
    		end
    	return {value = tid}	
    end
    
    function formatcoordinate( datavalue, datatype, options )
    --[[  datatype  globe-coordinate  ]] 
    	--local GlobeCoordinate = require 'Module:GlobeCoordinate'
    	--return {value = GlobeCoordinate.newFromWikidataValue( datavalue.value ):toHtml()}
    	local coord = datavalue.value 
    	local globe = datavalue.value.globe
    	--local globe = globe:match('Q%d+')
    	local globe2 =  require('Module:Wikidata2/Globes')[globe] or ""
    	if options.formatting  and options.formatting  ~= '' then
    		if options.formatting == 'latitude' then 
    			pro =coord.latitude 
    		elseif options.formatting == 'longitude' then 
    			pro =coord.longitude 
    		elseif options.formatting == 'dimension' then 
    			pro =coord.dimension  
    		elseif options.formatting == 'precision' then 
    			pro =coord.precision 
    		elseif options.formatting == 'globe' then 
    			pro = globe:match('Q%d+') 
    		elseif options.formatting == 'globe2' then 
    			pro = globe2 
    		--elseif options.formatting == 'coord' then
    			--return {value = }
    		else
    		end
    	else
    		pro =
    			mw.getCurrentFrame():preprocess('{{ {{{|safesubst:}}}#invoke:Coordinates|coord'
    			.. '|'.. coord.latitude
    			.. '|'.. coord.longitude
    			.. '|display=inline'
    			.. '|globe:'.. globe2 ..'_type:landmark'
    			.. '|format='..(options.formatcoord or '')..'}}'
    			)..catewikidatainfo(options) 
    	end
    	return {value = pro }
    end
    
    function formatquantity( datavalue, datatype, options )
    --[[  datatype quantity  ]] 
    		local amount, unit, cat = datavalue.value.amount, datavalue.value.unit, nil
    		amount = mw.ustring.gsub( amount , '+', '' )
    		if unit then
    			unit = unit:match('Q%d+')
    		end
    		local number = formatera.newFromWikidataValue(datavalue.value)
    		local unitraw = unit
    		if unit then
    			-- يتحقق اذا كان هناك اي اختصار لوحدة القياس
    			--if lab and ( not options.nounitshort or options.nounitshort == '' )  then
    			if options.unitshort and options.unitshort ~= '' then
    				local lab = options.label 
    				or formatStatements({property = 'P498', entityId = unit, firstvalue = 'true', noref = 'true'}) 
    				or formatStatements({property = 'P5061', entityId = unit, firstvalue = 'true', langpref = options.langpref, noref = 'true'})
    				or ""
    				local s = formatEntityId( unit, {label = lab ,enlabelcate ='t' , nolink = (options.nounitlink or options.nolink) })
    				unit = s.value
    				cat = s.cat
    			else -- om det inte finns en f?rkortning
    				local s = formatEntityId( unit, {nolink = options.nounitlink ,enlabelcate ='t'})
    				unit = s.value
    				cat = s.cat
    			end
    			
    		end
    	if options.formatcharacters and options.formatcharacters =="formatnum" then
    		amount = make_format_num( amount )
    	end
    		local Value = amount .. ' ' .. (unit or '')
    		if options.nounit and options.nounit ~= "" then
    			Value = amount
    		end
    		return {value = Value, amount = amount, unit = unit, unitraw = unitraw, cat = cat}
    end
    
    function formaturl( datavalue, datatype, options )
    --[[  datatype  url  ]] 
    	local label = options.label
    	if options.urllabel and options.urllabel  ~= '' then
    		label = options.urllabel     
    	end
    	va =  mw.ustring.gsub( datavalue.value, ' ', '_' )
    	if not label and  options.property =='P856' then label = 'الموقع الرسمي' end
    	if options.displayformat and options.displayformat == "weblink" then
    		return {value = weblink.makelink(va ) }
    	end
    	if options.formatting and options.formatting == "raw" then
    		return {value = va }
    	end
    		if label and label ~= '' then
    		pro = '[' .. va .. ' ' .. label .. ']' 
    		else
    		--	if property =='P856' then 	pro =  formatFromPattern( formatcharacters(va, options), {pattern = '[$1 الموقع الرسمي]'} )
    			--	else
    					pro = va
    		--		end
    		end
    	return {value = pro }
    end
    
    function formatmonolingualtext( datavalue, datatype, options ) -- showlang
    	local text = datavalue.value.text
    	if options.textformat and options.textformat == "text" then
    		return {value = text}
    	end
    	local Moduletext = require 'Module:wikidata2/monolingualtext'
    	local tid = Moduletext._main( datavalue, datatype, options )
    	return {value = tid}	
    end
    
    function formatDatavalue( datavalue, datatype, options )
        --Use the customize handler if provided
        if options['value-module'] or options['value-function'] then
            if not options['value-module'] or not options['value-function'] then
                return {value = formatError( 'unknown-value-module' )}
            end
            local formatter = require ('Module:' .. options['value-module'])
            if not formatter then
                return {value = formatError( 'value-module-not-found' )}
            end
            local fun = formatter[options['value-function']]
            if not fun then
                return {value = formatError( 'value-function-not-found' )}
            end
            return {value = fun( datavalue, datatype, options )}
        end
        --Default formatters
     		if datatype == 'wikibase-item' then return   formatwikibaseitem( datavalue, datatype, options ) 
     	elseif datatype == 'wikibase-property' then return   formatwikibaseproperty( datavalue, datatype, options)
     	elseif datatype == 'commonsMedia' then return   formatcommonsMedia( datavalue, datatype, options)
     	elseif datatype == 'math' then return       formatmath( datavalue, datatype, options )
     	elseif datatype == 'time' then return formattime( datavalue, datatype, options )
     	elseif datatype == 'external-id' then return  formatexternalid( datavalue, datatype, options )
     	elseif datatype == 'string' then return  formatstring( datavalue, datatype, options )
     	elseif datatype == 'globe-coordinate' then return  formatcoordinate( datavalue, datatype, options )
     	elseif datatype == 'quantity' then return   formatquantity( datavalue, datatype, options )
     	elseif datatype == 'url' then return   formaturl( datavalue, datatype, options )
     	elseif datatype == 'monolingualtext' then return  formatmonolingualtext( datavalue, datatype, options )
     	elseif datatype == 'geo-shape' then return formatgeoshape( datavalue, datatype, options )
     	elseif datatype == 'tabular-data' then return formattabulardata( datavalue, datatype, options )
        else
            return {value = formatError( 'unknown-datatype' )}
        end
    end
    
    function formatEntityId( entityId, options )
    	local label = options.label or mw.wikibase.label( entityId )
    	if label == '' then
    		label = mw.wikibase.label( entityId ) or nil
    	end
        local link = mw.wikibase.sitelink( entityId )
        if link and link ~= "" and (not options.nolink or options.nolink == '') then
            if label and label ~= '' then
                return {value = '[[:' .. link .. '|' .. formatcharacters(label, options) .. ']]'.. catewikidatainfo(options), label = label }
            else
                return {value = '[[:' .. link .. '|' .. formatcharacters(link, options) .. ']]'.. catewikidatainfo(options), label = link }
            end
        else
        	if label and label ~= '' 
        		then
        		local label3 = Labelfunction( entityId, label,options.label, options)
        		return {value = label3 , label = label}
        	else return ''
    
        	end
        	return '' --{value = entityId, cat = 'som har labels med Qid', label = entityId}
        end
    end
    
    function sitelink_g( id , wikisite )
     --[[ 
           function to get any link from any sister project
     ]]
    	if not mw.wikibase then return '' end
    	local site = wikisite or 'arwiki'
    	local link = mw.wikibase.sitelink( id , site ) or ""
    	--mw.log("mw.wikibase.sitelink,site: " .. site.. ",link:" .. link )
    	return link
    end
    
    function sitelink( id , wikisite )
    	if not mw.wikibase then return '' end
    	local site = wikisite or 'arwiki'
    	--local link = mw.wikibase.getSitelink( id , site ) or ""
    	--return link
    	
    	local entity = mw.wikibase.getEntityObject(id)
    	if entity
    		and entity.sitelinks 
    		and entity.sitelinks[''..site..'']
    		and entity.sitelinks[''..site..''].site 
    		and entity.sitelinks[''..site..''].title 
    		then
    			if entity.sitelinks[''..site..''].site == site then
    			return entity.sitelinks[''..site..''].title
    			else return ''
    			end
    	end
    end
    
    function formatsitelink( entityId, options )
     --[[ function to get only the value with link ]] 
        local link = sitelink( entityId )
        if link and link ~= ''  then
    		if not options.nolink or options.nolink == '' then
                --return '[[' .. formatcharacters(link, options) .. ']]'.. catewikidatainfo(options)
                return '[[' .. link .. ']]'.. catewikidatainfo(options)
        else
        		return link -- formatcharacters(link, options)
    		end
        else 
    		return ''
        	end
    
    end
    
    function formatFromPattern( str, options )
     --[[  function to replace $1 with string  ]] 
    	--if options.pattern and options.pattern ~='' then
    			--mw.log( str .. ':' .. options.pattern )
    			return mw.ustring.gsub( options.pattern, '$1', str )  --الحصول على اول نتيجة للدالة
    	--	else return str
    	--end
    end
    
    function p.getEntity( id ) 
    	if type(id) == 'table' then return id end
    	return getEntityFromId(id)
    end
    
    function p.translate(str, rep1, rep2)
    	str = i18n[str] or str
    	if rep1 and (type (rep1) == 'string') then
    		str = str:gsub('$1', rep1)
    	end
    	if rep2 and (type (rep2) == 'string')then
    		str = str:gsub('$2', rep2)
    	end
    	return str
    end
    
    function p.getId(snak)
    	if (snak.snaktype == 'value') then
    		if snak.datavalue.type == "wikibase-entityid" then 
    			return 'Q' .. snak.datavalue.value['numeric-id']
    		end
    	end
    end
    
    function p.addLinkBack(str, id, property)
    	if not id then id = p.getEntity() end
    	if not id then return str end
    	if type(property) == 'table' then property = property[1] end
    	if type(id) == 'table' then id = id.id end
    	local class = ''
    	if property then
    		class = 'wd_' .. string.lower(property)
    	end
    	local icon = '[[File:Blue pencil.svg|%s|10px|baseline|class=noviewer|link=%s]]'
    	local title = i18n['see-wikidata-value']
    	local url = mw.uri.fullUrl('d:' .. id, 'uselang=ar')
    	url.fragment = property
    	url = tostring(url)
    	local v = mw.html.create('span')
    		:addClass(class)
    		:wikitext(str)
    		:tag('span')
    			:addClass('noprint wikidata-linkback')
    			:css('padding-left', '0.5em')
    			:wikitext(icon:format(title, url))
    		:allDone()
    	return tostring(v)
    end
    
    -- Function to check whether a certain item is a parent of a given item.
    -- If pExitItem is reached without finding the searched parent item, the search stops.
    -- A parent is connected via P31 or P279.
    -- Attention: very intensive function, use carefully!
    function isParent(property, pItem, pParent, pExitItem, pMaxDepth, pDepth)
    	if not pDepth then pDepth = 0 end
    	 	if not mw.wikibase then return false end
    	local entity = mw.wikibase.getEntity(pItem)
    	if not entity then return false end
    	local claims31
    	local claims279
    	if entity.claims then 
    		if property and property ~= '' then
    			claims31 = entity.claims[property] 
    		else
    			claims31 = entity.claims['P31'] 
    			claims279 = entity.claims['P279'] 
    		end
    	else
    		return false
    	end
    	if not claims31 and not claims279 then return false end
    	local parentIds = {}
    		if claims31 and #claims31 > 0 then
    			for i, v in ipairs(claims31) do parentIds[#parentIds+1] = p.getId(v.mainsnak) end
    		end
    		if claims279 and #claims279 > 0 then
    			for i, v in ipairs(claims279) do parentIds[#parentIds+1] = p.getId(v.mainsnak) end
    		end
    	-- check if searched parent or exit item is reached or do recursive call
    	if not parentIds[1] or #parentIds == 0 then return false end
    	local itemString = ""
    	local result = nil
    	for i, qid in ipairs(parentIds) do
    		if not qid then return false end
    		--itemString = "Q" .. v
    		itemString = qid
    		if itemString == pParent then 
    			-- successful!
    			return true
    		elseif itemString == pExitItem then --or itemString == "Q35120"  
    			-- exit if either "exit item" or node item (Q35120) is reached
    			return false
    		else
    			if pDepth+1 < pMaxDepth then
    				result = isParent(property, itemString, pParent, pExitItem, pMaxDepth, pDepth+1)
    			else return false end
    			
    			if result == true then return result end
    		end
    	end
    	do return false end
    end
    
    function p.Subclass(options)
    	if options then Frame_args = options end
    	local parent = options.parent or ""
    	local id = options.id or ""
    	local Entity = getEntityFromId(id) 
    	if Entity then id = Entity.id end
    	local property = options.property or "P31"
    	if parent == "" or id == "" or property == "" then return false end
    	local tab = mw.text.split(options.parent,',')
    	local result = mw.wikibase.getReferencedEntityId( id , property,  tab  ) -- { 'Q5', 'Q2095' } )
    	if not result and property == "P31" then
    		result = mw.wikibase.getReferencedEntityId( id , "P279" ,  tab  )
    	end
    	if result then return true end
    end
    
    function old_isSubclass(options)
    	if not options.parent then return false end
    	local maxDepth
    	maxDepth = tonumber(options.maxDepth) or 10
    	if not type(maxDepth) == "number" then maxDepth = 5 end
    	property = options.property
    	local result
    	result = isParent(property, options.id, options.parent , options.exitItem, maxDepth)
    	if options.returnInt then
    		if result == true then return 1 else return nil end
    	else
    		return result
    	end
    end
    
    function p.formatSnak( snak, options )
        return formatSnak( snak, options )
    end
    
    function p.getLabel( entity, lang )
         return labelIn( lang , entity )
    end
    
    function p.formatEntityId( entityId, options )
    	return formatEntityId( entityId, (options or {}) )
    end
     
    function p.formatStatements( frame, key )
    	if frame.args then
    		if type(key)  == 'table' and key ~= {}  then else Frame_args = frame.args end
    	end
     --[[ 
           The main function 
     ]] 
        local args = frame.args
        --If a value if already set, use it
        if args.value and args.value ~= '' then
            return args.value
        end
        local wd_arg = frame:getParent().args["ويكي بيانات"] or frame.args["ويكي بيانات"]  -- arg used to ban wikidata value
        if wd_arg and wd_arg == 'لا' then
            return ""
        end
        
        local valuesnumb = 0
        local prop = formatStatements( args, key )
        if args.returnnumberofvalues then
            s , valuesnumb = formatStatements(  frame.args, key )
        end
    	if prop and prop ~= '' then
        	if args.mainprefix and args.mainprefix ~= '' then -- mainprefix
        		prop = args.mainprefix .. prop
        	end
        	if args.mainsuffix and args.mainsuffix ~= '' then  -- mainsuffix
        		prop = prop .. args.mainsuffix
        	end
    		if args.addTrackingCat and args.addTrackingCat ~= '' then   -- add tracking cat
    		prop =  addTrackingCategory(prop,frame.args)
    		end
    		if args.mainsuffixAfterIcon and args.mainsuffixAfterIcon ~= '' then   -- another suffix but after wikidata icon
    		prop =  prop .. args.mainsuffixAfterIcon 
    		end
    	else 
        	if args.NoPropValue and args.NoPropValue ~= '' then -- value if no local value and no wikidata value  
        		prop = args.NoPropValue
        	end
    	end
        if args.returnnumberofvalues and args.returnnumberofvalues ~= "" then
    		mw.log( "valuesnumb: " .. valuesnumb ) 
            return s , valuesnumb
        end
        return prop
    end
    function p.formatStatementsFromLua( options, key ) --  main function but to use from lua module
    	if options then if type(key) == 'table' and key ~= {}  then else Frame_args = options end end
    	
        --If a value if already set, use it
        if options.value and options.value ~= '' then
            return options.value
        end
        local valuesnumb = 0
        local s = formatStatements( options, key )
        if options.returnnumberofvalues and (options.returnnumberofvalues ~= "" or options.returnnumberofvalues == true ) then
            s , valuesnumb = formatStatements( options, key )
        end
        if s == '' then
        	s = nil
        end
    	if s and s ~= '' then
        	if options.mainprefix and options.mainprefix ~= '' then -- mainprefix
        		s = options.mainprefix .. s
        	end
        	if options.mainsuffix and options.mainsuffix ~= '' then  -- mainsuffix
        		s = s .. options.mainsuffix
        	end
    		if options.addTrackingCat and options.addTrackingCat ~= '' then   -- add tracking cat
    			s = addTrackingCategory(s,options)
    		end
    		if options.mainsuffixAfterIcon and options.mainsuffixAfterIcon ~= '' then   -- another suffix but after wikidata icon
    		s =  s .. options.mainsuffixAfterIcon 
    		end
    	else 
        	if options.NosValue and options.NosValue ~= '' then -- value if no local value and no wikidata value  
        		s = options.NosValue
        	end
    	end
        if options.returnnumberofvalues and (options.returnnumberofvalues ~= "" or options.returnnumberofvalues == true ) then
    	--	mw.log( "valuesnumb: " .. valuesnumb ) 
            return s , valuesnumb
        end
        return s
    end
    
    function p.isSubclass(frame)
    	if frame.args then Frame_args = frame.args end
    	return p.Subclass(frame.args)
    end
    
    -- Return the site link for a given data item and a given site (the current site by default) 
    
    function p.getSiteLink( frame )
    	if not mw.wikibase then return '' end
    	if frame.args then Frame_args = frame.args end
    
    	local site = frame.args[2] or frame.args.site
    	local id = frame.args[1] or frame.args.id
    	local count = frame.args.countsitelinks
    	if not id or id == "" then
    		if frame.args.page and frame.args.page ~= "" then
    			id = mw.wikibase.getEntityIdForTitle( frame.args.page )
    		end
    	end
    	if count and count ~= "" then 
    		return countSiteLinks(id)
    	end
        local link = sitelink( id , site )
        if link and link ~= ''  then
            return link
    	end
    end
    
    function p.getSiteLink1(frame)
    	if frame.args then Frame_args = frame.args end
    
    	local project = frame.args[1] 
    	local id = frame.args[2]
    	local link = sitelink( id , project )
    	var = link
    	return var
    end
    
    -- returns the page id (Q...) of the current page or nothing of the page is not connected to Wikidata
    function p.pageId(frame)
    	return  mw.wikibase.getEntityIdForCurrentPage()
    end
    
    function p.descriptionIn(frame)
    	if frame.args then Frame_args = frame.args end
    
    	local langcode = frame.args[1] or frame.args["lang"]
    	local id = frame.args[2]  or frame.args["id"]
    	return descriptionIn( langcode ,id  )
    end
    
    function p.labelIn(frame)
    	if frame.args then Frame_args = frame.args end
    
    	local langcode = frame.args[1]
    	local id = frame.args[2] -- "id" must be nil, as access to other Wikidata objects is disabled in Mediawiki configuration
    
    	return labelIn( langcode ,id  )
    end
    
    function p.ViewSomething(frame)   -- from en:Module:Wikidata
    	if frame.args then Frame_args = frame.args end
    
    	local f = (frame.args[1] or frame.args.id) and frame or frame:getParent()
              if f.args.id and f.args.id ~='' then aa = f.args.id end
    	local data = mw.wikibase.getEntityObject(aa)
    	if not data then
    		return nil
    	end
    	local i = 1
    	while true do
    		local index = f.args[i]
    		if not index then
    			if type(data) == "table" then
    				return mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY)
    			else
    				return tostring(data)
    			end
    		end
    		data = data[index] or data[tonumber(index)]
    		if not data then
    			return
    		end
    		i = i + 1
    	end
    end
    
    function p.Dump(frame)
    	if frame.args then Frame_args = frame.args end
    
    	local f = (frame.args[1] or frame.args.id) and frame or frame:getParent()
              if f.args.id and f.args.id ~='' then aa = f.args.id end
    	local data = mw.wikibase.getEntityObject(aa)
    	if not data then
    		return i18n.warnDump
    	end
    	local i = 1
    	while true do
    		local index = f.args[i]
    		if not index then
    			return frame:extensionTag("source", mw.dumpObject(data),{ lang= 'lua'}).. i18n.warnDump
    		end
    		data = data[index] or data[tonumber(index)]
    		if not data then
    			return i18n.warnDump
    		end
    		i = i + 1
    	end
    end
    
    function p.countSiteLinks(id)
    	return countSiteLinks(id)
    end
    
    function p.EntityIdForTitle(frame)
    	if frame.args then Frame_args = frame.args end
    
    	local title = frame.args[1]
    	local str = mw.wikibase.getEntityIdForTitle( title )
    	--mw.log(str)
    	return str
    end
    
    return p