| 
									
										
										
											
												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-21 13:09:57 +00:00
										 |  |  | const {extname} = require('canonical-path'); | 
					
						
							| 
									
										
										
										
											2017-01-26 14:03:53 +00:00
										 |  |  | 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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												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-21 13:09:57 +00:00
										 |  |  |                 // 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); | 
					
						
							| 
									
										
										
										
											2017-01-26 14:03:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 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 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } |