Template:PersonCall: Difference between revisions

From Bodhicitta
(VSCode edit)
(VSCode edit)
 
(5 intermediate revisions by the same user not shown)
Line 21: Line 21:




<div class="row ssb-content">
<!--
<div class="ssb col-md-3 order-md-last sliding-drawer">
Full width, no sidebar.
<div class="sidebar ssb__inner my-5">
 
<div class="font-serif-alt text-110">{{#ask:[[{{PAGENAME}}]][[PersonType::+]]
NOTE — avoid colons inside these comment blocks. SMW's RemoteRequest.php
|?PersonType
runs a colon-split over every HTML comment it finds in a remote query
|format=template |template=DisplayPersonTypes |link=none |valuesep=;
response, so a colon here produces PHP warnings during rebuildData runs.
|intro=<div class="mt-3 mb-2 text-center text-110 font-weight-bold">Categories</div>
 
}}{{#arraymap:{{#ask:[[{{PAGENAME}}]][[Languagetranslation::+]]
The page used to run a 3/9 split with relations and categories in a sticky
|?Languagetranslation
rail. Measured across all 1,695 person pages, that rail held a median of TWO
|link=none |valuesep=; |mainlabel=- |headers=hide |import-annotation=true
items. 82% of pages carried 1-3, and only 1.2% carried 15 or more. Four out
}}
of five pages were paying for a sticky-sidebar instance, a mobile drawer, and
|;
a narrowed article column in order to show about two links.
|@@@
 
|<div class="ml-3 my-1">[[:Category:Translators of @@@|Translator of @@@]]</div>
A sidebar also earns its keep elsewhere on this wiki by holding things a
|;
reader returns to while moving through long content, such as a TOC or chapter
}}{{#ask:[[{{PAGENAME}}]][[EmanationOf::+]]
navigation. Person pages have no such content, only a short biography and
|?EmanationOf
then tiles. Names and relationships are attributes OF the subject, so they
|format=template |template=DisplayRelPeople |link=none |valuesep=;
now read in sequence with it rather than in a parallel column.
|intro=<div class="mt-3 mb-2 text-center text-110 font-weight-bold">Emantation of</div>
 
}}{{#ask:[[{{PAGENAME}}]][[Studentof::+]]
Reading order is deliberate. Who they are, what they looked like and their
|?Studentof
life, who they were connected to, then what they made. The works queries come
|format=template |template=DisplayRelPeople |link=none |valuesep=;
last because they run deep on well-covered figures, and they are the point of
|intro=<div class="mt-3 mb-2 text-center text-110 font-weight-bold">Student of</div>
the page.
}}{{#ask:[[{{PAGENAME}}]][[Teacherof::+]]
-->{{#ask:[[{{SUBPAGENAME}}]]
|?Teacherof
|?BdrcLink |?Bio |?BiographicalInfo |?BioTib |?BnwShortPersonBio |?FirstImage |?HarLinkRaw |?HasDnzPage |?HasRtzPage |?ImagesRaw |?MainNameChi |?MainNameDev |?MainNameJap |?MainNameKor |?MainNamePhon |?MainNameTib |?TolExcerpt |?TolLinkRaw |?Yearbirth |?Yeardeath |?Subclass |?GyatsaBioTib |?AltNamesTib |?AltNamesWylie |?AltNamesOther |?PersonType |?Languagetranslation |?EmanationOf |?Studentof |?Teacherof
|format=template |template=DisplayRelPeople |link=none |valuesep=;
|intro=<div class="mt-3 mb-2 text-center text-110 font-weight-bold">Teacher of</div>
}}<!-- {{#ask:[[{{PAGENAME}}]][[AltNamesTib::+]]
OR[[{{PAGENAME}}]][[AltNamesWylie::+]]
OR[[{{PAGENAME}}]][[AltNamesOther::+]]
OR[[{{PAGENAME}}]][[GyatsaNameWylie::+]]
|?AltNamesTib |?AltNamesWylie |?AltNamesOther |?GyatsaNameWylie
|named args=true |format=template |template=DisplayAltNames |link=none |valuesep=;
|intro=<div class="mt-3 mb-2 text-center text-110 font-weight-bold">Other Names</div>
}} -->
</div>
</div>
</div>
<div class="col-md-9">{{#ask:[[{{SUBPAGENAME}}]]
|?BdrcLink |?Bio |?BiographicalInfo |?BioTib |?BnwShortPersonBio |?Description |?FirstImage |?HarLinkRaw |?HasDnzPage |?HasRtzPage |?ImagesRaw |?MainNameChi |?MainNameDev |?MainNameJap |?MainNameKor |?MainNamePhon |?MainNameTib |?TolExcerpt |?TolLinkRaw |?Yearbirth |?Yeardeath |?Subclass |?GyatsaBioTib
|named args=true
|named args=true
|link=none
|link=none
Line 66: Line 51:
|format=template
|format=template
|template=PersonRemote
|template=PersonRemote
}}
}}<!--
The Names and Connections band is rendered by the PersonRemote template on
Commons, from the printouts requested above. It used to be six local ask
queries here, which both duplicated data that arrives in the remote fetch
anyway and depended on SetRemoteValues having imported it.
-->
<div class="my-4"><!--
<div class="my-4"><!--
One filter box for the whole page, sitting above every section.
One filter box for the whole page, sitting above every section.


