Skip to content

Commit 6bef82f

Browse files
committed
Documentation updates
1 parent 623213b commit 6bef82f

10 files changed

Lines changed: 72 additions & 32 deletions

File tree

docs/about.ttl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
<h2 id="architecture">Architecture</h2>
5050
<p>Architecturally LinkedDataHub is a read-write RDF Graph Store combined with a rich Linked Data/SPARQL client. LinkedDataHub does not persist RDF data itself but rather serves it from, and stores it in,
5151
a backing triplestore, which by default is the <a href="https://jena.apache.org/documentation/fuseki2/" target="_blank">Apache Jena Fuseki</a>.</p>
52-
<p>Every document in LinkedDataHub's dataspace is also a named graph in the Graph Store and has both RDF and HTML representations. The client is implemented using XSLT 3.0, a standard, declarative data transformation language. It can connect to any Linked Data resource or SPARQL 1.1 endpoint.</p>
52+
<p>Every document in LinkedDataHub's dataspace is also a named graph in the Graph Store and has both RDF and HTML representations. The client is implemented using XSLT 3.0, a standard, declarative data transformation language. The same stylesheets run in two environments: on the server (Saxon-HE) to produce the initial HTML response, and in the browser (Saxon-JS 3 with Interactive XSLT) to render the layout and drive all subsequent navigation without full page reloads. It can connect to any Linked Data resource or SPARQL 1.1 endpoint.</p>
5353
<p>Since version 3.x LinkedDataHub does not use the <a href="https://atomgraph.github.io/Linked-Data-Templates/" target="_blank">Linked Data Templates</a> anymore. However they can still be used to publish Linked Data from SPARQL endpoints
5454
using <a href="https://github.com/AtomGraph/Processor" target="_blank">Processor</a>.</p>
5555
<p>You can find the changelog <a href="https://github.com/AtomGraph/LinkedDataHub/blob/master/CHANGELOG.md" target="_blank">here</a>.</p>

docs/get-started/get-an-account.ttl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<ul class="nav nav-tabs">
2020
<li class="active"><a>Get WebID</a></li>
2121
<li><a>Login with Google</a></li>
22+
<li><a>Login with ORCID</a></li>
2223
</ul>
2324
<div class="tab-content">
2425
<div class="tab-pane active">
@@ -93,7 +94,14 @@
9394
<p>Click the <span class="btn btn-primary">Login with Google</span> button in the navbar to authenticate with your Google account.</p>
9495
<p>If the email address of your Google account matches the dataspace owner's email address that was specified during <a href="../setup/">setup</a>, you will be authenticated as the owner with <a href="../../reference/administration/acl/">full control</a> access rights.</p>
9596
<div class="alert alert-info">
96-
<p>Login with Google is only enabled if LinkedDataHub was <a href="../../reference/configuration/#social-login">configured with social login</a>.</p>
97+
<p>Login with Google is only enabled if LinkedDataHub was <a href="../../reference/configuration/#secrets">configured with social login</a>.</p>
98+
</div>
99+
</div>
100+
<div class="tab-pane">
101+
<p>Click the <span class="btn btn-primary">Login with ORCID</span> button in the navbar to authenticate with your <a href="https://orcid.org" target="_blank">ORCID</a> account using OpenID Connect.</p>
102+
<p>If the email address of your ORCID account matches the dataspace owner's email address that was specified during <a href="../setup/">setup</a>, you will be authenticated as the owner with <a href="../../reference/administration/acl/">full control</a> access rights.</p>
103+
<div class="alert alert-info">
104+
<p>Login with ORCID is only enabled if LinkedDataHub was <a href="../../reference/configuration/#secrets">configured with social login</a>.</p>
97105
</div>
98106
</div>
99107
</div>

docs/reference/configuration.ttl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@
7171
<dd><a href="../../get-started/get-an-account/">Login with Google</a> authentication is enabled when this value is provided</dd>
7272
<dt><samp>google_client_secret</samp></dt>
7373
<dd><a href="https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid">OAuth client secret</a></dd>
74+
<dt><samp>orcid_client_id</samp></dt>
75+
<dd><a href="https://info.orcid.org/documentation/integration-guide/registering-a-public-api-client/">ORCID OpenID Connect client ID</a></dd>
76+
<dd><a href="../../get-started/get-an-account/">Login with ORCID</a> authentication is enabled when this value is provided</dd>
77+
<dt><samp>orcid_client_secret</samp></dt>
78+
<dd><a href="https://info.orcid.org/documentation/integration-guide/registering-a-public-api-client/">ORCID OpenID Connect client secret</a></dd>
7479
<dt><samp>credentials</samp></dt>
7580
<dd>RDF dataset file (<samp>./secrets/credentials.trig</samp>) containing service authentication credentials (optional)</dd>
7681
<dd>Supports HTTP Basic authentication (<code>a:authUser</code>, <code>a:authPwd</code>) and Bearer token authentication (<code>a:authToken</code>)</dd>

