6 Function.prototype.extend = function(baseConstructor, newPrototype){
7 // http://sourceforge.jp/projects/h58pcdgame/scm/git/GameScriptCoreLibrary/blobs/master/www/corelib/jsbase.js
8 //最初にベースクラスのプロトタイプを引き継ぐ。
10 F.prototype = baseConstructor.prototype;
11 this.prototype = new F();
14 for(var prop in newPrototype){
15 this.prototype[prop] = newPrototype[prop];
19 this.prototype.constructor = this;
21 this.base = baseConstructor;
26 Array.prototype.removeAllObject = function(anObject){
27 //Array中にある全てのanObjectを削除し、空いた部分は前につめる。
28 //戻り値は削除が一回でも実行されたかどうか
30 for(var i = 0; i < this.length; i++){
31 if(this[i] == anObject){
39 Array.prototype.removeAnObject = function(anObject){
40 //Array中にある最初のanObjectを削除し、空いた部分は前につめる。
42 for(var i = 0; i < this.length; i++){
43 if(this[i] == anObject){
50 Array.prototype.removeByIndex = function(index){
51 //Array[index]を削除し、空いた部分は前につめる。
52 this.splice(index, 1);
55 Array.prototype.intersectionWith = function(a, b, fEqualTo){
57 //fEqualToは省略可能で、評価関数fEqualTo(a[i], b[j])を設定する。
59 for(var i = 0, len = b.length; i < len; i++){
60 if(this.isIncluded(b[i], fEqualTo)){
66 Array.prototype.unionWith = function(a, b, fEqualTo){
68 //fEqualToは省略可能で、評価関数fEqualTo(a[i], b[j])を設定する。
70 for(var i = 0, len = b.length; i < len; i++){
71 if(!this.isIncluded(b[i], fEqualTo)){
75 return this.concat(r);
77 Array.prototype.isIncluded = function(obj, fEqualTo){
78 //含まれている場合は配列内のそのオブジェクトを返す
79 //fEqualToは省略可能で、評価関数fEqualTo(array[i], obj)を設定する。
80 if(fEqualTo == undefined){
81 for(var i = 0, len = this.length; i < len; i++){
87 for(var i = 0, len = this.length; i < len; i++){
88 if(fEqualTo(this[i], obj)){
95 Array.prototype.pushUnique = function(obj, fEqualTo){
96 //値が既に存在する場合は追加しない。評価関数fEqualTo(array[i], obj)を設定することができる。
97 //結果的に配列内にあるオブジェクトが返される。
98 var o = this.isIncluded(obj, fEqualTo);
105 Array.prototype.stableSort = function(f){
106 // http://blog.livedoor.jp/netomemo/archives/24688861.html
107 // Chrome等ではソートが必ずしも安定ではないので、この関数を利用する。
109 f = function(a,b){ return a - b; };
111 for(var i = 0; i < this.length; i++){
114 this.sort.call(this, function(a,b){
117 return (a.__id__ > b.__id__) ? 1 : -1;
122 for(var i = 0;i < this.length;i++){
123 delete this[i].__id__;
127 Array.prototype.splitByArray = function(separatorList){
128 //Array中の文字列をseparatorList内の文字列でそれぞれで分割し、それらの文字列が含まれた配列を返す。
129 var retArray = new Array();
131 for(var i = 0, iLen = this.length; i < iLen; i++){
132 retArray = retArray.concat(this[i].splitByArray(separatorList));
139 String.prototype.replaceAll = function(org, dest){
140 //String中にある文字列orgを文字列destにすべて置換する。
141 //http://www.syboos.jp/webjs/doc/string-replace-and-replaceall.html
142 return this.split(org).join(dest);
144 String.prototype.compareLeftHand = function (search){
146 for(var i = 0; search.charAt(i) != ""; i++){
147 if(search.charAt(i) != this.charAt(i)){
153 String.prototype.splitByArray = function(separatorList){
154 //リスト中の文字列それぞれで分割された配列を返す。
155 //separatorはそれ以前の文字列の末尾に追加された状態で含まれる。
156 //"abcdefg".splitByArray(["a", "e", "g"]);
157 // = ["a", "bcde", "fg"]
158 var retArray = new Array();
161 for(var i = 0; i < separatorList.length; i++){
162 var tmpArray = new Array();
163 for(var k = 0; k < retArray.length; k++){
164 tmpArray[k] = retArray[k].split(separatorList[i]);
165 if(tmpArray[k][tmpArray[k].length - 1] == ""){
166 tmpArray[k].splice(tmpArray[k].length - 1, 1);
167 if(tmpArray[k] && tmpArray[k].length > 0){
168 for(var m = 0; m < tmpArray[k].length; m++){
169 tmpArray[k][m] += separatorList[i];
173 for(var m = 0; m < tmpArray[k].length - 1; m++){
174 tmpArray[k][m] += separatorList[i];
178 retArray = new Array();
179 retArray = retArray.concat.apply(retArray, tmpArray);
185 String.prototype.splitByArraySeparatorSeparated = function(separatorList){
186 //リスト中の文字列それぞれで分割された配列を返す。
187 //separatorも分割された状態で含まれる。
188 //"abcdefg".splitByArraySeparatorSeparated(["a", "e", "g"]);
189 // = ["a", "bcd", "e", "f", "g"]
190 var retArray = new Array();
193 for(var i = 0; i < separatorList.length; i++){
194 var tmpArray = new Array();
195 for(var k = 0; k < retArray.length; k++){
196 var tmpArraySub = retArray[k].split(separatorList[i]);
197 tmpArray[k] = new Array();
198 for(var m = 0, mLen = tmpArraySub.length - 1; m < mLen; m++){
199 if(tmpArraySub[m] != ""){
200 tmpArray[k].push(tmpArraySub[m]);
202 tmpArray[k].push(separatorList[i]);
204 if(tmpArraySub[tmpArraySub.length - 1] != ""){
205 tmpArray[k].push(tmpArraySub[m]);
208 retArray = new Array();
209 retArray = retArray.concat.apply(retArray, tmpArray);
215 String.prototype.splitByArraySeparatorSeparatedLong = function(separatorList){
216 //リスト中の文字列それぞれで分割された配列を返す。
217 //separatorも分割された状態で含まれる。
218 //separatorListの前の方にあるseparatorは、後方のseparatorによって分割されない。
219 //"abcdefgcdefg".splitByArraySeparatorSeparatedLong(["bcde", "cd", "f"]);
220 // = ["a", "bcde", "f", "g", "cd", "e", "f", "g"]
221 //"for (i = 0; i != 15; i++) {".splitByArraySeparatorSeparatedLong(["!=", "(", ")", "="]);
222 // = ["for ", "(", "i ", "=", " 0; i ", "!=", " 15; i++", ")", " {"]
223 var retArray = new Array();
224 var checkArray = new Array();
226 checkArray[0] = false;
228 for(var i = 0; i < separatorList.length; i++){
229 var tmpArray = new Array();
230 var tmpCheckArray = new Array();
231 for(var k = 0; k < retArray.length; k++){
233 var tmpArraySub = retArray[k].split(separatorList[i]);
234 tmpArray[k] = new Array();
235 tmpCheckArray[k] = new Array();
236 for(var m = 0, mLen = tmpArraySub.length - 1; m < mLen; m++){
237 if(tmpArraySub[m] != ""){
238 tmpArray[k].push(tmpArraySub[m]);
239 tmpCheckArray[k].push(false);
241 tmpArray[k].push(separatorList[i]);
242 tmpCheckArray[k].push(true);
244 if(tmpArraySub[tmpArraySub.length - 1] != ""){
245 tmpArray[k].push(tmpArraySub[m]);
246 tmpCheckArray[k].push(false);
249 tmpArray.push([retArray[k]]);
250 tmpCheckArray.push([true]);
253 retArray = new Array();
254 checkArray = new Array();
255 retArray = retArray.concat.apply(retArray, tmpArray);
256 checkArray = checkArray.concat.apply(checkArray, tmpCheckArray);
262 String.prototype.trim = function(str){
263 return this.replace(/^[ ]+|[ ]+$/g, "").replace(/\n$/g, "");
265 //http://d.hatena.ne.jp/favril/20090514/1242280476
266 String.prototype.isKanjiAt = function(index){
267 var u = this.charCodeAt(index);
268 if( (0x4e00 <= u && u <= 0x9fcf) || // CJK統合漢字
269 (0x3400 <= u && u <= 0x4dbf) || // CJK統合漢字拡張A
270 (0x20000 <= u && u <= 0x2a6df) || // CJK統合漢字拡張B
271 (0xf900 <= u && u <= 0xfadf) || // CJK互換漢字
272 (0x2f800 <= u && u <= 0x2fa1f)){ // CJK互換漢字補助
277 String.prototype.isHiraganaAt = function(index){
278 var u = this.charCodeAt(index);
279 if(0x3040 <= u && u <= 0x309f){
284 String.prototype.isKatakanaAt = function(index){
285 var u = this.charCodeAt(index);
286 if(0x30a0 <= u && u <= 0x30ff){
291 String.prototype.isHankakuKanaAt = function(index){
292 var u = this.charCodeAt(index);
293 if(0xff61 <= u && u <= 0xff9f){