Skip to content

Commit 6f993f0

Browse files
committed
First stab at describing @direction in the syntax document.
Note that examples won't build properly until it's fully supported in the Ruby implementation. For #11.
1 parent cfd83e9 commit 6f993f0

File tree

3 files changed

+253
-11
lines changed

3 files changed

+253
-11
lines changed

common/extract-examples.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,18 @@ def table_to_dataset(table)
119119
# We might think something was an IRI, but determine that it's not
120120
object = RDF::Literal(object.to_s, language: cell.to_sym)
121121
end
122+
when 'Direction'
123+
case cell
124+
when '-', /^\s*$/
125+
else
126+
value = object.to_s
127+
language = object.language
128+
object = RDF::Node.new
129+
repo << RDF::Statement.new(object, RDF.value, RDF::Literal(value))
130+
repo << RDF::Statement.new(object, RDF.to_uri + "language", RDF::Literal(language.to_s)) if language
131+
repo << RDF::Statement.new(object, RDF.to_uri + "direction", RDF::Literal(cell.to_s))
132+
# We might think something was an IRI, but determine that it's not
133+
end
122134
end
123135
end
124136
repo << RDF::Statement.new(subject, predicate, object, graph_name: gname)

common/terms.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,10 @@
174174
whose value MUST be a <a>string</a> representing a [[BCP47]] language code or <code>null</code>.</dd>
175175
<dt><dfn data-cite="JSON-LD11#dfn-default-object">default object</dfn></dt><dd>
176176
A <a>default object</a> is a <a>map</a> that has a <code>@default</code> key.</dd>
177+
<dt><dfn data-cite="JSON-LD11#dfn-text-direction">default text direction</dfn></dt><dd>
178+
The <a>default text direction</a> is the direction used when a string does not have a direction associated with it directly.
179+
It can be set in the <a>context</a> using the <code>@direction</code> key
180+
whose value MUST be one of the strings `"ltr"`, `"rtl"`, or <code>null</code>.</dd>
177181
<dt><dfn data-cite="JSON-LD11#dfn-embedded-context">embedded context</dfn></dt><dd>
178182
An embedded <a>context</a> is a context which appears
179183
as the <code>@context</code> <a>entry</a> of one of the following:

index.html

Lines changed: 237 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,11 @@ <h2>Syntax Tokens and Keywords</h2>
522522
developers to express specific identifiers in a compact manner. The
523523
<code>@context</code> keyword is described in detail in
524524
<a class="sectionRef" href="#the-context"></a>.</dd>
525+
<dt class="changed"><code>@direction</code></dt>
526+
<dd class="changed">Used to set the <dfn>text direction</dfn> of a <a>JSON-LD value</a>,
527+
which are not <a>typed values</a> (e.g. <a>strings</a>, or <a>language-tagged strings</a>).
528+
This keyword is described in
529+
<a class="sectionRef" href="#string-internationalization"></a>.</dd>
525530
<dt><code>@id</code></dt>
526531
<dd>Used to uniquely identify <a>node objects</a> that are being described in the document
527532
with <a>IRIs</a> or
@@ -4460,7 +4465,7 @@ <h3>Using the Document Base for the Default Vocabulary</h3>
44604465

44614466
<p>When transformed into RDF, the JSON literal will have a lexical form based on
44624467
a specific serialization of the JSON,
4463-
as described in <a data-cite="JSON-LD11-API#round-tripping">Compaction algorithm</a> of [[JSON-LD11-API]]
4468+
as described in <a data-cite="JSON-LD11-API#compaction-algorithm">Compaction algorithm</a> of [[JSON-LD11-API]]
44644469
and <a href="#the-rdf-json-datatype" class="sectionRef">the JSON datatype</a>.</p>
44654470

44664471
<p>The following example shows an example of a <a>JSON Literal</a> contained as the
@@ -4939,7 +4944,6 @@ <h3>Using the Document Base for the Default Vocabulary</h3>
49394944
</section>
49404945