It is deliberately NOT per-section: the handler in tws.js binds to every
It is deliberately NOT per-section, because the handler in tws.js binds to every
.filter-input on the page, and an input with no contentId targets
.filter-input on the page, and an input with no contentId targets
.filterableContent globally — so one box per section would have each box
.filterableContent globally — so one box per section would have each box
Line 98: Line 88:


The buckets have to be mutually exclusive, because the underlying data
The buckets have to be mutually exclusive, because the underlying data
overlaps: an item with |Performer= is ALSO auto-categorised under the
overlaps, because an item with |Performer= is ALSO auto-categorised under the
performer's name. Splitting naively double-renders those tiles — measured on
performer's name. Splitting naively double-renders those tiles — measured on
People/Ringu Tulku, 303 "authored" + 294 "performer" for a true union of 303.
People/Ringu Tulku, 303 "authored" + 294 "performer" for a true union of 303.


They are separated on |Class= rather than by negating |Performer=, for two
They are separated on |Class= rather than by negating |Performer=, for two
reasons. First, SMW's negation operators do not do set subtraction here:
reasons. First, SMW's negation operators do not do set subtraction here.
[[Performer::!X]] excludes pages that LACK the property entirely, which
A negated Performer condition excludes pages that LACK the property entirely, which
silently drops every text work (it zeroed out Śāntideva's 181 works in
silently drops every text work (it zeroed out Śāntideva's 181 works in
testing), and [[Category:!X]] was ignored outright. Second, Class is a
testing), and a negated Category condition was ignored outright. Second, Class is a
reliable positive discriminator — every one of the 1,732 library items
reliable positive discriminator — every one of the 1,732 library items
carrying a Performer value is Class=Multimedia, with no exceptions.
carrying a Performer value is Class=Multimedia, with no exceptions.


So: Multimedia is the performance bucket, everything else is authorship.
So Multimedia is the performance bucket, and everything else is authorship.
Positive conditions only, no negation.
Positive conditions only, no negation.


Line 122: Line 112:
|heading=Performances &amp; Recordings
|heading=Performances &amp; Recordings
|blurb=Media in which {{#show:{{PAGENAME}}|?MainNamePhon}} appears as performer or teacher.
|blurb=Media in which {{#show:{{PAGENAME}}|?MainNamePhon}} appears as performer or teacher.
|query=[[Category:Library Items||Editorial Content]][[Performer::{{#titleparts:{{SUBPAGENAME}}}}]]
|query=[[Category:Library Items||Editorial Content]][[Performer::{{#titleparts:{{SUBPAGENAME}}}}]][[Volumenumber::<1]]
}}{{PersonWorksSection
}}{{PersonWorksSection
|heading=Narrated Audio
|heading=Narrated Audio
Line 133: Line 123:
}}
}}
<!--
<!--
Fallback: nothing matched any bucket. Preserves the original empty-state message.
Fallback for when nothing matched any bucket. Preserves the original empty state.
--> {{#ifexpr:{{#ask:[[Category:Library Items||Editorial Content]][[Category:{{#titleparts:{{SUBPAGENAME}}}}]]
--> {{#ifexpr:{{#ask:[[Category:Library Items||Editorial Content]][[Category:{{#titleparts:{{SUBPAGENAME}}}}]]
OR[[Category:Library Items||Editorial Content]][[PeopleTopics::{{#titleparts:{{SUBPAGENAME}}}}]]
OR[[Category:Library Items||Editorial Content]][[PeopleTopics::{{#titleparts:{{SUBPAGENAME}}}}]]
Line 142: Line 132:
}}
}}
</div>
</div>
</div>
</div>


{{#arraymap:{{#titleparts:{{SUBPAGENAME}} }};{{#arraymap:{{#ask:[[{{PAGENAME}}]][[Languagetranslation::+]]
{{#arraymap:{{#titleparts:{{SUBPAGENAME}} }};{{#arraymap:{{#ask:[[{{PAGENAME}}]][[Languagetranslation::+]]
Line 164: Line 151:
separated from single-valued ones.
separated from single-valued ones.


Module:GetData now takes |multi=, an allowlist of the properties that should
The GetData module now takes |multi=, an allowlist of the properties that should
receive SMW's '+sep=' directive. Everything else in |props= is stored as a
receive SMW's '+sep=' directive. Everything else in |props= is stored as a
single value, so both groups can travel in one query.
single value, so both groups can travel in one query.

Latest revision as of 21:42, 13 August 2026