Files
fd-dictionaries/shared/freedict-P5.xml
T
2026-10-02 22:51:03 +08:00

290 lines
17 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!-- vim: set expandtab sts=2 ts=2 sw=2 tw=88: -->
<?oxygen RNGSchema="tei_odds.rng" type="xml"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0"
xmlns:sch="http://purl.oclc.org/dsdl/schematron"
xmlns:rng="http://relaxng.org/ns/structure/1.0"
xml:lang="en" n="freedict">
<teiHeader>
<fileDesc>
<titleStmt>
<title>TEI Customization for the FreeDict project (basic), version 0.10</title>
<respStmt>
<resp>maintained by</resp>
<name xml:id="bansp">Piotr Bański (bansp in the domain of o2.pl)</name>
</respStmt>
</titleStmt>
<publicationStmt>
<publisher>FreeDict</publisher>
<availability status="free">
<p>This file is released as part of the FreeDict package (https://freedict.org/). It is licensed under the GNU Public License version 2.0 or later.</p>
</availability>
</publicationStmt>
<sourceDesc>
<p>Initial version created with Roma, the ODD generator, version 3.6.</p>
<p>This file is the basic schema for Freedict dictionaries encoded in TEI P5.</p>
</sourceDesc>
</fileDesc>
</teiHeader>
<text>
<body>
<head>ODD for FreeDict dictionaries, basic level of conformance.</head>
<p>This is the ODD driver for generating schemas and documentation for
dictionaries in the FreeDict project (see https://freedict.org/). It is
meant primarily for dictionaries with a basic structure.
More advanced dictionaries require an extended ODD schema.
See a TEI Conference and Members' Meeting presentation by Piotr Bański
and Beata Wójtowicz, which should be available from
https://www.lib.umich.edu/spo/teimeeting09/program.html.</p>
<list n="changelog" type="glossed">
<item><label>Version 0.11, <date when="2026-07-05">5th of July 2026</date>,
by <name>Sebastian Humenda</name></label>:
<list type="numbered">
<item>Require at least one licence paragraph in <gi>availability</gi>.</item>
<item>Allow normal TEI model.p-like content before and after that
required licence paragraph, instead of only plain-text
<gi>p</gi> paragraphs.</item>
<item>Allow multiple licence refs inside the required paragraph
(<gi>oneOrMore</gi> refs), not just a single one.</item>
<item>Restrict <gi>edition</gi> to FreeDict version strings, based
on semantic versioning:
<code>major.minor</code>, <code>major.minor.patch</code>, and the
three-part form with SemVer build metadata.</item>
</list>
</item>
<item><label>Version 0.10, <date when="2011-09-09">9 September 2011</date>, by <name>Piotr Bański</name></label>: Added the <gi>cell</gi>, <gi>row</gi>, and <gi>table</gi> elements, to handle front matter better.</item>
<item><label>Version 0.9, <date when="2010-11-08">8 November 2010</date>, by <name>Piotr Bański</name></label>:
<list type="bulleted">
<item>Added further Schematron constraints on the contents of <gi>tagUsage</gi>: when the <att>rend</att> on an ancestor is set to <val>anchored</val>, the <att>ana</att> attributes are traced to the FreeDict ontology interface (off by default, because it needs a checkout of the shared/ directory. See kha-deu for an example in action.</item>
<item>Commented out the 'figures' module, until it is ever? needed.</item>
<item>Removed <gi>tagUsage</gi> from the att.typed class added earlier in v. 0.8, because I decided to forcefully abuse the elements and attributes involved (mostly <gi>namespace</gi>, <att>n</att> and <att>rend</att>).</item>
<item>TODO: extend this system for <gi>subcat</gi> elements.</item>
</list>
</item>
<item><label>Version 0.8, <date when="2010-11-06">6 November 2010</date>, by <name>Piotr Bański</name></label>:
<list type="bulleted">
<item>Added Schematron constraints on <gi>tagUsage</gi> (so this may be the beginning of the end of DTDs for Freedict, and consequently the xinclude extension will be able to go);</item>
<item>added <gi>tagUsage</gi> to the att.typed class (need to distinguish between tags used in the <gi>gramGroup</gi> describing the source language forms from those describing the target language (inside <gi>cit</gi>);</item>
<item>added <gi>gramGrp</gi> to the att.typed class (in order to be able to talk about 'discharged' grammatical properties, in elements that trigger agreement on other elements (think noun classes));</item>
<item>Took out module "iso-fs" - I think it was here while I still thought of ontology interfaces being plugged more directly into dictionaries, not via tagUsage (or maybe I'm forgetting something now...).</item>
</list>
</item>
<item><label>Version 0.7, <date when="2010-04-25">25 April 2010</date>, by <name>Piotr Bański</name></label>: Added the xinclude extension from the approoriate Roma template, changed it to be able to occur as a child of front (I can't validate xinclusions with xmllint if a DTD is used, so this is for the sake of DTDs only)</item>
<item><label>Version 0.6, <date when="2010-04-24">24 April 2010</date>, by <name>Piotr Bański</name></label>: Added the "iso-fs" and "analysis" modules, the latter for the sake of @ana only...</item>
<item><label>Version 0.5, <date when="2010-04-16">16 April 2010</date>, edited by <name>Piotr Bański</name></label>
<list type="bulleted">
<item>Changed the responsibility type from the Roma-generated <gi>author</gi> to <gi>respStmt</gi> and called myself a maintainer.</item>
<item>Made the changelog dates machine-readable.</item>
<item>Added the linking module (merged changes by <name>Stuart Yeates</name>). This is to enable the <att>corresp</att> attributes.</item>
</list>
</item>
<item><label>Version 0.4, <date when="2009-12-31">31 December 2009</date> by <name>Piotr Bański</name></label>
<list type="bulleted">
<item>Commited to the Freedict CVS (still in version 0.3).</item>
<item>Properly re-titled and described.</item>
<item>Added the "figures" module, for tables in the front matter.</item>
</list>
</item>
<item><label>Version 0.3, <date when="2008-12-30">30 December 2008</date> by <name>Piotr Bański</name></label>
<list type="bulleted">
<item>Removed <gi>dictScrap</gi> and <gi>entryFree</gi> and the mysterious header elements that cause Sanity Checker warnings.</item>
<item>Removed numbered divs (with a view towards tailoring this ODD for all FreeDict dictionaries).</item>
</list>
</item>
</list>
<schemaSpec ident="freedict-P5" docLang="en" prefix="tei_">
<moduleRef key="core"/>
<elementSpec module="core" ident="teiCorpus" mode="delete"/>
<moduleRef key="tei"/>
<moduleRef key="header"/>
<elementSpec module="header" ident="handNote" mode="delete"/>
<elementSpec module="header" ident="typeNote" mode="delete"/>
<elementSpec module="header" ident="availability" mode="change">
<content>
<!-- Make sure that at least one <p> contains one or more <ref target="">...</ref>. This should be the licence name and URL. -->
<rng:group>
<rng:zeroOrMore>
<rng:ref name="tei_model.pLike"/>
</rng:zeroOrMore>
<rng:element name="p">
<rng:text/>
<rng:oneOrMore>
<rng:element name="ref">
<rng:attribute name="target"/>
<rng:text/>
</rng:element>
<rng:text/>
</rng:oneOrMore>
</rng:element>
<rng:zeroOrMore>
<rng:ref name="tei_model.pLike"/>
</rng:zeroOrMore>
</rng:group>
</content>
</elementSpec>
<elementSpec module="header" ident="edition" mode="change">
<content>
<rng:data type="token">
<rng:param name="pattern">[0-9]+\.[0-9]+(\.[0-9]+(\+[0-9A-Za-z][0-9A-Za-z\-]*(\.[0-9A-Za-z][0-9A-Za-z\-]*)*)?|-fd[0-9]+)?</rng:param>
</rng:data>
</content>
</elementSpec>
<elementSpec module="header" ident="tagUsage" mode="change">
<constraintSpec ident="tagUsage_stuff" scheme="isoschematron">
<desc>Make sure that the content of gramGrp (of various sorts) corresponds to whatever is defined in tagUsage *if* it is defined there.</desc>
<constraint>
<sch:pattern id="gramGrp-tagUsage_conformance">
<sch:rule context="/tei:TEI/tei:text/tei:body//tei:*[local-name() eq 'entry' or local-name() eq 'sense']/tei:gramGrp/tei:*">
<sch:let name="loc_name" value="local-name()"/>
<sch:assert test="not(/tei:TEI/tei:teiHeader/tei:encodingDesc/tei:tagsDecl/tei:namespace[@name eq 'https://www.tei-c.org/ns/1.0']/tei:tagUsage[@gi eq $loc_name]/tei:list/tei:item) or (. = /tei:TEI/tei:teiHeader/tei:encodingDesc/tei:tagsDecl/tei:namespace[@name eq 'http://www.tei-c.org/ns/1.0']/tei:tagUsage[@gi eq $loc_name]/tei:list/tei:item)">The values of gramGrp/<sch:name/> must belong to the set identified in tagUsage for this element.</sch:assert>
</sch:rule>
<sch:rule context="/tei:TEI/tei:text/tei:body//tei:cit[@type eq 'trans']/tei:gramGrp/tei:*">
<!-- big question: is the context here stated properly? is it not too narrow now? -->
<sch:let name="loc_name" value="local-name()"/>
<sch:assert test="not(/tei:TEI/tei:teiHeader/tei:encodingDesc/tei:tagsDecl/tei:namespace[@name eq 'http://www.tei-c.org/ns/1.0'][@n eq 'equiv']/tei:tagUsage[@gi eq $loc_name]/tei:list/tei:item) or (. = /tei:TEI/tei:teiHeader/tei:encodingDesc/tei:tagsDecl/tei:namespace[@name eq 'http://www.tei-c.org/ns/1.0'][@n eq 'equiv']/tei:tagUsage[@gi eq $loc_name]/tei:list/tei:item)">The values of cit[@type='trans']/gramGrp/<sch:name/> must belong to the set identified in tagUsage for this element, in the 'equiv' section.</sch:assert>
</sch:rule>
<sch:rule context="/tei:TEI/tei:text/tei:body//tei:*[local-name() eq 'entry' or local-name() eq 'sense']/tei:gramGrp/tei:gramGrp[@type='agr']/tei:*">
<sch:let name="loc_name" value="local-name()"/>
<sch:assert test="not(/tei:TEI/tei:teiHeader/tei:encodingDesc/tei:tagsDecl/tei:namespace[@name eq 'http://www.tei-c.org/ns/1.0'][@n eq 'agr']/tei:tagUsage[@gi eq $loc_name]/tei:list/tei:item) or (. = /tei:TEI/tei:teiHeader/tei:encodingDesc/tei:tagsDecl/tei:namespace[@name eq 'http://www.tei-c.org/ns/1.0'][@n eq 'agr']/tei:tagUsage[@gi eq $loc_name]/tei:list/tei:item)">The values of gramGrp[@type='agr']/<sch:name/> must belong to the set identified in tagUsage for this element, in the 'agr' section.</sch:assert>
</sch:rule>
</sch:pattern>
</constraint>
</constraintSpec>
<constraintSpec ident="tagUsage-item-external" scheme="isoschematron">
<desc>if this is an anchored description, for each item check if it identifies a resource in the FreeDict ontology interface</desc>
<constraint>
<sch:pattern id="tagUsage_item_check">
<sch:rule context="tei:list/tei:item">
<sch:let name="targ_res" value="document(@ana)"/>
<sch:assert test="if(ancestor::tei:tagsDecl[@rend eq 'anchored'] or ancestor::tei:namespace[@rend eq 'anchored'] or ancestor::tei:tagUsage[@rend eq 'anchored']) then (exists($targ_res) and string-length($targ_res)) else true()">The @ana attributes should identify a resource fragment in the FreeDict ontology interface.</sch:assert>
</sch:rule>
</sch:pattern>
</constraint>
</constraintSpec>
</elementSpec>
<moduleRef key="textstructure"/>
<elementSpec module="textstructure" ident="div1" mode="delete"/>
<elementSpec module="textstructure" ident="div2" mode="delete"/>
<elementSpec module="textstructure" ident="div3" mode="delete"/>
<elementSpec module="textstructure" ident="div4" mode="delete"/>
<elementSpec module="textstructure" ident="div5" mode="delete"/>
<elementSpec module="textstructure" ident="div6" mode="delete"/>
<elementSpec module="textstructure" ident="div7" mode="delete"/>
<moduleRef key="dictionaries"/>
<elementSpec module="dictionaries" ident="dictScrap" mode="delete"/>
<elementSpec module="dictionaries" ident="entryFree" mode="delete"/>
<elementSpec ident="gramGrp" module="dictionaries" mode="change">
<classes mode="replace">
<memberOf key="model.entryPart"/>
<memberOf key="model.entryPart.top"/>
<memberOf key="model.gramPart"/>
<memberOf key="att.lexicographic"/>
<memberOf key="att.typed" mode="add"/>
</classes>
</elementSpec>
<moduleRef key="figures" include="cell row table"/>
<moduleRef key="analysis"/>
<elementSpec module="analysis" ident="c" mode="delete"/>
<elementSpec module="analysis" ident="cl" mode="delete"/>
<elementSpec module="analysis" ident="interp" mode="delete"/>
<elementSpec module="analysis" ident="interpGrp" mode="delete"/>
<elementSpec module="analysis" ident="m" mode="delete"/>
<elementSpec module="analysis" ident="pc" mode="delete"/>
<elementSpec module="analysis" ident="phr" mode="delete"/>
<elementSpec module="analysis" ident="s" mode="delete"/>
<elementSpec module="analysis" ident="span" mode="delete"/>
<elementSpec module="analysis" ident="spanGrp" mode="delete"/>
<elementSpec module="analysis" ident="w" mode="delete"/>
<moduleRef key="linking"/>
<elementSpec module="linking" ident="ab" mode="delete"/>
<elementSpec module="linking" ident="alt" mode="delete"/>
<elementSpec module="linking" ident="altGrp" mode="delete"/>
<elementSpec module="linking" ident="anchor" mode="delete"/>
<elementSpec module="linking" ident="join" mode="delete"/>
<elementSpec module="linking" ident="joinGrp" mode="delete"/>
<elementSpec module="linking" ident="link" mode="delete"/>
<elementSpec module="linking" ident="linkGrp" mode="delete"/>
<elementSpec module="linking" ident="seg" mode="delete"/>
<elementSpec module="linking" ident="timeline" mode="delete"/>
<elementSpec module="linking" ident="when" mode="delete"/>
<classSpec ident="att.global.linking" mode="change" type="atts" module="linking">
<attList>
<attDef ident="synch" mode="delete"/>
<attDef ident="sameAs" mode="delete"/>
<attDef ident="copyOf" mode="delete"/>
<attDef ident="next" mode="delete"/>
<attDef ident="prev" mode="delete"/>
<attDef ident="exclude" mode="delete"/>
<attDef ident="select" mode="delete"/>
</attList>
</classSpec>
<elementSpec ident="include" ns="http://www.w3.org/2001/XInclude" mode="add">
<desc>The W3C XInclude element</desc>
<classes>
<!--<memberOf key="model.common"/>-->
<memberOf key="model.pLike.front"/>
<memberOf key="model.headerPart"/>
</classes>
<content>
<rng:optional>
<rng:ref name="fallback"/>
</rng:optional>
</content>
<attList>
<attDef ident="href">
<desc>pointer to the resource being included</desc>
<datatype>
<rng:ref name="data.pointer"/>
</datatype>
</attDef>
<attDef ident="parse" usage="opt">
<defaultVal>xml</defaultVal>
<valList type="closed">
<valItem ident="xml"/>
<valItem ident="text"/>
</valList>
</attDef>
<attDef ident="xpointer" usage="opt">
<datatype>
<rng:text/>
</datatype>
</attDef>
<attDef ident="encoding" usage="opt">
<datatype>
<rng:text/>
</datatype>
</attDef>
<attDef ident="accept" usage="opt">
<datatype>
<rng:text/>
</datatype>
</attDef>
<attDef ident="accept-charset" usage="opt">
<datatype>
<rng:text/>
</datatype>
</attDef>
<attDef ident="accept-language" usage="opt">
<datatype>
<rng:text/>
</datatype>
</attDef>
</attList>
</elementSpec>
</schemaSpec>
</body>
</text>
</TEI>