49414946
<section class="informative"><h2>String Internationalization</h2>
4942-
49434947
<p>At times, it is important to annotate a <a>string</a>
49444948
with its language. In JSON-LD this is possible in a variety of ways.
49454949
First, it is possible to define a <a>default language</a> for a JSON-LD document
@@ -5004,8 +5008,9 @@ <h3>Using the Document Base for the Default Vocabulary</h3>
50045008
</aside>
50055009

50065010
<p>The example above would associate the <code>ja</code> language
5007-
code with the two <a>strings</a> <em>花澄</em> and <em>科学者</em>.
5008-
<a data-cite="BCP47#section-2">Languages codes</a> are defined in [[BCP47]]. The <a>default language</a> applies to all
5011+
code with the two <a>strings</a> <em>花澄</em> and <em>科学者</em>
5012+
<a data-cite="BCP47#section-2">Languages codes</a> are defined in [[BCP47]].
5013+
The <a>default language</a> applies to all
50095014
<a>string</a> values that are not <a href="#type-coercion">type coerced</a>.</p>
50105015

50115016
<p>To clear the <a>default language</a> for a subtree, <code>@language</code> can
@@ -5151,6 +5156,204 @@ <h3>Using the Document Base for the Default Vocabulary</h3>
51515156

51525157
<p>See <a href="#language-maps" class="sectionRef"></a> for a description
51535158
of using <a>language maps</a> to set the language of mapped values.</p>
5159+
5160+
<section class="changed informative"><h3>Text Direction</h3>
5161+
<p>It is also possible to annotate a <a>string</a>, or <a>language-tagged string</a>,
5162+
with its <a>text direction</a>.
5163+
As with language, it is possible to define a <a>default text direction</a> for a JSON-LD document
5164+
by setting the `@direction` key in the <a>context</a>:</p>
5165+
5166+
<aside class="example ds-selector-tabs changed"
5167+
title="Setting the default text direction of a JSON-LD document">
5168+
<div class="selectors">
5169+
<button class="selected" data-selects="compacted">Compacted (Input)</button>
5170+
<button data-selects="expanded">Expanded (Result)</button>
5171+
<button data-selects="statements">Statements</button>
5172+
<button data-selects="turtle">Turtle (drops direction)</button>
5173+
<button data-selects="turtle-dt">Turtle (with datatype)</button>
5174+
<button data-selects="turtle-bn">Turtle (with bnode structure)</button>
5175+
<a class="playground" target="_blank"></a>
5176+
</div>
5177+
<pre class="compacted input selected nohighlight" data-transform="updateExample">
5178+
<!--
5179+
{
5180+
"@context": {
5181+
"title": "http://example.org/title",
5182+
"publisher": "http://example.org/publisher",
5183+
####...####
5184+
****"@language": "ar",
5185+
"@direction": "rtl"****
5186+
},
5187+
****"title": "HTML و CSS: تصميم و إنشاء مواقع الويب"****,
5188+
"publisher": "مكتبة"****
5189+
}
5190+
-->
5191+
</pre>
5192+
<pre class="expanded result nohighlight"
5193+
data-transform="updateExample"
5194+
data-result-for="Setting the default text direction of a JSON-LD document-compacted">
5195+
<!--
5196+
[{
5197+
"http://example.org/title": [{"@value": ****"HTML و CSS: تصميم و إنشاء مواقع الويب"****, "@language": "ar", ****"@direction": "rtl"****}],
5198+
"http://example.org/publisher": [{"@value": ****"مكتبة"****, "@language": "ar", ****"@direction": "rtl"****}]
5199+
}]
5200+
-->
5201+
</pre>
5202+
<table class="statements"
5203+
data-result-for="Setting the default text direction of a JSON-LD document-expanded"
5204+
data-to-rdf>
5205+
<thead><tr><th>Subject</th><th>Property</th><th>Value</th><th>Language</th><th>Direction</th></tr></thead>
5206+
<tbody>
5207+
<tr><td>_:b0</td><td>http://example.org/title</td><td>HTML و CSS: تصميم و إنشاء مواقع الويب</td><td>ar</td><td>rtl</td></tr>
5208+
<tr><td>_:b0</td><td>http://example.org/publisher</td><td>مكتبة</td><td>ar</td><td>rtl</td></tr>
5209+
</tbody>
5210+
</table>
5211+
<pre class="turtle nohighlight"
5212+
data-content-type="text/turtle"
5213+
data-result-for="Setting the default text direction of a JSON-LD document-expanded"
5214+
data-transform="updateExample"
5215+
data-to-rdf>
5216+
<!--
5217+
@prefix ex: <http://example.org/> .
5218+
5219+
# Note that this version drops the text direction.
5220+
[
5221+
ex:title ****"HTML و CSS: تصميم و إنشاء مواقع الويب"****@ar;
5222+
ex:publisher ****"مكتبة"****@ar
5223+
] .
5224+
-->
5225+
</pre>
5226+
<pre class="turtle-dt nohighlight"
5227+
data-content-type="text/turtle"
5228+
data-result-for="Setting the default text direction of a JSON-LD document-expanded"
5229+
data-transform="updateExample"
5230+
data-to-rdf>
5231+
<!--
5232+
@prefix ex: <http://example.org/> .
5233+
@prefix i18n: <https://www.w3.org/i18n#> .
5234+
5235+
# Note that this version preserves the text direction using a datatype.
5236+
[
5237+
ex:title ****"HTML و CSS: تصميم و إنشاء مواقع الويب"^^i18n:ar_rtl****;
5238+
ex:publisher ****"مكتبة"^^i18n:ar_rtl****
5239+
] .
5240+
-->
5241+
</pre>
5242+
<pre class="turtle-bn nohighlight"
5243+
data-content-type="text/turtle"
5244+
data-result-for="Setting the default text direction of a JSON-LD document-expanded"
5245+
data-transform="updateExample"
5246+
data-to-rdf>
5247+
<!--
5248+
@prefix ex: <http://example.org/> .
5249+
5250+
# Note that this version preserves the text direction using a bnode structure.
5251+
[
5252+
ex:title ****[
5253+
rdf:value "HTML و CSS: تصميم و إنشاء مواقع الويب",
5254+
rdf:language "ar",
5255+
rdf:direction "rtl"
5256+
]****;
5257+
ex:publisher ****[
5258+
rdf:value "مكتبة",
5259+
rdf:language "ar",
5260+
rdf:direction "rtl"
5261+
]****
5262+
] .
5263+
-->
5264+
</pre>
5265+
</aside>
5266+
5267+
<p>The example above would associate the <code>ar</code> language
5268+
and "rtl" text direction
5269+
code with the two <a>strings</a> <em>HTML و CSS: تصميم و إنشاء مواقع الويب</em> and <em>مكتبة</em>.
5270+
The <a>default text direction</a> applies to all
5271+
<a>string</a> values that are not <a href="#type-coercion">type coerced</a>.</p>
5272+
5273+
<p>To clear the <a>default text direction</a> for a subtree, <code>@direction</code> can
5274+
be set to <code>null</code> in an intervening context, such as a <a>scoped context</a> as follows:</p>
5275+
5276+
<pre class="example nohighlight" data-transform="updateExample"
5277+
title="Clearing default language">
5278+
<!--
5279+
{
5280+
"@context": {
5281+
####...####
5282+
****"@version": 1.1,****
5283+
"@vocab": "http://example.com/",
5284+
"@language": "ar",
5285+
"@direction": "rtl",
5286+
"details": {
5287+
****"@context": {
5288+
"@direction": null
5289+
}****
5290+
}
5291+
},
5292+
"title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
5293+
"details": {"genre": "Technical Publication"}
5294+
}
5295+
-->
5296+
</pre>
5297+
5298+
<p>Second, it is possible to associate a text direction with a specific <a>term</a>
5299+
using an <a>expanded term definition</a>:</p>
5300+
5301+
<pre class="example nohighlight" data-transform="updateExample"
5302+
title="Expanded term definition with language">
5303+
<!--
5304+
{
5305+
"@context": {
5306+
####...####
5307+
"ex": "http://example.com/vocab/",
5308+
"@language": "ar",
5309+
"@direction": "rtl",
5310+
"publisher": { "@id": "ex:name", ****"@direction": null**** },
5311+
"title": { "@id": "ex:title" },
5312+
"title_en": { "@id": "ex:title", ****"@language": "en", "@direction": "ltr"**** }
5313+
},
5314+
****"publisher": "مكتبة",
5315+
"title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
5316+
"title_en": "HTML and CSS: Design and Build Websites"****####,
5317+
...####
5318+
}
5319+
-->
5320+
</pre>
5321+
5322+
<p>The example above would associate <em>مكتبة</em> with the specified default
5323+
language code <code>ar</code> and no <a>text direction</a>,
5324+
<em>HTML and CSS: Design and Build Websites</em> with the language code
5325+
<code>en</code> and <a>text direction</a> `ltr`,
5326+
and <em>HTML و CSS: تصميم و إنشاء مواقع الويب</em> with the language code <code>ar</code>
5327+
and <a>text direction</a> `rtl`.</p>
5328+
5329+
<p class="note">Text direction associations are only applied to plain
5330+
<a>strings</a> and <a>language-tagged strings</a>.
5331+
<a>Typed values</a> or values that are subject to <a href="#type-coercion">type coercion</a>
5332+
are not given a text direction.</p>
5333+
5334+
<p>Third, it is possible to override the <a>default text direction</a> by using a
5335+
<a>value object</a>:</p>
5336+
5337+
<pre class="example nohighlight" data-transform="updateExample"
5338+
title="Overriding default language using an expanded value">
5339+
<!--
5340+
{
5341+
"@context": {
5342+
####...####
5343+
"@language": "ar",
5344+
"@direction": "rtl"
5345+
},
5346+
"title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
5347+
"author": ****{
5348+
"@value": "Jon Duckett",
5349+
"@language": "en"
5350+
}****
5351+
}
5352+
-->
5353+
</pre>
5354+
5355+
<p>See [[[string-meta]]] [[string-meta]] for a deeper discussion of <a>text direction</a>.</p>
5356+
</section>
51545357
</section>
51555358

