aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2020-06-30 10:21:51 +0200
committerJonas Smedegaard <dr@jones.dk>2020-06-30 10:21:51 +0200
commit36582ed97cca3d62bbf7d7d846054a596503dd74 (patch)
treef990d6bb9cc533207597572e31b1aaed01f3eb3f
Initial git draft
-rw-r--r--README.md1140
1 files changed, 1140 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..68aaf05
--- /dev/null
+++ b/README.md
@@ -0,0 +1,1140 @@
+# Semantic Markdown Spec (Alpha Draft)
+
+[TOC]
+
+## Introduction
+
+### What is Semantic Markdown?
+
+Semantic Markdown is a plain-text format for writing documents that embed machine-readable data. The documents are easy to author and both human and machine-readable, so that the structured data contained within these documents is available to tools and applications.
+
+Technically speaking, Semantic Markdown is _"RDFa Lite for Markdown"_ and aims at enhancing the HTML generated from Markdown with [RDFa Lite] attributes.
+
+Design Rationale:
+ - Embed RDFa-like semantic annotation within Markdown
+ - Ability to mix unstructured human-text with machine-readable data in JSON-LD-like lists
+ - Ability to semantically annotate an existing plain Markdown document with semantic annotations
+ - Keep human-readability to a maximum
+
+### About this document
+
+:::warning
+This document is in early draft stage !
+:::
+
+### Providing feedback
+
+Interested in joining the idea or providing feedback?
+
+1. Annotate this document with ideas
+2. Join us on the [Semantic Markdown Matrix discussion channel](https://matrix.to/#/#semantic-markdown:matrix.virtual-assembly.org), e.g. using a client like Riot.im at https://riot.im/app/#/room/#semantic-markdown:matrix.virtual-assembly.org
+3. Modify the document directly after your proposals were discussed
+
+## Semantic Markdown at a glance
+
+Semantic annotations are declared within curly braces `{...}`.
+
+### Annotation types
+
+Semantic Markdown provides 3 types of annotations:
+- annotating text with a type/class: Annotation starting with a `.` indicates a type/class, and generate RDFa `typeof` attribute: `{.foaf:Person}`
+- annotating text with a property: Annotation without leading marker indicates a property, and generate RDFa `property` attribute: `{foaf:name}`
+- annotating text with a subject identifier: Annotation starting with a `=` indicates an IRI of a known entity, and generate RDF `resource` attribute: `{=wdt:Q42}`
+
+### Paragraph example
+
+```markdown
+My name is
+[Manu Sporny]{:name}
+and you can give me a ring via
+[1-800-555-0199]{:telephone}.
+![](http://manu.sporny.org/images/manu.png){:image}
+My favorite animal is the [Liger]{ov:preferredAnimal}.
+{=<#manu> .:Person}
+
+{schema}: @default
+
+{ov}: http://open.vocab.org/terms/
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<p vocab="http://schema.org/" prefix="ov: http://open.vocab.org/terms/" resource="#manu" typeof="Person">
+My name is
+<span property="name">Manu Sporny</span>
+and you can give me a ring via
+<span property="telephone">1-800-555-0199</span>.
+<img property="image" src="http://manu.sporny.org/images/manu.png" />
+My favorite animal is the <span property="ov:preferredAnimal">Liger</span>.
+</p>
+```
+
+Notice how IRI namespace "schema" is implicitly resolved from its listing at [RDFa Core Initial Context]
+
+### Title and list example
+
+```markdown
+{.schema:Event}
+
+## {schema:name}
+## Specification meeting
+
+* Date: 11/10 {schema:startDate}
+* Place: Our office, Street name, Paris {schema:location}
+* Meeting participants: {schema:attendee}
+ * Alice;
+ * Bob;
+ * [Tim](https://www.wikidata.org/wiki/Q80);
+* Description: Some information not annotated
+
+## Launch party
+
+(TODO)
+
+{schema}: @default
+```
+Would produce the following HTML+RDFa:
+
+```html
+<div vocab="http://schema.org/" typeof="Event">
+ <h2 property="name">Specification meeting</h2>
+ <ul>
+ <li>Date: <span property="startDate">11/10</span></li>
+ <li>Place: <span property="location">Our office, Street name, Paris</span></li>
+ <li>Meeting participants:
+ <ul>
+ <li><span property="attendee">Alice</span>;</li>
+ <li><span property="attendee">Bob</span>;</li>
+ <li><a property="attendee" href="https://www.wikidata.org/wiki/Q80">Tim</a>;</li>
+ </ul>
+ </li>
+ <li>Description: Some information not annotated</li>
+ </ul>
+
+ <h2 property="name">Launch party</h2>
+ <p>(TODO)</p>
+</div>
+```
+
+:::danger
+:heavy_exclamation_mark: FIXME: Undecided if final punctuation should be omitted
+:::
+
+:::danger
+:heavy_exclamation_mark: FIXME: There is a problem in the RDFa markup as this generates _a single event with 2 names_ instead of 2 events each with a name (Thomas). Test the markup at http://rdfa.info/play
+:::
+
+## Annotation syntax
+
+Semantic Markdown is declared as sets of hints.
+Each set of hints is declared either directly where applied or indirectly tied to links.
+Hints may use shortened [CURIE][RDFa CURIE] notation, where uncommon vocabularies need to be defined.
+
+### Hint syntax
+
+Semantic Markdown id written as a set of zero or more whitespace delimited hints, wrapped with curly braces `{...}`.
+Each hint consists of a type identifier and an address.
+Type identifier is either `.` or `=` or none.
+Address is either a IRI wrapped with angle brackets `<...>`, or an [RDFa CURIE].
+All CURIEs must use either an [explicitly defined prefix](Prefix-definition-syntax) or a prefix listed in [RDFa Core Initial Context].
+
+### Link definition syntax
+
+:::warning
+:heavy_exclamation_mark: FIXME: write this...
+:::
+
+### Prefix definition syntax
+
+:::warning
+:heavy_exclamation_mark: FIXME: write this...
+:::
+
+## Annotation scopes
+
+Semantic Markdown is applied to content in different ways:
+
+### Span scope
+
+Hints immediately following an explicitly confined span of text apply to the span; i.e. bare spans (square brackets: `[...]`), underline (underscore: `_..._`), emphasis (asterisk: `*...*`), strong emphasis (double asterisk: `**...**`), inline code (backticks: \`...\`), or link (square brackets + parenthesis: `[...](...)`).
+
+```markdown
+My name is [Manu Sporny]{schema:name}.
+My name is **Manu [Sporny]**{schema:name}.
+My name is [Manu Sporny] {schema:name}.
+My name is Manu Sporny{schema:name}.
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<p>My name is <span property="schema:name">Manu Sporny</span><br>
+My name is <strong property="schema:name">Manu [Sporny]</strong><br>
+My name is [Manu Sporny] {schema:name}<br>
+My name is Manu Sporny{schema:name}</p>
+
+```
+
+Notice how third sentence above has no hints *immediately* following the span, and fourth sentence has no *explicit* span.
+
+### Block scope
+
+Hints not immediately following an explicit span, in a block with non-whitespace characters before the hints and none after, applies to the block.
+
+```markdown
+You can give me a ring. {=<#manu>}
+
+You can give me a ring {=<#manu>}.
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<p resource="#manu">You can give me a ring.</p>
+<p>You can give me a ring {=<a href=""#manu">#manu</a>}.</p>
+```
+
+Notice how second paragraph has punctuation *after* the hints.
+
+### Block-derived scope
+
+Hints in a block with non-whitespace characters after the hints and none before, applies to the block and any descendant blocks.
+If the resulting scope does not correspond to already generated html scope, then a div is added. In particular, when the resulting scope is the whole Markdown context then a Markdown parser targeting a full html document (not only a subset of body part as Markdown generally does) may apply the hints to the `<html>` tag.
+
+```markdown
+# People
+## {=<#manu>} Manu Sporny
+My name is Manu Sporny.
+and you can give me a ring.
+## Thomas Francart
+My name is Thomas Francart.
+
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<h1> People</h1>
+<div resource="#manu">
+<h2>Manu Sporny</h2>
+<p>My name is Manu Sporny,
+and you can give me a ring.<p>
+</div>
+<h2>Thomas Francart</h2>
+<p>My name is Thomas Francart.</p>
+```
+
+Notice how second header and succeeding paragraph is wrapped with a div tag, whereas third header is omitted because it is not a *descendant* but a *sibling*.
+
+
+### Nextblocks-same-level-each scope
+
+Hints in a header or list block with no non-whitespace characters before or after the hints, followed by a block of same type and level, applies individually to each following block of same type and level, until any block of a lower level.
+
+```markdown
+# People
+## {.schema:Person}
+## Manu Sporny
+My name is Manu Sporny.
+## Thomas Francart
+My name is Thomas Francart.
+# Animals
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<h1> People</h1>
+<div typeof="schema:Person">
+<h2>Manu Sporny</h2>
+<p>My name is Manu Sporny.<p>
+</div>
+<div typeof="schema:Person">
+<h2>Thomas Francart</h2>
+<p>My name is Thomas Francart.</p>
+</div>
+<h1>Animals</h1>
+```
+
+:::warning
+Insert example with a list
+:::
+
+### Nextblocks-derived-and-nonlevel-siblings scope
+
+Hints in a block with no non-whitespace characters before or after the hints, followed by a different type or level of block, applies to the following block and any descendant blocks; or followed by a non-header non-list block, applies to the following block and any following siblings and any descendant blocks of any of them.
+If the resulting scope does not correspond to already generated html scope, then a div is added. In particular, when the resulting scope is the whole Markdown context then a Markdown parser targeting a full html document (not only a subset of body part as Markdown generally does) may apply the hints to the `<html>` tag.
+
+```markdown
+{.schema:Group}
+# People
+## Manu Sporny
+My name is Manu Sporny.
+## Thomas Francart
+My name is Thomas Francart.
+
+I once read this:
+> {=<#manu>}
+> My name is Manu Sporny.
+>
+> You can give me a ring.
+
+Should I call him?
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<div typeof="schema:Group">
+<h1> People</h1>
+<h2>Manu Sporny</h2>
+<p>My name is Manu Sporny.<p>
+<h2>Thomas Francart</h2>
+<p>My name is Thomas Francart.</p>
+I once read this:
+<blockquote resource="#manu">
+<p>My name is Manu Sporny.</p>
+<p>You can give me a ring.</p>
+</blockquote>
+<p>Should I call him?</p>
+</div>
+```
+
+:::danger
+:heavy_exclamation_mark: FIXME: Uncertain which exact block types are considered descendant of which others.
+:::
+
+### Link definition scope
+
+Hints not immediately following an explicit span, in a link definition block with no non-whitespace characters after the hints, applies to all references to that definition, even if no link is defined.
+Similar to Markdown link definitions, source markup of this kind does not in itself result in any output html markup: It only affects _other_ markup, and if unused it simply is ignored.
+
+```markdown
+My name is
+[Manu Sporny]
+and you can give me a ring via
+[1-800-555-0199].
+
+[Manu Sporny]: {schema:name}
+
+[1-800-555-0199]: tel:+1-800-555-0199
+ "make a phone call to Manu Sporny"
+ {schema:telephone}
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<p>My name is
+<span property="schema:name">Manu Sporny</span>
+and you can give me a ring via
+<a property="telephone" title="make a phone call to Manu Sporny" href="tel:+1-800-555-0199">1-800-555-0199</a>.</p>
+```
+
+## Semantic Markdown and other Markdown extensions
+
+### Attributes extension
+
+See [PHP Markdown extra special attributes](https://michelf.ca/projects/php-markdown/extra/#spe-attr) and [Pandoc's header attributes](https://pandoc.org/MANUAL.html#heading-identifiers):
+
+Semantic Markdown uses similar syntax, but either with different leading character "=" or "keywords" containing a colon.
+
+Extract from PHP Markdown extra documentation:
+
+
+> With Markdown Extra, you can set the id and class attribute on certain elements using an attribute block. For instance, put the desired id prefixed by a hash inside curly brackets after the header at the end of the line, like this:
+>
+> ```markdown
+> Header 1 {#header1}
+> ========
+>
+>## Header 2 ## {#header2}
+>```
+>Then you can create links to different parts of the same document like this:
+>
+> ```markdown
+> [Link back to header 1](#header1)
+> ```
+>To add a class name, which can be used as a hook for a style sheet, use a dot like this:
+>```markdown
+>## The Site ## {.main}
+>```
+>You can also add custom attributes having simple values by specifying the attribute name, followed by an equal sign, followed by the value (which cannot contain spaces at this time):
+>```markdown
+>## Le Site ## {lang=fr}
+>```
+>The id, multiple class names, and other custom attributes can be combined by putting them all into the same special attribute block:
+>```markdown
+>## Le Site ## {.main .shine #the-site lang=fr}
+>```
+>At this time, special attribute blocks can be used with
+> - headers,
+> - fenced code blocks
+> - links, and
+> - images.
+
+
+### spans
+
+See Pandoc [bracketed spans](https://pandoc.org/MANUAL.html#divs-and-spans)
+
+#### span example
+
+```markdown
+Meeting with [Bob]{.foaf:Person}
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<p>Meeting with <span typeof="foaf:Person">Bob</span></p>
+```
+
+### blocks
+
+
+
+#### block example
+
+Annotations declared as a an initial separate block applies to all siblings by introducing a surrounding `<div>` tag.
+
+```markdown
+{.schema:Event}
+
+We are preparing the [2020 Music Festival]{schema:name} !
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<div typeof="schema:Event">
+<p>We are preparing the <span property="schema:name">2020 Music Festival</span> !</p>
+</div>
+```
+
+As per [Block scope](#Block-scope), Annotations declared at the end of a block (modulo whitespace) applies to that one block.
+
+```markdown
+We are preparing the [2020 Music Festival]{schema:name} !
+{.schema:Event}
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<p typeof="schema:Event">We are preparing the <span property="schema:name">2020 Music Festival</span> !</p>
+```
+
+
+### Extend the extensions: use attributes at other places
+
+#### Set attributes on lists
+
+```markdown
+- {foaf:member}
+- member 1
+- member 2
+ - something else
+- member 3
+```
+
+
+#### Set attributes on list items
+
+```markdown
+- item 1 {foaf:member}
+- item 2 {foaf:member}
+- item 3 {foaf:member}
+```
+
+#### Set attributes on inlines
+
+```markdown
+Thomas is _39_{foaf:age}.
+```
+
+### Define a "property attribute"
+
+An attribute without `.`, without `#` and that is not a key-value pair should be recognized as a property name, e.g. `{foaf:name}`.
+
+### Define a "subject attribute"
+
+An attribute beginning with the `=` sign indicates a subject IRI, equivalent to an `resource=xxx` property, e.g. `{=wdt:Q42}` is equivalent to `<sometag resource="wdt:Q42">`
+
+
+
+## Annotate properties (RDFa "property" attribute)
+
+
+### Properties in lists
+
+#### Key/Value pairs
+
+If the list item contains `:` or `=`, the annotation is applied to the string after this character.
+
+```markdown
+- Name: Thomas Francart {foaf:name}
+- Age = 39 {foaf:age}
+- Profession: Semantic Web Consultant; {rdfs:comment}
+- Hobby: Bird watching; train spotting; {rdfs:comment}
+```
+
+Should yield (note how semi-colons are excluded from last annotations):
+
+```html
+<ul>
+ <li>Name: <span property="foaf:name">Thomas Francart</span></li>
+ <li>Age = <span property="foaf:age">39</span></li>
+ <li>Profession: <span property="rdfs:comment">Semantic Web Consultant</span>;</li>
+ <li>Hobby: <span property="rdfs:comment">Bird watching</span>; <span property="rdfs:comment">train spotting</span>;</li>
+</ul>
+```
+
+:::danger
+:heavy_exclamation_mark: FIXME: Undecided if punctuation exceptions for lists should be included
+:::
+
+:::danger
+:heavy_exclamation_mark: FIXME: Undecided if final punctuation should be omitted
+:::
+
+#### Value-only list items
+
+```markdown
+- Thomas Francart {foaf:name}
+- 39 {foaf:age}
+- Semantic Web Consultant {rdfs:comment}
+```
+
+Should yield
+
+```html
+<ul>
+ <li><span property="foaf:name">Thomas Francart</span></li>
+ <li><span property="foaf:age">Thomas Francart</span></li>
+ <li><span property="rdfs:comment">Semantic Web Consultant</span></li>
+</ul>
+```
+
+
+#### Annotate a list with a property
+
+
+Annotating a list with a property annotation should be treated as if all list items are annotated with the same property
+
+```markdown
+{foaf:member}
+- Thomas ;
+- Vincent;
+- Nicolas;
+```
+
+Is equivalent to
+
+```markdown
+- Thomas; {foaf:member}
+- Vincent; {foaf:member}
+- Nicolas; {foaf:member}
+```
+
+And should yield
+
+```html
+<ul>
+ <li><span property="foaf:member">Thomas</span>;</li>
+ <li><span property="foaf:member">Vincent</span>;</li>
+ <li><span property="foaf:member">Nicolas</span>;</li>
+</ul>
+```
+
+:::danger
+:heavy_exclamation_mark: FIXME: Undecided if final punctuation should be omitted
+:::
+
+### Inline properties
+
+#### Properties on inline delimiters
+
+```markdown
+Thomas is [39]{foaf:age}.
+```
+
+Should yield
+
+```html
+<p>Thomas is <span property="foaf:age">39</span></p>
+```
+
+Same with `_`, `*` or `**`.
+
+### Annotate with 2 properties
+
+It should be possible to annotate with 2 properties
+
+```markdown
+- Name: Alice {foaf:name rdfs:label}
+- Age: 23 {foaf:age}
+```
+
+Should yield
+
+```html
+- Name: <span property="foaf:name rdfs:label">Alice</span>
+- Age: <span property="foaf:age">23</span>
+```
+
+
+## Annotate the subject of properties
+
+### Use a class attribute (RDFa "typeof" attribute)
+
+```markdown
+# Le site {.foaf:Document}
+```
+
+Would produce the following HTML+RDFa:
+
+```
+<h1 typeof="foaf:Document">Le site</h1>
+```
+
+As per [Block scope](#Block-scope), above hints applies to an existing block which serves as placeholder for the semantic hints, and there is therefore no need for adding a wrapper `<div>` tag.
+
+
+```markdown
+{.foaf:Document}
+- item 1
+- item 2
+- item 3
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<ul typeof="foaf:Document">
+ <li>item 1</li>
+ <li>item 2</li>
+ <li>item 3</li>
+</ul>
+```
+
+(Note that the `typeof` RDFa attribute used alone generates an anonymous node as the current subject of inner `property` attributes. In other words, further property annotations will refer to an entity of the provided type.)
+
+
+### Use an ID attribute (RDFa "resource" attribute)
+
+Use an annotation starting with "="
+
+```markdown
+# Douglas Adams {=wdt:Q42}
+```
+
+:::danger
+:heavy_exclamation_mark: FIXME: Undecided if leading character `=` should be replaced with e.g. `@`or `#`.
+:::
+
+### Combine ID + class
+
+It should be possible to combine an ID and a type attribute
+
+```markdown
+His name is [Douglas Adams]{.foaf:Person =wdt:Q42}
+
+{wdt}: http://www.wikidata.org/prop/direct/
+```
+
+Should produce the following HTML+RDFa
+
+```html
+<p prefix="wdt: http://www.wikidata.org/prop/direct/">His name is <span typeof="foaf:Person" resource="wdt:Q42">Douglas Adams</span></p>
+```
+
+But beware that if one hint is broken then the whole annotation is passed through as-is, e.g. if using an undefined prefix:
+
+```markdown
+His name is [Douglas Adams]{.foaf:Person =wdt:Q42}
+```
+
+Should produce the following HTML+RDFa
+
+```html
+<p>His name is [Douglas Adams]{.foaf:Person =wdt:Q42}</p>
+```
+
+## Where to find the current subject?
+
+RDFa relies on a mechanism to indicate the [_current subject_ of the annotation](https://www.w3.org/TR/rdfa-core/#setting-the-current-subject). Semantic Markdown aims at having an equivalent mechanism.
+
+Intuitively, the current subject is the resource annotated in the "closest ancestor" of a property annotation.
+
+### Current span subject
+
+Used to indicate that a certain inline portion of a sentence is about an entity.
+
+```markdown
+[Tim Berners Lee]{=wdt:Q80} invented the web.
+
+{wdt}: http://www.wikidata.org/prop/direct/
+```
+
+Should yield
+
+```html
+<p prefix="wdt: http://www.wikidata.org/prop/direct/"><span resource="wdt:Q80">Tim Berners Lee</span> invented the web.</p>
+```
+
+
+### Current paragraph subject
+
+Used to indicate that a whole paragraph is about an entity. The annotation is at the end of the paragraph for readability.
+
+```markdown
+Tim Berners Lee invented the web. {=wdt:Q80}
+
+{wdt}: http://www.wikidata.org/prop/direct/
+```
+
+Should yield
+
+```html
+<p prefix="wdt: http://www.wikidata.org/prop/direct/" resource="wdt:Q80">Tim Berners Lee invented the web.</p>
+```
+
+### Current list subject
+
+Used to indicate that a whole list describes an entity. The annotation should be sought at the end of the line preceding the list.
+
+```markdown
+{=wdt:Q80}
+- Name: Tim Berner's Lee {foaf:name}
+- ISNI: 0000 0000 7866 6209 {wd:P213}
+
+{wdt}: http://www.wikidata.org/prop/direct/
+
+{wd}: http://www.wikidata.org/entity/
+```
+Should yield
+
+```html
+<ul prefix="wdt: http://www.wikidata.org/prop/direct/ wd: http://www.wikidata.org/entity/" resource="wdt:Q80">
+ <li>Name: <span property="foaf:name">Tim Berner's Lee</span></li>
+ <li>ISNI: <span property="wd:P213">0000 0000 7866 6209</span></li>
+</ul>
+```
+
+:::warning
+:heavy_exclamation_mark: FIXME: Undecided if punctuation exceptions for lists should be included
+:::
+
+### Paragraph preceding a list
+
+If an annotation is between a paragraph and a list, then it applies to the list when standalone with double newlines same as writing a separate paragraph:
+
+```markdown
+The web was invented by this geek:
+
+{=wdt:Q80}
+- Name: Tim Berner's Lee {foaf:name}
+- ISNI: 0000 0000 7866 6209 {wd:P213}
+
+{wdt}: http://www.wikidata.org/prop/direct/
+
+{wd}: http://www.wikidata.org/entity/
+```
+
+Should yield
+
+```html
+<div prefix="wdt: http://www.wikidata.org/prop/direct/ wd: http://www.wikidata.org/entity/">
+<p>The web was invented by this geek:</p>
+<ul resource="wdt:Q80">
+ <li>Name: <span property="foaf:name">Tim Berner's Lee</span></li>
+ <li>ISNI: <span property="wd:P213">0000 0000 7866 6209</span></li>
+</ul>
+</div>
+```
+
+```markdown
+{.schema:Event}
+
+* Date: 11/10 {schema:startDate}
+* Meeting participants: {schema:attendee}
+ * Alice;
+ * Bob;
+```
+
+:::warning
+:heavy_exclamation_mark: FIXME: unclear if example is relevant
+:::
+
+### Indented lists
+
+Indented lists are key because they could make plain Markdown lists look like JSON-LD trees;
+
+Plain Markdown list:
+
+```markdown
+Here is our meeting description:
+
+- Date: 10/11/2019
+- Location: somewhere
+- Attendees:
+ - Alice
+ - Engineer
+ - Works for: Foo
+ - Hobbies:
+ - Football
+ - Video games
+ - Bob
+ - Sales Manager
+ - Works for: Bar
+ - Hobbies:
+ - Cooking
+ - Cycling
+```
+
+Annotated version:
+
+```markdown
+Here is our meeting description: {.schema:Event}
+
+- Date: 10/11/2019 {schema:startDate}
+- Location: somewhere {schema:place}
+- Attendees: {schema:attendee}
+ - Alice {schema:name}
+ - Engineer {schema:jobTitle}
+ - Works for: Foo {schema:affiliation}
+ - Hobbies: {schema:knowsAbout}
+ - Football
+ - Video games
+ - Bob {schema:name}
+ - Sales Manager {schema:jobTitle}
+ - Works for: Bar {schema:affiliation}
+ - Hobbies: {schema:knowsAbout}
+ - Cooking
+ - Cycling
+```
+
+:::danger
+:heavy_exclamation_mark: FIXME: Either replace this section with JSON-LD like style or drop this section
+:::
+
+### Current blockquote subject
+
+Used to indicate that a blockquote describes an entity
+
+:::danger
+:heavy_exclamation_mark: FIXME: Either document how or drop this section
+:::
+
+### Current header subject
+
+Used to indicate that a certain section of a document describes an entity.
+
+The following annotated MD:
+
+```markdown
+## {=ex:AliceIRI} Description of Alice
+
+She is [23]{foaf:age} and lives in [Berlin]{foaf:basedNear}.
+
+{ex}: http://example.org/
+```
+
+Should produce the following HTML+RDFa:
+
+```html
+<div prefix="ex: http://example.org/">
+<div resource="ex:AliceIRI">
+<h2>Description of Alice</h2>
+
+<p>She is <span property="foaf:age">23</span> and lives in <span property="foaf:basedNear">Berlin</span></p>
+</div>
+```
+
+Similarly
+
+```markdown
+## {.schema:Event} Specification meeting
+
+- Date: 10/11/2019 {schema:startDate}
+- Location: somewhere {schema:location}
+```
+
+Should produce the following HTML+RDFa:
+
+```html
+<div typeof="schema:Event">
+ <h2>Specification meeting</h2>
+ <ul>
+ <li>Date: <span property="schema:startDate">10/11/2019</span></li>
+ <li>Location: <span property="schema:location">somewhere</span></li>
+ </ul>
+</div>
+```
+
+
+### Current div subject
+
+```markdown
+{=wdt:Q80}
+
+Tim Berners Lee invented the web.
+
+He now works on Solid.
+
+{wdt}: http://www.wikidata.org/prop/direct/
+```
+
+Should yield
+
+```html
+<div prefix="wdt: http://www.wikidata.org/prop/direct/" about="wdt:Q80">
+ <p>Tim Berners Lee invented the web.</p>
+ <p>He now works on Solid.</p>
+</div>
+```
+
+As per [Nextblocks-derived-and-nonlevel-siblings scope](#Nextblocks-derived-and-nonlevel-siblings-scope), hints applies until next descendant block or sibling paragraph. To limit without introducing new content, use an empty hint:
+
+```markdown
+{=wdt:Q80}
+
+Tim Berners Lee invented the web.
+
+He now works on Solid.
+
+{}
+
+A paragraphe after the div ended.
+
+{wdt}: http://www.wikidata.org/prop/direct/
+```
+
+Should yield
+
+```html
+<div prefix="wdt: http://www.wikidata.org/prop/direct/" about="wdt:Q80">
+ <p>Tim Berners Lee invented the web.</p>
+ <p>He now works on Solid.</p>
+</div>
+<p>A paragraphe after the div ended.</p>
+```
+
+## Declaring prefixes
+
+Declare [prefix definitions](#Prefix-definition-syntax), anywhere in the document, preferably at the end to ease readability.
+
+```markdown
+{.schema:Event}
+* Date: 10/11/2019 {schema:startDate}
+* Location{.ex:good_places}: somewhere {schema:location}
+
+{schema}: http://schema.org/
+
+{rdfs}: http://www.w3.org/2000/01/rdf-schema#
+
+{ex}: http://example.org/
+```
+
+Should yield
+
+```html
+<div prefix="ex: http://example.org/">
+ <ul typeof="Event">
+ <li>Date: <span property="startDate">10/11/2019</span></li>
+ <li><span property="ex:good_places">Location</span>: <span property="location">somewhere</span></li>
+ </ul>
+</div>
+```
+
+Notice how prefixes "schema" and "rdfs" are omitted, because they are implicitly defined by [RDFa Core Initial Context], and rdfs also because it is unused.
+
+:::danger
+:heavy_exclamation_mark: FIXME: Undecided if prefix declared in the source should always be converted in the output or omitted if unneeded as per Core Initial Context or when unused.
+:::
+
+### Prefix and link definitions have similar but separate syntax
+
+Prefixes mimic the syntax for links, but using curly brackets instead of angle brackets:
+
+```markdown
+### Specifications Meeting {.schema:Event}
+
+* Date: 10/11/2019 {.schema:startDate}
+
+Bla bla bla as is documented in the [schema] ontology.
+
+—
+[schema]: http://schema.org/
+
+{schema}: http://schema.org/
+
+{rdfs}: http://www.w3.org/2000/01/rdf-schema#
+```
+
+### Specifying the default prefix
+
+Declaring a prefix as the default generates a `vocab` attribute instead of a prefix on the outermost block of the text, adding a div if no such block exists already. All uses of that default prefix is then generated without a prefix.
+
+```markdown
+My name is [Alice]{ex:name}.
+
+{ex}: http://example.org/ @default
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<p vocab="http://example.org/">My name is <span property="name">Alice</span></p>
+```
+
+:::danger
+FIXME : The default namespace should make it possible to annotate the document without using a prefix at all. Instead of giving the default both a prefix name _and_ a special annotation, I suggest using `@default` as the prefix itself.
+
+```markdown
+My name is [Alice]{name}.
+
+{@default}: http://example.org/
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<p vocab="http://example.org/">My name is <span property="name">Alice</span></p>
+```
+:::
+
+
+### Common prefixes are implicitly defined
+
+All prefixes predefined in [RDFa Core Initial Context] can be used without explicitly defining them.
+
+```markdown
+My name is [Alice]{schema:name}.
+```
+
+Would produce the following HTML+RDFa:
+
+```html
+<p>My name is <span property="schema:name">Alice</span></p>
+```
+
+## Referring to a IRI
+
+### Absolute IRI reference with <>
+
+`Meeting with [Bob]{.<http://xmlns.com/foaf/0.1/Person>}`
+
+### CURIE (with a declared prefix)
+
+```markdown
+Meeting with [Bob]{.f:Person}
+
+{f}: http://xmlns.com/foaf/0.1/
+````
+
+
+----
+
+## Parallel Idea: Indented Lists using Link References (JSON-LD or YAML-like lists).
+
+```markdown
+## {.schema:Event} Bird watchers meeting
+
+- [Date]: 10/11/2019
+- [Location]: somewhere
+- [Attendees]:
+ - [Name]: Alice
+ - [jobTitle]: Engineer
+ - [Works for]: Foo
+ - [Hobbies]:
+ - Football
+ - Video games
+ - [Name]: Bob
+ - [jobTitle]: Sales Manager
+ - [Works for]: Bar
+ - [Hobbies]:
+ - Cooking
+ - Cycling
+
+[Date]: {schema:startDate}
+[Location]: {schema:Location}
+[Name]: {schema:name}
+[jobTitle]: {schema:jobTitle}
+[Works for]: {schema:affiliation}
+[Hobbies]: {schema:knowsAbout}
+```
+
+Link can optionally be made clickable by adding a link to its definition at the bottom.
+
+# Deprecated
+
+#### Attributes on a word without inline delimiters?
+
+```markdown
+Thomas is 39{foaf:age}.
+```
+
+#### Properties on word without delimiters
+
+If a property annotation immediately follows a word with no explicit inline delimiters, it should be applied to this word only. (Is it really possible in terms of parsing? don't know).
+
+
+```markdown
+Thomas is 39{foaf:age}.
+```
+
+Should yield
+
+```html
+<p>Thomas is <span property="foaf:age">39</span></p>
+```
+
+#### IRI written directly as key
+
+```markdown
+- foaf:name: Thomas Francart
+- foaf:age = 39
+- rdfs:comment: Semantic Web Consultant
+```
+
+Should yield
+
+```html
+<ul>
+ <li>foaf:name: <span property="foaf:name">Thomas Francart</span></li>
+ <li>foaf:age = <span property="foaf:age">Thomas Francart</span></li>
+ <li>rdfs:comment: <span property="rdfs:comment">Semantic Web Consultant</span></li>
+</ul>
+```
+
+
+# See also
+
+http://rdfa.info/
+
+Whereas the scope of this project is limited to authoring a specification and maybe developing proof-of-concept parsers for it, some projects doing similar or more than that can be of inspiration.
+
+[Roam-research](https://roamresearch.com/)
+[Org-roam](https://org-roam.readthedocs.io/en/master/)
+[TiddlyRoam](https://joekroese.github.io/tiddlyroam/)
+
+There is also some experimentations on how to use those specifications:
+[SemanticMarkdown use cases studies](https://hackmd.io/yrm6X38NQTG6X-g6eyNt_g)
+
+
+Other references :
+[RDFa Lite]
+[RDFa CURIE]
+[RDFa Core]
+[RDFa Core Initial Context]
+
+[RDFa Lite]: https://www.w3.org/TR/rdfa-lite/
+
+[RDFa CURIE]: https://www.w3.org/TR/rdfa-core/#s_curies
+
+[RDFa Core Initial Context]: https://www.w3.org/2011/rdfa-context/rdfa-1.1
+
+[RDFa Core]: https://www.w3.org/TR/rdfa-core/