Skip to content

Instantly share code, notes, and snippets.

@mach3
Created August 12, 2013 17:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mach3/6213110 to your computer and use it in GitHub Desktop.
Save mach3/6213110 to your computer and use it in GitHub Desktop.
文字列内の数字・アルファベット・基本的な記号を全角半角変換する係の人。
(function(global){
/**
* ZenHan
* ------
*/
var ZenHan = Backbone.Model.extend({
/**
* Attributes:
* - types:Array = character types
* - num:Boolean = convert numeric or not
* - lower:Boolean = convert lower alphabeticals or not
* - upper:Boolean = convert upper alphabeticals or not
* - symbol:Boolean = convert symbols or not
*/
defaults: {
types: ["num", "lower", "upper", "symbol"],
num: true,
lower: true,
upper: true,
symbol: true,
},
/**
* Container for map
*/
map: {
zen: [],
han: []
},
/**
* Container for RegExp
*/
regex: {
zen: null,
han: null
},
/**
* Initialize map now and when attributes updated
*/
initialize: function(){
this.on("change", this.initMap);
this.initMap();
},
/**
* Convert character to hankaku
* @param String str
* @return String
*/
toHan: function(str, options){
this.set(options);
return this.render("han", str);
},
/**
* Convert characters to zenkaku
* @param String str
* @return String
*/
toZen: function(str, options){
this.set(options);
return this.render("zen", str);
},
/**
* Convert characters by mode
* @param String mode (zen|han)
* @param String str
* @return String
*/
render: function(mode, str){
var my, dest, src;
my = this;
dest = mode;
src = mode === "zen" ? "han" : "zen";
str = str.replace(this.regex[src], function(s){
var i = _.indexOf(my.map[src], s.charCodeAt(0));
return String.fromCharCode(my.map[dest][i]);
});
return str;
},
/**
* Initialize maps
*/
initMap: function(){
var my = this;
this.map = {
zen: [],
han: []
};
_.each(this.get("types"), function(name){
if(my.get(name)){
my.map.zen = _.union(my.map.zen, ZenHan.maps.zen[name]);
my.map.han = _.union(my.map.han, ZenHan.maps.han[name]);
}
});
this.initRegExp("zen");
this.initRegExp("han");
},
/**
* Initialize RegExp objects
*/
initRegExp: function(name){
var exp = _.map(this.map[name], function(code){
if(_.indexOf(ZenHan.maps.common.escape, code) >= 0){
return "\\" + String.fromCharCode(code);
}
return String.fromCharCode(code);
});
exp = this._sprintf("(%s)", exp.join("|"));
this.regex[name] = new RegExp(exp, "g");
},
/**
* Helper: Return formatted string
*/
_sprintf: function(/* tmeplate, arg1, arg2, arg3 */){
var args = $.makeArray(arguments);
return args.shift().replace("%s", function(){
return args.shift() || "";
});
}
});
ZenHan.maps = {
common: {
escape: [94,92,36,40,41,124,123,125,91,93,43,42,63]
},
zen: {
num: [
65296,65297,65298,65299,65300,65301,65302,65303,65304,65305
],
lower: [
65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,
65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,
65365,65366,65367,65368,65369,65370
],
upper: [
65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,
65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,
65333,65334,65335,65336,65337,65338
],
symbol: [
12540,65342,65509,65312,65307,65306,65281,8221,65283,65284,
65285,65286,8217,65288,65289,65309,65372,65344,65371,65291,
65290,65373,65308,65310,65311,65343,12288
]
},
han: {
num: [
48,49,50,51,52,53,54,55,56,57
],
lower: [
97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,
113,114,115,116,117,118,119,120,121,122
],
upper: [
65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,
85,86,87,88,89,90
],
symbol: [
45,94,92,64,59,58,33,34,35,36,37,38,39,40,41,61,124,96,123,43,
42,125,60,62,63,95,32
]
}
};
global.ZenHan = ZenHan;
}(this));
/* Example:
var zh = new ZenHan();
// convert to hankaku
zh.toHan(someString, {
symbol: false
});
// convert to zenkaku
zh.toHan(someString, {
symbol: true,
lower: false
});
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment