diff options
author | Jonas Smedegaard <dr@jones.dk> | 2025-05-11 18:43:00 +0200 |
---|---|---|
committer | Jonas Smedegaard <dr@jones.dk> | 2025-05-11 18:43:00 +0200 |
commit | 4ecfc4241891431add22d33cc0f8b46137e31951 (patch) | |
tree | a811df452e124ced86cf4fbf5989b6372d69dc05 | |
parent | b0becbe7293e4ff147264965fba20a263af9dd84 (diff) |
sync with https://hackmd.io/KtR5fUhXRuS_XnNEo_gpow as of 2025-05-11T18:40
-rw-r--r-- | README.md | 473 |
1 files changed, 314 insertions, 159 deletions
@@ -1,3 +1,6 @@ +--- +breaks: false +--- # Semantic Markdown Spec (Alpha Draft) [TOC] @@ -6,9 +9,16 @@ ### 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. +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. +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 @@ -19,7 +29,7 @@ Design Rationale: ### About this document :::warning -This document is in early draft stage ! +This document is in early draft stage! ::: ### Providing feedback @@ -27,7 +37,7 @@ This document is in early draft stage ! 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.jones.dk), e.g. using a client like Riot.im at https://riot.im/app/#/room/#semantic-markdown:matrix.jones.dk +2. Join us on the [Semantic Markdown Matrix discussion channel](https://matrix.to/#/#semantic-markdown:matrix.jones.dk) 3. Modify the document directly after your proposals were discussed ## Semantic Markdown at a glance @@ -37,9 +47,15 @@ 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}` +- 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 @@ -70,12 +86,14 @@ 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] +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} @@ -96,38 +114,43 @@ Would produce the following HTML+RDFa: ```html <div vocab="http://schema.org/"> - <h2 typeof="Event" 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 property="attendee">Alice</li> - <li property="attendee">Bob</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 typeof="Event" property="name">Launch party</h2> - <p>(TODO)</p> +<h2 typeof="Event" 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 property="attendee">Alice</li> +<li property="attendee">Bob</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 typeof="Event" property="name">Launch party</h2> +<p>(TODO)</p> </div> ``` ## 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. +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 `{...}`. +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]. +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 @@ -147,30 +170,41 @@ 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: `[...](...)`). +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}. +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> +<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. +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. +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>} @@ -182,11 +216,13 @@ 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> +<p>You can give me a ring {=<#manu>}.</p> ``` Notice how second paragraph has punctuation *after* the hints. +#### List + Similarly for a list: ```markdown @@ -199,26 +235,36 @@ Would produce the following HTML+RDFa: ```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> +<li><span property="foaf:name">Thomas Francart</span></li> +<li><span property="foaf:age">39</span></li> +<li><span property="rdfs:comment">Semantic Web Consultant</span></li> </ul> ``` - ### Block-tree 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. +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. + +My name is Manu Sporny, and you can give me a ring. + ## Thomas Francart -My name is Thomas Francart. +My name is Thomas Francart. ``` Would produce the following HTML+RDFa: @@ -228,36 +274,49 @@ Would produce the following HTML+RDFa: <div resource="#manu"> <h2>Manu Sporny</h2> <p>My name is Manu Sporny, -and you can give me a ring.<p> +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*. +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*. ### Block-siblings 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. +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> +<h1>People</h1> <div typeof="schema:Person"> <h2>Manu Sporny</h2> -<p>My name is Manu Sporny.<p> +<p>My name is Manu Sporny.</p> </div> <div typeof="schema:Person"> <h2>Thomas Francart</h2> @@ -266,10 +325,12 @@ Would produce the following HTML+RDFa: <h1>Animals</h1> ``` +#### List + Similarly for a list: ```markdown -{foaf:member} +- {foaf:member} - Thomas - Vincent - Nicolas @@ -287,30 +348,55 @@ And would produce the following HTML+RDFa: ```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> +<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> ``` ### Block-cluster 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 contained or descendant blocks; or followed by a non-header non-list block, applies to the following block and any following siblings and any contained or descendant blocks of any of them. -For the context of this definition, a paragraph or any container block (block which can contain other blocks) is considered to be descendent of a leaf block (block which cannot contain other blocks, e.g. a header or horisontal ruler). -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. +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 contained or descendant blocks; +or followed by a non-header non-list block, +applies to the following block and any following siblings +and any contained or descendant blocks of any of them. +For the context of this definition, +a paragraph or any container block +(block which can contain other blocks) +is considered to be descendent of a leaf block +(block which cannot contain other blocks, +e.g. a header or horisontal ruler). +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? @@ -320,9 +406,9 @@ Would produce the following HTML+RDFa: ```html <div typeof="schema:Group"> -<h1> People</h1> +<h1>People</h1> <h2>Manu Sporny</h2> -<p>My name is Manu Sporny.<p> +<p>My name is Manu Sporny.</p> <h2>Thomas Francart</h2> <p>My name is Thomas Francart.</p> I once read this: @@ -336,8 +422,15 @@ I once read this: ### 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. +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 @@ -358,21 +451,28 @@ Would produce the following HTML+RDFa: <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> +<a property="telephone" href="tel:+1-800-555-0199" title="make a phone call to Manu Sporny">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): +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. +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: +> 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} @@ -380,30 +480,45 @@ Extract from PHP Markdown extra documentation: > >## Header 2 ## {#header2} >``` ->Then you can create links to different parts of the same document like this: +> +> 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 +> +> 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) @@ -422,40 +537,40 @@ Would produce the following HTML+RDFa: ### blocks - - #### block example -Annotations declared as a an initial separate block applies to all siblings by introducing a surrounding `<div>` tag. +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} ! +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> +<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. +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} ! +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> +<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 @@ -468,7 +583,6 @@ Would produce the following HTML+RDFa: - member 3 ``` - #### Set attributes on list items ```markdown @@ -485,17 +599,17 @@ 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}`. +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">` - - +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) - ### Inline properties #### Properties on inline delimiters @@ -528,7 +642,6 @@ Should yield - Age: <span property="foaf:age">23</span> ``` - ## Annotate the subject of properties ### Use a class attribute (RDFa "typeof" attribute) @@ -543,8 +656,10 @@ 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. - +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} @@ -557,14 +672,17 @@ Would produce the following HTML+RDFa: ```html <ul typeof="foaf:Document"> - <li>item 1</li> - <li>item 2</li> - <li>item 3</li> +<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.) - +(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) @@ -575,7 +693,9 @@ Use an annotation starting with "=" ``` :::danger -:heavy_exclamation_mark: FIXME: Undecided if leading character `=` should be replaced with e.g. `@`or `#`. +:heavy_exclamation_mark: +FIXME: Undecided if leading character `=` should be replaced +with e.g. `@`or `#`. ::: ### Combine ID + class @@ -594,7 +714,9 @@ Should produce the following HTML+RDFa <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: +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} @@ -608,13 +730,17 @@ Should produce the following HTML+RDFa ## 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. +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. +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. +Used to indicate +that a certain inline portion of a sentence is about an entity. ```markdown [Tim Berners Lee]{=wdt:Q80} invented the web. @@ -628,10 +754,11 @@ Should yield <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. +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} @@ -647,7 +774,9 @@ Should yield ### 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. +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} @@ -662,19 +791,23 @@ 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> +<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> ``` ### 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: +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} @@ -689,15 +822,16 @@ Should yield <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> +<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> ``` ### Indented lists -Indented lists are key because they could make plain Markdown lists look like JSON-LD trees; +Indented lists are key +because they could make plain Markdown lists look like JSON-LD trees; Plain Markdown list: @@ -750,7 +884,9 @@ Here is our meeting description: ``` :::danger -:heavy_exclamation_mark: FIXME: Either replace this section with JSON-LD like style or drop this section +:heavy_exclamation_mark: +FIXME: Either replace this section with JSON-LD like style +or drop this section ::: ### Current blockquote subject @@ -758,12 +894,14 @@ Here is our meeting description: Used to indicate that a blockquote describes an entity :::danger -:heavy_exclamation_mark: FIXME: Either document how or drop this section +: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. +Used to indicate +that a certain section of a document describes an entity. The following annotated MD: @@ -799,15 +937,14 @@ 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> +<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 @@ -824,12 +961,15 @@ 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> +<p>Tim Berners Lee invented the web.</p> +<p>He now works on Solid.</p> </div> ``` -As per [Block-cluster scope](#Block-cluster-scope), hints applies until next descendant block or sibling paragraph. To limit without introducing new content, use an empty hint: +As per [Block-cluster scope](#Block-cluster-scope), +hints applies until next descendant block or sibling paragraph. +To limit without introducing new content, +use an empty hint: ```markdown {=wdt:Q80} @@ -849,15 +989,17 @@ 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> +<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. +Declare [prefix definitions](#Prefix-definition-syntax), +anywhere in the document, +preferably at the end to ease readability. ```markdown {.schema:Event} @@ -875,16 +1017,17 @@ Should yield ```html <div prefix="schema: http://schema.org/ rdfs: http://www.w3.org/2000/01/rdf-schema# ex: http://example.org/"> - <ul typeof="Event"> - <li>Date: <span property="startDate">10/11/2019</span></li> - <li>Location: <span property="ex:good_place">somewhere</span></li> - </ul> +<ul typeof="Event"> +<li>Date: <span property="startDate">10/11/2019</span></li> +<li>Location: <span property="ex:good_place">somewhere</span></li> +</ul> </div> ``` ### Prefix and link definitions have similar but separate syntax -Prefixes mimic the syntax for links, but using curly brackets instead of angle brackets: +Prefixes mimic the syntax for links, +but using curly brackets instead of angle brackets: ```markdown ### Specifications Meeting {.schema:Event} @@ -903,7 +1046,10 @@ Bla bla bla as is documented in the [schema] ontology. ### 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. +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}. @@ -918,7 +1064,11 @@ Would produce the following HTML+RDFa: ``` :::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. +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}. @@ -933,10 +1083,10 @@ Would produce the following HTML+RDFa: ``` ::: - ### Common prefixes are implicitly defined -All prefixes predefined in [RDFa Core Initial Context] can be used without explicitly defining them. +All prefixes predefined in [RDFa Core Initial Context] can be used +without explicitly defining them. ```markdown My name is [Alice]{schema:name}. @@ -962,7 +1112,6 @@ 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). @@ -999,23 +1148,27 @@ Meeting with [Bob]{.f:Person} [Hobbies]: {schema:knowsAbout} ``` -Link can optionally be made clickable by adding a link to its definition at the bottom. - +Link can optionally be made clickable +by adding a link to its definition at the bottom. # 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. +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: +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] @@ -1030,8 +1183,6 @@ Other references : [RDFa Core]: https://www.w3.org/TR/rdfa-core/ - - --- # Deprecated Stuff @@ -1044,8 +1195,10 @@ 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). - +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}. @@ -1075,11 +1228,13 @@ Should yield </ul> ``` - #### Omit list item leading key and trailing repetition punctuation -If the list item contains `:` or `=`, the annotation is applied to the string after this character. -If final non-space non-annotation character of the list item is `,` or `;`, the annotation is applied to the string before this character. +If the list item contains `:` or `=`, +the annotation is applied to the string after this character. +If final non-space non-annotation character of the list item +is `,` or `;`, +the annotation is applied to the string before this character. ```markdown - Name: Thomas Francart {foaf:name} |