80 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var hasOwnProperty = Object.prototype.hasOwnProperty;
 | |
| 
 | |
| function buildMap(list, caseInsensitive) {
 | |
|     var map = Object.create(null);
 | |
| 
 | |
|     if (!Array.isArray(list)) {
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     for (var i = 0; i < list.length; i++) {
 | |
|         var name = list[i];
 | |
| 
 | |
|         if (caseInsensitive) {
 | |
|             name = name.toLowerCase();
 | |
|         }
 | |
| 
 | |
|         map[name] = true;
 | |
|     }
 | |
| 
 | |
|     return map;
 | |
| }
 | |
| 
 | |
| function buildList(data) {
 | |
|     if (!data) {
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     var tags = buildMap(data.tags, true);
 | |
|     var ids = buildMap(data.ids);
 | |
|     var classes = buildMap(data.classes);
 | |
| 
 | |
|     if (tags === null &&
 | |
|         ids === null &&
 | |
|         classes === null) {
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     return {
 | |
|         tags: tags,
 | |
|         ids: ids,
 | |
|         classes: classes
 | |
|     };
 | |
| }
 | |
| 
 | |
| function buildIndex(data) {
 | |
|     var scopes = false;
 | |
| 
 | |
|     if (data.scopes && Array.isArray(data.scopes)) {
 | |
|         scopes = Object.create(null);
 | |
| 
 | |
|         for (var i = 0; i < data.scopes.length; i++) {
 | |
|             var list = data.scopes[i];
 | |
| 
 | |
|             if (!list || !Array.isArray(list)) {
 | |
|                 throw new Error('Wrong usage format');
 | |
|             }
 | |
| 
 | |
|             for (var j = 0; j < list.length; j++) {
 | |
|                 var name = list[j];
 | |
| 
 | |
|                 if (hasOwnProperty.call(scopes, name)) {
 | |
|                     throw new Error('Class can\'t be used for several scopes: ' + name);
 | |
|                 }
 | |
| 
 | |
|                 scopes[name] = i + 1;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return {
 | |
|         whitelist: buildList(data),
 | |
|         blacklist: buildList(data.blacklist),
 | |
|         scopes: scopes
 | |
|     };
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|     buildIndex: buildIndex
 | |
| };
 |