Peter Bacon Darwin 3f8d5ac478 feat(aio): support annotating JSON files with doc-regions
This change allows the example writer to add doc-region annotations to
files that do not allow comments. This is done by creating a clone of the
file and adding `.annotated` to the file name. This new file can contain
inline `// ...` comments that can be used to annotate the doc regions.

Example:

**package.json**

```
{
  "name": "angular.io",
  "version": "0.0.0",
  "main": "index.js",
  "repository": "git@github.com:angular/angular.git",
  "author": "Angular",
  "license": "MIT",
  "private": true,
}
````

**package.json.annotated**

```
{
  "name": "angular.io",
// #docregion version
  "version": "0.0.0",
// #enddocregion
  "main": "index.js",
  "repository": "git@github.com:angular/angular.git",
  "author": "Angular",
  "license": "MIT",
  "private": true,
}
````

This region can then be referenced in examples just like any other doc region:

```
{@example 'package.json' region="version"}
```
2017-02-23 23:23:58 -08:00

77 lines
2.7 KiB
JavaScript

const {extname} = require('canonical-path');
const {mapObject} = require('../utils');
module.exports = function collectExamples(exampleMap, regionParser, log, createDocMessage) {
return {
$runAfter: ['files-read'],
$runBefore: ['parsing-tags'],
$validate: {exampleFolders: {presence: true}},
$process: function(docs) {
const exampleFolders = this.exampleFolders;
const regionDocs = [];
docs = docs.filter((doc) => {
if (doc.docType === 'example-file') {
try {
// find the first matching folder
exampleFolders.some((folder) => {
if (doc.fileInfo.relativePath.indexOf(folder) === 0) {
const relativePath =
doc.fileInfo.relativePath.substr(folder.length).replace(/^\//, '');
exampleMap[folder] = exampleMap[folder] || {};
exampleMap[folder][relativePath] = doc;
// We treat files that end in `.annotated` specially
// They are used to annotate files that cannot contain comments, such as JSON
// So you provide two files: `xyz.json` and `xyz.json.annotated`, which is a copy
// of the original but contains inline doc region comments
let fileType = doc.fileInfo.extension;
if (fileType === 'annotated') {
fileType = extname(doc.fileInfo.baseName).substr(1) + '.' + fileType;
}
const parsedRegions = regionParser(doc.content, fileType);
log.debug(
'found example file', folder, relativePath, Object.keys(parsedRegions.regions));
doc.renderedContent = parsedRegions.contents;
// Map each region into a doc that can be put through the rendering pipeline
doc.regions = mapObject(parsedRegions.regions, (regionName, regionContents) => {
const regionDoc =
createRegionDoc(folder, relativePath, regionName, regionContents);
regionDocs.push(regionDoc);
return regionDoc;
});
return true;
}
});
return false;
} catch (e) {
throw new Error(createDocMessage(e.message, doc, e));
}
} else {
return true;
}
});
return docs.concat(regionDocs);
}
};
};
function createRegionDoc(folder, relativePath, regionName, regionContents) {
const path = folder + '/' + relativePath;
const id = path + '#' + regionName
return {
docType: 'example-region',
path: path,
name: regionName,
id: id,
aliases: [id],
contents: regionContents
};
}