mirror of
				https://github.com/elyby/accounts-frontend.git
				synced 2025-05-31 14:11:58 +05:30 
			
		
		
		
	Возможность импортить классы иконок через sass
This commit is contained in:
		| @@ -44,7 +44,6 @@ | |||||||
|     "eslint": "^1.10.3", |     "eslint": "^1.10.3", | ||||||
|     "eslint-plugin-react": "^3.13.1", |     "eslint-plugin-react": "^3.13.1", | ||||||
|     "extract-text-webpack-plugin": "^0.9.1", |     "extract-text-webpack-plugin": "^0.9.1", | ||||||
|     "fontgen-loader": "^0.1.9", |  | ||||||
|     "html-webpack-plugin": "^1.7.0", |     "html-webpack-plugin": "^1.7.0", | ||||||
|     "imports-loader": "^0.6.4", |     "imports-loader": "^0.6.4", | ||||||
|     "karma": "*", |     "karma": "*", | ||||||
|   | |||||||
| @@ -1,12 +0,0 @@ | |||||||
| import icons from 'icons.font.json'; |  | ||||||
|  |  | ||||||
| const baseClass = 'icon'; |  | ||||||
|  |  | ||||||
| export default Object.keys(icons) |  | ||||||
|     .filter((icon) => icon !== baseClass) |  | ||||||
|     .reduce((acc, icon) => { |  | ||||||
|         acc[icon.replace(`${baseClass}-`, '')] = `${icons[baseClass]} ${icons[icon]}`; |  | ||||||
|  |  | ||||||
|         return acc; |  | ||||||
|     }, {}) |  | ||||||
|     ; |  | ||||||
							
								
								
									
										10
									
								
								src/components/ui/icons.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/components/ui/icons.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | @import '~icons.font.json'; | ||||||
