microformats2-json: Difference between revisions

From Microformats Wiki
Jump to navigation Jump to search
(Stubs aren’t so much stubs when they need only a single specific expension, update rels with a multi-rel URL, start the rel-urls documentation)
m (Use source javascript instead of pre for syntax highlighting)
Line 7: Line 7:
Parsers collect not only microformats2 objects, but also [[rel|link relationships]]. Parsing an entire document will result in an outer object with 3 members named <code>items</code>, <code>rels</code>, and <code>rel-urls</code>:
Parsers collect not only microformats2 objects, but also [[rel|link relationships]]. Parsing an entire document will result in an outer object with 3 members named <code>items</code>, <code>rels</code>, and <code>rel-urls</code>:


<pre>{
<source lang=javascript>{
   "items": [],
   "items": [],
   "rels": {},
   "rels": {},
   "rel-urls": {}
   "rel-urls": {}
}</pre>
}</source>


# <code>items</code> is an array of [[microformats2-json#microformat2_Objects|microformats2 objects]], ordered according to their order in the source document.
# <code>items</code> is an array of [[microformats2-json#microformat2_Objects|microformats2 objects]], ordered according to their order in the source document.
Line 21: Line 21:
The '''microformats2 object''' is an object with 2 required members named <code>type</code> and <code>properties</code>, as well as an optional member named <code>children</code>:
The '''microformats2 object''' is an object with 2 required members named <code>type</code> and <code>properties</code>, as well as an optional member named <code>children</code>:


<pre>{  
<source lang=javascript>{  
   "type": [],
   "type": [],
   "properties": {},
   "properties": {},
   "children": []
   "children": []
}</pre>
}</source>


# <code>type</code> is an array of the types that identify the microformat, ordered alphabetically.
# <code>type</code> is an array of the types that identify the microformat, ordered alphabetically.
Line 41: Line 41:
The following example shows an <code>h-entry</code> type microformats2 object, with a single property attached. The <code>h-entry</code> type is [[h-entry|documented on the wiki]], this way types point towards documented conventions that hold true no matter what the source document was.
The following example shows an <code>h-entry</code> type microformats2 object, with a single property attached. The <code>h-entry</code> type is [[h-entry|documented on the wiki]], this way types point towards documented conventions that hold true no matter what the source document was.


<pre>{  
<source lang=javascript>{  
   "type": ["h-entry"],
   "type": ["h-entry"],
   "properties": {
   "properties": {
     "summary": ["A short published note."]
     "summary": ["A short published note."]
   }
   }
}</pre>
}</source>


=== properties ===
=== properties ===
Line 66: Line 66:
To see what these properties mean in the context of an <code>h-entry</code> type, see [[h-entry#Core_Properties|the Core Properties section on the type’s wiki page]].
To see what these properties mean in the context of an <code>h-entry</code> type, see [[h-entry#Core_Properties|the Core Properties section on the type’s wiki page]].


<pre>{
<source lang=javascript>{
   "type": ["h-entry"],
   "type": ["h-entry"],
   "properties": {
   "properties": {
Line 99: Line 99:
     ]
     ]
   }
   }
}</pre>
}</source>


=== children ===
=== children ===
Line 109: Line 109:
The following example shows an <code>h-feed</code> type microformats2 object with a few properties that describe the feed, and an array of <code>h-entry</code> objects as its children.
The following example shows an <code>h-feed</code> type microformats2 object with a few properties that describe the feed, and an array of <code>h-entry</code> objects as its children.


<pre>{
<source lang=javascript>{
   "type": ["h-feed"],
   "type": ["h-feed"],
   "properties": {
   "properties": {
Line 153: Line 153:
     }
     }
   ]
   ]
}</pre>
}</source>


== rels Object ==
== rels Object ==
Line 167: Line 167:
* <code><nowiki>https://example.com/a</nowiki></code> and <code><nowiki>https://example.com/b</nowiki></code> both identify an author of the current page using [[rel-author|the <code>author</code> relationship value]].
* <code><nowiki>https://example.com/a</nowiki></code> and <code><nowiki>https://example.com/b</nowiki></code> both identify an author of the current page using [[rel-author|the <code>author</code> relationship value]].


