mirror of
				https://github.com/skishore/makemeahanzi.git
				synced 2025-11-04 06:32:58 +08:00 
			
		
		
		
	Add glyph migration script
This commit is contained in:
		@ -7,6 +7,7 @@ const CHARACTER_FIELDS = ['character', 'decomposition', 'definition',
 | 
				
			|||||||
this.cjklib = {
 | 
					this.cjklib = {
 | 
				
			||||||
  characters: {},
 | 
					  characters: {},
 | 
				
			||||||
  gb2312: {},
 | 
					  gb2312: {},
 | 
				
			||||||
 | 
					  promise: undefined,
 | 
				
			||||||
  radicals: {
 | 
					  radicals: {
 | 
				
			||||||
    primary_radical: {},
 | 
					    primary_radical: {},
 | 
				
			||||||
    index_to_radical_map: {},
 | 
					    index_to_radical_map: {},
 | 
				
			||||||
@ -214,7 +215,7 @@ Meteor.startup(() => {
 | 
				
			|||||||
      readFile('unihan/Unihan_RadicalStrokeCounts.txt').then(getUnihanRows);
 | 
					      readFile('unihan/Unihan_RadicalStrokeCounts.txt').then(getUnihanRows);
 | 
				
			||||||
  const readings = readFile('unihan/Unihan_Readings.txt').then(getUnihanRows);
 | 
					  const readings = readFile('unihan/Unihan_Readings.txt').then(getUnihanRows);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Promise.all([
 | 
					  cjklib.promise = Promise.all([
 | 
				
			||||||
      // Per-character data.
 | 
					      // Per-character data.
 | 
				
			||||||
      fillDecompositions(decomposition, glyphs,
 | 
					      fillDecompositions(decomposition, glyphs,
 | 
				
			||||||
                         cjklib.characters.decomposition),
 | 
					                         cjklib.characters.decomposition),
 | 
				
			||||||
@ -229,5 +230,6 @@ Meteor.startup(() => {
 | 
				
			|||||||
                                cjklib.radicals.radical_to_character_map),
 | 
					                                cjklib.radicals.radical_to_character_map),
 | 
				
			||||||
      // Extract the list of characters in the GB2312 character set.
 | 
					      // Extract the list of characters in the GB2312 character set.
 | 
				
			||||||
      readFile('gb2312').then((data) => fillGB2312(data, cjklib.gb2312)),
 | 
					      readFile('gb2312').then((data) => fillGB2312(data, cjklib.gb2312)),
 | 
				
			||||||
  ]).then(cleanupCJKLibData).catch(console.error.bind(console));
 | 
					  ]).then(cleanupCJKLibData);
 | 
				
			||||||
 | 
					  cjklib.promise.catch(console.error.bind(console));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
				
			|||||||
@ -13,13 +13,16 @@ Glyphs.get_svg_path = function(glyph) {
 | 
				
			|||||||
  var terms = [];
 | 
					  var terms = [];
 | 
				
			||||||
  for (var i = 0; i < glyph.path.length; i++) {
 | 
					  for (var i = 0; i < glyph.path.length; i++) {
 | 
				
			||||||
    var segment = glyph.path[i];
 | 
					    var segment = glyph.path[i];
 | 
				
			||||||
 | 
					    assert('LMQZ'.indexOf(segment.type) >= 0, segment.type);
 | 
				
			||||||
    terms.push(segment.type);
 | 
					    terms.push(segment.type);
 | 
				
			||||||
    if (segment.x1 !== undefined) {
 | 
					    if (segment.x1 !== undefined) {
 | 
				
			||||||
      terms.push(segment.x1);
 | 
					      terms.push(segment.x1);
 | 
				
			||||||
      terms.push(segment.y1);
 | 
					      terms.push(segment.y1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (segment.x !== undefined) {
 | 
				
			||||||
      terms.push(segment.x);
 | 
					      terms.push(segment.x);
 | 
				
			||||||
      terms.push(segment.y);
 | 
					      terms.push(segment.y);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  return terms.join(' ');
 | 
					  return terms.join(' ');
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -54,8 +54,3 @@ Meteor.methods({
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					 | 
				
			||||||
Meteor.startup(function() {
 | 
					 | 
				
			||||||
  Glyphs._ensureIndex({name: 1}, {unique: true});
 | 
					 | 
				
			||||||
  Glyphs._ensureIndex({'manual.verified': 1});
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										48
									
								
								server/migration.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								server/migration.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					// Given an old-form glyph entry, returns the new glyph entry.
 | 
				
			||||||
 | 
					migrate_glyph = (glyph) => {
 | 
				
			||||||
 | 
					  const codepoint = parseInt(glyph.name.substr(3), 16);
 | 
				
			||||||
 | 
					  const character = String.fromCodePoint(codepoint);
 | 
				
			||||||
 | 
					  const data = cjklib.getCharacterData(character);
 | 
				
			||||||
 | 
					  assert(glyph.manual.verified !== undefined);
 | 
				
			||||||
 | 
					  const result = {
 | 
				
			||||||
 | 
					    character: character,
 | 
				
			||||||
 | 
					    codepoint: codepoint,
 | 
				
			||||||
 | 
					    metadata: {
 | 
				
			||||||
 | 
					      definition: undefined,
 | 
				
			||||||
 | 
					      kangxi_index: data.kangxi_index,
 | 
				
			||||||
 | 
					      pinyin: undefined,
 | 
				
			||||||
 | 
					      strokes: undefined,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    stages: {
 | 
				
			||||||
 | 
					      path: Glyphs.get_svg_path(glyph),
 | 
				
			||||||
 | 
					      bridges: glyph.manual.bridges,
 | 
				
			||||||
 | 
					      strokes: glyph.derived.strokes,
 | 
				
			||||||
 | 
					      analysis: undefined,
 | 
				
			||||||
 | 
					      order: undefined,
 | 
				
			||||||
 | 
					      settled: undefined,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  assert(result.stages.path !== undefined);
 | 
				
			||||||
 | 
					  assert(result.stages.bridges !== undefined);
 | 
				
			||||||
 | 
					  assert(result.stages.strokes !== undefined);
 | 
				
			||||||
 | 
					  return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					migrate_glyphs = () => {
 | 
				
			||||||
 | 
					  const names = Glyphs.find({}, {fields: {name: 1}, sort: {name: 1}}).fetch();
 | 
				
			||||||
 | 
					  names.reverse();
 | 
				
			||||||
 | 
					  for (name of names) {
 | 
				
			||||||
 | 
					    const glyph = Glyphs.findOne({name: name.name});
 | 
				
			||||||
 | 
					    const migrated_glyph = migrate_glyph(glyph);
 | 
				
			||||||
 | 
					    Glyphs.insert(migrated_glyph);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  console.log('Migration complete.');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Meteor.startup(() => {
 | 
				
			||||||
 | 
					  //console.log('Running migration...');
 | 
				
			||||||
 | 
					  //cjklib.promise.then(Meteor.bindEnvironment(migrate_glyphs))
 | 
				
			||||||
 | 
					  //              .catch(console.error.bind(console));
 | 
				
			||||||
 | 
					  Glyphs._ensureIndex({character: 1}, {unique: true});
 | 
				
			||||||
 | 
					  Glyphs._ensureIndex({codepoint: 1}, {unique: true});
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
		Reference in New Issue
	
	Block a user