build(aio): add new post-process dgeni package
This package will allow us to do complex post-processing on the HTML that is rendered by Nunjucks.
This commit is contained in:
		
							parent
							
								
									fbde2a8010
								
							
						
					
					
						commit
						1ceb2f9c79
					
				| @ -82,6 +82,7 @@ | |||||||
|     "lighthouse": "^1.6.3", |     "lighthouse": "^1.6.3", | ||||||
|     "lodash": "^4.17.4", |     "lodash": "^4.17.4", | ||||||
|     "protractor": "~5.1.0", |     "protractor": "~5.1.0", | ||||||
|  |     "rehype": "^4.0.0", | ||||||
|     "remark": "^7.0.0", |     "remark": "^7.0.0", | ||||||
|     "remark-autolink-headings": "^4.0.0", |     "remark-autolink-headings": "^4.0.0", | ||||||
|     "remark-html": "^6.0.0", |     "remark-html": "^6.0.0", | ||||||
|  | |||||||
| @ -14,11 +14,12 @@ const linksPackage = require('../links-package'); | |||||||
| const examplesPackage = require('../examples-package'); | const examplesPackage = require('../examples-package'); | ||||||
| const targetPackage = require('../target-package'); | const targetPackage = require('../target-package'); | ||||||
| const remarkPackage = require('../remark-package'); | const remarkPackage = require('../remark-package'); | ||||||
|  | const postProcessPackage = require('../post-process-package'); | ||||||
| 
 | 
 | ||||||
| const { PROJECT_ROOT, DOCS_OUTPUT_PATH, TEMPLATES_PATH, requireFolder } = require('../config'); | const { PROJECT_ROOT, DOCS_OUTPUT_PATH, TEMPLATES_PATH, requireFolder } = require('../config'); | ||||||
| 
 | 
 | ||||||
| module.exports = new Package('angular-base', [ | module.exports = new Package('angular-base', [ | ||||||
|   jsdocPackage, nunjucksPackage, linksPackage, examplesPackage, targetPackage, remarkPackage |   jsdocPackage, nunjucksPackage, linksPackage, examplesPackage, targetPackage, remarkPackage, postProcessPackage | ||||||
| ]) | ]) | ||||||
| 
 | 
 | ||||||
|   // Register the processors
 |   // Register the processors
 | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								aio/tools/transforms/post-process-package/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								aio/tools/transforms/post-process-package/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | var Package = require('dgeni').Package; | ||||||
|  | var base = require('dgeni-packages/base'); | ||||||
|  | 
 | ||||||
|  | module.exports = new Package('post-process-package', [base]) | ||||||
|  |   .processor(require('./processors/post-process-html')); | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | const rehype = require('rehype'); | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * @dgProcessor postProcessHtml | ||||||
|  |  * | ||||||
|  |  * @description | ||||||
|  |  * Use the rehype processing engine to manipulate the | ||||||
|  |  * `renderedContent` HTML via rehype "plugins" that work with HTML ASTs (HASTs). | ||||||
|  |  * See https://github.com/wooorm/rehype
 | ||||||
