Skip to content

Instantly share code, notes, and snippets.

@ethertank
Last active March 30, 2021 01:57
Show Gist options
  • Save ethertank/4419161 to your computer and use it in GitHub Desktop.
Save ethertank/4419161 to your computer and use it in GitHub Desktop.
String.prototype の拡張のおまとめ。
(function(SP) {
var _t = "[\x09-\x0D\x20\xA0\x85\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+",
_l = new RegExp("^" + _t),
_r = new RegExp(_t + "$");
// polyfills
SP.trimLeft = function() { return this.replace(_l, ""); };
SP.trimRight = function() { return this.replace(_r, ""); };
SP.trim = function() { return this.trimLeft().trimRight(); };
// HTML タグとして解釈される可能性のある文字をエスケープ(文字参照)する
SP.escapeHTML || (SP.htmlEscape = function() {
var m = { "<": "&lt;", ">": "&gt;", "&": "&amp;", "'": "&apos;", '"': "&quot;" };
function r(s) { return m[s]; }
return function(s) { return s.replace(/<|>|&|'|"/g, r); };
});
// todo: 数値参照。あまり好きではない。
/*
SP.escapeHTML2 || (SP.escapeHTML2 = function() {
return this.replace(
/[&"<>\'`\\#;%\/]/g,
function (m) { return '&#' + m.charCodeAt(0) + ';'; }
);
});
*/
//memo: unescape("%26") === "&" && String.fromCharCode("&#38".replace(/\&#/g,"")) === "&"
// ぜかまし を しまかぜ にする
SP.reverse || (SP.reverse = function() {
return this.split("").reverse().join("");
});
// ひらがなをカタカナにする。
SP.toKatakana || (SP.toKatakana = function() {
for (var c, i = 0, l = this.length, o = ""; i < l; ++i) {
c = this.charCodeAt(i);
o += String.fromCharCode(12352 < c && c < 12439 || c === 12445 || c === 12446 ? c + 96 : c);
}
return o;
});
// カタカナをひらがなに。
SP.toHiragana || (SP.toHiragana = function() {
for (var c, i = 0, l = this.length, o = ""; i < l; ++i) {
c = this.charCodeAt(i);
o += String.fromCharCode(12448 < c && c < 12535 || c === 12541 || c === 12542 ? c - 96 : c);
}
return o;
});
// 半角英数に。メソッド名……
SP.toHalfWidthAlphabetAndNumber || (SP.toHalfWidthAlphabetAndNumber = function(s) {
s.replace(/[A-Za-z0-9]/gm, function(m) {
return String.fromCharCode( m.charCodeAt(0) - 0xFEE0 );
});
});
// 全角英数に。
SP.toDoubleWidthAlphabetAndNumber || (SP.toDoubleWidthAlphabetAndNumber = function(s){
s.replace(/[A-Za-z0-9]/gm, function(m) {
return String.fromCharCode( m.charCodeAt(0) + 0xFEE0 );
});
});
})(String.prototype);
//trim
// usage : alert( " (・∀・) ".trim().length );
// test
var s = "\x09\x0A\x0B\x0C\x0D" +
"\x20\xA0\x85\u1680\u180E" +
"\u2000\u2001\u2002\u2003\u2004\u2005" +
"\u2006\u2007\u2008\u2009\u200A" +
"\u2028\u2029" +
"\u202F\u205F\u3000\uFEFF";
var echo = function(str){ document.write(str + "<br />"); };
echo(s.length);
echo((s + "t" + s).length);
echo((s + "e" + s).trimLeft().length);
echo((s + "s" + s).trimRight().length);
echo((s + "t" + s).trim().length);
/* 変更 *//*
trimが実装されている場合でもネイティブメソッドを上書きし、実装毎の差異を強制的に無くす事にした。
MLJ(http://www.mitsue.co.jp/knowledge/mjl.html)のソースコード内の丁寧なコメントにて気付く。
ちなみに MLJはネイティブメソッドを上書きせず、同等のメソッドとして実装している。
*/
// toKatakana / toHiragana
// usage
document.write("ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖゝゞ".toKatakana() +
"<hr />" +
"ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺヽヾ".toHiragana());​
/* memo (・´ω`・) *//*
ヷヸヹヺ の平仮名は無いようだ。故に変換対象外。
「わ」+「゛」の二文字に変換する手も有るといえば有るが、不可逆になるのであまり良くないように思う。
「ゕ」「ゖ」を含む小文字、下の字、濁点付き「う」を含む「0x3041~0x3096(12353~12438)」 ⇔ 「0x30A1~0x30F6(12449~12534)」 と、
一の字点「0x309d~0x309e(12445~12446)」 ⇔ 「0x30fd~0x30fe(12541~12542)」を変換対象としている。
他にも変換対象とすべき文字が在るかも知れない。
合略仮名の「ヿ(コト)」及び「ゟ(より)」は合わせ字。変換対象外。
(http://ja.wikipedia.org/wiki/%E5%90%88%E7%95%A5%E4%BB%AE%E5%90%8D)
一の字点 「ゝ(0x309d / 12445)」、「ゞ(0x309e / 12456)」、「ヽ(0x30fd / 12541)」、「ヾ(0x30fe / 12542)」は
ユニコード順列では他の仮名と離れた場所にある。
しかし、ともに平仮名・片仮名の対応は 0x0060 (96) の差分。故に分岐をまとめて同一のコードで処理可能。
c には整数しか入らないんだから、(12353 <= c && c <= 12438) と (12352 < c && c < 12439) は同じかなという事で後者に変更した。
高速化(+=演算子だと遅かった筈)。配列にpushするもの、正規表現によるもの等を試す。
--- こ こ か ら 違 う 関 数 の 話 ----------------------------------------------
半角→全角の相互変換関数を作成する場合は半角記号等も含み、変換対象の文字コード順での位置対応が異なる為、
差分を足し引きするこの方法の流用では上手くいかない。全角の「ガ」は一文字。濁点のみの文字「゛」も存在するが、
通常使用されるのは「カ」+「゛」ではなく、一文字の「ガ」の方。
対して、半角の「ガ」は文字と半角濁点で構成される2文字であり、通常こちらが使用される。半濁点も同様。
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment