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"}
```
		
	
			
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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
 | |
|   };
 | |
| } |