Wikipedya htwiki https://ht.wikipedia.org/wiki/Paj_Prensipal MediaWiki 1.44.0-wmf.2 first-letter Medya Espesyal Diskite Itilizatè Diskisyon Itilizatè Wikipedya Diskisyon Wikipedya Fichye Diskisyon Fichye MedyaWiki Diskisyon MedyaWiki Modèl Diskisyon Modèl Èd Diskisyon Èd Kategori Diskisyon Kategori TimedText TimedText talk Module Discussion module Layòs 0 1606 855654 840751 2024-11-13T09:13:09Z Gerd Eichmann 20679 gallery added 855654 wikitext text/x-wiki {{Infobox Peyi |non_lokal=Sathalanalat Passathipatai Passasson lao |non_kreyòl=Laos |deviz_nasyonal= |deviz_nasyonal_kreyòl=Pè, Endependans, Demokrasi, Inite and Pwosperite |im_nasyonal= |lang= |jantile= |drapo_imaj=Flag of Laos.svg |anblèm_imaj= |fizo_orè= |kapital=[[Vansiàn]] |pi_gwo_vil=Vansiàn |monnen_non= |monnen_kòd= |monnen_divizyon= |PIB_dat= |PIB_total= |PIB_total_ran= |PIB_pa_abitan= |PIB_pa_abitan_ran= |gouvènman_dat= |gouvènman_tip= |chèf_tit= |chèf_non= |sipèfisi_dat= |sipèfisi_ran= |sipèfisi_total= |dlo_pousantaj= |frontyè_tè= |frontyè_kòt= |pli_ro_kote= |pli_ro= |pli_ba_kote= |pli_ba= |popilasyon_dat= |popilasyon_ran= |popilasyon_total= |popilasyon_dansite= |popilasyon_tip= |popilasyon_lavi_dat= |popilasyon_lavi= |popilasyon_ne_dat= |popilasyon_ne= |popilasyon_mòtalite_dat= |popilasyon_mòtalite= |popilasyon_mòtalite_timoun_dat= |popilasyon_mòtalite_timoun= |popilasyon_alfabèt_dat= |popilasyon_alfabèt= |popilasyon_an_vil_dat= |popilasyon_an_vil= |endepandans_dat= |endepandans_tip= |endepandans_de= |kòd= |ISO_kòd= |endikatif_entènet= |endikatif_telefonik= |endikatif_radyofonik= |EDI= |EDI_ran= |EDI_dat= |EPI= |EPI_ran= |EPI_dat= |kat_anplasman=LocationLaos.png |kat_politik= |kat_jewografik= |kat_satelit= |divizyon_tip= |divizyon_non= |vwazen= |òganizasyon= |nòt= }} [[Fichye:LaosCarte.gif|300px|right|thumb|Layòs]] '''Layòs''' se yon peyi ki sitiye nan [[Azi]] disidès. [[Kapital]] se [[Vyantyàn]]. <center><gallery caption="Layòs - Laos"> Vientiane-Wat Xieng Ngeun-14-gje.jpg|Vyantyàn Vientiane-Wat Hay Sok-14-Tischchen-gje.jpg|Vyantyàn Vientiane-Wat Si Muang-16-Marabu-gje.jpg|Vyantyàn Luang Prabang-Wat Visounarath-04-Boddhi-Baum-gje.jpg|Luang Prabang Luang Prabang-Wat That Luang-01d-Moenche-gje.jpg|Luang Prabang Luang Prabang-Phou Si-02-von Wat Visounarath-gje.jpg|Luang Prabang Muang Sing-Akha-Dorf A-18-Haeuser-gje.jpg|Muang Sing Houay Mo-Markt-22-Fischiges-gje.jpg|Houay Mo Laos-Reis-22-Pflanzer-gje.jpg </gallery></center> == Istwa == == Jewografi == == Referans == {{referans}} == Lyen deyò == {{Azi}} [[Kategori:Peyi]] [[Kategori:Laos|*]] [[Kategori:Azi disidès]] 3copywzxkqj8x74tws560xup2ef24gi Pat 0 14844 855651 679859 2024-11-13T03:09:45Z Kitanago 19629 Li kreye pa tradui paj « [[:fr:Special:Redirect/revision/219259271|Pâte]] » 855651 wikitext text/x-wiki [[Fichye:Kneading.jpg|vignette| Frazage, premye etap nan mase yon farin ki vin trè kolan <ref>{{Citation|Les mécanismes physico-chimiques explicatifs de l'apparition et de la disparition du caractère collant d'une pâte sont peu connus. On considère que ce phénomène est associé aux proportions respectives d'[[eau libre]] et d'[[eau liée]] dans la pâte et qu'un excès d'eau libre serait la cause première de ce caractère. Il faut s'assurer d'un bon ajustement entre la quantité d'eau ajoutée à la [[farine]] pour former la pâte et la capacité d'absorption des [[macromolécule]]s qui la constituent pour le prévenir.}}.</ref> .]] Anjeneral, yon '''pat''' se yon sibstans oswa melanj ki pwès; li se souvan yon etap nan fabrikasyon an nan yon pwodwi. == Definisyon == Nan sans orijinal li, " [[Pat (materyo)|pat]] » (soti nan laten ''pasta'', ki gen menm siyifikasyon an, prete nan ansyen grèk la πάστα (" gro lòj "), deziyen [[farin]] tranpe ak mase pou fè [[pen]], pa ekstansyon yon lòt bagay ki sanble bon manje <ref name="DAF1762">''Dictionnaire de l'Académie française'', {{4e}} édition, 1762. </ref> . == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|wiktionary=pâte}} [[Kategori:Pages avec des traductions non relues]] b4by8w4tnxu2durcjjk7wml8kwweyiy 855652 855651 2024-11-13T03:10:40Z Kitanago 19629 Li kreye pa tradui paj « [[:fr:Special:Redirect/revision/219259271|Pâte]] » 855652 wikitext text/x-wiki [[Fichye:Kneading.jpg|vignette| Frazage, premye etap nan mase yon farin ki vin trè kolan <ref>{{Citation|Les mécanismes physico-chimiques explicatifs de l'apparition et de la disparition du caractère collant d'une pâte sont peu connus. On considère que ce phénomène est associé aux proportions respectives d'[[eau libre]] et d'[[eau liée]] dans la pâte et qu'un excès d'eau libre serait la cause première de ce caractère. Il faut s'assurer d'un bon ajustement entre la quantité d'eau ajoutée à la [[farine]] pour former la pâte et la capacité d'absorption des [[macromolécule]]s qui la constituent pour le prévenir.}}.</ref> .]] Anjeneral, yon '''pat''' se yon sibstans oswa melanj ki pwès; li se souvan yon etap nan fabrikasyon an nan yon pwodwi. == Definisyon == Nan sans orijinal li, " [[Pat (materyo)|pat]] » (soti nan laten ''pasta'', ki gen menm siyifikasyon an, prete nan ansyen grèk la πάστα (" gro lòj "), deziyen [[farin]] tranpe ak mase pou fè [[pen]], pa ekstansyon yon lòt bagay ki sanble bon manje <ref name="DAF1762">''Dictionnaire de l'Académie française'', {{4e}} édition, 1762. </ref>. == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|wiktionary=pâte}} [[Kategori:Pat]] [[Kategori:Pages avec des traductions non relues]] ob7ujvfrxv3xbiclco6iwdo7vyx34ue 855653 855652 2024-11-13T03:10:57Z Kitanago 19629 855653 wikitext text/x-wiki [[Fichye:Kneading.jpg|vignette| Frazage, premye etap nan mase yon farin ki vin trè kolan <ref>{{Citation|Les mécanismes physico-chimiques explicatifs de l'apparition et de la disparition du caractère collant d'une pâte sont peu connus. On considère que ce phénomène est associé aux proportions respectives d'[[eau libre]] et d'[[eau liée]] dans la pâte et qu'un excès d'eau libre serait la cause première de ce caractère. Il faut s'assurer d'un bon ajustement entre la quantité d'eau ajoutée à la [[farine]] pour former la pâte et la capacité d'absorption des [[macromolécule]]s qui la constituent pour le prévenir.}}.</ref> .]] Anjeneral, yon '''pat''' se yon sibstans oswa melanj ki pwès; li se souvan yon etap nan fabrikasyon an nan yon pwodwi. == Definisyon == Nan sans orijinal li, " [[Pat (materyo)|pat]] » (soti nan laten ''pasta'', ki gen menm siyifikasyon an, prete nan ansyen grèk la πάστα (" gro lòj "), deziyen [[farin]] tranpe ak mase pou fè [[pen]], pa ekstansyon yon lòt bagay ki sanble bon manje <ref name="DAF1762">''Dictionnaire de l'Académie française'', {{4e}} édition, 1762. </ref>. == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|wiktionary=pâte}} [[Kategori:Pat]] rz2z1d61pn09hd9bprkcq0qotm3vzzb Jocelyne Béroard 0 16904 855570 817130 2024-11-12T13:39:07Z InternetArchiveBot 25431 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 855570 wikitext text/x-wiki {{mizisyen |non= Jocelyne Béroard |foto= Jb olympia (cropped).jpg |fonksyon=Chantèz, aktris |domèn=Mizik, sinema, televizyon |diplòm= |etid= |dat nesans= [[12 septanm]] [[1954]] |lye nesans= [[Fod Fwans]], [[Matinik]] |peyi nesans= [[Frans]] |dat lanmò= |lye lanmò= |peyi lanmò= |nasyonalite= franse |zèv= |nòt= |gwoup= [[Kassav]] |mizik= [[Zouk]] |enstriman=[[vwa]] }} '''Jocelyne Béroard''', ki fèt [[12 septanm]] [[1954]] nan [[Fod Fwans]] nan [[Matinik]] ) se yon chantèz [[Matinik|matinikèz]]. Li se yon atis, chantèz kreyòl. Li chante mizik zouk, sèl oubyen avèk gwoup [[Kassav]]. == Biyografi == Sou 22 me [[2011]], li chante avèk siksè nan Olympia nan solo kèk jou aprè piblikasyon doub albòm li ''Yen Ki Lanmou''. An [[2014]], li chante ''On n'oublie pas'' (ekri pa [[Serge Bilé]]) avèk plizyè atis ak pèsonalite pami [[Alpha Blondy]], [[Tanya Saint-Val]], [[Harry Roselmack]], [[Admiral T]], [[Jean-Marie Ragald]] ak [[Chris Combette]]. Chante sa a se yon omaj pou 152 viktim martinikèz nan [[Vol 708 West Caribbean|krach 16 out 2005]], pou yo pa bliye evènman sa a ak ede AVCA (Association des Victimes de la Catastrophe Aérienne) pou kolekte lajan<ref>{{cite web|author1=|title=Crash du 16 août : « On n'oublie pas »|url=http://www.martinique.franceantilles.fr/actualite/societe/crash-du-16-aout-on-n-oublie-pas-266424.php/|date=7 out 2014|publisher=martinique France-Antilles|access-date=2019-05-19|archive-date=2018-01-16|archive-url=https://web.archive.org/web/20180116135057/http://www.martinique.franceantilles.fr/actualite/societe/crash-du-16-aout-on-n-oublie-pas-266424.php|dead-url=yes}}</ref> == Zèv li yo == === Diskografi === ==== Albòm estidyo ==== * 1986 : ''Siwo'' (disk dò) (GD Productions) * 1991 : ''Milans'' (Columbia Records) * 2003 : ''Madousinay'' (Créon Music) ==== Konpilasyon ==== * 2011 : ''Yen ki lanmou'' (Warner Music) ==== Videyoklip ak kolaborasyon ==== * [[1986]] : ''Siwo'' * [[1986]] : ''Mi tchè mwen'' * [[1986]] : ''Kay manman'' * [[1987]] : ''Kolé séré'' (avèk [[Philippe Lavil]]) * [[1991]] : ''Milans'' * [[1991]] : ''Ti tak isi'' * [[1997]] : ''Lonbraj an pyé mango'' (avèk [[Chris Combette]]) * [[1998]] : ''Coupé bibamba'' (avèk [[Awilo Longomba]]) * [[2003]] : ''Wè yo'' * [[2004]] : ''Difé karribean (avèk [[Dj Jackson]]) * [[2007]] : ''Ba mwen en tibo'' (avèk [[Victor Treffre]] ak [[Kali (chantè)|Kali]]) * [[2010]] : ''Avan i two ta'' (avèk [[Jocelyne Labylle]]) * [[2010]] : ''Ecolo'' (avèk [[Jacky Alpha]] ak [[Paille (chantè)|Paille]]) * [[2011]] : ''An limiè'' (avèk [[Sista Tchad]]) * [[2012]] : ''Ych mwen kouté'' (avèk [[Sam Alpha]]) * [[2012]] : ''Pou i pé sa tjenbé'' (avèk [[Gilles Voyer]]) * [[2014]] : ''Mizik an nou'' (avèk [[G'Ny]]) * [[2015]] : ''Lapli pé tonbé'' * [[2016]] : ''On tient bon'' (avèk [[ Nayah]], [[Luchko]] ak [[Papa Tank]]) === Sinema === ==== Fim ==== * 1992 : ''[[Siméon (fim)|Siméon]]'' ([[Euzhan Palcy]]) : Roselyne * 2005 : ''[[Nèg Maron]]'' ([[Jean-Claude Barny]]) : Manman Josua * 2016 : ''[[Le Gang des Antillais]]'' ([[Jean-Claude Barny]]) : Komè ==== Kout fim ==== * [[2017]] : ''Passagers'' de Nènèb ak Christophe Agelan : Nadine === Televizyon === * 2015 : ''[[Rose et le soldat]]'' : Clémence * [[2017]] : ''[[Le rêve français]]'' de [[Christian Faure (reyalizatè)|Christian Faure]] : Betty == Referans == {{referans}} == Lyen deyò == * [https://www.imdb.com/name/nm0077227/ Jocelyne Béroard] sou IMDb * [http://www.jocelyneberoard.com/ Sitwèb ofisyèl Jocelyne Béroard] * [https://web.archive.org/web/20190530224542/http://www.kassav30ans.com/ Sitwèb ofisyèl Kassav] {{DEFAULTSORT:Berouard, Jocelyne}} [[Kategori:Moun]] [[Kategori:Fanm]] [[Kategori:Mizik]] [[kategori:franse]] [[Kategori:Chantè]] [[Kategori:Chantè franse]] [[Kategori:Chantè matinikè]] [[Kategori:Aktè]] [[Kategori:Aktè sinema]] [[Kategori:Aktè televizyon]] [[Kategori:Aktè franse]] [[Kategori:Aktè matinikè]] [[Kategori:Nesans nan lane 1954]] 89oeca3s7d8u9r9whvkgo6arq7zxrhg Lakewood, Kolorado 0 24737 855616 766981 2024-11-12T20:52:53Z Nathavaskie 31718 /* Kèk lyen */ ajoute lyen 855616 wikitext text/x-wiki {{ebòch}} {{kolektivite tèritoryal |non_lokal=Lakewood |koodone_lat= |koodone_lon= |drapo_imaj= |anblèm_imaj= |tip=vil |dat= |zòn_tip=Eta |zòn=[[Kolorado]] |kapital_tip= |kapital_non=[[Washington]] |chèf_tit= |chèf_non=? |sipèfisi_dat= |sipèfisi_ran= |sipèfisi_total= |dlo_pousantaj= |frontyè_tè= |frontyè_kòt= |rote_mwayen= |pli_ro_kote= |pli_ro= |pli_ba_kote= |pli_ba= |popilasyon_dat= |popilasyon_ran=1 |popilasyon_total= |popilasyon_dansite= |popilasyon_tip= |aktivite= |kat_anplasman= |kat_politik= |kat_jewografik= |kat_satelit= |divizyon_tip= |divizyon_non= |vwazen= |sitwèb= |kòd_tip=jewografik |kòd= |nòt= }} '''{{PAGENAME}}''' se yon vil [[Etazini]]. Li sitye nan leta [[Kolorado]]. Chèf-lye li se ? . == Istwa == Istwa == referans == == Kèk lyen == [[Kategori:vil nan Kolorado]] [[Kategori:Vil nan Etazini]] [[Kategori:jewografi]] https://www-colorado-com.translate.goog/cities-and-towns/lakewood?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=fr&_x_tr_pto=sc&_x_tr_hist=true<br /><br /> nlt6dzemh4pqmx47baaikfr0amdf8nq 855617 855616 2024-11-12T20:53:33Z A09 30748 Reverted edits by [[Special:Contribs/Nathavaskie|Nathavaskie]] ([[User talk:Nathavaskie|talk]]) to last version by Escarbot: unnecessary links or spam 766981 wikitext text/x-wiki {{ebòch}} {{kolektivite tèritoryal |non_lokal=Lakewood |koodone_lat= |koodone_lon= |drapo_imaj= |anblèm_imaj= |tip=vil |dat= |zòn_tip=Eta |zòn=[[Kolorado]] |kapital_tip= |kapital_non=[[Washington]] |chèf_tit= |chèf_non=? |sipèfisi_dat= |sipèfisi_ran= |sipèfisi_total= |dlo_pousantaj= |frontyè_tè= |frontyè_kòt= |rote_mwayen= |pli_ro_kote= |pli_ro= |pli_ba_kote= |pli_ba= |popilasyon_dat= |popilasyon_ran=1 |popilasyon_total= |popilasyon_dansite= |popilasyon_tip= |aktivite= |kat_anplasman= |kat_politik= |kat_jewografik= |kat_satelit= |divizyon_tip= |divizyon_non= |vwazen= |sitwèb= |kòd_tip=jewografik |kòd= |nòt= }} '''{{PAGENAME}}''' se yon vil [[Etazini]]. Li sitye nan leta [[Kolorado]]. Chèf-lye li se ? . == Istwa == Istwa == referans == == Kèk lyen == [[Kategori:vil nan Kolorado]] [[Kategori:Vil nan Etazini]] [[Kategori:jewografi]] <br /><br /> 9pt6oua5ayj0lyhqxip3g7ch4miszx1 Moorestown, New Jersey 0 35777 855610 855326 2024-11-12T17:42:35Z InternetArchiveBot 25431 Rescuing 2 sources and tagging 0 as dead.) #IABot (v2.0.9.5 855610 wikitext text/x-wiki {{ebòch}} {{kolektivite tèritoryal |non_lokal= Moorestown |koodone_lat= |koodone_lon= |drapo_imaj= |anblèm_imaj= |tip=vil |dat= |zòn_tip=Eta |zòn= [[New Jersey]] |kapital_tip= |kapital_non=Trenton |chèf_tit= |chèf_non= |sipèfisi_dat= |sipèfisi_ran= |sipèfisi_total= |dlo_pousantaj= |frontyè_tè= |frontyè_kòt= |rote_mwayen= |pli_ro_kote= |pli_ro= |pli_ba_kote= |pli_ba= |popilasyon_dat= |popilasyon_ran= |popilasyon_total= |popilasyon_dansite= |popilasyon_tip= |aktivite= |kat_anplasman= |kat_politik= |kat_jewografik= |kat_satelit= |divizyon_tip= |divizyon_non= |vwazen= |sitwèb= |kòd_tip=jewografik |kòd= |nòt= }} Moorestown se yon vil nan eta [[New Jersey]] . Li nan konte Burlington Li te genyen nan lane 2000 19017 moun. == Istwa == Istwa == Relasyon ak Ayiti == *Kominote Ayisyen, relasyon ant eta sa epi Ayiti == Jewografi == Very humid in the summer, but cold in the winter. == Ekonomi == == Devlòpman == == Politik == == Edikasyon == == Anviwònman == == Pèsonalite == Pèsonalite ki te fèt nan, moun ki abite nan, oswa otreman asosye ak Moorestown Township gen ladan yo: [[Fichye:MSG O'Connor.jpg|thumb|right|upright|[[Brendan O'Connor (United States Army)|Brendan O'Connor]]]] * [[Diane Allen]] (ki fèt an 1948), politisyen<ref>{{cite web |url=http://www.senatenj.com/allen/biography.php |title=Biyografi Senatris Diane Allen - Diane graduated from Moorestown High School as valedictorian |website=senatenj.com |date=2015-05-16 |access-date=15 fevriye 2015 |archive-date=2018-09-25 |archive-url=https://web.archive.org/web/20180925122703/https://www.senatenj.com/allen/biography.php |dead-url=yes }}</ref> * [[Samuel Leeds Allen]] (1841–1918), envantè ak fabrikan ekipman fèm ak avyon.<ref>[https://web.archive.org/web/20110716072006/http://www.njinvent.org/2004/allen.html New Jersey Inventors Hall of Fame] "Samuel Leeds Allen has been awarded almost 300 patents for farming machinery,..." "Because the production of farm equipment was seasonal, many of Allen's employees were laid off during the winter." "Allen invented the Flexible Flyer,..." Accessed July 25, 2008.</ref> * [[Emily Bacon]] (1891-1972), fizisyen ki te premye espesyalis pedyatrik nan Filadèlfi.<ref>[https://www.nlm.nih.gov/changingthefaceofmedicine/physicians/biography_18.html Dr. Emily Partridge Bacon], [[National Institutes of Health]], Changing the face of Medicine. Accessed September 8, 2015. "Born in Moorestown, New Jersey in 1891, Emily Bacon entered Wilson College in Chambersburg, Pennsylvania, in 1908."</ref> * [[Sam Bishop]] (ki fèt an 1983), foutbalè pwofesyonèl.<ref>Bullock, Michael. [http://blog.pennlive.com/patriotnewssports/2010/04/ceperos_return_solidifies_city.html "Cepero's return solidifies City Islanders goalkeeping situation"], ''[[The Patriot-News]]'', April 3, 2010. Accessed March 2, 2011. "Sam Bishop, the 27-year-old keeper who has logged three seasons (2005-07) with the City Islanders, spent the opening week of the expansion Philadelphia Union's first training camp working out with the first-year MLS club. Needless to say, it was a memorable experience for the Moorestown, N.J., native."</ref> * [[David Bispham]] (1857–1921), chantè opera.<ref>[http://www.westjerseyhistory.org/books/decou1/mtn10.html West Jersey History]. Accessed January 9, 2011. "David Bispham, the great singer, whose boyhood days were spent in Moorestown, attended this school and some of our older residents who were students at that time tell interesting anecdotes about this celebrated man."</ref> * [[Francis L. Bodine]] (ki fèt an 1936), politisyen<ref name=Bodine/><ref>[http://votesmart.org/bio.php?can_id=4420 Assembly Member Francis L. Bodine], [[Project Vote Smart]]. Accessed August 8, 2007.</ref> * [[Hugh Borton]] (1903–1995), ekspè nan etid japonèz, prezidan [[Haverford College]] pandan 10 zan.<ref>Pace, Eric. [https://www.nytimes.com/1995/08/09/obituaries/hugh-borton-92-expert-on-japan-and-ex-college-president-dies.html "Hugh Borton, 92, Expert on Japan and Ex-College President, Dies"], ''[[The New York Times]]'', August 9, 1995. Accessed February 11, 2012. "Dr. Borton was born in Moorestown, N.J., graduated from Haverford in 1926 and received an M.A. in history from Columbia in 1932. He was awarded several honorary degrees and was decorated by the postwar Japanese Government."</ref> * [[T. J. Brennan]] (ki fèt an 1989), defansè [[Toronto Maple Leafs]] of the NHL.<ref>Donnellon, Sam. [http://www.accessmylibrary.com/coms2/summary_0286-31347148_ITM "Sam Donnellon / Moorestown's."], ''[[Philadelphia Daily News]]'', June 22, 2007. Accessed March 1, 2011. "His future lay 1,805 miles away, on the easternmost point of an island nearer the Arctic Circle than his Moorestown home. This is where the National Hockey League would discover T.J. Brennan."</ref><ref>Miller, Randy. [http://www.courierpostonline.com/article/20111125/SPORTS/311250029/Moorestown-native-scores-NHL-debut-Buffalo-Sabres "Moorestown native scores in debut for Buffalo Sabres"], ''[[Courier-Post]]'', November 25, 2011. Accessed December 3, 2011. "Moorestown native T.J. Brennan showed what he can bring in his NHL debut for the Buffalo Sabres."</ref><ref>[http://mapleleafs.nhl.com/club/player.htm?id=8474113 T J Brennan], [[Toronto Maple Leafs]]. Accessed October 9, 2013.</ref> * [[Dave Brock (foutbòl ameriken)|Dave Brock]] (ki fèt an 1967) .<ref>Luicci, Tom. [http://www.nj.com/rutgersfootball/index.ssf/2012/02/rutgers_to_name_boston_college.html "Rutgers to name Boston College assistant Dave Brock as new offensive coordinator"], ''[[The Star-Ledger]]'', February 7, 2012. Accessed September 8, 2015. "Dave Brock, a Moorestown native who was the interim offensive coordinator at Boston College last fall and has held that position at Kansas State, Temple and Hofstra, will be named the Scarlet Knights' offensive coordinator, replacing Frank Cignetti, possibly by the end of the week, according to a person familiar with the situation."</ref> * [[Lem Burnham]] (ki fèt an 1947), ansyen jwè [[National Football League]].<ref>Elane, Patricia. [https://web.archive.org/web/20140728221042/http://voices.yahoo.com/sports-rookie-athletes-too-much-too-soon-60257.html "Sports' Rookie Athletes - Too Much, Too Soon? Sports Agent and Former NFL Player Sees an 'Achilles Heel' in Toay's Recruiting Practices"], Yahoo! Voices, August 9, 2006. Accessed June 3, 2013. "Dr. Lem Burnham, a resident of Moorestown, New Jersey, has seen more than his fair share of action both on and off the field in the NFL."</ref> * [[Kevin Chamberlin]] (ki fèt an 1963), aktè.<ref>Gardner, Amanda. [https://www.nytimes.com/2001/06/03/nyregion/theater-tony-awards-new-jersey-ties.html "Theater; Tony Awards' New Jersey Ties"], ''[[The New York Times]]'', June 3, 2001. Accessed July 23, 2008. "Kevin Chamberlin (best performance by a leading actor in a musical, Seussical) also traces his childhood and early career to New Jersey. Mr. Chamberlin moved to Moorestown (exit 4) when he was 7 years old and worked summers as a singing waiter at the Show Place in Beach Haven on Long Beach Island."</ref> * [[Bobby Clarke]] (ki fèt an 1949), ansyen jwè okè nan National Hockey League avèk Philadelphia Flyers.<ref>[https://web.archive.org/web/20200811014922/http://www.citypaper.net/articles/2003-10-02/cover.shtml The Ice Man] Accessed July 26, 2008: "On Comcast's website, he's 'the ultimate Flyer' who's married to wife Sandy, has four children (sons Wade and Lucas and daughters Jody and Jakki) and resides in Moorestown, N.J."</ref> * [[Gary Close]], asistan pou baskètbal [[Wisconsin Badgers men's basketball]] team.<ref>[https://web.archive.org/web/20150920114732/http://www.uwbadgers.com/sports/m-baskbl/mtt/close_gary00.html Gary Close] {{webarchive|url=https://web.archive.org/web/20101020134033/http://www.uwbadgers.com/sports/m-baskbl/mtt/close_gary00.html |date=2010-10-20 }}, [[Wisconsin Badgers men's basketball]]. Accessed January 9, 2011.</ref> * [[Josh Cody]] (1892–1961), manm [[College Football Hall of Fame]].<ref>Traughber, Bill. [https://web.archive.org/web/20110708212327/http://vucommodores.cstv.com/sports/m-footbl/spec-rel/093009aab.html "Josh Cody, a College Football Hall of Famer"], [[Vanderbilt Commodores football]], September 30, 2009. Accessed March 1, 2011. "In 1959, Cody retired to his 190-acre farm across the Delaware River in Moorestown, N.J. He died on his farm in 1961 at age 69."</ref> * [[John S. Collins]] (1837–1928), devlopè [[Miami Beach]], [[Florid]].<ref>[http://www.miamibeach411.com/History/bio_collins.htm John Collins Biography], Miami Beach History. Accessed March 13, 2008. "Born on December 29, 1837, in Moorestown, New Jersey, John Stiles Collins was the sixth generation of Collinses to farm the family's western New Jersey homestead since 1678."</ref> * [[Herb Conaway]] (ki fèt an 1963), politisyen ki sèvi nan [[New Jersey General Assembly]] depi 1998, kote li reprezante [[7th Legislative District (New Jersey)|7th Legislative District]].<ref>Staff. [http://www.burlingtoncountytimes.com/article/20151023/OPINION/310239712 "Conaway and Singleton get our nod for 7th District"], ''[[Burlington County Times]]'', October 23, 2015. Accessed November 29, 2017. "Vying for two Assembly seats in the 7th Legislative District in New Jersey are Democratic incumbents Herb Conaway of Moorestown and Troy Singleton of Palmyra and Republican challengers William Conley and Robert Prisco."</ref> * [[Phil Costa (American football)|Phil Costa]] (born 1987), former football player with the [[Dallas Cowboys]].<ref>[https://web.archive.org/web/20110717154050/http://www.umterps.com/sports/m-footbl/mtt/costa_phil00.html Phil Costa] {{webarchive|url=https://web.archive.org/web/20110717154050/http://www.umterps.com/sports/m-footbl/mtt/costa_phil00.html |date=2011-07-17 }}, [[Maryland Terrapins football]]. Accessed March 2, 2011.</ref><ref>Staff. [https://web.archive.org/web/20160304093207/http://www.baltimoresun.com/sports/bal-costa0723-photo.html "Phil Costa"], ''[[The Baltimore Sun]]''. Accessed September 8, 2015. "Phil Costa; Junior offensive lineman Phil Costa is expected to start at right guard for the Terps in 2008. Costa, a junior from Moorestown, N.J., appeared in all 13 games as a junior."</ref> * [[Colin Farrell (rower)|Colin Farrell]], head coach of the [[University of Pennsylvania]] lightweight rowing team.<ref>[http://www.pennathletics.com/news/2016/6/27/5771aaf2e4b0028e7235e1e9_131492719921710273.aspx?path=mltrow "Colin Farrell Named Lightweight Rowing Head Coach"], PennAthletics.com, June 30, 2014. Accessed November 29, 2017. "Colin Farrell, who has served as an assistant coachfor the past two seasons and interim head coach since the conclusion of the 2014 EARC Sprints, will officially be promoted to head coach of the University of Pennsylvania men's lightweight rowing program effective July 1.... Farrell and his wife, Ellie, reside in Moorestown, N.J., with their son, Kellan."</ref> * [[Dereck Faulkner]] (born 1985), [[wide receiver]] who played in the NFL for the [[Philadelphia Eagles]].<ref>Hunt, Donald. [http://www.espn.com/college-football/news/story?id=2604575 "Hampton finds another star in QB Shepherd"], ''[[ESPN]]'', September 27, 2006. Accessed November 29, 2017. "Dereck Faulkner, Hampton's senior slot receiver, played with Iowa's star running back Albert Young at Moorestown High School in Moorestown, N.J. Faulkner and Young talk to each other at least twice a week."</ref> * [[Edwin B. Forsythe]] (1916–1984), member of the United States House of Representatives from New Jersey who served as mayor of Moorestown from 1957-62.<ref name=Forsythe/><ref>Waggoner, Walter H. [https://www.nytimes.com/1984/03/30/obituaries/edwin-forsythe-congressman-dies.html "Edwin Forsythe, congressman, dies"], ''[[The New York Times]]'', March 30, 1984. Accessed March 2, 2011. "Representative Edwin B. Forsythe, a New Jersey Republican who served in the House of Representatives for 14 years, died of lung cancer yesterday at his home in Moorestown, N.J. He was 68 years old."</ref> * [[Walter French (baseball)|Walter French]] (1899–1984), football All-American and professional baseball player for the Philadelphia Athletics, 1923-1929.<ref>[https://web.archive.org/web/20150909071042/http://www.moorestown.com/history/ Historical Society of Moorestown], Moorestown.com. Accessed September 8, 2015. "Congratulations to our president, Lenny Wagner. His article on Moorestown's Walter French, a former major league baseball player for the Philadelphia A's, was accepted for publication by The Society for American Baseball Research (SABR)."</ref><ref>Wagner, Lenny. [https://web.archive.org/web/20181118193922/https://sabr.org/bioproj/person/81b87e6a "Walt French"], [[Society for American Baseball Research]]. Accessed September 8, 2015. "Walter E. French was born in Moorestown, New Jersey, on July 10, 1899.... He entered Moorestown High School in 1914 and starred in football, baseball, basketball, and track."</ref> * [[Joseph H. Gaskill]] (1851-1935), judge on the [[New Jersey Court of Common Pleas]] and Justice of the [[New Jersey Supreme Court]] from 1893 to 1896.<ref>Staff. [https://www.nytimes.com/1935/11/26/archives/exjudge-gaskill-i-ds-suddeiily-84-servedon-burlington-county-n-j.html "Ex-Judge Gaskill Dies Suddenly, 84; Served-on Burlington County, N. J., Common Pleas Bench Many years Ago"], ''[[The New York Times]]'', November 26, 1935. Accessed August 28, 2018. "Judge Gaskill, a native of Mount Holly, was admitted to the bar as an attorney in 1873 and became a counselor in 1877.... After his retirement from the bench, Judge Gaskill opened law offices in Camden. In 1910 he moved from Mount Holly to Moorestown."</ref> * [[John F. Gerry]] (1926–1995), former chief [[United States federal judge|United States district judge]] on the [[United States District Court for the District of New Jersey]].<ref>Holloway, Lynette. [https://www.nytimes.com/1995/03/12/obituaries/john-f-gerry-69-chief-judge-of-federal-court-in-new-jersey.html "John F. Gerry, 69, Chief Judge Of Federal Court in New Jersey"], ''[[The New York Times]]'', March 12, 1995. Accessed June 3, 2013. "John Francis Gerry, the chief United States district judge in New Jersey for seven years and a former top official of the policy-making arm of the Federal bench, died on Friday at his home in Moorestown, N.J. He was 69."</ref> * [[Chris Gheysens]] (born c. 1972), president and chief executive officer of [[Wawa Inc.]]<ref name=SJT2014>Laday, Jason. [http://www.nj.com/gloucester-county/index.ssf/2014/04/wawa_ceo_chris_gheysens_remembers_vineland_as_company_celebrates_50-year_milestone.html "As Wawa celebrates 50th anniversary, CEO remembers Vineland store"], ''[[South Jersey Times]]'', April 15, 2014. Accessed October 8, 2015. "'My dad would have a bunch of change from the car wash, and he was like the banker for everyone over there at the Wawa,' said Gheysens, a graduate of both St. Mary's in East Vineland and St. Augustine College Preparatory School. 'South Jersey is a big part of Wawa, and it is definitely part of me — I grew up in Vineland, and my parents had a summer house in Sea Isle. I moved to Washington Township — or 'Township' as they call it — after marrying my wife, and we raised our four children there.' Gheysens, who currently resides in Burlington County, will be spending Wednesday morning at Wawa's very first store, which opened in 1964 in Folsom, Pa., for a ceremony at 6 a.m."</ref><ref>Monostra, Mike. [http://patch.com/new-jersey/moorestown/wawa-planned-to-open-near-moorestown-mall "Wawa Planned to Open Near Moorestown Mall; The convenience store will be located at the former location of Classic Chevrolet."], Moorestown Patch. Accessed October 8, 2015. "Wawa CEO Chris Gheysens is a resident of Moorestown."</ref> * [[Bill Guerin]] (born 1970), right winger who earned the [[Stanley Cup]] with both the [[New Jersey Devils]] and [[Pittsburgh Penguins]].<ref>Staff. [http://nl.newsbank.com/nl-search/we/Archives?p_product=DN&s_site=philly&p_multi=PI|DN&p_theme=realcities&p_action=search&p_maxdocs=200&p_topdoc=1&p_text_direct-0=0F0211A2D9FD5BF4&p_field_direct-0=document_id&p_perpage=10&p_sort=YMD_date:D&s_trackval=GooglePM "Guerin to Flyers? Speculation Bruin"], ''[[Philadelphia Daily News]]'', November 30, 2001. Accessed March 1, 2011. "Guerin spends his offseasons in Moorestown with his wife, Kara, and their three kids."</ref> * [[Edward Harris (ornithologist)|Edward Harris]] (1799–1863), introduced the [[Percheron]] horse to America; benefactor of [[John James Audubon]]; lived at Smith-Cadbury Mansion.<ref>[http://moorestownhistory.org/about/smith-cadbury/ Smith-Cadbury Mansion]</ref> * [[Vernon Hill]] (born 1946), founder and former chairman, president, and chief executive officer of [[Commerce Bancorp]] and Commerce Bank of Cherry Hill Township, New Jersey.<ref>Staff. [http://nl.newsbank.com/nl-search/we/Archives?p_product=PI&s_site=philly&p_multi=PI&p_theme=realcities&p_action=search&p_maxdocs=200&p_topdoc=1&p_text_direct-0=0F8051776326BDE7&p_field_direct-0=document_id&p_perpage=10&p_sort=YMD_date:D&s_trackval=GooglePM "Moorestown tells Hill that gate must go, Elaborate entrance at banker's estate violates zoning, officials say."], ''[[The Philadelphia Inquirer]]'', December 18, 2002. Accessed March 1, 2011. "The drive-through lane at Commerce Bancorp chairman Vernon Hill's home will move a little faster starting today. Moorestown's zoning officer ordered Hill to remove the elaborate entrance gate at his 44.2-acre estate because it violates last month's zoning board decision that disallowed a tall fence that would have separated a portion of Hill's land from neighboring property."</ref> * [[Leon A. Huff]] (born 1942), co-founder and vice-chairman of Gamble-Huff Music, a songwriting and record production team who have written and produced 15 gold singles and 22 gold albums.<ref>Friedman, Sally. [https://web.archive.org/web/20160509184851/http://articles.philly.com/2010-03-19/living/25214561_1_huffs-music-producer-love-privacy "One neat arrangement Music producer Leon Huff's Moorestown home is a serene, orderly getaway. The Sound of Philadelphia? 'I'm a guy who really needs quiet.'"], ''[[The Philadelphia Inquirer]]'', March 19, 2010. Accessed April 27, 2016. "Leon Huff admits it - he's a neat freak, and it shows in his elegant Moorestown home, a place so immaculate it's hard to imagine anyone even lives in it."</ref> * [[Alfred Hunt (steel magnate)|Alfred Hunt]] (1817–1888), first president of Bethlehem Iron Company, precursor of Bethlehem Steel Corporation.<ref>[http://www.pa-roots.org/data/read.php?360,473948 Alfred Hunt's obituary] "The announcement of the death of Alfred Hunt, president of the Bethlehem Iron Company, will be a shock to his numerous friends throughout the Lehigh Valley and the State. The sad event occurred last evening at the home of his brother, Mordecai Hunt, in Moorestown, N.&nbsp;J."</ref><ref>[http://www.pa-roots.org/data/read.php?351,454514,454514 Hunt family history]</ref> * [[Esther Hunt]] (1751–1820), a pioneer who lived on America's frontier as a wife, a mother and a leader in her Quaker faith.<ref>Specht, Neva Jean (1997), ''Mixed blessing: trans-Appalachian settlement and the Society of Friends, 1780-1813'', Ph. D. dissertation, University of Delaware</ref><ref>Specht, Neva Jean (2003), "Women of one or many bonnets?: Quaker women and the role of religion in trans-Appalachian settlement", ''NWSA Journal'' '''15 (2)''': 27-44</ref> * [[John Hunt (Quaker minister)|John Hunt]] (1740-1824), [[Recorded Minister|Quaker minister]] and journalist.<ref>[http://www.swarthmore.edu/library/friends/ead/5240johu.xml An Inventory of the John Hunt Papers, 1770-1828], [[Swarthmore College]]. Accessed November 20, 2017.</ref> * [[Eldridge R. Johnson]] (1867–1945), founder of [[Victor Talking Machine Company]].<ref>Staff. [https://www.nytimes.com/1928/10/15/archives/er-johnson-buyer-of-original-alice-pays-150000-for-manuscript-and.html "E.R. Johnson buyer of original 'Alice'; Pays $150,000 for Manuscript and Two Copies of Carroll's Famous Story. Will sent it on tour Former Head of Victor Talking Machine Company Will Never Sell It, He Says."], ''[[The New York Times]]'', October 15, 1928. Accessed August 28, 2018. "Eldridge R. Johnson, founder and former President of the Victor Talking Machine Company and a resident of Moorestown, N.J., is the purchaser from Dr. A.S.W. Rosenbach of Philadelphia of the original manuscript of Lewis Carroll's ''Alice in Wonderland,'' for which Dr. Rosenbach paid $75,259 at an auction at Sotheby's in London in April."</ref> * [[Jevon Kearse]] (born 1976), former NFL defensive end who played for the [[Philadelphia Eagles]] and [[Tennessee Titans]].<ref>Klein, Michael. [https://web.archive.org/web/20171201033202/http://www.philly.com/philly/columnists/michael_klein/20080608_Inqlings__Throwback_plan_for_Striped_Bass.html "Inqlings: Throwback plan for Striped Bass"], ''[[The Philadelphia Inquirer]]'', June 8, 2008. Accessed November 29, 2017. "Former Eagle Jevon Kearse has cut the asking price of his Moorestown five-bedroom from $3.1 million to $2,699,993."</ref> * [[Tim Kerr]] (born 1960), former NHL right wing who played for the [[Philadelphia Flyers]], [[New York Rangers]] and [[Hartford Whalers]].<ref>Lulgjuraj, Susan. [http://www.pressofatlanticcity.com/news/top_three/article_f53db206-66e5-11df-ae77-001cc4c03286.html "Many Philadelphia Flyers past and present call Cape May County home"], ''[[The Press of Atlantic City]]'', May 24, 2010. Accessed March 1, 2011. "Tim Kerr has a huge presence in the Avalon and Stone Harbor area. The three-time All-Star played in Philadelphia for 11 seasons from 1980 to 1991 and holds Philadelphia's team record for the most 50-goal seasons with four. He owns Tim Kerr's Powerplay Realty on Dune Drive, which sells and rents homes in the Avalon and Stone Harbor area. For several years, Kerr also has run a charity run that bears his name. Kerr splits time between his homes in Avalon and Moorestown, Burlington County, said Tim Kerr Realty sales associate Ann Delaney."</ref> * [[Matt Langel]] (born 1977), [[head coach]] for the [[Colgate Raiders men's basketball]] team.<ref>Ronaldson, Tim. [https://moorestownsun.com/from-the-courts-to-coach-482a89b51a54 "From the courts to coach"], ''The Moorestown Sun'', April 26, 2011. Accessed November 29, 2017. "Moorestown-native Matt Langel has etched his name into history books as a basketball player, now he'll do it as a coach."</ref> * [[Jonathan V. Last]] (born 1974), columnist for ''[[The Weekly Standard]]''.<ref>Staff. [http://nl.newsbank.com/nl-search/we/Archives?p_product=PI&s_site=philly&p_multi=PI&p_theme=realcities&p_action=search&p_maxdocs=200&p_topdoc=1&p_text_direct-0=10F2C719F9FE5FE0&p_field_direct-0=document_id&p_perpage=10&p_sort=YMD_date:D&s_trackval=GooglePM "Great leap rightward? Nah, just finding balance"], ''[[The Philadelphia Inquirer]]'', January 15, 2006. Accessed March 2, 2011. "Folks meet Jonathan V. Last. He was born in Camden 31 years ago grew up in Woodbury and Moorestown and now works as online editor for the Weekly Standard."</ref> * [[Al LeConey]] (1901–1959), gold medal winner in the [[4 × 100 metres relay|4x100 meter relay]] at the [[1924 Summer Olympics]].<ref>LeConey, Bill. [http://nl.newsbank.com/nl-search/we/Archives?p_product=AC&p_theme=ac&p_action=search&p_maxdocs=200&p_topdoc=1&p_text_direct-0=0EAEDD1A31B61260&p_field_direct-0=document_id&p_perpage=10&p_sort=YMD_date:D&s_trackval=GooglePM "1924 gold medalist in family spurs press writer's search"], ''[[The Press of Atlantic City]]'', September 27, 2000. Accessed March 1, 2011. "J. Alfred LeConey was a great American sprinter of his time achieving local fame at Moorestown and then at Lafayette in the early 1920s."</ref><ref>''New Jersey Mirror'', March 2, 1938: "Death of William G. LeConey." "Surviving are his wife, Laura Haines LeConey, a very active worker in the First Baptist Church; and two sons, Everett LeConey, of Moorestown; and J. Alfred LeConey, of Plainfield. The latter was a winner in the Olympics at Paris in 1924 and upon his return to Moorestown, a great reception was held on the lawn of the LeConey home here to do him honor."</ref> * [[Kathy Linden]] (born 1938), pop singer who scored hits on the U.S. [[Billboard Hot 100|''Billboard'' Hot 100]] with "[[Billy (Kathy Linden song)|Billy]]" and "[[Goodbye Jimmy, Goodbye]]".<ref>[https://mentalitch.com/kathy-linden-the-woman-with-a-childish-voice/ "Kathy Linden – The Woman with a Childish Voice"], Mental Itch. Accessed November 29, 2017. "Kathy Linden is an American traditional pop singer whose singing was considered one of the sweetest-sounding voices during her era. She was born Marion Londres in Moorestown Township, New Jersey, and grew up in nearby Burlington, living on the town's Elm Avenue."</ref> * [[Donovan McNabb]] (born 1976), former professional football player for the [[Philadelphia Eagles]].<ref>[https://www.usatoday.com/news/nation/2005-07-11-nj-town-best-place-to-live_x.htm "Moorestown, N.J., named best town to live"], ''[[USA Today]]'', July 11, 2005. Accessed July 25, 2008. "Plenty of executives still inhabit its {{convert|15|sqmi|km2}}. But the best-known citizens these days are a number of Philadelphia Eagles players, including star quarterback Donovan McNabb."</ref> * [[Stephen W. Meader]] (1892–1977), author of more than 40 novels for boys and girls.<ref>[https://web.archive.org/web/20110708104413/http://www.burlcohistorian.com/NewViewsVIINarrative New Views VII - 2008 Literary Burlington County], [[Burlington County, New Jersey]] Historian. Accessed March 1, 2011. "Stephen W. Meader home, 565 East Main Street, Moorestown. Author of Children's Books (1892-1977). Stephen Meader, born to Quaker parents, wrote his first children's book, The Black Buccaneer, in 1920. He moved his growing family to Moorestown in 1922 and by 1927, he had obtained a position with the Philadelphia advertising firm of N.W. Ayer & Son."</ref><ref>[https://web.archive.org/web/20060527162905/http://www.southernskies.com/bio.asp ''The Life of Stephen W. Meader''] "A third child, John, was born in 1921, and in 1922, the family moved to Moorestown, New Jersey." Accessed April 16, 2008.</ref> * [[Freddie Mitchell]] (born 1978), former professional football player for the [[Philadelphia Eagles]].<ref>Jones, Gordie. [https://web.archive.org/web/20140722230636/http://articles.mcall.com/2005-04-24/sports/3609037_1_defensive-linemen-andy-reid-receiver "Don't buy Andy's spin: draft sent Iggles a message"], ''[[The Morning Call]]'', April 24, 2005. Accessed February 11, 2012. "It was hard to hear him, because it sounded like somebody was hammering a 'For Sale' sign into the lawn in front of Freddie Mitchell's Moorestown, N.J., home."</ref><ref>Boyer, Dave. [https://web.archive.org/web/20160304060820/http://articles.philly.com/2004-10-11/news/25390659_1_moorestown-resident-affordable-housing-town-dump "Hear this, T.O.: There are plenty of hoppin' spots in Moorestown Who needs a liquor store when you have the town dump and a Friendly's?"], ''[[The Philadelphia Inquirer]]'', October 11, 2004. Accessed April 23, 2015. "And wide receiver Freddie Mitchell has lived in Moorestown the last few years, although he's moving. Mitchell got into a dispute with a neighbor over trees, and has been looking for a place that is - repeat after me, T.O. - quieter than Moorestown."</ref> * [[Victoria Napolitano]] (born 1988), politician who became Moorestown's youngest mayor, when she took office in 2015 at age 26.<ref name=Napolitano>Williams, Sharrie. [http://6abc.com/politics/26-year-old-moorestown-mayor-sworn-in-/464735/ "26-year-old Moorestown mayor sworn in"], [[WPVI-TV]], January 6, 2015. Accessed November 29, 2017. "A new year means new leadership in Moorestown, New Jersey. Victoria Napolitano was sworn in as the town's new mayor. At the age of 26, she's the youngest mayor in Moorestown's recent history."</ref> * [[David A. Norcross]] (born 1937), politician who ran for [[United States Senate]] in 1976 and served as chairman of the [[New Jersey Republican State Committee]].<ref>Guenther, Alan. [https://web.archive.org/web/20170108213527/http://pqasb.pqarchiver.com/app/doc/438008849.html?FMT=ABS&FMTS=ABS:FT&type=current&date=Nov%2024,%202007&author=ALAN%20GUENTHER&pub=Asbury%20Park%20Press&edition=&startpage=&desc=Feud%20roils%20race%20for%20Saxton%27s%20seat "Feud roils race for Saxton's seat"], ''[[Asbury Park Press]]'', November 24, 2007. Accessed December 2, 2013. "The next day, he touted the candidacy of Moorestown resident David A. Norcross, who's been active with the national Republican Party."</ref> * [[Brendan O'Connor (United States Army)|Brendan O'Connor]] (born c. 1960), recipient of the [[Distinguished Service Cross (United States)|Distinguished Service Cross]] for his heroic action in [[Afghanistan]].<ref>[https://web.archive.org/web/20110105120529/http://www.moorestown.nj.us/pubs/140/2669.pdf Proclamation honoring Master Sergeant Brendan O'Connor at July 28, 2008, Meeting of the Township Council of Moorestown Township], Moorestown Township, backed up by the [[Internet Archive]] as of January 15, 2011. Accessed September 8, 2015.</ref><ref>[http://militarytimes.com/citations-medals-awards/recipient.php?recipientid=3669 Brendan W. O'Connor], ''MilitaryTimes'' Hall of Valor. Accessed September 8, 2015. "Brendan W. O'Connor; Home of record: Moorestown New Jersey"</ref> * [[Christine O'Donnell]] (born 1969), Republican candidate in [[Delaware]]'s [[United States Senate special election in Delaware, 2010|2010 United States Senate special election]].<ref>via ''[[The Washington Post]]''. [http://www.cleveland.com/nation/index.ssf/2010/09/gop_candidate_christine_odonne.html "GOP candidate Christine O'Donnell's stunning Senate primary win raises questions about her past"], ''[[The Plain Dealer]]'', September 19, 2010. Accessed March 1, 2011. "O'Donnell, 41, grew up in Moorestown, N.J., and attended Fairleigh Dickinson University, though she did not earn her degree until this year."</ref> * [[Terrell Owens]] (born 1973), former professional football player who played for the [[Philadelphia Eagles]] and other teams.<ref>[http://sports.espn.go.com/nfl/news/story?id=2216703 Reid: T.O. will not play for Eagles this season], [[ESPN.com]], November 8, 2005.</ref> * [[Sal Paolantonio]], (born 1956), [[Philadelphia]]-based bureau reporter for [[ESPN]].<ref>Fiorillo, Victor. [http://www.phillymag.com/articles/2013/10/25/espns-sal-paolantonio-nobody-high-school/ "ESPN’s Sal Paolantonio Was a Nobody in High School; Plus, the Moorestown-based sports broadcast personality and former Inquirer reporter tells us why Donovan McNabb is misunderstood, his summer chasing Russian subs, and how the Beatles saved the USA."], ''[[Philadelphia (magazine)]]'', October 25, 2013. Accessed January 11, 2018.</ref><ref>Aleardi, Marianne. [https://sjmagazine.net/people/ten-questions/ten-questions-sal-paolantonio "Ten Questions: Sal Paolantonio; The ESPN correspondent talks sports, politics and Uncle Bill’s Pancake House"], ''South Jersey Magazine'', July 2013. Accessed January 11, 2018. "A resident of Moorestown, Paolantonio spends the NFL season watching, talking, breathing football."</ref> * [[Alice Paul]] (1885–1977), leader of a campaign for women's suffrage resulting in passage of the 19th Amendment to the U.S. Constitution.<ref>[https://web.archive.org/web/20110719035030/http://www.ettc.net/njarts/details.cfm?ID=313 Alice Paul House, Moorestown], [[Stockton University]]. Accessed July 25, 2008.</ref> * [[Doug Pederson]] (born 1968), head coach of the [[Philadelphia Eagles]] of the [[National Football League]].<ref>{{cite web|title=Eagles hiring Chiefs OC Doug Pederson as head coach|url=http://www.nfl.com/news/story/0ap3000000622612/article/eagles-hiring-chiefs-oc-doug-pederson-as-head-coach|website=NFL.com}}</ref><ref>Anastasia, Phil. [http://www.philly.com/philly/blogs/phil-anastasia/Football-preview-Moorestown.html "Football preview: Moorestown"], ''[[The Philadelphia Inquirer]]'', October 17, 2013. Accessed September 8, 2015. "But Lisa is not even a lock to start as Horton insists that junior Drew Pederson, the son of Eagles assistant coach Doug Pederson, is a strong contender for the job."</ref><ref>Cuellar, Dann. [http://6abc.com/sports/doug-pedersons-neighbors-ready-to-welcome-him-back-home/1166113/ "Doug Pedersons' neighbors ready to welcome him back home"], [[WPVI-TV]], January 19, 2016. Accessed November 29, 2017. "New Philadelphia Eagles head coach Doug Pederson and his family are excited about moving back to the area.... Before moving to Kansas City in 2011, the Pederson family lived on a cul-de-sac in the unit block of Hamilton Court in Moorestown, New Jersey."</ref> * [[Samuel K. Robbins]] (1853–1926), politician who served as Speaker of the [[New Jersey General Assembly]] and president of the [[New Jersey Senate]].<ref>Staff. [https://www.nytimes.com/1908/12/26/archives/would-succeed-watkins-senator-robbins-out-for-his-place-as-jersey.html "Would Succeed Watkins.; Senator Robbins Out for His Place as Jersey Commissioner of Banking."], ''[[The New York Times]]'', December 26, 1908. Accessed August 28, 2018. "Senator Samuel K. Robbins of Moorestown, Burlington County, is expected to succeed David O. Watkins of Woodbury as State Commissioner of Banking and Insurance."</ref> * [[Julie Robenhymer]] (born 1981), [[Miss New Jersey]] 2005.<ref>via [[Associated Press]]. [http://nl.newsbank.com/nl-search/we/Archives?p_product=BURB&p_multi=WBCB&p_theme=burb&p_action=search&p_maxdocs=200&p_topdoc=1&p_text_direct-0=10B1325E2D06DB00&p_field_direct-0=document_id&p_perpage=10&p_sort=YMD_date:D&s_trackval=GooglePM "Pageant life teaches new Miss N.J. Moorestown woman learns about competition, herself"], ''[[Burlington County Times]]'', June 20, 2005. Accessed March 1, 2011. "Julie Robenhymer, the reigning Miss Burlington County and the newly crowned Miss New Jersey, isn't entirely comfortable with being called beautiful. 'It's very weird,' she said. The 24-year-old Moorestown native would rather talk about how competing in beauty pageants gave her confidence and self-worth."</ref> * [[Jeremy Roenick]] (born 1970), professional hockey player, former player for the [[Philadelphia Flyers]].<ref>Ginsberg, Wendy. [https://web.archive.org/web/20110517031158/http://www.highbeam.com/doc/1G1-120637001.html "New Magazine Aims to Be Social Guide for Southern New Jersey Suburbs"], ''[[The Philadelphia Inquirer]]'', January 17, 2002. Accessed March 8, 2008. "The monthly magazine, which aims to be a social guide for South Jerseyans, was relaunched this month with the toothy grin of Philadelphia Flyer Jeremy Roenick, a Moorestown resident, gracing the cover."</ref> * [[Jon Runyan]] (born 1973), football player for the [[Philadelphia Eagles]], [[Houston Oilers]] and [[San Diego Chargers]] who was elected to represent [[New Jersey's 3rd congressional district]] from 2011 to 2015.<ref>[https://web.archive.org/web/20130729114852/http://abclocal.go.com/wpvi/story?section=news%2Fsports&id=5749333 "Inside Jon Runyan's New Crib"], [[WPVI]], November 17, 2007. Accessed June 15, 2008. "The man is Philadelphia Eagle Jon Runyan, and the house is located in Moorestown, New Jersey."</ref><ref>Zap, Claudine. [https://www.realtor.com/news/celebrity-real-estate/jon-runyan-purchases-new-jersey-home/ "Former Congressman and NFL Star Jon Runyan Buys Smaller Place in Jersey"], [[Realtor.com]], December 10, 2015. Accessed February 5, 2018. "From NFL offensive lineman to two-term New Jersey congressman, Jon Runyan has had an action-packed career.... He has since purchased a more modest home in nearby Moorestown, NJ, for $1,375,000. We're sure he'll adjust to his smaller manse."</ref> * [[Steve Sabol]] (1942–2012), president and co-founder of [[NFL Films]].<ref>Staff. [http://nl.newsbank.com/nl-search/we/Archives?p_product=PI&s_site=philly&p_multi=PI&p_theme=realcities&p_action=search&p_maxdocs=200&p_topdoc=1&p_text_direct-0=11E9657AA56E88E8&p_field_direct-0=document_id&p_perpage=10&p_sort=YMD_date:D&s_trackval=GooglePM "Sabol's seen many Super moments"], ''[[The Philadelphia Inquirer]]'', February 3, 2008. Accessed March 1, 2011. ""Steve Sabol, president of the Mount Laurel-based NFL Films and a resident of Moorestown, has been at all of these title games, documenting the events..."</ref> * [[Ulf Samuelsson]] (born 1964), professional hockey player, former player for the [[Philadelphia Flyers]].<ref>Samuelsson, Ulf. [https://web.archive.org/web/20160304032757/http://www.thehockeynews.com/articles/19067-Ulf-Samuelssons-Blog-The-transition-to-coaching.html "Ulf Samuelsson's Blog: The transition to coaching"], ''[[The Hockey News]]'', October 24, 2008. Accessed March 1, 2011. "I got into a number of things, like restaurants and car dealerships. For a while, we had three dealerships going in Pittsburgh and we sold a lot on eBay. It was fun to go out and try many things that I couldn't when I was playing hockey. My family and I stayed in New Jersey, in a great town called Moorestown Township."</ref> * [[Lauren Schmetterling]] (born 1988), [[Rowing (sport)|rower]] who won a total of three gold medals in the Women's eight competition at the [[2013 World Rowing Championships]], the [[2015 World Rowing Championships]] and the [[2016 Summer Olympics]] in [[Rio de Janeiro]].<ref>[http://www.teamusa.org/us-rowing/athletes/Lauren-Schmetterling Lauren Schmetterling], [[United States Olympic Team]]. Accessed August 10, 2016. "Birthplace: Voorhees, N.J.; Hometown: Moorestown, N.J.; High School: Moorestown High School (Moorestown, N.J.) '06"</ref> * [[Katherine Shindle]] (born 1977), [[Miss America]] 1998 and actress.<ref>[http://nl.newsbank.com/nl-search/we/Archives?p_product=PI&s_site=philly&p_multi=PI&p_theme=realcities&p_action=search&p_maxdocs=200&p_topdoc=1&p_text_direct-0=0EB32F096FA2E5E0&p_field_direct-0=document_id&p_perpage=10&p_sort=YMD_date:D&s_trackval=GooglePM "A S. Jersey girl takes the crown of Miss America, but she's Miss Illinois."], ''[[The Philadelphia Inquirer]]'', September 14, 1977. Accessed February 11, 2012. "Moorestown native and Bishop Eustace graduate Katherine Shindle was named Miss America 1998 last night, topping an all-vocalist field of five finalists in the 77th annual competition."</ref><ref>Marcus, Joan. [http://www.philly.com/philly/entertainment/author-alison-bechdel-and-actor-katherine-shindle-dish-on-the-tony-winning-musical-fun-home-opening-tuesday-in-philly-20170606.html "Author Alison Bechdel and actor Katherine Shindle dish on the Tony winning musical Fun Home opening Tuesday in Philly"], ''[[The Philadelphia Inquirer]]'', June 7, 2017. Accessed November 29, 2017. "A critical and commercial hit when it opened in 2015 on Broadway, the show kicked off a national tour in October and stars former Miss America Katherine Shindle (''Legally Blonde'' on Broadway, Cabaret national tour), who grew up in New Jersey, in Brigantine and Moorestown, and attended Bishop Eustace Preparatory School in Pennsauken."</ref> * [[Scott Terry (musician)|Scott Terry]] (born 1976), songwriter and singer who has fronted the band [[Red Wanting Blue]].<ref>Scott, Rob. [http://patch.com/new-jersey/moorestown/moorestown-s-scott-terry-to-rock-letterman "Moorestown's Scott Terry to Rock Letterman; Moorestown High School alum Scott Terry and his band, Red Wanting Blue, will perform on the ''Late Show with David Letterman'' Wednesday night."], Moorestown Patch, July 18, 2012. Accessed November 7, 2015. "But Scott said he didn't take music seriously until he moved to Moorestown and began singing in the choir at the and later joined the Madrigals at Moorestown High School."</ref> * [[Albert W. Van Duzer]] (1917-1999), bishop of the [[Episcopal Diocese of New Jersey]], serving from 1973 to 1982.<ref>Hagenmayer, S. Joseph. [https://web.archive.org/web/20160323105944/http://articles.philly.com/1999-11-30/news/25495375_1_general-theological-seminary-longtime-rector-first-parish "Episcopal Bishop Albert W. Van Duzer"], ''[[The Philadelphia Inquirer]]'', November 30, 1999. Accessed November 8, 2015. "A longtime New Jersey resident, he lived in Moorestown for five years, Medford for 10 years, Trenton for 20 years, and Merchantville for 20 years."</ref> * [[John Vanbiesbrouck]] (born 1963), professional hockey player, former player for the [[Philadelphia Flyers]].<ref>Staff. [http://nl.newsbank.com/nl-search/we/Archives?p_product=PI&s_site=philly&p_multi=PI&p_theme=realcities&p_action=search&p_maxdocs=200&p_topdoc=1&p_text_direct-0=0EB33094992DA3D4&p_field_direct-0=document_id&p_perpage=10&p_sort=YMD_date:D&s_trackval=GooglePM "Vanbiesbrouck ready for spotlight - The new goalie knows he was no. 3 on shopping lists during the free-agent period. He's eager to show that the flyers picked the right one"], ''[[The Philadelphia Inquirer]]'', October 8, 1998. Accessed March 1, 2011. "He has three sons - Ian, Ben and Nicholas - and lives in Moorestown."</ref> * [[James Weinstein (New Jersey)|James Weinstein]], transportation planner and executive who served as executive director of [[New Jersey Transit]].<ref>[http://www.state.nj.us/transportation/about/press/1999/010699.shtm "Governor Swears in James Weinstein as Commissioner of Transportation"], [[Governor of New Jersey]] [[Christine Todd Whitman]], press release dated April 5, 2007. Accessed November 29, 2017. "Weinstein is a graduate of Seton Hall University and began his career as a journalist. He currently resides in Moorestown, Burlington County, with his wife Linda Artlip."</ref> * [[Brian Willison]] (ki fèt an 1977), direktè nan Parsons Institute for Information Mapping. * [[Helen Van Pelt Wilson]] (1901-2003), ekriven.<ref>Staff. [http://nl.newsbank.com/nl-search/we/Archives?p_product=WTNB&p_theme=wtnb&p_action=search&p_maxdocs=200&p_topdoc=1&p_text_direct-0=0FEB2ABAAC2C21F8&p_field_direct-0=document_id&p_perpage=10&p_sort=YMD_date:D&s_trackval=GooglePM "Wilson, Helen Van Pelt"], ''Westport News (Connecticut)'', October 24, 2003. Accessed November 17, 2013. "Born in Collingswood, N.J., Oct. 19, 1901, she grew up in nearby Moorestown, went to the Shipley School in Bryn Mawr and graduated cum laude from Bryn Mawr College in 1923."</ref> * [[Esther V. Yanai]] (1928-2003), avokat open-space preservation in Moorestown.<ref>[http://obits.syracuse.com/obituaries/syracuse/obituary.aspx?n=esther-yanai&pid=1497100 "Obituary: Esther Yanai"], ''[[Syracuse Post Standard]]'', October 21, 2003. Accessed November 29, 2017. "October 15, 2003 Esther Yanai, 75, of Moorestown, NJ, died Wednesday at her daughter Ruth's home in Syracuse, cared for by friends and family, including husband Steve and granddaughter Nora."</ref> * [[Albert Young (American football)|Albert Young]] (ki fèt an 1985), ansyen foutbalè pou [[Iowa Hawkeyes football|University of Iowa]] and [[Minnesota Vikings]].<ref>[https://web.archive.org/web/20081022183017/http://hawkeyesports.cstv.com/sports/m-footbl/mtt/young_albert00.html Albert Young], [[Iowa Hawkeyes football]]. Accessed May 25, 2008.</ref> * [[Tim Young (American rower)|Tim Young]] (ki fèt an 1968), silver medal-winning rower in the quadruple sculls at the [[1996 Summer Olympics]].<ref>Pucin, Diane via ''[[The Philadelphia Inquirer]]''. [https://news.google.com/newspapers?id=jqRSAAAAIBAJ&sjid=m28DAAAAIBAJ&dq=tim-young%20moorestown&pg=4608%2C6177294 "U.S. rowers put 3 boats into finals"], ''[[Pittsburgh Post-Gazette]]'', July 27, 1996. Accessed March 1, 2011. "Young, from Moorestown, has chosen to row in the quad, a sculling boat in a country where the sculling boats are always of lowest priority."</ref> * [[Martha Zweig]], powèt.<ref>[http://www.versedaily.org/2010/aboutmarthazweigml.shtml About Martha Zweig], Verse Daily. Accessed November 29, 2017. "Martha Zweig was born in Philadelphia and grew up in suburban Moorestown, New Jersey, where she was educated at the Friends' (Quaker) School."</ref> == Referans == {{referans}} == Lyen deyò == [[Kategori:Vil nan New Jersey]] [[Kategori:Vil nan Etazini]] [[Kategori:Jewografi]] o5okbmxrm08glrnjnky1v29c83c1gzw River Edge, New Jersey 0 35859 855615 762206 2024-11-12T20:50:31Z Nathavaskie 31718 /* Kèk lyen */ ajoute lyen 855615 wikitext text/x-wiki {{ebòch}} {{kolektivite tèritoryal |non_lokal= River Edge |koodone_lat= |koodone_lon= |drapo_imaj= |anblèm_imaj= |tip=vil |dat= |zòn_tip=Eta |zòn= [[New Jersey]] |kapital_tip= |kapital_non=Trenton |chèf_tit= |chèf_non= |sipèfisi_dat= |sipèfisi_ran= |sipèfisi_total= |dlo_pousantaj= |frontyè_tè= |frontyè_kòt= |rote_mwayen= |pli_ro_kote= |pli_ro= |pli_ba_kote= |pli_ba= |popilasyon_dat= |popilasyon_ran= |popilasyon_total= |popilasyon_dansite= |popilasyon_tip= |aktivite= |kat_anplasman= |kat_politik= |kat_jewografik= |kat_satelit= |divizyon_tip= |divizyon_non= |vwazen= |sitwèb= |kòd_tip=jewografik |kòd= |nòt= }} River Edge se yon vil nan eta [[New Jersey]] . Li nan konte Bergen Li te genyen nan lane 2000 10946 moun. == Istwa == Istwa == Relasyon ak Ayiti == *Kominote Ayisyen, relasyon ant eta sa epi Ayiti == Jewografi == == Ekonomi == == Devlòpman == == Politik == == Edikasyon == == Anviwònman == == referans == == Kèk lyen == https://datausa.io/profile/geo/river-edge-nj [[kategori:vil nan New Jersey]] [[Kategori:Vil nan Etazini]] [[kategori:jewografi]] lb6jyggobdyzu7amcge0e6xf7wgk56a Modèl:Infobox 10 62585 855582 852945 2024-11-12T15:16:54Z BwaKajou 31668 855582 wikitext text/x-wiki {{#invoke:Infobox|build|nom={{#invoke:Infobox/Infobox universelle|main|{{{wikidata|}}}}}}}{{Infobox en Lua}}</div></includeonly> nermv6nivplreo3rrpgeqfet1odlrco XVideos 0 62588 855591 841203 2024-11-12T16:02:46Z BwaKajou 31668 855591 wikitext text/x-wiki {{Infobox Dotcom company | company_name = XVideos | company_logo = XVideos logo.svg | company_type = [[Pònografik]] | genre = Pònografi | foundation = | founder = | location = [[Etazini]] | area_served = Atravè lemond | industry = Pònografi | products = | services = Pònografi | revenue = | operating_income = | net_income = | owner = | parent = | divisions = | subsid = | company_slogan = Gratis Albòm Porn | url = xvideos.com | screenshot = | caption = | alexa = {{DecreasePositive}} 41 ({{as of|2014|6|25|alt=June 2014}})<ref name="alexa">{{cite web |url= http://www.alexa.com/siteinfo/xvideos.com |title= Xvideos.com Site Info |publisher= [[Alexa Internet]] |accessdate= 2014-04-01 |archive-date= 2019-05-17 |archive-url= https://web.archive.org/web/20190517111328/https://www.alexa.com/siteinfo/xvideos.com |dead-url= yes }}</ref><!--Updated monthly by OKBot.--> | website_type = Pònografik pataje videyo | language = [[Angle]] | advertising = Wi | registration = Si ou vle | launch_date = [[1997]] | current_status = Aktif | footnotes = | intl = }} '''XVideos''' se yon pònografik gratis sou sit wèb pataje videyo. Li se sit entènèt la ki pi popilè pònografik nan mond lan, li te gen simonte porneub kòm ki pi popilè sou sit wèb granmoun pataje videyo nan Novanm [[2010]]. Li te tou plis pouvwa pase LiveJasmin, yon sit entènèt chat videyo granmoun nan janvye [[2012]]. Dapre [[Alexa Internet|Alexa]] li te youn nan 50 sou sit entènèt yo sou entènèt la ki pi popilè depi nan kòmansman [[2013]], ak kounye a gen sou 350 milyon vizitè chak mwa, bay "nan 29 petabytes nan done transfere chak mwa."<ref name="ExtremeTech">{{cite journal |url= http://www.extremetech.com/computing/123929-just-how-big-are-porn-sites |title=Just how big are porn sites? |first=Sebastian |last=Anthony |journal=[[ExtremeTech]] |location=New York, NY |publisher=[[Ziff Davis Media]] |date=April 4, 2012 |accessdate=April 7, 2012 |oclc=489265532}}</ref> ==Referans== <references/> [[Kategori:Entènèt]] fft8inrks1t0assfifjpn0tehjzv6os Module:Infobox 828 62631 855580 852896 2024-11-12T15:00:35Z BwaKajou 31668 855580 Scribunto text/plain local p = {} local wikiLang = 'ht' local localdata = {}-- données concernant les paramètres passés au modèle -- données concernant la page où est affichée l'infobox local page = mw.title.getCurrentTitle() local maincolor, secondcolor, thirdcolor = 'var(--background-color-interactive-subtle, #f8f9fa)', 'var(--background-color-interactive-subtle, #f8f9fa)', 'var(--color-emphasized, #000000)' -- l'objet principal à retourner local infobox = mw.html.create('div') -- objets secondaires à retourner local maintenance = '' -- chaîne retournée avec le module : cats de maintenance local externaltext = '' -- par exemple coordonnées en titre -- modules importés local wd = require 'Module:Wikidata' local yesno = require 'Module:Yesno' local valueexpl = wd.translate("activate-query") -- maintenance des images dupliquées local usedImages = {} local i18n = { ['see doc'] = 'Documentation du modèle', ['edit'] = 'modifye', ['edit code'] = 'modifye kòd la', ['edit item'] = 'modifye Wikidata', ['tracking cat'] = "Paj ki itilize done Wikidata", ['invalid block type'] = "Bloc de données invalide dans le module d'infobox", ['default cat'] = "Antretyen infobox", } local function expandQuery(query) if not query.entity then query.entity = localdata.item end if not query.conjtype then query.conjtype = 'comma' end local claims = wd.getClaims(query) if (not claims) then return nil end return wd.formatAndCat(query), wd.getgendernum(claims) -- valeur et code indiquant le genre/nombre pour accorder le libellé end local function getWikidataValue(params, wikidataparam) -- Récupère la valeur Wikidata pour la valeur, soit dans le paramètre "wikidata" soit dans le paramètre "property" if not localdata.item then return nil end if params.blockers then -- blockers are local parameters that disable the wikidata query local blockers = params.blockers if (type(blockers) == 'string') then blockers = {blockers} end for i, blocker in ipairs(blockers) do if localdata[blocker] then return nil end end end local v, valgendernum -- la valeur à retourner, et le genre/nombre de de valeurs (pour l'accord grammatical) if not wikidataparam then -- par défaut la valeur wikidata est dans le paramètre "wikidata" mais dans les structures composées comme "title", il y a plusieurs paramètres wikidata wikidataparam = 'wikidata' end if params.property and not params[wikidataparam] then params[wikidataparam] = {property = params.property} end if params[wikidataparam] then if type(params[wikidataparam]) == 'function' then v, valgendernum = params[wikidataparam](localdata.item) elseif type(params[wikidataparam]) == 'table' then v, valgendernum = expandQuery(params[wikidataparam]) else v, valgendernum = params[wikidataparam] end end if not v then return nil end if(type(valgendernum) == 'number') then if(valgendernum > 1) then valgendernum = 'p' else valgendernum = 's' end end return v, valgendernum end local function getValue(val, params) if type(val) == 'string' then return localdata[val] elseif type(val) == 'function' then return val(localdata, localdata.item, params) elseif type(val) == 'table' then for i, j in pairs(val) do -- si plusieurs paramètres possibles (legacy de vieux code), prendre le premier non vide if localdata[j] then return localdata[j] end end end end local function addMaintenanceCat(cat, sortkey) if page.namespace ~= 0 then return '' end if cat then local sortkeycode if sortkey then sortkeycode = '|' .. sortkey else sortkeycode = '' end maintenance = maintenance .. '[[Category:'.. cat .. sortkeycode .. ']]' end end function p.separator(params) local style = params['separator style'] or {} style.height = style.height or '2px' style['background-color'] = style['background-color'] or maincolor return mw.html.create('hr'):css( style ) end --[=[ Construit le code du bloc de titre de l'infobox Paramètres (liste partielle) : - value : Moyen d'obtenir le titre via getValue (nom de paramètre de modèle ou fonction). - textdefaultvalue : Valeur par défaut du titre. - icon : Pictogramme d'infobox (voir [[Projet:Infobox/Pictogramme]]). - italic : Indique si le titre doit être affiché en italique. Si italic=true, le paramètre "titre en italique" de l'infobox peut forcer la désactivation. - setdisplaytitle : Indique si le titre de l'article doit être mis en forme comme celui de l'infobox. Si setdisplaytitle=true, le paramètre "titre article en italique" de l'infobox peut forcer la désactivation. ]=] function p.buildtitle(params) local text = getValue(params.value, params) or params.textdefaultvalue or getWikidataValue(params) or page.prefixedText local lang = localdata['langue du titre'] or '' if lang ~= '' then local langueFunction = require( 'Module:Langue' ).langue text = langueFunction( { lang, text } ) end local subtext = getValue(params.subtitle) or getWikidataValue(params, 'wikidatasubtitle') or params.subtitledefaultvalue if subtext and (subtext ~= text) then text = text .. '<br /><small>' .. subtext .. '</small>' end local icon = params.icon or '' if icon ~= '' and icon ~= 'defaut' then text = text .. mw.getCurrentFrame():extensionTag('templatestyles', '', {src = 'Infobox/Pictogramme/' .. mw.text.trim(icon) .. '.css'}) if not params.large then icon = 'icon ' .. icon end end local classes = 'entete ' .. icon local italic = params.italic and yesno(localdata['titre en italique'] or '', true, true) if italic then classes = classes .. ' italique' end if params.setdisplaytitle and yesno(localdata['titre article en italique'] or '', true, true) then local formatTitleModule = require( 'Module:Formatage du titre' ) text = text .. formatTitleModule.setDisplayTitle{ args = { lang = lang, italic = italic, options = 'noreplace', } } end -- overwrites with those provided in the module local style = {} style['background-color'] = maincolor style['color'] = thirdcolor if params.style then for i, j in pairs(params.style) do style[i] = j end end local title = mw.html.create('div') :addClass(classes) :css(style) :tag('div') :wikitext(text) :allDone() return title end p.buildTitle = p.buildtitle function p.buildnavigator(params) -- définition du style local classes = "overflow infobox-navigateur " .. (params.class or '') local style = params.style or {} if params.separated then -- options pour ajouter une ligne de séparation au dessus classes = classes .. ' bordered' style['border-top'] = '1px solid' .. maincolor end -- ajustement des paramètres de données params.previousval = params.previousval or params.previousparameter -- nom de paramètre obsolète params.nextval = params.nextval or params.nextparameter if params.previousproperty then params.previouswikidata = {property = params.previousproperty} end if params.nextproperty then params.nextwikidata = {property = params.nextproperty} end local previousval = getValue(params.previousval, params) or getWikidataValue(params, 'previouswikidata') local nextval = getValue(params.nextval, params) or getWikidataValue(params, 'nextwikidata') if previousval == '-' then previousval = nil end if nextval == '-' then nextval = nil end local navigator if params.inner then -- pour celles qui sont à l'intérieur d'une table navigator = mw.html.create('tr'):tag('th'):attr('colspan', 2) style['font-weight'] = style['font-weight'] or 'normal' else navigator = mw.html.create('div') end if previousval or nextval then navigator :addClass(classes) :css(style) :tag('div') :addClass('prev_bloc') :wikitext(previousval) :done() :tag('div') :addClass('next_bloc') :wikitext(nextval) :done() :allDone() return navigator end return nil end p.buildNavigator = p.buildnavigator function p.buildimages(params) local images = {} local upright, link, caption, classe, alt, size -- size is deprecated if type(params.imageparameters) == 'string' then params.imageparameters = {params.imageparameters} end if not params.imageparameters then -- s'il n'y a pas de paramètre image, continuer, peut-être y a-t-il une image par défaut définie dans le module d'infobox params.imageparameters = {} end for j, k in ipairs(params.imageparameters) do table.insert(images, localdata[k]) end -- Images de Wikidata local iswikidataimage, iswikidatacaption = false if #images == 0 and localdata.item then if params.property then params.wikidata = {entity = localdata.item, property = params.property} end if params.wikidata then local wdq = params.wikidata wdq.excludespecial = true if type(wdq) == 'table' then wdq.entity = wdq.entity or localdata.item wdq.numval = wdq.numval or params.numval or 1 images = wd.getClaims(wdq) end if type(wdq) == 'function' then images = params.wikidata() if type(images) == 'string' then return images end --c'est probablement une erreur dans la requête => afficher le message end if (not images) then images = {} end if (#images > 0) and (params.wikidata.property) then maintenance = maintenance .. wd.addTrackingCat(params.wikidata.property) end if type(images[1]) == 'table' then for i, image in pairs(images) do if image.mainsnak.snaktype ~= 'value' then return end if #images == 1 then -- si une seule image, on utilise la légende (si deux plusieurs images, comment mettre en forme ?) caption = wd.getFormattedQualifiers(images[i], {'P2096'}, {isinlang = wikiLang}) or wd.getFormattedQualifiers(images[i], {'P805'}) iswikidatacaption = caption ~= nil end images[i] = image.mainsnak.datavalue.value iswikidataimage = true end end end end if #images == 0 and getValue(params.captionparameter) ~= nil then addMaintenanceCat("Infobox avec une légende locale sans image") end -- Images par défaut if #images == 0 then if params.maintenancecat then addMaintenanceCat(params.maintenancecat, params.sortkey) end if params.defaultimages then images = params.defaultimages if type(images) == 'string' then images = {images} end upright = params.defaultimageupright caption = params.defaultimagecaption link = params.defaultimagelink classe = params.defaultimageclass if not classe and ( images[1] == 'Defaut.svg' or images[1] == 'Defaut 2.svg' ) then classe = 'skin-invert notheme' end alt = params.defaultimagealt if not alt and ( images[1] == 'Defaut.svg' or images[1] == 'Defaut 2.svg' ) then alt = 'une illustration sous licence libre serait bienvenue' end end end if #images == 0 then return nil end upright = upright or getValue(params.uprightparameter) or params.defaultupright or "1.2" link = link or getValue(params.linkparameter) or params.defaultlink caption = caption or getValue(params.captionparameter) or params.defaultcaption classe = classe or getValue( params.classparameter) or params.defaultclass alt = alt or getValue( params.altparameter) or params.defaultalt if iswikidataimage and not iswikidatacaption and getValue(params.captionparameter) ~= nil then addMaintenanceCat("Infobox avec une légende locale et une image sur Wikidata") end -- taille avec "size" (obsolète) size = size or getValue(params.sizeparameter) or params.defaultsize -- deprecated if size then local sizevalue = size:gsub('px$', '') local widthonly = mw.ustring.gsub(sizevalue, 'x.*', '') widthonly = tonumber(widthonly) if type(widthonly) ~= 'number' or widthonly > 280 then addMaintenanceCat("Infobox avec une image trop grande") end if tonumber(sizevalue) then size = tostring( tonumber(sizevalue) ) .. 'px' end end if tonumber(upright) then upright = tostring( tonumber(upright) ) end local style = params.style or {padding ='2px 0',} -- Partie image local imagesString = '' for i,image in pairs(images) do if image == '-' then return end imagesString = imagesString .. '[[Fichye:' .. image .. '|frameless' if size then imagesString = imagesString .. '|' .. size -- not a mistake, parameter is unnamed end if classe then imagesString = imagesString .. '|class=' .. classe end if alt then imagesString = imagesString .. '|alt=' .. alt end if link then imagesString = imagesString .. '|link=' .. link end if upright then imagesString = imagesString .. '|upright=' .. upright elseif #images > 1 and not size then imagesString = imagesString .. '|upright=' .. ( 1 / #images ) end if image:sub(-4):lower() == '.svg' then imagesString = imagesString .. '|lang=' .. wikiLang end imagesString = imagesString .. ']]' if usedImages[image] then addMaintenanceCat('Infobox avec plusieurs images identiques') end usedImages[image] = true end local image = mw.html.create('div') :addClass("images") :css(style) :wikitext(imagesString) -- Partie légende local captionobj if caption then captionobj = mw.html.create('div') :wikitext(caption) :css(params.legendstyle or {}) :addClass("legend") :done() end -- séparateur local separator if params.separator then separator = p.separator(params) end return mw.html.create('div') :node(image) :node(captionobj) :node(separator) :done() end p.buildImages = p.buildimages function p.buildtext(params) local classes = params.class or '' local style = { ['text-align'] = 'center', ['font-weight'] = 'bold' } if params.style then for i, j in pairs(params.style) do style[i] = j end end local text = getValue(params.value, params) or getWikidataValue(params) or params.defaultvalue if text == '-' then return end if not text then if params.maintenancecat then addMaintenanceCat(params.maintenancecat, params.sortkey) end return nil end -- séparateur local separator if params.separator then separator = p.separator(params) end local formattedtext = mw.html.create('p') :addClass(classes) :css(style) :wikitext(text) :node(separator) :done() return formattedtext end p.buildText = p.buildtext function p.buildrow(params) local classes = params.class or '' local style = params.style or {} local valueClass = params.valueClass or '' local valueStyle = params.valueStyle or {} local value, gendernum = getValue(params.value, params) if(type(gendernum) == 'number') then if(gendernum > 1) then gendernum = 'p' else gendernum = 's' end end if type(params.wikidata) == 'table' then params.wikidata.wikidatalang = localdata.wikidatalang if (value == valueexpl) then value = nil params.wikidata.expl = false end end if (not value) then value, gendernum = getWikidataValue(params, 'wikidata') end if not value then value = params.defaultvalue end if value == '-' then return nil end if not gendernum then gendernum = 's' --singulier indéfini end if not value then if params.maintenancecat then addMaintenanceCat(params.maintenancecat, params.sortkey) end return nil end local label = params.label if type(label) == 'string' then label = {default = label} end if type(label) == 'table' then -- Accord en genre et en nombre local onlynum = {default = 'default', s = 's', ms = 's', fs = 's', p = 'p', mp = 'p', fp = 'p', mixtep = 'p'} -- Accord seulement en nombre par défaut label['s'] = label['s'] or params.singularlabel or label['default'] or label['ms'] label['p'] = label['p'] or params.plurallabel or label['mp'] label = label[gendernum] or label[onlynum[gendernum]] or label.default end if type(label) == 'function' then label = label(localdata, localdata.item) end -- format local formattedvalue = mw.html.create('div') :wikitext('\n' .. value) -- Le '\n' est requis lorsque value est une liste commençant par '*' ou '#' if (params.hidden == true)then formattedvalue :attr({class="NavContent", style="display: none; text-align: left;"}) formattedvalue = mw.html.create('div') :attr({class="NavFrame", title="[Afiche]/[Maske]", style="border: none; padding: 0;"}) :node(formattedvalue) end formattedvalue = mw.html.create('td') :node(formattedvalue) :addClass(valueClass) :css(valueStyle) :allDone() local formattedlabel if label then formattedlabel = mw.html.create('th') :attr('scope', 'row') :wikitext(label) :done() end local row = mw.html.create('tr') :addClass(classes) :css(style) :node(formattedlabel) :node(formattedvalue) :done() return row end p.buildRow = p.buildrow function p.buildsuccession(params) if not params.value then return nil end --local style = params.style or {} --style['text-align'] = style['text-align'] or 'center' --style['color'] = style['color'] or '#000000' --style['background-color'] = style['background-color'] or '#F9F9F9' local rowI = mw.html.create('tr') local styleI = {} local colspan = '2' styleI['padding'] = '1px' local cellI = mw.html.create('td') :attr({colspan = colspan}) :attr({align = 'center'}) :css(styleI) local styleT = { margin = '0px', ['background-color'] = 'transparent', color = 'inherit', width = '100%' } local tabC = mw.html.create('table') :attr({cellspacing = '0'}) :addClass('navigation-not-searchable') :css(styleT) local row = mw.html.create('tr') local color = params.color local style = {} local arrowLeft = '[[Fichye:Arrleft.svg|13px|alt=Anvan|link=]]' local arrowRight = '[[Fichye:Arrright.svg|13px|alt=Aprè|link=]]' if color ~= 'default' then style['background-color'] = color end local styleTrans = {} local values = params.value local before = values['before'] local center = values['center'] local after = values['after'] local widthCenter local widthCell = '44%' if center then widthCenter = '28%' widthCell = '29%' end local formattedbefore if before then formattedbefore = mw.html.create('td') :attr({valign = 'middle'}) :attr({align = 'left'}) :attr({width = '5%'}) :css(style) :wikitext(arrowLeft) :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(style) :wikitext('') :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({align = 'left'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(style) :wikitext(before) :done() row:node(formattedbefore) else formattedbefore = mw.html.create('td') :attr({valign = 'middle'}) :attr({align = 'left'}) :attr({width = '5%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({align = 'left'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) end local formattedcenter formattedcenter = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedcenter) if center then formattedcenter = mw.html.create('td') :attr({align = 'center'}) :attr({valign = 'middle'}) :attr({width = widthCenter}) :css(style) :wikitext(center) :done() row:node(formattedcenter) formattedcenter = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedcenter) end local formattedafter if after then formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(style) :wikitext(after) :done() row:node(formattedafter) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(style) :wikitext('') :done() row:node(formattedbefore) formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = '5%'}) :css(style) :wikitext(arrowRight) :done() row:node(formattedafter) else formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(styleTrans) :wikitext('') :done() row:node(formattedafter) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = '5%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedafter) end row:done() tabC:node(row) tabC:done() cellI:node(tabC) cellI:done() rowI:node(cellI) rowI:allDone() return rowI end p.buildSuccession = p.buildsuccession function p.buildrow1col(params) if not params.value then return nil end --local style = params.style or {} --style['text-align'] = style['text-align'] or 'center' --style['color'] = style['color'] or '#000000' --style['background-color'] = style['background-color'] or '#F9F9F9' local classes = params.class local rowcolor if params.color == 'secondcolor' then rowcolor = secondcolor else rowcolor = params.color end local style = {} style['padding'] = '4px' style['text-align'] = 'center' style['background-color'] = rowcolor or 'var(--couleur-fond-boite-grise, #f9f9f9)' style['color'] = 'var(--color-emphasized, #000000)' local text = params.value local colspan ='2' local formattedlabel formattedlabel = mw.html.create('th') :attr({colspan = colspan}) :css(style) :wikitext(text) :done() local row = mw.html.create('tr') :addClass(classes) :css(style) :node(formattedlabel) :done() return row end p.buildRow1Col = p.buildrow1col function p.buildtable(params) local tab = mw.html.create('table'):css(params.style or {}) local rows = params.rows -- expand parameters so that we have a list of tables local i = 1 while (i <= #rows) do local l = rows[i] if type(l) == 'function' then l = l(localdata, localdata.item) end if (type(l) == 'table') and (l.type == 'multi') then table.remove(rows, i) for j, row in ipairs(l.rows) do table.insert(rows, i + j - 1, row) end elseif type(l) == 'nil' then table.remove(rows, i) elseif type(l) ~= 'table' then return error('les lignes d\'infobox ("rows") doivent être des tables, est ' .. type(l)) else i = i + 1 end end -- CREATE ROW local expandedrows = {} for k, row in ipairs(rows) do local v = p.buildblock(row) if v then table.insert(expandedrows, v) end end if (#expandedrows == 0) then return nil end rows = expandedrows -- ADD TITLE local title if params.title or params.singulartitle or params.pluraltitle then local text if #rows > 1 and params.pluraltitle then text = params.pluraltitle elseif #rows == 1 and params.singulartitle then text = params.singulartitle else text = params.title end local style = params.titlestyle or {} style['text-align'] = style['text-align'] or 'center' style['color'] = style['color'] or thirdcolor style['background-color'] = style['background-color'] or maincolor local colspan ='2' title = mw.html.create('caption') :attr({colspan = colspan}) :css(style) :wikitext(text) :done() end if title then tab:node(title) end for i, j in pairs (rows) do tab:node(j) end if params.separator then local separator = p.separator(params) tab:node(separator) end tab:allDone() return tab end p.buildTable = p.buildtable function p.buildinvalidblock(args) addMaintenanceCat(i18n['default cat']) local text = '' if type(args) ~= 'table' then text = "Les blocs d'infobox doivent être des tables" else text = i18n["invalid block type"] .. ' : ' .. (args.type or '??') end return text end p.buildInvalidBlock = p.buildinvalidblock function p.buildmap(params) -- paramètre d'affichage local maplist = getValue(params.maps) local pointtype = params.pointtype local maptype = params.maptype -- choisit le type de carte le plus approprié (relief, administratif, etc.) if type(maplist) == 'function' then maplist = maplist(localdata, localdata.item) end local width = tonumber(params.width) or 280 if width > 280 then addMaintenanceCat("Infobox avec une image trop grande") return 'image trop grande, la largeur doit être inférieure ou égale à 280px' end -- récupération des données locales local pointtable = {} local globe = params.globe if params.latitude then local lat, long if type(params.latitude) == 'function' then lat, long = params.latitude(localdata, localdata.item), params.longitude(localdata, localdata.item) else lat, long = localdata[params.latitude], localdata[params.longitude] end if lat then table.insert(pointtable, {latitude = lat, longitude = long}) end end -- récupération des données wikidata local function processWDval(claim, displayformat) if not claim then return nil end local val = wd.formatSnak( claim.mainsnak ) return {latitude = val.latitude, longitude = val.longitude, globe = val.globe, marker = displayformat.marker} end local function getWDvals(query) query.excludespecial = true query.numval = query.numval or 1 query.entity = query.entity or localdata.item local claims = wd.getClaims(query) if (not claims) then return end for i, claim in ipairs(claims) do claim = processWDval(claim, query) table.insert(pointtable, claim) end end if (#pointtable == 0) and localdata.item and params.wikidata and (params.wikidata ~= '-') then for i, query in ipairs(params.wikidata) do if type(query) == 'function' then query = query() end if query then getWDvals(query) end end end if (not pointtable) or (#pointtable == 0) then return nil end local newparams = {maplist = maplist, pointtype = pointtype, maptype = maptype, width = width, item = localdata.item, pointtable = pointtable, globe = globe, marker=params.marker, default_zoom=params.default_zoom, ids = params.ids, markercolor = params.markercolor, shapecolor = params.shapecolor } if params.params and type(params.params) == 'table' then -- paramètres additionnels for i, j in pairs(params.params) do newparams[i] = j end end return require('Module:Carte').multimap(newparams) end p.buildMap = p.buildmap function p.buildexternaltext(params) local value = getValue(params.value) if value and (type(value) == 'string') then externaltext = externaltext .. value end end p.buildExternalText = p.buildexternaltext function p.buildfooter(params) if not params then params = {} end local classes = 'navbar noprint bordered navigation-not-searchable ' .. (params.class or '') local style = params.style or {} style['border-top'] = style['border-top'] or '1px solid ' .. maincolor local backlinkstr = '[' .. tostring( mw.uri.fullUrl( page.prefixedText, 'veaction=edit&section=0' ) ) .. ' ' .. i18n['edit'] .. ']' .. ' - [' .. tostring( mw.uri.fullUrl( page.prefixedText, 'action=edit&section=0' ) ) .. ' ' .. i18n['edit code'] .. ']' local itemlinkstr if localdata.item and localdata.item ~= '-' then itemlinkstr = '[[d:' .. localdata.item .. '|' .. i18n['edit item'] .. ']]' end local editstr = backlinkstr if itemlinkstr then editstr = editstr .. ' - ' .. itemlinkstr end local editlinkspan = mw.html.create('span') :css({['text-align'] = "left"}) :addClass('plainlinks') :wikitext(editstr) :done() local doclinkstr = '[[Fichier:Info Simple.svg|12px|link=' .. localdata.templatename .. '|' .. i18n['see doc'] .. ']]' -- si ce lien ne marche pas toujours, il faut ajouter un variable pour le nom de l'infobox récupéré par le frame local doclinkspan = mw.html.create('span') :css({['text-align'] = "right"}) :wikitext(doclinkstr) :done() local footer = mw.html.create('p') :addClass(classes) :css(style) :node(editlinkspan) :node(doclinkspan) return footer end p.buildFooter = p.buildfooter function p.buildblock(block) if type(block) == 'function' then block = block( localdata ) end local blocktypes = { -- list of functions for block buildings ['invalid'] = p.buildinvalidblock, ['external text'] = p.buildexternaltext, ['footer'] = p.buildfooter, ['images'] = p.buildimages, ['map']= p.buildmap, ['mixed'] = p.buildrow, ['navigator'] = p.buildnavigator, ['table'] = p.buildtable, ['row'] = p.buildrow, ['row1col'] = p.buildrow1col, ['succession'] = p.buildsuccession, ['text'] = p.buildtext, ['title'] = p.buildtitle, } if type(block) ~= 'table' or (not block.type) or (not blocktypes[block.type]) then return blocktypes['invalid'](block) end return blocktypes[block.type](block) end p.buildBlock = p.buildblock function p.build() localdata = require( 'Module:Infobox/Localdata' ) if type( localdata.item ) == 'table' then localdata.item = localdata.item.id end -- assign rank to the infobox, "secondary" means special formatting like no displaytitle for coordinates local infoboxrank = 'main' -- main infobox of the page, with coordinates displayed in title etc. if page.namespace ~= 0 then infoboxrank = 'secondary' end -- if infobox is linked to another item: rank = secondary if localdata.item then local itemlink = mw.wikibase.sitelink(localdata.item) local pagetitle = page.prefixedText if (itemlink or '') ~= pagetitle then infoboxrank = 'secondary' end end localdata.infoboxrank = infoboxrank -- load infobox module page local moduledata = require('Module:Infobox/' .. localdata.modulename) moduledata.name = localdata.modulename -- maintenance categories given by the module page if moduledata.categories then for i, j in pairs(moduledata.categories) do if (type(j) == 'string') then addMaintenanceCat(j) end if (type(j) == 'table') then addMaintenanceCat(j[1],j[2]) end end end -- defines main color maincolor = localdata['couleur infobox'] or localdata['couleur boîte'] or localdata['couleur boite'] or moduledata.maincolor or maincolor secondcolor = moduledata.secondcolor or secondcolor thirdcolor = localdata['texte noir'] or localdata['couleur texte'] or moduledata.thirdcolor or thirdcolor if ( #maincolor == 6 or #maincolor == 3 ) and maincolor:match( '^%x+$' ) then maincolor = '#' .. maincolor end if thirdcolor == 'oui' or thirdcolor == 'true' then thirdcolor = '#000' elseif thirdcolor == 'non' or thirdcolor == 'false' then thirdcolor = '#fff' end -- classes local classes = mw.getCurrentFrame():expandTemplate{ title = 'Classes début infobox', args = { version = '3' } } classes = classes .. ' large ' .. (moduledata.class or '') -- style local style = moduledata.style or {} -- build infobox infobox :addClass(classes) :css(style) for i, j in pairs( moduledata.parts ) do infobox:node( p.buildblock(j) ) end infobox :node(p.buildfooter(moduledata.footer)) :done() return tostring(infobox) .. externaltext, maintenance end return p gdmy4x09fxmghcn5s788f7ormph713y 855586 855580 2024-11-12T15:28:41Z BwaKajou 31668 855586 Scribunto text/plain local p = {} local wikiLang = 'ht' local localdata = {}-- données concernant les paramètres passés au modèle -- données concernant la page où est affichée l'infobox local page = mw.title.getCurrentTitle() local maincolor, secondcolor, thirdcolor = 'var(--background-color-interactive-subtle, #f8f9fa)', 'var(--background-color-interactive-subtle, #f8f9fa)', 'var(--color-emphasized, #000000)' -- l'objet principal à retourner local infobox = mw.html.create('div') -- objets secondaires à retourner local maintenance = '' -- chaîne retournée avec le module : cats de maintenance local externaltext = '' -- par exemple coordonnées en titre -- modules importés local wd = require 'Module:Wikidata' local yesno = require 'Module:Yesno' local valueexpl = wd.translate("activate-query") -- maintenance des images dupliquées local usedImages = {} local i18n = { ['see doc'] = 'Documentation du modèle', ['edit'] = 'modifye', ['edit code'] = 'modifye kòd la', ['edit item'] = 'modifye Wikidata', ['tracking cat'] = "Paj ki itilize done Wikidata", ['invalid block type'] = "Bloc de données invalide dans le module d'infobox", ['default cat'] = "Antretyen infobox", } local function expandQuery(query) if not query.entity then query.entity = localdata.item end if not query.conjtype then query.conjtype = 'comma' end local claims = wd.getClaims(query) if (not claims) then return nil end return wd.formatAndCat(query), wd.getgendernum(claims) -- valeur et code indiquant le genre/nombre pour accorder le libellé end local function getWikidataValue(params, wikidataparam) -- Récupère la valeur Wikidata pour la valeur, soit dans le paramètre "wikidata" soit dans le paramètre "property" if not localdata.item then return nil end if params.blockers then -- blockers are local parameters that disable the wikidata query local blockers = params.blockers if (type(blockers) == 'string') then blockers = {blockers} end for i, blocker in ipairs(blockers) do if localdata[blocker] then return nil end end end local v, valgendernum -- la valeur à retourner, et le genre/nombre de de valeurs (pour l'accord grammatical) if not wikidataparam then -- par défaut la valeur wikidata est dans le paramètre "wikidata" mais dans les structures composées comme "title", il y a plusieurs paramètres wikidata wikidataparam = 'wikidata' end if params.property and not params[wikidataparam] then params[wikidataparam] = {property = params.property} end if params[wikidataparam] then if type(params[wikidataparam]) == 'function' then v, valgendernum = params[wikidataparam](localdata.item) elseif type(params[wikidataparam]) == 'table' then v, valgendernum = expandQuery(params[wikidataparam]) else v, valgendernum = params[wikidataparam] end end if not v then return nil end if(type(valgendernum) == 'number') then if(valgendernum > 1) then valgendernum = 'p' else valgendernum = 's' end end return v, valgendernum end local function getValue(val, params) if type(val) == 'string' then return localdata[val] elseif type(val) == 'function' then return val(localdata, localdata.item, params) elseif type(val) == 'table' then for i, j in pairs(val) do -- si plusieurs paramètres possibles (legacy de vieux code), prendre le premier non vide if localdata[j] then return localdata[j] end end end end local function addMaintenanceCat(cat, sortkey) if page.namespace ~= 0 then return '' end if cat then local sortkeycode if sortkey then sortkeycode = '|' .. sortkey else sortkeycode = '' end maintenance = maintenance .. '[[Category:'.. cat .. sortkeycode .. ']]' end end function p.separator(params) local style = params['separator style'] or {} style.height = style.height or '2px' style['background-color'] = style['background-color'] or maincolor return mw.html.create('hr'):css( style ) end --[=[ Construit le code du bloc de titre de l'infobox Paramètres (liste partielle) : - value : Moyen d'obtenir le titre via getValue (nom de paramètre de modèle ou fonction). - textdefaultvalue : Valeur par défaut du titre. - icon : Pictogramme d'infobox (voir [[Projet:Infobox/Pictogramme]]). - italic : Indique si le titre doit être affiché en italique. Si italic=true, le paramètre "titre en italique" de l'infobox peut forcer la désactivation. - setdisplaytitle : Indique si le titre de l'article doit être mis en forme comme celui de l'infobox. Si setdisplaytitle=true, le paramètre "titre article en italique" de l'infobox peut forcer la désactivation. ]=] function p.buildtitle(params) local text = getValue(params.value, params) or params.textdefaultvalue or getWikidataValue(params) or page.prefixedText local lang = localdata['langue du titre'] or '' if lang ~= '' then local langueFunction = require( 'Module:Langue' ).langue text = langueFunction( { lang, text } ) end local subtext = getValue(params.subtitle) or getWikidataValue(params, 'wikidatasubtitle') or params.subtitledefaultvalue if subtext and (subtext ~= text) then text = text .. '<br /><small>' .. subtext .. '</small>' end local icon = params.icon or '' if icon ~= '' and icon ~= 'defaut' then text = text .. mw.getCurrentFrame():extensionTag('templatestyles', '', {src = 'Infobox/Pictogramme/' .. mw.text.trim(icon) .. '.css'}) if not params.large then icon = 'icon ' .. icon end end local classes = 'entete ' .. icon local italic = params.italic and yesno(localdata['titre en italique'] or '', true, true) if italic then classes = classes .. ' italique' end if params.setdisplaytitle and yesno(localdata['titre article en italique'] or '', true, true) then local formatTitleModule = require( 'Module:Formatage du titre' ) text = text .. formatTitleModule.setDisplayTitle{ args = { lang = lang, italic = italic, options = 'noreplace', } } end -- overwrites with those provided in the module local style = {} style['background-color'] = maincolor style['color'] = thirdcolor if params.style then for i, j in pairs(params.style) do style[i] = j end end local title = mw.html.create('div') :addClass(classes) :css(style) :tag('div') :wikitext(text) :allDone() return title end p.buildTitle = p.buildtitle function p.buildnavigator(params) -- définition du style local classes = "overflow infobox-navigateur " .. (params.class or '') local style = params.style or {} if params.separated then -- options pour ajouter une ligne de séparation au dessus classes = classes .. ' bordered' style['border-top'] = '1px solid' .. maincolor end -- ajustement des paramètres de données params.previousval = params.previousval or params.previousparameter -- nom de paramètre obsolète params.nextval = params.nextval or params.nextparameter if params.previousproperty then params.previouswikidata = {property = params.previousproperty} end if params.nextproperty then params.nextwikidata = {property = params.nextproperty} end local previousval = getValue(params.previousval, params) or getWikidataValue(params, 'previouswikidata') local nextval = getValue(params.nextval, params) or getWikidataValue(params, 'nextwikidata') if previousval == '-' then previousval = nil end if nextval == '-' then nextval = nil end local navigator if params.inner then -- pour celles qui sont à l'intérieur d'une table navigator = mw.html.create('tr'):tag('th'):attr('colspan', 2) style['font-weight'] = style['font-weight'] or 'normal' else navigator = mw.html.create('div') end if previousval or nextval then navigator :addClass(classes) :css(style) :tag('div') :addClass('prev_bloc') :wikitext(previousval) :done() :tag('div') :addClass('next_bloc') :wikitext(nextval) :done() :allDone() return navigator end return nil end p.buildNavigator = p.buildnavigator function p.buildimages(params) local images = {} local upright, link, caption, classe, alt, size -- size is deprecated if type(params.imageparameters) == 'string' then params.imageparameters = {params.imageparameters} end if not params.imageparameters then -- s'il n'y a pas de paramètre image, continuer, peut-être y a-t-il une image par défaut définie dans le module d'infobox params.imageparameters = {} end for j, k in ipairs(params.imageparameters) do table.insert(images, localdata[k]) end -- Images de Wikidata local iswikidataimage, iswikidatacaption = false if #images == 0 and localdata.item then if params.property then params.wikidata = {entity = localdata.item, property = params.property} end if params.wikidata then local wdq = params.wikidata wdq.excludespecial = true if type(wdq) == 'table' then wdq.entity = wdq.entity or localdata.item wdq.numval = wdq.numval or params.numval or 1 images = wd.getClaims(wdq) end if type(wdq) == 'function' then images = params.wikidata() if type(images) == 'string' then return images end --c'est probablement une erreur dans la requête => afficher le message end if (not images) then images = {} end if (#images > 0) and (params.wikidata.property) then maintenance = maintenance .. wd.addTrackingCat(params.wikidata.property) end if type(images[1]) == 'table' then for i, image in pairs(images) do if image.mainsnak.snaktype ~= 'value' then return end if #images == 1 then -- si une seule image, on utilise la légende (si deux plusieurs images, comment mettre en forme ?) caption = wd.getFormattedQualifiers(images[i], {'P2096'}, {isinlang = wikiLang}) or wd.getFormattedQualifiers(images[i], {'P805'}) iswikidatacaption = caption ~= nil end images[i] = image.mainsnak.datavalue.value iswikidataimage = true end end end end if #images == 0 and getValue(params.captionparameter) ~= nil then addMaintenanceCat("Infobox avec une légende locale sans image") end -- Images par défaut if #images == 0 then if params.maintenancecat then addMaintenanceCat(params.maintenancecat, params.sortkey) end if params.defaultimages then images = params.defaultimages if type(images) == 'string' then images = {images} end upright = params.defaultimageupright caption = params.defaultimagecaption link = params.defaultimagelink classe = params.defaultimageclass if not classe and ( images[1] == 'Defaut.svg' or images[1] == 'Defaut 2.svg' ) then classe = 'skin-invert notheme' end alt = params.defaultimagealt if not alt and ( images[1] == 'Defaut.svg' or images[1] == 'Defaut 2.svg' ) then alt = 'une illustration sous licence libre serait bienvenue' end end end if #images == 0 then return nil end upright = upright or getValue(params.uprightparameter) or params.defaultupright or "1.2" link = link or getValue(params.linkparameter) or params.defaultlink caption = caption or getValue(params.captionparameter) or params.defaultcaption classe = classe or getValue( params.classparameter) or params.defaultclass alt = alt or getValue( params.altparameter) or params.defaultalt if iswikidataimage and not iswikidatacaption and getValue(params.captionparameter) ~= nil then addMaintenanceCat("Infobox avec une légende locale et une image sur Wikidata") end -- taille avec "size" (obsolète) size = size or getValue(params.sizeparameter) or params.defaultsize -- deprecated if size then local sizevalue = size:gsub('px$', '') local widthonly = mw.ustring.gsub(sizevalue, 'x.*', '') widthonly = tonumber(widthonly) if type(widthonly) ~= 'number' or widthonly > 280 then addMaintenanceCat("Infobox avec une image trop grande") end if tonumber(sizevalue) then size = tostring( tonumber(sizevalue) ) .. 'px' end end if tonumber(upright) then upright = tostring( tonumber(upright) ) end local style = params.style or {padding ='2px 0',} -- Partie image local imagesString = '' for i,image in pairs(images) do if image == '-' then return end imagesString = imagesString .. '[[Fichye:' .. image .. '|frameless' if size then imagesString = imagesString .. '|' .. size -- not a mistake, parameter is unnamed end if classe then imagesString = imagesString .. '|class=' .. classe end if alt then imagesString = imagesString .. '|alt=' .. alt end if link then imagesString = imagesString .. '|link=' .. link end if upright then imagesString = imagesString .. '|upright=' .. upright elseif #images > 1 and not size then imagesString = imagesString .. '|upright=' .. ( 1 / #images ) end if image:sub(-4):lower() == '.svg' then imagesString = imagesString .. '|lang=' .. wikiLang end imagesString = imagesString .. ']]' if usedImages[image] then addMaintenanceCat('Infobox avec plusieurs images identiques') end usedImages[image] = true end local image = mw.html.create('div') :addClass("images") :css(style) :wikitext(imagesString) -- Partie légende local captionobj if caption then captionobj = mw.html.create('div') :wikitext(caption) :css(params.legendstyle or {}) :addClass("legend") :done() end -- séparateur local separator if params.separator then separator = p.separator(params) end return mw.html.create('div') :node(image) :node(captionobj) :node(separator) :done() end p.buildImages = p.buildimages function p.buildtext(params) local classes = params.class or '' local style = { ['text-align'] = 'center', ['font-weight'] = 'bold' } if params.style then for i, j in pairs(params.style) do style[i] = j end end local text = getValue(params.value, params) or getWikidataValue(params) or params.defaultvalue if text == '-' then return end if not text then if params.maintenancecat then addMaintenanceCat(params.maintenancecat, params.sortkey) end return nil end -- séparateur local separator if params.separator then separator = p.separator(params) end local formattedtext = mw.html.create('p') :addClass(classes) :css(style) :wikitext(text) :node(separator) :done() return formattedtext end p.buildText = p.buildtext function p.buildrow(params) local classes = params.class or '' local style = params.style or {} local valueClass = params.valueClass or '' local valueStyle = params.valueStyle or {} local value, gendernum = getValue(params.value, params) if(type(gendernum) == 'number') then if(gendernum > 1) then gendernum = 'p' else gendernum = 's' end end if type(params.wikidata) == 'table' then params.wikidata.wikidatalang = localdata.wikidatalang if (value == valueexpl) then value = nil params.wikidata.expl = false end end if (not value) then value, gendernum = getWikidataValue(params, 'wikidata') end if not value then value = params.defaultvalue end if value == '-' then return nil end if not gendernum then gendernum = 's' --singulier indéfini end if not value then if params.maintenancecat then addMaintenanceCat(params.maintenancecat, params.sortkey) end return nil end local label = params.label if type(label) == 'string' then label = {default = label} end if type(label) == 'table' then -- Accord en genre et en nombre local onlynum = {default = 'default', s = 's', ms = 's', fs = 's', p = 'p', mp = 'p', fp = 'p', mixtep = 'p'} -- Accord seulement en nombre par défaut label['s'] = label['s'] or params.singularlabel or label['default'] or label['ms'] label['p'] = label['p'] or params.plurallabel or label['mp'] label = label[gendernum] or label[onlynum[gendernum]] or label.default end if type(label) == 'function' then label = label(localdata, localdata.item) end -- format local formattedvalue = mw.html.create('div') :wikitext('\n' .. value) -- Le '\n' est requis lorsque value est une liste commençant par '*' ou '#' if (params.hidden == true)then formattedvalue :attr({class="NavContent", style="display: none; text-align: left;"}) formattedvalue = mw.html.create('div') :attr({class="NavFrame", title="[Afiche]/[Maske]", style="border: none; padding: 0;"}) :node(formattedvalue) end formattedvalue = mw.html.create('td') :node(formattedvalue) :addClass(valueClass) :css(valueStyle) :allDone() local formattedlabel if label then formattedlabel = mw.html.create('th') :attr('scope', 'row') :wikitext(label) :done() end local row = mw.html.create('tr') :addClass(classes) :css(style) :node(formattedlabel) :node(formattedvalue) :done() return row end p.buildRow = p.buildrow function p.buildsuccession(params) if not params.value then return nil end --local style = params.style or {} --style['text-align'] = style['text-align'] or 'center' --style['color'] = style['color'] or '#000000' --style['background-color'] = style['background-color'] or '#F9F9F9' local rowI = mw.html.create('tr') local styleI = {} local colspan = '2' styleI['padding'] = '1px' local cellI = mw.html.create('td') :attr({colspan = colspan}) :attr({align = 'center'}) :css(styleI) local styleT = { margin = '0px', ['background-color'] = 'transparent', color = 'inherit', width = '100%' } local tabC = mw.html.create('table') :attr({cellspacing = '0'}) :addClass('navigation-not-searchable') :css(styleT) local row = mw.html.create('tr') local color = params.color local style = {} local arrowLeft = '[[Fichye:Arrleft.svg|13px|alt=Anvan|link=]]' local arrowRight = '[[Fichye:Arrright.svg|13px|alt=Aprè|link=]]' if color ~= 'default' then style['background-color'] = color end local styleTrans = {} local values = params.value local before = values['before'] local center = values['center'] local after = values['after'] local widthCenter local widthCell = '44%' if center then widthCenter = '28%' widthCell = '29%' end local formattedbefore if before then formattedbefore = mw.html.create('td') :attr({valign = 'middle'}) :attr({align = 'left'}) :attr({width = '5%'}) :css(style) :wikitext(arrowLeft) :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(style) :wikitext('') :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({align = 'left'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(style) :wikitext(before) :done() row:node(formattedbefore) else formattedbefore = mw.html.create('td') :attr({valign = 'middle'}) :attr({align = 'left'}) :attr({width = '5%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({align = 'left'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) end local formattedcenter formattedcenter = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedcenter) if center then formattedcenter = mw.html.create('td') :attr({align = 'center'}) :attr({valign = 'middle'}) :attr({width = widthCenter}) :css(style) :wikitext(center) :done() row:node(formattedcenter) formattedcenter = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedcenter) end local formattedafter if after then formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(style) :wikitext(after) :done() row:node(formattedafter) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(style) :wikitext('') :done() row:node(formattedbefore) formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = '5%'}) :css(style) :wikitext(arrowRight) :done() row:node(formattedafter) else formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(styleTrans) :wikitext('') :done() row:node(formattedafter) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = '5%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedafter) end row:done() tabC:node(row) tabC:done() cellI:node(tabC) cellI:done() rowI:node(cellI) rowI:allDone() return rowI end p.buildSuccession = p.buildsuccession function p.buildrow1col(params) if not params.value then return nil end --local style = params.style or {} --style['text-align'] = style['text-align'] or 'center' --style['color'] = style['color'] or '#000000' --style['background-color'] = style['background-color'] or '#F9F9F9' local classes = params.class local rowcolor if params.color == 'secondcolor' then rowcolor = secondcolor else rowcolor = params.color end local style = {} style['padding'] = '4px' style['text-align'] = 'center' style['background-color'] = rowcolor or 'var(--couleur-fond-boite-grise, #f9f9f9)' style['color'] = 'var(--color-emphasized, #000000)' local text = params.value local colspan ='2' local formattedlabel formattedlabel = mw.html.create('th') :attr({colspan = colspan}) :css(style) :wikitext(text) :done() local row = mw.html.create('tr') :addClass(classes) :css(style) :node(formattedlabel) :done() return row end p.buildRow1Col = p.buildrow1col function p.buildtable(params) local tab = mw.html.create('table'):css(params.style or {}) local rows = params.rows -- expand parameters so that we have a list of tables local i = 1 while (i <= #rows) do local l = rows[i] if type(l) == 'function' then l = l(localdata, localdata.item) end if (type(l) == 'table') and (l.type == 'multi') then table.remove(rows, i) for j, row in ipairs(l.rows) do table.insert(rows, i + j - 1, row) end elseif type(l) == 'nil' then table.remove(rows, i) elseif type(l) ~= 'table' then return error('les lignes d\'infobox ("rows") doivent être des tables, est ' .. type(l)) else i = i + 1 end end -- CREATE ROW local expandedrows = {} for k, row in ipairs(rows) do local v = p.buildblock(row) if v then table.insert(expandedrows, v) end end if (#expandedrows == 0) then return nil end rows = expandedrows -- ADD TITLE local title if params.title or params.singulartitle or params.pluraltitle then local text if #rows > 1 and params.pluraltitle then text = params.pluraltitle elseif #rows == 1 and params.singulartitle then text = params.singulartitle else text = params.title end local style = params.titlestyle or {} style['text-align'] = style['text-align'] or 'center' style['color'] = style['color'] or thirdcolor style['background-color'] = style['background-color'] or maincolor local colspan ='2' title = mw.html.create('caption') :attr({colspan = colspan}) :css(style) :wikitext(text) :done() end if title then tab:node(title) end for i, j in pairs (rows) do tab:node(j) end if params.separator then local separator = p.separator(params) tab:node(separator) end tab:allDone() return tab end p.buildTable = p.buildtable function p.buildinvalidblock(args) addMaintenanceCat(i18n['default cat']) local text = '' if type(args) ~= 'table' then text = "Les blocs d'infobox doivent être des tables" else text = i18n["invalid block type"] .. ' : ' .. (args.type or '??') end return text end p.buildInvalidBlock = p.buildinvalidblock function p.buildmap(params) -- paramètre d'affichage local maplist = getValue(params.maps) local pointtype = params.pointtype local maptype = params.maptype -- choisit le type de carte le plus approprié (relief, administratif, etc.) if type(maplist) == 'function' then maplist = maplist(localdata, localdata.item) end local width = tonumber(params.width) or 280 if width > 280 then addMaintenanceCat("Infobox avec une image trop grande") return 'image trop grande, la largeur doit être inférieure ou égale à 280px' end -- récupération des données locales local pointtable = {} local globe = params.globe if params.latitude then local lat, long if type(params.latitude) == 'function' then lat, long = params.latitude(localdata, localdata.item), params.longitude(localdata, localdata.item) else lat, long = localdata[params.latitude], localdata[params.longitude] end if lat then table.insert(pointtable, {latitude = lat, longitude = long}) end end -- récupération des données wikidata local function processWDval(claim, displayformat) if not claim then return nil end local val = wd.formatSnak( claim.mainsnak ) return {latitude = val.latitude, longitude = val.longitude, globe = val.globe, marker = displayformat.marker} end local function getWDvals(query) query.excludespecial = true query.numval = query.numval or 1 query.entity = query.entity or localdata.item local claims = wd.getClaims(query) if (not claims) then return end for i, claim in ipairs(claims) do claim = processWDval(claim, query) table.insert(pointtable, claim) end end if (#pointtable == 0) and localdata.item and params.wikidata and (params.wikidata ~= '-') then for i, query in ipairs(params.wikidata) do if type(query) == 'function' then query = query() end if query then getWDvals(query) end end end if (not pointtable) or (#pointtable == 0) then return nil end local newparams = {maplist = maplist, pointtype = pointtype, maptype = maptype, width = width, item = localdata.item, pointtable = pointtable, globe = globe, marker=params.marker, default_zoom=params.default_zoom, ids = params.ids, markercolor = params.markercolor, shapecolor = params.shapecolor } if params.params and type(params.params) == 'table' then -- paramètres additionnels for i, j in pairs(params.params) do newparams[i] = j end end return require('Module:Carte').multimap(newparams) end p.buildMap = p.buildmap function p.buildexternaltext(params) local value = getValue(params.value) if value and (type(value) == 'string') then externaltext = externaltext .. value end end p.buildExternalText = p.buildexternaltext function p.buildfooter(params) if not params then params = {} end local classes = 'navbar noprint bordered navigation-not-searchable ' .. (params.class or '') local style = params.style or {} style['border-top'] = style['border-top'] or '1px solid ' .. maincolor local backlinkstr = '[' .. tostring( mw.uri.fullUrl( page.prefixedText, 'veaction=edit&section=0' ) ) .. ' ' .. i18n['edit'] .. ']' .. ' - [' .. tostring( mw.uri.fullUrl( page.prefixedText, 'action=edit&section=0' ) ) .. ' ' .. i18n['edit code'] .. ']' local itemlinkstr if localdata.item and localdata.item ~= '-' then itemlinkstr = '[[d:' .. localdata.item .. '|' .. i18n['edit item'] .. ']]' end local editstr = backlinkstr if itemlinkstr then editstr = editstr .. ' - ' .. itemlinkstr end local editlinkspan = mw.html.create('span') :css({['text-align'] = "left"}) :addClass('plainlinks') :wikitext(editstr) :done() local doclinkstr = '[[Fichye:Info Simple.svg|12px|link=' .. localdata.templatename .. '|' .. i18n['see doc'] .. ']]' -- si ce lien ne marche pas toujours, il faut ajouter un variable pour le nom de l'infobox récupéré par le frame local doclinkspan = mw.html.create('span') :css({['text-align'] = "right"}) :wikitext(doclinkstr) :done() local footer = mw.html.create('p') :addClass(classes) :css(style) :node(editlinkspan) :node(doclinkspan) return footer end p.buildFooter = p.buildfooter function p.buildblock(block) if type(block) == 'function' then block = block( localdata ) end local blocktypes = { -- list of functions for block buildings ['invalid'] = p.buildinvalidblock, ['external text'] = p.buildexternaltext, ['footer'] = p.buildfooter, ['images'] = p.buildimages, ['map']= p.buildmap, ['mixed'] = p.buildrow, ['navigator'] = p.buildnavigator, ['table'] = p.buildtable, ['row'] = p.buildrow, ['row1col'] = p.buildrow1col, ['succession'] = p.buildsuccession, ['text'] = p.buildtext, ['title'] = p.buildtitle, } if type(block) ~= 'table' or (not block.type) or (not blocktypes[block.type]) then return blocktypes['invalid'](block) end return blocktypes[block.type](block) end p.buildBlock = p.buildblock function p.build() localdata = require( 'Module:Infobox/Localdata' ) if type( localdata.item ) == 'table' then localdata.item = localdata.item.id end -- assign rank to the infobox, "secondary" means special formatting like no displaytitle for coordinates local infoboxrank = 'main' -- main infobox of the page, with coordinates displayed in title etc. if page.namespace ~= 0 then infoboxrank = 'secondary' end -- if infobox is linked to another item: rank = secondary if localdata.item then local itemlink = mw.wikibase.sitelink(localdata.item) local pagetitle = page.prefixedText if (itemlink or '') ~= pagetitle then infoboxrank = 'secondary' end end localdata.infoboxrank = infoboxrank -- load infobox module page local moduledata = require('Module:Infobox/' .. localdata.modulename) moduledata.name = localdata.modulename -- maintenance categories given by the module page if moduledata.categories then for i, j in pairs(moduledata.categories) do if (type(j) == 'string') then addMaintenanceCat(j) end if (type(j) == 'table') then addMaintenanceCat(j[1],j[2]) end end end -- defines main color maincolor = localdata['couleur infobox'] or localdata['couleur boîte'] or localdata['couleur boite'] or moduledata.maincolor or maincolor secondcolor = moduledata.secondcolor or secondcolor thirdcolor = localdata['texte noir'] or localdata['couleur texte'] or moduledata.thirdcolor or thirdcolor if ( #maincolor == 6 or #maincolor == 3 ) and maincolor:match( '^%x+$' ) then maincolor = '#' .. maincolor end if thirdcolor == 'oui' or thirdcolor == 'true' then thirdcolor = '#000' elseif thirdcolor == 'non' or thirdcolor == 'false' then thirdcolor = '#fff' end -- classes local classes = mw.getCurrentFrame():expandTemplate{ title = 'Classes début infobox', args = { version = '3' } } classes = classes .. ' large ' .. (moduledata.class or '') -- style local style = moduledata.style or {} -- build infobox infobox :addClass(classes) :css(style) for i, j in pairs( moduledata.parts ) do infobox:node( p.buildblock(j) ) end infobox :node(p.buildfooter(moduledata.footer)) :done() return tostring(infobox) .. externaltext, maintenance end return p br526059bfs7lt3vkf9a6dxce9gki3t 855647 855586 2024-11-13T00:26:25Z BwaKajou 31668 855647 Scribunto text/plain local p = {} local wikiLang = 'ht' local localdata = {}-- données concernant les paramètres passés au modèle -- données concernant la page où est affichée l'infobox local page = mw.title.getCurrentTitle() local maincolor, secondcolor, thirdcolor = 'var(--background-color-interactive-subtle, #f8f9fa)', 'var(--background-color-interactive-subtle, #f8f9fa)', 'var(--color-emphasized, #000000)' -- l'objet principal à retourner local infobox = mw.html.create('div') -- objets secondaires à retourner local maintenance = '' -- chaîne retournée avec le module : cats de maintenance local externaltext = '' -- par exemple coordonnées en titre -- modules importés local wd = require 'Module:Wikidata' local yesno = require 'Module:Yesno' local valueexpl = wd.translate("activate-query") -- maintenance des images dupliquées local usedImages = {} local i18n = { ['see doc'] = 'Documentation du modèle', ['edit'] = 'modifye', ['edit code'] = 'modifye kòd la', ['edit item'] = 'modifye Wikidata', ['tracking cat'] = "Paj ki itilize done Wikidata", ['invalid block type'] = "Bloc de données invalide dans le module d'infobox", ['default cat'] = "Antretyen infobox", } local function expandQuery(query) if not query.entity then query.entity = localdata.item end if not query.conjtype then query.conjtype = 'comma' end local claims = wd.getClaims(query) if (not claims) then return nil end return wd.formatAndCat(query), wd.getgendernum(claims) -- valeur et code indiquant le genre/nombre pour accorder le libellé end local function getWikidataValue(params, wikidataparam) -- Récupère la valeur Wikidata pour la valeur, soit dans le paramètre "wikidata" soit dans le paramètre "property" if not localdata.item then return nil end if params.blockers then -- blockers are local parameters that disable the wikidata query local blockers = params.blockers if (type(blockers) == 'string') then blockers = {blockers} end for i, blocker in ipairs(blockers) do if localdata[blocker] then return nil end end end local v, valgendernum -- la valeur à retourner, et le genre/nombre de de valeurs (pour l'accord grammatical) if not wikidataparam then -- par défaut la valeur wikidata est dans le paramètre "wikidata" mais dans les structures composées comme "title", il y a plusieurs paramètres wikidata wikidataparam = 'wikidata' end if params.property and not params[wikidataparam] then params[wikidataparam] = {property = params.property} end if params[wikidataparam] then if type(params[wikidataparam]) == 'function' then v, valgendernum = params[wikidataparam](localdata.item) elseif type(params[wikidataparam]) == 'table' then v, valgendernum = expandQuery(params[wikidataparam]) else v, valgendernum = params[wikidataparam] end end if not v then return nil end if(type(valgendernum) == 'number') then if(valgendernum > 1) then valgendernum = 'p' else valgendernum = 's' end end return v, valgendernum end local function getValue(val, params) if type(val) == 'string' then return localdata[val] elseif type(val) == 'function' then return val(localdata, localdata.item, params) elseif type(val) == 'table' then for i, j in pairs(val) do -- si plusieurs paramètres possibles (legacy de vieux code), prendre le premier non vide if localdata[j] then return localdata[j] end end end end local function addMaintenanceCat(cat, sortkey) if page.namespace ~= 0 then return '' end if cat then local sortkeycode if sortkey then sortkeycode = '|' .. sortkey else sortkeycode = '' end maintenance = maintenance .. '[[Category:'.. cat .. sortkeycode .. ']]' end end function p.separator(params) local style = params['separator style'] or {} style.height = style.height or '2px' style['background-color'] = style['background-color'] or maincolor return mw.html.create('hr'):css( style ) end --[=[ Construit le code du bloc de titre de l'infobox Paramètres (liste partielle) : - value : Moyen d'obtenir le titre via getValue (nom de paramètre de modèle ou fonction). - textdefaultvalue : Valeur par défaut du titre. - icon : Pictogramme d'infobox (voir [[Projet:Infobox/Pictogramme]]). - italic : Indique si le titre doit être affiché en italique. Si italic=true, le paramètre "titre en italique" de l'infobox peut forcer la désactivation. - setdisplaytitle : Indique si le titre de l'article doit être mis en forme comme celui de l'infobox. Si setdisplaytitle=true, le paramètre "titre article en italique" de l'infobox peut forcer la désactivation. ]=] function p.buildtitle(params) local text = getValue(params.value, params) or params.textdefaultvalue or getWikidataValue(params) or page.prefixedText local lang = localdata['langue du titre'] or '' if lang ~= '' then local langueFunction = require( 'Module:Langue' ).langue text = langueFunction( { lang, text } ) end local subtext = getValue(params.subtitle) or getWikidataValue(params, 'wikidatasubtitle') or params.subtitledefaultvalue if subtext and (subtext ~= text) then text = text .. '<br /><small>' .. subtext .. '</small>' end local icon = params.icon or '' if icon ~= '' and icon ~= 'defaut' then text = text .. mw.getCurrentFrame():extensionTag('templatestyles', '', {src = 'Infobox/Pictogramme/' .. mw.text.trim(icon) .. '.css'}) if not params.large then icon = 'icon ' .. icon end end local classes = 'entete ' .. icon local italic = params.italic and yesno(localdata['titre en italique'] or '', true, true) if italic then classes = classes .. ' italique' end if params.setdisplaytitle and yesno(localdata['titre article en italique'] or '', true, true) then local formatTitleModule = require( 'Module:Formatage du titre' ) text = text .. formatTitleModule.setDisplayTitle{ args = { lang = lang, italic = italic, options = 'noreplace', } } end -- overwrites with those provided in the module local style = {} style['background-color'] = maincolor style['color'] = thirdcolor if params.style then for i, j in pairs(params.style) do style[i] = j end end local title = mw.html.create('div') :addClass(classes) :css(style) :tag('div') :wikitext(text) :allDone() return title end p.buildTitle = p.buildtitle function p.buildnavigator(params) -- définition du style local classes = "overflow infobox-navigateur " .. (params.class or '') local style = params.style or {} if params.separated then -- options pour ajouter une ligne de séparation au dessus classes = classes .. ' bordered' style['border-top'] = '1px solid' .. maincolor end -- ajustement des paramètres de données params.previousval = params.previousval or params.previousparameter -- nom de paramètre obsolète params.nextval = params.nextval or params.nextparameter if params.previousproperty then params.previouswikidata = {property = params.previousproperty} end if params.nextproperty then params.nextwikidata = {property = params.nextproperty} end local previousval = getValue(params.previousval, params) or getWikidataValue(params, 'previouswikidata') local nextval = getValue(params.nextval, params) or getWikidataValue(params, 'nextwikidata') if previousval == '-' then previousval = nil end if nextval == '-' then nextval = nil end local navigator if params.inner then -- pour celles qui sont à l'intérieur d'une table navigator = mw.html.create('tr'):tag('th'):attr('colspan', 2) style['font-weight'] = style['font-weight'] or 'normal' else navigator = mw.html.create('div') end if previousval or nextval then navigator :addClass(classes) :css(style) :tag('div') :addClass('prev_bloc') :wikitext(previousval) :done() :tag('div') :addClass('next_bloc') :wikitext(nextval) :done() :allDone() return navigator end return nil end p.buildNavigator = p.buildnavigator function p.buildimages(params) local images = {} local upright, link, caption, classe, alt, size -- size is deprecated if type(params.imageparameters) == 'string' then params.imageparameters = {params.imageparameters} end if not params.imageparameters then -- s'il n'y a pas de paramètre image, continuer, peut-être y a-t-il une image par défaut définie dans le module d'infobox params.imageparameters = {} end for j, k in ipairs(params.imageparameters) do table.insert(images, localdata[k]) end -- Images de Wikidata local iswikidataimage, iswikidatacaption = false if #images == 0 and localdata.item then if params.property then params.wikidata = {entity = localdata.item, property = params.property} end if params.wikidata then local wdq = params.wikidata wdq.excludespecial = true if type(wdq) == 'table' then wdq.entity = wdq.entity or localdata.item wdq.numval = wdq.numval or params.numval or 1 images = wd.getClaims(wdq) end if type(wdq) == 'function' then images = params.wikidata() if type(images) == 'string' then return images end --c'est probablement une erreur dans la requête => afficher le message end if (not images) then images = {} end if (#images > 0) and (params.wikidata.property) then maintenance = maintenance .. wd.addTrackingCat(params.wikidata.property) end if type(images[1]) == 'table' then for i, image in pairs(images) do if image.mainsnak.snaktype ~= 'value' then return end if #images == 1 then -- si une seule image, on utilise la légende (si deux plusieurs images, comment mettre en forme ?) caption = wd.getFormattedQualifiers(images[i], {'P2096'}, {isinlang = wikiLang}) or wd.getFormattedQualifiers(images[i], {'P805'}) iswikidatacaption = caption ~= nil end images[i] = image.mainsnak.datavalue.value iswikidataimage = true end end end end if #images == 0 and getValue(params.captionparameter) ~= nil then addMaintenanceCat("Infobox avèk yon lejand lokal san imaj") end -- Images par défaut if #images == 0 then if params.maintenancecat then addMaintenanceCat(params.maintenancecat, params.sortkey) end if params.defaultimages then images = params.defaultimages if type(images) == 'string' then images = {images} end upright = params.defaultimageupright caption = params.defaultimagecaption link = params.defaultimagelink classe = params.defaultimageclass if not classe and ( images[1] == 'Defaut.svg' or images[1] == 'Defaut 2.svg' ) then classe = 'skin-invert notheme' end alt = params.defaultimagealt if not alt and ( images[1] == 'Defaut.svg' or images[1] == 'Defaut 2.svg' ) then alt = 'yon ilistarsyon sou lisans lib ap byenvini' end end end if #images == 0 then return nil end upright = upright or getValue(params.uprightparameter) or params.defaultupright or "1.2" link = link or getValue(params.linkparameter) or params.defaultlink caption = caption or getValue(params.captionparameter) or params.defaultcaption classe = classe or getValue( params.classparameter) or params.defaultclass alt = alt or getValue( params.altparameter) or params.defaultalt if iswikidataimage and not iswikidatacaption and getValue(params.captionparameter) ~= nil then addMaintenanceCat("Infobox avèk lejand lokal ak yon imaj sou Wikidata") end -- taille avec "size" (obsolète) size = size or getValue(params.sizeparameter) or params.defaultsize -- deprecated if size then local sizevalue = size:gsub('px$', '') local widthonly = mw.ustring.gsub(sizevalue, 'x.*', '') widthonly = tonumber(widthonly) if type(widthonly) ~= 'number' or widthonly > 280 then addMaintenanceCat("Infobox avèk yon imaj ki twò gwo") end if tonumber(sizevalue) then size = tostring( tonumber(sizevalue) ) .. 'px' end end if tonumber(upright) then upright = tostring( tonumber(upright) ) end local style = params.style or {padding ='2px 0',} -- Partie image local imagesString = '' for i,image in pairs(images) do if image == '-' then return end imagesString = imagesString .. '[[Fichye:' .. image .. '|frameless' if size then imagesString = imagesString .. '|' .. size -- not a mistake, parameter is unnamed end if classe then imagesString = imagesString .. '|class=' .. classe end if alt then imagesString = imagesString .. '|alt=' .. alt end if link then imagesString = imagesString .. '|link=' .. link end if upright then imagesString = imagesString .. '|upright=' .. upright elseif #images > 1 and not size then imagesString = imagesString .. '|upright=' .. ( 1 / #images ) end if image:sub(-4):lower() == '.svg' then imagesString = imagesString .. '|lang=' .. wikiLang end imagesString = imagesString .. ']]' if usedImages[image] then addMaintenanceCat('Infobox avèk plizyè imaj idantik') end usedImages[image] = true end local image = mw.html.create('div') :addClass("images") :css(style) :wikitext(imagesString) -- Partie légende local captionobj if caption then captionobj = mw.html.create('div') :wikitext(caption) :css(params.legendstyle or {}) :addClass("legend") :done() end -- séparateur local separator if params.separator then separator = p.separator(params) end return mw.html.create('div') :node(image) :node(captionobj) :node(separator) :done() end p.buildImages = p.buildimages function p.buildtext(params) local classes = params.class or '' local style = { ['text-align'] = 'center', ['font-weight'] = 'bold' } if params.style then for i, j in pairs(params.style) do style[i] = j end end local text = getValue(params.value, params) or getWikidataValue(params) or params.defaultvalue if text == '-' then return end if not text then if params.maintenancecat then addMaintenanceCat(params.maintenancecat, params.sortkey) end return nil end -- séparateur local separator if params.separator then separator = p.separator(params) end local formattedtext = mw.html.create('p') :addClass(classes) :css(style) :wikitext(text) :node(separator) :done() return formattedtext end p.buildText = p.buildtext function p.buildrow(params) local classes = params.class or '' local style = params.style or {} local valueClass = params.valueClass or '' local valueStyle = params.valueStyle or {} local value, gendernum = getValue(params.value, params) if(type(gendernum) == 'number') then if(gendernum > 1) then gendernum = 'p' else gendernum = 's' end end if type(params.wikidata) == 'table' then params.wikidata.wikidatalang = localdata.wikidatalang if (value == valueexpl) then value = nil params.wikidata.expl = false end end if (not value) then value, gendernum = getWikidataValue(params, 'wikidata') end if not value then value = params.defaultvalue end if value == '-' then return nil end if not gendernum then gendernum = 's' --singulier indéfini end if not value then if params.maintenancecat then addMaintenanceCat(params.maintenancecat, params.sortkey) end return nil end local label = params.label if type(label) == 'string' then label = {default = label} end if type(label) == 'table' then -- Accord en genre et en nombre local onlynum = {default = 'default', s = 's', ms = 's', fs = 's', p = 'p', mp = 'p', fp = 'p', mixtep = 'p'} -- Accord seulement en nombre par défaut label['s'] = label['s'] or params.singularlabel or label['default'] or label['ms'] label['p'] = label['p'] or params.plurallabel or label['mp'] label = label[gendernum] or label[onlynum[gendernum]] or label.default end if type(label) == 'function' then label = label(localdata, localdata.item) end -- format local formattedvalue = mw.html.create('div') :wikitext('\n' .. value) -- Le '\n' est requis lorsque value est une liste commençant par '*' ou '#' if (params.hidden == true)then formattedvalue :attr({class="NavContent", style="display: none; text-align: left;"}) formattedvalue = mw.html.create('div') :attr({class="NavFrame", title="[Afiche]/[Maske]", style="border: none; padding: 0;"}) :node(formattedvalue) end formattedvalue = mw.html.create('td') :node(formattedvalue) :addClass(valueClass) :css(valueStyle) :allDone() local formattedlabel if label then formattedlabel = mw.html.create('th') :attr('scope', 'row') :wikitext(label) :done() end local row = mw.html.create('tr') :addClass(classes) :css(style) :node(formattedlabel) :node(formattedvalue) :done() return row end p.buildRow = p.buildrow function p.buildsuccession(params) if not params.value then return nil end --local style = params.style or {} --style['text-align'] = style['text-align'] or 'center' --style['color'] = style['color'] or '#000000' --style['background-color'] = style['background-color'] or '#F9F9F9' local rowI = mw.html.create('tr') local styleI = {} local colspan = '2' styleI['padding'] = '1px' local cellI = mw.html.create('td') :attr({colspan = colspan}) :attr({align = 'center'}) :css(styleI) local styleT = { margin = '0px', ['background-color'] = 'transparent', color = 'inherit', width = '100%' } local tabC = mw.html.create('table') :attr({cellspacing = '0'}) :addClass('navigation-not-searchable') :css(styleT) local row = mw.html.create('tr') local color = params.color local style = {} local arrowLeft = '[[Fichye:Arrleft.svg|13px|alt=Anvan|link=]]' local arrowRight = '[[Fichye:Arrright.svg|13px|alt=Aprè|link=]]' if color ~= 'default' then style['background-color'] = color end local styleTrans = {} local values = params.value local before = values['before'] local center = values['center'] local after = values['after'] local widthCenter local widthCell = '44%' if center then widthCenter = '28%' widthCell = '29%' end local formattedbefore if before then formattedbefore = mw.html.create('td') :attr({valign = 'middle'}) :attr({align = 'left'}) :attr({width = '5%'}) :css(style) :wikitext(arrowLeft) :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(style) :wikitext('') :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({align = 'left'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(style) :wikitext(before) :done() row:node(formattedbefore) else formattedbefore = mw.html.create('td') :attr({valign = 'middle'}) :attr({align = 'left'}) :attr({width = '5%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({align = 'left'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) end local formattedcenter formattedcenter = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedcenter) if center then formattedcenter = mw.html.create('td') :attr({align = 'center'}) :attr({valign = 'middle'}) :attr({width = widthCenter}) :css(style) :wikitext(center) :done() row:node(formattedcenter) formattedcenter = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedcenter) end local formattedafter if after then formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(style) :wikitext(after) :done() row:node(formattedafter) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(style) :wikitext('') :done() row:node(formattedbefore) formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = '5%'}) :css(style) :wikitext(arrowRight) :done() row:node(formattedafter) else formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(styleTrans) :wikitext('') :done() row:node(formattedafter) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedbefore) formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = '5%'}) :css(styleTrans) :wikitext('') :done() row:node(formattedafter) end row:done() tabC:node(row) tabC:done() cellI:node(tabC) cellI:done() rowI:node(cellI) rowI:allDone() return rowI end p.buildSuccession = p.buildsuccession function p.buildrow1col(params) if not params.value then return nil end --local style = params.style or {} --style['text-align'] = style['text-align'] or 'center' --style['color'] = style['color'] or '#000000' --style['background-color'] = style['background-color'] or '#F9F9F9' local classes = params.class local rowcolor if params.color == 'secondcolor' then rowcolor = secondcolor else rowcolor = params.color end local style = {} style['padding'] = '4px' style['text-align'] = 'center' style['background-color'] = rowcolor or 'var(--couleur-fond-boite-grise, #f9f9f9)' style['color'] = 'var(--color-emphasized, #000000)' local text = params.value local colspan ='2' local formattedlabel formattedlabel = mw.html.create('th') :attr({colspan = colspan}) :css(style) :wikitext(text) :done() local row = mw.html.create('tr') :addClass(classes) :css(style) :node(formattedlabel) :done() return row end p.buildRow1Col = p.buildrow1col function p.buildtable(params) local tab = mw.html.create('table'):css(params.style or {}) local rows = params.rows -- expand parameters so that we have a list of tables local i = 1 while (i <= #rows) do local l = rows[i] if type(l) == 'function' then l = l(localdata, localdata.item) end if (type(l) == 'table') and (l.type == 'multi') then table.remove(rows, i) for j, row in ipairs(l.rows) do table.insert(rows, i + j - 1, row) end elseif type(l) == 'nil' then table.remove(rows, i) elseif type(l) ~= 'table' then return error('les lignes d\'infobox ("rows") doivent être des tables, est ' .. type(l)) else i = i + 1 end end -- CREATE ROW local expandedrows = {} for k, row in ipairs(rows) do local v = p.buildblock(row) if v then table.insert(expandedrows, v) end end if (#expandedrows == 0) then return nil end rows = expandedrows -- ADD TITLE local title if params.title or params.singulartitle or params.pluraltitle then local text if #rows > 1 and params.pluraltitle then text = params.pluraltitle elseif #rows == 1 and params.singulartitle then text = params.singulartitle else text = params.title end local style = params.titlestyle or {} style['text-align'] = style['text-align'] or 'center' style['color'] = style['color'] or thirdcolor style['background-color'] = style['background-color'] or maincolor local colspan ='2' title = mw.html.create('caption') :attr({colspan = colspan}) :css(style) :wikitext(text) :done() end if title then tab:node(title) end for i, j in pairs (rows) do tab:node(j) end if params.separator then local separator = p.separator(params) tab:node(separator) end tab:allDone() return tab end p.buildTable = p.buildtable function p.buildinvalidblock(args) addMaintenanceCat(i18n['default cat']) local text = '' if type(args) ~= 'table' then text = "Les blocs d'infobox doivent être des tables" else text = i18n["invalid block type"] .. ' : ' .. (args.type or '??') end return text end p.buildInvalidBlock = p.buildinvalidblock function p.buildmap(params) -- paramètre d'affichage local maplist = getValue(params.maps) local pointtype = params.pointtype local maptype = params.maptype -- choisit le type de carte le plus approprié (relief, administratif, etc.) if type(maplist) == 'function' then maplist = maplist(localdata, localdata.item) end local width = tonumber(params.width) or 280 if width > 280 then addMaintenanceCat("Infobox avec une image trop grande") return 'image trop grande, la largeur doit être inférieure ou égale à 280px' end -- récupération des données locales local pointtable = {} local globe = params.globe if params.latitude then local lat, long if type(params.latitude) == 'function' then lat, long = params.latitude(localdata, localdata.item), params.longitude(localdata, localdata.item) else lat, long = localdata[params.latitude], localdata[params.longitude] end if lat then table.insert(pointtable, {latitude = lat, longitude = long}) end end -- récupération des données wikidata local function processWDval(claim, displayformat) if not claim then return nil end local val = wd.formatSnak( claim.mainsnak ) return {latitude = val.latitude, longitude = val.longitude, globe = val.globe, marker = displayformat.marker} end local function getWDvals(query) query.excludespecial = true query.numval = query.numval or 1 query.entity = query.entity or localdata.item local claims = wd.getClaims(query) if (not claims) then return end for i, claim in ipairs(claims) do claim = processWDval(claim, query) table.insert(pointtable, claim) end end if (#pointtable == 0) and localdata.item and params.wikidata and (params.wikidata ~= '-') then for i, query in ipairs(params.wikidata) do if type(query) == 'function' then query = query() end if query then getWDvals(query) end end end if (not pointtable) or (#pointtable == 0) then return nil end local newparams = {maplist = maplist, pointtype = pointtype, maptype = maptype, width = width, item = localdata.item, pointtable = pointtable, globe = globe, marker=params.marker, default_zoom=params.default_zoom, ids = params.ids, markercolor = params.markercolor, shapecolor = params.shapecolor } if params.params and type(params.params) == 'table' then -- paramètres additionnels for i, j in pairs(params.params) do newparams[i] = j end end return require('Module:Carte').multimap(newparams) end p.buildMap = p.buildmap function p.buildexternaltext(params) local value = getValue(params.value) if value and (type(value) == 'string') then externaltext = externaltext .. value end end p.buildExternalText = p.buildexternaltext function p.buildfooter(params) if not params then params = {} end local classes = 'navbar noprint bordered navigation-not-searchable ' .. (params.class or '') local style = params.style or {} style['border-top'] = style['border-top'] or '1px solid ' .. maincolor local backlinkstr = '[' .. tostring( mw.uri.fullUrl( page.prefixedText, 'veaction=edit&section=0' ) ) .. ' ' .. i18n['edit'] .. ']' .. ' - [' .. tostring( mw.uri.fullUrl( page.prefixedText, 'action=edit&section=0' ) ) .. ' ' .. i18n['edit code'] .. ']' local itemlinkstr if localdata.item and localdata.item ~= '-' then itemlinkstr = '[[d:' .. localdata.item .. '|' .. i18n['edit item'] .. ']]' end local editstr = backlinkstr if itemlinkstr then editstr = editstr .. ' - ' .. itemlinkstr end local editlinkspan = mw.html.create('span') :css({['text-align'] = "left"}) :addClass('plainlinks') :wikitext(editstr) :done() local doclinkstr = '[[Fichye:Info Simple.svg|12px|link=' .. localdata.templatename .. '|' .. i18n['see doc'] .. ']]' -- si ce lien ne marche pas toujours, il faut ajouter un variable pour le nom de l'infobox récupéré par le frame local doclinkspan = mw.html.create('span') :css({['text-align'] = "right"}) :wikitext(doclinkstr) :done() local footer = mw.html.create('p') :addClass(classes) :css(style) :node(editlinkspan) :node(doclinkspan) return footer end p.buildFooter = p.buildfooter function p.buildblock(block) if type(block) == 'function' then block = block( localdata ) end local blocktypes = { -- list of functions for block buildings ['invalid'] = p.buildinvalidblock, ['external text'] = p.buildexternaltext, ['footer'] = p.buildfooter, ['images'] = p.buildimages, ['map']= p.buildmap, ['mixed'] = p.buildrow, ['navigator'] = p.buildnavigator, ['table'] = p.buildtable, ['row'] = p.buildrow, ['row1col'] = p.buildrow1col, ['succession'] = p.buildsuccession, ['text'] = p.buildtext, ['title'] = p.buildtitle, } if type(block) ~= 'table' or (not block.type) or (not blocktypes[block.type]) then return blocktypes['invalid'](block) end return blocktypes[block.type](block) end p.buildBlock = p.buildblock function p.build() localdata = require( 'Module:Infobox/Localdata' ) if type( localdata.item ) == 'table' then localdata.item = localdata.item.id end -- assign rank to the infobox, "secondary" means special formatting like no displaytitle for coordinates local infoboxrank = 'main' -- main infobox of the page, with coordinates displayed in title etc. if page.namespace ~= 0 then infoboxrank = 'secondary' end -- if infobox is linked to another item: rank = secondary if localdata.item then local itemlink = mw.wikibase.sitelink(localdata.item) local pagetitle = page.prefixedText if (itemlink or '') ~= pagetitle then infoboxrank = 'secondary' end end localdata.infoboxrank = infoboxrank -- load infobox module page local moduledata = require('Module:Infobox/' .. localdata.modulename) moduledata.name = localdata.modulename -- maintenance categories given by the module page if moduledata.categories then for i, j in pairs(moduledata.categories) do if (type(j) == 'string') then addMaintenanceCat(j) end if (type(j) == 'table') then addMaintenanceCat(j[1],j[2]) end end end -- defines main color maincolor = localdata['couleur infobox'] or localdata['couleur boîte'] or localdata['couleur boite'] or moduledata.maincolor or maincolor secondcolor = moduledata.secondcolor or secondcolor thirdcolor = localdata['texte noir'] or localdata['couleur texte'] or moduledata.thirdcolor or thirdcolor if ( #maincolor == 6 or #maincolor == 3 ) and maincolor:match( '^%x+$' ) then maincolor = '#' .. maincolor end if thirdcolor == 'oui' or thirdcolor == 'true' then thirdcolor = '#000' elseif thirdcolor == 'non' or thirdcolor == 'false' then thirdcolor = '#fff' end -- classes local classes = mw.getCurrentFrame():expandTemplate{ title = 'Classes début infobox', args = { version = '3' } } classes = classes .. ' large ' .. (moduledata.class or '') -- style local style = moduledata.style or {} -- build infobox infobox :addClass(classes) :css(style) for i, j in pairs( moduledata.parts ) do infobox:node( p.buildblock(j) ) end infobox :node(p.buildfooter(moduledata.footer)) :done() return tostring(infobox) .. externaltext, maintenance end return p 5ttbq23gq4qnkyyaf2b4zxwqoaex5xj Module:Wikidata 828 64455 855593 854323 2024-11-12T16:16:10Z BwaKajou 31668 855593 Scribunto text/plain --script that retrieves basic data stored in Wikidata, for the datamodel, see https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua local wd = {} -- creation of a subobject to store comparison funtions, used for sorting claims -- to be able to build more complex sorts like topological sorts wd.compare = {} local databases = { } local modules = { } local databasesNames = { -- modules de données statiques pouvant être appelés avec mw.loadData(), ne nécessitant pas require() i18n = 'Module:Wikidata/I18n', globes = 'Module:Wikidata/Globes', langhierarchy = 'Module:Wikidata/Hiérarchie des langues', langcodes = 'Module:Dictionnaire Wikidata/Codes langue', -- big, infrequently useda invertedlangcodes = 'Module:Dictionnaire Wikidata/Codes langue/inversé' } local modulesNames = { reference = 'Module:Wikidata/Références', linguistic = 'Module:Linguistique', datemodule = 'Module:Date', formatDate = 'Module:Date complexe', formatNum = 'Module:Conversion', langmodule = 'Module:Langue', cite = 'Module:Biblio', weblink = 'Module:Weblink' } local function loadDatabase( t, key ) if databasesNames[key] then local m = mw.loadData( databasesNames[key] ) t[key] = m return m end end local function loadModule( t, key ) if modulesNames[key] then local m = require( modulesNames[key] ) t[key] = m return m end end setmetatable( databases, { __index = loadDatabase } ) setmetatable( modules, { __index = loadModule } ) -- ainsi le require() sera opéré seulement si nécessaire par modules.(nom du module) local datequalifiers = {'P585', 'P571', 'P580', 'P582', 'P1319', 'P1326'} -- === I18n === local defaultlang = mw.getContentLanguage():getCode() function wd.translate(str, rep1, rep2) str = databases.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 local function addCat(cat, sortkey) if sortkey then return '[[Category:' .. cat .. '|' .. sortkey .. ']]' end return '[[Category:' .. cat .. ']]' end local function formatError( key , category, debug) if debug then return error(databases.i18n[key] or key) end if category then return addCat(category, key) else return addCat('cat-unsorted-issue', key) end end -- function wd.isSpecial(snak) return (snak.snaktype ~= 'value') end function wd.getId(snak) if (snak.snaktype == 'value') then return 'Q' .. snak.datavalue.value['numeric-id'] end end function wd.getNumericId(snak) if (snak.snaktype == 'value') then return snak.datavalue.value['numeric-id'] end end function wd.getMainId(claim) return wd.getId(claim.mainsnak) end function wd.entityId(entity) if type(entity) == 'string' then return entity elseif type(entity) == 'table' then return entity.id end end function wd.getEntityIdForCurrentPage() return mw.wikibase.getEntityIdForCurrentPage() end -- function that returns true if the "qid" parameter is the qid -- of the item that is linked to the calling page function wd.isPageOfQId(qid) local self_id = mw.wikibase.getEntityIdForCurrentPage() return self_id ~= nil and qid == self_id end function wd.getEntity( val ) if type(val) == 'table' then return val end if val == '-' then return nil end if val == '' then val = nil end return mw.wikibase.getEntity(val) end function wd.splitStr(val) -- transforme en table les chaînes venant du Wikitexte qui utilisent des virgules de séparation if type(val) == 'string' then val = mw.text.split(val, ",") end return val end function wd.isHere(searchset, val, matchfunction) for i, j in pairs(searchset) do if matchfunction then if matchfunction(val,j) then return true end else if val == j then return true end end end return false end local function wikidataLink(entity) local name =':d:' if type(entity) == 'string' then if entity:match("P[0-9+]") then entity = "Property:" .. entity end return name .. entity elseif type(entity) == 'table' then if entity["tip"] == "property" then name = ":d:Property:" end return name .. entity.id elseif type(entity) == nil then return formatError('entity-not-found') end end function wd.siteLink(entity, project, lang) -- returns 3 values: a sitelink (with the relevant prefix) a project name and a language lang = lang or defaultlang if (type(project) ~= 'string') then project = 'wiki' end project = project:lower() if project == 'wikipedia' then project = 'wiki' end if type(entity) == 'string' and (project == 'wiki') and ( (not lang or lang == defaultlang) ) then -- évite de charger l'élément entier local link = mw.wikibase.getSitelink(entity) if link then local test_redirect = mw.title.new(link) -- remplacement des redirections (retirer si trop coûteux) if test_redirect.isRedirect and test_redirect.redirectTarget then link = test_redirect.redirectTarget.fullText end end return link, 'wiki', defaultlang end if project == 'wikidata' then return wikidataLink(entity), 'wikidata' end local projects = { -- nom = {préfixe sur Wikidata, préfix pour les liens sur Wikipédia, ajouter préfixe de langue} wiki = {'wiki', nil, true}, -- wikipedia commons = {'commonswiki', 'commons', false}, commonswiki = {'commonswiki', 'commons', false}, wikiquote = {'wikiquote', 'q', true}, wikivoyage = {'wikivoyage', 'voy', true}, wikibooks = {'wikibooks', 'b', true}, wikinews = {'wikinews', 'n', true}, wikiversity = {'wikiversity', 'v', true}, wikisource = {'wikisource', 's', true}, wiktionary = {'wiktionary', 'wikt', true}, specieswiki = {'specieswiki', 'species', false}, metawiki = {'metawiki', 'm', false}, incubator = {'incubator', 'incubator', false}, outreach = {'outreach', 'outreach', false}, mediawiki = {'mediawiki', 'mw', false} } local entityid = entity.id or entity local projectdata = projects[project:lower()] if not projectdata then -- defaultlink might be in the form "dewiki" rather than "project: 'wiki', lang: 'de' " for k, v in pairs(projects) do if project:match( k .. '$' ) and mw.language.isKnownLanguageTag(project:sub(1, #project-#k)) then lang = project:sub(1, #project-#k) project = project:sub(#lang + 1, #project) projectdata = projects[project] break end end if not mw.language.isKnownLanguageTag(lang) then return --formatError('invalid-project-code', projet or 'nil') end end if not projectdata then return -- formatError('invalid-project-code', projet or 'nil') end local linkcode = projectdata[1] local prefix = projectdata[2] local multiversion = projectdata[3] if multiversion then linkcode = lang .. linkcode end local link = mw.wikibase.getSitelink(entityid, linkcode) if not link then return nil end if prefix then link = prefix .. ':' .. link end if multiversion then link = ':' .. lang .. ':' .. link end return link, project, lang end -- add new values to a list, avoiding duplicates function wd.addNewValues(olditems, newitems, maxnum, stopval) if not newitems then return olditems end for _, qid in pairs(newitems) do if stopval and (qid == stopval) then table.insert(olditems, qid) return olditems end if maxnum and (#olditems >= maxnum) then return olditems end if not wd.isHere(olditems, qid) then table.insert(olditems, qid) end end return olditems end --=== FILTER CLAIMS ACCORDING TO VARIOUS CRITERIA : FUNCTION GETCLAIMS et alii === local function notSpecial(claim) local type if claim.mainsnak ~= nil then type = claim.mainsnak.snaktype else -- condition respectée quand showonlyqualifier est un paramètre renseigné -- dans ce cas, claim n'est pas une déclaration entière, mais UNE snak qualifiée du main snak type = claim.snaktype end return type == 'value' end local function hasTargetValue(claim, targets) -- retourne true si la valeur est dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial local id = wd.getMainId(claim) local targets = wd.splitStr(targets) return wd.isHere(targets, id) or wd.isSpecial(claim.mainsnak) end local function excludeValues(claim, values) -- true si la valeur n'est pas dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial) return wd.isSpecial(claim.mainsnak) or not ( hasTargetValue(claim, values) ) end local function hasTargetClass(claim, targets, maxdepth) -- retourne true si la valeur est une instance d'une classe dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial local id = wd.getMainId(claim) local targets = wd.splitStr(targets) local maxdepth = maxdepth or 10 local matchfunction = function(value, target) return wd.isInstance(target, value, maxdepth) end return wd.isHere(targets, id, matchfunction) or wd.isSpecial(claim.mainsnak) end local function excludeClasses(claim, classes) -- true si la valeur n'est pas une instance d'une classe dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial) return wd.isSpecial(claim.mainsnak) or not ( hasTargetClass(claim, classes, maxdepth) ) end local function hasTargetSuperclass(claim, targets, maxdepth) -- retourne true si la valeur est une sous-classe d'une classe dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial local id = wd.getMainId(claim) local targets = wd.splitStr(targets) local maxdepth = maxdepth or 10 local matchfunction = function(value, target) return wd.isSubclass(target, value, maxdepth) end return wd.isHere(targets, id, matchfunction) or wd.isSpecial(claim.mainsnak) end local function excludeSuperclasses(claim, classes) -- true si la valeur n'est pas une sous-classe d'une classe dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial) return wd.isSpecial(claim.mainsnak) or not ( hasTargetSuperclass(claim, classes, maxdepth) ) end local function bestRanked(claims) if not claims then return nil end local preferred, normal = {}, {} for i, j in pairs(claims) do if j.rank == 'preferred' then table.insert(preferred, j) elseif j.rank == 'normal' then table.insert(normal, j) end end if #preferred > 0 then return preferred else return normal end end local function withRank(claims, target) if target == 'best' then return bestRanked(claims) end local newclaims = {} for pos, claim in pairs(claims) do if target == 'valid' then if claim.rank ~= 'deprecated' then table.insert(newclaims, claim) end elseif claim.rank == target then table.insert(newclaims, claim) end end return newclaims end function wd.hasQualifier(claim, acceptedqualifs, acceptedvals, excludequalifiervalues) local claimqualifs = claim.qualifiers if (not claimqualifs) then return false end acceptedqualifs = wd.splitStr(acceptedqualifs) acceptedvals = wd.splitStr( acceptedvals) local function ok(qualif) -- vérification pour un qualificatif individuel if not claimqualifs[qualif] then return false end if not (acceptedvals) then -- si aucune valeur spécifique n'est demandée, OK return true end for i, wanted in pairs(acceptedvals) do for j, actual in pairs(claimqualifs[qualif]) do if wd.getId(actual) == wanted then return true end end end end for i, qualif in pairs(acceptedqualifs) do if ok(qualif) then return true end end return false end function wd.hasQualifierNumber(claim, acceptedqualifs, acceptedvals, excludequalifiervalues) local claimqualifs = claim.qualifiers if (not claimqualifs) then return false end acceptedqualifs = wd.splitStr(acceptedqualifs) acceptedvals = wd.splitStr( acceptedvals) local function ok(qualif) -- vérification pour un qualificatif individuel if not claimqualifs[qualif] then return false end if not (acceptedvals) then -- si aucune valeur spécifique n'est demandée, OK return true end for i, wanted in pairs(acceptedvals) do for j, actual in pairs(claimqualifs[qualif]) do if mw.wikibase.renderSnak(actual) == wanted then return true end end end end for i, qualif in pairs(acceptedqualifs) do if ok(qualif) then return true end end return false end local function hasSource(claim, targetsource, sourceproperty) sourceproperty = sourceproperty or 'P248' if targetsource == "-" then return true end if (not claim.references) then return false end local candidates = claim.references[1].snaks[sourceproperty] -- les snaks utilisant la propriété demandée if (not candidates) then return false end if (targetsource == "any") then -- si n'importe quelle valeur est acceptée tant qu'elle utilise en ref la propriété demandée return true end targetsource = wd.splitStr(targetsource) for _, source in pairs(candidates) do local s = wd.getId(source) for i, target in pairs(targetsource) do if s == target then return true end end end return false end local function excludeQualifier(claim, qualifier, qualifiervalues) return not wd.hasQualifier(claim, qualifier, qualifiervalues) end function wd.hasDate(claim) if not claim then return false --error() ? end if wd.getDateFromQualif(claim, 'P585') or wd.getDateFromQualif(claim, 'P580') or wd.getDateFromQualif(claim, 'P582') then return true end return false end local function hasLink(claim, site, lang) if (claim.mainsnak.snaktype ~= 'value') then -- ne pas supprimer les valeurs spéciales, il y a une fonction dédiée pour ça return true end local id = wd.getMainId(claim) local link = wd.siteLink(id, site, lang) if link then return true end end local function isInLanguage(claim, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ? if type(lang) == 'table' then -- si c'est une table de language séparées par des virgules, on les accepte toutes for i, l in pairs(lang) do local v = isInLanguage(claim, l) if v then return true end end end if type(lang) ~= ('string') then return --? end if (lang == '-') then return true end if (lang == 'locallang') then lang = mw.getContentLanguage():getCode() end -- pour les monolingual text local snak = claim.mainsnak or claim if snak.snaktype == 'value' and snak.datavalue.type == 'monolingualtext' then if snak.datavalue.value.language == lang then return true end return false end -- pour les autres types de données : recherche dans les qualificatifs if (lang == 'ht') then lang = 'Q150' elseif (lang == 'en') then lang = 'Q1860' else lang = databases.invertedlangcodes[lang] end if claim.qualifiers and claim.qualifiers.P407 then if wd.hasQualifier(claim, {'P407'}, {lang}) then return true else return false end end return true -- si on ne ne sait pas la langue, on condière que c'est bon end local function firstVals(claims, numval) -- retourn les numval premières valeurs de la table claims local numval = tonumber(numval) or 0 -- raise a error if numval is not a positive integer ? if not claims then return nil end while (#claims > numval) do table.remove(claims) end return claims end local function lastVals(claims, numval2) -- retourn les valeurs de la table claims à partir de numval2 local numval2 = tonumber(numval2) or 0 -- raise a error if numval is not a positive integer ? if not claims then return nil end for i=1,numval2 do table.remove(claims, 1) end return claims end -- retourne les valeurs de la table claims à partir de removedupesdate, -- sans les dates en doublons avec conversion entre les calendrier julien et grégorien, -- ou uniquement en catégorisant si le paramètre removedupesdate est égale à 'cat' local function removeDupesDate(claims, removedupesdate) if not claims or #claims < 2 then return claims, '' end local cat = '' local newClaims = {} local newIsos = {} local function findIndex(searchset, val) -- similaire à wd.isHere mais retourne l'index de la valeur trouvée for i, j in pairs(searchset) do if val == j then return i end end return -1 end for _, claim in ipairs( claims ) do local snak = claim.mainsnak or claim if (snak.snaktype == 'value') and (snak.datatype == 'time') and snak.datavalue.value.precision >= 11 then -- s'il s'agit d'un time et que la précision est au moins l'année local iso = snak.datavalue.value.time _, _, iso = string.find(iso, "(+%d+-%d+-%d+T)") local deleteIfDuplicate = false if snak.datavalue.value.calendarmodel == 'http://www.wikidata.org/entity/Q1985727' then -- si la date est grégorienne if modules.formatDate.before('+1582', iso) then -- si avant 1582 on calcule la date julienne _, _, y, m, d = string.find(iso, "+(%d+)-(%d+)-(%d+)T") y, m , d = modules.datemodule.gregorianToJulian(y, m , d) if m < 10 then m = '0' .. m end if d < 10 then d = '0' .. d end iso = '+' .. y .. '-' .. m .. '-' .. d .. 'T' deleteIfDuplicate = true end local index = findIndex(newIsos, iso) if index >= 0 then -- si la date est déjà présente cat = cat .. '[[Catégorie:Article avec des dates identiques venant de wikidata dans le code de l\'infobox]]' if removedupesdate == "cat" then -- ne faire que catégoriser table.insert(newIsos, iso) table.insert(newClaims, claim) elseif not deleteIfDuplicate then -- supprimer l'autre date si la date courante n'a pas été convertie newClaims[index] = claim end -- sinon supprimer la date courante else -- pas de doublon table.insert(newIsos, iso) table.insert(newClaims, claim) end elseif snak.datavalue.value.calendarmodel == 'http://www.wikidata.org/entity/Q1985786' then -- si date julienne if not modules.formatDate.before('+1582', iso) then -- si après 1582 on calcule la date grégorienne _, _, y, m, d = string.find(iso, "+(%d+)-(%d+)-(%d+)T") y, m , d = modules.datemodule.julianToGregorian(y, m , d) if m < 10 then m = '0' .. m end if d < 10 then d = '0' .. d end iso = '+' .. y .. '-' .. m .. '-' .. d .. 'T' deleteIfDuplicate = true end local index = findIndex(newIsos, iso) if index >= 0 then -- si date déjà présente cat = cat .. '[[Catégorie:Article avec des dates identiques venant de wikidata dans le code de l\'infobox]]' if removedupesdate == "cat" then -- ne faire que catégoriser table.insert(newIsos, iso) table.insert(newClaims, claim) elseif not deleteIfDuplicate then -- supprimer l'autre date si la date courante n'a pas été convertie newClaims[index] = claim end -- sinon supprimer la date courante else -- pas de doublon table.insert(newIsos, iso) table.insert(newClaims, claim) end else -- autre calendrier table.insert(newIsos, iso) table.insert(newClaims, claim) end else -- précision insuffisante table.insert(newIsos, iso) table.insert(newClaims, claim) end end return newClaims, cat end local function timeFromQualifs(claim, qualifs) local claimqualifs = claim.qualifiers if not claimqualifs then return nil end for i, qualif in ipairs(qualifs or datequalifiers) do local vals = claimqualifs[qualif] if vals and (vals[1].snaktype == 'value') then return vals[1].datavalue.value.time, vals[1].datavalue.value.precision end end end local function atDate(claim, mydate) if mydate == "today" then mydate = os.date("!%Y-%m-%dT%TZ") end -- determines required precision depending on the atdate format local d = mw.text.split(mydate, "-") local myprecision if d[3] then myprecision = 11 -- day elseif d[2] then myprecision = 10 -- month else myprecision = 9 -- year end -- with point in time local d, storedprecision = timeFromQualifs(claim, {'P585'}) if d then return modules.formatDate.equal(mydate, d, math.min(myprecision, storedprecision)) end -- with start or end date -- TODO: precision local mindate = timeFromQualifs(claim, {'P580'}) local maxdate = timeFromQualifs(claim, {'P582'}) if modules.formatDate.before(mydate, mindate) and modules.formatDate.before(maxdate, mydate) then return true end return false end local function check(claim, condition) if type(condition) == 'function' then -- cas standard return condition(claim) end return formatError('invalid type', 'function', type(condition)) end local function minPrecision(claim, minprecision) local snak if claim.qualifiers then -- si une date est donnée en qualificatif, c'est elle qu'on utilise de préférence au mainsnak for i, j in ipairs(datequalifiers) do if claim.qualifiers[j] then snak = claim.qualifiers[j][1] break end end end if not snak then snak = claim.mainsnak or claim end if (snak.snaktype == 'value') and (snak.datatype == 'time') and (snak.datavalue.value.precision < minprecision) then return false end return true end function wd.sortClaims(claims, sorttype) if not claims then return nil end if wd.isHere({'chronological', 'order', 'inverted', 'age', 'ageinverted'}, sorttype) then return wd.chronoSort(claims, sorttype) elseif sorttype == 'ascending' then return wd.quantitySort(claims) elseif sorttype == 'descending' then return wd.quantitySort(claims, true) elseif type(sorttype) == 'function' then table.sort(claims, sorttype) return claims elseif type(sorttype) == 'string' and sorttype:sub(1, 1) == 'P' then return wd.numericPropertySort(claims, sorttype) end return claims end function wd.filterClaims(claims, args) --retire de la tables de claims celles qui sont éliminés par un des filters de la table des filters local function filter(condition, filterfunction, funargs) if not args[condition] then return end for i = #claims, 1, -1 do if not( filterfunction(claims[i], args[funargs[1]], args[funargs[2]], args[funargs[3]]) ) then table.remove(claims, i) end end end filter('isinlang', isInLanguage, {'isinlang'} ) filter('excludespecial', notSpecial, {} ) filter('condition', check, {'condition'} ) if claims[1] and claims[1].mainsnak then filter('targetvalue', hasTargetValue, {'targetvalue'} ) filter('targetclass', hasTargetClass, {'targetclass'} ) filter('targetsuperclass', hasTargetSuperclass, {'targetsuperclass'} ) filter('atdate', atDate, {'atdate'} ) filter('qualifier', wd.hasQualifier, {'qualifier', 'qualifiervalue'} ) filter('qualifiernumber', wd.hasQualifierNumber, {'qualifiernumber', 'qualifiernumbervalue'} ) filter('excludequalifier', excludeQualifier, {'excludequalifier', 'excludequalifiervalue'} ) filter('withsource', hasSource, {'withsource', 'sourceproperty'} ) filter('withdate', wd.hasDate, {} ) filter('excludevalues', excludeValues, {'excludevalues'}) filter('excludeclasses', excludeClasses, {'excludeclasses'}) filter('excludesuperclasses', excludeSuperclasses, {'excludesuperclasses'}) filter('withlink', hasLink, {'withlink', 'linklang'} ) filter('minprecision', minPrecision, {'minprecision'} ) claims = withRank(claims, args.rank or 'best') end if #claims == 0 then return nil end if args.sorttype then claims = wd.sortClaims(claims, args.sorttype) end if args.numval2 then claims = lastVals(claims, args.numval2) end if args.numval then claims = firstVals(claims, args.numval) end return claims end function wd.loadEntity(entity, cache) if type(entity) ~= 'table' then if cache then if not cache[entity] then cache[entity] = mw.wikibase.getEntity(entity) mw.log("cached") end return cache[entity] else if entity == '' or (entity == '-') then entity = nil end return mw.wikibase.getEntity(entity) end else return entity end end function wd.getClaims( args ) -- returns a table of the claims matching some conditions given in args if args.claims then -- if claims have already been set, return them return args.claims end local properties = args.property if type(properties) == 'string' then properties = wd.splitStr(string.upper(args.property)) end if not properties then return formatError( 'property-param-not-provided' ) end --Get entity local entity = args.entity if type(entity) == 'string' then if entity == '' then entity = nil end elseif type(entity) == 'table' then entity = entity.id end if (not entity) then entity = mw.wikibase.getEntityIdForCurrentPage() end if (not entity) or (entity == '-') or (entity == wd.translate('somevalue')) or (entity == modules.linguistic.ucfirst(wd.translate('somevalue'))) then return nil end if args.labelformat and args.labelformat == 'gendered' then local longgender = {m = 'male', f = 'female'} args.labelformat = longgender[wd.getgender(entity)] end local claims = {} if #properties == 1 then claims = mw.wikibase.getAllStatements(entity, properties[1]) -- do not use mw.wikibase.getBestStatements at this stage, as it may remove the best ranked values that match other criteria in the query else for i, prop in ipairs(properties) do local newclaims = mw.wikibase.getAllStatements(entity, prop) if newclaims and #newclaims > 0 then for j, claim in ipairs(newclaims) do table.insert(claims, claim) end end end end if (not claims) or (#claims == 0) then return nil end return wd.filterClaims(claims, args) end --=== ENTITY FORMATTING === function wd.getLabel(entity, lang1, lang2) if (not entity) then return nil -- ou option de gestion des erreurs ? end entity = entity.id or ( type(entity) == "string" and entity) if not(type(entity) == 'string') then return nil end lang1 = lang1 or defaultlang local str, lang --str : texte rendu, lang : langue de celui-ci if lang1 == defaultlang then -- le plus économique str, lang = mw.wikibase.getLabelWithLang(entity) -- le libellé peut être en français ou en anglais else str = mw.wikibase.getLabelByLang(entity, lang1) if str then lang = lang1 end end if str and (lang == lang1) then --pas de catégorie "à traduire" si on a obtenu un texte dans la langue désirée (normalement fr) return str end if lang2 then -- langue secondaire, avec catégorie "à traduire" str2 = mw.wikibase.getLabelByLang(entity, lang2) if str2 then lang = lang2 str = str2 end end if not str then --si ni lang1, ni lang2 ni l'anglais ne sont présents, parcours de la hiérarchie des langues for _, trylang in ipairs(databases.langhierarchy.codes) do str = mw.wikibase.getLabelByLang(entity, trylang) if str then lang = trylang break end end end if str then local translationCat = databases.i18n['to translate'] translationCat = translationCat .. (databases.langhierarchy.cattext[lang] or '') translationCat = addCat(translationCat) return str, translationCat end end function wd.formatEntity( entity, params ) if (not entity) then return nil --formatError('entity-not-found') end local id = entity if type(id) == 'table' then id = id.id end params = params or {} local lang = params.lang or defaultlang local speciallabels = params.speciallabels local displayformat = params.displayformat local labelformat = params.labelformat local labelformat2 = params.labelformat2 local defaultlabel = params.defaultlabel or id local linktype = params.link local defaultlink = params.defaultlink local defaultlinkquery = params.defaultlinkquery if speciallabels and speciallabels[id] then --speciallabels override the standard label + link combination return speciallabels[id] end if params.displayformat == 'raw' then return id end if params.labelformat == 'male' then labelformat = function(objectid) return wd.genderedlabel(objectid, 'm') end end if params.labelformat == 'female' then labelformat = function(objectid) return wd.genderedlabel(objectid, 'f') end end local label, translationCat if type(labelformat) == 'function' then -- sert à des cas particuliers label, translationCat = labelformat(entity) end if not label then label, translationCat = wd.getLabel(entity, lang, params.wikidatalang) end if type(labelformat2) == 'function' and label then -- sert à des cas particuliers label = labelformat2(label) end translationCat = translationCat or "" -- sera toujours ajoutée au résultat mais sera vide si la catégorie de maintenance n'est pas nécessaire if not label then if (defaultlabel == '-') then return nil end local link = wd.siteLink(id, 'wikidata') return '[[' .. link .. '|' .. id .. ']]' .. translationCat -- si pas de libellé, on met un lien vers Wikidata pour qu'on comprenne à quoi ça fait référence end -- détermination du fait qu'on soit ou non en train de rendre l'élément sur la page de son article local rendering_entity_on_its_page = wd.isPageOfQId(id) if (linktype == '-') or rendering_entity_on_its_page then return label .. translationCat end local link = wd.siteLink(entity, linktype, lang) -- defaultlinkquery will try to link to another page on this Wiki if (not link) and defaultlinkquery then if type(defaultlinkquery) == 'string' then defaultlinkquery = {property = defaultlinkquery} end defaultlinkquery.excludespecial = true defaultlinkquery.entity = entity local claims = wd.getClaims(defaultlinkquery) if claims then for i, j in pairs(claims) do local id = wd.getMainId(j) link = wd.siteLink(id, linktype, lang) if link then break end end end end if link then if link:match('^Category:') or link:match('^Catégorie:') then -- attention, le « é » est multibyte -- lier vers une catégorie au lieu de catégoriser link = ':' .. link end return '[[' .. link .. '|' .. label .. ']]' .. translationCat end -- if not link, you can use defaultlink: a sidelink to another Wikimedia project if (not defaultlink) then defaultlink = {'enwiki'} end if defaultlink and (defaultlink ~= '-') then local linktype local sidelink, site, langcode if type(defaultlink) == 'string' then defaultlink = {defaultlink} end for i, j in ipairs(defaultlink) do sidelink, site, langcode = wd.siteLink(entity, j, lang) if sidelink then break end end if not sidelink then sidelink, site = wd.siteLink(entity, 'wikidata') end local icon, class, title = site, nil, nil -- le texte affiché du lien if site == 'wiki' then icon, class, title = langcode, "indicateur-langue", wd.translate('see-another-language', mw.language.fetchLanguageName(langcode, defaultlang)) elseif site == 'wikidata' then icon, class, title = 'd', "indicateur-langue", wd.translate('see-wikidata') else title = wd.translate('see-another-project', site) end local val = '[[' .. sidelink .. '|' .. '<span class = "' .. (class or '').. '" title = "' .. (title or '') .. '">' .. icon .. '</span>]]' return label .. ' <small>(' .. val .. ')</small>' .. translationCat end return label .. translationCat end function wd.addTrackingCat(prop, cat) -- doit parfois être appelé par d'autres modules if type(prop) == 'table' then prop = prop[1] -- devrait logiquement toutes les ajouter end if not prop and not cat then return formatError("property-param-not-provided") end if not cat then cat = wd.translate('trackingcat', prop or 'P??') end return addCat(cat ) end local function unknownValue(snak, label) local str = label if type(str) == "function" then str = str(snak) end if (not str) then if snak.datatype == 'time' then str = wd.translate('sometime') else str = wd.translate('somevalue') end end if type(str) ~= "string" then return formatError(snak.datatype) end return str end local function noValue(displayformat) if not displayformat then return wd.translate('novalue') end if type(displayformat) == 'string' then return displayformat end return formatError() end local function getLangCode(entityid) return databases.langcodes[tonumber(entityid:sub(2))] end local function showLang(statement, maxLang) -- retourne le code langue entre paranthèse avant la valeur (par exemple pour les biblios et liens externes) local mainsnak = statement.mainsnak if mainsnak.snaktype ~= 'value' then return nil end local langlist = {} if mainsnak.datavalue.type == 'monolingualtext' then langlist = {mainsnak.datavalue.value.language} elseif (not statement.qualifiers) or (not statement.qualifiers.P407) then return else for i, j in pairs( statement.qualifiers.P407 ) do if j.snaktype == 'value' then local langentity = wd.getId(j) local langcode = getLangCode(langentity) table.insert(langlist, langcode) end end end if (#langlist > 1) or (#langlist == 1 and langlist[1] ~= defaultlang) then -- si c'est en français, pas besoin de le dire langlist.maxLang = maxLang return modules.langmodule.indicationMultilingue(langlist) end end -- === DATE HANDLING === local function fuzzydate(str, precision) -- ajoute le qualificatif "vers" à une date if not str then return nil end if (precision >= 11) or (precision == 7) or (precision == 6) then --dates avec jour, siècles, millénaires return "vers le " .. str end if (precision == 8) then --deseni ("ane ...") return "alantou " .. str end return "alantou " .. str end function wd.addStandardQualifs(str, statement) if (not statement) or (not statement.qualifiers) then return str end if not str then return error()-- what's that ? end if statement.qualifiers.P1480 then for i, j in pairs(statement.qualifiers.P1480) do local v = wd.getId(j) if (v == "Q21818619") then str = wd.translate('approximate-place', str) elseif (v == "Q18122778") or (v == "Q18912752") or (v == "Q56644435") or (v == "Q30230067") then str = wd.translate('uncertain-information', str) elseif (v == "Q5727902") then if (statement.mainsnak.datatype == 'time') then local datevalue = statement.mainsnak.datavalue if datevalue then str = fuzzydate(str, datevalue.value.precision) end else str = wd.translate('approximate-value', str) end end end end return str end local function rangeObject(begin, ending, params) --[[ objet comportant un timestamp pour le classement chronologique et deux dateobject (begin et ending) ]]-- local timestamp if begin then timestamp = begin.timestamp else timestamp = ending.timestamp end return {begin = begin, ending = ending, timestamp = timestamp, type = 'rangeobject'} end local function dateObject(orig, params) --[[ transforme un snak en un nouvel objet utilisable par Module:Date complexe {type = 'dateobject', timestamp = str, era = '+' ou '-', year = number, month = number, day = number, calendar = calendar} ]]-- if not params then params = {} end local newobj = modules.formatDate.splitDate(orig.time, orig.calendarmodel) newobj.precision = params.precision or orig.precision newobj.type = 'dateobject' return newobj end local function objectToText(obj, params) if obj.type == 'dateobject' then return modules.formatDate.simplestring(obj, params) elseif obj.type == 'rangeobject' then return modules.formatDate.daterange(obj.begin, obj.ending, params) end end function wd.getDateFromQualif(statement, qualif) if (not statement) or (not statement.qualifiers) or not (statement.qualifiers[qualif]) then return nil end local v = statement.qualifiers[qualif][1] if v.snaktype ~= 'value' then -- que faire dans ce cas ? return nil end return dateObject(v.datavalue.value) end function wd.getDate(statement) local period = wd.getDateFromQualif(statement, 'P585') -- retourne un dateobject if period then return period end local begin, ending = wd.getDateFromQualif(statement, 'P580'), wd.getDateFromQualif(statement, 'P582') if begin or ending then return rangeObject(begin, ending) -- retourne un rangeobject fait de deux dateobject end return nil end function wd.getFormattedDate(statement, params) if not statement then return nil end local str --cherche la date avec les qualifs P580/P582 local datetable = wd.getDate(statement) if datetable then str = objectToText(datetable, params) end -- puis limite intérieur / supérieur if not str then local start, ending = wd.getDateFromQualif(statement, 'P1319'), wd.getDateFromQualif(statement, 'P1326') str = modules.formatDate.between(start, ending, params) end -- sinon, le mainsnak, pour les données de type time if (not str) and (statement.mainsnak.datatype == 'time') then local mainsnak = statement.mainsnak if (mainsnak.snaktype == 'value') or (mainsnak.snaktype == 'somevalue') then str = wd.formatSnak(mainsnak, params) end end if str and params and (params.addstandardqualifs ~= '-') then str = wd.addStandardQualifs(str, statement) end return str end wd.compare.by_quantity = function(c1, c2) local v1 = wd.getDataValue(c1.mainsnak) local v2 = wd.getDataValue(c2.mainsnak) if not (v1 and v2) then return true end return v1 < v2 end --[[ tri chronologique générique : retourne une fonction de tri de liste de déclaration en fonction d’une fonction qui calcule la clé de tri et d’une fonction qui compare les clés de tri paramètres nommés: (appel type wikidata.compare.chrono_key_sort{sortKey="nom clé"}) sortKey (optionnel) : chaine, le nom de la clé utilisée pour un tri (pour éviter de rentrer en collision avec "dateSortKey" utilisé par chronoSort au besoin) snak_key_get_function : fonction qui calcule la valeur de la clé à partir d’un snak ou d’une déclaration, (obligatoire) le résultat n’est calculé qu’une fois et est stocké en cache dans claim[sortKey] key_compare_function : fonction de comparaison des clés calculées par snak_key_get_function (optionnel) --]] function wd.chrono_key_sort(arg) local snak_key_get_function = arg.snak_key_get_function local sortKey = arg.sortKey or "dateSortKey" local key_compare_function = arg.key_compare_function or function(c1, c2) return c1 < c2 end return function(claims) for _, claim in ipairs( claims ) do if not claim[sortKey] then local key = snak_key_get_function(claim) if key then claim[sortKey] = wd.compare.get_claim_date(key) else claim[sortKey] = 0 end end end table.sort( claims, function(c1, c2) return key_compare_function(c1[sortKey], c2[sortKey]) end ) return claims end end function wd.quantitySort(claims, inverted) local function sort(c1, c2) local v1 = wd.getDataValue(c1.mainsnak) local v2 = wd.getDataValue(c2.mainsnak) if not (v1 and v2) then return true end if inverted then return v2 < v1 end return v1 < v2 end table.sort(claims, sort ) return claims end function wd.compare.get_claim_date(claim, datetype) -- rend une date au format numérique pour faire des comparaisons local snak = claim.mainsnak or claim if datetype and datetype == 'personbirthdate' then -- fonctionne avec un claim dont la valeur est une personne dont on va rendre la date de naissance if (snak.snaktype == 'value') and (snak.datatype == 'wikibase-item') then local personid = wd.getId(snak) local birthclaims = wd.getClaims({ entity = personid, property = 'P569', numval = 1}) if birthclaims then return wd.compare.get_claim_date(birthclaims[1] or birthclaims) else return math.huge end else return math.huge end -- en cas de donnée manquante, valeur infinie qui entraîne le classement en fin de liste end local iso, datequalif, isonumber if (snak.snaktype == 'value') and (snak.datatype == 'time') then iso = snak.datavalue.value.time else for i, dqualif in ipairs(datequalifiers) do iso = timeFromQualifs(claim, {dqualif}) if iso then datequalif = dqualif break end end if not iso then return math.huge end end -- transformation en nombre (indication de la base car gsub retourne deux valeurs) isonumber = tonumber( iso:gsub( '(%d)%D', '%1' ), 10 ) -- ajustement de la date tenant compte du qualificatif dont elle est issue : un fait se terminant à une date est antérieur à un autre commençant à cette date if datequalif == 'P582' then --date de fin isonumber = isonumber - 2 elseif datequalif == 'P1326' then -- date au plus tard isonumber = isonumber - 1 elseif datequalif == 'P1319' then -- date au plus tôt isonumber = isonumber + 1 elseif datequalif == 'P571' or datequalif == 'P580' then -- date de début et date de création isonumber = isonumber + 2 end return isonumber end function wd.compare.chronoCompare(c1, c2) return wd.compare.get_claim_date(c1) < wd.compare.get_claim_date(c2) end -- fonction pour renverser l’ordre d’une autre fonction function wd.compare.rev(comp_criteria) return function(c1, c2) -- attention les tris en lua attendent des fonctions de comparaison strictement inférieur, on doit -- vérifier la non égalité quand on inverse l’ordre d’un critère, d’ou "and comp_criteria(c2,c1)" return not(comp_criteria(c1,c2)) and comp_criteria(c2,c1) end end -- Fonction qui trie des Claims de type time selon l'ordre chronologique -- Une clé de tri nomée « dateSortKey » est ajouté à chaque claim. -- Si des clés de tri de ce nom existent déjà, elles sont utilisées sans modification. function wd.chronoSort( claims, sorttype ) for _, claim in ipairs( claims ) do if not claim.dateSortKey then if sorttype and (sorttype == 'age' or sorttype == 'ageinverted') then claim.dateSortKey = wd.compare.get_claim_date(claim, 'personbirthdate') else claim.dateSortKey = wd.compare.get_claim_date(claim) end if sorttype and (sorttype == 'inverted' or sorttype == 'ageinverted') and claim.dateSortKey == math.huge then claim.dateSortKey = -math.huge -- quand la donnée est manquante on lui assigne la valeur qui entraîne le classement en fin de liste end end end table.sort( claims, function ( c1, c2 ) if sorttype and (sorttype == 'inverted' or sorttype == 'ageinverted') then return c2.dateSortKey < c1.dateSortKey end return c1.dateSortKey < c2.dateSortKey end ) return claims end local function get_numeric_claim_value(claim, propertySort) local val local claimqualifs = claim.qualifiers if claimqualifs then local vals = claimqualifs[propertySort] if vals and vals[1].snaktype == 'value' then val = vals[1].datavalue.value end end return tonumber(val or 0) end function wd.compare.numeric(propertySort) return function(c1, c2) return get_numeric_claim_value(c1, propertySort) < get_numeric_claim_value(c2, propertySort) end end -- Fonction qui trie des Claims de type value selon l'ordre de la propriété fournit -- Une clé de tri nomée « dateSortKey » est ajouté à chaque claim. -- Si des clés de tri de ce nom existent déjà, elles sont utilisées sans modification. function wd.numericPropertySort( claims, propertySort ) for _, claim in ipairs( claims ) do if not claim.dateSortKey then local val = get_numeric_claim_value(claim, propertySort) claim.dateSortKey = tonumber(val or 0) end end table.sort( claims, function ( c1, c2 ) return c1.dateSortKey < c2.dateSortKey end ) return claims end --[[ test possible en console pour la fonction précédente : = p.formatStatements{entity = "Q375946", property = 'P50', sorttype = 'P1545', linkback = "true"} --]] -- =================== function wd.getReferences(statement) local refdata = statement.references if not refdata then return nil end local refs = {} local hashes = {} for i, ref in pairs(refdata) do local s local function hasValue(prop) -- checks that the prop is here with valid value if ref.snaks[prop] and ref.snaks[prop][1].snaktype == 'value' then return true end return false end if ref.snaks.P248 then -- cas lorsque P248 (affirmé dans) est utilisé for j, source in pairs(ref.snaks.P248) do if source.snaktype == 'value' then local page, accessdate, quotation if hasValue('P304') then -- page page = wd.formatSnak(ref.snaks.P304[1]) end if hasValue('P813') then -- date de consultation accessdate = wd.formatSnak(ref.snaks.P813[1]) end if hasValue('P1683') then -- citation quotation = wd.formatSnak(ref.snaks.P1683[1]) end local sourceId = wd.getId(source) s = modules.reference.citeitem(sourceId, {['page'] = page, ['accessdate'] = accessdate, ['citation'] = quotation}) table.insert(refs, s) table.insert(hashes, ref.hash .. sourceId) end end elseif hasValue('P8091') or hasValue('P854') then -- cas lorsque P8091 (Archival Resource Key) ou P854 (URL de la référence)est utilisé local arkKey, url, title, author, publisher, accessdate, publishdate, publishlang, quotation, description if hasValue('P8091') then arkKey = wd.formatSnak(ref.snaks.P8091[1], {text = "-"}) url = 'https://n2t.net/' .. arkKey if hasValue('P1476') then title = wd.formatSnak(ref.snaks.P1476[1]) else title = arkKey end elseif hasValue('P854') then url = wd.formatSnak(ref.snaks.P854[1], {text = "-"}) if hasValue('P1476') then title = wd.formatSnak(ref.snaks.P1476[1]) else title = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3') end end --todo : handle multiple values for author, etc. if hasValue('P1810') then -- sou non description = 'sou non ' .. wd.formatSnak(ref.snaks.P1810[1]) end if hasValue('P813') then -- dat konsiltasyon accessdate = wd.formatSnak(ref.snaks.P813[1]) end if hasValue('P50') then -- author (item type) author = wd.formatSnak(ref.snaks.P50[1]) elseif hasValue('P2093') then -- author (string type) author = wd.formatSnak(ref.snaks.P2093[1]) end if hasValue('P123') then -- éditeur publisher = wd.formatSnak(ref.snaks.P123[1]) end if hasValue('P1683') then -- citation quotation = wd.formatSnak(ref.snaks.P1683[1]) end if hasValue('P577') then -- date de publication publishdate = wd.formatSnak(ref.snaks.P577[1]) end if hasValue('P407') then -- langue de l'œuvre local id = wd.getId(ref.snaks.P407[1]) publishlang = getLangCode(id) end s = modules.cite.lienWeb{titre = title, url = url, auteur = author, editeur = publisher, langue = publishlang, ['en ligne le'] = publishdate, ['consulté le'] = accessdate, ['citation'] = quotation, ['description'] = description} table.insert(hashes, ref.hash) table.insert(refs, s) elseif ref.snaks.P854 and ref.snaks.P854[1].snaktype == 'value' then s = wd.formatSnak(ref.snaks.P854[1], {text = "-"}) table.insert(hashes, ref.snaks.P854[1].hash) table.insert(refs, s) end end if #refs > 0 then if #hashes == #refs then return refs, hashes end return refs end end function wd.sourceStr(sources, hashes) if not sources or (#sources == 0) then return nil end local useHashes = hashes and #hashes == #sources for i, j in ipairs(sources) do local refArgs = {name = 'ref', content = j} if useHashes and hashes[i] ~= '-' then refArgs.args = {name = 'wikidata-' .. hashes[i]} end sources[i] = mw.getCurrentFrame():extensionTag(refArgs) end return table.concat(sources, '<sup class="reference cite_virgule">,</sup>') end function wd.getDataValue(snak, params) if not params then params = {} end local speciallabels = params.speciallabels -- parfois on a besoin de faire une liste d'éléments pour lequel le libellé doit être changé, pas très pratique d'utiliser une fonction pour ça if snak.snaktype ~= 'value' then return nil end local datatype = snak.datatype local value = snak.datavalue.value local displayformat = params.displayformat if type(displayformat) == 'function' then return displayformat(snak, params) end if datatype == 'wikibase-item' then return wd.formatEntity(wd.getId(snak), params) end if datatype == 'url' then if params.displayformat == 'raw' then return value else return modules.weblink.makelink(value, params.text) end end if datatype == 'math' then return mw.getCurrentFrame():extensionTag( "math", value) end if datatype == 'tabular-data' then return mw.ustring.sub(value, 6, 100) -- returns the name of the file, without the "Data:" prefix end if (datatype == 'string') or (datatype == 'external-id') or (datatype == 'commonsMedia') then -- toutes les données de type string sauf "math" if params.urlpattern then local urlpattern = params.urlpattern if type(urlpattern) == 'function' then urlpattern = urlpattern(value) end -- encodage de l'identifiant qui se retrouve dans le path de l'URL, à l'exception des slashes parfois rencontrés, qui sont des séparateurs à ne pas encoder local encodedValue = mw.uri.encode(value, 'PATH'):gsub('%%2F', '/') -- les parenthèses autour du encodedValue:gsub() sont nécessaires, sinon sa 2e valeur de retour est aussi passée en argument au mw.ustring.gsub() parent local url = mw.ustring.gsub(urlpattern, '$1', (encodedValue:gsub('%%', '%%%%'))) value = '[' .. url .. ' ' .. (params.text or value) .. ']' end return value end if datatype == 'time' then -- format example: +00000001809-02-12T00:00:00Z if displayformat == 'raw' then return value.time else local dateobject = dateObject(value, {precision = params.precision}) return objectToText(dateobject, params) end end if datatype == 'globe-coordinate' then -- retourne une table avec clés latitude, longitude, précision et globe à formater par un autre module (à changer ?) if displayformat == 'latitude' then return value.latitude elseif displayformat == 'longitude' then return value.longitude else local coordvalue = mw.clone( value ) coordvalue.globe = databases.globes[value.globe] -- transforme l'ID du globe en nom anglais utilisable par geohack return coordvalue -- note : les coordonnées Wikidata peuvent être utilisée depuis Module:Coordinates. Faut-il aussi autoriser à appeler Module:Coordiantes ici ? end end if datatype == 'quantity' then -- todo : gérer les paramètres précision local amount, unit = value.amount, value.unit if unit then unit = unit:match('Q%d+') end if not unit then unit = 'dimensionless' end local raw if displayformat == "raw" then raw = true end return modules.formatNum.displayvalue(amount, unit, {targetunit = params.targetunit, raw = raw, rounding = params.rounding, showunit = params.showunit or 'short', showlink = params.showlink} ) end if datatype == 'monolingualtext' then if value.language == defaultlang then return value.text else return modules.langmodule.langue({value.language, value.text, nocat=true}) end end return formatError('unknown-datavalue-type' ) end function wd.stringTable(args) -- like getClaims, but get a list of string rather than a list of snaks, for easier manipulation local claims = args.claims local cat = '' if not claims then claims = wd.getClaims(args) end if not claims or claims == {} then return {}, {}, cat end if args.removedupesdate and (args.removedupesdate ~= '-') then claims, cat = removeDupesDate(claims, args.removedupesdate) end local props = {} -- liste des propriétés associété à chaque string pour catégorisation et linkback for i, j in pairs(claims) do claims[i] = wd.formatStatement(j, args) table.insert(props, j.mainsnak.property) end if args.removedupes and (args.removedupes ~= '-') then claims = wd.addNewValues({}, claims) -- devrait aussi supprimer de props celles qui ne sont pas utilisées end return claims, props, cat end function wd.getQualifiers(statement, qualifs, params) if not statement.qualifiers then return nil end local vals = {} if type(qualifs) == 'string' then qualifs = wd.splitStr(qualifs) end for i, j in pairs(qualifs) do if statement.qualifiers[j] then for k, l in pairs(statement.qualifiers[j]) do table.insert(vals, l) end end end if #vals == 0 then return nil end return vals end function wd.getFormattedQualifiers(statement, qualifs, params) if not params then params = {} end local qualiftable = wd.getQualifiers(statement, qualifs) if not qualiftable then return nil end qualiftable = wd.filterClaims(qualiftable, params) or {} for i, j in pairs(qualiftable) do qualiftable[i] = wd.formatSnak(j, params) end return modules.linguistic.conj(qualiftable, params.conjtype) end function wd.showQualifiers(str, statement, args) local qualifs = args.showqualifiers if not qualifs then return str -- or error ? end if type(qualifs) == 'string' then qualifs = wd.splitStr(qualifs) end local qualifargs = args.qualifargs or {} -- formatage des qualificatifs = args commençant par "qualif", ou à défaut, les mêmes que pour la valeur principale qualifargs.displayformat = args.qualifdisplayformat or args.displayformat qualifargs.labelformat = args.qualiflabelformat or args.labelformat qualifargs.labelformat2 = args.qualiflabelformat2 or args.labelformat2 qualifargs.link = args.qualiflink or args.link qualifargs.linktopic = args.qualiflinktopic or args.linktopic qualifargs.conjtype = args.qualifconjtype qualifargs.precision = args.qualifprecision qualifargs.targetunit = args.qualiftargetunit qualifargs.defaultlink = args.qualifdefaultlink or args.defaultlink qualifargs.defaultlinkquery = args.qualifdefaultlinkquery or args.defaultlinkquery local formattedqualifs if args.qualifformat and type (args.qualifformat) == 'function' then formattedqualifs = args.qualifformat(statement, qualifs, qualifargs) else formattedqualifs = wd.getFormattedQualifiers(statement, qualifs, qualifargs) end if formattedqualifs and formattedqualifs ~= "" then str = str .. " (" .. formattedqualifs .. ")" end return str end function wd.formatSnak( snak, params ) if not params then params = {} end -- pour faciliter l'appel depuis d'autres modules if snak.snaktype == 'somevalue' then return unknownValue(snak, params.unknownlabel) elseif snak.snaktype == 'novalue' then return noValue(params.novaluelabel) elseif snak.snaktype == 'value' then return wd.getDataValue( snak, params) else return formatError( 'unknown-snak-type' ) end end function wd.formatStatement( statement, args ) -- FONCTION A REORGANISER (pas très lisible) if not args then args = {} end if not statement.type or statement.type ~= 'statement' then return formatError( 'unknown-claim-type' ) end local prop = statement.mainsnak.property local str -- special displayformat f if args.statementformat and (type(args.statementformat) == 'function') then str = args.statementformat(statement, args) elseif (statement.mainsnak.datatype == 'time') and (statement.mainsnak.dateformat ~= '-') then if args.displayformat == 'raw' and statement.mainsnak.snaktype == 'value' then str = statement.mainsnak.datavalue.value.time else str = wd.getFormattedDate(statement, args) end elseif args.showonlyqualifier and (args.showonlyqualifier ~= '') then str = wd.getFormattedQualifiers(statement, args.showonlyqualifier, args) if not str then return nil end if args.addstandardqualifs ~= '-' then str = wd.addStandardQualifs(str, statement) end else str = wd.formatSnak( statement.mainsnak, args ) if (args.addstandardqualifs ~= '-') and (args.displayformat ~= 'raw') then str = wd.addStandardQualifs(str, statement) end end -- ajouts divers if args.showlang == true then local indicateur = showLang(statement, args.maxLang) if indicateur then str = indicateur .. '&nbsp;' .. str end end if args.showqualifiers then str = wd.showQualifiers(str, statement, args) end if args.showdate then -- when "showdate and chronosort are both set, date retrieval is performed twice local period = wd.getFormattedDate(statement, args, "-") -- 3 arguments indicate the we should not use additional qualifiers, already added by wd.formatStatement if period then str = str .. " <small>(" .. period .. ")</small>" end end if args.showsource and args.showsource ~= '-' then local sources, hashes = wd.getReferences(statement) if sources then local source = wd.sourceStr(sources, hashes) if source then str = str .. source end end end return str end function wd.addLinkBack(str, id, property) if not id or id == '' then id = wd.getEntityIdForCurrentPage() end if not id then return str end if type(property) == 'table' then property = property[1] end id = wd.entityId(id) 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 = wd.translate('see-wikidata-value') local url = mw.uri.fullUrl('d:' .. id, 'uselang=fr') url.fragment = property -- ajoute une #ancre si paramètre "property" défini url = tostring(url) local v = mw.html.create('span') :addClass(class) :wikitext(str) :tag('span') :addClass('noprint wikidata-linkback') :wikitext(icon:format(title, url)) :allDone() return tostring(v) end function wd.addRefAnchor(str, id) --[[ Insère une ancre pour une référence générée à partir d'un élément wd. L'id Wikidata sert d'identifiant à l'ancre, à utiliser dans les modèles type "harvsp" --]] return tostring( mw.html.create('span') :attr('id', id) :attr('class', "ouvrage") :wikitext(str) ) end --=== FUNCTIONS USING AN ENTITY AS ARGUMENT === local function formatStatementsGrouped(args, type) -- regroupe les affirmations ayant la même valeur en mainsnak, mais des qualificatifs différents -- (seulement pour les propriétés de type élément) local claims = wd.getClaims(args) if not claims then return nil end local groupedClaims = {} -- regroupe les affirmations par valeur de mainsnak local function addClaim(claim) local id = wd.getMainId(claim) for i, j in pairs(groupedClaims) do if (j.id == id) then table.insert(groupedClaims[i].claims, claim) return end end table.insert(groupedClaims, {id = id, claims = {claim}}) end for i, claim in pairs(claims) do addClaim(claim) end local stringTable = {} -- instructions ad hoc pour les paramètres concernant la mise en forme d'une déclaration individuelle local funs = { {param = "showqualifiers", fun = function(str, claims) local qualifs = {} for i, claim in pairs(claims) do local news = wd.getFormattedQualifiers(claim, args.showqualifiers, args) if news then table.insert(qualifs, news) end end local qualifstr = modules.linguistic.conj(qualifs, wd.translate("qualif-separator")) if qualifstr and qualifstr ~= "" then str = str .. " (" .. qualifstr .. ")" end return str end }, {param = "showdate", fun = function(str, claims) -- toutes les dates sont regroupées à l'intérieur des mêmes parenthèses ex "médaille d'or (1922, 1924)" local dates = {} for i, statement in pairs(claims) do local s = wd.getFormattedDate(statement, args, true) if statement then table.insert(dates, s) end end local datestr = modules.linguistic.conj(dates) if datestr and datestr ~= "" then str = str .. " <small>(" .. datestr .. ")</small>" end return str end }, {param = "showsource", fun = function(str, claims) -- les sources sont toutes affichées au même endroit, à la fin -- si deux affirmations ont la même source, on ne l'affiche qu'une fois local sources = {} local hashes = {} local function dupeRef(old, new) for i, j in pairs(old) do if j == new then return true end end end for i, claim in pairs(claims) do local refs, refHashes = wd.getReferences(claim) if refs then for i, j in pairs(refs) do if not dupeRef(sources, j) then table.insert(sources, j) local hash = (refHashes and refHashes[i]) or '-' table.insert(hashes, hash) end end end end return str .. (wd.sourceStr(sources, hashes) or "") end } } for i, group in pairs(groupedClaims) do -- bricolage pour utiliser les arguments de formatStatements local str = wd.formatEntity(group.id, args) if not str then str = '???' -- pour éviter erreur Lua si formatEntity a retourné nil end for i, fun in pairs(funs) do if args[fun.param] then str = fun.fun(str, group.claims, args) end end table.insert(stringTable, str) end args.valuetable = stringTable return wd.formatStatements(args) end function wd.formatStatements( args )--Format statement and concat them cleanly if args.value == '-' then return nil end -- If a value is already set: use it, except if it's the special value {{WD}} (use wikidata) if args.value and args.value ~= '' then local valueexpl = wd.translate("activate-query") if args.value ~= valueexpl then return args.value end -- There is no value set, and args.expl disables wikidata on empty values elseif args.expl then return nil end if args.grouped and args.grouped ~= '' then args.grouped = false return formatStatementsGrouped(args) end local valuetable = args.valuetable -- dans le cas où les valeurs sont déjà formatées local props -- les propriétés réellement utilisées (dans certains cas, ce ne sont pas toutes celles de args.property local cat = '' if not valuetable then -- cas le plus courant valuetable, props, cat = wd.stringTable(args) end if args.ucfirst == '-' and args.conjtype == 'new line' then args.conjtype = 'lowercase new line' end local str = modules.linguistic.conj(valuetable, args.conjtype) if not str then return args.default end if not props then props = wd.splitStr(args.property)[1] end if args.ucfirst ~= '-' then str = modules.linguistic.ucfirst(str) end if args.addcat and (args.addcat ~= '-') then str = str .. wd.addTrackingCat(props) .. cat end if args.linkback and (args.linkback ~= '-') then str = wd.addLinkBack(str, args.entity, props) end if args.returnnumberofvalues then return str, #valuetable end return str end function wd.formatAndCat(args) if not args then return nil end args.linkback = args.linkback or true args.addcat = true if args.value then -- do not ignore linkback and addcat, as formatStatements do if args.value == '-' then return nil end local val = args.value .. wd.addTrackingCat(args.property) val = wd.addLinkBack(val, args.entity, args.property) return val end return wd.formatStatements( args ) end function wd.getTheDate(args) local claims = wd.getClaims(args) if not claims then return nil end local formattedvalues = {} for i, j in pairs(claims) do local v = wd.getFormattedDate(j, args) if v then table.insert(formattedvalues, v ) end end local val = modules.linguistic.conj(formattedvalues) if not val then return nil end if args.addcat == true then val = val .. wd.addTrackingCat(args.property) end val = wd.addLinkBack(val, args.entity, args.property) return val end function wd.keyDate (event, item, params) params = params or {} params.entity = item if type(event) == 'table' then for i, j in pairs(event) do params.targetvalue = nil -- réinitialisation barbare des paramètres modifiés local s = wd.keyDate(j, item, params) if s then return s end end elseif type(event) ~= 'string' then return formatError('invalid-datatype', type(event), 'string') elseif string.sub(event, 1, 1) == 'Q' then -- on demande un élément utilisé dans P:P793 (événement clé) params.property = 'P793' params.targetvalue = event params.addcat = params.addcat or true return wd.getTheDate(params) elseif string.sub(event, 1, 1) == 'P' then -- on demande une propriété params.property = event return wd.formatAndCat(params) else return formatError('invalid-entity-id', event) end end function wd.mainDate(entity) -- essaye P580/P582 local args = {entity = entity, addcat = true} args.property = 'P580' local startpoint = wd.formatStatements(args) args.property = 'P582' local endpoint = wd.formatStatements(args) local str if (startpoint or endpoint) then str = modules.formatDate.daterange(startpoint, endpoint, params) str = wd.addLinkBack(str, entity, 'P582') return str end -- défaut : P585 args.property = {'P585', 'P571'} args.linkback = true return wd.formatStatements(args) end -- ==== Fonctions sur le genre ==== function wd.getgender(id) local vals = { ['Q6581072'] = 'f', -- féminin ['Q6581097'] = 'm', -- masculin ['Q1052281'] = 'f', -- femme transgenre ['Q2449503'] = 'm', -- homme transgenre ['Q17148251'] = 'f', -- en:Travesti (gender identity) ['Q43445'] = 'f', -- femelle ['Q44148'] = 'm', -- mâle default = '?' } local gender = wd.formatStatements{entity = id, property = 'P21', displayformat = 'raw', numval = 1} return vals[gender] or vals.default end -- catégories de genre/nombre function wd.getgendernum(claims) local personid, gender local anym = false local anyf = false local anyunknown = false for i, claim in pairs(claims) do local snak = claim.mainsnak or claim if(snak.snaktype == 'value') and (snak.datatype == 'wikibase-item') then personid = wd.getId(snak) gender = wd.getgender(personid) anym = anym or (gender == 'm') anyf = anyf or (gender == 'f') anyunknown = anyunknown or (gender == '?') else anyunknown = true end end local gendernum if #claims > 1 then if anyunknown then gendernum = 'p' else if anym and not anyf then gendernum = 'mp' end if anyf and not anym then gendernum = 'fp' end if anym and anyf then gendernum = 'mixtep' end end else gendernum = 's' if anym then gendernum = 'ms' end if anyf then gendernum = 'fs' end end return gendernum end -- récupération des libellés genrés de Wikidata function wd.genderedlabel(id, labelgender) local label if not labelgender then return nil end if labelgender == 'f' then -- femme : chercher le libellé dans P2521 (libellé féminin) label = wd.formatStatements{entity = id, property = 'P2521', isinlang = 'ht', numval = 1, ucfirst = '-'} elseif labelgender == 'm' then -- homme : chercher le libellé dans P3321 (libellé masculin) label = wd.formatStatements{entity = id, property = 'P3321', isinlang = 'ht', numval = 1, ucfirst = '-'} end if not label then label = wd.getLabel(id) end return label end -- === FUNCTIONS FOR TRANSITIVE PROPERTIES === function wd.getIds(item, query) query.excludespecial = true query.displayformat = 'raw' query.entity = item query.addstandardqualifs = '-' return wd.stringTable(query) end -- recursively adds a list of qid to an existing list, based on the results of a query function wd.addVals(list, query, maxdepth, maxnodes, stopval) maxdepth = tonumber(maxdepth) or 10 maxnodes = tonumber(maxnodes) or 100 if (maxdepth < 0) then return list end if stopval and wd.isHere(list, stopval) then return list end local origsize = #list for i = 1, origsize do -- tried a "checkpos" param instead of starting to 1 each time, but no impact on performance local candidates = wd.getIds(list[i], query) list = wd.addNewValues(list, candidates, maxnodes, stopval) if list[#list] == stopval then return list end if #list >= maxnodes then return list end end if (#list == origsize) then return list end return wd.addVals(list, query, maxdepth - 1, maxnodes, stopval, origsize + 1) end -- returns a list of items transitively matching a query (orig item is not included in the list) function wd.transitiveVals(item, query, maxdepth, maxnodes, stopval) maxdepth = tonumber(maxdepth) or 5 if type(query) == "string" then query = {property = query} end -- récupération des valeurs local vals = wd.getIds(item, query) if not vals then return nil end local v = wd.addVals(vals, query, maxdepth - 1, maxnodes, stopval) if not v then return nil end -- réarrangement des valeurs if query.valorder == "inverted" then local a = {} for i = #v, 1, -1 do a[#a+1] = v[i] end v = a end return v end -- returns true if an item is the value of a query, transitively function wd.inTransitiveVals(searchedval, sourceval, query, maxdepth, maxnodes ) local vals = wd.transitiveVals(sourceval, query, maxdepth, maxnodes, searchedval ) if (not vals) then return false end for _, val in ipairs(vals) do if (val == searchedval) then return true end end return false end -- returns true if an item is a superclass of another, based on P279 function wd.isSubclass(class, item, maxdepth) local query = {property = 'P279'} if class == item then -- item is a subclass of itself iff it is a class if wd.getIds(item, query) then return true end return false end return wd.inTransitiveVals(class, item, query, maxdepth ) end -- returns true if one of the best ranked P31 values of an item is the target or a subclass of the target -- rank = 'valid' would seem to make sense, but it would need to check for date qualifiers as some P31 values have begin or end date function wd.isInstance(targetclass, item, maxdepth) maxdepth = maxdepth or 10 local directclasses = wd.transitiveVals(item, {property = 'P31'}, 1) if not directclasses then return false end for i, class in pairs(directclasses) do if wd.isSubclass(targetclass, class, maxdepth - 1) then return true end end return false end -- return the first value in a transitive query that belongs to a particular class. For instance find a value of P131 that is a province of Canada function wd.findVal(sourceitem, targetclass, query, recursion, instancedepth) if type(query) == "string" then query = {property = query} end local candidates = wd.getIds(sourceitem, query) if candidates then for i, j in pairs(candidates) do if wd.isInstance(targetclass, j, instancedepth) then return j end end if not recursion then recursion = 3 else recursion = recursion - 1 end if recursion < 0 then return nil end for i, candidate in pairs(candidates) do return wd.findVal(candidate, targetclass, query, recursion, instancedepth) end end end -- === VARIA === function wd.getDescription(entity, lang) lang = lang or defaultlang local description if lang == defaultlang then return mw.wikibase.description(qid) end if not entity.descriptions then return wd.translate('no description') end local descriptions = entity.descriptions if not descriptions then return nil end if descriptions[lang] then return descriptions[delang].value end return entity.id end function wd.Dump(entity) entity = wd.getEntity(entity) if not entity then return formatError("entity-param-not-provided") end return "<pre>"..mw.dumpObject(entity).."</pre>" end function wd.frameFun(frame) local args = frame.args local funname = args[1] table.remove(args, 1) return wd[funname](args) end return wd edckxp6ck6fsx8x6xxbuklihbymyt50 855594 855593 2024-11-12T16:25:49Z BwaKajou 31668 855594 Scribunto text/plain --script that retrieves basic data stored in Wikidata, for the datamodel, see https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua local wd = {} -- creation of a subobject to store comparison funtions, used for sorting claims -- to be able to build more complex sorts like topological sorts wd.compare = {} local databases = { } local modules = { } local databasesNames = { -- modules de données statiques pouvant être appelés avec mw.loadData(), ne nécessitant pas require() i18n = 'Module:Wikidata/I18n', globes = 'Module:Wikidata/Globes', langhierarchy = 'Module:Wikidata/Hiérarchie des langues', langcodes = 'Module:Dictionnaire Wikidata/Codes langue', -- big, infrequently useda invertedlangcodes = 'Module:Dictionnaire Wikidata/Codes langue/inversé' } local modulesNames = { reference = 'Module:Wikidata/Références', linguistic = 'Module:Linguistique', datemodule = 'Module:Date', formatDate = 'Module:Date complexe', formatNum = 'Module:Conversion', langmodule = 'Module:Langue', cite = 'Module:Biblio', weblink = 'Module:Weblink' } local function loadDatabase( t, key ) if databasesNames[key] then local m = mw.loadData( databasesNames[key] ) t[key] = m return m end end local function loadModule( t, key ) if modulesNames[key] then local m = require( modulesNames[key] ) t[key] = m return m end end setmetatable( databases, { __index = loadDatabase } ) setmetatable( modules, { __index = loadModule } ) -- ainsi le require() sera opéré seulement si nécessaire par modules.(nom du module) local datequalifiers = {'P585', 'P571', 'P580', 'P582', 'P1319', 'P1326'} -- === I18n === local defaultlang = mw.getContentLanguage():getCode() function wd.translate(str, rep1, rep2) str = databases.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 local function addCat(cat, sortkey) if sortkey then return '[[Category:' .. cat .. '|' .. sortkey .. ']]' end return '[[Category:' .. cat .. ']]' end local function formatError( key , category, debug) if debug then return error(databases.i18n[key] or key) end if category then return addCat(category, key) else return addCat('cat-unsorted-issue', key) end end -- function wd.isSpecial(snak) return (snak.snaktype ~= 'value') end function wd.getId(snak) if (snak.snaktype == 'value') then return 'Q' .. snak.datavalue.value['numeric-id'] end end function wd.getNumericId(snak) if (snak.snaktype == 'value') then return snak.datavalue.value['numeric-id'] end end function wd.getMainId(claim) return wd.getId(claim.mainsnak) end function wd.entityId(entity) if type(entity) == 'string' then return entity elseif type(entity) == 'table' then return entity.id end end function wd.getEntityIdForCurrentPage() return mw.wikibase.getEntityIdForCurrentPage() end -- function that returns true if the "qid" parameter is the qid -- of the item that is linked to the calling page function wd.isPageOfQId(qid) local self_id = mw.wikibase.getEntityIdForCurrentPage() return self_id ~= nil and qid == self_id end function wd.getEntity( val ) if type(val) == 'table' then return val end if val == '-' then return nil end if val == '' then val = nil end return mw.wikibase.getEntity(val) end function wd.splitStr(val) -- transforme en table les chaînes venant du Wikitexte qui utilisent des virgules de séparation if type(val) == 'string' then val = mw.text.split(val, ",") end return val end function wd.isHere(searchset, val, matchfunction) for i, j in pairs(searchset) do if matchfunction then if matchfunction(val,j) then return true end else if val == j then return true end end end return false end local function wikidataLink(entity) local name =':d:' if type(entity) == 'string' then if entity:match("P[0-9+]") then entity = "Property:" .. entity end return name .. entity elseif type(entity) == 'table' then if entity["tip"] == "property" then name = ":d:Property:" end return name .. entity.id elseif type(entity) == nil then return formatError('entity-not-found') end end function wd.siteLink(entity, project, lang) -- returns 3 values: a sitelink (with the relevant prefix) a project name and a language lang = lang or defaultlang if (type(project) ~= 'string') then project = 'wiki' end project = project:lower() if project == 'wikipedia' then project = 'wiki' end if type(entity) == 'string' and (project == 'wiki') and ( (not lang or lang == defaultlang) ) then -- évite de charger l'élément entier local link = mw.wikibase.getSitelink(entity) if link then local test_redirect = mw.title.new(link) -- remplacement des redirections (retirer si trop coûteux) if test_redirect.isRedirect and test_redirect.redirectTarget then link = test_redirect.redirectTarget.fullText end end return link, 'wiki', defaultlang end if project == 'wikidata' then return wikidataLink(entity), 'wikidata' end local projects = { -- nom = {préfixe sur Wikidata, préfix pour les liens sur Wikipédia, ajouter préfixe de langue} wiki = {'wiki', nil, true}, -- wikipedia commons = {'commonswiki', 'commons', false}, commonswiki = {'commonswiki', 'commons', false}, wikiquote = {'wikiquote', 'q', true}, wikivoyage = {'wikivoyage', 'voy', true}, wikibooks = {'wikibooks', 'b', true}, wikinews = {'wikinews', 'n', true}, wikiversity = {'wikiversity', 'v', true}, wikisource = {'wikisource', 's', true}, wiktionary = {'wiktionary', 'wikt', true}, specieswiki = {'specieswiki', 'species', false}, metawiki = {'metawiki', 'm', false}, incubator = {'incubator', 'incubator', false}, outreach = {'outreach', 'outreach', false}, mediawiki = {'mediawiki', 'mw', false} } local entityid = entity.id or entity local projectdata = projects[project:lower()] if not projectdata then -- defaultlink might be in the form "dewiki" rather than "project: 'wiki', lang: 'de' " for k, v in pairs(projects) do if project:match( k .. '$' ) and mw.language.isKnownLanguageTag(project:sub(1, #project-#k)) then lang = project:sub(1, #project-#k) project = project:sub(#lang + 1, #project) projectdata = projects[project] break end end if not mw.language.isKnownLanguageTag(lang) then return --formatError('invalid-project-code', projet or 'nil') end end if not projectdata then return -- formatError('invalid-project-code', projet or 'nil') end local linkcode = projectdata[1] local prefix = projectdata[2] local multiversion = projectdata[3] if multiversion then linkcode = lang .. linkcode end local link = mw.wikibase.getSitelink(entityid, linkcode) if not link then return nil end if prefix then link = prefix .. ':' .. link end if multiversion then link = ':' .. lang .. ':' .. link end return link, project, lang end -- add new values to a list, avoiding duplicates function wd.addNewValues(olditems, newitems, maxnum, stopval) if not newitems then return olditems end for _, qid in pairs(newitems) do if stopval and (qid == stopval) then table.insert(olditems, qid) return olditems end if maxnum and (#olditems >= maxnum) then return olditems end if not wd.isHere(olditems, qid) then table.insert(olditems, qid) end end return olditems end --=== FILTER CLAIMS ACCORDING TO VARIOUS CRITERIA : FUNCTION GETCLAIMS et alii === local function notSpecial(claim) local type if claim.mainsnak ~= nil then type = claim.mainsnak.snaktype else -- condition respectée quand showonlyqualifier est un paramètre renseigné -- dans ce cas, claim n'est pas une déclaration entière, mais UNE snak qualifiée du main snak type = claim.snaktype end return type == 'value' end local function hasTargetValue(claim, targets) -- retourne true si la valeur est dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial local id = wd.getMainId(claim) local targets = wd.splitStr(targets) return wd.isHere(targets, id) or wd.isSpecial(claim.mainsnak) end local function excludeValues(claim, values) -- true si la valeur n'est pas dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial) return wd.isSpecial(claim.mainsnak) or not ( hasTargetValue(claim, values) ) end local function hasTargetClass(claim, targets, maxdepth) -- retourne true si la valeur est une instance d'une classe dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial local id = wd.getMainId(claim) local targets = wd.splitStr(targets) local maxdepth = maxdepth or 10 local matchfunction = function(value, target) return wd.isInstance(target, value, maxdepth) end return wd.isHere(targets, id, matchfunction) or wd.isSpecial(claim.mainsnak) end local function excludeClasses(claim, classes) -- true si la valeur n'est pas une instance d'une classe dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial) return wd.isSpecial(claim.mainsnak) or not ( hasTargetClass(claim, classes, maxdepth) ) end local function hasTargetSuperclass(claim, targets, maxdepth) -- retourne true si la valeur est une sous-classe d'une classe dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial local id = wd.getMainId(claim) local targets = wd.splitStr(targets) local maxdepth = maxdepth or 10 local matchfunction = function(value, target) return wd.isSubclass(target, value, maxdepth) end return wd.isHere(targets, id, matchfunction) or wd.isSpecial(claim.mainsnak) end local function excludeSuperclasses(claim, classes) -- true si la valeur n'est pas une sous-classe d'une classe dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial) return wd.isSpecial(claim.mainsnak) or not ( hasTargetSuperclass(claim, classes, maxdepth) ) end local function bestRanked(claims) if not claims then return nil end local preferred, normal = {}, {} for i, j in pairs(claims) do if j.rank == 'preferred' then table.insert(preferred, j) elseif j.rank == 'normal' then table.insert(normal, j) end end if #preferred > 0 then return preferred else return normal end end local function withRank(claims, target) if target == 'best' then return bestRanked(claims) end local newclaims = {} for pos, claim in pairs(claims) do if target == 'valid' then if claim.rank ~= 'deprecated' then table.insert(newclaims, claim) end elseif claim.rank == target then table.insert(newclaims, claim) end end return newclaims end function wd.hasQualifier(claim, acceptedqualifs, acceptedvals, excludequalifiervalues) local claimqualifs = claim.qualifiers if (not claimqualifs) then return false end acceptedqualifs = wd.splitStr(acceptedqualifs) acceptedvals = wd.splitStr( acceptedvals) local function ok(qualif) -- vérification pour un qualificatif individuel if not claimqualifs[qualif] then return false end if not (acceptedvals) then -- si aucune valeur spécifique n'est demandée, OK return true end for i, wanted in pairs(acceptedvals) do for j, actual in pairs(claimqualifs[qualif]) do if wd.getId(actual) == wanted then return true end end end end for i, qualif in pairs(acceptedqualifs) do if ok(qualif) then return true end end return false end function wd.hasQualifierNumber(claim, acceptedqualifs, acceptedvals, excludequalifiervalues) local claimqualifs = claim.qualifiers if (not claimqualifs) then return false end acceptedqualifs = wd.splitStr(acceptedqualifs) acceptedvals = wd.splitStr( acceptedvals) local function ok(qualif) -- vérification pour un qualificatif individuel if not claimqualifs[qualif] then return false end if not (acceptedvals) then -- si aucune valeur spécifique n'est demandée, OK return true end for i, wanted in pairs(acceptedvals) do for j, actual in pairs(claimqualifs[qualif]) do if mw.wikibase.renderSnak(actual) == wanted then return true end end end end for i, qualif in pairs(acceptedqualifs) do if ok(qualif) then return true end end return false end local function hasSource(claim, targetsource, sourceproperty) sourceproperty = sourceproperty or 'P248' if targetsource == "-" then return true end if (not claim.references) then return false end local candidates = claim.references[1].snaks[sourceproperty] -- les snaks utilisant la propriété demandée if (not candidates) then return false end if (targetsource == "any") then -- si n'importe quelle valeur est acceptée tant qu'elle utilise en ref la propriété demandée return true end targetsource = wd.splitStr(targetsource) for _, source in pairs(candidates) do local s = wd.getId(source) for i, target in pairs(targetsource) do if s == target then return true end end end return false end local function excludeQualifier(claim, qualifier, qualifiervalues) return not wd.hasQualifier(claim, qualifier, qualifiervalues) end function wd.hasDate(claim) if not claim then return false --error() ? end if wd.getDateFromQualif(claim, 'P585') or wd.getDateFromQualif(claim, 'P580') or wd.getDateFromQualif(claim, 'P582') then return true end return false end local function hasLink(claim, site, lang) if (claim.mainsnak.snaktype ~= 'value') then -- ne pas supprimer les valeurs spéciales, il y a une fonction dédiée pour ça return true end local id = wd.getMainId(claim) local link = wd.siteLink(id, site, lang) if link then return true end end local function isInLanguage(claim, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ? if type(lang) == 'table' then -- si c'est une table de language séparées par des virgules, on les accepte toutes for i, l in pairs(lang) do local v = isInLanguage(claim, l) if v then return true end end end if type(lang) ~= ('string') then return --? end if (lang == '-') then return true end if (lang == 'locallang') then lang = mw.getContentLanguage():getCode() end -- pour les monolingual text local snak = claim.mainsnak or claim if snak.snaktype == 'value' and snak.datavalue.type == 'monolingualtext' then if snak.datavalue.value.language == lang then return true end return false end -- pour les autres types de données : recherche dans les qualificatifs if (lang == 'ht') then lang = 'Q33491' elseif (lang == 'en') then lang = 'Q1860' else lang = databases.invertedlangcodes[lang] end if claim.qualifiers and claim.qualifiers.P407 then if wd.hasQualifier(claim, {'P407'}, {lang}) then return true else return false end end return true -- si on ne ne sait pas la langue, on condière que c'est bon end local function firstVals(claims, numval) -- retourn les numval premières valeurs de la table claims local numval = tonumber(numval) or 0 -- raise a error if numval is not a positive integer ? if not claims then return nil end while (#claims > numval) do table.remove(claims) end return claims end local function lastVals(claims, numval2) -- retourn les valeurs de la table claims à partir de numval2 local numval2 = tonumber(numval2) or 0 -- raise a error if numval is not a positive integer ? if not claims then return nil end for i=1,numval2 do table.remove(claims, 1) end return claims end -- retourne les valeurs de la table claims à partir de removedupesdate, -- sans les dates en doublons avec conversion entre les calendrier julien et grégorien, -- ou uniquement en catégorisant si le paramètre removedupesdate est égale à 'cat' local function removeDupesDate(claims, removedupesdate) if not claims or #claims < 2 then return claims, '' end local cat = '' local newClaims = {} local newIsos = {} local function findIndex(searchset, val) -- similaire à wd.isHere mais retourne l'index de la valeur trouvée for i, j in pairs(searchset) do if val == j then return i end end return -1 end for _, claim in ipairs( claims ) do local snak = claim.mainsnak or claim if (snak.snaktype == 'value') and (snak.datatype == 'time') and snak.datavalue.value.precision >= 11 then -- s'il s'agit d'un time et que la précision est au moins l'année local iso = snak.datavalue.value.time _, _, iso = string.find(iso, "(+%d+-%d+-%d+T)") local deleteIfDuplicate = false if snak.datavalue.value.calendarmodel == 'http://www.wikidata.org/entity/Q1985727' then -- si la date est grégorienne if modules.formatDate.before('+1582', iso) then -- si avant 1582 on calcule la date julienne _, _, y, m, d = string.find(iso, "+(%d+)-(%d+)-(%d+)T") y, m , d = modules.datemodule.gregorianToJulian(y, m , d) if m < 10 then m = '0' .. m end if d < 10 then d = '0' .. d end iso = '+' .. y .. '-' .. m .. '-' .. d .. 'T' deleteIfDuplicate = true end local index = findIndex(newIsos, iso) if index >= 0 then -- si la date est déjà présente cat = cat .. '[[Catégorie:Article avec des dates identiques venant de wikidata dans le code de l\'infobox]]' if removedupesdate == "cat" then -- ne faire que catégoriser table.insert(newIsos, iso) table.insert(newClaims, claim) elseif not deleteIfDuplicate then -- supprimer l'autre date si la date courante n'a pas été convertie newClaims[index] = claim end -- sinon supprimer la date courante else -- pas de doublon table.insert(newIsos, iso) table.insert(newClaims, claim) end elseif snak.datavalue.value.calendarmodel == 'http://www.wikidata.org/entity/Q1985786' then -- si date julienne if not modules.formatDate.before('+1582', iso) then -- si après 1582 on calcule la date grégorienne _, _, y, m, d = string.find(iso, "+(%d+)-(%d+)-(%d+)T") y, m , d = modules.datemodule.julianToGregorian(y, m , d) if m < 10 then m = '0' .. m end if d < 10 then d = '0' .. d end iso = '+' .. y .. '-' .. m .. '-' .. d .. 'T' deleteIfDuplicate = true end local index = findIndex(newIsos, iso) if index >= 0 then -- si date déjà présente cat = cat .. '[[Catégorie:Article avec des dates identiques venant de wikidata dans le code de l\'infobox]]' if removedupesdate == "cat" then -- ne faire que catégoriser table.insert(newIsos, iso) table.insert(newClaims, claim) elseif not deleteIfDuplicate then -- supprimer l'autre date si la date courante n'a pas été convertie newClaims[index] = claim end -- sinon supprimer la date courante else -- pas de doublon table.insert(newIsos, iso) table.insert(newClaims, claim) end else -- autre calendrier table.insert(newIsos, iso) table.insert(newClaims, claim) end else -- précision insuffisante table.insert(newIsos, iso) table.insert(newClaims, claim) end end return newClaims, cat end local function timeFromQualifs(claim, qualifs) local claimqualifs = claim.qualifiers if not claimqualifs then return nil end for i, qualif in ipairs(qualifs or datequalifiers) do local vals = claimqualifs[qualif] if vals and (vals[1].snaktype == 'value') then return vals[1].datavalue.value.time, vals[1].datavalue.value.precision end end end local function atDate(claim, mydate) if mydate == "today" then mydate = os.date("!%Y-%m-%dT%TZ") end -- determines required precision depending on the atdate format local d = mw.text.split(mydate, "-") local myprecision if d[3] then myprecision = 11 -- day elseif d[2] then myprecision = 10 -- month else myprecision = 9 -- year end -- with point in time local d, storedprecision = timeFromQualifs(claim, {'P585'}) if d then return modules.formatDate.equal(mydate, d, math.min(myprecision, storedprecision)) end -- with start or end date -- TODO: precision local mindate = timeFromQualifs(claim, {'P580'}) local maxdate = timeFromQualifs(claim, {'P582'}) if modules.formatDate.before(mydate, mindate) and modules.formatDate.before(maxdate, mydate) then return true end return false end local function check(claim, condition) if type(condition) == 'function' then -- cas standard return condition(claim) end return formatError('invalid type', 'function', type(condition)) end local function minPrecision(claim, minprecision) local snak if claim.qualifiers then -- si une date est donnée en qualificatif, c'est elle qu'on utilise de préférence au mainsnak for i, j in ipairs(datequalifiers) do if claim.qualifiers[j] then snak = claim.qualifiers[j][1] break end end end if not snak then snak = claim.mainsnak or claim end if (snak.snaktype == 'value') and (snak.datatype == 'time') and (snak.datavalue.value.precision < minprecision) then return false end return true end function wd.sortClaims(claims, sorttype) if not claims then return nil end if wd.isHere({'chronological', 'order', 'inverted', 'age', 'ageinverted'}, sorttype) then return wd.chronoSort(claims, sorttype) elseif sorttype == 'ascending' then return wd.quantitySort(claims) elseif sorttype == 'descending' then return wd.quantitySort(claims, true) elseif type(sorttype) == 'function' then table.sort(claims, sorttype) return claims elseif type(sorttype) == 'string' and sorttype:sub(1, 1) == 'P' then return wd.numericPropertySort(claims, sorttype) end return claims end function wd.filterClaims(claims, args) --retire de la tables de claims celles qui sont éliminés par un des filters de la table des filters local function filter(condition, filterfunction, funargs) if not args[condition] then return end for i = #claims, 1, -1 do if not( filterfunction(claims[i], args[funargs[1]], args[funargs[2]], args[funargs[3]]) ) then table.remove(claims, i) end end end filter('isinlang', isInLanguage, {'isinlang'} ) filter('excludespecial', notSpecial, {} ) filter('condition', check, {'condition'} ) if claims[1] and claims[1].mainsnak then filter('targetvalue', hasTargetValue, {'targetvalue'} ) filter('targetclass', hasTargetClass, {'targetclass'} ) filter('targetsuperclass', hasTargetSuperclass, {'targetsuperclass'} ) filter('atdate', atDate, {'atdate'} ) filter('qualifier', wd.hasQualifier, {'qualifier', 'qualifiervalue'} ) filter('qualifiernumber', wd.hasQualifierNumber, {'qualifiernumber', 'qualifiernumbervalue'} ) filter('excludequalifier', excludeQualifier, {'excludequalifier', 'excludequalifiervalue'} ) filter('withsource', hasSource, {'withsource', 'sourceproperty'} ) filter('withdate', wd.hasDate, {} ) filter('excludevalues', excludeValues, {'excludevalues'}) filter('excludeclasses', excludeClasses, {'excludeclasses'}) filter('excludesuperclasses', excludeSuperclasses, {'excludesuperclasses'}) filter('withlink', hasLink, {'withlink', 'linklang'} ) filter('minprecision', minPrecision, {'minprecision'} ) claims = withRank(claims, args.rank or 'best') end if #claims == 0 then return nil end if args.sorttype then claims = wd.sortClaims(claims, args.sorttype) end if args.numval2 then claims = lastVals(claims, args.numval2) end if args.numval then claims = firstVals(claims, args.numval) end return claims end function wd.loadEntity(entity, cache) if type(entity) ~= 'table' then if cache then if not cache[entity] then cache[entity] = mw.wikibase.getEntity(entity) mw.log("cached") end return cache[entity] else if entity == '' or (entity == '-') then entity = nil end return mw.wikibase.getEntity(entity) end else return entity end end function wd.getClaims( args ) -- returns a table of the claims matching some conditions given in args if args.claims then -- if claims have already been set, return them return args.claims end local properties = args.property if type(properties) == 'string' then properties = wd.splitStr(string.upper(args.property)) end if not properties then return formatError( 'property-param-not-provided' ) end --Get entity local entity = args.entity if type(entity) == 'string' then if entity == '' then entity = nil end elseif type(entity) == 'table' then entity = entity.id end if (not entity) then entity = mw.wikibase.getEntityIdForCurrentPage() end if (not entity) or (entity == '-') or (entity == wd.translate('somevalue')) or (entity == modules.linguistic.ucfirst(wd.translate('somevalue'))) then return nil end if args.labelformat and args.labelformat == 'gendered' then local longgender = {m = 'male', f = 'female'} args.labelformat = longgender[wd.getgender(entity)] end local claims = {} if #properties == 1 then claims = mw.wikibase.getAllStatements(entity, properties[1]) -- do not use mw.wikibase.getBestStatements at this stage, as it may remove the best ranked values that match other criteria in the query else for i, prop in ipairs(properties) do local newclaims = mw.wikibase.getAllStatements(entity, prop) if newclaims and #newclaims > 0 then for j, claim in ipairs(newclaims) do table.insert(claims, claim) end end end end if (not claims) or (#claims == 0) then return nil end return wd.filterClaims(claims, args) end --=== ENTITY FORMATTING === function wd.getLabel(entity, lang1, lang2) if (not entity) then return nil -- ou option de gestion des erreurs ? end entity = entity.id or ( type(entity) == "string" and entity) if not(type(entity) == 'string') then return nil end lang1 = lang1 or defaultlang local str, lang --str : texte rendu, lang : langue de celui-ci if lang1 == defaultlang then -- le plus économique str, lang = mw.wikibase.getLabelWithLang(entity) -- le libellé peut être en français ou en anglais else str = mw.wikibase.getLabelByLang(entity, lang1) if str then lang = lang1 end end if str and (lang == lang1) then --pas de catégorie "à traduire" si on a obtenu un texte dans la langue désirée (normalement fr) return str end if lang2 then -- langue secondaire, avec catégorie "à traduire" str2 = mw.wikibase.getLabelByLang(entity, lang2) if str2 then lang = lang2 str = str2 end end if not str then --si ni lang1, ni lang2 ni l'anglais ne sont présents, parcours de la hiérarchie des langues for _, trylang in ipairs(databases.langhierarchy.codes) do str = mw.wikibase.getLabelByLang(entity, trylang) if str then lang = trylang break end end end if str then local translationCat = databases.i18n['to translate'] translationCat = translationCat .. (databases.langhierarchy.cattext[lang] or '') translationCat = addCat(translationCat) return str, translationCat end end function wd.formatEntity( entity, params ) if (not entity) then return nil --formatError('entity-not-found') end local id = entity if type(id) == 'table' then id = id.id end params = params or {} local lang = params.lang or defaultlang local speciallabels = params.speciallabels local displayformat = params.displayformat local labelformat = params.labelformat local labelformat2 = params.labelformat2 local defaultlabel = params.defaultlabel or id local linktype = params.link local defaultlink = params.defaultlink local defaultlinkquery = params.defaultlinkquery if speciallabels and speciallabels[id] then --speciallabels override the standard label + link combination return speciallabels[id] end if params.displayformat == 'raw' then return id end if params.labelformat == 'male' then labelformat = function(objectid) return wd.genderedlabel(objectid, 'm') end end if params.labelformat == 'female' then labelformat = function(objectid) return wd.genderedlabel(objectid, 'f') end end local label, translationCat if type(labelformat) == 'function' then -- sert à des cas particuliers label, translationCat = labelformat(entity) end if not label then label, translationCat = wd.getLabel(entity, lang, params.wikidatalang) end if type(labelformat2) == 'function' and label then -- sert à des cas particuliers label = labelformat2(label) end translationCat = translationCat or "" -- sera toujours ajoutée au résultat mais sera vide si la catégorie de maintenance n'est pas nécessaire if not label then if (defaultlabel == '-') then return nil end local link = wd.siteLink(id, 'wikidata') return '[[' .. link .. '|' .. id .. ']]' .. translationCat -- si pas de libellé, on met un lien vers Wikidata pour qu'on comprenne à quoi ça fait référence end -- détermination du fait qu'on soit ou non en train de rendre l'élément sur la page de son article local rendering_entity_on_its_page = wd.isPageOfQId(id) if (linktype == '-') or rendering_entity_on_its_page then return label .. translationCat end local link = wd.siteLink(entity, linktype, lang) -- defaultlinkquery will try to link to another page on this Wiki if (not link) and defaultlinkquery then if type(defaultlinkquery) == 'string' then defaultlinkquery = {property = defaultlinkquery} end defaultlinkquery.excludespecial = true defaultlinkquery.entity = entity local claims = wd.getClaims(defaultlinkquery) if claims then for i, j in pairs(claims) do local id = wd.getMainId(j) link = wd.siteLink(id, linktype, lang) if link then break end end end end if link then if link:match('^Category:') or link:match('^Catégorie:') then -- attention, le « é » est multibyte -- lier vers une catégorie au lieu de catégoriser link = ':' .. link end return '[[' .. link .. '|' .. label .. ']]' .. translationCat end -- if not link, you can use defaultlink: a sidelink to another Wikimedia project if (not defaultlink) then defaultlink = {'enwiki'} end if defaultlink and (defaultlink ~= '-') then local linktype local sidelink, site, langcode if type(defaultlink) == 'string' then defaultlink = {defaultlink} end for i, j in ipairs(defaultlink) do sidelink, site, langcode = wd.siteLink(entity, j, lang) if sidelink then break end end if not sidelink then sidelink, site = wd.siteLink(entity, 'wikidata') end local icon, class, title = site, nil, nil -- le texte affiché du lien if site == 'wiki' then icon, class, title = langcode, "indicateur-langue", wd.translate('see-another-language', mw.language.fetchLanguageName(langcode, defaultlang)) elseif site == 'wikidata' then icon, class, title = 'd', "indicateur-langue", wd.translate('see-wikidata') else title = wd.translate('see-another-project', site) end local val = '[[' .. sidelink .. '|' .. '<span class = "' .. (class or '').. '" title = "' .. (title or '') .. '">' .. icon .. '</span>]]' return label .. ' <small>(' .. val .. ')</small>' .. translationCat end return label .. translationCat end function wd.addTrackingCat(prop, cat) -- doit parfois être appelé par d'autres modules if type(prop) == 'table' then prop = prop[1] -- devrait logiquement toutes les ajouter end if not prop and not cat then return formatError("property-param-not-provided") end if not cat then cat = wd.translate('trackingcat', prop or 'P??') end return addCat(cat ) end local function unknownValue(snak, label) local str = label if type(str) == "function" then str = str(snak) end if (not str) then if snak.datatype == 'time' then str = wd.translate('sometime') else str = wd.translate('somevalue') end end if type(str) ~= "string" then return formatError(snak.datatype) end return str end local function noValue(displayformat) if not displayformat then return wd.translate('novalue') end if type(displayformat) == 'string' then return displayformat end return formatError() end local function getLangCode(entityid) return databases.langcodes[tonumber(entityid:sub(2))] end local function showLang(statement, maxLang) -- retourne le code langue entre paranthèse avant la valeur (par exemple pour les biblios et liens externes) local mainsnak = statement.mainsnak if mainsnak.snaktype ~= 'value' then return nil end local langlist = {} if mainsnak.datavalue.type == 'monolingualtext' then langlist = {mainsnak.datavalue.value.language} elseif (not statement.qualifiers) or (not statement.qualifiers.P407) then return else for i, j in pairs( statement.qualifiers.P407 ) do if j.snaktype == 'value' then local langentity = wd.getId(j) local langcode = getLangCode(langentity) table.insert(langlist, langcode) end end end if (#langlist > 1) or (#langlist == 1 and langlist[1] ~= defaultlang) then -- si c'est en français, pas besoin de le dire langlist.maxLang = maxLang return modules.langmodule.indicationMultilingue(langlist) end end -- === DATE HANDLING === local function fuzzydate(str, precision) -- ajoute le qualificatif "vers" à une date if not str then return nil end if (precision >= 11) or (precision == 7) or (precision == 6) then --dates avec jour, siècles, millénaires return "vers le " .. str end if (precision == 8) then --deseni ("ane ...") return "alantou " .. str end return "alantou " .. str end function wd.addStandardQualifs(str, statement) if (not statement) or (not statement.qualifiers) then return str end if not str then return error()-- what's that ? end if statement.qualifiers.P1480 then for i, j in pairs(statement.qualifiers.P1480) do local v = wd.getId(j) if (v == "Q21818619") then str = wd.translate('approximate-place', str) elseif (v == "Q18122778") or (v == "Q18912752") or (v == "Q56644435") or (v == "Q30230067") then str = wd.translate('uncertain-information', str) elseif (v == "Q5727902") then if (statement.mainsnak.datatype == 'time') then local datevalue = statement.mainsnak.datavalue if datevalue then str = fuzzydate(str, datevalue.value.precision) end else str = wd.translate('approximate-value', str) end end end end return str end local function rangeObject(begin, ending, params) --[[ objet comportant un timestamp pour le classement chronologique et deux dateobject (begin et ending) ]]-- local timestamp if begin then timestamp = begin.timestamp else timestamp = ending.timestamp end return {begin = begin, ending = ending, timestamp = timestamp, type = 'rangeobject'} end local function dateObject(orig, params) --[[ transforme un snak en un nouvel objet utilisable par Module:Date complexe {type = 'dateobject', timestamp = str, era = '+' ou '-', year = number, month = number, day = number, calendar = calendar} ]]-- if not params then params = {} end local newobj = modules.formatDate.splitDate(orig.time, orig.calendarmodel) newobj.precision = params.precision or orig.precision newobj.type = 'dateobject' return newobj end local function objectToText(obj, params) if obj.type == 'dateobject' then return modules.formatDate.simplestring(obj, params) elseif obj.type == 'rangeobject' then return modules.formatDate.daterange(obj.begin, obj.ending, params) end end function wd.getDateFromQualif(statement, qualif) if (not statement) or (not statement.qualifiers) or not (statement.qualifiers[qualif]) then return nil end local v = statement.qualifiers[qualif][1] if v.snaktype ~= 'value' then -- que faire dans ce cas ? return nil end return dateObject(v.datavalue.value) end function wd.getDate(statement) local period = wd.getDateFromQualif(statement, 'P585') -- retourne un dateobject if period then return period end local begin, ending = wd.getDateFromQualif(statement, 'P580'), wd.getDateFromQualif(statement, 'P582') if begin or ending then return rangeObject(begin, ending) -- retourne un rangeobject fait de deux dateobject end return nil end function wd.getFormattedDate(statement, params) if not statement then return nil end local str --cherche la date avec les qualifs P580/P582 local datetable = wd.getDate(statement) if datetable then str = objectToText(datetable, params) end -- puis limite intérieur / supérieur if not str then local start, ending = wd.getDateFromQualif(statement, 'P1319'), wd.getDateFromQualif(statement, 'P1326') str = modules.formatDate.between(start, ending, params) end -- sinon, le mainsnak, pour les données de type time if (not str) and (statement.mainsnak.datatype == 'time') then local mainsnak = statement.mainsnak if (mainsnak.snaktype == 'value') or (mainsnak.snaktype == 'somevalue') then str = wd.formatSnak(mainsnak, params) end end if str and params and (params.addstandardqualifs ~= '-') then str = wd.addStandardQualifs(str, statement) end return str end wd.compare.by_quantity = function(c1, c2) local v1 = wd.getDataValue(c1.mainsnak) local v2 = wd.getDataValue(c2.mainsnak) if not (v1 and v2) then return true end return v1 < v2 end --[[ tri chronologique générique : retourne une fonction de tri de liste de déclaration en fonction d’une fonction qui calcule la clé de tri et d’une fonction qui compare les clés de tri paramètres nommés: (appel type wikidata.compare.chrono_key_sort{sortKey="nom clé"}) sortKey (optionnel) : chaine, le nom de la clé utilisée pour un tri (pour éviter de rentrer en collision avec "dateSortKey" utilisé par chronoSort au besoin) snak_key_get_function : fonction qui calcule la valeur de la clé à partir d’un snak ou d’une déclaration, (obligatoire) le résultat n’est calculé qu’une fois et est stocké en cache dans claim[sortKey] key_compare_function : fonction de comparaison des clés calculées par snak_key_get_function (optionnel) --]] function wd.chrono_key_sort(arg) local snak_key_get_function = arg.snak_key_get_function local sortKey = arg.sortKey or "dateSortKey" local key_compare_function = arg.key_compare_function or function(c1, c2) return c1 < c2 end return function(claims) for _, claim in ipairs( claims ) do if not claim[sortKey] then local key = snak_key_get_function(claim) if key then claim[sortKey] = wd.compare.get_claim_date(key) else claim[sortKey] = 0 end end end table.sort( claims, function(c1, c2) return key_compare_function(c1[sortKey], c2[sortKey]) end ) return claims end end function wd.quantitySort(claims, inverted) local function sort(c1, c2) local v1 = wd.getDataValue(c1.mainsnak) local v2 = wd.getDataValue(c2.mainsnak) if not (v1 and v2) then return true end if inverted then return v2 < v1 end return v1 < v2 end table.sort(claims, sort ) return claims end function wd.compare.get_claim_date(claim, datetype) -- rend une date au format numérique pour faire des comparaisons local snak = claim.mainsnak or claim if datetype and datetype == 'personbirthdate' then -- fonctionne avec un claim dont la valeur est une personne dont on va rendre la date de naissance if (snak.snaktype == 'value') and (snak.datatype == 'wikibase-item') then local personid = wd.getId(snak) local birthclaims = wd.getClaims({ entity = personid, property = 'P569', numval = 1}) if birthclaims then return wd.compare.get_claim_date(birthclaims[1] or birthclaims) else return math.huge end else return math.huge end -- en cas de donnée manquante, valeur infinie qui entraîne le classement en fin de liste end local iso, datequalif, isonumber if (snak.snaktype == 'value') and (snak.datatype == 'time') then iso = snak.datavalue.value.time else for i, dqualif in ipairs(datequalifiers) do iso = timeFromQualifs(claim, {dqualif}) if iso then datequalif = dqualif break end end if not iso then return math.huge end end -- transformation en nombre (indication de la base car gsub retourne deux valeurs) isonumber = tonumber( iso:gsub( '(%d)%D', '%1' ), 10 ) -- ajustement de la date tenant compte du qualificatif dont elle est issue : un fait se terminant à une date est antérieur à un autre commençant à cette date if datequalif == 'P582' then --date de fin isonumber = isonumber - 2 elseif datequalif == 'P1326' then -- date au plus tard isonumber = isonumber - 1 elseif datequalif == 'P1319' then -- date au plus tôt isonumber = isonumber + 1 elseif datequalif == 'P571' or datequalif == 'P580' then -- date de début et date de création isonumber = isonumber + 2 end return isonumber end function wd.compare.chronoCompare(c1, c2) return wd.compare.get_claim_date(c1) < wd.compare.get_claim_date(c2) end -- fonction pour renverser l’ordre d’une autre fonction function wd.compare.rev(comp_criteria) return function(c1, c2) -- attention les tris en lua attendent des fonctions de comparaison strictement inférieur, on doit -- vérifier la non égalité quand on inverse l’ordre d’un critère, d’ou "and comp_criteria(c2,c1)" return not(comp_criteria(c1,c2)) and comp_criteria(c2,c1) end end -- Fonction qui trie des Claims de type time selon l'ordre chronologique -- Une clé de tri nomée « dateSortKey » est ajouté à chaque claim. -- Si des clés de tri de ce nom existent déjà, elles sont utilisées sans modification. function wd.chronoSort( claims, sorttype ) for _, claim in ipairs( claims ) do if not claim.dateSortKey then if sorttype and (sorttype == 'age' or sorttype == 'ageinverted') then claim.dateSortKey = wd.compare.get_claim_date(claim, 'personbirthdate') else claim.dateSortKey = wd.compare.get_claim_date(claim) end if sorttype and (sorttype == 'inverted' or sorttype == 'ageinverted') and claim.dateSortKey == math.huge then claim.dateSortKey = -math.huge -- quand la donnée est manquante on lui assigne la valeur qui entraîne le classement en fin de liste end end end table.sort( claims, function ( c1, c2 ) if sorttype and (sorttype == 'inverted' or sorttype == 'ageinverted') then return c2.dateSortKey < c1.dateSortKey end return c1.dateSortKey < c2.dateSortKey end ) return claims end local function get_numeric_claim_value(claim, propertySort) local val local claimqualifs = claim.qualifiers if claimqualifs then local vals = claimqualifs[propertySort] if vals and vals[1].snaktype == 'value' then val = vals[1].datavalue.value end end return tonumber(val or 0) end function wd.compare.numeric(propertySort) return function(c1, c2) return get_numeric_claim_value(c1, propertySort) < get_numeric_claim_value(c2, propertySort) end end -- Fonction qui trie des Claims de type value selon l'ordre de la propriété fournit -- Une clé de tri nomée « dateSortKey » est ajouté à chaque claim. -- Si des clés de tri de ce nom existent déjà, elles sont utilisées sans modification. function wd.numericPropertySort( claims, propertySort ) for _, claim in ipairs( claims ) do if not claim.dateSortKey then local val = get_numeric_claim_value(claim, propertySort) claim.dateSortKey = tonumber(val or 0) end end table.sort( claims, function ( c1, c2 ) return c1.dateSortKey < c2.dateSortKey end ) return claims end --[[ test possible en console pour la fonction précédente : = p.formatStatements{entity = "Q375946", property = 'P50', sorttype = 'P1545', linkback = "true"} --]] -- =================== function wd.getReferences(statement) local refdata = statement.references if not refdata then return nil end local refs = {} local hashes = {} for i, ref in pairs(refdata) do local s local function hasValue(prop) -- checks that the prop is here with valid value if ref.snaks[prop] and ref.snaks[prop][1].snaktype == 'value' then return true end return false end if ref.snaks.P248 then -- cas lorsque P248 (affirmé dans) est utilisé for j, source in pairs(ref.snaks.P248) do if source.snaktype == 'value' then local page, accessdate, quotation if hasValue('P304') then -- page page = wd.formatSnak(ref.snaks.P304[1]) end if hasValue('P813') then -- date de consultation accessdate = wd.formatSnak(ref.snaks.P813[1]) end if hasValue('P1683') then -- citation quotation = wd.formatSnak(ref.snaks.P1683[1]) end local sourceId = wd.getId(source) s = modules.reference.citeitem(sourceId, {['page'] = page, ['accessdate'] = accessdate, ['citation'] = quotation}) table.insert(refs, s) table.insert(hashes, ref.hash .. sourceId) end end elseif hasValue('P8091') or hasValue('P854') then -- cas lorsque P8091 (Archival Resource Key) ou P854 (URL de la référence)est utilisé local arkKey, url, title, author, publisher, accessdate, publishdate, publishlang, quotation, description if hasValue('P8091') then arkKey = wd.formatSnak(ref.snaks.P8091[1], {text = "-"}) url = 'https://n2t.net/' .. arkKey if hasValue('P1476') then title = wd.formatSnak(ref.snaks.P1476[1]) else title = arkKey end elseif hasValue('P854') then url = wd.formatSnak(ref.snaks.P854[1], {text = "-"}) if hasValue('P1476') then title = wd.formatSnak(ref.snaks.P1476[1]) else title = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3') end end --todo : handle multiple values for author, etc. if hasValue('P1810') then -- sou non description = 'sou non ' .. wd.formatSnak(ref.snaks.P1810[1]) end if hasValue('P813') then -- dat konsiltasyon accessdate = wd.formatSnak(ref.snaks.P813[1]) end if hasValue('P50') then -- author (item type) author = wd.formatSnak(ref.snaks.P50[1]) elseif hasValue('P2093') then -- author (string type) author = wd.formatSnak(ref.snaks.P2093[1]) end if hasValue('P123') then -- éditeur publisher = wd.formatSnak(ref.snaks.P123[1]) end if hasValue('P1683') then -- citation quotation = wd.formatSnak(ref.snaks.P1683[1]) end if hasValue('P577') then -- date de publication publishdate = wd.formatSnak(ref.snaks.P577[1]) end if hasValue('P407') then -- langue de l'œuvre local id = wd.getId(ref.snaks.P407[1]) publishlang = getLangCode(id) end s = modules.cite.lienWeb{titre = title, url = url, auteur = author, editeur = publisher, langue = publishlang, ['en ligne le'] = publishdate, ['consulté le'] = accessdate, ['citation'] = quotation, ['description'] = description} table.insert(hashes, ref.hash) table.insert(refs, s) elseif ref.snaks.P854 and ref.snaks.P854[1].snaktype == 'value' then s = wd.formatSnak(ref.snaks.P854[1], {text = "-"}) table.insert(hashes, ref.snaks.P854[1].hash) table.insert(refs, s) end end if #refs > 0 then if #hashes == #refs then return refs, hashes end return refs end end function wd.sourceStr(sources, hashes) if not sources or (#sources == 0) then return nil end local useHashes = hashes and #hashes == #sources for i, j in ipairs(sources) do local refArgs = {name = 'ref', content = j} if useHashes and hashes[i] ~= '-' then refArgs.args = {name = 'wikidata-' .. hashes[i]} end sources[i] = mw.getCurrentFrame():extensionTag(refArgs) end return table.concat(sources, '<sup class="reference cite_virgule">,</sup>') end function wd.getDataValue(snak, params) if not params then params = {} end local speciallabels = params.speciallabels -- parfois on a besoin de faire une liste d'éléments pour lequel le libellé doit être changé, pas très pratique d'utiliser une fonction pour ça if snak.snaktype ~= 'value' then return nil end local datatype = snak.datatype local value = snak.datavalue.value local displayformat = params.displayformat if type(displayformat) == 'function' then return displayformat(snak, params) end if datatype == 'wikibase-item' then return wd.formatEntity(wd.getId(snak), params) end if datatype == 'url' then if params.displayformat == 'raw' then return value else return modules.weblink.makelink(value, params.text) end end if datatype == 'math' then return mw.getCurrentFrame():extensionTag( "math", value) end if datatype == 'tabular-data' then return mw.ustring.sub(value, 6, 100) -- returns the name of the file, without the "Data:" prefix end if (datatype == 'string') or (datatype == 'external-id') or (datatype == 'commonsMedia') then -- toutes les données de type string sauf "math" if params.urlpattern then local urlpattern = params.urlpattern if type(urlpattern) == 'function' then urlpattern = urlpattern(value) end -- encodage de l'identifiant qui se retrouve dans le path de l'URL, à l'exception des slashes parfois rencontrés, qui sont des séparateurs à ne pas encoder local encodedValue = mw.uri.encode(value, 'PATH'):gsub('%%2F', '/') -- les parenthèses autour du encodedValue:gsub() sont nécessaires, sinon sa 2e valeur de retour est aussi passée en argument au mw.ustring.gsub() parent local url = mw.ustring.gsub(urlpattern, '$1', (encodedValue:gsub('%%', '%%%%'))) value = '[' .. url .. ' ' .. (params.text or value) .. ']' end return value end if datatype == 'time' then -- format example: +00000001809-02-12T00:00:00Z if displayformat == 'raw' then return value.time else local dateobject = dateObject(value, {precision = params.precision}) return objectToText(dateobject, params) end end if datatype == 'globe-coordinate' then -- retourne une table avec clés latitude, longitude, précision et globe à formater par un autre module (à changer ?) if displayformat == 'latitude' then return value.latitude elseif displayformat == 'longitude' then return value.longitude else local coordvalue = mw.clone( value ) coordvalue.globe = databases.globes[value.globe] -- transforme l'ID du globe en nom anglais utilisable par geohack return coordvalue -- note : les coordonnées Wikidata peuvent être utilisée depuis Module:Coordinates. Faut-il aussi autoriser à appeler Module:Coordiantes ici ? end end if datatype == 'quantity' then -- todo : gérer les paramètres précision local amount, unit = value.amount, value.unit if unit then unit = unit:match('Q%d+') end if not unit then unit = 'dimensionless' end local raw if displayformat == "raw" then raw = true end return modules.formatNum.displayvalue(amount, unit, {targetunit = params.targetunit, raw = raw, rounding = params.rounding, showunit = params.showunit or 'short', showlink = params.showlink} ) end if datatype == 'monolingualtext' then if value.language == defaultlang then return value.text else return modules.langmodule.langue({value.language, value.text, nocat=true}) end end return formatError('unknown-datavalue-type' ) end function wd.stringTable(args) -- like getClaims, but get a list of string rather than a list of snaks, for easier manipulation local claims = args.claims local cat = '' if not claims then claims = wd.getClaims(args) end if not claims or claims == {} then return {}, {}, cat end if args.removedupesdate and (args.removedupesdate ~= '-') then claims, cat = removeDupesDate(claims, args.removedupesdate) end local props = {} -- liste des propriétés associété à chaque string pour catégorisation et linkback for i, j in pairs(claims) do claims[i] = wd.formatStatement(j, args) table.insert(props, j.mainsnak.property) end if args.removedupes and (args.removedupes ~= '-') then claims = wd.addNewValues({}, claims) -- devrait aussi supprimer de props celles qui ne sont pas utilisées end return claims, props, cat end function wd.getQualifiers(statement, qualifs, params) if not statement.qualifiers then return nil end local vals = {} if type(qualifs) == 'string' then qualifs = wd.splitStr(qualifs) end for i, j in pairs(qualifs) do if statement.qualifiers[j] then for k, l in pairs(statement.qualifiers[j]) do table.insert(vals, l) end end end if #vals == 0 then return nil end return vals end function wd.getFormattedQualifiers(statement, qualifs, params) if not params then params = {} end local qualiftable = wd.getQualifiers(statement, qualifs) if not qualiftable then return nil end qualiftable = wd.filterClaims(qualiftable, params) or {} for i, j in pairs(qualiftable) do qualiftable[i] = wd.formatSnak(j, params) end return modules.linguistic.conj(qualiftable, params.conjtype) end function wd.showQualifiers(str, statement, args) local qualifs = args.showqualifiers if not qualifs then return str -- or error ? end if type(qualifs) == 'string' then qualifs = wd.splitStr(qualifs) end local qualifargs = args.qualifargs or {} -- formatage des qualificatifs = args commençant par "qualif", ou à défaut, les mêmes que pour la valeur principale qualifargs.displayformat = args.qualifdisplayformat or args.displayformat qualifargs.labelformat = args.qualiflabelformat or args.labelformat qualifargs.labelformat2 = args.qualiflabelformat2 or args.labelformat2 qualifargs.link = args.qualiflink or args.link qualifargs.linktopic = args.qualiflinktopic or args.linktopic qualifargs.conjtype = args.qualifconjtype qualifargs.precision = args.qualifprecision qualifargs.targetunit = args.qualiftargetunit qualifargs.defaultlink = args.qualifdefaultlink or args.defaultlink qualifargs.defaultlinkquery = args.qualifdefaultlinkquery or args.defaultlinkquery local formattedqualifs if args.qualifformat and type (args.qualifformat) == 'function' then formattedqualifs = args.qualifformat(statement, qualifs, qualifargs) else formattedqualifs = wd.getFormattedQualifiers(statement, qualifs, qualifargs) end if formattedqualifs and formattedqualifs ~= "" then str = str .. " (" .. formattedqualifs .. ")" end return str end function wd.formatSnak( snak, params ) if not params then params = {} end -- pour faciliter l'appel depuis d'autres modules if snak.snaktype == 'somevalue' then return unknownValue(snak, params.unknownlabel) elseif snak.snaktype == 'novalue' then return noValue(params.novaluelabel) elseif snak.snaktype == 'value' then return wd.getDataValue( snak, params) else return formatError( 'unknown-snak-type' ) end end function wd.formatStatement( statement, args ) -- FONCTION A REORGANISER (pas très lisible) if not args then args = {} end if not statement.type or statement.type ~= 'statement' then return formatError( 'unknown-claim-type' ) end local prop = statement.mainsnak.property local str -- special displayformat f if args.statementformat and (type(args.statementformat) == 'function') then str = args.statementformat(statement, args) elseif (statement.mainsnak.datatype == 'time') and (statement.mainsnak.dateformat ~= '-') then if args.displayformat == 'raw' and statement.mainsnak.snaktype == 'value' then str = statement.mainsnak.datavalue.value.time else str = wd.getFormattedDate(statement, args) end elseif args.showonlyqualifier and (args.showonlyqualifier ~= '') then str = wd.getFormattedQualifiers(statement, args.showonlyqualifier, args) if not str then return nil end if args.addstandardqualifs ~= '-' then str = wd.addStandardQualifs(str, statement) end else str = wd.formatSnak( statement.mainsnak, args ) if (args.addstandardqualifs ~= '-') and (args.displayformat ~= 'raw') then str = wd.addStandardQualifs(str, statement) end end -- ajouts divers if args.showlang == true then local indicateur = showLang(statement, args.maxLang) if indicateur then str = indicateur .. '&nbsp;' .. str end end if args.showqualifiers then str = wd.showQualifiers(str, statement, args) end if args.showdate then -- when "showdate and chronosort are both set, date retrieval is performed twice local period = wd.getFormattedDate(statement, args, "-") -- 3 arguments indicate the we should not use additional qualifiers, already added by wd.formatStatement if period then str = str .. " <small>(" .. period .. ")</small>" end end if args.showsource and args.showsource ~= '-' then local sources, hashes = wd.getReferences(statement) if sources then local source = wd.sourceStr(sources, hashes) if source then str = str .. source end end end return str end function wd.addLinkBack(str, id, property) if not id or id == '' then id = wd.getEntityIdForCurrentPage() end if not id then return str end if type(property) == 'table' then property = property[1] end id = wd.entityId(id) 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 = wd.translate('see-wikidata-value') local url = mw.uri.fullUrl('d:' .. id, 'uselang=fr') url.fragment = property -- ajoute une #ancre si paramètre "property" défini url = tostring(url) local v = mw.html.create('span') :addClass(class) :wikitext(str) :tag('span') :addClass('noprint wikidata-linkback') :wikitext(icon:format(title, url)) :allDone() return tostring(v) end function wd.addRefAnchor(str, id) --[[ Insère une ancre pour une référence générée à partir d'un élément wd. L'id Wikidata sert d'identifiant à l'ancre, à utiliser dans les modèles type "harvsp" --]] return tostring( mw.html.create('span') :attr('id', id) :attr('class', "ouvrage") :wikitext(str) ) end --=== FUNCTIONS USING AN ENTITY AS ARGUMENT === local function formatStatementsGrouped(args, type) -- regroupe les affirmations ayant la même valeur en mainsnak, mais des qualificatifs différents -- (seulement pour les propriétés de type élément) local claims = wd.getClaims(args) if not claims then return nil end local groupedClaims = {} -- regroupe les affirmations par valeur de mainsnak local function addClaim(claim) local id = wd.getMainId(claim) for i, j in pairs(groupedClaims) do if (j.id == id) then table.insert(groupedClaims[i].claims, claim) return end end table.insert(groupedClaims, {id = id, claims = {claim}}) end for i, claim in pairs(claims) do addClaim(claim) end local stringTable = {} -- instructions ad hoc pour les paramètres concernant la mise en forme d'une déclaration individuelle local funs = { {param = "showqualifiers", fun = function(str, claims) local qualifs = {} for i, claim in pairs(claims) do local news = wd.getFormattedQualifiers(claim, args.showqualifiers, args) if news then table.insert(qualifs, news) end end local qualifstr = modules.linguistic.conj(qualifs, wd.translate("qualif-separator")) if qualifstr and qualifstr ~= "" then str = str .. " (" .. qualifstr .. ")" end return str end }, {param = "showdate", fun = function(str, claims) -- toutes les dates sont regroupées à l'intérieur des mêmes parenthèses ex "médaille d'or (1922, 1924)" local dates = {} for i, statement in pairs(claims) do local s = wd.getFormattedDate(statement, args, true) if statement then table.insert(dates, s) end end local datestr = modules.linguistic.conj(dates) if datestr and datestr ~= "" then str = str .. " <small>(" .. datestr .. ")</small>" end return str end }, {param = "showsource", fun = function(str, claims) -- les sources sont toutes affichées au même endroit, à la fin -- si deux affirmations ont la même source, on ne l'affiche qu'une fois local sources = {} local hashes = {} local function dupeRef(old, new) for i, j in pairs(old) do if j == new then return true end end end for i, claim in pairs(claims) do local refs, refHashes = wd.getReferences(claim) if refs then for i, j in pairs(refs) do if not dupeRef(sources, j) then table.insert(sources, j) local hash = (refHashes and refHashes[i]) or '-' table.insert(hashes, hash) end end end end return str .. (wd.sourceStr(sources, hashes) or "") end } } for i, group in pairs(groupedClaims) do -- bricolage pour utiliser les arguments de formatStatements local str = wd.formatEntity(group.id, args) if not str then str = '???' -- pour éviter erreur Lua si formatEntity a retourné nil end for i, fun in pairs(funs) do if args[fun.param] then str = fun.fun(str, group.claims, args) end end table.insert(stringTable, str) end args.valuetable = stringTable return wd.formatStatements(args) end function wd.formatStatements( args )--Format statement and concat them cleanly if args.value == '-' then return nil end -- If a value is already set: use it, except if it's the special value {{WD}} (use wikidata) if args.value and args.value ~= '' then local valueexpl = wd.translate("activate-query") if args.value ~= valueexpl then return args.value end -- There is no value set, and args.expl disables wikidata on empty values elseif args.expl then return nil end if args.grouped and args.grouped ~= '' then args.grouped = false return formatStatementsGrouped(args) end local valuetable = args.valuetable -- dans le cas où les valeurs sont déjà formatées local props -- les propriétés réellement utilisées (dans certains cas, ce ne sont pas toutes celles de args.property local cat = '' if not valuetable then -- cas le plus courant valuetable, props, cat = wd.stringTable(args) end if args.ucfirst == '-' and args.conjtype == 'new line' then args.conjtype = 'lowercase new line' end local str = modules.linguistic.conj(valuetable, args.conjtype) if not str then return args.default end if not props then props = wd.splitStr(args.property)[1] end if args.ucfirst ~= '-' then str = modules.linguistic.ucfirst(str) end if args.addcat and (args.addcat ~= '-') then str = str .. wd.addTrackingCat(props) .. cat end if args.linkback and (args.linkback ~= '-') then str = wd.addLinkBack(str, args.entity, props) end if args.returnnumberofvalues then return str, #valuetable end return str end function wd.formatAndCat(args) if not args then return nil end args.linkback = args.linkback or true args.addcat = true if args.value then -- do not ignore linkback and addcat, as formatStatements do if args.value == '-' then return nil end local val = args.value .. wd.addTrackingCat(args.property) val = wd.addLinkBack(val, args.entity, args.property) return val end return wd.formatStatements( args ) end function wd.getTheDate(args) local claims = wd.getClaims(args) if not claims then return nil end local formattedvalues = {} for i, j in pairs(claims) do local v = wd.getFormattedDate(j, args) if v then table.insert(formattedvalues, v ) end end local val = modules.linguistic.conj(formattedvalues) if not val then return nil end if args.addcat == true then val = val .. wd.addTrackingCat(args.property) end val = wd.addLinkBack(val, args.entity, args.property) return val end function wd.keyDate (event, item, params) params = params or {} params.entity = item if type(event) == 'table' then for i, j in pairs(event) do params.targetvalue = nil -- réinitialisation barbare des paramètres modifiés local s = wd.keyDate(j, item, params) if s then return s end end elseif type(event) ~= 'string' then return formatError('invalid-datatype', type(event), 'string') elseif string.sub(event, 1, 1) == 'Q' then -- on demande un élément utilisé dans P:P793 (événement clé) params.property = 'P793' params.targetvalue = event params.addcat = params.addcat or true return wd.getTheDate(params) elseif string.sub(event, 1, 1) == 'P' then -- on demande une propriété params.property = event return wd.formatAndCat(params) else return formatError('invalid-entity-id', event) end end function wd.mainDate(entity) -- essaye P580/P582 local args = {entity = entity, addcat = true} args.property = 'P580' local startpoint = wd.formatStatements(args) args.property = 'P582' local endpoint = wd.formatStatements(args) local str if (startpoint or endpoint) then str = modules.formatDate.daterange(startpoint, endpoint, params) str = wd.addLinkBack(str, entity, 'P582') return str end -- défaut : P585 args.property = {'P585', 'P571'} args.linkback = true return wd.formatStatements(args) end -- ==== Fonctions sur le genre ==== function wd.getgender(id) local vals = { ['Q6581072'] = 'f', -- féminin ['Q6581097'] = 'm', -- masculin ['Q1052281'] = 'f', -- femme transgenre ['Q2449503'] = 'm', -- homme transgenre ['Q17148251'] = 'f', -- en:Travesti (gender identity) ['Q43445'] = 'f', -- femelle ['Q44148'] = 'm', -- mâle default = '?' } local gender = wd.formatStatements{entity = id, property = 'P21', displayformat = 'raw', numval = 1} return vals[gender] or vals.default end -- catégories de genre/nombre function wd.getgendernum(claims) local personid, gender local anym = false local anyf = false local anyunknown = false for i, claim in pairs(claims) do local snak = claim.mainsnak or claim if(snak.snaktype == 'value') and (snak.datatype == 'wikibase-item') then personid = wd.getId(snak) gender = wd.getgender(personid) anym = anym or (gender == 'm') anyf = anyf or (gender == 'f') anyunknown = anyunknown or (gender == '?') else anyunknown = true end end local gendernum if #claims > 1 then if anyunknown then gendernum = 'p' else if anym and not anyf then gendernum = 'mp' end if anyf and not anym then gendernum = 'fp' end if anym and anyf then gendernum = 'mixtep' end end else gendernum = 's' if anym then gendernum = 'ms' end if anyf then gendernum = 'fs' end end return gendernum end -- récupération des libellés genrés de Wikidata function wd.genderedlabel(id, labelgender) local label if not labelgender then return nil end if labelgender == 'f' then -- femme : chercher le libellé dans P2521 (libellé féminin) label = wd.formatStatements{entity = id, property = 'P2521', isinlang = 'ht', numval = 1, ucfirst = '-'} elseif labelgender == 'm' then -- homme : chercher le libellé dans P3321 (libellé masculin) label = wd.formatStatements{entity = id, property = 'P3321', isinlang = 'ht', numval = 1, ucfirst = '-'} end if not label then label = wd.getLabel(id) end return label end -- === FUNCTIONS FOR TRANSITIVE PROPERTIES === function wd.getIds(item, query) query.excludespecial = true query.displayformat = 'raw' query.entity = item query.addstandardqualifs = '-' return wd.stringTable(query) end -- recursively adds a list of qid to an existing list, based on the results of a query function wd.addVals(list, query, maxdepth, maxnodes, stopval) maxdepth = tonumber(maxdepth) or 10 maxnodes = tonumber(maxnodes) or 100 if (maxdepth < 0) then return list end if stopval and wd.isHere(list, stopval) then return list end local origsize = #list for i = 1, origsize do -- tried a "checkpos" param instead of starting to 1 each time, but no impact on performance local candidates = wd.getIds(list[i], query) list = wd.addNewValues(list, candidates, maxnodes, stopval) if list[#list] == stopval then return list end if #list >= maxnodes then return list end end if (#list == origsize) then return list end return wd.addVals(list, query, maxdepth - 1, maxnodes, stopval, origsize + 1) end -- returns a list of items transitively matching a query (orig item is not included in the list) function wd.transitiveVals(item, query, maxdepth, maxnodes, stopval) maxdepth = tonumber(maxdepth) or 5 if type(query) == "string" then query = {property = query} end -- récupération des valeurs local vals = wd.getIds(item, query) if not vals then return nil end local v = wd.addVals(vals, query, maxdepth - 1, maxnodes, stopval) if not v then return nil end -- réarrangement des valeurs if query.valorder == "inverted" then local a = {} for i = #v, 1, -1 do a[#a+1] = v[i] end v = a end return v end -- returns true if an item is the value of a query, transitively function wd.inTransitiveVals(searchedval, sourceval, query, maxdepth, maxnodes ) local vals = wd.transitiveVals(sourceval, query, maxdepth, maxnodes, searchedval ) if (not vals) then return false end for _, val in ipairs(vals) do if (val == searchedval) then return true end end return false end -- returns true if an item is a superclass of another, based on P279 function wd.isSubclass(class, item, maxdepth) local query = {property = 'P279'} if class == item then -- item is a subclass of itself iff it is a class if wd.getIds(item, query) then return true end return false end return wd.inTransitiveVals(class, item, query, maxdepth ) end -- returns true if one of the best ranked P31 values of an item is the target or a subclass of the target -- rank = 'valid' would seem to make sense, but it would need to check for date qualifiers as some P31 values have begin or end date function wd.isInstance(targetclass, item, maxdepth) maxdepth = maxdepth or 10 local directclasses = wd.transitiveVals(item, {property = 'P31'}, 1) if not directclasses then return false end for i, class in pairs(directclasses) do if wd.isSubclass(targetclass, class, maxdepth - 1) then return true end end return false end -- return the first value in a transitive query that belongs to a particular class. For instance find a value of P131 that is a province of Canada function wd.findVal(sourceitem, targetclass, query, recursion, instancedepth) if type(query) == "string" then query = {property = query} end local candidates = wd.getIds(sourceitem, query) if candidates then for i, j in pairs(candidates) do if wd.isInstance(targetclass, j, instancedepth) then return j end end if not recursion then recursion = 3 else recursion = recursion - 1 end if recursion < 0 then return nil end for i, candidate in pairs(candidates) do return wd.findVal(candidate, targetclass, query, recursion, instancedepth) end end end -- === VARIA === function wd.getDescription(entity, lang) lang = lang or defaultlang local description if lang == defaultlang then return mw.wikibase.description(qid) end if not entity.descriptions then return wd.translate('no description') end local descriptions = entity.descriptions if not descriptions then return nil end if descriptions[lang] then return descriptions[delang].value end return entity.id end function wd.Dump(entity) entity = wd.getEntity(entity) if not entity then return formatError("entity-param-not-provided") end return "<pre>"..mw.dumpObject(entity).."</pre>" end function wd.frameFun(frame) local args = frame.args local funname = args[1] table.remove(args, 1) return wd[funname](args) end return wd l680m4j62edehkk2088mwdrai6ra7wu 855595 855594 2024-11-12T16:47:43Z BwaKajou 31668 855595 Scribunto text/plain --script that retrieves basic data stored in Wikidata, for the datamodel, see https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua local wd = {} -- creation of a subobject to store comparison funtions, used for sorting claims -- to be able to build more complex sorts like topological sorts wd.compare = {} local databases = { } local modules = { } local databasesNames = { -- modules de données statiques pouvant être appelés avec mw.loadData(), ne nécessitant pas require() i18n = 'Module:Wikidata/I18n', globes = 'Module:Wikidata/Globes', langhierarchy = 'Module:Wikidata/Hiérarchie des langues', langcodes = 'Module:Dictionnaire Wikidata/Codes langue', -- big, infrequently useda invertedlangcodes = 'Module:Dictionnaire Wikidata/Codes langue/inversé' } local modulesNames = { reference = 'Module:Wikidata/Références', linguistic = 'Module:Linguistique', datemodule = 'Module:Date', formatDate = 'Module:Date complexe', formatNum = 'Module:Conversion', langmodule = 'Module:Langue', cite = 'Module:Biblio', weblink = 'Module:Weblink' } local function loadDatabase( t, key ) if databasesNames[key] then local m = mw.loadData( databasesNames[key] ) t[key] = m return m end end local function loadModule( t, key ) if modulesNames[key] then local m = require( modulesNames[key] ) t[key] = m return m end end setmetatable( databases, { __index = loadDatabase } ) setmetatable( modules, { __index = loadModule } ) -- ainsi le require() sera opéré seulement si nécessaire par modules.(nom du module) local datequalifiers = {'P585', 'P571', 'P580', 'P582', 'P1319', 'P1326'} -- === I18n === local defaultlang = mw.getContentLanguage():getCode() function wd.translate(str, rep1, rep2) str = databases.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 local function addCat(cat, sortkey) if sortkey then return '[[Category:' .. cat .. '|' .. sortkey .. ']]' end return '[[Category:' .. cat .. ']]' end local function formatError( key , category, debug) if debug then return error(databases.i18n[key] or key) end if category then return addCat(category, key) else return addCat('cat-unsorted-issue', key) end end -- function wd.isSpecial(snak) return (snak.snaktype ~= 'value') end function wd.getId(snak) if (snak.snaktype == 'value') then return 'Q' .. snak.datavalue.value['numeric-id'] end end function wd.getNumericId(snak) if (snak.snaktype == 'value') then return snak.datavalue.value['numeric-id'] end end function wd.getMainId(claim) return wd.getId(claim.mainsnak) end function wd.entityId(entity) if type(entity) == 'string' then return entity elseif type(entity) == 'table' then return entity.id end end function wd.getEntityIdForCurrentPage() return mw.wikibase.getEntityIdForCurrentPage() end -- function that returns true if the "qid" parameter is the qid -- of the item that is linked to the calling page function wd.isPageOfQId(qid) local self_id = mw.wikibase.getEntityIdForCurrentPage() return self_id ~= nil and qid == self_id end function wd.getEntity( val ) if type(val) == 'table' then return val end if val == '-' then return nil end if val == '' then val = nil end return mw.wikibase.getEntity(val) end function wd.splitStr(val) -- transforme en table les chaînes venant du Wikitexte qui utilisent des virgules de séparation if type(val) == 'string' then val = mw.text.split(val, ",") end return val end function wd.isHere(searchset, val, matchfunction) for i, j in pairs(searchset) do if matchfunction then if matchfunction(val,j) then return true end else if val == j then return true end end end return false end local function wikidataLink(entity) local name =':d:' if type(entity) == 'string' then if entity:match("P[0-9+]") then entity = "Property:" .. entity end return name .. entity elseif type(entity) == 'table' then if entity["tip"] == "property" then name = ":d:Property:" end return name .. entity.id elseif type(entity) == nil then return formatError('entity-not-found') end end function wd.siteLink(entity, project, lang) -- returns 3 values: a sitelink (with the relevant prefix) a project name and a language lang = lang or defaultlang if (type(project) ~= 'string') then project = 'wiki' end project = project:lower() if project == 'wikipedia' then project = 'wiki' end if type(entity) == 'string' and (project == 'wiki') and ( (not lang or lang == defaultlang) ) then -- évite de charger l'élément entier local link = mw.wikibase.getSitelink(entity) if link then local test_redirect = mw.title.new(link) -- remplacement des redirections (retirer si trop coûteux) if test_redirect.isRedirect and test_redirect.redirectTarget then link = test_redirect.redirectTarget.fullText end end return link, 'wiki', defaultlang end if project == 'wikidata' then return wikidataLink(entity), 'wikidata' end local projects = { -- nom = {préfixe sur Wikidata, préfix pour les liens sur Wikipédia, ajouter préfixe de langue} wiki = {'wiki', nil, true}, -- wikipedia commons = {'commonswiki', 'commons', false}, commonswiki = {'commonswiki', 'commons', false}, wikiquote = {'wikiquote', 'q', true}, wikivoyage = {'wikivoyage', 'voy', true}, wikibooks = {'wikibooks', 'b', true}, wikinews = {'wikinews', 'n', true}, wikiversity = {'wikiversity', 'v', true}, wikisource = {'wikisource', 's', true}, wiktionary = {'wiktionary', 'wikt', true}, specieswiki = {'specieswiki', 'species', false}, metawiki = {'metawiki', 'm', false}, incubator = {'incubator', 'incubator', false}, outreach = {'outreach', 'outreach', false}, mediawiki = {'mediawiki', 'mw', false} } local entityid = entity.id or entity local projectdata = projects[project:lower()] if not projectdata then -- defaultlink might be in the form "dewiki" rather than "project: 'wiki', lang: 'de' " for k, v in pairs(projects) do if project:match( k .. '$' ) and mw.language.isKnownLanguageTag(project:sub(1, #project-#k)) then lang = project:sub(1, #project-#k) project = project:sub(#lang + 1, #project) projectdata = projects[project] break end end if not mw.language.isKnownLanguageTag(lang) then return --formatError('invalid-project-code', projet or 'nil') end end if not projectdata then return -- formatError('invalid-project-code', projet or 'nil') end local linkcode = projectdata[1] local prefix = projectdata[2] local multiversion = projectdata[3] if multiversion then linkcode = lang .. linkcode end local link = mw.wikibase.getSitelink(entityid, linkcode) if not link then return nil end if prefix then link = prefix .. ':' .. link end if multiversion then link = ':' .. lang .. ':' .. link end return link, project, lang end -- add new values to a list, avoiding duplicates function wd.addNewValues(olditems, newitems, maxnum, stopval) if not newitems then return olditems end for _, qid in pairs(newitems) do if stopval and (qid == stopval) then table.insert(olditems, qid) return olditems end if maxnum and (#olditems >= maxnum) then return olditems end if not wd.isHere(olditems, qid) then table.insert(olditems, qid) end end return olditems end --=== FILTER CLAIMS ACCORDING TO VARIOUS CRITERIA : FUNCTION GETCLAIMS et alii === local function notSpecial(claim) local type if claim.mainsnak ~= nil then type = claim.mainsnak.snaktype else -- condition respectée quand showonlyqualifier est un paramètre renseigné -- dans ce cas, claim n'est pas une déclaration entière, mais UNE snak qualifiée du main snak type = claim.snaktype end return type == 'value' end local function hasTargetValue(claim, targets) -- retourne true si la valeur est dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial local id = wd.getMainId(claim) local targets = wd.splitStr(targets) return wd.isHere(targets, id) or wd.isSpecial(claim.mainsnak) end local function excludeValues(claim, values) -- true si la valeur n'est pas dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial) return wd.isSpecial(claim.mainsnak) or not ( hasTargetValue(claim, values) ) end local function hasTargetClass(claim, targets, maxdepth) -- retourne true si la valeur est une instance d'une classe dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial local id = wd.getMainId(claim) local targets = wd.splitStr(targets) local maxdepth = maxdepth or 10 local matchfunction = function(value, target) return wd.isInstance(target, value, maxdepth) end return wd.isHere(targets, id, matchfunction) or wd.isSpecial(claim.mainsnak) end local function excludeClasses(claim, classes) -- true si la valeur n'est pas une instance d'une classe dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial) return wd.isSpecial(claim.mainsnak) or not ( hasTargetClass(claim, classes, maxdepth) ) end local function hasTargetSuperclass(claim, targets, maxdepth) -- retourne true si la valeur est une sous-classe d'une classe dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial local id = wd.getMainId(claim) local targets = wd.splitStr(targets) local maxdepth = maxdepth or 10 local matchfunction = function(value, target) return wd.isSubclass(target, value, maxdepth) end return wd.isHere(targets, id, matchfunction) or wd.isSpecial(claim.mainsnak) end local function excludeSuperclasses(claim, classes) -- true si la valeur n'est pas une sous-classe d'une classe dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial) return wd.isSpecial(claim.mainsnak) or not ( hasTargetSuperclass(claim, classes, maxdepth) ) end local function bestRanked(claims) if not claims then return nil end local preferred, normal = {}, {} for i, j in pairs(claims) do if j.rank == 'preferred' then table.insert(preferred, j) elseif j.rank == 'normal' then table.insert(normal, j) end end if #preferred > 0 then return preferred else return normal end end local function withRank(claims, target) if target == 'best' then return bestRanked(claims) end local newclaims = {} for pos, claim in pairs(claims) do if target == 'valid' then if claim.rank ~= 'deprecated' then table.insert(newclaims, claim) end elseif claim.rank == target then table.insert(newclaims, claim) end end return newclaims end function wd.hasQualifier(claim, acceptedqualifs, acceptedvals, excludequalifiervalues) local claimqualifs = claim.qualifiers if (not claimqualifs) then return false end acceptedqualifs = wd.splitStr(acceptedqualifs) acceptedvals = wd.splitStr( acceptedvals) local function ok(qualif) -- vérification pour un qualificatif individuel if not claimqualifs[qualif] then return false end if not (acceptedvals) then -- si aucune valeur spécifique n'est demandée, OK return true end for i, wanted in pairs(acceptedvals) do for j, actual in pairs(claimqualifs[qualif]) do if wd.getId(actual) == wanted then return true end end end end for i, qualif in pairs(acceptedqualifs) do if ok(qualif) then return true end end return false end function wd.hasQualifierNumber(claim, acceptedqualifs, acceptedvals, excludequalifiervalues) local claimqualifs = claim.qualifiers if (not claimqualifs) then return false end acceptedqualifs = wd.splitStr(acceptedqualifs) acceptedvals = wd.splitStr( acceptedvals) local function ok(qualif) -- vérification pour un qualificatif individuel if not claimqualifs[qualif] then return false end if not (acceptedvals) then -- si aucune valeur spécifique n'est demandée, OK return true end for i, wanted in pairs(acceptedvals) do for j, actual in pairs(claimqualifs[qualif]) do if mw.wikibase.renderSnak(actual) == wanted then return true end end end end for i, qualif in pairs(acceptedqualifs) do if ok(qualif) then return true end end return false end local function hasSource(claim, targetsource, sourceproperty) sourceproperty = sourceproperty or 'P248' if targetsource == "-" then return true end if (not claim.references) then return false end local candidates = claim.references[1].snaks[sourceproperty] -- les snaks utilisant la propriété demandée if (not candidates) then return false end if (targetsource == "any") then -- si n'importe quelle valeur est acceptée tant qu'elle utilise en ref la propriété demandée return true end targetsource = wd.splitStr(targetsource) for _, source in pairs(candidates) do local s = wd.getId(source) for i, target in pairs(targetsource) do if s == target then return true end end end return false end local function excludeQualifier(claim, qualifier, qualifiervalues) return not wd.hasQualifier(claim, qualifier, qualifiervalues) end function wd.hasDate(claim) if not claim then return false --error() ? end if wd.getDateFromQualif(claim, 'P585') or wd.getDateFromQualif(claim, 'P580') or wd.getDateFromQualif(claim, 'P582') then return true end return false end local function hasLink(claim, site, lang) if (claim.mainsnak.snaktype ~= 'value') then -- ne pas supprimer les valeurs spéciales, il y a une fonction dédiée pour ça return true end local id = wd.getMainId(claim) local link = wd.siteLink(id, site, lang) if link then return true end end local function isInLanguage(claim, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ? if type(lang) == 'table' then -- si c'est une table de language séparées par des virgules, on les accepte toutes for i, l in pairs(lang) do local v = isInLanguage(claim, l) if v then return true end end end if type(lang) ~= ('string') then return --? end if (lang == '-') then return true end if (lang == 'locallang') then lang = mw.getContentLanguage():getCode() end -- pour les monolingual text local snak = claim.mainsnak or claim if snak.snaktype == 'value' and snak.datavalue.type == 'monolingualtext' then if snak.datavalue.value.language == lang then return true end return false end -- pour les autres types de données : recherche dans les qualificatifs if (lang == 'ht') then lang = 'Q33491' elseif (lang == 'en') then lang = 'Q1860' else lang = databases.invertedlangcodes[lang] end if claim.qualifiers and claim.qualifiers.P407 then if wd.hasQualifier(claim, {'P407'}, {lang}) then return true else return false end end return true -- si on ne ne sait pas la langue, on condière que c'est bon end local function firstVals(claims, numval) -- retourn les numval premières valeurs de la table claims local numval = tonumber(numval) or 0 -- raise a error if numval is not a positive integer ? if not claims then return nil end while (#claims > numval) do table.remove(claims) end return claims end local function lastVals(claims, numval2) -- retourn les valeurs de la table claims à partir de numval2 local numval2 = tonumber(numval2) or 0 -- raise a error if numval is not a positive integer ? if not claims then return nil end for i=1,numval2 do table.remove(claims, 1) end return claims end -- retourne les valeurs de la table claims à partir de removedupesdate, -- sans les dates en doublons avec conversion entre les calendrier julien et grégorien, -- ou uniquement en catégorisant si le paramètre removedupesdate est égale à 'cat' local function removeDupesDate(claims, removedupesdate) if not claims or #claims < 2 then return claims, '' end local cat = '' local newClaims = {} local newIsos = {} local function findIndex(searchset, val) -- similaire à wd.isHere mais retourne l'index de la valeur trouvée for i, j in pairs(searchset) do if val == j then return i end end return -1 end for _, claim in ipairs( claims ) do local snak = claim.mainsnak or claim if (snak.snaktype == 'value') and (snak.datatype == 'time') and snak.datavalue.value.precision >= 11 then -- s'il s'agit d'un time et que la précision est au moins l'année local iso = snak.datavalue.value.time _, _, iso = string.find(iso, "(+%d+-%d+-%d+T)") local deleteIfDuplicate = false if snak.datavalue.value.calendarmodel == 'http://www.wikidata.org/entity/Q1985727' then -- si la date est grégorienne if modules.formatDate.before('+1582', iso) then -- si avant 1582 on calcule la date julienne _, _, y, m, d = string.find(iso, "+(%d+)-(%d+)-(%d+)T") y, m , d = modules.datemodule.gregorianToJulian(y, m , d) if m < 10 then m = '0' .. m end if d < 10 then d = '0' .. d end iso = '+' .. y .. '-' .. m .. '-' .. d .. 'T' deleteIfDuplicate = true end local index = findIndex(newIsos, iso) if index >= 0 then -- si la date est déjà présente cat = cat .. '[[Catégorie:Article avec des dates identiques venant de wikidata dans le code de l\'infobox]]' if removedupesdate == "cat" then -- ne faire que catégoriser table.insert(newIsos, iso) table.insert(newClaims, claim) elseif not deleteIfDuplicate then -- supprimer l'autre date si la date courante n'a pas été convertie newClaims[index] = claim end -- sinon supprimer la date courante else -- pas de doublon table.insert(newIsos, iso) table.insert(newClaims, claim) end elseif snak.datavalue.value.calendarmodel == 'http://www.wikidata.org/entity/Q1985786' then -- si date julienne if not modules.formatDate.before('+1582', iso) then -- si après 1582 on calcule la date grégorienne _, _, y, m, d = string.find(iso, "+(%d+)-(%d+)-(%d+)T") y, m , d = modules.datemodule.julianToGregorian(y, m , d) if m < 10 then m = '0' .. m end if d < 10 then d = '0' .. d end iso = '+' .. y .. '-' .. m .. '-' .. d .. 'T' deleteIfDuplicate = true end local index = findIndex(newIsos, iso) if index >= 0 then -- si date déjà présente cat = cat .. '[[Catégorie:Article avec des dates identiques venant de wikidata dans le code de l\'infobox]]' if removedupesdate == "cat" then -- ne faire que catégoriser table.insert(newIsos, iso) table.insert(newClaims, claim) elseif not deleteIfDuplicate then -- supprimer l'autre date si la date courante n'a pas été convertie newClaims[index] = claim end -- sinon supprimer la date courante else -- pas de doublon table.insert(newIsos, iso) table.insert(newClaims, claim) end else -- autre calendrier table.insert(newIsos, iso) table.insert(newClaims, claim) end else -- précision insuffisante table.insert(newIsos, iso) table.insert(newClaims, claim) end end return newClaims, cat end local function timeFromQualifs(claim, qualifs) local claimqualifs = claim.qualifiers if not claimqualifs then return nil end for i, qualif in ipairs(qualifs or datequalifiers) do local vals = claimqualifs[qualif] if vals and (vals[1].snaktype == 'value') then return vals[1].datavalue.value.time, vals[1].datavalue.value.precision end end end local function atDate(claim, mydate) if mydate == "today" then mydate = os.date("!%Y-%m-%dT%TZ") end -- determines required precision depending on the atdate format local d = mw.text.split(mydate, "-") local myprecision if d[3] then myprecision = 11 -- day elseif d[2] then myprecision = 10 -- month else myprecision = 9 -- year end -- with point in time local d, storedprecision = timeFromQualifs(claim, {'P585'}) if d then return modules.formatDate.equal(mydate, d, math.min(myprecision, storedprecision)) end -- with start or end date -- TODO: precision local mindate = timeFromQualifs(claim, {'P580'}) local maxdate = timeFromQualifs(claim, {'P582'}) if modules.formatDate.before(mydate, mindate) and modules.formatDate.before(maxdate, mydate) then return true end return false end local function check(claim, condition) if type(condition) == 'function' then -- cas standard return condition(claim) end return formatError('invalid type', 'function', type(condition)) end local function minPrecision(claim, minprecision) local snak if claim.qualifiers then -- si une date est donnée en qualificatif, c'est elle qu'on utilise de préférence au mainsnak for i, j in ipairs(datequalifiers) do if claim.qualifiers[j] then snak = claim.qualifiers[j][1] break end end end if not snak then snak = claim.mainsnak or claim end if (snak.snaktype == 'value') and (snak.datatype == 'time') and (snak.datavalue.value.precision < minprecision) then return false end return true end function wd.sortClaims(claims, sorttype) if not claims then return nil end if wd.isHere({'chronological', 'order', 'inverted', 'age', 'ageinverted'}, sorttype) then return wd.chronoSort(claims, sorttype) elseif sorttype == 'ascending' then return wd.quantitySort(claims) elseif sorttype == 'descending' then return wd.quantitySort(claims, true) elseif type(sorttype) == 'function' then table.sort(claims, sorttype) return claims elseif type(sorttype) == 'string' and sorttype:sub(1, 1) == 'P' then return wd.numericPropertySort(claims, sorttype) end return claims end function wd.filterClaims(claims, args) --retire de la tables de claims celles qui sont éliminés par un des filters de la table des filters local function filter(condition, filterfunction, funargs) if not args[condition] then return end for i = #claims, 1, -1 do if not( filterfunction(claims[i], args[funargs[1]], args[funargs[2]], args[funargs[3]]) ) then table.remove(claims, i) end end end filter('isinlang', isInLanguage, {'isinlang'} ) filter('excludespecial', notSpecial, {} ) filter('condition', check, {'condition'} ) if claims[1] and claims[1].mainsnak then filter('targetvalue', hasTargetValue, {'targetvalue'} ) filter('targetclass', hasTargetClass, {'targetclass'} ) filter('targetsuperclass', hasTargetSuperclass, {'targetsuperclass'} ) filter('atdate', atDate, {'atdate'} ) filter('qualifier', wd.hasQualifier, {'qualifier', 'qualifiervalue'} ) filter('qualifiernumber', wd.hasQualifierNumber, {'qualifiernumber', 'qualifiernumbervalue'} ) filter('excludequalifier', excludeQualifier, {'excludequalifier', 'excludequalifiervalue'} ) filter('withsource', hasSource, {'withsource', 'sourceproperty'} ) filter('withdate', wd.hasDate, {} ) filter('excludevalues', excludeValues, {'excludevalues'}) filter('excludeclasses', excludeClasses, {'excludeclasses'}) filter('excludesuperclasses', excludeSuperclasses, {'excludesuperclasses'}) filter('withlink', hasLink, {'withlink', 'linklang'} ) filter('minprecision', minPrecision, {'minprecision'} ) claims = withRank(claims, args.rank or 'best') end if #claims == 0 then return nil end if args.sorttype then claims = wd.sortClaims(claims, args.sorttype) end if args.numval2 then claims = lastVals(claims, args.numval2) end if args.numval then claims = firstVals(claims, args.numval) end return claims end function wd.loadEntity(entity, cache) if type(entity) ~= 'table' then if cache then if not cache[entity] then cache[entity] = mw.wikibase.getEntity(entity) mw.log("cached") end return cache[entity] else if entity == '' or (entity == '-') then entity = nil end return mw.wikibase.getEntity(entity) end else return entity end end function wd.getClaims( args ) -- returns a table of the claims matching some conditions given in args if args.claims then -- if claims have already been set, return them return args.claims end local properties = args.property if type(properties) == 'string' then properties = wd.splitStr(string.upper(args.property)) end if not properties then return formatError( 'property-param-not-provided' ) end --Get entity local entity = args.entity if type(entity) == 'string' then if entity == '' then entity = nil end elseif type(entity) == 'table' then entity = entity.id end if (not entity) then entity = mw.wikibase.getEntityIdForCurrentPage() end if (not entity) or (entity == '-') or (entity == wd.translate('somevalue')) or (entity == modules.linguistic.ucfirst(wd.translate('somevalue'))) then return nil end if args.labelformat and args.labelformat == 'gendered' then local longgender = {m = 'male', f = 'female'} args.labelformat = longgender[wd.getgender(entity)] end local claims = {} if #properties == 1 then claims = mw.wikibase.getAllStatements(entity, properties[1]) -- do not use mw.wikibase.getBestStatements at this stage, as it may remove the best ranked values that match other criteria in the query else for i, prop in ipairs(properties) do local newclaims = mw.wikibase.getAllStatements(entity, prop) if newclaims and #newclaims > 0 then for j, claim in ipairs(newclaims) do table.insert(claims, claim) end end end end if (not claims) or (#claims == 0) then return nil end return wd.filterClaims(claims, args) end --=== ENTITY FORMATTING === function wd.getLabel(entity, lang1, lang2) if (not entity) then return nil -- ou option de gestion des erreurs ? end entity = entity.id or ( type(entity) == "string" and entity) if not(type(entity) == 'string') then return nil end lang1 = lang1 or defaultlang local str, lang --str : texte rendu, lang : langue de celui-ci if lang1 == defaultlang then -- le plus économique str, lang = mw.wikibase.getLabelWithLang(entity) -- le libellé peut être en français ou en anglais else str = mw.wikibase.getLabelByLang(entity, lang1) if str then lang = lang1 end end if str and (lang == lang1) then --pas de catégorie "à traduire" si on a obtenu un texte dans la langue désirée (normalement fr) return str end if lang2 then -- langue secondaire, avec catégorie "à traduire" str2 = mw.wikibase.getLabelByLang(entity, lang2) if str2 then lang = lang2 str = str2 end end if not str then --si ni lang1, ni lang2 ni l'anglais ne sont présents, parcours de la hiérarchie des langues for _, trylang in ipairs(databases.langhierarchy.codes) do str = mw.wikibase.getLabelByLang(entity, trylang) if str then lang = trylang break end end end if str then local translationCat = databases.i18n['to translate'] translationCat = translationCat .. (databases.langhierarchy.cattext[lang] or '') translationCat = addCat(translationCat) return str, translationCat end end function wd.formatEntity( entity, params ) if (not entity) then return nil --formatError('entity-not-found') end local id = entity if type(id) == 'table' then id = id.id end params = params or {} local lang = params.lang or defaultlang local speciallabels = params.speciallabels local displayformat = params.displayformat local labelformat = params.labelformat local labelformat2 = params.labelformat2 local defaultlabel = params.defaultlabel or id local linktype = params.link local defaultlink = params.defaultlink local defaultlinkquery = params.defaultlinkquery if speciallabels and speciallabels[id] then --speciallabels override the standard label + link combination return speciallabels[id] end if params.displayformat == 'raw' then return id end if params.labelformat == 'male' then labelformat = function(objectid) return wd.genderedlabel(objectid, 'm') end end if params.labelformat == 'female' then labelformat = function(objectid) return wd.genderedlabel(objectid, 'f') end end local label, translationCat if type(labelformat) == 'function' then -- sert à des cas particuliers label, translationCat = labelformat(entity) end if not label then label, translationCat = wd.getLabel(entity, lang, params.wikidatalang) end if type(labelformat2) == 'function' and label then -- sert à des cas particuliers label = labelformat2(label) end translationCat = translationCat or "" -- sera toujours ajoutée au résultat mais sera vide si la catégorie de maintenance n'est pas nécessaire if not label then if (defaultlabel == '-') then return nil end local link = wd.siteLink(id, 'wikidata') return '[[' .. link .. '|' .. id .. ']]' .. translationCat -- si pas de libellé, on met un lien vers Wikidata pour qu'on comprenne à quoi ça fait référence end -- détermination du fait qu'on soit ou non en train de rendre l'élément sur la page de son article local rendering_entity_on_its_page = wd.isPageOfQId(id) if (linktype == '-') or rendering_entity_on_its_page then return label .. translationCat end local link = wd.siteLink(entity, linktype, lang) -- defaultlinkquery will try to link to another page on this Wiki if (not link) and defaultlinkquery then if type(defaultlinkquery) == 'string' then defaultlinkquery = {property = defaultlinkquery} end defaultlinkquery.excludespecial = true defaultlinkquery.entity = entity local claims = wd.getClaims(defaultlinkquery) if claims then for i, j in pairs(claims) do local id = wd.getMainId(j) link = wd.siteLink(id, linktype, lang) if link then break end end end end if link then if link:match('^Category:') or link:match('^Catégorie:') then -- attention, le « é » est multibyte -- lier vers une catégorie au lieu de catégoriser link = ':' .. link end return '[[' .. link .. '|' .. label .. ']]' .. translationCat end -- if not link, you can use defaultlink: a sidelink to another Wikimedia project if (not defaultlink) then defaultlink = {'enwiki'} end if defaultlink and (defaultlink ~= '-') then local linktype local sidelink, site, langcode if type(defaultlink) == 'string' then defaultlink = {defaultlink} end for i, j in ipairs(defaultlink) do sidelink, site, langcode = wd.siteLink(entity, j, lang) if sidelink then break end end if not sidelink then sidelink, site = wd.siteLink(entity, 'wikidata') end local icon, class, title = site, nil, nil -- le texte affiché du lien if site == 'wiki' then icon, class, title = langcode, "indicateur-langue", wd.translate('see-another-language', mw.language.fetchLanguageName(langcode, defaultlang)) elseif site == 'wikidata' then icon, class, title = 'd', "indicateur-langue", wd.translate('see-wikidata') else title = wd.translate('see-another-project', site) end local val = '[[' .. sidelink .. '|' .. '<span class = "' .. (class or '').. '" title = "' .. (title or '') .. '">' .. icon .. '</span>]]' return label .. ' <small>(' .. val .. ')</small>' .. translationCat end return label .. translationCat end function wd.addTrackingCat(prop, cat) -- doit parfois être appelé par d'autres modules if type(prop) == 'table' then prop = prop[1] -- devrait logiquement toutes les ajouter end if not prop and not cat then return formatError("property-param-not-provided") end if not cat then cat = wd.translate('trackingcat', prop or 'P??') end return addCat(cat ) end local function unknownValue(snak, label) local str = label if type(str) == "function" then str = str(snak) end if (not str) then if snak.datatype == 'time' then str = wd.translate('sometime') else str = wd.translate('somevalue') end end if type(str) ~= "string" then return formatError(snak.datatype) end return str end local function noValue(displayformat) if not displayformat then return wd.translate('novalue') end if type(displayformat) == 'string' then return displayformat end return formatError() end local function getLangCode(entityid) return databases.langcodes[tonumber(entityid:sub(2))] end local function showLang(statement, maxLang) -- retourne le code langue entre paranthèse avant la valeur (par exemple pour les biblios et liens externes) local mainsnak = statement.mainsnak if mainsnak.snaktype ~= 'value' then return nil end local langlist = {} if mainsnak.datavalue.type == 'monolingualtext' then langlist = {mainsnak.datavalue.value.language} elseif (not statement.qualifiers) or (not statement.qualifiers.P407) then return else for i, j in pairs( statement.qualifiers.P407 ) do if j.snaktype == 'value' then local langentity = wd.getId(j) local langcode = getLangCode(langentity) table.insert(langlist, langcode) end end end if (#langlist > 1) or (#langlist == 1 and langlist[1] ~= defaultlang) then -- si c'est en français, pas besoin de le dire langlist.maxLang = maxLang return modules.langmodule.indicationMultilingue(langlist) end end -- === DATE HANDLING === local function fuzzydate(str, precision) -- ajoute le qualificatif "vers" à une date if not str then return nil end if (precision >= 11) or (precision == 7) or (precision == 6) then --dates avec jour, siècles, millénaires return "vers le " .. str end if (precision == 8) then --deseni ("ane ...") return "alantou " .. str end return "alantou " .. str end function wd.addStandardQualifs(str, statement) if (not statement) or (not statement.qualifiers) then return str end if not str then return error()-- what's that ? end if statement.qualifiers.P1480 then for i, j in pairs(statement.qualifiers.P1480) do local v = wd.getId(j) if (v == "Q21818619") then str = wd.translate('approximate-place', str) elseif (v == "Q18122778") or (v == "Q18912752") or (v == "Q56644435") or (v == "Q30230067") then str = wd.translate('uncertain-information', str) elseif (v == "Q5727902") then if (statement.mainsnak.datatype == 'time') then local datevalue = statement.mainsnak.datavalue if datevalue then str = fuzzydate(str, datevalue.value.precision) end else str = wd.translate('approximate-value', str) end end end end return str end local function rangeObject(begin, ending, params) --[[ objet comportant un timestamp pour le classement chronologique et deux dateobject (begin et ending) ]]-- local timestamp if begin then timestamp = begin.timestamp else timestamp = ending.timestamp end return {begin = begin, ending = ending, timestamp = timestamp, type = 'rangeobject'} end local function dateObject(orig, params) --[[ transforme un snak en un nouvel objet utilisable par Module:Date complexe {type = 'dateobject', timestamp = str, era = '+' ou '-', year = number, month = number, day = number, calendar = calendar} ]]-- if not params then params = {} end local newobj = modules.formatDate.splitDate(orig.time, orig.calendarmodel) newobj.precision = params.precision or orig.precision newobj.type = 'dateobject' return newobj end local function objectToText(obj, params) if obj.type == 'dateobject' then return modules.formatDate.simplestring(obj, params) elseif obj.type == 'rangeobject' then return modules.formatDate.daterange(obj.begin, obj.ending, params) end end function wd.getDateFromQualif(statement, qualif) if (not statement) or (not statement.qualifiers) or not (statement.qualifiers[qualif]) then return nil end local v = statement.qualifiers[qualif][1] if v.snaktype ~= 'value' then -- que faire dans ce cas ? return nil end return dateObject(v.datavalue.value) end function wd.getDate(statement) local period = wd.getDateFromQualif(statement, 'P585') -- retourne un dateobject if period then return period end local begin, ending = wd.getDateFromQualif(statement, 'P580'), wd.getDateFromQualif(statement, 'P582') if begin or ending then return rangeObject(begin, ending) -- retourne un rangeobject fait de deux dateobject end return nil end function wd.getFormattedDate(statement, params) if not statement then return nil end local str --cherche la date avec les qualifs P580/P582 local datetable = wd.getDate(statement) if datetable then str = objectToText(datetable, params) end -- puis limite intérieur / supérieur if not str then local start, ending = wd.getDateFromQualif(statement, 'P1319'), wd.getDateFromQualif(statement, 'P1326') str = modules.formatDate.between(start, ending, params) end -- sinon, le mainsnak, pour les données de type time if (not str) and (statement.mainsnak.datatype == 'time') then local mainsnak = statement.mainsnak if (mainsnak.snaktype == 'value') or (mainsnak.snaktype == 'somevalue') then str = wd.formatSnak(mainsnak, params) end end if str and params and (params.addstandardqualifs ~= '-') then str = wd.addStandardQualifs(str, statement) end return str end wd.compare.by_quantity = function(c1, c2) local v1 = wd.getDataValue(c1.mainsnak) local v2 = wd.getDataValue(c2.mainsnak) if not (v1 and v2) then return true end return v1 < v2 end --[[ tri chronologique générique : retourne une fonction de tri de liste de déclaration en fonction d’une fonction qui calcule la clé de tri et d’une fonction qui compare les clés de tri paramètres nommés: (appel type wikidata.compare.chrono_key_sort{sortKey="nom clé"}) sortKey (optionnel) : chaine, le nom de la clé utilisée pour un tri (pour éviter de rentrer en collision avec "dateSortKey" utilisé par chronoSort au besoin) snak_key_get_function : fonction qui calcule la valeur de la clé à partir d’un snak ou d’une déclaration, (obligatoire) le résultat n’est calculé qu’une fois et est stocké en cache dans claim[sortKey] key_compare_function : fonction de comparaison des clés calculées par snak_key_get_function (optionnel) --]] function wd.chrono_key_sort(arg) local snak_key_get_function = arg.snak_key_get_function local sortKey = arg.sortKey or "dateSortKey" local key_compare_function = arg.key_compare_function or function(c1, c2) return c1 < c2 end return function(claims) for _, claim in ipairs( claims ) do if not claim[sortKey] then local key = snak_key_get_function(claim) if key then claim[sortKey] = wd.compare.get_claim_date(key) else claim[sortKey] = 0 end end end table.sort( claims, function(c1, c2) return key_compare_function(c1[sortKey], c2[sortKey]) end ) return claims end end function wd.quantitySort(claims, inverted) local function sort(c1, c2) local v1 = wd.getDataValue(c1.mainsnak) local v2 = wd.getDataValue(c2.mainsnak) if not (v1 and v2) then return true end if inverted then return v2 < v1 end return v1 < v2 end table.sort(claims, sort ) return claims end function wd.compare.get_claim_date(claim, datetype) -- rend une date au format numérique pour faire des comparaisons local snak = claim.mainsnak or claim if datetype and datetype == 'personbirthdate' then -- fonctionne avec un claim dont la valeur est une personne dont on va rendre la date de naissance if (snak.snaktype == 'value') and (snak.datatype == 'wikibase-item') then local personid = wd.getId(snak) local birthclaims = wd.getClaims({ entity = personid, property = 'P569', numval = 1}) if birthclaims then return wd.compare.get_claim_date(birthclaims[1] or birthclaims) else return math.huge end else return math.huge end -- en cas de donnée manquante, valeur infinie qui entraîne le classement en fin de liste end local iso, datequalif, isonumber if (snak.snaktype == 'value') and (snak.datatype == 'time') then iso = snak.datavalue.value.time else for i, dqualif in ipairs(datequalifiers) do iso = timeFromQualifs(claim, {dqualif}) if iso then datequalif = dqualif break end end if not iso then return math.huge end end -- transformation en nombre (indication de la base car gsub retourne deux valeurs) isonumber = tonumber( iso:gsub( '(%d)%D', '%1' ), 10 ) -- ajustement de la date tenant compte du qualificatif dont elle est issue : un fait se terminant à une date est antérieur à un autre commençant à cette date if datequalif == 'P582' then --date de fin isonumber = isonumber - 2 elseif datequalif == 'P1326' then -- date au plus tard isonumber = isonumber - 1 elseif datequalif == 'P1319' then -- date au plus tôt isonumber = isonumber + 1 elseif datequalif == 'P571' or datequalif == 'P580' then -- date de début et date de création isonumber = isonumber + 2 end return isonumber end function wd.compare.chronoCompare(c1, c2) return wd.compare.get_claim_date(c1) < wd.compare.get_claim_date(c2) end -- fonction pour renverser l’ordre d’une autre fonction function wd.compare.rev(comp_criteria) return function(c1, c2) -- attention les tris en lua attendent des fonctions de comparaison strictement inférieur, on doit -- vérifier la non égalité quand on inverse l’ordre d’un critère, d’ou "and comp_criteria(c2,c1)" return not(comp_criteria(c1,c2)) and comp_criteria(c2,c1) end end -- Fonction qui trie des Claims de type time selon l'ordre chronologique -- Une clé de tri nomée « dateSortKey » est ajouté à chaque claim. -- Si des clés de tri de ce nom existent déjà, elles sont utilisées sans modification. function wd.chronoSort( claims, sorttype ) for _, claim in ipairs( claims ) do if not claim.dateSortKey then if sorttype and (sorttype == 'age' or sorttype == 'ageinverted') then claim.dateSortKey = wd.compare.get_claim_date(claim, 'personbirthdate') else claim.dateSortKey = wd.compare.get_claim_date(claim) end if sorttype and (sorttype == 'inverted' or sorttype == 'ageinverted') and claim.dateSortKey == math.huge then claim.dateSortKey = -math.huge -- quand la donnée est manquante on lui assigne la valeur qui entraîne le classement en fin de liste end end end table.sort( claims, function ( c1, c2 ) if sorttype and (sorttype == 'inverted' or sorttype == 'ageinverted') then return c2.dateSortKey < c1.dateSortKey end return c1.dateSortKey < c2.dateSortKey end ) return claims end local function get_numeric_claim_value(claim, propertySort) local val local claimqualifs = claim.qualifiers if claimqualifs then local vals = claimqualifs[propertySort] if vals and vals[1].snaktype == 'value' then val = vals[1].datavalue.value end end return tonumber(val or 0) end function wd.compare.numeric(propertySort) return function(c1, c2) return get_numeric_claim_value(c1, propertySort) < get_numeric_claim_value(c2, propertySort) end end -- Fonction qui trie des Claims de type value selon l'ordre de la propriété fournit -- Une clé de tri nomée « dateSortKey » est ajouté à chaque claim. -- Si des clés de tri de ce nom existent déjà, elles sont utilisées sans modification. function wd.numericPropertySort( claims, propertySort ) for _, claim in ipairs( claims ) do if not claim.dateSortKey then local val = get_numeric_claim_value(claim, propertySort) claim.dateSortKey = tonumber(val or 0) end end table.sort( claims, function ( c1, c2 ) return c1.dateSortKey < c2.dateSortKey end ) return claims end --[[ test possible en console pour la fonction précédente : = p.formatStatements{entity = "Q375946", property = 'P50', sorttype = 'P1545', linkback = "true"} --]] -- =================== function wd.getReferences(statement) local refdata = statement.references if not refdata then return nil end local refs = {} local hashes = {} for i, ref in pairs(refdata) do local s local function hasValue(prop) -- checks that the prop is here with valid value if ref.snaks[prop] and ref.snaks[prop][1].snaktype == 'value' then return true end return false end if ref.snaks.P248 then -- cas lorsque P248 (affirmé dans) est utilisé for j, source in pairs(ref.snaks.P248) do if source.snaktype == 'value' then local page, accessdate, quotation if hasValue('P304') then -- page page = wd.formatSnak(ref.snaks.P304[1]) end if hasValue('P813') then -- date de consultation accessdate = wd.formatSnak(ref.snaks.P813[1]) end if hasValue('P1683') then -- citation quotation = wd.formatSnak(ref.snaks.P1683[1]) end local sourceId = wd.getId(source) s = modules.reference.citeitem(sourceId, {['page'] = page, ['accessdate'] = accessdate, ['citation'] = quotation}) table.insert(refs, s) table.insert(hashes, ref.hash .. sourceId) end end elseif hasValue('P8091') or hasValue('P854') then -- cas lorsque P8091 (Archival Resource Key) ou P854 (URL de la référence)est utilisé local arkKey, url, title, author, publisher, accessdate, publishdate, publishlang, quotation, description if hasValue('P8091') then arkKey = wd.formatSnak(ref.snaks.P8091[1], {text = "-"}) url = 'https://n2t.net/' .. arkKey if hasValue('P1476') then title = wd.formatSnak(ref.snaks.P1476[1]) else title = arkKey end elseif hasValue('P854') then url = wd.formatSnak(ref.snaks.P854[1], {text = "-"}) if hasValue('P1476') then title = wd.formatSnak(ref.snaks.P1476[1]) else title = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3') end end --todo : handle multiple values for author, etc. if hasValue('P1810') then -- sou non description = 'sou non ' .. wd.formatSnak(ref.snaks.P1810[1]) end if hasValue('P813') then -- dat konsiltasyon accessdate = wd.formatSnak(ref.snaks.P813[1]) end if hasValue('P50') then -- author (item type) author = wd.formatSnak(ref.snaks.P50[1]) elseif hasValue('P2093') then -- author (string type) author = wd.formatSnak(ref.snaks.P2093[1]) end if hasValue('P123') then -- éditeur publisher = wd.formatSnak(ref.snaks.P123[1]) end if hasValue('P1683') then -- citation quotation = wd.formatSnak(ref.snaks.P1683[1]) end if hasValue('P577') then -- date de publication publishdate = wd.formatSnak(ref.snaks.P577[1]) end if hasValue('P407') then -- langue de l'œuvre local id = wd.getId(ref.snaks.P407[1]) publishlang = getLangCode(id) end s = modules.cite.lienWeb{titre = title, url = url, auteur = author, editeur = publisher, langue = publishlang, ['en ligne le'] = publishdate, ['consulté le'] = accessdate, ['citation'] = quotation, ['description'] = description} table.insert(hashes, ref.hash) table.insert(refs, s) elseif ref.snaks.P854 and ref.snaks.P854[1].snaktype == 'value' then s = wd.formatSnak(ref.snaks.P854[1], {text = "-"}) table.insert(hashes, ref.snaks.P854[1].hash) table.insert(refs, s) end end if #refs > 0 then if #hashes == #refs then return refs, hashes end return refs end end function wd.sourceStr(sources, hashes) if not sources or (#sources == 0) then return nil end local useHashes = hashes and #hashes == #sources for i, j in ipairs(sources) do local refArgs = {name = 'ref', content = j} if useHashes and hashes[i] ~= '-' then refArgs.args = {name = 'wikidata-' .. hashes[i]} end sources[i] = mw.getCurrentFrame():extensionTag(refArgs) end return table.concat(sources, '<sup class="reference cite_virgule">,</sup>') end function wd.getDataValue(snak, params) if not params then params = {} end local speciallabels = params.speciallabels -- parfois on a besoin de faire une liste d'éléments pour lequel le libellé doit être changé, pas très pratique d'utiliser une fonction pour ça if snak.snaktype ~= 'value' then return nil end local datatype = snak.datatype local value = snak.datavalue.value local displayformat = params.displayformat if type(displayformat) == 'function' then return displayformat(snak, params) end if datatype == 'wikibase-item' then return wd.formatEntity(wd.getId(snak), params) end if datatype == 'url' then if params.displayformat == 'raw' then return value else return modules.weblink.makelink(value, params.text) end end if datatype == 'math' then return mw.getCurrentFrame():extensionTag( "math", value) end if datatype == 'tabular-data' then return mw.ustring.sub(value, 6, 100) -- returns the name of the file, without the "Data:" prefix end if (datatype == 'string') or (datatype == 'external-id') or (datatype == 'commonsMedia') then -- toutes les données de type string sauf "math" if params.urlpattern then local urlpattern = params.urlpattern if type(urlpattern) == 'function' then urlpattern = urlpattern(value) end -- encodage de l'identifiant qui se retrouve dans le path de l'URL, à l'exception des slashes parfois rencontrés, qui sont des séparateurs à ne pas encoder local encodedValue = mw.uri.encode(value, 'PATH'):gsub('%%2F', '/') -- les parenthèses autour du encodedValue:gsub() sont nécessaires, sinon sa 2e valeur de retour est aussi passée en argument au mw.ustring.gsub() parent local url = mw.ustring.gsub(urlpattern, '$1', (encodedValue:gsub('%%', '%%%%'))) value = '[' .. url .. ' ' .. (params.text or value) .. ']' end return value end if datatype == 'time' then -- format example: +00000001809-02-12T00:00:00Z if displayformat == 'raw' then return value.time else local dateobject = dateObject(value, {precision = params.precision}) return objectToText(dateobject, params) end end if datatype == 'globe-coordinate' then -- retourne une table avec clés latitude, longitude, précision et globe à formater par un autre module (à changer ?) if displayformat == 'latitude' then return value.latitude elseif displayformat == 'longitude' then return value.longitude else local coordvalue = mw.clone( value ) coordvalue.globe = databases.globes[value.globe] -- transforme l'ID du globe en nom anglais utilisable par geohack return coordvalue -- note : les coordonnées Wikidata peuvent être utilisée depuis Module:Coordinates. Faut-il aussi autoriser à appeler Module:Coordiantes ici ? end end if datatype == 'quantity' then -- todo : gérer les paramètres précision local amount, unit = value.amount, value.unit if unit then unit = unit:match('Q%d+') end if not unit then unit = 'dimensionless' end local raw if displayformat == "raw" then raw = true end return modules.formatNum.displayvalue(amount, unit, {targetunit = params.targetunit, raw = raw, rounding = params.rounding, showunit = params.showunit or 'short', showlink = params.showlink} ) end if datatype == 'monolingualtext' then if value.language == defaultlang then return value.text else return modules.langmodule.langue({value.language, value.text, nocat=true}) end end return formatError('unknown-datavalue-type' ) end function wd.stringTable(args) -- like getClaims, but get a list of string rather than a list of snaks, for easier manipulation local claims = args.claims local cat = '' if not claims then claims = wd.getClaims(args) end if not claims or claims == {} then return {}, {}, cat end if args.removedupesdate and (args.removedupesdate ~= '-') then claims, cat = removeDupesDate(claims, args.removedupesdate) end local props = {} -- liste des propriétés associété à chaque string pour catégorisation et linkback for i, j in pairs(claims) do claims[i] = wd.formatStatement(j, args) table.insert(props, j.mainsnak.property) end if args.removedupes and (args.removedupes ~= '-') then claims = wd.addNewValues({}, claims) -- devrait aussi supprimer de props celles qui ne sont pas utilisées end return claims, props, cat end function wd.getQualifiers(statement, qualifs, params) if not statement.qualifiers then return nil end local vals = {} if type(qualifs) == 'string' then qualifs = wd.splitStr(qualifs) end for i, j in pairs(qualifs) do if statement.qualifiers[j] then for k, l in pairs(statement.qualifiers[j]) do table.insert(vals, l) end end end if #vals == 0 then return nil end return vals end function wd.getFormattedQualifiers(statement, qualifs, params) if not params then params = {} end local qualiftable = wd.getQualifiers(statement, qualifs) if not qualiftable then return nil end qualiftable = wd.filterClaims(qualiftable, params) or {} for i, j in pairs(qualiftable) do qualiftable[i] = wd.formatSnak(j, params) end return modules.linguistic.conj(qualiftable, params.conjtype) end function wd.showQualifiers(str, statement, args) local qualifs = args.showqualifiers if not qualifs then return str -- or error ? end if type(qualifs) == 'string' then qualifs = wd.splitStr(qualifs) end local qualifargs = args.qualifargs or {} -- formatage des qualificatifs = args commençant par "qualif", ou à défaut, les mêmes que pour la valeur principale qualifargs.displayformat = args.qualifdisplayformat or args.displayformat qualifargs.labelformat = args.qualiflabelformat or args.labelformat qualifargs.labelformat2 = args.qualiflabelformat2 or args.labelformat2 qualifargs.link = args.qualiflink or args.link qualifargs.linktopic = args.qualiflinktopic or args.linktopic qualifargs.conjtype = args.qualifconjtype qualifargs.precision = args.qualifprecision qualifargs.targetunit = args.qualiftargetunit qualifargs.defaultlink = args.qualifdefaultlink or args.defaultlink qualifargs.defaultlinkquery = args.qualifdefaultlinkquery or args.defaultlinkquery local formattedqualifs if args.qualifformat and type (args.qualifformat) == 'function' then formattedqualifs = args.qualifformat(statement, qualifs, qualifargs) else formattedqualifs = wd.getFormattedQualifiers(statement, qualifs, qualifargs) end if formattedqualifs and formattedqualifs ~= "" then str = str .. " (" .. formattedqualifs .. ")" end return str end function wd.formatSnak( snak, params ) if not params then params = {} end -- pour faciliter l'appel depuis d'autres modules if snak.snaktype == 'somevalue' then return unknownValue(snak, params.unknownlabel) elseif snak.snaktype == 'novalue' then return noValue(params.novaluelabel) elseif snak.snaktype == 'value' then return wd.getDataValue( snak, params) else return formatError( 'unknown-snak-type' ) end end function wd.formatStatement( statement, args ) -- FONCTION A REORGANISER (pas très lisible) if not args then args = {} end if not statement.type or statement.type ~= 'statement' then return formatError( 'unknown-claim-type' ) end local prop = statement.mainsnak.property local str -- special displayformat f if args.statementformat and (type(args.statementformat) == 'function') then str = args.statementformat(statement, args) elseif (statement.mainsnak.datatype == 'time') and (statement.mainsnak.dateformat ~= '-') then if args.displayformat == 'raw' and statement.mainsnak.snaktype == 'value' then str = statement.mainsnak.datavalue.value.time else str = wd.getFormattedDate(statement, args) end elseif args.showonlyqualifier and (args.showonlyqualifier ~= '') then str = wd.getFormattedQualifiers(statement, args.showonlyqualifier, args) if not str then return nil end if args.addstandardqualifs ~= '-' then str = wd.addStandardQualifs(str, statement) end else str = wd.formatSnak( statement.mainsnak, args ) if (args.addstandardqualifs ~= '-') and (args.displayformat ~= 'raw') then str = wd.addStandardQualifs(str, statement) end end -- ajouts divers if args.showlang == true then local indicateur = showLang(statement, args.maxLang) if indicateur then str = indicateur .. '&nbsp;' .. str end end if args.showqualifiers then str = wd.showQualifiers(str, statement, args) end if args.showdate then -- when "showdate and chronosort are both set, date retrieval is performed twice local period = wd.getFormattedDate(statement, args, "-") -- 3 arguments indicate the we should not use additional qualifiers, already added by wd.formatStatement if period then str = str .. " <small>(" .. period .. ")</small>" end end if args.showsource and args.showsource ~= '-' then local sources, hashes = wd.getReferences(statement) if sources then local source = wd.sourceStr(sources, hashes) if source then str = str .. source end end end return str end function wd.addLinkBack(str, id, property) if not id or id == '' then id = wd.getEntityIdForCurrentPage() end if not id then return str end if type(property) == 'table' then property = property[1] end id = wd.entityId(id) 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 = wd.translate('see-wikidata-value') local url = mw.uri.fullUrl('d:' .. id, 'uselang=ht') url.fragment = property -- ajoute une #ancre si paramètre "property" défini url = tostring(url) local v = mw.html.create('span') :addClass(class) :wikitext(str) :tag('span') :addClass('noprint wikidata-linkback') :wikitext(icon:format(title, url)) :allDone() return tostring(v) end function wd.addRefAnchor(str, id) --[[ Insère une ancre pour une référence générée à partir d'un élément wd. L'id Wikidata sert d'identifiant à l'ancre, à utiliser dans les modèles type "harvsp" --]] return tostring( mw.html.create('span') :attr('id', id) :attr('class', "ouvrage") :wikitext(str) ) end --=== FUNCTIONS USING AN ENTITY AS ARGUMENT === local function formatStatementsGrouped(args, type) -- regroupe les affirmations ayant la même valeur en mainsnak, mais des qualificatifs différents -- (seulement pour les propriétés de type élément) local claims = wd.getClaims(args) if not claims then return nil end local groupedClaims = {} -- regroupe les affirmations par valeur de mainsnak local function addClaim(claim) local id = wd.getMainId(claim) for i, j in pairs(groupedClaims) do if (j.id == id) then table.insert(groupedClaims[i].claims, claim) return end end table.insert(groupedClaims, {id = id, claims = {claim}}) end for i, claim in pairs(claims) do addClaim(claim) end local stringTable = {} -- instructions ad hoc pour les paramètres concernant la mise en forme d'une déclaration individuelle local funs = { {param = "showqualifiers", fun = function(str, claims) local qualifs = {} for i, claim in pairs(claims) do local news = wd.getFormattedQualifiers(claim, args.showqualifiers, args) if news then table.insert(qualifs, news) end end local qualifstr = modules.linguistic.conj(qualifs, wd.translate("qualif-separator")) if qualifstr and qualifstr ~= "" then str = str .. " (" .. qualifstr .. ")" end return str end }, {param = "showdate", fun = function(str, claims) -- toutes les dates sont regroupées à l'intérieur des mêmes parenthèses ex "médaille d'or (1922, 1924)" local dates = {} for i, statement in pairs(claims) do local s = wd.getFormattedDate(statement, args, true) if statement then table.insert(dates, s) end end local datestr = modules.linguistic.conj(dates) if datestr and datestr ~= "" then str = str .. " <small>(" .. datestr .. ")</small>" end return str end }, {param = "showsource", fun = function(str, claims) -- les sources sont toutes affichées au même endroit, à la fin -- si deux affirmations ont la même source, on ne l'affiche qu'une fois local sources = {} local hashes = {} local function dupeRef(old, new) for i, j in pairs(old) do if j == new then return true end end end for i, claim in pairs(claims) do local refs, refHashes = wd.getReferences(claim) if refs then for i, j in pairs(refs) do if not dupeRef(sources, j) then table.insert(sources, j) local hash = (refHashes and refHashes[i]) or '-' table.insert(hashes, hash) end end end end return str .. (wd.sourceStr(sources, hashes) or "") end } } for i, group in pairs(groupedClaims) do -- bricolage pour utiliser les arguments de formatStatements local str = wd.formatEntity(group.id, args) if not str then str = '???' -- pour éviter erreur Lua si formatEntity a retourné nil end for i, fun in pairs(funs) do if args[fun.param] then str = fun.fun(str, group.claims, args) end end table.insert(stringTable, str) end args.valuetable = stringTable return wd.formatStatements(args) end function wd.formatStatements( args )--Format statement and concat them cleanly if args.value == '-' then return nil end -- If a value is already set: use it, except if it's the special value {{WD}} (use wikidata) if args.value and args.value ~= '' then local valueexpl = wd.translate("activate-query") if args.value ~= valueexpl then return args.value end -- There is no value set, and args.expl disables wikidata on empty values elseif args.expl then return nil end if args.grouped and args.grouped ~= '' then args.grouped = false return formatStatementsGrouped(args) end local valuetable = args.valuetable -- dans le cas où les valeurs sont déjà formatées local props -- les propriétés réellement utilisées (dans certains cas, ce ne sont pas toutes celles de args.property local cat = '' if not valuetable then -- cas le plus courant valuetable, props, cat = wd.stringTable(args) end if args.ucfirst == '-' and args.conjtype == 'new line' then args.conjtype = 'lowercase new line' end local str = modules.linguistic.conj(valuetable, args.conjtype) if not str then return args.default end if not props then props = wd.splitStr(args.property)[1] end if args.ucfirst ~= '-' then str = modules.linguistic.ucfirst(str) end if args.addcat and (args.addcat ~= '-') then str = str .. wd.addTrackingCat(props) .. cat end if args.linkback and (args.linkback ~= '-') then str = wd.addLinkBack(str, args.entity, props) end if args.returnnumberofvalues then return str, #valuetable end return str end function wd.formatAndCat(args) if not args then return nil end args.linkback = args.linkback or true args.addcat = true if args.value then -- do not ignore linkback and addcat, as formatStatements do if args.value == '-' then return nil end local val = args.value .. wd.addTrackingCat(args.property) val = wd.addLinkBack(val, args.entity, args.property) return val end return wd.formatStatements( args ) end function wd.getTheDate(args) local claims = wd.getClaims(args) if not claims then return nil end local formattedvalues = {} for i, j in pairs(claims) do local v = wd.getFormattedDate(j, args) if v then table.insert(formattedvalues, v ) end end local val = modules.linguistic.conj(formattedvalues) if not val then return nil end if args.addcat == true then val = val .. wd.addTrackingCat(args.property) end val = wd.addLinkBack(val, args.entity, args.property) return val end function wd.keyDate (event, item, params) params = params or {} params.entity = item if type(event) == 'table' then for i, j in pairs(event) do params.targetvalue = nil -- réinitialisation barbare des paramètres modifiés local s = wd.keyDate(j, item, params) if s then return s end end elseif type(event) ~= 'string' then return formatError('invalid-datatype', type(event), 'string') elseif string.sub(event, 1, 1) == 'Q' then -- on demande un élément utilisé dans P:P793 (événement clé) params.property = 'P793' params.targetvalue = event params.addcat = params.addcat or true return wd.getTheDate(params) elseif string.sub(event, 1, 1) == 'P' then -- on demande une propriété params.property = event return wd.formatAndCat(params) else return formatError('invalid-entity-id', event) end end function wd.mainDate(entity) -- essaye P580/P582 local args = {entity = entity, addcat = true} args.property = 'P580' local startpoint = wd.formatStatements(args) args.property = 'P582' local endpoint = wd.formatStatements(args) local str if (startpoint or endpoint) then str = modules.formatDate.daterange(startpoint, endpoint, params) str = wd.addLinkBack(str, entity, 'P582') return str end -- défaut : P585 args.property = {'P585', 'P571'} args.linkback = true return wd.formatStatements(args) end -- ==== Fonctions sur le genre ==== function wd.getgender(id) local vals = { ['Q6581072'] = 'f', -- féminin ['Q6581097'] = 'm', -- masculin ['Q1052281'] = 'f', -- femme transgenre ['Q2449503'] = 'm', -- homme transgenre ['Q17148251'] = 'f', -- en:Travesti (gender identity) ['Q43445'] = 'f', -- femelle ['Q44148'] = 'm', -- mâle default = '?' } local gender = wd.formatStatements{entity = id, property = 'P21', displayformat = 'raw', numval = 1} return vals[gender] or vals.default end -- catégories de genre/nombre function wd.getgendernum(claims) local personid, gender local anym = false local anyf = false local anyunknown = false for i, claim in pairs(claims) do local snak = claim.mainsnak or claim if(snak.snaktype == 'value') and (snak.datatype == 'wikibase-item') then personid = wd.getId(snak) gender = wd.getgender(personid) anym = anym or (gender == 'm') anyf = anyf or (gender == 'f') anyunknown = anyunknown or (gender == '?') else anyunknown = true end end local gendernum if #claims > 1 then if anyunknown then gendernum = 'p' else if anym and not anyf then gendernum = 'mp' end if anyf and not anym then gendernum = 'fp' end if anym and anyf then gendernum = 'mixtep' end end else gendernum = 's' if anym then gendernum = 'ms' end if anyf then gendernum = 'fs' end end return gendernum end -- récupération des libellés genrés de Wikidata function wd.genderedlabel(id, labelgender) local label if not labelgender then return nil end if labelgender == 'f' then -- femme : chercher le libellé dans P2521 (libellé féminin) label = wd.formatStatements{entity = id, property = 'P2521', isinlang = 'ht', numval = 1, ucfirst = '-'} elseif labelgender == 'm' then -- homme : chercher le libellé dans P3321 (libellé masculin) label = wd.formatStatements{entity = id, property = 'P3321', isinlang = 'ht', numval = 1, ucfirst = '-'} end if not label then label = wd.getLabel(id) end return label end -- === FUNCTIONS FOR TRANSITIVE PROPERTIES === function wd.getIds(item, query) query.excludespecial = true query.displayformat = 'raw' query.entity = item query.addstandardqualifs = '-' return wd.stringTable(query) end -- recursively adds a list of qid to an existing list, based on the results of a query function wd.addVals(list, query, maxdepth, maxnodes, stopval) maxdepth = tonumber(maxdepth) or 10 maxnodes = tonumber(maxnodes) or 100 if (maxdepth < 0) then return list end if stopval and wd.isHere(list, stopval) then return list end local origsize = #list for i = 1, origsize do -- tried a "checkpos" param instead of starting to 1 each time, but no impact on performance local candidates = wd.getIds(list[i], query) list = wd.addNewValues(list, candidates, maxnodes, stopval) if list[#list] == stopval then return list end if #list >= maxnodes then return list end end if (#list == origsize) then return list end return wd.addVals(list, query, maxdepth - 1, maxnodes, stopval, origsize + 1) end -- returns a list of items transitively matching a query (orig item is not included in the list) function wd.transitiveVals(item, query, maxdepth, maxnodes, stopval) maxdepth = tonumber(maxdepth) or 5 if type(query) == "string" then query = {property = query} end -- récupération des valeurs local vals = wd.getIds(item, query) if not vals then return nil end local v = wd.addVals(vals, query, maxdepth - 1, maxnodes, stopval) if not v then return nil end -- réarrangement des valeurs if query.valorder == "inverted" then local a = {} for i = #v, 1, -1 do a[#a+1] = v[i] end v = a end return v end -- returns true if an item is the value of a query, transitively function wd.inTransitiveVals(searchedval, sourceval, query, maxdepth, maxnodes ) local vals = wd.transitiveVals(sourceval, query, maxdepth, maxnodes, searchedval ) if (not vals) then return false end for _, val in ipairs(vals) do if (val == searchedval) then return true end end return false end -- returns true if an item is a superclass of another, based on P279 function wd.isSubclass(class, item, maxdepth) local query = {property = 'P279'} if class == item then -- item is a subclass of itself iff it is a class if wd.getIds(item, query) then return true end return false end return wd.inTransitiveVals(class, item, query, maxdepth ) end -- returns true if one of the best ranked P31 values of an item is the target or a subclass of the target -- rank = 'valid' would seem to make sense, but it would need to check for date qualifiers as some P31 values have begin or end date function wd.isInstance(targetclass, item, maxdepth) maxdepth = maxdepth or 10 local directclasses = wd.transitiveVals(item, {property = 'P31'}, 1) if not directclasses then return false end for i, class in pairs(directclasses) do if wd.isSubclass(targetclass, class, maxdepth - 1) then return true end end return false end -- return the first value in a transitive query that belongs to a particular class. For instance find a value of P131 that is a province of Canada function wd.findVal(sourceitem, targetclass, query, recursion, instancedepth) if type(query) == "string" then query = {property = query} end local candidates = wd.getIds(sourceitem, query) if candidates then for i, j in pairs(candidates) do if wd.isInstance(targetclass, j, instancedepth) then return j end end if not recursion then recursion = 3 else recursion = recursion - 1 end if recursion < 0 then return nil end for i, candidate in pairs(candidates) do return wd.findVal(candidate, targetclass, query, recursion, instancedepth) end end end -- === VARIA === function wd.getDescription(entity, lang) lang = lang or defaultlang local description if lang == defaultlang then return mw.wikibase.description(qid) end if not entity.descriptions then return wd.translate('no description') end local descriptions = entity.descriptions if not descriptions then return nil end if descriptions[lang] then return descriptions[delang].value end return entity.id end function wd.Dump(entity) entity = wd.getEntity(entity) if not entity then return formatError("entity-param-not-provided") end return "<pre>"..mw.dumpObject(entity).."</pre>" end function wd.frameFun(frame) local args = frame.args local funname = args[1] table.remove(args, 1) return wd[funname](args) end return wd 56l0vqgdlghuun529hya3ipw1cnnbqu Module:Wikidata/I18n 828 64457 855588 853455 2024-11-12T15:39:40Z BwaKajou 31668 855588 Scribunto text/plain return { -- Messages d'erreurs ["property-param-not-provided"] = "paramèt 'property' manke", ["qualifier-param-not-provided"] = "paramèt 'qualifier' manke", ["entity-param-not-provided"] = "paramèt 'entity' manket", ["entity-not-found"] = "entité non trouvée", ["unknown-claim-type"] = "type d'affirmation inconnu", ["unknown-snak-typeg"] = "unknown snak type", ["unknown-datavalue-type"] = "unknown datavalue type.", ["unknown-entity-type"] = "unknown entity type", ["invalid-id"] = "identifiant inconnu", ["invalid-datatype"] = "type de données inconnu", ["invalid-linktype"] = "type de lien inconnu", ["invalid-event-type"] = "l'événement devrait être une chaîne, est $1", ["invalid-entity-id"] = "identifiant d'entité invalide : $1", ["invalid-project-code"] = "identifiant de project Wikimédia invalide : $1", ["cat-unsorted-issue"] = "Page avec un problème de codage Wikidata", -- Autres messages ["no-label"] = "pas de libellé", ['no description'] = "pas description", ["novalue"] = "-", ["somevalue"] = "inconnu", ["sometime"] = "date inconnue", ['to translate'] = 'Paj ki itilize done Wikidata pou tradui', ["trackingcat"] = 'Paj ki itilize $1', ['see-wikidata-value'] = "Gade epi modifye done yo sou Wikidata", -- lien vers des valeurs sur une propriété Wikidata ['see-wikidata'] = "Gade eleman Wikidata ki koresponn", -- utilisé sur les liens Wikidata par défaut en l'absence de lien interne disponible ['see-another-project'] = "Atik sou $1", ['see-another-language'] = "Atik sou Wikipedya an $1", ['activate-query'] = "<div class='par wikidata'></div>" -- activates an on-demand-only query } qsn308bwppggo5hqnwmzf7uz9e3ra32 855589 855588 2024-11-12T15:42:09Z BwaKajou 31668 855589 Scribunto text/plain return { -- Messages d'erreurs ["property-param-not-provided"] = "paramèt 'property' manke", ["qualifier-param-not-provided"] = "paramèt 'qualifier' manke", ["entity-param-not-provided"] = "paramèt 'entity' manket", ["entity-not-found"] = "entité non trouvée", ["unknown-claim-type"] = "type d'affirmation inconnu", ["unknown-snak-typeg"] = "unknown snak type", ["unknown-datavalue-type"] = "unknown datavalue type.", ["unknown-entity-type"] = "unknown entity type", ["invalid-id"] = "identifiant inconnu", ["invalid-datatype"] = "type de données inconnu", ["invalid-linktype"] = "type de lien inconnu", ["invalid-event-type"] = "l'événement devrait être une chaîne, est $1", ["invalid-entity-id"] = "identifiant d'entité invalide : $1", ["invalid-project-code"] = "identifiant de project Wikimédia invalide : $1", ["cat-unsorted-issue"] = "Page avec un problème de codage Wikidata", -- Autres messages ["no-label"] = "pas de libellé", ['no description'] = "pas description", ["novalue"] = "-", ["somevalue"] = "inconnu", ["sometime"] = "date inconnue", ['to translate'] = 'Paj ki itilize done Wikidata pou tradui', ["trackingcat"] = 'Paj ki itilize $1', ['see-wikidata-value'] = "Gade epi modifye done yo sou Wikidata", -- lien vers des valeurs sur une propriété Wikidata ['see-wikidata'] = "Gade eleman Wikidata ki koresponn", -- utilisé sur les liens Wikidata par défaut en l'absence de lien interne disponible ['see-another-project'] = "Atik sou $1", ['see-another-language'] = "Atik sou Wikipedya an $1", ['activate-query'] = '<div class="par_wikidata"></div>', -- activates an on-demand-only query ['qualif-separator'] = " ; ", -- separate qualifiers shown next to a standard statement ['approximate-value'] = "environ $1", ['approximate-place'] = "$1 (ou environs)", ['uncertain-information'] = "$1 (?)", } 6yp55zmpq5ybk4mdkec4vtp5p3rlypk Module:Date 828 64464 855611 854317 2024-11-12T17:44:25Z BwaKajou 31668 855611 Scribunto text/plain -- luacheck: globals mw, no max line length local fun = {} local Outils = require 'Module:Outils' local Duree = require 'Module:Durée' -- chargement de la base de données répertoriant certaines pages existant ou n'existant pas pour éviter les "ifexist". local dataLiens local success, resultat = pcall ( mw.loadData, 'Module:Date/Data' ) if success then dataLiens = resultat else -- protection au cas où le sous-module serait mal modifié dataLiens = { [''] = { mois = { aucun = 1000, tous = { 1773, 2014 } }, } } end -- nettoie un paramètre non nommé (vire les espaces au début et à la fin) -- retourne nil si le texte est vide ou n'est pas du texte. Attention c'est important pour les fonctions qui l'utilisent. local trim = Outils.trim -- Fonction destinée à mettre la première lettre du mois en majuscule : -- utilisation de string car aucun mois ne commence par une lettre non ascii en français ou anglais. local function ucfirst( str ) return str:sub( 1, 1 ):upper() .. str:sub( 2 ) end local modelePremier = '<abbr class="abbr" title="premye">1<sup>e</sup></abbr>' -- liste des mois, écriture exacte et alias, en minuscule local listeMois = { { num = 1, nJour = 31, abrev = 'janv.', nom = 'janvye', alias = { 'janvier', 'jan.', 'janv.', 'jan', 'janv', 'january' } }, { num = 2, nJour = 29, abrev = 'fév.', nom = 'fevriye', alias = { 'février', 'fev.', 'fev', 'fév.', 'fév', 'févr', 'févr.', 'february', 'feb', 'feb.' } }, { num = 3, nJour = 31, abrev = 'mas', nom = 'mas', alias = { 'mars', 'mar.', 'mar', 'march' } }, { num = 4, nJour = 30, abrev = 'avr.', nom = 'avril', alias = { 'avr.', 'avr', 'apr', 'april'} }, { num = 5, nJour = 31, abrev = 'me', nom = 'me', alias = { 'mai','may' } }, { num = 6, nJour = 30, abrev = 'jen', nom = 'jen', alias = {'juin', 'jun', 'june' } }, { num = 7, nJour = 31, abrev = 'jiyè', nom = 'jiyè', alias = { 'juillet','juil.', 'juil', 'juill.', 'juill', 'jul', 'july' } }, { num = 8, nJour = 31, abrev = 'out', nom = 'out', alias = { 'août', 'aoû', 'aug', 'august' } }, { num = 9, nJour = 30, abrev = 'sept.', nom = 'septanm', alias = { 'septembre', 'sept.', 'sept', 'sep.', 'sep', 'september' } }, { num = 10, nJour = 31, abrev = 'okt.', nom = 'oktòb', alias = { 'octobre', 'oct.', 'oct', 'october' } }, { num = 11, nJour = 30, abrev = 'nov.', nom = 'novanm', alias = { 'novembre','nov.', 'nov', 'november' } }, { num = 12, nJour = 31, abrev = 'déc.', nom = 'desanm', alias = {'décembre', 'decembre', 'déc.', 'dec.', 'dec', 'déc', 'december' } }, aout = { num = 8, nJour = 31, abrev = 'aout', nom = 'out', alias = { 'aou' } }, } -- ajoute les noms, abréviations et alias en tant que clés de listeMois for i = 1, 12 do local mois = listeMois[i] listeMois[tostring( i )] = mois if i < 10 then listeMois['0' .. i] = mois end listeMois[mois.nom] = mois listeMois[mois.abrev] = mois for j = 1, #mois.alias do listeMois[mois.alias[j]] = mois end end for i = 1, #listeMois.aout.alias do listeMois[listeMois.aout.alias[i]] = listeMois.aout end local liste_saisons = { { 'prentan', 'printemps', 'spring', }, { 'ete','lete', 'été', 'summer', }, { 'otòn', 'lotòn', 'automne', 'autumn', }, { 'ivè', 'livè', 'hiver', 'winter', }, } -- à partir d'un nom de saison (en français ou en anglais), -- retourne son nom canonique (exemple : "été") -- si non reconnu, retourne nil function fun.determinationSaison( saison ) local s = trim( saison ) if s then s = s:gsub( 'ò', 'è' ):lower() for i = 1, 4 do for j = 1, #liste_saisons[i] do if s == liste_saisons[i][j] then return liste_saisons[i][1] end end end end end --- -- à partir d'un nom de mois (en français ou en anglais), de son numéro ou d'une abréviation, -- retourne son nom canonique (exemple : "juin") et son numéro (exemple : 6) -- si non reconnu, retourne nil, nil function fun.determinationMois( mois ) local result local num = tonumber( mois ) if num then result = listeMois[num] else local str = trim( mois ) if str then result = listeMois[str] if not result then result = listeMois[str:gsub( 'ò', 'è' ):gsub( 'ò', 'è' ):lower()] end end end if result then return result.nom, result.num else return nil, nil end end -- fonction interne à modeleDate, pour déterminer si on peut se passer de faire un ifexist local function existDate( dataQualificatif, annee, mois ) local data if mois then data = dataQualificatif.mois else data = dataQualificatif.annee end if type( data ) ~= 'table' then -- si data n'existe pas c'est que l'on considère qu'il n'y a pas de lien. return end -- le qualificatif est remplacé par celui de la base de données, ce qui permet des alias. local lien = annee if dataQualificatif.qualificatif ~= '' then lien = lien .. ' ' .. dataQualificatif.qualificatif end local seul = annee if mois then lien = mois .. ' ' .. lien seul = ucfirst( mois ) .. ' ' .. annee end local aucun = tonumber( data.aucun ) if aucun and annee <= aucun then -- si l'année est dans la partie 'aucun' on teste s'il y a malgré tout un lien isolé if type( data.seul ) == 'table' then for i, v in ipairs( data.seul ) do if seul == v or seul == tonumber( v ) then return lien end end end -- partie aucun et pas de lien => nil return nil elseif type( data.tous ) == 'table' then local tous1, tous2 = tonumber( data.tous[1] ), tonumber( data.tous[2] ) if tous1 and tous2 and annee >= tous1 and annee <= tous2 then -- l'année est dans la partie 'tous' donc on retourne le lien return lien end end -- l'année n'est ni dans la partie aucun, ni dans la partie tous donc il faut tester si la page existe. local cibleLien = mw.title.new( lien ) if cibleLien and cibleLien.exists then return lien end end --- -- Supprime le jour de la semaine, et "le" avant une date function fun.nettoyageJour( jour ) if type( jour ) == 'string' then local nomJour = { '[Ll]=endi', '[Mm]adi', '[Mm]èkredi', '[Jj]edi', '[Vv]andredi', '[Ss]amed', '[Dd]imanch', '^ *[Jj]ou' } local premier = { '<abbr class="abbr ?" title="[Pp]remye" ?>1<sup>e</sup></abbr>', '1<sup>e</sup>', '1e' } for i = 1, #nomJour do jour = jour:gsub( nomJour[i], '' ) end for i = 1, #premier do jour = jour:gsub( premier[i], '1' ) end jour = trim( jour ) end return jour end --- -- Sépare une chaine date en une table contenant les champs jour, mois et annee. -- la date doit contenir le mois. function fun.separationJourMoisAnnee( date ) date = trim( date ) if date then local function erreur( periode, valeur ) return false, '<span class="error">' .. periode .. ' invalide (' .. valeur .. ')</span>' end local dateAvantCleanup = date local jour, mois, annee, masquerMois, masquerAnnee, separateur -- variable pour construire les regex local j = '([0-3]?%d)' -- jour local m = '([01]?%d)' -- mois numérique local mmm = '([^%s%p%d]+[.]?)' -- mois en toute lettre local mmm2 = '([^%s%p%d]+[.]?[-/][^%s%p%d]+[.]?)' -- mois-mois en toute lettre local aj = '(%-?%d+)' -- année ou jour local s = '[ ./-]+' -- séparateur simple local sep = '([ ./-]+)' -- séparateur avec capture, pour le détecter deux fois local moins = '(%-?)' -- signe moins pour signifier qu'il ne faut pas afficher cette donnée date = fun.nettoyageJour( date ) if date:find( '[[', nil, true ) then date = date -- suppression catégories (doit être exécuté avant le code de suppression des liens) :gsub( '%[%[[Kk]ategori:.-%]%]', '' ) :gsub( '%[%[[Cc]ategory:.-%]%]', '' ) -- suppression liens :gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', function ( l, t ) return trim( t ) or l end ) end date = date -- suppression balises :gsub( '%b<>', '' ) -- suppression des espaces insécables -- nbsp :gsub( '\194\160', ' ' ) :gsub( '&nbsp;', ' ' ) :gsub( '&#160;', ' ' ) -- narrow nbsp :gsub( '\226\128\175', ' ' ) :gsub( '&#8239;', ' ' ) -- thin space :gsub( '\226\128\137', ' ' ) :gsub( '&thinsp;', ' ' ) :gsub( '&#8201;', ' ' ) -- simple space :gsub( '&#32;', ' ' ) -- plusieurs espaces :gsub( ' +', ' ' ) -- réduction av. J-C pour simplifier un peu les regex : :gsub( '(%d+) ?[Aa][Vv]%.? ?[Jj][ .-]*[Kk]%.?', '-%1' ) -- suppression de l'heure dans les dates ISO :gsub( '^+?([%d-]*%d%d%-%d%d)T%d%d[%d:,.+-]*Z?$' , '%1') -- test année seule if date:match( '^'..aj..'$' ) then annee = date:match( '^'..aj..'$' ) elseif date:match( '^'..aj..s..aj..moins..'$' ) then -- jj/mm, mm/aaaa ou aaaa/mm local a, separateur, b, sb = date:match( '^'..aj..sep..aj..moins..'$' ) a, b = tonumber( a ), tonumber( b ) if separateur:match( '^.+%-$' ) then -- probablement mm/-aaaa, ane av.JK b = 0 - b end if a > 12 and ( b < 1 or b > 31 ) or b > 12 and ( a < 1 or a > 31 ) then return erreur( 'Date', dateAvantCleanup ) elseif b < 1 or b > 31 then mois, annee, masquerAnnee = a, b, sb elseif a < 1 or a > 31 then annee, mois = a, b elseif b > 12 then return erreur( 'Mois', b ) else jour, mois, masquerMois = a, b, sb end elseif date:match( '^'..aj..sep..m..moins..'%2'..aj..moins..'$' ) then -- jj/mm/aaaa ou aaaa/mm/jj jour, separateur, mois, masquerMois, annee, masquerAnnee = date:match( '^'..aj..sep..m..moins..'%2'..aj..moins..'$' ) if separateur == '-' and masquerMois == '-' and masquerAnnee == '' and tonumber( annee ) > 0 then -- date au format jj-mm--aaaa type 17-06--44 pour 17 jen 44 av. JK masquerMois = nil annee = 0 - annee end elseif date:match( '^'..j..sep..mmm..moins..'%2'..aj..moins..'$' ) then -- jj mmm aaaa jour, separateur, mois, masquerMois, annee, masquerAnnee = date:match( '^'..j..sep..mmm..moins..'%2'..aj..moins..'$' ) elseif date:match( '^'..mmm..s..aj..moins..'$' ) then -- mmm aaaa mois, separateur, annee, masquerAnnee = date:match( '^'..mmm..sep..aj..moins..'$' ) if separateur:match( '^.+%-$' ) then annee = '-' .. annee end elseif date:match( '^'..mmm2..s..aj..moins..'$' ) then -- mmm-mmm aaaa mois, separateur, annee, masquerAnnee = date:match( '^'..mmm2..sep..aj..moins..'$' ) if separateur:match( '^.+%-$' ) then annee = '-' .. annee end elseif date:match( '^'..j..s..mmm..moins..'$' ) then -- jj mmm jour, mois, masquerMois = date:match( '^'..j..s..mmm..moins..'$' ) elseif date:match( '^'..mmm..s..j..', ?'..aj..'$') then -- mmm jj, aaaa (format anglo-saxon) mois, jour, annee = date:match( '^'..mmm..s..j..', ?'..aj..'$') elseif date:match( '^'..mmm..'$' ) then mois = date else return erreur( 'Date', dateAvantCleanup ) end local jn, an = tonumber( jour ), tonumber( annee ) if jn and an and ( jn > 31 or jn < 0 or #jour >= 3 ) and an <= 31 then -- cas notamment des date ISO 2015-06-17, -0044-06-17 et -0002-06-17 -- inversion du jour et de l'année local temp = annee annee = jour jour = temp end return fun.validationJourMoisAnnee{ jour, mois, annee, masquerAnnee = trim( masquerAnnee ) and true or nil, masquerMois = ( trim( masquerAnnee ) or not annee ) and trim( masquerMois ) and true or nil, -- or nil sert juste à éviter de trainer une valeur false dans tous les tests unitaires. } else return true, {} end end --- -- validationJourMoisAnnee vérifie que les paramètres correspondent à une date valide. -- la date peut être dans les paramètres 1 à 3, ou dans des paramètres jour, mois et annee. -- La fonction retourne true suivi d'une table avec la date en paramètres nommés (sans accent sur année) -- ou false suivi d'un message d'erreur. function fun.validationJourMoisAnnee( frame ) local args = Outils.extractArgs( frame ) local jour, mois, numMois, annee local bjour = args[1] or args['jou'] or '' local bmois = tostring( args[2] or args['mwa'] or '' ) local bannee = args[3] or args['annee'] or args['ane'] or '' local function erreur( periode, valeur ) return false, '<span class="error">' .. periode .. ' invalide (' .. valeur .. ')</span>' end -- on traite l'année if Outils.notEmpty( bannee ) then annee = tonumber( bannee ) if annee == nil and type( bannee ) == 'string' then -- test si l'année contient av. J.-K. annee = bannee:match( '^(%d+) ?[Aa][Vv]%.? ?[Jj][ .-]*[Kk]%.?' ) annee = tonumber( annee ) if annee then annee = 0 - annee else return erreur( 'Ane', bannee ) end elseif annee == 0 then return erreur( 'Ane', 0 ) end else annee = nil end -- on traite le mois if Outils.notEmpty( bmois ) then mois, numMois = fun.determinationMois( bmois ) if mois == nil then mois = fun.determinationSaison( bmois ) if mois == nil then local mois1, sep, mois2 = bmois:match( '^([^%s%p%d]+[.]?)([-/])([^%s%p%d]+[.]?)$' ) if mois1 then mois1 = fun.determinationMois( mois1 ) mois2 = fun.determinationMois( mois2 ) if mois1 == nil or mois2 == nil then return erreur( 'Mwa', bmois ) end mois = mois1 .. sep .. mois2 else return erreur( 'Mwa', bmois ) end end end -- on traite le jour si présent if Outils.notEmpty( bjour ) then if not numMois then erreur( 'Date', 'jour avec saison ou plusieurs mois' ) end jour = tonumber( bjour ) if jour == nil then jour = tonumber( fun.nettoyageJour( bjour ) ) end if jour == nil then return erreur( 'Jour', bjour ) end -- on valide que le jour est correct if jour < 1 or jour > 31 then return erreur( 'Jour', bjour ) elseif jour > listeMois[numMois].nJour then return erreur( 'Jour', bjour .. ' ' .. mois ) elseif jour == 29 and numMois == 2 and annee and ( math.fmod( annee, 4 ) ~= 0 ) then -- l'année bisextile sur les siècles est toujours acceptée pour être compatible avec les dates juliennes. return erreur( 'Jour', '29 février ' .. annee ) end else -- S'il n'y a pas de jour on regarde si la première lettre du mois est en majuscule if bmois:match( '^%u' ) then -- oui, on passe la première lettre en majuscule mois = ucfirst( mois ) end -- s'il n'y a pas d'année non plus on retourne le mois simple end else -- on teste le jour si présent if Outils.notEmpty( bjour ) then if annee then return erreur( 'Mois', 'absent' ) else bjour = fun.nettoyageJour( bjour ) jour = tonumber( bjour ) if jour then if jour > 31 or jour < 1 then annee = jour jour = nil else return erreur( 'Date', 'jour seul : ' .. bjour ) end else return erreur( 'Jour', bjour ) end end end end -- vérification de l'absence d'un décalage if annee and annee < 13 and annee > 0 and not jour and ( tonumber( bmois ) or ( not mois and tonumber( args[4] ) ) ) then return false, '<span class="error">année improbable (' .. annee .. ')</span>' end local resultat = { jour = jour, mois = mois, numMois = numMois, annee = annee, masquerAnnee = args.masquerAnnee, masquerMois = args.masquerMois, } return true, resultat end --- -- émule le modèle {{m|Date}}. -- Paramètres : -- 1 : jour (numéro ou "1er") ou la date complète -- 2 : mois (en toutes lettres) ou spécialité de l'année -- 3 : année (nombre) -- 4 : spécialité de l'année -- julien : date dans le calendrier julien -- compact : affiche le mois sous forme d'abréviation -- avJC : non pour désactiver l'affichage de « av. J.-C. » pour les dates négatives -- âge : ajoute la durée depuis cette date -- agePrefix : préfixe pour l'age, 'à ' par défaut pour les décès -- liens : active les liens par défaut -- nolinks : ne met pas de lien sur la date (a précédence sur le paramètre "liens") -- afficherErreurs : en cas d'erreur, si défini à "non" ne retourne pas un message d'erreur, mais le 1er argument inchangé -- categoriserErreurs : en cas d'erreur, si défini à "non" ne catégorise pas ; peut aussi être défini avec une catégorie à utiliser à la place de celle par défaut -- naissance : ajoute la class "bday" -- mort : ajoute la class "dday" function fun.modeleDate( frame ) local Yesno = require 'Module:Yesno' local args = Outils.extractArgs( frame ) local resultat local dateNaissanceMort -- analyse des paramètres non nommés (ou paramètres de la date jour, mois, annee) local test, params local arg1, arg2, arg3 = fun.nettoyageJour( args[1] ), trim( args[2] ), trim( args[3] ) if type( arg1 ) == 'string' and arg3 == nil and ( arg1:match( '[^ ./-][ ./-]+[^ ./-]' ) or arg2 == nil or dataLiens[arg2] or mw.ustring.match( arg2, '%a %a' ) ) then -- la date est dans le premier paramètre test, params = fun.separationJourMoisAnnee( arg1 ) if test then dateNaissanceMort = trim( arg2 ) if dataLiens[trim( arg2 )] then params.qualificatif = trim( arg2 ) end end elseif type( arg1 ) == 'string' and type( arg2 ) == 'string' and arg3 ~= nil and ( arg1:match( '[^ ./-][ ./-]+[^ ./-]' ) or dataLiens[arg3] or mw.ustring.match( arg3, '%a %a' ) ) then -- la date est dans le premier paramètre test, params = fun.separationJourMoisAnnee( arg1 ) if test then dateNaissanceMort = trim( arg2 ) if dataLiens[trim( arg3 )] then params.qualificatif = trim( arg3 ) end end else local function masquerParam( p ) -- sépare le signe moins final éventuel signifiant que le paramètre ne doit pas être affiché. if type( p ) ~= 'string' then return p, nil end local value, mask = p:match( '^%s*(.-)(%-?)%s*$' ) return value, ( mask == '-' or nil ) end local cleanArgs = { arg1 or args.jour } cleanArgs[2], cleanArgs.masquerMois = masquerParam( args[2] or args.mois ) cleanArgs[3], cleanArgs.masquerAnnee = masquerParam( args[3] or args.annee or args['année'] ) -- Si les paramètres ont été envoyés directement, ils ont précédence if args.masquerMois then cleanArgs.masquerMois = args.masquerMois end if args.masquerAnnee then cleanArgs.masquerAnnee = args.masquerAnnee end test, params = fun.validationJourMoisAnnee( cleanArgs ) if test and dataLiens[trim( args[4] )] then params.qualificatif = trim( args[4] ) end end -- analyse des paramètres nommés if test then params.agePrefix = args.agePrefix if args.qualificatif and dataLiens[args.qualificatif] then params.qualificatif = args.qualificatif end -- julien peut avoir trois valeurs : inactif, format standard (true), format court params.julien = Yesno( args.julien, 'court', false ) params.avJC = Yesno( args.avJC ) if args['républicain'] and args['républicain'] ~= '' then if args['républicain'] == 'liens' then params.republicain = 'liens' else params.republicain = Yesno( args['républicain'], false ) end else params.republicain = false end if args.dateNaissanceMort and args.dateNaissanceMort ~= '' then dateNaissanceMort = args.dateNaissanceMort elseif args['dateNaissanceÉvénement'] and args['dateNaissanceÉvénement'] ~= '' then dateNaissanceMort = args['dateNaissanceÉvénement'] end if dateNaissanceMort then local testNaissanceMort, paramsNaissanceMort = fun.separationJourMoisAnnee( dateNaissanceMort ) if testNaissanceMort then params.anneeNaissanceMort, params.moisNaissanceMort, params.numMoisNaissanceMort, params.jourNaissanceMort = paramsNaissanceMort.annee, paramsNaissanceMort.mois, paramsNaissanceMort.numMois, paramsNaissanceMort.jour end end local listeParam = { age = 'âge', ['âge'] = 'âge', naissance = 'naissance', mort = 'mort', ['événement'] = 'événement', evenement = 'evenement', ['décès'] = 'mort', apJC = 'apJC', nolinks = 'nolinks', compact = 'compact', compacte = 'compact', } for n, v in pairs( listeParam ) do params[v] = params[v] or Yesno( args[n], true, false ) or nil end if not params.nolinks then local liens = Yesno( args.liens ) if liens == nil then -- liens actifs par défaut si qualificatif liens = params.qualificatif and params.qualificatif ~= "" and true or false end params.nolinks = not liens end -- sortie pour les tests unitaire, ou pour débugger if args.debug then return params end resultat = fun._modeleDate( params ) else local yn_afficherErreurs = Yesno( args.afficherErreurs ) if yn_afficherErreurs == nil or yn_afficherErreurs == true then resultat = params else resultat = args[1] end local currentTitle = mw.title.getCurrentTitle() if currentTitle:inNamespaces( 0, 4, 10, 14, 100 ) and not Outils.notEmpty( args.nocat ) and not currentTitle.prefixedText:match( '^Modèl:.+/Test$' ) then local categorie local yn_categoriserErreurs = Yesno( args.categoriserErreurs, 'custom', true ) if yn_categoriserErreurs == nil or yn_categoriserErreurs == true then categorie = '[[Kategori:Paj ki itilize modèl dat ak sentaks ki pa kòrèk]]' elseif yn_categoriserErreurs == false then categorie = '' else local nomCategorie = args.categoriserErreurs :gsub( '^%[%[', '' ) :gsub( '%]%]$', '' ) :gsub( '^:?[Cc]atégorie:', '' ) :gsub( '^:?[Cc]atégory:', '' ) categorie = '[[Kategori:' .. nomCategorie .. ']]' end resultat = resultat .. categorie end end return resultat or '' end function fun._modeleDate( args ) local annee, mois, numMois, jour = args.annee, args.mois, args.numMois, args.jour local qualificatif = args.qualificatif if ( annee or mois or jour ) == nil then return end -- on traite l'âge, naissance et mort local agePrefix = args.agePrefix local age = args['âge'] and fun.age( annee, numMois, jour ) local naissance = args.naissance local mort = args.mort local evenement = args['événement'] or args.evenement if mort and args.anneeNaissanceMort then age = fun.age( args.anneeNaissanceMort, args.numMoisNaissanceMort, args.jourNaissanceMort, annee, numMois, jour ) agePrefix = agePrefix or 'à ' -- faut-il mettre \194\160 ? elseif evenement and args.anneeNaissanceMort then if naissance then age = fun.age( annee, numMois, jour, args.anneeNaissanceMort, args.numMoisNaissanceMort, args.jourNaissanceMort ) else age = fun.age(args.anneeNaissanceMort, args.numMoisNaissanceMort, args.jourNaissanceMort, annee, numMois, jour ) end end agePrefix = agePrefix or '' -- on traite le calendrier local gannee, gmois, gjour = annee, numMois, jour -- date suivant le calendrier grégorien pour <time> local jannee, jmois, jjour = annee, mois, jour -- date suivant le calendrier julien si necessaire local julienDate, julienSup, julienSep -- servira éventuellement à afficher la date selon le calendrier julien local gregAprMois, gregAprAn, gregFin -- message de calendrier grégorien lorsque la date est selon le calendrier julien local dateRepublicaine if annee and jour then local amj = annee * 10000 + numMois * 100 + jour if amj < 15821014 then if annee > 0 then gannee, gmois, gjour = fun.julianToGregorian( annee, numMois, jour ) else -- calendrier grégorien proleptique avec année 0. gannee, gmois, gjour = fun.julianToGregorian( annee + 1, numMois, jour ) end args.julien = false elseif args.julien then gannee, gmois, gjour = fun.julianToGregorian( annee, numMois, jour ) annee, mois, jour = gannee, listeMois[gmois].nom, gjour if jjour == 1 then jjour = modelePremier end if args.compact then jmois = listeMois[jmois].abrev end if args.julien == 'court' then julienDate = jjour .. ' ' .. jmois .. ' ' julienSup = '<sup>[[almanak jilyen|jil.]]</sup>' if jannee == annee then gregAprMois = '<sup>[[almanak gregoryen|greg.]]</sup>' else julienDate = julienDate .. jannee .. ' ' gregAprAn = '<sup>[[almanak gregoryen|greg.]]</sup>' end julienSep = ' / ' else julienDate = jjour .. ' ' .. jmois .. ' ' .. jannee julienSep = ' (' gregFin = ' [[Passage du calendrier julien au calendrier grégorien|dans le calendrier grégorien]])' end elseif args.republicain then local DateRep = require 'Module:Date républicaine' local RepSansLiens if args.republicain == 'liens' then RepSansLiens = false else RepSansLiens = true end dateRepublicaine = DateRep._date_republicaine( RepSansLiens, { fun.formatRepCal( fun.do_toRepCal{gannee, gmois, gjour} ) } ) end else if annee and annee < 0 then gannee = gannee + 1 end args.julien = false args.republicain = false end -- on génère le résultat -- Déclarations des variables local wikiListe = {} -- reçoit le texte affiché pour chaque paramètre local iso = {} -- reçoit le format date ISO de ce paramètre local texteMois = mois -- texte du mois qui sera affiché (éventuellement l'abréviation) if args.compact then if not numMois then -- mois est autre chose qu'un simple mois : saison, mois-mois... auquel cas, pas d'abréviation (provoquait erreur Lua) -- (les abréviations pour le cas "mois[-/]mois" seraient théoriquement possibles, mais ça reste à implémenter) else if args.nolinks then texteMois = '<abbr class="abbr" title="' .. mois .. '">' .. listeMois[mois].abrev .. '</abbr>' else texteMois = listeMois[mois].abrev end end end mois = mois and mois:gsub( 'out', 'août' ) local dataQualificatif, dataCat if not args.nolinks then dataQualificatif = dataLiens[qualificatif or ''] if type( dataQualificatif ) ~= 'table' then -- si le qualificatif n'est pas dans la base de données, on crée une table minimum, -- qui imposera un test sur l'année, mais considère qu'il n'y a pas de lien sur le jour ou le mois dataQualificatif = { qualificatif = qualificatif, annee = { } } end dataCat = dataLiens[dataQualificatif.cat] if type( dataCat ) ~= 'table' or dataCat == dataQualificatif then dataCat = { qualificatif = '' } end end local function wikiLien( lien, texte ) if lien == texte then return '[[' .. texte .. ']]' else return '[[' .. lien .. '|' .. texte .. ']]' end end -- le jour si présent local qualifJour = '' if jour then if args.nolinks then if jour == 1 then jour = modelePremier end table.insert( wikiListe, jour ) else qualifJour = dataQualificatif.jour and dataQualificatif.qualificatif or dataCat.jour and dataCat.qualificatif or '' local texteJour, lien if jour == 1 then texteJour = '1<sup>e</sup>' lien = '1e ' .. mois else texteJour = jour lien = jour .. ' ' .. mois end if qualifJour ~= '' then lien = lien .. ' ' .. qualifJour end -- s'il n'y a pas de lien sur le mois, il sera affiché avec le jour. table.insert( wikiListe, wikiLien( lien, texteJour ) ) table.insert( wikiListe, wikiLien( lien, texteJour .. ' '.. texteMois ) ) end table.insert( iso, 1, string.sub( '0' .. gjour, -2 ) ) end -- le mois if mois then if #wikiListe == 0 and annee == nil then return texteMois end if args.nolinks then if not args.masquerMois then table.insert( wikiListe, texteMois ) end else local lien if annee then if not numMois then -- mois est autre chose qu'un simple mois : saison, mois-mois... auquel cas, pas de lien else lien = existDate( dataQualificatif, annee, mois ) or existDate( dataCat, annee, mois ) if lien == nil and qualificatif and qualifJour == '' then -- nouveau test sans le qualificatif uniquement s'il n'y a pas d'éphémérides pour ce qualificatif. lien = existDate( dataLiens[''], annee, mois ) end end end if lien or args.masquerMois then -- s'il y a un lien on retire le lien affichant 'jour mois' pour ajouter '[[mois annee|mois]]' table.remove( wikiListe ) if not args.masquerMois then table.insert( wikiListe, wikiLien( lien, texteMois ) ) end elseif #wikiListe > 0 then -- sinon on retire le lien affichant 'jour' pour ne garder que le lien 'jour mois' table.remove( wikiListe, #wikiListe - 1 ) elseif args.masquerAnnee then -- s'il n'y a pas de jour et que l'année n'est pas affichée, on insère le mois seul. table.insert( wikiListe, texteMois ) end end if gmois then table.insert( iso, 1, string.sub( '0' .. gmois, -2 ) ) end table.insert( wikiListe, gregAprMois ) end -- l'année if annee and not (args.julien == true and args.nolinks and jannee == annee ) then if not args.masquerAnnee then local texteAnnee = annee if annee < 0 then local anneeAvJc = 0 - annee if args.avJC == false then texteAnnee = anneeAvJc else texteAnnee = anneeAvJc .. ' <abbr class="abbr" title="' .. anneeAvJc .. ' avan Jezi-Kris">av. J.-K.</abbr>' end elseif args.apJC then texteAnnee = texteAnnee .. ' <abbr class="abbr" title="' .. texteAnnee .. ' aprè Jezi-Kris">apr. J.-K.</abbr>' end if args.nolinks then -- seulement si on doit l'afficher table.insert( wikiListe, texteAnnee ) else local lien = existDate( dataQualificatif, annee ) or existDate( dataCat, annee ) if not lien then if annee < 0 then local anneeAvJc = 0 - annee lien = anneeAvJc .. ' av. J.-K.' else lien = annee end end if mois and #wikiListe == 0 then -- si le mois n'a pas de lien et n'est pas affiché avec le jour, il est affiché avec l'année. texteAnnee = texteMois .. ' ' .. texteAnnee end table.insert( wikiListe, wikiLien( lien, texteAnnee ) ) end end end if annee then if gannee > 999 then table.insert( iso, 1, gannee ) elseif gannee > -1 then table.insert( iso, 1, string.sub( '000' .. gannee , -4 ) ) elseif gannee > -999 then -- calendrier grégorien proleptique avec année 0. table.insert( iso, 1, 'U-' .. string.sub( '000' .. ( 0 - gannee ), -4 ) ) else table.insert( iso, 1, 'U' .. gannee ) end end table.insert( wikiListe, gregAprAn ) -- l'age if type( age ) == 'number' and age >= 0 and ( not naissance or age < 120 ) then if age == 0 then age = '(' .. agePrefix .. 'mwens ke\194\160ane)' elseif age == 1 then age = '(' .. agePrefix .. '1\194\160ane)' else age = '('.. agePrefix .. age .. '\194\160ane)' end else age = false end -- compilation du résultat local wikiTexte = table.concat( wikiListe, ' ' ) local isoTexte = table.concat( iso, '-' ) -- On ajoute un peu de sémantique. local wikiHtml = mw.html.create( '' ) if julienDate then wikiHtml:tag( 'span') :addClass( 'nowrap' ) :attr( 'data-sort-value', isoTexte ) :wikitext( julienDate ) :node( julienSup ) :done() :wikitext( julienSep ) end local dateHtml = wikiHtml:tag( 'time' ) :wikitext( wikiTexte ) if wikiTexte:match( ' ' ) then dateHtml:addClass( 'nowrap' ) end if isoTexte ~= wikiTexte then dateHtml:attr( 'datetime', isoTexte ) :attr( 'data-sort-value', isoTexte ) end if not args.nolinks then dateHtml:addClass( 'date-lien' ) end if naissance then dateHtml:addClass( 'bday' ) elseif mort then dateHtml:addClass( 'dday' ) end wikiHtml:wikitext( gregFin ) if dateRepublicaine then wikiHtml:wikitext( ' (', dateRepublicaine, ')' ) end if age then wikiHtml:wikitext( ' ' ) :tag( 'span' ) :addClass( 'noprint') :wikitext( age ) :done() end return tostring( wikiHtml ) end -- isoJourMoisAnnee transforme une date iso en un tableau équivalent à celui retourné par separationJourMoisAnnee local function isoJourMoisAnnee( dateiso ) if dateiso and dateiso:sub( 1, 2 ) == 'U-' then dateiso = dateiso:sub( 2 ) end local annee, mois, jour = dateiso:match( '^(%-?%d%d%d%d+)%-(%d+)%-(%d+)$' ) if not annee then annee, mois = dateiso:match( '^(%-?%d%d%d%d+)%-(%d+)$' ) end if not annee then annee = dateiso:match( '^(%-?%d%d%d%d+)$' ) end if annee and tonumber( annee ) <= 0 then -- la date iso utilise une année 0 annee = tonumber( annee ) - 1 end if not annee then mois, jour = dateiso:match( '^(%d+)%-(%d+)$' ) end return fun.validationJourMoisAnnee{ jour, mois, annee } end -- analyseDate sépare la date du contenu qui précède et suit, supprime les liens, et retourne si possible une table avec jour mois année local function analyseDate( d ) if trim( d ) then local datesMultiples = d:match( ' ou ' ) or d:match( '^[Aa]nt ' ) or d:match( '<time.->.-<time.->' ) if datesMultiples then return d end local approx = d:match( '^[Aa]lantou ' ) or d:match( '^[Aa]prè ' ) or d:match( '^[Aa]van ' ) -- booléen qui indique que la date est approximative, empêchant l'affichage de l'âge ou de la durée approx = approx and true or false local analyse = d -- s'il s'agit d'une date formattée avec {{date}}, on utilisera la valeur du datetime pour reconstruire la date local dateiso = d:match( 'datetime="([U%d-]+)"' ) or d:match( '<time>(.-)</time>' ) local debut, strDate, fin if dateiso then -- supprime le formatage créé par {{date}} debut, strDate, fin = analyse:match( '(.-)<time.->(.-)</time>(.*)' ) end if not strDate then -- sépare une date av. J.-C. du contenu qui suit strDate, fin = analyse:match( '(.-%d av%. J%.%-C%.]*%-?)(.*)' ) end if not strDate then -- sépare la date (avec ses liens) d'une référence ou contenu commençant par un espace strDate, fin = analyse:match( '(.-%d%d%d%]*%-?)([\127 ].+)' ) end if not strDate then -- sépare la date du contenu commençant par <br> strDate, fin = analyse:match( '(.-%d%d%d%]*%-?)(<br ?/?>.+)' ) end analyse = strDate or analyse -- supprime les liens analyse = analyse:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', function ( l, t ) return trim( t ) or l end ) local t, r if dateiso then -- Si la date était formatée avec {{date}}, on la reconstruit à partir de la valeur de datetime t, r = isoJourMoisAnnee( dateiso ) end if t then local tTexte, rTexte = fun.separationJourMoisAnnee( analyse ) if r.annee and r.jour then local amj = r.annee * 10000 + r.numMois * 100 + r.jour -- Les dates avant le 14 octobre 1582 sont dans le calendrier julien mais utilisent un datetime grégorien local gregToJul = amj < 15821014 if not gregToJul and amj < 15821024 then -- Entre le 14 et le 23 octobre, on ne peut pas différencier entre julien et grégorien sans comparer avec le texte gregToJul = tTexte and rTexte.jour ~= r.jour end if gregToJul then local jannee, jmois, jjour = fun.gregorianToJulian( r.annee, r.numMois, r.jour ) r = { annee = jannee, numMois = jmois, mois = listeMois[jmois].nom, jour = jjour } end end if tTexte then -- On analyse le texte de la date pour repérer les dates partiellement masquées -- Si seul le jour est affiché, separationJourMoisAnnee l'interprète comme une année if not rTexte.jour and not rTexte.mois and rTexte.annee == r.jour then r.masquerMois = true r.masquerAnnee = true elseif rTexte.jour == r.jour and rTexte.mois == r.mois and not rTexte.annee then r.masquerAnnee = true end end else t, r = fun.separationJourMoisAnnee( analyse ) end if t then return r, fin, debut, approx else return d, fin, debut, approx end end end --- -- fonction destinée aux infobox, notamment pour afficher les dates de naissance et de mort -- les liens présent dans les dates fournies sont automatiquement supprimés pour gérer les cas où -- le paramètre contient déjà un modèle date. -- Paramètres : -- 1 : type de date à afficher (naissance / n, mort / m, ou date / d) -- 2 : Date ou date de naissance -- 3 : Date de mort si type n ou m -- qualificatif = suffixe des page de date à lier (exemple : en musique) -- nolinks : n'affiche pas de lien -- préfixe : préfixe à afficher s'il y a un jour (par défaut '') -- préfixe sans jour : préfixe à afficher s'il n'y a pas de jour (par défaut : '') function fun.dateInfobox( frame ) local args = frame.args if type( args ) ~= 'table' or not ( args[1] and args[2] ) then return end -- prefix ajoute un préfixe en fonction de la présence ou non du jour si le paramètre "préfixe sans jour" est défini local function prefix( dateString ) if dateString then local datetime = dateString:match( 'datetime="([U%d%-]+)"' ) if datetime and datetime:match('%-%d%d%-%d%d') and trim( args['préfixe'] ) then return args['préfixe'] .. ' ' .. dateString end if trim( args['préfixe sans jour'] ) then return args['préfixe sans jour'] .. ' ' .. dateString end end return dateString end local naissance = args[1]:match( '^n' ) == 'n' local mort = args[1]:match( '^m' ) or args[1]:match( 'décès' ) local evenement = args[1]:match( '^é' ) local affichageDate, qualificatif = args[2], args[4] local affichageDateTab, resultatDate, complementDate, prefixeDate, approxDate local dateNaissance, dateMort, approxNaissance, approxMort if mort or evenement then affichageDate = args[3] end if not trim( affichageDate ) then return end if affichageDate:match( ']]</time>' ) or affichageDate:match( '</time>]]' ) then -- S'il y a des liens il y a probablement déjà un modèle date, évitons de l'exécuter une 2e fois if ( naissance or mort or evenement ) and ( affichageDate:match( 'wikidata%-linkback' )) then local _ dateNaissance, _, _, approxNaissance = analyseDate( args[2] ) dateMort, _, _, approxMort = analyseDate( args[3] ) resultatDate = affichageDate else return prefix( affichageDate ) end else affichageDateTab, complementDate, prefixeDate, approxDate = analyseDate( affichageDate ) if type( affichageDateTab ) ~= 'table' then return affichageDateTab else if naissance then local _ dateNaissance, approxNaissance = affichageDateTab, approxDate dateMort, _, _, approxMort = analyseDate( args[3] ) elseif mort then local _ dateNaissance, _, _, approxNaissance = analyseDate( args[2] ) dateMort, approxMort = affichageDateTab, approxDate else qualificatif = args[3] end affichageDateTab.naissance = not approxNaissance and naissance affichageDateTab.mort = not approxMort and mort affichageDateTab.evenement = evenement affichageDateTab.qualificatif = args.qualificatif or qualificatif affichageDateTab.liens = true -- Dans les infobox, liens activés par défaut affichageDateTab.nolinks = args.nolinks affichageDateTab.nocat = args.nocat affichageDateTab.julien = args.julien end end resultatDate = resultatDate or fun.modeleDate( affichageDateTab ) local age, prefixAge, suffixAge, calculAge = '', ' <span class="noprint">(', ')</span>', nil if naissance and dateNaissance and not approxNaissance and not dateMort and type( dateNaissance ) == 'table' then calculAge = fun.age( dateNaissance.annee, dateNaissance.numMois, dateNaissance.jour ) if calculAge and calculAge > 120 then calculAge = nil end elseif ( mort or evenement ) and dateNaissance and dateMort and not approxNaissance and not approxMort and type( dateNaissance ) == 'table' and type( dateMort ) == 'table' then calculAge = fun.age( dateNaissance.annee, dateNaissance.numMois, dateNaissance.jour, dateMort.annee, dateMort.numMois, dateMort.jour ) prefixAge = ' (ak ' suffixAge = ')' end if tonumber( calculAge ) then if calculAge > 1 then age = prefixAge .. calculAge .. '\194\160ane' .. suffixAge elseif calculAge == 1 then age = prefixAge .. 'en\194\160ane' .. suffixAge elseif calculAge == 0 then age = prefixAge .. 'mwens ke yon\194\160ane' .. suffixAge end if complementDate and complementDate:match( 'ane?%)' ) then complementDate = '' end end return ( prefixeDate or '' ) .. prefix( resultatDate ) .. ( complementDate or '' ) .. age end function fun.dureeInfobox( frame ) local args = frame.args if type( args ) ~= 'table' or not args[1] then return end -- vérifie si une chaîne semble contenir une durée local function contientDuree( chaine ) return chaine and ( mw.ustring.match( chaine, '%f[%w]ane?%f[^%w]' ) or mw.ustring.match( chaine, '%f[%w]mwa%f[^%w]' ) or mw.ustring.match( chaine, '%f[%w]jou?%f[^%w]' ) ) end local jour1, mois1, annee1, jour2, mois2, annee2 = '', '', '', '', '', '' local t1, fin1, _, approx1 = analyseDate( args[1] ) if approx1 or type( t1 ) ~= 'table' then return end jour1 = t1.jour or '' mois1 = t1.numMois or '' annee1 = t1.annee or '' if args[2] and args[2] ~= "" then local t2, fin2, _, approx2 = analyseDate( args[2] ) if approx2 or type( t2 ) ~= 'table' then return end if contientDuree( fin2 ) then -- La durée semble déjà renseignée manuellement return end jour2 = t2.jour or '' mois2 = t2.numMois or '' annee2 = t2.annee or '' if annee1 == '' or annee2 == '' then -- Mieux vaut ne pas extrapoler l'année return end if ( jour1 ~= '' and jour2 == '' ) or ( mois1 ~= '' and mois2 == '' ) then -- Si la deuxième date est moins précise que la première, mieux vaut ne rien afficher return end elseif annee1 == '' or contientDuree( fin1 ) then -- L'année n'est pas spécifiée ou la durée semble déjà renseignée return end local duree = Duree._duree({ jour1, mois1, annee1, jour2, mois2, annee2, noerror = true }) if duree then return '<br /><small>(' .. duree .. ')</small>' end end --- -- la fonction dateISO renvoie un date au format aaaa-mm-jj (sans liens) -- l'année peut être sous la forme 2013 ou [[2013 en litérature|2013]] -- le mois peut être en lettres ou en chiffres -- le jour peut être sous la forme '05', '{{1er}}' ou 'vendredi 13' function fun.dateISO( frame ) local args = Outils.extractArgs( frame ) local annee = Outils.notEmpty( args['année'], args.annee, args.year, args.date ) -- extraction de l'année if type( annee ) == 'string' then annee = ( tonumber( annee ) -- match '2013' or string.match ( annee, '%D(%d%d%d%d)%D' ) -- match '[[2013 nan mizik|2013]]' or string.match ( annee, '%D(%d%d%d%d)$' ) -- match '17 septanm 2013' or string.match ( annee, '^(%d%d%d%d)%D' ) -- match '2013-09-17' ) end annee = tonumber( annee ) -- le format de date iso est défini suivant le calendrier grégorien. -- Avant l'année 1583 la date est calendrier est probablement du calendrier julien, -- donc autant s'abstenir. if annee and annee > 1582 then local mois = Outils.notEmpty( args.mois, args.month ) -- num mois trouve le numéro du mois, qu'il soit numérique ou texte, complet ou abrégé. local nomMois, numMois = fun.determinationMois( mois ) if numMois then mois = '-' .. string.sub( '0' .. numMois, -2 ) local jour = Outils.notEmpty( args.jour, args.day, args['quantième'] ) if type( jour ) == 'string' then jour = tonumber( jour ) or tonumber( string.match ( jour, '%d+') ) end jour = tonumber( jour ) if jour and jour <= listeMois[numMois].nJour then jour = '-' .. string.sub( '0' .. jour, -2 ) return annee .. mois .. jour else return annee .. mois end else return tostring( annee ) end end end --- -- Rang du jour dans l'année -- Usage : do_dayRank{année,mois,jour} function fun.do_dayRank(arguments) local yr = tonumber(arguments.year or arguments[1]) or 1 local mt = tonumber(arguments.month or arguments[2]) or 1 local dy = tonumber(arguments.day or arguments[3]) or 1 -- Rangs des premiers des mois local ranks = {0,31,59,90,120,151,181,212,243,273,304,334} local rank = (ranks[mt] or 0) + dy - 1 if(fun.isLeapYear(yr) and (mt >= 3)) then rank = rank+1 end return rank end -- Nombre de jours entre deux années (du 1er janvier au 1er janvier) -- Suit le calendrier grégorien function fun.do_daysBetween(arguments) local yr1 = tonumber(arguments[1]) or 0 local yr2 = tonumber(arguments[2]) or 0 return fun.daysSinceOrigin(yr2) - fun.daysSinceOrigin(yr1) end -- Nombre de jours depuis l'année 1 (du 1er janvier au 1er janvier) function fun.daysSinceOrigin(year) local yr = year-1 return 365*yr + math.floor(yr/4) - math.floor(yr/100) + math.floor(yr/400) end -- Test d'année bissextile (Suit le calendrier grégorien) function fun.isLeapYear(year) local yr = tonumber(year) or 1 return (yr%4 == 0) and ((yr%100 ~= 0) or (yr%400 == 0)) end -- Conversion d'un nombre en chiffres romains function fun.toRoman(number) local n = math.floor(number) local letters = {"I","V","X","L","C","D","M","",""} local pattern = {"","0","00","000","01","1","10","100","1000","02"} local result = "" if(n<=0 or n>=4000) then result = "---" else for i=1,7,2 do local p = pattern[n%10 + 1] for j=0,2 do p = string.gsub(p,tostring(j),letters[i+j]) end result = p .. result n = math.floor(n/10) end end return result end -- Conversion et affichage d'une date dans le calendrier républicain function fun.dateRepublicain(frame) local pframe = frame:getParent() local arguments = pframe.args return fun.formatRepCal(fun.do_toRepCal(arguments)) end --- -- Calcul d'une date dans le calendrier républicain -- On suppose que les années 4n+3 sont sextiles (3, 7, 11...) function fun.do_toRepCal(arguments) local yr = tonumber(arguments.year or arguments[1]) or 2000 -- rang absolu du jour demandé, le jour 0 étant le 22 septembre 1792 (1er jour de l'an I) local repDays = fun.do_dayRank(arguments) + fun.do_daysBetween{1792,yr} - fun.do_dayRank{1792,9,22} local repYear = math.floor((repDays+731)/365.25) - 1 local repDayRank = repDays - 365*(repYear-1) - math.floor(repYear/4) local repMonth, repDay = math.floor(repDayRank/30)+1, (repDayRank%30)+1 return {repYear, repMonth, repDay} end --- -- Formatage d'une date selon le calendrier républicain -- Usage : fun.formatRepCal{année,mois,jour} function fun.formatRepCal(arguments) local months = {"Vendémiaire","Brumaire","Frimaire","Nivôse","Pluviôse","Ventôse","Germinal","Floréal","Prairial","Messidor","Thermidor","Fructidor"} local extras = {"de la vertu","du génie","du travail","des récompenses","de l'opinion","de la Révolution"} local result = "" if(arguments[2] < 13) then result = result .. tostring(arguments[3]) .. "\194\160" .. months[arguments[2]] else result = result .. "jou " .. extras[arguments[3]] end result = result .. " ane a " .. fun.toRoman(arguments[1]) return result end --- -- Voir Modèle:Âge -- retourne l'âge en fonction de la ou les dates fournies. La valeur retournée est de type 'number' -- Paramètres : -- 1, 2, 3 : année, mois jour de naissance (supposé dans le calendrier grégorien) -- 4, 5, 6 : année, mois, jour du calcul (facultatif, par défaut la date UTC courante). function fun.age( an, mn, jn, ac, mc, jc ) if ac == nil then local today = os.date( '!*t' ) ac = today.year mc = today.month jc = today.day else ac = tonumber( ac ) mc = tonumber( mc ) jc = tonumber( jc ) end an = tonumber( an ) mn = tonumber( mn ) jn = tonumber( jn ) if an == nil or ac == nil or mn == nil or mc == nil then -- pas de message d'erreur qui risque de faire planter la fonction appelante -- à elle de gérer ce retour. return end local age = ac - an -- si l'intervalle traverse l'année zéro, il faut soustraire une année -- parce que cette année n'existe pas dans les calendriers chrétiens if an < 0 and ac > 0 then age = age - 1 end if mc == mn then if jc == nil or jn == nil then return end return age - ( jc < jn and 1 or 0 ) else return age - ( mc < mn and 1 or 0 ) end end function fun.modeleAge( frame ) local args = Outils.extractArgs( frame ) local age = fun.age( args[1] or args['ane'], args[2] or args['mwa'], args[3] or args['jou'], args[4], args[5], args[6] ) if age then return age else return '<span class="error">Paramètres incorrects ou insuffisants pour calculer l\'âge précis</span>' end end --- -- calcul du jour julien à partir d'une date du calendrier grégorien function fun.julianDay( year, month, day, hour, min, sec ) local julian julian = math.floor( math.floor( ( year * 12 + month + 57609 ) / 12 - 1 ) * 1461 / 4 ) - math.floor( math.floor( ( year * 12 + month + 57609 ) / 12 - 1 ) / 100 ) + math.floor( math.floor( ( year * 12 + month + 57609 ) / 12 - 1 ) / 400 ) + math.floor( ( math.fmod( month + 57609, 12 ) + 4 ) * 153 / 5 ) + day + ( hour or 12 ) / 24 + ( min or 0 ) / 1440 + ( sec or 0 ) / 86400 - 32167.5 return julian end --- -- calcul du jour julien à partir d'une date du calendrier julien function fun.julianDayJulian( year, month, day, hour, min, sec ) local julian julian = math.floor( math.floor( ( year * 12 + month + 57609 ) / 12 - 1 ) * 1461 / 4 ) + math.floor( ( math.fmod( month + 57609, 12 ) + 4 ) * 153 / 5 ) + day + ( hour or 12 ) / 24 + ( min or 0 ) / 1440 + ( sec or 0 ) / 86400 - 32205.5 return julian end --- -- calcul d'une date dans le calendrier grégorien à partir du jour julien function fun.julianDayToGregorian( julianDay ) local base = math.floor( julianDay + 32044.5 ) -- 1 March -4800 (proleptic Gregorian date) local nCentury = math.floor( ( base * 4 + 3 ) / 146097 ) local sinceCentury = base - math.floor( nCentury * 146097 / 4 ) local nYear = math.floor( ( sinceCentury * 4 + 3 ) / 1461 ) local sinceYear = sinceCentury - math.floor( nYear * 1461 / 4 ) local nMonth = math.floor( ( sinceYear * 5 + 2 ) / 153 ) local day = sinceYear - math.floor( ( nMonth * 153 + 2 ) / 5 ) + 1 local month = nMonth - math.floor( nMonth / 10 ) * 12 + 3 local year = math.floor( sinceYear / 306 ) + nYear + 100 * nCentury - 4800 return year, month, day end --- -- calcul d'une date dans le calendrier julien à partir du jour julien -- calcul basé sur l'algorithme de la page https://en.wikipedia.org/wiki/Julian_day#Julian_or_Gregorian_calendar_from_Julian_day_number function fun.julianDayToJulian( julianDay ) local y = 4716 local v = 3 local j = 1401 local u = 5 local m = 2 local s = 153 local n = 12 local w = 2 local r = 4 local B = 274277 local p = 1461 local C = -38 local f = julianDay + j local e = r * f + v local g = math.modf( math.fmod( e, p ) / r ) local h = u * g + w local D = math.modf( math.fmod( h, s ) / u ) + 1 local M = math.fmod( math.modf( h / s ) + m, n ) + 1 local Y = math.modf( e / p ) - y + math.modf( ( n + m - M ) / n ) return Y, M, D end --- -- calcul d'une date dans le calendrier grégorien à partir d'une date dans le calendrier julien function fun.julianToGregorian( year, month, day ) return fun.julianDayToGregorian( fun.julianDayJulian( year, month, day ) ) end --- -- calcul d'une date dans le calendrier julien à partir d'une date dans le calendrier grégorien function fun.gregorianToJulian( year, month, day ) year = tonumber(year) if month then month = tonumber(month) else month = 6 end --prend une valeur centrale pour donner un best "guess" if day then day = tonumber(day) else day = 15 end return fun.julianDayToJulian( fun.julianDay( year, month, day ) ) end --[[ Cette fonction retourne "CET" ou "CEST" selon que dans la pseudo-timezone en cours c'est l'heure d'été ou l'heure d'hiver. Cette fonction n'a de sens a priori que pour des modèles utilisés en Europe Paramètre optionnel non nommé : "sans lien" : retourne le texte CET/CEST. sinon retourne ce même texte avec un wikilien vers les articles correspondants --]] function fun.CEST(frame) -- option : ne pas créer de wikilien local opt = trim(frame.args[1] or frame:getParent().args[1]) -- on récupère l'information dans la zone courante local t = mw.getContentLanguage():formatDate("I", nil, true) if (t == "1") then -- heure d'été if (opt == "sans lien") then return "CEST" elseif (opt == "décalage") then return "2" else return "[[Heure d'été d'Europe centrale|CEST]]" end else -- heure d'hiver (ou autre zone où ça ne s'applique pas) if (opt == "sans lien") then return "CET" elseif (opt == "décalage") then return "1" else return "[[Heure normale d'Europe centrale|CET]]" end end end return fun 2hemyoiif9coefba46ipzebh6nxztpz Module:Linguistique 828 64467 855577 825208 2024-11-12T13:58:43Z BwaKajou 31668 855577 Scribunto text/plain -- Ne fonctionne qu'en français. Si besoin est, on peut s'inspirer de [[wikidata:Module:Linguistic]] pour ajouter d'autres langues. local p = {} local lang = 'fr' local langobj = mw.language.new(lang) local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ' -- i18n local wordor = ' ou ' local wordand = ' et ' local comma = ', ' local fullstop = '. ' local wordsep = ' ' local function isin(str, pattern) if str and pattern and mw.ustring.find(str, pattern, 1, true ) then return true end end local function processgender(str) if (str == 'f') or (str == 'fem') or (str == 'feminine') then return 'feminine' elseif (str == 'n') or (str == 'neutral') then return 'neutral' else return 'masculine' end end local function processnumber(str) if (str == 'p') or (str == 'plural') then return 'plural' else return 'singular' end end function p.vowelfirst (str) if str and #str > 0 then return isin(vowels, mw.ustring.lower(mw.ustring.sub(str, 1, 1))) end end function p.inparentheses(str, lang, space) if (not str) or str == '' then return str end str = '(' .. str .. ')' if not space then space = '&#32;' end return space .. str end function p.of(word, gender, number, determiner, raw) if not word then word = '' end word = mw.text.trim( word ) if not raw then --texte non mis en forme pour gérer les élisions raw = p.texteLien(word) or word end gender = processgender(gender) number = processnumber(number) local vowel = p.vowelfirst(raw) local feminine = (gender== 'feminine') -- raw is the string without the Wikiformatting so that it correctly analyses the string that is [[:fr:Italie|Italie]] -> 'italie' -- any way to automate this ? if number == 'plural' then return 'des ' .. word elseif determiner and (determiner ~= '-') then-- de la, du // determiner ~= '-' veut dire renseigné comme vide if vowel then return 'de l’' .. word elseif feminine then return 'de la ' .. word else return 'du ' .. word end else if vowel then return 'd’' .. word else return 'de ' .. word end end end function p.noungroup(noun, adj) if not noun or noun == '' then return nil -- not '' so that it is not counted as a string by mw.listToText end return noun .. wordsep(lang) .. adj -- lorsque c'est en français end function p.quickconj(args, conjtype) local separator, conjunction -- cas où separator ~= conj if type(conjtype) == 'function' then conjtype = conjtype() end if (not conjtype) or conjtype == 'and' then separator, conjunction = comma, wordand elseif conjtype == 'or' then separator, conjunction = comma, wordor end if (separator and conjunction) then return mw.text.listToText(args, separator, conjunction) end -- autres cas if conjtype == 'comma' then separator = comma elseif conjtype == 'new line' or conjtype == 'lowercase new line' then separator = '<br />' if conjtype == 'new line' then for i, j in pairs(args) do -- ajoute une majuscule args[i] = p.ucfirst(j) end end else separator = conjtype end return table.concat(args, separator) end function p.conj(args, conjtype) if (not args) then return nil end local newargs = {} for i, j in pairs(args) do table.insert(newargs, j) end if #newargs == 0 then return nil end return p.quickconj(newargs, conjtype) end function p.conjfromWiki(frame) args = frame.args if not args or not args[1] then args = mw.getCurrentFrame():getParent().args end local conjtype = args.type newargs = {} -- transform args metatable into a table so it can be concetenated for i, j in pairs(args) do if type(i) == 'number' then j = mw.text.trim(j) if j ~= '' then table.insert(newargs, j) end else if i ~= 'type' and i ~= 'lang' then return error('bad parameter in template:Conj:' .. i), '[[Category:Pages with incorrect template usage/Conj|A]]' end end end return p.conj(newargs, conjtype) end local function findcomplement(str, beginswith) -- retourne le nom principal et le complément du nom ou nil et nil si échec local particles = {" de la ", " de l'", " des ", " de l’", " de ", " d’", " d'", " du "," en "," à "," au "," aux "} if beginswith and (not mw.ustring.find(str, "^" .. beginswith)) then return nil end for i, pattern in pairs(particles) do local pos = mw.ustring.find(str, pattern) if pos then local main = mw.ustring.sub(str, 1, pos -1) local comp = mw.ustring.sub(str, pos + string.len(pattern)) return main, comp end end return nil end function p.keepcomplement(str, beginswith) -- par exemple "gare de Lyon" -> "Lyon" local main, compl = findcomplement(str, beginswith) if compl then return compl end return str end function p.removecomplement(str, beginswith) -- par exemple "gare de Lyon" -> "gare" local main, compl = findcomplement(str, beginswith) if main then return main end return str end --[=[ texteLien le lien intere initial '^[[lien|texte]]' de str et retourne : texte, lien Si le lien est '[[texte]]', retourne : texte, texte. Si str ne commence pas par un lien interwiki, retourne : nil ]=] function p.texteLien( str ) if type( str ) == 'string' then local lien, texte = str:match( '^%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) if not lien then lien, texte = str:match( '^%b<>%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) end if lien then local testlien = string.lower( lien ) local fichier = string.match( testlien, '^fichier:' ) or string.match( testlien, '^image:' ) or string.match( testlien, '^file:' ) if not fichier then texte = ( texte ~= '' and texte ) or lien return texte, lien end end end return nil end function p.ucfirst(str) if (type (str ) ~= 'string') or (string == "") then return str end local strTemp, tag, tagTemp = str, '' -- sépare les balises html initiales (span ou autres) while strTemp:match( '^%b<>' ) do tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' ) tag = tag .. tagTemp end local texte = p.texteLien( strTemp ) if texte then -- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien texte = texte .. ']]' -- échappe les caractère magique local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' ) -- ajoute la majuscule au texte du lien str = str:gsub( pattern, p.ucfirst( texte ), 1 ) else str = tag .. langobj:ucfirst( strTemp ) end return str end function p.ucfirstE(frame) return p.ucfirst(frame.args[1]) end function p.lcfirst(str) if (type (str ) ~= 'string') or (string == "") then return str end local strTemp, tag, tagTemp = str, '' -- sépare les balises html initiales (span ou autres) while strTemp:match( '^%b<>' ) do tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' ) tag = tag .. tagTemp end local texte = p.texteLien( strTemp ) if texte then -- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien texte = texte .. ']]' -- échappe les caractère magique local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' ) -- ajoute la majuscule au texte du lien str = str:gsub( pattern, p.lcfirst( texte ), 1 ) else str = tag .. langobj:lcfirst( strTemp ) end return str end function p.lcfirstE(frame) return p.lcfirst(frame.args[1]) end --[[ function p.toascii(str) local convtable = mw.loadData("Module:Linguistique/ASCII") for i, j in pairs(convtable) do -- manquent les majuscules str = mw.ustring.gsub(str, '[' .. i .. ']', j) end return str end ]]-- return p pt7x9r3231pcj5jbeh3vf4y90ozx7gt 855578 855577 2024-11-12T13:59:24Z BwaKajou 31668 855578 Scribunto text/plain -- Ne fonctionne qu'en français. Si besoin est, on peut s'inspirer de [[wikidata:Module:Linguistic]] pour ajouter d'autres langues. local p = {} local lang = 'ht' local langobj = mw.language.new(lang) local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ' -- i18n local wordor = ' ou ' local wordand = ' et ' local comma = ', ' local fullstop = '. ' local wordsep = ' ' local function isin(str, pattern) if str and pattern and mw.ustring.find(str, pattern, 1, true ) then return true end end local function processgender(str) if (str == 'f') or (str == 'fem') or (str == 'feminine') then return 'feminine' elseif (str == 'n') or (str == 'neutral') then return 'neutral' else return 'masculine' end end local function processnumber(str) if (str == 'p') or (str == 'plural') then return 'plural' else return 'singular' end end function p.vowelfirst (str) if str and #str > 0 then return isin(vowels, mw.ustring.lower(mw.ustring.sub(str, 1, 1))) end end function p.inparentheses(str, lang, space) if (not str) or str == '' then return str end str = '(' .. str .. ')' if not space then space = '&#32;' end return space .. str end function p.of(word, gender, number, determiner, raw) if not word then word = '' end word = mw.text.trim( word ) if not raw then --texte non mis en forme pour gérer les élisions raw = p.texteLien(word) or word end gender = processgender(gender) number = processnumber(number) local vowel = p.vowelfirst(raw) local feminine = (gender== 'feminine') -- raw is the string without the Wikiformatting so that it correctly analyses the string that is [[:fr:Italie|Italie]] -> 'italie' -- any way to automate this ? if number == 'plural' then return 'des ' .. word elseif determiner and (determiner ~= '-') then-- de la, du // determiner ~= '-' veut dire renseigné comme vide if vowel then return 'de l’' .. word elseif feminine then return 'de la ' .. word else return 'du ' .. word end else if vowel then return 'd’' .. word else return 'de ' .. word end end end function p.noungroup(noun, adj) if not noun or noun == '' then return nil -- not '' so that it is not counted as a string by mw.listToText end return noun .. wordsep(lang) .. adj -- lorsque c'est en français end function p.quickconj(args, conjtype) local separator, conjunction -- cas où separator ~= conj if type(conjtype) == 'function' then conjtype = conjtype() end if (not conjtype) or conjtype == 'and' then separator, conjunction = comma, wordand elseif conjtype == 'or' then separator, conjunction = comma, wordor end if (separator and conjunction) then return mw.text.listToText(args, separator, conjunction) end -- autres cas if conjtype == 'comma' then separator = comma elseif conjtype == 'new line' or conjtype == 'lowercase new line' then separator = '<br />' if conjtype == 'new line' then for i, j in pairs(args) do -- ajoute une majuscule args[i] = p.ucfirst(j) end end else separator = conjtype end return table.concat(args, separator) end function p.conj(args, conjtype) if (not args) then return nil end local newargs = {} for i, j in pairs(args) do table.insert(newargs, j) end if #newargs == 0 then return nil end return p.quickconj(newargs, conjtype) end function p.conjfromWiki(frame) args = frame.args if not args or not args[1] then args = mw.getCurrentFrame():getParent().args end local conjtype = args.type newargs = {} -- transform args metatable into a table so it can be concetenated for i, j in pairs(args) do if type(i) == 'number' then j = mw.text.trim(j) if j ~= '' then table.insert(newargs, j) end else if i ~= 'type' and i ~= 'lang' then return error('bad parameter in template:Conj:' .. i), '[[Category:Pages with incorrect template usage/Conj|A]]' end end end return p.conj(newargs, conjtype) end local function findcomplement(str, beginswith) -- retourne le nom principal et le complément du nom ou nil et nil si échec local particles = {" de la ", " de l'", " des ", " de l’", " de ", " d’", " d'", " du "," en "," à "," au "," aux "} if beginswith and (not mw.ustring.find(str, "^" .. beginswith)) then return nil end for i, pattern in pairs(particles) do local pos = mw.ustring.find(str, pattern) if pos then local main = mw.ustring.sub(str, 1, pos -1) local comp = mw.ustring.sub(str, pos + string.len(pattern)) return main, comp end end return nil end function p.keepcomplement(str, beginswith) -- par exemple "gare de Lyon" -> "Lyon" local main, compl = findcomplement(str, beginswith) if compl then return compl end return str end function p.removecomplement(str, beginswith) -- par exemple "gare de Lyon" -> "gare" local main, compl = findcomplement(str, beginswith) if main then return main end return str end --[=[ texteLien le lien intere initial '^[[lien|texte]]' de str et retourne : texte, lien Si le lien est '[[texte]]', retourne : texte, texte. Si str ne commence pas par un lien interwiki, retourne : nil ]=] function p.texteLien( str ) if type( str ) == 'string' then local lien, texte = str:match( '^%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) if not lien then lien, texte = str:match( '^%b<>%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) end if lien then local testlien = string.lower( lien ) local fichier = string.match( testlien, '^fichier:' ) or string.match( testlien, '^image:' ) or string.match( testlien, '^file:' ) if not fichier then texte = ( texte ~= '' and texte ) or lien return texte, lien end end end return nil end function p.ucfirst(str) if (type (str ) ~= 'string') or (string == "") then return str end local strTemp, tag, tagTemp = str, '' -- sépare les balises html initiales (span ou autres) while strTemp:match( '^%b<>' ) do tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' ) tag = tag .. tagTemp end local texte = p.texteLien( strTemp ) if texte then -- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien texte = texte .. ']]' -- échappe les caractère magique local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' ) -- ajoute la majuscule au texte du lien str = str:gsub( pattern, p.ucfirst( texte ), 1 ) else str = tag .. langobj:ucfirst( strTemp ) end return str end function p.ucfirstE(frame) return p.ucfirst(frame.args[1]) end function p.lcfirst(str) if (type (str ) ~= 'string') or (string == "") then return str end local strTemp, tag, tagTemp = str, '' -- sépare les balises html initiales (span ou autres) while strTemp:match( '^%b<>' ) do tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' ) tag = tag .. tagTemp end local texte = p.texteLien( strTemp ) if texte then -- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien texte = texte .. ']]' -- échappe les caractère magique local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' ) -- ajoute la majuscule au texte du lien str = str:gsub( pattern, p.lcfirst( texte ), 1 ) else str = tag .. langobj:lcfirst( strTemp ) end return str end function p.lcfirstE(frame) return p.lcfirst(frame.args[1]) end --[[ function p.toascii(str) local convtable = mw.loadData("Module:Linguistique/ASCII") for i, j in pairs(convtable) do -- manquent les majuscules str = mw.ustring.gsub(str, '[' .. i .. ']', j) end return str end ]]-- return p 2r8mb2pxh72m6zb258461kklp966z0f 855579 855578 2024-11-12T14:01:05Z BwaKajou 31668 855579 Scribunto text/plain -- Ne fonctionne qu'en français. Si besoin est, on peut s'inspirer de [[wikidata:Module:Linguistic]] pour ajouter d'autres langues. local p = {} local lang = 'ht' local langobj = mw.language.new(lang) local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ' -- i18n local wordor = ' oswa ' local wordand = ' ak ' local comma = ', ' local fullstop = '. ' local wordsep = ' ' local function isin(str, pattern) if str and pattern and mw.ustring.find(str, pattern, 1, true ) then return true end end local function processgender(str) if (str == 'f') or (str == 'fem') or (str == 'feminine') then return 'feminine' elseif (str == 'n') or (str == 'neutral') then return 'neutral' else return 'masculine' end end local function processnumber(str) if (str == 'p') or (str == 'plural') then return 'plural' else return 'singular' end end function p.vowelfirst (str) if str and #str > 0 then return isin(vowels, mw.ustring.lower(mw.ustring.sub(str, 1, 1))) end end function p.inparentheses(str, lang, space) if (not str) or str == '' then return str end str = '(' .. str .. ')' if not space then space = '&#32;' end return space .. str end function p.of(word, gender, number, determiner, raw) if not word then word = '' end word = mw.text.trim( word ) if not raw then --texte non mis en forme pour gérer les élisions raw = p.texteLien(word) or word end gender = processgender(gender) number = processnumber(number) local vowel = p.vowelfirst(raw) local feminine = (gender== 'feminine') -- raw is the string without the Wikiformatting so that it correctly analyses the string that is [[:fr:Italie|Italie]] -> 'italie' -- any way to automate this ? if number == 'plural' then return 'des ' .. word elseif determiner and (determiner ~= '-') then-- de la, du // determiner ~= '-' veut dire renseigné comme vide if vowel then return 'de l’' .. word elseif feminine then return 'de la ' .. word else return 'du ' .. word end else if vowel then return 'd’' .. word else return 'de ' .. word end end end function p.noungroup(noun, adj) if not noun or noun == '' then return nil -- not '' so that it is not counted as a string by mw.listToText end return noun .. wordsep(lang) .. adj -- lorsque c'est en français end function p.quickconj(args, conjtype) local separator, conjunction -- cas où separator ~= conj if type(conjtype) == 'function' then conjtype = conjtype() end if (not conjtype) or conjtype == 'and' then separator, conjunction = comma, wordand elseif conjtype == 'or' then separator, conjunction = comma, wordor end if (separator and conjunction) then return mw.text.listToText(args, separator, conjunction) end -- autres cas if conjtype == 'comma' then separator = comma elseif conjtype == 'new line' or conjtype == 'lowercase new line' then separator = '<br />' if conjtype == 'new line' then for i, j in pairs(args) do -- ajoute une majuscule args[i] = p.ucfirst(j) end end else separator = conjtype end return table.concat(args, separator) end function p.conj(args, conjtype) if (not args) then return nil end local newargs = {} for i, j in pairs(args) do table.insert(newargs, j) end if #newargs == 0 then return nil end return p.quickconj(newargs, conjtype) end function p.conjfromWiki(frame) args = frame.args if not args or not args[1] then args = mw.getCurrentFrame():getParent().args end local conjtype = args.type newargs = {} -- transform args metatable into a table so it can be concetenated for i, j in pairs(args) do if type(i) == 'number' then j = mw.text.trim(j) if j ~= '' then table.insert(newargs, j) end else if i ~= 'type' and i ~= 'lang' then return error('bad parameter in template:Conj:' .. i), '[[Category:Pages with incorrect template usage/Conj|A]]' end end end return p.conj(newargs, conjtype) end local function findcomplement(str, beginswith) -- retourne le nom principal et le complément du nom ou nil et nil si échec local particles = {" de la ", " de l'", " des ", " de l’", " de ", " d’", " d'", " du "," en "," à "," au "," aux "} if beginswith and (not mw.ustring.find(str, "^" .. beginswith)) then return nil end for i, pattern in pairs(particles) do local pos = mw.ustring.find(str, pattern) if pos then local main = mw.ustring.sub(str, 1, pos -1) local comp = mw.ustring.sub(str, pos + string.len(pattern)) return main, comp end end return nil end function p.keepcomplement(str, beginswith) -- par exemple "gare de Lyon" -> "Lyon" local main, compl = findcomplement(str, beginswith) if compl then return compl end return str end function p.removecomplement(str, beginswith) -- par exemple "gare de Lyon" -> "gare" local main, compl = findcomplement(str, beginswith) if main then return main end return str end --[=[ texteLien le lien intere initial '^[[lien|texte]]' de str et retourne : texte, lien Si le lien est '[[texte]]', retourne : texte, texte. Si str ne commence pas par un lien interwiki, retourne : nil ]=] function p.texteLien( str ) if type( str ) == 'string' then local lien, texte = str:match( '^%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) if not lien then lien, texte = str:match( '^%b<>%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) end if lien then local testlien = string.lower( lien ) local fichier = string.match( testlien, '^fichier:' ) or string.match( testlien, '^image:' ) or string.match( testlien, '^file:' ) if not fichier then texte = ( texte ~= '' and texte ) or lien return texte, lien end end end return nil end function p.ucfirst(str) if (type (str ) ~= 'string') or (string == "") then return str end local strTemp, tag, tagTemp = str, '' -- sépare les balises html initiales (span ou autres) while strTemp:match( '^%b<>' ) do tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' ) tag = tag .. tagTemp end local texte = p.texteLien( strTemp ) if texte then -- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien texte = texte .. ']]' -- échappe les caractère magique local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' ) -- ajoute la majuscule au texte du lien str = str:gsub( pattern, p.ucfirst( texte ), 1 ) else str = tag .. langobj:ucfirst( strTemp ) end return str end function p.ucfirstE(frame) return p.ucfirst(frame.args[1]) end function p.lcfirst(str) if (type (str ) ~= 'string') or (string == "") then return str end local strTemp, tag, tagTemp = str, '' -- sépare les balises html initiales (span ou autres) while strTemp:match( '^%b<>' ) do tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' ) tag = tag .. tagTemp end local texte = p.texteLien( strTemp ) if texte then -- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien texte = texte .. ']]' -- échappe les caractère magique local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' ) -- ajoute la majuscule au texte du lien str = str:gsub( pattern, p.lcfirst( texte ), 1 ) else str = tag .. langobj:lcfirst( strTemp ) end return str end function p.lcfirstE(frame) return p.lcfirst(frame.args[1]) end --[[ function p.toascii(str) local convtable = mw.loadData("Module:Linguistique/ASCII") for i, j in pairs(convtable) do -- manquent les majuscules str = mw.ustring.gsub(str, '[' .. i .. ']', j) end return str end ]]-- return p n6sfs86fj954omgtwkkoomco1ppydql 855598 855579 2024-11-12T17:00:04Z BwaKajou 31668 855598 Scribunto text/plain -- Ne fonctionne qu'en français. Si besoin est, on peut s'inspirer de [[wikidata:Module:Linguistic]] pour ajouter d'autres langues. local p = {} local lang = 'ht' local langobj = mw.language.new(lang) local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ' -- i18n local wordor = ' oswa ' local wordand = ' ak ' local comma = ', ' local fullstop = '. ' local wordsep = ' ' local function isin(str, pattern) if str and pattern and mw.ustring.find(str, pattern, 1, true ) then return true end end local function processgender(str) if (str == 'f') or (str == 'fem') or (str == 'feminine') then return 'feminine' elseif (str == 'n') or (str == 'neutral') then return 'neutral' else return 'masculine' end end local function processnumber(str) if (str == 'p') or (str == 'plural') then return 'plural' else return 'singular' end end function p.vowelfirst (str) if str and #str > 0 then return isin(vowels, mw.ustring.lower(mw.ustring.sub(str, 1, 1))) end end function p.inparentheses(str, lang, space) if (not str) or str == '' then return str end str = '(' .. str .. ')' if not space then space = '&#32;' end return space .. str end function p.of(word, gender, number, determiner, raw) if not word then word = '' end word = mw.text.trim( word ) if not raw then --texte non mis en forme pour gérer les élisions raw = p.texteLien(word) or word end gender = processgender(gender) number = processnumber(number) local vowel = p.vowelfirst(raw) local feminine = (gender== 'feminine') -- raw is the string without the Wikiformatting so that it correctly analyses the string that is [[:fr:Italie|Italie]] -> 'italie' -- any way to automate this ? if number == 'plural' then return 'des ' .. word elseif determiner and (determiner ~= '-') then-- de la, du // determiner ~= '-' veut dire renseigné comme vide if vowel then return 'de l’' .. word elseif feminine then return 'de la ' .. word else return 'du ' .. word end else if vowel then return 'd’' .. word else return 'de ' .. word end end end function p.noungroup(noun, adj) if not noun or noun == '' then return nil -- not '' so that it is not counted as a string by mw.listToText end return noun .. wordsep(lang) .. adj -- lorsque c'est en français end function p.quickconj(args, conjtype) local separator, conjunction -- cas où separator ~= conj if type(conjtype) == 'function' then conjtype = conjtype() end if (not conjtype) or conjtype == 'and' then separator, conjunction = comma, wordand elseif conjtype == 'or' then separator, conjunction = comma, wordor end if (separator and conjunction) then return mw.text.listToText(args, separator, conjunction) end -- autres cas if conjtype == 'comma' then separator = comma elseif conjtype == 'new line' or conjtype == 'lowercase new line' then separator = '<br />' if conjtype == 'new line' then for i, j in pairs(args) do -- ajoute une majuscule args[i] = p.ucfirst(j) end end else separator = conjtype end return table.concat(args, separator) end function p.conj(args, conjtype) if (not args) then return nil end local newargs = {} for i, j in pairs(args) do table.insert(newargs, j) end if #newargs == 0 then return nil end return p.quickconj(newargs, conjtype) end function p.conjfromWiki(frame) args = frame.args if not args or not args[1] then args = mw.getCurrentFrame():getParent().args end local conjtype = args.type newargs = {} -- transform args metatable into a table so it can be concetenated for i, j in pairs(args) do if type(i) == 'number' then j = mw.text.trim(j) if j ~= '' then table.insert(newargs, j) end else if i ~= 'type' and i ~= 'lang' then return error('bad parameter in template:Conj:' .. i), '[[Category:Pages with incorrect template usage/Conj|A]]' end end end return p.conj(newargs, conjtype) end local function findcomplement(str, beginswith) -- retourne le nom principal et le complément du nom ou nil et nil si échec local particles = {" de la ", " de l'", " des ", " de l’", " de ", " d’", " d'", " du "," en "," à "," au "," aux "} if beginswith and (not mw.ustring.find(str, "^" .. beginswith)) then return nil end for i, pattern in pairs(particles) do local pos = mw.ustring.find(str, pattern) if pos then local main = mw.ustring.sub(str, 1, pos -1) local comp = mw.ustring.sub(str, pos + string.len(pattern)) return main, comp end end return nil end function p.keepcomplement(str, beginswith) -- par exemple "gare de Lyon" -> "Lyon" local main, compl = findcomplement(str, beginswith) if compl then return compl end return str end function p.removecomplement(str, beginswith) -- par exemple "gare de Lyon" -> "gare" local main, compl = findcomplement(str, beginswith) if main then return main end return str end --[=[ texteLien le lien intere initial '^[[lien|texte]]' de str et retourne : texte, lien Si le lien est '[[texte]]', retourne : texte, texte. Si str ne commence pas par un lien interwiki, retourne : nil ]=] function p.texteLien( str ) if type( str ) == 'string' then local lien, texte = str:match( '^%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) if not lien then lien, texte = str:match( '^%b<>%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) end if lien then local testlien = string.lower( lien ) local fichye = string.match( testlien, '^fichye:' ) or string.match( testlien, '^imaj:' ) or string.match( testlien, '^file:' ) if not fichye then texte = ( texte ~= '' and texte ) or lien return texte, lien end end end return nil end function p.ucfirst(str) if (type (str ) ~= 'string') or (string == "") then return str end local strTemp, tag, tagTemp = str, '' -- sépare les balises html initiales (span ou autres) while strTemp:match( '^%b<>' ) do tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' ) tag = tag .. tagTemp end local texte = p.texteLien( strTemp ) if texte then -- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien texte = texte .. ']]' -- échappe les caractère magique local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' ) -- ajoute la majuscule au texte du lien str = str:gsub( pattern, p.ucfirst( texte ), 1 ) else str = tag .. langobj:ucfirst( strTemp ) end return str end function p.ucfirstE(frame) return p.ucfirst(frame.args[1]) end function p.lcfirst(str) if (type (str ) ~= 'string') or (string == "") then return str end local strTemp, tag, tagTemp = str, '' -- sépare les balises html initiales (span ou autres) while strTemp:match( '^%b<>' ) do tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' ) tag = tag .. tagTemp end local texte = p.texteLien( strTemp ) if texte then -- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien texte = texte .. ']]' -- échappe les caractère magique local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' ) -- ajoute la majuscule au texte du lien str = str:gsub( pattern, p.lcfirst( texte ), 1 ) else str = tag .. langobj:lcfirst( strTemp ) end return str end function p.lcfirstE(frame) return p.lcfirst(frame.args[1]) end --[[ function p.toascii(str) local convtable = mw.loadData("Module:Linguistique/ASCII") for i, j in pairs(convtable) do -- manquent les majuscules str = mw.ustring.gsub(str, '[' .. i .. ']', j) end return str end ]]-- return p gsyaxzeh2kwdlyxpi4ox2k5kthed2wy Diskite:Lang kreyòl 1 64710 855649 805301 2024-11-13T01:10:49Z Naraht 10345 855649 wikitext text/x-wiki mon che == Mispelling == The reference that says "John Hopkins" should say "Johns Hopkins". Please change. [[Itilizatè:Naraht|Naraht]] ([[Diskisyon Itilizatè:Naraht|discussion]]) 16 out 2022 à 13:31 (UTC) :Hello, I made the correction. [[Itilizatè:Gilles2014|Gilles2014]] ([[Diskisyon Itilizatè:Gilles2014|diskisyon]]) 21 out 2022 à 17:28 (UTC) ::John Hopkins has been restored, please correct again.[[Itilizatè:Naraht|Naraht]] ([[Diskisyon Itilizatè:Naraht|diskisyon]]) 13 novanm 2024 à 01:10 (UTC) 76pt33qsx7krf6lbgk9lzh5t9t5rezg Jean Ray (ekriven) 0 66191 855560 811217 2024-11-12T13:21:17Z InternetArchiveBot 25431 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 855560 wikitext text/x-wiki {{moun |non= Jean Ray |foto= |tèks= |fonksyon=ekriven |domèn=Literati |diplòm= |etid= |dat nesans= [[8 jiyè]] [[1887]] |lye nesans= Gand |peyi nesans=[[Bèljik]] |dat lanmò= [[17 septanm]] [[1964]] |lye lanmò= Gand |peyi lanmò= [[Bèljik]] |nasyonalite= bèlj |relijyon= |rezidans= |kontak= |Biyografi= |zèv= |omaj= |rekonpans= |remak= |fim= }} '''Raymond Jean Marie De Kremer''' (ki fèt 8 jiyè 1887 epi ki mouri 17 septanm 1964 nan Gand) se yon ekriven bèlj. Li ekri nan lang franse tankou '''Jean Ray''' ak nan lang neèlande souvan tankou '''John Flanders'''. == Biyografi == == Zèv li yo == === Tankou Jean Ray === * [[1925]] : ''[[Les Contes du whisky]]'' * [[1929]]-[[1938]] : ''[[Histoires de Harry Dickson|Les Aventures de Harry Dickson]]'', nouvèl, Edisyon Marabout 16 tom - Librairie des champs Elysées 9 tom - Entegral nan 21 tom Edisyon Néo 1984-1986, La ''Guillotine ensorcelée'' chez Lefrancq (attitudes-mystère), 1993. * [[1932]] : ''Jack de minuit'', Edisyon Lefrancq 1991, ilistre pa [[René Follet]] * [[1932]] : ''La Croisière des ombres'', Edisyon Néo, n 106 * [[1942]] : ''[[Le Grand Nocturne]]'' * [[1943]] : ''[[Les Cercles de l'épouvante]]'' * [[1943]] : ''[[Malpertuis]]'', Présence du futur, n 7 1954 - Edisyon Marabout 1962 * [[1943]] : ''[[La Cité de l'indicible peur (woman)|La Cité de l'indicible peur]]'', Edisyon Marabout 1965, Edisyon Néo n 130 * [[1944]] : ''[[Les Derniers Contes de Canterbury]]'', Edisyon Marabout 1963, Edisyon Néo n 156 * [[1947]] : ''[[Le Livre des fantômes]]'', Edisyon Néo {{numéro|135}}]]) * [[1947]] : ''La Gerbe noire'', Edisyon Néo {{numéro|96}}]]) anthologie * [[1947]] : ''La Choucroute'', (Aventure Fantastique) * [[1961]] : ''Les 25 Meilleures Histoires noires et fantastiques'', Edisyon Marabout * [[1964]] : ''[[Saint-Judas-de-la-nuit]]'' * [[1964]] : ''Les Contes noirs du golf'', Edisyon Marabout 1964, Edisyon Néo {{numéro|159}}]]) * [[1964]] : ''[[Le Carrousel des maléfices]]'', Edisyon Marabout 1964) ([[Néo (éditions)|Éditions Néo {{numéro|150}}]]) * [[1982]] : ''Visages et choses crépusculaires'', Edisyon Néo {{numéro|63}}]]) * [[1992]] : ''Les Joyeux Contes d'Ingoldsby'', Edisyon Lefrancq ilistre pa [[René Follet]] * [[1996]] : ''Les Histoires étranges de la Biloque'', Edisyon Lefrancq === Tankou John Flanders === * ''Bestiaire fantastique'' ([[Marabout (éditions)| Ed. Marabout {{numéro |500}}]]) * ''Visions nocturnes'' ([[Néo (éditions)|Ed. Néo {{numéro|100}}]]) * ''Visions infernales'' ([[Néo (éditions)|Ed. Néo {{numéro|103}}]]) * ''La Malédiction de Machrood'' ([[Néo (éditions)|Ed. Néo {{numéro|122}}]]) * ''La Neuvaine d'épouvante'' ([[Néo (éditions)|Ed. Néo {{numéro|134}}]]) * ''La Brume verte'' ([[Néo (éditions)|Ed. Néo {{numéro|151}}]]) Également publié sous le titre ''Le secret des sargasses'' ([[10/18]] {{numéro|960}}, 1975). * ''Les Feux follets de Satan'' ([[Néo (éditions)|Ed. Néo {{numéro|160}}]]) * ''Les Contes du Fulmar'' ([[Néo (éditions)|Ed. Néo {{numéro|171}}]]) * ''L'Île noire'' ([[Néo (éditions)|Ed. Néo {{numéro|182}}]]) * ''La Nef des bourreaux'' ([[Néo (éditions)|Ed. Néo {{numéro|193}}]]) * ''Le Monstre de Borough'' ([[Casterman]]) * [[1985]] : ''Edmund Bell : L'Élève invisible'' ([[Lefrancq (maison d'édition)|Lefrancq]]) illustré par [[René Follet]] * [[1987]] : ''Edmund Bell : L'Ombre rouge'' ([[Lefrancq (maison d'édition)|Lefrancq]]) illustré par [[René Follet]] [[Fichye:John Flanders gedenkplaat Rooigemlaan 539 Gent.png|thumb| Plak Souveni tankou John Flanders nan numero 539 de Rooigemlaan nan Gand.]] == Referans == {{referans}} == Lyen deyò == * [https://web.archive.org/web/20100727013904/http://noosfere.org/heberg/jeanray/ Pajwèb ofisyel Jean Ray] * [https://web.archive.org/web/20091227191032/http://www.bibliopoche.com/auteur/Ray-Jean/1616.html Bibliopoche : Tout piblikasyon zèv Jean Ray] * [http://www.romanpopulaire.com/livres/ray/ray_jean.shtml Analiz woman, diksyonè pèsonaj] * [https://web.archive.org/web/20110706230351/http://www.lefantastique.net/litterature/dossiers/litt_belge/ray/ray1.htm Jean Ray] sou lefantastique.net * [http://www.reading-everyday.com/283/Text/content0002.html Gade ''Croisière des Ombres''] {{DEFAULTSORT:Ray, Jean}} [[Kategori:Moun]] [[Kategori:Ekriven bèlj]] [[Kategori:Nesans nan lane 1887]] [[Kategori:lanmò 1964]] qlz9tku4b6l43csgs89imbqcn465qgq Wikipedya:REJEBECSS-HAITI/BNH/Liste 4 67009 855587 853653 2024-11-12T15:35:06Z ListeriaBot 19489 Wikidata list updated [V2] 855587 wikitext text/x-wiki {{Wikidata list |sparql=SELECT ?linkcount ?item ?itemLabel WHERE { SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr" } {?item wdt:P17 wd:Q790.} UNION {?item wdt:P131/wdt:P279* wd:Q790 .} UNION {?item wdt:P27 wd:Q790} ?item wikibase:sitelinks ?linkcount . OPTIONAL {?article schema:about ?item ; schema:isPartOf <https://ht.wikipedia.org/> .} FILTER (!BOUND(?article)) } ORDER BY DESC(?linkcount) LIMIT 200 |sort= |columns=NUMBER:numéro,P18:Image,label:Nom,P625:Géolocalisation,P131:Lieu |thumb=128 }} {| class='wikitable sortable' ! numéro ! Image ! Nom ! Géolocalisation ! Lieu |- | style='text-align:right'| 1 | [[Fichye:Sandy 2012-10-25 0320Z.png|center|128px]] | ''[[:d:Q264|Hurricane Sandy]]'' | | |- | style='text-align:right'| 2 | [[Fichye:Rene-Theophile-Hyacinthe Laennec.jpg|center|128px]] | ''[[:d:Q219621|René Laennec]]'' | | |- | style='text-align:right'| 3 | [[Fichye:Monkeypox By Country.svg|center|128px]] | ''[[:d:Q112070734|2022 monkeypox outbreak]]'' | | |- | style='text-align:right'| 4 | | ''[[:d:Q273894|Order of Poor Clerks Regular of the Mother of God of the Pious Schools]]'' | {{Coord|41.89736111|12.473425|display=inline}} | |- | style='text-align:right'| 5 | | ''[[:d:Q207701|Coat of Arms of Haiti]]'' | | |- | style='text-align:right'| 6 | [[Fichye:Map-Francophone World.svg|center|128px]] | ''[[:d:Q1003588|Francophonie]]'' | | |- | style='text-align:right'| 7 | | ''[[:d:Q140265|Windward Passage]]'' | {{Coord|20|-74|display=inline}} | |- | style='text-align:right'| 8 | [[Fichye:John baptist de la salle 1.jpg|center|128px]] | ''[[:d:Q138579|Institute of the Brothers of the Christian Schools]]'' | {{Coord|41.899|12.423|display=inline}} | |- | style='text-align:right'| 9 | | ''[[:d:Q916809|Haiti women's national association football team]]'' | | |- | style='text-align:right'| 10 | [[Fichye:Andrés Muschietti.jpg|center|128px]] | ''[[:d:Q6385039|Andy Muschietti]]'' | | |- | style='text-align:right'| 11 | | ''[[:d:Q594254|1973 CONCACAF Championship]]'' | {{Coord|18.5425|-72.3386|display=inline}} | |- | style='text-align:right'| 12 | | ''[[:d:Q4131845|Ayisyen]]'' | | [[Ayiti]] |- | style='text-align:right'| 13 | [[Fichye:Maracanã, 5 de agosto de 2016- onde o Egito encontra o Haiti... -rio2016 (28778328632).jpg|center|128px]] | ''[[:d:Q20113758|Haiti at the 2016 Summer Olympics]]'' | | |- | style='text-align:right'| 14 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q107472171|Haiti at the 2022 Winter Olympics]]'' | | |- | style='text-align:right'| 15 | | ''[[:d:Q20986|ISO 3166-2:HT]]'' | | |- | style='text-align:right'| 16 | | ''[[:d:Q1256655|20th parallel north]]'' | {{Coord|20|0|display=inline}} | |- | style='text-align:right'| 17 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q141217|Haiti at the 2012 Summer Olympics]]'' | | |- | style='text-align:right'| 18 | [[Fichye:Haiti at the opening ceremony of the 1928 Summer Olympics.jpg|center|128px]] | ''[[:d:Q147174|Haiti at the 1928 Summer Olympics]]'' | | |- | style='text-align:right'| 19 | | ''[[:d:Q4435409|list of World Heritage Sites in Haiti]]'' | | |- | style='text-align:right'| 20 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q42914391|Haiti at the 2020 Summer Olympics]]'' | | |- | style='text-align:right'| 21 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q144034|Haiti at the 1900 Summer Olympics]]'' | | |- | style='text-align:right'| 22 | | ''[[:d:Q3439047|independencia dominicana venaty]]'' | | |- | style='text-align:right'| 23 | [[Fichye:Flag of Haiti (civil).svg|center|128px]] | ''[[:d:Q2297885|Haiti at the 1924 Summer Olympics]]'' | | |- | style='text-align:right'| 24 | | ''[[:d:Q2467445|Ligue Haïtienne]]'' | | |- | style='text-align:right'| 25 | [[Fichye:Jimmy "Barbecue" Cherizier 2024.png|center|128px]] | ''[[:d:Q101440369|Jimmy Chérizier]]'' | | |- | style='text-align:right'| 26 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q141075|Haiti at the 2008 Summer Olympics]]'' | | |- | style='text-align:right'| 27 | [[Fichye:Vida y viajes de Cristobal Colón, 1851 Construcción de la fortaleza de La Navidad (3819531625).jpg|center|128px]] | ''[[:d:Q1798978|La Navidad]]'' | {{Coord|19.690555555556|-72.015833333333|display=inline}} | [[Ayiti]] |- | style='text-align:right'| 28 | [[Fichye:Bennedict Mathurin (cropped).jpg|center|128px]] | ''[[:d:Q105013647|Bennedict Mathurin]]'' | | |- | style='text-align:right'| 29 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q143063|Haiti at the 2000 Summer Olympics]]'' | | |- | style='text-align:right'| 30 | | ''[[:d:Q1024083|1991 CONCACAF Women's Championship]]'' | | |- | style='text-align:right'| 31 | | ''[[:d:Q1254997|19th parallel north]]'' | {{Coord|19|0|display=inline}} | |- | style='text-align:right'| 32 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q2194097|Haiti at the 1960 Summer Olympics]]'' | | |- | style='text-align:right'| 33 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q1986870|Haiti at the 1988 Summer Olympics]]'' | | |- | style='text-align:right'| 34 | [[Fichye:Flag of Haiti (1964–1986).svg|center|128px]] | ''[[:d:Q2291898|Haiti at the 1984 Summer Olympics]]'' | | |- | style='text-align:right'| 35 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q126284599|Haiti at the 2024 Summer Olympics]]'' | | |- | style='text-align:right'| 36 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q145152|Haiti at the 2004 Summer Olympics]]'' | | |- | style='text-align:right'| 37 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q150527|Haiti at the 1996 Summer Olympics]]'' | | |- | style='text-align:right'| 38 | [[Fichye:Flag of Haiti (1964–1986).svg|center|128px]] | ''[[:d:Q168379|Haiti at the 1972 Summer Olympics]]'' | | |- | style='text-align:right'| 39 | [[Fichye:Flag of Haiti (1964–1986).svg|center|128px]] | ''[[:d:Q2489822|Haiti at the 1976 Summer Olympics]]'' | | |- | style='text-align:right'| 40 | [[Fichye:Flag of Haiti (civil).svg|center|128px]] | ''[[:d:Q2651878|Haiti at the 1932 Summer Olympics]]'' | | |- | style='text-align:right'| 41 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q2666070|Haiti at the 1992 Summer Olympics]]'' | | |- | style='text-align:right'| 42 | [[Fichye:Lens B - Dieppe (15-08-2015) 86.JPG|center|128px]] | ''[[:d:Q26251605|Jean-Kévin Duverne]]'' | | |- | style='text-align:right'| 43 | [[Fichye:Cap-Haitien seen from Morne Jean Explosion.jpg|center|128px]] | ''[[:d:Q110106709|Cap-Haïtien fuel tanker explosion]]'' | {{Coord|19.75138888888889|-72.20555555555555|display=inline}} | [[Kap Ayisyen (komin)|Kap Ayisyen]] |- | style='text-align:right'| 44 | | ''[[:d:Q667038|United Nations Mission in Haiti]]'' | | |- | style='text-align:right'| 45 | | ''[[:d:Q3207215|Lake Miragoâne]]'' | {{Coord|18.403888888889|-73.049722222222|display=inline}} | [[Miragwàn (komin)|Miragwàn]] |- | style='text-align:right'| 46 | | ''[[:d:Q4124963|Armed Forces of Haiti]]'' | | |- | style='text-align:right'| 47 | [[Fichye:Michel Patrick Boisvert 2023 (cropped).jpg|center|128px]] | ''[[:d:Q114735638|Michel Patrick Boisvert]]'' | | |- | style='text-align:right'| 48 | | ''[[:d:Q861844|André Corvington]]'' | | |- | style='text-align:right'| 49 | | ''[[:d:Q1857436|2010–11 Haitian general election]]'' | | |- | style='text-align:right'| 50 | [[Fichye:Trou Caïman.jpg|center|128px]] | ''[[:d:Q2805779|Trou Caïman]]'' | {{Coord|18.642804|-72.146336|display=inline}} | [[Tomazo (komin)|Tomazo]] |- | style='text-align:right'| 51 | | ''[[:d:Q2992378|demographics of Haiti]]'' | | |- | style='text-align:right'| 52 | | ''[[:d:Q5421623|Exposition internationale du bicentenaire de Port-au-Prince]]'' | {{Coord|18.549368|-72.348376|display=inline}} | |- | style='text-align:right'| 53 | | ''[[:d:Q10530123|Max Hilaire]]'' | | |- | style='text-align:right'| 54 | [[Fichye:Nerilia Mondesir.jpg|center|128px]] | ''[[:d:Q21622103|Nérilia Mondésir]]'' | | |- | style='text-align:right'| 55 | [[Fichye:Lens - Evian (29-02-2016) 17.jpg|center|128px]] | ''[[:d:Q22280180|Dylan Saint-Louis]]'' | | |- | style='text-align:right'| 56 | [[Fichye:Order of Merit of the Republic of Haiti (Grade of Commander) - IMG 4985.JPG|center|128px]] | ''[[:d:Q112390|National Order of Honour and Merit]]'' | | |- | style='text-align:right'| 57 | [[Fichye:Hotel Montana.jpg|center|128px]] | ''[[:d:Q3121455|Hôtel Montana]]'' | {{Coord|18.527222|-72.297778|display=inline}} | [[Petyonvil (komin)|Petyonvil]] |- | style='text-align:right'| 58 | [[Fichye:Danish Air Transport ATR-42-300.jpg|center|128px]] | ''[[:d:Q7641058|Sunrise Airways]]'' | | |- | style='text-align:right'| 59 | | ''[[:d:Q11821998|Polish Haitian]]'' | | |- | style='text-align:right'| 60 | [[Fichye:2019-07-17 SG Dynamo Dresden vs. Paris Saint-Germain by Sandro Halank–054 (cropped).jpg|center|128px]] | ''[[:d:Q69948832|Garissone Innocent]]'' | | |- | style='text-align:right'| 61 | [[Fichye:UN Haiti - MINUSTAH HQ after 2010 earthquake.jpg|center|128px]] | ''[[:d:Q166484|Christopher Hotel]]'' | {{Coord|18.5391|-72.3121|display=inline}} | [[Pòtoprens (komin)|Pòtoprens]] |- | style='text-align:right'| 62 | | ''[[:d:Q2202375|Catholic Church in Haiti]]'' | | |- | style='text-align:right'| 63 | | ''[[:d:Q2581074|Coupe d'Haïti]]'' | | |- | style='text-align:right'| 64 | | ''[[:d:Q3094730|Racing FC]]'' | | |- | style='text-align:right'| 65 | [[Fichye:Hotel Oloffson mars 2007.JPG|center|128px]] | ''[[:d:Q3365701|Hotel Oloffson]]'' | {{Coord|18.529444|-72.3375|display=inline}} | |- | style='text-align:right'| 66 | | ''[[:d:Q3623880|La Gonâve Arrondissement]]'' | {{Coord|18.8322|-72.8658|display=inline}} | [[Lwès (depatman)|Lwès]] |- | style='text-align:right'| 67 | | ''[[:d:Q4116369|Islam in Haiti]]'' | | |- | style='text-align:right'| 68 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q5639707|Haiti at the Paralympics]]'' | | |- | style='text-align:right'| 69 | [[Fichye:Cathedral of Cap-Haitien.jpg|center|128px]] | ''[[:d:Q11737318|Our Lady of the Assumption Cathedral, Cap-Haïtien]]'' | {{Coord|19.761|-72.2007|display=inline}} | [[Kap Ayisyen (komin)|Kap Ayisyen]] |- | style='text-align:right'| 70 | | ''[[:d:Q60853298|Arcahaie FC]]'' | | |- | style='text-align:right'| 71 | [[Fichye:Grace 2021-08-21 0610Z.jpg|center|128px]] | ''[[:d:Q108141536|Hurricane Grace]]'' | | |- | style='text-align:right'| 72 | | ''[[:d:Q124742130|2024 Haitian jailbreak]]'' | | |- | style='text-align:right'| 73 | | ''[[:d:Q258171|Águilas Cibaeñas]]'' | | |- | style='text-align:right'| 74 | | ''[[:d:Q1449569|Lee Holdridge]]'' | | |- | style='text-align:right'| 75 | | ''[[:d:Q1626302|LGBT rights in Haiti]]'' | | |- | style='text-align:right'| 76 | [[Fichye:Citadelle Laferrière terrace 2.jpg|center|128px]] | ''[[:d:Q2305026|Ramiers]]'' | {{Coord|19.5736|-72.2442|display=inline}} | |- | style='text-align:right'| 77 | | ''[[:d:Q3043219|deforestation in Haiti]]'' | | |- | style='text-align:right'| 78 | [[Fichye:St. Alexander Nevsky Cathedral - Howell, New Jersey 02.JPG|center|128px]] | ''[[:d:Q4126487|Russian Orthodox Eparchy of Eastern America and New York]]'' | | |- | style='text-align:right'| 79 | [[Fichye:Michelle Obama and Jill Biden in Haiti 2010.jpg|center|128px]] | ''[[:d:Q5361449|Elisabeth Delatour Préval]]'' | | |- | style='text-align:right'| 80 | | ''[[:d:Q19702717|Jeppe Simonsen]]'' | | |- | style='text-align:right'| 81 | | ''[[:d:Q19881628|2015–16 Haitian parliamentary election]]'' | | |- | style='text-align:right'| 82 | | ''[[:d:Q26225095|Caye Sable]]'' | {{Coord|18.7|-72.76667|display=inline}} | [[Lwès (depatman)|Lwès]] |- | style='text-align:right'| 83 | | ''[[:d:Q5715358|Henri Caesar]]'' | | |- | style='text-align:right'| 84 | | ''[[:d:Q26837183|Mulern Jean]]'' | | |- | style='text-align:right'| 85 | | ''[[:d:Q60677605|Benji Michel]]'' | | |- | style='text-align:right'| 86 | [[Fichye:Shan Borgelin (cropped).jpg|center|128px]] | ''[[:d:Q62078453|Shanyder Borgelin]]'' | | |- | style='text-align:right'| 87 | | ''[[:d:Q107122118|Carnejy Antoine]]'' | | |- | style='text-align:right'| 88 | | ''[[:d:Q111536396|Dany Jean]]'' | | |- | style='text-align:right'| 89 | | ''[[:d:Q113003310|Haiti at the 2022 World Athletics Championships]]'' | | |- | style='text-align:right'| 90 | | ''[[:d:Q121461135|Haiti at the 2023 World Athletics Championships]]'' | | |- | style='text-align:right'| 91 | | ''[[:d:Q125707608|Fritz Bélizaire]]'' | | |- | style='text-align:right'| 92 | | ''[[:d:Q131140314|Alix Didier Fils-Aimé]]'' | | |- | style='text-align:right'| 93 | | ''[[:d:Q655961|United Nations Transition Mission in Haiti]]'' | | |- | style='text-align:right'| 94 | | ''[[:d:Q1060772|list of Roman Catholic dioceses in Haiti]]'' | | |- | style='text-align:right'| 95 | | ''[[:d:Q1353457|Haiti at the 2012 Summer Paralympics]]'' | | |- | style='text-align:right'| 96 | | ''[[:d:Q1531692|Raboteau Massacre]]'' | {{Coord|19.45|-72.68333333|display=inline}} | [[Gonayiv (awondisman)|Gonayiv]] |- | style='text-align:right'| 97 | | ''[[:d:Q1569605|Haiti Davis Cup team]]'' | | |- | style='text-align:right'| 98 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q2497054|Haiti at the 2010 Summer Youth Olympics]]'' | | |- | style='text-align:right'| 99 | | ''[[:d:Q3163953|Janbatis Chavàn]]'' | | |- | style='text-align:right'| 100 | | ''[[:d:Q3297666|Massif des Montagnes Noires]]'' | {{Coord|19.0833|-72.25|display=inline}} | |- | style='text-align:right'| 101 | | ''[[:d:Q3366221|Haitian Communist Party]]'' | | |- | style='text-align:right'| 102 | | ''[[:d:Q3504239|Haitian Vodoun Culture Language]]'' | | |- | style='text-align:right'| 103 | | ''[[:d:Q3589794|Haiti national under-17 football team]]'' | | |- | style='text-align:right'| 104 | [[Fichye:Daniele Battaglia.jpg|center|128px]] | ''[[:d:Q3701868|Daniele Battaglia]]'' | | |- | style='text-align:right'| 105 | | ''[[:d:Q3873766|Ekip baskètbòl Ayiti]]'' | | |- | style='text-align:right'| 106 | | ''[[:d:Q7136383|Parc St. Victor]]'' | {{Coord|19.753611|-72.2075|display=inline}} | [[Kap Ayisyen (komin)|Kap Ayisyen]] |- | style='text-align:right'| 107 | | ''[[:d:Q16587373|National Unity Party]]'' | | |- | style='text-align:right'| 108 | [[Fichye:Cathédrale Jérémie Haïti.JPG|center|128px]] | ''[[:d:Q17608165|St. Louis King of France Cathedral]]'' | {{Coord|18.6447|-74.1146|display=inline}} | [[Jeremi (komin)|Jeremi]] |- | style='text-align:right'| 109 | | ''[[:d:Q19895065|French Haitian]]'' | | |- | style='text-align:right'| 110 | [[Fichye:Bayyinah Bello 1.png|center|128px]] | ''[[:d:Q20090268|Bayyinah Bello]]'' | | |- | style='text-align:right'| 111 | | ''[[:d:Q24744408|2016–17 Haitian Senate election]]'' | | |- | style='text-align:right'| 112 | [[Fichye:Sophia Martelly.jpg|center|128px]] | ''[[:d:Q24951046|Sofia Sen Remy Mately]]'' | | |- | style='text-align:right'| 113 | [[Fichye:Bassin Bleu, Haiti.jpg|center|128px]] | ''[[:d:Q2887443|Bassin Bleu]]'' | {{Coord|18.23416667|-72.58805556|display=inline}} | |- | style='text-align:right'| 114 | | ''[[:d:Q16728171|Monuma Constant Jr.]]'' | | |- | style='text-align:right'| 115 | | ''[[:d:Q26704937|Frantz Dorsainvil]]'' | | |- | style='text-align:right'| 116 | | ''[[:d:Q34383826|Haiti at the 2017 World Championships in Athletics]]'' | | |- | style='text-align:right'| 117 | | ''[[:d:Q57037767|Ángel Orelién]]'' | | |- | style='text-align:right'| 118 | | ''[[:d:Q68166407|Haiti at the 2019 World Championships in Athletics]]'' | | |- | style='text-align:right'| 119 | [[Fichye:Danielle Etienne .jpg|center|128px]] | ''[[:d:Q69803071|Danielle Etienne]]'' | | |- | style='text-align:right'| 120 | | ''[[:d:Q100792937|Josué Casimir]]'' | | |- | style='text-align:right'| 121 | | ''[[:d:Q107476272|Sabiana Anestor]]'' | | |- | style='text-align:right'| 122 | | ''[[:d:Q112623666|Alexandre Pierre]]'' | | |- | style='text-align:right'| 123 | | ''[[:d:Q119952811|Jayro Jean]]'' | | |- | style='text-align:right'| 124 | | ''[[:d:Q110664|Léonard Pétion Laroche]]'' | | |- | style='text-align:right'| 125 | [[Fichye:Hispaniolanpineforest.jpg|center|128px]] | ''[[:d:Q287885|Hispaniolan pine forests]]'' | {{Coord|18.33|-71.78|display=inline}} | |- | style='text-align:right'| 126 | | ''[[:d:Q1089416|Andre Pascal]]'' | | |- | style='text-align:right'| 127 | | ''[[:d:Q1149808|Brother Voodoo]]'' | | |- | style='text-align:right'| 128 | | ''[[:d:Q1654386|Inivèsite Notre Dame Ayiti]]'' | {{Coord|18.5286889|-72.3353421|display=inline}} | [[Pòtoprens (komin)|Pòtoprens]] |- | style='text-align:right'| 129 | [[Fichye:Les Trois-Rivières en Haïti.jpg|center|128px]] | ''[[:d:Q1952095|Les Trois Rivières]]'' | {{Coord|19.95|-72.866666666667|display=inline}} | |- | style='text-align:right'| 130 | | ''[[:d:Q2036275|Osvaldo Jeanty]]'' | | |- | style='text-align:right'| 131 | | ''[[:d:Q2069340|rail transport in Haiti]]'' | | |- | style='text-align:right'| 132 | | ''[[:d:Q2299927|Haiti at the 2008 Summer Paralympics]]'' | | |- | style='text-align:right'| 133 | [[Fichye:Lecture-scenique-iphigenie jr-lemoine.jpg|center|128px]] | ''[[:d:Q3169917|Jean-René Lemoine]]'' | | |- | style='text-align:right'| 134 | | ''[[:d:Q3208335|Montagne Terrible]]'' | {{Coord|18.8897|-72.4008|display=inline}}<br/>{{Coord|18.88972|-72.40028|display=inline}} | [[Sen Mak (awondisman)|Sen Mak]] |- | style='text-align:right'| 135 | | ''[[:d:Q3316510|Miss Haiti]]'' | | |- | style='text-align:right'| 136 | | ''[[:d:Q3366461|Fusion of Haitian Social Democrats]]'' | | |- | style='text-align:right'| 137 | | ''[[:d:Q3419888|Rally of Progressive National Democrats]]'' | | |- | style='text-align:right'| 138 | | ''[[:d:Q3509515|education in Haiti]]'' | | |- | style='text-align:right'| 139 | | ''[[:d:Q3532552|Tortug' Air]]'' | | |- | style='text-align:right'| 140 | | ''[[:d:Q3539909|Francophone]]'' | | |- | style='text-align:right'| 141 | | ''[[:d:Q3589796|équipe d'Haïti de volley-ball féminin]]'' | | |- | style='text-align:right'| 142 | [[Fichye:Alix Pasquet.jpg|center|128px]] | ''[[:d:Q4727515|Alix Pasquet]]'' | | |- | style='text-align:right'| 143 | | ''[[:d:Q4895878|Bertrand Madsen]]'' | | |- | style='text-align:right'| 144 | [[Fichye:Fight of the Poursuivante mp3h9427.jpg|center|128px]] | ''[[:d:Q4927230|Blockade of Saint-Domingue]]'' | | |- | style='text-align:right'| 145 | | ''[[:d:Q5354703|elections in Haiti]]'' | | |- | style='text-align:right'| 146 | | ''[[:d:Q5468493|Foreign relations of Haiti]]'' | | |- | style='text-align:right'| 147 | | ''[[:d:Q5639691|Haiti Billie Jean King Cup team]]'' | | |- | style='text-align:right'| 148 | | ''[[:d:Q5856947|Fe y Alegría]]'' | | |- | style='text-align:right'| 149 | | ''[[:d:Q5938282|human rights in Haiti]]'' | | |- | style='text-align:right'| 150 | | ''[[:d:Q6726315|Madame Max Adolphe]]'' | | |- | style='text-align:right'| 151 | | ''[[:d:Q6771722|Marlena Wesh]]'' | | |- | style='text-align:right'| 152 | | ''[[:d:Q7251035|prostitution in Haiti]]'' | | |- | style='text-align:right'| 153 | | ''[[:d:Q7279930|Rada loa]]'' | | |- | style='text-align:right'| 154 | | ''[[:d:Q7935364|visa policy of Haiti]]'' | | |- | style='text-align:right'| 155 | [[Fichye:Central Market, Port-au-Prince.jpg|center|128px]] | ''[[:d:Q16303839|Marché en Fer]]'' | {{Coord|18.5515|-72.3431|display=inline}} | [[Pòtoprens (komin)|Pòtoprens]] |- | style='text-align:right'| 156 | | ''[[:d:Q16360378|2014 Kosovo vs Haiti football match]]'' | | |- | style='text-align:right'| 157 | | ''[[:d:Q17006910|July 1958 Haitian coup d'état attempt]]'' | | |- | style='text-align:right'| 158 | | ''[[:d:Q17636553|Petite Rivière de Jacmel]]'' | {{Coord|18.23|-72.55111111|display=inline}} | |- | style='text-align:right'| 159 | | ''[[:d:Q19331319|2015 Haiti Carnival stampede]]'' | | |- | style='text-align:right'| 160 | | ''[[:d:Q19666225|Marie-Denise Douyon]]'' | | |- | style='text-align:right'| 161 | [[Fichye:Port-au-Prince Haiti Temple - Pierre.jpg|center|128px]] | ''[[:d:Q20714931|Port-au-Prince Haiti Temple]]'' | {{Coord|18.528651|-72.267999|display=inline}} | [[Pòtoprens (komin)|Pòtoprens]] |- | style='text-align:right'| 162 | | ''[[:d:Q20807714|Haiti national under-20 football team]]'' | | |- | style='text-align:right'| 163 | | ''[[:d:Q20872224|Haiti at the 2015 World Championships in Athletics]]'' | | |- | style='text-align:right'| 164 | | ''[[:d:Q23687393|February 2016 Haitian presidential election]]'' | | |- | style='text-align:right'| 165 | | ''[[:d:Q24910664|2016 Ligue Haïtienne season]]'' | | |- | style='text-align:right'| 166 | [[Fichye:Tropical Storm Matthew Sept 24 2010.jpg|center|128px]] | ''[[:d:Q4353265|Tropical Storm Matthew]]'' | | |- | style='text-align:right'| 167 | | ''[[:d:Q26226528|Ilet a Brouee]]'' | {{Coord|18.128333333333|-73.590555555556|display=inline}} | [[Sid (depatman)|Sid]] |- | style='text-align:right'| 168 | | ''[[:d:Q26834029|Haiti at the 2016 Summer Paralympics]]'' | | |- | style='text-align:right'| 169 | | ''[[:d:Q28941174|FC Juventus des Cayes]]'' | | |- | style='text-align:right'| 170 | | ''[[:d:Q28944080|Haitian Aviation Corps]]'' | | |- | style='text-align:right'| 171 | | ''[[:d:Q48609821|Haiti at the 2018 Summer Youth Olympics]]'' | | |- | style='text-align:right'| 172 | | ''[[:d:Q51120334|Myrlande Constant]]'' | | |- | style='text-align:right'| 173 | | ''[[:d:Q57315177|Germany–Haiti relations]]'' | | |- | style='text-align:right'| 174 | | ''[[:d:Q60776533|2018 Port-au-Prince massacre]]'' | {{Coord|18.56|-72.34|display=inline}} | |- | style='text-align:right'| 175 | | ''[[:d:Q62653313|Ronaldo Damus]]'' | | |- | style='text-align:right'| 176 | | ''[[:d:Q70531330|Mikerline Saint-Félix]]'' | | |- | style='text-align:right'| 177 | | ''[[:d:Q72697581|Louicius Don Deedson]]'' | | |- | style='text-align:right'| 178 | | ''[[:d:Q81330435|Haiti at the 2020 Winter Youth Olympics]]'' | | |- | style='text-align:right'| 179 | | ''[[:d:Q83887546|Kethna Louis]]'' | | |- | style='text-align:right'| 180 | | ''[[:d:Q106205592|Lise-Marie Dejean]]'' | | |- | style='text-align:right'| 181 | [[Fichye:Flag of Haiti.svg|center|128px]] | ''[[:d:Q108197251|Haiti at the 2020 Summer Paralympics]]'' | | |- | style='text-align:right'| 182 | | ''[[:d:Q110855814|Richardson Viano]]'' | | |- | style='text-align:right'| 183 | [[Fichye:Flag of Haiti (civil).svg|center|128px]] | ''[[:d:Q113397434|Haiti at the 1936 Summer Olympics]]'' | | |- | style='text-align:right'| 184 | | ''[[:d:Q766764|Dieudonné LaMothe]]'' | | |- | style='text-align:right'| 185 | | ''[[:d:Q1956676|Morne Degas]]'' | {{Coord|19.59583|-72.81861|display=inline}}<br/>{{Coord|19.594444444444|-72.821388888889|display=inline}} | [[Latibonit (depatman)|Latibonit]] |- | style='text-align:right'| 186 | | ''[[:d:Q2010761|Montagnes du Trou d'Eau]]'' | {{Coord|18.7167|-72|display=inline}}<br/>{{Coord|18.7|-72.05|display=inline}} | |- | style='text-align:right'| 187 | | ''[[:d:Q2265677|MICAH]]'' | | |- | style='text-align:right'| 188 | | ''[[:d:Q2310187|Parc Levelt]]'' | {{Coord|19.1081|-72.6959|display=inline}} | [[Sen Mak (komin)|Sen Mak]] |- | style='text-align:right'| 189 | | ''[[:d:Q2752222|Grande Caye]]'' | {{Coord|18.0875|-73.81222222|display=inline}}<br/>{{Coord|18.0875|-73.81222|display=inline}} | [[Sid (depatman)|Sid]] |} {{Wikidata list end}} hunqqmh4qrp6w5klz9ae7jdtplburj8 Les Morts-vivants 0 70441 855655 725425 2024-11-13T11:43:28Z Túrelio 19595 ([[c:GR|GR]]) [[c:COM:Duplicate|Duplicate]]: [[File:White Zombie (1932).webm]] → [[File:White Zombie (1932) by Victor Hugo Halperin HR.webm]] Exact or scaled-down duplicate: [[c::File:White Zombie (1932) by Victor Hugo Halperin HR.webm]] 855655 wikitext text/x-wiki [[Fichye:Poster - White Zombie 01 Crisco restoration.jpg|right|thumb|Afich ''White Zombie'']] [[Fichye:White Zombie (1932) by Victor Hugo Halperin HR.webm|thumb|thumbtime=22|''White Zombie'']] [[Fichye:White Zombie lobby card.JPG|right|thumb|Yon sèn nan fim]] '''''Les Morts-vivants''''' (nan angle ː ''White Zombie'') se yon [[fim laterè]] [[Etazini|ameriken]] reyalize pa [[Victor Halperin]], sòti an [[1932]]. Sa a se premye fim ki prezante [[zonbi]]. == Ekip teknik == * Tit orijinal : ''White Zombie'' * Tit franse : ''Les Morts-vivants'' * Reyalizatè : [[Victor Halperin]] * Senaryoo : [[Garnett Weston]] * Pwodiktè : [[Edward Halperin]] * Mizik : [[Guy Bevier]], [[Xavier Cugat]], [[Gaston Borch]], [[Robert Nathaniel Dett|Nathaniel Dett]], [[Nem Herkin]], [[H. Maurice Jacquet]], [[Leo Kempinski]], [[Hugo Riesenfeld]] * Fotografi : [[Arthur Martinelli]] * Montaj : [[Harold McLernon]] * Peyu orijin : [[Etazini]] * Lang : [[angle]] * Bidjè : 50000 $ (estimasyon) * Fòma : nwa ak blan - Fòma projeksyon 1,37:1]] - Mono * Jan : dram, laterè * Dire : 67 minit * Sosyete distribisyon : United Artists * Sòti : 4 out 1932 * Lisans : Domèn piblik == Aktè == * [[Béla Lugosi]] : Legendre * [[Madge Bellamy]] : Madeleine Short Parker * [[Joseph Cawthorn]] : Doktè Bruner, missionnaire * [[Robert Frazer]] : Charles Beaumont * [[John Harron]] : Neil Parker == Referans == {{referans}} == Lyen deyò == * [https://www.imdb.com/title/tt0023694/ Les Morts-vivants] sou IMDb * {{en}} [https://archive.org/details/white_zombie ''Les Morts-vivants''] sou Internet Archive [[Kategori:1932]] [[Kategori:Sinema]] [[Kategori:Fim]] [[Kategori:Fim ameriken]] guv6d4ry5p5o75qt7yqihs77q6tqbxo Lee Sang-yoon 0 75426 855619 781474 2024-11-12T21:01:22Z Nathavaskie 31718 /* Lyen deyò */ ajoute lyen 855619 wikitext text/x-wiki {{moun |non=Lee Sang-yoon |foto= Lee Sang-yoon.jpg |tèks=Lee Sang-yoon |fonksyon=Aktè |domèn=Sinema, televizyon |diplòm= |etid= |dat nesans=[[15 out]] [[1981]] |lye nesans=[[Seoul]] |peyi nesans=[[Kore disid]] |dat lanmò= |lye lanmò= |peyi lanmò= |nasyonalite= sidkoreyen |relijyon= |rezidans= |kontak= |Biyografi= |zèv= |omaj= |rekonpans= |remak= |fim= }} '''Lee Sang-yoon''' (an [[lang kore|koreyen]] : ko-hhrm|이상윤) ki fèt [[15 out]] [[1981]] nan [[Seoul]] ([[Kore disid]]), se yon [[aktè]] [[Kore disid|sidkoreyen]]. == Biyografi == == Zèv li yo == === Fim === * 2007 : ''[[Sex Is Zero 2]]'' : Gi-jo * 2014 : ''[[Santa Barbara (fim)|Santa Barbara]]'' : Jung-woo * 2016 : ''[[Insane (fim)|Insane]]'' : Na Nam-soo * 2020 : ''Okay Madam'' : Chul Seung === Seri elevizyon === * 2007 : ''[[Drama City]]'' "Transformation" : Charles ([[KBS2]]) * 2007 : ''[[Air City]]'' : Kim Jung-min ([[Munhwa Broadcasting Corporation|MBC]]) * 2007 : ''[[Drama City]]'' "Sky Lovers" : Moon Ui-sik (KBS2) * 2007 : ''[[Likeable or Not]]'' : Seo Woo-jin ([[KBS1]]) * 2008 : ''The Scale of Providence'' : Kim Woo-bin ([[Seoul Broadcasting System|SBS]]) * 2008 : ''[[Don't Cry My Love (seri)|Don't Cry My Love]]'' : Jang Hyun-woo (MBC) * 2009 : ''Heading to the Ground'' : Jang Seung-woo * 2010 : ''[[Jejungwon (seri)|Jejungwon]]'' : Ji Seok-young ([[Seoul Broadcasting System|SBS]]) * 2010 : ''[[Life Is Beautiful (seri, 2010)|Life Is Beautiful]]'' : Yang Ho-sub * 2010 : ''[[Home Sweet Home (seri, 2010)|Home Sweet Home]]'' : Kang Shin-woo (MBC) * 2011 : ''[[The Duo]]'' : Gwi-dong (MBC) * 2012 : ''[[My Daughter Seo-young]]'' : Kang Woo-jae (KBS2) * 2013 : ''[[Goddess of Fire]]'' : [[Gwanghaegun of Joseon|Prince Gwanghae]] (MBC) * 2014 : ''[[Angel Eyes (seri)|Angel Eyes]]'' : Park Dong-joo/Dylan Park ([[Seoul Broadcasting System|SBS]]) * 2014 : ''[[Liar Game (seri, 2014)|Liar Game]]'' : Ha Woo-jin ([[TVN (South Korea)|tvN]]) * 2015 : ''[[Unkind Ladies]]'' : Top star (KBS2) * 2015 : ''[[Second 20s]]'' : Cha Hyun-seok (tvN) * 2016 : ''[[On the Way to the Airport]]'' : Seo Do-woo ([[Korean Broadcasting System|KBS2]]) * 2017 : ''[[Whisper (seri)|Whisper]]'' : Lee Dong-joon ([[Seoul Broadcasting System|SBS]]) * 2018 : ''[[About Time (seri)|About Time]]'' : Lee Do-ha ([[tvN]]) * 2019 : ''[[VIP (seri, 2019)|VIP]]'' : Park Sung-joon ([[Seoul Broadcasting System|SBS]]) == Referans == {{referans}} == Lyen deyò == * [https://www.imdb.com/name/nm3718915/ Lee Sang-yoon] sou IMDb * https://mydramalist-com.translate.goog/people/694-lee-sang-yoon?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=fr&_x_tr_pto=sc {{DEFAULTSORT:Lee, Sang-yoon}} [[Kategori:Moun]] [[Kategori:Aktè]] [[Kategori:Aktè sinema]] [[Kategori:Aktè televizyon]] [[Kategori:Aktè sidkoreyen]] [[Kategori:Nesans nan lane 1981]] ji8hts70b51ai3s449lrsuqrcfyu7m3 Athena: Goddess of War 0 75563 855618 770718 2024-11-12T20:57:39Z Nathavaskie 31718 /* Lyen deyò */ ajoute lyen 855618 wikitext text/x-wiki '''''Athena: Goddess of War''''' (an [[Lang kore|koreyen]] : 아테나: 전쟁의 여신, ''Atena: Jeonjaeng-ui Yeoshin'') se yon [[seri televizyon]] [[Kore disid|sidkoreyèn]] difize an [[2010]] ak [[2011]] sou [[Seoul Broadcasting System|SBS]]. == Aktè == * [[Jung Woo-sung]] kòm Lee Jung-woo * [[Cha Seung-won]] kòm Son-hyuk * [[Soo Ae]] kòm Yoon Hye-in * [[Lee Ji-ah]] kòm Han Jae-hee == Referans == {{referans}} == Lyen deyò == * [https://www.imdb.com/title/tt1942171/ Athena: Goddess of War sou IMDb] * [https://programs.sbs.co.kr/drama/athena/about/53742 Sitwèb ofisyèl Athena: Goddess of War] sou sbs.co.kr * https://www.senscritique.com/serie/athena_goddess_of_war/439124 [[Kategori:2010]] [[Kategori:Televizyon]] [[Kategori:Seri televizyon]] [[Kategori:Seri sidkoreyèn]] en9uhothhb7xqoewlpevttcz71wqs6n Lis zòn pwoteje ann Ayiti 0 76613 855592 840638 2024-11-12T16:11:54Z InternetArchiveBot 25431 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 855592 wikitext text/x-wiki Zòn pwoteje ann Ayiti se sitou pak nasyonal. Sepandan, kèk inisyativ prive tou te reyisi nan prezève biyodivèsite la nan zòn plis oswa mwens gwo. == Pak nasyonal yo == Pak nasyonal Lavizit ak Pik Makaya yo te de (2) premye pak nasyonal yo ki te kreye an 1983, sitou gras a efò Charles A. Woods ak kòlèg li yo. <ref>Woods CA, Ottenwalder JA. The natural history of southern Haiti. Florida Museum of Natural History, University of Florida; 1992</ref> {{,}} <ref>Woods CA, Sergile FE, Ottenwalder JA. Stewardship plan for the national parks and natural areas of Haiti. Florida Museum of Natural History, University of Florida; 1992.</ref> Twa (3) pak resan se sitou rezilta efò S. Blair Hedges ak Philippe Bayard :<ref>{{Cite web|url=http://articles.philly.com/2011-09-13/news/30149741_1_rare-animals-frogs-forest|title=A search for rare animals before Haiti's forests - and the animals - disappear|website=articles.philly.com|access-date=2016-03-25|archive-date=2016-04-06|archive-url=https://web.archive.org/web/20160406054350/http://articles.philly.com/2011-09-13/news/30149741_1_rare-animals-frogs-forest|dead-url=yes}}</ref> {{,}} <ref name="HNT">{{Cite web|url=http://www.haititrust.org|title=Haiti National Trust|last=Haiti National Trust|access-date=2016-03-25}}</ref> Pak nasyonal Grann Kolin (23 jiyè 2014), <ref>Le Moniteur, Journal Officiel de la République d’Haiti, No. 158, 21 August 2014</ref> Granbwa ak De Manmèl (23 septanm 2015). <ref name="LM10-8">Le Moniteur, Journal Officiel de la République d’Haiti, No. 193, 8 October 2015</ref> === Lis pak === * [[Pak nasyonal Lavizit]] * [[Pak nasyonal Makaya]] * [[Pak nasyonal Grann Kolin|Pak nasyonal natirèl Grann Kolin]]<ref>{{Cite web |url=http://ciat.bach.anaphore.org/archives/search?filter_field=cCorpname&filter_value=Parc+National+Naturel+de+Grande+Colline+%28PNN-GC%29 |title=CIAT |access-date=2020-10-20 |archive-date=2020-08-13 |archive-url=https://web.archive.org/web/20200813203859/http://ciat.bach.anaphore.org/archives/search?filter_field=cCorpname&filter_value=Parc+National+Naturel+de+Grande+Colline+%28PNN-GC%29 |dead-url=yes }}</ref> * [[Pak nasyonal Granbwa]] * [[Pak nasyonal De Manmèl]]<ref name="Moniteur 10">Le Moniteur, Journal Officiel de la République d’Haiti, No. 10, 16 January 2014</ref> * [[Pak nasyonal Forè Pen|Pak nasyonal natirèl Forè Pen]] * [[Pak nasyonal Twa Bè]]<ref>Le Moniteur, Journal Officiel de la République d’Haiti, No. 230, 11 December 2013</ref> * Lilavach <ref>Le Moniteur, Journal Officiel de la République d’Haiti, No. 156, 26 August 2013</ref> === Rezèv maritim === * Abakou * Konplèks Kap-Kan Lwiz * Kòt Bèlans ak Gran Gozye * Dam Mari * La Cahoune * Lanavaz * Pak Maren Baradè / Kayemit * Pak Maren Bè Akil * Pak Maren Akaden * Pak Maren Wochelwa * Zòn Pwoteje nan Resous Natirèl jere nan Twa Bè yo * Pak Maren Gonayiv / Gran Salin * Pak Maren Lilavach / Aken * Pak Maren Lagonav-Nò * Pak Maren Lagonav-Sid * Ti paradi * Penensil Mòl-Sen-Nikola == Zòn pwoteje ki soti nan inisyativ prive == === Haïti National Trust === * Pak Natirèl Granbwa <ref>{{Cite web|url=https://lenouvelliste.com/article/197710/une-premiere-reserve-naturelle-privee-voit-le-jour-en-haiti|title=Une première réserve naturelle privée voit le jour en Haïti|last=Patrick Saint-Pré|date=18 janvye 2019|website=lenouvelliste.com|access-date=}}</ref> === Pak Natirèl Kiskeya === Pak la sitiye nan koridò Biyolojik Karayib la (CBC) ki kouvri [[Chèn Lasèl]], Lak Azweyi, pak nasyonal Forè Pen ak Lavizit osi byen ke [[Masif dinò]] Santral la. Nan Repiblik Dominikèn, antite sa a pwolonje sou rezèv biyosfè Jaragua-Baworiko-Enriquillo ak Kodilè Santral nan zòn fwontyè a avèk Ayiti pandan ke nan [[Kiba]] li etabli sitou sou Sierra Maestra, Baracoa, Nipe ak Sagua. == Referans == {{referans}} == Lyen deyò == * [http://www.haititrust.org/ Haiti National Trust] * [https://parcnaturelquisqueya.com Pak Natirèl Kiskeya] {{Palèt Ayiti}} 1elr4hfzzgota3hzhj7onl1tc912rqr Pak nasyonal Grann Kolin 0 76614 855612 813246 2024-11-12T18:20:43Z InternetArchiveBot 25431 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 855612 wikitext text/x-wiki {{Coord|18|24|15|N|74|06|10|W|type:landmark_region:HT_dim:10000}} [[Fichye:Grand_Colline.jpg|right|thumb|400x400px|Forè ak foujè pyebwa jeyan nan Grann Kolin (S. Blair Hedges)]] '''Pak nasyonal Grann Kolin''' (an [[Lang franse|franse]] : Parc National Naturel de Grande Colline) se yon pak nasyonal ann [[Ayiti|Ayiti ki]] etabli 23 jiyè 2014 ak yon sifas 1.510 ekta.<ref name="LM">Le Moniteur, Journal Officiel de la Republique d’Haiti, No. 158, 21 August 2014</ref> Pak la gen chèn montay Grann Kolin (Chaîne de la Grande Colline) nan nwayo [[Masif Lawòt]] (Massif de la Hotte) nan sidwès Ayiti, nan lwès [[Pik Makaya]]. Gen senk (5) mòn yo rele : Mòn Debaryè (1843 m), Mòn Grann Kolin (2025 m), Mòn Pitit Kolin (1860 m), Mòn Grenouy (2006 m), ak Mòn Leza (1854 m). <ref name="HNT">{{Cite web|url=http://www.haititrust.org|title=Haiti National Trust|last=Haiti National Trust|access-date=2016-03-16}}</ref> [[Fichye:Grande_Colline_National_Park_topographic_map.jpg|droite|vignette|400x400px|Limit pak nasyonal Grann Kolin sou yon kat topografik Ayiti <ref name="HNT">{{Cite web|url=http://www.haititrust.org|title=Haiti National Trust|last=Haiti National Trust|access-date=2016-03-16}}</ref>]] [[Fichye:Grande_Colline_detail_topographic_map_.jpg|droite|vignette|400x400px|Kat topografik detaye pak nasyonal Grann Kolin ak pik li yo <ref name="HNT">{{Cite web|url=http://www.haititrust.org|title=Haiti National Trust|last=Haiti National Trust|access-date=2016-03-16}}</ref>]] Pak sa a se youn nan zòn ki pi lwen ak difisil pou rive an Ayiti. Li te eksplore pa fondatè yo nan Haiti National Trust la an 2011-2015, avèk asistans yon elikoptè ak sipòte pa Fondasyon an Syans Nasyonal ak kritik Ekosistèm Patenarya Fon . <ref name="HNT"/> <ref>{{Cite web|url=http://articles.philly.com/2011-09-13/news/30149741_1_rare-animals-frogs-forest|title=A search for rare animals before Haiti's forests - and the animals - disappear|website=articles.philly.com|access-date=2016-03-25|archive-date=2016-04-06|archive-url=https://web.archive.org/web/20160406054350/http://articles.philly.com/2011-09-13/news/30149741_1_rare-animals-frogs-forest|dead-url=yes}}</ref> Nouvo espès yo te dekouvri ak enfòmasyon ki kapab lakòz sou ekosistèm lan ak menas mennen nan kreyasyon pak nasyonal la nan lane 2014. == Biyodivèsite == Nan pak nasyonal, nou ap jwenn 20 espès krapo (kèk ladan yo se la sèlman nou ka wè yo), 17 espès reptil, plis 19 espès zwazo tou. Izole kanpe nan forè orijinal ki gen foujè pyebwa jeyan ak bwa di rete nan elevasyon ki anwo 1800 mèt, men debwazman kontinye nan pak la, pou materyèl bilding, agrikilti, ak pwodiksyon chabon. == Gade tou == * [[Lis zòn pwoteje ann Ayiti]] * Haiti National Trust == Referans == {{referans}} == Lyen deyò == * [https://web.archive.org/web/20210119054820/https://haititrust.org/pdf/Haiti_Calendar_2020.pdf kalandriye 2020] sou haititrust.org * [http://www.haititrust.org/grande-colline Pak nasyonal Grann Kolin] sou haititrust.org [[Kategori:Pak nasyonal]] [[Kategori:Pak nasyonal Ayiti]] mwxtkboxwjobcbvcym5b7n6gkc1lvlk Diskisyon Itilizatè:Dade70 3 82575 855573 833299 2024-11-12T13:53:40Z 105.113.65.124 855573 wikitext text/x-wiki {{byenveni}} --[[Itilizatè:Gilles2014|Gilles2014]] ([[Diskisyon Itilizatè:Gilles2014|discussion]]) 13 jen 2022 à 16:08 (UTC) :Mèsi ampil . [[Itilizatè:Dade70|Dade70]] ([[Diskisyon Itilizatè:Dade70|diskisyon]]) 13 oktòb 2022 à 17:11 (UTC) == mwa wikikreyolo == mwen wè li enpòtan poou tout moun ki pale kreyòl patisipe nan mwa wikikreyolo , yon mannyè pou nou valorize lang kreyòl Ayisyen patou nan mond nan. [[Itilizatè:Dade70|Dade70]] ([[Diskisyon Itilizatè:Dade70|diskisyon]]) 13 oktòb 2022 à 17:16 (UTC) :W sa w di a se sa {{thank you}} @[[Itilizatè:Dade70|Dade70]] [[Itilizatè:Kitanago|Kitanago]] ([[Diskisyon Itilizatè:Kitanago|diskisyon]]) 13 oktòb 2022 à 17:18 (UTC) == Administrasyon Wikipedya ayisyen == Tanpri li [[Wikipedya:Kafe#Administrasyon Wikipedya ayisyen]]. Ou elijib pou vote. Please see [[Wikipedya:Kafe#Administrasyon Wikipedya ayisyen]]. You are eligible to vote. [[Itilizatè:WhatamIdoing|WhatamIdoing]] ([[Diskisyon Itilizatè:WhatamIdoing|diskisyon]]) 23 novanm 2023 à 20:49 (UTC) Allah kabanini karkin karya dukanma wanini azalimi albarkaci madayancin da kadayanta tukafin kaQagidayanta Allah kanaganin azalumai burunsu Suga mundaina bautaka gakibamuda qarki toalla kaqarfafamu aqarfin dayaqarfafa aqarfin daqarfinka qqxmisxtdmffgemxjse35eewjpnsvzd Modèl:Infobox en Lua 10 86182 855574 844698 2024-11-12T13:54:27Z BwaKajou 31668 855574 wikitext text/x-wiki <includeonly><!-- Catégorisation -->{{#if:{{{nocat|}}}||{{#ifeq:{{NAMESPACE}}|{{ns:0}}|{{#if:{{{1|}}}|[[Kategori:Atik ki itilize infobox en Lua {{{1|}}}]]|[[Kategori:Atik ki itilize infobox en Lua]]}}[[Kategori:Atik ki itilize yon infobox]]|}}}}</includeonly><noinclude>{{Documentation|contenu= <templatedata> { "params": { "1": { "description": "Nom du module en Lua.", "example": "Musée", "type": "string" }, "nocat": { "description": "Permet de ne pas catégoriser les articles.", "example": "oui", "type": "string" } }, "description": "Modèle permettant de catégoriser les articles utilisant une infobox en Lua." } </templatedata> {{kategorize|Kategori:Atik ki itilize infobox en Lua|sauf s'il existe une catégorie de la forme « Article utilisant l'infobox <1> »}} == Exemple == <pre>{{Infobox en Lua|Mize}}</pre> }} [[Kategori:Modèl infobox Lua| ]] </noinclude> p60wyz4jwrgsoqutxecw4bb267ecejs 855581 855574 2024-11-12T15:14:04Z BwaKajou 31668 855581 wikitext text/x-wiki <includeonly><!-- Catégorisation --> <templateStyles src="Modèl:Common/Style.css" /> {{#if:{{{nocat|}}}||{{#ifeq:{{NAMESPACE}}|{{ns:0}}|{{#if:{{{1|}}}|[[Kategori:Atik ki itilize infobox en Lua {{{1|}}}]]|[[Kategori:Atik ki itilize infobox en Lua]]}}[[Kategori:Atik ki itilize yon infobox]]|}}}}</includeonly><noinclude>{{Documentation|contenu= <templatedata> { "params": { "1": { "description": "Nom du module en Lua.", "example": "Musée", "type": "string" }, "nocat": { "description": "Permet de ne pas catégoriser les articles.", "example": "oui", "type": "string" } }, "description": "Modèle permettant de catégoriser les articles utilisant une infobox en Lua." } </templatedata> {{kategorize|Kategori:Atik ki itilize infobox en Lua|sauf s'il existe une catégorie de la forme « Article utilisant l'infobox <1> »}} == Exemple == <pre>{{Infobox en Lua|Mize}}</pre> }} [[Kategori:Modèl infobox Lua| ]] </noinclude> oxjt3bhj42schoewy5jmnfaafp4n9ks Module:Infobox/Titre 828 86340 855624 814781 2024-11-12T22:48:54Z BwaKajou 31668 855624 Scribunto text/plain local p = {} local trim = require( 'Module:Outils' ).trim local _moduleYesno local function yesno( ... ) if not _moduleYesno then _moduleYesno = require( 'Module:Yesno' ) end return _moduleYesno( ... ) end function p.templatestyles( pictogramme ) pictogramme = trim( pictogramme ) if not pictogramme then return '' end pictogramme = pictogramme :gsub( '^entete +', '' ) :gsub( '^entete$', '' ) :gsub( ' +entete$', '' ) :gsub( ' +entete +', ' ' ) if pictogramme ~= '' and pictogramme ~= 'defaut' then if pictogramme:match( '%s' ) then return '[[Kategori:Infobox avèk plizyè klass]]' else return mw.getCurrentFrame():extensionTag( 'templatestyles', '', { src = 'Infobox/Pictogramme/' .. pictogramme .. '.css' } ) end end return '' end function p.couleurs( background, color ) local couleur = require( 'Module:Dièse couleur web' ).couleur background = trim( background ) or '#E1E1E1' color = trim( color ) or 'black' return 'background-color:' .. couleur( background ) .. ';' .. 'color:' .. couleur( color ) .. ';' end function p.V2( frame ) local args = frame.getParent and frame:getParent().args or frame local colspan = trim( args[ 5 ] ) or '2' local texte = trim( args[ 1 ] ) or mw.title.getCurrentTitle().text local classes = trim( args[ 3 ] ) or 'defaut' local lang = args[ 'lang' ] or '' local italic = args[ 'italic' ] or '' local setDisplayTitle = args[ 'setdisplaytitle' ] or '' if lang ~= '' then local langueFunction = require( 'Module:Langue' ).langue texte = langueFunction( { lang, texte } ) end if italic ~= '' and yesno( italic ) then classes = classes .. ' italique' end local displayTitleEval = '' if setDisplayTitle ~= '' and yesno( setDisplayTitle ) then local setDisplayTitleFunction = require( 'Module:Formatage du titre' ).setDisplayTitle displayTitleEval = setDisplayTitleFunction( { args = { lang = lang, italic = italic, options = 'noreplace' } } ) end return 'colspan="' .. colspan .. '" ' .. 'class="entete ' .. classes .. '" ' .. 'style="' .. p.couleurs( args[ 2 ], args[ 4 ] ) .. '" ' .. ' | ' .. texte .. p.templatestyles( args[ 3 ] ) .. displayTitleEval end return p ndd8mklpto1mxa3uj5sau06myaetv5k Modèl:Infobox Biographie/Pied 10 87001 855559 820353 2024-11-12T13:00:09Z BwaKajou 31668 855559 wikitext text/x-wiki <includeonly><!-- NOTES -->{{#if:{{{nòt|}}}| {{Infobox V3/Titre Bloc|background=#{{#invoke:Chartes|charte|infobox=biographie|type={{{charte|}}}|catégorie=secondaire}}|text=Compléments}} <div style="font-size: 90%;"> {{{nòt|}}} </div> }}<!-- SIGNATURE -->{{#if:{{{siyati|}}}| {{Infobox V3/Séparateur|height=1|background=#{{#invoke:Chartes|charte|infobox=biographie|type={{{charte|}}}|catégorie=secondaire}} }} {{Infobox V3/Imaj|imaj={{{siyati|}}}|upright=0.75|alt=Siyati {{{non|{{PAGENAME}}}}}}} }}<!-- EMBLEME -->{{#if:{{{anblèm|}}}| {{Infobox V3/Séparateur|height=1|background=#{{#invoke:Chartes|charte|infobox=biographie|type={{{charte|}}}|catégorie=secondaire}} }} {{Infobox V3/Imaj|imaj={{{anblèm|}}}|lejand={{{lejand anblèm|}}}|upright=0.6 }} }} {{Infobox V3/Fin|Modèl:Infobox {{non vide|{{{modèl|}}}|Biyografi}}|border-color=#{{#invoke:Chartes|charte|infobox=biographie|type={{{charte|}}}|catégorie=secondaire}} }}</includeonly><noinclude>{{Documentation}}</noinclude> 19p6lobuwgbow90eyyg4ol3r3oo6c9c Modèl:Kategori antretyen pou vide 10 87682 855638 839767 2024-11-12T23:32:49Z BwaKajou 31668 855638 wikitext text/x-wiki <includeonly>{{Icône de titre|id=kategori-pou-vide|lyen=:Kategori:kategori pou vide|tèks=Tout kategori pou vide yo.|imaj=Gnome-fs-regular.svg}} {{Kategori pou antretyen|{{{1|}}}}} {{Méta bandeau d'avertissement | niveau = modéré | icône = Sheet icon.svg | titre = Kategori sa dwe {{#if: {{{delta sous-catégories|}}} {{{delta pages|}}} {{{delta|}}} | gen ladan l sèlman {{Kategori antretyen pou vide/affiche delta |delta sous-catégories={{{delta sous-catégories|}}} |delta pages={{{delta pages|}}} |delta={{{delta|}}} }} | vide }}. | texte = Sa ki ladan l yo kreye ak [[:Kategori:Modèl ki klase nan kategori|modèl ki klase nan kategori]] paj ki chaje ak pwoblèm yo: {{#if: {{{delta sous-catégories|}}} {{{delta pages|}}} {{{delta|}}} |* si gen ladan l plis {{Kategori antretyen pou vide/affiche delta |delta sous-catégories={{{delta sous-catégories|}}} |delta pages={{{delta pages|}}} |delta={{{delta|}}} }}, fè entèvasyon sou paj li montre yo pou vide li. | * si li pa vid, fè entèvasyon sou paj li montre yo pou vide li; * si li vid, pa efase li menm si li parèt pami[[Espesyal:KategoriPaItilize| Kategori ki pa itilize yo]]. }}}}</div><includeonly>{{#if: {{{nocat|}}} | | {{#ifeq: {{PAGESINCATEGORY:{{#titleparts:/{{NOMPAGE}}|2|2}}}} | {{Kategori antretyen pou vide/total delta |delta sous-catégories={{{delta sous-catégories|}}} |delta pages={{{delta pages|}}} |delta={{{delta|}}} }} | [[Kategori: Kategori pou antretyen vid ]] | [[Kategori:Kategori pou vide]]{{{kategori espesyal|}}} }} }}{{Kategori ki kapab vid}}</includeonly><noinclude> {{Documentation}} </noinclude> ki6emknutix0516yfmej4gd669yummt Modèl:Kategori pou antretyen 10 87683 855639 835189 2024-11-12T23:33:14Z BwaKajou 31668 855639 wikitext text/x-wiki <includeonly>{{Méta bandeau d'avertissement |icône={{{icône|Circle-icons-tools.svg}}} |niveau=information |titre={{{titre|Kategori sa la pou fè antretyen pou Wikipedya.}}} |texte={{{texte|[[Èd:Kategori|Kategori]] sa a pa fè pati [[Èd:Espas Ansiklopedik|espas ansiklopedik]] Wikipedya a, paj li montre yo pa [[Èd:Jagon Wikipedya#Atik|atik ansiklopedi]] oswa yo ka òganize pa kritè (eta avansman, kantite lyen {{elatriye}}) olye de tit. {{ #if: {{{racine|}}} | <br/>Kategori sa a se youn nan kategori rasin yo, kidonk li ta dwe genyen sèlman sou-kategori e petèt kèk paj ki asosye e ki pa ansiklopedik. }}}}} |supplément={{{1|}}} }}</div></includeonly><noinclude><!-- Pou limite kantite chanjman nan paj sa a, tanpri mete a meta-enfòmasyon (kategori, entèwiki) konsènan modèl sa a nan yon <includeonly> seksyon sou paj dokimantasyon li yo, olye ke isit la. -->{{Documentation}} </noinclude> bs9djbii1yv7ffyv0gqwvndz815ge27 Modèl:Kategorize pa 10 87687 855644 839770 2024-11-13T00:17:39Z BwaKajou 31668 855644 wikitext text/x-wiki {{#if: {{{1|}}} | {{Icône de titre | id = kategorize-pa-{{PAGEID:Modèl:{{{1}}}}} | imaj = Template-info.svg | taille = 32 | lyen = Modèl:{{{1}}} | tèks = Kategori sa a ranpli otomatikman ak itilizasyon modèl &#123;&#123;{{trim|{{{1}}}}}&#125;&#125;<!-- -->{{#if: {{{2|}}} | &#32;({{{2}}}) }}<!-- -->. }}<!-- -->{{#if: {{{note|}}} | Kategori sa a ranpli otomatikman ak itilizasyon modèl {{M|{{trim|{{{1}}}}}}}<!-- -->{{#if: {{{2|}}} | &#32;({{{2}}}) }}<!-- -->. }} | <span class="error">Erreur de paramétrage de {{M|Kategorize pa|2=''non modèl la''}} : non modèl la(paramètre <code>'''1'''</code>) obligatwa.</span><!-- -->{{#ifeq: {{NAMESPACE}} | Kategori | [[Kategori:Paj ki itilize modèl ak sentaks ki pa kòrèk||Kategorize pa]] }} }}</div><!-- --></includeonly><noinclude><!-- Pour limiter le nombre de changements de cette page merci de placer les métadonnées (catégories, interwikis) concernant ce modèle dans une section <includeonly> de sa sous-page de documentation, plutôt qu'ici. -->{{Documentation}}</noinclude> bsbj24u7uos0src9itvjf04jnrwbxmy 855645 855644 2024-11-13T00:17:56Z BwaKajou 31668 855645 wikitext text/x-wiki <includeonly>{{#if: {{{1|}}} | {{Icône de titre | id = kategorize-pa-{{PAGEID:Modèl:{{{1}}}}} | imaj = Template-info.svg | taille = 32 | lyen = Modèl:{{{1}}} | tèks = Kategori sa a ranpli otomatikman ak itilizasyon modèl &#123;&#123;{{trim|{{{1}}}}}&#125;&#125;<!-- -->{{#if: {{{2|}}} | &#32;({{{2}}}) }}<!-- -->. }}<!-- -->{{#if: {{{note|}}} | Kategori sa a ranpli otomatikman ak itilizasyon modèl {{M|{{trim|{{{1}}}}}}}<!-- -->{{#if: {{{2|}}} | &#32;({{{2}}}) }}<!-- -->. }} | <span class="error">Erreur de paramétrage de {{M|Kategorize pa|2=''non modèl la''}} : non modèl la(paramètre <code>'''1'''</code>) obligatwa.</span><!-- -->{{#ifeq: {{NAMESPACE}} | Kategori | [[Kategori:Paj ki itilize modèl ak sentaks ki pa kòrèk||Kategorize pa]] }} }}</div><!-- --></includeonly><noinclude><!-- Pour limiter le nombre de changements de cette page merci de placer les métadonnées (catégories, interwikis) concernant ce modèle dans une section <includeonly> de sa sous-page de documentation, plutôt qu'ici. -->{{Documentation}}</noinclude> 76aogln5vnhud6nixycz20zxbwzd9tl Module:Infobox/Fonctions/Personne 828 87759 855613 825262 2024-11-12T18:29:58Z BwaKajou 31668 855613 Scribunto text/plain --[[ Avant de mettre en production une nouvelle version avez-vous : - mis en place des tests dans au moins une des pages de test d'un des modèles utilisant la fonction ? - testé avec la version bac à sable ? - modifié la documentation ? ]] -- Functions utilisées par les infobox personnes local p = {} local localdata = require 'Module:Infobox/Localdata' local item = localdata.item local wikidata = require 'Module:Wikidata' local general = require 'Module:Infobox/Fonctions' local datemodule = require 'Module:Date' local complexdate = require 'Module:Date complexe' local linguistic = require 'Module:Linguistique' local militaryranks = require 'Module:Dictionnaire Wikidata/Grades militaires' local ppath = require 'Module:Wikidata/Chemin' local noble = require 'Module:Noble' -- == Accord en genre local gender = wikidata.getgender(item) -- genre de la personne dont c'est l'infobox -- Version locale de wikidata.genderedlabel où si le genre n'est pas indiqué, c'est celui de la personne dont c'est l'infobox local function genderedlabel(id, labelgender) if not labelgender then labelgender = gender end return wikidata.genderedlabel(id, labelgender) end -- === Gestion des dates -- Liens thématiques vers les dates local datelinks = { -- lien vers le domaine d'activité approprié Q483501 = 'en arts plastiques', -- artiste Q1028181 = 'en arts plastiques', -- peintre Q1281618 = 'en arts plastiques', -- sculpteur Q2309784 = 'en cyclisme', -- cycliste Q16947657 = 'en arts plastiques', -- lithographe Q11569986 = 'en arts plastiques', -- graveur Q13365770 = 'en arts plastiques', -- graveur sur cuivre Q21925567 = 'en arts plastiques', -- sérigraphe Q10862983 = 'en arts plastiques', -- aquafortiste Q36180 = 'en littérature', -- écrivain } local function getdatetopic() -- obtient le lien le plus approprié pour une date en fonction de la profession local claims = wikidata.stringTable{entity = item, property = 'P106', excludespecial = true, displayformat = 'raw'} if not claims then return nil end for i, j in pairs(claims) do if datelinks[j] then return datelinks[j] end end end local linktopic = getdatetopic() local unknowndatelabel = 'date inconnue' local birthdate = localdata['naissance'] or localdata['date de naissance'] or wikidata.formatAndCat{ entity = item, property = 'P569', unknownlabel = unknowndatelabel, conjtype = 'or', sorttype = 'chronological', removedupesdate = 'cat', minprecision = 8, --précision minimale pour être affichée : décennie } local dead = wikidata.getClaims{entity = item, property = 'P570'} --utilisé comme booléen qui dit si une personne est morte pour modifier certaines élément d'affichage local stillvalid if dead then stillvalid = "?" -- permet de remplacer des "depuis" par des "à partir de" end local deathdate = localdata['décès'] or localdata['date de décès'] local wddeathdate = wikidata.formatAndCat{ entity = item, property = 'P570', unknownlabel = unknowndatelabel, conjtype = 'or', sorttype = 'chronological', removedupesdate = 'cat', minprecision = 8, } local disappeardate = localdata['disparition'] local wddisappeardate = wikidata.formatAndCat{ entity = item, property = 'P746', unknownlabel = unknowndatelabel, conjtype = 'or', sorttype = 'chronological', removedupesdate = 'cat', showqualifiers = 'P276', minprecision = 8, } local function format1(event, period, predecessor, together, successor, displayformat) local mainstr = event if predecessor then local s = 'précédé par ' .. predecessor if gender == 'f' then s = 'précédée par ' .. predecessor end mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>' end if together then local s = 'avec ' .. together mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>' end if successor then local s = 'suivi par ' .. successor if gender == 'f' then s = 'suivie par ' .. successor end mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>' end return {type = 'row', label = period or '', value = function() return mainstr end} end ----------------- local function format2(event, period, predecessor, together, successor, displayformat) if (not event) then return nil end local rows = {} local eventrow = {type = 'row1col', color = 'secondcolor', value = event } table.insert(rows, eventrow) if period then period = '<span style="font-weight:normal">' .. period .. '</span>' local periodrow = {type = 'row1col', color = '#F9F9F9', value = period } table.insert(rows, periodrow) end if predecessor then local prederow = {type = 'row', label = 'Prédécesseur', value = function() return predecessor end} table.insert(rows, prederow) end if together then local succrow = {type = 'row', label = 'Avec', value = function() return together end} table.insert(rows, succrow) end if successor then local succrow = {type = 'row', label = 'Successeur', value = function() return successor end} table.insert(rows, succrow) end return {type = 'multi', rows = rows} end local function format3(event, period, predecessor, together, successor, displayformat, details) if details then details = '<span style="font-weight:normal">' .. details .. '</span>' event = linguistic.conj({event, details}, 'new line') end local mainrow = {type = 'row1col', color = 'secondcolor', value = event } if period then period = '<span style="font-weight:normal">' .. period .. '</span>' end local periodrow = {type = 'row1col', color = '#F9F9F9', value = period } local successionrow = { style = {['background-color'] = '#F9F9F9', ['padding-bottom'] = '2%'}, type = 'navigator', inner = true, previousval = function() return predecessor end, nextval = function() return successor end, } return {type = 'multi', rows = {mainrow, periodrow, successionrow}} end local function timeline(localparam, wdconf, timelineformat, title, singtitle, details) -- affiche date : événement (suppose les événements déjà triés) local rows = {} local function returnTable() return { type = 'table', title = title, rows = rows } end -- avec données locales local val = localdata[localparam] if val == '-' then return nil elseif val then table.insert(rows, {type = 'row1col', color = 'secondcolor', value = val}) return returnTable() end -- avec données wikidata if not wdconf then return nil end wdconf.entity = wdconf.entity or item wdconf.sorttype = wdconf.sorttype or 'chronological' wdconf.labelformat = wdconf.labelformat or genderedlabel wdconf.linktopic = wdconf.linktopic or '-' local statements = wikidata.getClaims(wdconf) if not statements then return nil end if #statements == 1 then title = singtitle end local displayformats = { A = format1, B = format2, C = format3, } local applyformat = displayformats[timelineformat] or displayformats['A'] rows = {} for i, statement in pairs(statements) do local event = linguistic.ucfirst(wikidata.formatStatement(statement, wdconf)) local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'}, {labelformat2 = noble.labelInfobox}) local together = wikidata.getFormattedQualifiers(statement, {'P1706', ''}, {labelformat2 = noble.labelInfobox}) local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'}, {labelformat2 = noble.labelInfobox}) local period = wikidata.getFormattedDate(statement, {linktopic = wdconf.linktopic, stilltrue = stillvalid } ) -- dont pass all wdconf or else qualifiers will show up local detailstr if type(details) == 'function' then detailstr = details(statement) end local row = applyformat(event, period, predecessor, together, successor, wdconf, detailstr) if row then table.insert(rows, row) end end table.insert(rows, {type = 'external text', value = function() return wikidata.addTrackingCat(wdconf.property) end}) return returnTable() end local function dateandplace(thedate, theplace) if thedate and theplace and mw.ustring.find(thedate, 'inconnu') and mw.ustring.find(theplace, 'inconnu') then theplace = nil thedate = mw.ustring.gsub(thedate, linguistic.ucfirst(unknowndatelabel), 'Date et lieu inconnus') end return linguistic.conj({thedate, theplace}, 'new line') end --Titre function p.title(icon, style) local title = general.title(icon, style) title.value = function() return localdata['nom'] or localdata['association_nom'] or localdata['nom_think'] or localdata['acronymelaboratoire'] or localdata['titre'] or wikidata.getLabel(localdata.item) and noble.labelInfobox( mw.language.getContentLanguage():ucfirst( wikidata.getLabel(localdata.item) ) ) or noble.labelInfobox( mw.title.getCurrentTitle().text ) end return title end --Image function p.mainimage(cat) -- demande d'illustration que si la personne est née ou morte après 1900, sinon c'est souvent impossible à trouver local defaultimage = 'Defaut 2.svg' local age = wikidata.stringTable{property = 'P569,P570', entity = item, displayformat = 'raw', excludespecial = true} if age and age[1] then local pattern = '(%W)(%d+)%-(%d+)%-(%d+)' local era, year = age[1]:match(pattern) if (era == '-') or (tonumber(year)) < 1900 then defaultimage = nil end end return general.mainimage({cat = cat or 'Article à illustrer Biographie', altparameter = 'alt'}, defaultimage) end -- Noms function p.othernames() local names = { {'P1477', 'Nom de naissance', 'Noms de naissance', 'nom de naissance'}, {'P1448', 'Nom officiel', 'Noms officiels', 'nom officiel'}, {'P1449', 'Surnom', 'Surnoms', 'surnom'}, {'P2001', 'Romanisation révisée', 'Romanisation révisée', 'romanisation révisée'}, {'P1942', 'McCune-Reischauer', 'McCune-Reischauer', 'McCune-Reischauer'}, {'P742', 'Pseudonyme', 'Pseudonymes', 'pseudonyme'}, {'P1782', 'Prénom social', 'Prénoms sociaux', 'prénom social'}, {'P1786', 'Nom posthume', 'Noms posthumes', 'nom posthume'}, {'P1785', 'Nom de temple', 'Noms de temple', 'nom de temple'}, {'P1787', 'Nom de pinceau', 'Noms de pinceau', 'nom de pinceau'}, {'P1813', 'Nom court', 'Noms courts', 'nom court'}, {nil, 'Autres noms', 'Autres noms', 'autres noms'}, } local nativelangnamerow = { -- un peu particulier, donc à part type = 'row', wikidata = function() local s = wikidata.formatAndCat{entity = item, property = 'P1559', showqualifiers = 'P1721', conjtype = 'or'} if (not s) then return nil end -- regarde si le nom de la valeur ressemble au libellé (en tenant compte de la pollution des marqueures de langue local label = mw.ustring.lower(wikidata.getLabel(item) or '') local useless if mw.ustring.find(mw.ustring.lower(s), mw.ustring.lower(label), 1, true) then useless = true end if wikidata.formatStatements{entity = item, property = 'P1559'} == wikidata.formatStatements{entity = item, property = 'P1477'} then useless = true --inutile si duplique le "nom de naissance" end if useless then return nil end return s end, label = 'Nom dans la langue maternelle', plurallabel = 'Noms dans la langue maternelle', value = 'nom dans la langue maternelle', } local rows = {type = 'multi', rows = {nativelangnamerow}} for i, j in pairs(names) do local query if j[1] and not localdata['autres noms'] then -- lorsqu'il y a un paramètre "autres noms", Wikidata est désactivée pour éviter risques de doublon query = {property = j[1], showqualifiers = {'P1721'}, conjtype = 'comma'} end table.insert(rows.rows, {type = 'row', value = j[4], wikidata = query, label = j[2], plurallabel = j[3]}) end return rows end -- NAISSANCE ET MORT function p.birth() -- date de naissance en première ligne, lieu de naissance en deuxième return { type = 'row', label = 'Naissance', value = function() local thedate = datemodule.dateInfobox{args = {[1] = 'naissance', [2] = birthdate or '', [3] = deathdate or wddeathdate or disappeardate or wddisappeardate or '', qualificatif = linktopic}} local theplace = localdata['lieu de naissance'] or wikidata.formatAndCat({entity =item, -- affichage du nom du lieu de naissance en vigueur à la date de naissance property= 'P19', rank = 'best', labelformat = function(val) return wikidata.getLabel(val) end, conjtype= ' ou ', defaultlinkquery = {property = {'P361'}}, -- liens par défaut : "partie de", unknownlabel = "lieu inconnu", showqualifiers = {'P131', 'P17'}, qualifconjtype = 'comma' } ) return dateandplace(thedate, theplace) end } end function p.death() -- même fonctionnement que la fonction p.birth -- date de disparition local ldisappeardate = disappeardate if (not ldisappeardate ) and (not deathdate) then -- récupérée de Wikidata seulement si la date de décès n'est pas fournie en locale ldisappeardate = wddisappeardate end if ldisappeardate and birthdate then ldisappeardate = datemodule.dateInfobox{args = {[1] = 'événement', [2] = birthdate or '', [3] = ldisappeardate or '', qualificatif = linktopic, unknownlabel = 'date inconnue'}} end -- date de décès local ddate = deathdate --déclarée pour l'ensemble du module if (not ddate) and (not ldisappeardate) then deathdate = wddeathdate -- récupérée de Wikidata seulement si la date de disparition n'est pas fournie en locale end local thedate = datemodule.dateInfobox{args = {[1] = 'mort', [2] = birthdate or '', [3] = deathdate or '', qualificatif = linktopic, unknownlabel = 'date inconnue'}} local theplace = localdata['lieu de décès'] or wikidata.formatAndCat{entity =item, property= 'P20', rank = 'best', -- affichage du nom du lieu de décès en vigueur à la date de décès labelformat = function(val) return wikidata.getLabel(val) end, conjtype= ' ou ', defaultlinkquery = {property = {'P361'}}, -- liens par défaut : "partie de", unknownlabel = "lieu inconnu", showqualifiers = {'P131', 'P17'}, qualifconjtype = 'comma' } local val = dateandplace(thedate, theplace) return {type = 'multi', rows = { { -- disparition type = 'row', label = 'Disparition', value = function() return ldisappeardate end }, { -- décès type = 'row', label = 'Décès', value = function() return val end, } }} end function p.floruit() return { type = 'row', label = "Période d'activité", value = "période d'activité", wikidata = function() local startDate = wikidata.formatAndCat{entity = item, property = 'P2031', conjtype = 'or', sorttype = 'chronological', linkback = '-'} local endDate = wikidata.formatAndCat{entity = item, property = 'P2032', conjtype = 'or', sorttype = 'chronological'} if not (startDate or endDate) then return wikidata.formatAndCat{entity = item, property = 'P1317', conjtype = 'or', sorttype = 'chronological'} end if startDate and not endDate then startDate = wikidata.formatAndCat{entity = item, property = 'P2031', conjtype = 'or', sorttype = 'chronological'} end return complexdate.daterange(startDate, endDate, {precision = 11, stilltrue = stillvalid}) end } end function p.placeofburial() return {type = 'row', label = 'Sépulture', value = 'sépulture', wikidata = {property = "P119", showdate = true, novaluelabel = 'aucune'}} end function table.slice(tbl, first, last, step) local sliced = {} for i = first or 1, last or #tbl, step or 1 do sliced[#sliced+1] = tbl[i] end return sliced end -- function that creates a filter function -- if the main country "base_country_item" is (replaced by)+ -- the subsequent statement main value that the function will receive as a parameter -- then the created function will return true for this statement to be filtered out local function filter_replaces_builder(base_country_item) -- P1365 = remplace -- P1366 = remplacé par local replaced_query = {property = 'P1365'} return function(may_be_replacing_stmt) local may_be_replacing_item = wikidata.getMainId(may_be_replacing_stmt) local replaces = wikidata.inTransitiveVals(may_be_replacing_item, base_country_item, replaced_query) return not(wikidata.inTransitiveVals(may_be_replacing_item, base_country_item, replaced_query)) end end -- filter parameterized by each of the values of the claims, in the order -- « filter_function_builder » will be called by all the values (remaining after filtering) in « claims » -- to filter the rest of the claims, starting from the first one in the list. local function iterated_filter(claims, filter_function_builder) -- the first country in the list, if any of the following value replaces this one -- we remove them. So we split the list local first_country_claim = claims[1] local to_test = table.slice(claims, 2, #claims) if #to_test > 0 then -- building the filter function with the first country as base value -- (a closure) local condition = filter_function_builder(wikidata.getMainId(first_country_claim)) -- keeping the number of values before the filter local nb_before = #to_test to_test = wikidata.filterClaims(to_test, {condition = condition}) or {} local nb_after = #to_test -- if some country was filtered out, we remove the dates of the main statement to avoid showing incomplete dates if (nb_before ~= nb_after and first_country_claim.qualifiers) then first_country_claim.qualifiers["P580"] = nil first_country_claim.qualifiers["P582"] = nil end -- if there still exists candidate countries, filter them recursively if #to_test > 0 then to_test = iterated_filter(to_test, filter_function_builder) end -- reconstruct the list of statement by readding our first country to the filtered list to_test = to_test or {} table.insert(to_test, 1, first_country_claim) return to_test end -- if there were nothing to filter, just return the first statement return {first_country_claim} end function p.nationality() local cmp = wikidata.compare -- à améliorer étant donnée les mœurs Wikidata comme nationalité : Empire allemand (1901-1918) République de Weimar (1918-1933) local function wdDate() local nation = require 'Module:Country data'.nationality -- désactivation si date de naissance avant l'Ère contemporaine : trop d'imprécisions et d'anachronismes local mindate = '1789' local birthdate = wikidata.formatStatements{entity = item, property = 'P569', displayformat = 'raw', numval = 1} local deathdate = wikidata.formatStatements{entity = item, property = 'P570', displayformat = 'raw', numval = 1} if ((not birthdate) or complexdate.before(mindate, birthdate)) and ((not deathdate) or complexdate.before(mindate, deathdate)) then return nil end -- preprocessing the "P27" statements -- if there is statements about a country that changed its regime, like France before and after the french Revolution -- then we just want to show "France" and not "France and France" because there is two statement (or worse) -- so we take advantage of the fact that the French Kingdom was "replaced by" French Republic (P1366) -- to detect and filter out such «redundant» values -- (we also remove the begin/end dates of statements in such cases to avoid wrong dating) local statements = wikidata.getClaims{entity = item, property = 'P27', rank='best', excludespecial=true} or {} -- sort nationality statements by statement dates or regime creation date if statement is not dated local sort_by_statement_or_regime = wikidata.chrono_key_sort{ sort_key="RegimeKey", -- use another key than « chronosort » snak_key_get_function = ppath.snak_key_by_paths{">P580","P571"}, --[[ either by « begin date » qualifier or « inception » of the nationality if the statement is not dated ]] key_compare_function = cmp.rev(function(v1, v2) return v1 < v2 end) -- sort in reverse chronological order to remove all values the first nationalities replaces } -- ordering statement by dates so that we can test only "A replaces B" and not "B replaces A" because A is an older regime than B statements = sort_by_statement_or_regime(statements) -- actual statement filtering statements = iterated_filter(statements, filter_replaces_builder) -- re-sorting in chronological ordering statements = wikidata.sortClaims(statements, cmp.chronoCompare) return { property = 'P27', claims = statements, -- our filtered statement as claims instead of the regular query showdate = true, entity = item, conjtype = 'new line', removedupes = true, linktopic = '-', sorttype = 'chronological', ucfirst = '-', stilltrue = not dead, displayformat = function(snak) -- local g = gender -- genre de la personne, pour affichage du gentilé -- if g == '?' then -- si inconnu, au masculin -- g = 'm' -- end local val, success = nation(wikidata.getId(snak), 'f') -- au féminin pour accorder au mot nationalité if not success then val = wikidata.formatSnak(snak) end return val end } end return { type = 'row', label = 'Nationalité', plurallabel = 'Nationalités', value = 'nationalité', wikidata = wdDate() -- wdDate() retourne une table } end function p.nativelanguage() return {type = 'row', label = 'Langue maternelle', value = 'langue maternelle', property = 'P103'} end function p.writinglanguage() return {type = 'row', label = "Langue d\'écriture", value = 'langue d\'écriture', plurallabel = "Langues d\'écriture" , wikidata = {property = 'P6886' , expl = true}} end -- Domiciles function p.places() return {type = 'multi', rows = { { type = 'row', label = 'Dème', plurallabel = 'Dèmes', value = 'dème', wikidata = {property = 'P2462', showdate = true, sorttype= 'chronological', stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Domicile', plurallabel = 'Domiciles', value = 'domicile', wikidata = {property = 'P551', showdate = true, sorttype= 'chronological', stilltrue = not dead, precision = 'year'}, }, }} end -- parcours professionel function p.education() local query = {sorttype= 'chronological', property = 'P69', showdate = true, stilltrue = '?', showqualifiers = 'P512', conjtype = 'new line', linktopic = '-'} return { type = 'row', value = {'éducation', 'formation'}, wikidata = query, label = 'Formation', } end function p.occupation() local speciallabels = { f = { ['Q33999'] = '[[Acteur|actrice]]', ['Q10798782'] = '[[Acteur|actrice]]', ['Q10800557'] = '[[Acteur|actrice]]', ['Q2405480'] = '[[Acteur|actrice]]', ['Q2259451'] = '[[Acteur|actrice]]', ['Q948329'] = '[[Acteur|actrice]]' }, m = { ['Q33999'] = '[[acteur]]', ['Q10798782'] = '[[acteur]]', ['Q10800557'] = '[[acteur]]', ['Q10798782'] = '[[acteur]]', ['Q2405480'] = '[[acteur]]', ['Q2259451'] = '[[acteur]]', ['Q948329'] = '[[acteur]]' } } return { type = 'row', value = {'activité', 'activités'}, wikidata = { property = 'P106', defaultlink = '-', defaultlinkquery = {property = {'P425','P1056'}}, labelformat = genderedlabel, speciallabels = speciallabels[gender] or speciallabels['m'], removedupes = true, showdate = true, sorttype = 'chronological', stilltrue = not dead, excludevalues = { -- les occupations qui ne méritent pas d'être affichées 'Q482980', -- auteur 'Q15980158', --"auteur de non-fiction" 'Q12144794', --prosateur 'Q18814623', -- autobiographe 'Q1209498', -- juriste-poète 'Q1097498', -- "dirigeant" 'Q2478141', -- aristocrate 'Q116', -- monarque 'Q115088092', -- participant à un forum international } }, label = 'Activité', plurallabel = 'Activités' } end function p.haswrittenfor() local valueStyle = {} valueStyle['font-style'] = 'italic' return {type = 'row', label = function(localdata, item) if gender == 'f' then return 'Rédactrice à' else return 'Rédacteur à' end end, value = 'rédacteur à', wikidata = {property = "P6872", showdate = true}, valueStyle = valueStyle} end function p.employer() return { type = 'row', value = 'employeur', wikidata = {property = 'P108', showdate = true, linktopic = '-', sorttype= 'inverted', stilltrue = not dead, conjtype = 'new line'}, label = function() return localdata['intitulé employeur'] or 'A travaillé pour' end, } end function p.victories() local title, singtitle = 'Victoires', 'Victoire' local localparam = 'victoire' local wdconf = {property = 'P2522'} local displayformat = 'B' return timeline(localparam, wdconf, displayformat, title, singtitle) end function p.officialposition() local title, singtitle = 'Fonctions', 'Fonction' local localparam = 'fonction' local wdconf = { property = 'P39', rank = 'valid', sorttype = 'inverted', defaultlinkquery = {property = {'P2354', 'P2389', 'P453', 'P361', 'P108', 'P276', 'P1001'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de", "partie de", employeur, ressort territorial } -- sur une ligne séparée : gouvernement, législature, juridiction, "de", circonsription, diocèse, affiliation, assemblée, parti, employeur local details = function(statement) return wikidata.getFormattedQualifiers(statement, {'P5054', 'P2937', 'P1001', 'P642', 'P2389', 'P768', 'P708', 'P1416', 'P194', 'P108', 'P937' , 'P1268'}, {conjtype = 'new line'}) end local displayformat = 'C' return timeline(localparam, wdconf, displayformat, title, singtitle, details) end function p.specialrole() local localparam = 'statut notable' local wdconf = { property = 'P2868', rank = 'valid', sorttype = 'inverted', targetsuperclass = 'Q254917', defaultlinkquery = {property = {'P2354'}}, -- lien par défaut : liste d'éléments } local displayformat = 'C' return timeline(localparam, wdconf, displayformat) end function p.nobilitytitle() local title, singtitle = 'Titres de noblesse', 'Titre de noblesse' local localparam = 'titre de noblesse' local wdconf = { property = 'P97', entity = item, rank = 'valid', showqualifiers = {'P642'}, defaultlinkquery = {property = {'P2354', 'P361'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de" et "partie de" } local displayformat = 'B' return timeline(localparam, wdconf, displayformat, title, singtitle) end function p.honorifictitle() local title, singtitle = 'Titres honorifiques', 'Titre honorifique' local localparam = 'titre honorifique' local wdconf = {property = 'P511', entity = item, rank = 'valid'} local displayformat = 'C' return timeline(localparam, wdconf, displayformat, title, singtitle) end function p.tombe() return { type = 'images', imageparameters = {'tombe'}, defaultimages = nil, defaultupright = 1, uprightparameter = 'upright tombe', sizeparameter = 'taille tombe', -- obsolète captionparameter = 'légende tombe', defaultcaption = 'Vue de la sépulture.', property = 'P1442', numval = 1, } end function p.plaque() return { type = 'images', imageparameters = {'plaque'}, defaultimages = nil, defaultupright = 1, uprightparameter = 'upright plaque', sizeparameter = 'taille plaque', -- obsolète captionparameter = 'légende plaque', defaultcaption = 'Plaque commémorative', property = 'P1801', numval = 1, } end function p.blason() return { type = 'images', imageparameters = {'blason'}, defaultimages = nil, defaultupright = 0.5, uprightparameter = 'upright blason', sizeparameter = 'taille blason', -- obsolète captionparameter = 'légende blason', defaultcaption = 'Blason', property = 'P94', numval = 1, } end function p.sceau() return { type = 'images', imageparameters = {'sceau'}, defaultimages = nil, defaultupright = 0.7, uprightparameter = 'upright sceau', sizeparameter = 'taille sceau', -- obsolète captionparameter = 'légende sceau', defaultcaption = 'Sceau', property = 'P158', numval = 1, } end function p.monogram() return { type = 'images', imageparameters = {'monogramme'}, defaultimages = nil, defaultsize = '100px', sizeparameter = 'taille monogramme', captionparameter = 'légende monogramme', defaultcaption = 'Monogramme', property = 'P1543', numval = 1, } end function p.flag() return { type = 'images', imageparameters = {'drapeau'}, defaultimages = nil, defaultsize = '150px', sizeparameter = 'taille drapeau', captionparameter = 'légende drapeau', defaultcaption = 'Drapeau', property = 'P41', numval = 1, } end function p.logo() return { type = 'images', imageparameters = {'logo'}, defaultimages = nil, defaultsize = '150px', sizeparameter = 'taille logo', captionparameter = 'légende logo', defaultcaption = 'Marque ou logotype', property = 'P154', numval = 1, } end function p.politicalparty() return { type = 'row', value = 'parti politique', label = 'Parti politique', plurallabel = 'Partis politiques', wikidata = { property = 'P102', sorttype= 'chronological', showdate = true, conjtype = 'new line', excludespecial = true, labelformat = function(id) if id == 'Q327591' and gender == 'f' then return 'indépendante' end end} } end function p.memberof() return {type = 'multi', rows = { { type = 'row', value = 'ordre de chevalerie', label = 'Ordre de chevalerie', plurallabel = 'Ordres de chevalerie', wikidata = {property = 'P550', sorttype= 'chronological', showdate = true, stilltrue = not dead}, }, { type = 'row', label = 'Membre de', value = 'membre de', wikidata = {property = 'P463', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year', linktopic = '-', textformat = 'minimum', conjtype = 'new line'}, }, }} end local masclabelitems = {a='Q10855271', b='Q10855195', c='Q10855212', d='Q10855216', e='Q13422138', f='Q13422140', g='Q13422141', h='Q13452524', i='Q13452528', j='Q13452531', k='Q14637182', l='Q14637176', m='Q14637188',} -- grades de la légion d'Honneur, de l'ordre national du Mérite, de l'ordre des Palmes académiques et de l'ordre des Arts et Lettres en France, de genre grammatical masculin y compris pour les femmes function p.awards() local function awardsList() local majorawards = require 'Module:Dictionnaire Wikidata/Distinctions' local query = { entity = item, property= 'P166', sorttype= 'chronological', grouped = true, showqualifiers = 'P642', showdate= true, precision = 'year', conjtype = 'new line', textformat = 'minimum', linktopic = '-', defaultlinkquery = {property = {'P2354', 'P361' , 'P1027'}}, excludevalues = majorawards.exclude, -- membre de la Royal Society, redondance avec le champ « membre de » (P463) speciallabels = majorawards, labelformat = function(id) masclabel = false for _, item in pairs(masclabelitems) do if id == item then masclabel = true end end if masclabel then return genderedlabel(id, 'm') else return genderedlabel(id) end end, } local claims = wikidata.getClaims(query) if (not claims) then return nil end local str = wikidata.formatAndCat(query) if #claims < 4 then return str, #claims end --si trop de valeurs, n'afficher que les importantes de [[Module:Dictionnaire Wikidata/Distinctions]], et mettre les autrs dans un menu pliant --- récupération des importantes local majorStr local targetvalues = {} for i, j in pairs(majorawards) do table.insert(targetvalues, i) end query.targetvalue = targetvalues query.value, query.claims, query.valuetable = nil, nil, nil -- apparemment sinon ce n'est pas le cas, pourquoi ? BUG IMPORTANT majorStr = wikidata.formatAndCat(query) --- repliage des autres local message = "'''Liste détaillée'''" local allAwardsTable = mw.html.create('div') :addClass('toccolours mw-collapsible mw-collapsed') :wikitext(message) :css{border = 'none'} :tag('div') :addClass('mw-collapsible-content') :css{['line-height'] = '150%'} -- sinon c'est vraiment serré :wikitext( str) :done() :allDone() return linguistic.conj({majorStr, tostring(allAwardsTable)}, '<br>'), #claims end return { type = 'row', value = {'prix', 'récompenses', 'distinction', 'distinctions'}, label = 'Distinctions', singularlabel = 'Distinction', wikidata = function() return awardsList() end } end -- Influences function p.influencedby() return { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Influencée par' else return 'Influencé par' end end, value = 'influencé par', wikidata = {property = 'P737'}, } end function p.influenced() return { type = 'row', label = 'A influencé', value = {'a influencé', 'influence de'}, } end -- Appartenances function p.movement() return { type = 'row', label = 'Mouvement', value = 'mouvement', plurallabel = 'Mouvements', wikidata = {property = 'P135', sorttype= 'chronological', showdate = true, precision = 'year'}, } end -- Religion function p.religion() return {type = 'multi', rows = { { type = 'row', label = 'Religion', value = 'religion', }, { type = 'row', label = 'Date de baptême', value = 'date de baptême', property = 'P1636', }, --{ -- type = 'row', En l'état, afficherait "parrain" y compris pour la marraine. Quoi qu'il en soit, pertinence douteuse. -- label = 'Parrain', -- plurallabel = 'Parrains', -- value = 'parrain', -- property = 'P1290', --}, { type = 'row', label = 'Nom en religion', plurallabel = 'Noms en religion', value = 'nom en religion', property = 'P1635', }, { type = 'row', label = 'Ordre religieux', plurallabel = 'Ordres religieux', value = 'ordre religieux', wikidata = {property = 'P611', showdate = true, sorttype= 'chronological', precision = 'year', stilltrue = not dead}, }, { type = 'row', label = 'Consécrateur', plurallabel = 'Consécrateurs', value = 'consécrateur', property = 'P1598', }, { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Vénérée par' elseif gender == 'm' then return 'Vénéré par' else return 'Vénéré par' end end, value = 'vénéré par', property = 'P1049', }, { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Vénérée à' elseif gender == 'm' then return 'Vénéré à' else return 'Vénéré à' end end, value = 'vénéré à', -- property = , }, { type = 'row', label = 'Étape de canonisation', value = 'étape de canonisation', wikidata = { property = 'P411', labelformat = genderedlabel, }, }, }} end -- Carrière militaire function p.military() return {type = 'multi', rows = { { type = 'row', label = 'Arme', plurallabel = 'Armes', value = 'arme', wikidata = {property = 'P241', showdate = true, stilltrue = not dead, sorttype= 'chronological', precision = 'year'}, }, { type = 'row', label = 'Unité', plurallabel = 'Unités', value = 'unité', wikidata = {property = 'P7779', showdate = true, stilltrue = not dead, sorttype= 'chronological', precision = 'year', conjtype = 'new line'}, }, { type = 'row', label = 'Grade militaire', plurallabel = 'Grades militaires', value = 'grade militaire', blockers = {'grade'}, -- paramètre théoriquement dédié aux arts martiaux et au go mais souvent rempli avec des grades militaires wikidata = { property = 'P410', showdate = true, sorttype= 'chronological', precision = 'year', speciallabels = militaryranks, conjtype ='new line', labelformat = genderedlabel, stilltrue = not dead }, }, { type = 'row', label = 'Conflit', plurallabel = 'Conflits', value = 'conflit', wikidata = {property = 'P607', conjtype = 'new line', showdate = true, stilltrue = not dead, sorttype= 'chronological', precision = 'year'}, }, }} end -- Carrière de torero function p.torero() return {type = 'multi', rows = { { type = 'row', label = 'Alternative', value = 'alternative', wikidata = function() return wikidata.keyDate('Q2840411', item) end }, { type = 'row', label = "Confirmation d'alternative", value = 'confirmation alt', wikidata = function() return wikidata.keyDate('Q23308805', item) end }, }} end -- Sport function p.sport() return {type = 'multi', rows = { { type = 'row', label = 'Sport', plurallabel = 'Sports', value = {'sport', 'sport pratiqué'}, wikidata = {property = 'P641'}, }, { type = 'row', label = 'Équipe', plurallabel = 'Équipes', value = 'équipe', wikidata = { property = 'P54', sorttype= 'chronological', conjtype = 'new line', statementformat = function(statement) local str = wikidata.formatStatement(statement, {showdate = true}) local compets = wikidata.getFormattedQualifiers(statement, {'P1350'}) if tonumber(compets) and (tonumber(compets) > 1) then compets = compets .. ' matchs joués' elseif compets then compets = compets .. ' match joué' end local points = wikidata.getFormattedQualifiers(statement, {'P1351'}) if tonumber(points) and (tonumber(points) > 1) then points = points .. ' points marqués' elseif points then points = points .. 'point marqué' end local qualifiers = linguistic.conj{compets, points} if qualifiers then str= str .. ' <small> – ' .. qualifiers .. ' </small>' end return str end } }, { type = 'row', label = 'Position', plurallabel = 'Positions', value = {'position', 'poste', 'spécialité'}, wikidata = {property = 'P413', labelformat = genderedlabel, }, }, { type = 'row', label = 'Discipline sportive', plurallabel = 'Disciplines sportives', value = 'discipline sportive', wikidata = {property = 'P2416'}, }, { type = 'row', label = 'Prise de raquette', value = 'prise de raquette', wikidata = {property = 'P741'}, }, { type = 'row', label = 'Tire de la', value = 'tire', wikidata = {property = 'P423'}, }, { type = 'row', label = 'Repêchage par', plurallabel = 'Repêchages par', value = 'repêchage', wikidata = { property = 'P647', statementformat = function(statement) local team = wikidata.formatStatement(statement) local moment = wikidata.getFormattedQualifiers(statement, {'P793'}) or wikidata.getFormattedQualifiers(statement, {'P585'}) local rank = wikidata.getFormattedQualifiers(statement, {'P1836'}) if rank then rank = require 'Module:Nombre2texte'.ordinal(rank) .. ' choix' end local qualifs = linguistic.conj({moment, rank}, '&nbsp;– ') if not qualifs then return team end return team .. ' <small>(' .. qualifs .. ')</small>' end }, }, { type = 'row', label = 'Capes internationales', value = 'capes', wikidata = {property = 'P1129', numval = 1}, }, { type = 'row', label = 'Titre aux échecs', plurallabel = 'Titres aux échecs', value = 'titre aux échecs', wikidata = {property = 'P2962', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Classement Elo', value = 'classement elo', wikidata = {property = 'P1087', numval = '1', sorttype = 'inverted', showdate = true, precision = 'year', removedupes = true}, }, { type = 'row', label = 'Record détenu', plurallabel = 'Records détenus', value = 'record détenu', wikidata = {property = 'P1000', sorttype= 'chronological', showdate = true}, }, { type = 'row', label = 'Entraîneur', plurallabel = 'Entraîneurs', value = 'entraîneur', wikidata = {property = 'P286', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Copilote', plurallabel = 'Copilotes', value = 'copilote', wikidata = {property = 'P2095', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Mécène', plurallabel = 'Mécènes', value = {'mécène', 'mécènes', 'sponsor', 'sponsors'}, wikidata = {property = 'P859', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, }} end -- Contacts function p.contacts() return {type = 'multi', rows = { { type = 'row', label = localdata['intitulé maître'] or 'Maître', plurallabel = 'Maîtres', value = {'maître', 'maîtres'}, wikidata = {property = 'P1066', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = { ms = 'Directeur de thèse', fs = 'Directrice de thèse', mp = 'Directeurs de thèse', fp = 'Directrices de thèse', default = '<abbr class="abbr" title="Direction">Dir.</abbr> de thèse' }, value = {'directeur de thèse', 'dir. de thèse'}, wikidata = {property = 'P184', sorttype= 'chronological', showdate = true, precision = 'year'}, }, { type = 'row', label = 'Agent', label = function(localdata, item) if gender == 'f' then return 'Représentée par' elseif gender == 'm' then return 'Représenté par' else return 'Représenté par' end end, value = 'représenté par', wikidata = {property = 'P1875'}, }, { -- Partenaire professionnel ou sportif type = 'row', label = 'Partenaire', plurallabel = 'Partenaires', value = 'partenaire', wikidata = {property = 'P1327', showdate = true, sorttype= 'chronological'}, }, { type = 'row', label = localdata['intitulé élève'] or 'Élève', plurallabel = 'Élèves', value = {'élève', 'élèves'}, wikidata = {property = 'P802', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year', numval = '5', expl = ''}, }, { type = 'row', label = 'Étudiant de thèse', plurallabel = 'Étudiants de thèse', value = 'étudiant de thèse', wikidata = {property = 'P185', sorttype= 'chronological', showdate = true, precision = 'year', numval = '5', expl = ''}, }, { type = 'row', label = 'Personne liée', plurallabel = 'Personnes liées', value = 'personne liée', wikidata = {property = 'P3342', numval = 5, showqualifiers = 'P3831',qualiflink="-",qualiflabelformat="objectgender"}, --objectgender à créer dans Module:Wikidata }, }} end -- Mécénat function p.patron() return { type = 'row', label = '[[Mécénat|Mécènes]]', singularlabel = '[[Mécénat|Mécène]]', plurallabel = '[[Mécénat|Mécènes]]', value = 'mécènes', wikidata = {property = 'P859', showdate = true, stilltrue = not dead, sorttype = 'chronological', conjtype = 'comma'}, } end -- Musique function p.music() return {type = 'multi', rows = { { type = 'row', label = 'Tessiture', value = 'tessiture', property = 'P412', }, { type = 'row', label = 'Fach', value = 'fach', property = 'P1731', }, { type = 'row', label = 'Instrument', plurallabel = 'Instruments', value = 'instrument', wikidata = {property = 'P1303', sorttype= 'chronological', excludevalues='Q17172850'}, --probablement jugée redondante avec l'occupation "chanteur" }, { type = 'row', label = 'Label', plurallabel = 'Labels', value = 'label', wikidata = {property = 'P264', sorttype= 'chronological', showdate = true, precision = 'year'}, }, }} end -- Victimes function p.victims() return {type = 'multi', rows = { { type = 'row', label = 'Victimes', value = 'victimes', wikidata = {property = 'P1345'}, }, }} end -- Condamnations function p.penalties() return {type = 'multi', rows = { { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Condamnée pour' elseif gender == 'm' then return 'Condamné pour' else return 'Condamné pour' end end, value = 'condamné pour', wikidata = {property = 'P1399', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'}, }, { type = 'row', label = 'Condamnation', plurallabel = 'Condamnations', value = 'condamnation', wikidata = {property = 'P1596', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'}, }, { type = 'row', label = 'Lieu de détention', plurallabel = 'Lieux de détention', value = 'lieu de détention', wikidata = {property = 'P2632', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'}, }, }} end -- Physique function p.appearance() return {type = 'multi', rows = { { type = 'row', label = 'Taille', value = 'taille', wikidata = {property = 'P2048', targetunit = 'metre', rounding = '2'}, }, { type = 'row', label = '[[masse corporelle|Poids]]', value = {'poids','masse'}, wikidata = {property = 'P2067', targetunit = 'kilogram', conjtype = 'new line', showdate=true, rounding = '1'}, }, { type = 'row', label = 'Cheveux', value = 'cheveux', wikidata = {property = 'P1884'}, }, { type = 'row', label = 'Yeux', value = 'yeux', wikidata = {property = 'P1340'}, }, }} end -- Famille function p.gens() return {type = 'multi', rows = { { type = 'row', label = 'Gens', value = 'gens', wikidata = {property = 'P5025'}, }, }} end function p.family() local function showkinship(statement) local personid = wikidata.getMainId(statement) local personlabel = wikidata.formatEntity(personid, { labelformat2 = noble.labelInfobox }) local persongender = wikidata.getgender(personid) local kintype = wikidata.getFormattedQualifiers( statement, 'P1039', { labelformat = function(id) return genderedlabel(id, persongender) end, link = '-' } ) if kintype then return personlabel .. ' ' .. linguistic.inparentheses(kintype) end return personlabel end return {type = 'multi', rows = { { type = 'row', label = 'Famille', plurallabels = 'Familles', value = 'famille', property = 'P53', }, { type = 'row', label = 'Père', value = 'père', wikidata = { property = 'P22', showqualifiers = "P1039", conjtype = ' ou ', labelformat2 = noble.labelInfobox }, }, { type = 'row', label = 'Mère', value = 'mère', wikidata = {property = 'P25', showqualifiers = "P1039", unknownlabel = 'Inconnue', conjtype = ' ou ', labelformat2 = noble.labelInfobox }, }, { type = 'row', label = 'Beau-parent', plurallabel = 'Beaux-parents', value = {'beau-parent', 'beau-père', 'belle-mère'}, wikidata = { property = 'P3448', labelformat2 = noble.labelInfobox }, }, { type = 'row', label = 'Fratrie', value = 'fratrie', wikidata = { property = 'P3373', sorttype = 'age', conjtype = 'new line', textformat = 'long', precision = 'year', stilltrue = not dead, statementformat = showkinship, excludespecial = true, labelformat2 = noble.labelInfobox, } }, { type = 'row', label = 'Conjoint', -- todo : adapter le libellé en genre ? plurallabel = 'Conjoints', value = 'conjoint', wikidata = { property = 'P26', showdate = true, linktopic = '-', sorttype = 'chronological', conjtype = 'new line', textformat = 'long', precision = 'year', stilltrue = not dead, precision = 'year', excludespecial = true, labelformat2 = noble.labelInfobox, } }, { type = 'row', label = localdata['intitulé enfant'] or 'Enfant',-- todo : adapter le libellé en genre ? plurallabel = 'Enfants', value = 'enfant', wikidata = { property = 'P40', conjtype = 'new line', showdate = false, sorttype = 'age', labelformat2 = noble.labelInfobox, } }, { type = 'row', label = 'Parentèle', value = 'parentèle', wikidata = { property = 'P1038', excludespecial = true, conjtype = 'new line', statementformat = showkinship } }, }} end -- Esclavage function p.slavery() return {type = 'multi', rows = { { type = 'row', label = 'Statut', plurallabel = 'Statuts', value = 'statut', wikidata = {property = 'P3716', showdate = true, labelformat = genderedlabel, excludevalues = {'Q11573099','Q10076267'}, --membre de la famille royale (doublon avec les propriétés familiales) et propriétaire d'esclaves (pas vraiment un statut) defaultlinkquery = 'P425'}, }, { type = 'row', label = 'Propriétaire', plurallabels = 'Propriétaires', value = 'propriétaire', wikidata = {property = 'P127'}, }, }} end -- Œuvres function p.works(params) params = params or {} local title = params.title or 'Œuvres principales' params.title = nil local wikidata = { excludespecial = true, numval = 5, property = 'P800', defaultlink = 'image', showdate= true, labelformat = function(id) local label = wikidata.getLabel(id) if label then if wikidata.isInstance('Q386724', id, 6) then --italique pour les instances d' "œuvre" ou ses sous-classes if wikidata.isInstance('Q14897293', id, 5) or wikidata.isInstance('Q13226383', id, 5) or wikidata.isInstance('Q3622126', id, 5) or wikidata.isInstance('Q12894677', id, 5) then --sauf les instances d'"entité fictionnelle", "équipement", "système de concepts", "moyen pour une fin" ou leurs sous-classes return label else return '<i>' .. label .. '</i>' end else return label end end end, } for i, j in pairs(params) do wikidata[i] = j end return {type = 'table', title = title, singulartitle = singulartitle, rows = { { type = 'row', value = 'œuvres principales', wikidata = wikidata } } } end function p.filmography() local title = 'Films notables' return {type = 'row', label = 'Films notables', value = 'films notables', property = 'P1283'} end function p.discography() local title = 'Discographie' return {type = 'row', label = 'Discographie', value = 'discographie', property = 'P358'} end -- Signature function p.signature(default) local nom = localdata.nom or mw.title.getCurrentTitle().text local alt = 'siyati ' .. nom if mw.ustring.match( nom, '^[AEÈÉIOUY]' ) then alt = "siyati" .. nom end return { type = 'images', imageparameters = {'siyati'}, defaultimage = default, captionparameter = 'lejand siyati', defaultcaption = 'Siyati', uprightparameter = 'upright signature', defaultupright = 0.75, defaultalt = alt, property = 'P109', numval = 1 } end -- Enregistrement vocal function p.voice() return { type = 'images', style = {['padding-top'] = '25px'},--{['border-width'] = '10px', ['border-style'] = 'solid'}, defaultcaption = 'Enregistrement vocal', captionparameter = 'légende voix', imageparameters = 'voix', defaultsize = '280', wikidata = general.selectSound('P990'), numval = 1, } end -- Site web p.website = general.website -- Prononciation p.prononciation = general.prononciation -- fête du saint function p.feast() local title = 'Fête' return {type = 'row', label = 'Fête', value = 'fête', wikidata = {property = 'P841' , showqualifiers = 'P276'}} end -- archivé par function p.archivesat() return {type = 'row', label = 'Archives conservées par', value = "archivé par", wikidata = { property = 'P485', conjtype = 'new line', showqualifiers = {'P217','P7328','P585','P7103','P7104'}, qualifprecision = 'year', qualifformat = function(statement, qualifs, params) -- basé sur wikidata.getFormattedQualifiers dans [[Module:Wikidata]] local str = '' if not params then params = {} end local qualiftable = wikidata.getQualifiers(statement, qualifs) if not qualiftable then return nil end qualiftable = wikidata.filterClaims(qualiftable, params) or {} for i, snak in pairs(qualiftable) do if (snak.datatype == 'time' and snak.property == 'P7104') then -- fin de période couverte str = str .. '-' elseif i > 1 then str = str .. ', ' end qualiftable[i] = wikidata.formatSnak(snak, params) if snak.datatype == 'quantity' and tonumber(snak.datavalue.value.amount) > 1 then -- pluriel qualiftable[i] = qualiftable[i] .. 's' end str = str .. qualiftable[i] end return str end, showsource = true } } end return p b5l23hh58pxaawrui9wm2hyst98ixhc 855626 855613 2024-11-12T22:58:38Z BwaKajou 31668 855626 Scribunto text/plain --[[ Avant de mettre en production une nouvelle version avez-vous : - mis en place des tests dans au moins une des pages de test d'un des modèles utilisant la fonction ? - testé avec la version bac à sable ? - modifié la documentation ? ]] -- Functions utilisées par les infobox personnes local p = {} local localdata = require 'Module:Infobox/Localdata' local item = localdata.item local wikidata = require 'Module:Wikidata' local general = require 'Module:Infobox/Fonctions' local datemodule = require 'Module:Date' local complexdate = require 'Module:Date complexe' local linguistic = require 'Module:Linguistique' local militaryranks = require 'Module:Dictionnaire Wikidata/Grades militaires' local ppath = require 'Module:Wikidata/Chemin' local noble = require 'Module:Noble' -- == Accord en genre local gender = wikidata.getgender(item) -- genre de la personne dont c'est l'infobox -- Version locale de wikidata.genderedlabel où si le genre n'est pas indiqué, c'est celui de la personne dont c'est l'infobox local function genderedlabel(id, labelgender) if not labelgender then labelgender = gender end return wikidata.genderedlabel(id, labelgender) end -- === Gestion des dates -- Liens thématiques vers les dates local datelinks = { -- lien vers le domaine d'activité approprié Q483501 = 'nan atizay plastik', -- artiste Q1028181 = 'nan atizay plastik', -- peintre Q1281618 = 'nan atizay plastik', -- sculpteur Q2309784 = 'nan siklis', -- cycliste Q16947657 = 'nan atizay plastik', -- lithographe Q11569986 = 'nan atizay plastik', -- graveur Q13365770 = 'nan atizay plastik', -- graveur sur cuivre Q21925567 = 'nan atizay plastik', -- sérigraphe Q10862983 = 'nan atizay plastik', -- aquafortiste Q36180 = 'nan literati', -- écrivain } local function getdatetopic() -- obtient le lien le plus approprié pour une date en fonction de la profession local claims = wikidata.stringTable{entity = item, property = 'P106', excludespecial = true, displayformat = 'raw'} if not claims then return nil end for i, j in pairs(claims) do if datelinks[j] then return datelinks[j] end end end local linktopic = getdatetopic() local unknowndatelabel = 'date inconnue' local birthdate = localdata['naissance'] or localdata['date de naissance'] or wikidata.formatAndCat{ entity = item, property = 'P569', unknownlabel = unknowndatelabel, conjtype = 'or', sorttype = 'chronological', removedupesdate = 'cat', minprecision = 8, --précision minimale pour être affichée : décennie } local dead = wikidata.getClaims{entity = item, property = 'P570'} --utilisé comme booléen qui dit si une personne est morte pour modifier certaines élément d'affichage local stillvalid if dead then stillvalid = "?" -- permet de remplacer des "depuis" par des "à partir de" end local deathdate = localdata['décès'] or localdata['date de décès'] local wddeathdate = wikidata.formatAndCat{ entity = item, property = 'P570', unknownlabel = unknowndatelabel, conjtype = 'or', sorttype = 'chronological', removedupesdate = 'cat', minprecision = 8, } local disappeardate = localdata['disparition'] local wddisappeardate = wikidata.formatAndCat{ entity = item, property = 'P746', unknownlabel = unknowndatelabel, conjtype = 'or', sorttype = 'chronological', removedupesdate = 'cat', showqualifiers = 'P276', minprecision = 8, } local function format1(event, period, predecessor, together, successor, displayformat) local mainstr = event if predecessor then local s = 'précédé par ' .. predecessor if gender == 'f' then s = 'précédée par ' .. predecessor end mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>' end if together then local s = 'avec ' .. together mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>' end if successor then local s = 'suivi par ' .. successor if gender == 'f' then s = 'suivie par ' .. successor end mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>' end return {type = 'row', label = period or '', value = function() return mainstr end} end ----------------- local function format2(event, period, predecessor, together, successor, displayformat) if (not event) then return nil end local rows = {} local eventrow = {type = 'row1col', color = 'secondcolor', value = event } table.insert(rows, eventrow) if period then period = '<span style="font-weight:normal">' .. period .. '</span>' local periodrow = {type = 'row1col', color = '#F9F9F9', value = period } table.insert(rows, periodrow) end if predecessor then local prederow = {type = 'row', label = 'Prédécesseur', value = function() return predecessor end} table.insert(rows, prederow) end if together then local succrow = {type = 'row', label = 'Avec', value = function() return together end} table.insert(rows, succrow) end if successor then local succrow = {type = 'row', label = 'Successeur', value = function() return successor end} table.insert(rows, succrow) end return {type = 'multi', rows = rows} end local function format3(event, period, predecessor, together, successor, displayformat, details) if details then details = '<span style="font-weight:normal">' .. details .. '</span>' event = linguistic.conj({event, details}, 'new line') end local mainrow = {type = 'row1col', color = 'secondcolor', value = event } if period then period = '<span style="font-weight:normal">' .. period .. '</span>' end local periodrow = {type = 'row1col', color = '#F9F9F9', value = period } local successionrow = { style = {['background-color'] = '#F9F9F9', ['padding-bottom'] = '2%'}, type = 'navigator', inner = true, previousval = function() return predecessor end, nextval = function() return successor end, } return {type = 'multi', rows = {mainrow, periodrow, successionrow}} end local function timeline(localparam, wdconf, timelineformat, title, singtitle, details) -- affiche date : événement (suppose les événements déjà triés) local rows = {} local function returnTable() return { type = 'table', title = title, rows = rows } end -- avec données locales local val = localdata[localparam] if val == '-' then return nil elseif val then table.insert(rows, {type = 'row1col', color = 'secondcolor', value = val}) return returnTable() end -- avec données wikidata if not wdconf then return nil end wdconf.entity = wdconf.entity or item wdconf.sorttype = wdconf.sorttype or 'chronological' wdconf.labelformat = wdconf.labelformat or genderedlabel wdconf.linktopic = wdconf.linktopic or '-' local statements = wikidata.getClaims(wdconf) if not statements then return nil end if #statements == 1 then title = singtitle end local displayformats = { A = format1, B = format2, C = format3, } local applyformat = displayformats[timelineformat] or displayformats['A'] rows = {} for i, statement in pairs(statements) do local event = linguistic.ucfirst(wikidata.formatStatement(statement, wdconf)) local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'}, {labelformat2 = noble.labelInfobox}) local together = wikidata.getFormattedQualifiers(statement, {'P1706', ''}, {labelformat2 = noble.labelInfobox}) local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'}, {labelformat2 = noble.labelInfobox}) local period = wikidata.getFormattedDate(statement, {linktopic = wdconf.linktopic, stilltrue = stillvalid } ) -- dont pass all wdconf or else qualifiers will show up local detailstr if type(details) == 'function' then detailstr = details(statement) end local row = applyformat(event, period, predecessor, together, successor, wdconf, detailstr) if row then table.insert(rows, row) end end table.insert(rows, {type = 'external text', value = function() return wikidata.addTrackingCat(wdconf.property) end}) return returnTable() end local function dateandplace(thedate, theplace) if thedate and theplace and mw.ustring.find(thedate, 'inconnu') and mw.ustring.find(theplace, 'inconnu') then theplace = nil thedate = mw.ustring.gsub(thedate, linguistic.ucfirst(unknowndatelabel), 'Date et lieu inconnus') end return linguistic.conj({thedate, theplace}, 'new line') end --Titre function p.title(icon, style) local title = general.title(icon, style) title.value = function() return localdata['nom'] or localdata['association_nom'] or localdata['nom_think'] or localdata['acronymelaboratoire'] or localdata['titre'] or wikidata.getLabel(localdata.item) and noble.labelInfobox( mw.language.getContentLanguage():ucfirst( wikidata.getLabel(localdata.item) ) ) or noble.labelInfobox( mw.title.getCurrentTitle().text ) end return title end --Image function p.mainimage(cat) -- demande d'illustration que si la personne est née ou morte après 1900, sinon c'est souvent impossible à trouver local defaultimage = 'Defaut 2.svg' local age = wikidata.stringTable{property = 'P569,P570', entity = item, displayformat = 'raw', excludespecial = true} if age and age[1] then local pattern = '(%W)(%d+)%-(%d+)%-(%d+)' local era, year = age[1]:match(pattern) if (era == '-') or (tonumber(year)) < 1900 then defaultimage = nil end end return general.mainimage({cat = cat or 'Article à illustrer Biographie', altparameter = 'alt'}, defaultimage) end -- Noms function p.othernames() local names = { {'P1477', 'Nom de naissance', 'Noms de naissance', 'nom de naissance'}, {'P1448', 'Nom officiel', 'Noms officiels', 'nom officiel'}, {'P1449', 'Surnom', 'Surnoms', 'surnom'}, {'P2001', 'Romanisation révisée', 'Romanisation révisée', 'romanisation révisée'}, {'P1942', 'McCune-Reischauer', 'McCune-Reischauer', 'McCune-Reischauer'}, {'P742', 'Pseudonyme', 'Pseudonymes', 'pseudonyme'}, {'P1782', 'Prénom social', 'Prénoms sociaux', 'prénom social'}, {'P1786', 'Nom posthume', 'Noms posthumes', 'nom posthume'}, {'P1785', 'Nom de temple', 'Noms de temple', 'nom de temple'}, {'P1787', 'Nom de pinceau', 'Noms de pinceau', 'nom de pinceau'}, {'P1813', 'Nom court', 'Noms courts', 'nom court'}, {nil, 'Autres noms', 'Autres noms', 'autres noms'}, } local nativelangnamerow = { -- un peu particulier, donc à part type = 'row', wikidata = function() local s = wikidata.formatAndCat{entity = item, property = 'P1559', showqualifiers = 'P1721', conjtype = 'or'} if (not s) then return nil end -- regarde si le nom de la valeur ressemble au libellé (en tenant compte de la pollution des marqueures de langue local label = mw.ustring.lower(wikidata.getLabel(item) or '') local useless if mw.ustring.find(mw.ustring.lower(s), mw.ustring.lower(label), 1, true) then useless = true end if wikidata.formatStatements{entity = item, property = 'P1559'} == wikidata.formatStatements{entity = item, property = 'P1477'} then useless = true --inutile si duplique le "nom de naissance" end if useless then return nil end return s end, label = 'Nom dans la langue maternelle', plurallabel = 'Noms dans la langue maternelle', value = 'nom dans la langue maternelle', } local rows = {type = 'multi', rows = {nativelangnamerow}} for i, j in pairs(names) do local query if j[1] and not localdata['autres noms'] then -- lorsqu'il y a un paramètre "autres noms", Wikidata est désactivée pour éviter risques de doublon query = {property = j[1], showqualifiers = {'P1721'}, conjtype = 'comma'} end table.insert(rows.rows, {type = 'row', value = j[4], wikidata = query, label = j[2], plurallabel = j[3]}) end return rows end -- NAISSANCE ET MORT function p.birth() -- date de naissance en première ligne, lieu de naissance en deuxième return { type = 'row', label = 'Naissance', value = function() local thedate = datemodule.dateInfobox{args = {[1] = 'naissance', [2] = birthdate or '', [3] = deathdate or wddeathdate or disappeardate or wddisappeardate or '', qualificatif = linktopic}} local theplace = localdata['lieu de naissance'] or wikidata.formatAndCat({entity =item, -- affichage du nom du lieu de naissance en vigueur à la date de naissance property= 'P19', rank = 'best', labelformat = function(val) return wikidata.getLabel(val) end, conjtype= ' ou ', defaultlinkquery = {property = {'P361'}}, -- liens par défaut : "partie de", unknownlabel = "lieu inconnu", showqualifiers = {'P131', 'P17'}, qualifconjtype = 'comma' } ) return dateandplace(thedate, theplace) end } end function p.death() -- même fonctionnement que la fonction p.birth -- date de disparition local ldisappeardate = disappeardate if (not ldisappeardate ) and (not deathdate) then -- récupérée de Wikidata seulement si la date de décès n'est pas fournie en locale ldisappeardate = wddisappeardate end if ldisappeardate and birthdate then ldisappeardate = datemodule.dateInfobox{args = {[1] = 'événement', [2] = birthdate or '', [3] = ldisappeardate or '', qualificatif = linktopic, unknownlabel = 'date inconnue'}} end -- date de décès local ddate = deathdate --déclarée pour l'ensemble du module if (not ddate) and (not ldisappeardate) then deathdate = wddeathdate -- récupérée de Wikidata seulement si la date de disparition n'est pas fournie en locale end local thedate = datemodule.dateInfobox{args = {[1] = 'mort', [2] = birthdate or '', [3] = deathdate or '', qualificatif = linktopic, unknownlabel = 'date inconnue'}} local theplace = localdata['lieu de décès'] or wikidata.formatAndCat{entity =item, property= 'P20', rank = 'best', -- affichage du nom du lieu de décès en vigueur à la date de décès labelformat = function(val) return wikidata.getLabel(val) end, conjtype= ' ou ', defaultlinkquery = {property = {'P361'}}, -- liens par défaut : "partie de", unknownlabel = "lieu inconnu", showqualifiers = {'P131', 'P17'}, qualifconjtype = 'comma' } local val = dateandplace(thedate, theplace) return {type = 'multi', rows = { { -- disparition type = 'row', label = 'Disparition', value = function() return ldisappeardate end }, { -- décès type = 'row', label = 'Décès', value = function() return val end, } }} end function p.floruit() return { type = 'row', label = "Période d'activité", value = "période d'activité", wikidata = function() local startDate = wikidata.formatAndCat{entity = item, property = 'P2031', conjtype = 'or', sorttype = 'chronological', linkback = '-'} local endDate = wikidata.formatAndCat{entity = item, property = 'P2032', conjtype = 'or', sorttype = 'chronological'} if not (startDate or endDate) then return wikidata.formatAndCat{entity = item, property = 'P1317', conjtype = 'or', sorttype = 'chronological'} end if startDate and not endDate then startDate = wikidata.formatAndCat{entity = item, property = 'P2031', conjtype = 'or', sorttype = 'chronological'} end return complexdate.daterange(startDate, endDate, {precision = 11, stilltrue = stillvalid}) end } end function p.placeofburial() return {type = 'row', label = 'Sépulture', value = 'sépulture', wikidata = {property = "P119", showdate = true, novaluelabel = 'aucune'}} end function table.slice(tbl, first, last, step) local sliced = {} for i = first or 1, last or #tbl, step or 1 do sliced[#sliced+1] = tbl[i] end return sliced end -- function that creates a filter function -- if the main country "base_country_item" is (replaced by)+ -- the subsequent statement main value that the function will receive as a parameter -- then the created function will return true for this statement to be filtered out local function filter_replaces_builder(base_country_item) -- P1365 = remplace -- P1366 = remplacé par local replaced_query = {property = 'P1365'} return function(may_be_replacing_stmt) local may_be_replacing_item = wikidata.getMainId(may_be_replacing_stmt) local replaces = wikidata.inTransitiveVals(may_be_replacing_item, base_country_item, replaced_query) return not(wikidata.inTransitiveVals(may_be_replacing_item, base_country_item, replaced_query)) end end -- filter parameterized by each of the values of the claims, in the order -- « filter_function_builder » will be called by all the values (remaining after filtering) in « claims » -- to filter the rest of the claims, starting from the first one in the list. local function iterated_filter(claims, filter_function_builder) -- the first country in the list, if any of the following value replaces this one -- we remove them. So we split the list local first_country_claim = claims[1] local to_test = table.slice(claims, 2, #claims) if #to_test > 0 then -- building the filter function with the first country as base value -- (a closure) local condition = filter_function_builder(wikidata.getMainId(first_country_claim)) -- keeping the number of values before the filter local nb_before = #to_test to_test = wikidata.filterClaims(to_test, {condition = condition}) or {} local nb_after = #to_test -- if some country was filtered out, we remove the dates of the main statement to avoid showing incomplete dates if (nb_before ~= nb_after and first_country_claim.qualifiers) then first_country_claim.qualifiers["P580"] = nil first_country_claim.qualifiers["P582"] = nil end -- if there still exists candidate countries, filter them recursively if #to_test > 0 then to_test = iterated_filter(to_test, filter_function_builder) end -- reconstruct the list of statement by readding our first country to the filtered list to_test = to_test or {} table.insert(to_test, 1, first_country_claim) return to_test end -- if there were nothing to filter, just return the first statement return {first_country_claim} end function p.nationality() local cmp = wikidata.compare -- à améliorer étant donnée les mœurs Wikidata comme nationalité : Empire allemand (1901-1918) République de Weimar (1918-1933) local function wdDate() local nation = require 'Module:Country data'.nationality -- désactivation si date de naissance avant l'Ère contemporaine : trop d'imprécisions et d'anachronismes local mindate = '1789' local birthdate = wikidata.formatStatements{entity = item, property = 'P569', displayformat = 'raw', numval = 1} local deathdate = wikidata.formatStatements{entity = item, property = 'P570', displayformat = 'raw', numval = 1} if ((not birthdate) or complexdate.before(mindate, birthdate)) and ((not deathdate) or complexdate.before(mindate, deathdate)) then return nil end -- preprocessing the "P27" statements -- if there is statements about a country that changed its regime, like France before and after the french Revolution -- then we just want to show "France" and not "France and France" because there is two statement (or worse) -- so we take advantage of the fact that the French Kingdom was "replaced by" French Republic (P1366) -- to detect and filter out such «redundant» values -- (we also remove the begin/end dates of statements in such cases to avoid wrong dating) local statements = wikidata.getClaims{entity = item, property = 'P27', rank='best', excludespecial=true} or {} -- sort nationality statements by statement dates or regime creation date if statement is not dated local sort_by_statement_or_regime = wikidata.chrono_key_sort{ sort_key="RegimeKey", -- use another key than « chronosort » snak_key_get_function = ppath.snak_key_by_paths{">P580","P571"}, --[[ either by « begin date » qualifier or « inception » of the nationality if the statement is not dated ]] key_compare_function = cmp.rev(function(v1, v2) return v1 < v2 end) -- sort in reverse chronological order to remove all values the first nationalities replaces } -- ordering statement by dates so that we can test only "A replaces B" and not "B replaces A" because A is an older regime than B statements = sort_by_statement_or_regime(statements) -- actual statement filtering statements = iterated_filter(statements, filter_replaces_builder) -- re-sorting in chronological ordering statements = wikidata.sortClaims(statements, cmp.chronoCompare) return { property = 'P27', claims = statements, -- our filtered statement as claims instead of the regular query showdate = true, entity = item, conjtype = 'new line', removedupes = true, linktopic = '-', sorttype = 'chronological', ucfirst = '-', stilltrue = not dead, displayformat = function(snak) -- local g = gender -- genre de la personne, pour affichage du gentilé -- if g == '?' then -- si inconnu, au masculin -- g = 'm' -- end local val, success = nation(wikidata.getId(snak), 'f') -- au féminin pour accorder au mot nationalité if not success then val = wikidata.formatSnak(snak) end return val end } end return { type = 'row', label = 'Nationalité', plurallabel = 'Nationalités', value = 'nationalité', wikidata = wdDate() -- wdDate() retourne une table } end function p.nativelanguage() return {type = 'row', label = 'Langue maternelle', value = 'langue maternelle', property = 'P103'} end function p.writinglanguage() return {type = 'row', label = "Langue d\'écriture", value = 'langue d\'écriture', plurallabel = "Langues d\'écriture" , wikidata = {property = 'P6886' , expl = true}} end -- Domiciles function p.places() return {type = 'multi', rows = { { type = 'row', label = 'Dème', plurallabel = 'Dèmes', value = 'dème', wikidata = {property = 'P2462', showdate = true, sorttype= 'chronological', stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Domicile', plurallabel = 'Domiciles', value = 'domicile', wikidata = {property = 'P551', showdate = true, sorttype= 'chronological', stilltrue = not dead, precision = 'year'}, }, }} end -- parcours professionel function p.education() local query = {sorttype= 'chronological', property = 'P69', showdate = true, stilltrue = '?', showqualifiers = 'P512', conjtype = 'new line', linktopic = '-'} return { type = 'row', value = {'éducation', 'formation'}, wikidata = query, label = 'Formation', } end function p.occupation() local speciallabels = { f = { ['Q33999'] = '[[Acteur|actrice]]', ['Q10798782'] = '[[Acteur|actrice]]', ['Q10800557'] = '[[Acteur|actrice]]', ['Q2405480'] = '[[Acteur|actrice]]', ['Q2259451'] = '[[Acteur|actrice]]', ['Q948329'] = '[[Acteur|actrice]]' }, m = { ['Q33999'] = '[[acteur]]', ['Q10798782'] = '[[acteur]]', ['Q10800557'] = '[[acteur]]', ['Q10798782'] = '[[acteur]]', ['Q2405480'] = '[[acteur]]', ['Q2259451'] = '[[acteur]]', ['Q948329'] = '[[acteur]]' } } return { type = 'row', value = {'activité', 'activités'}, wikidata = { property = 'P106', defaultlink = '-', defaultlinkquery = {property = {'P425','P1056'}}, labelformat = genderedlabel, speciallabels = speciallabels[gender] or speciallabels['m'], removedupes = true, showdate = true, sorttype = 'chronological', stilltrue = not dead, excludevalues = { -- les occupations qui ne méritent pas d'être affichées 'Q482980', -- auteur 'Q15980158', --"auteur de non-fiction" 'Q12144794', --prosateur 'Q18814623', -- autobiographe 'Q1209498', -- juriste-poète 'Q1097498', -- "dirigeant" 'Q2478141', -- aristocrate 'Q116', -- monarque 'Q115088092', -- participant à un forum international } }, label = 'Activité', plurallabel = 'Activités' } end function p.haswrittenfor() local valueStyle = {} valueStyle['font-style'] = 'italic' return {type = 'row', label = function(localdata, item) if gender == 'f' then return 'Rédactrice à' else return 'Rédacteur à' end end, value = 'rédacteur à', wikidata = {property = "P6872", showdate = true}, valueStyle = valueStyle} end function p.employer() return { type = 'row', value = 'employeur', wikidata = {property = 'P108', showdate = true, linktopic = '-', sorttype= 'inverted', stilltrue = not dead, conjtype = 'new line'}, label = function() return localdata['intitulé employeur'] or 'A travaillé pour' end, } end function p.victories() local title, singtitle = 'Victoires', 'Victoire' local localparam = 'victoire' local wdconf = {property = 'P2522'} local displayformat = 'B' return timeline(localparam, wdconf, displayformat, title, singtitle) end function p.officialposition() local title, singtitle = 'Fonctions', 'Fonction' local localparam = 'fonction' local wdconf = { property = 'P39', rank = 'valid', sorttype = 'inverted', defaultlinkquery = {property = {'P2354', 'P2389', 'P453', 'P361', 'P108', 'P276', 'P1001'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de", "partie de", employeur, ressort territorial } -- sur une ligne séparée : gouvernement, législature, juridiction, "de", circonsription, diocèse, affiliation, assemblée, parti, employeur local details = function(statement) return wikidata.getFormattedQualifiers(statement, {'P5054', 'P2937', 'P1001', 'P642', 'P2389', 'P768', 'P708', 'P1416', 'P194', 'P108', 'P937' , 'P1268'}, {conjtype = 'new line'}) end local displayformat = 'C' return timeline(localparam, wdconf, displayformat, title, singtitle, details) end function p.specialrole() local localparam = 'statut notable' local wdconf = { property = 'P2868', rank = 'valid', sorttype = 'inverted', targetsuperclass = 'Q254917', defaultlinkquery = {property = {'P2354'}}, -- lien par défaut : liste d'éléments } local displayformat = 'C' return timeline(localparam, wdconf, displayformat) end function p.nobilitytitle() local title, singtitle = 'Titres de noblesse', 'Titre de noblesse' local localparam = 'titre de noblesse' local wdconf = { property = 'P97', entity = item, rank = 'valid', showqualifiers = {'P642'}, defaultlinkquery = {property = {'P2354', 'P361'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de" et "partie de" } local displayformat = 'B' return timeline(localparam, wdconf, displayformat, title, singtitle) end function p.honorifictitle() local title, singtitle = 'Titres honorifiques', 'Titre honorifique' local localparam = 'titre honorifique' local wdconf = {property = 'P511', entity = item, rank = 'valid'} local displayformat = 'C' return timeline(localparam, wdconf, displayformat, title, singtitle) end function p.tombe() return { type = 'images', imageparameters = {'tombe'}, defaultimages = nil, defaultupright = 1, uprightparameter = 'upright tombe', sizeparameter = 'taille tombe', -- obsolète captionparameter = 'légende tombe', defaultcaption = 'Vue de la sépulture.', property = 'P1442', numval = 1, } end function p.plaque() return { type = 'images', imageparameters = {'plaque'}, defaultimages = nil, defaultupright = 1, uprightparameter = 'upright plaque', sizeparameter = 'taille plaque', -- obsolète captionparameter = 'légende plaque', defaultcaption = 'Plaque commémorative', property = 'P1801', numval = 1, } end function p.blason() return { type = 'images', imageparameters = {'blason'}, defaultimages = nil, defaultupright = 0.5, uprightparameter = 'upright blason', sizeparameter = 'taille blason', -- obsolète captionparameter = 'légende blason', defaultcaption = 'Blason', property = 'P94', numval = 1, } end function p.sceau() return { type = 'images', imageparameters = {'sceau'}, defaultimages = nil, defaultupright = 0.7, uprightparameter = 'upright sceau', sizeparameter = 'taille sceau', -- obsolète captionparameter = 'légende sceau', defaultcaption = 'Sceau', property = 'P158', numval = 1, } end function p.monogram() return { type = 'images', imageparameters = {'monogramme'}, defaultimages = nil, defaultsize = '100px', sizeparameter = 'taille monogramme', captionparameter = 'légende monogramme', defaultcaption = 'Monogramme', property = 'P1543', numval = 1, } end function p.flag() return { type = 'images', imageparameters = {'drapeau'}, defaultimages = nil, defaultsize = '150px', sizeparameter = 'taille drapeau', captionparameter = 'légende drapeau', defaultcaption = 'Drapeau', property = 'P41', numval = 1, } end function p.logo() return { type = 'images', imageparameters = {'logo'}, defaultimages = nil, defaultsize = '150px', sizeparameter = 'taille logo', captionparameter = 'légende logo', defaultcaption = 'Marque ou logotype', property = 'P154', numval = 1, } end function p.politicalparty() return { type = 'row', value = 'parti politique', label = 'Parti politique', plurallabel = 'Partis politiques', wikidata = { property = 'P102', sorttype= 'chronological', showdate = true, conjtype = 'new line', excludespecial = true, labelformat = function(id) if id == 'Q327591' and gender == 'f' then return 'indépendante' end end} } end function p.memberof() return {type = 'multi', rows = { { type = 'row', value = 'ordre de chevalerie', label = 'Ordre de chevalerie', plurallabel = 'Ordres de chevalerie', wikidata = {property = 'P550', sorttype= 'chronological', showdate = true, stilltrue = not dead}, }, { type = 'row', label = 'Membre de', value = 'membre de', wikidata = {property = 'P463', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year', linktopic = '-', textformat = 'minimum', conjtype = 'new line'}, }, }} end local masclabelitems = {a='Q10855271', b='Q10855195', c='Q10855212', d='Q10855216', e='Q13422138', f='Q13422140', g='Q13422141', h='Q13452524', i='Q13452528', j='Q13452531', k='Q14637182', l='Q14637176', m='Q14637188',} -- grades de la légion d'Honneur, de l'ordre national du Mérite, de l'ordre des Palmes académiques et de l'ordre des Arts et Lettres en France, de genre grammatical masculin y compris pour les femmes function p.awards() local function awardsList() local majorawards = require 'Module:Dictionnaire Wikidata/Distinctions' local query = { entity = item, property= 'P166', sorttype= 'chronological', grouped = true, showqualifiers = 'P642', showdate= true, precision = 'year', conjtype = 'new line', textformat = 'minimum', linktopic = '-', defaultlinkquery = {property = {'P2354', 'P361' , 'P1027'}}, excludevalues = majorawards.exclude, -- membre de la Royal Society, redondance avec le champ « membre de » (P463) speciallabels = majorawards, labelformat = function(id) masclabel = false for _, item in pairs(masclabelitems) do if id == item then masclabel = true end end if masclabel then return genderedlabel(id, 'm') else return genderedlabel(id) end end, } local claims = wikidata.getClaims(query) if (not claims) then return nil end local str = wikidata.formatAndCat(query) if #claims < 4 then return str, #claims end --si trop de valeurs, n'afficher que les importantes de [[Module:Dictionnaire Wikidata/Distinctions]], et mettre les autrs dans un menu pliant --- récupération des importantes local majorStr local targetvalues = {} for i, j in pairs(majorawards) do table.insert(targetvalues, i) end query.targetvalue = targetvalues query.value, query.claims, query.valuetable = nil, nil, nil -- apparemment sinon ce n'est pas le cas, pourquoi ? BUG IMPORTANT majorStr = wikidata.formatAndCat(query) --- repliage des autres local message = "'''Liste détaillée'''" local allAwardsTable = mw.html.create('div') :addClass('toccolours mw-collapsible mw-collapsed') :wikitext(message) :css{border = 'none'} :tag('div') :addClass('mw-collapsible-content') :css{['line-height'] = '150%'} -- sinon c'est vraiment serré :wikitext( str) :done() :allDone() return linguistic.conj({majorStr, tostring(allAwardsTable)}, '<br>'), #claims end return { type = 'row', value = {'prix', 'récompenses', 'distinction', 'distinctions'}, label = 'Distinctions', singularlabel = 'Distinction', wikidata = function() return awardsList() end } end -- Influences function p.influencedby() return { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Influencée par' else return 'Influencé par' end end, value = 'influencé par', wikidata = {property = 'P737'}, } end function p.influenced() return { type = 'row', label = 'A influencé', value = {'a influencé', 'influence de'}, } end -- Appartenances function p.movement() return { type = 'row', label = 'Mouvement', value = 'mouvement', plurallabel = 'Mouvements', wikidata = {property = 'P135', sorttype= 'chronological', showdate = true, precision = 'year'}, } end -- Religion function p.religion() return {type = 'multi', rows = { { type = 'row', label = 'Religion', value = 'religion', }, { type = 'row', label = 'Date de baptême', value = 'date de baptême', property = 'P1636', }, --{ -- type = 'row', En l'état, afficherait "parrain" y compris pour la marraine. Quoi qu'il en soit, pertinence douteuse. -- label = 'Parrain', -- plurallabel = 'Parrains', -- value = 'parrain', -- property = 'P1290', --}, { type = 'row', label = 'Nom en religion', plurallabel = 'Noms en religion', value = 'nom en religion', property = 'P1635', }, { type = 'row', label = 'Ordre religieux', plurallabel = 'Ordres religieux', value = 'ordre religieux', wikidata = {property = 'P611', showdate = true, sorttype= 'chronological', precision = 'year', stilltrue = not dead}, }, { type = 'row', label = 'Consécrateur', plurallabel = 'Consécrateurs', value = 'consécrateur', property = 'P1598', }, { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Vénérée par' elseif gender == 'm' then return 'Vénéré par' else return 'Vénéré par' end end, value = 'vénéré par', property = 'P1049', }, { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Vénérée à' elseif gender == 'm' then return 'Vénéré à' else return 'Vénéré à' end end, value = 'vénéré à', -- property = , }, { type = 'row', label = 'Étape de canonisation', value = 'étape de canonisation', wikidata = { property = 'P411', labelformat = genderedlabel, }, }, }} end -- Carrière militaire function p.military() return {type = 'multi', rows = { { type = 'row', label = 'Arme', plurallabel = 'Armes', value = 'arme', wikidata = {property = 'P241', showdate = true, stilltrue = not dead, sorttype= 'chronological', precision = 'year'}, }, { type = 'row', label = 'Unité', plurallabel = 'Unités', value = 'unité', wikidata = {property = 'P7779', showdate = true, stilltrue = not dead, sorttype= 'chronological', precision = 'year', conjtype = 'new line'}, }, { type = 'row', label = 'Grade militaire', plurallabel = 'Grades militaires', value = 'grade militaire', blockers = {'grade'}, -- paramètre théoriquement dédié aux arts martiaux et au go mais souvent rempli avec des grades militaires wikidata = { property = 'P410', showdate = true, sorttype= 'chronological', precision = 'year', speciallabels = militaryranks, conjtype ='new line', labelformat = genderedlabel, stilltrue = not dead }, }, { type = 'row', label = 'Conflit', plurallabel = 'Conflits', value = 'conflit', wikidata = {property = 'P607', conjtype = 'new line', showdate = true, stilltrue = not dead, sorttype= 'chronological', precision = 'year'}, }, }} end -- Carrière de torero function p.torero() return {type = 'multi', rows = { { type = 'row', label = 'Alternative', value = 'alternative', wikidata = function() return wikidata.keyDate('Q2840411', item) end }, { type = 'row', label = "Confirmation d'alternative", value = 'confirmation alt', wikidata = function() return wikidata.keyDate('Q23308805', item) end }, }} end -- Sport function p.sport() return {type = 'multi', rows = { { type = 'row', label = 'Sport', plurallabel = 'Sports', value = {'sport', 'sport pratiqué'}, wikidata = {property = 'P641'}, }, { type = 'row', label = 'Équipe', plurallabel = 'Équipes', value = 'équipe', wikidata = { property = 'P54', sorttype= 'chronological', conjtype = 'new line', statementformat = function(statement) local str = wikidata.formatStatement(statement, {showdate = true}) local compets = wikidata.getFormattedQualifiers(statement, {'P1350'}) if tonumber(compets) and (tonumber(compets) > 1) then compets = compets .. ' matchs joués' elseif compets then compets = compets .. ' match joué' end local points = wikidata.getFormattedQualifiers(statement, {'P1351'}) if tonumber(points) and (tonumber(points) > 1) then points = points .. ' points marqués' elseif points then points = points .. 'point marqué' end local qualifiers = linguistic.conj{compets, points} if qualifiers then str= str .. ' <small> – ' .. qualifiers .. ' </small>' end return str end } }, { type = 'row', label = 'Position', plurallabel = 'Positions', value = {'position', 'poste', 'spécialité'}, wikidata = {property = 'P413', labelformat = genderedlabel, }, }, { type = 'row', label = 'Discipline sportive', plurallabel = 'Disciplines sportives', value = 'discipline sportive', wikidata = {property = 'P2416'}, }, { type = 'row', label = 'Prise de raquette', value = 'prise de raquette', wikidata = {property = 'P741'}, }, { type = 'row', label = 'Tire de la', value = 'tire', wikidata = {property = 'P423'}, }, { type = 'row', label = 'Repêchage par', plurallabel = 'Repêchages par', value = 'repêchage', wikidata = { property = 'P647', statementformat = function(statement) local team = wikidata.formatStatement(statement) local moment = wikidata.getFormattedQualifiers(statement, {'P793'}) or wikidata.getFormattedQualifiers(statement, {'P585'}) local rank = wikidata.getFormattedQualifiers(statement, {'P1836'}) if rank then rank = require 'Module:Nombre2texte'.ordinal(rank) .. ' choix' end local qualifs = linguistic.conj({moment, rank}, '&nbsp;– ') if not qualifs then return team end return team .. ' <small>(' .. qualifs .. ')</small>' end }, }, { type = 'row', label = 'Capes internationales', value = 'capes', wikidata = {property = 'P1129', numval = 1}, }, { type = 'row', label = 'Titre aux échecs', plurallabel = 'Titres aux échecs', value = 'titre aux échecs', wikidata = {property = 'P2962', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Classement Elo', value = 'classement elo', wikidata = {property = 'P1087', numval = '1', sorttype = 'inverted', showdate = true, precision = 'year', removedupes = true}, }, { type = 'row', label = 'Record détenu', plurallabel = 'Records détenus', value = 'record détenu', wikidata = {property = 'P1000', sorttype= 'chronological', showdate = true}, }, { type = 'row', label = 'Entraîneur', plurallabel = 'Entraîneurs', value = 'entraîneur', wikidata = {property = 'P286', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Copilote', plurallabel = 'Copilotes', value = 'copilote', wikidata = {property = 'P2095', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Mécène', plurallabel = 'Mécènes', value = {'mécène', 'mécènes', 'sponsor', 'sponsors'}, wikidata = {property = 'P859', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, }} end -- Contacts function p.contacts() return {type = 'multi', rows = { { type = 'row', label = localdata['intitulé maître'] or 'Maître', plurallabel = 'Maîtres', value = {'maître', 'maîtres'}, wikidata = {property = 'P1066', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = { ms = 'Directeur de thèse', fs = 'Directrice de thèse', mp = 'Directeurs de thèse', fp = 'Directrices de thèse', default = '<abbr class="abbr" title="Direction">Dir.</abbr> de thèse' }, value = {'directeur de thèse', 'dir. de thèse'}, wikidata = {property = 'P184', sorttype= 'chronological', showdate = true, precision = 'year'}, }, { type = 'row', label = 'Agent', label = function(localdata, item) if gender == 'f' then return 'Représentée par' elseif gender == 'm' then return 'Représenté par' else return 'Représenté par' end end, value = 'représenté par', wikidata = {property = 'P1875'}, }, { -- Partenaire professionnel ou sportif type = 'row', label = 'Partenaire', plurallabel = 'Partenaires', value = 'partenaire', wikidata = {property = 'P1327', showdate = true, sorttype= 'chronological'}, }, { type = 'row', label = localdata['intitulé élève'] or 'Élève', plurallabel = 'Élèves', value = {'élève', 'élèves'}, wikidata = {property = 'P802', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year', numval = '5', expl = ''}, }, { type = 'row', label = 'Étudiant de thèse', plurallabel = 'Étudiants de thèse', value = 'étudiant de thèse', wikidata = {property = 'P185', sorttype= 'chronological', showdate = true, precision = 'year', numval = '5', expl = ''}, }, { type = 'row', label = 'Personne liée', plurallabel = 'Personnes liées', value = 'personne liée', wikidata = {property = 'P3342', numval = 5, showqualifiers = 'P3831',qualiflink="-",qualiflabelformat="objectgender"}, --objectgender à créer dans Module:Wikidata }, }} end -- Mécénat function p.patron() return { type = 'row', label = '[[Mécénat|Mécènes]]', singularlabel = '[[Mécénat|Mécène]]', plurallabel = '[[Mécénat|Mécènes]]', value = 'mécènes', wikidata = {property = 'P859', showdate = true, stilltrue = not dead, sorttype = 'chronological', conjtype = 'comma'}, } end -- Musique function p.music() return {type = 'multi', rows = { { type = 'row', label = 'Tessiture', value = 'tessiture', property = 'P412', }, { type = 'row', label = 'Fach', value = 'fach', property = 'P1731', }, { type = 'row', label = 'Instrument', plurallabel = 'Instruments', value = 'instrument', wikidata = {property = 'P1303', sorttype= 'chronological', excludevalues='Q17172850'}, --probablement jugée redondante avec l'occupation "chanteur" }, { type = 'row', label = 'Label', plurallabel = 'Labels', value = 'label', wikidata = {property = 'P264', sorttype= 'chronological', showdate = true, precision = 'year'}, }, }} end -- Victimes function p.victims() return {type = 'multi', rows = { { type = 'row', label = 'Victimes', value = 'victimes', wikidata = {property = 'P1345'}, }, }} end -- Condamnations function p.penalties() return {type = 'multi', rows = { { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Condamnée pour' elseif gender == 'm' then return 'Condamné pour' else return 'Condamné pour' end end, value = 'condamné pour', wikidata = {property = 'P1399', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'}, }, { type = 'row', label = 'Condamnation', plurallabel = 'Condamnations', value = 'condamnation', wikidata = {property = 'P1596', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'}, }, { type = 'row', label = 'Lieu de détention', plurallabel = 'Lieux de détention', value = 'lieu de détention', wikidata = {property = 'P2632', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'}, }, }} end -- Physique function p.appearance() return {type = 'multi', rows = { { type = 'row', label = 'Taille', value = 'taille', wikidata = {property = 'P2048', targetunit = 'metre', rounding = '2'}, }, { type = 'row', label = '[[masse corporelle|Poids]]', value = {'poids','masse'}, wikidata = {property = 'P2067', targetunit = 'kilogram', conjtype = 'new line', showdate=true, rounding = '1'}, }, { type = 'row', label = 'Cheveux', value = 'cheveux', wikidata = {property = 'P1884'}, }, { type = 'row', label = 'Yeux', value = 'yeux', wikidata = {property = 'P1340'}, }, }} end -- Famille function p.gens() return {type = 'multi', rows = { { type = 'row', label = 'Gens', value = 'gens', wikidata = {property = 'P5025'}, }, }} end function p.family() local function showkinship(statement) local personid = wikidata.getMainId(statement) local personlabel = wikidata.formatEntity(personid, { labelformat2 = noble.labelInfobox }) local persongender = wikidata.getgender(personid) local kintype = wikidata.getFormattedQualifiers( statement, 'P1039', { labelformat = function(id) return genderedlabel(id, persongender) end, link = '-' } ) if kintype then return personlabel .. ' ' .. linguistic.inparentheses(kintype) end return personlabel end return {type = 'multi', rows = { { type = 'row', label = 'Famille', plurallabels = 'Familles', value = 'famille', property = 'P53', }, { type = 'row', label = 'Père', value = 'père', wikidata = { property = 'P22', showqualifiers = "P1039", conjtype = ' ou ', labelformat2 = noble.labelInfobox }, }, { type = 'row', label = 'Mère', value = 'mère', wikidata = {property = 'P25', showqualifiers = "P1039", unknownlabel = 'Inconnue', conjtype = ' ou ', labelformat2 = noble.labelInfobox }, }, { type = 'row', label = 'Beau-parent', plurallabel = 'Beaux-parents', value = {'beau-parent', 'beau-père', 'belle-mère'}, wikidata = { property = 'P3448', labelformat2 = noble.labelInfobox }, }, { type = 'row', label = 'Fratrie', value = 'fratrie', wikidata = { property = 'P3373', sorttype = 'age', conjtype = 'new line', textformat = 'long', precision = 'year', stilltrue = not dead, statementformat = showkinship, excludespecial = true, labelformat2 = noble.labelInfobox, } }, { type = 'row', label = 'Conjoint', -- todo : adapter le libellé en genre ? plurallabel = 'Conjoints', value = 'conjoint', wikidata = { property = 'P26', showdate = true, linktopic = '-', sorttype = 'chronological', conjtype = 'new line', textformat = 'long', precision = 'year', stilltrue = not dead, precision = 'year', excludespecial = true, labelformat2 = noble.labelInfobox, } }, { type = 'row', label = localdata['intitulé enfant'] or 'Enfant',-- todo : adapter le libellé en genre ? plurallabel = 'Enfants', value = 'enfant', wikidata = { property = 'P40', conjtype = 'new line', showdate = false, sorttype = 'age', labelformat2 = noble.labelInfobox, } }, { type = 'row', label = 'Parentèle', value = 'parentèle', wikidata = { property = 'P1038', excludespecial = true, conjtype = 'new line', statementformat = showkinship } }, }} end -- Esclavage function p.slavery() return {type = 'multi', rows = { { type = 'row', label = 'Statut', plurallabel = 'Statuts', value = 'statut', wikidata = {property = 'P3716', showdate = true, labelformat = genderedlabel, excludevalues = {'Q11573099','Q10076267'}, --membre de la famille royale (doublon avec les propriétés familiales) et propriétaire d'esclaves (pas vraiment un statut) defaultlinkquery = 'P425'}, }, { type = 'row', label = 'Propriétaire', plurallabels = 'Propriétaires', value = 'propriétaire', wikidata = {property = 'P127'}, }, }} end -- Œuvres function p.works(params) params = params or {} local title = params.title or 'Œuvres principales' params.title = nil local wikidata = { excludespecial = true, numval = 5, property = 'P800', defaultlink = 'image', showdate= true, labelformat = function(id) local label = wikidata.getLabel(id) if label then if wikidata.isInstance('Q386724', id, 6) then --italique pour les instances d' "œuvre" ou ses sous-classes if wikidata.isInstance('Q14897293', id, 5) or wikidata.isInstance('Q13226383', id, 5) or wikidata.isInstance('Q3622126', id, 5) or wikidata.isInstance('Q12894677', id, 5) then --sauf les instances d'"entité fictionnelle", "équipement", "système de concepts", "moyen pour une fin" ou leurs sous-classes return label else return '<i>' .. label .. '</i>' end else return label end end end, } for i, j in pairs(params) do wikidata[i] = j end return {type = 'table', title = title, singulartitle = singulartitle, rows = { { type = 'row', value = 'œuvres principales', wikidata = wikidata } } } end function p.filmography() local title = 'Films notables' return {type = 'row', label = 'Films notables', value = 'films notables', property = 'P1283'} end function p.discography() local title = 'Discographie' return {type = 'row', label = 'Discographie', value = 'discographie', property = 'P358'} end -- Signature function p.signature(default) local nom = localdata.nom or mw.title.getCurrentTitle().text local alt = 'siyati ' .. nom if mw.ustring.match( nom, '^[AEÈÉIOUY]' ) then alt = "siyati" .. nom end return { type = 'images', imageparameters = {'siyati'}, defaultimage = default, captionparameter = 'lejand siyati', defaultcaption = 'Siyati', uprightparameter = 'upright signature', defaultupright = 0.75, defaultalt = alt, property = 'P109', numval = 1 } end -- Enregistrement vocal function p.voice() return { type = 'images', style = {['padding-top'] = '25px'},--{['border-width'] = '10px', ['border-style'] = 'solid'}, defaultcaption = 'Enregistrement vocal', captionparameter = 'légende voix', imageparameters = 'voix', defaultsize = '280', wikidata = general.selectSound('P990'), numval = 1, } end -- Site web p.website = general.website -- Prononciation p.prononciation = general.prononciation -- fête du saint function p.feast() local title = 'Fête' return {type = 'row', label = 'Fête', value = 'fête', wikidata = {property = 'P841' , showqualifiers = 'P276'}} end -- archivé par function p.archivesat() return {type = 'row', label = 'Archives conservées par', value = "archivé par", wikidata = { property = 'P485', conjtype = 'new line', showqualifiers = {'P217','P7328','P585','P7103','P7104'}, qualifprecision = 'year', qualifformat = function(statement, qualifs, params) -- basé sur wikidata.getFormattedQualifiers dans [[Module:Wikidata]] local str = '' if not params then params = {} end local qualiftable = wikidata.getQualifiers(statement, qualifs) if not qualiftable then return nil end qualiftable = wikidata.filterClaims(qualiftable, params) or {} for i, snak in pairs(qualiftable) do if (snak.datatype == 'time' and snak.property == 'P7104') then -- fin de période couverte str = str .. '-' elseif i > 1 then str = str .. ', ' end qualiftable[i] = wikidata.formatSnak(snak, params) if snak.datatype == 'quantity' and tonumber(snak.datavalue.value.amount) > 1 then -- pluriel qualiftable[i] = qualiftable[i] .. 's' end str = str .. qualiftable[i] end return str end, showsource = true } } end return p f1gerbhqorpaeshfvplwjv0ygbaaehm 855627 855626 2024-11-12T23:03:49Z BwaKajou 31668 855627 Scribunto text/plain --[[ Avant de mettre en production une nouvelle version avez-vous : - mis en place des tests dans au moins une des pages de test d'un des modèles utilisant la fonction ? - testé avec la version bac à sable ? - modifié la documentation ? ]] -- Functions utilisées par les infobox personnes local p = {} local localdata = require 'Module:Infobox/Localdata' local item = localdata.item local wikidata = require 'Module:Wikidata' local general = require 'Module:Infobox/Fonctions' local datemodule = require 'Module:Date' local complexdate = require 'Module:Date complexe' local linguistic = require 'Module:Linguistique' local militaryranks = require 'Module:Dictionnaire Wikidata/Grades militaires' local ppath = require 'Module:Wikidata/Chemin' local noble = require 'Module:Noble' -- == Accord en genre local gender = wikidata.getgender(item) -- genre de la personne dont c'est l'infobox -- Version locale de wikidata.genderedlabel où si le genre n'est pas indiqué, c'est celui de la personne dont c'est l'infobox local function genderedlabel(id, labelgender) if not labelgender then labelgender = gender end return wikidata.genderedlabel(id, labelgender) end -- === Gestion des dates -- Liens thématiques vers les dates local datelinks = { -- lien vers le domaine d'activité approprié Q483501 = 'nan atizay plastik', -- artiste Q1028181 = 'nan atizay plastik', -- peintre Q1281618 = 'nan atizay plastik', -- sculpteur Q2309784 = 'nan siklis', -- cycliste Q16947657 = 'nan atizay plastik', -- lithographe Q11569986 = 'nan atizay plastik', -- graveur Q13365770 = 'nan atizay plastik', -- graveur sur cuivre Q21925567 = 'nan atizay plastik', -- sérigraphe Q10862983 = 'nan atizay plastik', -- aquafortiste Q36180 = 'nan literati', -- écrivain } local function getdatetopic() -- obtient le lien le plus approprié pour une date en fonction de la profession local claims = wikidata.stringTable{entity = item, property = 'P106', excludespecial = true, displayformat = 'raw'} if not claims then return nil end for i, j in pairs(claims) do if datelinks[j] then return datelinks[j] end end end local linktopic = getdatetopic() local unknowndatelabel = 'date inconnue' local birthdate = localdata['naissance'] or localdata['date de naissance'] or wikidata.formatAndCat{ entity = item, property = 'P569', unknownlabel = unknowndatelabel, conjtype = 'or', sorttype = 'chronological', removedupesdate = 'cat', minprecision = 8, --précision minimale pour être affichée : décennie } local dead = wikidata.getClaims{entity = item, property = 'P570'} --utilisé comme booléen qui dit si une personne est morte pour modifier certaines élément d'affichage local stillvalid if dead then stillvalid = "?" -- permet de remplacer des "depuis" par des "à partir de" end local deathdate = localdata['décès'] or localdata['date de décès'] local wddeathdate = wikidata.formatAndCat{ entity = item, property = 'P570', unknownlabel = unknowndatelabel, conjtype = 'or', sorttype = 'chronological', removedupesdate = 'cat', minprecision = 8, } local disappeardate = localdata['disparition'] local wddisappeardate = wikidata.formatAndCat{ entity = item, property = 'P746', unknownlabel = unknowndatelabel, conjtype = 'or', sorttype = 'chronological', removedupesdate = 'cat', showqualifiers = 'P276', minprecision = 8, } local function format1(event, period, predecessor, together, successor, displayformat) local mainstr = event if predecessor then local s = 'précédé par ' .. predecessor if gender == 'f' then s = 'précédée par ' .. predecessor end mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>' end if together then local s = 'avec ' .. together mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>' end if successor then local s = 'suivi par ' .. successor if gender == 'f' then s = 'suivie par ' .. successor end mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>' end return {type = 'row', label = period or '', value = function() return mainstr end} end ----------------- local function format2(event, period, predecessor, together, successor, displayformat) if (not event) then return nil end local rows = {} local eventrow = {type = 'row1col', color = 'secondcolor', value = event } table.insert(rows, eventrow) if period then period = '<span style="font-weight:normal">' .. period .. '</span>' local periodrow = {type = 'row1col', color = '#F9F9F9', value = period } table.insert(rows, periodrow) end if predecessor then local prederow = {type = 'row', label = 'Prédécesseur', value = function() return predecessor end} table.insert(rows, prederow) end if together then local succrow = {type = 'row', label = 'Avec', value = function() return together end} table.insert(rows, succrow) end if successor then local succrow = {type = 'row', label = 'Successeur', value = function() return successor end} table.insert(rows, succrow) end return {type = 'multi', rows = rows} end local function format3(event, period, predecessor, together, successor, displayformat, details) if details then details = '<span style="font-weight:normal">' .. details .. '</span>' event = linguistic.conj({event, details}, 'new line') end local mainrow = {type = 'row1col', color = 'secondcolor', value = event } if period then period = '<span style="font-weight:normal">' .. period .. '</span>' end local periodrow = {type = 'row1col', color = '#F9F9F9', value = period } local successionrow = { style = {['background-color'] = '#F9F9F9', ['padding-bottom'] = '2%'}, type = 'navigator', inner = true, previousval = function() return predecessor end, nextval = function() return successor end, } return {type = 'multi', rows = {mainrow, periodrow, successionrow}} end local function timeline(localparam, wdconf, timelineformat, title, singtitle, details) -- affiche date : événement (suppose les événements déjà triés) local rows = {} local function returnTable() return { type = 'table', title = title, rows = rows } end -- avec données locales local val = localdata[localparam] if val == '-' then return nil elseif val then table.insert(rows, {type = 'row1col', color = 'secondcolor', value = val}) return returnTable() end -- avec données wikidata if not wdconf then return nil end wdconf.entity = wdconf.entity or item wdconf.sorttype = wdconf.sorttype or 'chronological' wdconf.labelformat = wdconf.labelformat or genderedlabel wdconf.linktopic = wdconf.linktopic or '-' local statements = wikidata.getClaims(wdconf) if not statements then return nil end if #statements == 1 then title = singtitle end local displayformats = { A = format1, B = format2, C = format3, } local applyformat = displayformats[timelineformat] or displayformats['A'] rows = {} for i, statement in pairs(statements) do local event = linguistic.ucfirst(wikidata.formatStatement(statement, wdconf)) local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'}, {labelformat2 = noble.labelInfobox}) local together = wikidata.getFormattedQualifiers(statement, {'P1706', ''}, {labelformat2 = noble.labelInfobox}) local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'}, {labelformat2 = noble.labelInfobox}) local period = wikidata.getFormattedDate(statement, {linktopic = wdconf.linktopic, stilltrue = stillvalid } ) -- dont pass all wdconf or else qualifiers will show up local detailstr if type(details) == 'function' then detailstr = details(statement) end local row = applyformat(event, period, predecessor, together, successor, wdconf, detailstr) if row then table.insert(rows, row) end end table.insert(rows, {type = 'external text', value = function() return wikidata.addTrackingCat(wdconf.property) end}) return returnTable() end local function dateandplace(thedate, theplace) if thedate and theplace and mw.ustring.find(thedate, 'inconnu') and mw.ustring.find(theplace, 'inconnu') then theplace = nil thedate = mw.ustring.gsub(thedate, linguistic.ucfirst(unknowndatelabel), 'Date et lieu inconnus') end return linguistic.conj({thedate, theplace}, 'new line') end --Titre function p.title(icon, style) local title = general.title(icon, style) title.value = function() return localdata['nom'] or localdata['association_nom'] or localdata['nom_think'] or localdata['acronymelaboratoire'] or localdata['titre'] or wikidata.getLabel(localdata.item) and noble.labelInfobox( mw.language.getContentLanguage():ucfirst( wikidata.getLabel(localdata.item) ) ) or noble.labelInfobox( mw.title.getCurrentTitle().text ) end return title end --Image function p.mainimage(cat) -- demande d'illustration que si la personne est née ou morte après 1900, sinon c'est souvent impossible à trouver local defaultimage = 'Defaut 2.svg' local age = wikidata.stringTable{property = 'P569,P570', entity = item, displayformat = 'raw', excludespecial = true} if age and age[1] then local pattern = '(%W)(%d+)%-(%d+)%-(%d+)' local era, year = age[1]:match(pattern) if (era == '-') or (tonumber(year)) < 1900 then defaultimage = nil end end return general.mainimage({cat = cat or 'Article à illustrer Biographie', altparameter = 'alt'}, defaultimage) end -- Noms function p.othernames() local names = { {'P1477', 'Nom de naissance', 'Noms de naissance', 'nom de naissance'}, {'P1448', 'Nom officiel', 'Noms officiels', 'nom officiel'}, {'P1449', 'Surnom', 'Surnoms', 'surnom'}, {'P2001', 'Romanisation révisée', 'Romanisation révisée', 'romanisation révisée'}, {'P1942', 'McCune-Reischauer', 'McCune-Reischauer', 'McCune-Reischauer'}, {'P742', 'Pseudonyme', 'Pseudonymes', 'pseudonyme'}, {'P1782', 'Prénom social', 'Prénoms sociaux', 'prénom social'}, {'P1786', 'Nom posthume', 'Noms posthumes', 'nom posthume'}, {'P1785', 'Nom de temple', 'Noms de temple', 'nom de temple'}, {'P1787', 'Nom de pinceau', 'Noms de pinceau', 'nom de pinceau'}, {'P1813', 'Nom court', 'Noms courts', 'nom court'}, {nil, 'Autres noms', 'Autres noms', 'autres noms'}, } local nativelangnamerow = { -- un peu particulier, donc à part type = 'row', wikidata = function() local s = wikidata.formatAndCat{entity = item, property = 'P1559', showqualifiers = 'P1721', conjtype = 'or'} if (not s) then return nil end -- regarde si le nom de la valeur ressemble au libellé (en tenant compte de la pollution des marqueures de langue local label = mw.ustring.lower(wikidata.getLabel(item) or '') local useless if mw.ustring.find(mw.ustring.lower(s), mw.ustring.lower(label), 1, true) then useless = true end if wikidata.formatStatements{entity = item, property = 'P1559'} == wikidata.formatStatements{entity = item, property = 'P1477'} then useless = true --inutile si duplique le "nom de naissance" end if useless then return nil end return s end, label = 'Nom dans la langue maternelle', plurallabel = 'Noms dans la langue maternelle', value = 'nom dans la langue maternelle', } local rows = {type = 'multi', rows = {nativelangnamerow}} for i, j in pairs(names) do local query if j[1] and not localdata['autres noms'] then -- lorsqu'il y a un paramètre "autres noms", Wikidata est désactivée pour éviter risques de doublon query = {property = j[1], showqualifiers = {'P1721'}, conjtype = 'comma'} end table.insert(rows.rows, {type = 'row', value = j[4], wikidata = query, label = j[2], plurallabel = j[3]}) end return rows end -- NAISSANCE ET MORT function p.birth() -- date de naissance en première ligne, lieu de naissance en deuxième return { type = 'row', label = 'Naissance', value = function() local thedate = datemodule.dateInfobox{args = {[1] = 'naissance', [2] = birthdate or '', [3] = deathdate or wddeathdate or disappeardate or wddisappeardate or '', qualificatif = linktopic}} local theplace = localdata['lieu de naissance'] or wikidata.formatAndCat({entity =item, -- affichage du nom du lieu de naissance en vigueur à la date de naissance property= 'P19', rank = 'best', labelformat = function(val) return wikidata.getLabel(val) end, conjtype= ' ou ', defaultlinkquery = {property = {'P361'}}, -- liens par défaut : "partie de", unknownlabel = "lieu inconnu", showqualifiers = {'P131', 'P17'}, qualifconjtype = 'comma' } ) return dateandplace(thedate, theplace) end } end function p.death() -- même fonctionnement que la fonction p.birth -- date de disparition local ldisappeardate = disappeardate if (not ldisappeardate ) and (not deathdate) then -- récupérée de Wikidata seulement si la date de décès n'est pas fournie en locale ldisappeardate = wddisappeardate end if ldisappeardate and birthdate then ldisappeardate = datemodule.dateInfobox{args = {[1] = 'événement', [2] = birthdate or '', [3] = ldisappeardate or '', qualificatif = linktopic, unknownlabel = 'date inconnue'}} end -- date de décès local ddate = deathdate --déclarée pour l'ensemble du module if (not ddate) and (not ldisappeardate) then deathdate = wddeathdate -- récupérée de Wikidata seulement si la date de disparition n'est pas fournie en locale end local thedate = datemodule.dateInfobox{args = {[1] = 'mort', [2] = birthdate or '', [3] = deathdate or '', qualificatif = linktopic, unknownlabel = 'date inconnue'}} local theplace = localdata['lieu de décès'] or wikidata.formatAndCat{entity =item, property= 'P20', rank = 'best', -- affichage du nom du lieu de décès en vigueur à la date de décès labelformat = function(val) return wikidata.getLabel(val) end, conjtype= ' ou ', defaultlinkquery = {property = {'P361'}}, -- liens par défaut : "partie de", unknownlabel = "lieu inconnu", showqualifiers = {'P131', 'P17'}, qualifconjtype = 'comma' } local val = dateandplace(thedate, theplace) return {type = 'multi', rows = { { -- disparition type = 'row', label = 'Disparition', value = function() return ldisappeardate end }, { -- décès type = 'row', label = 'Décès', value = function() return val end, } }} end function p.floruit() return { type = 'row', label = "Période d'activité", value = "période d'activité", wikidata = function() local startDate = wikidata.formatAndCat{entity = item, property = 'P2031', conjtype = 'or', sorttype = 'chronological', linkback = '-'} local endDate = wikidata.formatAndCat{entity = item, property = 'P2032', conjtype = 'or', sorttype = 'chronological'} if not (startDate or endDate) then return wikidata.formatAndCat{entity = item, property = 'P1317', conjtype = 'or', sorttype = 'chronological'} end if startDate and not endDate then startDate = wikidata.formatAndCat{entity = item, property = 'P2031', conjtype = 'or', sorttype = 'chronological'} end return complexdate.daterange(startDate, endDate, {precision = 11, stilltrue = stillvalid}) end } end function p.placeofburial() return {type = 'row', label = 'Sépulture', value = 'sépulture', wikidata = {property = "P119", showdate = true, novaluelabel = 'aucune'}} end function table.slice(tbl, first, last, step) local sliced = {} for i = first or 1, last or #tbl, step or 1 do sliced[#sliced+1] = tbl[i] end return sliced end -- function that creates a filter function -- if the main country "base_country_item" is (replaced by)+ -- the subsequent statement main value that the function will receive as a parameter -- then the created function will return true for this statement to be filtered out local function filter_replaces_builder(base_country_item) -- P1365 = remplace -- P1366 = remplacé par local replaced_query = {property = 'P1365'} return function(may_be_replacing_stmt) local may_be_replacing_item = wikidata.getMainId(may_be_replacing_stmt) local replaces = wikidata.inTransitiveVals(may_be_replacing_item, base_country_item, replaced_query) return not(wikidata.inTransitiveVals(may_be_replacing_item, base_country_item, replaced_query)) end end -- filter parameterized by each of the values of the claims, in the order -- « filter_function_builder » will be called by all the values (remaining after filtering) in « claims » -- to filter the rest of the claims, starting from the first one in the list. local function iterated_filter(claims, filter_function_builder) -- the first country in the list, if any of the following value replaces this one -- we remove them. So we split the list local first_country_claim = claims[1] local to_test = table.slice(claims, 2, #claims) if #to_test > 0 then -- building the filter function with the first country as base value -- (a closure) local condition = filter_function_builder(wikidata.getMainId(first_country_claim)) -- keeping the number of values before the filter local nb_before = #to_test to_test = wikidata.filterClaims(to_test, {condition = condition}) or {} local nb_after = #to_test -- if some country was filtered out, we remove the dates of the main statement to avoid showing incomplete dates if (nb_before ~= nb_after and first_country_claim.qualifiers) then first_country_claim.qualifiers["P580"] = nil first_country_claim.qualifiers["P582"] = nil end -- if there still exists candidate countries, filter them recursively if #to_test > 0 then to_test = iterated_filter(to_test, filter_function_builder) end -- reconstruct the list of statement by readding our first country to the filtered list to_test = to_test or {} table.insert(to_test, 1, first_country_claim) return to_test end -- if there were nothing to filter, just return the first statement return {first_country_claim} end function p.nationality() local cmp = wikidata.compare -- à améliorer étant donnée les mœurs Wikidata comme nationalité : Empire allemand (1901-1918) République de Weimar (1918-1933) local function wdDate() local nation = require 'Module:Country data'.nationality -- désactivation si date de naissance avant l'Ère contemporaine : trop d'imprécisions et d'anachronismes local mindate = '1789' local birthdate = wikidata.formatStatements{entity = item, property = 'P569', displayformat = 'raw', numval = 1} local deathdate = wikidata.formatStatements{entity = item, property = 'P570', displayformat = 'raw', numval = 1} if ((not birthdate) or complexdate.before(mindate, birthdate)) and ((not deathdate) or complexdate.before(mindate, deathdate)) then return nil end -- preprocessing the "P27" statements -- if there is statements about a country that changed its regime, like France before and after the french Revolution -- then we just want to show "France" and not "France and France" because there is two statement (or worse) -- so we take advantage of the fact that the French Kingdom was "replaced by" French Republic (P1366) -- to detect and filter out such «redundant» values -- (we also remove the begin/end dates of statements in such cases to avoid wrong dating) local statements = wikidata.getClaims{entity = item, property = 'P27', rank='best', excludespecial=true} or {} -- sort nationality statements by statement dates or regime creation date if statement is not dated local sort_by_statement_or_regime = wikidata.chrono_key_sort{ sort_key="RegimeKey", -- use another key than « chronosort » snak_key_get_function = ppath.snak_key_by_paths{">P580","P571"}, --[[ either by « begin date » qualifier or « inception » of the nationality if the statement is not dated ]] key_compare_function = cmp.rev(function(v1, v2) return v1 < v2 end) -- sort in reverse chronological order to remove all values the first nationalities replaces } -- ordering statement by dates so that we can test only "A replaces B" and not "B replaces A" because A is an older regime than B statements = sort_by_statement_or_regime(statements) -- actual statement filtering statements = iterated_filter(statements, filter_replaces_builder) -- re-sorting in chronological ordering statements = wikidata.sortClaims(statements, cmp.chronoCompare) return { property = 'P27', claims = statements, -- our filtered statement as claims instead of the regular query showdate = true, entity = item, conjtype = 'new line', removedupes = true, linktopic = '-', sorttype = 'chronological', ucfirst = '-', stilltrue = not dead, displayformat = function(snak) -- local g = gender -- genre de la personne, pour affichage du gentilé -- if g == '?' then -- si inconnu, au masculin -- g = 'm' -- end local val, success = nation(wikidata.getId(snak), 'f') -- au féminin pour accorder au mot nationalité if not success then val = wikidata.formatSnak(snak) end return val end } end return { type = 'row', label = 'Nationalité', plurallabel = 'Nationalités', value = 'nationalité', wikidata = wdDate() -- wdDate() retourne une table } end function p.nativelanguage() return {type = 'row', label = 'Langue maternelle', value = 'langue maternelle', property = 'P103'} end function p.writinglanguage() return {type = 'row', label = "Langue d\'écriture", value = 'langue d\'écriture', plurallabel = "Langues d\'écriture" , wikidata = {property = 'P6886' , expl = true}} end -- Domiciles function p.places() return {type = 'multi', rows = { { type = 'row', label = 'Dème', plurallabel = 'Dèmes', value = 'dème', wikidata = {property = 'P2462', showdate = true, sorttype= 'chronological', stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Domicile', plurallabel = 'Domiciles', value = 'domicile', wikidata = {property = 'P551', showdate = true, sorttype= 'chronological', stilltrue = not dead, precision = 'year'}, }, }} end -- parcours professionel function p.education() local query = {sorttype= 'chronological', property = 'P69', showdate = true, stilltrue = '?', showqualifiers = 'P512', conjtype = 'new line', linktopic = '-'} return { type = 'row', value = {'éducation', 'formation'}, wikidata = query, label = 'Formation', } end function p.occupation() local speciallabels = { f = { ['Q33999'] = '[[Acteur|actrice]]', ['Q10798782'] = '[[Acteur|actrice]]', ['Q10800557'] = '[[Acteur|actrice]]', ['Q2405480'] = '[[Acteur|actrice]]', ['Q2259451'] = '[[Acteur|actrice]]', ['Q948329'] = '[[Acteur|actrice]]' }, m = { ['Q33999'] = '[[acteur]]', ['Q10798782'] = '[[acteur]]', ['Q10800557'] = '[[acteur]]', ['Q10798782'] = '[[acteur]]', ['Q2405480'] = '[[acteur]]', ['Q2259451'] = '[[acteur]]', ['Q948329'] = '[[acteur]]' } } return { type = 'row', value = {'activité', 'activités'}, wikidata = { property = 'P106', defaultlink = '-', defaultlinkquery = {property = {'P425','P1056'}}, labelformat = genderedlabel, speciallabels = speciallabels[gender] or speciallabels['m'], removedupes = true, showdate = true, sorttype = 'chronological', stilltrue = not dead, excludevalues = { -- les occupations qui ne méritent pas d'être affichées 'Q482980', -- auteur 'Q15980158', --"auteur de non-fiction" 'Q12144794', --prosateur 'Q18814623', -- autobiographe 'Q1209498', -- juriste-poète 'Q1097498', -- "dirigeant" 'Q2478141', -- aristocrate 'Q116', -- monarque 'Q115088092', -- participant à un forum international } }, label = 'Activité', plurallabel = 'Activités' } end function p.haswrittenfor() local valueStyle = {} valueStyle['font-style'] = 'italic' return {type = 'row', label = function(localdata, item) if gender == 'f' then return 'Rédactrice à' else return 'Rédacteur à' end end, value = 'rédacteur à', wikidata = {property = "P6872", showdate = true}, valueStyle = valueStyle} end function p.employer() return { type = 'row', value = 'employeur', wikidata = {property = 'P108', showdate = true, linktopic = '-', sorttype= 'inverted', stilltrue = not dead, conjtype = 'new line'}, label = function() return localdata['intitulé employeur'] or 'A travaillé pour' end, } end function p.victories() local title, singtitle = 'Victoires', 'Victoire' local localparam = 'victoire' local wdconf = {property = 'P2522'} local displayformat = 'B' return timeline(localparam, wdconf, displayformat, title, singtitle) end function p.officialposition() local title, singtitle = 'Fonctions', 'Fonction' local localparam = 'fonction' local wdconf = { property = 'P39', rank = 'valid', sorttype = 'inverted', defaultlinkquery = {property = {'P2354', 'P2389', 'P453', 'P361', 'P108', 'P276', 'P1001'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de", "partie de", employeur, ressort territorial } -- sur une ligne séparée : gouvernement, législature, juridiction, "de", circonsription, diocèse, affiliation, assemblée, parti, employeur local details = function(statement) return wikidata.getFormattedQualifiers(statement, {'P5054', 'P2937', 'P1001', 'P642', 'P2389', 'P768', 'P708', 'P1416', 'P194', 'P108', 'P937' , 'P1268'}, {conjtype = 'new line'}) end local displayformat = 'C' return timeline(localparam, wdconf, displayformat, title, singtitle, details) end function p.specialrole() local localparam = 'statut notable' local wdconf = { property = 'P2868', rank = 'valid', sorttype = 'inverted', targetsuperclass = 'Q254917', defaultlinkquery = {property = {'P2354'}}, -- lien par défaut : liste d'éléments } local displayformat = 'C' return timeline(localparam, wdconf, displayformat) end function p.nobilitytitle() local title, singtitle = 'Titres de noblesse', 'Titre de noblesse' local localparam = 'titre de noblesse' local wdconf = { property = 'P97', entity = item, rank = 'valid', showqualifiers = {'P642'}, defaultlinkquery = {property = {'P2354', 'P361'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de" et "partie de" } local displayformat = 'B' return timeline(localparam, wdconf, displayformat, title, singtitle) end function p.honorifictitle() local title, singtitle = 'Titres honorifiques', 'Titre honorifique' local localparam = 'titre honorifique' local wdconf = {property = 'P511', entity = item, rank = 'valid'} local displayformat = 'C' return timeline(localparam, wdconf, displayformat, title, singtitle) end function p.tombe() return { type = 'images', imageparameters = {'tombe'}, defaultimages = nil, defaultupright = 1, uprightparameter = 'upright tombe', sizeparameter = 'taille tombe', -- obsolète captionparameter = 'légende tombe', defaultcaption = 'Vue de la sépulture.', property = 'P1442', numval = 1, } end function p.plaque() return { type = 'images', imageparameters = {'plaque'}, defaultimages = nil, defaultupright = 1, uprightparameter = 'upright plaque', sizeparameter = 'taille plaque', -- obsolète captionparameter = 'légende plaque', defaultcaption = 'Plaque commémorative', property = 'P1801', numval = 1, } end function p.blason() return { type = 'images', imageparameters = {'blason'}, defaultimages = nil, defaultupright = 0.5, uprightparameter = 'upright blason', sizeparameter = 'taille blason', -- obsolète captionparameter = 'légende blason', defaultcaption = 'Blason', property = 'P94', numval = 1, } end function p.sceau() return { type = 'images', imageparameters = {'sceau'}, defaultimages = nil, defaultupright = 0.7, uprightparameter = 'upright sceau', sizeparameter = 'taille sceau', -- obsolète captionparameter = 'légende sceau', defaultcaption = 'Sceau', property = 'P158', numval = 1, } end function p.monogram() return { type = 'images', imageparameters = {'monogramme'}, defaultimages = nil, defaultsize = '100px', sizeparameter = 'taille monogramme', captionparameter = 'légende monogramme', defaultcaption = 'Monogramme', property = 'P1543', numval = 1, } end function p.flag() return { type = 'images', imageparameters = {'drapeau'}, defaultimages = nil, defaultsize = '150px', sizeparameter = 'taille drapeau', captionparameter = 'légende drapeau', defaultcaption = 'Drapeau', property = 'P41', numval = 1, } end function p.logo() return { type = 'images', imageparameters = {'logo'}, defaultimages = nil, defaultsize = '150px', sizeparameter = 'taille logo', captionparameter = 'légende logo', defaultcaption = 'Marque ou logotype', property = 'P154', numval = 1, } end function p.politicalparty() return { type = 'row', value = 'parti politique', label = 'Parti politique', plurallabel = 'Partis politiques', wikidata = { property = 'P102', sorttype= 'chronological', showdate = true, conjtype = 'new line', excludespecial = true, labelformat = function(id) if id == 'Q327591' and gender == 'f' then return 'indépendante' end end} } end function p.memberof() return {type = 'multi', rows = { { type = 'row', value = 'ordre de chevalerie', label = 'Ordre de chevalerie', plurallabel = 'Ordres de chevalerie', wikidata = {property = 'P550', sorttype= 'chronological', showdate = true, stilltrue = not dead}, }, { type = 'row', label = 'Membre de', value = 'membre de', wikidata = {property = 'P463', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year', linktopic = '-', textformat = 'minimum', conjtype = 'new line'}, }, }} end local masclabelitems = {a='Q10855271', b='Q10855195', c='Q10855212', d='Q10855216', e='Q13422138', f='Q13422140', g='Q13422141', h='Q13452524', i='Q13452528', j='Q13452531', k='Q14637182', l='Q14637176', m='Q14637188',} -- grades de la légion d'Honneur, de l'ordre national du Mérite, de l'ordre des Palmes académiques et de l'ordre des Arts et Lettres en France, de genre grammatical masculin y compris pour les femmes function p.awards() local function awardsList() local majorawards = require 'Module:Dictionnaire Wikidata/Distinctions' local query = { entity = item, property= 'P166', sorttype= 'chronological', grouped = true, showqualifiers = 'P642', showdate= true, precision = 'year', conjtype = 'new line', textformat = 'minimum', linktopic = '-', defaultlinkquery = {property = {'P2354', 'P361' , 'P1027'}}, excludevalues = majorawards.exclude, -- membre de la Royal Society, redondance avec le champ « membre de » (P463) speciallabels = majorawards, labelformat = function(id) masclabel = false for _, item in pairs(masclabelitems) do if id == item then masclabel = true end end if masclabel then return genderedlabel(id, 'm') else return genderedlabel(id) end end, } local claims = wikidata.getClaims(query) if (not claims) then return nil end local str = wikidata.formatAndCat(query) if #claims < 4 then return str, #claims end --si trop de valeurs, n'afficher que les importantes de [[Module:Dictionnaire Wikidata/Distinctions]], et mettre les autrs dans un menu pliant --- récupération des importantes local majorStr local targetvalues = {} for i, j in pairs(majorawards) do table.insert(targetvalues, i) end query.targetvalue = targetvalues query.value, query.claims, query.valuetable = nil, nil, nil -- apparemment sinon ce n'est pas le cas, pourquoi ? BUG IMPORTANT majorStr = wikidata.formatAndCat(query) --- repliage des autres local message = "'''Liste détaillée'''" local allAwardsTable = mw.html.create('div') :addClass('toccolours mw-collapsible mw-collapsed') :wikitext(message) :css{border = 'none'} :tag('div') :addClass('mw-collapsible-content') :css{['line-height'] = '150%'} -- sinon c'est vraiment serré :wikitext( str) :done() :allDone() return linguistic.conj({majorStr, tostring(allAwardsTable)}, '<br>'), #claims end return { type = 'row', value = {'prix', 'récompenses', 'distinction', 'distinctions'}, label = 'Distinctions', singularlabel = 'Distinction', wikidata = function() return awardsList() end } end -- Influences function p.influencedby() return { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Influencée par' else return 'Influencé par' end end, value = 'influencé par', wikidata = {property = 'P737'}, } end function p.influenced() return { type = 'row', label = 'A influencé', value = {'a influencé', 'influence de'}, } end -- Appartenances function p.movement() return { type = 'row', label = 'Mouvement', value = 'mouvement', plurallabel = 'Mouvements', wikidata = {property = 'P135', sorttype= 'chronological', showdate = true, precision = 'year'}, } end -- Religion function p.religion() return {type = 'multi', rows = { { type = 'row', label = 'Religion', value = 'religion', }, { type = 'row', label = 'Date de baptême', value = 'date de baptême', property = 'P1636', }, --{ -- type = 'row', En l'état, afficherait "parrain" y compris pour la marraine. Quoi qu'il en soit, pertinence douteuse. -- label = 'Parrain', -- plurallabel = 'Parrains', -- value = 'parrain', -- property = 'P1290', --}, { type = 'row', label = 'Nom en religion', plurallabel = 'Noms en religion', value = 'nom en religion', property = 'P1635', }, { type = 'row', label = 'Ordre religieux', plurallabel = 'Ordres religieux', value = 'ordre religieux', wikidata = {property = 'P611', showdate = true, sorttype= 'chronological', precision = 'year', stilltrue = not dead}, }, { type = 'row', label = 'Consécrateur', plurallabel = 'Consécrateurs', value = 'consécrateur', property = 'P1598', }, { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Vénérée par' elseif gender == 'm' then return 'Vénéré par' else return 'Vénéré par' end end, value = 'vénéré par', property = 'P1049', }, { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Vénérée à' elseif gender == 'm' then return 'Vénéré à' else return 'Vénéré à' end end, value = 'vénéré à', -- property = , }, { type = 'row', label = 'Étape de canonisation', value = 'étape de canonisation', wikidata = { property = 'P411', labelformat = genderedlabel, }, }, }} end -- Carrière militaire function p.military() return {type = 'multi', rows = { { type = 'row', label = 'Arme', plurallabel = 'Armes', value = 'arme', wikidata = {property = 'P241', showdate = true, stilltrue = not dead, sorttype= 'chronological', precision = 'year'}, }, { type = 'row', label = 'Unité', plurallabel = 'Unités', value = 'unité', wikidata = {property = 'P7779', showdate = true, stilltrue = not dead, sorttype= 'chronological', precision = 'year', conjtype = 'new line'}, }, { type = 'row', label = 'Grade militaire', plurallabel = 'Grades militaires', value = 'grade militaire', blockers = {'grade'}, -- paramètre théoriquement dédié aux arts martiaux et au go mais souvent rempli avec des grades militaires wikidata = { property = 'P410', showdate = true, sorttype= 'chronological', precision = 'year', speciallabels = militaryranks, conjtype ='new line', labelformat = genderedlabel, stilltrue = not dead }, }, { type = 'row', label = 'Conflit', plurallabel = 'Conflits', value = 'conflit', wikidata = {property = 'P607', conjtype = 'new line', showdate = true, stilltrue = not dead, sorttype= 'chronological', precision = 'year'}, }, }} end -- Carrière de torero function p.torero() return {type = 'multi', rows = { { type = 'row', label = 'Alternative', value = 'alternative', wikidata = function() return wikidata.keyDate('Q2840411', item) end }, { type = 'row', label = "Confirmation d'alternative", value = 'confirmation alt', wikidata = function() return wikidata.keyDate('Q23308805', item) end }, }} end -- Sport function p.sport() return {type = 'multi', rows = { { type = 'row', label = 'Sport', plurallabel = 'Sports', value = {'sport', 'sport pratiqué'}, wikidata = {property = 'P641'}, }, { type = 'row', label = 'Équipe', plurallabel = 'Équipes', value = 'équipe', wikidata = { property = 'P54', sorttype= 'chronological', conjtype = 'new line', statementformat = function(statement) local str = wikidata.formatStatement(statement, {showdate = true}) local compets = wikidata.getFormattedQualifiers(statement, {'P1350'}) if tonumber(compets) and (tonumber(compets) > 1) then compets = compets .. ' matchs joués' elseif compets then compets = compets .. ' match joué' end local points = wikidata.getFormattedQualifiers(statement, {'P1351'}) if tonumber(points) and (tonumber(points) > 1) then points = points .. ' points marqués' elseif points then points = points .. 'point marqué' end local qualifiers = linguistic.conj{compets, points} if qualifiers then str= str .. ' <small> – ' .. qualifiers .. ' </small>' end return str end } }, { type = 'row', label = 'Position', plurallabel = 'Positions', value = {'position', 'poste', 'spécialité'}, wikidata = {property = 'P413', labelformat = genderedlabel, }, }, { type = 'row', label = 'Discipline sportive', plurallabel = 'Disciplines sportives', value = 'discipline sportive', wikidata = {property = 'P2416'}, }, { type = 'row', label = 'Prise de raquette', value = 'prise de raquette', wikidata = {property = 'P741'}, }, { type = 'row', label = 'Tire de la', value = 'tire', wikidata = {property = 'P423'}, }, { type = 'row', label = 'Repêchage par', plurallabel = 'Repêchages par', value = 'repêchage', wikidata = { property = 'P647', statementformat = function(statement) local team = wikidata.formatStatement(statement) local moment = wikidata.getFormattedQualifiers(statement, {'P793'}) or wikidata.getFormattedQualifiers(statement, {'P585'}) local rank = wikidata.getFormattedQualifiers(statement, {'P1836'}) if rank then rank = require 'Module:Nombre2texte'.ordinal(rank) .. ' choix' end local qualifs = linguistic.conj({moment, rank}, '&nbsp;– ') if not qualifs then return team end return team .. ' <small>(' .. qualifs .. ')</small>' end }, }, { type = 'row', label = 'Capes internationales', value = 'capes', wikidata = {property = 'P1129', numval = 1}, }, { type = 'row', label = 'Titre aux échecs', plurallabel = 'Titres aux échecs', value = 'titre aux échecs', wikidata = {property = 'P2962', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Classement Elo', value = 'classement elo', wikidata = {property = 'P1087', numval = '1', sorttype = 'inverted', showdate = true, precision = 'year', removedupes = true}, }, { type = 'row', label = 'Record détenu', plurallabel = 'Records détenus', value = 'record détenu', wikidata = {property = 'P1000', sorttype= 'chronological', showdate = true}, }, { type = 'row', label = 'Entraîneur', plurallabel = 'Entraîneurs', value = 'entraîneur', wikidata = {property = 'P286', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Copilote', plurallabel = 'Copilotes', value = 'copilote', wikidata = {property = 'P2095', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = 'Mécène', plurallabel = 'Mécènes', value = {'mécène', 'mécènes', 'sponsor', 'sponsors'}, wikidata = {property = 'P859', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, }} end -- Contacts function p.contacts() return {type = 'multi', rows = { { type = 'row', label = localdata['intitulé maître'] or 'Maître', plurallabel = 'Maîtres', value = {'maître', 'maîtres'}, wikidata = {property = 'P1066', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year'}, }, { type = 'row', label = { ms = 'Directeur de thèse', fs = 'Directrice de thèse', mp = 'Directeurs de thèse', fp = 'Directrices de thèse', default = '<abbr class="abbr" title="Direction">Dir.</abbr> de thèse' }, value = {'directeur de thèse', 'dir. de thèse'}, wikidata = {property = 'P184', sorttype= 'chronological', showdate = true, precision = 'year'}, }, { type = 'row', label = 'Agent', label = function(localdata, item) if gender == 'f' then return 'Représentée par' elseif gender == 'm' then return 'Représenté par' else return 'Représenté par' end end, value = 'représenté par', wikidata = {property = 'P1875'}, }, { -- Partenaire professionnel ou sportif type = 'row', label = 'Partenaire', plurallabel = 'Partenaires', value = 'partenaire', wikidata = {property = 'P1327', showdate = true, sorttype= 'chronological'}, }, { type = 'row', label = localdata['intitulé élève'] or 'Élève', plurallabel = 'Élèves', value = {'élève', 'élèves'}, wikidata = {property = 'P802', sorttype= 'chronological', showdate = true, stilltrue = not dead, precision = 'year', numval = '5', expl = ''}, }, { type = 'row', label = 'Étudiant de thèse', plurallabel = 'Étudiants de thèse', value = 'étudiant de thèse', wikidata = {property = 'P185', sorttype= 'chronological', showdate = true, precision = 'year', numval = '5', expl = ''}, }, { type = 'row', label = 'Personne liée', plurallabel = 'Personnes liées', value = 'personne liée', wikidata = {property = 'P3342', numval = 5, showqualifiers = 'P3831',qualiflink="-",qualiflabelformat="objectgender"}, --objectgender à créer dans Module:Wikidata }, }} end -- Mécénat function p.patron() return { type = 'row', label = '[[Mécénat|Mécènes]]', singularlabel = '[[Mécénat|Mécène]]', plurallabel = '[[Mécénat|Mécènes]]', value = 'mécènes', wikidata = {property = 'P859', showdate = true, stilltrue = not dead, sorttype = 'chronological', conjtype = 'comma'}, } end -- Musique function p.music() return {type = 'multi', rows = { { type = 'row', label = 'Tessiture', value = 'tessiture', property = 'P412', }, { type = 'row', label = 'Fach', value = 'fach', property = 'P1731', }, { type = 'row', label = 'Instrument', plurallabel = 'Instruments', value = 'instrument', wikidata = {property = 'P1303', sorttype= 'chronological', excludevalues='Q17172850'}, --probablement jugée redondante avec l'occupation "chanteur" }, { type = 'row', label = 'Label', plurallabel = 'Labels', value = 'label', wikidata = {property = 'P264', sorttype= 'chronological', showdate = true, precision = 'year'}, }, }} end -- Victimes function p.victims() return {type = 'multi', rows = { { type = 'row', label = 'Victimes', value = 'victimes', wikidata = {property = 'P1345'}, }, }} end -- Condamnations function p.penalties() return {type = 'multi', rows = { { type = 'row', label = function(localdata, item) if gender == 'f' then return 'Condamnée pour' elseif gender == 'm' then return 'Condamné pour' else return 'Condamné pour' end end, value = 'condamné pour', wikidata = {property = 'P1399', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'}, }, { type = 'row', label = 'Condamnation', plurallabel = 'Condamnations', value = 'condamnation', wikidata = {property = 'P1596', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'}, }, { type = 'row', label = 'Lieu de détention', plurallabel = 'Lieux de détention', value = 'lieu de détention', wikidata = {property = 'P2632', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'}, }, }} end -- Physique function p.appearance() return {type = 'multi', rows = { { type = 'row', label = 'Taille', value = 'taille', wikidata = {property = 'P2048', targetunit = 'metre', rounding = '2'}, }, { type = 'row', label = '[[masse corporelle|Poids]]', value = {'poids','masse'}, wikidata = {property = 'P2067', targetunit = 'kilogram', conjtype = 'new line', showdate=true, rounding = '1'}, }, { type = 'row', label = 'Cheveux', value = 'cheveux', wikidata = {property = 'P1884'}, }, { type = 'row', label = 'Yeux', value = 'yeux', wikidata = {property = 'P1340'}, }, }} end -- Famille function p.gens() return {type = 'multi', rows = { { type = 'row', label = 'Gens', value = 'gens', wikidata = {property = 'P5025'}, }, }} end function p.family() local function showkinship(statement) local personid = wikidata.getMainId(statement) local personlabel = wikidata.formatEntity(personid, { labelformat2 = noble.labelInfobox }) local persongender = wikidata.getgender(personid) local kintype = wikidata.getFormattedQualifiers( statement, 'P1039', { labelformat = function(id) return genderedlabel(id, persongender) end, link = '-' } ) if kintype then return personlabel .. ' ' .. linguistic.inparentheses(kintype) end return personlabel end return {type = 'multi', rows = { { type = 'row', label = 'Famille', plurallabels = 'Familles', value = 'famille', property = 'P53', }, { type = 'row', label = 'Père', value = 'père', wikidata = { property = 'P22', showqualifiers = "P1039", conjtype = ' ou ', labelformat2 = noble.labelInfobox }, }, { type = 'row', label = 'Mère', value = 'mère', wikidata = {property = 'P25', showqualifiers = "P1039", unknownlabel = 'Inconnue', conjtype = ' ou ', labelformat2 = noble.labelInfobox }, }, { type = 'row', label = 'Beau-parent', plurallabel = 'Beaux-parents', value = {'beau-parent', 'beau-père', 'belle-mère'}, wikidata = { property = 'P3448', labelformat2 = noble.labelInfobox }, }, { type = 'row', label = 'Fratrie', value = 'fratrie', wikidata = { property = 'P3373', sorttype = 'age', conjtype = 'new line', textformat = 'long', precision = 'year', stilltrue = not dead, statementformat = showkinship, excludespecial = true, labelformat2 = noble.labelInfobox, } }, { type = 'row', label = 'Conjoint', -- todo : adapter le libellé en genre ? plurallabel = 'Conjoints', value = 'conjoint', wikidata = { property = 'P26', showdate = true, linktopic = '-', sorttype = 'chronological', conjtype = 'new line', textformat = 'long', precision = 'year', stilltrue = not dead, precision = 'year', excludespecial = true, labelformat2 = noble.labelInfobox, } }, { type = 'row', label = localdata['intitulé enfant'] or 'Enfant',-- todo : adapter le libellé en genre ? plurallabel = 'Enfants', value = 'enfant', wikidata = { property = 'P40', conjtype = 'new line', showdate = false, sorttype = 'age', labelformat2 = noble.labelInfobox, } }, { type = 'row', label = 'Parentèle', value = 'parentèle', wikidata = { property = 'P1038', excludespecial = true, conjtype = 'new line', statementformat = showkinship } }, }} end -- Esclavage function p.slavery() return {type = 'multi', rows = { { type = 'row', label = 'Statut', plurallabel = 'Statuts', value = 'statut', wikidata = {property = 'P3716', showdate = true, labelformat = genderedlabel, excludevalues = {'Q11573099','Q10076267'}, --membre de la famille royale (doublon avec les propriétés familiales) et propriétaire d'esclaves (pas vraiment un statut) defaultlinkquery = 'P425'}, }, { type = 'row', label = 'Propriétaire', plurallabels = 'Propriétaires', value = 'propriétaire', wikidata = {property = 'P127'}, }, }} end -- Œuvres function p.works(params) params = params or {} local title = params.title or 'Œuvres principales' params.title = nil local wikidata = { excludespecial = true, numval = 5, property = 'P800', defaultlink = 'image', showdate= true, labelformat = function(id) local label = wikidata.getLabel(id) if label then if wikidata.isInstance('Q386724', id, 6) then --italique pour les instances d' "œuvre" ou ses sous-classes if wikidata.isInstance('Q14897293', id, 5) or wikidata.isInstance('Q13226383', id, 5) or wikidata.isInstance('Q3622126', id, 5) or wikidata.isInstance('Q12894677', id, 5) then --sauf les instances d'"entité fictionnelle", "équipement", "système de concepts", "moyen pour une fin" ou leurs sous-classes return label else return '<i>' .. label .. '</i>' end else return label end end end, } for i, j in pairs(params) do wikidata[i] = j end return {type = 'table', title = title, singulartitle = singulartitle, rows = { { type = 'row', value = 'œuvres principales', wikidata = wikidata } } } end function p.filmography() local title = 'Films notables' return {type = 'row', label = 'Films notables', value = 'films notables', property = 'P1283'} end function p.discography() local title = 'Discographie' return {type = 'row', label = 'Discographie', value = 'discographie', property = 'P358'} end -- Signature function p.signature(default) local nom = localdata.nom or mw.title.getCurrentTitle().text local alt = 'siyati ' .. nom if mw.ustring.match( nom, '^[AEÈÉIOUY]' ) then alt = "siyati" .. nom end return { type = 'images', imageparameters = {'siyati'}, defaultimage = default, captionparameter = 'lejand siyati', defaultcaption = 'Siyati', uprightparameter = 'upright signature', defaultupright = 0.75, defaultalt = alt, property = 'P109', numval = 1 } end -- Enregistrement vocal function p.voice() return { type = 'imaj', style = {['padding-top'] = '25px'},--{['border-width'] = '10px', ['border-style'] = 'solid'}, defaultcaption = 'Anrejistreman vokal', captionparameter = 'lejand vwa', imageparameters = 'vwa', defaultsize = '280', wikidata = general.selectSound('P990'), numval = 1, } end -- Site web p.website = general.website -- Prononciation p.prononciation = general.prononciation -- fête du saint function p.feast() local title = 'Fête' return {type = 'row', label = 'Fête', value = 'fête', wikidata = {property = 'P841' , showqualifiers = 'P276'}} end -- archivé par function p.archivesat() return {type = 'row', label = 'Archives conservées par', value = "archivé par", wikidata = { property = 'P485', conjtype = 'new line', showqualifiers = {'P217','P7328','P585','P7103','P7104'}, qualifprecision = 'year', qualifformat = function(statement, qualifs, params) -- basé sur wikidata.getFormattedQualifiers dans [[Module:Wikidata]] local str = '' if not params then params = {} end local qualiftable = wikidata.getQualifiers(statement, qualifs) if not qualiftable then return nil end qualiftable = wikidata.filterClaims(qualiftable, params) or {} for i, snak in pairs(qualiftable) do if (snak.datatype == 'time' and snak.property == 'P7104') then -- fin de période couverte str = str .. '-' elseif i > 1 then str = str .. ', ' end qualiftable[i] = wikidata.formatSnak(snak, params) if snak.datatype == 'quantity' and tonumber(snak.datavalue.value.amount) > 1 then -- pluriel qualiftable[i] = qualiftable[i] .. 's' end str = str .. qualiftable[i] end return str end, showsource = true } } end return p 3z0howpzozsudtf93jgpirhno6sey07 Module:Infobox/Atis 828 87839 855625 825515 2024-11-12T22:55:42Z BwaKajou 31668 855625 Scribunto text/plain local person = require "Module:Infobox/Fonctions/Personne" local wikidata = require "Module:Wikidata" return { maincolor = '#7DA7D9', parts = { person.title('atis'), person.mainimage('Atik pou ilistre Atis'), {type = 'table', rows = { person.birth(), person.death(), person.placeofburial(), person.floruit(), person.othernames(), person.nationality(), --- arrangemement pour le paramètre "autres activités" (obsolète ?) function ( localdata ) if localdata['lòt aktivite'] then return {type = 'row', label = 'Aktivite', value = 'aktivite'} else return person.occupation() end end, {type = 'row', label = 'lòt aktivite', value = 'lòt aktivite'}, ---- person.education(), person.contacts(), {type = 'row', label = 'Lye travay', singularlabel = 'Lye travay', plurallabel = 'Lye travay', value = 'lye travay', wikidata = {property = 'P937', showdate = true, sorttype = 'chronological', conjtype = 'comma'} }, person.movement(), person.patron(), person.influencedby(), person.influenced(), person.family(), person.awards(), person.archivesat(), person.website(), }}, person.works({withlink = 'htwiki'}), {type = 'table', title = 'Konpleman', rows = { {type = 'row', value = 'konpleman'}, }}, person.signature(), person.tombe(), } } bim7wl8bnpv7rwqkgbbklx2l1i89u5u Penti ak lwil 0 88348 855650 828740 2024-11-13T03:03:41Z Kitanago 19629 855650 wikitext text/x-wiki [[Image:Mona_Lisa,_by_Leonardo_da_Vinci,_from_C2RMF_retouched.jpg|vignette|''[[La Joconde]]'', lwil sou panèl bwa, [[Leonardo da Vinci]], anviwon 1503-06, [[Louvre Museum]] ]] '''Pinti ak lwil''' se yon [[Penti (matyè)|penti]] ki gen [[lyan]] oswa machin ki se yon [[lwil]] [[Sikatif|sikatif]] ki anvlope nèt patikil [[pigman]]. Nou rele tou "penti" travay la nan kouch yon sifas ak sa a kalite pwodwi. Otorite normatif franse yo mande pou nou di ''penti'', men tèm sa a pa janm pran<ref>AFNOR dapre {{harvsp|Béguin|1990|p=348}}.</ref>. "Pinti ak lwil" se pou sa tou aktivite a nan anpil [[pent|atis penti]] pase ak prezan, osi byen ke yon [[teknik imaj]]. Finalman, yon "penti ak lwil" se yon [[Tablo (boza)|tablo]] ki pentire ak teknik sa a. == Istwa == Malgre jodi a, penti ak lwil refere sèlman a sa a {{sitasyon|ki gen lyan ki konpoze sèlman ak lwil gra<ref>Fransè estanda T 30.001 te site pa {{harvsp|Béguin|1990|p=348 "Lwil (penti dlo)"}} .</ref>}}, nan tan lontan, mo "lwil" te deziyen tou de "fiks" oswa lwil gra ak sa yo rele "esansyèl" oswa temèt lwil ke nou rele [[Esans (chimi)|esans]]. "Lwil" nan penti a ta ka nenpòt kalite lyan ki pa akeuz<ref>{{harvsp|Pracontal|2008|p=168}}; wè ankò {{Ouvraj|prenon1=Antoine|ti non1=Furetière|otè lyen1=Antoine Furetière|title=Diksyonè Universal|volume=2|editè=|ane=1701|li sou entènèt=https://gallica.bnf.fr/ ark:/12148/bpt6k5542578m/f531}}.</ref>. Enterè lwil oliv gra ak divès kalite [[Resin (penti)|rezin]] pou penti yo te konnen osi bonè ke {{s-|X}} la, men itilizasyon difisil li yo, konsistans nan penti a, nesesite pou tann yon anpil tan ant chak kouch, yo te opoze ak itilizasyon li yo. [[Giorgio Vasari|Vasari]] atribiye envansyon penti lwil oliv ak pent Flamand [[Jan van Eyck]] (1390-1441)<ref>''Lavi'', 1550, apre {{ harvsp|Béguin|1990| p=350sq}}.</ref>, ki te swiv pa anpil lòt otè<ref>{{harvsp|Pil|1766|p=15}} (1684); {{harvsp|Mérimée|1830|p=1}} deja gen dout, gade tou {{harvsp|Béguin|1990|p=351}}.</ref>. Li sèten ke pwosesis la te egziste anvan li. Mwàn [[Theophilus Presbyter]] mansyone difikilte li nan {{s-|XI}}. Van Eyck te amelyore li nan konbine rezin transparan, dirab ak fleksib ak lwil oliv, ki mennen nan adopsyon toupatou li yo<ref>{{harvsp|Langlais|2011|p=29}}</ref>. Pwosesis sa a te fè li posib pou sèvi ak lwil oliv pou komisyon alontèm, epi pita pou pentire sou twal lonje sou yon ankadreman epi yo pa sou panèl ankò<ref name="Langlais">{{harvsp|Langlais|2011|p={{ refins}}}}</ref>. Li posib ke modèl oriental lak Chinwa te enfliyanse atis Ewopeyen yo<ref>{{harvsp|Béguin|1990|p=351}}.</ref>. Aparisyon penti lwil oliv nan Lwès la te gradyèl. Pent medyeval yo te itilize [[tanpera]] ke yo pafwa kouvri ak yon kouch lwil pwoteksyon. Pandan jenerasyon yo, kouch lwil oliv sa a piti piti te vin chaje ak pigman, bay sa ki ka dekri kòm premye glase a. Nou jwenn tou "tanpera" sa a nan penti frè Van Eyck yo, anba kouch inonbrabl nan glase. Panno yo te gen entansyon pentire yo te enpreye ak plizyè kouch lakòl ak kouch, lè bwa a te enpafè, ki te souvan ka a nan peyi sid yo (Itali, Espay); yo te deja [[Marouflage|marouflage]] ak yon twal fin pou yo limite efè ekspansyon oswa retraksyon bwa a. == Konpozisyon == [[Image:Oil painting palette.jpg|vignette|150px|Palèt pentire ak lwil la]] Koulè lwil yo konpoze de pigman ki fòme materyèl ki gen koulè pal ak yon lyan ki konpoze de grenn len pirifye oswa lwil popsicle ki mare ak aglomera yo. Mens oswa sòlvan pou penti ak lwil se [[terebantin]] oswa [[gazolin sentetik|espri petwòl]] (oswa ekivalan modèn ki pa alèjik). Lwil yo itilize se jeneralman [[lwil len]] oswa [[lwil len|lwil oeillete]], oswa menm [[lwil carthame]] oswa [[lwil zanmann|lwil nwa]]. Ki sa nou rele "seche" se an reyalite yon fenomèn sikativasyon oswa [[Oksidasyon-rediksyon|reyaksyon oksidasyon]] nan lwil la, ki polymerize ak vin di, san yo pa chanje aparans nan travay la, epi nan kèk fason, pyèj pigman yo. epi li pèmèt konsèvasyon penti<ref>{{harvsp|Langlais||2011|p=150}}.</ref>. Penti lwil oliv se yon teknik siye dousman (nou ta dwe di siccative), kontrèman ak [[penti akrilik]] oswa [[akwarèl]], ki se teknik akeuz. Espesyalite sa a pèmèt atis la pran tan pou melanje koulè li yo, refè yon erè epi retravay modèl li pandan plizyè jou jiskaske li jwenn melanj la, fòm nan fòm, manyen li anvi. Sibstans ki vize pou akselere siye, pafwa toksik tankou plon blan, ta ka ajoute nan lwil natirèl siye. Frè van Eyck yo te kreye<ref name=":0">{{Ouvraj|prenon1=Gombrich, Ernst Hans,|ti non1=1909-|title=Istwa atizay|piblikatè=Phaidon|ane=2001|isbn=0 -7148-9207-6|oclc=300468076|li sou entènèt=https://www.worldcat.org/oclc/300468076}}</ref> teknik ki konbine rezin transparan, dirab ak fleksib ak lwil oliv. Li posib tou pou jwenn efè materyèl oswa soulajman ak yon keratin san patipri konsistan. Sèvi ak yon [[Spatula (penti)|spatula]] yo rele tou [[kouto penti|kouto]] pèmèt ou jwenn soulajman epi konsa ogmante materyèl travay la. Konsistans nan keratin nan ka amelyore lè yo ajoute medyòm penti, tèt yo te fè soti nan lyan an (lwil oliv) ak sòlvan (petrol) nan ki, si sa nesesè, yo ajoute yon résine amelyore fleksibilite nan fim nan. Mwayen an fè materyèl la pi pèrmeabl ak Se poutèt sa pi fasil yo gaye. Prezans rezin pa chanje non komen "penti ak lwil"<ref>{{harvsp|Béguin|1990|p=348 "lwil(penti ak lwil)"}}.</ref >. == Travay == [[File:Las_Meninas,_by_Diego_Velázquez,_from_Prado_in_Google_Earth.jpg|vignette|dwat|''[[Las Meninas]]'' ([[Diego Vélasquez|Velasquez]]) [[1656]]-[[1657]] ({{dunité|318|276|cm}}) [[Prado Museum]], [[Madrid]].]] Teknik la te rete san okenn chanjman pou yon tan long: pent la te trase konpozisyon li sou twal la oswa sou panèl an kwiv oswa an bwa ki prepare epi apre yon posib [[gri]], te monte sijè li a ak koulè lwil oliv, nan kouch mens , bay efè a. nan limyè atravè jwèt la nan lonbraj ak refleksyon. Lè sa a, yon fwa premye kouch sa yo te fin sèk, li kouvri yo ak tente, ekla transparan, ki amonize koloran jeneral la. Tout bagay la te fòme yon sifas ki trè lis, tankou yon twal lwil. Lè sa a, teknik la evolye, depi nan fen Renesans la, pent kòmanse fè eksperyans ak keratin yo nan lòd yo aksantué limyè yo pa ba yo, pou egzanp, plis epesè. Pwosesis sa a te vin jeneral ak nouvo teknik te fèt: penti nan keratin konplè, pa manyen, pa manyen separe, avèk oswa san trase preparasyon. Pent [[barok]] yo ([[Pierre Paul Rubens|Rubens]], [[Antoine van Dyck|Van Dyck]]) answit [[rokoko]] ([[François Boucher|Boucher]], [[Jean- Honoré Fragonard|Fragonard]]) ak Romantik yo ([[Eugène Delacroix|Delacroix]], [[Théodore Géricault|Géricault]]) te konnen kòman pou yo byen eksplwate ekriti lespri sa a ki opoze yon fason ki pi dous ak "poli" pou trete sijè a ( [[penti neo-klasik]], [[style ponpye]], [[Surrealism|surrealis]]). Penti lwil oliv gen patikilye nan pèmèt tou de apwòch, nan mitan lòt moun. == Bibliyografi == === Liv modèn === <!-- Nan lòd alphabétique otè yo --> * {{Ouvraj|prénom1=André|nom1=Béguin|lien auteur1=André Béguin|titre=Dictionnaire technique de la peinture|éditeur=|année=1990|isbn=}} notamment « Huile (peinture à l'~) », pp. 348~380. * {{Ouvraj|prénom1=Xavier de|nom1=Langlais|lien auteur1=Xavier de Langlais|titre=La technique de la peinture à l'huile : histoire du procédé à l'huile, de Van Eyck à nos jours : éléments, recettes et manipulations : pratique du métier : suivie d'une étude sur la peinture acrylique|éditeur=[[Groupe Flammarion|Flammarion]]|année=|année première édition=1959|réimpression=2011|isbn=978-2-08-125821-1|isbn2=2-08-125821-8|oclc=800485280|présentation en ligne=https://www.worldcat.org/oclc/800485280}} * {{Ouvraj|prénom1=Jacques|nom1=Maroger|lien auteur1=Jacques Maroger|préface=Marc Havel|titre=À la recherche des secrets des grands peintres|lieu=Paris|éditeur=Dessain et Tolra|année=1986|année première édition=1948|isbn=}} * {{Ouvraj |prénom1=Jean |nom1=Petit |prénom2=Jacques |nom2=Roire |prénom3=Henri |nom3=Valot |titre=Encyclopédie de la peinture |sous-titre=formuler, fabriquer, appliquer |tome=1 |lieu=Puteaux |éditeur=EREC |année=1999 |isbn= |id=PRV1}} * {{Ouvraj|prénom1=Jean |nom1=Petit |prénom2=Jacques |nom2=Roire |prénom3=Henri |nom3=Valot |titre=Encyclopédie de la peinture |sous-titre=formuler, fabriquer, appliquer |tome=2 |lieu=Puteaux |éditeur=EREC |année=2001 |isbn= |id=PRV2}} * {{Ouvraj|prénom1=Jean |nom1=Petit |prénom2=Jacques |nom2=Roire |prénom3=Henri |nom3=Valot |titre=Encyclopédie de la peinture |sous-titre=formuler, fabriquer, appliquer |tome=3 |lieu=Puteaux |éditeur=EREC |année=2005 |isbn= |id=PRV3}} * {{Ouvraj|prénom1=Patrice de|nom1=Pracontal|titre=Lumiere, matiere et pigment : Principes et techniques des procédés picturaux|éditeur=Gourcuff-Gradenigo|année=2008|isbn=}} === Liv istorik === <!-- pa ane premye [piblikasyon yo --> * {{Ouvraj|prénom1=Roger de|nom1=Piles|lien auteur1=Roger de Piles|titre=Elemens de peinture pratique|sous-titre=Nouvelle édition entièrement refondue et augmentée considérablement par [[Charles-Antoine Jombert]]|lieu=Paris|éditeur=|année=1766|lire en ligne=https://gallica.bnf.fr/ark:/12148/bpt6k6554237r?rk=386268}} * {{Ouvraj|prénom1=Jean Félix|nom1=Watin|titre=L'art du peintre|sous-titre=doreur, vernisseur , ouvrage utile aux artistes et aux amateurs qui veulent entreprendre de peindre, dorer et vernir toutes sortes de sujets en bâtimens, meubles, bijoux, equipages,{{elatriye}} |lieu=Paris|éditeur=|année=1773|numéro d'édition=2|année première édition=1772|lire en ligne=https://gallica.bnf.fr/ark:/12148/bpt6k841821?rk=64378;0}} * {{Ouvraj|prénom1=Jean-François-Léonor|nom1=Mérimée|lien auteur1=Léonor Mérimée|titre=De la peinture à l'huile, ou Des procédés matériels employés dans ce genre de peinture, depuis Hubert et Jean Van-Eyck jusqu'à nos jours|lieu=Paris|éditeur=Mme Huzard|année=1830|lire en ligne=https://gallica.bnf.fr/ark:/12148/bpt6k6552355d}}. * {{atik|prénom=Michel-Eugène|nom=Chevreul |lien auteur1=Michel-Eugène Chevreul |titre=Recherches expérimentales sur la peinture à l'huile |périodique=Mémoires de l'Académie des sciences de l'Institut de France |lieu=Paris |année=1850 |lire en ligne=https://gallica.bnf.fr/ark:/12148/bpt6k3236r/f841}}. === Lyen deyò=== {{Lòt pwojè |Commons=Category:Oil paint |wiktionary=peinture à l’huile }} * {{Lien web |prénom1=Hélène |nom1=Pasco |titre=Expérimentations en peinture à l’huile : l’exemple des médiums gels au {{s-|XIX}} |url=https://culturesciences.chimie.ens.fr/thematiques/chimie-analytique/spectroscopies/experimentations-en-peinture-a-l-huile-l-exemple-des |accès url=libre |site=Culture Sciences Chimie |date=20 janvye 2018 |consulté le=25 janvye 2022}} ==Referans== {{Références}} [[Kategori:Teknik penti]] [[Kategori:Pwojè:Krepisaj Wikipedya]] sl0la4l4ti0l0p7plwy55ds0gajju2o Modèl:Langue de titre 10 89458 855599 838889 2024-11-12T17:28:12Z BwaKajou 31668 855599 wikitext text/x-wiki <includeonly>{{DISPLAYTITLE:<span lang="{{{langue|{{{1|}}}}}}">{{FULLPAGENAME}}</span>|noerror}}{{#if:{{NAMESPACE}}||{{#switch:{{{langue|{{{1|}}}}}}||lat|mul|und|gr|gr-Latn|gr-latn|lu|jp|dk|oci=[[Kategori:Page avec code de langue invalide|T]]|ht=[[Kategori:Page avec modèle Langue du titre inutile]]}}}}<nowiki /></includeonly><noinclude>{{Documentation}}</noinclude> huo8jjj97lq8bun3x1hklh62yduvanr Natacha Ratto 0 93528 855614 854715 2024-11-12T18:49:23Z BwaKajou 31668 855614 wikitext text/x-wiki {{Infobox Biyografi}}Apre li te etidye achitekti, Natacha Ratto pibliye kèk bann sou Instagram ki te mete aksan sou aplikasyon an. Piblikatè a Webtoon remake yo, ki gen plan pou yo rete an Frans epi kontakte li. Natacha Ratto<ref>{{Cite web|url=https://www.ouest-france.fr/pays-de-la-loire/les-sables-dolonne-85100/les-sables-d-olonne-a-26-ans-sa-premiere-bande-dessinee-seduit-sur-la-plateforme-webtoon-7083458|title=Les Sables-d’Olonne. À 26 ans, sa première bande dessinée séduit sur la plateforme Webtoon|last=BURBAN|first=Thibault|date=2020-12-12|website=Ouest-France.fr|language=fr|access-date=2024-09-23}}</ref>, ap devlope seri li ''[[wikidata:Q120728189|Sex, Drugs & RER]]'', ki pibliye sou Webtoon apati mwa mas 2020 epi ki gen 138 epizòd. Se yon siksè : mitan-2023, li gen 21 milyon opinyon. == Nòt ak referans yo == === Nòt yo === {{Referans}} * {{Cite web|url=https://www.webtoons.com/fr/comedy/sexdrugsrer/list?title_no=1937|title=Sex, drugs & RER|last=Natacha Ratto|publisher=[[Webtoon (plateforme)|Webtoon]]|language=fr|access-date=18 juillet 2023}} * Thelma Susbielle, « Sex Drugs et RER - Par Natacha Ratto - Webtoon.com », ActuaBD,‎ 14 janvier 2022 (lire en ligne, consulté le 21 juillet 2023). * Tessa Lanney, « "Sex, drugs & RER" sur Webtoon, une BD inclusive et nuancée », Têtu,‎ 23 juin 2021 (ISSN 1265-3578, lire en ligne, consulté le 21 juillet 2023). t0k10upiu0v2k2z13yoclinm3h1uo9z Modèl:Infobox atizay 10 93547 855576 854818 2024-11-12T13:54:52Z BwaKajou 31668 855576 wikitext text/x-wiki <templateStyles src="Common/Style.css"> {{#invoke:Infobox|build|nom=Art}}{{Infobox en Lua|Art}}</includeonly><noinclude>{{Documentation}}</noinclude> 6lq49v8n2rndoezlw03c0fx9coztr8n 855585 855576 2024-11-12T15:20:00Z BwaKajou 31668 855585 wikitext text/x-wiki {{#invoke:Infobox|build|nom=Art}}{{Infobox en Lua|Art}}</includeonly><noinclude>{{Documentation}}</noinclude> eitlwfnqwjovrfcftwamgof6271qr0f Module:Infobox/Art 828 93548 855628 854819 2024-11-12T23:07:15Z BwaKajou 31668 855628 Scribunto text/plain --[[ Avant de mettre en production une nouvelle version avez-vous : - testé avec la version bac à sable ? - modifié la documentation ? ]] local geoloc = require 'Module:Infobox/Fonctions/Géolocalisation' local general = require 'Module:Infobox/Fonctions' local owner = require 'Module:Propriétaire' local material = require 'Module:Matériau' local linguistic = require 'Module:Linguistique' local protected = require 'Module:Classement' local wikidata = require 'Module:Wikidata' local linktopic = 'nan atizay plastik' local function dimensions( localdata ) local dimensions = { -- paramètre, abréviation à afficher dans l'en tête, propriété Wikidata, nom complet à afficher dans l'entête {'dyamèt', 'Diam', 'P2386', 'Dyamèt'}, { 'hauteur', 'H', 'P2048', 'Wotè'}, {'lajè', 'L', 'P2049', 'Lajè'}, {'pwofondè', 'l', 'P2610' , 'Pwofondè'}, } local data, dims = {}, {} local label = 'Dimansyon' local unit = localdata['unité'] or 'cm' local wikidataval = function(d) return wikidata.formatStatements{ entity = localdata.item, showunit = '-', targetunit = unit, addcat = true, property = d } end local propertyused = nil for i, j in pairs(dimensions) do local val = localdata[j[1]] if localdata.item and j[3] and not val then val = wikidataval(j[3]) if val then propertyused = j[3] end end if val then table.insert(data, val) table.insert(dims, i) end end if #data == 0 then return nil end if #data == 1 then label = dimensions[dims[1]][4] else for i, j in pairs(dims) do dims[i] = dimensions[j][2] end label = label .. linguistic.inparentheses(linguistic.conj(dims, ' × ')) end local val = linguistic.conj(data, ' × ') .. ' ' .. unit if propertyused then val = wikidata.formatAndCat{entity = localdata.item, property = propertyused, value = val} end return { type = 'row', label = label, value = function() return val end } end return { maincolor = '#f9f9f9', parts = { { type = 'title', value = function(localdata) return localdata['titre'] or wikidata.getLabel(localdata.item) and mw.language.getContentLanguage():ucfirst( wikidata.getLabel(localdata.item) ) or mw.title.getCurrentTitle().text end, subtitle = 'titre original', italic = true, setdisplaytitle = true, }, general.mainimage( { cat = "Article à illustrer Art", defaultimage = nil, wikidata = {property = {'P18', 'P5252', 'P7420'}} } ), {type = 'table', rows = { { type = 'row', label = 'Artiste', plurallabel = 'Artistes', value = 'artiste', wikidata = { property = 'P170', statementformat = function(statement) local str -- On commence par les qualificatifs (attribué à, atelier etc.) local possiblequalifiers = { P1773 = "attribué $to $creator", P1774 = "atelier $of $creator", P1775 = "suiveur $of $creator", P1776 = "cercle $of $creator", P1777 = "d'après $creator", -- TODO : d'après LE Maître X P1778 = "faux d'après $creator", P1779 = "$creator (?)", P1780 = "école $of", P1877 = "d'après une œuvre $of $creator", } if statement.qualifiers then for qualif, text in pairs(possiblequalifiers) do local creator = wikidata.getFormattedQualifiers(statement, {qualif}) if creator then str = text str = mw.ustring.gsub(str, '$to $creator', "à ".. creator) str = mw.ustring.gsub(str, '$of $creator', linguistic.of(creator)) str = mw.ustring.gsub(str, '$creator', creator) break end end end -- TODO : prendre en compte tous les qualificatifs pour une même déclaration, exemple [[Galate mourant]] -- Sinon, la voie normale if not str then str = wikidata.formatStatement(statement, {speciallabels = {Q4233718 = "anonyme"}}) -- speciallabels pour éviter le lien par défaut end return str end } }, { type = 'row', label = 'Date', value = 'année', wikidata = { property = 'P571', showqualifiers = {'P518'}, linktopic = linktopic, sorttype = 'chronological', conjtype = function() if wikidata.getClaims{entity = item, property = 'P571', qualifier = {'P518'}} then return "new line" else return "or" end end } }, { type = 'row', label = 'Civilisation', plurallabel = 'Civilisations', value = 'civilisation', property = 'P2596' }, { type = 'row', label = 'Commanditaire', plurallabel = 'Commanditaires', value = 'commanditaire', property = 'P88' }, { type = 'row', label = 'Type', value = 'type', property = 'P136', }, { type = 'row', label = 'Technique', plurallabel= 'Techniques', value = 'technique', property = 'P2079' }, { type = 'row', label = 'Matériau', value = function( localdata ) if localdata['type'] or localdata['technique'] then -- la matériau est parfois contenu dans le paramètre "type", ne pas utiliser wikidata dans ce cas return nil end return material.formatFromItem(localdata.item) end }, { type = 'row', label = 'Point de vue', plurallabel = 'Points de vue', value = 'point de vue', property = 'P7108' }, { type = 'row', label = 'Lieu de création', plurallabel = 'Lieux de création', value = 'lieu de création', property = 'P1071' }, dimensions, { type = 'row', label = 'Format', value = 'format', property = 'P1419', }, { type = 'row', label = 'Étude pour', value = 'étude pour', property = 'P6606', valueClass = 'italique', }, { type = 'row', label = 'Inspiration', value = 'inspiration', wikidata ={property = 'P941' , conjtype="new line"}, }, { type = 'row', label = 'Série', plurallabel = 'Séries', value = 'série', property = 'P179', valueClass = 'italique', }, { type = 'row', label = 'Pendant', plurallabel = 'Pendants', value = 'pendant', property = 'P1639', valueClass = 'italique', }, { type = 'row', label = 'Verso', value = 'verso', wikidata = {property = {'P2681', 'P2682'}}, valueClass = 'italique', }, { type = 'row', label = 'Mouvement', plurallabel = 'Mouvements', value = function(localdata) return localdata['mouvement'] or localdata['style'] end, property = 'P135', }, { type = 'row', label = 'Propriétaire', plurallabel = 'Propriétaires', value = 'propriétaire', wikidata = function() return owner.formatFromItem(item, {atdate = 'today'}) end }, { type = 'row', label = 'Collection', plurallabel = 'Collections', value = 'collection' }, { type = 'row', label = '<abbr class="abbr" title="Numéro">N<sup>o</sup></abbr> d’inventaire', value = 'inventaire', property = 'P217' }, { type = 'row', label = 'Localisation', value = function(localdata) local museum, location, city, country = localdata['musée'], localdata['localisation'], localdata['ville'], localdata['pays'] location = linguistic.conj({museum, location, city}, 'comma') if location == '-' then -- désactivation de l'utilisation de wikidata (car il ne faut pas d'espace après) return '-' end country = linguistic.inparentheses(country) if country then country = '<span class="nowrap">' .. country .. '</span>' end if location or country then return (location or '') .. ' ' .. (country or '') end return nil end, property = 'P276' -- devrait croiser P195 et utiliser l'arbitrary access pour le lieu }, { type = 'row', label = 'Modèle', plurallabel = 'Modèles', value = 'modèle', property = 'P2634' }, --[[ { type = 'row', label = 'Représente', value = 'représente', wikidata = {property = 'P180', numval = '4', rank = 'best'} }, ]]-- { type = 'row', label = 'Inscription', plurallabel = 'Inscriptions', value = 'inscription', wikidata = {property = 'P1684', conjtype = '<br />', numval = '3', rank = 'best'} }, { type = 'row', label = 'Commentaire', value = 'commentaire', }, { type = 'row', label = 'Protection', value = function(localdata) return localdata['protection'] or localdata['classement'] end, wikidata = function(item) return protected.formattedList(item)end }, geoloc.coordinates{maintenancecat = "Œuvre d'art géolocalisable sans coordonnées paramétrées"}, }}, geoloc.geoloc('default', '-'), -- le '-' indique de ne pas chercher automatiquement une carte si aucune n'est fournie dans |géolocalisation= } } bdsgtj0d6fhiefy3u5o37in0b0iprro 855629 855628 2024-11-12T23:09:41Z BwaKajou 31668 855629 Scribunto text/plain --[[ Avant de mettre en production une nouvelle version avez-vous : - testé avec la version bac à sable ? - modifié la documentation ? ]] local geoloc = require 'Module:Infobox/Fonctions/Géolocalisation' local general = require 'Module:Infobox/Fonctions' local owner = require 'Module:Propriétaire' local material = require 'Module:Matériau' local linguistic = require 'Module:Linguistique' local protected = require 'Module:Classement' local wikidata = require 'Module:Wikidata' local linktopic = 'nan atizay plastik' local function dimensions( localdata ) local dimensions = { -- paramètre, abréviation à afficher dans l'en tête, propriété Wikidata, nom complet à afficher dans l'entête {'dyamèt', 'Diam', 'P2386', 'Dyamèt'}, { 'wotè', 'H', 'P2048', 'Wotè'}, {'lajè', 'L', 'P2049', 'Lajè'}, {'pwofondè', 'l', 'P2610' , 'Pwofondè'}, } local data, dims = {}, {} local label = 'Dimansyon' local unit = localdata['unité'] or 'cm' local wikidataval = function(d) return wikidata.formatStatements{ entity = localdata.item, showunit = '-', targetunit = unit, addcat = true, property = d } end local propertyused = nil for i, j in pairs(dimensions) do local val = localdata[j[1]] if localdata.item and j[3] and not val then val = wikidataval(j[3]) if val then propertyused = j[3] end end if val then table.insert(data, val) table.insert(dims, i) end end if #data == 0 then return nil end if #data == 1 then label = dimensions[dims[1]][4] else for i, j in pairs(dims) do dims[i] = dimensions[j][2] end label = label .. linguistic.inparentheses(linguistic.conj(dims, ' × ')) end local val = linguistic.conj(data, ' × ') .. ' ' .. unit if propertyused then val = wikidata.formatAndCat{entity = localdata.item, property = propertyused, value = val} end return { type = 'row', label = label, value = function() return val end } end return { maincolor = '#f9f9f9', parts = { { type = 'title', value = function(localdata) return localdata['tit'] or wikidata.getLabel(localdata.item) and mw.language.getContentLanguage():ucfirst( wikidata.getLabel(localdata.item) ) or mw.title.getCurrentTitle().text end, subtitle = 'tit orijinal', italic = true, setdisplaytitle = true, }, general.mainimage( { cat = "Atik pou ilistre Atizay", defaultimage = nil, wikidata = {property = {'P18', 'P5252', 'P7420'}} } ), {type = 'table', rows = { { type = 'row', label = 'Atis', plurallabel = 'Atis', value = 'atis', wikidata = { property = 'P170', statementformat = function(statement) local str -- On commence par les qualificatifs (attribué à, atelier etc.) local possiblequalifiers = { P1773 = "attribué $to $creator", P1774 = "atelier $of $creator", P1775 = "suiveur $of $creator", P1776 = "cercle $of $creator", P1777 = "d'après $creator", -- TODO : d'après LE Maître X P1778 = "faux d'après $creator", P1779 = "$creator (?)", P1780 = "école $of", P1877 = "d'après une œuvre $of $creator", } if statement.qualifiers then for qualif, text in pairs(possiblequalifiers) do local creator = wikidata.getFormattedQualifiers(statement, {qualif}) if creator then str = text str = mw.ustring.gsub(str, '$to $creator', "à ".. creator) str = mw.ustring.gsub(str, '$of $creator', linguistic.of(creator)) str = mw.ustring.gsub(str, '$creator', creator) break end end end -- TODO : prendre en compte tous les qualificatifs pour une même déclaration, exemple [[Galate mourant]] -- Sinon, la voie normale if not str then str = wikidata.formatStatement(statement, {speciallabels = {Q4233718 = "anonyme"}}) -- speciallabels pour éviter le lien par défaut end return str end } }, { type = 'row', label = 'Dat', value = 'ane', wikidata = { property = 'P571', showqualifiers = {'P518'}, linktopic = linktopic, sorttype = 'chronological', conjtype = function() if wikidata.getClaims{entity = item, property = 'P571', qualifier = {'P518'}} then return "new line" else return "or" end end } }, { type = 'row', label = 'Civilisation', plurallabel = 'Civilisations', value = 'civilisation', property = 'P2596' }, { type = 'row', label = 'Commanditaire', plurallabel = 'Commanditaires', value = 'commanditaire', property = 'P88' }, { type = 'row', label = 'Type', value = 'type', property = 'P136', }, { type = 'row', label = 'Technique', plurallabel= 'Techniques', value = 'technique', property = 'P2079' }, { type = 'row', label = 'Matériau', value = function( localdata ) if localdata['type'] or localdata['technique'] then -- la matériau est parfois contenu dans le paramètre "type", ne pas utiliser wikidata dans ce cas return nil end return material.formatFromItem(localdata.item) end }, { type = 'row', label = 'Point de vue', plurallabel = 'Points de vue', value = 'point de vue', property = 'P7108' }, { type = 'row', label = 'Lieu de création', plurallabel = 'Lieux de création', value = 'lieu de création', property = 'P1071' }, dimensions, { type = 'row', label = 'Format', value = 'format', property = 'P1419', }, { type = 'row', label = 'Étude pour', value = 'étude pour', property = 'P6606', valueClass = 'italique', }, { type = 'row', label = 'Inspiration', value = 'inspiration', wikidata ={property = 'P941' , conjtype="new line"}, }, { type = 'row', label = 'Série', plurallabel = 'Séries', value = 'série', property = 'P179', valueClass = 'italique', }, { type = 'row', label = 'Pendant', plurallabel = 'Pendants', value = 'pendant', property = 'P1639', valueClass = 'italique', }, { type = 'row', label = 'Verso', value = 'verso', wikidata = {property = {'P2681', 'P2682'}}, valueClass = 'italique', }, { type = 'row', label = 'Mouvement', plurallabel = 'Mouvements', value = function(localdata) return localdata['mouvement'] or localdata['style'] end, property = 'P135', }, { type = 'row', label = 'Propriétaire', plurallabel = 'Propriétaires', value = 'propriétaire', wikidata = function() return owner.formatFromItem(item, {atdate = 'today'}) end }, { type = 'row', label = 'Collection', plurallabel = 'Collections', value = 'collection' }, { type = 'row', label = '<abbr class="abbr" title="Numéro">N<sup>o</sup></abbr> d’inventaire', value = 'inventaire', property = 'P217' }, { type = 'row', label = 'Localisation', value = function(localdata) local museum, location, city, country = localdata['musée'], localdata['localisation'], localdata['ville'], localdata['pays'] location = linguistic.conj({museum, location, city}, 'comma') if location == '-' then -- désactivation de l'utilisation de wikidata (car il ne faut pas d'espace après) return '-' end country = linguistic.inparentheses(country) if country then country = '<span class="nowrap">' .. country .. '</span>' end if location or country then return (location or '') .. ' ' .. (country or '') end return nil end, property = 'P276' -- devrait croiser P195 et utiliser l'arbitrary access pour le lieu }, { type = 'row', label = 'Modèle', plurallabel = 'Modèles', value = 'modèle', property = 'P2634' }, --[[ { type = 'row', label = 'Représente', value = 'représente', wikidata = {property = 'P180', numval = '4', rank = 'best'} }, ]]-- { type = 'row', label = 'Inscription', plurallabel = 'Inscriptions', value = 'inscription', wikidata = {property = 'P1684', conjtype = '<br />', numval = '3', rank = 'best'} }, { type = 'row', label = 'Commentaire', value = 'commentaire', }, { type = 'row', label = 'Protection', value = function(localdata) return localdata['protection'] or localdata['classement'] end, wikidata = function(item) return protected.formattedList(item)end }, geoloc.coordinates{maintenancecat = "Œuvre d'art géolocalisable sans coordonnées paramétrées"}, }}, geoloc.geoloc('default', '-'), -- le '-' indique de ne pas chercher automatiquement une carte si aucune n'est fournie dans |géolocalisation= } } 75u6vxpba1nfjtkapfmn6ahfy44ouae 855630 855629 2024-11-12T23:13:47Z BwaKajou 31668 855630 Scribunto text/plain --[[ Avant de mettre en production une nouvelle version avez-vous : - testé avec la version bac à sable ? - modifié la documentation ? ]] local geoloc = require 'Module:Infobox/Fonctions/Géolocalisation' local general = require 'Module:Infobox/Fonctions' local owner = require 'Module:Propriétaire' local material = require 'Module:Matériau' local linguistic = require 'Module:Linguistique' local protected = require 'Module:Classement' local wikidata = require 'Module:Wikidata' local linktopic = 'nan atizay plastik' local function dimensions( localdata ) local dimensions = { -- paramètre, abréviation à afficher dans l'en tête, propriété Wikidata, nom complet à afficher dans l'entête {'dyamèt', 'Diam', 'P2386', 'Dyamèt'}, { 'wotè', 'H', 'P2048', 'Wotè'}, {'lajè', 'L', 'P2049', 'Lajè'}, {'pwofondè', 'l', 'P2610' , 'Pwofondè'}, } local data, dims = {}, {} local label = 'Dimansyon' local unit = localdata['unité'] or 'cm' local wikidataval = function(d) return wikidata.formatStatements{ entity = localdata.item, showunit = '-', targetunit = unit, addcat = true, property = d } end local propertyused = nil for i, j in pairs(dimensions) do local val = localdata[j[1]] if localdata.item and j[3] and not val then val = wikidataval(j[3]) if val then propertyused = j[3] end end if val then table.insert(data, val) table.insert(dims, i) end end if #data == 0 then return nil end if #data == 1 then label = dimensions[dims[1]][4] else for i, j in pairs(dims) do dims[i] = dimensions[j][2] end label = label .. linguistic.inparentheses(linguistic.conj(dims, ' × ')) end local val = linguistic.conj(data, ' × ') .. ' ' .. unit if propertyused then val = wikidata.formatAndCat{entity = localdata.item, property = propertyused, value = val} end return { type = 'row', label = label, value = function() return val end } end return { maincolor = '#f9f9f9', parts = { { type = 'title', value = function(localdata) return localdata['tit'] or wikidata.getLabel(localdata.item) and mw.language.getContentLanguage():ucfirst( wikidata.getLabel(localdata.item) ) or mw.title.getCurrentTitle().text end, subtitle = 'tit orijinal', italic = true, setdisplaytitle = true, }, general.mainimage( { cat = "Atik pou ilistre Atizay", defaultimage = nil, wikidata = {property = {'P18', 'P5252', 'P7420'}} } ), {type = 'table', rows = { { type = 'row', label = 'Atis', plurallabel = 'Atis', value = 'atis', wikidata = { property = 'P170', statementformat = function(statement) local str -- On commence par les qualificatifs (attribué à, atelier etc.) local possiblequalifiers = { P1773 = "attribué $to $creator", P1774 = "atelier $of $creator", P1775 = "suiveur $of $creator", P1776 = "cercle $of $creator", P1777 = "d'après $creator", -- TODO : d'après LE Maître X P1778 = "faux d'après $creator", P1779 = "$creator (?)", P1780 = "école $of", P1877 = "d'après une œuvre $of $creator", } if statement.qualifiers then for qualif, text in pairs(possiblequalifiers) do local creator = wikidata.getFormattedQualifiers(statement, {qualif}) if creator then str = text str = mw.ustring.gsub(str, '$to $creator', "à ".. creator) str = mw.ustring.gsub(str, '$of $creator', linguistic.of(creator)) str = mw.ustring.gsub(str, '$creator', creator) break end end end -- TODO : prendre en compte tous les qualificatifs pour une même déclaration, exemple [[Galate mourant]] -- Sinon, la voie normale if not str then str = wikidata.formatStatement(statement, {speciallabels = {Q4233718 = "anonyme"}}) -- speciallabels pour éviter le lien par défaut end return str end } }, { type = 'row', label = 'Dat', value = 'ane', wikidata = { property = 'P571', showqualifiers = {'P518'}, linktopic = linktopic, sorttype = 'chronological', conjtype = function() if wikidata.getClaims{entity = item, property = 'P571', qualifier = {'P518'}} then return "new line" else return "or" end end } }, { type = 'row', label = 'Sivilizasyon', plurallabel = 'Sivilizasyon', value = 'sivilizasyon', property = 'P2596' }, { type = 'row', label = 'Kòmanditè', plurallabel = 'Kòmanditè', value = 'kòmanditè', property = 'P88' }, { type = 'row', label = 'Type', value = 'type', property = 'P136', }, { type = 'row', label = 'Teknik', plurallabel= 'Teknik', value = 'teknik', property = 'P2079' }, { type = 'row', label = 'Materyo', value = function( localdata ) if localdata['type'] or localdata['teknik'] then -- la matériau est parfois contenu dans le paramètre "type", ne pas utiliser wikidata dans ce cas return nil end return material.formatFromItem(localdata.item) end }, { type = 'row', label = 'Pwennvi', plurallabel = 'Pwennvi', value = 'pwennvi', property = 'P7108' }, { type = 'row', label = 'Lye kreyasyon', plurallabel = 'Lye kreyasyon', value = 'lye kreyasyon', property = 'P1071' }, dimensions, { type = 'row', label = 'Fòma', value = 'fòma', property = 'P1419', }, { type = 'row', label = 'Edidye pou', value = 'etidye pou', property = 'P6606', valueClass = 'italique', }, { type = 'row', label = 'Inspiration', value = 'inspiration', wikidata ={property = 'P941' , conjtype="new line"}, }, { type = 'row', label = 'Série', plurallabel = 'Séries', value = 'série', property = 'P179', valueClass = 'italique', }, { type = 'row', label = 'Pendant', plurallabel = 'Pendants', value = 'pendant', property = 'P1639', valueClass = 'italique', }, { type = 'row', label = 'Verso', value = 'verso', wikidata = {property = {'P2681', 'P2682'}}, valueClass = 'italique', }, { type = 'row', label = 'Mouvement', plurallabel = 'Mouvements', value = function(localdata) return localdata['mouvement'] or localdata['style'] end, property = 'P135', }, { type = 'row', label = 'Propriétaire', plurallabel = 'Propriétaires', value = 'propriétaire', wikidata = function() return owner.formatFromItem(item, {atdate = 'today'}) end }, { type = 'row', label = 'Collection', plurallabel = 'Collections', value = 'collection' }, { type = 'row', label = '<abbr class="abbr" title="Numéro">N<sup>o</sup></abbr> d’inventaire', value = 'inventaire', property = 'P217' }, { type = 'row', label = 'Localisation', value = function(localdata) local museum, location, city, country = localdata['musée'], localdata['localisation'], localdata['ville'], localdata['pays'] location = linguistic.conj({museum, location, city}, 'comma') if location == '-' then -- désactivation de l'utilisation de wikidata (car il ne faut pas d'espace après) return '-' end country = linguistic.inparentheses(country) if country then country = '<span class="nowrap">' .. country .. '</span>' end if location or country then return (location or '') .. ' ' .. (country or '') end return nil end, property = 'P276' -- devrait croiser P195 et utiliser l'arbitrary access pour le lieu }, { type = 'row', label = 'Modèle', plurallabel = 'Modèles', value = 'modèle', property = 'P2634' }, --[[ { type = 'row', label = 'Représente', value = 'représente', wikidata = {property = 'P180', numval = '4', rank = 'best'} }, ]]-- { type = 'row', label = 'Inscription', plurallabel = 'Inscriptions', value = 'inscription', wikidata = {property = 'P1684', conjtype = '<br />', numval = '3', rank = 'best'} }, { type = 'row', label = 'Commentaire', value = 'commentaire', }, { type = 'row', label = 'Protection', value = function(localdata) return localdata['protection'] or localdata['classement'] end, wikidata = function(item) return protected.formattedList(item)end }, geoloc.coordinates{maintenancecat = "Œuvre d'art géolocalisable sans coordonnées paramétrées"}, }}, geoloc.geoloc('default', '-'), -- le '-' indique de ne pas chercher automatiquement une carte si aucune n'est fournie dans |géolocalisation= } } 3uvtz5i01af0cdzub3toj474w4nge6t 855631 855630 2024-11-12T23:22:52Z BwaKajou 31668 855631 Scribunto text/plain --[[ Avant de mettre en production une nouvelle version avez-vous : - testé avec la version bac à sable ? - modifié la documentation ? ]] local geoloc = require 'Module:Infobox/Fonctions/Géolocalisation' local general = require 'Module:Infobox/Fonctions' local owner = require 'Module:Propriétaire' local material = require 'Module:Matériau' local linguistic = require 'Module:Linguistique' local protected = require 'Module:Classement' local wikidata = require 'Module:Wikidata' local linktopic = 'nan atizay plastik' local function dimensions( localdata ) local dimensions = { -- paramètre, abréviation à afficher dans l'en tête, propriété Wikidata, nom complet à afficher dans l'entête {'dyamèt', 'Diam', 'P2386', 'Dyamèt'}, { 'wotè', 'H', 'P2048', 'Wotè'}, {'lajè', 'L', 'P2049', 'Lajè'}, {'pwofondè', 'l', 'P2610' , 'Pwofondè'}, } local data, dims = {}, {} local label = 'Dimansyon' local unit = localdata['inite'] or 'cm' local wikidataval = function(d) return wikidata.formatStatements{ entity = localdata.item, showunit = '-', targetunit = unit, addcat = true, property = d } end local propertyused = nil for i, j in pairs(dimensions) do local val = localdata[j[1]] if localdata.item and j[3] and not val then val = wikidataval(j[3]) if val then propertyused = j[3] end end if val then table.insert(data, val) table.insert(dims, i) end end if #data == 0 then return nil end if #data == 1 then label = dimensions[dims[1]][4] else for i, j in pairs(dims) do dims[i] = dimensions[j][2] end label = label .. linguistic.inparentheses(linguistic.conj(dims, ' × ')) end local val = linguistic.conj(data, ' × ') .. ' ' .. unit if propertyused then val = wikidata.formatAndCat{entity = localdata.item, property = propertyused, value = val} end return { type = 'row', label = label, value = function() return val end } end return { maincolor = '#f9f9f9', parts = { { type = 'title', value = function(localdata) return localdata['tit'] or wikidata.getLabel(localdata.item) and mw.language.getContentLanguage():ucfirst( wikidata.getLabel(localdata.item) ) or mw.title.getCurrentTitle().text end, subtitle = 'tit orijinal', italic = true, setdisplaytitle = true, }, general.mainimage( { cat = "Atik pou ilistre Atizay", defaultimage = nil, wikidata = {property = {'P18', 'P5252', 'P7420'}} } ), {type = 'table', rows = { { type = 'row', label = 'Atis', plurallabel = 'Atis', value = 'atis', wikidata = { property = 'P170', statementformat = function(statement) local str -- On commence par les qualificatifs (attribué à, atelier etc.) local possiblequalifiers = { P1773 = "attribué $to $creator", P1774 = "atelier $of $creator", P1775 = "suiveur $of $creator", P1776 = "cercle $of $creator", P1777 = "d'après $creator", -- TODO : d'après LE Maître X P1778 = "faux d'après $creator", P1779 = "$creator (?)", P1780 = "école $of", P1877 = "d'après une œuvre $of $creator", } if statement.qualifiers then for qualif, text in pairs(possiblequalifiers) do local creator = wikidata.getFormattedQualifiers(statement, {qualif}) if creator then str = text str = mw.ustring.gsub(str, '$to $creator', "à ".. creator) str = mw.ustring.gsub(str, '$of $creator', linguistic.of(creator)) str = mw.ustring.gsub(str, '$creator', creator) break end end end -- TODO : prendre en compte tous les qualificatifs pour une même déclaration, exemple [[Galate mourant]] -- Sinon, la voie normale if not str then str = wikidata.formatStatement(statement, {speciallabels = {Q4233718 = "anonyme"}}) -- speciallabels pour éviter le lien par défaut end return str end } }, { type = 'row', label = 'Dat', value = 'ane', wikidata = { property = 'P571', showqualifiers = {'P518'}, linktopic = linktopic, sorttype = 'chronological', conjtype = function() if wikidata.getClaims{entity = item, property = 'P571', qualifier = {'P518'}} then return "new line" else return "or" end end } }, { type = 'row', label = 'Sivilizasyon', plurallabel = 'Sivilizasyon', value = 'sivilizasyon', property = 'P2596' }, { type = 'row', label = 'Kòmanditè', plurallabel = 'Kòmanditè', value = 'kòmanditè', property = 'P88' }, { type = 'row', label = 'Type', value = 'type', property = 'P136', }, { type = 'row', label = 'Teknik', plurallabel= 'Teknik', value = 'teknik', property = 'P2079' }, { type = 'row', label = 'Materyo', value = function( localdata ) if localdata['type'] or localdata['teknik'] then -- la matériau est parfois contenu dans le paramètre "type", ne pas utiliser wikidata dans ce cas return nil end return material.formatFromItem(localdata.item) end }, { type = 'row', label = 'Pwennvi', plurallabel = 'Pwennvi', value = 'pwennvi', property = 'P7108' }, { type = 'row', label = 'Lye kreyasyon', plurallabel = 'Lye kreyasyon', value = 'lye kreyasyon', property = 'P1071' }, dimensions, { type = 'row', label = 'Fòma', value = 'fòma', property = 'P1419', }, { type = 'row', label = 'Edidye pou', value = 'etidye pou', property = 'P6606', valueClass = 'italique', }, { type = 'row', label = 'Enspirasyon', value = 'enspirasyon', wikidata ={property = 'P941' , conjtype="new line"}, }, { type = 'row', label = 'Seri', plurallabel = 'Seri', value = 'seri', property = 'P179', valueClass = 'italique', }, { type = 'row', label = 'Pandan', plurallabel = 'Pandan', value = 'pandan', property = 'P1639', valueClass = 'italique', }, { type = 'row', label = 'Vèso', value = 'vèso', wikidata = {property = {'P2681', 'P2682'}}, valueClass = 'italique', }, { type = 'row', label = 'Mouvman', plurallabel = 'Mouvman', value = function(localdata) return localdata['mouvman'] or localdata['style'] end, property = 'P135', }, { type = 'row', label = 'Pwopriyetè', plurallabel = 'Pwopriyetè', value = 'pwopriyetè', wikidata = function() return owner.formatFromItem(item, {atdate = 'today'}) end }, { type = 'row', label = 'Koleksyonon', plurallabel = 'Koleksyon', value = 'koleksyon' }, { type = 'row', label = '<abbr class="abbr" title="Nimewo">N<sup>o</sup></abbr> envantè', value = 'envantè', property = 'P217' }, { type = 'row', label = 'Lokalizasyon', value = function(localdata) local museum, location, city, country = localdata['mize'], localdata['lokalizasyon'], localdata['vil'], localdata['peyi'] location = linguistic.conj({museum, location, city}, 'comma') if location == '-' then -- désactivation de l'utilisation de wikidata (car il ne faut pas d'espace après) return '-' end country = linguistic.inparentheses(country) if country then country = '<span class="nowrap">' .. country .. '</span>' end if location or country then return (location or '') .. ' ' .. (country or '') end return nil end, property = 'P276' -- devrait croiser P195 et utiliser l'arbitrary access pour le lieu }, { type = 'row', label = 'Modèl', plurallabel = 'Modèl', value = 'modèl', property = 'P2634' }, --[[ { type = 'row', label = 'Reprezante', value = 'reprezante', wikidata = {property = 'P180', numval = '4', rank = 'best'} }, ]]-- { type = 'row', label = 'Enskripsyon', plurallabel = 'Enskripsyon', value = 'enskripsyon', wikidata = {property = 'P1684', conjtype = '<br />', numval = '3', rank = 'best'} }, { type = 'row', label = 'Kòmantè', value = 'kòmantè', }, { type = 'row', label = 'Pwoteksyon', value = function(localdata) return localdata['pwoteksyon'] or localdata['klasman'] end, wikidata = function(item) return protected.formattedList(item)end }, geoloc.coordinates{maintenancecat = "Zèv da jewolokalize san kowòdone parametre"}, }}, geoloc.geoloc('default', '-'), -- le '-' indique de ne pas chercher automatiquement une carte si aucune n'est fournie dans |géolocalisation= } } 8m5nzxtlbv8pi7vot8779rc1yy3julf 855641 855631 2024-11-12T23:42:45Z BwaKajou 31668 855641 Scribunto text/plain --[[ Avant de mettre en production une nouvelle version avez-vous : - testé avec la version bac à sable ? - modifié la documentation ? ]] local geoloc = require 'Module:Infobox/Fonctions/Géolocalisation' local general = require 'Module:Infobox/Fonctions' local owner = require 'Module:Propriétaire' local material = require 'Module:Matériau' local linguistic = require 'Module:Linguistique' local protected = require 'Module:Classement' local wikidata = require 'Module:Wikidata' local linktopic = 'nan atizay plastik' local function dimensions( localdata ) local dimensions = { -- paramètre, abréviation à afficher dans l'en tête, propriété Wikidata, nom complet à afficher dans l'entête {'dyamèt', 'Diam', 'P2386', 'Dyamèt'}, { 'wotè', 'H', 'P2048', 'Wotè'}, {'lajè', 'L', 'P2049', 'Lajè'}, {'pwofondè', 'l', 'P2610' , 'Pwofondè'}, } local data, dims = {}, {} local label = 'Dimansyon' local unit = localdata['inite'] or 'cm' local wikidataval = function(d) return wikidata.formatStatements{ entity = localdata.item, showunit = '-', targetunit = unit, addcat = true, property = d } end local propertyused = nil for i, j in pairs(dimensions) do local val = localdata[j[1]] if localdata.item and j[3] and not val then val = wikidataval(j[3]) if val then propertyused = j[3] end end if val then table.insert(data, val) table.insert(dims, i) end end if #data == 0 then return nil end if #data == 1 then label = dimensions[dims[1]][4] else for i, j in pairs(dims) do dims[i] = dimensions[j][2] end label = label .. linguistic.inparentheses(linguistic.conj(dims, ' × ')) end local val = linguistic.conj(data, ' × ') .. ' ' .. unit if propertyused then val = wikidata.formatAndCat{entity = localdata.item, property = propertyused, value = val} end return { type = 'row', label = label, value = function() return val end } end return { maincolor = '#f9f9f9', parts = { { type = 'title', value = function(localdata) return localdata['tit'] or wikidata.getLabel(localdata.item) and mw.language.getContentLanguage():ucfirst( wikidata.getLabel(localdata.item) ) or mw.title.getCurrentTitle().text end, subtitle = 'tit orijinal', italic = true, setdisplaytitle = true, }, general.mainimage( { cat = "Atik pou ilistre Atizay", defaultimage = nil, wikidata = {property = {'P18', 'P5252', 'P7420'}} } ), {type = 'table', rows = { { type = 'row', label = 'Atis', plurallabel = 'Atis', value = 'atis', wikidata = { property = 'P170', statementformat = function(statement) local str -- On commence par les qualificatifs (attribué à, atelier etc.) local possiblequalifiers = { P1773 = "attribué $to $creator", P1774 = "atelier $of $creator", P1775 = "suiveur $of $creator", P1776 = "cercle $of $creator", P1777 = "d'après $creator", -- TODO : d'après LE Maître X P1778 = "faux d'après $creator", P1779 = "$creator (?)", P1780 = "école $of", P1877 = "d'après une œuvre $of $creator", } if statement.qualifiers then for qualif, text in pairs(possiblequalifiers) do local creator = wikidata.getFormattedQualifiers(statement, {qualif}) if creator then str = text str = mw.ustring.gsub(str, '$to $creator', "à ".. creator) str = mw.ustring.gsub(str, '$of $creator', linguistic.of(creator)) str = mw.ustring.gsub(str, '$creator', creator) break end end end -- TODO : prendre en compte tous les qualificatifs pour une même déclaration, exemple [[Galate mourant]] -- Sinon, la voie normale if not str then str = wikidata.formatStatement(statement, {speciallabels = {Q4233718 = "anonyme"}}) -- speciallabels pour éviter le lien par défaut end return str end } }, { type = 'row', label = 'Dat', value = 'ane', wikidata = { property = 'P571', showqualifiers = {'P518'}, linktopic = linktopic, sorttype = 'chronological', conjtype = function() if wikidata.getClaims{entity = item, property = 'P571', qualifier = {'P518'}} then return "new line" else return "or" end end } }, { type = 'row', label = 'Sivilizasyon', plurallabel = 'Sivilizasyon', value = 'sivilizasyon', property = 'P2596' }, { type = 'row', label = 'Kòmanditè', plurallabel = 'Kòmanditè', value = 'kòmanditè', property = 'P88' }, { type = 'row', label = 'Tip', value = 'tip', property = 'P136', }, { type = 'row', label = 'Teknik', plurallabel= 'Teknik', value = 'teknik', property = 'P2079' }, { type = 'row', label = 'Materyo', value = function( localdata ) if localdata['type'] or localdata['teknik'] then -- la matériau est parfois contenu dans le paramètre "type", ne pas utiliser wikidata dans ce cas return nil end return material.formatFromItem(localdata.item) end }, { type = 'row', label = 'Pwennvi', plurallabel = 'Pwennvi', value = 'pwennvi', property = 'P7108' }, { type = 'row', label = 'Lye kreyasyon', plurallabel = 'Lye kreyasyon', value = 'lye kreyasyon', property = 'P1071' }, dimensions, { type = 'row', label = 'Fòma', value = 'fòma', property = 'P1419', }, { type = 'row', label = 'Edidye pou', value = 'etidye pou', property = 'P6606', valueClass = 'italique', }, { type = 'row', label = 'Enspirasyon', value = 'enspirasyon', wikidata ={property = 'P941' , conjtype="new line"}, }, { type = 'row', label = 'Seri', plurallabel = 'Seri', value = 'seri', property = 'P179', valueClass = 'italique', }, { type = 'row', label = 'Pandan', plurallabel = 'Pandan', value = 'pandan', property = 'P1639', valueClass = 'italique', }, { type = 'row', label = 'Vèso', value = 'vèso', wikidata = {property = {'P2681', 'P2682'}}, valueClass = 'italique', }, { type = 'row', label = 'Mouvman', plurallabel = 'Mouvman', value = function(localdata) return localdata['mouvman'] or localdata['style'] end, property = 'P135', }, { type = 'row', label = 'Pwopriyetè', plurallabel = 'Pwopriyetè', value = 'pwopriyetè', wikidata = function() return owner.formatFromItem(item, {atdate = 'today'}) end }, { type = 'row', label = 'Koleksyonon', plurallabel = 'Koleksyon', value = 'koleksyon' }, { type = 'row', label = '<abbr class="abbr" title="Nimewo">N<sup>o</sup></abbr> envantè', value = 'envantè', property = 'P217' }, { type = 'row', label = 'Lokalizasyon', value = function(localdata) local museum, location, city, country = localdata['mize'], localdata['lokalizasyon'], localdata['vil'], localdata['peyi'] location = linguistic.conj({museum, location, city}, 'comma') if location == '-' then -- désactivation de l'utilisation de wikidata (car il ne faut pas d'espace après) return '-' end country = linguistic.inparentheses(country) if country then country = '<span class="nowrap">' .. country .. '</span>' end if location or country then return (location or '') .. ' ' .. (country or '') end return nil end, property = 'P276' -- devrait croiser P195 et utiliser l'arbitrary access pour le lieu }, { type = 'row', label = 'Modèl', plurallabel = 'Modèl', value = 'modèl', property = 'P2634' }, --[[ { type = 'row', label = 'Reprezante', value = 'reprezante', wikidata = {property = 'P180', numval = '4', rank = 'best'} }, ]]-- { type = 'row', label = 'Enskripsyon', plurallabel = 'Enskripsyon', value = 'enskripsyon', wikidata = {property = 'P1684', conjtype = '<br />', numval = '3', rank = 'best'} }, { type = 'row', label = 'Kòmantè', value = 'kòmantè', }, { type = 'row', label = 'Pwoteksyon', value = function(localdata) return localdata['pwoteksyon'] or localdata['klasman'] end, wikidata = function(item) return protected.formattedList(item)end }, geoloc.coordinates{maintenancecat = "Zèv da jewolokalize san kowòdone parametre"}, }}, geoloc.geoloc('default', '-'), -- le '-' indique de ne pas chercher automatiquement une carte si aucune n'est fournie dans |géolocalisation= } } 6gjpa45n1mgxcjzqv4az1y9velzagb4 Jules Breton 0 93634 855575 855270 2024-11-12T13:54:39Z InternetArchiveBot 25431 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 855575 wikitext text/x-wiki {{Infobox atis|imaj=Jules Breton - Autoportrait (KMSKA).jpg|lejand=Jules Breton, ''Otopòtrè'' ([[1895]]),<br>[[mize wayal boza nan Anvè]].}} '''Jules Adolphe Aimé Louis Breton''', fèt nan Courrières ( Pas-de-Calais ) 1ye me 1827 e li te mouri Pari 5 jiyè 1906, se te yon pent ak powèt fransè. == Biyografi == [[Fichye:Lille_jules_Breton_calvaire.JPG|vignette| ''Plante yon kalvè'' (1858), [[Lil (vil)|Lille]], Palè Fine Arts .]] [[Fichye:Jules_Breton_-_Le_rappel_des_glaneuses.jpg|vignette| ''Rapèl Gleaners yo'' (1859), [[Pari|Paris]], Musée d'Orsay .]] [[Fichye:The_Feast_of_Saint_John.jpg|vignette| ''Fèt Sen Jan'' ( [[1875 (almanak gregoryen)|1875]] ), Philadelphia Museum of Art .]] [[Fichye:Brooklyn_Museum_-_Fin_du_travail_(The_End_of_the_Working_Day)_-_Jules_Breton.jpg|vignette| ''Across Fields'' (1887), [[Nouyòk|New York]], Brooklyn Museum .]] Papa l, Marie-Louis Breton, se majistra Courrières. Manman l te mouri an 1831. Jules Breton te etidye dabò nan kolèj Saint-Bertin nan Saint-Omer kote li te yon pensyonè, answit nan lekòl segondè Enperial nan Douai <ref>''Annuaire 1933-1934 de l'Association des Anciens Élèves du Lycée de Douai'', Imprimerie Lefebvre-Lévêque et Cie. </ref>. Li fè apranti ak Félix De Vigne nan Ghent ak Gustave Wappers nan [[Anvè|Antwerp]] nan [[Bèljik]], answit li kontinye fòmasyon li nan [[Pari]] nan swiv kou Ingres ak Horace Vernet. Ti frè l Émile Breton (1831-1902) se te yon pent peyizajis nan enspirasyon rèv. === Galeri === <gallery mode="packed" heights="160" caption="Zèv Jules Breton"> Fichye:Jules_Adolphe_Aimé_Louis_Breton,_The_Gleaners,_1854._National_Gallery_of_Ireland.jpg|lien=Fichier:Jules_Adolphe_Aimé_Louis_Breton,_The_Gleaners,_1854._National_Gallery_of_Ireland.jpg|alt=Les Glaneuses (1854), Dublin, Galerie nationale d'Irlande.| ''The Gleaners'' (1854), [[Diblen|Dublin]], Galeri Nasyonal Iland . Fichye:Jules_Breton_-_'The_Weeders',_oil_on_canvas,_1868,_Metropolitan_Museum_of_Art.jpg|lien=Fichier:Jules_Breton_-_'The_Weeders',_oil_on_canvas,_1868,_Metropolitan_Museum_of_Art.jpg|alt=Les Sarcleuses (1860), New York, Metropolitan Museum of Art.| ''The Weeders'' (1860), [[Nouyòk|New York]], Metropolitan Museum of Art . Fichye:Jules_Adolphe_Breton_-_Jeune_fille_tricotant.jpg|lien=Fichier:Jules_Adolphe_Breton_-_Jeune_fille_tricotant.jpg|alt=Jeune fille tricotant' (1860), localisation inconnue.| ''Young Girl Knitting' (1860), kote yo pa konnen.'' Fichye:Jules_Breton_-_Deux_jeune_femme_dans_le_vintage_(1862).jpg|lien=Fichier:Jules_Breton_-_Deux_jeune_femme_dans_le_vintage_(1862).jpg|alt=Étude de deux vendangeuses (vers 1862), localisation inconnue.| ''Etid sou de rekòt rezen'' (alantou 1862), kote enkoni. Fichye:Jules_Breton_La_femme_a_l'ombrelle_1871.jpg|lien=Fichier:Jules_Breton_La_femme_a_l'ombrelle_1871.jpg|alt=Femme à l'ombrelle (Élodie de Vigne) (1871), localisation inconnue.| ''Fanm ak yon parasol'' (Élodie de Vigne) (1871), kote yo pa konnen. Fichye:Jules_Adolphe_Aimé_Louis_Breton_-_Returning_from_the_Fields_-_Walters_3758.jpg|lien=Fichier:Jules_Adolphe_Aimé_Louis_Breton_-_Returning_from_the_Fields_-_Walters_3758.jpg|alt=Le Retour des champs (1871), Baltimore, Walters Art Museum.| ''The Return of the Fields'' (1871), Baltimore, Walters Art Museum . Fichye:Jules_Breton_-_The_Flax_Spinner_-_Google_Art_Project.jpg|lien=Fichier:Jules_Breton_-_The_Flax_Spinner_-_Google_Art_Project.jpg|alt=Fileuse (1872), Tulsa, Philbrook Museum of Art.| ''Spinner'' (1872), [[Tulsa, Oklahoma|Tulsa]], Philbrook Museum of Art . Fichye:Jules_Breton_-_La_glaneuse_lasse.jpg|lien=Fichier:Jules_Breton_-_La_glaneuse_lasse.jpg|alt=La Glaneuse lasse (1880), Cleveland Museum of Art.| ''The Weary Gleaner'' (1880), Cleveland Museum of Art . Fichye:Song_of_the_Lark_-_Jules_Breton.png|lien=Fichier:Song_of_the_Lark_-_Jules_Breton.png|alt=Le Chant de l'alouette (1884), Art Institute of Chicago.| ''The Song of the Lark'' (1884), Enstiti Art nan Chicago . Fichye:Jules_Breton_Young_Women_Going_to_a_Procession.jpg|lien=Fichier:Jules_Breton_Young_Women_Going_to_a_Procession.jpg|alt=Jeunes filles se rendant à la procession (1890), Utica, Munson-Williams-Proctor Arts Institute.| ''Young Girls Going to Procession'' (1890), [[Utica, New York|Utica]], Munson-Williams-Proctor Arts Institute . Fichye:Breton_Jules_Summer.jpg|lien=Fichier:Breton_Jules_Summer.jpg|alt=Été (1891), localisation inconnue.| ''Ete'' (1891), kote enkoni. Fichye:Le_pardon_de_Kergoat_en_Quéménéven_en_1891_Jules_Noël.JPG|lien=Fichier:Le_pardon_de_Kergoat_en_Quéménéven_en_1891_Jules_Noël.JPG|alt=Le Pardon de Kergoat (1891), musée des Beaux-Arts de Quimper.| ''The Pardon of Kergoat'' (1891), Mize Fine Arts nan Quimper . Fichye:Sacramentsprocessie.jpg|lien=Fichier:Sacramentsprocessie.jpg|alt=La Bénédiction des blés en Artois (1857), Musée des Beaux-Arts d'Arras.| ''Benediksyon ble a nan Artois'' (1857), Arras Museum of Fine Arts . Fichye:La_Falaise,_Jules_Breton,_1874_(1).jpg|lien=Fichier:La_Falaise,_Jules_Breton,_1874_(1).jpg|alt=La Falaise (1874), Collection Eric Weider| ''The Cliff'' (1874), Koleksyon Eric Weider </gallery> == Omaj == Depi 1912, yon liy nan 13e awondisman [[Pari|Paris]] pote non li, ri Jules-Breton . Plizyè vil nan Bretay pote non li nan yon ri, sitou Douarnenez, Quéménéven ak Quimper <ref name="NomsHistBret">{{Référence Harvard sans parenthèses|texte=''Les noms qui ont fait l'histoire de Bretagne''|id=NomsHistBret}}.</ref> . == Distenksyon == * Kómandè Lejyon donè an 1889; * Ofisye lòd Léopold an 1888 (Bèljik). == Gade tou == {{Lòt pwojè|commons=Category:Jules Breton|wikisource=Jules Breton}} === Lyen ekstèn === {{Liens}} * [http://www.artcyclopedia.com/artists/breton_jules.html « Jules Breton »] sur Artcyclopédia. * [https://web.archive.org/web/20070527171854/http://poesie.webnet.fr/auteurs/breton.html Poèmes de Jules Breton], sur poesie.webnet.fr. * [http://musee-beauxarts.quimper.fr/htcoib/fjbreto.htm « Jules Breton »], sur le site du musée des Beaux-Arts de Quimper. [[Kategori:Atik Wikipedya avèk dosye otorite]] <references /> [[Kategori:Pent peyizan]] [[Kategori:Pent fransè nan XIXe syèk]] [[Kategori:Pent fransè XIXe syèk]] bmsjlzz34lhivpyfpcfqdihrsi26vv0 Manjè pòmdetè yo 0 93724 855596 855451 2024-11-12T16:52:32Z InternetArchiveBot 25431 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 855596 wikitext text/x-wiki '''''Manjè pòmdetè yo''''' ( an {{Lang-fr|Les mangeurs de pomme de terre}} oswa an neyèlandè, {{Lang|nl|''De Aardappeleters''}} ) se yon tablo [[Vincent van Gogh]] te pentire an avril 1885 nan [[Nuenen]], [[Peyiba]] . == Vèsyon == <gallery mode="packed" heights="200"> Fichye:Van_Gogh_-_Vier_Bauern_beim_Essen_(Erste_Studie_zu_den_"Karoffelessern").jpeg|lien=Fichier:Van_Gogh_-_Vier_Bauern_beim_Essen_(Erste_Studie_zu_den_"Karoffelessern").jpeg|alt=Première étude pour Les Mangeurs de pommes de terre, fév.-mars 1885. Musée Van-Gogh (s0135V1962r).| Premye etid pou ''The Potato Eaters'', fevriye-mas 1885. Van-Gogh Museum (s0135V1962r). Fichye:Vincent_van_Gogh_(1853-1890)_De_aardappeleters_(tweede_voorstudie)_Kröller-Müller_Museum_Otterlo_23-8-2016_13-40-54.JPG|lien=Fichier:Vincent_van_Gogh_(1853-1890)_De_aardappeleters_(tweede_voorstudie)_Kröller-Müller_Museum_Otterlo_23-8-2016_13-40-54.JPG|alt=Deuxième étude pour Les Mangeurs de pommes de terre, avril 1885. Musée Kröller-Müller (KM 109.982).| Dezyèm etid pou ''The Potato Eaters'', Avril 1885. Kröller-Müller Museum (KM 109.982). </gallery> [[Fichye:Van-willem-vincent-gogh-die-kartoffelesser-03850.jpg|centré|vignette| ''The Potato Eaters'', Avril 1885, vèsyon final la. Mize Van Gogh (s0005V1962).]] == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|Category:Vincent van Gogh}} * [[Lis penti Vincent van Gogh]] * [[Lèt Vincent pou Théo]] * [[Mize Van-Gogh|Van Gogh mize]] === Lyen ekstèn === {{Liens}} * [https://web.archive.org/web/20080925213205/http://www3.vangoghmuseum.nl/vgm/index.jsp?page=1303&collection=619&lang=fr Le tableau sur le site officiel du musée Van Gogh] [[Kategori:Atik Wikipedya avèk dosye otorite]] [[Kategori:Tablo reyalize an 1885]] [[Kategori:Tablo Vincent van Gogh]] [[Kategori:Pages avec des traductions non relues]] 3vtryvxit24ojbsydd968t042z6vfvu Mize wayal Boza Bèljik 0 93725 855609 855454 2024-11-12T17:38:20Z InternetArchiveBot 25431 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 855609 wikitext text/x-wiki [[Fichye:0_Le_Massacre_des_Innocents_d'après_P.P._Rubens_-_Musées_royaux_des_beaux-arts_de_Belgique_(2).JPG|vignette| ''Masak inosan yo'' (1611-1612) apre [[Peter Paul Rubens|Rubens]] .]] [[Fichye:0_La_Sagesse_victorieuse_de_la_guerre_et_de_la_discorde_-_Rubens_-_Musée_royaux_des_Beaux-Arts_de_Belgique_(2).JPG|vignette| ''Sajès viktorye sou lagè ak dezakò anba gouvènman Jacques I nan Angletè'' (1632-1633) pa [[Peter Paul Rubens|Rubens]] .]] '''Mize wayal Boza Bèljik (an''' {{Lang-fr|musées royaux des Beaux-Arts de Belgique (MRBAB)}}), ki sitiye nan [[Briksèl]], prezève kèk ven mil zèv, penti, eskilti ak desen. Yo genyen sis mize: mize Oldmasters, ki te deja rele "mize wayal atizay ansyen ({{Sp-|XV|-|XVIII}}); mize Magritte; Mize Wiertz la; mize Meunier; mize Fin de syèk la; Mize a XIX Atizay modèn ({{Sp-|XIX|-|XX}}). == Lyen ekstèn == {{Lòt pwojè|commons=Category:Royal Museums of Fine Arts of Belgium|commons titre=Les musées royaux des Beaux-Arts de Belgique}} * Site officiel * [https://web.archive.org/web/20090323015614/http://www.opac-fabritius.be/fr/F_database.htm Catalogue des musées royaux des Beaux-Arts de Belgique] == Nòt ak referans == {{Referans}} [[Kategori:Mize fonde an 1803]] 34werxa91r7vykrphfcic0tcwu0ytrl Ferrari Land 0 93742 855545 2024-11-12T12:22:23Z BwaKajou 31668 Li kreye pa tradui paj « [[:fr:Special:Redirect/revision/214938547|Ferrari Land]] » 855545 wikitext text/x-wiki '''Ferrari Land''' se yon pak ak tèm espanyòl ki sitiye nan sidwès [[Baselòn]] nan komin Salou, nan pwovens Tarragona, sou Costa Daurada. Li louvri pòt li yo 7 avril 2017. Li fè pati konplèks lwazi PortAventura World. == Istorik == Premye pak la tematik la dedye a mak Italyen an [[Ferrari (antrepriz)|Ferrari]] te inogire an 2010. Se Ferrari World Abu Dhabi ki plase toupre sikwi Yas Marina nan [[Emira Arab Ini]] <ref name="positive">{{Cite web|url=https://www.hosteltur.com/142420_ferrari-abrira-parque-tematico-portaventura.html|title=Ferrari abrirá un parque temático en PortAventura|date=13 mars 2014|website=hosteltur.com|language=es|access-date=12 octobre 2018}}.</ref>. Apre inogirasyon sa a, konpayi Italyen an te resevwa anpil demand pou konstwi nouvo pak lwazi <ref group="alpha">La [[Généralité valencienne]] propose d'ailleurs la réalisation d'un parc Ferrari aux alentours de [[Valence (Espagne)|Valence]]. Après plusieurs démarches, cette idée est abandonnée. </ref> {{,}} <ref name="pais">{{Cite web|url=https://elpais.com/ccaa/2014/03/13/catalunya/1394711022_331793.html|title=Port Aventura invertirá 100 millones en un nuevo parque dedicado a Ferrari|last=Clara Blanchar|date=13 mars 2014|website=El País|language=es|access-date=12 octobre 2018}}.</ref>. Domèn espanyòl la fè yon pwopozisyon konsa. Pwojè a nan kataloy sanble pwomèt ak lidè yo nan mak otomobil la dakò ak sa a <ref name="positive">{{Cite web|url=https://www.hosteltur.com/142420_ferrari-abrira-parque-tematico-portaventura.html|title=Ferrari abrirá un parque temático en PortAventura|date=13 mars 2014|website=hosteltur.com|language=es|access-date=12 octobre 2018}}.</ref>. [[Fichye:Batiment_de_ferrari_experience.jpg|vignette| Eksperyans Ferrari.]] == Nòt ak referans == === Nòt === {{Referans}} === Referans === {{Referans}} == Apendis ==  {{Autres projets|commons=Category:Ferrari Land}} === Lyen ekstèn === {{liens}} [[Kategori:Ferrari]] hslvai7whcplqdysdpe3uk6wvrqfcc5 855546 855545 2024-11-12T12:24:29Z BwaKajou 31668 /* Nòt ak referans */ 855546 wikitext text/x-wiki '''Ferrari Land''' se yon pak ak tèm espanyòl ki sitiye nan sidwès [[Baselòn]] nan komin Salou, nan pwovens Tarragona, sou Costa Daurada. Li louvri pòt li yo 7 avril 2017. Li fè pati konplèks lwazi PortAventura World. == Istorik == Premye pak la tematik la dedye a mak Italyen an [[Ferrari (antrepriz)|Ferrari]] te inogire an 2010. Se Ferrari World Abu Dhabi ki plase toupre sikwi Yas Marina nan [[Emira Arab Ini]] <ref name="positive">{{Cite web|url=https://www.hosteltur.com/142420_ferrari-abrira-parque-tematico-portaventura.html|title=Ferrari abrirá un parque temático en PortAventura|date=13 mars 2014|website=hosteltur.com|language=es|access-date=12 octobre 2018}}.</ref>. Apre inogirasyon sa a, konpayi Italyen an te resevwa anpil demand pou konstwi nouvo pak lwazi <ref group="alpha">La [[Généralité valencienne]] propose d'ailleurs la réalisation d'un parc Ferrari aux alentours de [[Valence (Espagne)|Valence]]. Après plusieurs démarches, cette idée est abandonnée. </ref> {{,}} <ref name="pais">{{Cite web|url=https://elpais.com/ccaa/2014/03/13/catalunya/1394711022_331793.html|title=Port Aventura invertirá 100 millones en un nuevo parque dedicado a Ferrari|last=Clara Blanchar|date=13 mars 2014|website=El País|language=es|access-date=12 octobre 2018}}.</ref>. Domèn espanyòl la fè yon pwopozisyon konsa. Pwojè a nan kataloy sanble pwomèt ak lidè yo nan mak otomobil la dakò ak sa a <ref name="positive">{{Cite web|url=https://www.hosteltur.com/142420_ferrari-abrira-parque-tematico-portaventura.html|title=Ferrari abrirá un parque temático en PortAventura|date=13 mars 2014|website=hosteltur.com|language=es|access-date=12 octobre 2018}}.</ref>. [[Fichye:Batiment_de_ferrari_experience.jpg|vignette| Eksperyans Ferrari.]] <gallery mode="packed"> Fichye:Vu de dessous.jpg|''[[Red Force]]'' Fichye:Thrill towers vue de dessous.jpg|''Thrill Towers'' </gallery> == Nòt ak referans == === Nòt === {{Références|groupe=alpha}} === Referans === {{Referans}} == Apendis ==  {{Autres projets|commons=Category:Ferrari Land}} === Lyen ekstèn === {{liens}} [[Kategori:Ferrari]] omheugxjihte3mkez8ad2mi323u0x80 855547 855546 2024-11-12T12:24:48Z BwaKajou 31668 855547 wikitext text/x-wiki [[File:Logo ferrari land 2017.jpg|thumb|]] '''Ferrari Land''' se yon pak ak tèm espanyòl ki sitiye nan sidwès [[Baselòn]] nan komin Salou, nan pwovens Tarragona, sou Costa Daurada. Li louvri pòt li yo 7 avril 2017. Li fè pati konplèks lwazi PortAventura World. == Istorik == Premye pak la tematik la dedye a mak Italyen an [[Ferrari (antrepriz)|Ferrari]] te inogire an 2010. Se Ferrari World Abu Dhabi ki plase toupre sikwi Yas Marina nan [[Emira Arab Ini]] <ref name="positive">{{Cite web|url=https://www.hosteltur.com/142420_ferrari-abrira-parque-tematico-portaventura.html|title=Ferrari abrirá un parque temático en PortAventura|date=13 mars 2014|website=hosteltur.com|language=es|access-date=12 octobre 2018}}.</ref>. Apre inogirasyon sa a, konpayi Italyen an te resevwa anpil demand pou konstwi nouvo pak lwazi <ref group="alpha">La [[Généralité valencienne]] propose d'ailleurs la réalisation d'un parc Ferrari aux alentours de [[Valence (Espagne)|Valence]]. Après plusieurs démarches, cette idée est abandonnée. </ref> {{,}} <ref name="pais">{{Cite web|url=https://elpais.com/ccaa/2014/03/13/catalunya/1394711022_331793.html|title=Port Aventura invertirá 100 millones en un nuevo parque dedicado a Ferrari|last=Clara Blanchar|date=13 mars 2014|website=El País|language=es|access-date=12 octobre 2018}}.</ref>. Domèn espanyòl la fè yon pwopozisyon konsa. Pwojè a nan kataloy sanble pwomèt ak lidè yo nan mak otomobil la dakò ak sa a <ref name="positive">{{Cite web|url=https://www.hosteltur.com/142420_ferrari-abrira-parque-tematico-portaventura.html|title=Ferrari abrirá un parque temático en PortAventura|date=13 mars 2014|website=hosteltur.com|language=es|access-date=12 octobre 2018}}.</ref>. [[Fichye:Batiment_de_ferrari_experience.jpg|vignette| Eksperyans Ferrari.]] <gallery mode="packed"> Fichye:Vu de dessous.jpg|''[[Red Force]]'' Fichye:Thrill towers vue de dessous.jpg|''Thrill Towers'' </gallery> == Nòt ak referans == === Nòt === {{Références|groupe=alpha}} === Referans === {{Referans}} == Apendis ==  {{Autres projets|commons=Category:Ferrari Land}} === Lyen ekstèn === {{liens}} [[Kategori:Ferrari]] ifigadcfhhzagmkywjj8j24m96lwnc4 Kategori:Paj ki itilize P2751 14 93743 855548 2024-11-12T12:25:11Z BwaKajou 31668 Paj ki kreye ak " {{kategori yon pwopriyete}} " 855548 wikitext text/x-wiki {{kategori yon pwopriyete}} iolp85gdz69o8pxx123lkm762a7rdtk Ferrari (konpayi) 0 93744 855549 2024-11-12T12:30:49Z BwaKajou 31668 Li kreye pa tradui paj « [[:fr:Special:Redirect/revision/219939309|Ferrari (entreprise)]] » 855549 wikitext text/x-wiki '''Ferrari S.p.A.''' se yon konstriktè otomobil italyen ki baze nan Maranello, Itali, ki te fonde pa Enzo Ferrari an 1947. [[Fichye:Piloti_Alfa_Romeo_2.JPG|vignette| Enzo Ferrari (agòch) ak lòt chofè Alfa Romeo nan kòmansman ane 1930 yo .]] [[Fichye:Ferrari_250_GTO_R_-_001.jpg|gauche|vignette| Ferrari 250 GTO imedyatman depase tout rival li yo.]] [[Fichye:Ferrari-250-GT-Berlinetta-1.jpg|vignette| Ferrari 250 GT Berlinetta (1961).]] [[Fichye:Luca_Cordero_di_Montezemolo.jpg|vignette| Luca di Montezemolo nan 2008.]] == Chif lavant == {| class="wikitable" border="1" style="font-size:95%;" ! rowspan="2" |Années ! colspan="121" |Nombres d'exemplaires vendus |- style="font-size:65%; text-align:right;" ! colspan="1" style="background:#FFFFFF" width="10" |2000 ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" |3000 ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#FF8000" width="10" |4000 ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FFFF00" width="10" |5000 ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#32CD32" width="10" |6000 ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#0000FF" width="10" |7000 ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" |8000 ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF0080" width="10" |9000 ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0000" width="10" |10000 ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#CC66B2" width="10" |11000 ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#804000" width="10" |<span style="color:white">'''12000'''</span> ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#0000A0" width="10" |<span style="color:white">'''13000'''</span> ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#800000" width="10" |<span style="color:white">'''14000'''</span> |- !1999 | colspan="18" align="right" bgcolor="cornsilk" style="background:#C0C0C0" |'''{{formatnum:3775}}''' | colspan="103" bgcolor="whitesmoke" |  |- !2000 | colspan="20" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4070}}''' | colspan="101" bgcolor="whitesmoke" |  |- !2001 | colspan="23" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4289}}''' | colspan="98" bgcolor="whitesmoke" |  |- !2002 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4236}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2003 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4238}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2004 | colspan="30" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4975}}''' | colspan="91" bgcolor="whitesmoke" |  |- !2005 | colspan="34" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5409}}''' | colspan="87" bgcolor="whitesmoke" |  |- !2006 | colspan="37" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5671}}''' | colspan="84" bgcolor="whitesmoke" |  |- !2007 | colspan="45" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6465}}''' | colspan="76" bgcolor="whitesmoke" |  |- !2008 | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6587}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2009<ref>{{En}} {{Cite web|url=http://www.usinenouvelle.com/article/les-ventes-de-ferrari-ont-marque-le-pas-en-2009.N126376|title=Les ventes de Ferrari ont marqué le pas en 2009|website=Usine Nouvelle}}</ref> | colspan="43" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6250}}''' | colspan="78" bgcolor="whitesmoke" |  |- !2010<ref>{{En}} {{Cite web|url=http://news.sportauto.fr/news/1436058/599-GTO-Ferrari-FF-California-Ferrari-458-Italia|title=Une bonne année 2010 pour Ferrari|website=Sport Auto}}</ref> | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6573}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2011 | colspan="52" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7195}}''' | colspan="69" bgcolor="whitesmoke" |  |- !2012 | colspan="54" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7405}}''' | colspan="67" bgcolor="whitesmoke" |  |- !2013<ref>{{En}} {{Cite web|url=http://2013interactiveannualreport.fiatspa.com/en/report-operations/commercial-performance-operating-segment/luxury-brands#start|title=Performance commerciale par segment d'exploitation:Les marques de luxe|website=Groupe Fiat}}</ref> | colspan="50" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7000}}''' | colspan="71" bgcolor="whitesmoke" |  |- !2014<ref name="Rapport annuel 2015 Ferrari">{{En}} {{Cite web|url=http://corporate.ferrari.com/sites/ferrari15ipo/files/ferrari_nv_-_2015_annual_report_feb_25_final.pdf|title=Rapport annuel 2015|website=Ferrari corporate}}</ref> | colspan="53" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7255}}''' | colspan="68" bgcolor="whitesmoke" |  |- !2015<ref name="Rapport annuel 2015 Ferrari" /> | colspan="57" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7664}}''' | colspan="64" bgcolor="whitesmoke" |  |- !2016<ref>{{Cite web|url=http://www.motorlegend.com/actualite-automobile/ventes-2016-annee-record-pour-ferrari/15396.html|title=Ventes : nouveau record pour Ferrari en 2016|last=Samuel Morand|date=03 février 2017|publisher=''Motor Legend''}}</ref> | colspan="60" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8014}}''' | colspan="61" bgcolor="whitesmoke" |  |- !2017<ref>{{Cite web|url=https://www.lesechos.fr/monde/europe/0301239647675-ferrari-avance-sur-les-chapeaux-de-roues-2150106.php|title=Ferrari avance sur les chapeaux de roues|last=Julien Dupont-Calbo|date=2018|publisher=''[[Les Échos]]''}}</ref> | colspan="64" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8398}}''' | colspan="57" bgcolor="whitesmoke" |  |- !2018<ref>{{Cite web|url=http://corporate.ferrari.com/en/another-year-sustained-growth|title=Another year of sustained growth|last=Communiqué de presse Ferrari|date=31 janvier 2019|publisher=''ferrari''|language=en}}</ref> | colspan="73" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9251}}''' | colspan="48" bgcolor="whitesmoke" |  |- !2019<ref>{{Cite web|url=https://www.turbo.fr/actualite-automobile/ferrari-depasse-les-10000-ventes-en-2019-156925|title=Ferrari dépasse les 10.000 ventes en 2019|last=Arnaud Peytier|date=4 février 2020}}</ref> | colspan="83" align="right" bgcolor="cornsilk" style="background:#FF0000" |<span style="color:white">'''{{formatnum:10131}}'''</span> | colspan="38" bgcolor="whitesmoke" |  |- !2020<ref>{{Cite web|url=https://www.lepoint.fr/automobile/pour-ferrari-tout-va-bien-merci-03-08-2021-2437609_646.php|title=Pour Ferrari, tout va bien, merci|last=Jacques Chevalier|date=Août 2021}}</ref> | colspan="72" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9119}}''' | colspan="49" bgcolor="whitesmoke" |  |- !2021<ref>{{Cite web|url=https://www.caradisiac.com/ferrari-bat-son-record-de-ventes-194433.htm|title=Ferrari bat son record de ventes|last=Florent Ferrière|date=2 Février 2022}}</ref> | colspan="92" align="right" bgcolor="cornsilk" style="background:#CC66B2" |<span style="color:white">'''{{formatnum:11155}}'''</span> | colspan="39" bgcolor="whitesmoke" |  |- !2022<ref>{{Cite web|url=https://www.moniteurautomobile.be/actu-auto/industrie-et-economie/ferrari-ventes-record-2022.html|title=Ferrari bat également tous les records en 2022|last=Yeelen Möller|date=3 février 2023}}</ref> | colspan="113" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13221}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- !2023<ref>{{Cite web|url=https://www.italpassion.fr/ferrari/ferrari-chiffre-daffaires-record-en-2023-tout-en-limitant-ses-ventes/|title=Ferrari : chiffre d’affaires record en 2023, tout en limitant ses ventes|last=Alexandre|date=1 février 2024}}</ref> | colspan="117" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13663}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- |} == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|commons=Category:Ferrari}}{{Kategori prensipal|Ferrari}} [[Kategori:Ferrari]] [[Kategori:Mak italyèn]] [[Kategori:Antrepriz fonde an 1947]] bmmk8zw5rdfl8mbumtpr84sad2mvcvh 855550 855549 2024-11-12T12:31:41Z BwaKajou 31668 /* Chif lavant */ 855550 wikitext text/x-wiki '''Ferrari S.p.A.''' se yon konstriktè otomobil italyen ki baze nan Maranello, Itali, ki te fonde pa Enzo Ferrari an 1947. [[Fichye:Piloti_Alfa_Romeo_2.JPG|vignette| Enzo Ferrari (agòch) ak lòt chofè Alfa Romeo nan kòmansman ane 1930 yo .]] [[Fichye:Ferrari_250_GTO_R_-_001.jpg|gauche|vignette| Ferrari 250 GTO imedyatman depase tout rival li yo.]] [[Fichye:Ferrari-250-GT-Berlinetta-1.jpg|vignette| Ferrari 250 GT Berlinetta (1961).]] [[Fichye:Luca_Cordero_di_Montezemolo.jpg|vignette| Luca di Montezemolo nan 2008.]] == Chif lavant == {| class="wikitable" border="1" style="font-size:95%;" ! rowspan="2" |Ane ! colspan="121" |Kantite egzanplè ki vann |- style="font-size:65%; text-align:right;" ! colspan="1" style="background:#FFFFFF" width="10" |2000 ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" |3000 ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#FF8000" width="10" |4000 ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FFFF00" width="10" |5000 ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#32CD32" width="10" |6000 ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#0000FF" width="10" |7000 ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" |8000 ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF0080" width="10" |9000 ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0000" width="10" |10000 ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#CC66B2" width="10" |11000 ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#804000" width="10" |<span style="color:white">'''12000'''</span> ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#0000A0" width="10" |<span style="color:white">'''13000'''</span> ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#800000" width="10" |<span style="color:white">'''14000'''</span> |- !1999 | colspan="18" align="right" bgcolor="cornsilk" style="background:#C0C0C0" |'''{{formatnum:3775}}''' | colspan="103" bgcolor="whitesmoke" |  |- !2000 | colspan="20" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4070}}''' | colspan="101" bgcolor="whitesmoke" |  |- !2001 | colspan="23" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4289}}''' | colspan="98" bgcolor="whitesmoke" |  |- !2002 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4236}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2003 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4238}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2004 | colspan="30" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4975}}''' | colspan="91" bgcolor="whitesmoke" |  |- !2005 | colspan="34" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5409}}''' | colspan="87" bgcolor="whitesmoke" |  |- !2006 | colspan="37" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5671}}''' | colspan="84" bgcolor="whitesmoke" |  |- !2007 | colspan="45" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6465}}''' | colspan="76" bgcolor="whitesmoke" |  |- !2008 | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6587}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2009<ref>{{En}} {{Cite web|url=http://www.usinenouvelle.com/article/les-ventes-de-ferrari-ont-marque-le-pas-en-2009.N126376|title=Les ventes de Ferrari ont marqué le pas en 2009|website=Usine Nouvelle}}</ref> | colspan="43" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6250}}''' | colspan="78" bgcolor="whitesmoke" |  |- !2010<ref>{{En}} {{Cite web|url=http://news.sportauto.fr/news/1436058/599-GTO-Ferrari-FF-California-Ferrari-458-Italia|title=Une bonne année 2010 pour Ferrari|website=Sport Auto}}</ref> | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6573}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2011 | colspan="52" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7195}}''' | colspan="69" bgcolor="whitesmoke" |  |- !2012 | colspan="54" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7405}}''' | colspan="67" bgcolor="whitesmoke" |  |- !2013<ref>{{En}} {{Cite web|url=http://2013interactiveannualreport.fiatspa.com/en/report-operations/commercial-performance-operating-segment/luxury-brands#start|title=Performance commerciale par segment d'exploitation:Les marques de luxe|website=Groupe Fiat}}</ref> | colspan="50" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7000}}''' | colspan="71" bgcolor="whitesmoke" |  |- !2014<ref name="Rapport annuel 2015 Ferrari">{{En}} {{Cite web|url=http://corporate.ferrari.com/sites/ferrari15ipo/files/ferrari_nv_-_2015_annual_report_feb_25_final.pdf|title=Rapport annuel 2015|website=Ferrari corporate}}</ref> | colspan="53" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7255}}''' | colspan="68" bgcolor="whitesmoke" |  |- !2015<ref name="Rapport annuel 2015 Ferrari" /> | colspan="57" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7664}}''' | colspan="64" bgcolor="whitesmoke" |  |- !2016<ref>{{Cite web|url=http://www.motorlegend.com/actualite-automobile/ventes-2016-annee-record-pour-ferrari/15396.html|title=Ventes : nouveau record pour Ferrari en 2016|last=Samuel Morand|date=03 février 2017|publisher=''Motor Legend''}}</ref> | colspan="60" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8014}}''' | colspan="61" bgcolor="whitesmoke" |  |- !2017<ref>{{Cite web|url=https://www.lesechos.fr/monde/europe/0301239647675-ferrari-avance-sur-les-chapeaux-de-roues-2150106.php|title=Ferrari avance sur les chapeaux de roues|last=Julien Dupont-Calbo|date=2018|publisher=''[[Les Échos]]''}}</ref> | colspan="64" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8398}}''' | colspan="57" bgcolor="whitesmoke" |  |- !2018<ref>{{Cite web|url=http://corporate.ferrari.com/en/another-year-sustained-growth|title=Another year of sustained growth|last=Communiqué de presse Ferrari|date=31 janvier 2019|publisher=''ferrari''|language=en}}</ref> | colspan="73" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9251}}''' | colspan="48" bgcolor="whitesmoke" |  |- !2019<ref>{{Cite web|url=https://www.turbo.fr/actualite-automobile/ferrari-depasse-les-10000-ventes-en-2019-156925|title=Ferrari dépasse les 10.000 ventes en 2019|last=Arnaud Peytier|date=4 février 2020}}</ref> | colspan="83" align="right" bgcolor="cornsilk" style="background:#FF0000" |<span style="color:white">'''{{formatnum:10131}}'''</span> | colspan="38" bgcolor="whitesmoke" |  |- !2020<ref>{{Cite web|url=https://www.lepoint.fr/automobile/pour-ferrari-tout-va-bien-merci-03-08-2021-2437609_646.php|title=Pour Ferrari, tout va bien, merci|last=Jacques Chevalier|date=Août 2021}}</ref> | colspan="72" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9119}}''' | colspan="49" bgcolor="whitesmoke" |  |- !2021<ref>{{Cite web|url=https://www.caradisiac.com/ferrari-bat-son-record-de-ventes-194433.htm|title=Ferrari bat son record de ventes|last=Florent Ferrière|date=2 Février 2022}}</ref> | colspan="92" align="right" bgcolor="cornsilk" style="background:#CC66B2" |<span style="color:white">'''{{formatnum:11155}}'''</span> | colspan="39" bgcolor="whitesmoke" |  |- !2022<ref>{{Cite web|url=https://www.moniteurautomobile.be/actu-auto/industrie-et-economie/ferrari-ventes-record-2022.html|title=Ferrari bat également tous les records en 2022|last=Yeelen Möller|date=3 février 2023}}</ref> | colspan="113" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13221}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- !2023<ref>{{Cite web|url=https://www.italpassion.fr/ferrari/ferrari-chiffre-daffaires-record-en-2023-tout-en-limitant-ses-ventes/|title=Ferrari : chiffre d’affaires record en 2023, tout en limitant ses ventes|last=Alexandre|date=1 février 2024}}</ref> | colspan="117" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13663}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- |} == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|commons=Category:Ferrari}}{{Kategori prensipal|Ferrari}} [[Kategori:Ferrari]] [[Kategori:Mak italyèn]] [[Kategori:Antrepriz fonde an 1947]] 58rdivi5qe4820yhw9d2emxrv66uk2r 855551 855550 2024-11-12T12:33:27Z BwaKajou 31668 855551 wikitext text/x-wiki '''Ferrari S.p.A.''' se yon konstriktè otomobil italyen ki baze nan Maranello, Itali, ki te fonde pa Enzo Ferrari an 1947. ==Istwa== [[Fichye:Piloti_Alfa_Romeo_2.JPG|vignette| Enzo Ferrari (agòch) ak lòt chofè Alfa Romeo nan kòmansman ane 1930 yo .]] [[Fichye:Ferrari_250_GTO_R_-_001.jpg|gauche|vignette| Ferrari 250 GTO imedyatman depase tout rival li yo.]] [[Fichye:Ferrari-250-GT-Berlinetta-1.jpg|vignette| Ferrari 250 GT Berlinetta (1961).] [[Fichye:Luca_Cordero_di_Montezemolo.jpg|vignette| Luca di Montezemolo nan 2008.]] Konpayi an sitiye nan [[Maranello]], nan [[Emilia-Romagna]], {{unit|35|km}} soti nan [[Bologna]]. Enzo Ferrari te fè bati nouvo enstalasyon la, apre [[Dezyèm Gè Mondyal la]], sou tè li te pran pandan lagè a nan gwo vil sa a ki sitiye {{unit|18|km}} nan sid [[Modena]] , kote premye machin ki te pote non "[[Lis otomobil Ferrari|Ferrari]]] yo te bati. Ferrari depi kòmansman ane 2016 la pa fè pati gwoup [[Fiat]] ankò. Li te founi motè - apeprè {{formatnum:7500}} chak ane - ak penti pou kadav [[Maserati]], ansyen yon lòt sipòtè gwoup la. Nan [[Jen 2002]], Fiat, ki te chaje ak dèt kolosal, te oblije revann 34% Ferrari bay gwoup finansye Italyen [[Mediobanca]] pou yon montan {{unit|775|milyon}} ero. == Chif lavant == {| class="wikitable" border="1" style="font-size:95%;" ! rowspan="2" |Ane ! colspan="121" |Kantite egzanplè ki vann |- style="font-size:65%; text-align:right;" ! colspan="1" style="background:#FFFFFF" width="10" |2000 ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" |3000 ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#FF8000" width="10" |4000 ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FFFF00" width="10" |5000 ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#32CD32" width="10" |6000 ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#0000FF" width="10" |7000 ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" |8000 ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF0080" width="10" |9000 ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0000" width="10" |10000 ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#CC66B2" width="10" |11000 ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#804000" width="10" |<span style="color:white">'''12000'''</span> ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#0000A0" width="10" |<span style="color:white">'''13000'''</span> ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#800000" width="10" |<span style="color:white">'''14000'''</span> |- !1999 | colspan="18" align="right" bgcolor="cornsilk" style="background:#C0C0C0" |'''{{formatnum:3775}}''' | colspan="103" bgcolor="whitesmoke" |  |- !2000 | colspan="20" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4070}}''' | colspan="101" bgcolor="whitesmoke" |  |- !2001 | colspan="23" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4289}}''' | colspan="98" bgcolor="whitesmoke" |  |- !2002 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4236}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2003 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4238}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2004 | colspan="30" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4975}}''' | colspan="91" bgcolor="whitesmoke" |  |- !2005 | colspan="34" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5409}}''' | colspan="87" bgcolor="whitesmoke" |  |- !2006 | colspan="37" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5671}}''' | colspan="84" bgcolor="whitesmoke" |  |- !2007 | colspan="45" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6465}}''' | colspan="76" bgcolor="whitesmoke" |  |- !2008 | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6587}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2009<ref>{{En}} {{Cite web|url=http://www.usinenouvelle.com/article/les-ventes-de-ferrari-ont-marque-le-pas-en-2009.N126376|title=Les ventes de Ferrari ont marqué le pas en 2009|website=Usine Nouvelle}}</ref> | colspan="43" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6250}}''' | colspan="78" bgcolor="whitesmoke" |  |- !2010<ref>{{En}} {{Cite web|url=http://news.sportauto.fr/news/1436058/599-GTO-Ferrari-FF-California-Ferrari-458-Italia|title=Une bonne année 2010 pour Ferrari|website=Sport Auto}}</ref> | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6573}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2011 | colspan="52" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7195}}''' | colspan="69" bgcolor="whitesmoke" |  |- !2012 | colspan="54" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7405}}''' | colspan="67" bgcolor="whitesmoke" |  |- !2013<ref>{{En}} {{Cite web|url=http://2013interactiveannualreport.fiatspa.com/en/report-operations/commercial-performance-operating-segment/luxury-brands#start|title=Performance commerciale par segment d'exploitation:Les marques de luxe|website=Groupe Fiat}}</ref> | colspan="50" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7000}}''' | colspan="71" bgcolor="whitesmoke" |  |- !2014<ref name="Rapport annuel 2015 Ferrari">{{En}} {{Cite web|url=http://corporate.ferrari.com/sites/ferrari15ipo/files/ferrari_nv_-_2015_annual_report_feb_25_final.pdf|title=Rapport annuel 2015|website=Ferrari corporate}}</ref> | colspan="53" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7255}}''' | colspan="68" bgcolor="whitesmoke" |  |- !2015<ref name="Rapport annuel 2015 Ferrari" /> | colspan="57" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7664}}''' | colspan="64" bgcolor="whitesmoke" |  |- !2016<ref>{{Cite web|url=http://www.motorlegend.com/actualite-automobile/ventes-2016-annee-record-pour-ferrari/15396.html|title=Ventes : nouveau record pour Ferrari en 2016|last=Samuel Morand|date=03 février 2017|publisher=''Motor Legend''}}</ref> | colspan="60" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8014}}''' | colspan="61" bgcolor="whitesmoke" |  |- !2017<ref>{{Cite web|url=https://www.lesechos.fr/monde/europe/0301239647675-ferrari-avance-sur-les-chapeaux-de-roues-2150106.php|title=Ferrari avance sur les chapeaux de roues|last=Julien Dupont-Calbo|date=2018|publisher=''[[Les Échos]]''}}</ref> | colspan="64" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8398}}''' | colspan="57" bgcolor="whitesmoke" |  |- !2018<ref>{{Cite web|url=http://corporate.ferrari.com/en/another-year-sustained-growth|title=Another year of sustained growth|last=Communiqué de presse Ferrari|date=31 janvier 2019|publisher=''ferrari''|language=en}}</ref> | colspan="73" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9251}}''' | colspan="48" bgcolor="whitesmoke" |  |- !2019<ref>{{Cite web|url=https://www.turbo.fr/actualite-automobile/ferrari-depasse-les-10000-ventes-en-2019-156925|title=Ferrari dépasse les 10.000 ventes en 2019|last=Arnaud Peytier|date=4 février 2020}}</ref> | colspan="83" align="right" bgcolor="cornsilk" style="background:#FF0000" |<span style="color:white">'''{{formatnum:10131}}'''</span> | colspan="38" bgcolor="whitesmoke" |  |- !2020<ref>{{Cite web|url=https://www.lepoint.fr/automobile/pour-ferrari-tout-va-bien-merci-03-08-2021-2437609_646.php|title=Pour Ferrari, tout va bien, merci|last=Jacques Chevalier|date=Août 2021}}</ref> | colspan="72" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9119}}''' | colspan="49" bgcolor="whitesmoke" |  |- !2021<ref>{{Cite web|url=https://www.caradisiac.com/ferrari-bat-son-record-de-ventes-194433.htm|title=Ferrari bat son record de ventes|last=Florent Ferrière|date=2 Février 2022}}</ref> | colspan="92" align="right" bgcolor="cornsilk" style="background:#CC66B2" |<span style="color:white">'''{{formatnum:11155}}'''</span> | colspan="39" bgcolor="whitesmoke" |  |- !2022<ref>{{Cite web|url=https://www.moniteurautomobile.be/actu-auto/industrie-et-economie/ferrari-ventes-record-2022.html|title=Ferrari bat également tous les records en 2022|last=Yeelen Möller|date=3 février 2023}}</ref> | colspan="113" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13221}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- !2023<ref>{{Cite web|url=https://www.italpassion.fr/ferrari/ferrari-chiffre-daffaires-record-en-2023-tout-en-limitant-ses-ventes/|title=Ferrari : chiffre d’affaires record en 2023, tout en limitant ses ventes|last=Alexandre|date=1 février 2024}}</ref> | colspan="117" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13663}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- |} == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|commons=Category:Ferrari}}{{Kategori prensipal|Ferrari}} [[Kategori:Ferrari]] [[Kategori:Mak italyèn]] [[Kategori:Antrepriz fonde an 1947]] k8u7an75bhto1oov4kmc0gnqcdbwbx3 855552 855551 2024-11-12T12:34:03Z BwaKajou 31668 /* Istwa */ 855552 wikitext text/x-wiki '''Ferrari S.p.A.''' se yon konstriktè otomobil italyen ki baze nan Maranello, Itali, ki te fonde pa Enzo Ferrari an 1947. ==Istwa== [[Fichye:Piloti_Alfa_Romeo_2.JPG|vignette| Enzo Ferrari (agòch) ak lòt chofè Alfa Romeo nan kòmansman ane 1930 yo .]] [[Fichye:Ferrari_250_GTO_R_-_001.jpg|gauche|vignette| Ferrari 250 GTO imedyatman depase tout rival li yo.]] [[Fichye:Ferrari-250-GT-Berlinetta-1.jpg|vignette| Ferrari 250 GT Berlinetta (1961).]] [[Fichye:Luca_Cordero_di_Montezemolo.jpg|vignette| Luca di Montezemolo nan 2008.]] Konpayi an sitiye nan [[Maranello]], nan [[Emilia-Romagna]], {{unit|35|km}} soti nan [[Bologna]]. Enzo Ferrari te fè bati nouvo enstalasyon la, apre [[Dezyèm Gè Mondyal la]], sou tè li te pran pandan lagè a nan gwo vil sa a ki sitiye {{unit|18|km}} nan sid [[Modena]] , kote premye machin ki te pote non "[[Lis otomobil Ferrari|Ferrari]]] yo te bati. Ferrari depi kòmansman ane 2016 la pa fè pati gwoup [[Fiat]] ankò. Li te founi motè - apeprè {{formatnum:7500}} chak ane - ak penti pou kadav [[Maserati]], ansyen yon lòt sipòtè gwoup la. Nan [[Jen 2002]], Fiat, ki te chaje ak dèt kolosal, te oblije revann 34% Ferrari bay gwoup finansye Italyen [[Mediobanca]] pou yon montan {{unit|775|milyon}} ero. == Chif lavant == {| class="wikitable" border="1" style="font-size:95%;" ! rowspan="2" |Ane ! colspan="121" |Kantite egzanplè ki vann |- style="font-size:65%; text-align:right;" ! colspan="1" style="background:#FFFFFF" width="10" |2000 ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" |3000 ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#FF8000" width="10" |4000 ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FFFF00" width="10" |5000 ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#32CD32" width="10" |6000 ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#0000FF" width="10" |7000 ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" |8000 ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF0080" width="10" |9000 ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0000" width="10" |10000 ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#CC66B2" width="10" |11000 ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#804000" width="10" |<span style="color:white">'''12000'''</span> ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#0000A0" width="10" |<span style="color:white">'''13000'''</span> ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#800000" width="10" |<span style="color:white">'''14000'''</span> |- !1999 | colspan="18" align="right" bgcolor="cornsilk" style="background:#C0C0C0" |'''{{formatnum:3775}}''' | colspan="103" bgcolor="whitesmoke" |  |- !2000 | colspan="20" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4070}}''' | colspan="101" bgcolor="whitesmoke" |  |- !2001 | colspan="23" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4289}}''' | colspan="98" bgcolor="whitesmoke" |  |- !2002 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4236}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2003 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4238}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2004 | colspan="30" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4975}}''' | colspan="91" bgcolor="whitesmoke" |  |- !2005 | colspan="34" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5409}}''' | colspan="87" bgcolor="whitesmoke" |  |- !2006 | colspan="37" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5671}}''' | colspan="84" bgcolor="whitesmoke" |  |- !2007 | colspan="45" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6465}}''' | colspan="76" bgcolor="whitesmoke" |  |- !2008 | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6587}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2009<ref>{{En}} {{Cite web|url=http://www.usinenouvelle.com/article/les-ventes-de-ferrari-ont-marque-le-pas-en-2009.N126376|title=Les ventes de Ferrari ont marqué le pas en 2009|website=Usine Nouvelle}}</ref> | colspan="43" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6250}}''' | colspan="78" bgcolor="whitesmoke" |  |- !2010<ref>{{En}} {{Cite web|url=http://news.sportauto.fr/news/1436058/599-GTO-Ferrari-FF-California-Ferrari-458-Italia|title=Une bonne année 2010 pour Ferrari|website=Sport Auto}}</ref> | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6573}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2011 | colspan="52" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7195}}''' | colspan="69" bgcolor="whitesmoke" |  |- !2012 | colspan="54" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7405}}''' | colspan="67" bgcolor="whitesmoke" |  |- !2013<ref>{{En}} {{Cite web|url=http://2013interactiveannualreport.fiatspa.com/en/report-operations/commercial-performance-operating-segment/luxury-brands#start|title=Performance commerciale par segment d'exploitation:Les marques de luxe|website=Groupe Fiat}}</ref> | colspan="50" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7000}}''' | colspan="71" bgcolor="whitesmoke" |  |- !2014<ref name="Rapport annuel 2015 Ferrari">{{En}} {{Cite web|url=http://corporate.ferrari.com/sites/ferrari15ipo/files/ferrari_nv_-_2015_annual_report_feb_25_final.pdf|title=Rapport annuel 2015|website=Ferrari corporate}}</ref> | colspan="53" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7255}}''' | colspan="68" bgcolor="whitesmoke" |  |- !2015<ref name="Rapport annuel 2015 Ferrari" /> | colspan="57" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7664}}''' | colspan="64" bgcolor="whitesmoke" |  |- !2016<ref>{{Cite web|url=http://www.motorlegend.com/actualite-automobile/ventes-2016-annee-record-pour-ferrari/15396.html|title=Ventes : nouveau record pour Ferrari en 2016|last=Samuel Morand|date=03 février 2017|publisher=''Motor Legend''}}</ref> | colspan="60" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8014}}''' | colspan="61" bgcolor="whitesmoke" |  |- !2017<ref>{{Cite web|url=https://www.lesechos.fr/monde/europe/0301239647675-ferrari-avance-sur-les-chapeaux-de-roues-2150106.php|title=Ferrari avance sur les chapeaux de roues|last=Julien Dupont-Calbo|date=2018|publisher=''[[Les Échos]]''}}</ref> | colspan="64" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8398}}''' | colspan="57" bgcolor="whitesmoke" |  |- !2018<ref>{{Cite web|url=http://corporate.ferrari.com/en/another-year-sustained-growth|title=Another year of sustained growth|last=Communiqué de presse Ferrari|date=31 janvier 2019|publisher=''ferrari''|language=en}}</ref> | colspan="73" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9251}}''' | colspan="48" bgcolor="whitesmoke" |  |- !2019<ref>{{Cite web|url=https://www.turbo.fr/actualite-automobile/ferrari-depasse-les-10000-ventes-en-2019-156925|title=Ferrari dépasse les 10.000 ventes en 2019|last=Arnaud Peytier|date=4 février 2020}}</ref> | colspan="83" align="right" bgcolor="cornsilk" style="background:#FF0000" |<span style="color:white">'''{{formatnum:10131}}'''</span> | colspan="38" bgcolor="whitesmoke" |  |- !2020<ref>{{Cite web|url=https://www.lepoint.fr/automobile/pour-ferrari-tout-va-bien-merci-03-08-2021-2437609_646.php|title=Pour Ferrari, tout va bien, merci|last=Jacques Chevalier|date=Août 2021}}</ref> | colspan="72" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9119}}''' | colspan="49" bgcolor="whitesmoke" |  |- !2021<ref>{{Cite web|url=https://www.caradisiac.com/ferrari-bat-son-record-de-ventes-194433.htm|title=Ferrari bat son record de ventes|last=Florent Ferrière|date=2 Février 2022}}</ref> | colspan="92" align="right" bgcolor="cornsilk" style="background:#CC66B2" |<span style="color:white">'''{{formatnum:11155}}'''</span> | colspan="39" bgcolor="whitesmoke" |  |- !2022<ref>{{Cite web|url=https://www.moniteurautomobile.be/actu-auto/industrie-et-economie/ferrari-ventes-record-2022.html|title=Ferrari bat également tous les records en 2022|last=Yeelen Möller|date=3 février 2023}}</ref> | colspan="113" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13221}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- !2023<ref>{{Cite web|url=https://www.italpassion.fr/ferrari/ferrari-chiffre-daffaires-record-en-2023-tout-en-limitant-ses-ventes/|title=Ferrari : chiffre d’affaires record en 2023, tout en limitant ses ventes|last=Alexandre|date=1 février 2024}}</ref> | colspan="117" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13663}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- |} == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|commons=Category:Ferrari}}{{Kategori prensipal|Ferrari}} [[Kategori:Ferrari]] [[Kategori:Mak italyèn]] [[Kategori:Antrepriz fonde an 1947]] ifxwkjbhv6vyz52dcjjbkd9rbqhue58 855553 855552 2024-11-12T12:34:42Z BwaKajou 31668 855553 wikitext text/x-wiki '''Ferrari S.p.A.''' se yon konstriktè otomobil italyen ki baze nan Maranello, Itali, ki te fonde pa Enzo Ferrari an 1947. ==Istwa== [[Fichye:Piloti_Alfa_Romeo_2.JPG|vignette| Enzo Ferrari (agòch) ak lòt chofè Alfa Romeo nan kòmansman ane 1930 yo .]] [[Fichye:Ferrari_250_GTO_R_-_001.jpg|gauche|vignette| Ferrari 250 GTO imedyatman depase tout rival li yo.]] [[Fichye:Ferrari-250-GT-Berlinetta-1.jpg|vignette| Ferrari 250 GT Berlinetta (1961).]] [[Fichye:Luca_Cordero_di_Montezemolo.jpg|vignette| Luca di Montezemolo nan 2008.]] Konpayi an sitiye nan [[Maranello]], nan [[Emilia-Romagna]], {{unit|35|km}} soti nan [[Bologna]]. Enzo Ferrari te fè bati nouvo enstalasyon la, apre [[Dezyèm Gè mondyal|Dezyèm Gè Mondyal la]], sou tè li te pran pandan lagè a nan gwo vil sa a ki sitiye {{unit|18|km}} nan sid [[Modena]] , kote premye machin ki te pote non "[[Lis otomobil Ferrari|Ferrari]] yo te bati. Ferrari depi kòmansman ane 2016 la pa fè pati gwoup [[Fiat]] ankò. Li te founi motè - apeprè {{formatnum:7500}} chak ane - ak penti pou kadav [[Maserati]], ansyen yon lòt sipòtè gwoup la. Nan [[Jen 2002]], Fiat, ki te chaje ak dèt kolosal, te oblije revann 34% Ferrari bay gwoup finansye Italyen [[Mediobanca]] pou yon montan {{unit|775|milyon}} ero. == Chif lavant == {| class="wikitable" border="1" style="font-size:95%;" ! rowspan="2" |Ane ! colspan="121" |Kantite egzanplè ki vann |- style="font-size:65%; text-align:right;" ! colspan="1" style="background:#FFFFFF" width="10" |2000 ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" |3000 ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#FF8000" width="10" |4000 ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FFFF00" width="10" |5000 ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#32CD32" width="10" |6000 ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#0000FF" width="10" |7000 ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" |8000 ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF0080" width="10" |9000 ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0000" width="10" |10000 ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#CC66B2" width="10" |11000 ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#804000" width="10" |<span style="color:white">'''12000'''</span> ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#0000A0" width="10" |<span style="color:white">'''13000'''</span> ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#800000" width="10" |<span style="color:white">'''14000'''</span> |- !1999 | colspan="18" align="right" bgcolor="cornsilk" style="background:#C0C0C0" |'''{{formatnum:3775}}''' | colspan="103" bgcolor="whitesmoke" |  |- !2000 | colspan="20" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4070}}''' | colspan="101" bgcolor="whitesmoke" |  |- !2001 | colspan="23" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4289}}''' | colspan="98" bgcolor="whitesmoke" |  |- !2002 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4236}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2003 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4238}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2004 | colspan="30" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4975}}''' | colspan="91" bgcolor="whitesmoke" |  |- !2005 | colspan="34" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5409}}''' | colspan="87" bgcolor="whitesmoke" |  |- !2006 | colspan="37" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5671}}''' | colspan="84" bgcolor="whitesmoke" |  |- !2007 | colspan="45" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6465}}''' | colspan="76" bgcolor="whitesmoke" |  |- !2008 | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6587}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2009<ref>{{En}} {{Cite web|url=http://www.usinenouvelle.com/article/les-ventes-de-ferrari-ont-marque-le-pas-en-2009.N126376|title=Les ventes de Ferrari ont marqué le pas en 2009|website=Usine Nouvelle}}</ref> | colspan="43" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6250}}''' | colspan="78" bgcolor="whitesmoke" |  |- !2010<ref>{{En}} {{Cite web|url=http://news.sportauto.fr/news/1436058/599-GTO-Ferrari-FF-California-Ferrari-458-Italia|title=Une bonne année 2010 pour Ferrari|website=Sport Auto}}</ref> | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6573}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2011 | colspan="52" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7195}}''' | colspan="69" bgcolor="whitesmoke" |  |- !2012 | colspan="54" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7405}}''' | colspan="67" bgcolor="whitesmoke" |  |- !2013<ref>{{En}} {{Cite web|url=http://2013interactiveannualreport.fiatspa.com/en/report-operations/commercial-performance-operating-segment/luxury-brands#start|title=Performance commerciale par segment d'exploitation:Les marques de luxe|website=Groupe Fiat}}</ref> | colspan="50" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7000}}''' | colspan="71" bgcolor="whitesmoke" |  |- !2014<ref name="Rapport annuel 2015 Ferrari">{{En}} {{Cite web|url=http://corporate.ferrari.com/sites/ferrari15ipo/files/ferrari_nv_-_2015_annual_report_feb_25_final.pdf|title=Rapport annuel 2015|website=Ferrari corporate}}</ref> | colspan="53" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7255}}''' | colspan="68" bgcolor="whitesmoke" |  |- !2015<ref name="Rapport annuel 2015 Ferrari" /> | colspan="57" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7664}}''' | colspan="64" bgcolor="whitesmoke" |  |- !2016<ref>{{Cite web|url=http://www.motorlegend.com/actualite-automobile/ventes-2016-annee-record-pour-ferrari/15396.html|title=Ventes : nouveau record pour Ferrari en 2016|last=Samuel Morand|date=03 février 2017|publisher=''Motor Legend''}}</ref> | colspan="60" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8014}}''' | colspan="61" bgcolor="whitesmoke" |  |- !2017<ref>{{Cite web|url=https://www.lesechos.fr/monde/europe/0301239647675-ferrari-avance-sur-les-chapeaux-de-roues-2150106.php|title=Ferrari avance sur les chapeaux de roues|last=Julien Dupont-Calbo|date=2018|publisher=''[[Les Échos]]''}}</ref> | colspan="64" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8398}}''' | colspan="57" bgcolor="whitesmoke" |  |- !2018<ref>{{Cite web|url=http://corporate.ferrari.com/en/another-year-sustained-growth|title=Another year of sustained growth|last=Communiqué de presse Ferrari|date=31 janvier 2019|publisher=''ferrari''|language=en}}</ref> | colspan="73" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9251}}''' | colspan="48" bgcolor="whitesmoke" |  |- !2019<ref>{{Cite web|url=https://www.turbo.fr/actualite-automobile/ferrari-depasse-les-10000-ventes-en-2019-156925|title=Ferrari dépasse les 10.000 ventes en 2019|last=Arnaud Peytier|date=4 février 2020}}</ref> | colspan="83" align="right" bgcolor="cornsilk" style="background:#FF0000" |<span style="color:white">'''{{formatnum:10131}}'''</span> | colspan="38" bgcolor="whitesmoke" |  |- !2020<ref>{{Cite web|url=https://www.lepoint.fr/automobile/pour-ferrari-tout-va-bien-merci-03-08-2021-2437609_646.php|title=Pour Ferrari, tout va bien, merci|last=Jacques Chevalier|date=Août 2021}}</ref> | colspan="72" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9119}}''' | colspan="49" bgcolor="whitesmoke" |  |- !2021<ref>{{Cite web|url=https://www.caradisiac.com/ferrari-bat-son-record-de-ventes-194433.htm|title=Ferrari bat son record de ventes|last=Florent Ferrière|date=2 Février 2022}}</ref> | colspan="92" align="right" bgcolor="cornsilk" style="background:#CC66B2" |<span style="color:white">'''{{formatnum:11155}}'''</span> | colspan="39" bgcolor="whitesmoke" |  |- !2022<ref>{{Cite web|url=https://www.moniteurautomobile.be/actu-auto/industrie-et-economie/ferrari-ventes-record-2022.html|title=Ferrari bat également tous les records en 2022|last=Yeelen Möller|date=3 février 2023}}</ref> | colspan="113" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13221}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- !2023<ref>{{Cite web|url=https://www.italpassion.fr/ferrari/ferrari-chiffre-daffaires-record-en-2023-tout-en-limitant-ses-ventes/|title=Ferrari : chiffre d’affaires record en 2023, tout en limitant ses ventes|last=Alexandre|date=1 février 2024}}</ref> | colspan="117" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13663}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- |} == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|commons=Category:Ferrari}}{{Kategori prensipal|Ferrari}} [[Kategori:Ferrari]] [[Kategori:Mak italyèn]] [[Kategori:Antrepriz fonde an 1947]] ep1k6lj1zlq8hvkqds15kfrvp817liz 855554 855553 2024-11-12T12:35:58Z BwaKajou 31668 /* Istwa */ 855554 wikitext text/x-wiki '''Ferrari S.p.A.''' se yon konstriktè otomobil italyen ki baze nan Maranello, Itali, ki te fonde pa Enzo Ferrari an 1947. ==Istwa== [[Fichye:Piloti_Alfa_Romeo_2.JPG|vignette| Enzo Ferrari (agòch) ak lòt chofè Alfa Romeo nan kòmansman ane 1930 yo .]] [[Fichye:Ferrari_250_GTO_R_-_001.jpg|gauche|vignette| Ferrari 250 GTO imedyatman depase tout rival li yo.]] [[Fichye:Ferrari-250-GT-Berlinetta-1.jpg|vignette| Ferrari 250 GT Berlinetta (1961).]] [[Fichye:Luca_Cordero_di_Montezemolo.jpg|vignette| Luca di Montezemolo nan 2008.]] Konpayi an sitiye nan [[Maranello]], nan [[Emilia-Romagna]], {{unit|35|km}} soti nan [[Bologna]]. Enzo Ferrari te fè bati nouvo enstalasyon la, apre [[Dezyèm Gè mondyal|Dezyèm Gè Mondyal la]], sou tè li te pran pandan lagè a nan gwo vil sa a ki sitiye {{unit|18|km}} nan sid [[Modena]] , kote premye machin ki te pote non "[[Lis otomobil Ferrari|Ferrari]] yo te bati. Ferrari depi kòmansman ane 2016 la pa fè pati gwoup [[Fiat]] ankò. Li te founi motè - apeprè {{formatnum:7500}} chak ane - ak penti pou kadav [[Maserati]], ansyen yon lòt sipòtè gwoup la. Nan [[Jen 2002]], Fiat, ki te chaje ak dèt kolosal, te oblije revann 34% Ferrari bay gwoup finansye Italyen [[Mediobanca]] pou yon montan {{unit|775|milyon}} ero. Eslogan {{foreign quote|lang=it|Formula Uomo}} ("Formula Man" an Italyen) rezime an de mo estrateji endistriyèl la te lanse nan [[1997]] pa [[Luca di Montezemolo]]. Estrateji sa a, ki mete moun nan mitan konsiderasyon manifakti a, gen entansyon "optimize espas travay, pran swen fòmasyon kontinyèl ak pran an kont lavi pèsonèl yo nan anplwaye yo"<ref>{{Web link|url =http:// www.motorlegend.com/actualite-automobile/travailler-chez-ferrari/1927.html|title=Li bon pou travay nan Ferrari|site=Motorlegend|online sou=4 me 2007|accessed on=29 novanm 2009}}</ref>. Finansman 200 milyon ero sou dizan, pwogram sa a dwe tou renove tout faktori Ferrari yo nan lòd yo amelyore anviwònman k ap viv anplwaye yo<ref name="autohebdo" />{{,}}<ref name="cbd" >{{en}} {{Lien Web|url=http://www.carbodydesign.com/archive/2008/07/06-ferrari-formula-uomo/|title=Ferrari Formula Uomo|sit =Car Body Design| aksè=30 Novanm 2009}}</ref>. == Chif lavant == {| class="wikitable" border="1" style="font-size:95%;" ! rowspan="2" |Ane ! colspan="121" |Kantite egzanplè ki vann |- style="font-size:65%; text-align:right;" ! colspan="1" style="background:#FFFFFF" width="10" |2000 ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" |3000 ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#FF8000" width="10" |4000 ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FFFF00" width="10" |5000 ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#32CD32" width="10" |6000 ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#0000FF" width="10" |7000 ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" |8000 ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF0080" width="10" |9000 ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0000" width="10" |10000 ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#CC66B2" width="10" |11000 ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#804000" width="10" |<span style="color:white">'''12000'''</span> ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#0000A0" width="10" |<span style="color:white">'''13000'''</span> ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#800000" width="10" |<span style="color:white">'''14000'''</span> |- !1999 | colspan="18" align="right" bgcolor="cornsilk" style="background:#C0C0C0" |'''{{formatnum:3775}}''' | colspan="103" bgcolor="whitesmoke" |  |- !2000 | colspan="20" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4070}}''' | colspan="101" bgcolor="whitesmoke" |  |- !2001 | colspan="23" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4289}}''' | colspan="98" bgcolor="whitesmoke" |  |- !2002 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4236}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2003 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4238}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2004 | colspan="30" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4975}}''' | colspan="91" bgcolor="whitesmoke" |  |- !2005 | colspan="34" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5409}}''' | colspan="87" bgcolor="whitesmoke" |  |- !2006 | colspan="37" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5671}}''' | colspan="84" bgcolor="whitesmoke" |  |- !2007 | colspan="45" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6465}}''' | colspan="76" bgcolor="whitesmoke" |  |- !2008 | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6587}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2009<ref>{{En}} {{Cite web|url=http://www.usinenouvelle.com/article/les-ventes-de-ferrari-ont-marque-le-pas-en-2009.N126376|title=Les ventes de Ferrari ont marqué le pas en 2009|website=Usine Nouvelle}}</ref> | colspan="43" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6250}}''' | colspan="78" bgcolor="whitesmoke" |  |- !2010<ref>{{En}} {{Cite web|url=http://news.sportauto.fr/news/1436058/599-GTO-Ferrari-FF-California-Ferrari-458-Italia|title=Une bonne année 2010 pour Ferrari|website=Sport Auto}}</ref> | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6573}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2011 | colspan="52" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7195}}''' | colspan="69" bgcolor="whitesmoke" |  |- !2012 | colspan="54" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7405}}''' | colspan="67" bgcolor="whitesmoke" |  |- !2013<ref>{{En}} {{Cite web|url=http://2013interactiveannualreport.fiatspa.com/en/report-operations/commercial-performance-operating-segment/luxury-brands#start|title=Performance commerciale par segment d'exploitation:Les marques de luxe|website=Groupe Fiat}}</ref> | colspan="50" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7000}}''' | colspan="71" bgcolor="whitesmoke" |  |- !2014<ref name="Rapport annuel 2015 Ferrari">{{En}} {{Cite web|url=http://corporate.ferrari.com/sites/ferrari15ipo/files/ferrari_nv_-_2015_annual_report_feb_25_final.pdf|title=Rapport annuel 2015|website=Ferrari corporate}}</ref> | colspan="53" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7255}}''' | colspan="68" bgcolor="whitesmoke" |  |- !2015<ref name="Rapport annuel 2015 Ferrari" /> | colspan="57" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7664}}''' | colspan="64" bgcolor="whitesmoke" |  |- !2016<ref>{{Cite web|url=http://www.motorlegend.com/actualite-automobile/ventes-2016-annee-record-pour-ferrari/15396.html|title=Ventes : nouveau record pour Ferrari en 2016|last=Samuel Morand|date=03 février 2017|publisher=''Motor Legend''}}</ref> | colspan="60" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8014}}''' | colspan="61" bgcolor="whitesmoke" |  |- !2017<ref>{{Cite web|url=https://www.lesechos.fr/monde/europe/0301239647675-ferrari-avance-sur-les-chapeaux-de-roues-2150106.php|title=Ferrari avance sur les chapeaux de roues|last=Julien Dupont-Calbo|date=2018|publisher=''[[Les Échos]]''}}</ref> | colspan="64" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8398}}''' | colspan="57" bgcolor="whitesmoke" |  |- !2018<ref>{{Cite web|url=http://corporate.ferrari.com/en/another-year-sustained-growth|title=Another year of sustained growth|last=Communiqué de presse Ferrari|date=31 janvier 2019|publisher=''ferrari''|language=en}}</ref> | colspan="73" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9251}}''' | colspan="48" bgcolor="whitesmoke" |  |- !2019<ref>{{Cite web|url=https://www.turbo.fr/actualite-automobile/ferrari-depasse-les-10000-ventes-en-2019-156925|title=Ferrari dépasse les 10.000 ventes en 2019|last=Arnaud Peytier|date=4 février 2020}}</ref> | colspan="83" align="right" bgcolor="cornsilk" style="background:#FF0000" |<span style="color:white">'''{{formatnum:10131}}'''</span> | colspan="38" bgcolor="whitesmoke" |  |- !2020<ref>{{Cite web|url=https://www.lepoint.fr/automobile/pour-ferrari-tout-va-bien-merci-03-08-2021-2437609_646.php|title=Pour Ferrari, tout va bien, merci|last=Jacques Chevalier|date=Août 2021}}</ref> | colspan="72" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9119}}''' | colspan="49" bgcolor="whitesmoke" |  |- !2021<ref>{{Cite web|url=https://www.caradisiac.com/ferrari-bat-son-record-de-ventes-194433.htm|title=Ferrari bat son record de ventes|last=Florent Ferrière|date=2 Février 2022}}</ref> | colspan="92" align="right" bgcolor="cornsilk" style="background:#CC66B2" |<span style="color:white">'''{{formatnum:11155}}'''</span> | colspan="39" bgcolor="whitesmoke" |  |- !2022<ref>{{Cite web|url=https://www.moniteurautomobile.be/actu-auto/industrie-et-economie/ferrari-ventes-record-2022.html|title=Ferrari bat également tous les records en 2022|last=Yeelen Möller|date=3 février 2023}}</ref> | colspan="113" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13221}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- !2023<ref>{{Cite web|url=https://www.italpassion.fr/ferrari/ferrari-chiffre-daffaires-record-en-2023-tout-en-limitant-ses-ventes/|title=Ferrari : chiffre d’affaires record en 2023, tout en limitant ses ventes|last=Alexandre|date=1 février 2024}}</ref> | colspan="117" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13663}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- |} == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|commons=Category:Ferrari}}{{Kategori prensipal|Ferrari}} [[Kategori:Ferrari]] [[Kategori:Mak italyèn]] [[Kategori:Antrepriz fonde an 1947]] go3hpdvro3fo89navqm8w440vd1n6rc 855555 855554 2024-11-12T12:40:14Z BwaKajou 31668 /* Istwa */ 855555 wikitext text/x-wiki '''Ferrari S.p.A.''' se yon konstriktè otomobil italyen ki baze nan Maranello, Itali, ki te fonde pa Enzo Ferrari an 1947. ==Istwa== [[Fichye:Piloti_Alfa_Romeo_2.JPG|vignette| Enzo Ferrari (agòch) ak lòt chofè Alfa Romeo nan kòmansman ane 1930 yo .]] [[Fichye:Ferrari_250_GTO_R_-_001.jpg|gauche|vignette| Ferrari 250 GTO imedyatman depase tout rival li yo.]] [[Fichye:Ferrari-250-GT-Berlinetta-1.jpg|vignette| Ferrari 250 GT Berlinetta (1961).]] [[Fichye:Luca_Cordero_di_Montezemolo.jpg|vignette| Luca di Montezemolo nan 2008.]] Konpayi an sitiye nan [[Maranello]], nan [[Emilia-Romagna]], {{unit|35|km}} soti nan [[Bologna]]. Enzo Ferrari te fè bati nouvo enstalasyon la, apre [[Dezyèm Gè mondyal|Dezyèm Gè Mondyal la]], sou tè li te pran pandan lagè a nan gwo vil sa a ki sitiye {{unit|18|km}} nan sid [[Modena]] , kote premye machin ki te pote non "[[Lis otomobil Ferrari|Ferrari]] yo te bati. Ferrari depi kòmansman ane 2016 la pa fè pati gwoup [[Fiat]] ankò. Li te founi motè - apeprè {{formatnum:7500}} chak ane - ak penti pou kadav [[Maserati]], ansyen yon lòt sipòtè gwoup la. Nan [[Jen 2002]], Fiat, ki te chaje ak dèt kolosal, te oblije revann 34% Ferrari bay gwoup finansye Italyen [[Mediobanca]] pou yon montan {{unit|775|milyon}} ewo. Eslogan {{foreign quote|lang=it|Formula Uomo}} ("Formula Man" an Italyen) rezime an de mo estrateji endistriyèl la te lanse nan [[1997]] pa [[Luca di Montezemolo]]. Estrateji sa a, ki mete moun nan mitan konsiderasyon manifakti a, gen entansyon "optimize espas travay, pran swen fòmasyon kontinyèl ak pran an kont lavi pèsonèl yo nan anplwaye yo"<ref>{{Web link|url =http:// www.motorlegend.com/actualite-automobile/travailler-chez-ferrari/1927.html|title=Li bon pou travay nan Ferrari|site=Motorlegend|online sou=4 me 2007|accessed on=29 novanm 2009}}</ref>. Finansman 200 milyon ero sou dizan, pwogram sa a dwe tou renove tout faktori Ferrari yo nan lòd yo amelyore anviwònman k ap viv anplwaye yo<ref name="autohebdo">{{Atik|prénom1=Romain|nom1=Bernard|titre=Formula Uomo|périodique=Auto Hebdo|numéro=Hors Série|jour=25|mois=septembre|année=2009|pages=60-67|consulté le=30 novembre 2009}}</ref>.{{,}}<ref name="cbd" >{{en}} {{Lien web|url=http://www.carbodydesign.com/archive/2008/07/06-ferrari-formula-uomo/|title=Ferrari Formula Uomo|sit =Car Body Design| aksè=30 Novanm 2009}}</ref>. == Chif lavant == {| class="wikitable" border="1" style="font-size:95%;" ! rowspan="2" |Ane ! colspan="121" |Kantite egzanplè ki vann |- style="font-size:65%; text-align:right;" ! colspan="1" style="background:#FFFFFF" width="10" |2000 ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#FFFFFF" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" |3000 ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#C0C0C0" width="10" | ! colspan="1" style="background:#FF8000" width="10" |4000 ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FF8000" width="10" | ! colspan="1" style="background:#FFFF00" width="10" |5000 ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#FFFF00" width="10" | ! colspan="1" style="background:#32CD32" width="10" |6000 ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#32CD32" width="10" | ! colspan="1" style="background:#0000FF" width="10" |7000 ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#0000FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" |8000 ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF00FF" width="10" | ! colspan="1" style="background:#FF0080" width="10" |9000 ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0080" width="10" | ! colspan="1" style="background:#FF0000" width="10" |10000 ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#FF0000" width="10" | ! colspan="1" style="background:#CC66B2" width="10" |11000 ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#CC66B2" width="10" | ! colspan="1" style="background:#804000" width="10" |<span style="color:white">'''12000'''</span> ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#804000" width="10" | ! colspan="1" style="background:#0000A0" width="10" |<span style="color:white">'''13000'''</span> ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#0000A0" width="10" | ! colspan="1" style="background:#800000" width="10" |<span style="color:white">'''14000'''</span> |- !1999 | colspan="18" align="right" bgcolor="cornsilk" style="background:#C0C0C0" |'''{{formatnum:3775}}''' | colspan="103" bgcolor="whitesmoke" |  |- !2000 | colspan="20" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4070}}''' | colspan="101" bgcolor="whitesmoke" |  |- !2001 | colspan="23" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4289}}''' | colspan="98" bgcolor="whitesmoke" |  |- !2002 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4236}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2003 | colspan="22" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4238}}''' | colspan="99" bgcolor="whitesmoke" |  |- !2004 | colspan="30" align="right" bgcolor="cornsilk" style="background:#FF8000" |'''{{formatnum:4975}}''' | colspan="91" bgcolor="whitesmoke" |  |- !2005 | colspan="34" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5409}}''' | colspan="87" bgcolor="whitesmoke" |  |- !2006 | colspan="37" align="right" bgcolor="cornsilk" style="background:#FFFF00" |'''{{formatnum:5671}}''' | colspan="84" bgcolor="whitesmoke" |  |- !2007 | colspan="45" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6465}}''' | colspan="76" bgcolor="whitesmoke" |  |- !2008 | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6587}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2009<ref>{{En}} {{Cite web|url=http://www.usinenouvelle.com/article/les-ventes-de-ferrari-ont-marque-le-pas-en-2009.N126376|title=Les ventes de Ferrari ont marqué le pas en 2009|website=Usine Nouvelle}}</ref> | colspan="43" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6250}}''' | colspan="78" bgcolor="whitesmoke" |  |- !2010<ref>{{En}} {{Cite web|url=http://news.sportauto.fr/news/1436058/599-GTO-Ferrari-FF-California-Ferrari-458-Italia|title=Une bonne année 2010 pour Ferrari|website=Sport Auto}}</ref> | colspan="46" align="right" bgcolor="cornsilk" style="background:#32CD32" |'''{{formatnum:6573}}''' | colspan="75" bgcolor="whitesmoke" |  |- !2011 | colspan="52" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7195}}''' | colspan="69" bgcolor="whitesmoke" |  |- !2012 | colspan="54" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7405}}''' | colspan="67" bgcolor="whitesmoke" |  |- !2013<ref>{{En}} {{Cite web|url=http://2013interactiveannualreport.fiatspa.com/en/report-operations/commercial-performance-operating-segment/luxury-brands#start|title=Performance commerciale par segment d'exploitation:Les marques de luxe|website=Groupe Fiat}}</ref> | colspan="50" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7000}}''' | colspan="71" bgcolor="whitesmoke" |  |- !2014<ref name="Rapport annuel 2015 Ferrari">{{En}} {{Cite web|url=http://corporate.ferrari.com/sites/ferrari15ipo/files/ferrari_nv_-_2015_annual_report_feb_25_final.pdf|title=Rapport annuel 2015|website=Ferrari corporate}}</ref> | colspan="53" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7255}}''' | colspan="68" bgcolor="whitesmoke" |  |- !2015<ref name="Rapport annuel 2015 Ferrari" /> | colspan="57" align="right" bgcolor="cornsilk" style="background:#0000FF" |'''{{formatnum:7664}}''' | colspan="64" bgcolor="whitesmoke" |  |- !2016<ref>{{Cite web|url=http://www.motorlegend.com/actualite-automobile/ventes-2016-annee-record-pour-ferrari/15396.html|title=Ventes : nouveau record pour Ferrari en 2016|last=Samuel Morand|date=03 février 2017|publisher=''Motor Legend''}}</ref> | colspan="60" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8014}}''' | colspan="61" bgcolor="whitesmoke" |  |- !2017<ref>{{Cite web|url=https://www.lesechos.fr/monde/europe/0301239647675-ferrari-avance-sur-les-chapeaux-de-roues-2150106.php|title=Ferrari avance sur les chapeaux de roues|last=Julien Dupont-Calbo|date=2018|publisher=''[[Les Échos]]''}}</ref> | colspan="64" align="right" bgcolor="cornsilk" style="background:#FF00FF" |'''{{formatnum:8398}}''' | colspan="57" bgcolor="whitesmoke" |  |- !2018<ref>{{Cite web|url=http://corporate.ferrari.com/en/another-year-sustained-growth|title=Another year of sustained growth|last=Communiqué de presse Ferrari|date=31 janvier 2019|publisher=''ferrari''|language=en}}</ref> | colspan="73" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9251}}''' | colspan="48" bgcolor="whitesmoke" |  |- !2019<ref>{{Cite web|url=https://www.turbo.fr/actualite-automobile/ferrari-depasse-les-10000-ventes-en-2019-156925|title=Ferrari dépasse les 10.000 ventes en 2019|last=Arnaud Peytier|date=4 février 2020}}</ref> | colspan="83" align="right" bgcolor="cornsilk" style="background:#FF0000" |<span style="color:white">'''{{formatnum:10131}}'''</span> | colspan="38" bgcolor="whitesmoke" |  |- !2020<ref>{{Cite web|url=https://www.lepoint.fr/automobile/pour-ferrari-tout-va-bien-merci-03-08-2021-2437609_646.php|title=Pour Ferrari, tout va bien, merci|last=Jacques Chevalier|date=Août 2021}}</ref> | colspan="72" align="right" bgcolor="cornsilk" style="background:#FF0080" |'''{{formatnum:9119}}''' | colspan="49" bgcolor="whitesmoke" |  |- !2021<ref>{{Cite web|url=https://www.caradisiac.com/ferrari-bat-son-record-de-ventes-194433.htm|title=Ferrari bat son record de ventes|last=Florent Ferrière|date=2 Février 2022}}</ref> | colspan="92" align="right" bgcolor="cornsilk" style="background:#CC66B2" |<span style="color:white">'''{{formatnum:11155}}'''</span> | colspan="39" bgcolor="whitesmoke" |  |- !2022<ref>{{Cite web|url=https://www.moniteurautomobile.be/actu-auto/industrie-et-economie/ferrari-ventes-record-2022.html|title=Ferrari bat également tous les records en 2022|last=Yeelen Möller|date=3 février 2023}}</ref> | colspan="113" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13221}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- !2023<ref>{{Cite web|url=https://www.italpassion.fr/ferrari/ferrari-chiffre-daffaires-record-en-2023-tout-en-limitant-ses-ventes/|title=Ferrari : chiffre d’affaires record en 2023, tout en limitant ses ventes|last=Alexandre|date=1 février 2024}}</ref> | colspan="117" align="right" bgcolor="cornsilk" style="background:#0000A0" |<span style="color:white">'''{{formatnum:13663}}'''</span> | colspan="8" bgcolor="whitesmoke" |  |- |} == Nòt ak referans == {{Referans}} == Gade tou == {{Lòt pwojè|commons=Category:Ferrari}}{{Kategori prensipal|Ferrari}} [[Kategori:Ferrari]] [[Kategori:Mak italyèn]] [[Kategori:Antrepriz fonde an 1947]] 9qynrbekpgfcoia0dlti0wj4eomr12h Enzo Ferrari 0 93745 855556 2024-11-12T12:45:49Z BwaKajou 31668 Li kreye pa tradui paj « [[:fr:Special:Redirect/revision/219747443|Enzo Ferrari]] » 855556 wikitext text/x-wiki {{Infobox Biographie2|entete=|charte=entrepreneur|nom=Enzo Ferrari|image=Enzo Ferrari Monza 1967.jpg|légende=Enzo Ferrari à Monza en 1967.|nom de naissance=|surnom=''Il Commendatore''|date de naissance={{Date de naissance|18|février|1898}}|lieu de naissance=[[Modène]] ([[Royaume d'Italie (1861-1946)|Italie]])|date de décès={{Date de décès|14|août|1988|18|2|1898}}|lieu de décès=[[Modène]] ([[Italie]])|nationalité={{drapeau2|Italie|domaine=Gentilé|genre=féminin}}|paysorigine=|pays de résidence=|profession=[[Industrie]]l, [[Ferrari (entreprise)|Ferrari]] <br /> ancien [[pilote automobile]]|occupation=|formation=|hommage=[[Ordre du Mérite de la République italienne]]|activités autres=|notes=|signature=Enzoferrari-signature.svg|famille=|IMHoF=2001}}'''Enzo Ferrari''', fèt 18 févriye 1898 nan Modena ([[Wayòm Itali (1861-1946)|Itali]]), kote li te mouri 14 out 1988, se yon chofè kous [[Itali|Italyen]] ak endistriyalis. Fondatè an [[1929 (almanak gregoryen)|1929]] nan Scuderia Ferrari, yon ekip kous ki ta vin yon pyonye epi, yon pilye nan Fòmil 1 chanpyona mondyal la, nan [[1947 (almanak gregoryen)|1947]] li te kreye konpayi an [[Ferrari (konpayi)|{{Lang|it|Ferrari Automobili}}]], ki konsepsyon, fabrike ak mache trè wo-fen machin espò . Surnom "''li kòmandan''» ("kòmandan an), Enzo Ferrari te konsakre lavi l nan konpayi li a, nan pwen nan vin tounen yon gwo figi istorik, entènasyonalman li te ye, nan motorsport. Enzo Ferrari te toujou mete kous motè anvan konstriksyon endistriyèl la nan [[machin]] wout epi li se atravè konpetisyon ke Ferrari te vin youn nan kreyatè ki pi popilè nan machin prestijye nan mond lan. == Nòt ak referans == {{Referans}} == Apendis == {{Lòt pwojè|commons=Category:Enzo Ferrari}} * [[Konstriktè otomobil]] * [[Ferrari (konpayi)]] * Scuderia Ferrari [[Kategori:Biznisman italyen]] [[Kategori:Nesans an fevriye 1898]] sr6kr0qkugfv11llr55f9dvbwlig2vs 855557 855556 2024-11-12T12:51:55Z BwaKajou 31668 855557 wikitext text/x-wiki {{Infobox Biyografi|entete=|charte=entrepreneur|nom=Enzo Ferrari|imaj=Enzo Ferrari Monza 1967.jpg|lejand=Enzo Ferrari à Monza en 1967.|non nesans=|ti non=''Il Commendatore''|dat nesans={{Dat nesans|18|fevriye|1898}}|lye nesans=[[Modèn]] ([[Wayòm Itali (1861-1946)|Itali]])|dat lanmò={{Dat lanmò|14|out|1988|18|2|1898}}|lye lanmò=[[Modèn]] ([[Itali]])|nasyonalite={{drapo2|Itali|domèn=Jantile|jan=feminen}}|paysorigine=|pays de résidence=|pwofesyon=[[Endistri]]yèl, [[Ferrari (konpayi)|Ferrari]] <br /> ansyen [[pilòt otomobil]]|occupation=|formation=|omaj=[[Lòd merit Repiblik italyèn]]|activités autres=|notes=|siyati=Enzoferrari-signature.svg|famille=|IMHoF=2001}} '''Enzo Ferrari''', fèt 18 févriye 1898 nan Modena ([[Wayòm Itali (1861-1946)|Itali]]), kote li te mouri 14 out 1988, se yon chofè kous [[Itali|Italyen]] ak endistriyalis. Fondatè an [[1929 (almanak gregoryen)|1929]] nan Scuderia Ferrari, yon ekip kous ki ta vin yon pyonye epi, yon pilye nan Fòmil 1 chanpyona mondyal la, nan [[1947 (almanak gregoryen)|1947]] li te kreye konpayi an [[Ferrari (konpayi)|{{Lang|it|Ferrari Automobili}}]], ki konsepsyon, fabrike ak mache trè wo-fen machin espò . Surnom "''li kòmandan''» ("kòmandan an), Enzo Ferrari te konsakre lavi l nan konpayi li a, nan pwen nan vin tounen yon gwo figi istorik, entènasyonalman li te ye, nan motorsport. Enzo Ferrari te toujou mete kous motè anvan konstriksyon endistriyèl la nan [[machin]] wout epi li se atravè konpetisyon ke Ferrari te vin youn nan kreyatè ki pi popilè nan machin prestijye nan mond lan. == Nòt ak referans == {{Referans}} == Apendis == {{Lòt pwojè|commons=Category:Enzo Ferrari}} * [[Konstriktè otomobil]] * [[Ferrari (konpayi)]] * Scuderia Ferrari [[Kategori:Biznisman italyen]] [[Kategori:Nesans an fevriye 1898]] dejmn3dszy4gzsuo0jasa37zhsjaoto 855558 855557 2024-11-12T12:56:06Z BwaKajou 31668 855558 wikitext text/x-wiki {{Infobox Biyografi|entete=|charte=entrepreneur|nom=Enzo Ferrari|imaj=Enzo Ferrari Monza 1967.jpg|lejand=Enzo Ferrari à Monza en 1967.|non nesans=|ti non=''Il Commendatore''|dat nesans={{Dat nesans|18|fevriye|1898}}|lye nesans=[[Modèn]] ([[Wayòm Itali (1861-1946)|Itali]])|dat lanmò={{Dat lanmò|14|out|1988|18|2|1898}}|lye lanmò=[[Modèn]] ([[Itali]])|nasyonalite=[[Itali|italyèn]]|paysorigine=|pays de résidence=|pwofesyon=[[Endistri]]yèl, [[Ferrari (konpayi)|Ferrari]] <br /> ansyen [[pilòt otomobil]]|occupation=|formation=|omaj=[[Lòd merit Repiblik italyèn]]|activités autres=|notes=|siyati=Enzoferrari-signature.svg|famille=|IMHoF=2001}} '''Enzo Ferrari''', fèt 18 févriye 1898 nan Modena ([[Wayòm Itali (1861-1946)|Itali]]), kote li te mouri 14 out 1988, se yon chofè kous [[Itali|Italyen]] ak endistriyalis. Fondatè an [[1929 (almanak gregoryen)|1929]] nan Scuderia Ferrari, yon ekip kous ki ta vin yon pyonye epi, yon pilye nan Fòmil 1 chanpyona mondyal la, nan [[1947 (almanak gregoryen)|1947]] li te kreye konpayi an [[Ferrari (konpayi)|{{Lang|it|Ferrari Automobili}}]], ki konsepsyon, fabrike ak mache trè wo-fen machin espò . Surnom "''li kòmandan''» ("kòmandan an), Enzo Ferrari te konsakre lavi l nan konpayi li a, nan pwen nan vin tounen yon gwo figi istorik, entènasyonalman li te ye, nan motorsport. Enzo Ferrari te toujou mete kous motè anvan konstriksyon endistriyèl la nan [[machin]] wout epi li se atravè konpetisyon ke Ferrari te vin youn nan kreyatè ki pi popilè nan machin prestijye nan mond lan. == Nòt ak referans == {{Referans}} == Apendis == {{Lòt pwojè|commons=Category:Enzo Ferrari}} * [[Konstriktè otomobil]] * [[Ferrari (konpayi)]] * Scuderia Ferrari [[Kategori:Biznisman italyen]] [[Kategori:Nesans an fevriye 1898]] gzfhmvd0orotcjhl2wcjhvmq0okb50x Konstriktè otomobil 0 93746 855561 2024-11-12T13:27:27Z BwaKajou 31668 Li kreye pa tradui paj « [[:fr:Special:Redirect/revision/220173706|Constructeur automobile]] » 855561 wikitext text/x-wiki [[Fichye:Kansas_City_Assembly.png|vignette| Yon liy asanblaj (izin [[Ford]] nan [[Kansas City, Missouri|Kansas City]] ).]] [[Fichye:Cars_parked_on_the_pier_in_Barcelona_1997.jpg|vignette| Otomobil ap tann transpò (pò [[Baselòn|Barcelona]] ).]] Yon '''konstriktè otomobil''' se yon konpayi nan sektè konstriksyon otomobil ki gen aktivite sitou nan konsepsyon, fabrikasyon ak kòmès [[Machin|otomobil]]. Remake byen konsantrasyon pifò konstriktè yo nan gwo gwoup entènasyonal ki gen orijin yo se swa nan [[Etazini|Ozetazini]], an [[Ewòp]] oksidantal ( [[Almay]], [[Frans|Lafrans]], [[Itali]] ), oswa nan [[Ekstrèm-Oryan|Ekstrèm Oryan an]] ( [[Japon]], [[Kore disid|Kore di Sid]], [[Chin|Lachin]] ). [[End]] sitou rasanble anba lisans men gen yon kèk konstriktè nasyonal ak endepandan ki ap pran fòs. Se pa tout konstriktè ki fè tout pwodiksyon yo nan peyi kote syèj sosyal yo ye <ref group="Notes">Dans les tableaux, la nationalité est déterminée par le lieu d'implantation du siège social et les lieux de production ne sont pas précisés. </ref>. Gen kèk konstriktè ki baze nan peyi ki te gen pwodiksyon machin trè wo pou yon tan long. Gen lòt ki baze nan peyi sa yo rele emèjan", sa vle di ki piti piti ranfòse kapasite pwodiksyon yo, swa nan lanse nan aktivite sa a nan grafouyen oswa nan ogmante kapasite istorik yo. Pa "emèjan» Nou vle di sitou ki kalite pwodiksyon otomobil, osi byen ke matirite nan mache nasyonal peyi konsène yo (kritè sa a trè souvan sipèpoze ak sa ki nan kalifikasyon an "emèjan» yo itilize nan ekonomi). === Pwodiksyon mondyal otomobil depi 1999 === Pwodiksyon machin, eksepte machin itilitè, atravè lemond, depi 1999 <ref>{{En}} [http://www.worldometers.info/cars/ How many cars are produced in the world every year?]</ref>: * 2018 : 79 333 306 * 2017 : 80 063 544 * 2016 : 72 105 435 * 2015 : 68 539 516 * 2014 : 67 782 035 * 2013 : 65 745 403 * 2012 : 63 081 024 * 2011 : 59 929 016 * 2010 : 58 264 852 * 2009 : 47 772 598 * 2008 : 52 940 559 * 2007 : 54 920 317 * 2006 : 49 886 549 * 2005 : 46 862 978 * 2004 : 44 554 268 * 2003 : 41 968 666 * 2002 : 41 358 394 * 2001 : 39 825 888 * 2000 : 41 215 653 * 1999 : 39 759 847 === Klasman gwoup otomobil yo dapre lavant yo an Ewòp === ==== 2016 ==== Top dis gwoup otomobil yo nan Ewòp yo, an 2016, selon pati nan mache yo <ref name="Bilan_2016_Europe">{{Cite web|url=http://www.leblogauto.com/2017/01/bilan-2016-europe.html|title=Bilan 2016 : Europe|last=G. Bottet|year=23 janvier 2017|website=leblogauto.com|language=fr|access-date=20 février 2017}}.</ref>: (klas, non gwoup, pati nan mache, ogmantasyon/diminye nan pataje konpare ak 2015) # Volkswagen : 24.19 % (</img> ) # Renault-Nissan : 13.50 % (</img> ) # Gwoup PSA : 9.78 % (</img> ) # [[Ford]] : 6.93 % (</img> ) # BMW Group : 6.85 % (</img> ) # General Motors : 6.62 % (</img> ) # Fiat Chrysler Automobiles : 6.59 % (</img> ) # Daimler : 6.28 % (</img> ) # Gwoup motè Hyundai : 6.25 % (</img> ) # [[Toyota]] : 4.33 % (</img> ) ==== 2009 ==== Sis gwo gwoup otomobil yo an Ewòp an 2009 (nan pati nan mache) : # Volkswagen AG : 18.6 % # PSA Peugeot Citroën : 13.7 % # [[Ford]] : 10 % # Renault-Nissan : 9.1 % # Gwoup Fiat : 9.1 % # General Motors : 8.8 % === Classement de fabricants machin selon lavant yo an Ewòp === ==== 2016 ==== Pi gwo dis konstriktè otomobil yo nan Ewòp yo, nan 2016 <ref name="Bilan_2016_Europe">{{Cite web|url=http://www.leblogauto.com/2017/01/bilan-2016-europe.html|title=Bilan 2016 : Europe|last=G. Bottet|year=23 janvier 2017|website=leblogauto.com|language=fr|access-date=20 février 2017}}.</ref>: # [[Volkswagen]] : 1 720 829, 11,43 % (</img> ) # [[Renault]] : 1 100 880, 7,31 % (</img> ) # [[Ford]] : 1 043 294, 6,93 % (</img> ) # Opel / Vauxhall : 993 494, 6,60 % (</img> ) # Peugeot : 865 374, 5,75 % (</img> ) # Mercedes : 839 779, 5,58 % (</img> ) # Audi : 830 956, 5,52 % (</img> ) # BMW : 821 525, 5,46 % (</img> ) # Fiat : 746 126, 4,96 % (</img> ) # Skoda : 663 230, 4,41 % (</img> ) Pi gwo dis konstriktè otomobil yo an Ewòp (kantite anrejistreman an 2009) <ref>[http://www.7sur7.be/7s7/fr/1784/Auto/article/detail/1054437/2010/01/15/Baisse-des-nouvelles-immatriculations-en-Europe-en-2009.dhtml 7s7 Auto - Baisse des nouvelles immatriculations en Europe en 2009 (1054437)] </ref>: # [[Volkswagen]] : 1 649 931 # [[Ford]] : 1 283 602 # [[Renault]] : 1 097 854 # Opel : 1 064 723 # Fiat : 1 016 340 # Peugeot : 995 130 # Citroën : 870 133 # [[Toyota]] : 710 369 # Audi : 612 293 # Mercedes-Benz : 593 088 == Nòt ak referans == === Nòt === <references group="Notes" /> === Referans === {{Referans}} == Apendis == {{Kategori prensipal}} === Lyen ekstèn === {{Liens}} [[Kategori:Atik Wikipedya avèk dosye otorite]] [[Kategori:Konstriksyon otomobil]] [[Kategori:Konstriktè otomobil]] 92juobqmkq3bdpb5glgwpbz7we7bn6g 855562 855561 2024-11-12T13:29:19Z BwaKajou 31668 /* 2016 */ 855562 wikitext text/x-wiki [[Fichye:Kansas_City_Assembly.png|vignette| Yon liy asanblaj (izin [[Ford]] nan [[Kansas City, Missouri|Kansas City]] ).]] [[Fichye:Cars_parked_on_the_pier_in_Barcelona_1997.jpg|vignette| Otomobil ap tann transpò (pò [[Baselòn|Barcelona]] ).]] Yon '''konstriktè otomobil''' se yon konpayi nan sektè konstriksyon otomobil ki gen aktivite sitou nan konsepsyon, fabrikasyon ak kòmès [[Machin|otomobil]]. Remake byen konsantrasyon pifò konstriktè yo nan gwo gwoup entènasyonal ki gen orijin yo se swa nan [[Etazini|Ozetazini]], an [[Ewòp]] oksidantal ( [[Almay]], [[Frans|Lafrans]], [[Itali]] ), oswa nan [[Ekstrèm-Oryan|Ekstrèm Oryan an]] ( [[Japon]], [[Kore disid|Kore di Sid]], [[Chin|Lachin]] ). [[End]] sitou rasanble anba lisans men gen yon kèk konstriktè nasyonal ak endepandan ki ap pran fòs. Se pa tout konstriktè ki fè tout pwodiksyon yo nan peyi kote syèj sosyal yo ye <ref group="Notes">Dans les tableaux, la nationalité est déterminée par le lieu d'implantation du siège social et les lieux de production ne sont pas précisés. </ref>. Gen kèk konstriktè ki baze nan peyi ki te gen pwodiksyon machin trè wo pou yon tan long. Gen lòt ki baze nan peyi sa yo rele emèjan", sa vle di ki piti piti ranfòse kapasite pwodiksyon yo, swa nan lanse nan aktivite sa a nan grafouyen oswa nan ogmante kapasite istorik yo. Pa "emèjan» Nou vle di sitou ki kalite pwodiksyon otomobil, osi byen ke matirite nan mache nasyonal peyi konsène yo (kritè sa a trè souvan sipèpoze ak sa ki nan kalifikasyon an "emèjan» yo itilize nan ekonomi). === Pwodiksyon mondyal otomobil depi 1999 === Pwodiksyon machin, eksepte machin itilitè, atravè lemond, depi 1999 <ref>{{En}} [http://www.worldometers.info/cars/ How many cars are produced in the world every year?]</ref>: * 2018 : 79 333 306 * 2017 : 80 063 544 * 2016 : 72 105 435 * 2015 : 68 539 516 * 2014 : 67 782 035 * 2013 : 65 745 403 * 2012 : 63 081 024 * 2011 : 59 929 016 * 2010 : 58 264 852 * 2009 : 47 772 598 * 2008 : 52 940 559 * 2007 : 54 920 317 * 2006 : 49 886 549 * 2005 : 46 862 978 * 2004 : 44 554 268 * 2003 : 41 968 666 * 2002 : 41 358 394 * 2001 : 39 825 888 * 2000 : 41 215 653 * 1999 : 39 759 847 === Klasman gwoup otomobil yo dapre lavant yo an Ewòp === ==== 2016 ==== Top dis gwoup otomobil yo nan Ewòp yo, an 2016, selon pati nan mache yo <ref name="Bilan_2016_Europe">{{Cite web|url=http://www.leblogauto.com/2017/01/bilan-2016-europe.html|title=Bilan 2016 : Europe|last=G. Bottet|year=23 janvier 2017|website=leblogauto.com|language=fr|access-date=20 février 2017}}.</ref>: (klas, non gwoup, pati nan mache, ogmantasyon/diminye nan pataje konpare ak 2015) # Volkswagen : 24.19 % (</img> ) # Renault-Nissan : 13.50 % (</img> ) # Gwoup PSA : 9.78 % (</img> ) # [[Ford]] : 6.93 % (</img> ) # BMW Group : 6.85 % (</img> ) # General Motors : 6.62 % (</img> ) # Fiat Chrysler Automobiles : 6.59 % (</img> ) # Daimler : 6.28 % (</img> ) # Gwoup motè Hyundai : 6.25 % (</img> ) # [[Toyota]] : 4.33 % (</img> ) ==== 2009 ==== Sis gwo gwoup otomobil yo an Ewòp an 2009 (nan pati nan mache) : # Volkswagen AG : 18.6 % # PSA Peugeot Citroën : 13.7 % # [[Ford]] : 10 % # Renault-Nissan : 9.1 % # Gwoup Fiat : 9.1 % # General Motors : 8.8 % === Classement de fabricants machin selon lavant yo an Ewòp === ==== 2016 ==== Pi gwo dis konstriktè otomobil yo nan Ewòp yo, nan 2016 <ref name="Bilan_2016_Europe">{{Cite web|url=http://www.leblogauto.com/2017/01/bilan-2016-europe.html|title=Bilan 2016 : Europe|last=G. Bottet|year=23 janvier 2017|website=leblogauto.com|language=fr|access-date=20 février 2017}}.</ref>: ({{Diminution}}) # [[Renault]] : {{formatnum:1100880}}, 7,31 % ({{augmentation}}) # [[Ford]] : {{formatnum:1043294}}, 6,93 % ({{Diminution}}) # [[Opel]]/[[Vauxhall]] : {{formatnum:993494}}, 6,60 % ({{Diminution}}) # [[Peugeot]] : {{formatnum:865374}}, 5,75 % ({{Diminution}}) # [[Mercedes-Benz|Mercedes]] : {{formatnum:839779}}, 5,58 % ({{augmentation}}) # [[Audi]] : {{formatnum:830956}}, 5,52 % ({{augmentation}}) # [[BMW]] : {{formatnum:821525}}, 5,46 % ({{augmentation}}) # [[Fiat]] : {{formatnum:746126}}, 4,96 % ({{augmentation}}) # [[Škoda Auto|Škoda]] : {{formatnum:663230}}, 4,41 % ({{augmentation}}) Pi gwo dis konstriktè otomobil yo an Ewòp (kantite anrejistreman an 2009) <ref>[http://www.7sur7.be/7s7/fr/1784/Auto/article/detail/1054437/2010/01/15/Baisse-des-nouvelles-immatriculations-en-Europe-en-2009.dhtml 7s7 Auto - Baisse des nouvelles immatriculations en Europe en 2009 (1054437)] </ref>: # [[Volkswagen]] : 1 649 931 # [[Ford]] : 1 283 602 # [[Renault]] : 1 097 854 # Opel : 1 064 723 # Fiat : 1 016 340 # Peugeot : 995 130 # Citroën : 870 133 # [[Toyota]] : 710 369 # Audi : 612 293 # Mercedes-Benz : 593 088 == Nòt ak referans == === Nòt === <references group="Notes" /> === Referans === {{Referans}} == Apendis == {{Kategori prensipal}} === Lyen ekstèn === {{Liens}} [[Kategori:Atik Wikipedya avèk dosye otorite]] [[Kategori:Konstriksyon otomobil]] [[Kategori:Konstriktè otomobil]] 3rdeamfme30iiu8kbryykm183fpbpx2 855563 855562 2024-11-12T13:30:29Z BwaKajou 31668 /* 2016 */ 855563 wikitext text/x-wiki [[Fichye:Kansas_City_Assembly.png|vignette| Yon liy asanblaj (izin [[Ford]] nan [[Kansas City, Missouri|Kansas City]] ).]] [[Fichye:Cars_parked_on_the_pier_in_Barcelona_1997.jpg|vignette| Otomobil ap tann transpò (pò [[Baselòn|Barcelona]] ).]] Yon '''konstriktè otomobil''' se yon konpayi nan sektè konstriksyon otomobil ki gen aktivite sitou nan konsepsyon, fabrikasyon ak kòmès [[Machin|otomobil]]. Remake byen konsantrasyon pifò konstriktè yo nan gwo gwoup entènasyonal ki gen orijin yo se swa nan [[Etazini|Ozetazini]], an [[Ewòp]] oksidantal ( [[Almay]], [[Frans|Lafrans]], [[Itali]] ), oswa nan [[Ekstrèm-Oryan|Ekstrèm Oryan an]] ( [[Japon]], [[Kore disid|Kore di Sid]], [[Chin|Lachin]] ). [[End]] sitou rasanble anba lisans men gen yon kèk konstriktè nasyonal ak endepandan ki ap pran fòs. Se pa tout konstriktè ki fè tout pwodiksyon yo nan peyi kote syèj sosyal yo ye <ref group="Notes">Dans les tableaux, la nationalité est déterminée par le lieu d'implantation du siège social et les lieux de production ne sont pas précisés. </ref>. Gen kèk konstriktè ki baze nan peyi ki te gen pwodiksyon machin trè wo pou yon tan long. Gen lòt ki baze nan peyi sa yo rele emèjan", sa vle di ki piti piti ranfòse kapasite pwodiksyon yo, swa nan lanse nan aktivite sa a nan grafouyen oswa nan ogmante kapasite istorik yo. Pa "emèjan» Nou vle di sitou ki kalite pwodiksyon otomobil, osi byen ke matirite nan mache nasyonal peyi konsène yo (kritè sa a trè souvan sipèpoze ak sa ki nan kalifikasyon an "emèjan» yo itilize nan ekonomi). === Pwodiksyon mondyal otomobil depi 1999 === Pwodiksyon machin, eksepte machin itilitè, atravè lemond, depi 1999 <ref>{{En}} [http://www.worldometers.info/cars/ How many cars are produced in the world every year?]</ref>: * 2018 : 79 333 306 * 2017 : 80 063 544 * 2016 : 72 105 435 * 2015 : 68 539 516 * 2014 : 67 782 035 * 2013 : 65 745 403 * 2012 : 63 081 024 * 2011 : 59 929 016 * 2010 : 58 264 852 * 2009 : 47 772 598 * 2008 : 52 940 559 * 2007 : 54 920 317 * 2006 : 49 886 549 * 2005 : 46 862 978 * 2004 : 44 554 268 * 2003 : 41 968 666 * 2002 : 41 358 394 * 2001 : 39 825 888 * 2000 : 41 215 653 * 1999 : 39 759 847 === Klasman gwoup otomobil yo dapre lavant yo an Ewòp === ==== 2016 ==== Top dis gwoup otomobil yo nan Ewòp yo, an 2016, selon pati nan mache yo <ref name="Bilan_2016_Europe">{{Cite web|url=http://www.leblogauto.com/2017/01/bilan-2016-europe.html|title=Bilan 2016 : Europe|last=G. Bottet|year=23 janvier 2017|website=leblogauto.com|language=fr|access-date=20 février 2017}}.</ref>: (klas, non gwoup, pati nan mache, ogmantasyon/diminye nan pataje konpare ak 2015) # Volkswagen : 24.19 % (</img> ) # Renault-Nissan : 13.50 % (</img> ) # Gwoup PSA : 9.78 % (</img> ) # [[Ford]] : 6.93 % (</img> ) # BMW Group : 6.85 % (</img> ) # General Motors : 6.62 % (</img> ) # Fiat Chrysler Automobiles : 6.59 % (</img> ) # Daimler : 6.28 % (</img> ) # Gwoup motè Hyundai : 6.25 % (</img> ) # [[Toyota]] : 4.33 % (</img> ) ==== 2009 ==== Sis gwo gwoup otomobil yo an Ewòp an 2009 (nan pati nan mache) : # Volkswagen AG : 18.6 % # PSA Peugeot Citroën : 13.7 % # [[Ford]] : 10 % # Renault-Nissan : 9.1 % # Gwoup Fiat : 9.1 % # General Motors : 8.8 % === Classement de fabricants machin selon lavant yo an Ewòp === ==== 2016 ==== Pi gwo dis konstriktè otomobil yo nan Ewòp yo, nan 2016 <ref name="Bilan_2016_Europe">{{Cite web|url=http://www.leblogauto.com/2017/01/bilan-2016-europe.html|title=Bilan 2016 : Europe|last=G. Bottet|year=23 janvier 2017|website=leblogauto.com|language=fr|access-date=20 février 2017}}.</ref>: # [[Volkswagen]] : {{formatnum:1720829}}, 11,43 % ({{Diminution}}) # [[Renault]] : {{formatnum:1100880}}, 7,31 % ({{augmentation}}) # [[Ford]] : {{formatnum:1043294}}, 6,93 % ({{Diminution}}) # [[Opel]]/[[Vauxhall]] : {{formatnum:993494}}, 6,60 % ({{Diminution}}) # [[Peugeot]] : {{formatnum:865374}}, 5,75 % ({{Diminution}}) # [[Mercedes-Benz|Mercedes]] : {{formatnum:839779}}, 5,58 % ({{augmentation}}) # [[Audi]] : {{formatnum:830956}}, 5,52 % ({{augmentation}}) # [[BMW]] : {{formatnum:821525}}, 5,46 % ({{augmentation}}) # [[Fiat]] : {{formatnum:746126}}, 4,96 % ({{augmentation}}) # [[Škoda Auto|Škoda]] : {{formatnum:663230}}, 4,41 % ({{augmentation}}) Pi gwo dis konstriktè otomobil yo an Ewòp (kantite anrejistreman an 2009) <ref>[http://www.7sur7.be/7s7/fr/1784/Auto/article/detail/1054437/2010/01/15/Baisse-des-nouvelles-immatriculations-en-Europe-en-2009.dhtml 7s7 Auto - Baisse des nouvelles immatriculations en Europe en 2009 (1054437)] </ref>: # [[Volkswagen]] : 1 649 931 # [[Ford]] : 1 283 602 # [[Renault]] : 1 097 854 # Opel : 1 064 723 # Fiat : 1 016 340 # Peugeot : 995 130 # Citroën : 870 133 # [[Toyota]] : 710 369 # Audi : 612 293 # Mercedes-Benz : 593 088 == Nòt ak referans == === Nòt === <references group="Notes" /> === Referans === {{Referans}} == Apendis == {{Kategori prensipal}} === Lyen ekstèn === {{Liens}} [[Kategori:Atik Wikipedya avèk dosye otorite]] [[Kategori:Konstriksyon otomobil]] [[Kategori:Konstriktè otomobil]] 424gm3eyndekexwpb1795ojnem07gf9 855564 855563 2024-11-12T13:32:18Z BwaKajou 31668 /* Klasman gwoup otomobil yo dapre lavant yo an Ewòp */ 855564 wikitext text/x-wiki [[Fichye:Kansas_City_Assembly.png|vignette| Yon liy asanblaj (izin [[Ford]] nan [[Kansas City, Missouri|Kansas City]] ).]] [[Fichye:Cars_parked_on_the_pier_in_Barcelona_1997.jpg|vignette| Otomobil ap tann transpò (pò [[Baselòn|Barcelona]] ).]] Yon '''konstriktè otomobil''' se yon konpayi nan sektè konstriksyon otomobil ki gen aktivite sitou nan konsepsyon, fabrikasyon ak kòmès [[Machin|otomobil]]. Remake byen konsantrasyon pifò konstriktè yo nan gwo gwoup entènasyonal ki gen orijin yo se swa nan [[Etazini|Ozetazini]], an [[Ewòp]] oksidantal ( [[Almay]], [[Frans|Lafrans]], [[Itali]] ), oswa nan [[Ekstrèm-Oryan|Ekstrèm Oryan an]] ( [[Japon]], [[Kore disid|Kore di Sid]], [[Chin|Lachin]] ). [[End]] sitou rasanble anba lisans men gen yon kèk konstriktè nasyonal ak endepandan ki ap pran fòs. Se pa tout konstriktè ki fè tout pwodiksyon yo nan peyi kote syèj sosyal yo ye <ref group="Notes">Dans les tableaux, la nationalité est déterminée par le lieu d'implantation du siège social et les lieux de production ne sont pas précisés. </ref>. Gen kèk konstriktè ki baze nan peyi ki te gen pwodiksyon machin trè wo pou yon tan long. Gen lòt ki baze nan peyi sa yo rele emèjan", sa vle di ki piti piti ranfòse kapasite pwodiksyon yo, swa nan lanse nan aktivite sa a nan grafouyen oswa nan ogmante kapasite istorik yo. Pa "emèjan» Nou vle di sitou ki kalite pwodiksyon otomobil, osi byen ke matirite nan mache nasyonal peyi konsène yo (kritè sa a trè souvan sipèpoze ak sa ki nan kalifikasyon an "emèjan» yo itilize nan ekonomi). === Pwodiksyon mondyal otomobil depi 1999 === Pwodiksyon machin, eksepte machin itilitè, atravè lemond, depi 1999 <ref>{{En}} [http://www.worldometers.info/cars/ How many cars are produced in the world every year?]</ref>: * 2018 : 79 333 306 * 2017 : 80 063 544 * 2016 : 72 105 435 * 2015 : 68 539 516 * 2014 : 67 782 035 * 2013 : 65 745 403 * 2012 : 63 081 024 * 2011 : 59 929 016 * 2010 : 58 264 852 * 2009 : 47 772 598 * 2008 : 52 940 559 * 2007 : 54 920 317 * 2006 : 49 886 549 * 2005 : 46 862 978 * 2004 : 44 554 268 * 2003 : 41 968 666 * 2002 : 41 358 394 * 2001 : 39 825 888 * 2000 : 41 215 653 * 1999 : 39 759 847 === Classement de fabricants machin selon lavant yo an Ewòp === ==== 2016 ==== Pi gwo dis konstriktè otomobil yo nan Ewòp yo, nan 2016 <ref name="Bilan_2016_Europe">{{Cite web|url=http://www.leblogauto.com/2017/01/bilan-2016-europe.html|title=Bilan 2016 : Europe|last=G. Bottet|year=23 janvier 2017|website=leblogauto.com|language=fr|access-date=20 février 2017}}.</ref>: # [[Volkswagen]] : {{formatnum:1720829}}, 11,43 % ({{Diminution}}) # [[Renault]] : {{formatnum:1100880}}, 7,31 % ({{augmentation}}) # [[Ford]] : {{formatnum:1043294}}, 6,93 % ({{Diminution}}) # [[Opel]]/[[Vauxhall]] : {{formatnum:993494}}, 6,60 % ({{Diminution}}) # [[Peugeot]] : {{formatnum:865374}}, 5,75 % ({{Diminution}}) # [[Mercedes-Benz|Mercedes]] : {{formatnum:839779}}, 5,58 % ({{augmentation}}) # [[Audi]] : {{formatnum:830956}}, 5,52 % ({{augmentation}}) # [[BMW]] : {{formatnum:821525}}, 5,46 % ({{augmentation}}) # [[Fiat]] : {{formatnum:746126}}, 4,96 % ({{augmentation}}) # [[Škoda Auto|Škoda]] : {{formatnum:663230}}, 4,41 % ({{augmentation}}) Pi gwo dis konstriktè otomobil yo an Ewòp (kantite anrejistreman an 2009) <ref>[http://www.7sur7.be/7s7/fr/1784/Auto/article/detail/1054437/2010/01/15/Baisse-des-nouvelles-immatriculations-en-Europe-en-2009.dhtml 7s7 Auto - Baisse des nouvelles immatriculations en Europe en 2009 (1054437)] </ref>: # [[Volkswagen]] : 1 649 931 # [[Ford]] : 1 283 602 # [[Renault]] : 1 097 854 # Opel : 1 064 723 # Fiat : 1 016 340 # Peugeot : 995 130 # Citroën : 870 133 # [[Toyota]] : 710 369 # Audi : 612 293 # Mercedes-Benz : 593 088 == Nòt ak referans == === Nòt === <references group="Notes" /> === Referans === {{Referans}} == Apendis == {{Kategori prensipal}} === Lyen ekstèn === {{Liens}} [[Kategori:Atik Wikipedya avèk dosye otorite]] [[Kategori:Konstriksyon otomobil]] [[Kategori:Konstriktè otomobil]] j2d2k7figr03sat171byyptyhwo3ja0 855565 855564 2024-11-12T13:32:39Z BwaKajou 31668 /* 2016 */ 855565 wikitext text/x-wiki [[Fichye:Kansas_City_Assembly.png|vignette| Yon liy asanblaj (izin [[Ford]] nan [[Kansas City, Missouri|Kansas City]] ).]] [[Fichye:Cars_parked_on_the_pier_in_Barcelona_1997.jpg|vignette| Otomobil ap tann transpò (pò [[Baselòn|Barcelona]] ).]] Yon '''konstriktè otomobil''' se yon konpayi nan sektè konstriksyon otomobil ki gen aktivite sitou nan konsepsyon, fabrikasyon ak kòmès [[Machin|otomobil]]. Remake byen konsantrasyon pifò konstriktè yo nan gwo gwoup entènasyonal ki gen orijin yo se swa nan [[Etazini|Ozetazini]], an [[Ewòp]] oksidantal ( [[Almay]], [[Frans|Lafrans]], [[Itali]] ), oswa nan [[Ekstrèm-Oryan|Ekstrèm Oryan an]] ( [[Japon]], [[Kore disid|Kore di Sid]], [[Chin|Lachin]] ). [[End]] sitou rasanble anba lisans men gen yon kèk konstriktè nasyonal ak endepandan ki ap pran fòs. Se pa tout konstriktè ki fè tout pwodiksyon yo nan peyi kote syèj sosyal yo ye <ref group="Notes">Dans les tableaux, la nationalité est déterminée par le lieu d'implantation du siège social et les lieux de production ne sont pas précisés. </ref>. Gen kèk konstriktè ki baze nan peyi ki te gen pwodiksyon machin trè wo pou yon tan long. Gen lòt ki baze nan peyi sa yo rele emèjan", sa vle di ki piti piti ranfòse kapasite pwodiksyon yo, swa nan lanse nan aktivite sa a nan grafouyen oswa nan ogmante kapasite istorik yo. Pa "emèjan» Nou vle di sitou ki kalite pwodiksyon otomobil, osi byen ke matirite nan mache nasyonal peyi konsène yo (kritè sa a trè souvan sipèpoze ak sa ki nan kalifikasyon an "emèjan» yo itilize nan ekonomi). === Pwodiksyon mondyal otomobil depi 1999 === Pwodiksyon machin, eksepte machin itilitè, atravè lemond, depi 1999 <ref>{{En}} [http://www.worldometers.info/cars/ How many cars are produced in the world every year?]</ref>: * 2018 : 79 333 306 * 2017 : 80 063 544 * 2016 : 72 105 435 * 2015 : 68 539 516 * 2014 : 67 782 035 * 2013 : 65 745 403 * 2012 : 63 081 024 * 2011 : 59 929 016 * 2010 : 58 264 852 * 2009 : 47 772 598 * 2008 : 52 940 559 * 2007 : 54 920 317 * 2006 : 49 886 549 * 2005 : 46 862 978 * 2004 : 44 554 268 * 2003 : 41 968 666 * 2002 : 41 358 394 * 2001 : 39 825 888 * 2000 : 41 215 653 * 1999 : 39 759 847 === Classement de fabricants machin selon lavant yo an Ewòp === ==== 2016 ==== Pi gwo dis konstriktè otomobil yo nan Ewòp yo, nan 2016 <ref name="Bilan_2016_Europe">{{Cite web|url=http://www.leblogauto.com/2017/01/bilan-2016-europe.html|title=Bilan 2016 : Europe|last=G. Bottet|year=23 janvier 2017|website=leblogauto.com|language=fr|access-date=20 février 2017}}.</ref>: # [[Volkswagen]] : {{formatnum:1720829}}, 11,43 % ({{Diminution}}) # [[Renault]] : {{formatnum:1100880}}, 7,31 % ({{augmentation}}) # [[Ford]] : {{formatnum:1043294}}, 6,93 % ({{Diminution}}) # [[Opel]]/[[Vauxhall]] : {{formatnum:993494}}, 6,60 % ({{Diminution}}) # [[Peugeot]] : {{formatnum:865374}}, 5,75 % ({{Diminution}}) # [[Mercedes-Benz|Mercedes]] : {{formatnum:839779}}, 5,58 % ({{augmentation}}) # [[Audi]] : {{formatnum:830956}}, 5,52 % ({{augmentation}}) # [[BMW]] : {{formatnum:821525}}, 5,46 % ({{augmentation}}) # [[Fiat]] : {{formatnum:746126}}, 4,96 % ({{augmentation}}) # [[Škoda Auto|Škoda]] : {{formatnum:663230}}, 4,41 % ({{augmentation}}) ==== 2009 ==== Pi gwo dis konstriktè otomobil yo an Ewòp (kantite anrejistreman an 2009) <ref>[http://www.7sur7.be/7s7/fr/1784/Auto/article/detail/1054437/2010/01/15/Baisse-des-nouvelles-immatriculations-en-Europe-en-2009.dhtml 7s7 Auto - Baisse des nouvelles immatriculations en Europe en 2009 (1054437)] </ref>: # [[Volkswagen]] : 1 649 931 # [[Ford]] : 1 283 602 # [[Renault]] : 1 097 854 # Opel : 1 064 723 # Fiat : 1 016 340 # Peugeot : 995 130 # Citroën : 870 133 # [[Toyota]] : 710 369 # Audi : 612 293 # Mercedes-Benz : 593 088 == Nòt ak referans == === Nòt === <references group="Notes" /> === Referans === {{Referans}} == Apendis == {{Kategori prensipal}} === Lyen ekstèn === {{Liens}} [[Kategori:Atik Wikipedya avèk dosye otorite]] [[Kategori:Konstriksyon otomobil]] [[Kategori:Konstriktè otomobil]] mwfsso35n3qatuny656dp9i5ex2chzb 855569 855565 2024-11-12T13:35:32Z BwaKajou 31668 /* 2016 */ 855569 wikitext text/x-wiki [[Fichye:Kansas_City_Assembly.png|vignette| Yon liy asanblaj (izin [[Ford]] nan [[Kansas City, Missouri|Kansas City]] ).]] [[Fichye:Cars_parked_on_the_pier_in_Barcelona_1997.jpg|vignette| Otomobil ap tann transpò (pò [[Baselòn|Barcelona]] ).]] Yon '''konstriktè otomobil''' se yon konpayi nan sektè konstriksyon otomobil ki gen aktivite sitou nan konsepsyon, fabrikasyon ak kòmès [[Machin|otomobil]]. Remake byen konsantrasyon pifò konstriktè yo nan gwo gwoup entènasyonal ki gen orijin yo se swa nan [[Etazini|Ozetazini]], an [[Ewòp]] oksidantal ( [[Almay]], [[Frans|Lafrans]], [[Itali]] ), oswa nan [[Ekstrèm-Oryan|Ekstrèm Oryan an]] ( [[Japon]], [[Kore disid|Kore di Sid]], [[Chin|Lachin]] ). [[End]] sitou rasanble anba lisans men gen yon kèk konstriktè nasyonal ak endepandan ki ap pran fòs. Se pa tout konstriktè ki fè tout pwodiksyon yo nan peyi kote syèj sosyal yo ye <ref group="Notes">Dans les tableaux, la nationalité est déterminée par le lieu d'implantation du siège social et les lieux de production ne sont pas précisés. </ref>. Gen kèk konstriktè ki baze nan peyi ki te gen pwodiksyon machin trè wo pou yon tan long. Gen lòt ki baze nan peyi sa yo rele emèjan", sa vle di ki piti piti ranfòse kapasite pwodiksyon yo, swa nan lanse nan aktivite sa a nan grafouyen oswa nan ogmante kapasite istorik yo. Pa "emèjan» Nou vle di sitou ki kalite pwodiksyon otomobil, osi byen ke matirite nan mache nasyonal peyi konsène yo (kritè sa a trè souvan sipèpoze ak sa ki nan kalifikasyon an "emèjan» yo itilize nan ekonomi). === Pwodiksyon mondyal otomobil depi 1999 === Pwodiksyon machin, eksepte machin itilitè, atravè lemond, depi 1999 <ref>{{En}} [http://www.worldometers.info/cars/ How many cars are produced in the world every year?]</ref>: * 2018 : 79 333 306 * 2017 : 80 063 544 * 2016 : 72 105 435 * 2015 : 68 539 516 * 2014 : 67 782 035 * 2013 : 65 745 403 * 2012 : 63 081 024 * 2011 : 59 929 016 * 2010 : 58 264 852 * 2009 : 47 772 598 * 2008 : 52 940 559 * 2007 : 54 920 317 * 2006 : 49 886 549 * 2005 : 46 862 978 * 2004 : 44 554 268 * 2003 : 41 968 666 * 2002 : 41 358 394 * 2001 : 39 825 888 * 2000 : 41 215 653 * 1999 : 39 759 847 === Classement de fabricants machin selon lavant yo an Ewòp === ==== 2016 ==== Pi gwo dis konstriktè otomobil yo nan Ewòp yo, nan 2016 <ref name="Bilan_2016_Europe">{{Cite web|url=http://www.leblogauto.com/2017/01/bilan-2016-europe.html|title=Bilan 2016 : Europe|last=G. Bottet|year=23 janvier 2017|website=leblogauto.com|language=fr|access-date=20 février 2017}}.</ref>: # [[Volkswagen]] : {{formatnum:1720829}}, 11,43 % ({{Diminution}}) # [[Renault]] : {{formatnum:1100880}}, 7,31 % ({{augmentation}}) # [[Ford]] : {{formatnum:1043294}}, 6,93 % ({{Diminution}}) # [[Opel]]/[[Vauxhall]] : {{formatnum:993494}}, 6,60 % ({{Diminution}}) # [[Peugeot]] : {{formatnum:865374}}, 5,75 % ({{Diminution}}) # [[Mercedes-Benz|Mercedes]] : {{formatnum:839779}}, 5,58 % ({{augmentation}}) # [[Audi]] : {{formatnum:830956}}, 5,52 % ({{augmentation}}) # [[BMW]] : {{formatnum:821525}}, 5,46 % ({{augmentation}}) # [[Fiat]] : {{formatnum:746126}}, 4,96 % ({{augmentation}}) # [[Škoda Auto|Škoda]] : {{formatnum:663230}}, 4,41 % ({{augmentation}}) ==== 2009 ==== Pi gwo dis konstriktè otomobil yo an Ewòp (kantite anrejistreman an 2009) <ref>[http://www.7sur7.be/7s7/fr/1784/Auto/article/detail/1054437/2010/01/15/Baisse-des-nouvelles-immatriculations-en-Europe-en-2009.dhtml 7s7 Auto - Baisse des nouvelles immatriculations en Europe en 2009 (1054437)] </ref>: # [[Volkswagen]] : 1 649 931 # [[Ford]] : 1 283 602 # [[Renault]] : 1 097 854 # Opel : 1 064 723 # Fiat : 1 016 340 # Peugeot : 995 130 # Citroën : 870 133 # [[Toyota]] : 710 369 # Audi : 612 293 # Mercedes-Benz : 593 088 == Nòt ak referans == === Nòt === <references group="Notes" /> === Referans === {{Referans}} == Apendis == {{Kategori prensipal}} === Lyen ekstèn === {{Liens}} [[Kategori:Atik Wikipedya avèk dosye otorite]] [[Kategori:Konstriksyon otomobil]] [[Kategori:Konstriktè otomobil]] t5p99e04dm5ke1kdc5yn4f1nu25i4jh Modèl:Diminution 10 93747 855566 2024-11-12T13:33:17Z BwaKajou 31668 Redireksyon sou [[Modèl:Diminisyon]] 855566 wikitext text/x-wiki #redirect[[Modèl:Diminisyon]] e6csxw2acgbzt8xnoycnfxyecmpguda Modèl:Augmentation 10 93748 855567 2024-11-12T13:33:56Z BwaKajou 31668 Redireksyon sou [[Modèl:Ogmantasyon]] 855567 wikitext text/x-wiki #Redirect[[Modèl:Ogmantasyon]] nqn5j1yoszahnyapueph9vm1qhlgyik Modèl:Diminisyon 10 93749 855568 2024-11-12T13:35:10Z BwaKajou 31668 Paj ki kreye ak " {{#ifeq: {{{1|}}} | tri | <span data-sort-value="−">[[Fichye:Decrease2.svg|{{{2|11px}}}|an diminisyon|alt=−|link=]]</span> | <span data-sort-value="">[[Fichye:Decrease2.svg|{{{2|11px}}}|{{#if:{{{1|}}}|{{{1}}}|an diminisyon}}|link=]]</span> }}<noinclude>{{Documentation}}</noinclude> " 855568 wikitext text/x-wiki {{#ifeq: {{{1|}}} | tri | <span data-sort-value="−">[[Fichye:Decrease2.svg|{{{2|11px}}}|an diminisyon|alt=−|link=]]</span> | <span data-sort-value="">[[Fichye:Decrease2.svg|{{{2|11px}}}|{{#if:{{{1|}}}|{{{1}}}|an diminisyon}}|link=]]</span> }}<noinclude>{{Documentation}}</noinclude> kq67bzor6er1t601uhoo0z2g8ryjzza J. Paul Getty Museum 0 93750 855571 2024-11-12T13:41:07Z BwaKajou 31668 Li kreye pa tradui paj « [[:fr:Special:Redirect/revision/218936364|J. Paul Getty Museum]] » 855571 wikitext text/x-wiki '''J.''' '''Paul Getty Museum''' se yon mize atizay [[Etazini|ameriken]] nan [[Los Angeles, Kalifòni|Los Angeles]], [[Kalifòni]]. Souvan yo rele l '''Gettty''', li deplwaye sou de kanpis: Villa Getty ak Getty Center <ref name="visitors">{{Cite web|url=https://www.museus.gov.br/wp-content/uploads/2017/04/20170406-CPAI-Ranking2016Pub-Comp-.pdf|title=Visitor Figures 2016|date=April 2017|publisher=[[The Art Newspaper]] Review|page=14|access-date=23 mars 2018}}</ref>. Mize Getty orijinal la, Villa Getty, sitiye nan katye Pacific Palisades. Li prezante zèv atistik ki soti nan [[Grès antik|ansyen Lagrès]], [[Wòm ansyen|Wòm]] ak Etruria <ref>{{Cite web|url=http://getty.edu/visit/|title=Visit the Getty|publisher=Getty.edu|access-date=26 janvier 2012}}</ref>. Getty Center a sitiye nan katye Brentwood. Li prezante penti, desen, maniskri eklere, eskilti, atizay dekoratif ak foto <ref>{{Cite web|url=http://www.getty.edu/museum/about.html|title=About the Museum (Getty Museum)|website=www.getty.edu|access-date=16 mars 2018}}</ref> {{,}} <ref>{{Cite web|url=http://www.getty.edu/art/photographs/|title=Photographs &#124; the J. Paul Getty Museum|website=www.getty.edu|access-date=16 mars 2018}}</ref> [[Fichye:Getty_villa,_peristilio_esterno_10.JPG|centré|vignette| Peristil nan Geti Villa a, gwo lakou jaden an 2010.]] == Nòt ak referans == <references /> == Apendis == {{Lòt pwojè|commons=Getty Museum}} === Lyen ekstèn === {{Liens}} [[Kategori:Atik Wikipedya avèk dosye otorite]] [[Kategori:Fanmi Getty]] 7xkij6bj42hj2zxky33jm6byr00eja0 Lila (Van Gogh) 0 93751 855572 2024-11-12T13:47:24Z BwaKajou 31668 Li kreye pa tradui paj « [[:fr:Special:Redirect/revision/218914707|Lilas (Van Gogh)]] » 855572 wikitext text/x-wiki '''''Lila''''' a se yon tablo [[Vincent van Gogh]] nan Mize Èmitaj nan [[Sen Pitèboug|Saint Petersburg]]. == Istwa == Van Gogh te pentire tablo sa a nan mwa me 1889, pandan atis la t ap resevwa tretman nan [[Saint-Rémy-de-Provence]] nan lopital pou moun fou [[Théophile Peyron|Doktè Peyron]] a. Lilas sa a te nan jaden lopital kote Van Gogh te trete. Ekspresyon an dramatik nan moman sa yo transkri nan mouvman an nan ti pyebwa a flè. Lè li rive nan azil la, yo te entèdi l mache nan peyi a pou premye mwa a, se nan jaden sa a ke li konpoze etid flè ki pi popilè <ref>Ralph Skea, ''Les Arbres de Vincent van Gogh'', Londres, éd. Thames & Hudson, traduction française de Lydie Échasseriaud, 2013 </ref> . Li te kwè ke kominyon ak lanati - kèlkeswa fòm li - ta dwe pèmèt yon moun antre an kontak ak sa ki pi wo a, « ak [...] yon bagay sa a ki anwo a [...] enkonpreyansib. » <ref>Lettre n°403 à son frère [[Théodore van Gogh (négociant en art)|Théo]], in ''Vincent van Gogh - Les Lettres'' 6 volumes, Arles, Actes Sud, 2009 </ref> == Nòt ak referans == {{Referans}} == Bibliyografi == * [[Jacob Baart de la Faille]], ''Zèv Vincent van Gogh, katalòg rezone, Ouvraj ki te akonpaye pa repwodiksyon de plis pase 1,600 penti, desen, aquarelle ak engraving pa mèt la'', 6 volim, edisyon G. van Oest, Pari & [[Briksèl]], 1928 == Lyen ekstèn == * {{En}} [http://www.vangoghgallery.com/catalog/Painting/305/Lilacs.html ''Lilas''] (Van Gogh Gallery) * {{En}} [http://www.hermitagemuseum.org/fcgi-bin/db2www/descrPage.mac/descrPage?selLang=English&indexClass=PICTURE_EN&PID=GJ-6511&numView=1&ID_NUM=1&thumbFile=%2Ftmplobs%2FVFO5BKQYYRT_234N216.jpg&embViewVer=noEmb&comeFrom=quick&sorting=no&thumbId=6&numResults=9&tmCond=van+Gogh&searchIndex=TAGFILEN&author=Van%26%2332%3BGogh%2C%26%2332%3BVincent ''Lilas'' (site officiel du musée de l'Ermitage)] [[Kategori:Me 1889]] [[Kategori:1889 an Frans]] [[Kategori:Tablo reyalize an 1889]] [[Kategori:Tablo Vincent van Gogh]] j4rb7bwctsk1f00jxb7b00vw9papbhm 855590 855572 2024-11-12T15:51:37Z BwaKajou 31668 855590 wikitext text/x-wiki {{infobox atizay}} '''''Lila''''' a se yon tablo [[Vincent van Gogh]] nan Mize Èmitaj nan [[Sen Pitèboug|Saint Petersburg]]. == Istwa == Van Gogh te pentire tablo sa a nan mwa me 1889, pandan atis la t ap resevwa tretman nan [[Saint-Rémy-de-Provence]] nan lopital pou moun fou [[Théophile Peyron|Doktè Peyron]] a. Lilas sa a te nan jaden lopital kote Van Gogh te trete. Ekspresyon an dramatik nan moman sa yo transkri nan mouvman an nan ti pyebwa a flè. Lè li rive nan azil la, yo te entèdi l mache nan peyi a pou premye mwa a, se nan jaden sa a ke li konpoze etid flè ki pi popilè <ref>Ralph Skea, ''Les Arbres de Vincent van Gogh'', Londres, éd. Thames & Hudson, traduction française de Lydie Échasseriaud, 2013 </ref> . Li te kwè ke kominyon ak lanati - kèlkeswa fòm li - ta dwe pèmèt yon moun antre an kontak ak sa ki pi wo a, « ak [...] yon bagay sa a ki anwo a [...] enkonpreyansib. » <ref>Lettre n°403 à son frère [[Théodore van Gogh (négociant en art)|Théo]], in ''Vincent van Gogh - Les Lettres'' 6 volumes, Arles, Actes Sud, 2009 </ref> == Nòt ak referans == {{Referans}} == Bibliyografi == * [[Jacob Baart de la Faille]], ''Zèv Vincent van Gogh, katalòg rezone, Ouvraj ki te akonpaye pa repwodiksyon de plis pase 1,600 penti, desen, aquarelle ak engraving pa mèt la'', 6 volim, edisyon G. van Oest, Pari & [[Briksèl]], 1928 == Lyen ekstèn == * {{En}} [http://www.vangoghgallery.com/catalog/Painting/305/Lilacs.html ''Lilas''] (Van Gogh Gallery) * {{En}} [http://www.hermitagemuseum.org/fcgi-bin/db2www/descrPage.mac/descrPage?selLang=English&indexClass=PICTURE_EN&PID=GJ-6511&numView=1&ID_NUM=1&thumbFile=%2Ftmplobs%2FVFO5BKQYYRT_234N216.jpg&embViewVer=noEmb&comeFrom=quick&sorting=no&thumbId=6&numResults=9&tmCond=van+Gogh&searchIndex=TAGFILEN&author=Van%26%2332%3BGogh%2C%26%2332%3BVincent ''Lilas'' (site officiel du musée de l'Ermitage)] [[Kategori:Me 1889]] [[Kategori:1889 an Frans]] [[Kategori:Tablo reyalize an 1889]] [[Kategori:Tablo Vincent van Gogh]] d484nnqylwaj7742kfq0lrbavjkdlvu 855597 855590 2024-11-12T16:54:15Z BwaKajou 31668 855597 wikitext text/x-wiki {{infobox atizay}} '''''Lila''''' a se yon tablo [[Vincent van Gogh]] nan Mize Èmitaj nan [[Sen Pitèboug|Saint Petersburg]]. == Istwa == Van Gogh te pentire tablo sa a nan mwa me 1889, pandan atis la t ap resevwa tretman nan [[Saint-Rémy-de-Provence]] nan lopital pou moun fou [[Théophile Peyron|Doktè Peyron]] a. Lilas sa a te nan jaden lopital kote Van Gogh te trete. Ekspresyon an dramatik nan moman sa yo transkri nan mouvman an nan ti pyebwa a flè. Lè li rive nan azil la, yo te entèdi l mache nan peyi a pou premye mwa a, se nan jaden sa a ke li konpoze etid flè ki pi popilè <ref>Ralph Skea, ''Les Arbres de Vincent van Gogh'', Londres, éd. Thames & Hudson, traduction française de Lydie Échasseriaud, 2013 </ref> . Li te kwè ke kominyon ak lanati - kèlkeswa fòm li - ta dwe pèmèt yon moun antre an kontak ak sa ki pi wo a, « ak [...] yon bagay sa a ki anwo a [...] enkonpreyansib. » <ref>Lettre n°403 à son frère [[Théodore van Gogh (négociant en art)|Théo]], in ''Vincent van Gogh - Les Lettres'' 6 volumes, Arles, Actes Sud, 2009 </ref> == Nòt ak referans == {{Referans}} == Bibliyografi == * [[Jacob Baart de la Faille]], ''Zèv Vincent van Gogh, katalòg rezone, Ouvraj ki te akonpaye pa repwodiksyon de plis pase 1,600 penti, desen, aquarelle ak engraving pa mèt la'', 6 volim, edisyon G. van Oest, Pari & [[Briksèl]], 1928 == Lyen ekstèn == * {{En}} [http://www.vangoghgallery.com/catalog/Painting/305/Lilacs.html ''Lilas''] (Van Gogh Gallery) * {{En}} [http://www.hermitagemuseum.org/fcgi-bin/db2www/descrPage.mac/descrPage?selLang=English&indexClass=PICTURE_EN&PID=GJ-6511&numView=1&ID_NUM=1&thumbFile=%2Ftmplobs%2FVFO5BKQYYRT_234N216.jpg&embViewVer=noEmb&comeFrom=quick&sorting=no&thumbId=6&numResults=9&tmCond=van+Gogh&searchIndex=TAGFILEN&author=Van%26%2332%3BGogh%2C%26%2332%3BVincent ''Lilas'' (site officiel du musée de l'Ermitage)] [[Kategori:Me 1889]] [[Kategori:1889 an Frans]] [[Kategori:Tablo reyalize an 1889]] [[Kategori:Tablo Vincent van Gogh]] pqo00xxdnuf100hbnomuzfx436s28sx 855600 855597 2024-11-12T17:29:36Z BwaKajou 31668 855600 wikitext text/x-wiki {{infobox atizay}} '''''Lila''''' a se yon tablo [[Vincent van Gogh]] nan Mize Èmitaj nan [[Sen Pitèboug|Saint Petersburg]]. == Istwa == Van Gogh te pentire tablo sa a nan mwa me 1889, pandan atis la t ap resevwa tretman nan [[Saint-Rémy-de-Provence]] nan lopital pou moun fou [[Théophile Peyron|Doktè Peyron]] a. Lilas sa a te nan jaden lopital kote Van Gogh te trete. Ekspresyon an dramatik nan moman sa yo transkri nan mouvman an nan ti pyebwa a flè. Lè li rive nan azil la, yo te entèdi l mache nan peyi a pou premye mwa a, se nan jaden sa a ke li konpoze etid flè ki pi popilè <ref>Ralph Skea, ''Les Arbres de Vincent van Gogh'', Londres, éd. Thames & Hudson, traduction française de Lydie Échasseriaud, 2013 </ref> . Li te kwè ke kominyon ak lanati - kèlkeswa fòm li - ta dwe pèmèt yon moun antre an kontak ak sa ki pi wo a, « ak [...] yon bagay sa a ki anwo a [...] enkonpreyansib. » <ref>Lettre n°403 à son frère [[Théodore van Gogh (négociant en art)|Théo]], in ''Vincent van Gogh - Les Lettres'' 6 volumes, Arles, Actes Sud, 2009 </ref> == Nòt ak referans == {{Referans}} == Bibliyografi == * [[Jacob Baart de la Faille]], ''Zèv Vincent van Gogh, katalòg rezone, Ouvraj ki te akonpaye pa repwodiksyon de plis pase 1,600 penti, desen, aquarelle ak engraving pa mèt la'', 6 volim, edisyon G. van Oest, Pari & [[Briksèl]], 1928 == Lyen ekstèn == * {{En}} [http://www.vangoghgallery.com/catalog/Painting/305/Lilacs.html ''Lilas''] (Van Gogh Gallery) * {{En}} [http://www.hermitagemuseum.org/fcgi-bin/db2www/descrPage.mac/descrPage?selLang=English&indexClass=PICTURE_EN&PID=GJ-6511&numView=1&ID_NUM=1&thumbFile=%2Ftmplobs%2FVFO5BKQYYRT_234N216.jpg&embViewVer=noEmb&comeFrom=quick&sorting=no&thumbId=6&numResults=9&tmCond=van+Gogh&searchIndex=TAGFILEN&author=Van%26%2332%3BGogh%2C%26%2332%3BVincent ''Lilas'' (site officiel du musée de l'Ermitage)] [[Kategori:Me 1889]] [[Kategori:1889 an Frans]] [[Kategori:Tablo reyalize an 1889]] [[Kategori:Tablo Vincent van Gogh]] asrxdhj7ost4c4qwgf8r7l4u7talkha Kategori:Paj ki itilize P31 14 93752 855583 2024-11-12T15:17:34Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855583 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P366 14 93753 855584 2024-11-12T15:17:57Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855584 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P170 14 93754 855601 2024-11-12T17:30:09Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855601 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P136 14 93755 855602 2024-11-12T17:30:35Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855602 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P186 14 93756 855603 2024-11-12T17:30:45Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855603 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P1071 14 93757 855604 2024-11-12T17:30:59Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855604 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P2048 14 93758 855605 2024-11-12T17:31:10Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855605 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P2049 14 93759 855606 2024-11-12T17:31:40Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855606 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P217 14 93760 855607 2024-11-12T17:31:53Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855607 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P276 14 93761 855608 2024-11-12T17:32:04Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855608 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Legliz Auvers-sur-Oise 0 93762 855620 2024-11-12T22:40:12Z BwaKajou 31668 Li kreye pa tradui paj « [[:fr:Special:Redirect/revision/218922895|L'Église d'Auvers-sur-Oise]] » 855620 wikitext text/x-wiki <references responsive="1"></references> '''''Legliz Auvers-sur-Oise''''' se yon [[penti ak lwil]] sou yon twal ki mezire 74 × 94  cm. Li te reyalize pa pent [[Vincent van Gogh]] an [[1890 (almanak gregoryen)|1890]] e li ekspoze nan [[Mize Orsay|Mize d'Orsay]], Pari. Li fè pati [[Pòs-enpresyonis|mouvman pòs-enpresyonist]] la. == Istorik == Nan mwa me 1890, Van Gogh te ale Auvers-sur-Oise, nan tout savann Pari. Travay sa a se youn nan katreven penti ke pent la te kreye pandan de dènye mwa nan lavi l, pandan tan li te pase nan vilaj Auvers-sur-Oise {{Sfn|Hodge|2018|p=13|id=}}. {{Lòt pwojè|commons=Category:The Church at Auvers by Vincent van Gogh}} == Referans == {{Liens}} === Atik ki gen rapò === === Lyen ekstèn === [[Kategori:1890 an Frans]] [[Kategori:Tablo reyalize an 1890]] [[Kategori:Tablo Vincent van Gogh]] f15ugn0vyv8457actmjn80kpt42kjs6 855623 855620 2024-11-12T22:47:20Z BwaKajou 31668 855623 wikitext text/x-wiki {{Infobox atizay | tit = Legliz Auvers-sur-Oise | imaj = Vincent van Gogh - The Church in Auvers-sur-Oise, View from the Chevet - Google Art Project.jpg | taille = | alt = Legliz Auvers | légende = ''Legliz Auvers-sur-Oise, depi chevet'' | atis = [[Vincent van Gogh]] | ane = 16 me 1890 | teknik = [[lwil sou twal]] | tip = | wotè = 940 | lajè = 740 | pwofondè = | dyamèt = | inite = mm | fòma = | mize = [[Mize Orsay]] | lokalizasyon = | vil = Pari | peyi = Frans | pwopriyete = | kòmantè = F789 / JH2006 - Reyalize Auvers-sur-Oise | jewolokalizasyon = pas pertinent }} <references responsive="1"></references> '''''Legliz Auvers-sur-Oise''''' se yon [[penti ak lwil]] sou yon twal ki mezire 74 × 94  cm. Li te reyalize pa pent [[Vincent van Gogh]] an [[1890 (almanak gregoryen)|1890]] e li ekspoze nan [[Mize Orsay|Mize d'Orsay]], Pari. Li fè pati [[Pòs-enpresyonis|mouvman pòs-enpresyonist]] la. == Istorik == Nan mwa me 1890, Van Gogh te ale Auvers-sur-Oise, nan tout savann Pari. Travay sa a se youn nan katreven penti ke pent la te kreye pandan de dènye mwa nan lavi l, pandan tan li te pase nan vilaj Auvers-sur-Oise {{Sfn|Hodge|2018|p=13|id=}}. {{Lòt pwojè|commons=Category:The Church at Auvers by Vincent van Gogh}} == Referans == {{Liens}} === Atik ki gen rapò === === Lyen ekstèn === [[Kategori:1890 an Frans]] [[Kategori:Tablo reyalize an 1890]] [[Kategori:Tablo Vincent van Gogh]] pi4twj58s6w98fcfrciyqaz34p3tp04 855635 855623 2024-11-12T23:25:10Z BwaKajou 31668 855635 wikitext text/x-wiki {{Infobox atizay | tit = Legliz Auvers-sur-Oise | imaj = Vincent van Gogh - The Church in Auvers-sur-Oise, View from the Chevet - Google Art Project.jpg | taille = | alt = Legliz Auvers | légende = ''Legliz Auvers-sur-Oise, depi chevet'' | atis = [[Vincent van Gogh]] | ane = 16 me 1890 | teknik = [[lwil sou twal]] | tip = | wotè = 940 | lajè = 740 | pwofondè = | dyamèt = | inite = mm | fòma = | mize = [[Mize Orsay]] | lokalizasyon = | vil = Pari | peyi = Frans | pwopriyete = | kòmantè = F789 / JH2006 - Reyalize Auvers-sur-Oise | jewolokalizasyon = pas pertinent }} <references responsive="1"></references> '''''Legliz Auvers-sur-Oise''''' se yon [[penti ak lwil]] sou yon twal ki mezire 74 × 94  cm. Li te reyalize pa pent [[Vincent van Gogh]] an [[1890 (almanak gregoryen)|1890]] e li ekspoze nan [[Mize Orsay|Mize d'Orsay]], Pari. Li fè pati [[Pòs-enpresyonis|mouvman pòs-enpresyonist]] la. == Istorik == Nan mwa me 1890, Van Gogh te ale Auvers-sur-Oise, nan tout savann Pari. Travay sa a se youn nan katreven penti ke pent la te kreye pandan de dènye mwa nan lavi l, pandan tan li te pase nan vilaj Auvers-sur-Oise {{Sfn|Hodge|2018|p=13|id=}}. {{Lòt pwojè|commons=Category:The Church at Auvers by Vincent van Gogh}} == Referans == {{Liens}} === Atik ki gen rapò === === Lyen ekstèn === [[Kategori:1890 an Frans]] [[Kategori:Tablo reyalize an 1890]] [[Kategori:Tablo Vincent van Gogh]] okkpdf9t148jwdrvk3whz6s97hayi73 855642 855635 2024-11-12T23:43:24Z BwaKajou 31668 855642 wikitext text/x-wiki {{Infobox atizay | tit = Legliz Auvers-sur-Oise | imaj = Vincent van Gogh - The Church in Auvers-sur-Oise, View from the Chevet - Google Art Project.jpg | taille = | alt = Legliz Auvers | légende = ''Legliz Auvers-sur-Oise, depi chevet'' | atis = [[Vincent van Gogh]] | ane = 16 me 1890 | teknik = [[lwil sou twal]] | tip = | wotè = 940 | lajè = 740 | pwofondè = | dyamèt = | inite = mm | fòma = | mize = [[Mize Orsay]] | lokalizasyon = | vil = Pari | peyi = Frans | pwopriyete = | kòmantè = F789 / JH2006 - Reyalize Auvers-sur-Oise | jewolokalizasyon = pas pertinent }} <references responsive="1"></references> '''''Legliz Auvers-sur-Oise''''' se yon [[penti ak lwil]] sou yon twal ki mezire 74 × 94  cm. Li te reyalize pa pent [[Vincent van Gogh]] an [[1890 (almanak gregoryen)|1890]] e li ekspoze nan [[Mize Orsay|Mize d'Orsay]], Pari. Li fè pati [[Pòs-enpresyonis|mouvman pòs-enpresyonist]] la. == Istorik == Nan mwa me 1890, Van Gogh te ale Auvers-sur-Oise, nan tout savann Pari. Travay sa a se youn nan katreven penti ke pent la te kreye pandan de dènye mwa nan lavi l, pandan tan li te pase nan vilaj Auvers-sur-Oise {{Sfn|Hodge|2018|p=13|id=}}. {{Lòt pwojè|commons=Category:The Church at Auvers by Vincent van Gogh}} == Referans == {{Liens}} === Atik ki gen rapò === === Lyen ekstèn === [[Kategori:1890 an Frans]] [[Kategori:Tablo reyalize an 1890]] [[Kategori:Tablo Vincent van Gogh]] 8zug7estxxi0w7u7dll3bodg02r46rc Kategori:Paj ki itilize P347 14 93763 855621 2024-11-12T22:41:00Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855621 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P4659 14 93764 855622 2024-11-12T22:41:14Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855622 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P135 14 93765 855632 2024-11-12T23:23:38Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855632 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P127 14 93766 855633 2024-11-12T23:23:55Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855633 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Kategori:Paj ki itilize P154 14 93767 855634 2024-11-12T23:24:35Z BwaKajou 31668 Paj ki kreye ak " {{Kategori yon pwopriyete}} " 855634 wikitext text/x-wiki {{Kategori yon pwopriyete}} 6kt630uq9qbt3m2blhq5zh6ftm5nla1 Lwil sou twal 0 93768 855636 2024-11-12T23:26:51Z BwaKajou 31668 Redireksyon sou [[Penti ak lwil]] 855636 wikitext text/x-wiki #REDIRECTION [[Penti ak lwil]] rejavvxf6ylvrs2wgyksry9ii7u39ls Kategori:Zèv da jewolokalize san kowòdone parametre 14 93769 855637 2024-11-12T23:30:53Z BwaKajou 31668 Paj ki kreye ak " __HIDDENCAT__ {{Kategori Wikipedya pou vide|nocat=wi}} {{kategorize pa|pou jewokalize}} Lè w mete banyè {{m|pou jewolokalize}} la sou yon atik, sa ap fè banyè sa a parèt epi ajoute li nan kategori sa a: {{pou jewolokalize|nocat=wi}} Kategori sa a tou ranpli pa {{m|Infobox atizay}} lè kowòdone jeyografik yo absan. {{DEFAULTSORT: Zèv da jewolokalize san kowòdone parametre}} [[Kategori:Paj jewolokalize san kowòdone parametre]] " 855637 wikitext text/x-wiki __HIDDENCAT__ {{Kategori Wikipedya pou vide|nocat=wi}} {{kategorize pa|pou jewokalize}} Lè w mete banyè {{m|pou jewolokalize}} la sou yon atik, sa ap fè banyè sa a parèt epi ajoute li nan kategori sa a: {{pou jewolokalize|nocat=wi}} Kategori sa a tou ranpli pa {{m|Infobox atizay}} lè kowòdone jeyografik yo absan. {{DEFAULTSORT: Zèv da jewolokalize san kowòdone parametre}} [[Kategori:Paj jewolokalize san kowòdone parametre]] 4each6nivd7x6h2pu3d150ikzhq5bqc Modèl:Pou jewolokalize 10 93770 855640 2024-11-12T23:39:14Z BwaKajou 31668 Paj ki kreye ak " {{Méta bandeau d'avertissement | niveau = modéré | icône = Circle-icons-compass.svg | titre = Atik sa a bezwen jewolokalize. | texte = Pou amelyore atik sa a, detèmine [[kowòdone jewografik]] lye li dekri a epi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ajoute yo nan atik la] gras ak modèl {{m|coord}}. }}<includeonly>{{#if:{{{nocat|}}}||[[Catégorie:Article à géolocaliser]]}}</includeonly><noinclude>{{Documentation|contenu= == Itilizasyon == {{Kategorize|Atik pou... " 855640 wikitext text/x-wiki {{Méta bandeau d'avertissement | niveau = modéré | icône = Circle-icons-compass.svg | titre = Atik sa a bezwen jewolokalize. | texte = Pou amelyore atik sa a, detèmine [[kowòdone jewografik]] lye li dekri a epi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ajoute yo nan atik la] gras ak modèl {{m|coord}}. }}<includeonly>{{#if:{{{nocat|}}}||[[Catégorie:Article à géolocaliser]]}}</includeonly><noinclude>{{Documentation|contenu= == Itilizasyon == {{Kategorize|Atik pou jewolokalize|ki nan yon kategori kache}} Le paramètre <code><nowiki>|nocat=oui</nowiki></code> permet de désactiver la catégorisation de la page. <templatedata> { "params": { "nocat": { "label": "Nocat", "description": "Permet de ne pas catégoriser la page.", "type": "string", "suggestedvalues": [ "1" ] } }, "description": "Bandeau indiquant un article à géolocaliser." } </templatedata> }} [[Kategori:Modèl banyè atik]] </noinclude> dqz0rdue57m0l2mbxjxwn6cu9lwnqll Kategori:Atik ki itilize infobox en Lua Art 14 93771 855643 2024-11-13T00:15:10Z BwaKajou 31668 Paj ki kreye ak " __HIDDENCAT__ {{kategorize pa|Infobox nan Lua}} [[Kategori:Antretyen infobox|Lua]] [[Kategori:Atik ki itilize yon Infobox]] " 855643 wikitext text/x-wiki __HIDDENCAT__ {{kategorize pa|Infobox nan Lua}} [[Kategori:Antretyen infobox|Lua]] [[Kategori:Atik ki itilize yon Infobox]] 1v6digapu3sl8ainoy2o3vpll836t04 Kategori:Atik ki itilize yon Infobox 14 93772 855646 2024-11-13T00:20:28Z BwaKajou 31668 Paj ki kreye ak " __HIDDENCAT__ [[Kategori:Antretyen atik yo]] " 855646 wikitext text/x-wiki __HIDDENCAT__ [[Kategori:Antretyen atik yo]] 4wse0g6d7zqdon7bwfja3n940s7wd3k Kategori:Infobox avèk lejand lokal ak yon imaj sou Wikidata 14 93773 855648 2024-11-13T00:30:08Z BwaKajou 31668 Paj ki kreye ak " __HIDDENCAT__ {{kategorize pa|Infobox}} {{Kategori Wikipedya pou vide|kategori espesifik=[[Kategori:Paj ki sèvi ak yon modèl sentaks ki pa kòrèk]][[Kategori:Kategori antretyen modèl yo dwe vide]]}} Kategori sa a gen paj ki itilize modèl ki depann de modil [[Module:Infobox|Infobox]]. Li parèt apre prezans yon tit sou Wikipedia pandan imaj la soti nan Wikidata. [[Kategori:Antretyen infobox]] " 855648 wikitext text/x-wiki __HIDDENCAT__ {{kategorize pa|Infobox}} {{Kategori Wikipedya pou vide|kategori espesifik=[[Kategori:Paj ki sèvi ak yon modèl sentaks ki pa kòrèk]][[Kategori:Kategori antretyen modèl yo dwe vide]]}} Kategori sa a gen paj ki itilize modèl ki depann de modil [[Module:Infobox|Infobox]]. Li parèt apre prezans yon tit sou Wikipedia pandan imaj la soti nan Wikidata. [[Kategori:Antretyen infobox]] l91mfal7uf9io4fm3mbqzv7seg8d433