xrfragment/doc/RFC_XR_Fragments.md

612 lines
33 KiB
Markdown
Raw Normal View History

2023-09-01 14:20:02 +02:00
%%%
Title = "XR Fragments"
area = "Internet"
workgroup = "Internet Engineering Task Force"
[seriesInfo]
name = "XR-Fragments"
value = "draft-XRFRAGMENTS-leonvankammen-00"
stream = "IETF"
status = "informational"
date = 2023-04-12T00:00:00Z
[[author]]
initials="L.R."
surname="van Kammen"
fullname="L.R. van Kammen"
%%%
<!-- for annotated version see: https://raw.githubusercontent.com/ietf-tools/rfcxml-templates-and-schemas/main/draft-rfcxml-general-template-annotated-00.xml -->
<!--{
<style type="text/css">
body{
font-family: monospace;
2023-09-04 21:20:59 +02:00
max-width: 1000px;
2023-09-01 14:20:02 +02:00
font-size: 15px;
padding: 0% 20%;
line-height: 30px;
color:#555;
background:#F0F0F3
}
h1 { margin-top:40px; }
pre{ line-height:18px; }
2023-09-02 21:44:57 +02:00
a,a:visited,a:active{ color: #70f; }
code{
border: 1px solid #AAA;
border-radius: 3px;
padding: 0px 5px 2px 5px;
}
2023-09-04 21:20:59 +02:00
pre{
line-height: 18px;
overflow: auto;
padding: 12px;
}
pre + code {
background:#DDD;
}
2023-09-02 21:44:57 +02:00
pre>code{
border:none;
border-radius:0px;
padding:0;
}
blockquote{
padding-left: 30px;
margin: 0;
border-left: 5px solid #CCC;
}
2023-09-04 21:20:59 +02:00
th {
border-bottom: 1px solid #000;
text-align: left;
padding-right:45px;
padding-left:7px;
background: #DDD;
}
td {
border-bottom: 1px solid #CCC;
font-size:13px;
}
2023-09-01 14:20:02 +02:00
</style>
<br>
<h1>XR Fragments</h1>
<br>
<pre>
stream: IETF
area: Internet
status: informational
author: Leon van Kammen
date: 2023-04-12T00:00:00Z
workgroup: Internet Engineering Task Force
value: draft-XRFRAGMENTS-leonvankammen-00
</pre>
}-->
.# Abstract
2023-09-04 21:20:59 +02:00
This draft offers a specification for 4D URLs & navigation, to link 3D scenes and text together with- or without a network-connection.<br>
The specification promotes spatial addressibility, sharing, navigation, query-ing and tagging interactive (text)objects across for (XR) Browsers.<br>
2023-09-06 15:43:29 +02:00
XR Fragments allows us to enrich existing dataformats, by recursive use of existing proven technologies like [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment) and BibTags notation.<br>
2023-09-05 19:14:10 +02:00
> Almost every idea in this document is demonstrated at [https://xrfragment.org](https://xrfragment.org)
2023-09-04 21:20:59 +02:00
{mainmatter}
2023-09-01 14:20:02 +02:00
# Introduction
2023-09-04 21:20:59 +02:00
How can we add more features to existing text & 3D scenes, without introducing new dataformats?<br>
Historically, there's many attempts to create the ultimate markuplanguage or 3D fileformat.<br>
2023-09-07 15:53:32 +02:00
Their lowest common denominator is: (co)authoring using plain text.<br>
2023-09-04 21:51:01 +02:00
XR Fragments allows us to enrich/connect existing dataformats, by recursive use of existing technologies:<br>
2023-09-01 14:20:02 +02:00
2023-09-04 21:20:59 +02:00
1. addressibility and navigation of 3D scenes/objects: [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment) + src/href spatial metadata
2023-09-08 16:57:49 +02:00
1. hasslefree tagging across text and spatial objects using [bibs](https://github.com/coderofsalvation/tagbibs) / [BibTags](https://en.wikipedia.org/wiki/BibTeX) appendices (see [visual-meta](https://visual-meta.info) e.g.)
2023-09-01 14:20:02 +02:00
2023-09-04 21:20:59 +02:00
> NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible
2023-09-01 14:20:02 +02:00
2023-09-04 21:20:59 +02:00
# Core principle
2023-09-05 19:14:10 +02:00
XR Fragments strives to serve (nontechnical/fuzzy) humans first, and machine(implementations) later, by ensuring hasslefree text-vs-thought feedback loops.<br>
2023-09-04 21:20:59 +02:00
This also means that the repair-ability of machine-matters should be human friendly too (not too complex).<br>
2023-09-04 21:51:01 +02:00
> "When a car breaks down, the ones **without** turbosupercharger are easier to fix"
2023-09-07 15:53:32 +02:00
Let's always focus on average humans: our fuzzy symbolical mind must be served first, before serving a greater [categorized typesafe RDF hive mind](https://en.wikipedia.org/wiki/Borg)).
2023-09-04 21:51:01 +02:00
2023-09-05 19:14:10 +02:00
> Humans first, machines (AI) later.
2023-09-07 15:53:32 +02:00
Thererfore, XR Fragments does not look at XR (or the web) thru the lens of HTML.<br>
XR Fragments itself is HTML-agnostic, though pseudo-XR Fragment browsers **can** be implemented on top of HTML/Javascript.
2023-09-04 21:51:01 +02:00
# Conventions and Definitions
2023-09-07 15:53:32 +02:00
See appendix below in case certain terms are not clear.
2023-09-01 14:20:02 +02:00
2023-09-02 21:44:57 +02:00
# List of URI Fragments
2023-09-04 21:20:59 +02:00
| fragment | type | example | info |
|--------------|----------|-------------------|-------------------------------------------------------------------|
| `#pos` | vector3 | `#pos=0.5,0,0` | positions camera to xyz-coord 0.5,0,0 |
| `#rot` | vector3 | `#rot=0,90,0` | rotates camera to xyz-coord 0.5,0,0 |
| `#t` | vector2 | `#t=500,1000` | sets animation-loop range between frame 500 and 1000 |
| `#......` | string | `#.cubes` `#cube` | object(s) of interest (fragment to object name or class mapping) |
> xyz coordinates are similar to ones found in SVG Media Fragments
2023-09-02 21:44:57 +02:00
# List of metadata for 3D nodes
2023-09-04 21:20:59 +02:00
| key | type | example (JSON) | info |
|--------------|----------|--------------------|--------------------------------------------------------|
| `name` | string | `"name": "cube"` | available in all 3D fileformats & scenes |
| `class` | string | `"class": "cubes"` | available through custom property in 3D fileformats |
| `href` | string | `"href": "b.gltf"` | available through custom property in 3D fileformats |
| `src` | string | `"src": "#q=cube"` | available through custom property in 3D fileformats |
2023-09-07 15:53:32 +02:00
Popular compatible 3D fileformats: `.gltf`, `.obj`, `.fbx`, `.usdz`, `.json` (THREE.js), `.dae` and so on.
2023-09-04 21:20:59 +02:00
> NOTE: XR Fragments are file-agnostic, which means that the metadata exist in programmatic 3D scene(nodes) too.
2023-09-02 21:44:57 +02:00
2023-09-01 14:20:02 +02:00
# Navigating 3D
2023-09-04 21:20:59 +02:00
Here's an ascii representation of a 3D scene-graph which contains 3D objects `◻` and their metadata:
2023-09-01 14:20:02 +02:00
```
2023-09-02 21:44:57 +02:00
+--------------------------------------------------------+
| |
| index.gltf |
| │ |
| ├── ◻ buttonA |
| │ └ href: #pos=1,0,1&t=100,200 |
| │ |
| └── ◻ buttonB |
2023-09-04 21:20:59 +02:00
| └ href: other.fbx | <-- file-agnostic (can be .gltf .obj etc)
2023-09-02 21:44:57 +02:00
| |
+--------------------------------------------------------+
2023-09-01 14:20:02 +02:00
```
2023-09-04 21:20:59 +02:00
An XR Fragment-compatible browser viewing this scene, allows the end-user to interact with the `buttonA` and `buttonB`.<br>
2023-09-01 14:20:02 +02:00
In case of `buttonA` the end-user will be teleported to another location and time in the **current loaded scene**, but `buttonB` will
2023-09-05 19:14:10 +02:00
**replace the current scene** with a new one, like `other.fbx`.
2023-09-01 14:20:02 +02:00
# Embedding 3D content
2023-09-09 11:30:03 +02:00
Here's an ascii representation of a 3D scene-graph with 3D objects `◻` which embeds remote & local 3D objects `◻` with/out using queries:
2023-09-01 14:20:02 +02:00
```
2023-09-02 21:44:57 +02:00
+--------------------------------------------------------+ +-------------------------+
| | | |
| index.gltf | | ocean.com/aquarium.fbx |
| │ | | │ |
| ├── ◻ canvas | | └── ◻ fishbowl |
| │ └ src: painting.png | | ├─ ◻ bass |
| │ | | └─ ◻ tuna |
| ├── ◻ aquariumcube | | |
| │ └ src: ://rescue.com/fish.gltf#q=bass%20tuna | +-------------------------+
| │ |
| ├── ◻ bedroom |
| │ └ src: #q=canvas |
| │ |
| └── ◻ livingroom |
| └ src: #q=canvas |
| |
+--------------------------------------------------------+
2023-09-01 14:20:02 +02:00
```
2023-09-04 21:20:59 +02:00
An XR Fragment-compatible browser viewing this scene, lazy-loads and projects `painting.png` onto the (plane) object called `canvas` (which is copy-instanced in the bed and livingroom).<br>
Also, after lazy-loading `ocean.com/aquarium.gltf`, only the queried objects `bass` and `tuna` will be instanced inside `aquariumcube`.<br>
2023-09-05 19:14:10 +02:00
Resizing will be happen accordingly to its placeholder object `aquariumcube`, see chapter Scaling.<br>
2023-09-01 14:20:02 +02:00
2023-09-07 14:06:50 +02:00
# XR Fragment queries
Include, exclude, hide/shows objects using space-separated strings:
* `#q=cube`
* `#q=cube -ball_inside_cube`
* `#q=* -sky`
* `#q=-.language .english`
* `#q=cube&rot=0,90,0`
* `#q=price:>2 price:<5`
It's simple but powerful syntax which allows <b>css</b>-like class/id-selectors with a searchengine prompt-style feeling:
1. queries are showing/hiding objects **only** when defined as `src` value (prevents sharing of scene-tampered URL's).
1. queries are highlighting objects when defined in the top-Level (browser) URL (bar).
1. search words like `cube` and `foo` in `#q=cube foo` are matched against 3D object names or custom metadata-key(values)
1. search words like `cube` and `foo` in `#q=cube foo` are matched against tags (BibTeX) inside plaintext `src` values like `@cube{redcube, ...` e.g.
1. `#` equals `#q=*`
1. words starting with `.` like `.german` match class-metadata of 3D objects like `"class":"german"`
1. words starting with `.` like `.german` match class-metadata of (BibTeX) tags in XR Text objects like `@german{KarlHeinz, ...` e.g.
> **For example**: `#q=.foo` is a shorthand for `#q=class:foo`, which will select objects with custom property `class`:`foo`. Just a simple `#q=cube` will simply select an object named `cube`.
* see [an example video here](https://coderofsalvation.github.io/xrfragment.media/queries.mp4)
## including/excluding
| operator | info |
|----------|-------------------------------------------------------------------------------------------------------------------------------|
| `*` | select all objects (only useful in `src` custom property) |
| `-` | removes/hides object(s) |
| `:` | indicates an object-embedded custom property key/value |
| `.` | alias for `"class" :".foo"` equals `class:foo` |
| `>` `<` | compare float or int number |
| `/` | reference to root-scene.<br>Useful in case of (preventing) showing/hiding objects in nested scenes (instanced by `src`) (*) |
> \* = `#q=-/cube` hides object `cube` only in the root-scene (not nested `cube` objects)<br> `#q=-cube` hides both object `cube` in the root-scene <b>AND</b> nested `skybox` objects |
[» example implementation](https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/three/xrf/q.js)
[» example 3D asset](https://github.com/coderofsalvation/xrfragment/blob/main/example/assets/query.gltf#L192)
[» discussion](https://github.com/coderofsalvation/xrfragment/issues/3)
## Query Parser
Here's how to write a query parser:
1. create an associative array/object to store query-arguments as objects
1. detect object id's & properties `foo:1` and `foo` (reference regex: `/^.*:[><=!]?/` )
1. detect excluders like `-foo`,`-foo:1`,`-.foo`,`-/foo` (reference regex: `/^-/` )
1. detect root selectors like `/foo` (reference regex: `/^[-]?\//` )
1. detect class selectors like `.foo` (reference regex: `/^[-]?class$/` )
1. detect number values like `foo:1` (reference regex: `/^[0-9\.]+$/` )
1. expand aliases like `.foo` into `class:foo`
1. for every query token split string on `:`
1. create an empty array `rules`
1. then strip key-operator: convert "-foo" into "foo"
1. add operator and value to rule-array
1. therefore we we set `id` to `true` or `false` (false=excluder `-`)
1. and we set `root` to `true` or `false` (true=`/` root selector is present)
1. we convert key '/foo' into 'foo'
1. finally we add the key/value to the store like `store.foo = {id:false,root:true}` e.g.
> An example query-parser (which compiles to many languages) can be [found here](https://github.com/coderofsalvation/xrfragment/blob/main/src/xrfragment/Query.hx)
## XR Fragment URI Grammar
```
reserved = gen-delims / sub-delims
gen-delims = "#" / "&"
sub-delims = "," / "="
```
> Example: `://foo.com/my3d.gltf#pos=1,0,0&prio=-5&t=0,100`
| Demo | Explanation |
|-------------------------------|---------------------------------|
| `pos=1,2,3` | vector/coordinate argument e.g. |
| `pos=1,2,3&rot=0,90,0&q=.foo` | combinators |
2023-09-02 21:44:57 +02:00
2023-09-04 21:20:59 +02:00
# Text in XR (tagging,linking to spatial objects)
2023-09-01 14:20:02 +02:00
2023-09-04 21:20:59 +02:00
We still think and speak in simple text, not in HTML or RDF.<br>
2023-09-04 21:51:01 +02:00
The most advanced human will probably not shout `<h1>FIRE!</h1>` in case of emergency.<br>
Given the new dawn of (non-keyboard) XR interfaces, keeping text as is (not obscuring with markup) is preferred.<br>
2023-09-11 11:43:02 +02:00
Ideally metadata must come **with** text, but not **obfuscate** the text, or **spawning another request** to fetch it.<br>
2023-09-03 15:14:31 +02:00
2023-09-11 11:43:02 +02:00
```
Spectrum of speak/scan/write/listen/keyboard-friendly 'tagging' notations:
(just # and @) (string only) (obuscated text) (type-aware text)
<---- Bibs ---------- BibTeX ---------- XML / HTML --------- JSON / YAML / RDF -------->
```
Hence:
2023-09-04 21:20:59 +02:00
2023-09-11 11:43:02 +02:00
1. XR Fragments promotes the importance of hasslefree plain text and string-based patternmatching
2. XR Fragments allows <b id="tagging-text">hasslefree spatial tagging</b>, by detecting metadata **at the end of content** of text (see default mimetype & Data URI)
3. XR Fragments allows <b id="tagging-objects">hasslefree spatial tagging</b>, by treating 3D object name/class-pairs as BibTeX tags.
2023-09-11 12:07:06 +02:00
4. XR Fragments promotes hasslefree <a href="#textual-tag">textual tagging</a>, <a href="#spatial-tag">spatial tagging</a>, and <a href="#supra-tagging">supra tagging</a>, by mapping 3D/text object (class)names to (tag)text-occurences.
5. XR Fragments supports **requestless metadata** when found in plain text data (of `src` metadata), for adding/describing relationships spatially.
6. **requestless metadata** should be string-only and typeless, and should be easy to edit/add by humans (using text).
7. Therefore, BibTeX and [Bib's](https://github.com/coderofsalvation/hashtagbibs) are first class citizens for XR text (HTML/RDF/JSON is great, but fits better in the application-layer)
2023-09-11 11:43:02 +02:00
8. Opening tags for metadata (`#`, `@`, `{`, or `<`) should always start at the beginning of the line.
2023-09-11 12:07:06 +02:00
2023-09-11 11:43:02 +02:00
This allows recursive connections between text itself, as well as 3D objects and vice versa.<br>
Here's an example by expanding polyglot metadata to **BibTeX** associations:
```
http://y.io/z.fbx | Derived BibTex / 'wires' & tags
----------------------------------------------------------------------------+--------------------------------------
| @house{castle,
+-[src: data:.....]----------------------+ +-[3D mesh]-+ | url = {https://y.io/z.fbx#castle}
| Chapter one | | / \ | | }
| | | / \ | | @baroque{castle,
| John built houses in baroque style. | | / \ | | url = {https://y.io/z.fbx#castle}
| | | |_____| | | }
| #john@baroque | +-----│-----+ | @baroque{john}
| | │ |
| | ├─ name: castle |
| | └─ class: house baroque |
+----------------------------------------+ |
[3D mesh ] |
2023-09-11 12:15:34 +02:00
+-[remotestorage.io / localstorage]------+ | O ├─ name: john |
2023-09-11 11:43:02 +02:00
| #contactjohn@todo@house | | /|\ | |
| ... | | / \ | |
+----------------------------------------+ +--------+ |
```
2023-09-04 21:20:59 +02:00
2023-09-11 12:15:34 +02:00
A (somewhat extreme) example of using polyglot (bib)tags:
2023-09-04 21:20:59 +02:00
```
2023-09-11 11:43:02 +02:00
http://y.io/z.fbx | Derived BibTex / 'wires' & tags
----------------------------------------------------------------------------+--------------------------------------
2023-09-11 12:15:34 +02:00
| @baroque{john}
+-[src: data:.....]----------------------+ +-[3D mesh]-+ | @house{castle,
| Chapter one | | / \ | | url = {https://y.io/z.fbx#castle}
| | | / \ | | }
| John built houses in baroque style. | | / \ | | @baroque{castle,
| | | |_____| | | url = {https://y.io/z.fbx#castle}
| #john@baroque | +-----│-----+ | }
2023-09-11 11:43:02 +02:00
| @house{baroque, info = {classic}, } | │ | @house{baroque,
2023-09-11 12:15:34 +02:00
| { "tag":"baroque", "match":"john"} | ├─ name: castle | info = {classic}
| <tag name="baroque" match="john"/> | └─ class: house baroque | }
2023-09-11 11:43:02 +02:00
+----------------------------------------+ | @house{contactjohn}
2023-09-11 12:15:34 +02:00
[3D mesh ] | @todo{contactjohn}
+-[remotestorage.io / localstorage]------+ | O + name: john |
2023-09-11 11:43:02 +02:00
| #contactjohn@todo@house | | /|\ | |
2023-09-11 12:15:34 +02:00
| ... | | / \ | |
2023-09-11 11:43:02 +02:00
+----------------------------------------+ +--------+ |
2023-09-09 11:30:03 +02:00
```
2023-09-11 11:43:02 +02:00
As seen above, we can extract tags/associations between text & 3D objects, by converting all scene metadata to (in this case) BibTeX, by expanding [hashtagbibs](https://github.com/coderofsalvation/hashtagbibs) and interpreting its polyglot tag-notation.<br>
One huge advantage of polyglot tags is authoring and copy-paste **by humans**, which will be discussed later in this spec.<br>
2023-09-09 11:30:03 +02:00
2023-09-11 11:43:02 +02:00
> [hashtagbibs](https://github.com/coderofsalvation/hashtagbibs) also allows the enduser to annotate text/objects by **speaking/typing/scanning associations**, which the XR Browser saves to remotestorage (or localStorage per toplevel URL). As well as, referencing BibTags per URI later on: `https://y.io/z.fbx#@baroque@todo` e.g.
2023-09-09 11:30:03 +02:00
2023-09-11 11:43:02 +02:00
The Evaluated BiBTeX allows XR Browsers to show/hide relationships in realtime at various levels:
2023-09-05 19:14:10 +02:00
2023-09-11 11:43:02 +02:00
| scope | tag-matching algo |
2023-09-05 19:14:10 +02:00
|---------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
2023-09-11 11:43:02 +02:00
| <b id="textual-tagging">textual</b> | text containing 'baroque' is now automatically tagged with 'house' (incl. plaintext `src` child nodes) |
| <b id="spatial-tagging">spatial</b> | spatial object(s) with name `baroque` or `"class":"house"` are now automatically tagged with 'house' (incl. child nodes) |
| <b id="supra-tagging">supra</b> | text- or spatial-object(s) (non-descendant nodes) elsewhere, (class)named 'baroque' or 'house', are automatically tagged with 'house' (current node to root nodes) |
| <b id="omni-tagging">omni</b> | text- or spatial-object(s) (non-descendant nodes) elsewhere, (class)named 'baroque' or 'house', are automatically tagged with 'house' (root node to all nodes) |
| <b id="infinite-tagging">infinite</b> | text- or spatial-object(s) (non-descendant nodes) elsewhere, (class)named 'baroque' or 'house', are automatically tagged with 'house' (root node to all nodes ) |
2023-09-03 15:14:31 +02:00
2023-09-11 11:43:02 +02:00
This allows the enduser to adjust different levels of associations (see [the core principle](#core-principle)): spatial wires can be rendered, words/objects can be highlighted/scaled etc.<br>
2023-09-04 21:20:59 +02:00
2023-09-11 11:43:02 +02:00
> NOTE: infinite matches both 'baroque' and 'house'-occurences in text, as well as spatial objects with `"class":"house"` or name "baroque". This multiplexing of id/category is deliberate, in order to support [the core principle](#core-principle).
2023-09-04 21:20:59 +02:00
2023-09-11 12:15:34 +02:00
9. The XR Browser needs to adjust tag-scope based on the endusers needs/focus (infinite tagging only makes sense when environment is scaled down significantly)
10. The XR Browser should always allow the human to view/edit the metadata, by clicking 'toggle metadata' on the 'back' (contextmenu e.g.) of any XR text, anywhere anytime.
11. When moving/copying/pasting metadata, always prefer converting to string-only microformats (BibTex/Bibs)
12. respect multi-line metadata because of [the core principle](#core-principle)
13. Default font (unless specified otherwise) is a modern monospace font, for maximized tabular expressiveness (see [the core principle](#core-principle)).
14. anti-pattern: hardcoupling an XR Browser with a mandatory **markup/scripting-language** which departs from onubtrusive plain text (HTML/VRML/Javascript) (see [the core principle](#core-principle))
15. anti-pattern: limiting human introspection, by abandoning plain text as first class citizen.
2023-09-09 11:30:03 +02:00
2023-09-11 11:43:02 +02:00
> The simplicity of appending metadata (and leveling the metadata-playfield between humans and machines) is also demonstrated by [visual-meta](https://visual-meta.info) in greater detail.
2023-09-02 21:44:57 +02:00
## Default Data URI mimetype
2023-09-04 21:20:59 +02:00
The `src`-values work as expected (respecting mime-types), however:
2023-09-02 21:44:57 +02:00
The XR Fragment specification bumps the traditional default browser-mimetype
`text/plain;charset=US-ASCII`
2023-09-08 16:57:49 +02:00
to a hashtagbib(tex)-friendly one:
2023-09-04 21:20:59 +02:00
2023-09-11 12:07:06 +02:00
`text/plain;charset=utf-8;bib=^@`
2023-09-04 21:20:59 +02:00
2023-09-08 16:57:49 +02:00
This indicates that:
* utf-8 is supported by default
2023-09-11 12:07:06 +02:00
* lines beginning with `@` will not be rendered verbatim by default (=Bibs/BibTex)
* bibs occurring in text (`#contactjohn@todo@important` e.g.) should expand to BibTeX
2023-09-11 11:43:02 +02:00
By doing so, the XR Browser (applications-layer) can interpret microformats ([visual-meta](https://visual-meta.info)
to connect text further with its environment ( setup links between textual/spatial objects automatically e.g.).
2023-09-02 21:44:57 +02:00
2023-09-08 16:57:49 +02:00
> for more info on this mimetype see [bibs](https://github.com/coderofsalvation/hashtagbibs)
2023-09-03 15:14:31 +02:00
2023-09-08 16:57:49 +02:00
Advantages:
2023-09-03 15:14:31 +02:00
2023-09-11 11:43:02 +02:00
* auto-expanding of [hashtagbibs](https://github.com/coderofsalvation/hashtagbibs) associations
2023-09-08 16:57:49 +02:00
* out-of-the-box (de)multiplex human text and metadata in one go (see [the core principle](#core-principle))
2023-09-06 15:13:36 +02:00
* no network-overhead for metadata (see [the core principle](#core-principle))
* ensuring high FPS: HTML/RDF historically is too 'requesty'/'parsy' for game studios
2023-09-04 21:20:59 +02:00
* rich send/receive/copy-paste everywhere by default, metadata being retained (see [the core principle](#core-principle))
2023-09-06 15:13:36 +02:00
* netto result: less webservices, therefore less servers, and overall better FPS in XR
2023-09-03 15:14:31 +02:00
2023-09-06 15:13:36 +02:00
> This significantly expands expressiveness and portability of human tagged text, by **postponing machine-concerns to the end of the human text** in contrast to literal interweaving of content and markupsymbols (or extra network requests, webservices e.g.).
2023-09-02 21:44:57 +02:00
2023-09-04 21:20:59 +02:00
For all other purposes, regular mimetypes can be used (but are not required by the spec).<br>
## URL and Data URI
2023-09-02 21:44:57 +02:00
```
+--------------------------------------------------------------+ +------------------------+
| | | author.com/article.txt |
| index.gltf | +------------------------+
| │ | | |
| ├── ◻ article_canvas | | Hello friends. |
| │ └ src: ://author.com/article.txt | | |
2023-09-11 11:43:02 +02:00
| │ | | { |
2023-09-04 21:20:59 +02:00
| └── ◻ note_canvas | | ... |
2023-09-11 11:43:02 +02:00
| └ src:`data:welcome human\n{...` | | } |
2023-09-04 21:20:59 +02:00
| | +------------------------+
2023-09-02 21:44:57 +02:00
| |
+--------------------------------------------------------------+
```
2023-09-09 11:30:03 +02:00
The enduser will only see `welcome human` and `Hello friends` rendered spatially (see mimetype).
The beauty is that text in Data URI automatically promotes rich copy-paste (retaining metadata).
2023-09-04 21:20:59 +02:00
In both cases, the text gets rendered immediately (onto a plane geometry, hence the name '_canvas').
2023-09-02 21:44:57 +02:00
The XR Fragment-compatible browser can let the enduser access visual-meta(data)-fields after interacting with the object (contextmenu e.g.).
2023-09-08 16:57:49 +02:00
> additional tagging using [bibs](https://github.com/coderofsalvation/hashtagbibs): to tag spatial object `note_canvas` with 'todo', the enduser can type or speak `@note_canvas@todo`
2023-09-07 14:06:50 +02:00
2023-09-06 15:13:36 +02:00
## XR Text example parser
2023-09-04 21:20:59 +02:00
2023-09-11 11:43:02 +02:00
Here's an example XR Text (de)multiplexer in javascript, which supports inline bibs & bibtex:
2023-09-03 15:14:31 +02:00
```
2023-09-04 21:20:59 +02:00
xrtext = {
2023-09-08 16:57:49 +02:00
expandBibs: (text) => {
let bibs = { regex: /(#[a-zA-Z0-9_+@\-]+(#)?)/g, tags: {}}
text.replace( bibs.regex , (m,k,v) => {
tok = m.substr(1).split("@")
match = tok.shift()
if( tok.length ) tok.map( (t) => bibs.tags[t] = `@${t}{${match},\n}` )
else if( match.substr(-1) == '#' )
bibs.tags[match] = `@{${match.replace(/#/,'')}}`
else bibs.tags[match] = `@${match}{${match},\n}`
})
return text.replace( bibs.regex, '') + Object.values(bibs.tags).join('\n')
},
2023-09-03 15:14:31 +02:00
2023-09-05 19:14:10 +02:00
decode: (str) => {
2023-09-08 16:57:49 +02:00
// bibtex: ↓@ ↓<tag|tag{phrase,|{ruler}> ↓property ↓end
let pat = [ /@/, /^\S+[,{}]/, /},/, /}/ ]
let tags = [], text='', i=0, prop=''
let lines = xrtext.expandBibs(str).replace(/\r?\n/g,'\n').split(/\n/)
for( let i = 0; i < lines.length && !String(lines[i]).match( /^@/ ); i++ )
text += lines[i]+'\n'
bibtex = lines.join('\n').substr( text.length )
bibtex.split( pat[0] ).map( (t) => {
try{
let v = {}
if( !(t = t.trim()) ) return
if( tag = t.match( pat[1] ) ) tag = tag[0]
if( tag.match( /^{.*}$/ ) ) return tags.push({ruler:tag})
2023-09-11 11:43:02 +02:00
if( tag.match( /}$/ ) ) return tags.push({k: tag.replace(/}$/,''), v: {}})
2023-09-08 16:57:49 +02:00
t = t.substr( tag.length )
t.split( pat[2] )
.map( kv => {
if( !(kv = kv.trim()) || kv == "}" ) return
v[ kv.match(/\s?(\S+)\s?=/)[1] ] = kv.substr( kv.indexOf("{")+1 )
})
tags.push( { k:tag, v } )
}catch(e){ console.error(e) }
})
return {text, tags}
2023-09-04 21:20:59 +02:00
},
2023-09-08 16:57:49 +02:00
2023-09-06 15:13:36 +02:00
encode: (text,tags) => {
let str = text+"\n"
for( let i in tags ){
let item = tags[i]
2023-09-08 16:57:49 +02:00
if( item.ruler ){
2023-09-06 15:13:36 +02:00
str += `@${item.ruler}\n`
continue;
}
str += `@${item.k}\n`
for( let j in item.v ) str += ` ${j} = {${item.v[j]}}\n`
2023-09-05 19:14:10 +02:00
str += `}\n`
}
2023-09-08 16:57:49 +02:00
return str
2023-09-03 15:14:31 +02:00
}
}
2023-09-04 21:20:59 +02:00
```
2023-09-03 15:14:31 +02:00
2023-09-07 14:06:50 +02:00
The above functions (de)multiplexe text/metadata, expands bibs, (de)serialize bibtex (and all fits more or less on one A4 paper)
2023-09-06 15:13:36 +02:00
2023-09-05 19:14:10 +02:00
> above can be used as a startingpoint for LLVM's to translate/steelman to a more formal form/language.
2023-09-06 15:13:36 +02:00
```
str = `
hello world
2023-09-08 16:57:49 +02:00
here are some hashtagbibs followed by bibtex:
#world
#hello@greeting
#another-section#
2023-09-06 15:13:36 +02:00
@{some-section}
@flap{
asdf = {23423}
}`
var {tags,text} = xrtext.decode(str) // demultiplex text & bibtex
tags.find( (t) => t.k == 'flap{' ).v.asdf = 1 // edit tag
tags.push({ k:'bar{', v:{abc:123} }) // add tag
console.log( xrtext.encode(text,tags) ) // multiplex text & bibtex back together
```
2023-09-08 16:57:49 +02:00
This expands to the following (hidden by default) BibTex appendix:
2023-09-05 19:14:10 +02:00
```
2023-09-07 14:06:50 +02:00
hello world
2023-09-08 16:57:49 +02:00
here are some hashtagbibs followed by bibtex:
2023-09-05 19:14:10 +02:00
2023-09-07 14:06:50 +02:00
@{some-section}
@flap{
asdf = {1}
2023-09-05 19:14:10 +02:00
}
2023-09-08 16:57:49 +02:00
@world{world,
}
@greeting{hello,
}
@{another-section}
2023-09-07 14:06:50 +02:00
@bar{
abc = {123}
2023-09-05 19:14:10 +02:00
}
```
2023-09-03 15:14:31 +02:00
2023-09-07 18:48:40 +02:00
> when an XR browser updates the human text, a quick scan for nonmatching tags (`@book{nonmatchingbook` e.g.) should be performed and prompt the enduser for deleting them.
2023-09-02 21:44:57 +02:00
# HYPER copy/paste
The previous example, offers something exciting compared to simple copy/paste of 3D objects or text.
2023-09-07 14:06:50 +02:00
XR Text according to the XR Fragment spec, allows HYPER-copy/paste: time, space and text interlinked.
2023-09-02 21:44:57 +02:00
Therefore, the enduser in an XR Fragment-compatible browser can copy/paste/share data in these ways:
2023-09-05 19:14:10 +02:00
1. time/space: 3D object (current animation-loop)
1. text: TeXt object (including BibTeX/visual-meta if any)
1. interlinked: Collected objects by visual-meta tag
2023-09-02 21:44:57 +02:00
2023-09-01 14:20:02 +02:00
# Security Considerations
2023-09-04 21:20:59 +02:00
Since XR Text contains metadata too, the user should be able to set up tagging-rules, so the copy-paste feature can :
* filter out sensitive data when copy/pasting (XR text with `class:secret` e.g.)
2023-09-01 14:20:02 +02:00
# IANA Considerations
This document has no IANA actions.
# Acknowledgments
2023-09-07 15:53:32 +02:00
* [NLNET](https://nlnet.nl)
* [Future of Text](https://futureoftext.org)
* [visual-meta.info](https://visual-meta.info)
# Appendix: Definitions
2023-09-11 12:08:04 +02:00
|definition | explanation |
|----------------------|--------------------------------------------------------------------------------------------------------------------------------------|
|human | a sentient being who thinks fuzzy, absorbs, and shares thought (by plain text, not markuplanguage) |
|scene | a (local/remote) 3D scene or 3D file (index.gltf e.g.) |
|3D object | an object inside a scene characterized by vertex-, face- and customproperty data. |
|metadata | custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers) |
|XR fragment | URI Fragment with spatial hints like `#pos=0,0,0&t=1,100` e.g. |
|src | (HTML-piggybacked) metadata of a 3D object which instances content |
|href | (HTML-piggybacked) metadata of a 3D object which links to content |
|query | an URI Fragment-operator which queries object(s) from a scene like `#q=cube` |
|visual-meta | [visual-meta](https://visual.meta.info) data appended to text/books/papers which is indirectly visible/editable in XR. |
|requestless metadata | metadata which never spawns new requests (unlike RDF/HTML, which can cause framerate-dropping, hence not used a lot in games) |
|FPS | frames per second in spatial experiences (games,VR,AR e.g.), should be as high as possible |
|introspective | inward sensemaking ("I feel this belongs to that") |
|extrospective | outward sensemaking ("I'm fairly sure John is a person who lives in oklahoma") |
|`◻` | ascii representation of an 3D object/mesh |
|(un)obtrusive | obtrusive: wrapping human text/thought in XML/HTML/JSON obfuscates human text into a salad of machine-symbols and words |
|BibTeX | simple tagging/citing/referencing standard for plaintext |
|BibTag | a BibTeX tag |
|(hashtag)bibs | an easy to speak/type/scan tagging SDL ([see here](https://github.com/coderofsalvation/hashtagbibs) which expands to BibTex/JSON/XML |
2023-09-07 15:53:32 +02:00