<pre>{
<source lang=javascript>{
   "home": [
   "home": [
     "https://example.com/",
     "https://example.com/",
Line 177: Line 177:
   ],
   ],
   "alternate": ["https://example.com/fr/"]
   "alternate": ["https://example.com/fr/"]
}</pre>
}</source>


== rel-urls Object ==
== rel-urls Object ==
Line 185: Line 185:
The '''rel-urls object''' is an object with any amount of members, where every member name is a URL and every member value is an object.
The '''rel-urls object''' is an object with any amount of members, where every member name is a URL and every member value is an object.


<pre>{
<source lang=javascript>{
   "https://example.com/": {
   "https://example.com/": {
     "rels": ["home"],
     "rels": ["home"],
Line 203: Line 203:
     "text": "Example page d’accueil"
     "text": "Example page d’accueil"
   }
   }
}</pre>
}</source>


== See Also ==
== See Also ==

Revision as of 08:48, 24 April 2018

microformats2 JSON is the canonical output format of the microformats2 parsing algorithm. As such it can be used to compare parsers and create test suites. It is also used as the official serialisation format of microformats objects, and relied upon by specifications such as Micropub.

⚠️ The JSON format used is not pinned to a specific JSON specification. See issue #23 for a discussion on the subject.

Parsed Document Format

Parsers collect not only microformats2 objects, but also link relationships. Parsing an entire document will result in an outer object with 3 members named items, rels, and rel-urls:

{
  "items": [],
  "rels": {},
  "rel-urls": {}
}
  1. items is an array of microformats2 objects, ordered according to their order in the source document.
  2. rels is an object where the member names reflect all rel-values found in the source document.
  3. rel-urls is an object where the member names reflect all URLs found in the source document with rel-values attached.

microformat2 Objects

The microformats2 object is an object with 2 required members named type and properties, as well as an optional member named children:

{ 
  "type": [],
  "properties": {},
  "children": []
}
  1. type is an array of the types that identify the microformat, ordered alphabetically.
  2. properties is an object where the member names reflect all properties found for the microformat.
  3. The optional member children is an array of other microformats2 objects that were found nested in the current one.

type

ℹ️ This section needs expanding. It needs an example of a microformats2 object that uses multiple types and still makes sense.

The type member contains an alphabetically sorted array of root class names. These names express what the microformat is expressing, and are often coupled to which properties to expect through documented conventions.

The root class names are individual strings that match the pattern h-([0-9a-z]+-)?[a-z]+.

The following example shows an h-entry type microformats2 object, with a single property attached. The h-entry type is documented on the wiki, this way types point towards documented conventions that hold true no matter what the source document was.

{ 
  "type": ["h-entry"],
  "properties": {
    "summary": ["A short published note."]
  }
}

properties

The properties member contains an object where every member name is a microformats2 property name, and every member value is an array of the found microformats2 values. Even when only one value is given, it will be inside an array.

Valid values in the value array are one of the following:

  1. a string value, the most common value,
  2. an embedded markup object, containing both a plain string value and the verbatim mark-up from the source document, or
  3. another microformat2 object.

If a microformat2 object is used as the value of a property, it will gain the additional member value to express a plain string representation. If a consuming application does not understand the nested microformat2 object, it can opt to treat it as that string.

If a microformat2 object is used as the value of a property, when the parser is also instructed to return it as an embedded markup object, it will gain the additional member html.

The following example shows an h-entry type microformats2 object, with 3 properties to show the 3 different types of properties. The name is a single string, the content contains verbatim HTML from the source document, and the author is a nested microformat2 h-card object. The in-reply-to property has been added to show how one property may contain multiple valid values.

To see what these properties mean in the context of an h-entry type, see the Core Properties section on the type’s wiki page.

