PageSourceSearch

https://maitsuki-panda.jp/Js/AutoKana/jquery.autoKana.js

js maitsuki-panda.jp collected 2026-10-08 12:39:12 UTC 10,155 bytes, 288 lines download raw bytes

1// ※Mac時の独自の処理があるため上書きする際は注意してください!!
2
3// Copyright (c) 2013 Keith Perhac @ DelfiNet (http://delfi-net.com)
4//
5// Based on the AutoRuby library created by:
6// Copyright (c) 2005-2008 spinelz.org (http://script.spinelz.org/)
7//
8// Permission is hereby granted, free of charge, to any person obtaining
9// a copy of this software and associated documentation files (the
10// "Software"), to deal in the Software without restriction, including
11// without limitation the rights to use, copy, modify, merge, publish,
12// distribute, sublicense, and/or sell copies of the Software, and to
13// permit persons to whom the Software is furnished to do so, subject to
14// the following conditions:
15//
16// The above copyright notice and this permission notice shall be
17// included in all copies or substantial portions of the Software.
18//
19// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
27(function ($) {
28	$.fn.autoKana = function (element1, element2, passedOptions) {
29
30		// Mac時の処理上書き注意
31		var ua = navigator.userAgent.toLowerCase();
32		var isMac = ((ua.indexOf("mac") > -1) && (ua.indexOf("os") > -1)) && !((ua.indexOf("iphone") > -1) || (ua.indexOf("ipad") > -1) || (ua.indexOf("windows") > -1));
33
34		var options = $.extend(
35			{
36				"katakana": false
37			}, passedOptions);
38
39		var kanaExtractionPattern = new RegExp("[^  ぁあ-んー]", "g");
40		var kanaCompactingPattern = new RegExp("[ぁぃぅぇぉっゃゅょ]", "g");
41		var elName,
42			elKana,
43			active = false,
44			timer = null,
45			flagConvert = true,
46			input,
47			romanChar,
48			values,
49			ignoreString,
50			baseKana;
51
52		elName = $(element1);
53		elKana = $(element2);
54		active = true;
55		stateClear();
56
57		if (isMac) {
58			elName.keyup(eventKeyUp);
59		} else {
60			elName.blur(eventBlur);
61			elName.focus(eventFocus);
62			elName.keydown(eventKeyDown);
63		}
64
65		function checkConvert(newValues) {
66			if (!flagConvert) {
67				if (Math.abs(values.length - newValues.length) > 1) {
68					var tmpValues = newValues.join("").replace(kanaCompactingPattern, "").split("");
69					if (Math.abs(values.length - tmpValues.length) > 1) {
70						stateConvert();
71					}
72				} else {
73					if (values.length === input.length && values.join("") !== input) {
74						if (input.match(kanaExtractionPattern)) {
75							stateConvert();
76						}
77					}
78				}
79			}
80		};
81
82		function checkValue() {
83			var newInput, newValues;
84			newInput = elName.val();
85			if (newInput === "") {
86				stateClear();
87				setKana();
88			} else {
89				newInput = removeString(newInput);
90				if (input === newInput) {
91					return;
92				} else {
93					input = newInput;
94					if (!flagConvert) {
95						newValues = newInput.replace(kanaExtractionPattern, "").split("");
96						checkConvert(newValues);
97						setKana(newValues);
98					}
99				}
100			}
101		};
102
103		function resetInterval() {
104			clearInterval(timer);
105		};
106
107		function eventBlur(event) {
108			resetInterval();
109		};
110		function eventFocus(event) {
111			stateInput();
112			startInterval();
113		};
114		function eventKeyDown(event) {
115			if (flagConvert) {
116				stateInput();
117			}
118		};
119
120		// Mac時の処理上書き注意
121		function eventKeyUp(event) {// キーボード入力が行われた場合(キーが入力されたら毎度行う)
122
123			var realTimeKeyCode = event.keyCode;// キーコードを所得
124			if (65 <= realTimeKeyCode && realTimeKeyCode <= 90) {
125				romanChar += String.fromCharCode(realTimeKeyCode)// ローマ字が入る(a-z)
126			} else if (realTimeKeyCode === 8 && elName.val() === "") {// TextBoxの中身が空になった場合
127				romanChar = "";
128				elKana.val("");
129			} else if (realTimeKeyCode === 13) {// Enterを押された場合
130				romanChar = "";
131			}
132			if (romanChar) {
133				var newValues = romanToHiragana(romanChar.toLowerCase());
133// ローマ字からひらがなへ変換している
134				if (newValues.match(/^[ぁ-んー ]+$/)) {// ひらがなが入っているかチェックはいていたらsetKanaを行う
135					setKanaMac(newValues);
136					romanChar = "";
137				}
138			}
139		};
140		function isHiragana(chara) {
141			return ((chara >= 12353 && chara <= 12435) || chara == 12445 || chara == 12446);
142		};
143		function removeString(newInput) {
144			if (newInput.indexOf(ignoreString) !== -1) {
145				return newInput.replace(ignoreString, "");
146			} else {
147				var i;
148				var ignoreArray = ignoreString.split("");
149				var inputArray = newInput.split("");
150				for (i = 0; i < ignoreArray.length; i++) {
151					if (ignoreArray[i] === inputArray[i]) {
152						inputArray[i] = "";
153					}
154				}
155				return inputArray.join("");
156			}
157		};
158		function startInterval() {
159			var self = this;
160			timer = setInterval(checkValue, 30);
161			for (var intervalId = 1; intervalId < timer; intervalId++) {
162				clearInterval(intervalId);
163			}
164		};
165		function setKana(newValues) {
166			if (!flagConvert) {
167				if (newValues) {
168					values = newValues;
169				}
170				if (active) {
171					var _val = toKatakana(baseKana + values.join(""));
172					elKana.val(_val);
173				}
174			}
175		};
176		// Mac時の処理上書き注意
177		function setKanaMac(newValues) {
178			baseKana = elKana.val();
179			var values = toKatakana(baseKana + newValues);
180			elKana.val(values);
181		};
182		function stateClear() {
183			baseKana = "";
184			flagConvert = false;
185			ignoreString = "";
186			input = "";
187			romanChar = "";
188			values = [];
189		};
190		function stateInput() {
191			baseKana = elKana.val();
192			flagConvert = false;
193			ignoreString = elName.val();
194		};
195		function stateConvert() {
196			baseKana = baseKana + values.join("");
197			flagConvert = true;
198			values = [];
199		};
200		function toKatakana(src) {
201			if (options.katakana) {
202				var c, i, str;
203				str = new String;
204				for (i = 0; i < src.length; i++) {
205					c = src.charCodeAt(i);
206					if (isHiragana(c)) {
207						str += String.fromCharCode(c + 96);
208					} else {
209						str += src.charAt(i);
210					}
211				}
212				return str;
213			} else {
214				return src;
215			}
216		}
217		// Mac時の処理上書き注意
218		var hiraganaBox = {
219			"a": "あ", "i": "い", "u": "う", "e": "え", "o": "お",
220			"ka": "か", "ki": "き", "ku": "く", "ke": "け", "ko": "こ",
221			"sa": "さ", "si": "し", "su": "す", "se": "せ", "so": "そ",
222			"ta": "た", "ti": "ち", "tu": "つ", "te": "て", "to": "と", "chi": "ち", "tsu": "つ",
223			"na": "な", "ni": "に", "nu": "ぬ", "ne": "ね", "no": "の",
224			"ha": "は", "hi": "ひ", "hu": "ふ", "he": "へ", "ho": "ほ", "fu": "ふ",
225			"ma": "ま", "mi": "み", "mu": "む", "me": "め", "mo": "も",
226			"ya": "や", "yi": "い", "yu": "ゆ", "ye": "いぇ", "yo": "よ",
227			"ra": "ら", "ri": "り", "ru": "る", "re": "れ", "ro": "ろ",
228			"wa": "わ", "wyi": "ゐ", "wu": "う", "wye": "ゑ", "wo": "を",
229			"nn": "ん",
230			"ga": "が", "gi": "ぎ", "gu": "ぐ", "ge": "げ", "go": "ご",
231			"za": "ざ", "zi": "じ", "zu": "ず", "ze": "ぜ", "zo": "ぞ", "ji": "じ",
232			"da": "だ", "di": "ぢ", "du": "づ", "de": "で", "do": "ど",
233			"ba": "ば", "bi": "び", "bu": "ぶ", "be": "べ", "bo": "ぼ",
234			"pa": "ぱ", "pi": "ぴ", "pu": "ぷ", "pe": "ぺ", "po": "ぽ",
235			"kya": "きゃ", "kyu": "きゅ", "kyo": "きょ",
236			"sya": "しゃ", "syu": "しゅ", "syo": "しょ",
237			"tya": "ちゃ", "tyi": "ちぃ", "tyu": "ちゅ", "tye": "ちぇ", "tyo": "ちょ", "cha": "ちゃ", "chu": "ちゅ", "che": "ちぇ", "cho": "ちょ",
238			"nya": "にゃ", "nyi": "にぃ", "nyu": "にゅ", "nye": "にぇ", "nyo": "にょ",
239			"hya": "ひゃ", "hyi": "ひぃ", "hyu": "ひゅ", "hye": "ひぇ", "hyo": "ひょ",
240			"mya": "みゃ", "myi": "みぃ", "myu": "みゅ", "mye": "みぇ", "myo": "みょ",
241			"rya": "りゃ", "ryi": "りぃ", "ryu": "りゅ", "rye": "りぇ", "ryo": "りょ",
242			"gya": "ぎゃ", "gyi": "ぎぃ", "gyu": "ぎゅ", "gye": "ぎぇ", "gyo": "ぎょ",
243			"zya": "じゃ", "zyi": "じぃ", "zyu": "じゅ", "zye": "じぇ", "zyo": "じょ",
244			"ja": "じゃ", "ju": "じゅ", "je": "じぇ", "jo": "じょ", "jya": "じゃ", "jyi": "じぃ", "jyu": "じゅ", "jye": "じぇ", "jyo": "じょ",
245			"dya": "ぢゃ", "dyi": "ぢぃ", "dyu": "ぢゅ", "dye": "ぢぇ", "dyo": "ぢょ",
246			"bya": "びゃ", "byi": "びぃ", "byu": "びゅ", "bye": "びぇ", "byo": "びょ",
247			"pya": "ぴゃ", "pyi": "ぴぃ", "pyu": "ぴゅ", "pye": "ぴぇ", "pyo": "ぴょ",
248			"fa": "ふぁ", "fi": "ふぃ", "fe": "ふぇ", "fo": "ふぉ",
249			"fya": "ふゃ", "fyu": "ふゅ", "fyo": "ふょ",
250			"xa": "ぁ", "xi": "ぃ", "xu": "ぅ", "xe": "ぇ", "xo": "ぉ", "la": "ぁ", "li": "ぃ", "lu": "ぅ", "le": "ぇ", "lo": "ぉ",
251			"xya": "ゃ", "xyu": "ゅ", "xyo": "ょ",
252			"xtu": "っ", "xtsu": "っ",
253			"wi": "うぃ", "we": "うぇ",
254			"va": "ヴぁ", "vi": "ヴぃ", "vu": "ヴ", "ve": "ヴぇ", "vo": "ヴぉ"
255		};
256		// Mac時の処理上書き注意
257		function romanToHiragana(roman) {
258			var i, iz, match, regex,
259				hiragana = "", table = hiraganaBox;
260
261			regex = new RegExp((function (table) {
262				var key,
263					s = "^(?:";
264
265				for (key in table) if (table.hasOwnProperty(key)) {
266					s += key + "|";
267				}
268				return s + "(?:n(?![aiueo]|y[aiueo]|$))|" + "([^aiueon])\\1)";
269			})(table));
270			for (i = 0, iz = roman.length; i < iz; ++i) {
271				if (match = roman.slice(i).match(regex)) {
272					if (match[0] === "n") {
273						hiragana += "ん";
274					} else if (/^([^n])\1$/.test(match[0])) {
275						hiragana += "っ";
276						--i;
277					} else {
278						hiragana += table[match[0]];
279					}
280					i += match[0].length - 1;
281				} else {
282					hiragana += roman[i];
283				}
284			}
285			return hiragana;
286		};
287	};
288})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.