Wikifunctions wikifunctionswiki https://www.wikifunctions.org/wiki/Wikifunctions:Main_Page MediaWiki 1.48.0-wmf.1 first-letter Media Special Talk User User talk Wikifunctions Wikifunctions talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk TimedText TimedText talk Module Module talk Translations Translations talk Event Event talk Z557 0 148 334687 220533 2026-10-30T11:12:39Z Mengsky 103320 334687 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z557" }, "Z2K2": { "Z1K1": "Z50", "Z50K1": [ "Z3", { "Z1K1": "Z3", "Z3K1": "Z6", "Z3K2": "Z557K1", "Z3K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "message" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "bericht" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "messaggio" } ] } } ], "Z50K2": "Z557" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "User does not have permission to edit" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Benutzer hat nicht die Bearbeitungsberechtigung" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "gebruiker heeft geen toestemming om te bewerken" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "ব্যবহারকারীর সম্পাদনা করার অনুমতি নেই" }, { "Z1K1": "Z11", "Z11K1": "Z1013", "Z11K2": "Mai amfani bashi da izini don yin gyara" }, { "Z1K1": "Z11", "Z11K1": "Z1186", "Z11K2": "למשתמש אין הרשאה לערוך" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "Användaren saknar behörighet att redigera" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "L'utilisateur n'a pas la permission de modifier" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "L'utente non ha il permesso di modificare" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Pengguna tidak memiliki akses untuk mengedit" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1186", "Z11K2": "סוג של שגיאה" } ] } } ghllpav5yda1x5wwviodesb419wqlzj Z801 0 169 334694 302551 2026-10-30T11:26:49Z Virinas-code 2884 Add "I combinator" alias 334694 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z801" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z801K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "input" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "invoer" }, { "Z1K1": "Z11", "Z11K1": "Z1025", "Z11K2": "wejście" }, { "Z1K1": "Z11", "Z11K1": "Z1014", "Z11K2": "Ihe" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "ইনপুট" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "saisie" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "इनपुट" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Eingabe" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "入力" } ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20", "Z8010", "Z8011", "Z8012", "Z8013", "Z13517", "Z15868", "Z13870", "Z17799", "Z17603", "Z31006" ], "Z8K4": [ "Z14", "Z901", "Z10044" ], "Z8K5": "Z801" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Echo" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Echo" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "echo" }, { "Z1K1": "Z11", "Z11K1": "Z1025", "Z11K2": "nie zmieniaj" }, { "Z1K1": "Z11", "Z11K1": "Z1014", "Z11K2": "Echo" }, { "Z1K1": "Z11", "Z11K1": "Z1003", "Z11K2": "Escribir" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "mata ut" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "প্রতিফলন" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "écho" }, { "Z1K1": "Z11", "Z11K1": "Z1005", "Z11K2": "Эхо" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "प्रतिध्वनि" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "オウム返し" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "evaluate object", "Object identity", "object from argument", "return Object", "identity", "Print", "I combinator" ] }, { "Z1K1": "Z31", "Z31K1": "Z1025", "Z31K2": [ "Z6", "identyczność", "echo", "zwróć obiekt bez zmian", "tożsamość" ] }, { "Z1K1": "Z31", "Z31K1": "Z1003", "Z31K2": [ "Z6", "Mensaje", "Eco", "Imprimir" ] }, { "Z1K1": "Z31", "Z31K1": "Z1592", "Z31K2": [ "Z6", "skriv ut", "echo", "print" ] }, { "Z1K1": "Z31", "Z31K1": "Z1011", "Z31K2": [ "Z6", "ছায়া ", "প্রতিধ্বনি", "অনুকৃতি", "অনুকরণ", "পুনরাবৃত্তি" ] }, { "Z1K1": "Z31", "Z31K1": "Z1830", "Z31K2": [ "Z6", "エコー", "そのまま返す", "こだま出力" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "returns the argument unchanged" }, { "Z1K1": "Z11", "Z11K1": "Z1025", "Z11K2": "zwraca obiekt podany jako parametr bez zmian" }, { "Z1K1": "Z11", "Z11K1": "Z1014", "Z11K2": "weghachiri arụmụka ahụ agbanweghị" }, { "Z1K1": "Z11", "Z11K1": "Z1003", "Z11K2": "regresa un argumento sin cambios" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "skicka vidare argumentet utan färändring" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "আর্গুমেন্টকে ঠিক যেমন কি তেমনই ফিরিয়ে দেবে" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "renvoie la valeur passée en argument inchangée" }, { "Z1K1": "Z11", "Z11K1": "Z1005", "Z11K2": "возвращает аргумент без изменений" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "बिना बदले तर्क लौटाता है" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "引数をそのまま返す。" } ] } } 40fhux7ouswvni8gk4f8r73uf79ipsc Wikifunctions:Project chat 4 1184 334557 333404 2026-10-30T03:08:08Z SpBot 978 archive 1 section: 1 to [[Wikifunctions:Project chat/Archive/2026/09]] (after section [[Wikifunctions:Project chat/Archive/2026/09#i_can_create_my_own_function?|i_can_create_my_own_function?]]) - previous edit: [[:User:MediaWiki message delivery|MediaWiki message delivery]], 2026-10-26 14:28 334557 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ([https://abstract.wikipedia.org/view/sv/Q55767 link]) ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) :::That's a fallback when there is no version of the thing in the specific language. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:33, 22 October 2026 (UTC) ::::Yes, I know that too, but that does not answer my question either. ::::'''How do I translate those?''' /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:35, 22 October 2026 (UTC) :::Use your cursor to find which Function produced that sentence (in this case there's only one so it's pretty obvious). Go to the Function's talk page and hopefully it will have {{t|show function tree}} so that you can jump to the Config from there. The branches corresponding to Configs are the ones with language lists as children. If the template wasn't there you would have to navigate through one or more Implementations.<br>Once you've found the Config, open one of the existing Functions to use as reference, and create a new Function with the same input/output types. Then add it to the Config right away. To save time in writing an Implementation you might be able to copy from another language. Either way you should create a few Tests, which you can copy from AW articles, the top-level Function, or other languages' Functions. There's a longer walkthrough at [[WF:Working with Configuration of functions for given languages]].<br>Notice this process doesn't involve ''translating from English'' (unless you copied from its Function). Content for AW is generated by Functions specific to a language or languages, starting from QIDs. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:14, 22 October 2026 (UTC) ::::Good answer. Another way to find the config quickly is to click the 🔧 link at the end of the sentence like "Astrid Lindgren (is a) författare (from) Sverige.🔧" --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 22:52, 22 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #270: Wikiabstrak app == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce the latest app created by a Wikimedia volunteer about Abstract Wikipedia, and we take a look at the latest functions created by the community. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 14:28, 26 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> 2xl9mlelnfehb2m16ndyu39m8cdgw13 Wikifunctions:How to create implementations/de 4 9282 334457 334148 2026-10-29T19:36:21Z Ameisenigel 44 Created page with "Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben:" 334457 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <span id="Calling_another_Wikifunctions_function"></span> === Aufruf einer anderen Wikifunctions-Funktion === Eine Code-Implementierung kann bestimmte andere Wikifunctions-Funktionen aufrufen, die Ausgabe des Aufrufs empfangen und diese Ausgabe für die weitere Verarbeitung nutzen. Wir bezeichnen solche Aufrufe als Callbacks. Derzeit können aus Sicherheits- und Leistungsgründen nur die folgenden integrierten Wikidata-Abruf- und Suchfunktionen auf diese Weise aufgerufen werden: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}} und {{Z|Z6831}}. Diese Funktionalität befindet sich in einem frühen Stadium der Einführung; wir hoffen, in Zukunft Aufrufe für eine größere Bandbreite an Funktionen zu ermöglichen. Betrachten wir eine JavaScript-Implementierung, die einen Callback enthält. Diese Implementierung ruft ein Datenobjekt von Wikidata ab, extrahiert die Bezeichnung dieses Datenobjektes in einer bestimmten Sprache und gibt die Bezeichnung als Zeichenkette zurück. Das abzurufende Datenobjekt wird über das Argument <code>Z400K1</code> angegeben, die Sprache über <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Ein Callback wird durch den Aufruf von <code>Wikifunctions.Call</code> ausgelöst, wie im Beispiel gezeigt. Das erste Argument für <code>Wikifunctions.Call</code> ist stets die ZID der aufzurufenden Funktion – in diesem Fall {{Z|Z6821}}, welche ein einzelnes Argument entgegennimmt. Darauf folgen, durch Kommas getrennt, die an diese Funktion zu übergebenden Argumente. Hierbei handelt es sich bei dem Argument <code>Z400K1</code> um denselben Wert, der auch an <code>Z400</code> übergeben wurde. Dies ist ein gängiges Muster für die Argumentübergabe an Callbacks, jedoch können die Argumente auch mit dem Konstruktor <code>ZObject</code> (wie oben beschrieben) erstellt oder auf andere Weise bezogen werden. Der Wert von <code>Z400K1</code> wäre eine Instanz von {{Z|Z6091}}, die die QID des abzurufenden Datenobjekts enthält. Zeile 2 des Beispiels ruft <code>Z6821</code> auf, um dieses Datenobjekt von Wikidata abzurufen, und weist das resultierende ZObjekt der Konstante <code>item</code> zu. Der restliche Code durchläuft die Bezeichnungen des Datenobjekts, bis er diejenige findet, die der durch <code>Z400K2</code> angegebenen Sprache entspricht. Für das obige Beispiel haben wir der Einfachheit halber <code>Z6821</code> verwendet. Sofern die Implementierung jedoch nicht das gesamte Objekt benötigt, wird dringend empfohlen, zum Abrufen von Wikidata-Datenobjekten, die sehr groß sein können, <code>Z6820</code> zu verwenden. Obwohl der Aufruf von <code>Z6820</code> etwas komplexer ist, ermöglichen seine Parameter das Abrufen spezifischer Teile eines Wikidata-Datenobjekts. Dies kann die Leistung erheblich steigern und bestimmte Fehler vermeiden, da weniger Netzwerkbandbreite und Verarbeitungszeit erforderlich sind. (<code>Z6820</code> kann auch statt <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code> und <code>Z6826</code> verwendet werden, um ähnliche Vorteile bei der Bandweitenreduzierung zu erreichen.) Im Folgenden zeigen wir, wie <code>Z6820</code> in <code>Wikifunctions.Call</code> verwendet werden kann, um dasselbe Verhalten wie oben zu erzielen. Beachte, dass wir das zweite an <code>Z6820</code> übergebene Argument, <code>[labelsPart]</code>, nutzen, um festzulegen: “Gib nur die Bezeichnungen des Datenobjekts zurück”, und das dritte Argument, <code>[Z400K2]</code>, verwenden, um festzulegen: “Gib die Bezeichnungen nur in der angegebenen Sprache zurück”. (Dieses Argument würde auch für Aliasse und Beschreibungen gelten, sofern diese im Ergebnis enthalten wären.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Weitere zu beachtende Hinweise: * Obwohl Code-Implementierungen mittlerweile in der Lage sind, Wikidata-Entitäten abzurufen, wird empfohlen, dass sie keine ''vollständigen'' Entitäten zurückgeben. Dies liegt an den derzeitigen Beschränkungen hinsichtlich der Größe des von einer Code-Implementierung zurückgegebenen Wertes. Um eine vollständige, große Entität abzurufen und zurückzugeben, ist es besser, die Abruffunktion aus einer Komposition heraus aufzurufen. * Es kann nur ein Callback gleichzeitig ausgeführt werden. Aus Sicherheitsgründen ist es nicht möglich, die Nebenläufigkeitsfunktionen von JavaScript oder Python zu nutzen, um mehrere Callbacks parallel auszuführen. ** Beachte jedoch, dass du mithilfe von Z6820 mehrere Entitäten auf einmal abrufen kannst. * Derzeit gibt es eine Obergrenze von 3 MiB für die Größe von Wikidata-Inhalten, die über einen einzelnen Callback an eine Code-Implementierung zurückgegeben werden können. Dieselbe Obergrenze gilt für die Größe des Ergebnisses, das von einer Code-Implementierung zurückgegeben wird. <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * '''Fehlermeldung''' – Fehlertypen können ein mehrsprachiges Array von Fehlermeldungen enthalten, die mit HTML-Parametern versehen sind. Die Parameter werden als $1, $2 etc. angegeben, wobei die Ziffer dem Schlüssel des Fehlertyps entspricht. Beim Erstellen eines Fehlertyps mit dem Zeichenketten-Schlüssel "aktuelle Eingabe", kann die Fehlermeldung beispielsweise den Platzhalter "$1" verwenden, der zum Zeitpunkt der Fehlerausgabe durch den Wert des Schlüssels "aktuelle Eingabe" ersetzt wird. Um HTML-Meldungen hinzuzufügen, klicke unter "HTML-Fragmente" auf das Symbol "[+]", wähle eine Sprache aus und gib die HTML-Zeichenkette ein. <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <span id="Creating_actionable_error_messages"></span> === Erstellung handlungsorientierter Fehlermeldungen === Wie oben beschrieben, verfügen Fehlertypen über einen optionalen Schlüssel <code>Z50K3</code>, der eine mehrsprachige Liste von HTML-Zeichenketten enthält. Bei der Darstellung von Informationen zu einem Fehler können die im Fehlertyp hinterlegten Meldungen dazu beitragen, eine klare, präzise, ​​informative, übersetzbare und handlungsorientierte Fehlermeldung zu erstellen. Zu diesem Zweck können Fehlermeldungen Parameter wie <code>$1</code>, <code>$2</code> etc. enthalten, wobei die Ziffer dem Argument des Fehlertyps und dessen Wert in der Fehlerinstanz entspricht. Diese Fehlermeldungen werden in Wikifunctions nach der Ausführung eines Funktionsaufrufs im Dialogfenster "Details" angezeigt. Darüber hinaus werden diese Fehlermeldungen auch in anderen Client-Schnittstellen, wie der Abstrakten Wikipedia, ausgegeben, um den Autoren von Abstrakten Inhalten eine bessere Orientierung zu bieten. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|Die Fehlermeldung wird unter Verwendung der HTML-Meldung des Fehlertyps und der Werte der Fehlerargumente generiert.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|Sofern verfügbar, wird die HTML-Fehlermeldung im Vorschau-Bereich der Abstrakten Wikipedia angezeigt.]] Lass uns anhand eines konkreten Beispiels die Vorteile von HTML-Fehlermeldungen nachvollziehen: Die Funktion {{Z|Z37847}} gibt die erste Lexem-Referenz zurück, basierend auf einer Wikidata-Datenobjekt-Referenz und einer Sprache. Falls für diese Kombination aus Datenobjekt und Sprache kein Lexem existiert, löst sie einen Fehler vom Typ {{Z|Z28248}} aus, der drei Schlüssel hat: * '''Z28248K1''' ist die QID des angegebenen Wikidata-Datenobjekts * '''Z28248K2''' ist die verbindende Eigenschaft, in diesem Fall <code>P5137/Objekt für diesen Sinn</code> * '''Z28248K3''' ist der Sprachcode Wenn diese Funktion für ein Wikidata-Lexem aufgerufen wird, das nicht existiert, löst der Aufruf eine Fehlerinstanz wie die folgende aus: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] 13mc6arbox0hhyim4j0tgrd91708cua 334459 334457 2026-10-29T19:37:17Z Ameisenigel 44 Created page with "welches Datenobjekt fehlschlägt," 334459 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <span id="Calling_another_Wikifunctions_function"></span> === Aufruf einer anderen Wikifunctions-Funktion === Eine Code-Implementierung kann bestimmte andere Wikifunctions-Funktionen aufrufen, die Ausgabe des Aufrufs empfangen und diese Ausgabe für die weitere Verarbeitung nutzen. Wir bezeichnen solche Aufrufe als Callbacks. Derzeit können aus Sicherheits- und Leistungsgründen nur die folgenden integrierten Wikidata-Abruf- und Suchfunktionen auf diese Weise aufgerufen werden: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}} und {{Z|Z6831}}. Diese Funktionalität befindet sich in einem frühen Stadium der Einführung; wir hoffen, in Zukunft Aufrufe für eine größere Bandbreite an Funktionen zu ermöglichen. Betrachten wir eine JavaScript-Implementierung, die einen Callback enthält. Diese Implementierung ruft ein Datenobjekt von Wikidata ab, extrahiert die Bezeichnung dieses Datenobjektes in einer bestimmten Sprache und gibt die Bezeichnung als Zeichenkette zurück. Das abzurufende Datenobjekt wird über das Argument <code>Z400K1</code> angegeben, die Sprache über <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Ein Callback wird durch den Aufruf von <code>Wikifunctions.Call</code> ausgelöst, wie im Beispiel gezeigt. Das erste Argument für <code>Wikifunctions.Call</code> ist stets die ZID der aufzurufenden Funktion – in diesem Fall {{Z|Z6821}}, welche ein einzelnes Argument entgegennimmt. Darauf folgen, durch Kommas getrennt, die an diese Funktion zu übergebenden Argumente. Hierbei handelt es sich bei dem Argument <code>Z400K1</code> um denselben Wert, der auch an <code>Z400</code> übergeben wurde. Dies ist ein gängiges Muster für die Argumentübergabe an Callbacks, jedoch können die Argumente auch mit dem Konstruktor <code>ZObject</code> (wie oben beschrieben) erstellt oder auf andere Weise bezogen werden. Der Wert von <code>Z400K1</code> wäre eine Instanz von {{Z|Z6091}}, die die QID des abzurufenden Datenobjekts enthält. Zeile 2 des Beispiels ruft <code>Z6821</code> auf, um dieses Datenobjekt von Wikidata abzurufen, und weist das resultierende ZObjekt der Konstante <code>item</code> zu. Der restliche Code durchläuft die Bezeichnungen des Datenobjekts, bis er diejenige findet, die der durch <code>Z400K2</code> angegebenen Sprache entspricht. Für das obige Beispiel haben wir der Einfachheit halber <code>Z6821</code> verwendet. Sofern die Implementierung jedoch nicht das gesamte Objekt benötigt, wird dringend empfohlen, zum Abrufen von Wikidata-Datenobjekten, die sehr groß sein können, <code>Z6820</code> zu verwenden. Obwohl der Aufruf von <code>Z6820</code> etwas komplexer ist, ermöglichen seine Parameter das Abrufen spezifischer Teile eines Wikidata-Datenobjekts. Dies kann die Leistung erheblich steigern und bestimmte Fehler vermeiden, da weniger Netzwerkbandbreite und Verarbeitungszeit erforderlich sind. (<code>Z6820</code> kann auch statt <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code> und <code>Z6826</code> verwendet werden, um ähnliche Vorteile bei der Bandweitenreduzierung zu erreichen.) Im Folgenden zeigen wir, wie <code>Z6820</code> in <code>Wikifunctions.Call</code> verwendet werden kann, um dasselbe Verhalten wie oben zu erzielen. Beachte, dass wir das zweite an <code>Z6820</code> übergebene Argument, <code>[labelsPart]</code>, nutzen, um festzulegen: “Gib nur die Bezeichnungen des Datenobjekts zurück”, und das dritte Argument, <code>[Z400K2]</code>, verwenden, um festzulegen: “Gib die Bezeichnungen nur in der angegebenen Sprache zurück”. (Dieses Argument würde auch für Aliasse und Beschreibungen gelten, sofern diese im Ergebnis enthalten wären.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Weitere zu beachtende Hinweise: * Obwohl Code-Implementierungen mittlerweile in der Lage sind, Wikidata-Entitäten abzurufen, wird empfohlen, dass sie keine ''vollständigen'' Entitäten zurückgeben. Dies liegt an den derzeitigen Beschränkungen hinsichtlich der Größe des von einer Code-Implementierung zurückgegebenen Wertes. Um eine vollständige, große Entität abzurufen und zurückzugeben, ist es besser, die Abruffunktion aus einer Komposition heraus aufzurufen. * Es kann nur ein Callback gleichzeitig ausgeführt werden. Aus Sicherheitsgründen ist es nicht möglich, die Nebenläufigkeitsfunktionen von JavaScript oder Python zu nutzen, um mehrere Callbacks parallel auszuführen. ** Beachte jedoch, dass du mithilfe von Z6820 mehrere Entitäten auf einmal abrufen kannst. * Derzeit gibt es eine Obergrenze von 3 MiB für die Größe von Wikidata-Inhalten, die über einen einzelnen Callback an eine Code-Implementierung zurückgegeben werden können. Dieselbe Obergrenze gilt für die Größe des Ergebnisses, das von einer Code-Implementierung zurückgegeben wird. <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * '''Fehlermeldung''' – Fehlertypen können ein mehrsprachiges Array von Fehlermeldungen enthalten, die mit HTML-Parametern versehen sind. Die Parameter werden als $1, $2 etc. angegeben, wobei die Ziffer dem Schlüssel des Fehlertyps entspricht. Beim Erstellen eines Fehlertyps mit dem Zeichenketten-Schlüssel "aktuelle Eingabe", kann die Fehlermeldung beispielsweise den Platzhalter "$1" verwenden, der zum Zeitpunkt der Fehlerausgabe durch den Wert des Schlüssels "aktuelle Eingabe" ersetzt wird. Um HTML-Meldungen hinzuzufügen, klicke unter "HTML-Fragmente" auf das Symbol "[+]", wähle eine Sprache aus und gib die HTML-Zeichenkette ein. <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <span id="Creating_actionable_error_messages"></span> === Erstellung handlungsorientierter Fehlermeldungen === Wie oben beschrieben, verfügen Fehlertypen über einen optionalen Schlüssel <code>Z50K3</code>, der eine mehrsprachige Liste von HTML-Zeichenketten enthält. Bei der Darstellung von Informationen zu einem Fehler können die im Fehlertyp hinterlegten Meldungen dazu beitragen, eine klare, präzise, ​​informative, übersetzbare und handlungsorientierte Fehlermeldung zu erstellen. Zu diesem Zweck können Fehlermeldungen Parameter wie <code>$1</code>, <code>$2</code> etc. enthalten, wobei die Ziffer dem Argument des Fehlertyps und dessen Wert in der Fehlerinstanz entspricht. Diese Fehlermeldungen werden in Wikifunctions nach der Ausführung eines Funktionsaufrufs im Dialogfenster "Details" angezeigt. Darüber hinaus werden diese Fehlermeldungen auch in anderen Client-Schnittstellen, wie der Abstrakten Wikipedia, ausgegeben, um den Autoren von Abstrakten Inhalten eine bessere Orientierung zu bieten. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|Die Fehlermeldung wird unter Verwendung der HTML-Meldung des Fehlertyps und der Werte der Fehlerargumente generiert.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|Sofern verfügbar, wird die HTML-Fehlermeldung im Vorschau-Bereich der Abstrakten Wikipedia angezeigt.]] Lass uns anhand eines konkreten Beispiels die Vorteile von HTML-Fehlermeldungen nachvollziehen: Die Funktion {{Z|Z37847}} gibt die erste Lexem-Referenz zurück, basierend auf einer Wikidata-Datenobjekt-Referenz und einer Sprache. Falls für diese Kombination aus Datenobjekt und Sprache kein Lexem existiert, löst sie einen Fehler vom Typ {{Z|Z28248}} aus, der drei Schlüssel hat: * '''Z28248K1''' ist die QID des angegebenen Wikidata-Datenobjekts * '''Z28248K2''' ist die verbindende Eigenschaft, in diesem Fall <code>P5137/Objekt für diesen Sinn</code> * '''Z28248K3''' ist der Sprachcode Wenn diese Funktion für ein Wikidata-Lexem aufgerufen wird, das nicht existiert, löst der Aufruf eine Fehlerinstanz wie die folgende aus: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: * welches Datenobjekt fehlschlägt, * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] kdtrxx2s5937yzsfmwjm223zeloplik 334461 334459 2026-10-29T19:37:38Z Ameisenigel 44 Created page with "welche Sprache fehlt, und" 334461 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <span id="Calling_another_Wikifunctions_function"></span> === Aufruf einer anderen Wikifunctions-Funktion === Eine Code-Implementierung kann bestimmte andere Wikifunctions-Funktionen aufrufen, die Ausgabe des Aufrufs empfangen und diese Ausgabe für die weitere Verarbeitung nutzen. Wir bezeichnen solche Aufrufe als Callbacks. Derzeit können aus Sicherheits- und Leistungsgründen nur die folgenden integrierten Wikidata-Abruf- und Suchfunktionen auf diese Weise aufgerufen werden: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}} und {{Z|Z6831}}. Diese Funktionalität befindet sich in einem frühen Stadium der Einführung; wir hoffen, in Zukunft Aufrufe für eine größere Bandbreite an Funktionen zu ermöglichen. Betrachten wir eine JavaScript-Implementierung, die einen Callback enthält. Diese Implementierung ruft ein Datenobjekt von Wikidata ab, extrahiert die Bezeichnung dieses Datenobjektes in einer bestimmten Sprache und gibt die Bezeichnung als Zeichenkette zurück. Das abzurufende Datenobjekt wird über das Argument <code>Z400K1</code> angegeben, die Sprache über <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Ein Callback wird durch den Aufruf von <code>Wikifunctions.Call</code> ausgelöst, wie im Beispiel gezeigt. Das erste Argument für <code>Wikifunctions.Call</code> ist stets die ZID der aufzurufenden Funktion – in diesem Fall {{Z|Z6821}}, welche ein einzelnes Argument entgegennimmt. Darauf folgen, durch Kommas getrennt, die an diese Funktion zu übergebenden Argumente. Hierbei handelt es sich bei dem Argument <code>Z400K1</code> um denselben Wert, der auch an <code>Z400</code> übergeben wurde. Dies ist ein gängiges Muster für die Argumentübergabe an Callbacks, jedoch können die Argumente auch mit dem Konstruktor <code>ZObject</code> (wie oben beschrieben) erstellt oder auf andere Weise bezogen werden. Der Wert von <code>Z400K1</code> wäre eine Instanz von {{Z|Z6091}}, die die QID des abzurufenden Datenobjekts enthält. Zeile 2 des Beispiels ruft <code>Z6821</code> auf, um dieses Datenobjekt von Wikidata abzurufen, und weist das resultierende ZObjekt der Konstante <code>item</code> zu. Der restliche Code durchläuft die Bezeichnungen des Datenobjekts, bis er diejenige findet, die der durch <code>Z400K2</code> angegebenen Sprache entspricht. Für das obige Beispiel haben wir der Einfachheit halber <code>Z6821</code> verwendet. Sofern die Implementierung jedoch nicht das gesamte Objekt benötigt, wird dringend empfohlen, zum Abrufen von Wikidata-Datenobjekten, die sehr groß sein können, <code>Z6820</code> zu verwenden. Obwohl der Aufruf von <code>Z6820</code> etwas komplexer ist, ermöglichen seine Parameter das Abrufen spezifischer Teile eines Wikidata-Datenobjekts. Dies kann die Leistung erheblich steigern und bestimmte Fehler vermeiden, da weniger Netzwerkbandbreite und Verarbeitungszeit erforderlich sind. (<code>Z6820</code> kann auch statt <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code> und <code>Z6826</code> verwendet werden, um ähnliche Vorteile bei der Bandweitenreduzierung zu erreichen.) Im Folgenden zeigen wir, wie <code>Z6820</code> in <code>Wikifunctions.Call</code> verwendet werden kann, um dasselbe Verhalten wie oben zu erzielen. Beachte, dass wir das zweite an <code>Z6820</code> übergebene Argument, <code>[labelsPart]</code>, nutzen, um festzulegen: “Gib nur die Bezeichnungen des Datenobjekts zurück”, und das dritte Argument, <code>[Z400K2]</code>, verwenden, um festzulegen: “Gib die Bezeichnungen nur in der angegebenen Sprache zurück”. (Dieses Argument würde auch für Aliasse und Beschreibungen gelten, sofern diese im Ergebnis enthalten wären.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Weitere zu beachtende Hinweise: * Obwohl Code-Implementierungen mittlerweile in der Lage sind, Wikidata-Entitäten abzurufen, wird empfohlen, dass sie keine ''vollständigen'' Entitäten zurückgeben. Dies liegt an den derzeitigen Beschränkungen hinsichtlich der Größe des von einer Code-Implementierung zurückgegebenen Wertes. Um eine vollständige, große Entität abzurufen und zurückzugeben, ist es besser, die Abruffunktion aus einer Komposition heraus aufzurufen. * Es kann nur ein Callback gleichzeitig ausgeführt werden. Aus Sicherheitsgründen ist es nicht möglich, die Nebenläufigkeitsfunktionen von JavaScript oder Python zu nutzen, um mehrere Callbacks parallel auszuführen. ** Beachte jedoch, dass du mithilfe von Z6820 mehrere Entitäten auf einmal abrufen kannst. * Derzeit gibt es eine Obergrenze von 3 MiB für die Größe von Wikidata-Inhalten, die über einen einzelnen Callback an eine Code-Implementierung zurückgegeben werden können. Dieselbe Obergrenze gilt für die Größe des Ergebnisses, das von einer Code-Implementierung zurückgegeben wird. <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * '''Fehlermeldung''' – Fehlertypen können ein mehrsprachiges Array von Fehlermeldungen enthalten, die mit HTML-Parametern versehen sind. Die Parameter werden als $1, $2 etc. angegeben, wobei die Ziffer dem Schlüssel des Fehlertyps entspricht. Beim Erstellen eines Fehlertyps mit dem Zeichenketten-Schlüssel "aktuelle Eingabe", kann die Fehlermeldung beispielsweise den Platzhalter "$1" verwenden, der zum Zeitpunkt der Fehlerausgabe durch den Wert des Schlüssels "aktuelle Eingabe" ersetzt wird. Um HTML-Meldungen hinzuzufügen, klicke unter "HTML-Fragmente" auf das Symbol "[+]", wähle eine Sprache aus und gib die HTML-Zeichenkette ein. <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <span id="Creating_actionable_error_messages"></span> === Erstellung handlungsorientierter Fehlermeldungen === Wie oben beschrieben, verfügen Fehlertypen über einen optionalen Schlüssel <code>Z50K3</code>, der eine mehrsprachige Liste von HTML-Zeichenketten enthält. Bei der Darstellung von Informationen zu einem Fehler können die im Fehlertyp hinterlegten Meldungen dazu beitragen, eine klare, präzise, ​​informative, übersetzbare und handlungsorientierte Fehlermeldung zu erstellen. Zu diesem Zweck können Fehlermeldungen Parameter wie <code>$1</code>, <code>$2</code> etc. enthalten, wobei die Ziffer dem Argument des Fehlertyps und dessen Wert in der Fehlerinstanz entspricht. Diese Fehlermeldungen werden in Wikifunctions nach der Ausführung eines Funktionsaufrufs im Dialogfenster "Details" angezeigt. Darüber hinaus werden diese Fehlermeldungen auch in anderen Client-Schnittstellen, wie der Abstrakten Wikipedia, ausgegeben, um den Autoren von Abstrakten Inhalten eine bessere Orientierung zu bieten. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|Die Fehlermeldung wird unter Verwendung der HTML-Meldung des Fehlertyps und der Werte der Fehlerargumente generiert.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|Sofern verfügbar, wird die HTML-Fehlermeldung im Vorschau-Bereich der Abstrakten Wikipedia angezeigt.]] Lass uns anhand eines konkreten Beispiels die Vorteile von HTML-Fehlermeldungen nachvollziehen: Die Funktion {{Z|Z37847}} gibt die erste Lexem-Referenz zurück, basierend auf einer Wikidata-Datenobjekt-Referenz und einer Sprache. Falls für diese Kombination aus Datenobjekt und Sprache kein Lexem existiert, löst sie einen Fehler vom Typ {{Z|Z28248}} aus, der drei Schlüssel hat: * '''Z28248K1''' ist die QID des angegebenen Wikidata-Datenobjekts * '''Z28248K2''' ist die verbindende Eigenschaft, in diesem Fall <code>P5137/Objekt für diesen Sinn</code> * '''Z28248K3''' ist der Sprachcode Wenn diese Funktion für ein Wikidata-Lexem aufgerufen wird, das nicht existiert, löst der Aufruf eine Fehlerinstanz wie die folgende aus: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: * welches Datenobjekt fehlschlägt, * welche Sprache fehlt, und * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] jusqjnmrkq7b676yz8u82h3vnjdxfrv 334463 334461 2026-10-29T19:38:08Z Ameisenigel 44 Created page with "welche Möglichkeiten zur Fehlerbehebung es gibt." 334463 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <span id="Calling_another_Wikifunctions_function"></span> === Aufruf einer anderen Wikifunctions-Funktion === Eine Code-Implementierung kann bestimmte andere Wikifunctions-Funktionen aufrufen, die Ausgabe des Aufrufs empfangen und diese Ausgabe für die weitere Verarbeitung nutzen. Wir bezeichnen solche Aufrufe als Callbacks. Derzeit können aus Sicherheits- und Leistungsgründen nur die folgenden integrierten Wikidata-Abruf- und Suchfunktionen auf diese Weise aufgerufen werden: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}} und {{Z|Z6831}}. Diese Funktionalität befindet sich in einem frühen Stadium der Einführung; wir hoffen, in Zukunft Aufrufe für eine größere Bandbreite an Funktionen zu ermöglichen. Betrachten wir eine JavaScript-Implementierung, die einen Callback enthält. Diese Implementierung ruft ein Datenobjekt von Wikidata ab, extrahiert die Bezeichnung dieses Datenobjektes in einer bestimmten Sprache und gibt die Bezeichnung als Zeichenkette zurück. Das abzurufende Datenobjekt wird über das Argument <code>Z400K1</code> angegeben, die Sprache über <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Ein Callback wird durch den Aufruf von <code>Wikifunctions.Call</code> ausgelöst, wie im Beispiel gezeigt. Das erste Argument für <code>Wikifunctions.Call</code> ist stets die ZID der aufzurufenden Funktion – in diesem Fall {{Z|Z6821}}, welche ein einzelnes Argument entgegennimmt. Darauf folgen, durch Kommas getrennt, die an diese Funktion zu übergebenden Argumente. Hierbei handelt es sich bei dem Argument <code>Z400K1</code> um denselben Wert, der auch an <code>Z400</code> übergeben wurde. Dies ist ein gängiges Muster für die Argumentübergabe an Callbacks, jedoch können die Argumente auch mit dem Konstruktor <code>ZObject</code> (wie oben beschrieben) erstellt oder auf andere Weise bezogen werden. Der Wert von <code>Z400K1</code> wäre eine Instanz von {{Z|Z6091}}, die die QID des abzurufenden Datenobjekts enthält. Zeile 2 des Beispiels ruft <code>Z6821</code> auf, um dieses Datenobjekt von Wikidata abzurufen, und weist das resultierende ZObjekt der Konstante <code>item</code> zu. Der restliche Code durchläuft die Bezeichnungen des Datenobjekts, bis er diejenige findet, die der durch <code>Z400K2</code> angegebenen Sprache entspricht. Für das obige Beispiel haben wir der Einfachheit halber <code>Z6821</code> verwendet. Sofern die Implementierung jedoch nicht das gesamte Objekt benötigt, wird dringend empfohlen, zum Abrufen von Wikidata-Datenobjekten, die sehr groß sein können, <code>Z6820</code> zu verwenden. Obwohl der Aufruf von <code>Z6820</code> etwas komplexer ist, ermöglichen seine Parameter das Abrufen spezifischer Teile eines Wikidata-Datenobjekts. Dies kann die Leistung erheblich steigern und bestimmte Fehler vermeiden, da weniger Netzwerkbandbreite und Verarbeitungszeit erforderlich sind. (<code>Z6820</code> kann auch statt <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code> und <code>Z6826</code> verwendet werden, um ähnliche Vorteile bei der Bandweitenreduzierung zu erreichen.) Im Folgenden zeigen wir, wie <code>Z6820</code> in <code>Wikifunctions.Call</code> verwendet werden kann, um dasselbe Verhalten wie oben zu erzielen. Beachte, dass wir das zweite an <code>Z6820</code> übergebene Argument, <code>[labelsPart]</code>, nutzen, um festzulegen: “Gib nur die Bezeichnungen des Datenobjekts zurück”, und das dritte Argument, <code>[Z400K2]</code>, verwenden, um festzulegen: “Gib die Bezeichnungen nur in der angegebenen Sprache zurück”. (Dieses Argument würde auch für Aliasse und Beschreibungen gelten, sofern diese im Ergebnis enthalten wären.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Weitere zu beachtende Hinweise: * Obwohl Code-Implementierungen mittlerweile in der Lage sind, Wikidata-Entitäten abzurufen, wird empfohlen, dass sie keine ''vollständigen'' Entitäten zurückgeben. Dies liegt an den derzeitigen Beschränkungen hinsichtlich der Größe des von einer Code-Implementierung zurückgegebenen Wertes. Um eine vollständige, große Entität abzurufen und zurückzugeben, ist es besser, die Abruffunktion aus einer Komposition heraus aufzurufen. * Es kann nur ein Callback gleichzeitig ausgeführt werden. Aus Sicherheitsgründen ist es nicht möglich, die Nebenläufigkeitsfunktionen von JavaScript oder Python zu nutzen, um mehrere Callbacks parallel auszuführen. ** Beachte jedoch, dass du mithilfe von Z6820 mehrere Entitäten auf einmal abrufen kannst. * Derzeit gibt es eine Obergrenze von 3 MiB für die Größe von Wikidata-Inhalten, die über einen einzelnen Callback an eine Code-Implementierung zurückgegeben werden können. Dieselbe Obergrenze gilt für die Größe des Ergebnisses, das von einer Code-Implementierung zurückgegeben wird. <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * '''Fehlermeldung''' – Fehlertypen können ein mehrsprachiges Array von Fehlermeldungen enthalten, die mit HTML-Parametern versehen sind. Die Parameter werden als $1, $2 etc. angegeben, wobei die Ziffer dem Schlüssel des Fehlertyps entspricht. Beim Erstellen eines Fehlertyps mit dem Zeichenketten-Schlüssel "aktuelle Eingabe", kann die Fehlermeldung beispielsweise den Platzhalter "$1" verwenden, der zum Zeitpunkt der Fehlerausgabe durch den Wert des Schlüssels "aktuelle Eingabe" ersetzt wird. Um HTML-Meldungen hinzuzufügen, klicke unter "HTML-Fragmente" auf das Symbol "[+]", wähle eine Sprache aus und gib die HTML-Zeichenkette ein. <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <span id="Creating_actionable_error_messages"></span> === Erstellung handlungsorientierter Fehlermeldungen === Wie oben beschrieben, verfügen Fehlertypen über einen optionalen Schlüssel <code>Z50K3</code>, der eine mehrsprachige Liste von HTML-Zeichenketten enthält. Bei der Darstellung von Informationen zu einem Fehler können die im Fehlertyp hinterlegten Meldungen dazu beitragen, eine klare, präzise, ​​informative, übersetzbare und handlungsorientierte Fehlermeldung zu erstellen. Zu diesem Zweck können Fehlermeldungen Parameter wie <code>$1</code>, <code>$2</code> etc. enthalten, wobei die Ziffer dem Argument des Fehlertyps und dessen Wert in der Fehlerinstanz entspricht. Diese Fehlermeldungen werden in Wikifunctions nach der Ausführung eines Funktionsaufrufs im Dialogfenster "Details" angezeigt. Darüber hinaus werden diese Fehlermeldungen auch in anderen Client-Schnittstellen, wie der Abstrakten Wikipedia, ausgegeben, um den Autoren von Abstrakten Inhalten eine bessere Orientierung zu bieten. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|Die Fehlermeldung wird unter Verwendung der HTML-Meldung des Fehlertyps und der Werte der Fehlerargumente generiert.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|Sofern verfügbar, wird die HTML-Fehlermeldung im Vorschau-Bereich der Abstrakten Wikipedia angezeigt.]] Lass uns anhand eines konkreten Beispiels die Vorteile von HTML-Fehlermeldungen nachvollziehen: Die Funktion {{Z|Z37847}} gibt die erste Lexem-Referenz zurück, basierend auf einer Wikidata-Datenobjekt-Referenz und einer Sprache. Falls für diese Kombination aus Datenobjekt und Sprache kein Lexem existiert, löst sie einen Fehler vom Typ {{Z|Z28248}} aus, der drei Schlüssel hat: * '''Z28248K1''' ist die QID des angegebenen Wikidata-Datenobjekts * '''Z28248K2''' ist die verbindende Eigenschaft, in diesem Fall <code>P5137/Objekt für diesen Sinn</code> * '''Z28248K3''' ist der Sprachcode Wenn diese Funktion für ein Wikidata-Lexem aufgerufen wird, das nicht existiert, löst der Aufruf eine Fehlerinstanz wie die folgende aus: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: * welches Datenobjekt fehlschlägt, * welche Sprache fehlt, und * welche Möglichkeiten zur Fehlerbehebung es gibt. <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] 2plxnjdnbnskudcz3235bmobw5caoah 334465 334463 2026-10-29T19:39:40Z Ameisenigel 44 Created page with "Das Feld der Fehlermeldung $1 kann diese Funktionalität bereitstellen. Sobald für einen Fehlertyp eine Fehlermeldung in der Sprache des Benutzers (oder einer seiner Rückfallwerte) vorliegt, wird die angezeigte Fehlermeldung wie folgt ausgegeben:" 334465 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <span id="Calling_another_Wikifunctions_function"></span> === Aufruf einer anderen Wikifunctions-Funktion === Eine Code-Implementierung kann bestimmte andere Wikifunctions-Funktionen aufrufen, die Ausgabe des Aufrufs empfangen und diese Ausgabe für die weitere Verarbeitung nutzen. Wir bezeichnen solche Aufrufe als Callbacks. Derzeit können aus Sicherheits- und Leistungsgründen nur die folgenden integrierten Wikidata-Abruf- und Suchfunktionen auf diese Weise aufgerufen werden: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}} und {{Z|Z6831}}. Diese Funktionalität befindet sich in einem frühen Stadium der Einführung; wir hoffen, in Zukunft Aufrufe für eine größere Bandbreite an Funktionen zu ermöglichen. Betrachten wir eine JavaScript-Implementierung, die einen Callback enthält. Diese Implementierung ruft ein Datenobjekt von Wikidata ab, extrahiert die Bezeichnung dieses Datenobjektes in einer bestimmten Sprache und gibt die Bezeichnung als Zeichenkette zurück. Das abzurufende Datenobjekt wird über das Argument <code>Z400K1</code> angegeben, die Sprache über <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Ein Callback wird durch den Aufruf von <code>Wikifunctions.Call</code> ausgelöst, wie im Beispiel gezeigt. Das erste Argument für <code>Wikifunctions.Call</code> ist stets die ZID der aufzurufenden Funktion – in diesem Fall {{Z|Z6821}}, welche ein einzelnes Argument entgegennimmt. Darauf folgen, durch Kommas getrennt, die an diese Funktion zu übergebenden Argumente. Hierbei handelt es sich bei dem Argument <code>Z400K1</code> um denselben Wert, der auch an <code>Z400</code> übergeben wurde. Dies ist ein gängiges Muster für die Argumentübergabe an Callbacks, jedoch können die Argumente auch mit dem Konstruktor <code>ZObject</code> (wie oben beschrieben) erstellt oder auf andere Weise bezogen werden. Der Wert von <code>Z400K1</code> wäre eine Instanz von {{Z|Z6091}}, die die QID des abzurufenden Datenobjekts enthält. Zeile 2 des Beispiels ruft <code>Z6821</code> auf, um dieses Datenobjekt von Wikidata abzurufen, und weist das resultierende ZObjekt der Konstante <code>item</code> zu. Der restliche Code durchläuft die Bezeichnungen des Datenobjekts, bis er diejenige findet, die der durch <code>Z400K2</code> angegebenen Sprache entspricht. Für das obige Beispiel haben wir der Einfachheit halber <code>Z6821</code> verwendet. Sofern die Implementierung jedoch nicht das gesamte Objekt benötigt, wird dringend empfohlen, zum Abrufen von Wikidata-Datenobjekten, die sehr groß sein können, <code>Z6820</code> zu verwenden. Obwohl der Aufruf von <code>Z6820</code> etwas komplexer ist, ermöglichen seine Parameter das Abrufen spezifischer Teile eines Wikidata-Datenobjekts. Dies kann die Leistung erheblich steigern und bestimmte Fehler vermeiden, da weniger Netzwerkbandbreite und Verarbeitungszeit erforderlich sind. (<code>Z6820</code> kann auch statt <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code> und <code>Z6826</code> verwendet werden, um ähnliche Vorteile bei der Bandweitenreduzierung zu erreichen.) Im Folgenden zeigen wir, wie <code>Z6820</code> in <code>Wikifunctions.Call</code> verwendet werden kann, um dasselbe Verhalten wie oben zu erzielen. Beachte, dass wir das zweite an <code>Z6820</code> übergebene Argument, <code>[labelsPart]</code>, nutzen, um festzulegen: “Gib nur die Bezeichnungen des Datenobjekts zurück”, und das dritte Argument, <code>[Z400K2]</code>, verwenden, um festzulegen: “Gib die Bezeichnungen nur in der angegebenen Sprache zurück”. (Dieses Argument würde auch für Aliasse und Beschreibungen gelten, sofern diese im Ergebnis enthalten wären.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Weitere zu beachtende Hinweise: * Obwohl Code-Implementierungen mittlerweile in der Lage sind, Wikidata-Entitäten abzurufen, wird empfohlen, dass sie keine ''vollständigen'' Entitäten zurückgeben. Dies liegt an den derzeitigen Beschränkungen hinsichtlich der Größe des von einer Code-Implementierung zurückgegebenen Wertes. Um eine vollständige, große Entität abzurufen und zurückzugeben, ist es besser, die Abruffunktion aus einer Komposition heraus aufzurufen. * Es kann nur ein Callback gleichzeitig ausgeführt werden. Aus Sicherheitsgründen ist es nicht möglich, die Nebenläufigkeitsfunktionen von JavaScript oder Python zu nutzen, um mehrere Callbacks parallel auszuführen. ** Beachte jedoch, dass du mithilfe von Z6820 mehrere Entitäten auf einmal abrufen kannst. * Derzeit gibt es eine Obergrenze von 3 MiB für die Größe von Wikidata-Inhalten, die über einen einzelnen Callback an eine Code-Implementierung zurückgegeben werden können. Dieselbe Obergrenze gilt für die Größe des Ergebnisses, das von einer Code-Implementierung zurückgegeben wird. <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * '''Fehlermeldung''' – Fehlertypen können ein mehrsprachiges Array von Fehlermeldungen enthalten, die mit HTML-Parametern versehen sind. Die Parameter werden als $1, $2 etc. angegeben, wobei die Ziffer dem Schlüssel des Fehlertyps entspricht. Beim Erstellen eines Fehlertyps mit dem Zeichenketten-Schlüssel "aktuelle Eingabe", kann die Fehlermeldung beispielsweise den Platzhalter "$1" verwenden, der zum Zeitpunkt der Fehlerausgabe durch den Wert des Schlüssels "aktuelle Eingabe" ersetzt wird. Um HTML-Meldungen hinzuzufügen, klicke unter "HTML-Fragmente" auf das Symbol "[+]", wähle eine Sprache aus und gib die HTML-Zeichenkette ein. <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <span id="Creating_actionable_error_messages"></span> === Erstellung handlungsorientierter Fehlermeldungen === Wie oben beschrieben, verfügen Fehlertypen über einen optionalen Schlüssel <code>Z50K3</code>, der eine mehrsprachige Liste von HTML-Zeichenketten enthält. Bei der Darstellung von Informationen zu einem Fehler können die im Fehlertyp hinterlegten Meldungen dazu beitragen, eine klare, präzise, ​​informative, übersetzbare und handlungsorientierte Fehlermeldung zu erstellen. Zu diesem Zweck können Fehlermeldungen Parameter wie <code>$1</code>, <code>$2</code> etc. enthalten, wobei die Ziffer dem Argument des Fehlertyps und dessen Wert in der Fehlerinstanz entspricht. Diese Fehlermeldungen werden in Wikifunctions nach der Ausführung eines Funktionsaufrufs im Dialogfenster "Details" angezeigt. Darüber hinaus werden diese Fehlermeldungen auch in anderen Client-Schnittstellen, wie der Abstrakten Wikipedia, ausgegeben, um den Autoren von Abstrakten Inhalten eine bessere Orientierung zu bieten. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|Die Fehlermeldung wird unter Verwendung der HTML-Meldung des Fehlertyps und der Werte der Fehlerargumente generiert.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|Sofern verfügbar, wird die HTML-Fehlermeldung im Vorschau-Bereich der Abstrakten Wikipedia angezeigt.]] Lass uns anhand eines konkreten Beispiels die Vorteile von HTML-Fehlermeldungen nachvollziehen: Die Funktion {{Z|Z37847}} gibt die erste Lexem-Referenz zurück, basierend auf einer Wikidata-Datenobjekt-Referenz und einer Sprache. Falls für diese Kombination aus Datenobjekt und Sprache kein Lexem existiert, löst sie einen Fehler vom Typ {{Z|Z28248}} aus, der drei Schlüssel hat: * '''Z28248K1''' ist die QID des angegebenen Wikidata-Datenobjekts * '''Z28248K2''' ist die verbindende Eigenschaft, in diesem Fall <code>P5137/Objekt für diesen Sinn</code> * '''Z28248K3''' ist der Sprachcode Wenn diese Funktion für ein Wikidata-Lexem aufgerufen wird, das nicht existiert, löst der Aufruf eine Fehlerinstanz wie die folgende aus: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: * welches Datenobjekt fehlschlägt, * welche Sprache fehlt, und * welche Möglichkeiten zur Fehlerbehebung es gibt. Das Feld der Fehlermeldung <code>Z50K3</code> kann diese Funktionalität bereitstellen. Sobald für einen Fehlertyp eine Fehlermeldung in der Sprache des Benutzers (oder einer seiner Rückfallwerte) vorliegt, wird die angezeigte Fehlermeldung wie folgt ausgegeben: # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] k6su86d9s5hf9zizt36ktsj749375ya 334467 334465 2026-10-29T19:42:22Z Ameisenigel 44 Created page with "Zuerst werden die Parameter der Meldung durch die Werte der Schlüssel ersetzt. In unserem Beispiel wird jedes $1 durch den Wert von $2 ("Q319"), $3 durch "P5137" und $4 durch "ast" ersetzt." 334467 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <span id="Calling_another_Wikifunctions_function"></span> === Aufruf einer anderen Wikifunctions-Funktion === Eine Code-Implementierung kann bestimmte andere Wikifunctions-Funktionen aufrufen, die Ausgabe des Aufrufs empfangen und diese Ausgabe für die weitere Verarbeitung nutzen. Wir bezeichnen solche Aufrufe als Callbacks. Derzeit können aus Sicherheits- und Leistungsgründen nur die folgenden integrierten Wikidata-Abruf- und Suchfunktionen auf diese Weise aufgerufen werden: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}} und {{Z|Z6831}}. Diese Funktionalität befindet sich in einem frühen Stadium der Einführung; wir hoffen, in Zukunft Aufrufe für eine größere Bandbreite an Funktionen zu ermöglichen. Betrachten wir eine JavaScript-Implementierung, die einen Callback enthält. Diese Implementierung ruft ein Datenobjekt von Wikidata ab, extrahiert die Bezeichnung dieses Datenobjektes in einer bestimmten Sprache und gibt die Bezeichnung als Zeichenkette zurück. Das abzurufende Datenobjekt wird über das Argument <code>Z400K1</code> angegeben, die Sprache über <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Ein Callback wird durch den Aufruf von <code>Wikifunctions.Call</code> ausgelöst, wie im Beispiel gezeigt. Das erste Argument für <code>Wikifunctions.Call</code> ist stets die ZID der aufzurufenden Funktion – in diesem Fall {{Z|Z6821}}, welche ein einzelnes Argument entgegennimmt. Darauf folgen, durch Kommas getrennt, die an diese Funktion zu übergebenden Argumente. Hierbei handelt es sich bei dem Argument <code>Z400K1</code> um denselben Wert, der auch an <code>Z400</code> übergeben wurde. Dies ist ein gängiges Muster für die Argumentübergabe an Callbacks, jedoch können die Argumente auch mit dem Konstruktor <code>ZObject</code> (wie oben beschrieben) erstellt oder auf andere Weise bezogen werden. Der Wert von <code>Z400K1</code> wäre eine Instanz von {{Z|Z6091}}, die die QID des abzurufenden Datenobjekts enthält. Zeile 2 des Beispiels ruft <code>Z6821</code> auf, um dieses Datenobjekt von Wikidata abzurufen, und weist das resultierende ZObjekt der Konstante <code>item</code> zu. Der restliche Code durchläuft die Bezeichnungen des Datenobjekts, bis er diejenige findet, die der durch <code>Z400K2</code> angegebenen Sprache entspricht. Für das obige Beispiel haben wir der Einfachheit halber <code>Z6821</code> verwendet. Sofern die Implementierung jedoch nicht das gesamte Objekt benötigt, wird dringend empfohlen, zum Abrufen von Wikidata-Datenobjekten, die sehr groß sein können, <code>Z6820</code> zu verwenden. Obwohl der Aufruf von <code>Z6820</code> etwas komplexer ist, ermöglichen seine Parameter das Abrufen spezifischer Teile eines Wikidata-Datenobjekts. Dies kann die Leistung erheblich steigern und bestimmte Fehler vermeiden, da weniger Netzwerkbandbreite und Verarbeitungszeit erforderlich sind. (<code>Z6820</code> kann auch statt <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code> und <code>Z6826</code> verwendet werden, um ähnliche Vorteile bei der Bandweitenreduzierung zu erreichen.) Im Folgenden zeigen wir, wie <code>Z6820</code> in <code>Wikifunctions.Call</code> verwendet werden kann, um dasselbe Verhalten wie oben zu erzielen. Beachte, dass wir das zweite an <code>Z6820</code> übergebene Argument, <code>[labelsPart]</code>, nutzen, um festzulegen: “Gib nur die Bezeichnungen des Datenobjekts zurück”, und das dritte Argument, <code>[Z400K2]</code>, verwenden, um festzulegen: “Gib die Bezeichnungen nur in der angegebenen Sprache zurück”. (Dieses Argument würde auch für Aliasse und Beschreibungen gelten, sofern diese im Ergebnis enthalten wären.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Weitere zu beachtende Hinweise: * Obwohl Code-Implementierungen mittlerweile in der Lage sind, Wikidata-Entitäten abzurufen, wird empfohlen, dass sie keine ''vollständigen'' Entitäten zurückgeben. Dies liegt an den derzeitigen Beschränkungen hinsichtlich der Größe des von einer Code-Implementierung zurückgegebenen Wertes. Um eine vollständige, große Entität abzurufen und zurückzugeben, ist es besser, die Abruffunktion aus einer Komposition heraus aufzurufen. * Es kann nur ein Callback gleichzeitig ausgeführt werden. Aus Sicherheitsgründen ist es nicht möglich, die Nebenläufigkeitsfunktionen von JavaScript oder Python zu nutzen, um mehrere Callbacks parallel auszuführen. ** Beachte jedoch, dass du mithilfe von Z6820 mehrere Entitäten auf einmal abrufen kannst. * Derzeit gibt es eine Obergrenze von 3 MiB für die Größe von Wikidata-Inhalten, die über einen einzelnen Callback an eine Code-Implementierung zurückgegeben werden können. Dieselbe Obergrenze gilt für die Größe des Ergebnisses, das von einer Code-Implementierung zurückgegeben wird. <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * '''Fehlermeldung''' – Fehlertypen können ein mehrsprachiges Array von Fehlermeldungen enthalten, die mit HTML-Parametern versehen sind. Die Parameter werden als $1, $2 etc. angegeben, wobei die Ziffer dem Schlüssel des Fehlertyps entspricht. Beim Erstellen eines Fehlertyps mit dem Zeichenketten-Schlüssel "aktuelle Eingabe", kann die Fehlermeldung beispielsweise den Platzhalter "$1" verwenden, der zum Zeitpunkt der Fehlerausgabe durch den Wert des Schlüssels "aktuelle Eingabe" ersetzt wird. Um HTML-Meldungen hinzuzufügen, klicke unter "HTML-Fragmente" auf das Symbol "[+]", wähle eine Sprache aus und gib die HTML-Zeichenkette ein. <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <span id="Creating_actionable_error_messages"></span> === Erstellung handlungsorientierter Fehlermeldungen === Wie oben beschrieben, verfügen Fehlertypen über einen optionalen Schlüssel <code>Z50K3</code>, der eine mehrsprachige Liste von HTML-Zeichenketten enthält. Bei der Darstellung von Informationen zu einem Fehler können die im Fehlertyp hinterlegten Meldungen dazu beitragen, eine klare, präzise, ​​informative, übersetzbare und handlungsorientierte Fehlermeldung zu erstellen. Zu diesem Zweck können Fehlermeldungen Parameter wie <code>$1</code>, <code>$2</code> etc. enthalten, wobei die Ziffer dem Argument des Fehlertyps und dessen Wert in der Fehlerinstanz entspricht. Diese Fehlermeldungen werden in Wikifunctions nach der Ausführung eines Funktionsaufrufs im Dialogfenster "Details" angezeigt. Darüber hinaus werden diese Fehlermeldungen auch in anderen Client-Schnittstellen, wie der Abstrakten Wikipedia, ausgegeben, um den Autoren von Abstrakten Inhalten eine bessere Orientierung zu bieten. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|Die Fehlermeldung wird unter Verwendung der HTML-Meldung des Fehlertyps und der Werte der Fehlerargumente generiert.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|Sofern verfügbar, wird die HTML-Fehlermeldung im Vorschau-Bereich der Abstrakten Wikipedia angezeigt.]] Lass uns anhand eines konkreten Beispiels die Vorteile von HTML-Fehlermeldungen nachvollziehen: Die Funktion {{Z|Z37847}} gibt die erste Lexem-Referenz zurück, basierend auf einer Wikidata-Datenobjekt-Referenz und einer Sprache. Falls für diese Kombination aus Datenobjekt und Sprache kein Lexem existiert, löst sie einen Fehler vom Typ {{Z|Z28248}} aus, der drei Schlüssel hat: * '''Z28248K1''' ist die QID des angegebenen Wikidata-Datenobjekts * '''Z28248K2''' ist die verbindende Eigenschaft, in diesem Fall <code>P5137/Objekt für diesen Sinn</code> * '''Z28248K3''' ist der Sprachcode Wenn diese Funktion für ein Wikidata-Lexem aufgerufen wird, das nicht existiert, löst der Aufruf eine Fehlerinstanz wie die folgende aus: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: * welches Datenobjekt fehlschlägt, * welche Sprache fehlt, und * welche Möglichkeiten zur Fehlerbehebung es gibt. Das Feld der Fehlermeldung <code>Z50K3</code> kann diese Funktionalität bereitstellen. Sobald für einen Fehlertyp eine Fehlermeldung in der Sprache des Benutzers (oder einer seiner Rückfallwerte) vorliegt, wird die angezeigte Fehlermeldung wie folgt ausgegeben: # Zuerst werden die Parameter der Meldung durch die Werte der Schlüssel ersetzt. In unserem Beispiel wird jedes <code>$1</code> durch den Wert von <code>Z28248K1</code> ("Q319"), <code>$2</code> durch "P5137" und <code>$3</code> durch "ast" ersetzt. # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] e9c72ha9jp04zpz47mo8br4b5ffj1pz 334469 334467 2026-10-29T19:43:40Z Ameisenigel 44 Created page with "Abschließend erfolgt die Bereinigung und Ausgabe der HTML-Nachricht." 334469 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <span id="Calling_another_Wikifunctions_function"></span> === Aufruf einer anderen Wikifunctions-Funktion === Eine Code-Implementierung kann bestimmte andere Wikifunctions-Funktionen aufrufen, die Ausgabe des Aufrufs empfangen und diese Ausgabe für die weitere Verarbeitung nutzen. Wir bezeichnen solche Aufrufe als Callbacks. Derzeit können aus Sicherheits- und Leistungsgründen nur die folgenden integrierten Wikidata-Abruf- und Suchfunktionen auf diese Weise aufgerufen werden: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}} und {{Z|Z6831}}. Diese Funktionalität befindet sich in einem frühen Stadium der Einführung; wir hoffen, in Zukunft Aufrufe für eine größere Bandbreite an Funktionen zu ermöglichen. Betrachten wir eine JavaScript-Implementierung, die einen Callback enthält. Diese Implementierung ruft ein Datenobjekt von Wikidata ab, extrahiert die Bezeichnung dieses Datenobjektes in einer bestimmten Sprache und gibt die Bezeichnung als Zeichenkette zurück. Das abzurufende Datenobjekt wird über das Argument <code>Z400K1</code> angegeben, die Sprache über <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Ein Callback wird durch den Aufruf von <code>Wikifunctions.Call</code> ausgelöst, wie im Beispiel gezeigt. Das erste Argument für <code>Wikifunctions.Call</code> ist stets die ZID der aufzurufenden Funktion – in diesem Fall {{Z|Z6821}}, welche ein einzelnes Argument entgegennimmt. Darauf folgen, durch Kommas getrennt, die an diese Funktion zu übergebenden Argumente. Hierbei handelt es sich bei dem Argument <code>Z400K1</code> um denselben Wert, der auch an <code>Z400</code> übergeben wurde. Dies ist ein gängiges Muster für die Argumentübergabe an Callbacks, jedoch können die Argumente auch mit dem Konstruktor <code>ZObject</code> (wie oben beschrieben) erstellt oder auf andere Weise bezogen werden. Der Wert von <code>Z400K1</code> wäre eine Instanz von {{Z|Z6091}}, die die QID des abzurufenden Datenobjekts enthält. Zeile 2 des Beispiels ruft <code>Z6821</code> auf, um dieses Datenobjekt von Wikidata abzurufen, und weist das resultierende ZObjekt der Konstante <code>item</code> zu. Der restliche Code durchläuft die Bezeichnungen des Datenobjekts, bis er diejenige findet, die der durch <code>Z400K2</code> angegebenen Sprache entspricht. Für das obige Beispiel haben wir der Einfachheit halber <code>Z6821</code> verwendet. Sofern die Implementierung jedoch nicht das gesamte Objekt benötigt, wird dringend empfohlen, zum Abrufen von Wikidata-Datenobjekten, die sehr groß sein können, <code>Z6820</code> zu verwenden. Obwohl der Aufruf von <code>Z6820</code> etwas komplexer ist, ermöglichen seine Parameter das Abrufen spezifischer Teile eines Wikidata-Datenobjekts. Dies kann die Leistung erheblich steigern und bestimmte Fehler vermeiden, da weniger Netzwerkbandbreite und Verarbeitungszeit erforderlich sind. (<code>Z6820</code> kann auch statt <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code> und <code>Z6826</code> verwendet werden, um ähnliche Vorteile bei der Bandweitenreduzierung zu erreichen.) Im Folgenden zeigen wir, wie <code>Z6820</code> in <code>Wikifunctions.Call</code> verwendet werden kann, um dasselbe Verhalten wie oben zu erzielen. Beachte, dass wir das zweite an <code>Z6820</code> übergebene Argument, <code>[labelsPart]</code>, nutzen, um festzulegen: “Gib nur die Bezeichnungen des Datenobjekts zurück”, und das dritte Argument, <code>[Z400K2]</code>, verwenden, um festzulegen: “Gib die Bezeichnungen nur in der angegebenen Sprache zurück”. (Dieses Argument würde auch für Aliasse und Beschreibungen gelten, sofern diese im Ergebnis enthalten wären.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Weitere zu beachtende Hinweise: * Obwohl Code-Implementierungen mittlerweile in der Lage sind, Wikidata-Entitäten abzurufen, wird empfohlen, dass sie keine ''vollständigen'' Entitäten zurückgeben. Dies liegt an den derzeitigen Beschränkungen hinsichtlich der Größe des von einer Code-Implementierung zurückgegebenen Wertes. Um eine vollständige, große Entität abzurufen und zurückzugeben, ist es besser, die Abruffunktion aus einer Komposition heraus aufzurufen. * Es kann nur ein Callback gleichzeitig ausgeführt werden. Aus Sicherheitsgründen ist es nicht möglich, die Nebenläufigkeitsfunktionen von JavaScript oder Python zu nutzen, um mehrere Callbacks parallel auszuführen. ** Beachte jedoch, dass du mithilfe von Z6820 mehrere Entitäten auf einmal abrufen kannst. * Derzeit gibt es eine Obergrenze von 3 MiB für die Größe von Wikidata-Inhalten, die über einen einzelnen Callback an eine Code-Implementierung zurückgegeben werden können. Dieselbe Obergrenze gilt für die Größe des Ergebnisses, das von einer Code-Implementierung zurückgegeben wird. <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * '''Fehlermeldung''' – Fehlertypen können ein mehrsprachiges Array von Fehlermeldungen enthalten, die mit HTML-Parametern versehen sind. Die Parameter werden als $1, $2 etc. angegeben, wobei die Ziffer dem Schlüssel des Fehlertyps entspricht. Beim Erstellen eines Fehlertyps mit dem Zeichenketten-Schlüssel "aktuelle Eingabe", kann die Fehlermeldung beispielsweise den Platzhalter "$1" verwenden, der zum Zeitpunkt der Fehlerausgabe durch den Wert des Schlüssels "aktuelle Eingabe" ersetzt wird. Um HTML-Meldungen hinzuzufügen, klicke unter "HTML-Fragmente" auf das Symbol "[+]", wähle eine Sprache aus und gib die HTML-Zeichenkette ein. <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <span id="Creating_actionable_error_messages"></span> === Erstellung handlungsorientierter Fehlermeldungen === Wie oben beschrieben, verfügen Fehlertypen über einen optionalen Schlüssel <code>Z50K3</code>, der eine mehrsprachige Liste von HTML-Zeichenketten enthält. Bei der Darstellung von Informationen zu einem Fehler können die im Fehlertyp hinterlegten Meldungen dazu beitragen, eine klare, präzise, ​​informative, übersetzbare und handlungsorientierte Fehlermeldung zu erstellen. Zu diesem Zweck können Fehlermeldungen Parameter wie <code>$1</code>, <code>$2</code> etc. enthalten, wobei die Ziffer dem Argument des Fehlertyps und dessen Wert in der Fehlerinstanz entspricht. Diese Fehlermeldungen werden in Wikifunctions nach der Ausführung eines Funktionsaufrufs im Dialogfenster "Details" angezeigt. Darüber hinaus werden diese Fehlermeldungen auch in anderen Client-Schnittstellen, wie der Abstrakten Wikipedia, ausgegeben, um den Autoren von Abstrakten Inhalten eine bessere Orientierung zu bieten. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|Die Fehlermeldung wird unter Verwendung der HTML-Meldung des Fehlertyps und der Werte der Fehlerargumente generiert.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|Sofern verfügbar, wird die HTML-Fehlermeldung im Vorschau-Bereich der Abstrakten Wikipedia angezeigt.]] Lass uns anhand eines konkreten Beispiels die Vorteile von HTML-Fehlermeldungen nachvollziehen: Die Funktion {{Z|Z37847}} gibt die erste Lexem-Referenz zurück, basierend auf einer Wikidata-Datenobjekt-Referenz und einer Sprache. Falls für diese Kombination aus Datenobjekt und Sprache kein Lexem existiert, löst sie einen Fehler vom Typ {{Z|Z28248}} aus, der drei Schlüssel hat: * '''Z28248K1''' ist die QID des angegebenen Wikidata-Datenobjekts * '''Z28248K2''' ist die verbindende Eigenschaft, in diesem Fall <code>P5137/Objekt für diesen Sinn</code> * '''Z28248K3''' ist der Sprachcode Wenn diese Funktion für ein Wikidata-Lexem aufgerufen wird, das nicht existiert, löst der Aufruf eine Fehlerinstanz wie die folgende aus: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: * welches Datenobjekt fehlschlägt, * welche Sprache fehlt, und * welche Möglichkeiten zur Fehlerbehebung es gibt. Das Feld der Fehlermeldung <code>Z50K3</code> kann diese Funktionalität bereitstellen. Sobald für einen Fehlertyp eine Fehlermeldung in der Sprache des Benutzers (oder einer seiner Rückfallwerte) vorliegt, wird die angezeigte Fehlermeldung wie folgt ausgegeben: # Zuerst werden die Parameter der Meldung durch die Werte der Schlüssel ersetzt. In unserem Beispiel wird jedes <code>$1</code> durch den Wert von <code>Z28248K1</code> ("Q319"), <code>$2</code> durch "P5137" und <code>$3</code> durch "ast" ersetzt. # Abschließend erfolgt die Bereinigung und Ausgabe der HTML-Nachricht. <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] 9kytj0lrojw4u3lacjcb7ldqjv5p0mj 334471 334469 2026-10-29T19:43:54Z Ameisenigel 44 Created page with "Eine HTML-Nachricht wie:" 334471 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <span id="Calling_another_Wikifunctions_function"></span> === Aufruf einer anderen Wikifunctions-Funktion === Eine Code-Implementierung kann bestimmte andere Wikifunctions-Funktionen aufrufen, die Ausgabe des Aufrufs empfangen und diese Ausgabe für die weitere Verarbeitung nutzen. Wir bezeichnen solche Aufrufe als Callbacks. Derzeit können aus Sicherheits- und Leistungsgründen nur die folgenden integrierten Wikidata-Abruf- und Suchfunktionen auf diese Weise aufgerufen werden: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}} und {{Z|Z6831}}. Diese Funktionalität befindet sich in einem frühen Stadium der Einführung; wir hoffen, in Zukunft Aufrufe für eine größere Bandbreite an Funktionen zu ermöglichen. Betrachten wir eine JavaScript-Implementierung, die einen Callback enthält. Diese Implementierung ruft ein Datenobjekt von Wikidata ab, extrahiert die Bezeichnung dieses Datenobjektes in einer bestimmten Sprache und gibt die Bezeichnung als Zeichenkette zurück. Das abzurufende Datenobjekt wird über das Argument <code>Z400K1</code> angegeben, die Sprache über <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Ein Callback wird durch den Aufruf von <code>Wikifunctions.Call</code> ausgelöst, wie im Beispiel gezeigt. Das erste Argument für <code>Wikifunctions.Call</code> ist stets die ZID der aufzurufenden Funktion – in diesem Fall {{Z|Z6821}}, welche ein einzelnes Argument entgegennimmt. Darauf folgen, durch Kommas getrennt, die an diese Funktion zu übergebenden Argumente. Hierbei handelt es sich bei dem Argument <code>Z400K1</code> um denselben Wert, der auch an <code>Z400</code> übergeben wurde. Dies ist ein gängiges Muster für die Argumentübergabe an Callbacks, jedoch können die Argumente auch mit dem Konstruktor <code>ZObject</code> (wie oben beschrieben) erstellt oder auf andere Weise bezogen werden. Der Wert von <code>Z400K1</code> wäre eine Instanz von {{Z|Z6091}}, die die QID des abzurufenden Datenobjekts enthält. Zeile 2 des Beispiels ruft <code>Z6821</code> auf, um dieses Datenobjekt von Wikidata abzurufen, und weist das resultierende ZObjekt der Konstante <code>item</code> zu. Der restliche Code durchläuft die Bezeichnungen des Datenobjekts, bis er diejenige findet, die der durch <code>Z400K2</code> angegebenen Sprache entspricht. Für das obige Beispiel haben wir der Einfachheit halber <code>Z6821</code> verwendet. Sofern die Implementierung jedoch nicht das gesamte Objekt benötigt, wird dringend empfohlen, zum Abrufen von Wikidata-Datenobjekten, die sehr groß sein können, <code>Z6820</code> zu verwenden. Obwohl der Aufruf von <code>Z6820</code> etwas komplexer ist, ermöglichen seine Parameter das Abrufen spezifischer Teile eines Wikidata-Datenobjekts. Dies kann die Leistung erheblich steigern und bestimmte Fehler vermeiden, da weniger Netzwerkbandbreite und Verarbeitungszeit erforderlich sind. (<code>Z6820</code> kann auch statt <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code> und <code>Z6826</code> verwendet werden, um ähnliche Vorteile bei der Bandweitenreduzierung zu erreichen.) Im Folgenden zeigen wir, wie <code>Z6820</code> in <code>Wikifunctions.Call</code> verwendet werden kann, um dasselbe Verhalten wie oben zu erzielen. Beachte, dass wir das zweite an <code>Z6820</code> übergebene Argument, <code>[labelsPart]</code>, nutzen, um festzulegen: “Gib nur die Bezeichnungen des Datenobjekts zurück”, und das dritte Argument, <code>[Z400K2]</code>, verwenden, um festzulegen: “Gib die Bezeichnungen nur in der angegebenen Sprache zurück”. (Dieses Argument würde auch für Aliasse und Beschreibungen gelten, sofern diese im Ergebnis enthalten wären.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Weitere zu beachtende Hinweise: * Obwohl Code-Implementierungen mittlerweile in der Lage sind, Wikidata-Entitäten abzurufen, wird empfohlen, dass sie keine ''vollständigen'' Entitäten zurückgeben. Dies liegt an den derzeitigen Beschränkungen hinsichtlich der Größe des von einer Code-Implementierung zurückgegebenen Wertes. Um eine vollständige, große Entität abzurufen und zurückzugeben, ist es besser, die Abruffunktion aus einer Komposition heraus aufzurufen. * Es kann nur ein Callback gleichzeitig ausgeführt werden. Aus Sicherheitsgründen ist es nicht möglich, die Nebenläufigkeitsfunktionen von JavaScript oder Python zu nutzen, um mehrere Callbacks parallel auszuführen. ** Beachte jedoch, dass du mithilfe von Z6820 mehrere Entitäten auf einmal abrufen kannst. * Derzeit gibt es eine Obergrenze von 3 MiB für die Größe von Wikidata-Inhalten, die über einen einzelnen Callback an eine Code-Implementierung zurückgegeben werden können. Dieselbe Obergrenze gilt für die Größe des Ergebnisses, das von einer Code-Implementierung zurückgegeben wird. <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * '''Fehlermeldung''' – Fehlertypen können ein mehrsprachiges Array von Fehlermeldungen enthalten, die mit HTML-Parametern versehen sind. Die Parameter werden als $1, $2 etc. angegeben, wobei die Ziffer dem Schlüssel des Fehlertyps entspricht. Beim Erstellen eines Fehlertyps mit dem Zeichenketten-Schlüssel "aktuelle Eingabe", kann die Fehlermeldung beispielsweise den Platzhalter "$1" verwenden, der zum Zeitpunkt der Fehlerausgabe durch den Wert des Schlüssels "aktuelle Eingabe" ersetzt wird. Um HTML-Meldungen hinzuzufügen, klicke unter "HTML-Fragmente" auf das Symbol "[+]", wähle eine Sprache aus und gib die HTML-Zeichenkette ein. <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <span id="Creating_actionable_error_messages"></span> === Erstellung handlungsorientierter Fehlermeldungen === Wie oben beschrieben, verfügen Fehlertypen über einen optionalen Schlüssel <code>Z50K3</code>, der eine mehrsprachige Liste von HTML-Zeichenketten enthält. Bei der Darstellung von Informationen zu einem Fehler können die im Fehlertyp hinterlegten Meldungen dazu beitragen, eine klare, präzise, ​​informative, übersetzbare und handlungsorientierte Fehlermeldung zu erstellen. Zu diesem Zweck können Fehlermeldungen Parameter wie <code>$1</code>, <code>$2</code> etc. enthalten, wobei die Ziffer dem Argument des Fehlertyps und dessen Wert in der Fehlerinstanz entspricht. Diese Fehlermeldungen werden in Wikifunctions nach der Ausführung eines Funktionsaufrufs im Dialogfenster "Details" angezeigt. Darüber hinaus werden diese Fehlermeldungen auch in anderen Client-Schnittstellen, wie der Abstrakten Wikipedia, ausgegeben, um den Autoren von Abstrakten Inhalten eine bessere Orientierung zu bieten. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|Die Fehlermeldung wird unter Verwendung der HTML-Meldung des Fehlertyps und der Werte der Fehlerargumente generiert.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|Sofern verfügbar, wird die HTML-Fehlermeldung im Vorschau-Bereich der Abstrakten Wikipedia angezeigt.]] Lass uns anhand eines konkreten Beispiels die Vorteile von HTML-Fehlermeldungen nachvollziehen: Die Funktion {{Z|Z37847}} gibt die erste Lexem-Referenz zurück, basierend auf einer Wikidata-Datenobjekt-Referenz und einer Sprache. Falls für diese Kombination aus Datenobjekt und Sprache kein Lexem existiert, löst sie einen Fehler vom Typ {{Z|Z28248}} aus, der drei Schlüssel hat: * '''Z28248K1''' ist die QID des angegebenen Wikidata-Datenobjekts * '''Z28248K2''' ist die verbindende Eigenschaft, in diesem Fall <code>P5137/Objekt für diesen Sinn</code> * '''Z28248K3''' ist der Sprachcode Wenn diese Funktion für ein Wikidata-Lexem aufgerufen wird, das nicht existiert, löst der Aufruf eine Fehlerinstanz wie die folgende aus: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: * welches Datenobjekt fehlschlägt, * welche Sprache fehlt, und * welche Möglichkeiten zur Fehlerbehebung es gibt. Das Feld der Fehlermeldung <code>Z50K3</code> kann diese Funktionalität bereitstellen. Sobald für einen Fehlertyp eine Fehlermeldung in der Sprache des Benutzers (oder einer seiner Rückfallwerte) vorliegt, wird die angezeigte Fehlermeldung wie folgt ausgegeben: # Zuerst werden die Parameter der Meldung durch die Werte der Schlüssel ersetzt. In unserem Beispiel wird jedes <code>$1</code> durch den Wert von <code>Z28248K1</code> ("Q319"), <code>$2</code> durch "P5137" und <code>$3</code> durch "ast" ersetzt. # Abschließend erfolgt die Bereinigung und Ausgabe der HTML-Nachricht. Eine HTML-Nachricht wie: <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] 2fst054m0d1ngb84d6lhyyhwa0jyrcx 334473 334471 2026-10-29T19:44:00Z Ameisenigel 44 Created page with "Wird zu:" 334473 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <span id="Calling_another_Wikifunctions_function"></span> === Aufruf einer anderen Wikifunctions-Funktion === Eine Code-Implementierung kann bestimmte andere Wikifunctions-Funktionen aufrufen, die Ausgabe des Aufrufs empfangen und diese Ausgabe für die weitere Verarbeitung nutzen. Wir bezeichnen solche Aufrufe als Callbacks. Derzeit können aus Sicherheits- und Leistungsgründen nur die folgenden integrierten Wikidata-Abruf- und Suchfunktionen auf diese Weise aufgerufen werden: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}} und {{Z|Z6831}}. Diese Funktionalität befindet sich in einem frühen Stadium der Einführung; wir hoffen, in Zukunft Aufrufe für eine größere Bandbreite an Funktionen zu ermöglichen. Betrachten wir eine JavaScript-Implementierung, die einen Callback enthält. Diese Implementierung ruft ein Datenobjekt von Wikidata ab, extrahiert die Bezeichnung dieses Datenobjektes in einer bestimmten Sprache und gibt die Bezeichnung als Zeichenkette zurück. Das abzurufende Datenobjekt wird über das Argument <code>Z400K1</code> angegeben, die Sprache über <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Ein Callback wird durch den Aufruf von <code>Wikifunctions.Call</code> ausgelöst, wie im Beispiel gezeigt. Das erste Argument für <code>Wikifunctions.Call</code> ist stets die ZID der aufzurufenden Funktion – in diesem Fall {{Z|Z6821}}, welche ein einzelnes Argument entgegennimmt. Darauf folgen, durch Kommas getrennt, die an diese Funktion zu übergebenden Argumente. Hierbei handelt es sich bei dem Argument <code>Z400K1</code> um denselben Wert, der auch an <code>Z400</code> übergeben wurde. Dies ist ein gängiges Muster für die Argumentübergabe an Callbacks, jedoch können die Argumente auch mit dem Konstruktor <code>ZObject</code> (wie oben beschrieben) erstellt oder auf andere Weise bezogen werden. Der Wert von <code>Z400K1</code> wäre eine Instanz von {{Z|Z6091}}, die die QID des abzurufenden Datenobjekts enthält. Zeile 2 des Beispiels ruft <code>Z6821</code> auf, um dieses Datenobjekt von Wikidata abzurufen, und weist das resultierende ZObjekt der Konstante <code>item</code> zu. Der restliche Code durchläuft die Bezeichnungen des Datenobjekts, bis er diejenige findet, die der durch <code>Z400K2</code> angegebenen Sprache entspricht. Für das obige Beispiel haben wir der Einfachheit halber <code>Z6821</code> verwendet. Sofern die Implementierung jedoch nicht das gesamte Objekt benötigt, wird dringend empfohlen, zum Abrufen von Wikidata-Datenobjekten, die sehr groß sein können, <code>Z6820</code> zu verwenden. Obwohl der Aufruf von <code>Z6820</code> etwas komplexer ist, ermöglichen seine Parameter das Abrufen spezifischer Teile eines Wikidata-Datenobjekts. Dies kann die Leistung erheblich steigern und bestimmte Fehler vermeiden, da weniger Netzwerkbandbreite und Verarbeitungszeit erforderlich sind. (<code>Z6820</code> kann auch statt <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code> und <code>Z6826</code> verwendet werden, um ähnliche Vorteile bei der Bandweitenreduzierung zu erreichen.) Im Folgenden zeigen wir, wie <code>Z6820</code> in <code>Wikifunctions.Call</code> verwendet werden kann, um dasselbe Verhalten wie oben zu erzielen. Beachte, dass wir das zweite an <code>Z6820</code> übergebene Argument, <code>[labelsPart]</code>, nutzen, um festzulegen: “Gib nur die Bezeichnungen des Datenobjekts zurück”, und das dritte Argument, <code>[Z400K2]</code>, verwenden, um festzulegen: “Gib die Bezeichnungen nur in der angegebenen Sprache zurück”. (Dieses Argument würde auch für Aliasse und Beschreibungen gelten, sofern diese im Ergebnis enthalten wären.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Weitere zu beachtende Hinweise: * Obwohl Code-Implementierungen mittlerweile in der Lage sind, Wikidata-Entitäten abzurufen, wird empfohlen, dass sie keine ''vollständigen'' Entitäten zurückgeben. Dies liegt an den derzeitigen Beschränkungen hinsichtlich der Größe des von einer Code-Implementierung zurückgegebenen Wertes. Um eine vollständige, große Entität abzurufen und zurückzugeben, ist es besser, die Abruffunktion aus einer Komposition heraus aufzurufen. * Es kann nur ein Callback gleichzeitig ausgeführt werden. Aus Sicherheitsgründen ist es nicht möglich, die Nebenläufigkeitsfunktionen von JavaScript oder Python zu nutzen, um mehrere Callbacks parallel auszuführen. ** Beachte jedoch, dass du mithilfe von Z6820 mehrere Entitäten auf einmal abrufen kannst. * Derzeit gibt es eine Obergrenze von 3 MiB für die Größe von Wikidata-Inhalten, die über einen einzelnen Callback an eine Code-Implementierung zurückgegeben werden können. Dieselbe Obergrenze gilt für die Größe des Ergebnisses, das von einer Code-Implementierung zurückgegeben wird. <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * '''Fehlermeldung''' – Fehlertypen können ein mehrsprachiges Array von Fehlermeldungen enthalten, die mit HTML-Parametern versehen sind. Die Parameter werden als $1, $2 etc. angegeben, wobei die Ziffer dem Schlüssel des Fehlertyps entspricht. Beim Erstellen eines Fehlertyps mit dem Zeichenketten-Schlüssel "aktuelle Eingabe", kann die Fehlermeldung beispielsweise den Platzhalter "$1" verwenden, der zum Zeitpunkt der Fehlerausgabe durch den Wert des Schlüssels "aktuelle Eingabe" ersetzt wird. Um HTML-Meldungen hinzuzufügen, klicke unter "HTML-Fragmente" auf das Symbol "[+]", wähle eine Sprache aus und gib die HTML-Zeichenkette ein. <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <span id="Creating_actionable_error_messages"></span> === Erstellung handlungsorientierter Fehlermeldungen === Wie oben beschrieben, verfügen Fehlertypen über einen optionalen Schlüssel <code>Z50K3</code>, der eine mehrsprachige Liste von HTML-Zeichenketten enthält. Bei der Darstellung von Informationen zu einem Fehler können die im Fehlertyp hinterlegten Meldungen dazu beitragen, eine klare, präzise, ​​informative, übersetzbare und handlungsorientierte Fehlermeldung zu erstellen. Zu diesem Zweck können Fehlermeldungen Parameter wie <code>$1</code>, <code>$2</code> etc. enthalten, wobei die Ziffer dem Argument des Fehlertyps und dessen Wert in der Fehlerinstanz entspricht. Diese Fehlermeldungen werden in Wikifunctions nach der Ausführung eines Funktionsaufrufs im Dialogfenster "Details" angezeigt. Darüber hinaus werden diese Fehlermeldungen auch in anderen Client-Schnittstellen, wie der Abstrakten Wikipedia, ausgegeben, um den Autoren von Abstrakten Inhalten eine bessere Orientierung zu bieten. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|Die Fehlermeldung wird unter Verwendung der HTML-Meldung des Fehlertyps und der Werte der Fehlerargumente generiert.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|Sofern verfügbar, wird die HTML-Fehlermeldung im Vorschau-Bereich der Abstrakten Wikipedia angezeigt.]] Lass uns anhand eines konkreten Beispiels die Vorteile von HTML-Fehlermeldungen nachvollziehen: Die Funktion {{Z|Z37847}} gibt die erste Lexem-Referenz zurück, basierend auf einer Wikidata-Datenobjekt-Referenz und einer Sprache. Falls für diese Kombination aus Datenobjekt und Sprache kein Lexem existiert, löst sie einen Fehler vom Typ {{Z|Z28248}} aus, der drei Schlüssel hat: * '''Z28248K1''' ist die QID des angegebenen Wikidata-Datenobjekts * '''Z28248K2''' ist die verbindende Eigenschaft, in diesem Fall <code>P5137/Objekt für diesen Sinn</code> * '''Z28248K3''' ist der Sprachcode Wenn diese Funktion für ein Wikidata-Lexem aufgerufen wird, das nicht existiert, löst der Aufruf eine Fehlerinstanz wie die folgende aus: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: * welches Datenobjekt fehlschlägt, * welche Sprache fehlt, und * welche Möglichkeiten zur Fehlerbehebung es gibt. Das Feld der Fehlermeldung <code>Z50K3</code> kann diese Funktionalität bereitstellen. Sobald für einen Fehlertyp eine Fehlermeldung in der Sprache des Benutzers (oder einer seiner Rückfallwerte) vorliegt, wird die angezeigte Fehlermeldung wie folgt ausgegeben: # Zuerst werden die Parameter der Meldung durch die Werte der Schlüssel ersetzt. In unserem Beispiel wird jedes <code>$1</code> durch den Wert von <code>Z28248K1</code> ("Q319"), <code>$2</code> durch "P5137" und <code>$3</code> durch "ast" ersetzt. # Abschließend erfolgt die Bereinigung und Ausgabe der HTML-Nachricht. Eine HTML-Nachricht wie: <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> Wird zu: : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] bxmyndgqafjltwlzru31lrmhbrsy70d Z11089 0 14796 334648 333471 2026-10-30T10:34:21Z NikolasKHF 68920 334648 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z11089" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z11089K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "singular" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "英単語" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "singulier" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Singular" }, { "Z1K1": "Z11", "Z11K1": "Z1645", "Z11K2": "需要复数化的单词" }, { "Z1K1": "Z11", "Z11K1": "Z1672", "Z11K2": "英語單詞單數形式" }, { "Z1K1": "Z11", "Z11K1": "Z1014", "Z11K2": "otu : usoro" }, { "Z1K1": "Z11", "Z11K1": "Z1013", "Z11K2": "guda ɗaya" }, { "Z1K1": "Z11", "Z11K1": "Z1818", "Z11K2": "ẹyọkan" }, { "Z1K1": "Z11", "Z11K1": "Z1403", "Z11K2": "singularis" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z11090", "Z11091", "Z11092", "Z11093", "Z11096", "Z11113", "Z11114", "Z11115", "Z11116", "Z11117", "Z11119", "Z11120", "Z11121", "Z11124", "Z11123", "Z11125", "Z11126", "Z11128", "Z11144", "Z11183", "Z11186", "Z11187", "Z11190", "Z11188", "Z11189", "Z11191", "Z11192", "Z12387", "Z12407", "Z25920", "Z17712", "Z32120", "Z32121", "Z37819", "Z37792", "Z39662", "Z39663", "Z39860", "Z39977", "Z47801" ], "Z8K4": [ "Z14", "Z31844" ], "Z8K5": "Z11089" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "English plural" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "英語複数形変換" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "ইংরেজি বহুবচন" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "pluriel en anglais" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Plural Englisch" }, { "Z1K1": "Z11", "Z11K1": "Z1645", "Z11K2": "英语复数变换" }, { "Z1K1": "Z11", "Z11K1": "Z1672", "Z11K2": "英語複數形式變換" }, { "Z1K1": "Z11", "Z11K1": "Z1014", "Z11K2": "Ụbara bekee" }, { "Z1K1": "Z11", "Z11K1": "Z1013", "Z11K2": "Turanci jam'i" }, { "Z1K1": "Z11", "Z11K1": "Z1818", "Z11K2": "English ọpọ" }, { "Z1K1": "Z11", "Z11K1": "Z1003", "Z11K2": "plural inglés" }, { "Z1K1": "Z11", "Z11K1": "Z1827", "Z11K2": "πληθυντικός αγγλικής λέξης" }, { "Z1K1": "Z11", "Z11K1": "Z1643", "Z11K2": "영어 복수형" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "अंग्रेज़ी बहुवचन" }, { "Z1K1": "Z11", "Z11K1": "Z1403", "Z11K2": "pluralis Anglica" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "Engels meervoud" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "bahasa Inggris jamak " } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "plural (English)", "pluralize (English)", "pluralise (English)" ] }, { "Z1K1": "Z31", "Z31K1": "Z1004", "Z31K2": [ "Z6", "pluriel anglais" ] }, { "Z1K1": "Z31", "Z31K1": "Z1003", "Z31K2": [ "Z6", "plural (inglés)" ] }, { "Z1K1": "Z31", "Z31K1": "Z1827", "Z31K2": [ "Z6", "πληθυντικός στα αγγλικά" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "return the plural of an English word; see https://meta.wikimedia.org/wiki/Abstract_Wikipedia/Updates/2023-09-08 for context" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "入力された英単語を複数形に変換する。作成理由については https://meta.wikimedia.org/wiki/Abstract_Wikipedia/Updates/2023-09-08 を参照" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "একটি ইংরেজি শব্দের বহুবচন ফেরত দাও।" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "gibt die englischsprachige Pluralform eines Wortes zurück" }, { "Z1K1": "Z11", "Z11K1": "Z1645", "Z11K2": "返回英语单词的复数" }, { "Z1K1": "Z11", "Z11K1": "Z1672", "Z11K2": "回傳英語單詞的複數形式" }, { "Z1K1": "Z11", "Z11K1": "Z1014", "Z11K2": "Weghachite otutu okwu bekee. Hụ https://meta.wikimedia.org/wiki/Abstract_Wikipedia/Updates/2023-09-08 for contest." }, { "Z1K1": "Z11", "Z11K1": "Z1013", "Z11K2": "Kawo jam'in kalmar Ingilishi." }, { "Z1K1": "Z11", "Z11K1": "Z1818", "Z11K2": "Pada ọpọ ọrọ Gẹẹsi pada." }, { "Z1K1": "Z11", "Z11K1": "Z1003", "Z11K2": "Regresa la forma plural de una palabra inglesa. Véase https://meta.wikimedia.org/wiki/Abstract_Wikipedia/Updates/2023-09-08 para más contexto." }, { "Z1K1": "Z11", "Z11K1": "Z1827", "Z11K2": "επιστρέφει τον πληθυντικό μιας αγγλικής λέξης\n" }, { "Z1K1": "Z11", "Z11K1": "Z1643", "Z11K2": "입력된 영어 단어를 복수형으로 변환. 자세한 내용은 https://meta.wikimedia.org/wiki/Abstract_Wikipedia/Updates/2023-09-08 참고." }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "एक अंग्रेज़ी शब्द का बहुवचन रूप लौटाता है; प्रसंग के लिए https://meta.wikimedia.org/wiki/Abstract_Wikipedia/Updates/2023-09-08 देखें" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "mengembalikan bentuk jamak dari kata bahasa Inggris" } ] } } lk9oa1qciysfn2xgg0d18qbk1bvogd9 Wikifunctions:Status updates/de 4 22906 334484 333351 2026-10-29T20:23:12Z Ameisenigel 44 Created page with "$1: Wikiabstrak-App" 334484 wikitext text/x-wiki <languages/> {{shortcut|WF:SU}}{{notice|1='''[[:m:Global message delivery/Targets/Wikifunctions & Abstract Wikipedia|Abonniere]]''' kurze MassMessage-Benachrichtigungen im Wiki über jede neue Ausgabe.}} {{Wikifunctions updates | prevlabel = Vorheriges Update | prev = 2024-02-01 | nextlabel = Letztes Update | next = 2026-10-25 }} Es passiert viel rund um Wikifunctions und die Abstrakte Wikipedia. Auf dieser Seite werden unsere Updates veröffentlicht, inklusive der [[Special:MyLanguage/WF:function of the Week|Funktion der Woche]]. Du kannst auch den [[:m:Global message delivery/Targets/Wikifunctions & Abstract Wikipedia|On-Wiki-Newsletter]] abonnieren, um sie auf deine Diskussionsseite oder die Projektdiskussion deines Projekts geliefert zu bekommen. <inputbox> type=fulltext prefix={{NAMESPACE}}:{{PAGENAME}}/ break=no width=30 searchbuttonlabel={{int:Search}} placeholder=Suchen Sie nach allen Status-Updates </inputbox> <span id="Newsletters"></span> == Newsletter == <!--<nowiki> Newsletter entry template: * <translate><tvar name="1">{{Status updates|2026-1?-??}}</tvar>: Title</translate> NOTE: Remember to also update the "next =" date at the top of this page. </nowiki>--> === 2026 === * {{Status updates|2026-10-25}}: Wikiabstrak-App * {{Status updates|2026-10-17}}: Änderungen an Darstellungen im Auswerter * {{Status updates|2026-10-09}}: Vierteljährliche Planung * {{Status updates|2026-10-02}}: Aktualisierung von Ergebnissen * {{Status updates|2026-09-25}}: Memoisation und der Bürgermeister von Paris * {{Status updates|2026-09-18}}: Ansprechendere Fehlermeldungen * {{Status updates|2026-09-10}}: Dein Code kann nun die Wikidata-Abruffunktionen aufrufen * {{Status updates|2026-09-03}}: 5.000 Funktionen, Z40000 überschritten * {{Status updates|2026-08-28}}: Wikifunctions-Objektreferenz * {{Status updates|2026-08-20}}: ''Mayors'' und ''North'' * {{Status updates|2026-08-13}}: Lob an 99of9! * {{Status updates|2026-08-05}}: Ein Apfel ist eine Frucht * {{Status updates|2026-07-29}}: Abstrakte Wikipedia bei der Wikimania * {{Status updates|2026-07-16}}: Über syntaktische Tabellen hinaus * {{Status updates|2026-07-08}}: Auf dem Weg zu unserem ersten Meilenstein bei der Integration der Abstrakten Wikipedia * {{Status updates|2026-07-01}}: Integration im Test-Wiki und Jahresplan * {{Status updates|2026-06-26}}: Arbeit an Funktionen, gemeinsam * {{Status updates|2026-06-19}}: Der/die/das oder nicht, (das?) ist hier die Frage * {{Status updates|2026-06-12}}: Verbessertes Laden und Anzeigen von Testergebnissen * {{Status updates|2026-06-05}}: Die illustrierte Enzyklopädie * {{Status updates|2026-05-30}}: Rückblick und Ausblick * {{Status updates|2026-05-23}}: Jahresplan 2026/2027 * {{Status updates|2026-05-15}}: Eine höhere Bedeutung * {{Status updates|2026-05-08}}: Einzelnachweise aus Wikidata jetzt verfügbar * {{Status updates|2026-05-02}}: Bitte um Anregungen: Was sollten wir für die Abstrakte Wikipedia zählen? * {{Status updates|2026-04-25}}: Die Suche der Foundation nach der perfekten Sprache * {{Status updates|2026-04-16}}: Meilensteine; Einige größere Probleme hoffentlich behoben * {{Status updates|2026-04-10}}: Community-Vorschläge zur Erfassung von Bedeutungen * {{Status updates|2026-04-02}}: Diskussionsanfrage: Syntaktische Tabellen * {{Status updates|2026-03-26}}: Erste Tage der Abstrakten Wikipedia Beta; Status der Kompositionssprache v2 * {{Status updates|2026-03-19}}: Abstrakte Wikipedia in Beta * {{Status updates|2026-03-11}}: Eine neue Kompositionssprache * {{Status updates|2026-03-06}}: Einzelnachweise und Kopieren und Einfügen * {{Status updates|2026-02-26}}: Elegante Überschreibungen und Rückfalllösungen * {{Status updates|2026-02-20}}: Eine Vorschau auf die Abstrakte Wikipedia * {{Status updates|2026-02-13}}: Sätze des anderen beenden: Dinge anfangen; Treffen in Istanbul * {{Status updates|2026-01-29}}: Integration der Abstrakten Wikipedia * {{Status updates|2026-01-22}}: Vierteljährliche Planung für Januar–März 2026 * {{Status updates|2026-01-15}}: 25 Jahre Wikipedia === 2025 === * {{Status updates|2025-12-18}}: Wir wünschen euch ein frohes neues gregorianisches Jahr! * {{Status updates|2025-12-11}}: Wie man bessere Fehlermeldungen schreibt * {{Status updates|2025-12-04}}: Und der Name ist Abstrakte Wikipedia * {{Status updates|2025-11-27}}: Stimme über den Namen für das neue Wiki ab!; Sätze des anderen beenden * {{Status updates|2025-11-20}}: Zweite Abstimmungsrunde über den Namen des Wikis mit sprachunabhängigen Inhalten; Teilen von Funktionsaufrufen * {{Status updates|2025-11-13}}: Vorbereitung für die zweite Abstimmungsrunde über den Namen des Wikis mit abstraktem Inhalt; Neuschreiben des Back-Ends: Warum Rust? * {{Status updates|2025-11-05}}: Erste Runde der Abstimmung über den Namen für das Wiki der Abstrakten Inhalte beendet; Aufruf für Wiktionary-Funktionen; Eingebettete Wikifunctions in der bengalischen Wikipedia und sieben weiteren Wiktionarys * {{Status updates|2025-10-29}}: Runde 1 der Abstimmung über den Namen für das “Wiki der Abstrakten Inhalte” endet Montag; Ein Beispiel für Kurzbeschreibungen * {{Status updates|2025-10-23}}: Willkommen, Zaree und Laura! Runde 1 des Namenswettbewerbs gestartet * {{Status updates|2025-10-15}}: Start des Namenswettbewerbs für die Abstrakte Wikipedia; Visualisierung von Funktionen * {{Status updates|2025-10-08}}: Entscheidung über den Ort für abstrakte Inhalte und Quartalsplanung für Oktober–Dezember * {{Status updates|2025-10-03}}: Rich Text jetzt in eingebetteten Funktionsaufrufen in 148 Wiktionarys und im Incubator verfügbar * {{Status updates|2025-09-26}}: Zugriff auf Qualifikatoren in Wikidata-Aussagen * {{Status updates|2025-09-19}}: Wikifunctions in 123 Wiktionary-Sprachversionen verfügbar * {{Status updates|2025-09-12}}: Mehr als 3000 Funktionen auf Wikifunctions * {{Status updates|2025-09-07}}: Funktionsaufrufe aus einer Wikipedia in eine andere kopieren * {{Status updates|2025-08-29}}: Zugriff auf Wikidata-Datenobjekte über eingebettete Funktionsaufrufe nun möglich; Wikifunctions in 65 Wiktionarys verfügbar * {{Status updates|2025-08-22}}: Aufzeichnung der Wikimania-Sitzung: Wikifunctions kommt bald in ein Wiki in deiner Nähe! * {{Status updates|2025-08-01}}: Die Wikimania 2025 kommt bald! * {{Status updates|2025-07-26}}: “Wikipedia ist eine Enzyklopädie”; Zwei Jahre Wikifunctions * {{Status updates|2025-07-19}}: Wikidata-basierte Aufzählungen sind da * {{Status updates|2025-07-10}}: Längenbeschränkungen für Bezeichnungen und Beschreibungen * {{Status updates|2025-07-04}}: Abdeckung von 1298 * {{Status updates|2025-06-27}}: Wie viele Personen werden benötigt, um eine Enzyklopädie zu schreiben? * {{Status updates|2025-06-21}}: Quartalsplanung für Juli-September 2025 * {{Status updates|2025-06-15}}: Ende der Konsultation über den Ort des Abstrakten Inhalts * {{Status updates|2025-06-06}}: Wo wird sich der Abstrakte Inhalt befinden? * {{Status updates|2025-05-29}}: Einführung in fünf Wiktionarys; Berechnung mit dem heutigen Datum * {{Status updates|2025-05-23}}: Laufende Konsultation über den Ort des Abstrakten Inhalts * {{Status updates|2025-05-15}}: Ort des Abstrakten Inhalts * {{Status updates|2025-05-09}}: Abstrakte Wikipedia und die Wikimedia KI-Strategie * {{Status updates|2025-04-30}}: Abstrakte Wikipedia ist Finalist bei MacArthur 100&Change * {{Status updates|2025-04-25}}: Willkommen, Gregory! * {{Status updates|2025-04-16}}: Wikifunctions integriert in Dagbani - und Wikifunctions; und das Osterdatum * {{Status updates|2025-04-11}}: Rückblick auf das Quartal * {{Status updates|2025-04-05}}: Vierteljährliche Planung für April–Juni 2025; Wir suchen nach einem Leitenden Produktmanager * {{Status updates|2025-03-28}}: Es ist Zeit * {{Status updates|2025-03-20}}: Auf Wikidata basierende einfache Aufzählungen * {{Status updates|2025-03-15}}: Anstehendes NLG-Treffen, letzte Änderungen an der Software * {{Status updates|2025-03-07}}: Letzte Änderungen an der Software, Aufzeichnung des Freiwilligentreffens und Vorträge in London * {{Status updates|2025-02-26}}: Von Dingen zu Worten * {{Status updates|2025-02-19}}: Ein Vorschlag für Typen je Sprache und Wortart * {{Status updates|2025-02-13}}: Die Welt begrenzen * {{Status updates|2025-02-06}}: Einladung zur Natural Language Generation Special Interest Group * {{Status updates|2025-01-29}}: Mit 2000 Funktionen ins neue Jahr: Zeit für Statistiken * {{Status updates|2025-01-22}}: Willkommen, David! Empfehlungen zu Namenskonventionen * {{Status updates|2025-01-15}}: Einen frohen Wikipedia-Tag! Vierteljährliche Planung === 2024 === * {{Status updates|2024-12-19}}: Funktion der Woche: Alter; Intro für Artikel über Jahre; Neuer Typ: Gleitkommazahl * {{Status updates|2024-12-12}}: Skizzieren eines Pfads zur Abstrakten Wikipedia; Offsite des Teams in Lissabon; und vieles mehr * {{Status updates|2024-11-27}}: WordGraph-Veröffentlichung; Neue Spezialseite: Funktionen nach Tests auflisten; neuer Typ für Tag des Jahres und viel mehr * {{Status updates|2024-11-21}}: Neue Spezialseite für fehlende Bezeichnungen, neuer Typ für Gregorianische Jahre und viel mehr * {{Status updates|2024-11-13}}: Neuer Typ: rationale Zahl; Dokumentation zu Wikidata-basierten Typen; und mehr * {{Status updates|2024-11-07}}: Der Traum einer universellen Sprache * {{Status updates|2024-11-01}}: Neuschreiben des Back-Ends * {{Status updates|2024-10-25}}: Unser Ziel für dieses Quartal: Kongruenz * {{Status updates|2024-10-17}}: Wie könnte abstrakter Inhalt aussehen? * {{Status updates|2024-10-11}}: Wikidata-Lexeme sind in Wikifunctions bald verfügbar * {{Status updates|2024-10-02}}: Fokusthema: Essen * {{Status updates|2024-09-26}}: Vierteljährliche Planung für Oktober bis Dezember 2024; Präsentation bei Celtic Knot morgen * {{Status updates|2024-09-20}}: Einführung von Fokus-Themenbereichen * {{Status updates|2024-09-13}}: Die Dagbani-Wikipedia wird unser erstes Wiki für die Integration von Wikifunctions sein * {{Status updates|2024-09-06}}: Freiwilligentreffen und andere Neuigkeiten * {{Status updates|2024-08-29}}: Beschränkungen für die Länge von Namen und Beschreibungen * {{Status updates|2024-08-23}}: WasmEdge, jetzt 300 ms weniger langsam * {{Status updates|2024-08-16}}: Ausgabe zur Wikimania 2024 * {{Status updates|2024-08-02}}: Überarbeitung unseres 'Info'-Widgets * {{Status updates|2024-07-26}}: Bald findet die Wikimania 2024 statt! * {{Status updates|2024-07-18}}: Forschungsbericht zur Integration von Wikifunctions in Wikipedia * {{Status updates|2024-07-10}}: Typen-Vorschläge für den Zugriff auf Lexeme * {{Status updates|2024-07-03}}: Vierteljährliche Planung * {{Status updates|2024-06-26}}: Willkommen, Daphne! * {{Status updates|2024-06-20}}: Neuer Typ: Integer * {{Status updates|2024-06-13}}: Neuer Typ: Monate des Igbo-Kalenders * {{Status updates|2024-06-06}}: Neuer Typ: Zeichen * {{Status updates|2024-05-30}}: Ein einziger Singular oder eine Vielzahl von Pluralen? * {{Status updates|2024-05-22}}: Neuer Typ: Monate des Gregorianischen Kalenders * {{Status updates|2024-05-15}}: Aufruf zur Erstellung von Funktionen: Ausschreibung von Zahlen! * {{Status updates|2024-05-10}}: Flaggschifftyp für Aufzählungen: Monate des Gregorianischen Kalenders * {{Status updates|2024-05-03}}: Teamtreffen und Quartalsplan * {{Status updates|2024-04-19}}: Willkommen, Sharvani! * {{Status updates|2024-04-11}}: Neue API zum Aufrufen von Wikifunctions und Feier von 1000 Funktionen * {{Status updates|2024-04-03}}: Produktneuigkeiten auf Diff und anstehende API-Verbesserungen * {{Status updates|2024-03-28}}: Das Erstellen von Tests ist nun viel einfacher! * {{Status updates|2024-03-21}}: Auf dem Weg zur Internationalisierung von Zahlen * {{Status updates|2024-03-13}}: Zur Identität * {{Status updates|2024-03-07}}: Einführung unseres zweiten neuen Typs: Natürliche Zahlen * {{Status updates|2024-02-28}}: Typenvorschlag für natürliche Zahlen * {{Status updates|2024-02-22}}: Aktualisierung des Funktionsmodells * {{Status updates|2024-02-14}}: Reparatur-Woche * {{Status updates|2024-02-07}}: Vierteljährliche Planung. Danke, Nick! Funktion der Woche: ist Permutation * {{Status updates|2024-02-01}}: Der Igbo-Imperativ! <span id="Before_February_2024"></span> === Vor Februar 2024 === Alle Updates aus dieser Zeit sind [[:m:Special:MyLanguage/Abstract Wikipedia/Updates|im Meta-Wiki verfügbar]]. [[Category:Status updates{{#translation:}}| ]] 1umlp2inbk3ux5g9lqvdpzvji7ppcdj Z15886 0 29648 334449 200795 2026-10-29T16:48:33Z ReXLer 39813 changed 334449 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z15886" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z803", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": "Hello, world!" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z19084", "Z19084K2": "Z6" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Z1K1 for string is Z6" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Wert von \"Hello, world!\" ist Zeichenkette" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "reproduces https://phabricator.wikimedia.org/T363623" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "\"Hello, world!\" ist eine Zeichenkette" } ] } } 3ighj7m60mmfauzii0q07jqkdd9bhk7 Z15905 0 29675 334450 201460 2026-10-29T16:56:21Z ReXLer 39813 334450 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z15905" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z803", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": "Z15903" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z19084", "Z19084K2": "Z20" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "type of Test case is Z20" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Typ von Test ist Testfall" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "**should return** True because the Z1K1/type of a Z20/test case is equal to the Z4K1/identity of its type: Z20 (see https://phabricator.wikimedia.org/T363623)" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "gibt wahr aus, da der Typ eines Tests der Identität dieses Typs entspricht" } ] } } l9j2o2a68s1a74vc70sgipnpaqhglay 334451 334450 2026-10-29T16:57:08Z ReXLer 39813 Restored revision 201460 by [[Special:Contributions/Ameisenigel|Ameisenigel]] ([[User talk:Ameisenigel|talk]]) (Twinkle) 334451 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z15905" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z803", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": "Z15903" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z13052", "Z13052K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z4K1" }, "Z803K2": "Z20" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "type of Test case is Z20" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Typ von Test ist Testfall" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "**should return** True because the Z1K1/type of a Z20/test case is equal to the Z4K1/identity of its type: Z20 (see https://phabricator.wikimedia.org/T363623)" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "gibt wahr aus, da der Typ eines Tests der Identität dieses Typs entspricht" } ] } } mjdvgnvodae33tc8ngdo1exy3lnfmo3 Z16740 0 31613 334678 222728 2026-10-30T10:58:22Z Mengsky 103320 334678 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z16740" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z16728", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z16728", "Z16728K1": { "Z1K1": "Z16659", "Z16659K1": "Z16662" }, "Z16728K2": { "Z1K1": "Z16659", "Z16659K1": "Z16662" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z16667", "Z16667K2": { "Z1K1": "Z16659", "Z16659K1": "Z16660" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "negative * negative = positive" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "négatif × négatif = \"positif\"" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "negativ × negativ = positiv" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "negatif dikali negatif = positif" }, { "Z1K1": "Z11", "Z11K1": "Z1362", "Z11K2": "mines ping mines dadi ples" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "perkalian dua bilangan bernilai negatif menghasilkan bilangan bernilai positif" }, { "Z1K1": "Z11", "Z11K1": "Z1362", "Z11K2": "ping pingan wilangan mines ngasilke wilangan ples" } ] } } 879l4inst5qa3zycvv8zfscufeqjkpz Z17418 0 32878 334683 236012 2026-10-30T11:08:35Z Mengsky 103320 334683 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z17418" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z17414", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z17414( Z17414K1, Z17414K2 ) {\n\treturn Z17414K1 === Z17414K2;\n}" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "using JS identity" }, { "Z1K1": "Z11", "Z11K1": "Z1014", "Z11K2": "iji njirimara JS" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "est-ce le même jour de la semaine ?, en JavaScript" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "selber Wochentag in JavaScript" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menggunakan identitas javascript" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 9xxireukcqeb8pvuh63a5nelb3uz227 Z18546 0 35719 334642 283308 2026-10-30T09:50:55Z Mengsky 103320 334642 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z18546" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z18546K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "number" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "nombre" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "bilangan" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "numero" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Zahl" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z18560", "Z18562", "Z26826", "Z26827" ], "Z8K4": [ "Z14", "Z18554" ], "Z8K5": "Z18546" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Indonesian cardinal" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "cardinal en indonésien" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "bilangan dalam kata bahasa Indonesia" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "cardinale in Indonesiano" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Indonesische Kardinalzahl" }, { "Z1K1": "Z11", "Z11K1": "Z1471", "Z11K2": "wilangan dina kecap basa Indonésia" }, { "Z1K1": "Z11", "Z11K1": "Z1362", "Z11K2": "angka ing bahasa Indonesia" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1787", "Z31K2": [ "Z6", "cardinale Indonesiano" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "expresses a natural number in Indonesian words" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "exprime un nombre entier en toutes lettres en indonésien" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "mengembalikan bilangan asli dengan kata bahasa Indonesia" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "Esprime un numero naturale in parole in Indonesiano" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "drückt eine natürliche Zahl in indonesischen Worten aus" }, { "Z1K1": "Z11", "Z11K1": "Z1471", "Z11K2": "ngabalikeun wilangan asli jeung kecap basa Indonésia" }, { "Z1K1": "Z11", "Z11K1": "Z1362", "Z11K2": "Piye ngunekke utowo nulis wilangan ing bahasa Indonesia" } ] } } b9a3hymjs67mkwxw1inb251hzag7882 Wikifunctions:Catalogue/Natural language operations/Global language functions 4 41926 334422 331206 2026-10-29T14:22:59Z 鈴音雨 101019 Add Z48103 (noun phrase with a quantity) with its default Z48106 under Phrases, and Z48107 (item/quantity pair check) under Clauses 334422 wikitext text/x-wiki See also the [[Wikifunctions:Catalogue/Wikidata operations|Wikidata operations]], particularly for Lexemes, Senses, and Forms. == Sentence and fragment generation == {{main|WF:NLG functions}} {{see also|WF:Abstract Wikipedia/2025 fragment experiments}} * {{Z+|Z26039}} * {{Z+|Z26095}} * {{Z+|Z26627}} * {{Z+|Z28803}} * {{Z+|Z29743}} * {{Z+|Z31405}} * {{Z+|Z32321}} * {{Z+|Z32208}} ** {{Z+|Z32204}} * {{Z+|Z32229}} * {{Z+|Z32283}} ** {{Z+|Z32308}} * {{Z+|Z32276}} * {{Z+|Z32297}} * {{Z+|Z32326}} * {{Z+|Z39770}} ** {{Z+|Z39772}} * {{Z+|Z44088}} ** {{Z+|Z44085}} * {{Z+|Z44170}} ** {{Z+|Z44158}} * {{Z+|Z44230}} * {{Z+|Z44350}} * {{Z+|Z44472}} * {{Z+|Z44491}} * {{Z+|Z44692}} * {{Z+|Z42725}} ** {{Z+|Z42722}} * {{Z+|Z42756}} ** {{Z+|Z42919}} *** {{Z+|Z42753}} * {{Z+|Z42880}} ** {{Z+|Z42903}} *** {{Z+|Z42867}} * {{Z+|Z42945}} ** {{Z+|Z42934}} * {{Z+|Z42972}} * {{Z+|Z43163}} * {{Z+|Z43187}} * {{Z+|Z43220}} ** {{Z+|Z43217}} * {{Z+|Z43298}} ** {{Z+|Z43509}} * {{Z+|Z43328}} ** {{Z+|Z43494}} ** {{Z+|Z43530}} === Cross-lingual sentence creation === * {{Z+|Z22664}} * {{Z+|Z26955}} * {{Z+|Z27137}} * {{Z+|Z27885}} ** {{Z+|Z30159}} * {{Z+|Z28254}} === Helpers === ;Punctuation * {{Z+|Z43545}} ** {{Z+|Z43544}} * {{Z+|Z44357}} ;Semantic roles * {{Z+|Z44029}} ;Groups of things * {{Z+|Z44142}} ;Words for items * {{Z+|Z44217}} * {{Z+|Z44443}} ;Clauses * {{Z+|Z44291}} * {{Z+|Z46870}} ** {{Z+|Z46869}} * {{Z+|Z44331}} * {{Z+|Z44328}} ** {{Z+|Z44326}} * {{Z+|Z44633}} * {{Z+|Z44634}} * {{Z+|Z48107}} * {{Z+|Z44688}} ;Statements * {{Z+|Z44480}} ;Phrases * {{Z+|Z44643}} ** {{Z+|Z44644}} * {{Z+|Z44639}} ** {{Z+|Z44640}} * {{Z+|Z44641}} * {{Z+|Z45336}} ** {{Z+|Z45406}} ** {{Z+|Z45408}} ** {{Z+|Z45410}} * {{Z+|Z45338}} ** {{Z+|Z45413}} ** {{Z+|Z45415}} ** {{Z+|Z45417}} * {{Z+|Z45387}} ** {{Z+|Z45420}} ** {{Z+|Z45422}} ** {{Z+|Z45424}} * {{Z+|Z48103}} ** {{Z+|Z48106}} * {{Z+|Z45402}} ** {{Z+|Z45427}} ** {{Z+|Z45429}} ** {{Z+|Z45431}} * {{Z+|Z45400}} ** {{Z+|Z45575}} ;Genders (words) * {{z+|Z26676}} * {{z+|Z30539}} * {{z+|Z28089}} * {{z+|Z26745}} * {{z+|Z23067}} * {{z+|Z26364}} * {{z+|Z25754}} * {{z+|Z20616}} ;Genders (persons) * {{z+|Z44615}} * {{z+|Z44619}} == Numbers == * {{Z+|Z16437}} * {{Z+|Z26829}} == Natural language == {{Help:Type deconstruction table/Natural language}} * {{Z+|Z860}} ** {{Z+|Z24097}} ** {{Z+|Z34854}} * {{Z+|Z14329}} ** {{Z+|Z28282}} ** {{Z+|Z25974}} * {{Z+|Z29958}} ** {{Z+|Z29649}} * {{Z+|Z14326}} * {{Z+|Z14321}} ** {{Z+|Z29750}} * {{Z+|Z33738}} * {{Z+|Z29654}} * {{Z+|Z30043}} === Writing systems === * {{Z+|Z34854}} * {{Z+|Z34993}} ** {{Z+|Z38395}} *** {{Z+|Z25974}} * {{Z+|Z39957}} == Monolingual text and stringset == {{Help:Type deconstruction table/Monolingual text}} {{Help:Type deconstruction table/Monolingual stringset}} * {{Z+|Z14392}} * {{Z+|Z12877}} ** {{Z+|Z33175}} ** {{Z+|Z14334}} * {{Z+|Z14396}} ** {{Z+|Z21583}} ** {{Z+|Z29749}} * {{Z+|Z19254}} * {{Z+|Z19279}} * {{Z+|Z23236}} * {{Z+|Z26107}} ** {{Z+|Z861}} * {{Z+|Z34663}} == Multilingual text and stringset == {{Help:Type deconstruction table/Multilingual text}} {{Help:Type deconstruction table/Multilingual stringset}} * {{Z+|Z19312}} * {{Z+|Z19254}} * {{Z+|Z19272}} * {{Z+|Z19279}} * {{Z+|Z23236}} * {{Z+|Z27893}} ** {{Z+|Z27905}} == Select a language and language configurator == {{Help:Type deconstruction table/Per lang config}} {{Help:Type deconstruction table/Per lang config branch}} * {{Z+|Z14310}} * {{Z+|Z14311}} * {{Z+|Z14548}} * {{Z+|Z23156}} * {{Z+|Z23159}} * {{Z+|Z23143}} * {{Z+|Z45392}} == Language functions for table (experimental) == Maybe will be replaced or augmented with [[Wikifunctions:Catalogue/Natural language operations/Global language functions#Language functions for syntactic functions|syntactic phrase functions]]. === Syntactic tables === Regarding the Type {{Z+|Z36462}} * {{Z+|Z36608}} * ''(not working 100%)'' {{Z+|Z36717}} * {{Z+|Z36613}} * {{Z+|Z36616}} * {{Z+|Z36636}} * {{Z+|Z36639}} * {{Z+|Z36644}} * {{Z+|Z36723}} * {{Z+|Z36727}} * {{Z+|Z36650}} * {{Z+|Z36652}} * {{Z+|Z36733}} * {{Z+|Z36737}} * {{Z+|Z36743}} * {{Z+|Z36747}} * {{Z+|Z36823}} * {{Z+|Z36820}} * {{Z+|Z36827}} * {{Z+|Z36957}} * {{Z+|Z37029}} * {{Z+|Z37510}} * Agree options === Syntactic options === Regarding the Type {{Z+|Z36463}} * {{Z+|Z36656}} * {{Z+|Z36658}} * {{Z+|Z36660}} * ''(not working 100%)'' {{Z+|Z36670}} * {{Z+|Z36662}} * {{Z+|Z36666}} * {{Z+|Z36816}} * {{Z+|Z36959}} * {{Z+|Z37512}} * {{Z+|Z37004}} === Abstract functions === * {{Z+|Z37089}} * {{Z+|Z37115}} * {{Z+|Z37120}} * {{Z+|Z37126}} * {{Z+|Z37140}} * {{Z+|Z37146}} * {{Z+|Z37150}} * {{Z+|Z37507}} ==== returning HTML ==== * {{Z+|Z37126}} * {{Z+|Z37143}} == Language functions for syntactic functions (experimental) == === Syntactic phrase function === Type: {{Z+|Z39358}} * {{Z+|Z39360}} * {{Z+|Z39385}} * {{Z+|Z39362}} ** {{Z+|Z39395}} * {{Z+|Z39368}} ** {{Z+|Z39399}} * {{Z+|Z39371}} ** {{Z+|Z39403}} ** {{Z+|Z39411}} ** {{Z+|Z41003}} * {{Z+|Z39375}} ** {{Z+|Z40397}} ** {{Z+|Z41030}} ** {{Z+|Z41033}} ** {{Z+|Z41036}} ** {{Z+|Z42101}} * {{Z+|Z41039}} * Example values ** {{Z|Z39363}} ** {{Z|Z39365}} === Feature === Type: {{Z+|Z39328}} * {{Z+|Z39350}} * {{Z+|Z39342}} ** {{Z+|Z39406}} * {{Z+|Z39346}} * {{Z+|Z39351}} * {{Z+|Z41006}} * {{Z+|Z39413}} === abstract builders === * {{Z+|Z40561}} * {{Z+|Z41334}} * {{Z+|Z40596}} * {{Z+|Z41334}} * {{Z+|Z41411}} * {{Z+|Z40650}} * {{Z+|Z40656}} * {{Z+|Z41148}} === supporting functions === * {{Z+|Z40459}} * {{Z+|Z39425}} === HTML-producing === * {{Z+|Z40471}} * {{Z+|Z40659}} * {{Z+|Z40662}} [[Category:Lists of functions]] k4z3sdftytq77z4uak4slz7oj27x8ne Wikifunctions:Catalogue/Natural language operations/English 4 41934 334424 331268 2026-10-29T14:23:33Z 鈴音雨 101019 Add Z48105 (English noun phrase with a quantity) 334424 wikitext text/x-wiki ==Sentence and fragment generation== ===General-purpose=== * {{Z+|Z26088}} * {{Z+|Z23410}} * {{Z+|Z21765}} * {{Z+|Z26570}} * {{Z+|Z32199}} * {{Z+|Z32230}} * {{Z+|Z32244}} * {{Z+|Z32249}} * {{Z+|Z44687}} * {{Z+|Z44691}} ** {{Z+|Z46890}} ===Special use cases=== * {{Z+|Z20597}} * {{Z+|Z28784}} * {{Z+|Z41682}} * {{Z+|Z41707}} * {{Z+|Z42078}} * {{Z+|Z42080}} * {{Z+|Z42082}} * {{Z+|Z42100}} * {{Z+|Z42208}} * {{Z+|Z42422}} * {{Z+|Z42438}} * {{Z+|Z42970}} * {{Z+|Z43162}} * {{Z+|Z43186}} * {{Z+|Z43281}} * {{Z+|Z43216}} * {{Z+|Z43219}} * {{Z+|Z43327}} ** {{Z+|Z43493}} *** {{Z+|Z43529}} * {{Z+|Z43297}} ** {{Z+|Z43508}} * {{Z+|Z43522}} * {{Z+|Z43543}} * {{Z+|Z42519}} * {{Z+|Z42520}} ** {{Z+|Z44581}} ** {{Z+|Z44281}} * {{Z+|Z42573}} ** {{Z+|Z44361}} * {{Z+|Z42576}} * {{Z+|Z42600}} * {{Z+|Z42603}} * {{Z+|Z42721}} * {{Z+|Z42724}} * {{Z+|Z42752}} * {{Z+|Z42755}} ** {{Z+|Z42917}} * {{Z+|Z42932}} * {{Z+|Z42943}} * {{Z+|Z42843}} * {{Z+|Z42866}} * {{Z+|Z42879}} ** {{Z+|Z42902}} * {{Z+|Z44021}} ** {{Z+|Z44062}} *** {{Z+|Z44353}} * {{Z+|Z44017}} ** {{Z+|Z44055}} ** {{Z+|Z44046}} * {{Z+|Z44167}} ** {{Z+|Z44153}} ** {{Z+|Z44145}} * {{Z+|Z44226}} ** {{Z+|Z44233}} * {{Z+|Z44374}} * {{Z+|Z44486}} ** {{Z+|Z44500}} ** {{Z+|Z44632}} ** {{Z+|Z44637}} *** {{Z+|Z44630}} ** {{Z+|Z45402}} ** {{Z+|Z48105}} * {{Z+|Z44346}} ** {{Z+|Z44477}} ** {{Z+|Z44294}} ** {{Z+|Z44299}} ** {{Z+|Z44334}} *** {{Z+|Z44312}} ==Morphology== ===Nouns and pronouns=== * {{Z+|Z11089}} * {{Z+|Z11218}} * {{Z+|Z22490}} ====Possessives==== * {{Z+|Z11302}} * {{Z+|Z19125}} ===Verbs=== * {{Z+|Z24676}} * {{Z+|Z24687}} * {{Z+|Z13177}} * {{Z+|Z13087}} * {{Z+|Z44058}} ** {{Z+|Z44051}} * {{Z+|Z44212}} * {{Z+|Z44322}} ===Adjectives and adverbs=== * {{Z+|Z11795}} * {{Z+|Z12203}} ** {{Z+|Z29851}} *** {{Z+|Z29852}} * {{Z+|Z44138}} ===Articles=== * {{Z+|Z43698}} ** {{Z+|Z43697}} ** {{Z+|Z43699}} * {{Z+|Z43834}} * {{Z+|Z44035}} ** {{Z+|Z44065}} * {{Z+|Z21739}} ** {{Z+|Z32314}} * {{Z+|Z32935}} * {{Z+|Z32929}} * {{Z+|Z32645}} ===Word derivation=== * {{Z+|Z11390}} * {{Z+|Z11646}} * {{Z+|Z13280}} * {{Z+|Z13262}} ===Other=== * {{Z+|Z13254}} * {{Z+|Z44635}} * {{Z+|Z44686}} ==Numbers== * {{Z+|Z13587}} * {{Z+|Z14526}} * {{Z+|Z13596}} * {{Z+|Z14726}} * {{Z+|Z14531}} * {{Z+|Z14523}} ==Other== * {{Z+|Z23827}} * {{Z+|Z18852}} * {{Z+|Z18859}} == Function usage on Abstract Wikipedia == See function usage on Abstract Wikipedia on this [https://abstract-data.toolforge.org/?lang=en tool for en]. ==Configurations== {{LanguageConfigurations|Language=en|Language2=en-au|Language3=en-gb|Language4=en-us}} == Syntactic tables (experimental) == For more about Syntactic tables see the [[Wikifunctions:Catalogue/Natural language operations/Global language functions#Language functions for table|language independent functions for tables]]. These are the ones specific for English. Syntactic tables are experimental and may be deprecated entirely, especially in favor of syntactic functions. === Nouns === * Example noun: {{Z|Z36617}} * {{Z+|Z36607}} * {{Z+|Z36754}} * {{Z+|Z36759}} * {{Z+|Z36762}} * {{Z+|Z36766}} * {{Z+|Z36770}} * {{Z+|Z36969}} * {{Z+|Z37080}} === Determiners === * specific determiners ** {{Z+|Z36781}} ** {{Z+|Z36782}} ** {{Z+|Z36783}} ** {{Z+|Z36784}} ** {{Z+|Z36791}} * {{Z+|Z36785}} * {{Z+|Z36792}} === Noun phrase === * {{Z+|Z36798}} * {{Z+|Z36925}} * {{Z+|Z36935}} === Adjective === * example adjective: {{Z|Z36968}} * {{Z+|Z36972}} * {{Z+|Z36975}} * {{Z+|Z36978}} * {{Z+|Z37076}} === Sentence === * {{Z+|Z37083}} * {{Z+|Z37086}} * {{Z+|Z36939}} * {{Z+|Z36953}} == Syntactic phrase functions == === Functions for building anonymous functions === === nouns === * {{Z+|Z39425}} * {{Z+|Z39430}} * {{Z+|Z39437}} * {{Z+|Z40299}} * {{Z+|Z40335}} * {{Z+|Z40344}} * {{Z+|Z40374}} * {{Z+|Z40378}} === determiner === * {{Z+|Z40382}} * {{Z+|Z40389}} * {{Z+|Z40391}} * {{Z+|Z40421}} * {{Z+|Z40419}} * {{Z+|Z40423}} * {{Z+|Z40427}} === adjective === * {{Z+|Z41157}} * {{Z+|Z41204}} * {{Z+|Z41251}} * {{Z+|Z41304}} * {{Z+|Z41266}} * {{Z+|Z41311}} * {{Z+|Z41322}} * {{Z+|Z41392}} === noun phrase === * {{Z+|Z40395}} * {{Z+|Z40457}} === clause === * {{Z+|Z40440}} * {{Z+|Z40450}} * {{Z+|Z40505}} * {{Z+|Z40550}} [[Category:Lists of functions]] [[Category:English]] endgn3k6fi9ehv23jy7zr1hgwz2w3qb Wikifunctions:Catalogue/Natural language operations/Japanese 4 41942 334423 327124 2026-10-29T14:23:17Z 鈴音雨 101019 Add Z48104 (Japanese noun phrase with a quantity) 334423 wikitext text/x-wiki ==Sentence and fragment generation== * {{Z+|Z32355}} * {{Z+|Z32994}} * {{Z+|Z32989}} * {{Z+|Z32967}} * {{Z+|Z39846}} * {{Z+|Z39894}} * {{Z+|Z39914}} * {{Z+|Z39920}} * {{Z+|Z40019}} * {{Z+|Z40024}} * {{Z+|Z40048}} * {{Z+|Z40094}} * {{Z+|Z40206}} * {{Z+|Z40268}} * {{Z+|Z40287}} * {{Z+|Z40298}} * {{Z+|Z40769}} * {{Z+|Z40789}} * {{Z+|Z40920}} * {{Z+|Z40926}} * {{Z+|Z41657}} * {{Z+|Z41673}} * {{Z+|Z41679}} * {{Z+|Z41701}} * {{Z+|Z41864}} * {{Z+|Z41867}} * {{Z+|Z41982}} * {{Z+|Z42096}} * {{Z+|Z42158}} * {{Z+|Z42225}} * {{Z+|Z42315}} * {{Z+|Z42968}} * {{Z+|Z43161}} * {{Z+|Z43185}} * {{Z+|Z43281}} * {{Z+|Z43215}} * {{Z+|Z43218}} * {{Z+|Z43326}} ** {{Z+|Z43492}} *** {{Z+|Z43528}} * {{Z+|Z43542}} * {{Z+|Z43296}} ** {{Z+|Z43507}} * {{Z+|Z43213}} * {{Z+|Z43214}} * {{Z+|Z42316}} * {{Z+|Z42479}} * {{Z+|Z42480}} ** {{Z+|Z44577}} * {{Z+|Z42572}} * {{Z+|Z42575}} * {{Z+|Z42599}} * {{Z+|Z42602}} * {{Z+|Z42720}} * {{Z+|Z42723}} * {{Z+|Z42751}} * {{Z+|Z42754}} ** {{Z+|Z42915}} * {{Z+|Z42930}} * {{Z+|Z42941}} * {{Z+|Z42828}} * {{Z+|Z42837}} * {{Z+|Z42865}} * {{Z+|Z42878}} ** {{Z+|Z42901}} * {{Z+|Z43964}} ** {{Z+|Z43994}} * {{Z+|Z44164}} ** {{Z+|Z44149}} *** {{Z+|Z44132}} **** {{Z+|Z44127}} * {{Z+|Z44222}} * {{Z+|Z44307}} * {{Z+|Z44483}} ** {{Z+|Z44497}} ** {{Z+|Z44631}} ** {{Z+|Z44636}} ** {{Z+|Z44638}} * {{Z+|Z44337}} ** {{Z+|Z44315}} ** {{Z+|Z44303}} ** {{Z+|Z44286}} ** {{Z+|Z45402}} ** {{Z+|Z48104}} * {{Z+|Z44687}} * {{Z+|Z44690}} ==Labels, lexemes, and list formatting== * {{Z+|Z39886}} * {{Z+|Z39896}} * {{Z+|Z39898}} * {{Z+|Z39899}} * {{Z+|Z43959}} * {{Z+|Z43982}} * {{Z+|Z44206}} * {{Z+|Z44635}} * {{Z+|Z44686}} ==Dates, quantities, and coordinates== * {{Z+|Z39859}} * {{Z+|Z39861}} * {{Z+|Z40056}} * {{Z+|Z40214}} * {{Z+|Z40795}} * {{Z+|Z41164}} * {{Z+|Z41192}} * {{Z+|Z41292}} * {{Z+|Z41314}} ==Writing system== * {{Z+|Z10878}} * {{Z+|Z10883}} * {{Z+|Z10927}} * {{Z+|Z45390}} == Function usage on Abstract Wikipedia == See function usage on Abstract Wikipedia on this [https://abstract-data.toolforge.org/?lang=ja tool for ja]. ==Configurations== {{LanguageConfigurations|Language=ja}} [[Category:Lists of functions]] [[Category:Japanese]] qx0cyxph2h4679c4v7bh81ce8s66que Z20381 0 43760 334474 245721 2026-10-29T20:07:50Z Ameisenigel 44 de 334474 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20381" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20181", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20181", "Z20181K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1300" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z42" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "1300 AD a Julian leap, but not proleptic Gregorian" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "1300 ≠ Gregoriaans schrikkeljaar" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "1300 ist kein Schaltjahr" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "see https://en.wikipedia.org/wiki/1300" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "1300 ist ein julianisches Schaltjahr, nicht im proleptischen gregorianischen Kalender" } ] } } gmzkl7f71ymnqekl3s0b3flekri3nb4 Z20382 0 43761 334475 245726 2026-10-29T20:15:15Z Ameisenigel 44 de 334475 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20382" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20181", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20181", "Z20181K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "4000" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "4000 AD leap, Herschel's proposal not yet accepted" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "4000 = Gregoriaans schrikkeljaar" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "4000 ist Schaltjahr" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "https://en.wikipedia.org/wiki/John_Herschel#Other_aspects_of_Herschel's_career" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Vorschlag von Herschel wurde noch nicht akzeptiert" } ] } } irzrhepfz3twre1it33oy0ifzx1x8a8 Z20383 0 43762 334476 163136 2026-10-29T20:15:45Z Ameisenigel 44 de 334476 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20383" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20198", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20198", "Z20198K1": "0 AD" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z20166", "Z20166K2": { "Z1K1": "Z20159", "Z20159K1": "Z17815", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "\"0 AD\" gives 1 BC" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "\"0 AD\" donne 1 av. J.-C." }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "0 AD ist 1 v. Chr." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } d0do5qk79thjxtrh95dxkht0n29p3rg Z20384 0 43763 334477 163131 2026-10-29T20:16:29Z Ameisenigel 44 de 334477 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20384" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20198", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20198", "Z20198K1": "-512 BC" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z20166", "Z20166K2": { "Z1K1": "Z20159", "Z20159K1": "Z17815", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "512" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "\"-512 BC\" gives 512 BC?" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "\"-512 BC\" donne 512 av. J.-C." }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "-512 BC ist 512 v. Chr." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "documenting current behaviour, feel free to change" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "-512 BC renvoie effectivement 512 av. J.-C." }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "aktuelles Verhalten der Funktion" } ] } } opebfpqd1gmw7mae9x488pbe5tw3jg2 Z20388 0 43767 334478 203103 2026-10-29T20:20:10Z Ameisenigel 44 de 334478 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20388" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z20342", "Z17K2": "Z20388K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "date" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "giorno" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Datum" } ] } } ], "Z8K2": "Z13518", "Z8K3": [ "Z20", "Z20390" ], "Z8K4": [ "Z14", "Z20389" ], "Z8K5": "Z20388" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "day of month from date" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "giorno del mese da giorno di anno romano" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Tag aus Datum" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1787", "Z31K2": [ "Z6", "giorno da data", "giorno del mese da data di anno romano" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "returns the day of the month in day of Roman year" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "Restituisce il giorno del mese contenuto nel giorno dell'anno romano" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "gibt den Tag des Monats aus dem Datum im Römischen Kalender aus" } ] } } b07ql3umxx0zcfwund886t9ir1ic7pm Z20389 0 43768 334479 141060 2026-10-29T20:20:29Z Ameisenigel 44 de 334479 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20389" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z20388", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20342K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z20388K1" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "day from key, composition" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Tag aus Datum als Komposition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } mmef7bkb6drcvlyigb3if9ys2tnc7ab Z20390 0 43769 334480 141062 2026-10-29T20:21:32Z Ameisenigel 44 de 334480 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20390" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20388", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20388", "Z20388K1": { "Z1K1": "Z20342", "Z20342K1": "Z16112", "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "25" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z13522", "Z13522K2": { "Z1K1": "Z13518", "Z13518K1": "25" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "25 December is the 25th day of the month" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "25. Dezember ist 25" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } qlijvws813ac1gj8ervkhf8dvf6vlfi Z20756 0 45254 334647 271240 2026-10-30T10:24:43Z Mengsky 103320 334647 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20756" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z20420", "Z17K2": "Z20756K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "from" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "depuis" }, { "Z1K1": "Z11", "Z11K1": "Z1061", "Z11K2": "gregoriansk dato" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "från" }, { "Z1K1": "Z11", "Z11K1": "Z1332", "Z11K2": "від" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "von" }, { "Z1K1": "Z11", "Z11K1": "Z1664", "Z11K2": "de la" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "যে তারিখ থেকে শুরু" }, { "Z1K1": "Z11", "Z11K1": "Z1709", "Z11K2": "no" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "dari" }, { "Z1K1": "Z11", "Z11K1": "Z1643", "Z11K2": "시작" }, { "Z1K1": "Z11", "Z11K1": "Z1001", "Z11K2": "من" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "da" }, { "Z1K1": "Z11", "Z11K1": "Z1012", "Z11K2": "തുടക്കം" }, { "Z1K1": "Z11", "Z11K1": "Z1051", "Z11K2": "alku" }, { "Z1K1": "Z11", "Z11K1": "Z1789", "Z11K2": "des de" }, { "Z1K1": "Z11", "Z11K1": "Z1003", "Z11K2": "de" }, { "Z1K1": "Z11", "Z11K1": "Z1973", "Z11K2": "төрүүрэ" }, { "Z1K1": "Z11", "Z11K1": "Z1645", "Z11K2": "起始日期" }, { "Z1K1": "Z11", "Z11K1": "Z1186", "Z11K2": "מן" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "van" }, { "Z1K1": "Z11", "Z11K1": "Z1403", "Z11K2": "ex" }, { "Z1K1": "Z11", "Z11K1": "Z1237", "Z11K2": "Başlangıç" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "から" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z20420", "Z17K2": "Z20756K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "to" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "jusque" }, { "Z1K1": "Z11", "Z11K1": "Z1061", "Z11K2": "gregoriansk dato" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "till" }, { "Z1K1": "Z11", "Z11K1": "Z1332", "Z11K2": "до" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "bis" }, { "Z1K1": "Z11", "Z11K1": "Z1664", "Z11K2": "la" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "যে তারিখ পর্যন্ত" }, { "Z1K1": "Z11", "Z11K1": "Z1709", "Z11K2": "līdz" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "sampai" }, { "Z1K1": "Z11", "Z11K1": "Z1643", "Z11K2": "변환" }, { "Z1K1": "Z11", "Z11K1": "Z1001", "Z11K2": "إلى" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "a" }, { "Z1K1": "Z11", "Z11K1": "Z1012", "Z11K2": "അവസാനം" }, { "Z1K1": "Z11", "Z11K1": "Z1051", "Z11K2": "loppu" }, { "Z1K1": "Z11", "Z11K1": "Z1789", "Z11K2": "a" }, { "Z1K1": "Z11", "Z11K1": "Z1003", "Z11K2": "a" }, { "Z1K1": "Z11", "Z11K1": "Z1973", "Z11K2": "өлөрө" }, { "Z1K1": "Z11", "Z11K1": "Z1645", "Z11K2": "截止日期" }, { "Z1K1": "Z11", "Z11K1": "Z1186", "Z11K2": "עד" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "naar" }, { "Z1K1": "Z11", "Z11K1": "Z1403", "Z11K2": "ad" }, { "Z1K1": "Z11", "Z11K1": "Z1237", "Z11K2": "Bitiş" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "まで" } ] } } ], "Z8K2": "Z13518", "Z8K3": [ "Z20", "Z20796", "Z20797", "Z20798", "Z20799", "Z20800", "Z29378" ], "Z8K4": [ "Z14", "Z20804", "Z20900", "Z20764" ], "Z8K5": "Z20756" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "age" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "âge (en années)" }, { "Z1K1": "Z11", "Z11K1": "Z1061", "Z11K2": "alder" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "ålder" }, { "Z1K1": "Z11", "Z11K1": "Z1332", "Z11K2": "вік" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Alter" }, { "Z1K1": "Z11", "Z11K1": "Z1664", "Z11K2": "vârstă" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "বয়স" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "věk" }, { "Z1K1": "Z11", "Z11K1": "Z1709", "Z11K2": "vecums" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "umur" }, { "Z1K1": "Z11", "Z11K1": "Z1643", "Z11K2": "나이" }, { "Z1K1": "Z11", "Z11K1": "Z1001", "Z11K2": "العمر" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "年齢" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "età" }, { "Z1K1": "Z11", "Z11K1": "Z1012", "Z11K2": "വയസ്സ്" }, { "Z1K1": "Z11", "Z11K1": "Z1051", "Z11K2": "ikä" }, { "Z1K1": "Z11", "Z11K1": "Z1005", "Z11K2": "возраст" }, { "Z1K1": "Z11", "Z11K1": "Z1789", "Z11K2": "edat" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "उम्र" }, { "Z1K1": "Z11", "Z11K1": "Z1003", "Z11K2": "edad" }, { "Z1K1": "Z11", "Z11K1": "Z1973", "Z11K2": "киһи һааһа" }, { "Z1K1": "Z11", "Z11K1": "Z1645", "Z11K2": "年龄" }, { "Z1K1": "Z11", "Z11K1": "Z1186", "Z11K2": "גיל" }, { "Z1K1": "Z11", "Z11K1": "Z1597", "Z11K2": "yaş" }, { "Z1K1": "Z11", "Z11K1": "Z1362", "Z11K2": "yuswo" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "leeftijd" }, { "Z1K1": "Z11", "Z11K1": "Z1403", "Z11K2": "aetas" }, { "Z1K1": "Z11", "Z11K1": "Z1237", "Z11K2": "Yaş" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "years old", "age in years", "age at death", "age range", "year old" ] }, { "Z1K1": "Z31", "Z31K1": "Z1592", "Z31K2": [ "Z6", "år gammal", "ålder i år" ] }, { "Z1K1": "Z31", "Z31K1": "Z1332", "Z31K2": [ "Z6", "років, вік у роках, вік на момент смерті" ] }, { "Z1K1": "Z31", "Z31K1": "Z1430", "Z31K2": [ "Z6", "Jahre alt" ] }, { "Z1K1": "Z31", "Z31K1": "Z1664", "Z31K2": [ "Z6", "etate", "ani", "vârsta în ani", "vârsta ", "ani la moarte" ] }, { "Z1K1": "Z31", "Z31K1": "Z1011", "Z31K2": [ "Z6", "কত বছর পুরোনো" ] }, { "Z1K1": "Z31", "Z31K1": "Z1062", "Z31K2": [ "Z6", "stáří v letech", "věk v letech" ] }, { "Z1K1": "Z31", "Z31K1": "Z1709", "Z31K2": [ "Z6", "vecums gados" ] }, { "Z1K1": "Z31", "Z31K1": "Z1643", "Z31K2": [ "Z6", "연령", "연세", "사망 나이" ] }, { "Z1K1": "Z31", "Z31K1": "Z1012", "Z31K2": [ "Z6", "പ്രായം" ] }, { "Z1K1": "Z31", "Z31K1": "Z1820", "Z31K2": [ "Z6", "आयु" ] }, { "Z1K1": "Z31", "Z31K1": "Z1003", "Z31K2": [ "Z6", "edad dado un rango" ] }, { "Z1K1": "Z31", "Z31K1": "Z1645", "Z31K2": [ "Z6", "岁数" ] }, { "Z1K1": "Z31", "Z31K1": "Z1157", "Z31K2": [ "Z6", "jaren oud ", "jaar oud", "leeftijd bij overlijden", "leeftijd in jaren" ] }, { "Z1K1": "Z31", "Z31K1": "Z1403", "Z31K2": [ "Z6", "annorum", "aetas in annis", "aetas in morte", "spatium annorum" ] }, { "Z1K1": "Z31", "Z31K1": "Z1004", "Z31K2": [ "Z6", "ans " ] }, { "Z1K1": "Z31", "Z31K1": "Z1237", "Z31K2": [ "Z6", "yaşında", "yaş (yıl)", "ölüm yaşı", "yaş aralığı" ] }, { "Z1K1": "Z31", "Z31K1": "Z1830", "Z31K2": [ "Z6", "歳 ", "年単位の年齢", "享年", "年齢層", "年層" ] }, { "Z1K1": "Z31", "Z31K1": "Z1051", "Z31K2": [ "Z6", "vuotta vanha", "ikä vuosina", "kuolinikä", "vuotias" ] }, { "Z1K1": "Z31", "Z31K1": "Z1362", "Z31K2": [ "Z6", "umur" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "âge en années, dans n'importe quel ordre" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "jämför två datum i den gregorianska kalendern och svara med en ålder i år (heltal)" }, { "Z1K1": "Z11", "Z11K1": "Z1332", "Z11K2": "Вік у роках" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Alter in Jahren" }, { "Z1K1": "Z11", "Z11K1": "Z1664", "Z11K2": "Vârsta în ani" }, { "Z1K1": "Z11", "Z11K1": "Z1011", "Z11K2": "দুটি তারিখের মধ্যে কত বছরের পার্থক্য সেটা নির্ধারন করে। " }, { "Z1K1": "Z11", "Z11K1": "Z1709", "Z11K2": "Vecums gados" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Umur dalam tahun" }, { "Z1K1": "Z11", "Z11K1": "Z1643", "Z11K2": "연도 기준 연령" }, { "Z1K1": "Z11", "Z11K1": "Z1001", "Z11K2": "يُرجع العمر بالسنوات" }, { "Z1K1": "Z11", "Z11K1": "Z1012", "Z11K2": "പ്രായം വർഷക്കണക്കിൽ" }, { "Z1K1": "Z11", "Z11K1": "Z1787", "Z11K2": "Numero di anni interi trascorsi tra due date" }, { "Z1K1": "Z11", "Z11K1": "Z1005", "Z11K2": "возраст в годах" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "दो दिनांकों के बीच का अंतर लौटाता है।" }, { "Z1K1": "Z11", "Z11K1": "Z1003", "Z11K2": "edad dado un rango de fechas" }, { "Z1K1": "Z11", "Z11K1": "Z1973", "Z11K2": "Киһи һааһа һылларынан" }, { "Z1K1": "Z11", "Z11K1": "Z1186", "Z11K2": "גיל בשנים, משך שנים בין שני תאריכים" }, { "Z1K1": "Z11", "Z11K1": "Z1362", "Z11K2": "yuswo" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "věk v letech" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "Leeftijd in jaren" }, { "Z1K1": "Z11", "Z11K1": "Z1403", "Z11K2": "Aetas in annis" }, { "Z1K1": "Z11", "Z11K1": "Z1237", "Z11K2": "Yaş (yıl)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "returns the difference between two dates on the Gregorian calendar in years" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "2つの新暦日付の違いを割り出し、解答(年単位)を返す" }, { "Z1K1": "Z11", "Z11K1": "Z1051", "Z11K2": "Palauttaa kahden gregoriaanisen kalenterin päivämäärän erotuksen vuosina." } ] } } etcnd3u30d7way7xuidhno9bjiwuzlb Z28020 0 65095 334504 314262 2026-10-29T23:16:46Z Comfyquiettree 6942 +czech 334504 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z28020" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": "Z28018", "Z14293K2": "Z33160" }, { "Z1K1": "Z14293", "Z14293K1": "Z28026", "Z14293K2": "Z33034" }, { "Z1K1": "Z14293", "Z14293K1": "Z28049", "Z14293K2": [ "Z60", "Z1011" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z28052", "Z14293K2": [ "Z60", "Z1787" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z30671", "Z14293K2": [ "Z60", "Z1146" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z30609", "Z14293K2": [ "Z60", "Z1531" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z32212", "Z14293K2": "Z33463" }, { "Z1K1": "Z14293", "Z14293K1": "Z32355", "Z14293K2": "Z34003" }, { "Z1K1": "Z14293", "Z14293K1": "Z32166", "Z14293K2": "Z33056" }, { "Z1K1": "Z14293", "Z14293K1": "Z35139", "Z14293K2": [ "Z60", "Z1762" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z35151", "Z14293K2": [ "Z60", "Z1272" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z35196", "Z14293K2": "Z34075" }, { "Z1K1": "Z14293", "Z14293K1": "Z36001", "Z14293K2": [ "Z60", "Z1592" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z36337", "Z14293K2": [ "Z60", "Z1532", "Z1576", "Z1137", "Z1402", "Z1078" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z38205", "Z14293K2": [ "Z60", "Z1158" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z32728", "Z14293K2": [ "Z60", "Z1005" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z28107", "Z14293K2": "Z42266" }, { "Z1K1": "Z14293", "Z14293K1": "Z41584", "Z14293K2": [ "Z60", "Z1844", "Z1226", "Z1609" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z36184", "Z14293K2": [ "Z60", "Z1062" ] } ], "Z14294K2": "Z28019" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "config for defining role sentence" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "config pour définir la phrase de rôle" }, { "Z1K1": "Z11", "Z11K1": "Z1643", "Z11K2": "역할을 정의하는 문장 설정" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "定義的役割文の言語別設定" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "output Type: Monolingual text" }, { "Z1K1": "Z11", "Z11K1": "Z1643", "Z11K2": "출력 종류: 단-언어 텍스트" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "出力型: 単一言語テキスト" } ] } } ms9vbvhr3jw3oalwz7ip2k1v8uavrut Z28021 0 65096 334565 290512 2026-10-30T03:42:02Z YoshiRulz 10156 Remove English 334565 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z28021" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z28019", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z26107", "Z26107K1": { "Z1K1": "Z60", "Z60K1": "mul", "Z60K2": [ "Z6" ] }, "Z26107K2": { "Z1K1": "Z7", "Z7K1": "Z22504", "Z22504K1": [ "Z6", { "Z1K1": "Z7", "Z7K1": "Z36270", "Z36270K1": { "Z1K1": "Z18", "Z18K1": "Z28019K1" }, "Z36270K2": { "Z1K1": "Z18", "Z18K1": "Z28019K4" } }, " : ", { "Z1K1": "Z7", "Z7K1": "Z36270", "Z36270K1": { "Z1K1": "Z18", "Z18K1": "Z28019K2" }, "Z36270K2": { "Z1K1": "Z18", "Z18K1": "Z28019K4" } }, " = ", { "Z1K1": "Z7", "Z7K1": "Z36270", "Z36270K1": { "Z1K1": "Z18", "Z18K1": "Z28019K3" }, "Z36270K2": { "Z1K1": "Z18", "Z18K1": "Z28019K4" } }, "." ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "join with spaces labels of QIDs in language" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "A (is the) B (of) C." ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } d96xs1nv2dt3qrh16lvwjorq44c8m5d Z29597 0 68799 334651 314234 2026-10-30T10:38:39Z Affandy Murad 10666 translate into Indonesian 334651 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z29597" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": "Z29594", "Z14293K2": "Z33034" }, { "Z1K1": "Z14293", "Z14293K1": "Z30347", "Z14293K2": "Z33160" }, { "Z1K1": "Z14293", "Z14293K1": "Z30410", "Z14293K2": [ "Z60", "Z1146" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z30635", "Z14293K2": [ "Z60", "Z1078" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z32256", "Z14293K2": [ "Z60", "Z1005", "Z1332", "Z1622" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z33267", "Z14293K2": [ "Z60", "Z1011" ] }, { "Z1K1": "Z14293", "Z14293K1": "Z40334", "Z14293K2": "Z35147" }, { "Z1K1": "Z14293", "Z14293K1": "Z41657", "Z14293K2": "Z34003" }, { "Z1K1": "Z14293", "Z14293K1": "Z41848", "Z14293K2": "Z42266" } ], "Z14294K2": "Z29596" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "config for describing entity with adjective/class" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "konfig för att beskriva entitet med adjektiv/klass" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "形容詞/分類でエンティティを説明する文章の言語別設定" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Konfigurasi atribut/kelas deskripsi entitas" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "all language versions should have four arguments (including the last one for the language)" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "semua versi bahasa harus memiliki empat argumen (termasuk argumen terakhir untuk bahasa tersebut)" } ] } } hdolp58t7v1uoikh163ezb6sgm4audz Template:Main page/News/de 10 69043 334482 333413 2026-10-29T20:22:59Z Ameisenigel 44 Created page with "$1: Wikiabstrak-App" 334482 wikitext text/x-wiki <noinclude><languages /></noinclude> ; Freiwilligentreffen * Das nächste Freiwilligentreffen findet am <bdi lang="en" dir="ltr">[https://zonestamp.toolforge.org/1794222000 11:00 UTC on 2026-11-09]</bdi> auf <bdi lang="en" dir="ltr">Google Meet</bdi> unter <bdi lang="en" dir="ltr">[https://meet.google.com/xuy-njxh-rkw meet.google.com/xuy-njxh-rkw]</bdi> statt. * Das [[:c:File:Abstract Wikipedia Volunteer Corner 2026-10.webm|letzte Freiwilligentreffen]] ist auf Commons verfügbar ; Aktuelle Neuigkeiten zum Status von Wikifunctions <!--Keep this to the most recent 5 entries--> * {{Status updates|2026-10-25}}: Wikiabstrak-App * {{Status updates|2026-10-17}}: Änderungen an Darstellungen im Auswerter * {{Status updates|2026-10-09}}: Vierteljährliche Planung * {{Status updates|2026-10-02}}: Aktualisierung von Ergebnissen * {{Status updates|2026-09-25}}: Memoisation und der Bürgermeister von Paris [[Special:MyLanguage/Wikifunctions:Status updates|<span class="mw-ui-button mw-ui-constructive mw-ui-small">Weitere Neuigkeiten</span>]] gnnwwh4mx8rjo4olfu9uy7zsskzq9r7 Z30635 0 70911 334566 312062 2026-10-30T04:50:19Z OwlyKnight 7673 Added Z30636 to the approved list of implementations 334566 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z30635" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z30635K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "entitas" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "entity" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z30635K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "adjektiva" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "adjective" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z30635K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "kelas" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "class" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z30635K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "bahasa" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20", "Z30637" ], "Z8K4": [ "Z14", "Z30636" ], "Z8K5": "Z30635" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Deskripsi entitas dengan adj/kelas (Indonesia)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "describing entity with adjective/class, Indonesian" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Membuat deskripsi entitas dengan tambahan adjetiva atau kelas dari Wikidata dalam bahasa Indonesia" } ] } } o30sjuwre7lr510on9x57tdpra1391x Z32486 0 78733 334681 259589 2026-10-30T11:06:04Z Mengsky 103320 334681 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z32486" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z32473", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z610", "Z16K2": "def Z32473(Z32473K1, Z32473K2, Z32473K3, Z32473K4): #yk what someone else can make this if they want, ima try compositions.\n\tengLang = [ZObject\u003CZ1K1:{'Z1K1': 'Z9', 'Z9K1': 'Z60'},Z60K1:en\u003E]\n\tif(str(Z32473K4) in engLang):\n\t\treturn str(Z32473K1) + \" was born \" + str(Z32473K2) + \" in \" + str(Z32473K3) + \".\"\n\telse:\n\t\treturn str(Z32473K4)" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[name] was born [date] in [place]. (python imp.)" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "[nama] terlahir di [tanggal] berada di [tempat]" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menuliskan profil berdasarkan nama dan tempat tanggal lahir dalam bahasa phyton" } ] } } p0escs2l8pyd8tdf9s83c510nplaeai User:NikolasKHF 2 82684 334597 273482 2026-10-30T08:38:58Z NikolasKHF 68920 Replaced content with "{{delete|To use [[:meta:User:NikolasKHF|Meta-Wiki userpage]] instead.}}" 334597 wikitext text/x-wiki {{delete|To use [[:meta:User:NikolasKHF|Meta-Wiki userpage]] instead.}} tb3ojthb5d2dlmmh9nbtz6exmlnyeat User:YoshiRulz/WF bugs 2 89125 334390 327350 2026-10-29T12:55:31Z YoshiRulz 10156 Strike T368320 334390 wikitext text/x-wiki HUGE BUGS which concern correctness, like, how are these still open: * [[phab:T373607]] Test evaluations where the Implementation threw or returned {{Z|24}} are treated as successes * <s>[[phab:T427454]] 2-ary apply pairwise / apply with common first/second evaluate incorrectly, returning a list with only copies of the final element</s> seems fixed as of 2026-08 Not-so-huge correctness bugs: * [[phab:T406784]] Test evaluations are for an older revision of the Implementation, but aren't indicated as such and aren't cleared from cache for a while * [[phab:T417614]] {{Z|6821}} doesn't include sitelinks * <s>[[phab:T423853]] {{Z|18}} are not always resolved</s> seems fixed as of 2026-08 * <s>[[phab:T431432]] Allow editors to clear function eval cache</s> implemented 2026-09 * [[phab:T439425]] A {{Z|9}} pointing at a persistent {{Z|6020}} is considered not equal to a literal [[Z6020]] with the same [[Z9]] in its identity field Major bugs which hinder editing: * [[phab:T386422]] Allow currying / partial application ** Not really a bug (although one dev seems to think it is), but this would simplify compositions so much, removing the need for a bunch of applyN helpers ** Experimentally available via a new type; see [[Z39808|example]] and [[Talk:Z39807#I_have_no_idea_what_I'm_doing_ː)|explanation]] * <s>[[phab:T433272]] Memoise inner calls in compositions</s> implemented 2026-09 * <s>[[phab:T433746]] Test results refuse to load when there are very many tests for a Function</s> fixed 2026-09 Editing annoyances, which will disproportionately affect new/inexperienced users: * [[phab:T335713]] Clicking "undo" in the history for a Function, Implementation, etc. brings up the editor but doesn't undo anything * [[phab:T343559]] Always allow manually calling Implementations even if they aren't connected * <s>[[phab:T368320]] Various literals have a malformed collapsed display form when their components are non-literals</s> resolved 2026-10 * [[phab:T373413]] {{Z|504}} is raised for reasons other than an invalid ZID * [[phab:T410839]] Test result details include the relevant Implementation but aren't considering which Implementations were chosen for recursive calls ** Blocked by [[phab:T368892|<code>nestedMetadata</code> functionality]] * <s>[[phab:T433743]] Hyperlinks in preview of localStorage clipboard are clickable</s> fixed 2026-09 * <s>[[phab:T433744]] "Copy result link" is not tied to the result/submission</s> fixed 2026-10 * <s>[[phab:T433745]] Unable to populate nested list when the UI component exists on page load (<code>[Object object]</code>-typed list)</s> fixed 2026-08 * <s>[[phab:T435331]] Lexeme Sense selector component doesn't load the first time</s> fixed as of 2026-09 * [[phab:T439423]] Links aren't clickable in localised error messages {{abbr|i18n|internationalisation}} fails: * [[phab:T343460]] Indicate which language a foreign label is from * [[phab:T359663]] <code>mul</code> labels aren't used as the default when no native label exists, nor are they used in search * [[phab:T359774]] The overflow/context menu on ZObjects in the composition editor is sorted alphabetically by label * [[phab:T410501]] {{Z|828}} and co. ignore the live version of predefined objects, only returning the hardcoded labels etc. * [[phab:T419365]] Allow [[:Category:Interlinear_annotations|ruby annotations]] in {{Z|89}} Features that would be needed for maintenance in the long term: * [[phab:T260953]] MCR slot on persistent objects for long-form documentation ** I got sick of waiting and [[Template:Function_documentation|made a talk page template]] * [[phab:T292892]] Introduce a [[WF:Type_proposals/Either|Union generic type]] * <s>[[phab:T350715]] Add an indicator to test evaluations which are particularly slow</s> implemented in the form of new {{Z|50}} raised as warnings * [[phab:T355738]] Track localisation of Types' labels across {{SITENAME}} (like Special:LanguageStats maybe) * [[phab:T383842]] Provide an n-argument apply ** [[Z22074|The function in question]] works fine, but one dev said <q>the user-land hack is unstable, unstable, and will likely break soon</q> and refused to elaborate, so tracking this in case a bunch of functions need rewriting suddenly * [[phab:T390563]] Improve support for Chinese dialects, ''à la'' LanguageConverter * [[phab:T392437]] Show embedded function calls under <q>Pages included on this page</q> (<code>templatesused</code>) in the editor * [[phab:T404897]] Search for Functions by the programming languages of their Implementation(s) * [[phab:T410599]] Prevent multiple inputs in persistent Functions sharing the same label in a language * [[phab:T419501]] Include a link to the source for built-in Implementations * (TODO report) Backlink false positives e.g. <code>"Z28020"</code> in [[Z37468]] &rarr; [[Special:WhatLinksHere/Z28020]] Features that would be nice to have: * [[phab:T301418]] Block-based visual programming interface ** I got sick of waiting and [[User:YoshiRulz/Blockly|made my own]] * [[phab:T343685]] Re-use localised labels from Wikidata * (TODO check Phab) Improve how embedded function calls are displayed in the source editor's previews; see also [[phab:T405608]] * [[phab:T345541]] Include the keys of a {{Z|4}} or {{Z|50}} in the <q>{{int:wikilambda-about-widget-title}}</q> box, like with {{Z|8}} inputs, for easy localisation * [[phab:T345636]] Preview persistent ZObjects on hover in compositions * [[phab:T382209]] Expand the default selection of [[Z4]]-typed fields in compositions to include all the most common Types * [[phab:T411703]] (In Abstract Wikipedia, but maybe useful here too) Show function call results in multiple languages at once * [[phab:T421275]] Allow localStorage copy/paste between Wikifunctions and Abstract Wikipedia * [[phab:T423329]] Other improvements to localStorage clipboard * [[phab:T433157]] (In Abstract Wikipedia, but presumably the same mechanism would be used for categorising mainspace here) Provide a mechanism to put abstract articles into MediaWiki categories * <s>[[phab:T434141]] Add link to Special:FunctionUsage from Functions in mainspace</s> implemented 2026-09-03 * <s>[[phab:T435332]] Allow pasting URLs into Reference/Function input components</s> implemented as of 2026-10 * <s>[[phab:T435712]] Expand the default selection of [[Z60]]-typed fields in compositions to include the currently-selected interface language</s> implemented 2026-09-10 pobibgyea2nm55o0kx1djsc9u2kpold Z39619 0 90322 334487 332637 2026-10-29T21:35:58Z Virinas-code 2884 Added Z39623 to the approved list of test cases 334487 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z39619" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z39619K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "k" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z39619K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "i" } ] } } ], "Z8K2": "Z8", "Z8K3": [ "Z20", "Z39623" ], "Z8K4": [ "Z14", "Z39622" ], "Z8K5": "Z39619" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "P" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Makes a function that takes k arguments and returns the i-th one." } ] } } 50fsrc45a0fpvsm3zte5sgq9cmjf79e 334489 334487 2026-10-29T21:40:33Z Virinas-code 2884 Clarify that i is 1-indexed 334489 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z39619" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z39619K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "k" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z39619K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "i" } ] } } ], "Z8K2": "Z8", "Z8K3": [ "Z20", "Z39623" ], "Z8K4": [ "Z14", "Z39622" ], "Z8K5": "Z39619" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "P" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Makes a function that takes k arguments and returns the i-th one (1-indexed)." } ] } } 6qi39ul0uwu7d9k4gnaoabqxcd94xh5 334491 334489 2026-10-29T21:42:08Z Virinas-code 2884 Added Z48128 to the approved list of test cases 334491 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z39619" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z39619K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "k" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z39619K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "i" } ] } } ], "Z8K2": "Z8", "Z8K3": [ "Z20", "Z39623", "Z48128" ], "Z8K4": [ "Z14", "Z39622" ], "Z8K5": "Z39619" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "P" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Makes a function that takes k arguments and returns the i-th one (1-indexed)." } ] } } lbostklpxo9i5nu1m4k5i3b7bh7wtlp Z39620 0 90323 334500 300185 2026-10-29T22:27:17Z Virinas-code 2884 Removed Z39621 from the approved list of implementations 334500 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z39620" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z39620K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "k" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z38545" }, "Z17K2": "Z39620K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "arguments" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z17" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z39620" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Arguments for primitive recursive function" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } dfw7fr64t9yq5i061f68lykxlybpujy 334501 334500 2026-10-29T22:27:23Z Virinas-code 2884 Rewrite function to be used in composition implementations 334501 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z39620" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z39620K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "k" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z17" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z39620" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Arguments for primitive recursive function" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Builds the arguments part of the functions returned by primitive recursive functions" } ] } } 1q3epgn9x7qoowixlow0r8vf4cymc58 Z39622 0 90328 334485 300782 2026-10-29T21:33:30Z Virinas-code 2884 334485 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z39622" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z39619", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z39619( Z39619K1, Z39619K2 ) {\n function Z13518(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z13518K1\", value.toString() ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z13518\" }\n \t);\n }\n function Z99(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z99K1\", value ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z99\" }\n \t);\n }\n function Z18(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z18K1\", value ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z18\" }\n \t);\n }\n function Z11(language, text) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z11K1\", language ],\n \t \t[ \"Z11K2\", text ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z11\" }\n \t);\n }\n function Z12(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z12K1\", value ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z12\" }\n \t);\n }\n const functionCallKeys = new Map( [\n \t[ \"Z7K1\", new ZReference(\"Z39619\") ],\n \t[ \"Z39619K1\", Z13518(Z39619K1.toString()) ],\n \t[ \"Z39619K2\", Z13518(Z39619K2.toString()) ]\n ] );\n const functionCall = new ZObject(\n \tfunctionCallKeys,\n \t{ \"Z1K1\": \"Z9\", \"Z9K1\": \"Z7\" }\n );\n const implementationKeys = new Map( [\n \t[ \"Z14K1\", functionCall ],\n \t[ \"Z14K2\", Z18(`K${Z39619K2 + 1}`) ],\n ] );\n const implementation = new ZObject(\n \timplementationKeys,\n \t{ \"Z1K1\": \"Z9\", \"Z9K1\": \"Z14\" }\n );\n // func work. need argument\n let args = Array(Z39619K1);\n for (let i = 0; i \u003C Z39619K1; i++) {\n \targs[i] = new ZObject(\n\t new Map( [\n\t \t[ \"Z17K1\", new ZReference(\"Z1\") ],\n\t \t[ \"Z17K2\", `K${i + 1}` ],\n\t \t[ \"Z17K3\", Z12(\n\t \t\t[Z11(new ZReference(\"Z1360\"), `x_${i}`)]\n\t \t)]\n\t ] ),\n\t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z17\" }\n\t);\n }\n const keys = new Map( [\n [ \"Z8K1\", args ],\n [ \"Z8K2\", new ZReference(\"Z1\") ],\n [ \"Z8K3\", [] ],\n [ \"Z8K4\", [ implementation ] ],\n [ \"Z8K5\", new ZReference(\"Z39619\") /* ?? */ ]\n ] );\n const func = new ZObject(\n keys,\n { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z8\" }\n );\n return func;\n}" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function (JavaScript)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 4at6osgu6djbwzz1uwfe9otlttb7t1p 334486 334485 2026-10-29T21:35:47Z Virinas-code 2884 Don't add one to the key reference in implementation 334486 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z39622" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z39619", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z39619( Z39619K1, Z39619K2 ) {\n function Z13518(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z13518K1\", value.toString() ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z13518\" }\n \t);\n }\n function Z99(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z99K1\", value ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z99\" }\n \t);\n }\n function Z18(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z18K1\", value ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z18\" }\n \t);\n }\n function Z11(language, text) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z11K1\", language ],\n \t \t[ \"Z11K2\", text ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z11\" }\n \t);\n }\n function Z12(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z12K1\", value ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z12\" }\n \t);\n }\n const functionCallKeys = new Map( [\n \t[ \"Z7K1\", new ZReference(\"Z39619\") ],\n \t[ \"Z39619K1\", Z13518(Z39619K1.toString()) ],\n \t[ \"Z39619K2\", Z13518(Z39619K2.toString()) ]\n ] );\n const functionCall = new ZObject(\n \tfunctionCallKeys,\n \t{ \"Z1K1\": \"Z9\", \"Z9K1\": \"Z7\" }\n );\n const implementationKeys = new Map( [\n \t[ \"Z14K1\", functionCall ],\n \t[ \"Z14K2\", Z18(`K${Z39619K2}`) ],\n ] );\n const implementation = new ZObject(\n \timplementationKeys,\n \t{ \"Z1K1\": \"Z9\", \"Z9K1\": \"Z14\" }\n );\n // func work. need argument\n let args = Array(Z39619K1);\n for (let i = 0; i \u003C Z39619K1; i++) {\n \targs[i] = new ZObject(\n\t new Map( [\n\t \t[ \"Z17K1\", new ZReference(\"Z1\") ],\n\t \t[ \"Z17K2\", `K${i + 1}` ],\n\t \t[ \"Z17K3\", Z12(\n\t \t\t[Z11(new ZReference(\"Z1360\"), `x_${i}`)]\n\t \t)]\n\t ] ),\n\t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z17\" }\n\t);\n }\n const keys = new Map( [\n [ \"Z8K1\", args ],\n [ \"Z8K2\", new ZReference(\"Z1\") ],\n [ \"Z8K3\", [] ],\n [ \"Z8K4\", [ implementation ] ],\n [ \"Z8K5\", new ZReference(\"Z39619\") /* ?? */ ]\n ] );\n const func = new ZObject(\n keys,\n { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z8\" }\n );\n return func;\n}" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function (JavaScript)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 3ua3vs1381fe4vcmyxwd7kmunfeap77 334488 334486 2026-10-29T21:37:46Z Virinas-code 2884 Convert BigInt i to a string in the implementation 334488 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z39622" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z39619", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z39619( Z39619K1, Z39619K2 ) {\n function Z13518(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z13518K1\", value.toString() ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z13518\" }\n \t);\n }\n function Z99(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z99K1\", value ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z99\" }\n \t);\n }\n function Z18(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z18K1\", value ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z18\" }\n \t);\n }\n function Z11(language, text) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z11K1\", language ],\n \t \t[ \"Z11K2\", text ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z11\" }\n \t);\n }\n function Z12(value) {\n \treturn new ZObject(\n \t new Map( [\n \t \t[ \"Z12K1\", value ]\n \t ] ),\n \t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z12\" }\n \t);\n }\n const functionCallKeys = new Map( [\n \t[ \"Z7K1\", new ZReference(\"Z39619\") ],\n \t[ \"Z39619K1\", Z13518(Z39619K1.toString()) ],\n \t[ \"Z39619K2\", Z13518(Z39619K2.toString()) ]\n ] );\n const functionCall = new ZObject(\n \tfunctionCallKeys,\n \t{ \"Z1K1\": \"Z9\", \"Z9K1\": \"Z7\" }\n );\n const implementationKeys = new Map( [\n \t[ \"Z14K1\", functionCall ],\n \t[ \"Z14K2\", Z18(`K${Z39619K2.toString()}`) ],\n ] );\n const implementation = new ZObject(\n \timplementationKeys,\n \t{ \"Z1K1\": \"Z9\", \"Z9K1\": \"Z14\" }\n );\n // func work. need argument\n let args = Array(Z39619K1);\n for (let i = 0; i \u003C Z39619K1; i++) {\n \targs[i] = new ZObject(\n\t new Map( [\n\t \t[ \"Z17K1\", new ZReference(\"Z1\") ],\n\t \t[ \"Z17K2\", `K${i + 1}` ],\n\t \t[ \"Z17K3\", Z12(\n\t \t\t[Z11(new ZReference(\"Z1360\"), `x_${i}`)]\n\t \t)]\n\t ] ),\n\t { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z17\" }\n\t);\n }\n const keys = new Map( [\n [ \"Z8K1\", args ],\n [ \"Z8K2\", new ZReference(\"Z1\") ],\n [ \"Z8K3\", [] ],\n [ \"Z8K4\", [ implementation ] ],\n [ \"Z8K5\", new ZReference(\"Z39619\") /* ?? */ ]\n ] );\n const func = new ZObject(\n keys,\n { \"Z1K1\": \"Z9\", \"Z9K1\": \"Z8\" }\n );\n return func;\n}" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function (JavaScript)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } dqa7j5tzniz6fp3h20tycnl5eztb5r9 Z40222 0 91917 334564 309774 2026-10-30T03:41:59Z Satdeep Gill 10395 Added Z40224 to the approved list of test cases 334564 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z40222" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z40222K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "entity" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "इकाई" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z40222K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "class" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "वर्ग" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z40273", "Z41405", "Z40224" ], "Z8K4": [ "Z14", "Z40223" ], "Z8K5": "Z40222" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Hindi article-less instantiating sentence" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "हिन्दी वर्ग का उदाहरण वाक्य" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "entity is instance of class, Hindi, X is a Y (Hindi)" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates a Hindi sentence stating an entity is an instance of a class (X एक Y है।)" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "यह दर्शाता है कि कोई इकाई किसी वर्ग का उदाहरण है (X एक Y है।)" } ] } } m6uzmly23tol7km0k75c4f1hi7w06qi Z42495 0 95125 334641 315225 2026-10-30T09:46:08Z Mengsky 103320 334641 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z42495" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z42482", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z42482", "Z42482K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q2" }, { "Z1K1": "Z6091", "Z6091K1": "Q16877383" }, { "Z1K1": "Z6091", "Z6091K1": "Q525" } ], "Z42482K2": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Earth, Moon, \u0026 Sun" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[EN] Earth, Moon, \u0026 Sun" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Id Bumi, Bulan, \u0026 Matahari" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } eytik89tmr81xuxazvzz6kntu1pc1ep Wikifunctions:Project chat/Archive/2026/09 4 97018 334556 331035 2026-10-30T03:08:05Z SpBot 978 archiving 1 section from [[Wikifunctions:Project chat]] (after section [[Wikifunctions:Project chat/Archive/2026/09#i_can_create_my_own_function?|i_can_create_my_own_function?]]) 334556 wikitext text/x-wiki {{Talkarchive}} == New visualisation templates to help editors navigate {{Z|14294}} == I've got {{Z|40885}} mostly working and I hacked together a version of [[Z40902|a tree view]] that's usable: take a look at [[Talk:Z25091]] and [[Talk:Z39262]]. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 02:35, 3 September 2026 (UTC) == Native implementations reading Z12 labels broken after recent deploy == {{tracked|T436918}} Native (JS/Python) implementations that read labels from their argument now get an empty <code>Z12K1</code>, so they return 0 items. Composition implementations are unaffected. Example: {{Z|Z24116}} (JS impl of {{Z|Z24114}}) with Q1 + [en, mul] returns 0 items, while composition {{Z|Z26569}} returns <code>["universe"]</code>. Cause: orchestrator commit [https://gitlab.wikimedia.org/repos/abstract-wiki/wikifunctions/function-orchestrator/-/commit/beb111db6c "Strip Z12 labels when resolving WFObjects"] (Aug 26), deployed in the 2026-09-02 services deploy. <code>fullyRealize()</code> now strips <code>Z12K1</code>, and native implementation arguments go through it (<code>WFImplementation.js</code>). I've temporarily disconnected Z24116/Z24770 from Z24114 so the working composition Z26569 is used. Question: Is stripping labels from native arguments intentional? How should native code access labels going forward? (FYI: Z24114 tester {{Z|Z36529}} is separately failing; Q30 has no <code>no</code> label; it's under <code>nb</code>/<code>nn</code> now.) [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 08:49, 3 September 2026 (UTC) :{{Z|Z23769}} is also broken. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 09:46, 3 September 2026 (UTC) :It was intentional to remove some, but not intentional to remove all (or at least we didn't understand the effect). The development team are aware. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 09:58, 3 September 2026 (UTC) :Should now be fixed. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:20, 4 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #263: 5,000 Functions, passing Z40000 == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-03|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we mark the 5,000th function on Wikifunction, we explore a new Type for functions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1788802200 September 7, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 11:00, 4 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> == Help for optimizing functions == I developed {{Z|Z41075}}, but in many cases, {{Z|Z571}} or {{Z|Z574}} occurs. I understand that this function is trying to do a lot, but I am trying to find a way to make it lighter. Any advice would be appreciated. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 06:47, 8 September 2026 (UTC) :I made a few changes, of which I think [[Special:Diff/311013|making all the fetch calls identical]] would have the most impact. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:55, 8 September 2026 (UTC) == Incorrect number formatting with uselang on Main Page == <code><nowiki>{{formatnum:{{NUMBEROFFUNCTIONS}}}}</nowiki></code> on [[Wikifunctions:Main_Page]] (or to be precise, on [[Template:Main page]]) evaluates using <code>PAGELANGUAGE</code> (en) by default, not <code>USERLANGUAGE</code>. Setting Polish as the interface language and/or appending <code>?uselang=pl</code> leaves English digit grouping (5,634, not Polish grouping: 5634). Is there a way to fix this? Because right now in Polish, <u>technically speaking</u>, it says there are "5.634 functions" (five and six hundred thirty-four thousandths), since a comma is used as a decimal separator in Polish. [[User:Wcalenieja|Wcalenieja]] ([[User talk:Wcalenieja|talk]]) 19:45, 9 September 2026 (UTC) :This problem has been repeatedly raised on [[WT:Main_Page|the talk page]] and ignored every time. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:32, 9 September 2026 (UTC) ::Oh, yeah, you're right :/ [[User:Wcalenieja|Wcalenieja]] ([[User talk:Wcalenieja|talk]]) 22:32, 9 September 2026 (UTC) :Will admin rights help with this? Or where should the change be? I take it we can't use an embedded call: {{#function:Z14280|5634|pl}}?--[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 00:44, 10 September 2026 (UTC) ::Yep, admin rights are needed to edit [[Template:Main page]], since it's edit-protected. Hardcoding a static string defeats the purpose of using <code><nowiki>{{NUMBEROFFUNCTIONS}}</nowiki></code>, which automatically updates as new functions are added. AFAIK users should be navigated to language subpages (e.g., Wikifunctions:Main_Page/pl). On subpages, PAGELANGUAGE is explicitly pl, so standard <code><nowiki>{{formatnum:...}}</nowiki></code> works correctly. But to be honest I'm not that technical, so I may be wrong. [[User:Wcalenieja|Wcalenieja]] ([[User talk:Wcalenieja|talk]]) 10:45, 10 September 2026 (UTC) :::I guess I didn't mean hardcoding, I was more asking about using our own functional formatting by calling {{Z|Z14280}} with an embedded function call. It might look more like {{#function:Z14280|{{NUMBEROFFUNCTIONS}}|pl}} --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 10:53, 10 September 2026 (UTC) ::::That makes sense. Apologies, I misread your comment as suggesting a hardcoded string rather than a function call. But we should use <code><nowiki>{{#function:Z14280|{{NUMBEROFFUNCTIONS}}|{{int:lang}}}}</nowiki></code> instead of hardcoding <code>pl</code> :) [[User:Wcalenieja|Wcalenieja]] ([[User talk:Wcalenieja|talk]]) 11:03, 10 September 2026 (UTC) :::::Indeed. I think it is now working. This does risk the first visitor in each language seeing "function is being called"... So let's see if we get lots of complaints.--[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 11:20, 10 September 2026 (UTC) == [[module:citation]] and templates == [[template:cite encyclopedia]] requires it [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|talk]]) 02:28, 13 September 2026 (UTC) :[[WF:AN]] to request imports from another wiki. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 02:59, 13 September 2026 (UTC) ::Thanks, moved to [[WF:administrators' noticeboard#importing module:citation and associated templates]]. [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|talk]]) 19:55, 13 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #264: Your code can now call back to the Wikidata fetch functions == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-10|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce the possibility of calling Wikidata fetch functions, we present a new Type, we celebrate more than 200 new functions this week, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:13, 11 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :Maybe with "call back to the Wikidata fetch functions" it would be possible to craate an implmentation for {{Z|Z38960}} as described in its discussion page. Who can help? [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 12:43, 14 September 2026 (UTC) == Calculadora de Obras de Artista por Periodo == Hola, necesito una función que calcule a partir de dadas * Una fecha de inicio (dd/mm/aaaa) * Una fecha de final (dd/mm/aaaa) * Un artista o grupo de artistas La cantidad de obras hechas en ese periodo de tiempo por ese artista o grupo de artistas. [[User:Jackie SMG|Jackie SMG]] ([[User talk:Jackie SMG|talk]]) 05:40, 13 September 2026 (UTC) :Something like ([[d:Q41264|Q41264]], 1650-01-01, 1659-12-31) &rarr; [https://w.wiki/UVaJ 7]? That's not currently possible, because it needs to jump from the artist's Item to the works' Items (backlinks), which SPARQL can do but {{SITENAME}} cannot.<br>Something that is currently possible would be to take a list of works as arguments and filter them by date: [https://www.wikifunctions.org/wiki/Z22820?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z22820%22%2C%22Z22820K1%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q167605%22%7D%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q185372%22%7D%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q544315%22%7D%5D%2C%22Z22820K2%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z873%22%2C%22Z873K1%22%3A%22Z29661%22%2C%22Z873K2%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z31262%22%2C%22Z31262K1%22%3A%22Z42044%22%2C%22Z31262K2%22%3A%7B%22Z1K1%22%3A%22Z20420%22%2C%22Z20420K1%22%3A%7B%22Z1K1%22%3A%22Z20159%22%2C%22Z20159K1%22%3A%7B%22Z1K1%22%3A%22Z17813%22%2C%22Z17813K1%22%3A%22Z17814%22%7D%2C%22Z20159K2%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%221663%22%7D%7D%2C%22Z20420K2%22%3A%7B%22Z1K1%22%3A%22Z20342%22%2C%22Z20342K1%22%3A%7B%22Z1K1%22%3A%22Z16098%22%2C%22Z16098K1%22%3A%22Z16101%22%7D%2C%22Z20342K2%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%221%22%7D%7D%7D%2C%22Z31262K3%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z873%22%2C%22Z873K1%22%3A%22Z39110%22%2C%22Z873K2%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z13464%22%2C%22Z13464K1%22%3A%22Z39908%22%2C%22Z13464K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q167605%22%7D%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q185372%22%7D%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q544315%22%7D%5D%2C%22Z13464K3%22%3A%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P571%22%7D%7D%7D%2C%22Z31262K4%22%3A%7B%22Z1K1%22%3A%22Z20420%22%2C%22Z20420K1%22%3A%7B%22Z1K1%22%3A%22Z20159%22%2C%22Z20159K1%22%3A%7B%22Z1K1%22%3A%22Z17813%22%2C%22Z17813K1%22%3A%22Z17814%22%7D%2C%22Z20159K2%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%221667%22%7D%7D%2C%22Z20420K2%22%3A%7B%22Z1K1%22%3A%22Z20342%22%2C%22Z20342K1%22%3A%7B%22Z1K1%22%3A%22Z16098%22%2C%22Z16098K1%22%3A%22Z16112%22%7D%2C%22Z20342K2%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%2231%22%7D%7D%7D%7D%7D%7D example]. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 19:06, 13 September 2026 (UTC) ::Más o menos algo así quiero, que se haga mediante Wikidata. Aunque igualmente, ustedes son los que saben programar, por algo estoy aquí solicitando. Muchas gracias de igual forma. ::Esto es para un proyecto que tengo llamado [[:m:Wikimuseum ~ Art]], entonces necesito funciones para ese proyecto para no tener que calcular todo a mano. Les voy a dar actualizaciones si algo pasa. ::Atte: [[User:Jackie SMG|Jackie SMG]] ([[User talk:Jackie SMG|talk]]) 19:14, 13 September 2026 (UTC) :: Hola, soy yo de nuevo. Quiero darle las gracias a la comunidad de Wikifuntions por responder a mis dudas y les quiero avisar que, por motivo de [[:m:Wikimuseum ~ Art]], les voy a estar pidiendo funciones de forma continua para poder desarrollar este nuevo proyecto, el cual planea convertirse en un proyecto hermano. Muchas gracias por su atención. :: Atte: [[User:Jackie SMG|Jackie SMG]] ([[User talk:Jackie SMG|talk]]) 19:51, 15 September 2026 (UTC) == Categories, classifiers, tags and the Function catalogue == Functions are manually classified within the Function-catalogue sub-pages. Objects in the main namespace, including functions, may also be organized into traditional Wikimedia categories by categorizing their Talk pages. In addition, objects may also be grouped together using their labels or aliases; for example, equality functions are likely to have "==" as an alias. There may be other mechanisms that I have overlooked. These approaches share the drawback that they are essentially monolingual and, in practice, mainly restricted to English. I suggest that we should replace the English strings used for such purposes with {{Z|Z12}} objects and link to these wherever feasible. In the future, it may be possible to link directly from any {{Z|Z2}} to such a “tag” object, but I think we would need to create a Feature request on Phabricator for this. In the meantime, maybe we should explore using embedded function calls to provide headings within the Function catalogue? [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:26, 16 September 2026 (UTC) :Great ideas. I support all. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 10:33, 16 September 2026 (UTC) :{{abbr|ICYMI|in case you missed it}}: {{t|function documentation}}<br>I don't understand where you intend to add [[Z12]]s, since the things you mentioned already use it. Cross-lingual/symbolic aliases [[phab:T359663|are still not working]].<br>Using our own [[Z32839|heading functions]] is a good idea, but the Items need to exist. Extension:Translate is probably the better choice on a lot of pages. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 20:05, 16 September 2026 (UTC) ::The Z12s themselves would be standalone objects, just like a category is a standalone page. Objects could link to them directly, by reference (subject to a change to the Z2 type definition to add a new key for a list of references). Alternatively, a standalone typed pair could link the Z12 object to the list of objects it categorizes, which would be easier for functions to operate over. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:53, 16 September 2026 (UTC) :::I still don't follow. Do you mean that the links to the persistent Z12 will serve as categorisation, with Special:WhatLinksHere for listing membership? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:50, 16 September 2026 (UTC) ::::Basically… yes. But I imagine we’d have some more specific searches too. And an embedded function over a Separate association object might even populate an entire Catalogue section. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 22:30, 16 September 2026 (UTC) == The next Natural Language Generation Special Interest Group meeting is tomorrow! == Hi all! A quick message to inform you that Denny will lead a quick first introduction to syntactic phrase functions in the next '''Natural Language Generation Special Interest Group meeting''', that will be held tomorrow, '''[https://zonestamp.toolforge.org/1789488000 September 15, at 16:00 UTC]''' ([https://meet.google.com/xzn-kqer-mah link to the meeting]). See you at the meeting! In case you can't join, the meeting will be recorded and made available on Commons. -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:27, 14 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :[[c:File:Abstract Wikipedia NLG SIG Meeting 2026-09.webm]] re: {{Z|39358}} [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:34, 17 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #265: More engaging error messages == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-18|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we explain how we reworked error messaging, we talk about our recent and upcoming meetings, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 12:59, 18 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> {{phab|T439423}} :The "message template" is used on WF too (as you show in [[:File:Wikifunctions_actionable_error_message_example_in_the_Details_dialog.png|the first screenshot there]]), but because it's used as the subtitle for the <q>Errors</q> collapsible section, clicking on hyperlinks collapses the section instead.<!-- --><br>edit: [[Talk:Z28248#Documentation|Made a visualisation]]. Although it now occurs to me that it's cached for a month, so maybe not that useful compared to a [https://www.wikifunctions.org/wiki/Z37847?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z37847%22%2C%22Z37847K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q319%22%7D%2C%22Z37847K2%22%3A%22Z1732%22%7D shared call URL]<!-- --> which has the error. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 05:40, 19 September 2026 (UTC) : <q>We also changed how we track rate limiting for actions including running Functions. These can happen a lot via API calls when using the front-end.</q><!-- --><br>Whatever you did, it now takes several minutes to see test results ''while writing an Implementation'',<!-- --> or to get the preview of an embedded function call. I would have thought those are the work units you'd want to prioritise.<!-- --><br>If you want to reduce the amount of work that gets queued, you could change the indiscriminate execution of the whole test matrix<!-- --> when any Impl/Test is dis/connected, and allow selective queuing of tests from the Implementation editor. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 08:51, 19 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) 61d2qx41x1hofg25qco30y77g668yu8 Z44531 0 97664 334685 324034 2026-10-30T11:11:05Z Mengsky 103320 334685 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44531" }, "Z2K2": [ "Z6", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" ], "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "English lowercase alphabet" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Huruf nonkapital" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "English lowercase alphabet" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "huruf nonkapital dalam bahasa Inggris" } ] } } o9f3k8zdh97gmlkvy9qhjxjib7fvup9 Z44635 0 97809 334416 325324 2026-10-29T13:40:40Z 鈴音雨 101019 Connect testers Z48112 and Z48113 334416 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44635" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z44635K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目または生成済み句" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item or generated phrase" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z44635K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目の表示関数" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item renderer" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z44635K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z44635K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "リストを表示する関数?" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "renderer takes a list?" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z44678", "Z44796", "Z48112", "Z48113" ], "Z8K4": [ "Z14", "Z44653" ], "Z8K5": "Z44635" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の項目または生成済み句の表示" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "render item or generated phrase" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "生成済みの句はそのまま返し、項目参照は指定の表示関数で語にします。例: near the coast。" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns a generated phrase unchanged, or renders an item through the supplied two-argument function. E.g. near the coast." } ] } } f6z0zx27htqjotyse9u6us9i71yufr1 Z44653 0 97827 334415 325374 2026-10-29T13:40:27Z 鈴音雨 101019 An item/quantity pair puts the quantity where the language puts it (Z48103): many endemic species, 多数の固有種 334415 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44653" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z44635", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13052", "Z13052K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } }, "Z13052K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z4K1" }, "Z803K2": "Z6" } }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z44635K1" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z48107", "Z48107K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48103", "Z48103K1": { "Z1K1": "Z7", "Z7K1": "Z822", "Z822K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } }, "Z48103K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z44635K4" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z13318", "Z13318K1": { "Z1K1": "Z18", "Z18K1": "Z44635K2" }, "Z13318K2": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z44688", "Z44688K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } } ], "Z13318K3": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13318", "Z13318K1": { "Z1K1": "Z18", "Z18K1": "Z44635K2" }, "Z13318K2": { "Z1K1": "Z7", "Z7K1": "Z44688", "Z44688K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } }, "Z13318K3": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } } }, "Z48103K3": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z44634", "Z44634K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z24097", "Z24097K1": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } } }, "Z866K2": "ja" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12899", "Z12899K1": [ "Z6", { "Z1K1": "Z7", "Z7K1": "Z822", "Z822K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z44635K4" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z13318", "Z13318K1": { "Z1K1": "Z18", "Z18K1": "Z44635K2" }, "Z13318K2": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z44688", "Z44688K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } } ], "Z13318K3": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13318", "Z13318K1": { "Z1K1": "Z18", "Z18K1": "Z44635K2" }, "Z13318K2": { "Z1K1": "Z7", "Z7K1": "Z44688", "Z44688K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } }, "Z13318K3": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } } } ], "Z12899K2": "" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z12899", "Z12899K1": [ "Z6", { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z44635K4" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z13318", "Z13318K1": { "Z1K1": "Z18", "Z18K1": "Z44635K2" }, "Z13318K2": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z44688", "Z44688K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } } ], "Z13318K3": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13318", "Z13318K1": { "Z1K1": "Z18", "Z18K1": "Z44635K2" }, "Z13318K2": { "Z1K1": "Z7", "Z7K1": "Z44688", "Z44688K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } }, "Z13318K3": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } } }, " ", { "Z1K1": "Z7", "Z7K1": "Z822", "Z822K1": { "Z1K1": "Z18", "Z18K1": "Z44635K1" } } ], "Z12899K2": "" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z44635K4" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z13318", "Z13318K1": { "Z1K1": "Z18", "Z18K1": "Z44635K2" }, "Z13318K2": [ "Z6091", { "Z1K1": "Z18", "Z18K1": "Z44635K1" } ], "Z13318K3": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13318", "Z13318K1": { "Z1K1": "Z18", "Z18K1": "Z44635K2" }, "Z13318K2": { "Z1K1": "Z18", "Z18K1": "Z44635K1" }, "Z13318K3": { "Z1K1": "Z18", "Z18K1": "Z44635K3" } } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の項目または生成済み句の表示、合成" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "render item or generated phrase, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "生成済みの句はそのまま返し、項目参照は指定の表示関数で語にします。例: near the coast。" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns a generated phrase unchanged, or renders an item through the supplied two-argument function. E.g. near the coast." } ] } } hjtl3dfojvdh1g4egsqia3wxgtfwt3d Z44797 0 98049 334689 325326 2026-10-30T11:19:11Z Mengsky 103320 334689 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44797" }, "Z2K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775415" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775461" } ], "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Latin grammatical genders" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Daftar penulisan gender bahasa Latin" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "List of grammatical genders used in Latin." } ] } } qvtmvb2z5xmqj090ipkkssd2n46lpye Z46616 0 100154 334386 334378 2026-10-29T12:30:41Z Jsamwrites 938 Removed Z46618 from the approved list of implementations 334386 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46616" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z46616K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46616K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46616K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z46616K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20", "Z46619", "Z46620", "Z46621", "Z46622", "Z46623", "Z46624", "Z46625", "Z46627", "Z46628", "Z46626" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46616" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction candidates for property" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical constructions that can express statements of the property, in order of preference: language-neutral property map, then the language's preferences, then the value kind (Z6091 item, Z6064 time, Z6010 quantity; empty = any). Empty when the property or value kind is not supported." } ] } } 54imcnzokqu01tv3jwjv8lgudq7ms6t 334388 334386 2026-10-29T12:33:06Z Jsamwrites 938 Added Z46618 to the approved list of implementations 334388 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46616" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z46616K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46616K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46616K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z46616K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20", "Z46619", "Z46620", "Z46621", "Z46622", "Z46623", "Z46624", "Z46625", "Z46627", "Z46628", "Z46626" ], "Z8K4": [ "Z14", "Z46618" ], "Z8K5": "Z46616" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction candidates for property" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical constructions that can express statements of the property, in order of preference: language-neutral property map, then the language's preferences, then the value kind (Z6091 item, Z6064 time, Z6010 quantity; empty = any). Empty when the property or value kind is not supported." } ] } } gehs61dfb8jcsa24m0oyzvmbpge1vat 334520 334388 2026-10-30T00:48:42Z Jsamwrites 938 Removed Z46618 from the approved list of implementations 334520 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46616" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z46616K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46616K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46616K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z46616K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20", "Z46619", "Z46620", "Z46621", "Z46622", "Z46623", "Z46624", "Z46625", "Z46627", "Z46628", "Z46626" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46616" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction candidates for property" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical constructions that can express statements of the property, in order of preference: language-neutral property map, then the language's preferences, then the value kind (Z6091 item, Z6064 time, Z6010 quantity; empty = any). Empty when the property or value kind is not supported." } ] } } 54imcnzokqu01tv3jwjv8lgudq7ms6t 334522 334520 2026-10-30T00:51:13Z Jsamwrites 938 Added Z46618 to the approved list of implementations 334522 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46616" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z46616K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46616K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46616K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z46616K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20", "Z46619", "Z46620", "Z46621", "Z46622", "Z46623", "Z46624", "Z46625", "Z46627", "Z46628", "Z46626" ], "Z8K4": [ "Z14", "Z46618" ], "Z8K5": "Z46616" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction candidates for property" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical constructions that can express statements of the property, in order of preference: language-neutral property map, then the language's preferences, then the value kind (Z6091 item, Z6064 time, Z6010 quantity; empty = any). Empty when the property or value kind is not supported." } ] } } gehs61dfb8jcsa24m0oyzvmbpge1vat 334523 334522 2026-10-30T01:07:17Z Jsamwrites 938 Removed Z46618 from the approved list of implementations 334523 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46616" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z46616K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46616K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46616K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z46616K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20", "Z46619", "Z46620", "Z46621", "Z46622", "Z46623", "Z46624", "Z46625", "Z46627", "Z46628", "Z46626" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46616" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction candidates for property" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical constructions that can express statements of the property, in order of preference: language-neutral property map, then the language's preferences, then the value kind (Z6091 item, Z6064 time, Z6010 quantity; empty = any). Empty when the property or value kind is not supported." } ] } } 54imcnzokqu01tv3jwjv8lgudq7ms6t 334525 334523 2026-10-30T01:12:32Z Jsamwrites 938 Added Z46618 to the approved list of implementations 334525 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46616" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z46616K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46616K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46616K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z46616K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20", "Z46619", "Z46620", "Z46621", "Z46622", "Z46623", "Z46624", "Z46625", "Z46627", "Z46628", "Z46626" ], "Z8K4": [ "Z14", "Z46618" ], "Z8K5": "Z46616" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction candidates for property" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical constructions that can express statements of the property, in order of preference: language-neutral property map, then the language's preferences, then the value kind (Z6091 item, Z6064 time, Z6010 quantity; empty = any). Empty when the property or value kind is not supported." } ] } } gehs61dfb8jcsa24m0oyzvmbpge1vat Z46618 0 100156 334387 334374 2026-10-29T12:31:27Z Jsamwrites 938 Task 8: dispatch large predicate-candidate cases through lazy registered helpers 334387 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46618" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46616", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z48100", "Z48100K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P47" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48072", "Z48072K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P366" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48072", "Z48072K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P166" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48072", "Z48072K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P112" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48074", "Z48074K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" }, "Z48074K2": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P178" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48074", "Z48074K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" }, "Z48074K2": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P571" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48076", "Z48076K1": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P84" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48078", "Z48078K1": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P277" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48080", "Z48080K1": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z48086", "Z48086K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" }, "Z48086K2": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } } } } } } } } } }, "Z48100K2": { "Z1K1": "Z18", "Z18K1": "Z46616K3" }, "Z48100K3": { "Z1K1": "Z18", "Z18K1": "Z46616K4" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction candidates for property, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical constructions that can express statements of the property, in order of preference: language-neutral property map, then the language's preferences, then the value kind (Z6091 item, Z6064 time, Z6010 quantity; empty = any). Empty when the property or value kind is not supported." } ] } } inj14mfpedps4hv3j9b54za1jhqbxnk 334521 334387 2026-10-30T00:49:54Z Jsamwrites 938 Task 8: dispatch large predicate-candidate cases through lazy registered helpers 334521 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46618" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46616", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z48100", "Z48100K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P31" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48136" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P47" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48072", "Z48072K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P366" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48072", "Z48072K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P166" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48072", "Z48072K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P112" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48074", "Z48074K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" }, "Z48074K2": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P178" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48074", "Z48074K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" }, "Z48074K2": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P571" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48076", "Z48076K1": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P84" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48078", "Z48078K1": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P277" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48080", "Z48080K1": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z48086", "Z48086K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" }, "Z48086K2": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } } } } } } } } } } }, "Z48100K2": { "Z1K1": "Z18", "Z18K1": "Z46616K3" }, "Z48100K3": { "Z1K1": "Z18", "Z18K1": "Z46616K4" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction candidates for property, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical constructions that can express statements of the property, in order of preference: language-neutral property map, then the language's preferences, then the value kind (Z6091 item, Z6064 time, Z6010 quantity; empty = any). Empty when the property or value kind is not supported." } ] } } ffzez68xncs4hnw3n6kya4q9cqsw7gr 334524 334521 2026-10-30T01:09:37Z Jsamwrites 938 Task 8: dispatch large predicate-candidate cases through lazy registered helpers 334524 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46618" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46616", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z48100", "Z48100K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P31" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48136" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P106" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48136" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P47" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48072", "Z48072K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P366" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48072", "Z48072K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P166" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48072", "Z48072K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P112" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48074", "Z48074K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" }, "Z48074K2": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P178" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48074", "Z48074K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" }, "Z48074K2": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P571" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48076", "Z48076K1": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P84" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48078", "Z48078K1": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46616K1" } }, "Z866K2": "P277" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48080", "Z48080K1": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z48086", "Z48086K1": { "Z1K1": "Z18", "Z18K1": "Z46616K1" }, "Z48086K2": { "Z1K1": "Z18", "Z18K1": "Z46616K2" } } } } } } } } } } } }, "Z48100K2": { "Z1K1": "Z18", "Z18K1": "Z46616K3" }, "Z48100K3": { "Z1K1": "Z18", "Z18K1": "Z46616K4" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction candidates for property, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical constructions that can express statements of the property, in order of preference: language-neutral property map, then the language's preferences, then the value kind (Z6091 item, Z6064 time, Z6010 quantity; empty = any). Empty when the property or value kind is not supported." } ] } } kftjeud2c16apc2wzaf7pktjvzt09fx Z47286 0 100922 334582 332888 2026-10-30T07:32:25Z Jsamwrites 938 Removed Z47287 from the approved list of implementations 334582 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47286" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z47286K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z47286K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z47286K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "variant" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z47321", "Z47322", "Z47364", "Z47552" ], "Z8K4": [ "Z14" ], "Z8K5": "Z47286" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Classification sentence (HTML)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates HTML with links and a language marker for what kind of thing the item is (instance of): Paris is a city." } ] } } fcka5cxw86d9n4nxzcxw07vzall3wly 334587 334582 2026-10-30T07:35:20Z Jsamwrites 938 Added Z47287 to the approved list of implementations 334587 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47286" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z47286K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z47286K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z47286K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "variant" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z47321", "Z47322", "Z47364", "Z47552" ], "Z8K4": [ "Z14", "Z47287" ], "Z8K5": "Z47286" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Classification sentence (HTML)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates HTML with links and a language marker for what kind of thing the item is (instance of): Paris is a city." } ] } } gkunwfqi8bssecju3tqjxo3im6oergz 334588 334587 2026-10-30T07:39:04Z Jsamwrites 938 Removed Z47287 from the approved list of implementations 334588 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47286" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z47286K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z47286K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z47286K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "variant" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z47321", "Z47322", "Z47364", "Z47552" ], "Z8K4": [ "Z14" ], "Z8K5": "Z47286" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Classification sentence (HTML)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates HTML with links and a language marker for what kind of thing the item is (instance of): Paris is a city." } ] } } fcka5cxw86d9n4nxzcxw07vzall3wly 334593 334588 2026-10-30T07:41:55Z Jsamwrites 938 Added Z47287 to the approved list of implementations 334593 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47286" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z47286K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z47286K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z47286K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "variant" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z47321", "Z47322", "Z47364", "Z47552" ], "Z8K4": [ "Z14", "Z47287" ], "Z8K5": "Z47286" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Classification sentence (HTML)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates HTML with links and a language marker for what kind of thing the item is (instance of): Paris is a city." } ] } } gkunwfqi8bssecju3tqjxo3im6oergz Z47287 0 100923 334584 332214 2026-10-30T07:33:40Z Jsamwrites 938 Route public classification HTML through the form-level sentence caller 334584 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47287" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z47286", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z47169", "Z47169K1": { "Z1K1": "Z7", "Z7K1": "Z48169", "Z47251K1": { "Z1K1": "Z18", "Z18K1": "Z47286K1" }, "Z47251K2": { "Z1K1": "Z18", "Z18K1": "Z47286K2" }, "Z47251K3": { "Z1K1": "Z18", "Z18K1": "Z47286K3" } }, "Z47169K2": { "Z1K1": "Z18", "Z18K1": "Z47286K1" }, "Z47169K3": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "Z47169K4": { "Z1K1": "Z18", "Z18K1": "Z47286K2" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Classification sentence (HTML), composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 29sl8gom740nmq6765x6ix4ukbi7n94 334590 334584 2026-10-30T07:40:05Z Jsamwrites 938 Route public classification HTML through the form-level sentence caller 334590 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47287" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z47286", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z47169", "Z47169K1": { "Z1K1": "Z7", "Z7K1": "Z48169", "Z48169K1": { "Z1K1": "Z18", "Z18K1": "Z47286K1" }, "Z48169K2": { "Z1K1": "Z18", "Z18K1": "Z47286K2" }, "Z48169K3": { "Z1K1": "Z18", "Z18K1": "Z47286K3" } }, "Z47169K2": { "Z1K1": "Z18", "Z18K1": "Z47286K1" }, "Z47169K3": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "Z47169K4": { "Z1K1": "Z18", "Z18K1": "Z47286K2" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Classification sentence (HTML), composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } rjw24kafdqesiqbmryc9qzg3oog4eru Z47290 0 100926 334583 332422 2026-10-30T07:32:40Z Jsamwrites 938 Removed Z47291 from the approved list of implementations 334583 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47290" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z47290K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z47290K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z47290K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "variant" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z47343", "Z47318", "Z47365" ], "Z8K4": [ "Z14" ], "Z8K5": "Z47290" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Occupation sentence (HTML)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates HTML with links and a language marker for the occupation of a person: Marie Curie is a physicist." } ] } } 6v4khgig2o1uevh3uy9qcmqscza8aen 334586 334583 2026-10-30T07:35:11Z Jsamwrites 938 Added Z47291 to the approved list of implementations 334586 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47290" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z47290K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z47290K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z47290K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "variant" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z47343", "Z47318", "Z47365" ], "Z8K4": [ "Z14", "Z47291" ], "Z8K5": "Z47290" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Occupation sentence (HTML)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates HTML with links and a language marker for the occupation of a person: Marie Curie is a physicist." } ] } } r8dghu43orml8kd7ozxr5vypd5r49e9 334589 334586 2026-10-30T07:39:18Z Jsamwrites 938 Removed Z47291 from the approved list of implementations 334589 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47290" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z47290K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z47290K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z47290K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "variant" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z47343", "Z47318", "Z47365" ], "Z8K4": [ "Z14" ], "Z8K5": "Z47290" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Occupation sentence (HTML)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates HTML with links and a language marker for the occupation of a person: Marie Curie is a physicist." } ] } } 6v4khgig2o1uevh3uy9qcmqscza8aen 334592 334589 2026-10-30T07:41:49Z Jsamwrites 938 Added Z47291 to the approved list of implementations 334592 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47290" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z47290K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z47290K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z47290K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "variant" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z47343", "Z47318", "Z47365" ], "Z8K4": [ "Z14", "Z47291" ], "Z8K5": "Z47290" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Occupation sentence (HTML)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates HTML with links and a language marker for the occupation of a person: Marie Curie is a physicist." } ] } } r8dghu43orml8kd7ozxr5vypd5r49e9 Z47291 0 100927 334585 332218 2026-10-30T07:33:44Z Jsamwrites 938 Route public classification HTML through the form-level sentence caller 334585 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47291" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z47290", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z47169", "Z47169K1": { "Z1K1": "Z7", "Z7K1": "Z48171", "Z47258K1": { "Z1K1": "Z18", "Z18K1": "Z47290K1" }, "Z47258K2": { "Z1K1": "Z18", "Z18K1": "Z47290K2" }, "Z47258K3": { "Z1K1": "Z18", "Z18K1": "Z47290K3" } }, "Z47169K2": { "Z1K1": "Z18", "Z18K1": "Z47290K1" }, "Z47169K3": { "Z1K1": "Z6092", "Z6092K1": "P106" }, "Z47169K4": { "Z1K1": "Z18", "Z18K1": "Z47290K2" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Occupation sentence (HTML), composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } d9yrm6rpazyepd567tmj45o32cznaxa 334591 334585 2026-10-30T07:40:09Z Jsamwrites 938 Route public classification HTML through the form-level sentence caller 334591 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z47291" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z47290", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z47169", "Z47169K1": { "Z1K1": "Z7", "Z7K1": "Z48171", "Z48171K1": { "Z1K1": "Z18", "Z18K1": "Z47290K1" }, "Z48171K2": { "Z1K1": "Z18", "Z18K1": "Z47290K2" }, "Z48171K3": { "Z1K1": "Z18", "Z18K1": "Z47290K3" } }, "Z47169K2": { "Z1K1": "Z18", "Z18K1": "Z47290K1" }, "Z47169K3": { "Z1K1": "Z6092", "Z6092K1": "P106" }, "Z47169K4": { "Z1K1": "Z18", "Z18K1": "Z47290K2" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Occupation sentence (HTML), composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } mup9mjya2aj218xj3n3oj7r86r5sbrn Wikifunctions:Status updates/2026-10-25/de 4 101489 334453 334138 2026-10-29T19:25:11Z Ameisenigel 44 Created page with "Das Freiwilligentreffen in diesem Monat (12. Oktober 2026) ist [[$1|jetzt als Aufzeichnung auf Commons verfügbar]]. Vielen Dank für die lebhafte Diskussion und die neuen Ideen!" 334453 wikitext text/x-wiki <languages/> {{Wikifunctions updates | prevlabel = Vorheriges Update | prev = 2026-10-17 | nextlabel = Nächstes Update | next = }} <span id="Wikiabstrak_app"></span> === Wikiabstrak-App === [[File:Screenshot of Wikiabstrak App.png|thumb|Wikiabstrak App]] Eine neue App wurde von [[:meta:User:Affandy Murad|Affandy Murad]], einem Freiwilligen in der indonesischen Wikipedia und anderen Projekten, entwickelt: [https://wikiabstrak.web.app/ Wikiabstrak]. Die App selbst beschreibt sich wie folgt: ''“Wikiabstrak ist ein offenes Experiment, das strukturierte Daten aus Wikidata in lesbare Zusammenfassungen umwandelt, ganz ohne Sprachmodell (LLM). Sucht man nach einem Land, einem Ort, einer Person oder einem Gebäude, erstellt das System anhand fester Regeln einen Textabschnitt aus Wikidata-Aussagen, sodass sich jeder Satz auf seine Quelle zurückführen lässt.'' ''“Zudem werden wichtige Fakten, Fotos von Wikimedia Commons sowie Links zu sämtlichen Wikimedia-Projekten angezeigt und es gibt eine vorgefertigte Vorlage für den Einleitungsabsatz für die Abstrakte Wikipedia, die es dir ermöglicht, sprachunabhängige Artikel zu erstellen oder zu bearbeiten.”'' Viel Spaß bei der Nutzung der App! Falls du Vorschläge hast, kannst du Affandy im Telegram-/IRC-Chat des Projekts oder auf [[:meta:User talk:Affandy Murad|seiner Benutzerdiskussionsseite]] kontaktieren. Schau dir auch die weiteren Apps an, die Affandy entwickelt hat und die auf [[:meta:User:Affandy Murad|seiner Benutzerseite]] aufgelistet sind. <span id="No_changes_in_the_software_this_week"></span> === Keine Änderungen an der Software in dieser Woche === Aufgrund der diese Woche bekannt gewordenen [[:de:PHP2Shell|PHP-Schwachstellen]] haben wir beschlossen, von weiteren Einführungen abzusehen, ausgenommen sicherheitskritische Änderungen. <span id="Recording_of_October_Volunteer’s_Corner"></span> === Aufzeichnung des Freiwilligentreffens im Oktober === Das Freiwilligentreffen in diesem Monat (12. Oktober 2026) ist [[:commons:File:Abstract Wikipedia Volunteer Corner 2026-10.webm|jetzt als Aufzeichnung auf Commons verfügbar]]. Vielen Dank für die lebhafte Diskussion und die neuen Ideen! <div lang="en" dir="ltr" class="mw-content-ltr"> === Next Volunteers’ Corner on November 9 at 11 UTC === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The next Volunteers’ Corner will be on [https://zonestamp.toolforge.org/1794222000 Monday, 9 November 2026 at 11:00 UTC]. Note the earlier time in the day, in order to make it easier for some folks to attend this one. We plan to have the following agenda: there will be time to ask questions and discuss all matters arising. If we have time, we will write a function together. Everyone is welcome to join us on [https://meet.google.com/xuy-njxh-rkw Google Meet]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Fresh Functions weekly: 169 new Functions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This week we had 169 new functions. Here is an incomplete list of functions with implementations and passing tests to get a taste of what functions have been created. Thanks everybody for contributing! </div> * {{Z|Z45336}} * {{Z|Z45338}} * {{Z|Z45343}} * {{Z|Z45347}} * {{Z|Z45350}} * {{Z|Z45353}} * {{Z|Z45356}} * {{Z|Z45370}} * {{Z|Z45381}} * {{Z|Z45387}} * {{Z|Z45390}} * {{Z|Z45392}} * {{Z|Z45400}} * {{Z|Z45402}} * {{Z|Z45406}} * {{Z|Z45408}} * {{Z|Z45410}} * {{Z|Z45413}} * {{Z|Z45415}} * {{Z|Z45417}} * {{Z|Z45420}} * {{Z|Z45422}} * {{Z|Z45424}} * {{Z|Z45429}} * {{Z|Z45431}} * {{Z|Z45434}} * {{Z|Z45456}} * {{Z|Z45457}} * {{Z|Z45481}} * {{Z|Z45485}} * {{Z|Z45491}} * {{Z|Z45495}} * {{Z|Z45510}} * {{Z|Z45515}} * {{Z|Z45517}} * {{Z|Z45527}} * {{Z|Z45549}} * {{Z|Z45575}} * {{Z|Z45588}} * {{Z|Z45590}} * {{Z|Z45605}} * {{Z|Z45612}} * {{Z|Z45617}} * {{Z|Z45644}} * {{Z|Z45648}} * {{Z|Z45663}} * {{Z|Z45702}} * {{Z|Z45723}} * {{Z|Z45739}} * {{Z|Z45751}} * {{Z|Z45763}} * {{Z|Z45775}} * {{Z|Z45776}} * {{Z|Z45777}} * {{Z|Z45778}} * {{Z|Z45779}} * {{Z|Z45780}} * {{Z|Z45781}} * {{Z|Z45782}} * {{Z|Z45783}} * {{Z|Z45784}} * {{Z|Z45785}} * {{Z|Z45786}} * {{Z|Z45787}} * {{Z|Z45788}} * {{Z|Z45790}} * {{Z|Z45792}} * {{Z|Z45793}} * {{Z|Z45795}} * {{Z|Z45796}} * {{Z|Z45798}} * {{Z|Z45799}} * {{Z|Z45836}} * {{Z|Z45943}} * {{Z|Z45955}} * {{Z|Z45981}} * {{Z|Z45982}} * {{Z|Z45983}} * {{Z|Z45984}} * {{Z|Z45985}} * {{Z|Z45986}} * {{Z|Z45987}} * {{Z|Z45988}} * {{Z|Z45990}} * {{Z|Z45992}} * {{Z|Z45994}} * {{Z|Z45995}} * {{Z|Z45996}} * {{Z|Z46058}} * {{Z|Z46069}} * {{Z|Z46070}} * {{Z|Z46071}} * {{Z|Z46072}} * {{Z|Z46073}} * {{Z|Z46074}} * {{Z|Z46075}} * {{Z|Z46076}} * {{Z|Z46077}} * {{Z|Z46078}} * {{Z|Z46079}} * {{Z|Z46096}} * {{Z|Z46118}} * {{Z|Z46130}} * {{Z|Z46140}} * {{Z|Z46150}} * {{Z|Z46162}} * {{Z|Z46171}} * {{Z|Z46205}} * {{Z|Z46243}} * {{Z|Z46291}} * {{Z|Z46292}} * {{Z|Z46311}} * {{Z|Z46322}} * {{Z|Z46323}} * {{Z|Z46324}} * {{Z|Z46325}} * {{Z|Z46365}} * {{Z|Z46391}} * {{Z|Z46392}} * {{Z|Z46393}} * {{Z|Z46394}} * {{Z|Z46395}} * {{Z|Z46420}} * {{Z|Z46432}} * {{Z|Z46448}} * {{Z|Z46460}} * {{Z|Z46499}} * {{Z|Z46508}} * {{Z|Z46509}} * {{Z|Z46532}} * {{Z|Z46535}} * {{Z|Z46536}} * {{Z|Z46558}} * {{Z|Z46561}} * {{Z|Z46568}} * {{Z|Z46569}} * {{Z|Z46570}} * {{Z|Z46602}} * {{Z|Z46616}} * {{Z|Z46617}} * {{Z|Z46641}} * {{Z|Z46657}} * {{Z|Z46658}} * {{Z|Z46659}} * {{Z|Z46673}} * {{Z|Z46685}} <span lang="en" dir="ltr" class="mw-content-ltr">A [https://www.wikifunctions.org/wiki/Special:ListObjectsByType?type=Z8&orderby=latest complete list of all functions sorted by when they were created] is available.</span> [[Category:Status updates{{#translation:}}|2026-10-25]] pl408naiuzkulmbs7lags6adwe054pb 334455 334453 2026-10-29T19:25:44Z Ameisenigel 44 Created page with "=== Nächstes Freiwilligentreffen am 9. November um 12:00 MEZ ===" 334455 wikitext text/x-wiki <languages/> {{Wikifunctions updates | prevlabel = Vorheriges Update | prev = 2026-10-17 | nextlabel = Nächstes Update | next = }} <span id="Wikiabstrak_app"></span> === Wikiabstrak-App === [[File:Screenshot of Wikiabstrak App.png|thumb|Wikiabstrak App]] Eine neue App wurde von [[:meta:User:Affandy Murad|Affandy Murad]], einem Freiwilligen in der indonesischen Wikipedia und anderen Projekten, entwickelt: [https://wikiabstrak.web.app/ Wikiabstrak]. Die App selbst beschreibt sich wie folgt: ''“Wikiabstrak ist ein offenes Experiment, das strukturierte Daten aus Wikidata in lesbare Zusammenfassungen umwandelt, ganz ohne Sprachmodell (LLM). Sucht man nach einem Land, einem Ort, einer Person oder einem Gebäude, erstellt das System anhand fester Regeln einen Textabschnitt aus Wikidata-Aussagen, sodass sich jeder Satz auf seine Quelle zurückführen lässt.'' ''“Zudem werden wichtige Fakten, Fotos von Wikimedia Commons sowie Links zu sämtlichen Wikimedia-Projekten angezeigt und es gibt eine vorgefertigte Vorlage für den Einleitungsabsatz für die Abstrakte Wikipedia, die es dir ermöglicht, sprachunabhängige Artikel zu erstellen oder zu bearbeiten.”'' Viel Spaß bei der Nutzung der App! Falls du Vorschläge hast, kannst du Affandy im Telegram-/IRC-Chat des Projekts oder auf [[:meta:User talk:Affandy Murad|seiner Benutzerdiskussionsseite]] kontaktieren. Schau dir auch die weiteren Apps an, die Affandy entwickelt hat und die auf [[:meta:User:Affandy Murad|seiner Benutzerseite]] aufgelistet sind. <span id="No_changes_in_the_software_this_week"></span> === Keine Änderungen an der Software in dieser Woche === Aufgrund der diese Woche bekannt gewordenen [[:de:PHP2Shell|PHP-Schwachstellen]] haben wir beschlossen, von weiteren Einführungen abzusehen, ausgenommen sicherheitskritische Änderungen. <span id="Recording_of_October_Volunteer’s_Corner"></span> === Aufzeichnung des Freiwilligentreffens im Oktober === Das Freiwilligentreffen in diesem Monat (12. Oktober 2026) ist [[:commons:File:Abstract Wikipedia Volunteer Corner 2026-10.webm|jetzt als Aufzeichnung auf Commons verfügbar]]. Vielen Dank für die lebhafte Diskussion und die neuen Ideen! <span id="Next_Volunteers’_Corner_on_November_9_at_11_UTC"></span> === Nächstes Freiwilligentreffen am 9. November um 12:00 MEZ === <div lang="en" dir="ltr" class="mw-content-ltr"> The next Volunteers’ Corner will be on [https://zonestamp.toolforge.org/1794222000 Monday, 9 November 2026 at 11:00 UTC]. Note the earlier time in the day, in order to make it easier for some folks to attend this one. We plan to have the following agenda: there will be time to ask questions and discuss all matters arising. If we have time, we will write a function together. Everyone is welcome to join us on [https://meet.google.com/xuy-njxh-rkw Google Meet]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Fresh Functions weekly: 169 new Functions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This week we had 169 new functions. Here is an incomplete list of functions with implementations and passing tests to get a taste of what functions have been created. Thanks everybody for contributing! </div> * {{Z|Z45336}} * {{Z|Z45338}} * {{Z|Z45343}} * {{Z|Z45347}} * {{Z|Z45350}} * {{Z|Z45353}} * {{Z|Z45356}} * {{Z|Z45370}} * {{Z|Z45381}} * {{Z|Z45387}} * {{Z|Z45390}} * {{Z|Z45392}} * {{Z|Z45400}} * {{Z|Z45402}} * {{Z|Z45406}} * {{Z|Z45408}} * {{Z|Z45410}} * {{Z|Z45413}} * {{Z|Z45415}} * {{Z|Z45417}} * {{Z|Z45420}} * {{Z|Z45422}} * {{Z|Z45424}} * {{Z|Z45429}} * {{Z|Z45431}} * {{Z|Z45434}} * {{Z|Z45456}} * {{Z|Z45457}} * {{Z|Z45481}} * {{Z|Z45485}} * {{Z|Z45491}} * {{Z|Z45495}} * {{Z|Z45510}} * {{Z|Z45515}} * {{Z|Z45517}} * {{Z|Z45527}} * {{Z|Z45549}} * {{Z|Z45575}} * {{Z|Z45588}} * {{Z|Z45590}} * {{Z|Z45605}} * {{Z|Z45612}} * {{Z|Z45617}} * {{Z|Z45644}} * {{Z|Z45648}} * {{Z|Z45663}} * {{Z|Z45702}} * {{Z|Z45723}} * {{Z|Z45739}} * {{Z|Z45751}} * {{Z|Z45763}} * {{Z|Z45775}} * {{Z|Z45776}} * {{Z|Z45777}} * {{Z|Z45778}} * {{Z|Z45779}} * {{Z|Z45780}} * {{Z|Z45781}} * {{Z|Z45782}} * {{Z|Z45783}} * {{Z|Z45784}} * {{Z|Z45785}} * {{Z|Z45786}} * {{Z|Z45787}} * {{Z|Z45788}} * {{Z|Z45790}} * {{Z|Z45792}} * {{Z|Z45793}} * {{Z|Z45795}} * {{Z|Z45796}} * {{Z|Z45798}} * {{Z|Z45799}} * {{Z|Z45836}} * {{Z|Z45943}} * {{Z|Z45955}} * {{Z|Z45981}} * {{Z|Z45982}} * {{Z|Z45983}} * {{Z|Z45984}} * {{Z|Z45985}} * {{Z|Z45986}} * {{Z|Z45987}} * {{Z|Z45988}} * {{Z|Z45990}} * {{Z|Z45992}} * {{Z|Z45994}} * {{Z|Z45995}} * {{Z|Z45996}} * {{Z|Z46058}} * {{Z|Z46069}} * {{Z|Z46070}} * {{Z|Z46071}} * {{Z|Z46072}} * {{Z|Z46073}} * {{Z|Z46074}} * {{Z|Z46075}} * {{Z|Z46076}} * {{Z|Z46077}} * {{Z|Z46078}} * {{Z|Z46079}} * {{Z|Z46096}} * {{Z|Z46118}} * {{Z|Z46130}} * {{Z|Z46140}} * {{Z|Z46150}} * {{Z|Z46162}} * {{Z|Z46171}} * {{Z|Z46205}} * {{Z|Z46243}} * {{Z|Z46291}} * {{Z|Z46292}} * {{Z|Z46311}} * {{Z|Z46322}} * {{Z|Z46323}} * {{Z|Z46324}} * {{Z|Z46325}} * {{Z|Z46365}} * {{Z|Z46391}} * {{Z|Z46392}} * {{Z|Z46393}} * {{Z|Z46394}} * {{Z|Z46395}} * {{Z|Z46420}} * {{Z|Z46432}} * {{Z|Z46448}} * {{Z|Z46460}} * {{Z|Z46499}} * {{Z|Z46508}} * {{Z|Z46509}} * {{Z|Z46532}} * {{Z|Z46535}} * {{Z|Z46536}} * {{Z|Z46558}} * {{Z|Z46561}} * {{Z|Z46568}} * {{Z|Z46569}} * {{Z|Z46570}} * {{Z|Z46602}} * {{Z|Z46616}} * {{Z|Z46617}} * {{Z|Z46641}} * {{Z|Z46657}} * {{Z|Z46658}} * {{Z|Z46659}} * {{Z|Z46673}} * {{Z|Z46685}} <span lang="en" dir="ltr" class="mw-content-ltr">A [https://www.wikifunctions.org/wiki/Special:ListObjectsByType?type=Z8&orderby=latest complete list of all functions sorted by when they were created] is available.</span> [[Category:Status updates{{#translation:}}|2026-10-25]] 0pamb87x2s005l96m9rvzyrmgy18ngz Z48037 0 101749 334402 334084 2026-10-29T13:33:15Z 鈴音雨 101019 The endemic species come with the quantity many (多数の固有種 / many endemic species) 334402 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48037" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z44346", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z44346", "Z44346K1": { "Z1K1": "Z6091", "Z6091K1": "Q141900546" }, "Z44346K2": { "Z1K1": "Z6091", "Z6091K1": "Q140402519" }, "Z44346K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q140402518" }, { "Z1K1": "Z6091", "Z6091K1": "Q140402519" } ], "Z44346K4": [ "Z6091", { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z6091" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q113828342" }, "K2": { "Z1K1": "Z6091", "Z6091K1": "Q25556293" } }, { "Z1K1": "Z6091", "Z6091K1": "Q841337" } ], "Z44346K5": { "Z1K1": "Z6091", "Z6091K1": "Q192613" }, "Z44346K6": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44346K7": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44346K8": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44346K9": [ "Z6091" ], "Z44346K10": [ "Z6091" ], "Z44346K11": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z14392", "Z14392K2": { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "The Japanese archipelago has been inhabited by many endemic species." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[en] endemic species inhabiting the archipelago" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "[en] 固有種の生息: by endemic species" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } qar6ti4zbm0e07wwyvzjsvh43511rfr 334417 334402 2026-10-29T13:48:18Z 鈴音雨 101019 A values list holding a pair is a list of Z1 334417 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48037" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z44346", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z44346", "Z44346K1": { "Z1K1": "Z6091", "Z6091K1": "Q141900546" }, "Z44346K2": { "Z1K1": "Z6091", "Z6091K1": "Q140402519" }, "Z44346K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q140402518" }, { "Z1K1": "Z6091", "Z6091K1": "Q140402519" } ], "Z44346K4": [ "Z1", { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z6091" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q113828342" }, "K2": { "Z1K1": "Z6091", "Z6091K1": "Q25556293" } }, { "Z1K1": "Z6091", "Z6091K1": "Q841337" } ], "Z44346K5": { "Z1K1": "Z6091", "Z6091K1": "Q192613" }, "Z44346K6": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44346K7": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44346K8": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44346K9": [ "Z6091" ], "Z44346K10": [ "Z6091" ], "Z44346K11": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z14392", "Z14392K2": { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "The Japanese archipelago has been inhabited by many endemic species." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[en] endemic species inhabiting the archipelago" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "[en] 固有種の生息: by endemic species" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } g5tme1uhv14zdh0wwdtuj7lgqdq6a0q Z48038 0 101750 334403 334085 2026-10-29T13:33:29Z 鈴音雨 101019 The endemic species come with the quantity many (多数の固有種 / many endemic species) 334403 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48038" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z44337", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z44337", "Z44337K1": { "Z1K1": "Z6091", "Z6091K1": "Q141900546" }, "Z44337K2": { "Z1K1": "Z6091", "Z6091K1": "Q140402519" }, "Z44337K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q140402518" }, { "Z1K1": "Z6091", "Z6091K1": "Q140402519" } ], "Z44337K4": [ "Z6091", { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z6091" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q113828342" }, "K2": { "Z1K1": "Z6091", "Z6091K1": "Q25556293" } }, { "Z1K1": "Z6091", "Z6091K1": "Q841337" } ], "Z44337K5": { "Z1K1": "Z6091", "Z6091K1": "Q192613" }, "Z44337K6": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44337K7": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44337K8": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44337K9": [ "Z6091" ], "Z44337K10": [ "Z6091" ], "Z44337K11": "Z1830" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z14392", "Z14392K2": { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "日本列島には多数の固有種が生息している。" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[ja] endemic species inhabiting the archipelago" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "[ja] 固有種の生息: 日本列島には" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 65n15cx1w7220etitl8e1rxjx57idjb 334418 334403 2026-10-29T13:48:32Z 鈴音雨 101019 A values list holding a pair is a list of Z1 334418 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48038" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z44337", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z44337", "Z44337K1": { "Z1K1": "Z6091", "Z6091K1": "Q141900546" }, "Z44337K2": { "Z1K1": "Z6091", "Z6091K1": "Q140402519" }, "Z44337K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q140402518" }, { "Z1K1": "Z6091", "Z6091K1": "Q140402519" } ], "Z44337K4": [ "Z1", { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z6091" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q113828342" }, "K2": { "Z1K1": "Z6091", "Z6091K1": "Q25556293" } }, { "Z1K1": "Z6091", "Z6091K1": "Q841337" } ], "Z44337K5": { "Z1K1": "Z6091", "Z6091K1": "Q192613" }, "Z44337K6": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44337K7": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44337K8": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z44337K9": [ "Z6091" ], "Z44337K10": [ "Z6091" ], "Z44337K11": "Z1830" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z14392", "Z14392K2": { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "日本列島には多数の固有種が生息している。" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[ja] endemic species inhabiting the archipelago" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "[ja] 固有種の生息: 日本列島には" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 5khido8h6h60bcs611zvdhwpdu3n0iu Z48098 0 101859 334379 2026-10-29T12:08:21Z Jsamwrites 938 Create Compact one-complement predicate realization 334379 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48098" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48098K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48098K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z48098K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "precedence-resolved requests" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48098K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "realized grammatical subject" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48098K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "complement role" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48098K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "realized complement" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48098" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact one-complement predicate realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes one already-selected predicate lexeme with precedence-resolved requests, an already-realized grammatical subject and one already-realized direct-object or oblique complement. Uses the registered morphology strategy and constituent order for en, fr, es, la, ml, ig and dag. Unsupported languages or complement roles preserve failure instead of choosing a fallback claim." } ] } } djdcabfd9e3ylcqy4o39i8yrj6yh2si 334381 334379 2026-10-29T12:11:05Z Jsamwrites 938 Added Z48099 to the approved list of implementations 334381 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48098" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48098K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48098K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z48098K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "precedence-resolved requests" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48098K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "realized grammatical subject" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48098K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "complement role" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48098K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "realized complement" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48099" ], "Z8K5": "Z48098" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact one-complement predicate realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes one already-selected predicate lexeme with precedence-resolved requests, an already-realized grammatical subject and one already-realized direct-object or oblique complement. Uses the registered morphology strategy and constituent order for en, fr, es, la, ml, ig and dag. Unsupported languages or complement roles preserve failure instead of choosing a fallback claim." } ] } } 9kc4s565bsp7jsltunz3dxib2o2fnpz Z48099 0 101860 334380 2026-10-29T12:08:27Z Jsamwrites 938 Create implementation of Compact one-complement predicate realization 334380 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48099" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48098", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6091K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K5" } }, "Z866K2": "Q2990574" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "la" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "ml" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z48098K4" }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z48098K6" }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "en" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47428", "Z47428K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47428K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47428K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "fr" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47416", "Z47416K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47416K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47416K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "es" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47418", "Z47418K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47418K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47418K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "la" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47420", "Z47420K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47420K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47420K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "ml" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47422", "Z47422K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47422K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47422K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "ig" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47426", "Z47426K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47426K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47426K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "dag" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47424", "Z47424K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47424K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47424K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": "Z24" } } } } } } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z48098K4" }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "en" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47428", "Z47428K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47428K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47428K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "fr" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47416", "Z47416K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47416K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47416K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "es" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47418", "Z47418K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47418K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47418K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "la" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47420", "Z47420K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47420K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47420K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "ml" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47422", "Z47422K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47422K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47422K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "ig" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47426", "Z47426K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47426K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47426K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "dag" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47424", "Z47424K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47424K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47424K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": "Z24" } } } } } } } } }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z18", "Z18K1": "Z48098K6" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6091K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K5" } }, "Z866K2": "Q117795533" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z48098K4" }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "en" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47428", "Z47428K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47428K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47428K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "fr" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47416", "Z47416K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47416K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47416K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "es" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47418", "Z47418K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47418K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47418K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "la" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47420", "Z47420K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47420K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47420K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "ml" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47422", "Z47422K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47422K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47422K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "ig" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47426", "Z47426K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47426K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47426K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" } }, "Z866K2": "dag" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z47424", "Z47424K1": { "Z1K1": "Z18", "Z18K1": "Z48098K1" }, "Z47424K2": { "Z1K1": "Z18", "Z18K1": "Z48098K2" }, "Z47424K3": { "Z1K1": "Z18", "Z18K1": "Z48098K3" } }, "Z802K3": "Z24" } } } } } } } } }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z18", "Z18K1": "Z48098K6" } } }, "Z802K3": "Z24" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact one-complement predicate realization, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes one already-selected predicate lexeme with precedence-resolved requests, an already-realized grammatical subject and one already-realized direct-object or oblique complement. Uses the registered morphology strategy and constituent order for en, fr, es, la, ml, ig and dag. Unsupported languages or complement roles preserve failure instead of choosing a fallback claim." } ] } } 4c4nvwtdoohfvzllzgwg1mrwjz0nytx Z48100 0 101861 334382 2026-10-29T12:23:22Z Jsamwrites 938 Create Finalize predicate candidates with context ordering 334382 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48100" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z48100K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "candidates" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48100K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48100K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48100" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Finalize predicate candidates with context ordering" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns the measured preferred construction candidates without expanding the shared configuration." } ] } } eueoqrccv98rpgvmbn4p9mn57tsjh7b 334385 334382 2026-10-29T12:28:36Z Jsamwrites 938 Added Z48101 to the approved list of implementations 334385 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48100" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z48100K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "candidates" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48100K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48100K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48101" ], "Z8K5": "Z48100" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Finalize predicate candidates with context ordering" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns the measured preferred construction candidates without expanding the shared configuration." } ] } } bkpvxqiff21kxf0aww76s2mzjgkmw88 334389 334385 2026-10-29T12:53:45Z Jsamwrites 938 Added Z48102 to the approved list of test cases 334389 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48100" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z48100K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "candidates" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48100K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48100K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20", "Z48102" ], "Z8K4": [ "Z14", "Z48101" ], "Z8K5": "Z48100" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Finalize predicate candidates with context ordering" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns the measured preferred construction candidates without expanding the shared configuration." } ] } } re8xuivqcasecq25ty6h36n9s2bkvg4 Z48101 0 101862 334383 2026-10-29T12:23:28Z Jsamwrites 938 Create the implementation of Finalize predicate candidates with context ordering 334383 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48101" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48100", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z48100K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z18", "Z18K1": "Z48100K3" }, "Z866K2": "" }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z48100K1" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z48092", "Z48092K1": { "Z1K1": "Z18", "Z18K1": "Z48100K1" }, "Z48092K2": { "Z1K1": "Z18", "Z18K1": "Z48100K2" }, "Z48092K3": { "Z1K1": "Z18", "Z18K1": "Z48100K3" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z48094", "Z48094K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z18", "Z18K1": "Z48100K3" }, "Z866K2": "" }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z48100K1" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z48092", "Z48092K1": { "Z1K1": "Z18", "Z18K1": "Z48100K1" }, "Z48092K2": { "Z1K1": "Z18", "Z18K1": "Z48100K2" }, "Z48092K3": { "Z1K1": "Z18", "Z18K1": "Z48100K3" } } }, "Z48094K2": { "Z1K1": "Z18", "Z18K1": "Z48100K2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Finalize predicate candidates with context ordering, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } klkjmb30yv539qq8ly74i2t92s8ihho Z48102 0 101863 334384 2026-10-29T12:27:07Z Jsamwrites 938 Create active-voice ordering tester 334384 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48102" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48100", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q211101" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z48100", "Z48100K1": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q7562091" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134480019" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q134480019" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134480019" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q211101" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1194697" } } ], [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q7562091" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134480019" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134480019" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q211101" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1317831" } } ] ], "Z48100K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q211101" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1317831" } } ], "Z48100K3": "" } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1317831" }, { "Z1K1": "Z6091", "Z6091K1": "Q1194697" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Finalize predicate candidates: active voice precedes passive voice" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } m3nofqlktsr1ay6qd12bue713eiljpm Z48103 0 101864 334391 2026-10-29T13:30:26Z 鈴音雨 101019 Create: noun phrase with a quantity (dispatches by language) 334391 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48103" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48103K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48103K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "名詞句" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48103K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48103" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Puts a quantity such as many in front of a noun phrase, in the way of the language. E.g. many and endemic species: many endemic species." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "「多数」などの量を、その言語の言い方で名詞句に付けます。例: 多数、固有種 → 多数の固有種" } ] } } sp0whpypzs0nw61cqj54wa6591h3w53 334410 334391 2026-10-29T13:39:19Z 鈴音雨 101019 Connect the implementation and testers 334410 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48103" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48103K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48103K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "名詞句" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48103K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z48108", "Z48109" ], "Z8K4": [ "Z14", "Z48118" ], "Z8K5": "Z48103" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Puts a quantity such as many in front of a noun phrase, in the way of the language. E.g. many and endemic species: many endemic species." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "「多数」などの量を、その言語の言い方で名詞句に付けます。例: 多数、固有種 → 多数の固有種" } ] } } k8tbt0l5jdqvctm5xw6wthtg3l66w9k Z48104 0 101865 334392 2026-10-29T13:30:41Z 鈴音雨 101019 Create: Japanese noun phrase with a quantity 334392 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48104" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48104K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48104K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "名詞句" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48104K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48104" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, Japanese" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句 (日本語)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Puts a quantity in front of a Japanese noun phrase with の. E.g. 多数 and 固有種: 多数の固有種." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を表す名詞と「の」を日本語の名詞句の前に付けます。例: 多数、固有種 → 多数の固有種" } ] } } cg1twzjwwm7kotdnyuot4veuz49zdy3 334412 334392 2026-10-29T13:39:46Z 鈴音雨 101019 Connect the implementation 334412 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48104" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48104K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48104K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "名詞句" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48104K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48115" ], "Z8K5": "Z48104" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, Japanese" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句 (日本語)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Puts a quantity in front of a Japanese noun phrase with の. E.g. 多数 and 固有種: 多数の固有種." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を表す名詞と「の」を日本語の名詞句の前に付けます。例: 多数、固有種 → 多数の固有種" } ] } } kry3sztaln1c7gcsycpsdcgnk15zckz Z48105 0 101866 334393 2026-10-29T13:30:55Z 鈴音雨 101019 Create: English noun phrase with a quantity 334393 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48105" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48105K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48105K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "名詞句" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48105K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48105" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, English" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句 (英語)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Puts the English adjective for a quantity in front of a noun phrase. E.g. many and endemic species: many endemic species." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を表す英語の形容詞を名詞句の前に付けます。例: many、endemic species → many endemic species" } ] } } gan4cghspyzpf7rrg5h7pt4kn0eo3me 334413 334393 2026-10-29T13:39:59Z 鈴音雨 101019 Connect the implementation 334413 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48105" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48105K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48105K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "名詞句" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48105K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48116" ], "Z8K5": "Z48105" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, English" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句 (英語)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Puts the English adjective for a quantity in front of a noun phrase. E.g. many and endemic species: many endemic species." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を表す英語の形容詞を名詞句の前に付けます。例: many、endemic species → many endemic species" } ] } } f2s6dejetdqdhq1urqp9mub5bcyt19r Z48106 0 101867 334394 2026-10-29T13:31:10Z 鈴音雨 101019 Create: default noun phrase with a quantity 334394 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48106" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48106K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48106K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "名詞句" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48106K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48106" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, default" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句 (複数言語フォールバック)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Puts the label of a quantity in front of a noun phrase, for languages without their own wording. E.g. many and endemic species: many endemic species." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量の項目のラベルを名詞句の前に付けます。例: 多数、固有種 → 多数の固有種" } ] } } srfv2kanz8qfvjzf9861l4awi5vew70 334414 334394 2026-10-29T13:40:13Z 鈴音雨 101019 Connect the implementation 334414 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48106" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48106K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48106K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "名詞句" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48106K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48117" ], "Z8K5": "Z48106" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, default" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句 (複数言語フォールバック)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Puts the label of a quantity in front of a noun phrase, for languages without their own wording. E.g. many and endemic species: many endemic species." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量の項目のラベルを名詞句の前に付けます。例: 多数、固有種 → 多数の固有種" } ] } } 2pwb9oeirbf9e2mywyngasxfsib7wio Z48107 0 101868 334395 2026-10-29T13:31:25Z 鈴音雨 101019 Create: is the clause value an item/quantity pair 334395 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48107" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z48107K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "clause value" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値" } ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48107" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "is the clause value an item/quantity pair" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値は項目と量の組か" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Tells whether a clause value is a pair of an item and a quantity item, such as endemic species and many." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値が、項目と量の項目の組 (例: 固有種と多数) かどうかを返します。" } ] } } sizz1r1yldjmq8ugnlzj3svgbczkazq 334411 334395 2026-10-29T13:39:33Z 鈴音雨 101019 Connect the implementation and testers 334411 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48107" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z48107K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "clause value" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値" } ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20", "Z48110", "Z48111" ], "Z8K4": [ "Z14", "Z48119" ], "Z8K5": "Z48107" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "is the clause value an item/quantity pair" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値は項目と量の組か" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Tells whether a clause value is a pair of an item and a quantity item, such as endemic species and many." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値が、項目と量の項目の組 (例: 固有種と多数) かどうかを返します。" } ] } } ktm5oe77dbkeaos27emw58erd1lvijc Z48108 0 101869 334396 2026-10-29T13:31:47Z 鈴音雨 101019 Tester: Japanese puts 多数の before the noun 334396 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48108" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48103", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48103", "Z48103K1": { "Z1K1": "Z6091", "Z6091K1": "Q25556293" }, "Z48103K2": "固有種", "Z48103K3": "Z1830" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "多数の固有種" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[ja] many, endemic species" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "[ja] 多数、固有種: 多数の固有種" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0pvhkabwqdutn10i0d3m0dd4jb3ya8n Z48109 0 101870 334397 2026-10-29T13:32:01Z 鈴音雨 101019 Tester: English puts many before the noun 334397 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48109" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48103", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48103", "Z48103K1": { "Z1K1": "Z6091", "Z6091K1": "Q25556293" }, "Z48103K2": "endemic species", "Z48103K3": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "many endemic species" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[en] many, endemic species" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "[en] 多数、固有種: many endemic species" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } jrntb0tghw5zi0gkqf4rk0tjauu9ppy Z48110 0 101871 334398 2026-10-29T13:32:15Z 鈴音雨 101019 Tester: a pair of two items is an item/quantity pair 334398 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48110" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48107", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48107", "Z48107K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z6091" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q113828342" }, "K2": { "Z1K1": "Z6091", "Z6091K1": "Q25556293" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item and quantity: yes" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目と量の組: はい" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ht2aadm6f9tkryoqjuj0eo9n4iyhzhv Z48111 0 101872 334399 2026-10-29T13:32:29Z 鈴音雨 101019 Tester: an item/modifier pair is not a quantity pair 334399 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48111" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48107", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48107", "Z48107K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z6" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q43619" }, "K2": "of diverse kinds" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z42" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item and modifier text: no" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目と修飾語の組: いいえ" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } m6tvk2d8akk5z9dxa9gsu2dllt74gk3 Z48112 0 101873 334400 2026-10-29T13:32:43Z 鈴音雨 101019 Tester: the quantity goes before the English noun 334400 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48112" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z44635", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z44635", "Z44635K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z6091" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q113828342" }, "K2": { "Z1K1": "Z6091", "Z6091K1": "Q25556293" } }, "Z44635K2": "Z44334", "Z44635K3": "Z1002", "Z44635K4": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "many endemic species" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[en] endemic species with many" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "[en] 固有種と多数の組" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0hh5qpubcl51h7yhz2q9dv2mpz861so Z48113 0 101874 334401 2026-10-29T13:32:56Z 鈴音雨 101019 Tester: the quantity goes before the Japanese noun 334401 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48113" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z44635", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z44635", "Z44635K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z6091" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q113828342" }, "K2": { "Z1K1": "Z6091", "Z6091K1": "Q25556293" } }, "Z44635K2": "Z44217", "Z44635K3": "Z1830", "Z44635K4": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "多数の固有種" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[ja] endemic species with many" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "[ja] 固有種と多数の組" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } pjlu0emsdd8e8js2i8uvg2oed9z7fi0 Z48114 0 101875 334404 2026-10-29T13:37:55Z 鈴音雨 101019 Create: config for noun phrase with a quantity 334404 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48114" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": "Z48104", "Z14293K2": "Z34003" }, { "Z1K1": "Z14293", "Z14293K1": "Z48105", "Z14293K2": "Z33034" } ], "Z14294K2": "Z48106" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "config for noun phrase with a quantity" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句の言語別設定" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } rzvjatubjf3xfsy29ozchjlskee7lmw Z48115 0 101876 334405 2026-10-29T13:38:09Z 鈴音雨 101019 Composition 334405 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48115" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48104", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z44123", "Z44123K1": { "Z1K1": "Z18", "Z18K1": "Z48104K1" }, "Z44123K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z44123K3": { "Z1K1": "Z18", "Z18K1": "Z48104K3" }, "Z44123K4": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1084" } ] }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z48104K3" } }, "Z10000K2": "の" }, "Z10000K2": { "Z1K1": "Z18", "Z18K1": "Z48104K2" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, Japanese, composition" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句 (日本語)、合成" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 350yir0ge16vl4mqrry5xcsin19yr64 Z48116 0 101877 334406 2026-10-29T13:38:24Z 鈴音雨 101019 Composition 334406 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48116" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48105", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z44123", "Z44123K1": { "Z1K1": "Z18", "Z18K1": "Z48105K1" }, "Z44123K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z44123K3": { "Z1K1": "Z18", "Z18K1": "Z48105K3" }, "Z44123K4": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q34698" } ] }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z48105K3" } }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z18", "Z18K1": "Z48105K2" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, English, composition" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句 (英語)、合成" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } r81xe66eroclpjr1fs567f3y9yp27wo Z48117 0 101878 334407 2026-10-29T13:38:37Z 鈴音雨 101019 Composition 334407 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48117" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48106", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z36270", "Z36270K1": { "Z1K1": "Z18", "Z18K1": "Z48106K1" }, "Z36270K2": { "Z1K1": "Z18", "Z18K1": "Z48106K3" } }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z18", "Z18K1": "Z48106K2" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, default, composition" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句 (複数言語フォールバック)、合成" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } nohyyj2qc46aerg7ogq6t6ea4wdd1b8 Z48118 0 101879 334408 2026-10-29T13:38:51Z 鈴音雨 101019 Composition 334408 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48118" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48103", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z29350", "Z29350K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z48114", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z48103K3" } } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z48103K1" }, "K2": { "Z1K1": "Z18", "Z18K1": "Z48103K2" }, "K3": { "Z1K1": "Z18", "Z18K1": "Z48103K3" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "noun phrase with a quantity, composition" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "量を伴う名詞句、合成" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } i262woeq49stu4tvkptzuapmr7exa8t Z48119 0 101880 334409 2026-10-29T13:39:05Z 鈴音雨 101019 JavaScript 334409 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48119" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48107", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z48107( Z48107K1 ) {\n\t// a pair of two items: the second one is a quantity such as many (多数)\n\tconst isItem = ( o ) =\u003E o \u0026\u0026 ( o.Z1K1 === 'Z6091' || ( o.Z1K1 \u0026\u0026 o.Z1K1.Z9K1 === 'Z6091' ) );\n\tif ( isItem( Z48107K1 ) ) {\n\t\treturn false;\n\t}\n\tconst first = Z48107K1 \u0026\u0026 ( Z48107K1.K1 || Z48107K1.Z882K1 );\n\tconst second = Z48107K1 \u0026\u0026 ( Z48107K1.K2 || Z48107K1.Z882K2 );\n\treturn isItem( first ) \u0026\u0026 isItem( second );\n}\n" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "is the clause value an item/quantity pair, JS" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値は項目と量の組か、JS" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } rprqk0yraktx2n8hxtvpax36ozqz31m 334419 334409 2026-10-29T13:49:20Z 鈴音雨 101019 An item/modifier pair whose second element is text is not a quantity pair (reading it fails in the executor) 334419 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48119" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48107", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z48107( Z48107K1 ) {\n\t// a pair of two items: the second one is a quantity such as many (多数)\n\tconst isItem = ( o ) =\u003E o \u0026\u0026 ( o.Z1K1 === 'Z6091' || ( o.Z1K1 \u0026\u0026 o.Z1K1.Z9K1 === 'Z6091' ) );\n\tif ( isItem( Z48107K1 ) ) {\n\t\treturn false;\n\t}\n\tconst first = Z48107K1 \u0026\u0026 ( Z48107K1.K1 || Z48107K1.Z882K1 );\n\tlet second;\n\ttry {\n\t\tsecond = Z48107K1 \u0026\u0026 ( Z48107K1.K2 || Z48107K1.Z882K2 );\n\t} catch ( e ) {\n\t\t// the executor cannot hand over a text element here (an item/modifier pair): not a quantity pair\n\t\treturn false;\n\t}\n\treturn isItem( first ) \u0026\u0026 isItem( second );\n}\n" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "is the clause value an item/quantity pair, JS" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値は項目と量の組か、JS" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } gjjj4vm3hnkv49ui8l7lrwlf1of8yss 334420 334419 2026-10-29T14:00:49Z 鈴音雨 101019 Guard the whole check of the second element: inspecting a text element fails in the executor 334420 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48119" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48107", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z48107( Z48107K1 ) {\n\t// a pair of two items: the second one is a quantity such as many (多数)\n\tconst isItem = ( o ) =\u003E o \u0026\u0026 ( o.Z1K1 === 'Z6091' || ( o.Z1K1 \u0026\u0026 o.Z1K1.Z9K1 === 'Z6091' ) );\n\tif ( isItem( Z48107K1 ) ) {\n\t\treturn false;\n\t}\n\tconst first = Z48107K1 \u0026\u0026 ( Z48107K1.K1 || Z48107K1.Z882K1 );\n\ttry {\n\t\treturn isItem( first ) \u0026\u0026 isItem( Z48107K1.K2 || Z48107K1.Z882K2 );\n\t} catch ( e ) {\n\t\t// the executor cannot inspect a text element here (an item/modifier pair): not a quantity pair\n\t\treturn false;\n\t}\n}\n" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "is the clause value an item/quantity pair, JS" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値は項目と量の組か、JS" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 04g4p63anfojcjm0fdm55cyzyagy422 334421 334420 2026-10-29T14:11:57Z 鈴音雨 101019 Composition instead of JavaScript: a pair whose second element is of type Z6091 334421 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48119" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48107", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z44634", "Z44634K1": { "Z1K1": "Z18", "Z18K1": "Z48107K1" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13052", "Z13052K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z822", "Z822K1": { "Z1K1": "Z18", "Z18K1": "Z48107K1" } } }, "Z13052K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z4K1" }, "Z803K2": "Z6091" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item/quantity pair check, composition" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "節の値は項目と量の組か、合成" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 1erivxra7ie4m32isjzpktq0noujvfa Talk:Z48103 1 101881 334425 2026-10-29T14:23:49Z 鈴音雨 101019 Categories 334425 wikitext text/x-wiki [[Category:Multilingual_NLG_functions]] [[Category:NLG_functions_returning_untagged_Strings]] gxuwpubqfy2m27dz8jp3ywhol6u3s3p Talk:Z48104 1 101882 334426 2026-10-29T14:24:02Z 鈴音雨 101019 Categories 334426 wikitext text/x-wiki [[Category:Japanese_natural_language_generation_functions]] [[Category:NLG_functions_returning_untagged_Strings]] glo5iahl7k2vf3cg3f3w90impccr7r7 Talk:Z48105 1 101883 334427 2026-10-29T14:24:15Z 鈴音雨 101019 Categories 334427 wikitext text/x-wiki [[Category:English_natural_language_generation_functions]] [[Category:NLG_functions_returning_untagged_Strings]] oe3dy2ayo31nbxrwfl30qsqyw4u0nx5 Talk:Z48106 1 101884 334428 2026-10-29T14:24:29Z 鈴音雨 101019 Categories 334428 wikitext text/x-wiki [[Category:NLG_functions_returning_untagged_Strings]] darf48vuetfjcc659f8pt45jax694dw Talk:Z48107 1 101885 334429 2026-10-29T14:24:42Z 鈴音雨 101019 Categories 334429 wikitext text/x-wiki [[Category:Multilingual_NLG_functions]] qgyydyx23nla5jtxn7j3ylkuxk4jk9j Z48120 0 101886 334430 2026-10-29T15:01:57Z Mdm.Bla 103171 created - wip 334430 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48120" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z48120K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject reference" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z48120K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property reference" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z48120K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property subreference" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48120" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Property of subject is WD value used twice" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } eerdfci8wwjj3jwey0r1wpiaf8x13ue 334432 334430 2026-10-29T15:33:10Z Mdm.Bla 103171 lang 334432 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48120" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z48120K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject reference" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z48120K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property reference" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z48120K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property subreference" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48120K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48120" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Property of subject is WD value used twice" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 6a0hp20swa0uzezq2rwadr3hykqcpf2 Z48121 0 101887 334431 2026-10-29T15:32:30Z Mdm.Bla 103171 334431 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48121" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48120", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48120", "Z48120K1": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q758098" } }, "Z48120K2": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "P609" } }, "Z48120K3": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q684" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K2": { "Z1K1": "Z89", "Z89K1": "The east terminus location of California State Route 126 is Santa Clarita." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } d1uxm16b3u70xrtzx1yoxubfolmr4mf 334433 334431 2026-10-29T15:35:01Z Mdm.Bla 103171 lang 334433 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48121" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48120", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48120", "Z48120K1": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q758098" } }, "Z48120K2": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "P609" } }, "Z48120K3": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q684" } }, "Z48120K4": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K2": { "Z1K1": "Z89", "Z89K1": "The east terminus location of California State Route 126 is Santa Clarita." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 6909pb48z98r0g88cx0p3m721mj88wu 334434 334433 2026-10-29T15:38:06Z Mdm.Bla 103171 spans 334434 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48121" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48120", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48120", "Z48120K1": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q758098" } }, "Z48120K2": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "P609" } }, "Z48120K3": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q684" } }, "Z48120K4": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K2": { "Z1K1": "Z89", "Z89K1": "The \u003Cspan lang=\"en-US\"\u003Eeastern\u003C/span\u003E \u003Cspan lang=\"en-US\"\u003Eterminus\u003C/span\u003E of \u003Cspan lang=\"en-us\"\u003ECalifornia State Route 126\u003C/span\u003E is \u003Cspan lang=\"en-US\"\u003ESanta Clarita\u003C/span\u003E." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "CA126" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } hzc7reqg5v68ul791aols3aai0ss0nm 334435 334434 2026-10-29T15:38:38Z Mdm.Bla 103171 334435 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48121" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48120", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48120", "Z48120K1": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q758098" } }, "Z48120K2": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "P609" } }, "Z48120K3": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q684" } }, "Z48120K4": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K2": { "Z1K1": "Z89", "Z89K1": "The \u003Cspan lang=\"en-US\"\u003Eeast\u003C/span\u003E \u003Cspan lang=\"en-US\"\u003Eterminus\u003C/span\u003E of \u003Cspan lang=\"en-us\"\u003ECalifornia State Route 126\u003C/span\u003E is \u003Cspan lang=\"en-US\"\u003ESanta Clarita\u003C/span\u003E." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "CA126" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } o6c87a23165vvid4uimzgjfdmknvchq Z48122 0 101888 334436 2026-10-29T15:42:40Z Mdm.Bla 103171 334436 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48122" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48120", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z36218", "Z36218K1": { "Z1K1": "Z6091", "Z6091K1": "" }, "Z36218K2": { "Z1K1": "Z6092", "Z6092K1": "" }, "Z36218K3": "Z1002" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 3k58p4qifgl498gyrjjm24ycffch94q 334686 334436 2026-10-30T11:11:13Z HenkvD 1290 English label 334686 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48122" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48120", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z36218", "Z36218K1": { "Z1K1": "Z6091", "Z6091K1": "" }, "Z36218K2": { "Z1K1": "Z6092", "Z6092K1": "" }, "Z36218K3": "Z1002" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Property of subject is WD value used twice Comp" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } hga30yudsn45z4n6ohagwz3hjcoay91 Z48123 0 101889 334437 2026-10-29T16:15:42Z ReXLer 39813 334437 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48123" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z7", "Z17K2": "Z48123K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48123K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48123" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on an HTML fragment" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Runs a string function on an HTML fragment. (only works for functions with 1 input)" } ] } } pe7y9jrybfgclwfw0azklbzy75n0q8v 334440 334437 2026-10-29T16:21:56Z ReXLer 39813 Added Z48124 to the approved list of implementations 334440 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48123" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z7", "Z17K2": "Z48123K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48123K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48124" ], "Z8K5": "Z48123" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on an HTML fragment" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Runs a string function on an HTML fragment. (only works for functions with 1 input)" } ] } } totmb5hnei5kx80j91cnsx3kassgs3r 334441 334440 2026-10-29T16:22:14Z ReXLer 39813 Removed Z48124 from the approved list of implementations 334441 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48123" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z7", "Z17K2": "Z48123K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48123K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48123" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on an HTML fragment" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Runs a string function on an HTML fragment. (only works for functions with 1 input)" } ] } } pe7y9jrybfgclwfw0azklbzy75n0q8v 334442 334441 2026-10-29T16:22:21Z ReXLer 39813 334442 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48123" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z48123K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48123K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48123" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on an HTML fragment" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Runs a string function on an HTML fragment. (only works for functions with 1 input)" } ] } } apbtmfwewi9e8505q3rhajk2l9a99nb 334443 334442 2026-10-29T16:22:31Z ReXLer 39813 Added Z48124 to the approved list of implementations 334443 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48123" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z48123K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48123K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48124" ], "Z8K5": "Z48123" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on an HTML fragment" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Runs a string function on an HTML fragment. (only works for functions with 1 input)" } ] } } 4w1bmv6vbnike9zzhh8ry43f4eluian 334445 334443 2026-10-29T16:24:24Z ReXLer 39813 Added Z48125 to the approved list of test cases 334445 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48123" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z48123K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48123K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z48125" ], "Z8K4": [ "Z14", "Z48124" ], "Z8K5": "Z48123" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on an HTML fragment" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Runs a string function on an HTML fragment. (only works for functions with 1 input)" } ] } } h68vkpq957ma3gfuy4x2r8pd5eazf48 334507 334445 2026-10-29T23:54:11Z ReXLer 39813 334507 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48123" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z48123K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48123K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z48125" ], "Z8K4": [ "Z14", "Z48124" ], "Z8K5": "Z48123" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a one input String function on HTML" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Runs a string function on an HTML fragment. (only works for functions with 1 input)" } ] } } oc3dv3p3nwtopryi270x2t2vqykw81d Z48124 0 101890 334438 2026-10-29T16:19:31Z ReXLer 39813 334438 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48124" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48123", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z47997", "Z47997K1": { "Z1K1": "Z7", "Z7K1": "Z13036", "Z13036K1": { "Z1K1": "Z18", "Z18K1": "Z48123K1" }, "Z13036K2": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z18", "Z18K1": "Z48123K2" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } q1qj3nxnutas72kljhpyo946dw0j6nr 334439 334438 2026-10-29T16:21:43Z ReXLer 39813 334439 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48124" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48123", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z47997", "Z47997K1": { "Z1K1": "Z7", "Z7K1": "Z13036", "Z13036K1": { "Z1K1": "Z18", "Z18K1": "Z48123K1" }, "Z13036K2": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z18", "Z18K1": "Z48123K2" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on HTML, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ldsfhothbil0iawppqzv2frac0coafm 334509 334439 2026-10-29T23:56:47Z ReXLer 39813 334509 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48124" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48123", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z47997", "Z47997K1": { "Z1K1": "Z7", "Z7K1": "Z13036", "Z13036K1": { "Z1K1": "Z18", "Z18K1": "Z48123K1" }, "Z13036K2": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z18", "Z18K1": "Z48123K2" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a 1in String function on HTML, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ni2qc2yofndauhqgibgh6mky7eo2u51 Z48125 0 101891 334444 2026-10-29T16:24:08Z ReXLer 39813 334444 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48125" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48123", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48123", "Z48123K1": "Z10938", "Z48123K2": { "Z1K1": "Z89", "Z89K1": "\u0026lt;i\u0026gt;Hi!\u0026lt;/i\u0026gt;" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K2": { "Z1K1": "Z89", "Z89K1": "\u003Ci\u003EHi!\u003C/i\u003E" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "apply Z10938 on HTML" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } n0hfpfo4nftfy5r204b76pim5gq20hi Z48126 0 101892 334446 2026-10-29T16:24:25Z Jsamwrites 938 Create Compact selected-predicate upstream bridge 334446 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48126" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z17K2": "Z48126K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected construction and predicate lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48126K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z48126K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "precedence-resolved requests" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z48126K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical-subject phrase" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48126K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "complement role" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z48126K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "complement phrase" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48126" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact selected-predicate upstream bridge" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Takes one already-selected construction and predicate lexeme, precedence-resolved requests, an already-selected grammatical-subject phrase, an exact complement role and an already-selected complement phrase. Realizes each participant once and calls the registered compact predicate realizer without constructing a deferred predicate phrase. Missing selection and unsupported roles preserve failure." } ] } } qf58sw1cumnry73kx1oqxh1uvxcm1lj 334448 334446 2026-10-29T16:27:28Z Jsamwrites 938 Added Z48127 to the approved list of implementations 334448 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48126" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z17K2": "Z48126K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected construction and predicate lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48126K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z48126K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "precedence-resolved requests" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z48126K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical-subject phrase" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48126K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "complement role" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z48126K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "complement phrase" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48127" ], "Z8K5": "Z48126" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact selected-predicate upstream bridge" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Takes one already-selected construction and predicate lexeme, precedence-resolved requests, an already-selected grammatical-subject phrase, an exact complement role and an already-selected complement phrase. Realizes each participant once and calls the registered compact predicate realizer without constructing a deferred predicate phrase. Missing selection and unsupported roles preserve failure." } ] } } apt9xsmlv54f3fowy0564svib9dlhcd Z48127 0 101893 334447 2026-10-29T16:24:32Z Jsamwrites 938 Create implementation of Compact selected-predicate upstream bridge 334447 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48127" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48126", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z48098", "Z48098K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48126K1" } } }, "Z48098K2": { "Z1K1": "Z18", "Z18K1": "Z48126K2" }, "Z48098K3": { "Z1K1": "Z18", "Z18K1": "Z48126K3" }, "Z48098K4": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z48126K4" } } }, "Z48098K5": { "Z1K1": "Z18", "Z18K1": "Z48126K5" }, "Z48098K6": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z48126K6" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact selected-predicate upstream bridge, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Takes one already-selected construction and predicate lexeme, precedence-resolved requests, an already-selected grammatical-subject phrase, an exact complement role and an already-selected complement phrase. Realizes each participant once and calls the registered compact predicate realizer without constructing a deferred predicate phrase. Missing selection and unsupported roles preserve failure." } ] } } p6pranjon9aqgmazno04a1ly03rhz4g Translations:Wikifunctions:Status updates/2026-10-25/12/de 1198 101894 334452 2026-10-29T19:25:06Z Ameisenigel 44 Created page with "Das Freiwilligentreffen in diesem Monat (12. Oktober 2026) ist [[$1|jetzt als Aufzeichnung auf Commons verfügbar]]. Vielen Dank für die lebhafte Diskussion und die neuen Ideen!" 334452 wikitext text/x-wiki Das Freiwilligentreffen in diesem Monat (12. Oktober 2026) ist [[$1|jetzt als Aufzeichnung auf Commons verfügbar]]. Vielen Dank für die lebhafte Diskussion und die neuen Ideen! iomj1mbeb9qn15jkfonuj6ljhhxrpnz Translations:Wikifunctions:Status updates/2026-10-25/13/de 1198 101895 334454 2026-10-29T19:25:39Z Ameisenigel 44 Created page with "=== Nächstes Freiwilligentreffen am 9. November um 12:00 MEZ ===" 334454 wikitext text/x-wiki === Nächstes Freiwilligentreffen am 9. November um 12:00 MEZ === t0bmk4ejjurwd71z796fzvtcimtsdqm Translations:Wikifunctions:How to create implementations/342/de 1198 101896 334456 2026-10-29T19:36:16Z Ameisenigel 44 Created page with "Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben:" 334456 wikitext text/x-wiki Während die Fehlertyp-Bezeichnung <code>No matching lexeme for item in language</code> lautet, sollte eine bessere Fehlermeldung angeben: 62hr14djlu6ruae50icdsfxtr45zlhp Translations:Wikifunctions:How to create implementations/343/de 1198 101897 334458 2026-10-29T19:37:12Z Ameisenigel 44 Created page with "welches Datenobjekt fehlschlägt," 334458 wikitext text/x-wiki welches Datenobjekt fehlschlägt, 9p5dtuekl0g1nc07xedt6vqfdq3vum3 Translations:Wikifunctions:How to create implementations/344/de 1198 101898 334460 2026-10-29T19:37:34Z Ameisenigel 44 Created page with "welche Sprache fehlt, und" 334460 wikitext text/x-wiki welche Sprache fehlt, und 6fd2loh1yewoebz435g5x8ecdmhd76f Translations:Wikifunctions:How to create implementations/345/de 1198 101899 334462 2026-10-29T19:38:03Z Ameisenigel 44 Created page with "welche Möglichkeiten zur Fehlerbehebung es gibt." 334462 wikitext text/x-wiki welche Möglichkeiten zur Fehlerbehebung es gibt. p84rjc6hpt3cb9xliwu49xn1rj4pp57 Translations:Wikifunctions:How to create implementations/346/de 1198 101900 334464 2026-10-29T19:39:36Z Ameisenigel 44 Created page with "Das Feld der Fehlermeldung $1 kann diese Funktionalität bereitstellen. Sobald für einen Fehlertyp eine Fehlermeldung in der Sprache des Benutzers (oder einer seiner Rückfallwerte) vorliegt, wird die angezeigte Fehlermeldung wie folgt ausgegeben:" 334464 wikitext text/x-wiki Das Feld der Fehlermeldung $1 kann diese Funktionalität bereitstellen. Sobald für einen Fehlertyp eine Fehlermeldung in der Sprache des Benutzers (oder einer seiner Rückfallwerte) vorliegt, wird die angezeigte Fehlermeldung wie folgt ausgegeben: ij3ec7va2mz7j4ugpmolzws1tujaffo Translations:Wikifunctions:How to create implementations/347/de 1198 101901 334466 2026-10-29T19:42:17Z Ameisenigel 44 Created page with "Zuerst werden die Parameter der Meldung durch die Werte der Schlüssel ersetzt. In unserem Beispiel wird jedes $1 durch den Wert von $2 ("Q319"), $3 durch "P5137" und $4 durch "ast" ersetzt." 334466 wikitext text/x-wiki Zuerst werden die Parameter der Meldung durch die Werte der Schlüssel ersetzt. In unserem Beispiel wird jedes $1 durch den Wert von $2 ("Q319"), $3 durch "P5137" und $4 durch "ast" ersetzt. 31truhhmxqmnn4fszwts824n3cdqube Translations:Wikifunctions:How to create implementations/348/de 1198 101902 334468 2026-10-29T19:43:36Z Ameisenigel 44 Created page with "Abschließend erfolgt die Bereinigung und Ausgabe der HTML-Nachricht." 334468 wikitext text/x-wiki Abschließend erfolgt die Bereinigung und Ausgabe der HTML-Nachricht. nuza9gr4pwiq941uaretg2nihd6sz9x Translations:Wikifunctions:How to create implementations/349/de 1198 101903 334470 2026-10-29T19:43:50Z Ameisenigel 44 Created page with "Eine HTML-Nachricht wie:" 334470 wikitext text/x-wiki Eine HTML-Nachricht wie: lm0ygfaec4wi1v7dl12n83fm0aqth4e Translations:Wikifunctions:How to create implementations/350/de 1198 101904 334472 2026-10-29T19:43:55Z Ameisenigel 44 Created page with "Wird zu:" 334472 wikitext text/x-wiki Wird zu: 31zsi63q4cy6vne508svdolfktq0lni Translations:Template:Main page/News/53/de 1198 101905 334481 2026-10-29T20:22:55Z Ameisenigel 44 Created page with "$1: Wikiabstrak-App" 334481 wikitext text/x-wiki $1: Wikiabstrak-App mr1ql7g5a5386ssslakih77f61w03xy Translations:Wikifunctions:Status updates/142/de 1198 101906 334483 2026-10-29T20:23:07Z Ameisenigel 44 Created page with "$1: Wikiabstrak-App" 334483 wikitext text/x-wiki $1: Wikiabstrak-App mr1ql7g5a5386ssslakih77f61w03xy Z48128 0 101907 334490 2026-10-29T21:41:43Z Virinas-code 2884 334490 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48128" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z39619", "Z20K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z39619", "Z39619K1": { "Z1K1": "Z13518", "Z13518K1": "4" }, "Z39619K2": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "K1": { "Z1K1": "Z40", "Z40K1": "Z42" }, "K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "K3": { "Z1K1": "Z40", "Z40K1": "Z42" }, "K4": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z42" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function (4, 1) (F, T, F, F) = F" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } iypbrdjlhysedrkne4a2gmclexoz8cs Z48129 0 101908 334492 2026-10-29T21:44:07Z Comfyquiettree 6942 334492 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48129" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z36184", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z26107", "Z26107K1": { "Z1K1": "Z18", "Z18K1": "Z36184K4" }, "Z26107K2": { "Z1K1": "Z7", "Z7K1": "Z21394", "Z21394K1": [ "Z6", { "Z1K1": "Z7", "Z7K1": "Z23753", "Z23753K1": { "Z1K1": "Z18", "Z18K1": "Z36184K1" }, "Z23753K2": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } }, "je", { "Z1K1": "Z7", "Z7K1": "Z14396", "Z14396K1": { "Z1K1": "Z7", "Z7K1": "Z39422", "Z39422K1": { "Z1K1": "Z18", "Z18K1": "Z36184K3" }, "Z39422K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146233" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ], "Z39422K3": "Z1062" } } ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "defining role sentence in Czech, Composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0vydsihyif8k1ec95nksclyjjdemizk 334502 334492 2026-10-29T23:05:13Z Comfyquiettree 6942 334502 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48129" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z36184", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z26107", "Z26107K1": { "Z1K1": "Z18", "Z18K1": "Z36184K4" }, "Z26107K2": { "Z1K1": "Z7", "Z7K1": "Z22504", "Z22504K1": [ "Z6", { "Z1K1": "Z7", "Z7K1": "Z23753", "Z23753K1": { "Z1K1": "Z18", "Z18K1": "Z36184K1" }, "Z23753K2": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } }, "je", { "Z1K1": "Z7", "Z7K1": "Z23753", "Z23753K1": { "Z1K1": "Z18", "Z18K1": "Z36184K2" }, "Z23753K2": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } }, { "Z1K1": "Z7", "Z7K1": "Z14396", "Z14396K1": { "Z1K1": "Z7", "Z7K1": "Z39422", "Z39422K1": { "Z1K1": "Z18", "Z18K1": "Z36184K3" }, "Z39422K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146233" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ], "Z39422K3": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } } } ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "defining role sentence in Czech, Composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } rbq1modz0vtuwdqceiy804z49puvkq8 334503 334502 2026-10-29T23:07:01Z Comfyquiettree 6942 adding a dot 334503 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48129" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z36184", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z26107", "Z26107K1": { "Z1K1": "Z18", "Z18K1": "Z36184K4" }, "Z26107K2": { "Z1K1": "Z7", "Z7K1": "Z22504", "Z22504K1": [ "Z6", { "Z1K1": "Z7", "Z7K1": "Z23753", "Z23753K1": { "Z1K1": "Z18", "Z18K1": "Z36184K1" }, "Z23753K2": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } }, "je", { "Z1K1": "Z7", "Z7K1": "Z23753", "Z23753K1": { "Z1K1": "Z18", "Z18K1": "Z36184K2" }, "Z23753K2": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } }, { "Z1K1": "Z7", "Z7K1": "Z14396", "Z14396K1": { "Z1K1": "Z7", "Z7K1": "Z39422", "Z39422K1": { "Z1K1": "Z18", "Z18K1": "Z36184K3" }, "Z39422K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146233" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ], "Z39422K3": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } } }, "." ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "defining role sentence in Czech, Composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ajn2igegqr2uq0eqzxys04vtduzl2gj 334505 334503 2026-10-29T23:22:59Z Comfyquiettree 6942 removing dot to force refresh test 334505 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48129" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z36184", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z26107", "Z26107K1": { "Z1K1": "Z18", "Z18K1": "Z36184K4" }, "Z26107K2": { "Z1K1": "Z7", "Z7K1": "Z22504", "Z22504K1": [ "Z6", { "Z1K1": "Z7", "Z7K1": "Z23753", "Z23753K1": { "Z1K1": "Z18", "Z18K1": "Z36184K1" }, "Z23753K2": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } }, "je", { "Z1K1": "Z7", "Z7K1": "Z23753", "Z23753K1": { "Z1K1": "Z18", "Z18K1": "Z36184K2" }, "Z23753K2": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } }, { "Z1K1": "Z7", "Z7K1": "Z14396", "Z14396K1": { "Z1K1": "Z7", "Z7K1": "Z39422", "Z39422K1": { "Z1K1": "Z18", "Z18K1": "Z36184K3" }, "Z39422K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146233" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ], "Z39422K3": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } } } ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "defining role sentence in Czech, Composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } rbq1modz0vtuwdqceiy804z49puvkq8 334506 334505 2026-10-29T23:34:53Z Comfyquiettree 6942 replacing monolingual text from language and string with join list of strings with spaces 334506 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48129" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z36184", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z22511", "Z22511K1": { "Z1K1": "Z7", "Z7K1": "Z22504", "Z22504K1": [ "Z6", { "Z1K1": "Z7", "Z7K1": "Z23753", "Z23753K1": { "Z1K1": "Z18", "Z18K1": "Z36184K1" }, "Z23753K2": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } }, "je", { "Z1K1": "Z7", "Z7K1": "Z23753", "Z23753K1": { "Z1K1": "Z18", "Z18K1": "Z36184K2" }, "Z23753K2": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } }, { "Z1K1": "Z7", "Z7K1": "Z14396", "Z14396K1": { "Z1K1": "Z7", "Z7K1": "Z39422", "Z39422K1": { "Z1K1": "Z18", "Z18K1": "Z36184K3" }, "Z39422K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146233" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ], "Z39422K3": { "Z1K1": "Z18", "Z18K1": "Z36184K4" } } } ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "defining role sentence in Czech, Composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } keasmu9gasj688zh6exkftf4lanxgdp Z48130 0 101909 334493 2026-10-29T21:47:22Z Comfyquiettree 6942 334493 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48130" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z36184", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z36184", "Z36184K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z36184K2": { "Z1K1": "Z6091", "Z6091K1": "Q5119" }, "Z36184K3": { "Z1K1": "Z6091", "Z6091K1": "Q142" }, "Z36184K4": "Z1062" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z14392", "Z14392K2": { "Z1K1": "Z11", "Z11K1": { "Z1K1": "Z9", "Z9K1": "" }, "Z11K2": "Paříž je hlavní město Francie." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "Paříž je hlavní město Francie." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 8i70290w3s3hj1jvcy2w2j0qqw6rdsp 334494 334493 2026-10-29T21:48:06Z Comfyquiettree 6942 334494 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48130" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z36184", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z36184", "Z36184K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z36184K2": { "Z1K1": "Z6091", "Z6091K1": "Q5119" }, "Z36184K3": { "Z1K1": "Z6091", "Z6091K1": "Q142" }, "Z36184K4": "Z1062" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z14392", "Z14392K2": { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "Paříž je hlavní město Francie." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "Paříž je hlavní město Francie." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 5r8zh4bof73upjrqoxj1lwmr4w1n4vo 334684 334494 2026-10-30T11:08:59Z HenkvD 1290 English label 334684 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48130" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z36184", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z36184", "Z36184K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z36184K2": { "Z1K1": "Z6091", "Z6091K1": "Q5119" }, "Z36184K3": { "Z1K1": "Z6091", "Z6091K1": "Q142" }, "Z36184K4": "Z1062" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z14392", "Z14392K2": { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "Paříž je hlavní město Francie." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "Paříž je hlavní město Francie." }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "cz Paříž je hlavní město Francie." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } fdo0e1vw0ib2rqa8t54ver55wj2kds6 Z48131 0 101910 334495 2026-10-29T21:49:08Z Virinas-code 2884 334495 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48131" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z39619", "Z14K2": "Z39619" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function (composition)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 1c04kp5062vnwceryj9lt626de9okae 334496 334495 2026-10-29T21:55:22Z Virinas-code 2884 First attempt at a raw JSON implementation, only default Z8 keys for now 334496 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48131" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z39619", "Z14K2": { "Z1K1": "Z8", "Z8K1": [ "Z17" ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z39619" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function (composition)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } nx3gbg5e729czj4cynrvlr570z42bqr 334497 334496 2026-10-29T21:58:10Z Virinas-code 2884 Add beginning of implementation via raw JSON 334497 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48131" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z39619", "Z14K2": { "Z1K1": "Z8", "Z8K1": [ "Z17" ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": { "Z1K1": "Z7", "Z7K1": "Z39619" }, "Z14K2": { "Z1K1": "Z18", "Z18K1": "K" } } ], "Z8K5": "Z39619" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function (composition)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } pssa49to7q5bik09irboqkg86y2vqvi 334498 334497 2026-10-29T22:01:14Z Virinas-code 2884 Add parameters to Z8K4 function call 334498 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48131" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z39619", "Z14K2": { "Z1K1": "Z8", "Z8K1": [ "Z17" ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": { "Z1K1": "Z7", "Z7K1": "Z39619", "Z39619K1": { "Z1K1": "Z18", "Z18K1": "Z39619K1" }, "Z39619K2": { "Z1K1": "Z18", "Z18K1": "Z39619K2" } }, "Z14K2": { "Z1K1": "Z18", "Z18K1": "K" } } ], "Z8K5": "Z39619" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function (composition)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 4f5aqwy7ls33hzweqw0ik04ecrsvczr 334499 334498 2026-10-29T22:04:28Z Virinas-code 2884 Fix implementation 334499 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48131" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z39619", "Z14K2": { "Z1K1": "Z8", "Z8K1": [ "Z17" ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": { "Z1K1": "Z7", "Z7K1": "Z39619", "Z39619K1": { "Z1K1": "Z18", "Z18K1": "Z39619K1" }, "Z39619K2": { "Z1K1": "Z18", "Z18K1": "Z39619K2" } }, "Z14K2": { "Z1K1": "Z18", "Z18K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "K", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z39619K2" } } } } } ], "Z8K5": "Z39619" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Projection function (composition)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 4saau43icl4re6vmq0rlb0l5k8u3ku6 Z48132 0 101911 334508 2026-10-29T23:56:14Z ReXLer 39813 334508 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48132" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z48132K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48132K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48132K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "input to insert HTML" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z48132K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "extra inputs" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48132" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on HTML" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 3eq3ewfmcovnbq5w1vumpn5akwjsdty 334512 334508 2026-10-29T23:59:35Z ReXLer 39813 Added Z48133 to the approved list of implementations 334512 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48132" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z48132K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48132K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48132K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "input to insert HTML" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z48132K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "extra inputs" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48133" ], "Z8K5": "Z48132" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on HTML" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } f3t6qe8mdsebuzeq9p6e75j5xncmaw5 334514 334512 2026-10-30T00:01:00Z ReXLer 39813 Added Z48134 to the approved list of test cases 334514 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48132" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z48132K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48132K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48132K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "input to insert HTML" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z48132K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "extra inputs" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z48134" ], "Z8K4": [ "Z14", "Z48133" ], "Z8K5": "Z48132" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on HTML" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 282jkb6h1qb8dp5fom7gqmggbtqzm3p 334516 334514 2026-10-30T00:03:18Z ReXLer 39813 Added Z48135 to the approved list of test cases 334516 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48132" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z48132K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z48132K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value to operate on" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48132K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "input to insert HTML" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z48132K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "extra inputs" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z48134", "Z48135" ], "Z8K4": [ "Z14", "Z48133" ], "Z8K5": "Z48132" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on HTML" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 1zlzbgvrndo2fn1w6wwcggwj8tf3wq3 Z48133 0 101912 334510 2026-10-29T23:58:42Z ReXLer 39813 334510 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48133" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48132", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z47997", "Z47997K1": { "Z1K1": "Z7", "Z7K1": "Z22074", "Z22074K1": { "Z1K1": "Z18", "Z18K1": "Z48132K1" }, "Z22074K2": { "Z1K1": "Z7", "Z7K1": "Z31345", "Z31345K1": { "Z1K1": "Z18", "Z18K1": "Z48132K4" }, "Z31345K2": { "Z1K1": "Z18", "Z18K1": "Z48132K3" }, "Z31345K3": { "Z1K1": "Z18", "Z18K1": "Z48132K2" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on HTML, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 8hua0axvo2a4ouaf7cfyghwr5iaflng 334511 334510 2026-10-29T23:59:19Z ReXLer 39813 334511 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48133" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48132", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z47997", "Z47997K1": { "Z1K1": "Z7", "Z7K1": "Z22074", "Z22074K1": { "Z1K1": "Z18", "Z18K1": "Z48132K1" }, "Z22074K2": { "Z1K1": "Z7", "Z7K1": "Z31345", "Z31345K1": { "Z1K1": "Z18", "Z18K1": "Z48132K4" }, "Z31345K2": { "Z1K1": "Z18", "Z18K1": "Z48132K3" }, "Z31345K3": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z18", "Z18K1": "Z48132K2" } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "operate a String function on HTML, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 907xjf16i1bdcwohjq5zybnxqtdoprj Z48134 0 101913 334513 2026-10-30T00:00:26Z ReXLer 39813 334513 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48134" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48132", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48132", "Z48132K1": "Z10075", "Z48132K2": { "Z1K1": "Z89", "Z89K1": "hey banana" }, "Z48132K3": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z48132K4": [ "Z1", "banana", "joe" ] }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K2": { "Z1K1": "Z89", "Z89K1": "hey joe" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Z10075, multiple inputs" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 305dezda5ix8j6yzzcpdl52gfcck8gv Z48135 0 101914 334515 2026-10-30T00:03:05Z ReXLer 39813 334515 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48135" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48132", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48132", "Z48132K1": "Z10938", "Z48132K2": { "Z1K1": "Z89", "Z89K1": "\u0026lt;i\u0026gt;Hi!\u0026lt;/i\u0026gt;" }, "Z48132K3": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z48132K4": [ "Z1" ] }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K2": { "Z1K1": "Z89", "Z89K1": "\u003Ci\u003EHi!\u003C/i\u003E" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Z10938, apply one input function" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0c43rlysp7edgmxzmdgkuk6asxug4yy Z48136 0 101915 334517 2026-10-30T00:41:42Z Jsamwrites 938 Create Predicate candidates for classification 334517 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48136" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17" ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48136" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate candidates for classification" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns the measured preferred construction candidates without expanding the shared configuration." } ] } } mjww5m6cp8p9l2gva7lq87qz25rupkc 334519 334517 2026-10-30T00:45:44Z Jsamwrites 938 Added Z48137 to the approved list of implementations 334519 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48136" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17" ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48137" ], "Z8K5": "Z48136" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate candidates for classification" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns the measured preferred construction candidates without expanding the shared configuration." } ] } } rvjd12xnapysn4qn946s4byzpxatvcu Z48137 0 101916 334518 2026-10-30T00:41:47Z Jsamwrites 938 Create the implementation of Predicate candidates for classification 334518 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48137" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48136", "Z14K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } } ] ] }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate candidates for classification, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 7fq0zpqtsckhokbfj3359iolz74nh2k Z48138 0 101917 334526 2026-10-30T01:26:29Z Jsamwrites 938 Create Compact English predicative-noun realization 334526 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48138" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48138K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48138K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48138K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48138" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact English predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } i5adkksrlqnobtuf6egsw6dthwtnpg0 334546 334526 2026-10-30T01:30:57Z Jsamwrites 938 Added Z48139 to the approved list of implementations 334546 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48138" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48138K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48138K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48138K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48139" ], "Z8K5": "Z48138" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact English predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } bcyz1zhkqag7nsskrmtrj331i9e5dmd Z48139 0 101918 334527 2026-10-30T01:26:36Z Jsamwrites 938 Create Compact English predicative-noun realization, composition 334527 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48139" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48138", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K11", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K13", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L1883" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46395K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K13" } }, "Z46395K3": [ "Z39328" ] }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z8K11" } } } } } ], "Z8K5": "Z8" }, "Z8K13": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z48138K3" }, "Z8K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } } } } ], "Z8K5": "Z8" }, "Z8K11": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z46075", "Z46075K1": { "Z1K1": "Z7", "Z7K1": "Z46205", "Z46205K1": { "Z1K1": "Z6095", "Z6095K1": "L2767" }, "Z46205K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46075K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46075K3": { "Z1K1": "Z6096", "Z6096K1": "L2767-S1" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z48138K1" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "en" } } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z48138K2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact English predicative-noun realization, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } fgfhp8pq3u9mxaiu368f53ko5d6osxo Z48140 0 101919 334528 2026-10-30T01:26:42Z Jsamwrites 938 Create Compact French predicative-noun realization 334528 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48140" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48140K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48140K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48140K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48140" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact French predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } lxaiijw776o756gooreg584o6jj8vct 334540 334528 2026-10-30T01:30:05Z Jsamwrites 938 Added Z48141 to the approved list of implementations 334540 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48140" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48140K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48140K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48140K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48141" ], "Z8K5": "Z48140" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact French predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } iz8qbs2x5uwjd09yxdxqpn9fcerx7ob Z48141 0 101920 334529 2026-10-30T01:26:48Z Jsamwrites 938 Create Compact French predicative-noun realization, composition 334529 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48141" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48140", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K11", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K13", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L1882" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46395K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K13" } }, "Z46395K3": [ "Z39328" ] }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z8K11" } } } } } ], "Z8K5": "Z8" }, "Z8K13": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q108524486" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z48140K3" }, "Z8K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } } } } ], "Z8K5": "Z8" }, "Z8K11": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46075", "Z46075K1": { "Z1K1": "Z7", "Z7K1": "Z46205", "Z46205K1": { "Z1K1": "Z6095", "Z6095K1": "L9111" }, "Z46205K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46075K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46075K3": { "Z1K1": "Z6096", "Z6096K1": "L9111-S1" } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z48140K1" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "fr" } } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z48140K2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact French predicative-noun realization, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } ilbofrpbnrwp1u7neptkk305xd5albw Z48142 0 101921 334530 2026-10-30T01:26:55Z Jsamwrites 938 Create Compact Spanish predicative-noun realization 334530 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48142" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48142K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48142K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48142K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48142" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Spanish predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } 98xxew1udmcc4nomwms62ofx4yeljkd 334541 334530 2026-10-30T01:30:14Z Jsamwrites 938 Added Z48143 to the approved list of implementations 334541 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48142" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48142K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48142K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48142K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48143" ], "Z8K5": "Z48142" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Spanish predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } 0r9p9f9273ypemjvt7mwtp7ylhzovm3 Z48143 0 101922 334531 2026-10-30T01:27:01Z Jsamwrites 938 Create Compact Spanish predicative-noun realization, composition 334531 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48143" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48142", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K11", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K13", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L5140" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46395K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K13" } }, "Z46395K3": [ "Z39328" ] }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z8K11" } } } } } ], "Z8K5": "Z8" }, "Z8K13": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q12547192" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q442485" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z48142K3" }, "Z8K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } } } } ], "Z8K5": "Z8" }, "Z8K11": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46075", "Z46075K1": { "Z1K1": "Z7", "Z7K1": "Z46205", "Z46205K1": { "Z1K1": "Z6095", "Z6095K1": "L11720" }, "Z46205K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46075K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46075K3": { "Z1K1": "Z6096", "Z6096K1": "L11720-S1" } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z48142K1" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "es" } } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z48142K2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Spanish predicative-noun realization, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } c9mdirqpohfd6c5nctceenu0uczxw0u Z48144 0 101923 334532 2026-10-30T01:27:07Z Jsamwrites 938 Create Compact Latin predicative-noun realization 334532 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48144" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48144K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48144K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48144K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48144" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Latin predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } 12x306dpn52j44vu0t83xjwujdeawrp 334542 334532 2026-10-30T01:30:21Z Jsamwrites 938 Added Z48145 to the approved list of implementations 334542 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48144" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48144K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48144K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48144K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48145" ], "Z8K5": "Z48144" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Latin predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } 1s63jan1oxw4z9divh5zm4ae85fyc9x Z48145 0 101924 334533 2026-10-30T01:27:13Z Jsamwrites 938 Create Compact Latin predicative-noun realization, composition 334533 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48145" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48144", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K11", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K13", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z8K11" } } }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L29204" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46395K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K13" } }, "Z46395K3": [ "Z39328" ] } } } ], "Z8K5": "Z8" }, "Z8K13": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q211101" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1317831" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q211101" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1317831" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q12547192" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q211101" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1317831" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z48144K3" }, "Z8K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } } } } ], "Z8K5": "Z8" }, "Z8K11": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z48144K1" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "la" } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z48144K2" } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } } ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Latin predicative-noun realization, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } ecvwnuq3jr12ln6x3lqyqtfgb8az57e Z48146 0 101925 334534 2026-10-30T01:27:20Z Jsamwrites 938 Create Compact Malayalam predicative-noun realization 334534 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48146" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48146K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48146K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48146K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48146" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Malayalam predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } etupnl5kh927u8yq713yymvwdlrwxn1 334543 334534 2026-10-30T01:30:28Z Jsamwrites 938 Added Z48147 to the approved list of implementations 334543 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48146" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48146K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48146K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48146K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48147" ], "Z8K5": "Z48146" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Malayalam predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } 1jnsn9btba09eiikcazs4mcczb0udi8 Z48147 0 101926 334535 2026-10-30T01:27:26Z Jsamwrites 938 Create Compact Malayalam predicative-noun realization, composition 334535 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48147" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48146", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K11", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z8K11" } } }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z48146K3" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": "ആയിരുന്നു", "Z802K3": "ആണ്" } } } } ], "Z8K5": "Z8" }, "Z8K11": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z46075", "Z46075K1": { "Z1K1": "Z7", "Z7K1": "Z46205", "Z46205K1": { "Z1K1": "Z6095", "Z6095K1": "L556712" }, "Z46205K2": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46075K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46075K3": { "Z1K1": "Z6096", "Z6096K1": "L556712-S1" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z48146K1" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "ml" } } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z48146K2" } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } } ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Malayalam predicative-noun realization, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } jmr0yh5z9g0uhw9s0ftgsm0uflerlwj Z48148 0 101927 334536 2026-10-30T01:27:32Z Jsamwrites 938 Create Compact Igbo predicative-noun realization 334536 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48148" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48148K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48148K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48148K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48148" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Igbo predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } p7zkaf8g0id97kbvkmj35u9w6rxfco1 334544 334536 2026-10-30T01:30:34Z Jsamwrites 938 Added Z48149 to the approved list of implementations 334544 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48148" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48148K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48148K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48148K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48149" ], "Z8K5": "Z48148" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Igbo predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } 3o0jhopdjuvhpat5kimj2ajd3q8o2ig Z48149 0 101928 334537 2026-10-30T01:27:39Z Jsamwrites 938 Create Compact Igbo predicative-noun realization, composition 334537 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48149" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48148", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K11", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K13", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L643929" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z46395K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K13" } }, "Z46395K3": [ "Z39328" ] }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z8K11" } } } } } ], "Z8K5": "Z8" }, "Z8K13": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328" ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328" ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ], "K2": [ "Z6091" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z48148K3" }, "Z8K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } } } } ], "Z8K5": "Z8" }, "Z8K11": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z48148K1" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "ig" } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z48148K2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Igbo predicative-noun realization, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } 34tdsi1wxt2qc0f3ix1hg6z2x256h2t Z48150 0 101929 334538 2026-10-30T01:27:45Z Jsamwrites 938 Create Compact Dagbani predicative-noun realization 334538 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48150" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48150K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48150K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48150K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48150" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Dagbani predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } 488mrutqt7doorthkfmbfqohpxputba 334545 334538 2026-10-30T01:30:39Z Jsamwrites 938 Added Z48151 to the approved list of implementations 334545 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48150" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48150K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48150K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48150K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48151" ], "Z8K5": "Z48150" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Dagbani predicative-noun realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } k5kmg3hae8gh8mwluqfw4p6hz1h5hre Z48151 0 101930 334539 2026-10-30T01:27:51Z Jsamwrites 938 Create Compact Dagbani predicative-noun realization, composition 334539 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48151" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48150", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K11", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K13", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L651347" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "dag" } }, "Z46395K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K13" } }, "Z46395K3": [ "Z39328" ] }, "Z10000K2": "la" }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z8K11" } } } } } ], "Z8K5": "Z8" }, "Z8K13": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328" ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ], "K2": [ "Z6091" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z48150K3" }, "Z8K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } } } } ], "Z8K5": "Z8" }, "Z8K11": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z48150K1" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "dag" } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z48150K2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact Dagbani predicative-noun realization, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected predicative noun with subject agreement and an abstract tense in one fixed language. This compact helper avoids the shared multilingual copular configuration used by P31 and P106." } ] } } 7ewlc6ekz8zaqz7p0i9icmirmy9yhe8 Z48152 0 101931 334547 2026-10-30T01:34:11Z Jsamwrites 938 Create Compact predicative-noun realization by language 334547 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48152" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48152K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48152K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48152K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48152K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48152" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact predicative-noun realization by language" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Lazily dispatches an already-selected predicative noun to the compact en, fr, es, la, ml, ig or dag realizer." } ] } } syn65voa08d0p8132p5jdkg7urzvqrj 334549 334547 2026-10-30T01:36:05Z Jsamwrites 938 Added Z48153 to the approved list of implementations 334549 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48152" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48152K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48152K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48152K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48152K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48153" ], "Z8K5": "Z48152" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact predicative-noun realization by language" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Lazily dispatches an already-selected predicative noun to the compact en, fr, es, la, ml, ig or dag realizer." } ] } } dtw7qa73f8mhr13t1bb6kf7w7jpd9jp Z48153 0 101932 334548 2026-10-30T01:34:18Z Jsamwrites 938 Create Compact predicative-noun realization by language, composition 334548 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48153" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48152", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48152K1" } }, "Z866K2": "en" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48138", "Z48138K1": { "Z1K1": "Z18", "Z18K1": "Z48152K2" }, "Z48138K2": { "Z1K1": "Z18", "Z18K1": "Z48152K3" }, "Z48138K3": { "Z1K1": "Z18", "Z18K1": "Z48152K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48152K1" } }, "Z866K2": "fr" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48140", "Z48140K1": { "Z1K1": "Z18", "Z18K1": "Z48152K2" }, "Z48140K2": { "Z1K1": "Z18", "Z18K1": "Z48152K3" }, "Z48140K3": { "Z1K1": "Z18", "Z18K1": "Z48152K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48152K1" } }, "Z866K2": "es" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48142", "Z48142K1": { "Z1K1": "Z18", "Z18K1": "Z48152K2" }, "Z48142K2": { "Z1K1": "Z18", "Z18K1": "Z48152K3" }, "Z48142K3": { "Z1K1": "Z18", "Z18K1": "Z48152K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48152K1" } }, "Z866K2": "la" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48144", "Z48144K1": { "Z1K1": "Z18", "Z18K1": "Z48152K2" }, "Z48144K2": { "Z1K1": "Z18", "Z18K1": "Z48152K3" }, "Z48144K3": { "Z1K1": "Z18", "Z18K1": "Z48152K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48152K1" } }, "Z866K2": "ml" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48146", "Z48146K1": { "Z1K1": "Z18", "Z18K1": "Z48152K2" }, "Z48146K2": { "Z1K1": "Z18", "Z18K1": "Z48152K3" }, "Z48146K3": { "Z1K1": "Z18", "Z18K1": "Z48152K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48152K1" } }, "Z866K2": "ig" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48148", "Z48148K1": { "Z1K1": "Z18", "Z18K1": "Z48152K2" }, "Z48148K2": { "Z1K1": "Z18", "Z18K1": "Z48152K3" }, "Z48148K3": { "Z1K1": "Z18", "Z18K1": "Z48152K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48152K1" } }, "Z866K2": "dag" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z48150", "Z48150K1": { "Z1K1": "Z18", "Z18K1": "Z48152K2" }, "Z48150K2": { "Z1K1": "Z18", "Z18K1": "Z48152K3" }, "Z48150K3": { "Z1K1": "Z18", "Z18K1": "Z48152K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Unsupported compact copular language", "Compact predicative-noun realization by language" ] } } } } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact predicative-noun realization by language, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Lazily dispatches an already-selected predicative noun to the compact en, fr, es, la, ml, ig or dag realizer." } ] } } 0h4dwdj56e5lvuf8xmdw3t0cw09p7l3 Z48154 0 101933 334550 2026-10-30T01:42:19Z Jsamwrites 938 Create Compact English predicate-noun text pilot 334550 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48154" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48154K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48154K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48154" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact English predicate-noun text pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected English predicate-noun lexeme with subject features." } ] } } 8mdnkeze2g5m6mes0ui3hxbqw8tkcv2 334554 334550 2026-10-30T01:43:37Z Jsamwrites 938 Added Z48155 to the approved list of implementations 334554 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48154" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48154K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48154K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48155" ], "Z8K5": "Z48154" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact English predicate-noun text pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected English predicate-noun lexeme with subject features." } ] } } 1azc3282s72h4u9965fm7vpdep0o2ps Z48155 0 101934 334551 2026-10-30T01:42:25Z Jsamwrites 938 Create Compact English predicate-noun text pilot, composition 334551 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48155" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48154", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K11", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z18", "Z18K1": "Z8K11" } } } } ], "Z8K5": "Z8" }, "Z8K11": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z46075", "Z46075K1": { "Z1K1": "Z7", "Z7K1": "Z46205", "Z46205K1": { "Z1K1": "Z6095", "Z6095K1": "L2767" }, "Z46205K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46075K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46075K3": { "Z1K1": "Z6096", "Z6096K1": "L2767-S1" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z48154K1" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "en" } } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z48154K2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact English predicate-noun text pilot, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected English predicate-noun lexeme with subject features." } ] } } rv3xsuih2gfu34j2qmyzn2t9ieup1gv Z48156 0 101935 334552 2026-10-30T01:42:32Z Jsamwrites 938 Create Compact English copula text pilot 334552 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48156" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48156K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48156" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact English copula text pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes the English third-person singular copula for an abstract present or past tense." } ] } } oxj93g7olav45op72j0z30h6tl1q6lf 334555 334552 2026-10-30T01:43:54Z Jsamwrites 938 Added Z48157 to the approved list of implementations 334555 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48156" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48156K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48157" ], "Z8K5": "Z48156" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact English copula text pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes the English third-person singular copula for an abstract present or past tense." } ] } } try80bzbx9w3yq40jr4bt4dmhi1xcl0 Z48157 0 101936 334553 2026-10-30T01:42:38Z Jsamwrites 938 Create Compact English copula text pilot, composition 334553 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48157" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48156", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L1883" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46395K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z48156K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "Z802K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ] }, "Z46395K3": [ "Z39328" ] } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compact English copula text pilot, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes the English third-person singular copula for an abstract present or past tense." } ] } } qrso537h2audtd1dlfq607n7niklw0h Z48158 0 101937 334558 2026-10-30T03:16:33Z DelectableMaggot 103287 Initial draft 334558 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48158" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48158K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Main word" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48158K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Second word" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48158" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Create contraction" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Given two words, will output one contraction." } ] } } iu50pi4s4m44oabaf4bznh46jywps0q 334688 334558 2026-10-30T11:15:12Z HenkvD 1290 334688 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48158" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48158K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Main word" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48158K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Second word" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48158" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Create contraction in English" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Given two words, will output one contraction." } ] } } nq9vhsh4zz6xfoq8b6uspdnmj5kg666 Z48159 0 101938 334559 2026-10-30T03:18:12Z DelectableMaggot 103287 Created "I am" test 334559 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48159" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48158", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48158", "Z48158K1": "I", "Z48158K2": "am" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "I'm" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } bp153e9403datoiuvudh9wm4sx820ci 334560 334559 2026-10-30T03:19:37Z DelectableMaggot 103287 added name to "I am" test 334560 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48159" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48158", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48158", "Z48158K1": "I", "Z48158K2": "am" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "I'm" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "I am" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } jeqxtrtsgrj1rwijdvglid99b5bmlz1 Z48160 0 101939 334561 2026-10-30T03:20:33Z DelectableMaggot 103287 Created "do not" test 334561 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48160" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48158", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48158", "Z48158K1": "do", "Z48158K2": "not" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "don't" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Do not" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 2vz7gqgv5ujed4p90jb1j73d807wboo Z48161 0 101940 334562 2026-10-30T03:21:37Z DelectableMaggot 103287 created "they are" test 334562 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48161" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48158", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48158", "Z48158K1": "they", "Z48158K2": "are" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "they're" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "They are" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0d0qs5t2de36a8rivwoulx56d0oiviw Z48162 0 101941 334563 2026-10-30T03:22:43Z DelectableMaggot 103287 Created "he is" test 334563 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48162" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48158", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48158", "Z48158K1": "He", "Z48158K2": "is" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "he's" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "He is" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } s2qfu5wwwje3nth6pojmkxq04a90vg2 Z48163 0 101942 334567 2026-10-30T06:55:58Z Jsamwrites 938 Create Form-level English predicate-noun text pilot 334567 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48163" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48163K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48163K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48163" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English predicate-noun text pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected English predicate-noun lexeme directly as text, using number agreement and the established a/an behavior without constructing a deferred Z39358 phrase." } ] } } 71eavod2mybj2t09ht85yqg82xca0w6 334569 334567 2026-10-30T06:57:25Z Jsamwrites 938 Added Z48164 to the approved list of implementations 334569 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48163" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48163K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48163K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48164" ], "Z8K5": "Z48163" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English predicate-noun text pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected English predicate-noun lexeme directly as text, using number agreement and the established a/an behavior without constructing a deferred Z39358 phrase." } ] } } 5aqbz1z3k0g3hmg697g2xuvigfazroh Z48164 0 101943 334568 2026-10-30T06:56:04Z Jsamwrites 938 Create Form-level English predicate-noun text pilot, composition 334568 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48164" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48163", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z18", "Z18K1": "Z48163K2" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46311", "Z46311K1": { "Z1K1": "Z18", "Z18K1": "Z48163K1" }, "Z46311K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z18", "Z18K1": "Z48163K2" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], "Z802K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] }, "Z46311K3": { "Z1K1": "Z60", "Z60K1": "en" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z32319", "Z32319K1": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46311", "Z46311K1": { "Z1K1": "Z18", "Z18K1": "Z48163K1" }, "Z46311K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z18", "Z18K1": "Z48163K2" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], "Z802K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] }, "Z46311K3": { "Z1K1": "Z60", "Z60K1": "en" } } } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English predicate-noun text pilot, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes an already-selected English predicate-noun lexeme directly as text, using number agreement and the established a/an behavior without constructing a deferred Z39358 phrase." } ] } } 2495h71rbvbuwymh40j7x76ito2dtvt Z48165 0 101944 334570 2026-10-30T07:04:34Z Jsamwrites 938 Create Form-level English copular sentence pilot 334570 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48165" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48165K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject text" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48165K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48165K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48165K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48165" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English copular sentence pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes a complete English present or past predicative-noun sentence through the registered form-level noun boundary, without constructing a deferred syntactic phrase." } ] } } 61zw4jqn9150z8mg5qdngjot0jlbcmn 334572 334570 2026-10-30T07:06:09Z Jsamwrites 938 Added Z48166 to the approved list of implementations 334572 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48165" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48165K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject text" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z48165K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected predicate noun lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48165K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48165K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract tense" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48166" ], "Z8K5": "Z48165" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English copular sentence pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes a complete English present or past predicative-noun sentence through the registered form-level noun boundary, without constructing a deferred syntactic phrase." } ] } } 6vmopfsh85zorgk8768lo6y5ls1y9pz Z48166 0 101945 334571 2026-10-30T07:04:40Z Jsamwrites 938 Create Form-level English copular sentence pilot, composition 334571 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48166" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48165", "Z14K2": { "Z1K1": "Z11", "Z11K1": { "Z1K1": "Z60", "Z60K1": "en" }, "Z11K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z48165K1" }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z48165K4" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z18", "Z18K1": "Z48165K3" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } }, "Z802K2": "are", "Z802K3": "is" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z18", "Z18K1": "Z48165K3" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } }, "Z802K2": "were", "Z802K3": "was" } }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z48163", "Z48163K1": { "Z1K1": "Z18", "Z18K1": "Z48165K2" }, "Z48163K2": { "Z1K1": "Z18", "Z18K1": "Z48165K3" } } } }, "Z10000K2": "." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English copular sentence pilot, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes a complete English present or past predicative-noun sentence through the registered form-level noun boundary, without constructing a deferred syntactic phrase." } ] } } l3i6r5xnjh990i5sy6nxrsx3ybsj7t5 Z48167 0 101946 334573 2026-10-30T07:20:04Z Jsamwrites 938 Create Preferred usable item-valued statement selector pilot 334573 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48167" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48167K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z48167K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property" } ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48167" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Preferred usable item-valued statement selector pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns the item value of the first preferred usable statement, falling back to the first normal usable statement, from a property-scoped fetch." } ] } } rqkh14v29ixj9bpqtx90o87iojuhh0b 334579 334573 2026-10-30T07:21:45Z Jsamwrites 938 Added Z48168 to the approved list of implementations 334579 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48167" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48167K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z48167K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "property" } ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48168" ], "Z8K5": "Z48167" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Preferred usable item-valued statement selector pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns the item value of the first preferred usable statement, falling back to the first normal usable statement, from a property-scoped fetch." } ] } } m7fxif2hzyd6jkrrzit8kkcydroir6i Z48168 0 101947 334574 2026-10-30T07:20:11Z Jsamwrites 938 Create Preferred usable item-valued statement selector pilot, composition 334574 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48168" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48167", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K9", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } } } ], "Z8K5": "Z8" }, "Z8K9": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K7" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48167K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z18", "Z18K1": "Z48167K2" } ] } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K7" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48167K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z18", "Z18K1": "Z48167K2" } ] } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K7" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48167K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z18", "Z18K1": "Z48167K2" } ] } } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The item has no usable statement for the compact copular sentence", "Compact classification sentence" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K7" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48167K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z18", "Z18K1": "Z48167K2" } ] } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K7" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48167K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z18", "Z18K1": "Z48167K2" } ] } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K7" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48167K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z18", "Z18K1": "Z48167K2" } ] } } } } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Preferred usable item-valued statement selector pilot, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Returns the item value of the first preferred usable statement, falling back to the first normal usable statement, from a property-scoped fetch." } ] } } 01w2uftcdq4qbcsljx71q9rcb3yuo0z Z48169 0 101948 334575 2026-10-30T07:20:17Z Jsamwrites 938 Create Form-level English instance-of sentence pilot 334575 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48169" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48169K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48169K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48169K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48169" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English instance-of sentence pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Selects an item's preferred instance-of statement and realizes an English present predicative-noun sentence through the registered form-level sentence boundary." } ] } } oro9xzzk3ktab2022w1r5m2c39nagk3 334580 334575 2026-10-30T07:21:50Z Jsamwrites 938 Added Z48170 to the approved list of implementations 334580 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48169" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48169K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48169K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48169K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48170" ], "Z8K5": "Z48169" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English instance-of sentence pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Selects an item's preferred instance-of statement and realizes an English present predicative-noun sentence through the registered form-level sentence boundary." } ] } } 8apenz93lw2bpuzinw3upz5haqun3ns Z48170 0 101949 334576 2026-10-30T07:20:23Z Jsamwrites 938 Create Form-level English instance-of sentence pilot, composition 334576 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48170" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48169", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z18", "Z17K2": "Z8K7", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K8", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z48165", "Z48165K1": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } } }, "Z48165K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K9", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6095", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L1" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K9" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10216", "Z10216K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } ], "Z13752K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10216", "Z10216K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } ], "Z13752K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } } } } } } ], "Z8K5": "Z8" }, "Z8K9": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" } } } } }, "Z48165K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" } }, "Z48165K4": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } } } ], "Z8K5": "Z8" }, "Z8K8": { "Z1K1": "Z7", "Z7K1": "Z46641", "Z46641K1": { "Z1K1": "Z18", "Z18K1": "Z48169K1" }, "Z46641K2": { "Z1K1": "Z18", "Z18K1": "Z48169K2" } } } } ], "Z8K5": "Z8" }, "Z8K6": { "Z1K1": "Z7", "Z7K1": "Z46641", "Z46641K1": { "Z1K1": "Z18", "Z18K1": "Z8K4" }, "Z46641K2": { "Z1K1": "Z18", "Z18K1": "Z48169K2" } } } } ], "Z8K5": "Z8" }, "Z8K7": { "Z1K1": "Z7", "Z7K1": "Z46617", "Z46617K1": { "Z1K1": "Z7", "Z7K1": "Z46616", "Z46616K1": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "Z46616K2": { "Z1K1": "Z18", "Z18K1": "Z48169K2" }, "Z46616K3": { "Z1K1": "Z18", "Z18K1": "Z48169K3" }, "Z46616K4": { "Z1K1": "Z6", "Z6K1": "Z6091" } }, "Z46617K2": { "Z1K1": "Z18", "Z18K1": "Z48169K1" }, "Z46617K3": { "Z1K1": "Z18", "Z18K1": "Z8K4" }, "Z46617K4": { "Z1K1": "Z18", "Z18K1": "Z48169K3" }, "Z46617K5": { "Z1K1": "Z18", "Z18K1": "Z48169K2" } } } } ], "Z8K5": "Z8" }, "Z8K4": { "Z1K1": "Z7", "Z7K1": "Z48167", "Z48167K1": { "Z1K1": "Z18", "Z18K1": "Z48169K1" }, "Z48167K2": { "Z1K1": "Z6092", "Z6092K1": "P31" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English instance-of sentence pilot, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Selects an item's preferred instance-of statement and realizes an English present predicative-noun sentence through the registered form-level sentence boundary." } ] } } l2etnfz286sm53p4t9nxkd0q81iyg6z Z48171 0 101950 334577 2026-10-30T07:20:30Z Jsamwrites 938 Create Form-level English occupation sentence pilot 334577 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48171" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48171K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48171K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48171K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48171" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English occupation sentence pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Selects an item's preferred occupation statement and realizes an English past predicative-noun sentence through the registered form-level sentence boundary." } ] } } 4moi52pqbfpq2lmkmp0046c3f2xzj83 334581 334577 2026-10-30T07:21:55Z Jsamwrites 938 Added Z48172 to the approved list of implementations 334581 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48171" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48171K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48171K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z48171K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48172" ], "Z8K5": "Z48171" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English occupation sentence pilot" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Selects an item's preferred occupation statement and realizes an English past predicative-noun sentence through the registered form-level sentence boundary." } ] } } d1ilix95whprwe39ix3srt6rwco6l1t Z48172 0 101951 334578 2026-10-30T07:20:36Z Jsamwrites 938 Create Form-level English occupation sentence pilot, composition 334578 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48172" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48171", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z18", "Z17K2": "Z8K7", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K8", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z48165", "Z48165K1": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } } }, "Z48165K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K9", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6095", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L1" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K9" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10216", "Z10216K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } ], "Z13752K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z10216", "Z10216K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } ], "Z13752K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } } } } } } ], "Z8K5": "Z8" }, "Z8K9": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" } } } } }, "Z48165K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" } }, "Z48165K4": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } } ], "Z8K5": "Z8" }, "Z8K8": { "Z1K1": "Z7", "Z7K1": "Z46641", "Z46641K1": { "Z1K1": "Z18", "Z18K1": "Z48171K1" }, "Z46641K2": { "Z1K1": "Z18", "Z18K1": "Z48171K2" } } } } ], "Z8K5": "Z8" }, "Z8K6": { "Z1K1": "Z7", "Z7K1": "Z46641", "Z46641K1": { "Z1K1": "Z18", "Z18K1": "Z8K4" }, "Z46641K2": { "Z1K1": "Z18", "Z18K1": "Z48171K2" } } } } ], "Z8K5": "Z8" }, "Z8K7": { "Z1K1": "Z7", "Z7K1": "Z46617", "Z46617K1": { "Z1K1": "Z7", "Z7K1": "Z46616", "Z46616K1": { "Z1K1": "Z6092", "Z6092K1": "P106" }, "Z46616K2": { "Z1K1": "Z18", "Z18K1": "Z48171K2" }, "Z46616K3": { "Z1K1": "Z18", "Z18K1": "Z48171K3" }, "Z46616K4": { "Z1K1": "Z6", "Z6K1": "Z6091" } }, "Z46617K2": { "Z1K1": "Z18", "Z18K1": "Z48171K1" }, "Z46617K3": { "Z1K1": "Z18", "Z18K1": "Z8K4" }, "Z46617K4": { "Z1K1": "Z18", "Z18K1": "Z48171K3" }, "Z46617K5": { "Z1K1": "Z18", "Z18K1": "Z48171K2" } } } } ], "Z8K5": "Z8" }, "Z8K4": { "Z1K1": "Z7", "Z7K1": "Z48167", "Z48167K1": { "Z1K1": "Z18", "Z18K1": "Z48171K1" }, "Z48167K2": { "Z1K1": "Z6092", "Z6092K1": "P106" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Form-level English occupation sentence pilot, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Selects an item's preferred occupation statement and realizes an English past predicative-noun sentence through the registered form-level sentence boundary." } ] } } 0v2ah0zcuazynp11d7ubxuasj0p4476 Z48173 0 101952 334594 2026-10-30T08:26:20Z Jsamwrites 938 Create Coordinate pair text 334594 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48173" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6011", "Z17K2": "Z48173K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "coordinate" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48173K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "decimal separator" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48173K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "hemisphere letters" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48173" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Wikidata geo-coordinate on Earth as latitude and longitude in degrees with hemisphere letters, for example 48.8566° N, 2.3522° E. The decimal separator and the four hemisphere letters (north, south, east, west, separated by semicolons) are arguments, so each language chooses its own. The number of decimals follows the stated precision, capped at four. Coordinates on other globes, unknown precision and out-of-range values fail instead of producing text." } ] } } hoc4jxtf7b23ncd4kw8aophn3sovlev 334596 334594 2026-10-30T08:28:15Z Jsamwrites 938 Added Z48174 to the approved list of implementations 334596 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48173" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6011", "Z17K2": "Z48173K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "coordinate" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48173K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "decimal separator" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48173K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "hemisphere letters" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48174" ], "Z8K5": "Z48173" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Wikidata geo-coordinate on Earth as latitude and longitude in degrees with hemisphere letters, for example 48.8566° N, 2.3522° E. The decimal separator and the four hemisphere letters (north, south, east, west, separated by semicolons) are arguments, so each language chooses its own. The number of decimals follows the stated precision, capped at four. Coordinates on other globes, unknown precision and out-of-range values fail instead of producing text." } ] } } rzlr0dd2zsdvratohjnmy5swd99304a 334627 334596 2026-10-30T09:16:06Z Jsamwrites 938 Added Z48179, Z48180, Z48181, Z48182, Z48183, Z48184 and Z48185 to the approved list of test cases 334627 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48173" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6011", "Z17K2": "Z48173K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "coordinate" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48173K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "decimal separator" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48173K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "hemisphere letters" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z48179", "Z48180", "Z48181", "Z48182", "Z48183", "Z48184", "Z48185" ], "Z8K4": [ "Z14", "Z48174" ], "Z8K5": "Z48173" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Wikidata geo-coordinate on Earth as latitude and longitude in degrees with hemisphere letters, for example 48.8566° N, 2.3522° E. The decimal separator and the four hemisphere letters (north, south, east, west, separated by semicolons) are arguments, so each language chooses its own. The number of decimals follows the stated precision, capped at four. Coordinates on other globes, unknown precision and out-of-range values fail instead of producing text." } ] } } 52hp31g73p6raigu1mrecav21olpm3z Z48174 0 101953 334595 2026-10-30T08:26:26Z Jsamwrites 938 Create implementation of Coordinate pair text 334595 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48174" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48173", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K7", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K8", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K9", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K10", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K11", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z8( Z8K1, Z8K2, Z8K3, Z8K4, Z8K5, Z8K6, Z8K7, Z8K8, Z8K9, Z8K10, Z8K11 ) {\n const fail = ( message ) =\u003E { throw new Error( message ); };\n if ( Z8K9 !== 'Q2' ) { fail( 'Only coordinates on Earth are supported' ); }\n const letters = String( Z8K11 ).split( ';' );\n if ( letters.length !== 4 ) { fail( 'Four hemisphere letters are required' ); }\n const pn = BigInt( Z8K7 ), pd = BigInt( Z8K8 );\n if ( pn \u003C= 0n || pd \u003C= 0n ) { fail( 'The coordinate precision is unknown' ); }\n let places = 0;\n while ( places \u003C 4 \u0026\u0026 pn * 10n ** BigInt( places ) * 1000n \u003C 999n * pd ) { places++; }\n const part = ( sign, num, den, limit, pair ) =\u003E {\n const n = BigInt( num ), d = BigInt( den );\n if ( d \u003C= 0n || n \u003E limit * d ) { fail( 'The coordinate is out of range' ); }\n const scaled = ( 2n * n * 10n ** BigInt( places ) + d ) / ( 2n * d );\n const digits = scaled.toString().padStart( places + 1, '0' );\n const text = places ? digits.slice( 0, -places ) + Z8K10 + digits.slice( -places ) : digits;\n return text + '\\u00b0 ' + ( sign === '-' \u0026\u0026 n !== 0n ? pair[ 1 ] : pair[ 0 ] );\n };\n return part( Z8K1, Z8K2, Z8K3, 90n, letters.slice( 0, 2 ) ) + ', ' +\n part( Z8K4, Z8K5, Z8K6, 180n, letters.slice( 2 ) );\n}" } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6011K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48173K1" } } }, "Z18683K2": "Z16662" }, "Z802K2": "-", "Z802K3": "" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6011K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48173K1" } } } }, "Z8K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K3" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6011K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48173K1" } } } }, "Z8K4": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6011K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48173K1" } } }, "Z18683K2": "Z16662" }, "Z802K2": "-", "Z802K3": "" }, "Z8K5": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6011K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48173K1" } } } }, "Z8K6": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K3" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6011K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48173K1" } } } }, "Z8K7": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6011K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48173K1" } } } }, "Z8K8": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K3" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6011K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48173K1" } } } }, "Z8K9": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6091K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6011K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48173K1" } } }, "Z8K10": { "Z1K1": "Z18", "Z18K1": "Z48173K2" }, "Z8K11": { "Z1K1": "Z18", "Z18K1": "Z48173K3" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text, composition with code formatter" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Wikidata geo-coordinate on Earth as latitude and longitude in degrees with hemisphere letters, for example 48.8566° N, 2.3522° E. The decimal separator and the four hemisphere letters (north, south, east, west, separated by semicolons) are arguments, so each language chooses its own. The number of decimals follows the stated precision, capped at four. Coordinates on other globes, unknown precision and out-of-range values fail instead of producing text." } ] } } 9vky6db9gqxuqxfeowt32iljmbfg0ov Z48175 0 101954 334598 2026-10-30T08:51:12Z Jsamwrites 938 Create Date phrase by role 334598 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48175" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6064", "Z17K2": "Z48175K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "time" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "role" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "phrase table" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "century words" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48175" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Gregorian year, decade or century (before or after the common era) as a phrase for a role: point in time, start or end, for example in the 1940s, since the 1940s, until the 1940s. The phrase table (lines such as decade-point=in the {d}s separated by vertical bars) and the century words (such as 3=third;20=twentieth) are arguments, so each language chooses its own. Months, days, Julian dates and combinations missing from the table fail instead of producing text." } ] } } m0p9emlxtne1vgbdcl4gv2geqlcqqvg 334602 334598 2026-10-30T09:03:55Z Jsamwrites 938 Added Z48176 to the approved list of implementations 334602 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48175" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6064", "Z17K2": "Z48175K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "time" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "role" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "phrase table" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "century words" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48176" ], "Z8K5": "Z48175" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Gregorian year, decade or century (before or after the common era) as a phrase for a role: point in time, start or end, for example in the 1940s, since the 1940s, until the 1940s. The phrase table (lines such as decade-point=in the {d}s separated by vertical bars) and the century words (such as 3=third;20=twentieth) are arguments, so each language chooses its own. Months, days, Julian dates and combinations missing from the table fail instead of producing text." } ] } } nzrops5c4oncz83pnj9ro8io7jox82y 334625 334602 2026-10-30T09:15:51Z Jsamwrites 938 Added Z48186, Z48187, Z48188, Z48189, Z48190, Z48191 and Z48192 to the approved list of test cases 334625 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48175" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6064", "Z17K2": "Z48175K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "time" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "role" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "phrase table" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "century words" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z48186", "Z48187", "Z48188", "Z48189", "Z48190", "Z48191", "Z48192" ], "Z8K4": [ "Z14", "Z48176" ], "Z8K5": "Z48175" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Gregorian year, decade or century (before or after the common era) as a phrase for a role: point in time, start or end, for example in the 1940s, since the 1940s, until the 1940s. The phrase table (lines such as decade-point=in the {d}s separated by vertical bars) and the century words (such as 3=third;20=twentieth) are arguments, so each language chooses its own. Months, days, Julian dates and combinations missing from the table fail instead of producing text." } ] } } kbrvrw9nz4lys4jz5m5z7sr6ixrdc0i 334691 334625 2026-10-30T11:21:04Z Jsamwrites 938 Removed Z48176 from the approved list of implementations 334691 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48175" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6064", "Z17K2": "Z48175K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "time" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "role" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "phrase table" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48175K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "century words" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z48186", "Z48187", "Z48188", "Z48189", "Z48190", "Z48191", "Z48192" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48175" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Gregorian year, decade or century (before or after the common era) as a phrase for a role: point in time, start or end, for example in the 1940s, since the 1940s, until the 1940s. The phrase table (lines such as decade-point=in the {d}s separated by vertical bars) and the century words (such as 3=third;20=twentieth) are arguments, so each language chooses its own. Months, days, Julian dates and combinations missing from the table fail instead of producing text." } ] } } tbcb7ae5vca5nfrb4zv34h3h6zstn1x Z48176 0 101955 334599 2026-10-30T08:51:19Z Jsamwrites 938 Create implementation of Date phrase by role 334599 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48176" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48175", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K7", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z8( Z8K1, Z8K2, Z8K3, Z8K4, Z8K5, Z8K6, Z8K7 ) {\n const fail = ( message ) =\u003E { throw new Error( message ); };\n if ( Z8K4 !== 'Q1985727' ) { fail( 'Only Gregorian dates are supported' ); }\n const year = parseInt( Z8K2, 10 );\n if ( !( year \u003E= 0 \u0026\u0026 year \u003C= 9999 ) ) { fail( 'The year is out of range' ); }\n const roman = ( n ) =\u003E {\n if ( !( n \u003E= 1 \u0026\u0026 n \u003C= 3999 ) ) { fail( 'No Roman numeral' ); }\n const marks = [ [ 1000, 'M' ], [ 900, 'CM' ], [ 500, 'D' ], [ 400, 'CD' ], [ 100, 'C' ], [ 90, 'XC' ],\n [ 50, 'L' ], [ 40, 'XL' ], [ 10, 'X' ], [ 9, 'IX' ], [ 5, 'V' ], [ 4, 'IV' ], [ 1, 'I' ] ];\n let rest = n, out = '';\n for ( const [ value, mark ] of marks ) { while ( rest \u003E= value ) { out += mark; rest -= value; } }\n return out;\n };\n const words = {};\n String( Z8K7 ).split( ';' ).forEach( ( pair ) =\u003E {\n const at = pair.indexOf( '=' );\n if ( at \u003E 0 ) { words[ pair.slice( 0, at ) ] = pair.slice( at + 1 ); }\n } );\n let slots;\n let kind;\n if ( Z8K3 === 'Q577' ) {\n kind = 'year';\n slots = { y: String( year ), Y: year ? roman( year ) : '' };\n } else if ( Z8K3 === 'Q39911' ) {\n kind = 'decade';\n const d = Math.floor( year / 10 ) * 10;\n slots = { d: String( d ), e: String( d + 9 ), D: d ? roman( d ) : '', E: roman( d + 9 ) };\n } else if ( Z8K3 === 'Q578' ) {\n kind = 'century';\n const c = Math.ceil( year / 100 );\n if ( c \u003C 1 ) { fail( 'The century is out of range' ); }\n slots = { c: String( c ), C: roman( c ), w: words[ String( c ) ] };\n } else {\n fail( 'Only year, decade and century precision are supported' );\n }\n const wanted = kind + '-' + ( Z8K1 === '1' ? 'bce' : 'ce' ) + '-' + Z8K5;\n const lines = String( Z8K6 ).split( '|' );\n const line = lines.find( ( entry ) =\u003E entry.slice( 0, entry.indexOf( '=' ) ) === wanted );\n if ( line === undefined ) { fail( 'No phrase for ' + wanted ); }\n return line.slice( line.indexOf( '=' ) + 1 ).replace( /\\{(\\w)\\}/g, ( whole, name ) =\u003E {\n if ( slots[ name ] === undefined || slots[ name ] === '' ) { fail( 'No value for ' + whole ); }\n return slots[ name ];\n } );\n}" } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6091K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6063K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K6" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48175K1" } } } }, "Z866K2": "Q1985727" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48175K1" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z40962K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48175K1" } } } } } }, "Z18683K2": "Z17815" }, "Z802K2": "1", "Z802K3": "0" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6091K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6063K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K6" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48175K1" } } } }, "Z866K2": "Q1985727" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48175K1" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z40962K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48175K1" } } } } } } }, "Z8K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6091K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6062K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48175K1" } } } }, "Z8K4": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6091K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6063K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K6" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48175K1" } } } }, "Z8K5": { "Z1K1": "Z18", "Z18K1": "Z48175K2" }, "Z8K6": { "Z1K1": "Z18", "Z18K1": "Z48175K3" }, "Z8K7": { "Z1K1": "Z18", "Z18K1": "Z48175K4" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role, composition with code formatter" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Gregorian year, decade or century (before or after the common era) as a phrase for a role: point in time, start or end, for example in the 1940s, since the 1940s, until the 1940s. The phrase table (lines such as decade-point=in the {d}s separated by vertical bars) and the century words (such as 3=third;20=twentieth) are arguments, so each language chooses its own. Months, days, Julian dates and combinations missing from the table fail instead of producing text." } ] } } a7lit584v8mtptkom23oxkggb0wtz8u Z48177 0 101956 334600 2026-10-30T08:58:35Z Jsamwrites 938 Create Quantity with unit text 334600 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48177" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6010", "Z17K2": "Z48177K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48177K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "number format" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48177K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "unit table" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48177K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "plural rule" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48177" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Wikidata quantity as the number and the stated unit word, for example 120 minutes. The number format (group separator, decimal separator, gap), the unit table (items with singular and optional plural) and the plural rule (one, below-two or never) are arguments. The unit is never converted. Unlisted units and amounts that are not finite decimals within six places fail." } ] } } cng8qp3810dwr2pzzs92wi9eojmn1rp 334603 334600 2026-10-30T09:04:03Z Jsamwrites 938 Added Z48178 to the approved list of implementations 334603 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48177" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6010", "Z17K2": "Z48177K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48177K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "number format" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48177K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "unit table" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48177K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "plural rule" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48178" ], "Z8K5": "Z48177" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Wikidata quantity as the number and the stated unit word, for example 120 minutes. The number format (group separator, decimal separator, gap), the unit table (items with singular and optional plural) and the plural rule (one, below-two or never) are arguments. The unit is never converted. Unlisted units and amounts that are not finite decimals within six places fail." } ] } } 2e50tu22eojb62c7bciqkmgses4rrkq 334626 334603 2026-10-30T09:16:00Z Jsamwrites 938 Added Z48193, Z48194, Z48195, Z48196, Z48197, Z48198 and Z48199 to the approved list of test cases 334626 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48177" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6010", "Z17K2": "Z48177K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "quantity" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48177K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "number format" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48177K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "unit table" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48177K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "plural rule" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z48193", "Z48194", "Z48195", "Z48196", "Z48197", "Z48198", "Z48199" ], "Z8K4": [ "Z14", "Z48178" ], "Z8K5": "Z48177" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Wikidata quantity as the number and the stated unit word, for example 120 minutes. The number format (group separator, decimal separator, gap), the unit table (items with singular and optional plural) and the plural rule (one, below-two or never) are arguments. The unit is never converted. Unlisted units and amounts that are not finite decimals within six places fail." } ] } } 5g3esn674hpaam47oxuxna6g36upa1c Z48178 0 101957 334601 2026-10-30T08:58:41Z Jsamwrites 938 Create implementation of Quantity with unit text 334601 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48178" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48177", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K7", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z8( Z8K1, Z8K2, Z8K3, Z8K4, Z8K5, Z8K6, Z8K7 ) {\n const fail = ( message ) =\u003E { throw new Error( message ); };\n const format = String( Z8K5 ).split( ';' );\n if ( format.length !== 3 ) { fail( 'Number format needs group separator, decimal separator and gap' ); }\n const num = BigInt( Z8K2 ), den = BigInt( Z8K3 );\n if ( den \u003C= 0n ) { fail( 'The amount is invalid' ); }\n let places = 0;\n while ( places \u003C= 6 \u0026\u0026 ( num * 10n ** BigInt( places ) ) % den !== 0n ) { places++; }\n if ( places \u003E 6 ) { fail( 'The amount is not a finite decimal within six places' ); }\n const digits = ( num * 10n ** BigInt( places ) / den ).toString().padStart( places + 1, '0' );\n const whole = places ? digits.slice( 0, -places ) : digits;\n const grouped = whole.replace( /\\B(?=(\\d{3})+(?!\\d))/g, format[ 0 ] );\n const number = ( Z8K1 === '1' \u0026\u0026 num !== 0n ? '-' : '' ) + grouped +\n ( places ? format[ 1 ] + digits.slice( -places ) : '' );\n const line = String( Z8K6 ).split( '|' ).find( ( entry ) =\u003E entry.slice( 0, entry.indexOf( '=' ) ) === Z8K4 );\n if ( line === undefined ) { fail( 'The unit is not listed' ); }\n const forms = line.slice( line.indexOf( '=' ) + 1 ).split( '/' );\n const singular = { one: num === den, 'below-two': num \u003C 2n * den, never: true }[ Z8K7 ];\n if ( singular === undefined ) { fail( 'Unknown plural rule' ); }\n return number + format[ 2 ] + ( singular || forms.length \u003C 2 ? forms[ 0 ] : forms[ 1 ] );\n}" } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6010K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48177K1" } } }, "Z18683K2": "Z16662" }, "Z802K2": "1", "Z802K3": "0" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6010K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48177K1" } } } }, "Z8K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K3" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6010K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48177K1" } } } }, "Z8K4": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6091K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6010K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48177K1" } } }, "Z8K5": { "Z1K1": "Z18", "Z18K1": "Z48177K2" }, "Z8K6": { "Z1K1": "Z18", "Z18K1": "Z48177K3" }, "Z8K7": { "Z1K1": "Z18", "Z18K1": "Z48177K4" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text, composition with code formatter" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Formats a Wikidata quantity as the number and the stated unit word, for example 120 minutes. The number format (group separator, decimal separator, gap), the unit table (items with singular and optional plural) and the plural rule (one, below-two or never) are arguments. The unit is never converted. Unlisted units and amounts that are not finite decimals within six places fail." } ] } } 5diyrr74dn2nl7rc739nxvk95mj7mnd Z48179 0 101958 334604 2026-10-30T09:07:57Z Jsamwrites 938 Create Coordinate pair text test: paris-ne en 334604 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48179" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48173", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48173", "Z48173K1": { "Z1K1": "Z6011", "Z6011K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "244283" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "11761" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K3": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "10000" } }, "Z6011K4": { "Z1K1": "Z6091", "Z6091K1": "Q2" } }, "Z48173K2": ".", "Z48173K3": "N;S;E;W" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "48.8566° N, 2.3522° E" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text test: paris-ne en" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } jrcfy6yl8g4vygo0n7q6qvgjqloo3td Z48180 0 101959 334605 2026-10-30T09:08:09Z Jsamwrites 938 Create Coordinate pair text test: paris-ne fr 334605 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48180" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48173", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48173", "Z48173K1": { "Z1K1": "Z6011", "Z6011K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "244283" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "11761" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K3": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "10000" } }, "Z6011K4": { "Z1K1": "Z6091", "Z6091K1": "Q2" } }, "Z48173K2": ",", "Z48173K3": "N;S;E;O" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "48,8566° N, 2,3522° E" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text test: paris-ne fr" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } 3aa63h3hz5g8j4mmjxfzbd4un57xkzn Z48181 0 101960 334606 2026-10-30T09:08:21Z Jsamwrites 938 Create Coordinate pair text test: paris-ne es 334606 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48181" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48173", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48173", "Z48173K1": { "Z1K1": "Z6011", "Z6011K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "244283" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "11761" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K3": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "10000" } }, "Z6011K4": { "Z1K1": "Z6091", "Z6091K1": "Q2" } }, "Z48173K2": ",", "Z48173K3": "N;S;E;O" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "48,8566° N, 2,3522° E" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text test: paris-ne es" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } 3v3ba3ee27ce5mnpmwg02xifabdalqg Z48182 0 101961 334607 2026-10-30T09:08:32Z Jsamwrites 938 Create Coordinate pair text test: paris-ne la 334607 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48182" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48173", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48173", "Z48173K1": { "Z1K1": "Z6011", "Z6011K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "244283" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "11761" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K3": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "10000" } }, "Z6011K4": { "Z1K1": "Z6091", "Z6091K1": "Q2" } }, "Z48173K2": ",", "Z48173K3": "N;S;E;O" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "48,8566° N, 2,3522° E" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text test: paris-ne la" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } cgvmgent1wlbv3m0f1zivsc6zh7qp5x Z48183 0 101962 334608 2026-10-30T09:08:44Z Jsamwrites 938 Create Coordinate pair text test: paris-ne ml 334608 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48183" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48173", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48173", "Z48173K1": { "Z1K1": "Z6011", "Z6011K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "244283" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "11761" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K3": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "10000" } }, "Z6011K4": { "Z1K1": "Z6091", "Z6091K1": "Q2" } }, "Z48173K2": ".", "Z48173K3": "വ;തെ;കി;പ" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "48.8566° വ, 2.3522° കി" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text test: paris-ne ml" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } 12gh59yducu8amx654i1fajzyjgmmbh Z48184 0 101963 334609 2026-10-30T09:08:56Z Jsamwrites 938 Create Coordinate pair text test: paris-ne ig 334609 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48184" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48173", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48173", "Z48173K1": { "Z1K1": "Z6011", "Z6011K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "244283" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "11761" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K3": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "10000" } }, "Z6011K4": { "Z1K1": "Z6091", "Z6091K1": "Q2" } }, "Z48173K2": ".", "Z48173K3": "N;S;E;W" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "48.8566° N, 2.3522° E" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text test: paris-ne ig" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } bl5z4llncketzmwzo1f7q9bq7w5c4dj Z48185 0 101964 334610 2026-10-30T09:09:08Z Jsamwrites 938 Create Coordinate pair text test: paris-ne dag 334610 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48185" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48173", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48173", "Z48173K1": { "Z1K1": "Z6011", "Z6011K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "244283" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "11761" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "5000" } }, "Z6011K3": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "10000" } }, "Z6011K4": { "Z1K1": "Z6091", "Z6091K1": "Q2" } }, "Z48173K2": ".", "Z48173K3": "N;S;E;W" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "48.8566° N, 2.3522° E" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinate pair text test: paris-ne dag" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } k2fa9mmymrojwqv9skrqyhz63dlzem4 Z48186 0 101965 334611 2026-10-30T09:09:20Z Jsamwrites 938 Create Date phrase by role test: year-ce-point en 334611 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48186" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48175", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48175", "Z48175K1": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1998" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z48175K2": "point", "Z48175K3": "year-ce-point=in {y}|year-ce-start=since {y}|year-ce-end=until {y}|year-bce-point=in {y} BC|decade-ce-point=in the {d}s|decade-ce-start=since the {d}s|decade-ce-end=until the {d}s|century-ce-point=in the {w} century|century-ce-start=since the {w} century|century-ce-end=until the {w} century|century-bce-point=in the {w} century BC", "Z48175K4": "3=third;20=twentieth" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "in 1998" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role test: year-ce-point en" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } ltmvc68evj0i5pj00cutssmiesmuxg0 Z48187 0 101966 334612 2026-10-30T09:09:32Z Jsamwrites 938 Create Date phrase by role test: year-ce-point fr 334612 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48187" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48175", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48175", "Z48175K1": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1998" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z48175K2": "point", "Z48175K3": "year-ce-point=en {y}|year-ce-start=depuis {y}|year-ce-end=jusqu'en {y}|year-bce-point=en {y} av. J.-C.|decade-ce-point=dans les années {d}|decade-ce-start=depuis les années {d}|decade-ce-end=jusqu'aux années {d}|century-ce-point=au {C}e siècle|century-ce-start=depuis le {C}e siècle|century-ce-end=jusqu'au {C}e siècle|century-bce-point=au {C}e siècle av. J.-C.", "Z48175K4": "" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "en 1998" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role test: year-ce-point fr" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } r4ryjgpej0fcfiya1mcg8fbu5rytdm6 Z48188 0 101967 334613 2026-10-30T09:09:44Z Jsamwrites 938 Create Date phrase by role test: year-ce-point es 334613 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48188" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48175", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48175", "Z48175K1": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1998" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z48175K2": "point", "Z48175K3": "year-ce-point=en {y}|year-ce-start=desde {y}|year-ce-end=hasta {y}|year-bce-point=en {y} a. C.|decade-ce-point=en la década de {d}|decade-ce-start=desde la década de {d}|decade-ce-end=hasta la década de {d}|century-ce-point=en el siglo {C}|century-ce-start=desde el siglo {C}|century-ce-end=hasta el siglo {C}|century-bce-point=en el siglo {C} a. C.", "Z48175K4": "" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "en 1998" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role test: year-ce-point es" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } bcbdvw21zdc96xgz676xefq288wjmfv Z48189 0 101968 334614 2026-10-30T09:09:56Z Jsamwrites 938 Create Date phrase by role test: year-ce-point la 334614 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48189" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48175", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48175", "Z48175K1": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1998" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z48175K2": "point", "Z48175K3": "year-ce-point=anno {Y}|year-ce-start=ab anno {Y}|year-ce-end=usque ad annum {Y}|year-bce-point=anno {Y} a.C.n.|decade-ce-point=annis {D}–{E}|decade-ce-start=ab annis {D}–{E}|decade-ce-end=usque ad annos {D}–{E}|century-ce-point=saeculo {C}|century-ce-start=a saeculo {C}|century-ce-end=usque ad saeculum {C}|century-bce-point=saeculo {C} a.C.n.", "Z48175K4": "" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "anno MCMXCVIII" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role test: year-ce-point la" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } 66svh8ms7jh8zcfckk8l0t1wnjnisnb Z48190 0 101969 334615 2026-10-30T09:10:08Z Jsamwrites 938 Create Date phrase by role test: year-ce-point ml 334615 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48190" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48175", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48175", "Z48175K1": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1998" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z48175K2": "point", "Z48175K3": "year-ce-point={y}-ൽ|year-ce-start={y} മുതൽ|year-ce-end={y} വരെ|year-bce-point=ക്രി.മു. {y}-ൽ|decade-ce-point={d}-കളിൽ|decade-ce-start={d}-കൾ മുതൽ|decade-ce-end={d}-കൾ വരെ|century-ce-point={w} നൂറ്റാണ്ടിൽ|century-ce-start={w} നൂറ്റാണ്ട് മുതൽ|century-ce-end={w} നൂറ്റാണ്ട് വരെ|century-bce-point=ക്രി.മു. {w} നൂറ്റാണ്ടിൽ", "Z48175K4": "3=മൂന്നാം;20=ഇരുപതാം" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "1998-ൽ" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role test: year-ce-point ml" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } 05xee7jjmn1ncvwan34i17u6irxz7ya Z48191 0 101970 334616 2026-10-30T09:10:20Z Jsamwrites 938 Create Date phrase by role test: year-ce-point ig 334616 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48191" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48175", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48175", "Z48175K1": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1998" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z48175K2": "point", "Z48175K3": "year-ce-point=na {y}|year-ce-start=kemgbe {y}|year-ce-end=ruo {y}|year-bce-point=na {y} TOA|decade-ce-point=n'afọ ndị {d}|decade-ce-start=kemgbe afọ ndị {d}|decade-ce-end=ruo afọ ndị {d}|century-ce-point=na narị afọ nke {w}|century-ce-start=kemgbe narị afọ nke {w}|century-ce-end=ruo narị afọ nke {w}|century-bce-point=na narị afọ nke {w} TOA", "Z48175K4": "3=atọ;20=iri abụọ" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "na 1998" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role test: year-ce-point ig" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } 2kt78hwvlyjwgulxbgcbig7zxeqmkvi Z48192 0 101971 334617 2026-10-30T09:10:32Z Jsamwrites 938 Create Date phrase by role test: year-ce-point dag 334617 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48192" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48175", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48175", "Z48175K1": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1998" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z48175K2": "point", "Z48175K3": "year-ce-point=yuuni {y} ni|year-ce-start=hali yuuni {y} ni|year-ce-end=hali yuuni {y} ni|year-bce-point=yuuni {y} BC ni|decade-ce-point=yuma {d}–{e} ni|decade-ce-start=hali yuma {d}–{e} ni|decade-ce-end=hali yuma {d}–{e} ni|century-ce-point=kɔbiga {w} yuuni saha ni|century-ce-start=hali kɔbiga {w} yuuni saha ni|century-ce-end=hali kɔbiga {w} yuuni saha ni|century-bce-point=kɔbiga {w} yuuni saha BC ni", "Z48175K4": "3=ata;20=ayi" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "yuuni 1998 ni" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Date phrase by role test: year-ce-point dag" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } g9qoed4zkks2xill6p1ifev3fm17nyo Z48193 0 101972 334618 2026-10-30T09:10:44Z Jsamwrites 938 Create Quantity with unit text test: minutes en 334618 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48193" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48177", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48177", "Z48177K1": { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "120" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q7727" } }, "Z48177K2": ",;.; ", "Z48177K3": "Q7727=minute/minutes|Q11574=second/seconds|Q25235=hour/hours|Q174728=centimetre/centimetres|Q11573=metre/metres|Q712226=square kilometre/square kilometres|Q35852=hectare/hectares|Q232291=square mile/square miles|Q81292=acre/acres|Q3710=foot/feet|Q218593=inch/inches|Q174789=millimetre/millimetres|Q25343=square metre/square metres|Q483261=dalton/daltons", "Z48177K4": "one" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "120 minutes" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text test: minutes en" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } qx6dq7eauaa2e23gxv9f6oiil4qpqia Z48194 0 101973 334619 2026-10-30T09:10:56Z Jsamwrites 938 Create Quantity with unit text test: minutes fr 334619 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48194" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48177", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48177", "Z48177K1": { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "120" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q7727" } }, "Z48177K2": " ;,; ", "Z48177K3": "Q7727=minute/minutes|Q11574=seconde/secondes|Q25235=heure/heures|Q174728=centimètre/centimètres|Q11573=mètre/mètres|Q712226=kilomètre carré/kilomètres carrés|Q35852=hectare/hectares|Q232291=mille carré/milles carrés|Q81292=acre/acres|Q3710=pied/pieds|Q218593=pouce/pouces|Q174789=millimètre/millimètres|Q25343=mètre carré/mètres carrés|Q483261=unité de masse atomique unifiée/unités de masse atomique unifiée", "Z48177K4": "below-two" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "120 minutes" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text test: minutes fr" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } pwhfodstzrpuokn8vz7klmlhi7yva8f Z48195 0 101974 334620 2026-10-30T09:11:08Z Jsamwrites 938 Create Quantity with unit text test: minutes es 334620 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48195" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48177", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48177", "Z48177K1": { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "120" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q7727" } }, "Z48177K2": " ;,; ", "Z48177K3": "Q7727=minuto/minutos|Q11574=segundo/segundos|Q25235=hora/horas|Q174728=centímetro/centímetros|Q11573=metro/metros|Q712226=kilómetro cuadrado/kilómetros cuadrados|Q35852=hectárea/hectáreas|Q232291=milla cuadrada/millas cuadradas|Q81292=acre/acres|Q3710=pie/pies|Q218593=pulgada/pulgadas|Q174789=milímetro/milímetros|Q25343=metro cuadrado/metros cuadrados|Q483261=unidad de masa atómica/unidades de masa atómica", "Z48177K4": "one" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "120 minutos" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text test: minutes es" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } azu0lceo9s85aj0do58rq9eyjkfz34i Z48196 0 101975 334621 2026-10-30T09:11:20Z Jsamwrites 938 Create Quantity with unit text test: minutes la 334621 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48196" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48177", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48177", "Z48177K1": { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "120" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q7727" } }, "Z48177K2": " ;,; ", "Z48177K3": "Q7727=minutum|Q11574=secundum|Q25235=hora|Q174728=centimetrum|Q11573=metrum|Q712226=chiliometrum quadratum|Q35852=hectarium|Q232291=mille passus quadratum|Q81292=ager|Q3710=Pes|Q218593=pollex|Q174789=millimetrum|Q25343=metrum quadratum|Q483261=daltonium", "Z48177K4": "never" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "120 minutum" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text test: minutes la" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } 1mxwlp3e7sybfjueyl8noz1e0m4dsei Z48197 0 101976 334622 2026-10-30T09:11:32Z Jsamwrites 938 Create Quantity with unit text test: minutes ml 334622 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48197" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48177", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48177", "Z48177K1": { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "120" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q7727" } }, "Z48177K2": ",;.; ", "Z48177K3": "Q7727=മിനിറ്റ്|Q11574=സെക്കന്റ്|Q25235=മണിക്കൂർ|Q174728=സെന്റിമീറ്റർ|Q11573=മീറ്റർ|Q712226=ചതുരശ്ര കിലോമീറ്റർ|Q35852=ഹെക്ടേർ|Q232291=ചതുരശ്ര മൈൽ|Q81292=ഏക്കർ|Q3710=അടി|Q218593=ഇഞ്ച്|Q174789=മില്ലിമീറ്റർ|Q25343=ചതുരശ്ര മീറ്റർ|Q483261=അറ്റോമിക് മാസ്സ് യൂണിറ്റ്", "Z48177K4": "never" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "120 മിനിറ്റ്" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text test: minutes ml" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } f2akwt300gi3zlvld6lj63dru5er79g Z48198 0 101977 334623 2026-10-30T09:11:44Z Jsamwrites 938 Create Quantity with unit text test: minutes ig 334623 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48198" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48177", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48177", "Z48177K1": { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "120" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q7727" } }, "Z48177K2": ",;.; ", "Z48177K3": "Q7727=nkeji|Q11574=sekọnd|Q25235=elekere|Q174728=sentimita|Q11573=mita|Q712226=square kilomita|Q35852=hectare|Q232291=square maịl|Q81292=acre|Q3710=ụkwụ|Q218593=inch|Q174789=milimita|Q25343=square mita|Q483261=dalton", "Z48177K4": "never" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "120 nkeji" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text test: minutes ig" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } hz6bq07886q7h1neuubo5sck72pmzv4 Z48199 0 101978 334624 2026-10-30T09:11:56Z Jsamwrites 938 Create Quantity with unit text test: minutes dag 334624 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48199" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48177", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48177", "Z48177K1": { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "120" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q7727" } }, "Z48177K2": ",;.; ", "Z48177K3": "Q7727=minti|Q11574=sɛkɔndi|Q25235=hawa|Q174728=sentimita|Q11573=mita|Q712226=square kilomita|Q35852=hectare|Q232291=square maili|Q81292=yika|Q3710=futi|Q218593=inchi|Q174789=milimita|Q25343=square mita|Q483261=dalton", "Z48177K4": "never" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "120 minti" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity with unit text test: minutes dag" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture and language." } ] } } e9magpa7jm6ed5url4dak2e5ryagrt1 User:Firman Rusda 2 101979 334628 2026-10-30T09:35:48Z Firman Rusda 103322 Created page with "Hello! <nowiki><br/></nowiki> I am Firman, a beginner Wikimedian in the Wikimedia Padang community." 334628 wikitext text/x-wiki Hello! <nowiki><br/></nowiki> I am Firman, a beginner Wikimedian in the Wikimedia Padang community. sn4w916k9bqt3zwrz94tjcza4td2gv0 334629 334628 2026-10-30T09:36:26Z Firman Rusda 103322 334629 wikitext text/x-wiki Hello! <br/> I am Firman, a beginner Wikimedian in the Wikimedia Padang community. nmlyuz2g1ziyrd2z6ttm0xnmjvk5hta Z48200 0 101980 334630 2026-10-30T09:42:25Z Jsamwrites 938 Create Coordinates sentence 334630 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48200" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48200K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48200K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48200K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48200" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving the coordinates of an item from its Wikidata coordinate location (P625), for example Its coordinates are 48.8567° N, 2.3519° E. The subject is a pronoun (it, he, she or they), so the item is not repeated. The preferred statement is used, else the normal-rank one. Without a usable coordinate, or with an unknown pronoun, it fails instead of producing text." } ] } } k3s3xoy69uux77mz89qjh9q98wxm3ci 334639 334630 2026-10-30T09:45:29Z Jsamwrites 938 Added Z48201 to the approved list of implementations 334639 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48200" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48200K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48200K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48200K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48201" ], "Z8K5": "Z48200" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving the coordinates of an item from its Wikidata coordinate location (P625), for example Its coordinates are 48.8567° N, 2.3519° E. The subject is a pronoun (it, he, she or they), so the item is not repeated. The preferred statement is used, else the normal-rank one. Without a usable coordinate, or with an unknown pronoun, it fails instead of producing text." } ] } } p5w208y05szc6q94uprdmyrtngw6qeo 334640 334639 2026-10-30T09:45:53Z Jsamwrites 938 Added Z48202, Z48203, Z48204, Z48205, Z48206, Z48207 and Z48208 to the approved list of test cases 334640 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48200" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48200K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48200K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48200K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20", "Z48202", "Z48203", "Z48204", "Z48205", "Z48206", "Z48207", "Z48208" ], "Z8K4": [ "Z14", "Z48201" ], "Z8K5": "Z48200" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving the coordinates of an item from its Wikidata coordinate location (P625), for example Its coordinates are 48.8567° N, 2.3519° E. The subject is a pronoun (it, he, she or they), so the item is not repeated. The preferred statement is used, else the normal-rank one. Without a usable coordinate, or with an unknown pronoun, it fails instead of producing text." } ] } } 38ofvtg4nm7bt8q6egfy348cln20tu9 Z48201 0 101981 334631 2026-10-30T09:42:31Z Jsamwrites 938 Create Coordinates sentence, composition with coordinate pair text 334631 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48201" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48200", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z8K8", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6003" }, "Z17K2": "Z8K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6003" }, "Z17K2": "Z8K7", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K9", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z11", "Z11K1": { "Z1K1": "Z18", "Z18K1": "Z48200K2" }, "Z11K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48200K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48200K3" }, "Z8K3": "sentence", "Z8K4": { "Z1K1": "Z7", "Z7K1": "Z48173", "Z48173K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } }, "Z48173K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48200K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48200K3" }, "Z8K3": "sep", "Z8K4": "" }, "Z48173K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48200K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48200K3" }, "Z8K3": "letters", "Z8K4": "" } } } } } ], "Z8K5": "Z8" }, "Z8K9": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K7" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The item has no usable coordinate location", "Coordinates sentence" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } } } ], "Z8K5": "Z8" }, "Z8K7": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } } } } } ], "Z8K5": "Z8" }, "Z8K6": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K7" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P625" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48200K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P625" } ] } } } }, "Z8K8": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z8( Z8K1, Z8K2, Z8K3, Z8K4 ) {\n const fail = ( message ) =\u003E { throw new Error( message ); };\n const N = { it: 0, he: 1, she: 2, they: 3 };\n const L = {\n en: [ '.', 'N;S;E;W', [ 'Its', 'His', 'Her', 'Their' ], '{S} coordinates are {C}.' ],\n fr: [ ',', 'N;S;E;O', null, 'Ses coordonn\\u00e9es sont {C}.' ],\n es: [ ',', 'N;S;E;O', null, 'Sus coordenadas son {C}.' ],\n la: [ ',', 'N;S;E;O', null, 'Coordinatae eius sunt {C}.' ],\n ml: [ '.', '\\u0d35;\\u0d24\\u0d46;\\u0d15\\u0d3f;\\u0d2a', [ '\\u0d05\\u0d24\\u0d3f\\u0d28\\u0d4d\\u0d31\\u0d46',\n '\\u0d05\\u0d26\\u0d4d\\u0d26\\u0d47\\u0d39\\u0d24\\u0d4d\\u0d24\\u0d3f\\u0d28\\u0d4d\\u0d31\\u0d46',\n '\\u0d05\\u0d35\\u0d33\\u0d41\\u0d1f\\u0d46', '\\u0d05\\u0d35\\u0d30\\u0d41\\u0d1f\\u0d46' ],\n '{S} \\u0d28\\u0d3f\\u0d7c\\u0d26\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d3e\\u0d19\\u0d4d\\u0d15\\u0d19\\u0d4d\\u0d19\\u0d7e {C} \\u0d06\\u0d23\\u0d4d.' ],\n ig: [ '.', 'N;S;E;W', null, 'Ebe \\u1ecd d\\u1ecb b\\u1ee5 {C}.' ],\n dag: [ '.', 'N;S;E;W', null, 'Di coordinates ny\\u025bla {C}.' ]\n };\n const row = L[ Z8K1 ];\n if ( !row ) { fail( 'Language not supported' ); }\n if ( !( Z8K2 in N ) ) { fail( 'Unknown subject pronoun' ); }\n if ( Z8K3 === 'sep' ) { return row[ 0 ]; }\n if ( Z8K3 === 'letters' ) { return row[ 1 ]; }\n return row[ 3 ].replace( '{S}', row[ 2 ] ? row[ 2 ][ N[ Z8K2 ] ] : '' ).replace( '{C}', Z8K4 );\n}" } } ], "Z8K5": "Z8" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence, composition with coordinate pair text" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving the coordinates of an item from its Wikidata coordinate location (P625), for example Its coordinates are 48.8567° N, 2.3519° E. The subject is a pronoun (it, he, she or they), so the item is not repeated. The preferred statement is used, else the normal-rank one. Without a usable coordinate, or with an unknown pronoun, it fails instead of producing text." } ] } } icsjqeqq2m0msm0hx9imfnvzok377jf Z48202 0 101982 334632 2026-10-30T09:42:38Z Jsamwrites 938 Create Coordinates sentence test: paris en it 334632 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48202" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48200", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48200", "Z48200K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z48200K2": { "Z1K1": "Z60", "Z60K1": "en" }, "Z48200K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Its coordinates are 48.8567° N, 2.3522° E." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence test: paris en it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } g1utnza6oyj74rolc992lziwm6k1b5i Z48203 0 101983 334633 2026-10-30T09:42:51Z Jsamwrites 938 Create Coordinates sentence test: paris fr it 334633 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48203" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48200", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48200", "Z48200K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z48200K2": { "Z1K1": "Z60", "Z60K1": "fr" }, "Z48200K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Ses coordonnées sont 48,8567° N, 2,3522° E." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence test: paris fr it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } 8far8bzg4h51krfl4mgrl9o7lu0pdcw Z48204 0 101984 334634 2026-10-30T09:43:05Z Jsamwrites 938 Create Coordinates sentence test: paris es it 334634 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48204" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48200", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48200", "Z48200K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z48200K2": { "Z1K1": "Z60", "Z60K1": "es" }, "Z48200K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Sus coordenadas son 48,8567° N, 2,3522° E." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence test: paris es it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } rxfljbpm1fonhq5nrh8gv5itqn601gk Z48205 0 101985 334635 2026-10-30T09:43:19Z Jsamwrites 938 Create Coordinates sentence test: paris la it 334635 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48205" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48200", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48200", "Z48200K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z48200K2": { "Z1K1": "Z60", "Z60K1": "la" }, "Z48200K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Coordinatae eius sunt 48,8567° N, 2,3522° E." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence test: paris la it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } 06tik29g8cc4q55nb2reqppf27043as Z48206 0 101986 334636 2026-10-30T09:43:33Z Jsamwrites 938 Create Coordinates sentence test: paris ml it 334636 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48206" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48200", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48200", "Z48200K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z48200K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z48200K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "അതിന്റെ നിർദ്ദേശാങ്കങ്ങൾ 48.8567° വ, 2.3522° കി ആണ്." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence test: paris ml it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } iownnvu487vqshyn27f4e8qswu2j57i Z48207 0 101987 334637 2026-10-30T09:43:46Z Jsamwrites 938 Create Coordinates sentence test: paris ig it 334637 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48207" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48200", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48200", "Z48200K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z48200K2": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z48200K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Ebe ọ dị bụ 48.8567° N, 2.3522° E." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence test: paris ig it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } hfflu55rx6l84do69kdn4eaf20uoffp Z48208 0 101988 334638 2026-10-30T09:44:00Z Jsamwrites 938 Create Coordinates sentence test: paris dag it 334638 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48208" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48200", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48200", "Z48200K1": { "Z1K1": "Z6091", "Z6091K1": "Q90" }, "Z48200K2": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z48200K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Di coordinates nyɛla 48.8567° N, 2.3522° E." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Coordinates sentence test: paris dag it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } 530xuqduojz53bktkl066fpgk7niblq Z48209 0 101989 334643 2026-10-30T10:10:37Z NikolasKHF 68920 334643 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48209" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "massa (kg)" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "kecepatan (m/s)" } ] } } ], "Z8K2": "Z20838", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48209" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Kinetik (SI)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menghitung energi kinetik (SI)" } ] } } m8tx9dn5morow0bbjmymf9o297z7r4t 334644 334643 2026-10-30T10:12:38Z Yamato Shiya 9717 add translation 334644 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48209" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "massa (kg)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "mass" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "kecepatan (m/s)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "velocity" } ] } } ], "Z8K2": "Z20838", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48209" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Kinetic energy function" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Kinetic energy" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menghitung energi kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function to count kinetic energy from formula 1/2 x m x v squared." } ] } } 8gngf8ja78d1aqplwyxsfpt0nf181n6 334649 334644 2026-10-30T10:36:30Z OwlyKnight 7673 Added Z48210 to the approved list of implementations 334649 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48209" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "massa (kg)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "mass" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "kecepatan (m/s)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "velocity" } ] } } ], "Z8K2": "Z20838", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48210" ], "Z8K5": "Z48209" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Kinetic energy function" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Kinetic energy" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menghitung energi kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function to count kinetic energy from formula 1/2 x m x v squared." } ] } } 23lz90dyqb2csa8j9baz9b6835uxq12 334650 334649 2026-10-30T10:36:35Z OwlyKnight 7673 Added Z48211 to the approved list of test cases 334650 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48209" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "massa (kg)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "mass" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "kecepatan (m/s)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "velocity" } ] } } ], "Z8K2": "Z20838", "Z8K3": [ "Z20", "Z48211" ], "Z8K4": [ "Z14", "Z48210" ], "Z8K5": "Z48209" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Kinetic energy function" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Kinetic energy" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menghitung energi kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function to count kinetic energy from formula 1/2 x m x v squared." } ] } } sgsyyg3n777f2xqu0nliaf72a86ljjg 334661 334650 2026-10-30T10:46:55Z Afdhal Sy 101702 334661 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48209" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "massa (kg)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "mass" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "kecepatan (m/s)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "velocity" } ] } } ], "Z8K2": "Z20838", "Z8K3": [ "Z20", "Z48211" ], "Z8K4": [ "Z14", "Z48210" ], "Z8K5": "Z48209" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Kinetic energy function" }, { "Z1K1": "Z11", "Z11K1": "Z1860", "Z11K2": "Energi gerak" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Kinetic energy" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menghitung energi kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function to count kinetic energy from formula 1/2 x m x v squared." }, { "Z1K1": "Z11", "Z11K1": "Z1860", "Z11K2": "untuak maetong energi gerak dari rumus" } ] } } aebpielzwgz6vx84clltxtbogocg352 334677 334661 2026-10-30T10:54:23Z Afdhal Sy 101702 334677 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48209" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "massa (kg)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "mass" }, { "Z1K1": "Z11", "Z11K1": "Z1860", "Z11K2": "barek" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48209K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "kecepatan (m/s)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "velocity" }, { "Z1K1": "Z11", "Z11K1": "Z1860", "Z11K2": "kacapatan" } ] } } ], "Z8K2": "Z20838", "Z8K3": [ "Z20", "Z48211" ], "Z8K4": [ "Z14", "Z48210" ], "Z8K5": "Z48209" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Kinetic energy function" }, { "Z1K1": "Z11", "Z11K1": "Z1860", "Z11K2": "Energi garik" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Kinetic energy" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menghitung energi kinetik (SI)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "function to count kinetic energy from formula 1/2 x m x v squared." }, { "Z1K1": "Z11", "Z11K1": "Z1860", "Z11K2": "untuak maetong energi gerak dari rumus" } ] } } eteu6lpjqvzo6nr1iphvq1d3sqgpapw Z48210 0 101990 334645 2026-10-30T10:22:07Z NikolasKHF 68920 334645 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48210" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48209", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z21032", "Z21032K1": { "Z1K1": "Z7", "Z7K1": "Z21032", "Z21032K1": { "Z1K1": "Z7", "Z7K1": "Z21033", "Z21033K1": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16661" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } }, "Z21033K2": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } } }, "Z21032K2": { "Z1K1": "Z18", "Z18K1": "Z48209K1" } }, "Z21032K2": { "Z1K1": "Z7", "Z7K1": "Z21028", "Z21028K1": { "Z1K1": "Z18", "Z18K1": "Z48209K2" }, "Z21028K2": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Kinetik (komposisi)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 5y7nlpd7oohrjm7xxur3losk0ajwuuv 334679 334645 2026-10-30T11:03:06Z HenkvD 1290 English label 334679 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48210" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48209", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z21032", "Z21032K1": { "Z1K1": "Z7", "Z7K1": "Z21032", "Z21032K1": { "Z1K1": "Z7", "Z7K1": "Z21033", "Z21033K1": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16661" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } }, "Z21033K2": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } } }, "Z21032K2": { "Z1K1": "Z18", "Z18K1": "Z48209K1" } }, "Z21032K2": { "Z1K1": "Z7", "Z7K1": "Z21028", "Z21028K1": { "Z1K1": "Z18", "Z18K1": "Z48209K2" }, "Z21028K2": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Kinetik (komposisi)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Kinetic energy function, Composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 8dbh6pufninqlaqd4e5ntuykqucjsts Z48211 0 101991 334646 2026-10-30T10:24:20Z NikolasKHF 68920 334646 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48211" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48209", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48209", "Z48209K1": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } }, "Z48209K2": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z20850", "Z20850K2": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "2" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "m=2,v=2" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ccf3ktwfvy6exztfw0xos84avbs2u76 334680 334646 2026-10-30T11:04:03Z HenkvD 1290 English label 334680 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48211" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48209", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z48209", "Z48209K1": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } }, "Z48209K2": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z20850", "Z20850K2": { "Z1K1": "Z20838", "Z20838K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z20838K2": { "Z1K1": "Z16683", "Z16683K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "2" } }, "Z20838K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z20838K4": { "Z1K1": "Z20825", "Z20825K1": "Z20837" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "m=2,v=2" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "m=2,v=2" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0u1hiev6p617fyzf8e2i0g9n32y9tyv Z48212 0 101992 334652 2026-10-30T10:45:20Z Jsamwrites 938 Create Duration sentence 334652 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48212" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48212K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48212K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48212K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48212" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving the duration of an item from its Wikidata duration (P2047), for example Its duration is 120 minutes. The subject is a pronoun (it, he, she or they), so the item is not repeated. The preferred statement is used, else the only normal-rank one. Only minutes, seconds and hours are accepted. Without exactly one usable duration, or with an unknown pronoun, it fails instead of producing text." } ] } } 4jbx3xnqicljp1hod3hfzx6qdki0ozn 334675 334652 2026-10-30T10:53:31Z Jsamwrites 938 Added Z48213 to the approved list of implementations 334675 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48212" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48212K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48212K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48212K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48213" ], "Z8K5": "Z48212" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving the duration of an item from its Wikidata duration (P2047), for example Its duration is 120 minutes. The subject is a pronoun (it, he, she or they), so the item is not repeated. The preferred statement is used, else the only normal-rank one. Only minutes, seconds and hours are accepted. Without exactly one usable duration, or with an unknown pronoun, it fails instead of producing text." } ] } } f3p7gxa0d3yxfgs89f0mq3q9jg1phhi 334676 334675 2026-10-30T10:53:35Z Jsamwrites 938 Added Z48214, Z48215, Z48216, Z48218, Z48219, Z48220 and Z48221 to the approved list of test cases 334676 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48212" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48212K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48212K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48212K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20", "Z48214", "Z48215", "Z48216", "Z48218", "Z48219", "Z48220", "Z48221" ], "Z8K4": [ "Z14", "Z48213" ], "Z8K5": "Z48212" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving the duration of an item from its Wikidata duration (P2047), for example Its duration is 120 minutes. The subject is a pronoun (it, he, she or they), so the item is not repeated. The preferred statement is used, else the only normal-rank one. Only minutes, seconds and hours are accepted. Without exactly one usable duration, or with an unknown pronoun, it fails instead of producing text." } ] } } jfe24zsrtv3t39h4at3f4k6o4av7o61 Z48213 0 101993 334653 2026-10-30T10:45:26Z Jsamwrites 938 Create Duration sentence, composition with quantity text 334653 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48213" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48212", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z8K8", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6003" }, "Z17K2": "Z8K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6003" }, "Z17K2": "Z8K7", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K9", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z11", "Z11K1": { "Z1K1": "Z18", "Z18K1": "Z48212K2" }, "Z11K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48212K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48212K3" }, "Z8K3": "sentence", "Z8K4": { "Z1K1": "Z7", "Z7K1": "Z48177", "Z48177K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } }, "Z48177K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48212K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48212K3" }, "Z8K3": "format", "Z8K4": "" }, "Z48177K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48212K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48212K3" }, "Z8K3": "units", "Z8K4": "" }, "Z48177K4": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48212K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48212K3" }, "Z8K3": "rule", "Z8K4": "" } } } } } ], "Z8K5": "Z8" }, "Z8K9": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K7" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The item has no usable duration", "Duration sentence" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z18", "Z18K1": "Z8K7" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The item has several competing durations", "Duration sentence" ] } } } } } ], "Z8K5": "Z8" }, "Z8K7": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } } } } } ], "Z8K5": "Z8" }, "Z8K6": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K7" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P2047" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48212K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P2047" } ] } } } }, "Z8K8": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z8( Z8K1, Z8K2, Z8K3, Z8K4 ) {\n const fail = ( message ) =\u003E { throw new Error( message ); };\n const N = { it: 0, he: 1, she: 2, they: 3 };\n const L = {\"en\":[\",;.; \",\"one\",\"Q7727=minute/minutes|Q11574=second/seconds|Q25235=hour/hours\",\"{S} duration is {Q}.\",[\"Its\",\"His\",\"Her\",\"Their\"]],\"fr\":[\" ;,; \",\"below-two\",\"Q7727=minute/minutes|Q11574=seconde/secondes|Q25235=heure/heures\",\"Sa durée est de {Q}.\",null],\"es\":[\" ;,; \",\"one\",\"Q7727=minuto/minutos|Q11574=segundo/segundos|Q25235=hora/horas\",\"Su duración es de {Q}.\",null],\"la\":[\" ;,; \",\"never\",\"Q7727=minutum|Q11574=secundum|Q25235=hora\",\"Eius duratio est {Q}.\",null],\"ml\":[\",;.; \",\"never\",\"Q7727=മിനിറ്റ്|Q11574=സെക്കന്റ്|Q25235=മണിക്കൂർ\",\"{S} ദൈർഘ്യം {Q} ആണ്.\",[\"അതിന്റെ\",\"അദ്ദേഹത്തിന്റെ\",\"അവളുടെ\",\"അവരുടെ\"]],\"ig\":[\",;.; \",\"never\",\"Q7727=nkeji|Q11574=sekọnd|Q25235=elekere\",\"Ogologo oge ya bụ {Q}.\",null],\"dag\":[\",;.; \",\"never\",\"Q7727=minti|Q11574=sɛkɔndi|Q25235=hawa\",\"Di saha nyɛla {Q}.\",null]};\n const row = L[ Z8K1 ];\n if ( !row ) { fail( 'Language not supported' ); }\n if ( !( Z8K2 in N ) ) { fail( 'Unknown subject pronoun' ); }\n if ( Z8K3 === 'format' ) { return row[ 0 ]; }\n if ( Z8K3 === 'rule' ) { return row[ 1 ]; }\n if ( Z8K3 === 'units' ) { return row[ 2 ]; }\n return row[ 3 ].replace( '{S}', row[ 4 ] ? row[ 4 ][ N[ Z8K2 ] ] : '' ).replace( '{Q}', Z8K4 );\n}" } } ], "Z8K5": "Z8" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence, composition with quantity text" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving the duration of an item from its Wikidata duration (P2047), for example Its duration is 120 minutes. The subject is a pronoun (it, he, she or they), so the item is not repeated. The preferred statement is used, else the only normal-rank one. Only minutes, seconds and hours are accepted. Without exactly one usable duration, or with an unknown pronoun, it fails instead of producing text." } ] } } q01cpjknxs7gxbgrhh8nd3u7c2x2jv6 Z48214 0 101994 334654 2026-10-30T10:45:33Z Jsamwrites 938 Create Duration sentence test: casablanca en it 334654 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48214" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48212", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48212", "Z48212K1": { "Z1K1": "Z6091", "Z6091K1": "Q132689" }, "Z48212K2": { "Z1K1": "Z60", "Z60K1": "en" }, "Z48212K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Its duration is 102 minutes." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence test: casablanca en it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } snusrskqmredohtmw7v7yu75u3nb4e7 Z48215 0 101996 334655 2026-10-30T10:45:47Z Jsamwrites 938 Create Duration sentence test: casablanca fr it 334655 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48215" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48212", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48212", "Z48212K1": { "Z1K1": "Z6091", "Z6091K1": "Q132689" }, "Z48212K2": { "Z1K1": "Z60", "Z60K1": "fr" }, "Z48212K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Sa durée est de 102 minutes." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence test: casablanca fr it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } h7lrmfj2wv44cvauvpqwspzpwf0g8ea Z48216 0 101997 334656 2026-10-30T10:46:00Z Jsamwrites 938 Create Duration sentence test: casablanca es it 334656 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48216" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48212", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48212", "Z48212K1": { "Z1K1": "Z6091", "Z6091K1": "Q132689" }, "Z48212K2": { "Z1K1": "Z60", "Z60K1": "es" }, "Z48212K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Su duración es de 102 minutos." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence test: casablanca es it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } dkps99288nl1nabk7ov9bco1cwoklwl Z48217 0 101998 334657 2026-10-30T10:46:09Z Firman Rusda 103322 334657 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48217" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48217K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Massa (kg)" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48217K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Ketinggian (m)" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48217K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Gravitasi (g)" } ] } } ], "Z8K2": "Z13518", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48217" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Potensial Gravitasi " } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "energi yang tersimpan pada suatu benda karena posisi atau ketinggiannya terhadap suatu titik acuan (seperti permukaan tanah) di dalam medan gravitasi" } ] } } 3hb6mv5ciz1sfkx6op7z1hukxdnyjve 334666 334657 2026-10-30T10:47:37Z Firman Rusda 103322 334666 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48217" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48217K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Massa (kg)" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48217K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Ketinggian (m)" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48217K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Gravitasi (g)" } ] } } ], "Z8K2": "Z13518", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48217" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Potensial Gravitasi " } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menghitung benda yang berada dekat dengan permukaan Bumi" } ] } } 6cevovyqhb4384pvpjka98zrdyliix7 334682 334666 2026-10-30T11:07:48Z HenkvD 1290 English labels 334682 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48217" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48217K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Massa (kg)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "mass (kg)" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48217K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Ketinggian (m)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "height (m)" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48217K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Gravitasi (g)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "gravity (g)" } ] } } ], "Z8K2": "Z13518", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48217" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Potensial Gravitasi " }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Gravitational Potential Energy" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menghitung benda yang berada dekat dengan permukaan Bumi" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "calculating for objects located near the Earth's surface" } ] } } mh0pnnbzum8dtuo7yatyq234z7zneic Z48218 0 101999 334658 2026-10-30T10:46:14Z Jsamwrites 938 Create Duration sentence test: casablanca la it 334658 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48218" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48212", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48212", "Z48212K1": { "Z1K1": "Z6091", "Z6091K1": "Q132689" }, "Z48212K2": { "Z1K1": "Z60", "Z60K1": "la" }, "Z48212K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Eius duratio est 102 minutum." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence test: casablanca la it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } s1ymvjffua97d1izsl89ps72q7nggz0 Z48219 0 102000 334659 2026-10-30T10:46:28Z Jsamwrites 938 Create Duration sentence test: casablanca ml it 334659 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48219" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48212", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48212", "Z48212K1": { "Z1K1": "Z6091", "Z6091K1": "Q132689" }, "Z48212K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z48212K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "അതിന്റെ ദൈർഘ്യം 102 മിനിറ്റ് ആണ്." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence test: casablanca ml it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } awzl1qz9eo95px7q6noduvvto5k1trh Z48220 0 102001 334660 2026-10-30T10:46:42Z Jsamwrites 938 Create Duration sentence test: casablanca ig it 334660 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48220" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48212", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48212", "Z48212K1": { "Z1K1": "Z6091", "Z6091K1": "Q132689" }, "Z48212K2": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z48212K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Ogologo oge ya bụ 102 nkeji." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence test: casablanca ig it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } fi2q1779x5zcvf8lurry4t6b70hxwdz Z48221 0 102002 334662 2026-10-30T10:46:56Z Jsamwrites 938 Create Duration sentence test: casablanca dag it 334662 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48221" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48212", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48212", "Z48212K1": { "Z1K1": "Z6091", "Z6091K1": "Q132689" }, "Z48212K2": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z48212K3": "it" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Di saha nyɛla 102 minti." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Duration sentence test: casablanca dag it" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } rx7re4w7gm461lajlmveynyuzec9xj4 Z48222 0 102003 334663 2026-10-30T10:47:13Z Jsamwrites 938 Create Birth sentence 334663 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48222" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48222K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48222K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48222K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48222" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving when a person was born from their Wikidata date of birth (P569), for example She was born in 1998. The subject is a pronoun (he, she or they), so the person is not repeated. Only humans (instance of human) with a Gregorian year, decade or century date are accepted; the preferred statement is used, else the only normal-rank one. Without exactly one usable date, for a non-human, or with an unknown pronoun, it fails instead of producing text. A missing date of death is never used." } ] } } npnxvn74htibvnkew80mdzrd7jn6k37 334673 334663 2026-10-30T10:53:22Z Jsamwrites 938 Added Z48223 to the approved list of implementations 334673 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48222" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48222K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48222K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48222K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z48223" ], "Z8K5": "Z48222" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving when a person was born from their Wikidata date of birth (P569), for example She was born in 1998. The subject is a pronoun (he, she or they), so the person is not repeated. Only humans (instance of human) with a Gregorian year, decade or century date are accepted; the preferred statement is used, else the only normal-rank one. Without exactly one usable date, for a non-human, or with an unknown pronoun, it fails instead of producing text. A missing date of death is never used." } ] } } 03tyy6bar3w3ms9nzldnw49eo2hscf9 334674 334673 2026-10-30T10:53:26Z Jsamwrites 938 Added Z48224, Z48225, Z48226, Z48227, Z48228, Z48229 and Z48230 to the approved list of test cases 334674 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48222" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48222K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48222K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48222K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20", "Z48224", "Z48225", "Z48226", "Z48227", "Z48228", "Z48229", "Z48230" ], "Z8K4": [ "Z14", "Z48223" ], "Z8K5": "Z48222" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving when a person was born from their Wikidata date of birth (P569), for example She was born in 1998. The subject is a pronoun (he, she or they), so the person is not repeated. Only humans (instance of human) with a Gregorian year, decade or century date are accepted; the preferred statement is used, else the only normal-rank one. Without exactly one usable date, for a non-human, or with an unknown pronoun, it fails instead of producing text. A missing date of death is never used." } ] } } stt9bexcrnpfa4u674zg9hf4zxwmyng 334695 334674 2026-10-30T11:32:14Z Jsamwrites 938 Removed Z48223 from the approved list of implementations 334695 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48222" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z48222K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z48222K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z48222K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject pronoun" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20", "Z48224", "Z48225", "Z48226", "Z48227", "Z48228", "Z48229", "Z48230" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48222" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving when a person was born from their Wikidata date of birth (P569), for example She was born in 1998. The subject is a pronoun (he, she or they), so the person is not repeated. Only humans (instance of human) with a Gregorian year, decade or century date are accepted; the preferred statement is used, else the only normal-rank one. Without exactly one usable date, for a non-human, or with an unknown pronoun, it fails instead of producing text. A missing date of death is never used." } ] } } 8dkoyttgealwbez5a81u8hck6kw0q1v Z48223 0 102004 334664 2026-10-30T10:47:19Z Jsamwrites 938 Create Birth sentence, composition with date phrase 334664 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48223" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48222", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z8K8", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6003" }, "Z17K2": "Z8K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q5" } ], "Z13752K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48222K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P31" } ] } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6003" }, "Z17K2": "Z8K7", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K9", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z11", "Z11K1": { "Z1K1": "Z18", "Z18K1": "Z48222K2" }, "Z11K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48222K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48222K3" }, "Z8K3": "sentence", "Z8K4": { "Z1K1": "Z7", "Z7K1": "Z48175", "Z48175K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } }, "Z48175K2": "point", "Z48175K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48222K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48222K3" }, "Z8K3": "phrases", "Z8K4": "" }, "Z48175K4": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z48222K2" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z48222K3" }, "Z8K3": "words", "Z8K4": "" } } } } } ], "Z8K5": "Z8" }, "Z8K9": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K7" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The item has no usable date of birth", "Birth sentence" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z18", "Z18K1": "Z8K7" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The item has several competing dates of birth", "Birth sentence" ] } } } } } ], "Z8K5": "Z8" }, "Z8K7": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K4" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6040", "Z6040K1": "Z6041" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The item is not a human", "Birth sentence" ] } } } ], "Z8K5": "Z8" }, "Z8K6": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K7" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P569" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z48222K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P569" } ] } } } }, "Z8K8": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z8( Z8K1, Z8K2, Z8K3, Z8K4 ) {\n const fail = ( message ) =\u003E { throw new Error( message ); };\n const N = { he: 0, she: 1, they: 2 };\n const L = {\"en\":[\"year-ce-point=in {y}|year-bce-point=in {y} BC|decade-ce-point=in the {d}s|century-ce-point=in the {w} century|century-bce-point=in the {w} century BC\",\"3=third;20=twentieth\",[\"He was born {P}.\",\"She was born {P}.\",\"They were born {P}.\"]],\"fr\":[\"year-ce-point=en {y}|year-bce-point=en {y} av. J.-C.|decade-ce-point=dans les années {d}|century-ce-point=au {C}e siècle|century-bce-point=au {C}e siècle av. J.-C.\",\"\",[\"Il est né {P}.\",\"Elle est née {P}.\",\"Iel est né·e {P}.\"]],\"es\":[\"year-ce-point=en {y}|year-bce-point=en {y} a. C.|decade-ce-point=en la década de {d}|century-ce-point=en el siglo {C}|century-bce-point=en el siglo {C} a. C.\",\"\",[\"Él nació {P}.\",\"Ella nació {P}.\",\"Elle nació {P}.\"]],\"la\":[\"year-ce-point=anno {Y}|year-bce-point=anno {Y} a.C.n.|decade-ce-point=annis {D}–{E}|century-ce-point=saeculo {C}|century-bce-point=saeculo {C} a.C.n.\",\"\",[\"Natus est {P}.\",\"Nata est {P}.\",null]],\"ml\":[\"year-ce-point={y}-ൽ|year-bce-point=ക്രി.മു. {y}-ൽ|decade-ce-point={d}-കളിൽ|century-ce-point={w} നൂറ്റാണ്ടിൽ|century-bce-point=ക്രി.മു. {w} നൂറ്റാണ്ടിൽ\",\"3=മൂന്നാം;20=ഇരുപതാം\",[\"അദ്ദേഹം {P} ജനിച്ചു.\",\"അവൾ {P} ജനിച്ചു.\",\"അവർ {P} ജനിച്ചു.\"]],\"ig\":[\"year-ce-point=na {y}|year-bce-point=na {y} TOA|decade-ce-point=n'afọ ndị {d}|century-ce-point=na narị afọ nke {w}|century-bce-point=na narị afọ nke {w} TOA\",\"3=atọ;20=iri abụọ\",[\"A mụrụ ya {P}.\",\"A mụrụ ya {P}.\",\"A mụrụ ya {P}.\"]],\"dag\":[\"year-ce-point=yuuni {y} ni|year-bce-point=yuuni {y} BC ni|decade-ce-point=yuma {d}–{e} ni|century-ce-point=kɔbiga {w} yuuni saha ni|century-bce-point=kɔbiga {w} yuuni saha BC ni\",\"3=ata;20=ayi\",[\"Bɛ dɔɣi o la {P}.\",\"Bɛ dɔɣi o la {P}.\",\"Bɛ dɔɣi o la {P}.\"]]};\n const row = L[ Z8K1 ];\n if ( !row ) { fail( 'Language not supported' ); }\n if ( !( Z8K2 in N ) ) { fail( 'Unknown subject pronoun' ); }\n if ( Z8K3 === 'phrases' ) { return row[ 0 ]; }\n if ( Z8K3 === 'words' ) { return row[ 1 ]; }\n if ( !row[ 2 ][ N[ Z8K2 ] ] ) { fail( 'No form of this sentence for the pronoun' ); }\n return row[ 2 ][ N[ Z8K2 ] ].replace( '{P}', Z8K4 );\n}" } } ], "Z8K5": "Z8" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence, composition with date phrase" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence giving when a person was born from their Wikidata date of birth (P569), for example She was born in 1998. The subject is a pronoun (he, she or they), so the person is not repeated. Only humans (instance of human) with a Gregorian year, decade or century date are accepted; the preferred statement is used, else the only normal-rank one. Without exactly one usable date, for a non-human, or with an unknown pronoun, it fails instead of producing text. A missing date of death is never used." } ] } } 692inh4frnlm9lzhk720o94k881umqk Z48224 0 102005 334665 2026-10-30T10:47:26Z Jsamwrites 938 Create Birth sentence test: mohr en he 334665 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48224" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48222", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48222", "Z48222K1": { "Z1K1": "Z6091", "Z6091K1": "Q100000811" }, "Z48222K2": { "Z1K1": "Z60", "Z60K1": "en" }, "Z48222K3": "he" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "He was born in 1851." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence test: mohr en he" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } iyxktw5tlpm64c96a3pe5613o2lbdrj Z48225 0 102006 334667 2026-10-30T10:47:40Z Jsamwrites 938 Create Birth sentence test: mohr fr he 334667 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48225" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48222", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48222", "Z48222K1": { "Z1K1": "Z6091", "Z6091K1": "Q100000811" }, "Z48222K2": { "Z1K1": "Z60", "Z60K1": "fr" }, "Z48222K3": "he" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Il est né en 1851." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence test: mohr fr he" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } i2tp4andbc7xbz7acb8pklphmdco681 Z48226 0 102007 334668 2026-10-30T10:47:54Z Jsamwrites 938 Create Birth sentence test: mohr es he 334668 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48226" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48222", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48222", "Z48222K1": { "Z1K1": "Z6091", "Z6091K1": "Q100000811" }, "Z48222K2": { "Z1K1": "Z60", "Z60K1": "es" }, "Z48222K3": "he" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Él nació en 1851." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence test: mohr es he" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } 1j77rg6eopfoxtljzwkuzoaoe8wj8dp Z48227 0 102008 334669 2026-10-30T10:48:07Z Jsamwrites 938 Create Birth sentence test: mohr la he 334669 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48227" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48222", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48222", "Z48222K1": { "Z1K1": "Z6091", "Z6091K1": "Q100000811" }, "Z48222K2": { "Z1K1": "Z60", "Z60K1": "la" }, "Z48222K3": "he" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Natus est anno MDCCCLI." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence test: mohr la he" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } pzkb8qqyng1k86loev4785wrnangyxn Z48228 0 102009 334670 2026-10-30T10:48:21Z Jsamwrites 938 Create Birth sentence test: mohr ml he 334670 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48228" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48222", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48222", "Z48222K1": { "Z1K1": "Z6091", "Z6091K1": "Q100000811" }, "Z48222K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z48222K3": "he" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "അദ്ദേഹം 1851-ൽ ജനിച്ചു." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence test: mohr ml he" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } fxkq0ewf7iosklgnoqfzxc6m530qcqi Z48229 0 102010 334671 2026-10-30T10:48:35Z Jsamwrites 938 Create Birth sentence test: mohr ig he 334671 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48229" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48222", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48222", "Z48222K1": { "Z1K1": "Z6091", "Z6091K1": "Q100000811" }, "Z48222K2": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z48222K3": "he" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "A mụrụ ya na 1851." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence test: mohr ig he" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } skv0hgyxx9i7yq6aepazv8g7uz4owp4 Z48230 0 102011 334672 2026-10-30T10:48:48Z Jsamwrites 938 Create Birth sentence test: mohr dag he 334672 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48230" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z48222", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z48222", "Z48222K1": { "Z1K1": "Z6091", "Z6091K1": "Q100000811" }, "Z48222K2": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z48222K3": "he" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Bɛ dɔɣi o la yuuni 1851 ni." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Birth sentence test: mohr dag he" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the exact text for one reviewed fixture, language and pronoun." } ] } } 7xnyz3o0zd9cbnlpeco3tw8yqp6d8th Z48231 0 102012 334690 2026-10-30T11:20:36Z Firman Rusda 103322 334690 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48231" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48217", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z21032", "Z21032K1": { "Z1K1": "Z18", "Z18K1": "Z48217K1" }, "Z21032K2": { "Z1K1": "Z7", "Z7K1": "Z21032", "Z21032K1": { "Z1K1": "Z18", "Z18K1": "Z48217K3" }, "Z21032K2": { "Z1K1": "Z18", "Z18K1": "Z48217K2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Potensial Gravitasi (komposisi)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ptoq5zbea07qhyk5xai8v1v8js0ux0e 334692 334690 2026-10-30T11:22:35Z Firman Rusda 103322 334692 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48231" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48217", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z21032", "Z21032K1": { "Z1K1": "Z18", "Z18K1": "Z48217K1" }, "Z21032K2": { "Z1K1": "Z7", "Z7K1": "Z21032", "Z21032K1": { "Z1K1": "Z18", "Z18K1": "Z48217K3" }, "Z21032K2": { "Z1K1": "Z18", "Z18K1": "Z48217K2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Energi Potensial Gravitasi (komposisi)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "menghitung benda yang berada dekat dengan permukaan Bumi" } ] } } q82xm51b2flrpow1hrspct6dhgryrku Z48232 0 102013 334693 2026-10-30T11:24:04Z Pijri Paijar 88848 334693 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48232" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48232K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Total pendapatan" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z48232K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Total populasi" } ] } } ], "Z8K2": "Z13518", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48232" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Pendapatan per kapita" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Menghitung rata-rata pendapatan setiap individu dalam suatu wilayah dengan membagi total pendapatan dengan total populasi." } ] } } 5otkuvcd7ix7sm5wauu9gi4gyq9yr6m Z48233 0 102014 334696 2026-10-30T11:32:53Z Pijri Paijar 88848 334696 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48233" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48232", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function Z48232( Z48232K1, Z48232K2 ) { {\n if (totalPopulasi === 0) {\n return 0;\n }\n return totalPendapatan / totalPopulasi;\n}" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } n5notfan3mdb7pxovdqz0nqg1xjkoig 334697 334696 2026-10-30T11:33:36Z Pijri Paijar 88848 334697 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48233" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z48232", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z600", "Z16K2": "function( totalPendapatan, totalPopulasi ) {\n if (totalPopulasi === 0) {\n return 0;\n }\n return totalPendapatan / totalPopulasi;\n}" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 7hrlxly875ll8l1xnzkmjffi9myhi9d Z48234 0 102015 334698 2026-10-30T11:53:16Z Naila Fathinah 103318 334698 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z48234" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48234K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Massa jenis" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48234K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Gravitasi" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z20838", "Z17K2": "Z48234K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Kedalaman" } ] } } ], "Z8K2": "Z20838", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z48234" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Tekanan Hidrostatis" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1078", "Z31K2": [ "Z6", "Tekanan zat cair", "Tekanan fluida" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Fungsi untuk menghitung tekanan yang diberikan oleh zat cair yang diam akibat pengaruh gaya gravitasi pada suatu kedalaman tertentu" } ] } } j6mb7yy0ib2hnji5fx60579jmwy4kqo