WanaKana

Utilities for detecting and transliterating between Hiragana, Katakana, and Romaji

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/19781/126349/WanaKana.js

  1. // ==UserScript==
  2. // @name WanaKana
  3. // @version 1.3.7
  4. // @namespace https://github.com/WaniKani/WanaKana
  5. // @description Utilities for detecting and transliterating between Hiragana, Katakana, and Romaji
  6. // @author Mims H. Wright
  7. // @license MIT; http://opensource.org/licenses/MIT
  8. // ==/UserScript==
  9.  
  10. /*
  11. The MIT License (MIT)
  12.  
  13. Copyright (c) 2013 WaniKani Community Github
  14.  
  15. Permission is hereby granted, free of charge, to any person obtaining a copy of
  16. this software and associated documentation files (the "Software"), to deal in
  17. the Software without restriction, including without limitation the rights to
  18. use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  19. the Software, and to permit persons to whom the Software is furnished to do so,
  20. subject to the following conditions:
  21.  
  22. The above copyright notice and this permission notice shall be included in all
  23. copies or substantial portions of the Software.
  24.  
  25. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  26. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  27. FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  28. COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  29. IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  30. CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  31. */
  32.  
  33. var wanakana,
  34. __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
  35.  
  36. wanakana = wanakana || {};
  37.  
  38. wanakana.version = "1.3.7";
  39.  
  40. if (typeof define === "function" && define.amd) {
  41. define("wanakana", [], function() {
  42. return wanakana;
  43. });
  44. }
  45.  
  46. wanakana.LOWERCASE_START = 0x61;
  47.  
  48. wanakana.LOWERCASE_END = 0x7A;
  49.  
  50. wanakana.UPPERCASE_START = 0x41;
  51.  
  52. wanakana.UPPERCASE_END = 0x5A;
  53.  
  54. wanakana.HIRAGANA_START = 0x3041;
  55.  
  56. wanakana.HIRAGANA_END = 0x3096;
  57.  
  58. wanakana.KATAKANA_START = 0x30A1;
  59.  
  60. wanakana.KATAKANA_END = 0x30FA;
  61.  
  62. wanakana.LOWERCASE_FULLWIDTH_START = 0xFF41;
  63.  
  64. wanakana.LOWERCASE_FULLWIDTH_END = 0xFF5A;
  65.  
  66. wanakana.UPPERCASE_FULLWIDTH_START = 0xFF21;
  67.  
  68. wanakana.UPPERCASE_FULLWIDTH_END = 0xFF3A;
  69.  
  70. wanakana.defaultOptions = {
  71. useObseleteKana: false,
  72. IMEMode: false
  73. };
  74.  
  75. /**
  76. * Automatically sets up an input field to be an IME.
  77. */
  78.  
  79.  
  80. wanakana.bind = function(input) {
  81. return input.addEventListener('input', wanakana._onInput);
  82. };
  83.  
  84. wanakana.unbind = function(input) {
  85. return input.removeEventListener('input', wanakana._onInput);
  86. };
  87.  
  88. wanakana._onInput = function(event) {
  89. var input, newText, normalizedInputString, range, startingCursor, startingLength;
  90. input = event.target;
  91. startingCursor = input.selectionStart;
  92. startingLength = input.value.length;
  93. normalizedInputString = wanakana._convertFullwidthCharsToASCII(input.value);
  94. newText = wanakana.toKana(normalizedInputString, {
  95. IMEMode: true
  96. });
  97. if (normalizedInputString !== newText) {
  98. input.value = newText;
  99. if (typeof input.selectionStart === "number") {
  100. return input.selectionStart = input.selectionEnd = input.value.length;
  101. } else if (typeof input.createTextRange !== "undefined") {
  102. input.focus();
  103. range = input.createTextRange();
  104. range.collapse(false);
  105. return range.select();
  106. }
  107. }
  108. };
  109.  
  110. wanakana._extend = function(target, source) {
  111. var prop;
  112. if (target == null) {
  113. return source;
  114. }
  115. for (prop in source) {
  116. if ((target[prop] == null) && (source[prop] != null)) {
  117. target[prop] = source[prop];
  118. }
  119. }
  120. return target;
  121. };
  122.  
  123. /**
  124. * Takes a character and a unicode range. Returns true if the char is in the range.
  125. */
  126.  
  127.  
  128. wanakana._isCharInRange = function(char, start, end) {
  129. var code;
  130. code = char.charCodeAt(0);
  131. return (start <= code && code <= end);
  132. };
  133.  
  134. wanakana._isCharVowel = function(char, includeY) {
  135. var regexp;
  136. if (includeY == null) {
  137. includeY = true;
  138. }
  139. regexp = includeY ? /[aeiouy]/ : /[aeiou]/;
  140. return char.toLowerCase().charAt(0).search(regexp) !== -1;
  141. };
  142.  
  143. wanakana._isCharConsonant = function(char, includeY) {
  144. var regexp;
  145. if (includeY == null) {
  146. includeY = true;
  147. }
  148. regexp = includeY ? /[bcdfghjklmnpqrstvwxyz]/ : /[bcdfghjklmnpqrstvwxz]/;
  149. return char.toLowerCase().charAt(0).search(regexp) !== -1;
  150. };
  151.  
  152. wanakana._isCharKatakana = function(char) {
  153. return wanakana._isCharInRange(char, wanakana.KATAKANA_START, wanakana.KATAKANA_END);
  154. };
  155.  
  156. wanakana._isCharHiragana = function(char) {
  157. return wanakana._isCharInRange(char, wanakana.HIRAGANA_START, wanakana.HIRAGANA_END);
  158. };
  159.  
  160. wanakana._isCharKana = function(char) {
  161. return wanakana._isCharHiragana(char) || wanakana._isCharKatakana(char);
  162. };
  163.  
  164. wanakana._isCharNotKana = function(char) {
  165. return !wanakana._isCharHiragana(char) && !wanakana._isCharKatakana(char);
  166. };
  167.  
  168. wanakana._convertFullwidthCharsToASCII = function(string) {
  169. var char, chars, code, i, _i, _len;
  170. chars = string.split("");
  171. for (i = _i = 0, _len = chars.length; _i < _len; i = ++_i) {
  172. char = chars[i];
  173. code = char.charCodeAt(0);
  174. if (wanakana._isCharInRange(char, wanakana.LOWERCASE_FULLWIDTH_START, wanakana.LOWERCASE_FULLWIDTH_END)) {
  175. chars[i] = String.fromCharCode(code - wanakana.LOWERCASE_FULLWIDTH_START + wanakana.LOWERCASE_START);
  176. }
  177. if (wanakana._isCharInRange(char, wanakana.UPPERCASE_FULLWIDTH_START, wanakana.UPPERCASE_FULLWIDTH_END)) {
  178. chars[i](String.fromCharCode(code - wanakana.UPPERCASE_FULLWIDTH_START + wanakana.UPPERCASE_START));
  179. }
  180. }
  181. return chars.join("");
  182. };
  183.  
  184. wanakana._katakanaToHiragana = function(kata) {
  185. var code, hira, hiraChar, kataChar, _i, _len, _ref;
  186. hira = [];
  187. _ref = kata.split("");
  188. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  189. kataChar = _ref[_i];
  190. if (wanakana._isCharKatakana(kataChar)) {
  191. code = kataChar.charCodeAt(0);
  192. code += wanakana.HIRAGANA_START - wanakana.KATAKANA_START;
  193. hiraChar = String.fromCharCode(code);
  194. hira.push(hiraChar);
  195. } else {
  196. hira.push(kataChar);
  197. }
  198. }
  199. return hira.join("");
  200. };
  201.  
  202. wanakana._hiraganaToKatakana = function(hira) {
  203. var code, hiraChar, kata, kataChar, _i, _len, _ref;
  204. kata = [];
  205. _ref = hira.split("");
  206. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  207. hiraChar = _ref[_i];
  208. if (wanakana._isCharHiragana(hiraChar)) {
  209. code = hiraChar.charCodeAt(0);
  210. code += wanakana.KATAKANA_START - wanakana.HIRAGANA_START;
  211. kataChar = String.fromCharCode(code);
  212. kata.push(kataChar);
  213. } else {
  214. kata.push(hiraChar);
  215. }
  216. }
  217. return kata.join("");
  218. };
  219.  
  220. wanakana._hiraganaToRomaji = function(hira, options) {
  221. var chunk, chunkSize, cursor, getChunk, len, maxChunk, nextCharIsDoubleConsonant, resetChunkSize, roma, romaChar;
  222. options = wanakana._extend(options, wanakana.defaultOptions);
  223. len = hira.length;
  224. roma = [];
  225. cursor = 0;
  226. chunkSize = 0;
  227. maxChunk = 2;
  228. getChunk = function() {
  229. return hira.substr(cursor, chunkSize);
  230. };
  231. resetChunkSize = function() {
  232. return chunkSize = Math.min(maxChunk, len - cursor);
  233. };
  234. while (cursor < len) {
  235. resetChunkSize();
  236. while (chunkSize > 0) {
  237. chunk = getChunk();
  238. if (wanakana.isKatakana(chunk)) {
  239. chunk = wanakana._katakanaToHiragana(chunk);
  240. }
  241. if (chunk.charAt(0) === "っ" && chunkSize === 1 && cursor < (len - 1)) {
  242. nextCharIsDoubleConsonant = true;
  243. romaChar = "";
  244. break;
  245. }
  246. romaChar = wanakana.J_to_R[chunk];
  247. if ((romaChar != null) && nextCharIsDoubleConsonant) {
  248. romaChar = romaChar.charAt(0).concat(romaChar);
  249. nextCharIsDoubleConsonant = false;
  250. }
  251. if (romaChar != null) {
  252. break;
  253. }
  254. chunkSize--;
  255. }
  256. if (romaChar == null) {
  257. romaChar = chunk;
  258. }
  259. roma.push(romaChar);
  260. cursor += chunkSize || 1;
  261. }
  262. return roma.join("");
  263. };
  264.  
  265. wanakana._romajiToHiragana = function(roma, options) {
  266. return wanakana._romajiToKana(roma, options, true);
  267. };
  268.  
  269. wanakana._romajiToKana = function(roma, options, ignoreCase) {
  270. var chunk, chunkLC, chunkSize, cursor, getChunk, isCharUpperCase, kana, kanaChar, len, maxChunk;
  271. if (ignoreCase == null) {
  272. ignoreCase = false;
  273. }
  274. options = wanakana._extend(options, wanakana.defaultOptions);
  275. len = roma.length;
  276. kana = [];
  277. cursor = 0;
  278. maxChunk = 3;
  279. getChunk = function() {
  280. return roma.substr(cursor, chunkSize);
  281. };
  282. isCharUpperCase = function(char) {
  283. return wanakana._isCharInRange(char, wanakana.UPPERCASE_START, wanakana.UPPERCASE_END);
  284. };
  285. while (cursor < len) {
  286. chunkSize = Math.min(maxChunk, len - cursor);
  287. while (chunkSize > 0) {
  288. chunk = getChunk();
  289. chunkLC = chunk.toLowerCase();
  290. if (__indexOf.call(wanakana.FOUR_CHARACTER_EDGE_CASES, chunkLC) >= 0 && (len - cursor) >= 4) {
  291. chunkSize++;
  292. chunk = getChunk();
  293. chunkLC = chunk.toLowerCase();
  294. } else {
  295. if (chunkLC.charAt(0) === "n") {
  296. if (options.IMEMode && chunkLC.charAt(1) === "'" && chunkSize === 2) {
  297. kanaChar = "ん";
  298. break;
  299. }
  300. if (wanakana._isCharConsonant(chunkLC.charAt(1), false) && wanakana._isCharVowel(chunkLC.charAt(2))) {
  301. chunkSize = 1;
  302. chunk = getChunk();
  303. chunkLC = chunk.toLowerCase();
  304. }
  305. }
  306. if (chunkLC.charAt(0) !== "n" && wanakana._isCharConsonant(chunkLC.charAt(0)) && chunk.charAt(0) === chunk.charAt(1)) {
  307. chunkSize = 1;
  308. if (wanakana._isCharInRange(chunk.charAt(0), wanakana.UPPERCASE_START, wanakana.UPPERCASE_END)) {
  309. chunkLC = chunk = "ッ";
  310. } else {
  311. chunkLC = chunk = "っ";
  312. }
  313. }
  314. }
  315. kanaChar = wanakana.R_to_J[chunkLC];
  316. if (kanaChar != null) {
  317. break;
  318. }
  319. if (chunkSize === 4) {
  320. chunkSize -= 2;
  321. } else {
  322. chunkSize--;
  323. }
  324. }
  325. if (kanaChar == null) {
  326. chunk = wanakana._convertPunctuation(chunk);
  327. kanaChar = chunk;
  328. }
  329. if (options != null ? options.useObseleteKana : void 0) {
  330. if (chunkLC === "wi") {
  331. kanaChar = "ゐ";
  332. }
  333. if (chunkLC === "we") {
  334. kanaChar = "ゑ";
  335. }
  336. }
  337. if (options.IMEMode && chunkLC.charAt(0) === "n") {
  338. if (roma.charAt(cursor + 1).toLowerCase() === "y" && wanakana._isCharVowel(roma.charAt(cursor + 2)) === false || cursor === (len - 1) || wanakana.isKana(roma.charAt(cursor + 1))) {
  339. kanaChar = chunk.charAt(0);
  340. }
  341. }
  342. if (!ignoreCase) {
  343. if (isCharUpperCase(chunk.charAt(0))) {
  344. kanaChar = wanakana._hiraganaToKatakana(kanaChar);
  345. }
  346. }
  347. kana.push(kanaChar);
  348. cursor += chunkSize || 1;
  349. }
  350. return kana.join("");
  351. };
  352.  
  353. wanakana._convertPunctuation = function(input, options) {
  354. if (input === ' ') {
  355. return ' ';
  356. }
  357. if (input === '-') {
  358. return 'ー';
  359. }
  360. return input;
  361. };
  362.  
  363. /**
  364. * Returns true if input is entirely hiragana.
  365. */
  366.  
  367.  
  368. wanakana.isHiragana = function(input) {
  369. var chars;
  370. chars = input.split("");
  371. return chars.every(wanakana._isCharHiragana);
  372. };
  373.  
  374. wanakana.isKatakana = function(input) {
  375. var chars;
  376. chars = input.split("");
  377. return chars.every(wanakana._isCharKatakana);
  378. };
  379.  
  380. wanakana.isKana = function(input) {
  381. var chars;
  382. chars = input.split("");
  383. return chars.every(function(char) {
  384. return (wanakana.isHiragana(char)) || (wanakana.isKatakana(char));
  385. });
  386. };
  387.  
  388. wanakana.isRomaji = function(input) {
  389. var chars;
  390. chars = input.split("");
  391. return chars.every(function(char) {
  392. return (!wanakana.isHiragana(char)) && (!wanakana.isKatakana(char));
  393. });
  394. };
  395.  
  396. wanakana.toHiragana = function(input, options) {
  397. if (wanakana.isRomaji(input)) {
  398. return input = wanakana._romajiToHiragana(input, options);
  399. }
  400. if (wanakana.isKatakana(input)) {
  401. return input = wanakana._katakanaToHiragana(input, options);
  402. }
  403. return input;
  404. };
  405.  
  406. wanakana.toKatakana = function(input, options) {
  407. if (wanakana.isHiragana(input)) {
  408. return input = wanakana._hiraganaToKatakana(input, options);
  409. }
  410. if (wanakana.isRomaji(input)) {
  411. input = wanakana._romajiToHiragana(input, options);
  412. return input = wanakana._hiraganaToKatakana(input, options);
  413. }
  414. return input;
  415. };
  416.  
  417. wanakana.toKana = function(input, options) {
  418. return input = wanakana._romajiToKana(input, options);
  419. };
  420.  
  421. wanakana.toRomaji = function(input, options) {
  422. return input = wanakana._hiraganaToRomaji(input);
  423. };
  424.  
  425. wanakana.R_to_J = {
  426. a: 'あ',
  427. i: 'い',
  428. u: 'う',
  429. e: 'え',
  430. o: 'お',
  431. yi: 'い',
  432. wu: 'う',
  433. whu: 'う',
  434. xa: 'ぁ',
  435. xi: 'ぃ',
  436. xu: 'ぅ',
  437. xe: 'ぇ',
  438. xo: 'ぉ',
  439. xyi: 'ぃ',
  440. xye: 'ぇ',
  441. ye: 'いぇ',
  442. wha: 'うぁ',
  443. whi: 'うぃ',
  444. whe: 'うぇ',
  445. who: 'うぉ',
  446. wi: 'うぃ',
  447. we: 'うぇ',
  448. va: 'ゔぁ',
  449. vi: 'ゔぃ',
  450. vu: 'ゔ',
  451. ve: 'ゔぇ',
  452. vo: 'ゔぉ',
  453. vya: 'ゔゃ',
  454. vyi: 'ゔぃ',
  455. vyu: 'ゔゅ',
  456. vye: 'ゔぇ',
  457. vyo: 'ゔょ',
  458. ka: 'か',
  459. ki: 'き',
  460. ku: 'く',
  461. ke: 'け',
  462. ko: 'こ',
  463. lka: 'ヵ',
  464. lke: 'ヶ',
  465. xka: 'ヵ',
  466. xke: 'ヶ',
  467. kya: 'きゃ',
  468. kyi: 'きぃ',
  469. kyu: 'きゅ',
  470. kye: 'きぇ',
  471. kyo: 'きょ',
  472. ca: 'か',
  473. ci: 'き',
  474. cu: 'く',
  475. ce: 'け',
  476. co: 'こ',
  477. lca: 'ヵ',
  478. lce: 'ヶ',
  479. xca: 'ヵ',
  480. xce: 'ヶ',
  481. qya: 'くゃ',
  482. qyu: 'くゅ',
  483. qyo: 'くょ',
  484. qwa: 'くぁ',
  485. qwi: 'くぃ',
  486. qwu: 'くぅ',
  487. qwe: 'くぇ',
  488. qwo: 'くぉ',
  489. qa: 'くぁ',
  490. qi: 'くぃ',
  491. qe: 'くぇ',
  492. qo: 'くぉ',
  493. kwa: 'くぁ',
  494. qyi: 'くぃ',
  495. qye: 'くぇ',
  496. ga: 'が',
  497. gi: 'ぎ',
  498. gu: 'ぐ',
  499. ge: 'げ',
  500. go: 'ご',
  501. gya: 'ぎゃ',
  502. gyi: 'ぎぃ',
  503. gyu: 'ぎゅ',
  504. gye: 'ぎぇ',
  505. gyo: 'ぎょ',
  506. gwa: 'ぐぁ',
  507. gwi: 'ぐぃ',
  508. gwu: 'ぐぅ',
  509. gwe: 'ぐぇ',
  510. gwo: 'ぐぉ',
  511. sa: 'さ',
  512. si: 'し',
  513. shi: 'し',
  514. su: 'す',
  515. se: 'せ',
  516. so: 'そ',
  517. za: 'ざ',
  518. zi: 'じ',
  519. zu: 'ず',
  520. ze: 'ぜ',
  521. zo: 'ぞ',
  522. ji: 'じ',
  523. sya: 'しゃ',
  524. syi: 'しぃ',
  525. syu: 'しゅ',
  526. sye: 'しぇ',
  527. syo: 'しょ',
  528. sha: 'しゃ',
  529. shu: 'しゅ',
  530. she: 'しぇ',
  531. sho: 'しょ',
  532. shya: 'しゃ',
  533. shyu: 'しゅ',
  534. shye: 'しぇ',
  535. shyo: 'しょ',
  536. swa: 'すぁ',
  537. swi: 'すぃ',
  538. swu: 'すぅ',
  539. swe: 'すぇ',
  540. swo: 'すぉ',
  541. zya: 'じゃ',
  542. zyi: 'じぃ',
  543. zyu: 'じゅ',
  544. zye: 'じぇ',
  545. zyo: 'じょ',
  546. ja: 'じゃ',
  547. ju: 'じゅ',
  548. je: 'じぇ',
  549. jo: 'じょ',
  550. jya: 'じゃ',
  551. jyi: 'じぃ',
  552. jyu: 'じゅ',
  553. jye: 'じぇ',
  554. jyo: 'じょ',
  555. ta: 'た',
  556. ti: 'ち',
  557. tu: 'つ',
  558. te: 'て',
  559. to: 'と',
  560. chi: 'ち',
  561. tsu: 'つ',
  562. ltu: 'っ',
  563. xtu: 'っ',
  564. tya: 'ちゃ',
  565. tyi: 'ちぃ',
  566. tyu: 'ちゅ',
  567. tye: 'ちぇ',
  568. tyo: 'ちょ',
  569. cha: 'ちゃ',
  570. chu: 'ちゅ',
  571. che: 'ちぇ',
  572. cho: 'ちょ',
  573. cya: 'ちゃ',
  574. cyi: 'ちぃ',
  575. cyu: 'ちゅ',
  576. cye: 'ちぇ',
  577. cyo: 'ちょ',
  578. chya: 'ちゃ',
  579. chyu: 'ちゅ',
  580. chye: 'ちぇ',
  581. chyo: 'ちょ',
  582. tsa: 'つぁ',
  583. tsi: 'つぃ',
  584. tse: 'つぇ',
  585. tso: 'つぉ',
  586. tha: 'てゃ',
  587. thi: 'てぃ',
  588. thu: 'てゅ',
  589. the: 'てぇ',
  590. tho: 'てょ',
  591. twa: 'とぁ',
  592. twi: 'とぃ',
  593. twu: 'とぅ',
  594. twe: 'とぇ',
  595. two: 'とぉ',
  596. da: 'だ',
  597. di: 'ぢ',
  598. du: 'づ',
  599. de: 'で',
  600. "do": 'ど',
  601. dya: 'ぢゃ',
  602. dyi: 'ぢぃ',
  603. dyu: 'ぢゅ',
  604. dye: 'ぢぇ',
  605. dyo: 'ぢょ',
  606. dha: 'でゃ',
  607. dhi: 'でぃ',
  608. dhu: 'でゅ',
  609. dhe: 'でぇ',
  610. dho: 'でょ',
  611. dwa: 'どぁ',
  612. dwi: 'どぃ',
  613. dwu: 'どぅ',
  614. dwe: 'どぇ',
  615. dwo: 'どぉ',
  616. na: 'な',
  617. ni: 'に',
  618. nu: 'ぬ',
  619. ne: 'ね',
  620. no: 'の',
  621. nya: 'にゃ',
  622. nyi: 'にぃ',
  623. nyu: 'にゅ',
  624. nye: 'にぇ',
  625. nyo: 'にょ',
  626. ha: 'は',
  627. hi: 'ひ',
  628. hu: 'ふ',
  629. he: 'へ',
  630. ho: 'ほ',
  631. fu: 'ふ',
  632. hya: 'ひゃ',
  633. hyi: 'ひぃ',
  634. hyu: 'ひゅ',
  635. hye: 'ひぇ',
  636. hyo: 'ひょ',
  637. fya: 'ふゃ',
  638. fyu: 'ふゅ',
  639. fyo: 'ふょ',
  640. fwa: 'ふぁ',
  641. fwi: 'ふぃ',
  642. fwu: 'ふぅ',
  643. fwe: 'ふぇ',
  644. fwo: 'ふぉ',
  645. fa: 'ふぁ',
  646. fi: 'ふぃ',
  647. fe: 'ふぇ',
  648. fo: 'ふぉ',
  649. fyi: 'ふぃ',
  650. fye: 'ふぇ',
  651. ba: 'ば',
  652. bi: 'び',
  653. bu: 'ぶ',
  654. be: 'べ',
  655. bo: 'ぼ',
  656. bya: 'びゃ',
  657. byi: 'びぃ',
  658. byu: 'びゅ',
  659. bye: 'びぇ',
  660. byo: 'びょ',
  661. pa: 'ぱ',
  662. pi: 'ぴ',
  663. pu: 'ぷ',
  664. pe: 'ぺ',
  665. po: 'ぽ',
  666. pya: 'ぴゃ',
  667. pyi: 'ぴぃ',
  668. pyu: 'ぴゅ',
  669. pye: 'ぴぇ',
  670. pyo: 'ぴょ',
  671. ma: 'ま',
  672. mi: 'み',
  673. mu: 'む',
  674. me: 'め',
  675. mo: 'も',
  676. mya: 'みゃ',
  677. myi: 'みぃ',
  678. myu: 'みゅ',
  679. mye: 'みぇ',
  680. myo: 'みょ',
  681. ya: 'や',
  682. yu: 'ゆ',
  683. yo: 'よ',
  684. xya: 'ゃ',
  685. xyu: 'ゅ',
  686. xyo: 'ょ',
  687. ra: 'ら',
  688. ri: 'り',
  689. ru: 'る',
  690. re: 'れ',
  691. ro: 'ろ',
  692. rya: 'りゃ',
  693. ryi: 'りぃ',
  694. ryu: 'りゅ',
  695. rye: 'りぇ',
  696. ryo: 'りょ',
  697. la: 'ら',
  698. li: 'り',
  699. lu: 'る',
  700. le: 'れ',
  701. lo: 'ろ',
  702. lya: 'りゃ',
  703. lyi: 'りぃ',
  704. lyu: 'りゅ',
  705. lye: 'りぇ',
  706. lyo: 'りょ',
  707. wa: 'わ',
  708. wo: 'を',
  709. lwe: 'ゎ',
  710. xwa: 'ゎ',
  711. n: 'ん',
  712. nn: 'ん',
  713. 'n ': 'ん',
  714. xn: 'ん',
  715. ltsu: 'っ'
  716. };
  717.  
  718. wanakana.FOUR_CHARACTER_EDGE_CASES = ['lts', 'chy', 'shy'];
  719.  
  720. wanakana.J_to_R = {
  721. あ: 'a',
  722. い: 'i',
  723. う: 'u',
  724. え: 'e',
  725. お: 'o',
  726. ゔぁ: 'va',
  727. ゔぃ: 'vi',
  728. ゔ: 'vu',
  729. ゔぇ: 've',
  730. ゔぉ: 'vo',
  731. か: 'ka',
  732. き: 'ki',
  733. きゃ: 'kya',
  734. きぃ: 'kyi',
  735. きゅ: 'kyu',
  736. く: 'ku',
  737. け: 'ke',
  738. こ: 'ko',
  739. が: 'ga',
  740. ぎ: 'gi',
  741. ぐ: 'gu',
  742. げ: 'ge',
  743. ご: 'go',
  744. ぎゃ: 'gya',
  745. ぎぃ: 'gyi',
  746. ぎゅ: 'gyu',
  747. ぎぇ: 'gye',
  748. ぎょ: 'gyo',
  749. さ: 'sa',
  750. す: 'su',
  751. せ: 'se',
  752. そ: 'so',
  753. ざ: 'za',
  754. ず: 'zu',
  755. ぜ: 'ze',
  756. ぞ: 'zo',
  757. し: 'shi',
  758. しゃ: 'sha',
  759. しゅ: 'shu',
  760. しょ: 'sho',
  761. じ: 'ji',
  762. じゃ: 'ja',
  763. じゅ: 'ju',
  764. じょ: 'jo',
  765. た: 'ta',
  766. ち: 'chi',
  767. ちゃ: 'cha',
  768. ちゅ: 'chu',
  769. ちょ: 'cho',
  770. つ: 'tsu',
  771. て: 'te',
  772. と: 'to',
  773. だ: 'da',
  774. ぢ: 'di',
  775. づ: 'du',
  776. で: 'de',
  777. ど: 'do',
  778. な: 'na',
  779. に: 'ni',
  780. にゃ: 'nya',
  781. にゅ: 'nyu',
  782. にょ: 'nyo',
  783. ぬ: 'nu',
  784. ね: 'ne',
  785. の: 'no',
  786. は: 'ha',
  787. ひ: 'hi',
  788. ふ: 'fu',
  789. へ: 'he',
  790. ほ: 'ho',
  791. ひゃ: 'hya',
  792. ひゅ: 'hyu',
  793. ひょ: 'hyo',
  794. ふぁ: 'fa',
  795. ふぃ: 'fi',
  796. ふぇ: 'fe',
  797. ふぉ: 'fo',
  798. ば: 'ba',
  799. び: 'bi',
  800. ぶ: 'bu',
  801. べ: 'be',
  802. ぼ: 'bo',
  803. びゃ: 'bya',
  804. びゅ: 'byu',
  805. びょ: 'byo',
  806. ぱ: 'pa',
  807. ぴ: 'pi',
  808. ぷ: 'pu',
  809. ぺ: 'pe',
  810. ぽ: 'po',
  811. ぴゃ: 'pya',
  812. ぴゅ: 'pyu',
  813. ぴょ: 'pyo',
  814. ま: 'ma',
  815. み: 'mi',
  816. む: 'mu',
  817. め: 'me',
  818. も: 'mo',
  819. みゃ: 'mya',
  820. みゅ: 'myu',
  821. みょ: 'myo',
  822. や: 'ya',
  823. ゆ: 'yu',
  824. よ: 'yo',
  825. ら: 'ra',
  826. り: 'ri',
  827. る: 'ru',
  828. れ: 're',
  829. ろ: 'ro',
  830. りゃ: 'rya',
  831. りゅ: 'ryu',
  832. りょ: 'ryo',
  833. わ: 'wa',
  834. を: 'wo',
  835. ん: 'n',
  836. ゐ: 'wi',
  837. ゑ: 'we',
  838. きぇ: 'kye',
  839. きょ: 'kyo',
  840. じぃ: 'jyi',
  841. じぇ: 'jye',
  842. ちぃ: 'cyi',
  843. ちぇ: 'che',
  844. ひぃ: 'hyi',
  845. ひぇ: 'hye',
  846. びぃ: 'byi',
  847. びぇ: 'bye',
  848. ぴぃ: 'pyi',
  849. ぴぇ: 'pye',
  850. みぇ: 'mye',
  851. みぃ: 'myi',
  852. りぃ: 'ryi',
  853. りぇ: 'rye',
  854. にぃ: 'nyi',
  855. にぇ: 'nye',
  856. しぃ: 'syi',
  857. しぇ: 'she',
  858. いぇ: 'ye',
  859. うぁ: 'wha',
  860. うぉ: 'who',
  861. うぃ: 'wi',
  862. うぇ: 'we',
  863. ゔゃ: 'vya',
  864. ゔゅ: 'vyu',
  865. ゔょ: 'vyo',
  866. すぁ: 'swa',
  867. すぃ: 'swi',
  868. すぅ: 'swu',
  869. すぇ: 'swe',
  870. すぉ: 'swo',
  871. くゃ: 'qya',
  872. くゅ: 'qyu',
  873. くょ: 'qyo',
  874. くぁ: 'qwa',
  875. くぃ: 'qwi',
  876. くぅ: 'qwu',
  877. くぇ: 'qwe',
  878. くぉ: 'qwo',
  879. ぐぁ: 'gwa',
  880. ぐぃ: 'gwi',
  881. ぐぅ: 'gwu',
  882. ぐぇ: 'gwe',
  883. ぐぉ: 'gwo',
  884. つぁ: 'tsa',
  885. つぃ: 'tsi',
  886. つぇ: 'tse',
  887. つぉ: 'tso',
  888. てゃ: 'tha',
  889. てぃ: 'thi',
  890. てゅ: 'thu',
  891. てぇ: 'the',
  892. てょ: 'tho',
  893. とぁ: 'twa',
  894. とぃ: 'twi',
  895. とぅ: 'twu',
  896. とぇ: 'twe',
  897. とぉ: 'two',
  898. ぢゃ: 'dya',
  899. ぢぃ: 'dyi',
  900. ぢゅ: 'dyu',
  901. ぢぇ: 'dye',
  902. ぢょ: 'dyo',
  903. でゃ: 'dha',
  904. でぃ: 'dhi',
  905. でゅ: 'dhu',
  906. でぇ: 'dhe',
  907. でょ: 'dho',
  908. どぁ: 'dwa',
  909. どぃ: 'dwi',
  910. どぅ: 'dwu',
  911. どぇ: 'dwe',
  912. どぉ: 'dwo',
  913. ふぅ: 'fwu',
  914. ふゃ: 'fya',
  915. ふゅ: 'fyu',
  916. ふょ: 'fyo',
  917. ぁ: 'a',
  918. ぃ: 'i',
  919. ぇ: 'e',
  920. ぅ: 'u',
  921. ぉ: 'o',
  922. ゃ: 'ya',
  923. ゅ: 'yu',
  924. ょ: 'yo',
  925. っ: '',
  926. ゕ: 'ka',
  927. ゖ: 'ka',
  928. ゎ: 'wa',
  929. ' ': ' ',
  930. んあ: 'n\'a',
  931. んい: 'n\'i',
  932. んう: 'n\'u',
  933. んえ: 'n\'e',
  934. んお: 'n\'o',
  935. んや: 'n\'ya',
  936. んゆ: 'n\'yu',
  937. んよ: 'n\'yo'
  938. };

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址