{
  "type": ["h-entry"],
  "properties": {
    "name": ["An example entry"],
    "content": [
      {
        "html": "<p>Ut non sit saepe porro porro est aut. Dicta ut repellat quisquam repellendus et iste consequatur.</p>\n<p>Consequuntur repellat sed aut in et dolores. Consequatur amet quo enim.</p>",
        "value": "Ut non sit saepe porro porro est aut. Dicta ut repellat quisquam repellendus et iste consequatur.\nConsequuntur repellat sed aut in et dolores. Consequatur amet quo enim."
      }
    ],
    "author": [
      {
        "type": ["h-card"],
        "properties": {
          "name": ["Mx Example"],
          "url": ["https://example.com/"]
        },
        "value": "Mx Example"
      }
    ],
    "in-reply-to": [
      {
        "type": ["h-cite"],
        "properties": {
          "name": ["Example Domain"],
          "author": ["IANA"],
          "url": ["https://example.org/"]
        },
        "value": "https://example.org/"
      },
      "https://example.net/"
    ]
  }
}

children

The optional children member is added when nested microformats are found and contains an array of microformat2 objects.

This happens when other objects are contained with outer ones, e.g. data is marked up with microformats within the content of an h-entry. Another possibility is that the outer object exists to group all its nested objects, such as an h-feed.

The following example shows an h-feed type microformats2 object with a few properties that describe the feed, and an array of h-entry objects as its children.

{
  "type": ["h-feed"],
  "properties": {
    "author": ["https://example.org/"],
    "name": ["Example Feed"]
  },
  "children": [
    {
      "type": ["h-entry"],
      "properties": {
        "name": ["Entry 1"],
        "content": [
          {
            "html": "<p>Ut non sit saepe porro porro est aut.</p>\n<p>Dicta ut repellat quisquam repellendus et iste consequatur.</p>",
            "value": "Ut non sit saepe porro porro est aut.\nDicta ut repellat quisquam repellendus et iste consequatur."
          }
        ]
      }
    },
    {
      "type": ["h-entry"],
      "properties": {
        "name": ["Entry 2"],
        "content": [
          {
            "html": "<p>Ut non sit saepe porro porro est aut.</p>\n<p>Dicta ut repellat quisquam repellendus et iste consequatur.</p>",
            "value": "Ut non sit saepe porro porro est aut.\nDicta ut repellat quisquam repellendus et iste consequatur."
          }
        ]
      }
    },
    {
      "type": ["h-entry"],
      "properties": {
        "name": ["Entry 3"],
        "content": [
          {
            "html": "<p>Ut non sit saepe porro porro est aut.</p>\n<p>Dicta ut repellat quisquam repellendus et iste consequatur.</p>",
            "value": "Ut non sit saepe porro porro est aut.\nDicta ut repellat quisquam repellendus et iste consequatur."
          }
        ]
      }
    }
  ]
}

rels Object

The rels object is an object with any amount of members, where every member name is a link relationship (see the documented existing relationships for examples) and every member value is an array of URLs.

Any relationship can have 1 or more URLs in its matching array. And any URL can be in several arrays, if it has several relationships associated with it.

The following example shows a rels object where 4 URLs were found in the source document:

{
  "home": [
    "https://example.com/",
    "https://example.com/fr/"
  ],
  "author": [
    "https://example.com/a",
    "https://example.com/b"
  ],
  "alternate": ["https://example.com/fr/"]
}

rel-urls Object

ℹ️ This section is a stub. You can help the microformats.org wiki by expanding it.

The rel-urls object is an object with any amount of members, where every member name is a URL and every member value is an object.

{
  "https://example.com/": {
    "rels": ["home"],
    "text": "Example Homepage"
  },
  "https://example.com/a": {
    "rels": ["author"],
    "text": "Mx Adam"
  },
  "https://example.com/b": {
    "rels": ["author"],
    "text": "Mx Baker"
  },
  "https://example.com/fr/": {
    "rels": ["alternate", "home"],
    "hreflang": "fr",
    "text": "Example page d’accueil"
  }
}

See Also