51565359
</section>
@@ -11233,8 +11436,8 @@ <h1>Data Model</h1>
1123311436
<p>JSON-LD is a serialization format for Linked Data based on JSON.
1123411437
It is therefore important to distinguish between the syntax, which is
1123511438
defined by JSON in [[RFC8259]], and the <dfn>data model</dfn> which is
11236-
an extension of the <a data-cite="RDF11-CONCEPTS#data-model">RDF data model</a> [[RDF11-CONCEPTS]]. The precise
11237-
details of how JSON-LD relates to the RDF data model are given in
11439+
an extension of the <a data-cite="RDF11-CONCEPTS#data-model">RDF data model</a> [[RDF11-CONCEPTS]].
11440+
The precise details of how JSON-LD relates to the RDF data model are given in
1123811441
<a class="sectionRef" href="#relationship-to-rdf"></a>.</p>
1123911442

1124011443
<p>To ease understanding for developers unfamiliar with the RDF model, the
@@ -11315,6 +11518,9 @@ <h1>Data Model</h1>
1131511518
The language tag MUST be well-formed according to section
1131611519
<a data-cite="BCP47#section-2.2.9">2.2.9 Classes of Conformance</a>
1131711520
of [[BCP47]].</li>
11521+
<li class="changed">Either <a>strings</a>, or <a>language-tagged strings</a> may include
11522+
a <a>text direction</a>, which represents an extension to the underlying
11523+
<a data-cite="RDF11-CONCEPTS#data-model">RDF data model</a>.</li>
1131811524
<li>A <a>list</a> is a sequence of zero or more <a>IRIs</a>,
1131911525
<a>blank nodes</a>, and <a>JSON-LD values</a>.
1132011526
<a>Lists</a> are interpreted as
@@ -11739,13 +11945,17 @@ <h2>Graph Objects</h2>
1173911945
<h2>Value Objects</h2>
1174011946