docs/reference/dataspace.ttl

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
<h2 id="dataspaces">Dataspaces</h2>
1616
<p>The LinkedDataHub URI address space is split into <dfn>dataspaces</dfn>. Every dataspace consists of a pair of LinkedDataHub applications:
1717
<a href="#end-user-apps">end-user</a> and <a href="#admin-apps">administration</a>.</p>
18-
<p>The end-user app will be available on the given base URI; the admin app will be available
19-
at that base URI with <code>admin/</code> appended. The <a href="../administration/acl/#agents">agent</a> that installed the admin dataset will be the application <dfn>owner</dfn>.</p>
18+
<p>The end-user app will be available on the given base URI; the admin app will be available on the corresponding
19+
<code>admin.</code> subdomain (e.g. the admin app of <samp>https://example.com/</samp> is served at <samp>https://admin.example.com/</samp>). The <a href="../administration/acl/#agents">agent</a> that installed the admin dataset will be the application <dfn>owner</dfn>.</p>
2020
<p>The <dfn>secretary</dfn> is a special agent which represents the software application itself. It is distinct from the owner agent and is used to delegate the owner's access.</p>
2121
<div>
2222
<h3 id="configuring-dataspaces">Configuring dataspaces</h3>
@@ -66,9 +66,13 @@
6666
<div>
6767
<h3 id="admin-apps">Administration</h3>
6868
<p>Every administration application is related to one <a href="#end-user-apps">end-user application</a>. It cannot exist standalone.</p>
69-
<p>The base URI(s) of an administration application is the base URI(s) of its end-user application with <code>admin/</code> appended
70-
to it. Note that any URIs in the end-user application that are equal or relative to the admin application base URI <em>will not
71-
be accessible</em>.</p>
69+
<p>The base URI of an administration application is the base URI of its end-user application with the <code>admin.</code> subdomain
70+
prefixed to the host (e.g. <samp>https://example.com/</samp> &#8594; <samp>https://admin.example.com/</samp>). Because the admin application lives on
71+
its own subdomain (origin), it no longer occupies a path within the end-user application.</p>
72+
<div class="alert alert-info">
73+
<p>Since LinkedDataHub 5.1.0 the administration application is served on the <code>admin.</code> subdomain rather than under an
74+
<code>admin/</code> path. The subdomain must resolve in DNS and be covered by the server's TLS certificate.</p>
75+
</div>
7276
<p>Administration application provides means to control the <a href="../administration/ontologies/">domain model</a> and the
7377
<a href="../administration/acl/">access control</a> of its end-user application. Only dataspace owners have access to its
7478
administration application.</p>

docs/reference/http-api.ttl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@ Content-Type: text/turtle</code></pre>
238238
All HTTP methods are supported.</p>
239239
<p>If the URL dereferences successfully as RDF, LinkedDataHub forwards its response body (re-serializing it to enable content negotiation).
240240
During a write request, the request body is forwarded to the provided URL.</p>
241+
<p>If the URL returns an HTML document, LinkedDataHub extracts every embedded <a href="https://json-ld.org/" target="_blank">JSON-LD</a> script
242+
(<code>&lt;script type="application/ld+json"&gt;</code>) and parses it as RDF using JSON-LD 1.1, so pages annotated with <a href="https://schema.org/" target="_blank">schema.org</a> markup
243+
can be browsed as Linked Data. The schema.org JSON-LD context is bundled with LinkedDataHub and served locally, so no external network request is made to resolve it.</p>
241244
<p>The proxy only accepts external (non-relative to the current application's base URI) URLs; local URLs have to be dereferenced directly.</p>
242245
</div>
243246
<div>

docs/reference/stylesheets.ttl

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@
4747
<p>One XSLT stylesheet can be specified per application. In order to reuse LinkedDataHub's built-in templates, it should import the <a href="https://github.com/AtomGraph/LinkedDataHub/blob/master/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/layout.xsl" target="_blank">system stylesheet <samp>layout.xsl</samp></a> and only override the necessary templates. That is however not a requirement, the stylesheet could also use its own independent transformation logic.</p>
4848
<p>If there is no stylesheet specified for the application, the system stylesheet is used. It defines the overall layout and imports resource-level and container-specific stylesheets, as well as per-vocabulary stylesheets.</p>
4949
<p>Note that LinkedDataHub itself imports stylesheets from <a href="https://github.com/AtomGraph/Web-Client" target="_blank">Web-Client</a>, which uses the same template modes but produces a much simpler layout.</p>
50-
<p>There is also a special <a href="https://github.com/AtomGraph/LinkedDataHub/blob/master/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/client.xsl" target="_blank">client-side stylesheet</a> which is not used to render a full layout, but only manipulate DOM elements in the browser in response to user or system events. It is processed using <a href="http://www.saxonica.com/saxon-js/index.xml" target="_blank">Saxon-JS</a> which provides IXSL (<a href="https://www.saxonica.com/saxon-js/documentation/index.html#!ixsl-extension" target="_blank">client-side extensions for XSLT</a>). It imports and reuses some of the same sub-stylesheets as the server-side system stylesheet does, but avoids loading per-vocabulary stylesheets in order to improve page load time. Templates of the client-side stylesheet can also be overridden.</p>
50+
<p>The same XSLT 3.0 stylesheets run in two environments. On the server they are executed by Saxon-HE to produce the initial HTML response. In the browser they are executed by <a href="https://www.saxonica.com/saxon-js/index.xml" target="_blank">Saxon-JS 3</a>, which provides IXSL (<a href="https://www.saxonica.com/saxonjs/documentation3/index.html#!ixsl-extension" target="_blank">Interactive XSLT extensions</a>) for reading and manipulating the browser DOM.</p>
51+
<p>There is a dedicated <a href="https://github.com/AtomGraph/LinkedDataHub/blob/master/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/client.xsl" target="_blank">client-side stylesheet <samp>client.xsl</samp></a> that drives the browser. After the server-rendered page loads, its <code>main</code> template renders the layout client-side — the left sidebar, navigation, document and tab panes, content blocks, forms and modal dialogs are injected into the DOM using IXSL (e.g. <code>ixsl:append-content</code>). It also handles all subsequent navigation, so following links and switching documents re-renders in place without a full page reload. It imports and reuses the same document-, resource- and property-level templates as the server-side system stylesheet, but avoids loading per-vocabulary stylesheets in order to improve page load time. Templates of the client-side stylesheet can also be overridden.</p>
5152
</div>
5253
<div>
5354
<h3 id="namespaces">Namespaces</h3>
@@ -137,11 +138,6 @@
137138
</tr>
138139
</thead>
139140
<tbody>
140-
<tr>
141-
<td><code>$ldt:base</code></td>
142-
<td><code>xs:anyURI</code></td>
143-
<td>Base URI of the current application</td>
144-
</tr>
145141
<tr>
146142
<td><code>$lapp:Application</code></td>
147143
<td><code>document-node()?</code></td>
@@ -160,7 +156,7 @@
160156
<tr>
161157
<td><code>$ac:endpoint</code></td>
162158
<td><code>xs:anyURI</code></td>
163-
<td>SPARQL query endpoint URI (defaults to <code>resolve-uri('sparql', $ldt:base)</code>)</td>
159+
<td>SPARQL query endpoint URI (defaults to <code>resolve-uri('sparql', ldt:base())</code>)</td>
164160
</tr>
165161
<tr>
166162
<td><code>$sd:endpoint</code></td>
@@ -182,11 +178,6 @@
182178
<td><code>xs:anyURI*</code></td>
183179
<td>Current layout mode (derived: <code>ldh:ContentMode</code> if the document has content blocks, otherwise <code>ac:ReadMode</code>)</td>
184180
</tr>
185-
<tr>
186-
<td><code>$lapp:origin</code></td>
187-
<td><code>xs:anyURI</code></td>
188-
<td>Origin URI of the current application</td>
189-
</tr>
190181
</tbody>
191182
</table>
192183
</div>
@@ -223,6 +214,16 @@
223214
<td><code>xs:string?</code></td>
224215
<td>Extracts the fragment identifier (the part after <code>#</code>)</td>
225216
</tr>
217+
<tr>
218+
<td><code>lapp:origin()</code></td>
219+
<td><code>xs:anyURI</code></td>
220+
<td>Returns the origin (scheme, host and port) of the current application, e.g. <code>https://localhost:4443/</code>. Used to build absolute URIs for static resources and same-site requests</td>
221+
</tr>
222+
<tr>
223+
<td><code>ldt:base()</code></td>
224+
<td><code>xs:anyURI</code></td>
225+
<td>Returns the base URI of the current application. Replaces the former <code>$ldt:base</code> parameter</td>
226+
</tr>
226227
<tr>
227228
<td><code>ldh:request-uri()</code></td>
228229
<td><code>xs:anyURI</code></td>
@@ -238,6 +239,11 @@
238239
<td><code>xs:anyURI</code></td>
239240
<td>Resolves a URI to a local href, proxying external URIs through the LinkedDataHub proxy. Overloads accept <code>$query-params as map(xs:string, xs:string*)</code> and <code>$fragment as xs:string?</code></td>
240241
</tr>
242+
<tr>
243+
<td><code>ldh:parse-href($href as xs:anyURI)</code></td>
244+
<td><code>map(xs:string, item()?)</code></td>
245+
<td>Inverse of <code>ldh:href()</code> — parses a local href back into its target URI, query parameters and fragment. Shared by the client-side navigation handlers</td>
246+
</tr>
241247
<tr>
242248
<td><code>ldh:query-params($mode as xs:anyURI*)</code></td>
243249
<td><code>map(xs:string, xs:string*)</code></td>
@@ -386,7 +392,7 @@
386392
each LinkedDataHub instance. As a result, retrieving their descriptions by dereferencing their URIs using <code>document()</code> does not incur an HTTP request and is much faster. The URI-to-file mapping
387393
is defined as Jena's <a href="https://jena.apache.org/documentation/io/rdf-input.html#configuring-a-locationmapper" target="_blank">location mapping</a> and can be found in
388394
<a href="https://github.com/AtomGraph/LinkedDataHub/blob/master/src/main/resources/location-mapping.n3" target="_blank"><samp>location-mapping.n3</samp></a> and <a href="https://github.com/AtomGraph/LinkedDataHub/blob/master/src/main/resources/prefix-mapping.n3" target="_blank"><samp>prefix-mapping.n3</samp></a>.</p>
389-
<p>Client-side stylesheets use <a href="https://www.saxonica.com/saxon-js/documentation/index.html#!ixsl-extension/instructions/schedule-action" target="_blank"><code>&lt;ixsl:schedule-action&gt;</code></a> (deprecated) and <a href="https://www.saxonica.com/saxonjs/documentation3/index.html#!ixsl-extension/instructions/promise" target="_blank"><code>&lt;ixsl:promise&gt;</code></a> to load XML documents asynchronously.</p>
395+
<p>Client-side stylesheets use <a href="https://www.saxonica.com/saxonjs/documentation3/index.html#!ixsl-extension/instructions/schedule-action" target="_blank"><code>&lt;ixsl:schedule-action&gt;</code></a> (deprecated) and <a href="https://www.saxonica.com/saxonjs/documentation3/index.html#!ixsl-extension/instructions/promise" target="_blank"><code>&lt;ixsl:promise&gt;</code></a> to load XML documents asynchronously. The metadata required to render forms — constructors, SHACL shapes, and property and object descriptions — is loaded client-side through chains of <code>&lt;ixsl:promise&gt;</code>, so the browser fetches it on demand rather than the server fetching everything up front.</p>
390396
</div>
391397
</div>
392398
<div>

docs/reference/user-interface.ttl

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,19 @@
102102
<dt>Chart</dt>
103103
<dd>Renders the metadata of the <a href="../data-model/resources/">resources</a> in the current document as a chart with (multiple chart types are supported, such as table, scatter chart, timeline etc.)</dd>
104104
<dt>Graph</dt>
105-
<dd>Renders <a href="../data-model/resources/">resources</a> in the current document graphically as nodes in a network using
106-
force-directed layout.</dd>
105+
<dd>Renders <a href="../data-model/resources/">resources</a> in the current document graphically as nodes in an interactive 3D network using a
106+
force-directed layout. Clicking a node shows its details, double-clicking loads the resource, and right-clicking a URI node loads its backlinks (resources pointing at it).
107+
The canvas can be toggled to fullscreen (press <kbd>Esc</kbd> to exit), and the graph state is preserved across search and filter re-renders.</dd>
107108
</dl>
108109
</div>
110+
<div>
111+
<h2 id="document-tabs">Document tabs</h2>
112+
<p>LinkedDataHub navigates within a single page. When you follow a link to an external document (for example a resource fetched through the
113+
<a href="../http-api/#linked-data-proxy">Linked Data proxy</a>), it opens in its own tab so that several documents can be kept open side by side.
114+
A sticky tab bar appears at the top of the page once the first external tab is opened.</p>
115+
<p>Each tab keeps its own content pane, and modal dialogs (such as creation and edit forms) are scoped to the active tab pane. Switching between tabs is cached, so
116+
returning to a previously opened tab does not re-fetch it. Closing a tab removes its pane and falls back to the base document's tab.</p>
117+
</div>
109118
<div>
110119
<h2 id="creation-bar">Creation bar</h2>
111120
<p>The creation bar serves different functions depending on the current mode:</p>

0 commit comments

Comments
 (0)