الاستخدامات

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

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

الاستعمال

مثال

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

الوسائط

formatStatements

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

فصل القيم

  • |separator= فاصلة بين البنود | انظر أيضا conjunction
  • |conjunction= الفاصلة الأخيرة قبل اخر بند، افتراضي ، و .
القيم الافتراضية
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P106|rank=all}}  
  • |separator=br يضع القيم في أسطر.
القيم الافتراضية
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P106|rank=all|separator=br}}  
  • |separator=* يضع القيم في قائمة نقطية.
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P106|rank=all|separator=*}}  

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

  • |numval=2 عدد القيم المراد عرضها
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P106|rank=all|numval=2}} 

رتبة القيم / rank

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

فرز النتيجة / sort

  • |sortbytime= الترتيب حسب الوقت يفيد هذا مع المعلمة |enbarten= أعلاه
    • |sortbytime=chronological ترتيب البنود حسب زمن التصفيات المذكورة.
    • |sortbytime=inverted عكس البنذ السابق.
  • |sortingproperty= تحديد الخواص المدعومة، الافتراضي هو:'P585','P571','P580','P569','P582','P570' بالترتيب، الخواص المعتمدة حالياً هي خواص الوقت. point in time (P585) ،inception (P571) ،start time (P580) ،date of birth (P569) ،end time (P582) ،date of death (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= يضيف تصفية point in time (P585) إذا كانت موجودة.
  • |bothdates= يضيف تصفيات start time (P580) وend time (P582) إذا كانتا موجودتان كلاهما أو إحداهما.
    • |bothdates=line يضع سطر جديد قبل التاريخ، |bothdates=before يضع التاريخ قبل القيمة، |bothdates=after يضع التاريخ بعد القيمة.
  • |qual1= يضيف تصفية محددة.
فلترة النتائج
  • |avoidqualifier= يتجاهل القيم التي تحتوي تصفيات معينة، مثل: |avoidqualifier=P518 يظهر البند الذي لا يحتوي على تصفية applies to part (P518).
    • بإستخدام |avoidqualifiervalue= مع |avoidqualifier= فإن ذلك يحدد قيمة التصفية إذا طابقت الوسيط |avoidqualifiervalue= فلن يتم إظهارها، وإذا لم تطابق فسيتم إظهارها، يدعم حالياً العناصر/items فقط.
  • |preferqualifier= تحديد خاصية تصفيات يجب أن تكون بيانات الخاصية متضمنتها.
    • |preferqualifiervalue= تحدد القيمة التي تناسب أعلاه. يدعم حالياً العناصر فقط.
  • |justthisqual= يظهر فقط التصفية، إذا لم تكن التصفية موجودة لن يظهر شيء.

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

عنصر / item
  • |nolink= يظهر النتيجة دون وصلات.
  • |formatting=raw يعرض القيمة بشكل Q505.
  • |formatting=sitelink ينتج الوصلة إذا كانت موجودة في الويكي العربية.
فلترة النتيجة
  • |getonly= يستخدم هذا الوسيط إذا أردنا الحصول على عناصر معينة التي تكون قيمة instance of (P31) فيها تساوي قيمة هذا الوسيط، مثال:
    • |getonly=Q5 للحصول على الأفراد فقط.
    • القيم المتعددة ممكنة، مثل :|getonly=Q127448,Q193556 للحصول على البلديات السويدية والمناظر الطبيعية.
  • |getonlyproperty= إذا أردنا استخدام خاصية أخرى بدلاً من instance of (P31) في البند السابق.
  • |avoidvalue= يستخدم هذا الوسيط إذا أردنا أن نتجاهل أو نلغي ظهور عنصر معين، مثال عند وضع |avoidvalue=Q21769847 فتظهر النتائج دون ظهور [خطأ: الوظيفة "wdurl" غير موجودة. (Q21769847)].
prefervalue
  • |prefervalue= يستخدم هذا الوسيط بشكل معاكس للوسيط |avoidvalue= حيث نقوم بتحديد القيمة التي نريد ظهورها |prefervalue=Q19481 فتظهر النتيجة للعنصر [خطأ: الوظيفة "wdurl" غير موجودة. اتحاد بلغاريا لكرة القدم (Q19481)] فقط، ولكن الفائدة من إستخدام هذا الوسيط هي التأكد من وجود العنصر في هذه الخاصية أو للحصول على التصفيات، مثال يظهر عناصر winner (P1346) مع تصفية (P1923) بين قوسين.
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q39052816|property=P1923|qual1=P1355}} 

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

توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q39052816|property=P1923|justthisqual=P1355}} 

ولكننا نريد ظهور التصفية للفريق الفائز فقط وهو [خطأ: الوظيفة "wdurl" غير موجودة. أوبن مودليكا (Q50602)]:

توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q39052816|property=P1923|prefervalue=Q50602|qual1=P1355}} 