1174111947
<p>A <a>value object</a> is used to explicitly associate a type or a
11742-
language with a value to create a <a>typed value</a> or a <a>language-tagged
11743-
string</a>.</p>
11948+
language with a value to create a <a>typed value</a> or a <a>language-tagged string</a>
11949+
<span class="changed">and possibly associate a <a>text direction</a></span>.</p>
1174411950

1174511951
<p>A <a>value object</a> MUST be a <a>map</a> containing the
1174611952
<code>@value</code> key. It MAY also contain an <code>@type</code>,
11747-
an <code>@language</code>, an <code>@index</code>, or an <code>@context</code> key but MUST NOT contain
11748-
both an <code>@type</code> and an <code>@language</code> key at the same time.
11953+
an <code>@language</code>,
11954+
<span class="changed">an `@direction`,</span>
11955+
an <code>@index</code>, or an <code>@context</code> key but MUST NOT contain
11956+
both an <code>@type</code> and either <code>@language</code>
11957+
<span class="changed">or `@direction`</span>
11958+
keys at the same time.
1174911959
A <a>value object</a> MUST NOT contain any other keys that expand to an
1175011960
<a>absolute IRI</a> or <a>keyword</a>.</p>
1175111961

@@ -11766,6 +11976,9 @@ <h2>Value Objects</h2>
1176611976
<p>The value associated with the <code>@language</code> key MUST have the
1176711977
<a data-cite="BCP47#section-2.1.1">lexical form</a> described in [[BCP47]], or be <a>null</a>.</p>
1176811978

