Created
August 12, 2013 17:32
-
-
Save mach3/6213110 to your computer and use it in GitHub Desktop.
文字列内の数字・アルファベット・基本的な記号を全角半角変換する係の人。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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