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' → 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' → '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—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]] → [[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) → [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