|  |  | ||||||
|  | .arrowLeft { | ||||||
|  |     composes: arrow; | ||||||
|  |  | ||||||
|  |     display: inline-block; | ||||||
|  |     transform: rotate(90deg); | ||||||
|  |  | ||||||
|  |     font-size: 24px; | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								src/icons.css.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/icons.css.hbs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | @font-face { | ||||||
|  | 	font-family: "{{fontName}}"; | ||||||
|  | 	src: {{{src}}}; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .{{baseClass}} { | ||||||
|  | 	line-height: 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .{{baseClass}}:before { | ||||||
|  | 	font-family: {{fontName}} !important; | ||||||
|  | 	font-style: normal; | ||||||
|  | 	font-weight: normal !important; | ||||||
|  | 	vertical-align: top; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | {{#each codepoints}} | ||||||
|  | .{{../classPrefix}}{{@key}} { | ||||||
|  |     composes: {{../baseClass}}; | ||||||
|  |  | ||||||
|  |     &:before { | ||||||
|  |         content: "\\{{this}}"; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | {{/each}} | ||||||
| @@ -1,6 +1,9 @@ | |||||||
| { | { | ||||||
|     "files": ["icons/webfont/*"], |     "files": ["icons/webfont/*"], | ||||||
|  |     "fileName": "[fontname][ext]", | ||||||
|     "fontName": "ely-account-icons", |     "fontName": "ely-account-icons", | ||||||
|  |     "cssTemplate": "icons.css.hbs", | ||||||
|  |     "classPrefix": "", | ||||||
|     "fixedWidth": true, |     "fixedWidth": true, | ||||||
|     "normalize": true |     "normalize": true | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,10 +1,12 @@ | |||||||
| /* eslint-env node */ | /* eslint-env node */ | ||||||
|  |  | ||||||
| var path = require('path'); | var path = require('path'); | ||||||
|  |  | ||||||
| var webpack = require('webpack'); | var webpack = require('webpack'); | ||||||
| var ExtractTextPlugin = require('extract-text-webpack-plugin'); | var ExtractTextPlugin = require('extract-text-webpack-plugin'); | ||||||
| var HtmlWebpackPlugin = require('html-webpack-plugin'); | var HtmlWebpackPlugin = require('html-webpack-plugin'); | ||||||
| var cssnano = require('cssnano'); | var cssnano = require('cssnano'); | ||||||
|  | var iconfontImporter = require('./webpack/node-sass-iconfont-importer'); | ||||||
|  |  | ||||||
| const API_HOST = 'http://account.l'; | const API_HOST = 'http://account.l'; | ||||||
|  |  | ||||||
| @@ -21,8 +23,6 @@ var isTest = process.argv.some(function(arg) { | |||||||
|     return arg.indexOf('karma') !== -1; |     return arg.indexOf('karma') !== -1; | ||||||
| }); | }); | ||||||
|  |  | ||||||
| const CSS_LOADER = 'style!css?modules&importLoaders=2&localIdentName=[path][name]-[local]!postcss'; |  | ||||||
|  |  | ||||||
| var webpackConfig = { | var webpackConfig = { | ||||||
|     entry: { |     entry: { | ||||||
|         app: path.join(__dirname, 'src'), |         app: path.join(__dirname, 'src'), | ||||||
| @@ -66,6 +66,7 @@ var webpackConfig = { | |||||||
|     devtool: isTest ? 'inline-source-map' : 'eval', |     devtool: isTest ? 'inline-source-map' : 'eval', | ||||||
|  |  | ||||||
|     plugins: [ |     plugins: [ | ||||||
|  |         new iconfontImporter.Plugin(), | ||||||
|         new webpack.DefinePlugin({ |         new webpack.DefinePlugin({ | ||||||
|             'process.env': { |             'process.env': { | ||||||
|                 NODE_ENV: JSON.stringify(isProduction ? 'production' : 'dev') |                 NODE_ENV: JSON.stringify(isProduction ? 'production' : 'dev') | ||||||
| @@ -96,7 +97,7 @@ var webpackConfig = { | |||||||
|             { |             { | ||||||
|                 test: /\.scss$/, |                 test: /\.scss$/, | ||||||
|                 extractInProduction: true, |                 extractInProduction: true, | ||||||
|                 loader: CSS_LOADER + '!sass' |                 loader: 'style!css?modules&localIdentName=[path][name]-[local]!postcss!sass' | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|                 test: /\.jsx?$/, |                 test: /\.jsx?$/, | ||||||
| @@ -106,15 +107,17 @@ var webpackConfig = { | |||||||
|                     presets: ['react', 'es2015', 'stage-0'], |                     presets: ['react', 'es2015', 'stage-0'], | ||||||
|                     plugins: ['transform-runtime', ['react-intl', {messagesDir: './dist/messages/'}]] |                     plugins: ['transform-runtime', ['react-intl', {messagesDir: './dist/messages/'}]] | ||||||
|                 } |                 } | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 test: /\.font.(js|json)$/, |  | ||||||
|                 extractInProduction: true, |  | ||||||
|                 loader: CSS_LOADER + '!fontgen?types=woff,eot,ttf' |  | ||||||
|             } |             } | ||||||
|         ] |         ] | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     sassLoader: { | ||||||
|  |         importer: iconfontImporter({ | ||||||
|  |             test: /\.font.(js|json)$/, | ||||||
|  |             types: ['woff', 'eot', 'ttf'] | ||||||
|  |         }) | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     postcss: [ |     postcss: [ | ||||||
|         cssnano({ |         cssnano({ | ||||||
|             sourcemap: !isProduction, |             sourcemap: !isProduction, | ||||||
|   | |||||||
							
								
								
									
										217
									
								
								webpack/node-sass-iconfont-importer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								webpack/node-sass-iconfont-importer.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,217 @@ | |||||||
|  | var path = require("path"); | ||||||
|  |  | ||||||
|  | var glob = require('glob'); | ||||||
|  | var loaderUtils = require("loader-utils"); | ||||||
|  | var fontgen = require("webfonts-generator"); | ||||||
|  |  | ||||||
|  | module.exports = function createImporter(options) { | ||||||
|  |     return function(url, fileContext, done) { | ||||||
|  |         if (options.test.test(url)) { | ||||||
|  |             var context = this.options.includePaths; | ||||||
|  |             var request = loaderUtils.urlToRequest(url); | ||||||
|  |  | ||||||
|  |             compiler.resolvers.normal.resolve(context, request, function(err, resourcePath) { | ||||||
|  |                 if (err) return done(new Error(err)); | ||||||
|  |  | ||||||
|  |                 var context = path.dirname(resourcePath); | ||||||
|  |                 var config = require(resourcePath); | ||||||
|  |  | ||||||
|  |                 generate( | ||||||
|  |                     config, | ||||||
|  |                     options, | ||||||
|  |                     resourcePath, | ||||||
|  |                     context, | ||||||
|  |                     function(err, content) { | ||||||
|  |                         if (err) return done(new Error(err)); | ||||||
|  |  | ||||||
|  |                         done({ | ||||||
|  |                             contents: content | ||||||
|  |                         }); | ||||||
|  |                     } | ||||||
|  |                 ); | ||||||
|  |             }); | ||||||
|  |         } else { | ||||||
|  |             done(false); | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | var Plugin = module.exports.Plugin = function() {}; | ||||||
|  |  | ||||||
|  | Plugin.prototype.apply = function(compiler) { | ||||||
|  |     setCompiler(compiler); // inject compiler to use in importer | ||||||
|  |  | ||||||
|  |     compiler.plugin("emit", function(compilation, callback) { | ||||||
|  |         Object.keys(emitQueue).forEach(function(url) { | ||||||
|  |             compilation.assets[url] = emitQueue[url]; | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         callback(); | ||||||
|  |     }); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | var compiler; | ||||||
|  |  | ||||||
|  | function setCompiler(instance) { | ||||||
|  |     // inject compiler instance for importer function | ||||||
|  |     compiler = instance; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var emitQueue = {}; | ||||||
|  | var RawSource = require('webpack-sources').RawSource; | ||||||
|  | function emitFile(url, content) { | ||||||
|  |     // TODO: support multiple plugin instances? | ||||||
|  |     emitQueue[url] = new RawSource(content); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Partially modified code of fontgen goes next | ||||||
|  |  */ | ||||||
|  | var mimeTypes = { | ||||||
|  |     'eot': 'application/vnd.ms-fontobject', | ||||||
|  |     'svg': 'image/svg+xml', | ||||||
|  |     'ttf': 'application/x-font-ttf', | ||||||
|  |     'woff': 'application/font-woff' | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | function absolute(from, to) { | ||||||
|  |     if (arguments.length < 2) { | ||||||
|  |         return function (to) { | ||||||
|  |             return path.resolve(from, to); | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  |     return path.resolve(from, to); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function getFilesAndDeps(patterns, context) { | ||||||
|  |     var files = []; | ||||||
|  |     var filesDeps = []; | ||||||
|  |     var directoryDeps = []; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     function addFile(file) { | ||||||
|  |         filesDeps.push(file); | ||||||
|  |         files.push(absolute(context, file)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function addByGlob(globExp) { | ||||||
|  |         var globOptions = {cwd: context}; | ||||||
|  |  | ||||||
|  |         var foundFiles = glob.sync(globExp, globOptions); | ||||||
|  |         files = files.concat(foundFiles.map(absolute(context))); | ||||||
|  |  | ||||||
|  |         var globDirs = glob.sync(path.dirname(globExp) + '/', globOptions); | ||||||
|  |         directoryDeps = directoryDeps.concat(globDirs.map(absolute(context))); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Re-work the files array. | ||||||
|  |     patterns.forEach(function (pattern) { | ||||||
|  |         if (glob.hasMagic(pattern)) { | ||||||
|  |             addByGlob(pattern); | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             addFile(pattern); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     return { | ||||||
|  |         files: files, | ||||||
|  |         dependencies: { | ||||||
|  |             directories: directoryDeps, | ||||||
|  |             files: filesDeps | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function generate(config, params, resourcePath, context, cb) { | ||||||
|  |     config.__dirname = path.dirname(resourcePath); | ||||||
|  |  | ||||||
|  |     var filesAndDeps = getFilesAndDeps(config.files, context); | ||||||
|  |     config.files = filesAndDeps.files; | ||||||
|  |  | ||||||
|  |     // With everything set up, let's make an ACTUAL config. | ||||||
|  |     var formats = params.types || ['eot', 'woff', 'ttf', 'svg']; | ||||||
|  |     if (formats.constructor !== Array) { | ||||||
|  |         formats = [formats]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     var fontconf = { | ||||||
|  |         files: config.files, | ||||||
|  |         fontName: config.fontName, | ||||||
|  |         types: formats, | ||||||
|  |         order: formats, | ||||||
|  |         fontHeight: config.fontHeight || 1000, // Fixes conversion issues with small svgs | ||||||
|  |         templateOptions: { | ||||||
|  |             baseClass: config.baseClass || "icon", | ||||||
|  |             classPrefix: 'classPrefix' in config ? config.classPrefix : "icon-" | ||||||
|  |         }, | ||||||
|  |         rename: (typeof config.rename == "function" ? config.rename : function (f) { | ||||||
|  |             return path.basename(f, ".svg"); | ||||||
|  |         }), | ||||||
|  |         dest: "", | ||||||
|  |         writeFiles: false | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     if (config.cssTemplate) { | ||||||
|  |         fontconf.cssTemplate = absolute(context, config.cssTemplate); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (var option in config.templateOptions) { | ||||||
|  |         if (config.templateOptions.hasOwnProperty(option)) { | ||||||
|  |             fontconf.templateOptions[option] = config.templateOptions[option]; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // svgicons2svgfont stuff | ||||||
|  |     var keys = [ | ||||||
|  |         "fixedWidth", | ||||||
|  |         "centerHorizontally", | ||||||
|  |         "normalize", | ||||||
|  |         "fontHeight", | ||||||
|  |         "round", | ||||||
|  |         "descent" | ||||||
|  |     ]; | ||||||
|  |     for (var x in keys) { | ||||||
|  |         if (typeof config[keys[x]] != "undefined") { | ||||||
|  |             fontconf[keys[x]] = config[keys[x]]; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     var pub = compiler.options.output.publicPath || '/'; | ||||||
|  |     var embed = !!params.embed; | ||||||
|  |  | ||||||
|  |     fontgen(fontconf, function (err, res) { | ||||||
|  |         if (err) { | ||||||
|  |             return cb(err); | ||||||
|  |         } | ||||||
|  |         var urls = {}; | ||||||
|  |         for (var i in formats) { | ||||||
|  |             var format = formats[i]; | ||||||
|  |             if (!embed) { | ||||||
|  |                 var filename = config.fileName || params.fileName || "[hash]-[fontname][ext]"; | ||||||
|  |                 filename = filename | ||||||
|  |                   .replace("[fontname]", fontconf.fontName) | ||||||
|  |                   .replace("[ext]", "." + format); | ||||||
|  |                 var url = loaderUtils.interpolateName(this, | ||||||
|  |                   filename, | ||||||
|  |                   { | ||||||
|  |                       context: params.context || this.context, | ||||||
|  |                       content: res[format] | ||||||
|  |                   } | ||||||
|  |                 ); | ||||||
|  |                 urls[format] = path.join(pub, url).replace(/\\/g, '/'); | ||||||
|  |                 emitFile(url, res[format]); | ||||||
|  |             } else { | ||||||
|  |                 urls[format] = 'data:' | ||||||
|  |                   + mimeTypes[format] | ||||||
|  |                   + ';charset=utf-8;base64,' | ||||||
|  |                   + (new Buffer(res[format]).toString('base64')); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         cb(null, res.generateCss(urls)); | ||||||
|  |     }); | ||||||
|  | }; | ||||||
							
								
								
									
										13
									
								
								webpack/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								webpack/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "name": "webpack", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "description": "", | ||||||
|  |   "keywords": [], | ||||||
|  |   "author": "", | ||||||
|  |   "dependencies": { | ||||||
|  |     "glob": "^6.0.3", | ||||||
|  |     "loader-utils": "^0.2.12", | ||||||
|  |     "webfonts-generator": "^0.3.1", | ||||||
|  |     "webpack-sources": "^0.1.0" | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user