mirror of
				https://github.com/KevinMidboe/inline-html.git
				synced 2025-10-29 17:40:29 +00:00 
			
		
		
		
	Initial commit.
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| node_modules | ||||
| test/test.html | ||||
							
								
								
									
										68
									
								
								lib/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								lib/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| var co = require('co'); | ||||
| var inlineLess = require('inline-less'); | ||||
| var inlineCssUrl = require('inline-css-url'); | ||||
| var cheerio = require('cheerio'); | ||||
| var string = require('string'); | ||||
| var fs = require('mz/fs'); | ||||
|  | ||||
| // TODO refactor into separate module | ||||
| // inline html images | ||||
| var localPath = require('local-path'); | ||||
| var datauri = require('datauri'); | ||||
| var path = require('path'); | ||||
| var inlineImg = function (html, filePath) { | ||||
| 	var basedir = path.dirname(filePath); | ||||
| 	var $ = cheerio.load(html); | ||||
| 	var images = $('img').filter(function (index, element) { | ||||
| 		return localPath($(element).attr('src')); | ||||
| 	}); | ||||
| 	images.each(function (index, element) { | ||||
| 		var src = $(element).attr('src'); | ||||
| 		var filePath = path.resolve(basedir, src); | ||||
| 		src = datauri(filePath); | ||||
| 		$(element).attr('src', src); | ||||
| 	}); | ||||
| 	return $.html(); | ||||
| }; | ||||
|  | ||||
| // TODO refactor into separate module | ||||
| // inline html url css data types | ||||
| var inlineUrl = function (html, filePath) { | ||||
| 	var $ = cheerio.load(html); | ||||
| 	// style elements | ||||
| 	var styles = $('style'); | ||||
| 	styles.each(function (index, element) { | ||||
| 		var css = $(element).html(); | ||||
| 		css = inlineCssUrl(css, filePath); | ||||
| 		$(element).html(css); | ||||
| 	}); | ||||
| 	// style attributes | ||||
| 	var attributes = $('body *').filter('[style]'); | ||||
| 	attributes.each(function (index, element) { | ||||
| 		var css = $(element).attr('style'); | ||||
| 		var prefix = 'element {'; | ||||
| 		var suffix = '}'; | ||||
| 		css = prefix + css + suffix; | ||||
| 		css = inlineCssUrl(css, filePath); | ||||
| 		css = string(css).collapseWhitespace().toString(); | ||||
| 		css = css.replace(new RegExp('^' + prefix + '\\s*(.*)\\s+' + suffix + '$'), '$1'); | ||||
| 		$(element).attr('style', css); | ||||
| 	}); | ||||
| 	return $.html(); | ||||
| }; | ||||
|  | ||||
| var inline = co.wrap(function * (filePath, options) { | ||||
| 	var html = yield fs.readFile(filePath, 'utf8'); | ||||
| 	// inline links: less | ||||
| 	html = yield inlineLess(html, filePath, options); | ||||
| 	// TODO inline links: css | ||||
| 	// TODO inline scripts (js + browserify? = scriptify) | ||||
|  | ||||
| 	// Inline local assets (path -> datauri) | ||||
| 	html = inlineUrl(html, filePath); | ||||
| 	html = inlineImg(html, filePath); | ||||
| 	// svg? | ||||
|  | ||||
| 	return html; | ||||
| }); | ||||
| module.exports = inline; | ||||
							
								
								
									
										21
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| { | ||||
|   "name": "inline-html", | ||||
|   "version": "0.0.0", | ||||
|   "description": "", | ||||
|   "main": "lib/index.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "", | ||||
|   "license": "ISC", | ||||
|   "dependencies": { | ||||
|     "cheerio": "^0.19.0", | ||||
|     "co": "^4.6.0", | ||||
|     "datauri": "^0.7.1", | ||||
|     "inline-css-url": "file:../inline-css-url", | ||||
|     "inline-less": "file:../inline-less", | ||||
|     "local-path": "file:../local-path", | ||||
|     "mz": "^2.0.0", | ||||
|     "string": "^3.3.0" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										8
									
								
								test/assets/imported.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								test/assets/imported.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| body { | ||||
|     border: solid 4px green; | ||||
| } | ||||
| #import { | ||||
|     background-image: url('./person.png'); | ||||
|     background-size: contain; | ||||
|     background-repeat: no-repeat; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								test/assets/person.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								test/assets/person.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 5.7 KiB | 
							
								
								
									
										25
									
								
								test/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								test/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| <!doctype html> | ||||
| <html> | ||||
| <head> | ||||
|     <style> | ||||
|         div { | ||||
|             padding-left: 2em; | ||||
|         } | ||||
|     </style> | ||||
|     <link rel="stylesheet/less" href="main.less"/> | ||||
|     <style> | ||||
|         #style { | ||||
|             background-image: url('./assets/person.png'); | ||||
|             background-size: contain; | ||||
|             background-repeat: no-repeat; | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
| <body> | ||||
|     <div id="link">Link</div> | ||||
|     <div id="import">Import</div> | ||||
|     <div id="style">Style</div> | ||||
|     <div id="attribute" style="background-image: url('./assets/person.png'); background-size: contain; background-repeat: no-repeat;">Attribute</div> | ||||
|     <img height="32px" width="32px" src="./assets/person.png"/>Image | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										15
									
								
								test/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								test/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| var inline = require('../lib'); | ||||
| var path = require('path'); | ||||
| var fs = require('fs'); | ||||
|  | ||||
| var filepath = path.resolve(__dirname, './index.html'); | ||||
| var options = {}; | ||||
| /** | ||||
|  * html -> async -> inlined html | ||||
|  */ | ||||
| inline(filepath, options) | ||||
| 	.then(function (html) { | ||||
| 		console.log(html); | ||||
| 		fs.writeFileSync('./test.html', html); | ||||
| 	}) | ||||
| 	.catch(console.error); | ||||
							
								
								
									
										7
									
								
								test/main.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								test/main.less
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| @import (less) './assets/imported.css'; | ||||
|  | ||||
| #link { | ||||
|     background-image: url('assets/person.png'); | ||||
|     background-size: contain; | ||||
|     background-repeat: no-repeat; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user