{{#invoke:Wikidata2|formatStatements|entityId=Q39052816|property=P1923|prefervalue=Q50602|justthisqual=P1355}} 
ملف وسائط من كومنز / commonsMedia
  • تظهر الصور افتراضياً كالتالي:

{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P18|noref=true|rank=best}}

  • |image= عند استخدام هذا الوسيط في خواص الصور تظهر الصورة مباشرة.
  • |size= لتحديد حجم الصورة (60 افتراضياً)، ضع القيمة دون (بك/px إلخ).
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P18|image=true|noref=true|rank=best|size=100}} 
  • |center= لجعل الصورة في الوسط ضع قيمة هذا الخيار |center=yes.
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P18|image=true|noref=true|rank=best|size=100|center=yes}} 
إحداثيات جغرافية / coordinate
  • |formatting=latitude يعرض خط العرض فقط.
  • |formatting=longitude يعرض خط الطول فقط.
  • |formatting=precision يعرض الدقة.
  • |formatting=globe يعرض عنصر الكوكب. مثال:
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P625|formatting=globe}} 

{{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P625|formatting=longitude}} 


نص أحادي اللغة / نص بلغة وحيدة / monolingualtext
  • |langpref= في الوحدة، هناك مرشح يعطي أولوية للقيم التي تحتوي على "اللغة = العربية". أضف القيمة المطلوبة لتعطيل هذا الفلتر.
    • القيم المقبولة الأخرى هي : justlang و langcode
    • |langpref=justlang لإظهار لغة النص فقط دون النص، مثل الإنجليزية.
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P1477|langpref=justlang}} 
    • |langpref=justlang لإظهار رمز لغة النص فقط دون النص، مثل en.
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P1477|langpref=langcode}} 
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P1477|showlang=true}} 
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P1477|textformat=text}} 
كمية / quantity
  • |nounitlink= يظهر وحدة القياس دون وصلة.

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

توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P2046|noref=t|firstvalue=y}} 
  • |formatcharacters=formatnum: تنسيق الأرقام بالفواصل.
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P2046|firstvalue=y|noref=t|formatcharacters=formatnum}} 
  • |nounit= لا يظهر وحدة القياس.
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q805|property=P2046|noref=t|firstvalue=y|nounit=t}} 
  • مثال لاستخدام |unitshort= ومثال عند عدم استخدامه:
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q219635|property=P2295|unitshort=t}} 

{{#invoke:Wikidata2|formatStatements|entityId=Q219635|property=P2295}} 
نص / 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]}} 
نقطة زمنية / time
  • |modifytime= يحدد تنسيق الوقت أو التاريخ:
    • |modifytime=longdate يكتب التاريخ في شكل "26 يونيو 2024"
    • |modifytime=Y يكتب التاريخ في شكل "2024" يظهر فقط السنة.
    • |modifytime= F يكتب التاريخ في شكل "يونيو" يظهر فقط الشهر.
    • |modifytime= j يكتب التاريخ في شكل "26" يظهر فقط اليوم.
  • |modifyqualifiertime= تنسيق التاريخ على النحو الوارد أعلاه، ولكن يؤثر فقط على التصفيات. qualifier
معرف خارجي / external-id
افتراضي:
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P2002}} 
  • |pattern= طريقة عرض الخاصية مثلاً في وصلات الضبط الاستنادي $1 مثلاً: <nowiki>https://viaf.org/viaf/$1/</nowiki> .
  • |pattern=autourl من خواص البند أعلاه، لنمط مستخدم في الخاصية formatter URL (P1630) (تنسيق عنوان URL) للخاصية المطلوبة.
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P2002|pattern=autourl}} 
  • |pattern=autourl2 كما سبق، يقدم وصلة من نوع <nowiki>[https://viaf.org/viaf/$1/ $1] </nowiki>
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P2002|pattern=autourl2}} 
⧼datatypes-type-url⧽ / url
  • |urllabel= وضع تسمية لتظهر بدلاً من الوصلة، كما في معرف خارجي ولكن في خواص الروابط.
    • مثال عند استخدام official website (P856) ل[خطأ: الوظيفة "wdurl" غير موجودة. المعالجة الرقمية للضوء (Q76)] مع/بدون الوسيط |urllabel=الموقع الرسمي:
توصيف يظهر
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P856}} 