|  |  * | ||||||
|  |  * Each plugin is a factory function that will be called with the "rehype" engine as `this`. | ||||||
|  |  * The factory should return a function that takes a HAST and returns a `boolean` or `undefined`. | ||||||
|  |  * The HAST can be mutated by the this function. | ||||||
|  |  * If `false` is returned then the processing stops with that plugin. | ||||||
|  |  * | ||||||
|  |  * @property docTypes {string[]} the `docTypes` of docs that should be post-processed | ||||||
|  |  * @property plugins {Function[]} the rehype plugins that will modify the HAST. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | module.exports = function postProcessHtml() { | ||||||
|  |   return { | ||||||
|  |     $runAfter: ['docs-rendered'], | ||||||
|  |     $runBefore: ['writing-files'], | ||||||
|  |     docTypes: [], | ||||||
|  |     plugins: [], | ||||||
|  |     $process(docs) { | ||||||
|  |       const engine = rehype() | ||||||
|  |             .data('settings', { fragment: true }); | ||||||
|  |       this.plugins.forEach(plugin => engine.use(plugin)); | ||||||
|  | 
 | ||||||
|  |       docs | ||||||
|  |         .filter(doc => this.docTypes.indexOf(doc.docType) !== -1) | ||||||
|  |         .forEach(doc => | ||||||
|  |           doc.renderedContent = engine.processSync(doc.renderedContent).contents); | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  | }; | ||||||
| @ -0,0 +1,62 @@ | |||||||
|  | const testPackage = require('../../helpers/test-package'); | ||||||
|  | const Dgeni = require('dgeni'); | ||||||
|  | 
 | ||||||
|  | describe('postProcessHtml', function() { | ||||||
|  |   let dgeni, injector, processor; | ||||||
|  | 
 | ||||||
|  |   beforeEach(function() { | ||||||
|  |     dgeni = new Dgeni([testPackage('post-process-package', true)]); | ||||||
|  |     injector = dgeni.configureInjector(); | ||||||
|  |     processor = injector.get('postProcessHtml'); | ||||||
|  |     processor.docTypes = ['a', 'b']; | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('should be available from the injector', () => { | ||||||
|  |     expect(processor).toBeDefined(); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('should only process docs that match the specified docTypes', () => { | ||||||
|  |     const elements = []; | ||||||
|  |     const captureFirstElement = ast => { | ||||||
|  |       elements.push(ast.children[0].tagName); | ||||||
|  |     }; | ||||||
|  |     processor.plugins = [() => captureFirstElement]; | ||||||
|  | 
 | ||||||
|  |     const docs = [ | ||||||
|  |       { docType: 'a', renderedContent: '<a></a>' }, | ||||||
|  |       { docType: 'b', renderedContent: '<b></b>' }, | ||||||
|  |       { docType: 'c', renderedContent: '<c></c>' }, | ||||||
|  |       { docType: 'd', renderedContent: '<d></d>' }, | ||||||
|  |     ]; | ||||||
|  |     processor.$process(docs); | ||||||
|  |     expect(elements).toEqual(['a', 'b']); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('should run all the plugins on each doc', () => { | ||||||
|  |     const capitalizeFirstElement = ast => { | ||||||
|  |       ast.children[0].tagName = ast.children[0].tagName.toUpperCase(); | ||||||
|  |     }; | ||||||
|  |     const addOneToFirstElement = ast => { | ||||||
|  |       ast.children[0].tagName = ast.children[0].tagName + '1'; | ||||||
|  |     }; | ||||||
|  |     const elements = []; | ||||||
|  |     const captureFirstElement = ast => { | ||||||
|  |       elements.push(ast.children[0].tagName); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     const docs = [ | ||||||
|  |       { docType: 'a', renderedContent: '<a></a>' }, | ||||||
|  |       { docType: 'b', renderedContent: '<b></b>' }, | ||||||
|  |       { docType: 'c', renderedContent: '<c></c>' }, | ||||||
|  |       { docType: 'd', renderedContent: '<d></d>' }, | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     processor.plugins = [ | ||||||
|  |       () => capitalizeFirstElement, | ||||||
|  |       () => addOneToFirstElement, | ||||||
|  |       () => captureFirstElement | ||||||
|  |     ]; | ||||||
|  |     processor.$process(docs); | ||||||
|  |     expect(elements).toEqual(['A1', 'B1']); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
| @ -1219,7 +1219,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: | |||||||
|   dependencies: |   dependencies: | ||||||
|     delayed-stream "~1.0.0" |     delayed-stream "~1.0.0" | ||||||
| 
 | 
 | ||||||
| comma-separated-tokens@^1.0.1: | comma-separated-tokens@^1.0.0, comma-separated-tokens@^1.0.1: | ||||||
|   version "1.0.2" |   version "1.0.2" | ||||||
|   resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.2.tgz#4b64717a2ee363af6dd39878336bd95e42d063e7" |   resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.2.tgz#4b64717a2ee363af6dd39878336bd95e42d063e7" | ||||||
|   dependencies: |   dependencies: | ||||||
| @ -3014,10 +3014,24 @@ hash.js@^1.0.0: | |||||||
|   dependencies: |   dependencies: | ||||||
|     inherits "^2.0.1" |     inherits "^2.0.1" | ||||||
| 
 | 
 | ||||||
|  | hast-util-from-parse5@^1.0.0: | ||||||
|  |   version "1.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-1.1.0.tgz#359cc339dc8ccf1dfaca41915ad63fd546130acd" | ||||||
|  |   dependencies: | ||||||
|  |     camelcase "^3.0.0" | ||||||
|  |     has "^1.0.1" | ||||||
|  |     hastscript "^3.0.0" | ||||||
|  |     property-information "^3.1.0" | ||||||
|  |     vfile-location "^2.0.0" | ||||||
|  | 
 | ||||||
| hast-util-is-element@^1.0.0: | hast-util-is-element@^1.0.0: | ||||||
|   version "1.0.0" |   version "1.0.0" | ||||||
|   resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.0.0.tgz#3f7216978b2ae14d98749878782675f33be3ce00" |   resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.0.0.tgz#3f7216978b2ae14d98749878782675f33be3ce00" | ||||||
| 
 | 
 | ||||||
|  | hast-util-parse-selector@^2.0.0: | ||||||
|  |   version "2.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.1.0.tgz#b55c0f4bb7bb2040c889c325ef87ab29c38102b4" | ||||||
|  | 
 | ||||||
| hast-util-sanitize@^1.0.0: | hast-util-sanitize@^1.0.0: | ||||||
|   version "1.1.0" |   version "1.1.0" | ||||||
|   resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-1.1.0.tgz#9b4bc3731043fe92e1253a9a4ca7bcc4148d06f2" |   resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-1.1.0.tgz#9b4bc3731043fe92e1253a9a4ca7bcc4148d06f2" | ||||||
| @ -3046,6 +3060,16 @@ hast-util-whitespace@^1.0.0: | |||||||
|   version "1.0.0" |   version "1.0.0" | ||||||
|   resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.0.tgz#bd096919625d2936e1ff17bc4df7fd727f17ece9" |   resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.0.tgz#bd096919625d2936e1ff17bc4df7fd727f17ece9" | ||||||
| 
 | 
 | ||||||
|  | hastscript@^3.0.0: | ||||||
|  |   version "3.0.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-3.0.1.tgz#9edfab8839e6d67bc6835297a0bf9ba6ad7a00a9" | ||||||
|  |   dependencies: | ||||||
|  |     camelcase "^3.0.0" | ||||||
|  |     comma-separated-tokens "^1.0.0" | ||||||
|  |     hast-util-parse-selector "^2.0.0" | ||||||
|  |     property-information "^3.0.0" | ||||||
|  |     space-separated-tokens "^1.0.0" | ||||||
|  | 
 | ||||||
| hawk@~3.1.3: | hawk@~3.1.3: | ||||||
|   version "3.1.3" |   version "3.1.3" | ||||||
|   resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" |   resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" | ||||||
| @ -4902,6 +4926,10 @@ parse5@^1.5.1: | |||||||
|   version "1.5.1" |   version "1.5.1" | ||||||
|   resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" |   resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" | ||||||
| 
 | 
 | ||||||
|  | parse5@^2.1.5: | ||||||
|  |   version "2.2.3" | ||||||
|  |   resolved "https://registry.yarnpkg.com/parse5/-/parse5-2.2.3.tgz#0c4fc41c1000c5e6b93d48b03f8083837834e9f6" | ||||||
|  | 
 | ||||||
| parse5@^3.0.1: | parse5@^3.0.1: | ||||||
|   version "3.0.2" |   version "3.0.2" | ||||||
|   resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510" |   resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510" | ||||||
| @ -5324,7 +5352,7 @@ promise@^7.1.1: | |||||||
|   dependencies: |   dependencies: | ||||||
|     asap "~2.0.3" |     asap "~2.0.3" | ||||||
| 
 | 
 | ||||||
| property-information@^3.1.0: | property-information@^3.0.0, property-information@^3.1.0: | ||||||
|   version "3.1.0" |   version "3.1.0" | ||||||
|   resolved "https://registry.yarnpkg.com/property-information/-/property-information-3.1.0.tgz#1581bf8a445dfbfef759775a86700e8dda18b4a1" |   resolved "https://registry.yarnpkg.com/property-information/-/property-information-3.1.0.tgz#1581bf8a445dfbfef759775a86700e8dda18b4a1" | ||||||
| 
 | 
 | ||||||
| @ -5623,6 +5651,29 @@ regjsparser@^0.1.4: | |||||||
|   dependencies: |   dependencies: | ||||||
|     jsesc "~0.5.0" |     jsesc "~0.5.0" | ||||||
| 
 | 
 | ||||||
|  | rehype-parse@^3.0.0: | ||||||
|  |   version "3.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-3.1.0.tgz#7f5227a597a3f39fc4b938646161539c444ee728" | ||||||
|  |   dependencies: | ||||||
|  |     hast-util-from-parse5 "^1.0.0" | ||||||
|  |     parse5 "^2.1.5" | ||||||
|  |     xtend "^4.0.1" | ||||||
|  | 
 | ||||||
|  | rehype-stringify@^3.0.0: | ||||||
|  |   version "3.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-3.0.0.tgz#9fef0868213c2dce2f780b76f3d0488c85e819eb" | ||||||
|  |   dependencies: | ||||||
|  |     hast-util-to-html "^3.0.0" | ||||||
|  |     xtend "^4.0.1" | ||||||
|  | 
 | ||||||
|  | rehype@^4.0.0: | ||||||
|  |   version "4.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/rehype/-/rehype-4.0.0.tgz#2ed92dd269bfa549f7108fd2c4f6f626d27c7be4" | ||||||
|  |   dependencies: | ||||||
|  |     rehype-parse "^3.0.0" | ||||||
|  |     rehype-stringify "^3.0.0" | ||||||
|  |     unified "^6.0.0" | ||||||
|  | 
 | ||||||
| relateurl@0.2.x: | relateurl@0.2.x: | ||||||
|   version "0.2.7" |   version "0.2.7" | ||||||
|   resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" |   resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user