11979+
<p>The value associated with the <code>@direction</code> key MUST be
11980+
one of `ltr` or `rtl`, or be <a>null</a>.</p>
11981+
1176911982
<p>The value associated with the <code>@index</code> key MUST be a
1177011983
<a>string</a>.</p>
1177111984

@@ -11781,7 +11994,12 @@ <h2>Value Patterns</h2>
1178111994
extends a <a>value object</a> to allow
1178211995
<a>entries</a> used specifically for <a>framing</a>.</p>
1178311996
<ul>
11784-
<li>The values of <code>@value</code>, <code>@language</code> and <code>@type</code> MAY additionally be
11997+
<li>The values of
11998+
<code>@value</code>,
11999+
<code>@language</code>,
12000+
<code class="changed">@direction</code> and
12001+
<code>@type</code>
12002+
MAY additionally be
1178512003
an empty <a>map</a> (<a data-cite="JSON-LD11-FRAMING#dfn-wildcard">wildcard</a>),
1178612004
an <a>array</a> containing only an empty <a>map</a>,
1178712005
an empty <a>array</a> (<a data-cite="JSON-LD11-FRAMING#dfn-match-none">match none</a>)
@@ -12376,6 +12594,14 @@ <h2>Relationship to RDF</h2>
1237612594
and <code>false</code>. The JSON-LD 1.1 Processing Algorithms and API specification [[JSON-LD11-API]]
1237712595
defines the <a data-cite="JSON-LD11-API#data-round-tripping">conversion rules</a>
1237812596
between JSON's native data types and RDF's counterparts to allow round-tripping.</li>
12597+
<li class="changed">As an extension to the <a data-cite="RDF11-CONCEPTS#data-model">RDF data model</a>,
12598+
<em>typed literals</em>, where the datatype is `xsd:string`, or <a>language-tagged strings</a>
12599+
MAY include a <a>text direction</a>.
12600+
As there is not yet any standardized mechanism for representing the text direction
12601+
of <a>RDF literals</a>, the JSON-LD to RDF transformation can loose this direction.
12602+
The <a data-cite="JSON-LD11-API#deserialize-json-ld-to-rdf-algorithm">Deserialize JSON-LD to RDF Algorithm</a>
12603+
also provides a means of representing <a>text direction</a>
12604+
using non-standardized mechanisms which will preserve round-tripping through RDF.</li>
1237912605
</ul>
1238012606

1238112607
<p class="note">The use of <a>blank node identifiers</a> to label properties is obsolete,

0 commit comments

Comments
 (0)