139 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			139 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | var fs = require('fs'); | ||
|  | var path = require('path'); | ||
|  | var sortKeys = require('sort-keys'); | ||
|  | // var Rx = require('rx');
 | ||
|  | 
 | ||
|  | // var langTagRegex = /^[a-z]{2,3}(?:-[A-Z]{2,3}(?:-[a-zA-Z]{4})?)?$/;
 | ||
|  | var translationRegex = /(description|title)([a-zA-Z]{2,4})/i; | ||
|  | var oldNameRegex = /name([a-zA-Z]{2,4})/i; | ||
|  | function hasOldTranslation(key) { | ||
|  |   return translationRegex.test(key) || oldNameRegex.test(key); | ||
|  | } | ||
|  | 
 | ||
|  | function normalizeLangTag(tag) { | ||
|  |   return tag.slice(0, 2).toLowerCase() + ( | ||
|  |     tag.length > 2 ? '-' + tag.slice(2).toUpperCase() : '' | ||
|  |   ); | ||
|  | } | ||
|  | 
 | ||
|  | function sortTranslationsKeys(translations) { | ||
|  |   Object.keys(translations) | ||
|  |     .forEach(function(key) { | ||
|  |       if (Object.keys(translations[key]).length > 2) { | ||
|  |         console.log('keys', Object.keys(translations[key])); | ||
|  |         throw new Error('Unknown keys'); | ||
|  |       } | ||
|  |     }); | ||
|  |   var _translations = Object.keys(translations) | ||
|  |     .reduce(function(_translations, key) { | ||
|  |       _translations[key] = sortKeys(translations[key], { | ||
|  |         compare: function(a, b) { | ||
|  |           return b > a; | ||
|  |         } | ||
|  |       }); | ||
|  |       _translations[key] = Object.keys(_translations[key]) | ||
|  |         .reduce(function(translation, _key) { | ||
|  |           translation[_key.toLowerCase()] = _translations[key][_key]; | ||
|  |           return translation; | ||
|  |         }, {}); | ||
|  |       return _translations; | ||
|  |     }, {}); | ||
|  |   return sortKeys(_translations); | ||
|  | } | ||
|  | 
 | ||
|  | function createNewTranslations(challenge) { | ||
|  |   return Object.keys(challenge) | ||
|  |     .filter(hasOldTranslation) | ||
|  |     .reduce(function(translations, oldKey) { | ||
|  |       var matches, tag, newTranslation; | ||
|  |       if (translationRegex.test(oldKey)) { | ||
|  |         matches = oldKey.match(translationRegex); | ||
|  |         tag = normalizeLangTag(matches[2]); | ||
|  |         newTranslation = {}; | ||
|  |         newTranslation[matches[1]] = challenge[oldKey]; | ||
|  |         translations[tag] = translations[tag] ? | ||
|  |           Object.assign({}, translations[tag], newTranslation) : | ||
|  |           Object.assign({}, newTranslation); | ||
|  |         return translations; | ||
|  |       } | ||
|  |       matches = oldKey.match(oldNameRegex); | ||
|  |       tag = normalizeLangTag(matches[1]); | ||
|  |       newTranslation = { title: challenge[oldKey] }; | ||
|  |       translations[tag] = translations[tag] ? | ||
|  |         Object.assign({}, translations[tag], newTranslation) : | ||
|  |         Object.assign({}, newTranslation); | ||
|  |       return translations; | ||
|  |     }, {}); | ||
|  | } | ||
|  | 
 | ||
|  | function normalizeChallenge(challenge) { | ||
|  |   var keys = Object.keys(challenge); | ||
|  |   challenge.translations = challenge.translations || {}; | ||
|  |   var hasOldTranslations = keys.some(hasOldTranslation); | ||
|  |   if (hasOldTranslations) { | ||
|  |     challenge.translations = Object.assign( | ||
|  |       {}, | ||
|  |       challenge.translations, | ||
|  |       createNewTranslations(challenge) | ||
|  |     ); | ||
|  |   } | ||
|  |   challenge.translations = sortTranslationsKeys(challenge.translations); | ||
|  |   // remove old translations from the top level
 | ||
|  |   return Object.keys(challenge) | ||
|  |     .filter(function(key) { return !hasOldTranslation(key); }) | ||
|  |     .reduce(function(newChallenge, key) { | ||
|  |       newChallenge[key] = challenge[key]; | ||
|  |       return newChallenge; | ||
|  |     }, {}); | ||
|  | } | ||
|  | 
 | ||
|  | function normalizeBlock(block) { | ||
|  |   block.challenges = block.challenges.map(normalizeChallenge); | ||
|  |   return block; | ||
|  | } | ||
|  | 
 | ||
|  | function getFilesForDir(dir) { | ||
|  |   return fs.readdirSync(path.join(__dirname, '/' + dir)) | ||
|  |     .map(function(file) { | ||
|  |       if (fs.statSync(path.join(__dirname, dir + '/' + file)).isFile()) { | ||
|  |         return { path: dir + '/' + file }; | ||
|  |       } | ||
|  |       return getFilesForDir(dir + '/' + file); | ||
|  |     }) | ||
|  |     .reduce(function(files, file) { | ||
|  |       if (!Array.isArray(file)) { | ||
|  |         files.push(file); | ||
|  |         return files; | ||
|  |       } | ||
|  |       return files.concat(file); | ||
|  |     }, []); | ||
|  | } | ||
|  | 
 | ||
|  | function normalize(dir) { | ||
|  |   return getFilesForDir(dir) | ||
|  |     .map(function(data) { | ||
|  |       return { | ||
|  |         path: data.path, | ||
|  |         block: require(path.join(__dirname, data.path)) | ||
|  |       }; | ||
|  |     }) | ||
|  |     .map(function(data) { | ||
|  |       return { | ||
|  |         path: data.path, | ||
|  |         block: normalizeBlock(data.block) | ||
|  |       }; | ||
|  |     }) | ||
|  |     .forEach(function(data) { | ||
|  |       var file = JSON.stringify(data.block, null, 2); | ||
|  |       if (/[^\n]$/.test(file)) { | ||
|  |         file = file + '\n'; | ||
|  |       } | ||
|  |       fs.writeFileSync( | ||
|  |         path.join(__dirname, '/', data.path), | ||
|  |         file | ||
|  |       ); | ||
|  |     }); | ||
|  | } | ||
|  | 
 | ||
|  | normalize('challenges'); |