{{#invoke:Wikidata2|formatStatements|urllabel=الموقع الرسمي|entityId=Q76|property=P856}} 
  • |displayformat= يقبل حالياً قيمة واحدة وهي |displayformat=weblink لاستخدام وحدة:weblink لعرض وصلة الموقع.
{{#invoke:Wikidata2|formatStatements|entityId=Q76|property=P856|displayformat=weblink}}

خيارات إضافية

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

property-(module/function) و claim-(module/function) و value-(module/function)

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

  • |-module= عنوان الوحدة
  • |-function= عنوان الوظيفة
property
  • |property-module= عنوان الوحدة مثل |property-module=وحدة:Wikidata2/P54
  • |property-function= عنوان الوظيفة مثل |property-function=foot
  • تستخدم هذه الخيارات عند الحاجة لتنسيق قيم الخاصية بشكل كامل مثلاً لوضعها في جدول معين، أو فرزها بتنسيق خاص، مع إمكانية الحصول على التصفيات/qualifiers والمراجع/references وتنسيقها والتحكم بها.
  • أمثلة:
    • الوحدة وحدة:Wikidata2/P54 الخاصة بعرض فرق لاعبي كرة القدم، مثل أندية كرة القدم حيث يتم فصل المنتخبات عن الأندية.
claim
  • |claim-module= عنوان الوحدة مثل |claim-module=وحدة:Wikidata2/P39
  • |claim-function= عنوان الوظيفة مثل |claim-function=office3
  • تستخدم هذه الخيارات عند الحاجة لتنسيق قيم الخاصية بشكل منفرد، مع إمكانية الحصول على التصفيات/qualifiers والمراجع/references وتنسيقها والتحكم بها.
  • أمثلة:
value
  • |value-module= عنوان الوحدة مثل |value-module=وحدة:Wikidata2/P106
  • |value-function= عنوان الوظيفة مثل |value-function=formatEntityWithGenderClaim
  • تستخدم هذه الخيارات عند الحاجة لتنسيق قيم الخاصية بشكل منفرد لكل قيمة مثلاً لأخذ تسمية الإناث عند إستخدام خاصية occupation (P106)، لا نستطيع هنا الحصول على التصفيات/qualifiers والمراجع/references.

pageId

{{#invoke:Wikidata2|pageId}}

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

labelIn

  • |1= اللغة مثل fr.
  • |2= عنصر ويكي بيانات مثل Q76.

مثال: {{#invoke:Wikidata2|labelIn|fa|Q76}} ينتج:

descriptionIn

  • |1= اللغة مثل fr.
  • |2= عنصر ويكي بيانات مثل Q76.

مثال: {{#invoke:Wikidata2|descriptionIn|en|Q76}} ينتج: display device

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}}

ينتج: Digital Light Processing

أو:

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

Dump

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

مثال2: {{#invoke:Wikidata2|Dump|id=Q76|claims|P19}}
مثال
مثال موسع: {{#invoke:Wikidata2|Dump|claims|P1791|1|references|1|snaks|P244|1|datavalue|value}}

isSubclass / نوع فرعي من

إن كانت قيمة instance of (P31) أو subclass of (P279) للصفحة التي وضع فيها الكود أو للصفحة في الوسيط |id= مساوية للوسيط |parent= ينتج 'true' غير ذلك لا ينتج شيئاً. كامل الخيارات:{{#invoke:Wikidata2|isSubclass|parent=|maxDepth=1|property=|id=|exitItem=}}

  • مطلوب: |parent= مثلاً [خطأ: الوظيفة "wdurl" غير موجودة. (Q5)]
  • |maxDepth= عمق البحث في الصفحات.
  • |property= الخاصية المطلوبه (افتراضياً instance of (P31)، وsubclass of (P279))
  • |id= الصفحة المطلوب البحث فيها.
  • |exitItem=

مثال:

توصيف يظهر
{{#invoke:Wikidata2|isSubclass|parent=Q5|maxDepth=1|id=Q76}} 

{{#invoke:Wikidata2|isSubclass|parent=Q45|maxDepth=5|id=Q76}} 
خطأ لوا: عدد كبير جدا من ادعاءات "mw.wikibase.getReferencedEntityId"، فقط ما يصل إلى 3 مسموح به..

EntityIdForTitle

يعطي معرف ويكي بيانات من خلال عنوان المقالة: مثال:

  • {{#invoke:Wikidata2|EntityIdForTitle|اليمن}}
    • ينتج: Q89816
  • {{#invoke:Wikidata2|EntityIdForTitle|وحدة:Wikidata2}}
    • ينتج:

آخر التحديثات


-- 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 and 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' 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 and 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 and mw.wikibase.getEntityObject( id )
	else
		return mw.wikibase and 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
	local arlabel = ar --formatcharacters(ar, options) 
	if labeloption and labeloption ~= '' then
			jlabel = labeloption 
	elseif options.illwd2  and options.illwd2  ~= '' then
		if arlabel and arlabel ~= '' then
				jlabel = mw.getCurrentFrame():expandTemplate{ title = 'Ill-WD2', args = {arlabel, fromlua="t", id=entityId, y = (options.illwd2y or '') } }
				--jlabel = arlabel
			else 
				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 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
	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 
				return mw.text.tag('small', {}, (Prefix or ' (').. (qualpref or '') .. p .. (Suffix or ')'))  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 .. p.addTrackingCat(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 and mw.wikibase.label( entityId )
	if label == '' then
		label = mw.wikibase and mw.wikibase.label( entityId ) or nil
	end
    local link = mw.wikibase and 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 and mw.wikibase.getReferencedEntityId( id , property,  tab  ) -- { 'Q5', 'Q2095' } )
	if not result and property == "P31" then
		result = mw.wikibase and 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 and 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 and 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 and 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 and mw.wikibase.getEntityIdForTitle( title )
	--mw.log(str)
	return str
end

return p