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');
							 |