mirror of
				https://github.com/skishore/makemeahanzi.git
				synced 2025-11-04 14:37:38 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			246 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
/*
 | 
						|
Session.setDefault('editor.glyph', undefined);
 | 
						|
Session.setDefault('glyph.selected_point', undefined);
 | 
						|
 | 
						|
var COLORS = ['#0074D9', '#2ECC40', '#FFDC00', '#FF4136', '#7FDBFF',
 | 
						|
              '#001F3F', '#39CCCC', '#3D9970', '#01FF70', '#FF851B'];
 | 
						|
var DICTIONARY = 'http://www.archchinese.com/chinese_english_dictionary.html';
 | 
						|
 | 
						|
function change_glyph(method, argument) {
 | 
						|
  argument = argument || Session.get('editor.glyph');
 | 
						|
  Meteor.call(method, argument, function(err, data) {
 | 
						|
    Session.set('editor.glyph', data);
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
window.get_glyph = function(name) {
 | 
						|
  change_glyph('get_glyph', name);
 | 
						|
}
 | 
						|
 | 
						|
function contains(bridges, bridge) {
 | 
						|
  return remove_bridges(bridges, [bridge]).length < bridges.length;
 | 
						|
}
 | 
						|
 | 
						|
function remove_bridges(add, remove) {
 | 
						|
  var set = {};
 | 
						|
  for (var i = 0; i < remove.length; i++) {
 | 
						|
    set[to_line(remove[i]).coordinates] = true;
 | 
						|
    set[to_line([remove[i][1], remove[i][0]]).coordinates] = true;
 | 
						|
  }
 | 
						|
  return add.filter(function(x) { return !set[to_line(x).coordinates]; });
 | 
						|
}
 | 
						|
 | 
						|
function to_line(pairs) {
 | 
						|
  return {
 | 
						|
    x1: pairs[0][0],
 | 
						|
    y1: pairs[0][1],
 | 
						|
    x2: pairs[1][0],
 | 
						|
    y2: pairs[1][1],
 | 
						|
    coordinates: pairs[0].join(',') + ',' + pairs[1].join(','),
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
function to_point(pair) {
 | 
						|
  return {x: pair[0], y: pair[1], coordinates: pair.join(',')};
 | 
						|
}
 | 
						|
 | 
						|
var bindings = {
 | 
						|
  'w': function() {
 | 
						|
    if (!EDIT_STROKES) {
 | 
						|
      var glyph = Session.get('editor.glyph');
 | 
						|
      var character = String.fromCodePoint(parseInt(glyph.name.substr(3), 16));
 | 
						|
      window.open(DICTIONARY + '?find=' + character, '_blank').focus();
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    if (Session.get('glyph.show_strokes')) {
 | 
						|
      Session.set('glyph.show_strokes', false);
 | 
						|
      Session.set('glyph.selected_point', undefined);
 | 
						|
      var glyph = Session.get('editor.glyph');
 | 
						|
      glyph.manual.verified = false;
 | 
						|
      change_glyph('save_glyph', glyph);
 | 
						|
    } else {
 | 
						|
      var glyph = Session.get('editor.glyph');
 | 
						|
      delete glyph.manual;
 | 
						|
      Session.set('editor.glyph', fill_glyph_fields(glyph));
 | 
						|
    }
 | 
						|
  },
 | 
						|
  'a': function() {
 | 
						|
    change_glyph('get_previous_glyph');
 | 
						|
  },
 | 
						|
  'A': function() {
 | 
						|
    change_glyph('get_previous_glyph_skip_verified');
 | 
						|
  },
 | 
						|
  's': function() {
 | 
						|
    if (!EDIT_STROKES) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    var glyph = Session.get('editor.glyph');
 | 
						|
    if (!Session.get('glyph.show_strokes')) {
 | 
						|
      Session.set('glyph.show_strokes', true);
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    if (glyph.manual.verified || !has_errors(glyph)) {
 | 
						|
      glyph.manual.verified = !glyph.manual.verified;
 | 
						|
      change_glyph('save_glyph', glyph);
 | 
						|
    }
 | 
						|
  },
 | 
						|
  'd': function() {
 | 
						|
    change_glyph('get_next_glyph');
 | 
						|
  },
 | 
						|
  'D': function() {
 | 
						|
    change_glyph('get_next_glyph_skip_verified');
 | 
						|
  },
 | 
						|
};
 | 
						|
 | 
						|
Template.controls.helpers({
 | 
						|
  w_button_name: function() {
 | 
						|
    if (!EDIT_STROKES) {
 | 
						|
      return 'Check';
 | 
						|
    }
 | 
						|
    return Session.get('glyph.show_strokes') ? 'Edit' : 'Reset';
 | 
						|
  },
 | 
						|
  s_button_name: function() {
 | 
						|
    return '(Error)';
 | 
						|
    if (!Session.get('glyph.show_strokes')) {
 | 
						|
      return 'View';
 | 
						|
    }
 | 
						|
    var glyph = Session.get('glyph.data');
 | 
						|
    return glyph && glyph.manual.verified ? 'Flag' : 'Verify';
 | 
						|
  },
 | 
						|
});
 | 
						|
 | 
						|
Template.glyph.events({
 | 
						|
  'click #glyph svg g line': function(e) {
 | 
						|
    var coordinates = $(e.target).attr('data-coordinates');
 | 
						|
    var xs = coordinates.split(',').map(function(x) {
 | 
						|
      return parseInt(x, 10);
 | 
						|
    });
 | 
						|
    var bridge = [[xs[0], xs[1]], [xs[2], xs[3]]];
 | 
						|
    var glyph = Session.get('glyph.data');
 | 
						|
    glyph.manual.bridges = remove_bridges(glyph.manual.bridges, [bridge]);
 | 
						|
    Session.set('glyph.data', fill_glyph_fields(glyph));
 | 
						|
    Session.set('glyph.selected_point', undefined);
 | 
						|
  },
 | 
						|
  'click #glyph svg g circle': function(e) {
 | 
						|
    var coordinates = $(e.target).attr('data-coordinates');
 | 
						|
    var selected_point = Session.get('glyph.selected_point');
 | 
						|
    if (selected_point === coordinates) {
 | 
						|
      Session.set('glyph.selected_point', undefined);
 | 
						|
      return;
 | 
						|
    } else if (!selected_point) {
 | 
						|
      Session.set('glyph.selected_point', coordinates);
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    var xs = (coordinates + ',' + selected_point).split(',').map(function(x) {
 | 
						|
      return parseInt(x, 10);
 | 
						|
    });
 | 
						|
    var bridge = [[xs[0], xs[1]], [xs[2], xs[3]]];
 | 
						|
    var glyph = Session.get('glyph.data');
 | 
						|
    if (!contains(glyph.manual.bridges, bridge)) {
 | 
						|
      glyph.manual.bridges.push(bridge);
 | 
						|
      Session.set('glyph.data', fill_glyph_fields(glyph));
 | 
						|
    }
 | 
						|
    Session.set('glyph.selected_point', undefined);
 | 
						|
  },
 | 
						|
});
 | 
						|
 | 
						|
Template.editor.helpers({
 | 
						|
  class() {
 | 
						|
    return undefined;
 | 
						|
  },
 | 
						|
  paths() {
 | 
						|
    const glyph = Session.get('editor.glyph');
 | 
						|
    if (!glyph) return;
 | 
						|
    const result = [];
 | 
						|
    for (let i = 0; i < glyph.stages.strokes.length; i++) {
 | 
						|
      result.push({
 | 
						|
        cls: 'selectable',
 | 
						|
        d: glyph.stages.strokes[i],
 | 
						|
        fill: COLORS[i % COLORS.length],
 | 
						|
        stroke: 'black',
 | 
						|
      });
 | 
						|
    }
 | 
						|
    return result;
 | 
						|
  },
 | 
						|
  lines() {
 | 
						|
    return;
 | 
						|
    const glyph = Session.get('editor.glyph');
 | 
						|
    if (!glyph) return;
 | 
						|
    var original = {};
 | 
						|
    for (var i = 0; i < glyph.render.bridges.length; i++) {
 | 
						|
      var bridge = glyph.render.bridges[i];
 | 
						|
      original[to_line(bridge).coordinates] = true;
 | 
						|
      original[to_line([bridge[1], bridge[0]]).coordinates] = true;
 | 
						|
    }
 | 
						|
    var result = [];
 | 
						|
    for (var i = 0; i < glyph.manual.bridges.length; i++) {
 | 
						|
      var line = to_line(glyph.manual.bridges[i]);
 | 
						|
      line.color = original[line.coordinates] ? 'red' : 'purple';
 | 
						|
      result.push(line);
 | 
						|
    }
 | 
						|
    return result;
 | 
						|
  },
 | 
						|
  points() {
 | 
						|
    return;
 | 
						|
    const glyph = Session.get('editor.glyph');
 | 
						|
    if (!glyph) return;
 | 
						|
    var result = [];
 | 
						|
    for (var i = 0; i < glyph.render.endpoints.length; i++) {
 | 
						|
      var endpoint = glyph.render.endpoints[i];
 | 
						|
      var point = to_point(endpoint.point);
 | 
						|
      point.color = endpoint.corner ? 'red' : 'black';
 | 
						|
      point.z_index = endpoint.corner ? 1 : 0;
 | 
						|
      if (point.coordinates === Session.get('glyph.selected_point')) {
 | 
						|
        point.color = 'purple';
 | 
						|
      }
 | 
						|
      result.push(point);
 | 
						|
    }
 | 
						|
    result.sort(function(p1, p2) { return p1.z_index - p2.z_index; });
 | 
						|
    return result;
 | 
						|
  },
 | 
						|
});
 | 
						|
 | 
						|
Template.metadata.helpers({
 | 
						|
  character() {
 | 
						|
    const glyph = Session.get('editor.glyph');
 | 
						|
    if (!glyph) return;
 | 
						|
    return glyph.character;
 | 
						|
  },
 | 
						|
  items() {
 | 
						|
    const glyph = Session.get('editor.glyph');
 | 
						|
    if (!glyph) return;
 | 
						|
    const defaults = cjklib.getCharacterData(glyph.character);
 | 
						|
    const fields = ['definition', 'pinyin', 'strokes']
 | 
						|
    return fields.map((x) => ({
 | 
						|
      field: `${x[0].toUpperCase()}${x.substr(1)}:`,
 | 
						|
      value: glyph.metadata[x] || defaults[x] || '(unknown)',
 | 
						|
    }));
 | 
						|
  },
 | 
						|
});
 | 
						|
 | 
						|
Template.status.helpers({
 | 
						|
  stage() {
 | 
						|
    return 'strokes';
 | 
						|
  },
 | 
						|
  lines() {
 | 
						|
    return [
 | 
						|
      {cls: 'success', message: 'asdf'},
 | 
						|
      {cls: 'error', message: 'asdf asdf'},
 | 
						|
      {message: 'asdf asdf asdf asdf asdf asdf asdf asdf asdf asd fasd fasd fasd fas dfa sdfa sdf'},
 | 
						|
    ];
 | 
						|
  },
 | 
						|
});
 | 
						|
 | 
						|
Meteor.startup(function() {
 | 
						|
  $('body').on('keypress', function(e) {
 | 
						|
    var key = String.fromCharCode(e.which);
 | 
						|
    if (bindings.hasOwnProperty(key)) {
 | 
						|
      bindings[key]();
 | 
						|
    }
 | 
						|
  });
 | 
						|
  cjklib.promise.then(() => change_glyph('get_next_glyph'))
 | 
						|
                .catch(console.error.bind(console));
 | 
						|
});
 | 
						|
*/
 |