diff --git a/assets/js/wanakana.min.js b/assets/js/wanakana.min.js index 915aee3..e0855dd 100644 --- a/assets/js/wanakana.min.js +++ b/assets/js/wanakana.min.js @@ -1,2 +1,2 @@ -!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((n="undefined"!=typeof globalThis?globalThis:n||self).wanakana={})}(this,(function(n){"use strict";function t(n){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},t(n)}function e(n,t){return function(n){if(Array.isArray(n))return n}(n)||function(n,t){var e=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null==e)return;var r,o,i=[],a=!0,u=!1;try{for(e=e.call(n);!(a=(r=e.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(n){u=!0,o=n}finally{try{a||null==e.return||e.return()}finally{if(u)throw o}}return i}(n,t)||o(n,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(n){return function(n){if(Array.isArray(n))return i(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||o(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(n,t){if(n){if("string"==typeof n)return i(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?i(n,t):void 0}}function i(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,r=new Array(t);e=n.length?{done:!0}:{done:!1,value:n[r++]}},e:function(n){throw n},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u=!0,c=!1;return{s:function(){e=e.call(n)},n:function(){var n=e.next();return u=n.done,n},e:function(n){c=!0,a=n},f:function(){try{u||null==e.return||e.return()}finally{if(c)throw a}}}}function u(n){return null===n?"null":n!==Object(n)?t(n):{}.toString.call(n).slice(8,-1).toLowerCase()}function c(n){return"string"!==u(n)||!n.length}function f(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,e=arguments.length>2?arguments[2]:void 0;if(c(n))return!1;var r=n.charCodeAt(0);return t<=r&&r<=e}var s={HIRAGANA:"toHiragana",KATAKANA:"toKatakana"},l={HEPBURN:"hepburn"},v={useObsoleteKana:!1,passRomaji:!1,upcaseKatakana:!1,IMEMode:!1,convertLongVowelMark:!0,romanization:l.HEPBURN},d=12353,h=12449,g=[65377,65381],p=[[12288,12351],g,[12539,12540],[65281,65295],[65306,65311],[65339,65343],[65371,65376],[65504,65518]],y=[].concat([[12352,12447],[12448,12543],g,[65382,65439]],p,[[65313,65338],[65345,65370],[65296,65305],[19968,40959],[13312,19903]]),m=[[0,127]].concat([[256,257],[274,275],[298,299],[332,333],[362,363]]),b=[[32,47],[58,63],[91,96],[123,126]].concat([[8216,8217],[8220,8221]]);function j(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return y.some((function(t){var r=e(t,2),o=r[0],i=r[1];return f(n,o,i)}))}function O(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,e="regexp"===u(t);return!c(n)&&r(n).every((function(n){var r=j(n);return e?r||t.test(n):r}))}var w=Number.isNaN||function(n){return"number"==typeof n&&n!=n};function E(n,t){if(n.length!==t.length)return!1;for(var e=0;e0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},v,n)};function R(n,t,e){var r=t;function o(n,t){var e=n.charAt(0);return i(Object.assign({"":e},r[e]),n.slice(1),t,t+1)}function i(n,t,r,a){if(!t)return e||1===Object.keys(n).length?n[""]?[[r,a,n[""]]]:[]:[[r,a,null]];if(1===Object.keys(n).length)return[[r,a,n[""]]].concat(o(t,a));var u=function(n,t){if(void 0!==n[t])return Object.assign({"":n[""]+t},n[t])}(n,t.charAt(0));return void 0===u?[[r,a,n[""]]].concat(o(t,a)):i(u,t.slice(1),r,a+1)}return o(n,0)}function C(n){return Object.entries(n).reduce((function(n,t){var r=e(t,2),o=r[0],i=r[1],a="string"===u(i);return n[o]=a?{"":i}:C(i),n}),{})}function z(n,t){return t.split("").reduce((function(n,t){return void 0===n[t]&&(n[t]={}),n[t]}),n)}function I(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={};return"object"===u(n)&&Object.entries(n).forEach((function(n){var r=e(n,2),o=r[0],i=r[1],a=t;o.split("").forEach((function(n){void 0===a[n]&&(a[n]={}),a=a[n]})),a[""]=i})),function(n){return function n(t,r){return void 0===t||"string"===u(t)?r:Object.entries(r).reduce((function(r,o){var i=e(o,2),a=i[0],u=i[1];return r[a]=n(t[a],u),r}),t)}(JSON.parse(JSON.stringify(n)),t)}}function K(n,t){return t?"function"===u(t)?t(n):I(t)(n):n}var L={a:"あ",i:"い",u:"う",e:"え",o:"お",k:{a:"か",i:"き",u:"く",e:"け",o:"こ"},s:{a:"さ",i:"し",u:"す",e:"せ",o:"そ"},t:{a:"た",i:"ち",u:"つ",e:"て",o:"と"},n:{a:"な",i:"に",u:"ぬ",e:"ね",o:"の"},h:{a:"は",i:"ひ",u:"ふ",e:"へ",o:"ほ"},m:{a:"ま",i:"み",u:"む",e:"め",o:"も"},y:{a:"や",u:"ゆ",o:"よ"},r:{a:"ら",i:"り",u:"る",e:"れ",o:"ろ"},w:{a:"わ",i:"ゐ",e:"ゑ",o:"を"},g:{a:"が",i:"ぎ",u:"ぐ",e:"げ",o:"ご"},z:{a:"ざ",i:"じ",u:"ず",e:"ぜ",o:"ぞ"},d:{a:"だ",i:"ぢ",u:"づ",e:"で",o:"ど"},b:{a:"ば",i:"び",u:"ぶ",e:"べ",o:"ぼ"},p:{a:"ぱ",i:"ぴ",u:"ぷ",e:"ぺ",o:"ぽ"},v:{a:"ゔぁ",i:"ゔぃ",u:"ゔ",e:"ゔぇ",o:"ゔぉ"}},x={".":"。",",":"、",":":":","/":"・","!":"!","?":"?","~":"〜","-":"ー","‘":"「","’":"」","“":"『","”":"』","[":"[","]":"]","(":"(",")":")","{":"{","}":"}"},T={k:"き",s:"し",t:"ち",n:"に",h:"ひ",m:"み",r:"り",g:"ぎ",z:"じ",d:"ぢ",b:"び",p:"ぴ",v:"ゔ",q:"く",f:"ふ"},J={ya:"ゃ",yi:"ぃ",yu:"ゅ",ye:"ぇ",yo:"ょ"},H={a:"ぁ",i:"ぃ",u:"ぅ",e:"ぇ",o:"ぉ"},U={sh:"sy",ch:"ty",cy:"ty",chy:"ty",shy:"sy",j:"zy",jy:"zy",shi:"si",chi:"ti",tsu:"tu",ji:"zi",fu:"hu"},P=Object.assign({tu:"っ",wa:"ゎ",ka:"ヵ",ke:"ヶ"},H,J),D={yi:"い",wu:"う",ye:"いぇ",wi:"うぃ",we:"うぇ",kwa:"くぁ",whu:"う",tha:"てゃ",thu:"てゅ",tho:"てょ",dha:"でゃ",dhu:"でゅ",dho:"でょ"},q={wh:"う",qw:"く",q:"く",gw:"ぐ",sw:"す",ts:"つ",th:"て",tw:"と",dh:"で",dw:"ど",fw:"ふ",f:"ふ"},B={kwi:"くぃ",kuxi:"くぃ",kuli:"くぃ",kwe:"くぇ",kuxe:"くぇ",kule:"くぇ",kwo:"くぉ",kuxo:"くぉ",kulo:"くぉ"};function V(){var n=C(L),t=function(t){return z(n,t)};function o(n){return Object.entries(n).reduce((function(n,t){var r=e(t,2),i=r[0],a=r[1];return n[i]=i?o(a):"っ".concat(a),n}),{})}return Object.entries(T).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];Object.entries(J).forEach((function(n){var r=e(n,2),a=r[0],u=r[1];t(o+a)[""]=i+u}))})),Object.entries(x).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];t(o)[""]=i})),Object.entries(B).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];t(o)[""]=i})),Object.entries(q).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];Object.entries(H).forEach((function(n){var r=e(n,2),a=r[0],u=r[1];t(o+a)[""]=i+u}))})),["n","n'","xn"].forEach((function(n){t(n)[""]="ん"})),n.c=JSON.parse(JSON.stringify(n.k)),Object.entries(U).forEach((function(n){var r=e(n,2),o=r[0],i=r[1],a=o.slice(0,o.length-1),u=o.charAt(o.length-1);t(a)[u]=JSON.parse(JSON.stringify(t(i)))})),Object.entries(P).forEach((function(n){var o,i=e(n,2),a=i[0],u=i[1],c=function(n){return n.charAt(n.length-1)},f=function(n){return n.slice(0,n.length-1)},s="x".concat(a),l=t(s);l[""]=u,t("l".concat(f(a)))[c(a)]=l,(o=a,[].concat(r(Object.entries(U)),[["c","k"]]).reduce((function(n,t){var r=e(t,2),i=r[0],a=r[1];return o.startsWith(a)?n.concat(o.replace(a,i)):n}),[])).forEach((function(n){["l","x"].forEach((function(e){t(e+f(n))[c(n)]=t(e+a)}))}))})),Object.entries(D).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];t(o)[""]=i})),[].concat(r(Object.keys(T)),["c","y","w","j"]).forEach((function(t){var e=n[t];e[t]=o(e)})),delete n.n.n,Object.freeze(JSON.parse(JSON.stringify(n)))}var W=null;var G=I({wi:"ゐ",we:"ゑ"});function $(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&f(n,65,90)}function _(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&12540===n.charCodeAt(0)}function X(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&12539===n.charCodeAt(0)}function Z(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&(!!_(n)||f(n,d,12438))}function F(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=[];return n.split("").forEach((function(n){if(_(n)||X(n))t.push(n);else if(Z(n)){var e=n.charCodeAt(0)+96,r=String.fromCharCode(e);t.push(r)}else t.push(n)})),t.join("")}var Q=A((function(n,t,e){var r=(null==W&&(W=V()),W);return r=n?function(n){var t=JSON.parse(JSON.stringify(n));return t.n.n={"":"ん"},t.n[" "]={"":"ん"},t}(r):r,r=t?G(r):r,e&&(r=K(r,e)),r}),N);function Y(){var n,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;return i?n=o:(n=M(o),i=Q(n.IMEMode,n.useObsoleteKana,n.customKanaMapping)),nn(t,n,i).map((function(o){var i=e(o,3),a=i[0],u=i[1],c=i[2];if(null===c)return t.slice(a);var f=n.IMEMode===s.HIRAGANA,l=n.IMEMode===s.KATAKANA||r(t.slice(a,u)).every($);return f||!l?c:F(c)})).join("")}function nn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2?arguments[2]:void 0,r=t.IMEMode,o=t.useObsoleteKana,i=t.customKanaMapping;return e||(e=Q(r,o,i)),R(n.toLowerCase(),e,!r)}var tn=[];function en(n){var t=Object.assign({},M(n),{IMEMode:n.IMEMode||!0}),o=Q(t),i=[].concat(r(Object.keys(o)),r(Object.keys(o).map((function(n){return n.toUpperCase()}))));return function(n){var r=n.target;undefined!==r.value&&"true"!==r.dataset.ignoreComposition&&function(n,t,r,o,i){var a=e(function(){var n,t,r,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];if(0===i&&a.includes(o[0])){var u=e(cn(o,a),3);n=u[0],t=u[1],r=u[2]}else if(i>0){var c=e(fn(o,i),3);n=c[0],t=c[1],r=c[2]}else{var f=e(sn(o,(function(n){return!a.includes(n)})),2);n=f[0];var s=e(sn(t=f[1],(function(n){return!O(n)})),2);t=s[0],r=s[1]}return[n,t,r]}(n.value,n.selectionEnd,o),3),u=a[0],c=a[1],f=a[2],s=Y(c,t,r);if(c!==s){var l=u.length+s.length,v=u+s+f;n.value=v,f.length?setTimeout((function(){return n.setSelectionRange(l,l)}),1):n.setSelectionRange(l,l)}}(r,t,o,i)}}function rn(n){var t=n.type,e=n.target,r=n.data;/Mac/.test(window.navigator&&window.navigator.platform)&&("compositionupdate"===t&&O(r)&&(e.dataset.ignoreComposition="true"),"compositionend"===t&&(e.dataset.ignoreComposition="false"))}function on(n,t,e){tn=tn.concat({id:n,inputHandler:t,compositionHandler:e})}function an(n){var t=n.id;tn=tn.filter((function(n){return n.id!==t}))}function un(n){return n&&tn.find((function(t){return t.id===n.getAttribute("data-wanakana-id")}))}function cn(n,t){return[""].concat(r(sn(n,(function(n){return t.includes(n)||!O(n,/[0-9]/)}))))}function fn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=sn(r(n.slice(0,t)).reverse(),(function(n){return!O(n)})),i=e(o,2),a=i[0],u=i[1];return[u.reverse().join(""),a.split("").reverse().join(""),n.slice(t)]}function sn(){for(var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(n){return!!n},e=[],r=n.length,o=0;o0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&m.some((function(t){var r=e(t,2),o=r[0],i=r[1];return f(n,o,i)}))}function mn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,e="regexp"===u(t);return!c(n)&&r(n).every((function(n){var r=yn(n);return e?r||t.test(n):r}))}function bn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return f(n,h,12540)}function jn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&(Z(n)||bn(n))}function On(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&r(n).every(jn)}function wn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&r(n).every(Z)}function En(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&r(n).every(bn)}function An(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return f(n,19968,40879)}function kn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&r(n).every(An)}function Sn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{passKanji:!0},e=r(n),o=!1;return t.passKanji||(o=e.some(kn)),(e.some(wn)||e.some(En))&&e.some(mn)&&!o}var Nn=function(n,t){return _(n)&&t<1},Mn=function(n,t){return _(n)&&t>0},Rn=function(n){return["ヶ","ヵ"].includes(n)},Cn={a:"あ",i:"い",u:"う",e:"え",o:"う"};function zn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=e.isDestinationRomaji,o=e.convertLongVowelMark,i="";return n.split("").reduce((function(e,a,u){if(X(a)||Nn(a,u)||Rn(a))return e.concat(a);if(o&&i&&Mn(a,u)){var c=t(i).slice(-1);return bn(n[u-1])&&"o"===c&&r?e.concat("お"):e.concat(Cn[c])}if(!_(a)&&bn(a)){var f=a.charCodeAt(0)+-96,s=String.fromCharCode(f);return i=s,e.concat(s)}return i="",e.concat(a)}),[]).join("")}var In=null,Kn={"あ":"a","い":"i","う":"u","え":"e","お":"o","か":"ka","き":"ki","く":"ku","け":"ke","こ":"ko","さ":"sa","し":"shi","す":"su","せ":"se","そ":"so","た":"ta","ち":"chi","つ":"tsu","て":"te","と":"to","な":"na","に":"ni","ぬ":"nu","ね":"ne","の":"no","は":"ha","ひ":"hi","ふ":"fu","へ":"he","ほ":"ho","ま":"ma","み":"mi","む":"mu","め":"me","も":"mo","ら":"ra","り":"ri","る":"ru","れ":"re","ろ":"ro","や":"ya","ゆ":"yu","よ":"yo","わ":"wa","ゐ":"wi","ゑ":"we","を":"wo","ん":"n","が":"ga","ぎ":"gi","ぐ":"gu","げ":"ge","ご":"go","ざ":"za","じ":"ji","ず":"zu","ぜ":"ze","ぞ":"zo","だ":"da","ぢ":"ji","づ":"zu","で":"de","ど":"do","ば":"ba","び":"bi","ぶ":"bu","べ":"be","ぼ":"bo","ぱ":"pa","ぴ":"pi","ぷ":"pu","ぺ":"pe","ぽ":"po","ゔぁ":"va","ゔぃ":"vi","ゔ":"vu","ゔぇ":"ve","ゔぉ":"vo"},Ln={"。":".","、":",",":":":","・":"/","!":"!","?":"?","〜":"~","ー":"-","「":"‘","」":"’","『":"“","』":"”","[":"[","]":"]","(":"(",")":")","{":"{","}":"}"," ":" "},xn=["あ","い","う","え","お","や","ゆ","よ"],Tn={"ゃ":"ya","ゅ":"yu","ょ":"yo"},Jn={"ぃ":"yi","ぇ":"ye"},Hn={"ぁ":"a","ぃ":"i","ぅ":"u","ぇ":"e","ぉ":"o"},Un=["き","に","ひ","み","り","ぎ","び","ぴ","ゔ","く","ふ"],Pn={"し":"sh","ち":"ch","じ":"j","ぢ":"j"},Dn={"っ":"","ゃ":"ya","ゅ":"yu","ょ":"yo","ぁ":"a","ぃ":"i","ぅ":"u","ぇ":"e","ぉ":"o"},qn={b:"b",c:"t",d:"d",f:"f",g:"g",h:"h",j:"j",k:"k",m:"m",p:"p",q:"q",r:"r",s:"s",t:"t",v:"v",w:"w",x:"x",z:"z"};function Bn(){var n,t,o;return null==In&&(n=C(Kn),t=function(t){return z(n,t)},o=function(n,e){t(n)[""]=e},Object.entries(Ln).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];t(o)[""]=i})),[].concat(r(Object.entries(Tn)),r(Object.entries(Hn))).forEach((function(n){var t=e(n,2),r=t[0],i=t[1];o(r,i)})),Un.forEach((function(n){var r=t(n)[""][0];Object.entries(Tn).forEach((function(t){var i=e(t,2),a=i[0],u=i[1];o(n+a,r+u)})),Object.entries(Jn).forEach((function(t){var i=e(t,2),a=i[0],u=i[1];o(n+a,r+u)}))})),Object.entries(Pn).forEach((function(n){var t=e(n,2),r=t[0],i=t[1];Object.entries(Tn).forEach((function(n){var t=e(n,2),a=t[0],u=t[1];o(r+a,i+u[1])})),o("".concat(r,"ぃ"),"".concat(i,"yi")),o("".concat(r,"ぇ"),"".concat(i,"e"))})),n["っ"]=Vn(n),Object.entries(Dn).forEach((function(n){var t=e(n,2),r=t[0],i=t[1];o(r,i)})),xn.forEach((function(n){o("ん".concat(n),"n'".concat(t(n)[""]))})),In=Object.freeze(JSON.parse(JSON.stringify(n)))),In}function Vn(n){return Object.entries(n).reduce((function(n,t){var r=e(t,2),o=r[0],i=r[1];if(o)n[o]=Vn(i);else{var a=i.charAt(0);n[o]=Object.keys(qn).includes(a)?qn[a]+i:i}return n}),{})}var Wn=A((function(n,t){var e=function(n){return n===l.HEPBURN?Bn():{}}(n);return t&&(e=K(e,t)),e}),N);function Gn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0,o=M(t);return r||(r=Wn(o.romanization,o.customRomajiMapping)),$n(n,o,r).map((function(t){var r=e(t,3),i=r[0],a=r[1],u=r[2];return o.upcaseKatakana&&En(n.slice(i,a))?u.toUpperCase():u})).join("")}function $n(n,t,e){return e||(e=Wn(t.romanization,t.customRomajiMapping)),R(zn(n,Gn,Object.assign({},{isDestinationRomaji:!0},t)),e,!t.IMEMode)}function _n(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&b.some((function(t){var r=e(t,2),o=r[0],i=r[1];return f(n,o,i)}))}function Xn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&p.some((function(t){var r=e(t,2),o=r[0],i=r[1];return f(n,o,i)}))}var Zn=function(n){return" "===n},Fn=function(n){return" "===n},Qn=function(n){return/[0-9]/.test(n)},Yn=function(n){return/[0-9]/.test(n)},nt="en",tt="ja",et="englishNumeral",rt="japaneseNumeral",ot="englishPunctuation",it="japanesePunctuation",at="kanji",ut="hiragana",ct="katakana",ft="space",st="other";function lt(n){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=nt,r=tt,o=et,i=rt,a=ot,u=it,c=at,f=ut,s=ct,l=ft,v=st;if(t)switch(!0){case Qn(n):case Yn(n):return v;case Zn(n):return e;case _n(n):return v;case Fn(n):return r;case Xn(n):return v;case j(n):return r;case yn(n):return e;default:return v}else switch(!0){case Fn(n):case Zn(n):return l;case Qn(n):return i;case Yn(n):return o;case _n(n):return a;case Xn(n):return u;case An(n):return c;case Z(n):return f;case bn(n):return s;case j(n):return r;case yn(n):return e;default:return v}}function vt(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=t.compact,o=void 0!==e&&e,i=t.detailed,a=void 0!==i&&i;if(null==n||c(n))return[];var u=r(n),f=u.shift(),s=lt(f,o);f=a?{type:s,value:f}:f;var l=u.reduce((function(n,t){var e=lt(t,o),r=e===s;s=e;var i=t;return r&&(i=(a?n.pop().value:n.pop())+i),a?n.concat({type:e,value:i}):n.concat(i)}),[f]);return l}var dt=function(n,t){return t&&!On(n[0])},ht=function(n,t){return!t&&!On(n[n.length-1])},gt=function(n,t){return t&&!r(t).some(kn)||!t&&On(n)};n.ROMANIZATIONS=l,n.TO_KANA_METHODS=s,n.VERSION="5.0.1",n.bind=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!hn.includes(n.nodeName))throw new Error("Element provided to Wanakana bind() was not a valid input or textarea element.\n Received: (".concat(JSON.stringify(n),")"));var r=en(t),o=pn();n.setAttribute("data-wanakana-id",o),n.setAttribute("lang","ja"),n.setAttribute("autoCapitalize","none"),n.setAttribute("autoCorrect","off"),n.setAttribute("autoComplete","off"),n.setAttribute("spellCheck","false"),n.addEventListener("input",r),n.addEventListener("compositionupdate",rn),n.addEventListener("compositionend",rn),on(o,r,rn),!0===e&&vn(n)},n.isHiragana=wn,n.isJapanese=O,n.isKana=On,n.isKanji=kn,n.isKatakana=En,n.isMixed=Sn,n.isRomaji=mn,n.stripOkurigana=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=t.leading,r=void 0!==e&&e,o=t.matchKanji,i=void 0===o?"":o;if(!O(n)||dt(n,r)||ht(n,r)||gt(n,i))return n;var a=i||n,u=new RegExp(r?"^".concat(vt(a).shift()):"".concat(vt(a).pop(),"$"));return n.replace(u,"")},n.toHiragana=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=M(t);if(e.passRomaji)return zn(n,Gn,e);if(Sn(n,{passKanji:!0})){var r=zn(n,Gn,e);return Y(r.toLowerCase(),e)}return mn(n)||_n(n)?Y(n.toLowerCase(),e):zn(n,Gn,e)},n.toKana=Y,n.toKatakana=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=M(t);if(e.passRomaji)return F(n);if(Sn(n)||mn(n)||_n(n)){var r=Y(n.toLowerCase(),e);return F(r)}return F(n)},n.toRomaji=Gn,n.tokenize=vt,n.unbind=function(n){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=un(n);if(null==e)throw new Error("Element provided to Wanakana unbind() had no listener registered.\n Received: ".concat(JSON.stringify(n)));var r=e.inputHandler,o=e.compositionHandler;n.removeAttribute("data-wanakana-id"),n.removeAttribute("data-ignore-composition"),n.removeEventListener("input",r),n.removeEventListener("compositionstart",o),n.removeEventListener("compositionupdate",o),n.removeEventListener("compositionend",o),an(e),!0===t&&dn(n)}})); +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((n="undefined"!=typeof globalThis?globalThis:n||self).wanakana={})}(this,(function(n){"use strict";function t(n){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},t(n)}function e(n,t){return function(n){if(Array.isArray(n))return n}(n)||function(n,t){var e=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null==e)return;var r,o,i=[],a=!0,u=!1;try{for(e=e.call(n);!(a=(r=e.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(n){u=!0,o=n}finally{try{a||null==e.return||e.return()}finally{if(u)throw o}}return i}(n,t)||o(n,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(n){return function(n){if(Array.isArray(n))return i(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||o(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(n,t){if(n){if("string"==typeof n)return i(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?i(n,t):void 0}}function i(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,r=new Array(t);e=n.length?{done:!0}:{done:!1,value:n[r++]}},e:function(n){throw n},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u=!0,c=!1;return{s:function(){e=e.call(n)},n:function(){var n=e.next();return u=n.done,n},e:function(n){c=!0,a=n},f:function(){try{u||null==e.return||e.return()}finally{if(c)throw a}}}}function u(n){return null===n?"null":n!==Object(n)?t(n):{}.toString.call(n).slice(8,-1).toLowerCase()}function c(n){return"string"!==u(n)||!n.length}function f(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,e=arguments.length>2?arguments[2]:void 0;if(c(n))return!1;var r=n.charCodeAt(0);return t<=r&&r<=e}var s={HIRAGANA:"toHiragana",KATAKANA:"toKatakana"},l={HEPBURN:"hepburn"},v={useObsoleteKana:!1,passRomaji:!1,upcaseKatakana:!1,IMEMode:!1,convertLongVowelMark:!0,romanization:l.HEPBURN},d=12353,h=12449,g=[65377,65381],p=[[12288,12351],g,[12539,12540],[65281,65295],[65306,65311],[65339,65343],[65371,65376],[65504,65518]],y=[].concat([[12352,12447],[12448,12543],g,[65382,65439]],p,[[65313,65338],[65345,65370],[65296,65305],[19968,40959],[13312,19903]]),m=[[0,127]].concat([[256,257],[274,275],[298,299],[332,333],[362,363]]),b=[[32,47],[58,63],[91,96],[123,126]].concat([[8216,8217],[8220,8221]]);function j(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return y.some((function(t){var r=e(t,2),o=r[0],i=r[1];return f(n,o,i)}))}function O(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,e="regexp"===u(t);return!c(n)&&r(n).every((function(n){var r=j(n);return e?r||t.test(n):r}))}var E=Number.isNaN||function(n){return"number"==typeof n&&n!=n};function w(n,t){if(n.length!==t.length)return!1;for(var e=0;e0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},v,n)};function R(n,t,e){var r=t;function o(n,t){var e=n.charAt(0);return i(Object.assign({"":e},r[e]),n.slice(1),t,t+1)}function i(n,t,r,a){if(!t)return e||1===Object.keys(n).length?n[""]?[[r,a,n[""]]]:[]:[[r,a,null]];if(1===Object.keys(n).length)return[[r,a,n[""]]].concat(o(t,a));var u=function(n,t){if(void 0!==n[t])return Object.assign({"":n[""]+t},n[t])}(n,t.charAt(0));return void 0===u?[[r,a,n[""]]].concat(o(t,a)):i(u,t.slice(1),r,a+1)}return o(n,0)}function C(n){return Object.entries(n).reduce((function(n,t){var r=e(t,2),o=r[0],i=r[1],a="string"===u(i);return n[o]=a?{"":i}:C(i),n}),{})}function I(n,t){return t.split("").reduce((function(n,t){return void 0===n[t]&&(n[t]={}),n[t]}),n)}function K(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={};return"object"===u(n)&&Object.entries(n).forEach((function(n){var r=e(n,2),o=r[0],i=r[1],a=t;o.split("").forEach((function(n){void 0===a[n]&&(a[n]={}),a=a[n]})),a[""]=i})),function(n){return function n(t,r){return void 0===t||"string"===u(t)?r:Object.entries(r).reduce((function(r,o){var i=e(o,2),a=i[0],u=i[1];return r[a]=n(t[a],u),r}),t)}(JSON.parse(JSON.stringify(n)),t)}}function z(n,t){return t?"function"===u(t)?t(n):K(t)(n):n}var L={a:"あ",i:"い",u:"う",e:"え",o:"お",k:{a:"か",i:"き",u:"く",e:"け",o:"こ"},s:{a:"さ",i:"し",u:"す",e:"せ",o:"そ"},t:{a:"た",i:"ち",u:"つ",e:"て",o:"と"},n:{a:"な",i:"に",u:"ぬ",e:"ね",o:"の"},h:{a:"は",i:"ひ",u:"ふ",e:"へ",o:"ほ"},m:{a:"ま",i:"み",u:"む",e:"め",o:"も"},y:{a:"や",u:"ゆ",o:"よ"},r:{a:"ら",i:"り",u:"る",e:"れ",o:"ろ"},w:{a:"わ",i:"ゐ",e:"ゑ",o:"を"},g:{a:"が",i:"ぎ",u:"ぐ",e:"げ",o:"ご"},z:{a:"ざ",i:"じ",u:"ず",e:"ぜ",o:"ぞ"},d:{a:"だ",i:"ぢ",u:"づ",e:"で",o:"ど"},b:{a:"ば",i:"び",u:"ぶ",e:"べ",o:"ぼ"},p:{a:"ぱ",i:"ぴ",u:"ぷ",e:"ぺ",o:"ぽ"},v:{a:"ゔぁ",i:"ゔぃ",u:"ゔ",e:"ゔぇ",o:"ゔぉ"}},T={".":"。",",":"、",":":":","/":"・","!":"!","?":"?","~":"〜","-":"ー","‘":"「","’":"」","“":"『","”":"』","[":"[","]":"]","(":"(",")":")","{":"{","}":"}"},x={k:"き",s:"し",t:"ち",n:"に",h:"ひ",m:"み",r:"り",g:"ぎ",z:"じ",d:"ぢ",b:"び",p:"ぴ",v:"ゔ",q:"く",f:"ふ"},J={ya:"ゃ",yi:"ぃ",yu:"ゅ",ye:"ぇ",yo:"ょ"},H={a:"ぁ",i:"ぃ",u:"ぅ",e:"ぇ",o:"ぉ"},U={sh:"sy",ch:"ty",cy:"ty",chy:"ty",shy:"sy",j:"zy",jy:"zy",shi:"si",chi:"ti",tsu:"tu",ji:"zi",fu:"hu"},P=Object.assign({tu:"っ",wa:"ゎ",ka:"ヵ",ke:"ヶ"},H,J),D={yi:"い",wu:"う",ye:"いぇ",wi:"うぃ",we:"うぇ",kwa:"くぁ",whu:"う",tha:"てゃ",thu:"てゅ",tho:"てょ",dha:"でゃ",dhu:"でゅ",dho:"でょ"},q={wh:"う",kw:"く",qw:"く",q:"く",gw:"ぐ",sw:"す",ts:"つ",th:"て",tw:"と",dh:"で",dw:"ど",fw:"ふ",f:"ふ"};function B(){var n=C(L),t=function(t){return I(n,t)};function o(n){return Object.entries(n).reduce((function(n,t){var r=e(t,2),i=r[0],a=r[1];return n[i]=i?o(a):"っ".concat(a),n}),{})}return Object.entries(x).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];Object.entries(J).forEach((function(n){var r=e(n,2),a=r[0],u=r[1];t(o+a)[""]=i+u}))})),Object.entries(T).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];t(o)[""]=i})),Object.entries(q).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];Object.entries(H).forEach((function(n){var r=e(n,2),a=r[0],u=r[1];t(o+a)[""]=i+u}))})),["n","n'","xn"].forEach((function(n){t(n)[""]="ん"})),n.c=JSON.parse(JSON.stringify(n.k)),Object.entries(U).forEach((function(n){var r=e(n,2),o=r[0],i=r[1],a=o.slice(0,o.length-1),u=o.charAt(o.length-1);t(a)[u]=JSON.parse(JSON.stringify(t(i)))})),Object.entries(P).forEach((function(n){var o,i=e(n,2),a=i[0],u=i[1],c=function(n){return n.charAt(n.length-1)},f=function(n){return n.slice(0,n.length-1)},s="x".concat(a),l=t(s);l[""]=u,t("l".concat(f(a)))[c(a)]=l,(o=a,[].concat(r(Object.entries(U)),[["c","k"]]).reduce((function(n,t){var r=e(t,2),i=r[0],a=r[1];return o.startsWith(a)?n.concat(o.replace(a,i)):n}),[])).forEach((function(n){["l","x"].forEach((function(e){t(e+f(n))[c(n)]=t(e+a)}))}))})),Object.entries(D).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];t(o)[""]=i})),[].concat(r(Object.keys(x)),["c","y","w","j"]).forEach((function(t){var e=n[t];e[t]=o(e)})),delete n.n.n,Object.freeze(JSON.parse(JSON.stringify(n)))}var V=null;var W=K({wi:"ゐ",we:"ゑ"});function G(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&f(n,65,90)}function $(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&12540===n.charCodeAt(0)}function _(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&12539===n.charCodeAt(0)}function X(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&(!!$(n)||f(n,d,12438))}function Z(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=[];return n.split("").forEach((function(n){if($(n)||_(n))t.push(n);else if(X(n)){var e=n.charCodeAt(0)+96,r=String.fromCharCode(e);t.push(r)}else t.push(n)})),t.join("")}var F=A((function(n,t,e){var r=(null==V&&(V=B()),V);return r=n?function(n){var t=JSON.parse(JSON.stringify(n));return t.n.n={"":"ん"},t.n[" "]={"":"ん"},t}(r):r,r=t?W(r):r,e&&(r=z(r,e)),r}),N);function Q(){var n,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;return i?n=o:(n=M(o),i=F(n.IMEMode,n.useObsoleteKana,n.customKanaMapping)),Y(t,n,i).map((function(o){var i=e(o,3),a=i[0],u=i[1],c=i[2];if(null===c)return t.slice(a);var f=n.IMEMode===s.HIRAGANA,l=n.IMEMode===s.KATAKANA||r(t.slice(a,u)).every(G);return f||!l?c:Z(c)})).join("")}function Y(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2?arguments[2]:void 0,r=t.IMEMode,o=t.useObsoleteKana,i=t.customKanaMapping;return e||(e=F(r,o,i)),R(n.toLowerCase(),e,!r)}var nn=[];function tn(n){var t=Object.assign({},M(n),{IMEMode:n.IMEMode||!0}),o=F(t.IMEMode,t.useObsoleteKana,t.customKanaMapping),i=[].concat(r(Object.keys(o)),r(Object.keys(o).map((function(n){return n.toUpperCase()}))));return function(n){var r=n.target;undefined!==r.value&&"true"!==r.dataset.ignoreComposition&&function(n,t,r,o,i){var a=e(function(){var n,t,r,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];if(0===i&&a.includes(o[0])){var u=e(un(o,a),3);n=u[0],t=u[1],r=u[2]}else if(i>0){var c=e(cn(o,i),3);n=c[0],t=c[1],r=c[2]}else{var f=e(fn(o,(function(n){return!a.includes(n)})),2);n=f[0];var s=e(fn(t=f[1],(function(n){return!O(n)})),2);t=s[0],r=s[1]}return[n,t,r]}(n.value,n.selectionEnd,o),3),u=a[0],c=a[1],f=a[2],s=Q(c,t,r);if(c!==s){var l=u.length+s.length,v=u+s+f;n.value=v,f.length?setTimeout((function(){return n.setSelectionRange(l,l)}),1):n.setSelectionRange(l,l)}}(r,t,o,i)}}function en(n){var t=n.type,e=n.target,r=n.data;/Mac/.test(window.navigator&&window.navigator.platform)&&("compositionupdate"===t&&O(r)&&(e.dataset.ignoreComposition="true"),"compositionend"===t&&(e.dataset.ignoreComposition="false"))}function rn(n,t,e){nn=nn.concat({id:n,inputHandler:t,compositionHandler:e})}function on(n){var t=n.id;nn=nn.filter((function(n){return n.id!==t}))}function an(n){return n&&nn.find((function(t){return t.id===n.getAttribute("data-wanakana-id")}))}function un(n,t){return[""].concat(r(fn(n,(function(n){return t.includes(n)||!O(n,/[0-9]/)}))))}function cn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=fn(r(n.slice(0,t)).reverse(),(function(n){return!O(n)})),i=e(o,2),a=i[0],u=i[1];return[u.reverse().join(""),a.split("").reverse().join(""),n.slice(t)]}function fn(){for(var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(n){return!!n},e=[],r=n.length,o=0;o0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&m.some((function(t){var r=e(t,2),o=r[0],i=r[1];return f(n,o,i)}))}function yn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,e="regexp"===u(t);return!c(n)&&r(n).every((function(n){var r=pn(n);return e?r||t.test(n):r}))}function mn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return f(n,h,12540)}function bn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&(X(n)||mn(n))}function jn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&r(n).every(bn)}function On(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&r(n).every(X)}function En(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&r(n).every(mn)}function wn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return f(n,19968,40879)}function An(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&r(n).every(wn)}function Sn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{passKanji:!0},e=r(n),o=!1;return t.passKanji||(o=e.some(An)),(e.some(On)||e.some(En))&&e.some(yn)&&!o}var kn=function(n,t){return $(n)&&t<1},Nn=function(n,t){return $(n)&&t>0},Mn=function(n){return["ヶ","ヵ"].includes(n)},Rn={a:"あ",i:"い",u:"う",e:"え",o:"う"};function Cn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=e.isDestinationRomaji,o=e.convertLongVowelMark,i="";return n.split("").reduce((function(e,a,u){if(_(a)||kn(a,u)||Mn(a))return e.concat(a);if(o&&i&&Nn(a,u)){var c=t(i).slice(-1);return mn(n[u-1])&&"o"===c&&r?e.concat("お"):e.concat(Rn[c])}if(!$(a)&&mn(a)){var f=a.charCodeAt(0)+-96,s=String.fromCharCode(f);return i=s,e.concat(s)}return i="",e.concat(a)}),[]).join("")}var In=null,Kn={"あ":"a","い":"i","う":"u","え":"e","お":"o","か":"ka","き":"ki","く":"ku","け":"ke","こ":"ko","さ":"sa","し":"shi","す":"su","せ":"se","そ":"so","た":"ta","ち":"chi","つ":"tsu","て":"te","と":"to","な":"na","に":"ni","ぬ":"nu","ね":"ne","の":"no","は":"ha","ひ":"hi","ふ":"fu","へ":"he","ほ":"ho","ま":"ma","み":"mi","む":"mu","め":"me","も":"mo","ら":"ra","り":"ri","る":"ru","れ":"re","ろ":"ro","や":"ya","ゆ":"yu","よ":"yo","わ":"wa","ゐ":"wi","ゑ":"we","を":"wo","ん":"n","が":"ga","ぎ":"gi","ぐ":"gu","げ":"ge","ご":"go","ざ":"za","じ":"ji","ず":"zu","ぜ":"ze","ぞ":"zo","だ":"da","ぢ":"ji","づ":"zu","で":"de","ど":"do","ば":"ba","び":"bi","ぶ":"bu","べ":"be","ぼ":"bo","ぱ":"pa","ぴ":"pi","ぷ":"pu","ぺ":"pe","ぽ":"po","ゔぁ":"va","ゔぃ":"vi","ゔ":"vu","ゔぇ":"ve","ゔぉ":"vo"},zn={"。":".","、":",",":":":","・":"/","!":"!","?":"?","〜":"~","ー":"-","「":"‘","」":"’","『":"“","』":"”","[":"[","]":"]","(":"(",")":")","{":"{","}":"}"," ":" "},Ln=["あ","い","う","え","お","や","ゆ","よ"],Tn={"ゃ":"ya","ゅ":"yu","ょ":"yo"},xn={"ぃ":"yi","ぇ":"ye"},Jn={"ぁ":"a","ぃ":"i","ぅ":"u","ぇ":"e","ぉ":"o"},Hn=["き","に","ひ","み","り","ぎ","び","ぴ","ゔ","く","ふ"],Un={"し":"sh","ち":"ch","じ":"j","ぢ":"j"},Pn={"っ":"","ゃ":"ya","ゅ":"yu","ょ":"yo","ぁ":"a","ぃ":"i","ぅ":"u","ぇ":"e","ぉ":"o"},Dn={b:"b",c:"t",d:"d",f:"f",g:"g",h:"h",j:"j",k:"k",m:"m",p:"p",q:"q",r:"r",s:"s",t:"t",v:"v",w:"w",x:"x",z:"z"};function qn(){var n,t,o;return null==In&&(n=C(Kn),t=function(t){return I(n,t)},o=function(n,e){t(n)[""]=e},Object.entries(zn).forEach((function(n){var r=e(n,2),o=r[0],i=r[1];t(o)[""]=i})),[].concat(r(Object.entries(Tn)),r(Object.entries(Jn))).forEach((function(n){var t=e(n,2),r=t[0],i=t[1];o(r,i)})),Hn.forEach((function(n){var r=t(n)[""][0];Object.entries(Tn).forEach((function(t){var i=e(t,2),a=i[0],u=i[1];o(n+a,r+u)})),Object.entries(xn).forEach((function(t){var i=e(t,2),a=i[0],u=i[1];o(n+a,r+u)}))})),Object.entries(Un).forEach((function(n){var t=e(n,2),r=t[0],i=t[1];Object.entries(Tn).forEach((function(n){var t=e(n,2),a=t[0],u=t[1];o(r+a,i+u[1])})),o("".concat(r,"ぃ"),"".concat(i,"yi")),o("".concat(r,"ぇ"),"".concat(i,"e"))})),n["っ"]=Bn(n),Object.entries(Pn).forEach((function(n){var t=e(n,2),r=t[0],i=t[1];o(r,i)})),Ln.forEach((function(n){o("ん".concat(n),"n'".concat(t(n)[""]))})),In=Object.freeze(JSON.parse(JSON.stringify(n)))),In}function Bn(n){return Object.entries(n).reduce((function(n,t){var r=e(t,2),o=r[0],i=r[1];if(o)n[o]=Bn(i);else{var a=i.charAt(0);n[o]=Object.keys(Dn).includes(a)?Dn[a]+i:i}return n}),{})}var Vn=A((function(n,t){var e=function(n){return n===l.HEPBURN?qn():{}}(n);return t&&(e=z(e,t)),e}),N);function Wn(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0,o=M(t);return r||(r=Vn(o.romanization,o.customRomajiMapping)),Gn(n,o,r).map((function(t){var r=e(t,3),i=r[0],a=r[1],u=r[2];return o.upcaseKatakana&&En(n.slice(i,a))?u.toUpperCase():u})).join("")}function Gn(n,t,e){return e||(e=Vn(t.romanization,t.customRomajiMapping)),R(Cn(n,Wn,Object.assign({},{isDestinationRomaji:!0},t)),e,!t.IMEMode)}function $n(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&b.some((function(t){var r=e(t,2),o=r[0],i=r[1];return f(n,o,i)}))}function _n(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return!c(n)&&p.some((function(t){var r=e(t,2),o=r[0],i=r[1];return f(n,o,i)}))}var Xn=function(n){return" "===n},Zn=function(n){return" "===n},Fn=function(n){return/[0-9]/.test(n)},Qn=function(n){return/[0-9]/.test(n)},Yn="en",nt="ja",tt="englishNumeral",et="japaneseNumeral",rt="englishPunctuation",ot="japanesePunctuation",it="kanji",at="hiragana",ut="katakana",ct="space",ft="other";function st(n){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=Yn,r=nt,o=tt,i=et,a=rt,u=ot,c=it,f=at,s=ut,l=ct,v=ft;if(t)switch(!0){case Fn(n):case Qn(n):return v;case Xn(n):return e;case $n(n):return v;case Zn(n):return r;case _n(n):return v;case j(n):return r;case pn(n):return e;default:return v}else switch(!0){case Zn(n):case Xn(n):return l;case Fn(n):return i;case Qn(n):return o;case $n(n):return a;case _n(n):return u;case wn(n):return c;case X(n):return f;case mn(n):return s;case j(n):return r;case pn(n):return e;default:return v}}function lt(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=t.compact,o=void 0!==e&&e,i=t.detailed,a=void 0!==i&&i;if(null==n||c(n))return[];var u=r(n),f=u.shift(),s=st(f,o);f=a?{type:s,value:f}:f;var l=u.reduce((function(n,t){var e=st(t,o),r=e===s;s=e;var i=t;return r&&(i=(a?n.pop().value:n.pop())+i),a?n.concat({type:e,value:i}):n.concat(i)}),[f]);return l}var vt=function(n,t){return t&&!jn(n[0])},dt=function(n,t){return!t&&!jn(n[n.length-1])},ht=function(n,t){return t&&!r(t).some(An)||!t&&jn(n)};n.ROMANIZATIONS=l,n.TO_KANA_METHODS=s,n.VERSION="5.0.2",n.bind=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!dn.includes(n.nodeName))throw new Error("Element provided to Wanakana bind() was not a valid input or textarea element.\n Received: (".concat(JSON.stringify(n),")"));var r=tn(t),o=gn();n.setAttribute("data-wanakana-id",o),n.setAttribute("lang","ja"),n.setAttribute("autoCapitalize","none"),n.setAttribute("autoCorrect","off"),n.setAttribute("autoComplete","off"),n.setAttribute("spellCheck","false"),n.addEventListener("input",r),n.addEventListener("compositionupdate",en),n.addEventListener("compositionend",en),rn(o,r,en),!0===e&&ln(n)},n.isHiragana=On,n.isJapanese=O,n.isKana=jn,n.isKanji=An,n.isKatakana=En,n.isMixed=Sn,n.isRomaji=yn,n.stripOkurigana=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=t.leading,r=void 0!==e&&e,o=t.matchKanji,i=void 0===o?"":o;if(!O(n)||vt(n,r)||dt(n,r)||ht(n,i))return n;var a=i||n,u=new RegExp(r?"^".concat(lt(a).shift()):"".concat(lt(a).pop(),"$"));return n.replace(u,"")},n.toHiragana=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=M(t);if(e.passRomaji)return Cn(n,Wn,e);if(Sn(n,{passKanji:!0})){var r=Cn(n,Wn,e);return Q(r.toLowerCase(),e)}return yn(n)||$n(n)?Q(n.toLowerCase(),e):Cn(n,Wn,e)},n.toKana=Q,n.toKatakana=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=M(t);if(e.passRomaji)return Z(n);if(Sn(n)||yn(n)||$n(n)){var r=Q(n.toLowerCase(),e);return Z(r)}return Z(n)},n.toRomaji=Wn,n.tokenize=lt,n.unbind=function(n){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=an(n);if(null==e)throw new Error("Element provided to Wanakana unbind() had no listener registered.\n Received: ".concat(JSON.stringify(n)));var r=e.inputHandler,o=e.compositionHandler;n.removeAttribute("data-wanakana-id"),n.removeAttribute("data-ignore-composition"),n.removeEventListener("input",r),n.removeEventListener("compositionstart",o),n.removeEventListener("compositionupdate",o),n.removeEventListener("compositionend",o),on(e),!0===t&&vn(n)}})); //# sourceMappingURL=wanakana.min.js.map diff --git a/assets/js/wanakana.min.js.map b/assets/js/wanakana.min.js.map index 6c5bcd8..6135db2 100644 --- a/assets/js/wanakana.min.js.map +++ b/assets/js/wanakana.min.js.map @@ -1 +1 @@ -{"version":3,"file":"wanakana.min.js","sources":["../src/utils/typeOf.js","../src/utils/isEmpty.js","../src/utils/isCharInRange.js","../src/constants.js","../src/utils/isCharJapanese.js","../src/isJapanese.js","../node_modules/memoize-one/dist/memoize-one.esm.js","../node_modules/dequal/dist/index.mjs","../src/utils/mergeWithDefaultOptions.js","../src/utils/kanaMapping.js","../src/utils/romajiToKanaMap.js","../src/utils/isCharUpperCase.js","../src/utils/isCharLongDash.js","../src/utils/isCharSlashDot.js","../src/utils/isCharHiragana.js","../src/utils/hiraganaToKatakana.js","../src/toKana.js","../src/utils/dom.js","../src/utils/logInputEvents.js","../src/bind.js","../src/utils/isCharRomaji.js","../src/isRomaji.js","../src/utils/isCharKatakana.js","../src/utils/isCharKana.js","../src/isKana.js","../src/isHiragana.js","../src/isKatakana.js","../src/utils/isCharKanji.js","../src/isKanji.js","../src/isMixed.js","../src/utils/katakanaToHiragana.js","../src/utils/kanaToRomajiMap.js","../src/toRomaji.js","../src/utils/isCharEnglishPunctuation.js","../src/utils/isCharJapanesePunctuation.js","../src/tokenize.js","../src/stripOkurigana.js","../src/toHiragana.js","../src/toKatakana.js","../src/unbind.js"],"sourcesContent":["/**\n * Returns detailed type as string (instead of just 'object' for arrays etc)\n * @private\n * @param {any} value js value\n * @returns {String} type of value\n * @example\n * typeOf({}); // 'object'\n * typeOf([]); // 'array'\n * typeOf(function() {}); // 'function'\n * typeOf(/a/); // 'regexp'\n * typeOf(new Date()); // 'date'\n * typeOf(null); // 'null'\n * typeOf(undefined); // 'undefined'\n * typeOf('a'); // 'string'\n * typeOf(1); // 'number'\n * typeOf(true); // 'boolean'\n * typeOf(new Map()); // 'map'\n * typeOf(new Set()); // 'map'\n */\nfunction typeOf(value) {\n if (value === null) {\n return 'null';\n }\n if (value !== Object(value)) {\n return typeof value;\n }\n return {}.toString\n .call(value)\n .slice(8, -1)\n .toLowerCase();\n}\n\nexport default typeOf;\n","import typeOf from './typeOf';\n/**\n * Checks if input string is empty\n * @param {String} input text input\n * @return {Boolean} true if no input\n */\nfunction isEmpty(input) {\n if (typeOf(input) !== 'string') {\n return true;\n }\n return !input.length;\n}\n\nexport default isEmpty;\n","import isEmpty from './isEmpty';\n\n/**\n * Takes a character and a unicode range. Returns true if the char is in the range.\n * @param {String} char unicode character\n * @param {Number} start unicode start range\n * @param {Number} end unicode end range\n * @return {Boolean}\n */\nfunction isCharInRange(char = '', start, end) {\n if (isEmpty(char)) return false;\n const code = char.charCodeAt(0);\n return start <= code && code <= end;\n}\n\nexport default isCharInRange;\n","export const VERSION = '5.0.1';\n\nexport const TO_KANA_METHODS = {\n HIRAGANA: 'toHiragana',\n KATAKANA: 'toKatakana',\n};\n\nexport const ROMANIZATIONS = {\n HEPBURN: 'hepburn',\n};\n\n/**\n * Default config for WanaKana, user passed options will be merged with these\n * @type {DefaultOptions}\n * @name defaultOptions\n * @property {Boolean} [useObsoleteKana=false] - Set to true to use obsolete characters, such as ゐ and ゑ.\n * @example\n * toHiragana('we', { useObsoleteKana: true })\n * // => 'ゑ'\n * @property {Boolean} [passRomaji=false] - Set to true to pass romaji when using mixed syllabaries with toKatakana() or toHiragana()\n * @example\n * toHiragana('only convert the katakana: ヒラガナ', { passRomaji: true })\n * // => \"only convert the katakana: ひらがな\"\n * @property {Object} [convertLongVowelMark=true] - Set to false to prevent conversions of 'ー' to extended vowels with toHiragana()\n * @example\n * toHiragana('ラーメン', { convertLongVowelMark: false });\n * // => 'らーめん\n * @property {Boolean} [upcaseKatakana=false] - Set to true to convert katakana to uppercase using toRomaji()\n * @example\n * toRomaji('ひらがな カタカナ', { upcaseKatakana: true })\n * // => \"hiragana KATAKANA\"\n * @property {Boolean|String} [IMEMode=false] - Set to true, 'toHiragana', or 'toKatakana' to handle conversion while it is being typed.\n * @property {String} [romanization='hepburn'] - choose toRomaji() romanization map (currently only 'hepburn')\n * @property {Object} [customKanaMapping] - custom map will be merged with default conversion\n * @example\n * toKana('wanakana', { customKanaMapping: { na: 'に', ka: 'Bana' }) };\n * // => 'わにBanaに'\n * @property {Object} [customRomajiMapping] - custom map will be merged with default conversion\n * @example\n * toRomaji('つじぎり', { customRomajiMapping: { じ: 'zi', つ: 'tu', り: 'li' }) };\n * // => 'tuzigili'\n */\nexport const DEFAULT_OPTIONS = {\n useObsoleteKana: false,\n passRomaji: false,\n upcaseKatakana: false,\n IMEMode: false,\n convertLongVowelMark: true,\n romanization: ROMANIZATIONS.HEPBURN,\n};\n\n// CharCode References\n// http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml\n// http://unicode-table.com\n\nexport const LATIN_LOWERCASE_START = 0x61;\nexport const LATIN_LOWERCASE_END = 0x7a;\nexport const LATIN_UPPERCASE_START = 0x41;\nexport const LATIN_UPPERCASE_END = 0x5a;\nexport const LOWERCASE_ZENKAKU_START = 0xff41;\nexport const LOWERCASE_ZENKAKU_END = 0xff5a;\nexport const UPPERCASE_ZENKAKU_START = 0xff21;\nexport const UPPERCASE_ZENKAKU_END = 0xff3a;\nexport const HIRAGANA_START = 0x3041;\nexport const HIRAGANA_END = 0x3096;\nexport const KATAKANA_START = 0x30a1;\nexport const KATAKANA_END = 0x30fc;\nexport const KANJI_START = 0x4e00;\nexport const KANJI_END = 0x9faf;\nexport const PROLONGED_SOUND_MARK = 0x30fc;\nexport const KANA_SLASH_DOT = 0x30fb;\n\nconst ZENKAKU_NUMBERS = [0xff10, 0xff19];\nconst ZENKAKU_UPPERCASE = [UPPERCASE_ZENKAKU_START, UPPERCASE_ZENKAKU_END];\nconst ZENKAKU_LOWERCASE = [LOWERCASE_ZENKAKU_START, LOWERCASE_ZENKAKU_END];\nconst ZENKAKU_PUNCTUATION_1 = [0xff01, 0xff0f];\nconst ZENKAKU_PUNCTUATION_2 = [0xff1a, 0xff1f];\nconst ZENKAKU_PUNCTUATION_3 = [0xff3b, 0xff3f];\nconst ZENKAKU_PUNCTUATION_4 = [0xff5b, 0xff60];\nconst ZENKAKU_SYMBOLS_CURRENCY = [0xffe0, 0xffee];\n\nconst HIRAGANA_CHARS = [0x3040, 0x309f];\nconst KATAKANA_CHARS = [0x30a0, 0x30ff];\nconst HANKAKU_KATAKANA = [0xff66, 0xff9f];\nconst KATAKANA_PUNCTUATION = [0x30fb, 0x30fc];\nconst KANA_PUNCTUATION = [0xff61, 0xff65];\nconst CJK_SYMBOLS_PUNCTUATION = [0x3000, 0x303f];\nconst COMMON_CJK = [0x4e00, 0x9fff];\nconst RARE_CJK = [0x3400, 0x4dbf];\n\nexport const KANA_RANGES = [\n HIRAGANA_CHARS,\n KATAKANA_CHARS,\n KANA_PUNCTUATION,\n HANKAKU_KATAKANA,\n];\n\nexport const JA_PUNCTUATION_RANGES = [\n CJK_SYMBOLS_PUNCTUATION,\n KANA_PUNCTUATION,\n KATAKANA_PUNCTUATION,\n ZENKAKU_PUNCTUATION_1,\n ZENKAKU_PUNCTUATION_2,\n ZENKAKU_PUNCTUATION_3,\n ZENKAKU_PUNCTUATION_4,\n ZENKAKU_SYMBOLS_CURRENCY,\n];\n\n// All Japanese unicode start and end ranges\n// Includes kanji, kana, zenkaku latin chars, punctuation, and number ranges.\nexport const JAPANESE_RANGES = [\n ...KANA_RANGES,\n ...JA_PUNCTUATION_RANGES,\n ZENKAKU_UPPERCASE,\n ZENKAKU_LOWERCASE,\n ZENKAKU_NUMBERS,\n COMMON_CJK,\n RARE_CJK,\n];\n\nconst MODERN_ENGLISH = [0x0000, 0x007f];\nconst HEPBURN_MACRON_RANGES = [\n [0x0100, 0x0101], // Ā ā\n [0x0112, 0x0113], // Ē ē\n [0x012a, 0x012b], // Ī ī\n [0x014c, 0x014d], // Ō ō\n [0x016a, 0x016b], // Ū ū\n];\nconst SMART_QUOTE_RANGES = [\n [0x2018, 0x2019], // ‘ ’\n [0x201c, 0x201d], // “ ”\n];\n\nexport const ROMAJI_RANGES = [MODERN_ENGLISH, ...HEPBURN_MACRON_RANGES];\n\nexport const EN_PUNCTUATION_RANGES = [\n [0x20, 0x2f],\n [0x3a, 0x3f],\n [0x5b, 0x60],\n [0x7b, 0x7e],\n ...SMART_QUOTE_RANGES,\n];\n","import isCharInRange from './isCharInRange';\nimport { JAPANESE_RANGES } from '../constants';\n\n/**\n * Tests a character. Returns true if the character is [Katakana](https://en.wikipedia.org/wiki/Katakana).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharJapanese(char = '') {\n return JAPANESE_RANGES.some(([start, end]) => isCharInRange(char, start, end));\n}\n\nexport default isCharJapanese;\n","import typeOf from './utils/typeOf';\nimport isEmpty from './utils/isEmpty';\nimport isCharJapanese from './utils/isCharJapanese';\n\n/**\n * Test if `input` only includes [Kanji](https://en.wikipedia.org/wiki/Kanji), [Kana](https://en.wikipedia.org/wiki/Kana), zenkaku numbers, and JA punctuation/symbols.”\n * @param {String} [input=''] text\n * @param {Regexp} [allowed] additional test allowed to pass for each char\n * @return {Boolean} true if passes checks\n * @example\n * isJapanese('泣き虫')\n * // => true\n * isJapanese('あア')\n * // => true\n * isJapanese('2月') // Zenkaku numbers allowed\n * // => true\n * isJapanese('泣き虫。!〜$') // Zenkaku/JA punctuation\n * // => true\n * isJapanese('泣き虫.!~$') // Latin punctuation fails\n * // => false\n * isJapanese('A泣き虫')\n * // => false\n * isJapanese('≪偽括弧≫', /[≪≫]/);\n * // => true\n */\nfunction isJapanese(input = '', allowed) {\n const augmented = typeOf(allowed) === 'regexp';\n return isEmpty(input)\n ? false\n : [...input].every((char) => {\n const isJa = isCharJapanese(char);\n return !augmented ? isJa : isJa || allowed.test(char);\n });\n}\n\nexport default isJapanese;\n","var safeIsNaN = Number.isNaN ||\n function ponyfill(value) {\n return typeof value === 'number' && value !== value;\n };\nfunction isEqual(first, second) {\n if (first === second) {\n return true;\n }\n if (safeIsNaN(first) && safeIsNaN(second)) {\n return true;\n }\n return false;\n}\nfunction areInputsEqual(newInputs, lastInputs) {\n if (newInputs.length !== lastInputs.length) {\n return false;\n }\n for (var i = 0; i < newInputs.length; i++) {\n if (!isEqual(newInputs[i], lastInputs[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction memoizeOne(resultFn, isEqual) {\n if (isEqual === void 0) { isEqual = areInputsEqual; }\n var cache = null;\n function memoized() {\n var newArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n newArgs[_i] = arguments[_i];\n }\n if (cache && cache.lastThis === this && isEqual(newArgs, cache.lastArgs)) {\n return cache.lastResult;\n }\n var lastResult = resultFn.apply(this, newArgs);\n cache = {\n lastResult: lastResult,\n lastArgs: newArgs,\n lastThis: this,\n };\n return lastResult;\n }\n memoized.clear = function clear() {\n cache = null;\n };\n return memoized;\n}\n\nexport { memoizeOne as default };\n","var has = Object.prototype.hasOwnProperty;\n\nfunction find(iter, tar, key) {\n\tfor (key of iter.keys()) {\n\t\tif (dequal(key, tar)) return key;\n\t}\n}\n\nexport function dequal(foo, bar) {\n\tvar ctor, len, tmp;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ctor === Set) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len;\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!bar.has(tmp)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === Map) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len[0];\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!dequal(len[1], bar.get(tmp))) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === ArrayBuffer) {\n\t\t\tfoo = new Uint8Array(foo);\n\t\t\tbar = new Uint8Array(bar);\n\t\t} else if (ctor === DataView) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo.getInt8(len) === bar.getInt8(len));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ArrayBuffer.isView(foo)) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo[len] === bar[len]);\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { DEFAULT_OPTIONS } from '../constants';\n/**\n * Easy re-use of merging with default options\n * @param {Object} opts user options\n * @returns user options merged over default options\n */\nconst mergeWithDefaultOptions = (opts = {}) => Object.assign({}, DEFAULT_OPTIONS, opts);\n\nexport default mergeWithDefaultOptions;\n","import typeOf from './typeOf';\n\nexport function applyMapping(string, mapping, convertEnding) {\n const root = mapping;\n\n function nextSubtree(tree, nextChar) {\n const subtree = tree[nextChar];\n if (subtree === undefined) {\n return undefined;\n }\n // if the next child node does not have a node value, set its node value to the input\n return Object.assign({ '': tree[''] + nextChar }, tree[nextChar]);\n }\n\n function newChunk(remaining, currentCursor) {\n // start parsing a new chunk\n const firstChar = remaining.charAt(0);\n\n return parse(\n Object.assign({ '': firstChar }, root[firstChar]),\n remaining.slice(1),\n currentCursor,\n currentCursor + 1\n );\n }\n\n function parse(tree, remaining, lastCursor, currentCursor) {\n if (!remaining) {\n if (convertEnding || Object.keys(tree).length === 1) {\n // nothing more to consume, just commit the last chunk and return it\n // so as to not have an empty element at the end of the result\n return tree[''] ? [[lastCursor, currentCursor, tree['']]] : [];\n }\n // if we don't want to convert the ending, because there are still possible continuations\n // return null as the final node value\n return [[lastCursor, currentCursor, null]];\n }\n\n if (Object.keys(tree).length === 1) {\n return [[lastCursor, currentCursor, tree['']]].concat(newChunk(remaining, currentCursor));\n }\n\n const subtree = nextSubtree(tree, remaining.charAt(0));\n\n if (subtree === undefined) {\n return [[lastCursor, currentCursor, tree['']]].concat(newChunk(remaining, currentCursor));\n }\n // continue current branch\n return parse(subtree, remaining.slice(1), lastCursor, currentCursor + 1);\n }\n\n return newChunk(string, 0);\n}\n\n// transform the tree, so that for example hepburnTree['ゔ']['ぁ'][''] === 'va'\n// or kanaTree['k']['y']['a'][''] === 'きゃ'\nexport function transform(tree) {\n return Object.entries(tree).reduce((map, [char, subtree]) => {\n const endOfBranch = typeOf(subtree) === 'string';\n map[char] = endOfBranch ? { '': subtree } : transform(subtree);\n return map;\n }, {});\n}\n\nexport function getSubTreeOf(tree, string) {\n return string.split('').reduce((correctSubTree, char) => {\n if (correctSubTree[char] === undefined) {\n correctSubTree[char] = {};\n }\n return correctSubTree[char];\n }, tree);\n}\n\n/**\n * Creates a custom mapping tree, returns a function that accepts a defaultMap which the newly created customMapping will be merged with and returned\n * (customMap) => (defaultMap) => mergedMap\n * @param {Object} customMap { 'ka' : 'な' }\n * @return {Function} (defaultMap) => defaultMergedWithCustomMap\n * @example\n * const sillyMap = createCustomMapping({ 'ちゃ': 'time', '茎': 'cookie' });\n * // sillyMap is passed defaultMapping to merge with when called in toRomaji()\n * toRomaji(\"It's 茎 ちゃ よ\", { customRomajiMapping: sillyMap });\n * // => 'It's cookie time yo';\n */\nexport function createCustomMapping(customMap = {}) {\n const customTree = {};\n\n if (typeOf(customMap) === 'object') {\n Object.entries(customMap).forEach(([roma, kana]) => {\n let subTree = customTree;\n roma.split('').forEach((char) => {\n if (subTree[char] === undefined) {\n subTree[char] = {};\n }\n subTree = subTree[char];\n });\n subTree[''] = kana;\n });\n }\n\n return function makeMap(map) {\n const mapCopy = JSON.parse(JSON.stringify(map));\n\n function transformMap(mapSubtree, customSubtree) {\n if (mapSubtree === undefined || typeOf(mapSubtree) === 'string') {\n return customSubtree;\n }\n return Object.entries(customSubtree).reduce((newSubtree, [char, subtree]) => {\n newSubtree[char] = transformMap(mapSubtree[char], subtree);\n return newSubtree;\n }, mapSubtree);\n }\n\n return transformMap(mapCopy, customTree);\n };\n}\n\n// allow consumer to pass either function or object as customMapping\nexport function mergeCustomMapping(map, customMapping) {\n if (!customMapping) {\n return map;\n }\n return typeOf(customMapping) === 'function'\n ? customMapping(map)\n : createCustomMapping(customMapping)(map);\n}\n","import { transform, getSubTreeOf, createCustomMapping } from './kanaMapping';\n\n// NOTE: not exactly kunrei shiki, for example ぢゃ -> dya instead of zya, to avoid name clashing\n/* eslint-disable */\n// prettier-ignore\nconst BASIC_KUNREI = {\n a: 'あ', i: 'い', u: 'う', e: 'え', o: 'お',\n k: { a: 'か', i: 'き', u: 'く', e: 'け', o: 'こ', },\n s: { a: 'さ', i: 'し', u: 'す', e: 'せ', o: 'そ', },\n t: { a: 'た', i: 'ち', u: 'つ', e: 'て', o: 'と', },\n n: { a: 'な', i: 'に', u: 'ぬ', e: 'ね', o: 'の', },\n h: { a: 'は', i: 'ひ', u: 'ふ', e: 'へ', o: 'ほ', },\n m: { a: 'ま', i: 'み', u: 'む', e: 'め', o: 'も', },\n y: { a: 'や', u: 'ゆ', o: 'よ' },\n r: { a: 'ら', i: 'り', u: 'る', e: 'れ', o: 'ろ', },\n w: { a: 'わ', i: 'ゐ', e: 'ゑ', o: 'を', },\n g: { a: 'が', i: 'ぎ', u: 'ぐ', e: 'げ', o: 'ご', },\n z: { a: 'ざ', i: 'じ', u: 'ず', e: 'ぜ', o: 'ぞ', },\n d: { a: 'だ', i: 'ぢ', u: 'づ', e: 'で', o: 'ど', },\n b: { a: 'ば', i: 'び', u: 'ぶ', e: 'べ', o: 'ぼ', },\n p: { a: 'ぱ', i: 'ぴ', u: 'ぷ', e: 'ぺ', o: 'ぽ', },\n v: { a: 'ゔぁ', i: 'ゔぃ', u: 'ゔ', e: 'ゔぇ', o: 'ゔぉ', },\n};\n\nconst SPECIAL_SYMBOLS = {\n '.': '。',\n ',': '、',\n ':': ':',\n '/': '・',\n '!': '!',\n '?': '?',\n '~': '〜',\n '-': 'ー',\n '‘': '「',\n '’': '」',\n '“': '『',\n '”': '』',\n '[': '[',\n ']': ']',\n '(': '(',\n ')': ')',\n '{': '{',\n '}': '}',\n};\n\nconst CONSONANTS = {\n k: 'き',\n s: 'し',\n t: 'ち',\n n: 'に',\n h: 'ひ',\n m: 'み',\n r: 'り',\n g: 'ぎ',\n z: 'じ',\n d: 'ぢ',\n b: 'び',\n p: 'ぴ',\n v: 'ゔ',\n q: 'く',\n f: 'ふ',\n};\nconst SMALL_Y = { ya: 'ゃ', yi: 'ぃ', yu: 'ゅ', ye: 'ぇ', yo: 'ょ' };\nconst SMALL_VOWELS = { a: 'ぁ', i: 'ぃ', u: 'ぅ', e: 'ぇ', o: 'ぉ' };\n\n// typing one should be the same as having typed the other instead\nconst ALIASES = {\n sh: 'sy', // sha -> sya\n ch: 'ty', // cho -> tyo\n cy: 'ty', // cyo -> tyo\n chy: 'ty', // chyu -> tyu\n shy: 'sy', // shya -> sya\n j: 'zy', // ja -> zya\n jy: 'zy', // jye -> zye\n\n // exceptions to above rules\n shi: 'si',\n chi: 'ti',\n tsu: 'tu',\n ji: 'zi',\n fu: 'hu',\n};\n\n// xtu -> っ\nconst SMALL_LETTERS = Object.assign(\n {\n tu: 'っ',\n wa: 'ゎ',\n ka: 'ヵ',\n ke: 'ヶ',\n },\n SMALL_VOWELS,\n SMALL_Y\n);\n\n// don't follow any notable patterns\nconst SPECIAL_CASES = {\n yi: 'い',\n wu: 'う',\n ye: 'いぇ',\n wi: 'うぃ',\n we: 'うぇ',\n kwa: 'くぁ',\n whu: 'う',\n // because it's not thya for てゃ but tha\n // and tha is not てぁ, but てゃ\n tha: 'てゃ',\n thu: 'てゅ',\n tho: 'てょ',\n dha: 'でゃ',\n dhu: 'でゅ',\n dho: 'でょ',\n};\n\nconst AIUEO_CONSTRUCTIONS = {\n wh: 'う',\n qw: 'く',\n q: 'く',\n gw: 'ぐ',\n sw: 'す',\n ts: 'つ',\n th: 'て',\n tw: 'と',\n dh: 'で',\n dw: 'ど',\n fw: 'ふ',\n f: 'ふ',\n};\n\n// Match other IME conversions\n// https://github.com/WaniKani/WanaKana/issues/126\nconst K_CONSTRUCTIONS = {\n kwi: 'くぃ',\n kuxi: 'くぃ',\n kuli: 'くぃ',\n kwe: 'くぇ',\n kuxe: 'くぇ',\n kule: 'くぇ',\n kwo: 'くぉ',\n kuxo: 'くぉ',\n kulo: 'くぉ',\n};\n\n/* eslint-enable */\nfunction createRomajiToKanaMap() {\n const kanaTree = transform(BASIC_KUNREI);\n // pseudo partial application\n const subtreeOf = (string) => getSubTreeOf(kanaTree, string);\n\n // add tya, sya, etc.\n Object.entries(CONSONANTS).forEach(([consonant, yKana]) => {\n Object.entries(SMALL_Y).forEach(([roma, kana]) => {\n // for example kyo -> き + ょ\n subtreeOf(consonant + roma)[''] = yKana + kana;\n });\n });\n\n Object.entries(SPECIAL_SYMBOLS).forEach(([symbol, jsymbol]) => {\n subtreeOf(symbol)[''] = jsymbol;\n });\n\n Object.entries(K_CONSTRUCTIONS).forEach(([symbol, jsymbol]) => {\n subtreeOf(symbol)[''] = jsymbol;\n });\n\n // things like うぃ, くぃ, etc.\n Object.entries(AIUEO_CONSTRUCTIONS).forEach(([consonant, aiueoKana]) => {\n Object.entries(SMALL_VOWELS).forEach(([vowel, kana]) => {\n const subtree = subtreeOf(consonant + vowel);\n subtree[''] = aiueoKana + kana;\n });\n });\n\n // different ways to write ん\n ['n', \"n'\", 'xn'].forEach((nChar) => {\n subtreeOf(nChar)[''] = 'ん';\n });\n\n // c is equivalent to k, but not for chi, cha, etc. that's why we have to make a copy of k\n kanaTree.c = JSON.parse(JSON.stringify(kanaTree.k));\n\n Object.entries(ALIASES).forEach(([string, alternative]) => {\n const allExceptLast = string.slice(0, string.length - 1);\n const last = string.charAt(string.length - 1);\n const parentTree = subtreeOf(allExceptLast);\n // copy to avoid recursive containment\n parentTree[last] = JSON.parse(JSON.stringify(subtreeOf(alternative)));\n });\n\n function getAlternatives(string) {\n return [...Object.entries(ALIASES), ...[['c', 'k']]].reduce(\n (list, [alt, roma]) => (string.startsWith(roma) ? list.concat(string.replace(roma, alt)) : list),\n []\n );\n }\n\n Object.entries(SMALL_LETTERS).forEach(([kunreiRoma, kana]) => {\n const last = (char) => char.charAt(char.length - 1);\n const allExceptLast = (chars) => chars.slice(0, chars.length - 1);\n const xRoma = `x${kunreiRoma}`;\n const xSubtree = subtreeOf(xRoma);\n xSubtree[''] = kana;\n\n // ltu -> xtu -> っ\n const parentTree = subtreeOf(`l${allExceptLast(kunreiRoma)}`);\n parentTree[last(kunreiRoma)] = xSubtree;\n\n // ltsu -> ltu -> っ\n getAlternatives(kunreiRoma).forEach((altRoma) => {\n ['l', 'x'].forEach((prefix) => {\n const altParentTree = subtreeOf(prefix + allExceptLast(altRoma));\n altParentTree[last(altRoma)] = subtreeOf(prefix + kunreiRoma);\n });\n });\n });\n\n Object.entries(SPECIAL_CASES).forEach(([string, kana]) => {\n subtreeOf(string)[''] = kana;\n });\n\n // add kka, tta, etc.\n function addTsu(tree) {\n return Object.entries(tree).reduce((tsuTree, [key, value]) => {\n if (!key) {\n // we have reached the bottom of this branch\n tsuTree[key] = `っ${value}`;\n } else {\n // more subtrees\n tsuTree[key] = addTsu(value);\n }\n return tsuTree;\n }, {});\n }\n // have to explicitly name c here, because we made it a copy of k, not a reference\n [...Object.keys(CONSONANTS), 'c', 'y', 'w', 'j'].forEach((consonant) => {\n const subtree = kanaTree[consonant];\n subtree[consonant] = addTsu(subtree);\n });\n // nn should not be っん\n delete kanaTree.n.n;\n // solidify the results, so that there there is referential transparency within the tree\n return Object.freeze(JSON.parse(JSON.stringify(kanaTree)));\n}\n\nlet romajiToKanaMap = null;\n\nexport function getRomajiToKanaTree() {\n if (romajiToKanaMap == null) {\n romajiToKanaMap = createRomajiToKanaMap();\n }\n return romajiToKanaMap;\n}\n\nexport const USE_OBSOLETE_KANA_MAP = createCustomMapping({\n wi: 'ゐ',\n we: 'ゑ',\n});\n\nexport function IME_MODE_MAP(map) {\n // in IME mode, we do not want to convert single ns\n const mapCopy = JSON.parse(JSON.stringify(map));\n mapCopy.n.n = { '': 'ん' };\n mapCopy.n[' '] = { '': 'ん' };\n return mapCopy;\n}\n","import isEmpty from './isEmpty';\nimport isCharInRange from './isCharInRange';\nimport { LATIN_UPPERCASE_START, LATIN_UPPERCASE_END } from '../constants';\n\n/**\n * Tests if char is in English unicode uppercase range\n * @param {String} char\n * @return {Boolean}\n */\nfunction isCharUpperCase(char = '') {\n if (isEmpty(char)) return false;\n return isCharInRange(char, LATIN_UPPERCASE_START, LATIN_UPPERCASE_END);\n}\n\nexport default isCharUpperCase;\n","import isEmpty from './isEmpty';\nimport { PROLONGED_SOUND_MARK } from '../constants';\n\n/**\n * Returns true if char is 'ー'\n * @param {String} char to test\n * @return {Boolean}\n */\nfunction isCharLongDash(char = '') {\n if (isEmpty(char)) return false;\n return char.charCodeAt(0) === PROLONGED_SOUND_MARK;\n}\n\nexport default isCharLongDash;\n","import isEmpty from './isEmpty';\nimport { KANA_SLASH_DOT } from '../constants';\n\n/**\n * Tests if char is '・'\n * @param {String} char\n * @return {Boolean} true if '・'\n */\nfunction isCharSlashDot(char = '') {\n if (isEmpty(char)) return false;\n return char.charCodeAt(0) === KANA_SLASH_DOT;\n}\n\nexport default isCharSlashDot;\n","import isEmpty from './isEmpty';\nimport isCharLongDash from './isCharLongDash';\nimport isCharInRange from './isCharInRange';\nimport {\n HIRAGANA_START,\n HIRAGANA_END,\n} from '../constants';\n\n/**\n * Tests a character. Returns true if the character is [Hiragana](https://en.wikipedia.org/wiki/Hiragana).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharHiragana(char = '') {\n if (isEmpty(char)) return false;\n if (isCharLongDash(char)) return true;\n return isCharInRange(char, HIRAGANA_START, HIRAGANA_END);\n}\n\nexport default isCharHiragana;\n","import { KATAKANA_START, HIRAGANA_START } from '../constants';\n\nimport isCharLongDash from './isCharLongDash';\nimport isCharSlashDot from './isCharSlashDot';\nimport isCharHiragana from './isCharHiragana';\n\n/**\n * Convert [Hiragana](https://en.wikipedia.org/wiki/Hiragana) to [Katakana](https://en.wikipedia.org/wiki/Katakana)\n * Passes through any non-hiragana chars\n * @private\n * @param {String} [input=''] text input\n * @return {String} converted text\n * @example\n * hiraganaToKatakana('ひらがな')\n * // => \"ヒラガナ\"\n * hiraganaToKatakana('ひらがな is a type of kana')\n * // => \"ヒラガナ is a type of kana\"\n */\nfunction hiraganaToKatakana(input = '') {\n const kata = [];\n input.split('').forEach((char) => {\n // Short circuit to avoid incorrect codeshift for 'ー' and '・'\n if (isCharLongDash(char) || isCharSlashDot(char)) {\n kata.push(char);\n } else if (isCharHiragana(char)) {\n // Shift charcode.\n const code = char.charCodeAt(0) + (KATAKANA_START - HIRAGANA_START);\n const kataChar = String.fromCharCode(code);\n kata.push(kataChar);\n } else {\n // Pass non-hiragana chars through\n kata.push(char);\n }\n });\n return kata.join('');\n}\n\nexport default hiraganaToKatakana;\n","import memoizeOne from 'memoize-one';\nimport { dequal } from 'dequal';\n\nimport { TO_KANA_METHODS } from './constants';\nimport mergeWithDefaultOptions from './utils/mergeWithDefaultOptions';\nimport {\n getRomajiToKanaTree,\n IME_MODE_MAP,\n USE_OBSOLETE_KANA_MAP,\n} from './utils/romajiToKanaMap';\nimport { applyMapping, mergeCustomMapping } from './utils/kanaMapping';\nimport isCharUpperCase from './utils/isCharUpperCase';\nimport hiraganaToKatakana from './utils/hiraganaToKatakana';\n\n// memoize and deeply compare args so we only recreate when necessary\nexport const createRomajiToKanaMap = memoizeOne(\n (IMEMode, useObsoleteKana, customKanaMapping) => {\n let map = getRomajiToKanaTree();\n\n map = IMEMode ? IME_MODE_MAP(map) : map;\n map = useObsoleteKana ? USE_OBSOLETE_KANA_MAP(map) : map;\n\n if (customKanaMapping) {\n map = mergeCustomMapping(map, customKanaMapping);\n }\n\n return map;\n },\n dequal\n);\n\n/**\n * Convert [Romaji](https://en.wikipedia.org/wiki/Romaji) to [Kana](https://en.wikipedia.org/wiki/Kana), lowercase text will result in [Hiragana](https://en.wikipedia.org/wiki/Hiragana) and uppercase text will result in [Katakana](https://en.wikipedia.org/wiki/Katakana).\n * @param {String} [input=''] text\n * @param {DefaultOptions} [options=defaultOptions]\n * @return {String} converted text\n * @example\n * toKana('onaji BUTTSUUJI')\n * // => 'おなじ ブッツウジ'\n * toKana('ONAJI buttsuuji')\n * // => 'オナジ ぶっつうじ'\n * toKana('座禅‘zazen’スタイル')\n * // => '座禅「ざぜん」スタイル'\n * toKana('batsuge-mu')\n * // => 'ばつげーむ'\n * toKana('!?.:/,~-‘’“”[](){}') // Punctuation conversion\n * // => '!?。:・、〜ー「」『』[](){}'\n * toKana('we', { useObsoleteKana: true })\n * // => 'ゑ'\n * toKana('wanakana', { customKanaMapping: { na: 'に', ka: 'bana' } });\n * // => 'わにbanaに'\n */\nexport function toKana(input = '', options = {}, map) {\n let config;\n if (!map) {\n config = mergeWithDefaultOptions(options);\n map = createRomajiToKanaMap(\n config.IMEMode,\n config.useObsoleteKana,\n config.customKanaMapping\n );\n } else {\n config = options;\n }\n\n // throw away the substring index information and just concatenate all the kana\n return splitIntoConvertedKana(input, config, map)\n .map((kanaToken) => {\n const [start, end, kana] = kanaToken;\n if (kana === null) {\n // haven't converted the end of the string, since we are in IME mode\n return input.slice(start);\n }\n const enforceHiragana = config.IMEMode === TO_KANA_METHODS.HIRAGANA;\n const enforceKatakana =\n config.IMEMode === TO_KANA_METHODS.KATAKANA ||\n [...input.slice(start, end)].every(isCharUpperCase);\n\n return enforceHiragana || !enforceKatakana\n ? kana\n : hiraganaToKatakana(kana);\n })\n .join('');\n}\n\n/**\n *\n * @private\n * @param {String} [input=''] input text\n * @param {DefaultOptions} [options=defaultOptions] toKana options\n * @param {Object} [map] custom mapping\n * @returns {Array[]} [[start, end, token]]\n * @example\n * splitIntoConvertedKana('buttsuuji')\n * // => [[0, 2, 'ぶ'], [2, 6, 'っつ'], [6, 7, 'う'], [7, 9, 'じ']]\n */\nexport function splitIntoConvertedKana(input = '', options = {}, map) {\n const { IMEMode, useObsoleteKana, customKanaMapping } = options;\n\n if (!map) {\n map = createRomajiToKanaMap(IMEMode, useObsoleteKana, customKanaMapping);\n }\n\n return applyMapping(input.toLowerCase(), map, !IMEMode);\n}\n\nexport default toKana;\n","import isJapanese from '../isJapanese';\nimport toKana, { createRomajiToKanaMap } from '../toKana';\nimport mergeWithDefaultOptions from './mergeWithDefaultOptions';\n\nlet LISTENERS = [];\n/**\n * Automagically replaces input values with converted text to kana\n * @param {defaultOptions} [options] user config overrides, default conversion is toKana()\n * @return {Function} event handler with bound options\n * @private\n */\nexport function makeOnInput(options) {\n let prevInput;\n // Enforce IMEMode if not already specified\n const mergedConfig = Object.assign({}, mergeWithDefaultOptions(options), {\n IMEMode: options.IMEMode || true,\n });\n const preConfiguredMap = createRomajiToKanaMap(mergedConfig);\n const triggers = [\n ...Object.keys(preConfiguredMap),\n ...Object.keys(preConfiguredMap).map((char) => char.toUpperCase()),\n ];\n\n return function onInput({ target }) {\n if (target.value !== prevInput && target.dataset.ignoreComposition !== 'true') {\n convertInput(target, mergedConfig, preConfiguredMap, triggers, prevInput);\n }\n };\n}\n\nexport function convertInput(target, options, map, triggers, prevInput) {\n const [head, textToConvert, tail] = splitInput(target.value, target.selectionEnd, triggers);\n const convertedText = toKana(textToConvert, options, map);\n const changed = textToConvert !== convertedText;\n\n if (changed) {\n const newCursor = head.length + convertedText.length;\n const newValue = head + convertedText + tail;\n target.value = newValue;\n prevInput = newValue;\n\n if (tail.length) {\n // push later on event loop (otherwise mid-text insertion can be 1 char too far to the right)\n setTimeout(() => target.setSelectionRange(newCursor, newCursor), 1);\n } else {\n target.setSelectionRange(newCursor, newCursor);\n }\n } else {\n prevInput = target.value;\n }\n}\n\nexport function onComposition({ type, target, data }) {\n // navigator.platform is not 100% reliable for singling out all OS,\n // but for determining desktop \"Mac OS\" it is effective enough.\n const isMacOS = /Mac/.test(window.navigator && window.navigator.platform);\n // We don't want to ignore on Android:\n // https://github.com/WaniKani/WanaKana/issues/82\n // But MacOS IME auto-closes if we don't ignore:\n // https://github.com/WaniKani/WanaKana/issues/71\n // Other platform Japanese IMEs pass through happily\n if (isMacOS) {\n if (type === 'compositionupdate' && isJapanese(data)) {\n target.dataset.ignoreComposition = 'true';\n }\n\n if (type === 'compositionend') {\n target.dataset.ignoreComposition = 'false';\n }\n }\n}\n\nexport function trackListeners(id, inputHandler, compositionHandler) {\n LISTENERS = LISTENERS.concat({\n id,\n inputHandler,\n compositionHandler,\n });\n}\n\nexport function untrackListeners({ id: targetId }) {\n LISTENERS = LISTENERS.filter(({ id }) => id !== targetId);\n}\n\nexport function findListeners(el) {\n return el && LISTENERS.find(({ id }) => id === el.getAttribute('data-wanakana-id'));\n}\n\n// Handle non-terminal inserted input conversion:\n// | -> わ| -> わび| -> わ|び -> わs|び -> わsh|び -> わshi|び -> わし|び\n// or multiple ambiguous positioning (to select which \"s\" to work from)\n// こsこs|こsこ -> こsこso|こsこ -> こsこそ|こsこ\nexport function splitInput(text = '', cursor = 0, triggers = []) {\n let head;\n let toConvert;\n let tail;\n\n if (cursor === 0 && triggers.includes(text[0])) {\n [head, toConvert, tail] = workFromStart(text, triggers);\n } else if (cursor > 0) {\n [head, toConvert, tail] = workBackwards(text, cursor);\n } else {\n [head, toConvert] = takeWhileAndSlice(text, (char) => !triggers.includes(char));\n [toConvert, tail] = takeWhileAndSlice(toConvert, (char) => !isJapanese(char));\n }\n\n return [head, toConvert, tail];\n}\n\nfunction workFromStart(text, catalystChars) {\n return [\n '',\n ...takeWhileAndSlice(\n text,\n (char) => catalystChars.includes(char) || !isJapanese(char, /[0-9]/)\n ),\n ];\n}\n\nfunction workBackwards(text = '', startIndex = 0) {\n const [toConvert, head] = takeWhileAndSlice(\n [...text.slice(0, startIndex)].reverse(),\n (char) => !isJapanese(char)\n );\n return [\n head.reverse().join(''),\n toConvert\n .split('')\n .reverse()\n .join(''),\n text.slice(startIndex),\n ];\n}\n\nfunction takeWhileAndSlice(source = {}, predicate = (x) => !!x) {\n const result = [];\n const { length } = source;\n let i = 0;\n while (i < length && predicate(source[i], i)) {\n result.push(source[i]);\n i += 1;\n }\n return [result.join(''), source.slice(i)];\n}\n","/* eslint-disable no-console */\nconst onInput = ({ target: { value, selectionStart, selectionEnd } }) => console.log('input:', { value, selectionStart, selectionEnd });\nconst onCompositionStart = () => console.log('compositionstart');\nconst onCompositionUpdate = ({\n target: { value, selectionStart, selectionEnd },\n data,\n}) => console.log('compositionupdate', {\n data,\n value,\n selectionStart,\n selectionEnd,\n});\nconst onCompositionEnd = () => console.log('compositionend');\n\nconst events = {\n input: onInput,\n compositionstart: onCompositionStart,\n compositionupdate: onCompositionUpdate,\n compositionend: onCompositionEnd,\n};\n\nexport const addDebugListeners = (input) => {\n Object.entries(events).forEach(([event, handler]) => input.addEventListener(event, handler)\n );\n};\n\nexport const removeDebugListeners = (input) => {\n Object.entries(events).forEach(([event, handler]) => input.removeEventListener(event, handler)\n );\n};\n","import { makeOnInput, onComposition, trackListeners } from './utils/dom';\nimport { addDebugListeners } from './utils/logInputEvents';\n\nconst ELEMENTS = ['TEXTAREA', 'INPUT'];\n\nlet idCounter = 0;\nconst newId = () => {\n idCounter += 1;\n return `${Date.now()}${idCounter}`;\n};\n\n/**\n * Binds eventListener for 'input' events to an input field to automagically replace values with kana\n * Can pass `{ IMEMode: 'toHiragana' || 'toKatakana' }` to enforce kana conversion type\n * @param {HTMLElement} element textarea, input[type=\"text\"] etc\n * @param {DefaultOptions} [options=defaultOptions] defaults to { IMEMode: true } using `toKana`\n * @example\n * bind(document.querySelector('#myInput'));\n */\nfunction bind(element = {}, options = {}, debug = false) {\n if (!ELEMENTS.includes(element.nodeName)) {\n throw new Error(\n `Element provided to Wanakana bind() was not a valid input or textarea element.\\n Received: (${JSON.stringify(\n element\n )})`\n );\n }\n const onInput = makeOnInput(options);\n const id = newId();\n element.setAttribute('data-wanakana-id', id);\n element.setAttribute('lang', 'ja');\n element.setAttribute('autoCapitalize', 'none');\n element.setAttribute('autoCorrect', 'off');\n element.setAttribute('autoComplete', 'off');\n element.setAttribute('spellCheck', 'false');\n element.addEventListener('input', onInput);\n element.addEventListener('compositionupdate', onComposition);\n element.addEventListener('compositionend', onComposition);\n trackListeners(id, onInput, onComposition);\n if (debug === true) {\n addDebugListeners(element);\n }\n}\n\nexport default bind;\n","import isEmpty from './isEmpty';\nimport isCharInRange from './isCharInRange';\nimport { ROMAJI_RANGES } from '../constants';\n\n/**\n * Tests a character. Returns true if the character is [Romaji](https://en.wikipedia.org/wiki/Romaji) (allowing [Hepburn romanisation](https://en.wikipedia.org/wiki/Hepburn_romanization))\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharRomaji(char = '') {\n if (isEmpty(char)) return false;\n return ROMAJI_RANGES.some(([start, end]) => isCharInRange(char, start, end));\n}\n\nexport default isCharRomaji;\n","import typeOf from './utils/typeOf';\nimport isEmpty from './utils/isEmpty';\nimport isCharRomaji from './utils/isCharRomaji';\n\n/**\n * Test if `input` is [Romaji](https://en.wikipedia.org/wiki/Romaji) (allowing [Hepburn romanisation](https://en.wikipedia.org/wiki/Hepburn_romanization))\n * @param {String} [input=''] text\n * @param {Regexp} [allowed] additional test allowed to pass for each char\n * @return {Boolean} true if [Romaji](https://en.wikipedia.org/wiki/Romaji)\n * @example\n * isRomaji('Tōkyō and Ōsaka')\n * // => true\n * isRomaji('12a*b&c-d')\n * // => true\n * isRomaji('あアA')\n * // => false\n * isRomaji('お願い')\n * // => false\n * isRomaji('a!b&cーd') // Zenkaku punctuation fails\n * // => false\n * isRomaji('a!b&cーd', /[!ー]/)\n * // => true\n */\nfunction isRomaji(input = '', allowed) {\n const augmented = typeOf(allowed) === 'regexp';\n return isEmpty(input)\n ? false\n : [...input].every((char) => {\n const isRoma = isCharRomaji(char);\n return !augmented ? isRoma : isRoma || allowed.test(char);\n });\n}\n\nexport default isRomaji;\n","import {\n KATAKANA_START,\n KATAKANA_END,\n} from '../constants';\n\nimport isCharInRange from './isCharInRange';\n\n/**\n * Tests a character. Returns true if the character is [Katakana](https://en.wikipedia.org/wiki/Katakana).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharKatakana(char = '') {\n return isCharInRange(char, KATAKANA_START, KATAKANA_END);\n}\n\nexport default isCharKatakana;\n","import isEmpty from './isEmpty';\nimport isCharHiragana from './isCharHiragana';\nimport isCharKatakana from './isCharKatakana';\n\n/**\n * Tests a character. Returns true if the character is [Hiragana](https://en.wikipedia.org/wiki/Hiragana) or [Katakana](https://en.wikipedia.org/wiki/Katakana).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharKana(char = '') {\n if (isEmpty(char)) return false;\n return isCharHiragana(char) || isCharKatakana(char);\n}\n\nexport default isCharKana;\n","import isEmpty from './utils/isEmpty';\nimport isCharKana from './utils/isCharKana';\n\n/**\n * Test if `input` is [Kana](https://en.wikipedia.org/wiki/Kana) ([Katakana](https://en.wikipedia.org/wiki/Katakana) and/or [Hiragana](https://en.wikipedia.org/wiki/Hiragana))\n * @param {String} [input=''] text\n * @return {Boolean} true if all [Kana](https://en.wikipedia.org/wiki/Kana)\n * @example\n * isKana('あ')\n * // => true\n * isKana('ア')\n * // => true\n * isKana('あーア')\n * // => true\n * isKana('A')\n * // => false\n * isKana('あAア')\n * // => false\n */\nfunction isKana(input = '') {\n if (isEmpty(input)) return false;\n return [...input].every(isCharKana);\n}\n\nexport default isKana;\n","import isEmpty from './utils/isEmpty';\nimport isCharHiragana from './utils/isCharHiragana';\n\n/**\n * Test if `input` is [Hiragana](https://en.wikipedia.org/wiki/Hiragana)\n * @param {String} [input=''] text\n * @return {Boolean} true if all [Hiragana](https://en.wikipedia.org/wiki/Hiragana)\n * @example\n * isHiragana('げーむ')\n * // => true\n * isHiragana('A')\n * // => false\n * isHiragana('あア')\n * // => false\n */\nfunction isHiragana(input = '') {\n if (isEmpty(input)) return false;\n return [...input].every(isCharHiragana);\n}\n\nexport default isHiragana;\n","import isEmpty from './utils/isEmpty';\nimport isCharKatakana from './utils/isCharKatakana';\n\n/**\n * Test if `input` is [Katakana](https://en.wikipedia.org/wiki/Katakana)\n * @param {String} [input=''] text\n * @return {Boolean} true if all [Katakana](https://en.wikipedia.org/wiki/Katakana)\n * @example\n * isKatakana('ゲーム')\n * // => true\n * isKatakana('あ')\n * // => false\n * isKatakana('A')\n * // => false\n * isKatakana('あア')\n * // => false\n */\nfunction isKatakana(input = '') {\n if (isEmpty(input)) return false;\n return [...input].every(isCharKatakana);\n}\n\nexport default isKatakana;\n","import {\n KANJI_START,\n KANJI_END,\n} from '../constants';\n\nimport isCharInRange from './isCharInRange';\n/**\n * Tests a character. Returns true if the character is a CJK ideograph (kanji).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharKanji(char = '') {\n return isCharInRange(char, KANJI_START, KANJI_END);\n}\n\nexport default isCharKanji;\n","import isEmpty from './utils/isEmpty';\nimport isCharKanji from './utils/isCharKanji';\n\n/**\n * Tests if `input` is [Kanji](https://en.wikipedia.org/wiki/Kanji) ([Japanese CJK ideographs](https://en.wikipedia.org/wiki/CJK_Unified_Ideographs))\n * @param {String} [input=''] text\n * @return {Boolean} true if all [Kanji](https://en.wikipedia.org/wiki/Kanji)\n * @example\n * isKanji('刀')\n * // => true\n * isKanji('切腹')\n * // => true\n * isKanji('勢い')\n * // => false\n * isKanji('あAア')\n * // => false\n * isKanji('🐸')\n * // => false\n */\nfunction isKanji(input = '') {\n if (isEmpty(input)) return false;\n return [...input].every(isCharKanji);\n}\n\nexport default isKanji;\n","import isKanji from './isKanji';\nimport isHiragana from './isHiragana';\nimport isKatakana from './isKatakana';\nimport isRomaji from './isRomaji';\n\n/**\n * Test if `input` contains a mix of [Romaji](https://en.wikipedia.org/wiki/Romaji) *and* [Kana](https://en.wikipedia.org/wiki/Kana), defaults to pass through [Kanji](https://en.wikipedia.org/wiki/Kanji)\n * @param {String} input text\n * @param {Object} [options={ passKanji: true }] optional config to pass through kanji\n * @return {Boolean} true if mixed\n * @example\n * isMixed('Abあア'))\n * // => true\n * isMixed('お腹A')) // ignores kanji by default\n * // => true\n * isMixed('お腹A', { passKanji: false }))\n * // => false\n * isMixed('ab'))\n * // => false\n * isMixed('あア'))\n * // => false\n */\nfunction isMixed(input = '', options = { passKanji: true }) {\n const chars = [...input];\n let hasKanji = false;\n if (!options.passKanji) {\n hasKanji = chars.some(isKanji);\n }\n return (chars.some(isHiragana) || chars.some(isKatakana)) && chars.some(isRomaji) && !hasKanji;\n}\n\nexport default isMixed;\n","import { KATAKANA_START, HIRAGANA_START } from '../constants';\n\nimport isCharLongDash from './isCharLongDash';\nimport isCharSlashDot from './isCharSlashDot';\nimport isCharKatakana from './isCharKatakana';\nconst isCharInitialLongDash = (char, index) => isCharLongDash(char) && index < 1;\nconst isCharInnerLongDash = (char, index) => isCharLongDash(char) && index > 0;\nconst isKanaAsSymbol = (char) => ['ヶ', 'ヵ'].includes(char);\nconst LONG_VOWELS = {\n a: 'あ',\n i: 'い',\n u: 'う',\n e: 'え',\n o: 'う',\n};\n\n// inject toRomaji to avoid circular dependency between toRomaji <-> katakanaToHiragana\nfunction katakanaToHiragana(\n input = '',\n toRomaji,\n { isDestinationRomaji, convertLongVowelMark } = {}\n) {\n let previousKana = '';\n\n return input\n .split('')\n .reduce((hira, char, index) => {\n // Short circuit to avoid incorrect codeshift for 'ー' and '・'\n if (\n isCharSlashDot(char)\n || isCharInitialLongDash(char, index)\n || isKanaAsSymbol(char)\n ) {\n return hira.concat(char);\n }\n\n // Transform long vowels: 'オー' to 'おう'\n if (\n convertLongVowelMark\n && previousKana\n && isCharInnerLongDash(char, index)\n ) {\n // Transform previousKana back to romaji, and slice off the vowel\n const romaji = toRomaji(previousKana).slice(-1);\n // However, ensure 'オー' => 'おお' => 'oo' if this is a transform on the way to romaji\n if (\n isCharKatakana(input[index - 1])\n && romaji === 'o'\n && isDestinationRomaji\n ) {\n return hira.concat('お');\n }\n return hira.concat(LONG_VOWELS[romaji]);\n // Transform all other chars\n }\n\n if (!isCharLongDash(char) && isCharKatakana(char)) {\n const code = char.charCodeAt(0) + (HIRAGANA_START - KATAKANA_START);\n const hiraChar = String.fromCharCode(code);\n previousKana = hiraChar;\n return hira.concat(hiraChar);\n }\n\n // Pass non katakana chars through\n previousKana = '';\n return hira.concat(char);\n }, [])\n .join('');\n}\n\nexport default katakanaToHiragana;\n","import { transform, getSubTreeOf } from './kanaMapping';\nimport { ROMANIZATIONS } from '../constants';\n\nlet kanaToHepburnMap = null;\n\n/* eslint-disable */\n// prettier-ignore\nconst BASIC_ROMAJI = {\n あ:'a', い:'i', う:'u', え:'e', お:'o',\n か:'ka', き:'ki', く:'ku', け:'ke', こ:'ko',\n さ:'sa', し:'shi', す:'su', せ:'se', そ:'so',\n た:'ta', ち:'chi', つ:'tsu', て:'te', と:'to',\n な:'na', に:'ni', ぬ:'nu', ね:'ne', の:'no',\n は:'ha', ひ:'hi', ふ:'fu', へ:'he', ほ:'ho',\n ま:'ma', み:'mi', む:'mu', め:'me', も:'mo',\n ら:'ra', り:'ri', る:'ru', れ:'re', ろ:'ro',\n や:'ya', ゆ:'yu', よ:'yo',\n わ:'wa', ゐ:'wi', ゑ:'we', を:'wo',\n ん: 'n',\n が:'ga', ぎ:'gi', ぐ:'gu', げ:'ge', ご:'go',\n ざ:'za', じ:'ji', ず:'zu', ぜ:'ze', ぞ:'zo',\n だ:'da', ぢ:'ji', づ:'zu', で:'de', ど:'do',\n ば:'ba', び:'bi', ぶ:'bu', べ:'be', ぼ:'bo',\n ぱ:'pa', ぴ:'pi', ぷ:'pu', ぺ:'pe', ぽ:'po',\n ゔぁ:'va', ゔぃ:'vi', ゔ:'vu', ゔぇ:'ve', ゔぉ:'vo',\n};\n/* eslint-enable */\n\nconst SPECIAL_SYMBOLS = {\n '。': '.',\n '、': ',',\n ':': ':',\n '・': '/',\n '!': '!',\n '?': '?',\n '〜': '~',\n 'ー': '-',\n '「': '‘',\n '」': '’',\n '『': '“',\n '』': '”',\n '[': '[',\n ']': ']',\n '(': '(',\n ')': ')',\n '{': '{',\n '}': '}',\n ' ': ' ',\n};\n\n// んい -> n'i\nconst AMBIGUOUS_VOWELS = ['あ', 'い', 'う', 'え', 'お', 'や', 'ゆ', 'よ'];\nconst SMALL_Y = { ゃ: 'ya', ゅ: 'yu', ょ: 'yo' };\nconst SMALL_Y_EXTRA = { ぃ: 'yi', ぇ: 'ye' };\nconst SMALL_AIUEO = {\n ぁ: 'a',\n ぃ: 'i',\n ぅ: 'u',\n ぇ: 'e',\n ぉ: 'o',\n};\nconst YOON_KANA = [\n 'き',\n 'に',\n 'ひ',\n 'み',\n 'り',\n 'ぎ',\n 'び',\n 'ぴ',\n 'ゔ',\n 'く',\n 'ふ',\n];\nconst YOON_EXCEPTIONS = {\n し: 'sh',\n ち: 'ch',\n じ: 'j',\n ぢ: 'j',\n};\nconst SMALL_KANA = {\n っ: '',\n ゃ: 'ya',\n ゅ: 'yu',\n ょ: 'yo',\n ぁ: 'a',\n ぃ: 'i',\n ぅ: 'u',\n ぇ: 'e',\n ぉ: 'o',\n};\n\n// going with the intuitive (yet incorrect) solution where っや -> yya and っぃ -> ii\n// in other words, just assume the sokuon could have been applied to anything\nconst SOKUON_WHITELIST = {\n b: 'b',\n c: 't',\n d: 'd',\n f: 'f',\n g: 'g',\n h: 'h',\n j: 'j',\n k: 'k',\n m: 'm',\n p: 'p',\n q: 'q',\n r: 'r',\n s: 's',\n t: 't',\n v: 'v',\n w: 'w',\n x: 'x',\n z: 'z',\n};\n\nfunction getKanaToHepburnTree() {\n if (kanaToHepburnMap == null) {\n kanaToHepburnMap = createKanaToHepburnMap();\n }\n return kanaToHepburnMap;\n}\n\nexport function getKanaToRomajiTree(romanization) {\n switch (romanization) {\n case ROMANIZATIONS.HEPBURN:\n return getKanaToHepburnTree();\n default:\n return {};\n }\n}\n\nfunction createKanaToHepburnMap() {\n const romajiTree = transform(BASIC_ROMAJI);\n\n const subtreeOf = (string) => getSubTreeOf(romajiTree, string);\n const setTrans = (string, transliteration) => {\n subtreeOf(string)[''] = transliteration;\n };\n\n Object.entries(SPECIAL_SYMBOLS).forEach(([jsymbol, symbol]) => {\n subtreeOf(jsymbol)[''] = symbol;\n });\n\n [...Object.entries(SMALL_Y), ...Object.entries(SMALL_AIUEO)].forEach(\n ([roma, kana]) => {\n setTrans(roma, kana);\n }\n );\n\n // きゃ -> kya\n YOON_KANA.forEach((kana) => {\n const firstRomajiChar = subtreeOf(kana)[''][0];\n Object.entries(SMALL_Y).forEach(([yKana, yRoma]) => {\n setTrans(kana + yKana, firstRomajiChar + yRoma);\n });\n // きぃ -> kyi\n Object.entries(SMALL_Y_EXTRA).forEach(([yKana, yRoma]) => {\n setTrans(kana + yKana, firstRomajiChar + yRoma);\n });\n });\n\n Object.entries(YOON_EXCEPTIONS).forEach(([kana, roma]) => {\n // じゃ -> ja\n Object.entries(SMALL_Y).forEach(([yKana, yRoma]) => {\n setTrans(kana + yKana, roma + yRoma[1]);\n });\n // じぃ -> jyi, じぇ -> je\n setTrans(`${kana}ぃ`, `${roma}yi`);\n setTrans(`${kana}ぇ`, `${roma}e`);\n });\n\n romajiTree['っ'] = resolveTsu(romajiTree);\n\n Object.entries(SMALL_KANA).forEach(([kana, roma]) => {\n setTrans(kana, roma);\n });\n\n AMBIGUOUS_VOWELS.forEach((kana) => {\n setTrans(`ん${kana}`, `n'${subtreeOf(kana)['']}`);\n });\n\n // NOTE: could be re-enabled with an option?\n // // んば -> mbo\n // const LABIAL = [\n // 'ば', 'び', 'ぶ', 'べ', 'ぼ',\n // 'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ',\n // 'ま', 'み', 'む', 'め', 'も',\n // ];\n // LABIAL.forEach((kana) => {\n // setTrans(`ん${kana}`, `m${subtreeOf(kana)['']}`);\n // });\n\n return Object.freeze(JSON.parse(JSON.stringify(romajiTree)));\n}\n\nfunction resolveTsu(tree) {\n return Object.entries(tree).reduce((tsuTree, [key, value]) => {\n if (!key) {\n // we have reached the bottom of this branch\n const consonant = value.charAt(0);\n tsuTree[key] = Object.keys(SOKUON_WHITELIST).includes(consonant)\n ? SOKUON_WHITELIST[consonant] + value\n : value;\n } else {\n // more subtrees\n tsuTree[key] = resolveTsu(value);\n }\n return tsuTree;\n }, {});\n}\n","import memoizeOne from 'memoize-one';\nimport { dequal } from 'dequal';\n\nimport mergeWithDefaultOptions from './utils/mergeWithDefaultOptions';\nimport katakanaToHiragana from './utils/katakanaToHiragana';\nimport isKatakana from './isKatakana';\nimport { getKanaToRomajiTree } from './utils/kanaToRomajiMap';\nimport { applyMapping, mergeCustomMapping } from './utils/kanaMapping';\n\n// memoize and deeply compare args so we only recreate when necessary\nexport const createKanaToRomajiMap = memoizeOne(\n (romanization, customRomajiMapping) => {\n let map = getKanaToRomajiTree(romanization);\n\n if (customRomajiMapping) {\n map = mergeCustomMapping(map, customRomajiMapping);\n }\n\n return map;\n },\n dequal\n);\n\n/**\n * Convert kana to romaji\n * @param {String} kana text input\n * @param {DefaultOptions} [options=defaultOptions]\n * @param {Object} map custom mapping\n * @return {String} converted text\n * @example\n * toRomaji('ひらがな カタカナ')\n * // => 'hiragana katakana'\n * toRomaji('げーむ ゲーム')\n * // => 'ge-mu geemu'\n * toRomaji('ひらがな カタカナ', { upcaseKatakana: true })\n * // => 'hiragana KATAKANA'\n * toRomaji('つじぎり', { customRomajiMapping: { じ: 'zi', つ: 'tu', り: 'li' } });\n * // => 'tuzigili'\n */\nexport function toRomaji(input = '', options = {}, map) {\n const config = mergeWithDefaultOptions(options);\n\n if (!map) {\n map = createKanaToRomajiMap(\n config.romanization,\n config.customRomajiMapping\n );\n }\n\n // just throw away the substring index information and simply concatenate all the kana\n return splitIntoRomaji(input, config, map)\n .map((romajiToken) => {\n const [start, end, romaji] = romajiToken;\n const makeUpperCase = config.upcaseKatakana && isKatakana(input.slice(start, end));\n return makeUpperCase ? romaji.toUpperCase() : romaji;\n })\n .join('');\n}\n\nfunction splitIntoRomaji(input, options, map) {\n if (!map) {\n map = createKanaToRomajiMap(\n options.romanization,\n options.customRomajiMapping\n );\n }\n\n const config = Object.assign({}, { isDestinationRomaji: true }, options);\n\n return applyMapping(\n katakanaToHiragana(input, toRomaji, config),\n map,\n !options.IMEMode\n );\n}\n\nexport default toRomaji;\n","import isEmpty from './isEmpty';\nimport { EN_PUNCTUATION_RANGES } from '../constants';\nimport isCharInRange from './isCharInRange';\n\n/**\n * Tests a character. Returns true if the character is considered English punctuation.\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharEnglishPunctuation(char = '') {\n if (isEmpty(char)) return false;\n return EN_PUNCTUATION_RANGES.some(([start, end]) => isCharInRange(char, start, end));\n}\n\nexport default isCharEnglishPunctuation;\n","import isEmpty from './isEmpty';\nimport { JA_PUNCTUATION_RANGES } from '../constants';\nimport isCharInRange from './isCharInRange';\n\n/**\n * Tests a character. Returns true if the character is considered English punctuation.\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharJapanesePunctuation(char = '') {\n if (isEmpty(char)) return false;\n return JA_PUNCTUATION_RANGES.some(([start, end]) => isCharInRange(char, start, end));\n}\n\nexport default isCharJapanesePunctuation;\n","import isEmpty from './utils/isEmpty';\nimport isCharEnglishPunctuation from './utils/isCharEnglishPunctuation';\nimport isCharJapanesePunctuation from './utils/isCharJapanesePunctuation';\nimport isCharRomaji from './utils/isCharRomaji';\nimport isCharKanji from './utils/isCharKanji';\nimport isCharHiragana from './utils/isCharHiragana';\nimport isCharKatakana from './utils/isCharKatakana';\nimport isCharJapanese from './utils/isCharJapanese';\n\nconst isCharEnSpace = (x) => x === ' ';\nconst isCharJaSpace = (x) => x === ' ';\nconst isCharJaNum = (x) => /[0-9]/.test(x);\nconst isCharEnNum = (x) => /[0-9]/.test(x);\n\nexport const TOKEN_TYPES = {\n EN: 'en',\n JA: 'ja',\n EN_NUM: 'englishNumeral',\n JA_NUM: 'japaneseNumeral',\n EN_PUNC: 'englishPunctuation',\n JA_PUNC: 'japanesePunctuation',\n KANJI: 'kanji',\n HIRAGANA: 'hiragana',\n KATAKANA: 'katakana',\n SPACE: 'space',\n OTHER: 'other',\n};\n\n// prettier-ignore\nexport function getType(input, compact = false) {\n const {\n EN, JA, EN_NUM, JA_NUM, EN_PUNC, JA_PUNC, KANJI, HIRAGANA, KATAKANA, SPACE, OTHER,\n } = TOKEN_TYPES;\n\n if (compact) {\n switch (true) {\n case isCharJaNum(input): return OTHER;\n case isCharEnNum(input): return OTHER;\n case isCharEnSpace(input): return EN;\n case isCharEnglishPunctuation(input): return OTHER;\n case isCharJaSpace(input): return JA;\n case isCharJapanesePunctuation(input): return OTHER;\n case isCharJapanese(input): return JA;\n case isCharRomaji(input): return EN;\n default: return OTHER;\n }\n } else {\n switch (true) {\n case isCharJaSpace(input): return SPACE;\n case isCharEnSpace(input): return SPACE;\n case isCharJaNum(input): return JA_NUM;\n case isCharEnNum(input): return EN_NUM;\n case isCharEnglishPunctuation(input): return EN_PUNC;\n case isCharJapanesePunctuation(input): return JA_PUNC;\n case isCharKanji(input): return KANJI;\n case isCharHiragana(input): return HIRAGANA;\n case isCharKatakana(input): return KATAKANA;\n case isCharJapanese(input): return JA;\n case isCharRomaji(input): return EN;\n default: return OTHER;\n }\n }\n}\n\n/**\n * Splits input into array of strings separated by opinionated token types\n * `'en', 'ja', 'englishNumeral', 'japaneseNumeral','englishPunctuation', 'japanesePunctuation','kanji', 'hiragana', 'katakana', 'space', 'other'`.\n * If `{ compact: true }` then many same-language tokens are combined (spaces + text, kanji + kana, numeral + punctuation).\n * If `{ detailed: true }` then return array will contain `{ type, value }` instead of `'value'`\n * @param {String} input text\n * @param {Object} [options={ compact: false, detailed: false}] options to modify output style\n * @return {String|Object[]} text split into tokens containing values, or detailed object\n * @example\n * tokenize('ふふフフ')\n * // ['ふふ', 'フフ']\n *\n * tokenize('感じ')\n * // ['感', 'じ']\n *\n * tokenize('truly 私は悲しい')\n * // ['truly', ' ', '私', 'は', '悲', 'しい']\n *\n * tokenize('truly 私は悲しい', { compact: true })\n * // ['truly ', '私は悲しい']\n *\n * tokenize('5romaji here...!?漢字ひらがな4カタ カナ「SHIO」。!')\n * // [ '5', 'romaji', ' ', 'here', '...!?', '漢字', 'ひらがな', 'カタ', ' ', 'カナ', '4', '「', 'SHIO', '」。!']\n *\n * tokenize('5romaji here...!?漢字ひらがな4カタ カナ「SHIO」。!', { compact: true })\n * // [ '5', 'romaji here', '...!?', '漢字ひらがなカタ カナ', '4「', 'SHIO', '」。!']\n *\n * tokenize('5romaji here...!?漢字ひらがなカタ カナ4「SHIO」。! لنذهب', { detailed: true })\n * // [\n * { type: 'englishNumeral', value: '5' },\n * { type: 'en', value: 'romaji' },\n * { type: 'space', value: ' ' },\n * { type: 'en', value: 'here' },\n * { type: 'englishPunctuation', value: '...!?' },\n * { type: 'kanji', value: '漢字' },\n * { type: 'hiragana', value: 'ひらがな' },\n * { type: 'katakana', value: 'カタ' },\n * { type: 'space', value: ' ' },\n * { type: 'katakana', value: 'カナ' },\n * { type: 'japaneseNumeral', value: '4' },\n * { type: 'japanesePunctuation', value: '「' },\n * { type: 'ja', value: 'SHIO' },\n * { type: 'japanesePunctuation', value: '」。!' },\n * { type: 'space', value: ' ' },\n * { type: 'other', value: 'لنذهب' },\n * ]\n *\n * tokenize('5romaji here...!?漢字ひらがなカタ カナ4「SHIO」。! لنذهب', { compact: true, detailed: true})\n * // [\n * { type: 'other', value: '5' },\n * { type: 'en', value: 'romaji here' },\n * { type: 'other', value: '...!?' },\n * { type: 'ja', value: '漢字ひらがなカタ カナ' },\n * { type: 'other', value: '4「' },\n * { type: 'ja', value: 'SHIO' },\n * { type: 'other', value: '」。!' },\n * { type: 'en', value: ' ' },\n * { type: 'other', value: 'لنذهب' },\n *]\n */\nfunction tokenize(input, { compact = false, detailed = false } = {}) {\n if (input == null || isEmpty(input)) {\n return [];\n }\n const chars = [...input];\n let initial = chars.shift();\n let prevType = getType(initial, compact);\n initial = detailed ? { type: prevType, value: initial } : initial;\n\n const result = chars.reduce(\n (tokens, char) => {\n const currType = getType(char, compact);\n const sameType = currType === prevType;\n prevType = currType;\n let newValue = char;\n\n if (sameType) {\n newValue = (detailed ? tokens.pop().value : tokens.pop()) + newValue;\n }\n\n return detailed\n ? tokens.concat({ type: currType, value: newValue })\n : tokens.concat(newValue);\n },\n [initial]\n );\n return result;\n}\n\nexport default tokenize;\n","import isJapanese from './isJapanese';\nimport isKana from './isKana';\nimport isKanji from './isKanji';\nimport tokenize from './tokenize';\n\nconst isLeadingWithoutInitialKana = (input, leading) => leading && !isKana(input[0]);\nconst isTrailingWithoutFinalKana = (input, leading) => !leading && !isKana(input[input.length - 1]);\nconst isInvalidMatcher = (input, matchKanji) =>\n (matchKanji && ![...matchKanji].some(isKanji)) || (!matchKanji && isKana(input));\n\n/**\n * Strips [Okurigana](https://en.wikipedia.org/wiki/Okurigana)\n * @param {String} input text\n * @param {Object} [options={ leading: false, matchKanji: '' }] optional config\n * @return {String} text with okurigana removed\n * @example\n * stripOkurigana('踏み込む')\n * // => '踏み込'\n * stripOkurigana('お祝い')\n * // => 'お祝'\n * stripOkurigana('お腹', { leading: true });\n * // => '腹'\n * stripOkurigana('ふみこむ', { matchKanji: '踏み込む' });\n * // => 'ふみこ'\n * stripOkurigana('おみまい', { matchKanji: 'お祝い', leading: true });\n * // => 'みまい'\n */\nfunction stripOkurigana(input = '', { leading = false, matchKanji = '' } = {}) {\n if (\n !isJapanese(input) ||\n isLeadingWithoutInitialKana(input, leading) ||\n isTrailingWithoutFinalKana(input, leading) ||\n isInvalidMatcher(input, matchKanji)\n ) {\n return input;\n }\n\n const chars = matchKanji || input;\n const okuriganaRegex = new RegExp(\n leading ? `^${tokenize(chars).shift()}` : `${tokenize(chars).pop()}$`\n );\n return input.replace(okuriganaRegex, '');\n}\n\nexport default stripOkurigana;\n","import mergeWithDefaultOptions from './utils/mergeWithDefaultOptions';\nimport katakanaToHiragana from './utils/katakanaToHiragana';\nimport isCharEnglishPunctuation from './utils/isCharEnglishPunctuation';\nimport isRomaji from './isRomaji';\nimport isMixed from './isMixed';\nimport toKana from './toKana';\nimport toRomaji from './toRomaji';\n\n/**\n * Convert input to [Hiragana](https://en.wikipedia.org/wiki/Hiragana)\n * @param {String} [input=''] text\n * @param {DefaultOptions} [options=defaultOptions]\n * @return {String} converted text\n * @example\n * toHiragana('toukyou, オオサカ')\n * // => 'とうきょう、 おおさか'\n * toHiragana('only カナ', { passRomaji: true })\n * // => 'only かな'\n * toHiragana('wi')\n * // => 'うぃ'\n * toHiragana('wi', { useObsoleteKana: true })\n * // => 'ゐ'\n */\nfunction toHiragana(input = '', options = {}) {\n const config = mergeWithDefaultOptions(options);\n if (config.passRomaji) {\n return katakanaToHiragana(input, toRomaji, config);\n }\n\n if (isMixed(input, { passKanji: true })) {\n const convertedKatakana = katakanaToHiragana(input, toRomaji, config);\n return toKana(convertedKatakana.toLowerCase(), config);\n }\n\n if (isRomaji(input) || isCharEnglishPunctuation(input)) {\n return toKana(input.toLowerCase(), config);\n }\n\n return katakanaToHiragana(input, toRomaji, config);\n}\n\nexport default toHiragana;\n","import mergeWithDefaultOptions from './utils/mergeWithDefaultOptions';\nimport hiraganaToKatakana from './utils/hiraganaToKatakana';\nimport isCharEnglishPunctuation from './utils/isCharEnglishPunctuation';\nimport toKana from './toKana';\nimport isRomaji from './isRomaji';\nimport isMixed from './isMixed';\n\n/**\n * Convert input to [Katakana](https://en.wikipedia.org/wiki/Katakana)\n * @param {String} [input=''] text\n * @param {DefaultOptions} [options=defaultOptions]\n * @return {String} converted text\n * @example\n * toKatakana('toukyou, おおさか')\n * // => 'トウキョウ、 オオサカ'\n * toKatakana('only かな', { passRomaji: true })\n * // => 'only カナ'\n * toKatakana('wi')\n * // => 'ウィ'\n * toKatakana('wi', { useObsoleteKana: true })\n * // => 'ヰ'\n */\nfunction toKatakana(input = '', options = {}) {\n const mergedOptions = mergeWithDefaultOptions(options);\n if (mergedOptions.passRomaji) {\n return hiraganaToKatakana(input);\n }\n\n if (isMixed(input) || isRomaji(input) || isCharEnglishPunctuation(input)) {\n const hiragana = toKana(input.toLowerCase(), mergedOptions);\n return hiraganaToKatakana(hiragana);\n }\n\n return hiraganaToKatakana(input);\n}\n\nexport default toKatakana;\n","import { findListeners, untrackListeners } from './utils/dom';\nimport { removeDebugListeners } from './utils/logInputEvents';\n\n/**\n * Unbinds eventListener from input field\n * @param {HTMLElement} element textarea, input\n */\nexport function unbind(element, debug = false) {\n const listeners = findListeners(element);\n if (listeners == null) {\n throw new Error(\n `Element provided to Wanakana unbind() had no listener registered.\\n Received: ${JSON.stringify(\n element\n )}`\n );\n }\n const { inputHandler, compositionHandler } = listeners;\n element.removeAttribute('data-wanakana-id');\n element.removeAttribute('data-ignore-composition');\n element.removeEventListener('input', inputHandler);\n element.removeEventListener('compositionstart', compositionHandler);\n element.removeEventListener('compositionupdate', compositionHandler);\n element.removeEventListener('compositionend', compositionHandler);\n untrackListeners(listeners);\n if (debug === true) {\n removeDebugListeners(element);\n }\n}\n\nexport default unbind;\n"],"names":["typeOf","value","Object","_typeof","toString","call","slice","toLowerCase","isEmpty","input","length","isCharInRange","char","start","arguments","undefined","end","code","charCodeAt","VERSION","TO_KANA_METHODS","HIRAGANA","KATAKANA","ROMANIZATIONS","HEPBURN","DEFAULT_OPTIONS","useObsoleteKana","passRomaji","upcaseKatakana","IMEMode","convertLongVowelMark","romanization","HIRAGANA_START","KATAKANA_START","KANA_PUNCTUATION","JA_PUNCTUATION_RANGES","JAPANESE_RANGES","concat","ZENKAKU_UPPERCASE","ROMAJI_RANGES","EN_PUNCTUATION_RANGES","SMART_QUOTE_RANGES","isCharJapanese","some","_ref","_ref2","_slicedToArray","isJapanese","allowed","augmented","_toConsumableArray","every","isJa","test","safeIsNaN","Number","isNaN","areInputsEqual","newInputs","lastInputs","i","first","second","memoizeOne","resultFn","isEqual","cache","memoized","newArgs","_i","lastThis","this","lastArgs","lastResult","apply","clear","has","prototype","hasOwnProperty","find","iter","tar","key","_step","keys","_iterator","s","n","done","dequal","err","e","f","foo","bar","ctor","len","tmp","constructor","Date","getTime","RegExp","Array","Set","size","_step2","_iterator2","_createForOfIteratorHelper","Map","_step3","_iterator3","get","ArrayBuffer","Uint8Array","DataView","byteLength","getInt8","isView","mergeWithDefaultOptions","opts","assign","applyMapping","string","mapping","convertEnding","root","newChunk","remaining","currentCursor","firstChar","charAt","parse","tree","lastCursor","subtree","nextChar","nextSubtree","transform","entries","reduce","map","endOfBranch","getSubTreeOf","split","correctSubTree","createCustomMapping","customMap","customTree","forEach","_ref3","_ref4","roma","kana","subTree","transformMap","mapSubtree","customSubtree","newSubtree","_ref5","_ref6","JSON","stringify","mergeCustomMapping","customMapping","BASIC_KUNREI","a","u","o","k","t","h","m","y","r","w","g","z","d","b","p","v","SPECIAL_SYMBOLS","CONSONANTS","q","SMALL_Y","ya","yi","yu","ye","yo","SMALL_VOWELS","ALIASES","sh","ch","cy","chy","shy","j","jy","shi","chi","tsu","ji","fu","SMALL_LETTERS","tu","wa","ka","ke","SPECIAL_CASES","wu","wi","we","kwa","whu","tha","thu","tho","dha","dhu","dho","AIUEO_CONSTRUCTIONS","wh","qw","gw","sw","ts","th","tw","dh","dw","fw","K_CONSTRUCTIONS","kwi","kuxi","kuli","kwe","kuxe","kule","kwo","kuxo","kulo","createRomajiToKanaMap","kanaTree","subtreeOf","addTsu","tsuTree","_ref21","_ref22","consonant","yKana","symbol","jsymbol","_ref7","_ref8","_ref9","_ref10","aiueoKana","_ref11","_ref12","vowel","nChar","c","_ref13","_ref14","alternative","allExceptLast","last","_ref17","_ref18","kunreiRoma","chars","xRoma","xSubtree","list","_ref15","_ref16","alt","startsWith","replace","altRoma","prefix","_ref19","_ref20","freeze","romajiToKanaMap","USE_OBSOLETE_KANA_MAP","isCharUpperCase","isCharLongDash","isCharSlashDot","isCharHiragana","hiraganaToKatakana","kata","push","kataChar","String","fromCharCode","join","customKanaMapping","mapCopy","IME_MODE_MAP","toKana","config","options","splitIntoConvertedKana","kanaToken","_kanaToken","enforceHiragana","enforceKatakana","LISTENERS","makeOnInput","prevInput","mergedConfig","preConfiguredMap","triggers","toUpperCase","target","dataset","ignoreComposition","splitInput","_splitInput2","text","head","toConvert","tail","cursor","includes","_workFromStart2","workFromStart","_workBackwards2","workBackwards","_takeWhileAndSlice2","takeWhileAndSlice","_takeWhileAndSlice4","selectionEnd","textToConvert","convertedText","newCursor","newValue","setTimeout","setSelectionRange","convertInput","onComposition","type","data","window","navigator","platform","trackListeners","id","inputHandler","compositionHandler","untrackListeners","targetId","filter","findListeners","el","getAttribute","catalystChars","startIndex","_takeWhileAndSlice5","reverse","_takeWhileAndSlice6","source","predicate","x","result","events","_ref$target","selectionStart","console","log","compositionstart","compositionupdate","_ref2$target","compositionend","addDebugListeners","event","handler","addEventListener","removeDebugListeners","removeEventListener","ELEMENTS","idCounter","newId","now","isCharRomaji","isRomaji","isRoma","isCharKatakana","isCharKana","isKana","isHiragana","isKatakana","isCharKanji","isKanji","isMixed","passKanji","hasKanji","isCharInitialLongDash","index","isCharInnerLongDash","isKanaAsSymbol","LONG_VOWELS","katakanaToHiragana","toRomaji","isDestinationRomaji","previousKana","hira","romaji","hiraChar","kanaToHepburnMap","BASIC_ROMAJI","あ","い","う","え","お","か","き","く","け","こ","さ","し","す","せ","そ","た","ち","つ","て","と","な","に","ぬ","ね","の","は","ひ","ふ","へ","ほ","ま","み","む","め","も","ら","り","る","れ","ろ","や","ゆ","よ","わ","ゐ","ゑ","を","ん","が","ぎ","ぐ","げ","ご","ざ","じ","ず","ぜ","ぞ","だ","ぢ","づ","で","ど","ば","び","ぶ","べ","ぼ","ぱ","ぴ","ぷ","ぺ","ぽ","ゔぁ","ゔぃ","ゔ","ゔぇ","ゔぉ","AMBIGUOUS_VOWELS","ゃ","ゅ","ょ","SMALL_Y_EXTRA","ぃ","ぇ","SMALL_AIUEO","ぁ","ぅ","ぉ","YOON_KANA","YOON_EXCEPTIONS","SMALL_KANA","っ","SOKUON_WHITELIST","getKanaToHepburnTree","romajiTree","setTrans","transliteration","firstRomajiChar","yRoma","resolveTsu","createKanaToRomajiMap","customRomajiMapping","getKanaToRomajiTree","splitIntoRomaji","romajiToken","_romajiToken","isCharEnglishPunctuation","isCharJapanesePunctuation","isCharEnSpace","isCharJaSpace","isCharJaNum","isCharEnNum","TOKEN_TYPES","getType","compact","EN","JA","EN_NUM","JA_NUM","EN_PUNC","JA_PUNC","KANJI","SPACE","OTHER","tokenize","_ref$compact","_ref$detailed","detailed","initial","shift","prevType","tokens","currType","sameType","pop","isLeadingWithoutInitialKana","leading","isTrailingWithoutFinalKana","isInvalidMatcher","matchKanji","element","debug","nodeName","Error","onInput","setAttribute","_ref$leading","_ref$matchKanji","okuriganaRegex","convertedKatakana","mergedOptions","hiragana","listeners","removeAttribute"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"wanakana.min.js","sources":["../src/utils/typeOf.js","../src/utils/isEmpty.js","../src/utils/isCharInRange.js","../src/constants.js","../src/utils/isCharJapanese.js","../src/isJapanese.js","../node_modules/memoize-one/dist/memoize-one.esm.js","../node_modules/dequal/dist/index.mjs","../src/utils/mergeWithDefaultOptions.js","../src/utils/kanaMapping.js","../src/utils/romajiToKanaMap.js","../src/utils/isCharUpperCase.js","../src/utils/isCharLongDash.js","../src/utils/isCharSlashDot.js","../src/utils/isCharHiragana.js","../src/utils/hiraganaToKatakana.js","../src/toKana.js","../src/utils/dom.js","../src/utils/logInputEvents.js","../src/bind.js","../src/utils/isCharRomaji.js","../src/isRomaji.js","../src/utils/isCharKatakana.js","../src/utils/isCharKana.js","../src/isKana.js","../src/isHiragana.js","../src/isKatakana.js","../src/utils/isCharKanji.js","../src/isKanji.js","../src/isMixed.js","../src/utils/katakanaToHiragana.js","../src/utils/kanaToRomajiMap.js","../src/toRomaji.js","../src/utils/isCharEnglishPunctuation.js","../src/utils/isCharJapanesePunctuation.js","../src/tokenize.js","../src/stripOkurigana.js","../src/toHiragana.js","../src/toKatakana.js","../src/unbind.js"],"sourcesContent":["/**\n * Returns detailed type as string (instead of just 'object' for arrays etc)\n * @private\n * @param {any} value js value\n * @returns {String} type of value\n * @example\n * typeOf({}); // 'object'\n * typeOf([]); // 'array'\n * typeOf(function() {}); // 'function'\n * typeOf(/a/); // 'regexp'\n * typeOf(new Date()); // 'date'\n * typeOf(null); // 'null'\n * typeOf(undefined); // 'undefined'\n * typeOf('a'); // 'string'\n * typeOf(1); // 'number'\n * typeOf(true); // 'boolean'\n * typeOf(new Map()); // 'map'\n * typeOf(new Set()); // 'map'\n */\nfunction typeOf(value) {\n if (value === null) {\n return 'null';\n }\n if (value !== Object(value)) {\n return typeof value;\n }\n return {}.toString\n .call(value)\n .slice(8, -1)\n .toLowerCase();\n}\n\nexport default typeOf;\n","import typeOf from './typeOf';\n/**\n * Checks if input string is empty\n * @param {String} input text input\n * @return {Boolean} true if no input\n */\nfunction isEmpty(input) {\n if (typeOf(input) !== 'string') {\n return true;\n }\n return !input.length;\n}\n\nexport default isEmpty;\n","import isEmpty from './isEmpty';\n\n/**\n * Takes a character and a unicode range. Returns true if the char is in the range.\n * @param {String} char unicode character\n * @param {Number} start unicode start range\n * @param {Number} end unicode end range\n * @return {Boolean}\n */\nfunction isCharInRange(char = '', start, end) {\n if (isEmpty(char)) return false;\n const code = char.charCodeAt(0);\n return start <= code && code <= end;\n}\n\nexport default isCharInRange;\n","export const VERSION = '5.0.2';\n\nexport const TO_KANA_METHODS = {\n HIRAGANA: 'toHiragana',\n KATAKANA: 'toKatakana',\n};\n\nexport const ROMANIZATIONS = {\n HEPBURN: 'hepburn',\n};\n\n/**\n * Default config for WanaKana, user passed options will be merged with these\n * @type {DefaultOptions}\n * @name defaultOptions\n * @property {Boolean} [useObsoleteKana=false] - Set to true to use obsolete characters, such as ゐ and ゑ.\n * @example\n * toHiragana('we', { useObsoleteKana: true })\n * // => 'ゑ'\n * @property {Boolean} [passRomaji=false] - Set to true to pass romaji when using mixed syllabaries with toKatakana() or toHiragana()\n * @example\n * toHiragana('only convert the katakana: ヒラガナ', { passRomaji: true })\n * // => \"only convert the katakana: ひらがな\"\n * @property {Object} [convertLongVowelMark=true] - Set to false to prevent conversions of 'ー' to extended vowels with toHiragana()\n * @example\n * toHiragana('ラーメン', { convertLongVowelMark: false });\n * // => 'らーめん\n * @property {Boolean} [upcaseKatakana=false] - Set to true to convert katakana to uppercase using toRomaji()\n * @example\n * toRomaji('ひらがな カタカナ', { upcaseKatakana: true })\n * // => \"hiragana KATAKANA\"\n * @property {Boolean|String} [IMEMode=false] - Set to true, 'toHiragana', or 'toKatakana' to handle conversion while it is being typed.\n * @property {String} [romanization='hepburn'] - choose toRomaji() romanization map (currently only 'hepburn')\n * @property {Object} [customKanaMapping] - custom map will be merged with default conversion\n * @example\n * toKana('wanakana', { customKanaMapping: { na: 'に', ka: 'Bana' }) };\n * // => 'わにBanaに'\n * @property {Object} [customRomajiMapping] - custom map will be merged with default conversion\n * @example\n * toRomaji('つじぎり', { customRomajiMapping: { じ: 'zi', つ: 'tu', り: 'li' }) };\n * // => 'tuzigili'\n */\nexport const DEFAULT_OPTIONS = {\n useObsoleteKana: false,\n passRomaji: false,\n upcaseKatakana: false,\n IMEMode: false,\n convertLongVowelMark: true,\n romanization: ROMANIZATIONS.HEPBURN,\n};\n\n// CharCode References\n// http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml\n// http://unicode-table.com\n\nexport const LATIN_LOWERCASE_START = 0x61;\nexport const LATIN_LOWERCASE_END = 0x7a;\nexport const LATIN_UPPERCASE_START = 0x41;\nexport const LATIN_UPPERCASE_END = 0x5a;\nexport const LOWERCASE_ZENKAKU_START = 0xff41;\nexport const LOWERCASE_ZENKAKU_END = 0xff5a;\nexport const UPPERCASE_ZENKAKU_START = 0xff21;\nexport const UPPERCASE_ZENKAKU_END = 0xff3a;\nexport const HIRAGANA_START = 0x3041;\nexport const HIRAGANA_END = 0x3096;\nexport const KATAKANA_START = 0x30a1;\nexport const KATAKANA_END = 0x30fc;\nexport const KANJI_START = 0x4e00;\nexport const KANJI_END = 0x9faf;\nexport const PROLONGED_SOUND_MARK = 0x30fc;\nexport const KANA_SLASH_DOT = 0x30fb;\n\nconst ZENKAKU_NUMBERS = [0xff10, 0xff19];\nconst ZENKAKU_UPPERCASE = [UPPERCASE_ZENKAKU_START, UPPERCASE_ZENKAKU_END];\nconst ZENKAKU_LOWERCASE = [LOWERCASE_ZENKAKU_START, LOWERCASE_ZENKAKU_END];\nconst ZENKAKU_PUNCTUATION_1 = [0xff01, 0xff0f];\nconst ZENKAKU_PUNCTUATION_2 = [0xff1a, 0xff1f];\nconst ZENKAKU_PUNCTUATION_3 = [0xff3b, 0xff3f];\nconst ZENKAKU_PUNCTUATION_4 = [0xff5b, 0xff60];\nconst ZENKAKU_SYMBOLS_CURRENCY = [0xffe0, 0xffee];\n\nconst HIRAGANA_CHARS = [0x3040, 0x309f];\nconst KATAKANA_CHARS = [0x30a0, 0x30ff];\nconst HANKAKU_KATAKANA = [0xff66, 0xff9f];\nconst KATAKANA_PUNCTUATION = [0x30fb, 0x30fc];\nconst KANA_PUNCTUATION = [0xff61, 0xff65];\nconst CJK_SYMBOLS_PUNCTUATION = [0x3000, 0x303f];\nconst COMMON_CJK = [0x4e00, 0x9fff];\nconst RARE_CJK = [0x3400, 0x4dbf];\n\nexport const KANA_RANGES = [\n HIRAGANA_CHARS,\n KATAKANA_CHARS,\n KANA_PUNCTUATION,\n HANKAKU_KATAKANA,\n];\n\nexport const JA_PUNCTUATION_RANGES = [\n CJK_SYMBOLS_PUNCTUATION,\n KANA_PUNCTUATION,\n KATAKANA_PUNCTUATION,\n ZENKAKU_PUNCTUATION_1,\n ZENKAKU_PUNCTUATION_2,\n ZENKAKU_PUNCTUATION_3,\n ZENKAKU_PUNCTUATION_4,\n ZENKAKU_SYMBOLS_CURRENCY,\n];\n\n// All Japanese unicode start and end ranges\n// Includes kanji, kana, zenkaku latin chars, punctuation, and number ranges.\nexport const JAPANESE_RANGES = [\n ...KANA_RANGES,\n ...JA_PUNCTUATION_RANGES,\n ZENKAKU_UPPERCASE,\n ZENKAKU_LOWERCASE,\n ZENKAKU_NUMBERS,\n COMMON_CJK,\n RARE_CJK,\n];\n\nconst MODERN_ENGLISH = [0x0000, 0x007f];\nconst HEPBURN_MACRON_RANGES = [\n [0x0100, 0x0101], // Ā ā\n [0x0112, 0x0113], // Ē ē\n [0x012a, 0x012b], // Ī ī\n [0x014c, 0x014d], // Ō ō\n [0x016a, 0x016b], // Ū ū\n];\nconst SMART_QUOTE_RANGES = [\n [0x2018, 0x2019], // ‘ ’\n [0x201c, 0x201d], // “ ”\n];\n\nexport const ROMAJI_RANGES = [MODERN_ENGLISH, ...HEPBURN_MACRON_RANGES];\n\nexport const EN_PUNCTUATION_RANGES = [\n [0x20, 0x2f],\n [0x3a, 0x3f],\n [0x5b, 0x60],\n [0x7b, 0x7e],\n ...SMART_QUOTE_RANGES,\n];\n","import isCharInRange from './isCharInRange';\nimport { JAPANESE_RANGES } from '../constants';\n\n/**\n * Tests a character. Returns true if the character is [Katakana](https://en.wikipedia.org/wiki/Katakana).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharJapanese(char = '') {\n return JAPANESE_RANGES.some(([start, end]) => isCharInRange(char, start, end));\n}\n\nexport default isCharJapanese;\n","import typeOf from './utils/typeOf';\nimport isEmpty from './utils/isEmpty';\nimport isCharJapanese from './utils/isCharJapanese';\n\n/**\n * Test if `input` only includes [Kanji](https://en.wikipedia.org/wiki/Kanji), [Kana](https://en.wikipedia.org/wiki/Kana), zenkaku numbers, and JA punctuation/symbols.”\n * @param {String} [input=''] text\n * @param {Regexp} [allowed] additional test allowed to pass for each char\n * @return {Boolean} true if passes checks\n * @example\n * isJapanese('泣き虫')\n * // => true\n * isJapanese('あア')\n * // => true\n * isJapanese('2月') // Zenkaku numbers allowed\n * // => true\n * isJapanese('泣き虫。!〜$') // Zenkaku/JA punctuation\n * // => true\n * isJapanese('泣き虫.!~$') // Latin punctuation fails\n * // => false\n * isJapanese('A泣き虫')\n * // => false\n * isJapanese('≪偽括弧≫', /[≪≫]/);\n * // => true\n */\nfunction isJapanese(input = '', allowed) {\n const augmented = typeOf(allowed) === 'regexp';\n return isEmpty(input)\n ? false\n : [...input].every((char) => {\n const isJa = isCharJapanese(char);\n return !augmented ? isJa : isJa || allowed.test(char);\n });\n}\n\nexport default isJapanese;\n","var safeIsNaN = Number.isNaN ||\n function ponyfill(value) {\n return typeof value === 'number' && value !== value;\n };\nfunction isEqual(first, second) {\n if (first === second) {\n return true;\n }\n if (safeIsNaN(first) && safeIsNaN(second)) {\n return true;\n }\n return false;\n}\nfunction areInputsEqual(newInputs, lastInputs) {\n if (newInputs.length !== lastInputs.length) {\n return false;\n }\n for (var i = 0; i < newInputs.length; i++) {\n if (!isEqual(newInputs[i], lastInputs[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction memoizeOne(resultFn, isEqual) {\n if (isEqual === void 0) { isEqual = areInputsEqual; }\n var cache = null;\n function memoized() {\n var newArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n newArgs[_i] = arguments[_i];\n }\n if (cache && cache.lastThis === this && isEqual(newArgs, cache.lastArgs)) {\n return cache.lastResult;\n }\n var lastResult = resultFn.apply(this, newArgs);\n cache = {\n lastResult: lastResult,\n lastArgs: newArgs,\n lastThis: this,\n };\n return lastResult;\n }\n memoized.clear = function clear() {\n cache = null;\n };\n return memoized;\n}\n\nexport { memoizeOne as default };\n","var has = Object.prototype.hasOwnProperty;\n\nfunction find(iter, tar, key) {\n\tfor (key of iter.keys()) {\n\t\tif (dequal(key, tar)) return key;\n\t}\n}\n\nexport function dequal(foo, bar) {\n\tvar ctor, len, tmp;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ctor === Set) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len;\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!bar.has(tmp)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === Map) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len[0];\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!dequal(len[1], bar.get(tmp))) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === ArrayBuffer) {\n\t\t\tfoo = new Uint8Array(foo);\n\t\t\tbar = new Uint8Array(bar);\n\t\t} else if (ctor === DataView) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo.getInt8(len) === bar.getInt8(len));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ArrayBuffer.isView(foo)) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo[len] === bar[len]);\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { DEFAULT_OPTIONS } from '../constants';\n/**\n * Easy re-use of merging with default options\n * @param {Object} opts user options\n * @returns user options merged over default options\n */\nconst mergeWithDefaultOptions = (opts = {}) => Object.assign({}, DEFAULT_OPTIONS, opts);\n\nexport default mergeWithDefaultOptions;\n","import typeOf from './typeOf';\n\nexport function applyMapping(string, mapping, convertEnding) {\n const root = mapping;\n\n function nextSubtree(tree, nextChar) {\n const subtree = tree[nextChar];\n if (subtree === undefined) {\n return undefined;\n }\n // if the next child node does not have a node value, set its node value to the input\n return Object.assign({ '': tree[''] + nextChar }, tree[nextChar]);\n }\n\n function newChunk(remaining, currentCursor) {\n // start parsing a new chunk\n const firstChar = remaining.charAt(0);\n\n return parse(\n Object.assign({ '': firstChar }, root[firstChar]),\n remaining.slice(1),\n currentCursor,\n currentCursor + 1\n );\n }\n\n function parse(tree, remaining, lastCursor, currentCursor) {\n if (!remaining) {\n if (convertEnding || Object.keys(tree).length === 1) {\n // nothing more to consume, just commit the last chunk and return it\n // so as to not have an empty element at the end of the result\n return tree[''] ? [[lastCursor, currentCursor, tree['']]] : [];\n }\n // if we don't want to convert the ending, because there are still possible continuations\n // return null as the final node value\n return [[lastCursor, currentCursor, null]];\n }\n\n if (Object.keys(tree).length === 1) {\n return [[lastCursor, currentCursor, tree['']]].concat(\n newChunk(remaining, currentCursor)\n );\n }\n\n const subtree = nextSubtree(tree, remaining.charAt(0));\n\n if (subtree === undefined) {\n return [[lastCursor, currentCursor, tree['']]].concat(\n newChunk(remaining, currentCursor)\n );\n }\n // continue current branch\n return parse(subtree, remaining.slice(1), lastCursor, currentCursor + 1);\n }\n\n return newChunk(string, 0);\n}\n\n// transform the tree, so that for example hepburnTree['ゔ']['ぁ'][''] === 'va'\n// or kanaTree['k']['y']['a'][''] === 'きゃ'\nexport function transform(tree) {\n return Object.entries(tree).reduce((map, [char, subtree]) => {\n const endOfBranch = typeOf(subtree) === 'string';\n // eslint-disable-next-line no-param-reassign\n map[char] = endOfBranch ? { '': subtree } : transform(subtree);\n return map;\n }, {});\n}\n\nexport function getSubTreeOf(tree, string) {\n return string.split('').reduce((correctSubTree, char) => {\n if (correctSubTree[char] === undefined) {\n // eslint-disable-next-line no-param-reassign\n correctSubTree[char] = {};\n }\n return correctSubTree[char];\n }, tree);\n}\n\n/**\n * Creates a custom mapping tree, returns a function that accepts a defaultMap which the newly created customMapping will be merged with and returned\n * (customMap) => (defaultMap) => mergedMap\n * @param {Object} customMap { 'ka' : 'な' }\n * @return {Function} (defaultMap) => defaultMergedWithCustomMap\n * @example\n * const sillyMap = createCustomMapping({ 'ちゃ': 'time', '茎': 'cookie' });\n * // sillyMap is passed defaultMapping to merge with when called in toRomaji()\n * toRomaji(\"It's 茎 ちゃ よ\", { customRomajiMapping: sillyMap });\n * // => 'It's cookie time yo';\n */\nexport function createCustomMapping(customMap = {}) {\n const customTree = {};\n\n if (typeOf(customMap) === 'object') {\n Object.entries(customMap).forEach(([roma, kana]) => {\n let subTree = customTree;\n roma.split('').forEach((char) => {\n if (subTree[char] === undefined) {\n subTree[char] = {};\n }\n subTree = subTree[char];\n });\n subTree[''] = kana;\n });\n }\n\n return function makeMap(map) {\n const mapCopy = JSON.parse(JSON.stringify(map));\n\n function transformMap(mapSubtree, customSubtree) {\n if (mapSubtree === undefined || typeOf(mapSubtree) === 'string') {\n return customSubtree;\n }\n return Object.entries(customSubtree).reduce(\n (newSubtree, [char, subtree]) => {\n // eslint-disable-next-line no-param-reassign\n newSubtree[char] = transformMap(mapSubtree[char], subtree);\n return newSubtree;\n },\n mapSubtree\n );\n }\n\n return transformMap(mapCopy, customTree);\n };\n}\n\n// allow consumer to pass either function or object as customMapping\nexport function mergeCustomMapping(map, customMapping) {\n if (!customMapping) {\n return map;\n }\n return typeOf(customMapping) === 'function'\n ? customMapping(map)\n : createCustomMapping(customMapping)(map);\n}\n","import { transform, getSubTreeOf, createCustomMapping } from './kanaMapping';\n\n// NOTE: not exactly kunrei shiki, for example ぢゃ -> dya instead of zya, to avoid name clashing\n/* eslint-disable */\n// prettier-ignore\nconst BASIC_KUNREI = {\n a: 'あ', i: 'い', u: 'う', e: 'え', o: 'お',\n k: { a: 'か', i: 'き', u: 'く', e: 'け', o: 'こ', },\n s: { a: 'さ', i: 'し', u: 'す', e: 'せ', o: 'そ', },\n t: { a: 'た', i: 'ち', u: 'つ', e: 'て', o: 'と', },\n n: { a: 'な', i: 'に', u: 'ぬ', e: 'ね', o: 'の', },\n h: { a: 'は', i: 'ひ', u: 'ふ', e: 'へ', o: 'ほ', },\n m: { a: 'ま', i: 'み', u: 'む', e: 'め', o: 'も', },\n y: { a: 'や', u: 'ゆ', o: 'よ' },\n r: { a: 'ら', i: 'り', u: 'る', e: 'れ', o: 'ろ', },\n w: { a: 'わ', i: 'ゐ', e: 'ゑ', o: 'を', },\n g: { a: 'が', i: 'ぎ', u: 'ぐ', e: 'げ', o: 'ご', },\n z: { a: 'ざ', i: 'じ', u: 'ず', e: 'ぜ', o: 'ぞ', },\n d: { a: 'だ', i: 'ぢ', u: 'づ', e: 'で', o: 'ど', },\n b: { a: 'ば', i: 'び', u: 'ぶ', e: 'べ', o: 'ぼ', },\n p: { a: 'ぱ', i: 'ぴ', u: 'ぷ', e: 'ぺ', o: 'ぽ', },\n v: { a: 'ゔぁ', i: 'ゔぃ', u: 'ゔ', e: 'ゔぇ', o: 'ゔぉ', },\n};\n\nconst SPECIAL_SYMBOLS = {\n '.': '。',\n ',': '、',\n ':': ':',\n '/': '・',\n '!': '!',\n '?': '?',\n '~': '〜',\n '-': 'ー',\n '‘': '「',\n '’': '」',\n '“': '『',\n '”': '』',\n '[': '[',\n ']': ']',\n '(': '(',\n ')': ')',\n '{': '{',\n '}': '}',\n};\n\nconst CONSONANTS = {\n k: 'き',\n s: 'し',\n t: 'ち',\n n: 'に',\n h: 'ひ',\n m: 'み',\n r: 'り',\n g: 'ぎ',\n z: 'じ',\n d: 'ぢ',\n b: 'び',\n p: 'ぴ',\n v: 'ゔ',\n q: 'く',\n f: 'ふ',\n};\nconst SMALL_Y = { ya: 'ゃ', yi: 'ぃ', yu: 'ゅ', ye: 'ぇ', yo: 'ょ' };\nconst SMALL_VOWELS = { a: 'ぁ', i: 'ぃ', u: 'ぅ', e: 'ぇ', o: 'ぉ' };\n\n// typing one should be the same as having typed the other instead\nconst ALIASES = {\n sh: 'sy', // sha -> sya\n ch: 'ty', // cho -> tyo\n cy: 'ty', // cyo -> tyo\n chy: 'ty', // chyu -> tyu\n shy: 'sy', // shya -> sya\n j: 'zy', // ja -> zya\n jy: 'zy', // jye -> zye\n\n // exceptions to above rules\n shi: 'si',\n chi: 'ti',\n tsu: 'tu',\n ji: 'zi',\n fu: 'hu',\n};\n\n// xtu -> っ\nconst SMALL_LETTERS = Object.assign(\n {\n tu: 'っ',\n wa: 'ゎ',\n ka: 'ヵ',\n ke: 'ヶ',\n },\n SMALL_VOWELS,\n SMALL_Y\n);\n\n// don't follow any notable patterns\nconst SPECIAL_CASES = {\n yi: 'い',\n wu: 'う',\n ye: 'いぇ',\n wi: 'うぃ',\n we: 'うぇ',\n kwa: 'くぁ',\n whu: 'う',\n // because it's not thya for てゃ but tha\n // and tha is not てぁ, but てゃ\n tha: 'てゃ',\n thu: 'てゅ',\n tho: 'てょ',\n dha: 'でゃ',\n dhu: 'でゅ',\n dho: 'でょ',\n};\n\nconst AIUEO_CONSTRUCTIONS = {\n wh: 'う',\n kw: 'く',\n qw: 'く',\n q: 'く',\n gw: 'ぐ',\n sw: 'す',\n ts: 'つ',\n th: 'て',\n tw: 'と',\n dh: 'で',\n dw: 'ど',\n fw: 'ふ',\n f: 'ふ',\n};\n\n/* eslint-enable */\nfunction createRomajiToKanaMap() {\n const kanaTree = transform(BASIC_KUNREI);\n // pseudo partial application\n const subtreeOf = (string) => getSubTreeOf(kanaTree, string);\n\n // add tya, sya, etc.\n Object.entries(CONSONANTS).forEach(([consonant, yKana]) => {\n Object.entries(SMALL_Y).forEach(([roma, kana]) => {\n // for example kyo -> き + ょ\n subtreeOf(consonant + roma)[''] = yKana + kana;\n });\n });\n\n Object.entries(SPECIAL_SYMBOLS).forEach(([symbol, jsymbol]) => {\n subtreeOf(symbol)[''] = jsymbol;\n });\n\n // things like うぃ, くぃ, etc.\n Object.entries(AIUEO_CONSTRUCTIONS).forEach(([consonant, aiueoKana]) => {\n Object.entries(SMALL_VOWELS).forEach(([vowel, kana]) => {\n const subtree = subtreeOf(consonant + vowel);\n subtree[''] = aiueoKana + kana;\n });\n });\n\n // different ways to write ん\n ['n', \"n'\", 'xn'].forEach((nChar) => {\n subtreeOf(nChar)[''] = 'ん';\n });\n\n // c is equivalent to k, but not for chi, cha, etc. that's why we have to make a copy of k\n kanaTree.c = JSON.parse(JSON.stringify(kanaTree.k));\n\n Object.entries(ALIASES).forEach(([string, alternative]) => {\n const allExceptLast = string.slice(0, string.length - 1);\n const last = string.charAt(string.length - 1);\n const parentTree = subtreeOf(allExceptLast);\n // copy to avoid recursive containment\n parentTree[last] = JSON.parse(JSON.stringify(subtreeOf(alternative)));\n });\n\n function getAlternatives(string) {\n return [...Object.entries(ALIASES), ...[['c', 'k']]].reduce(\n (list, [alt, roma]) => (string.startsWith(roma) ? list.concat(string.replace(roma, alt)) : list),\n []\n );\n }\n\n Object.entries(SMALL_LETTERS).forEach(([kunreiRoma, kana]) => {\n const last = (char) => char.charAt(char.length - 1);\n const allExceptLast = (chars) => chars.slice(0, chars.length - 1);\n const xRoma = `x${kunreiRoma}`;\n const xSubtree = subtreeOf(xRoma);\n xSubtree[''] = kana;\n\n // ltu -> xtu -> っ\n const parentTree = subtreeOf(`l${allExceptLast(kunreiRoma)}`);\n parentTree[last(kunreiRoma)] = xSubtree;\n\n // ltsu -> ltu -> っ\n getAlternatives(kunreiRoma).forEach((altRoma) => {\n ['l', 'x'].forEach((prefix) => {\n const altParentTree = subtreeOf(prefix + allExceptLast(altRoma));\n altParentTree[last(altRoma)] = subtreeOf(prefix + kunreiRoma);\n });\n });\n });\n\n Object.entries(SPECIAL_CASES).forEach(([string, kana]) => {\n subtreeOf(string)[''] = kana;\n });\n\n // add kka, tta, etc.\n function addTsu(tree) {\n return Object.entries(tree).reduce((tsuTree, [key, value]) => {\n if (!key) {\n // we have reached the bottom of this branch\n // eslint-disable-next-line no-param-reassign\n tsuTree[key] = `っ${value}`;\n } else {\n // more subtrees\n // eslint-disable-next-line no-param-reassign\n tsuTree[key] = addTsu(value);\n }\n return tsuTree;\n }, {});\n }\n // have to explicitly name c here, because we made it a copy of k, not a reference\n [...Object.keys(CONSONANTS), 'c', 'y', 'w', 'j'].forEach((consonant) => {\n const subtree = kanaTree[consonant];\n subtree[consonant] = addTsu(subtree);\n });\n // nn should not be っん\n delete kanaTree.n.n;\n // solidify the results, so that there there is referential transparency within the tree\n return Object.freeze(JSON.parse(JSON.stringify(kanaTree)));\n}\n\nlet romajiToKanaMap = null;\n\nexport function getRomajiToKanaTree() {\n if (romajiToKanaMap == null) {\n romajiToKanaMap = createRomajiToKanaMap();\n }\n return romajiToKanaMap;\n}\n\nexport const USE_OBSOLETE_KANA_MAP = createCustomMapping({\n wi: 'ゐ',\n we: 'ゑ',\n});\n\nexport function IME_MODE_MAP(map) {\n // in IME mode, we do not want to convert single ns\n const mapCopy = JSON.parse(JSON.stringify(map));\n mapCopy.n.n = { '': 'ん' };\n mapCopy.n[' '] = { '': 'ん' };\n return mapCopy;\n}\n","import isEmpty from './isEmpty';\nimport isCharInRange from './isCharInRange';\nimport { LATIN_UPPERCASE_START, LATIN_UPPERCASE_END } from '../constants';\n\n/**\n * Tests if char is in English unicode uppercase range\n * @param {String} char\n * @return {Boolean}\n */\nfunction isCharUpperCase(char = '') {\n if (isEmpty(char)) return false;\n return isCharInRange(char, LATIN_UPPERCASE_START, LATIN_UPPERCASE_END);\n}\n\nexport default isCharUpperCase;\n","import isEmpty from './isEmpty';\nimport { PROLONGED_SOUND_MARK } from '../constants';\n\n/**\n * Returns true if char is 'ー'\n * @param {String} char to test\n * @return {Boolean}\n */\nfunction isCharLongDash(char = '') {\n if (isEmpty(char)) return false;\n return char.charCodeAt(0) === PROLONGED_SOUND_MARK;\n}\n\nexport default isCharLongDash;\n","import isEmpty from './isEmpty';\nimport { KANA_SLASH_DOT } from '../constants';\n\n/**\n * Tests if char is '・'\n * @param {String} char\n * @return {Boolean} true if '・'\n */\nfunction isCharSlashDot(char = '') {\n if (isEmpty(char)) return false;\n return char.charCodeAt(0) === KANA_SLASH_DOT;\n}\n\nexport default isCharSlashDot;\n","import isEmpty from './isEmpty';\nimport isCharLongDash from './isCharLongDash';\nimport isCharInRange from './isCharInRange';\nimport {\n HIRAGANA_START,\n HIRAGANA_END,\n} from '../constants';\n\n/**\n * Tests a character. Returns true if the character is [Hiragana](https://en.wikipedia.org/wiki/Hiragana).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharHiragana(char = '') {\n if (isEmpty(char)) return false;\n if (isCharLongDash(char)) return true;\n return isCharInRange(char, HIRAGANA_START, HIRAGANA_END);\n}\n\nexport default isCharHiragana;\n","import { KATAKANA_START, HIRAGANA_START } from '../constants';\n\nimport isCharLongDash from './isCharLongDash';\nimport isCharSlashDot from './isCharSlashDot';\nimport isCharHiragana from './isCharHiragana';\n\n/**\n * Convert [Hiragana](https://en.wikipedia.org/wiki/Hiragana) to [Katakana](https://en.wikipedia.org/wiki/Katakana)\n * Passes through any non-hiragana chars\n * @private\n * @param {String} [input=''] text input\n * @return {String} converted text\n * @example\n * hiraganaToKatakana('ひらがな')\n * // => \"ヒラガナ\"\n * hiraganaToKatakana('ひらがな is a type of kana')\n * // => \"ヒラガナ is a type of kana\"\n */\nfunction hiraganaToKatakana(input = '') {\n const kata = [];\n input.split('').forEach((char) => {\n // Short circuit to avoid incorrect codeshift for 'ー' and '・'\n if (isCharLongDash(char) || isCharSlashDot(char)) {\n kata.push(char);\n } else if (isCharHiragana(char)) {\n // Shift charcode.\n const code = char.charCodeAt(0) + (KATAKANA_START - HIRAGANA_START);\n const kataChar = String.fromCharCode(code);\n kata.push(kataChar);\n } else {\n // Pass non-hiragana chars through\n kata.push(char);\n }\n });\n return kata.join('');\n}\n\nexport default hiraganaToKatakana;\n","import memoizeOne from 'memoize-one';\nimport { dequal } from 'dequal';\n\nimport { TO_KANA_METHODS } from './constants';\nimport mergeWithDefaultOptions from './utils/mergeWithDefaultOptions';\nimport {\n getRomajiToKanaTree,\n IME_MODE_MAP,\n USE_OBSOLETE_KANA_MAP,\n} from './utils/romajiToKanaMap';\nimport { applyMapping, mergeCustomMapping } from './utils/kanaMapping';\nimport isCharUpperCase from './utils/isCharUpperCase';\nimport hiraganaToKatakana from './utils/hiraganaToKatakana';\n\n// memoize and deeply compare args so we only recreate when necessary\nexport const createRomajiToKanaMap = memoizeOne(\n (IMEMode, useObsoleteKana, customKanaMapping) => {\n let map = getRomajiToKanaTree();\n\n map = IMEMode ? IME_MODE_MAP(map) : map;\n map = useObsoleteKana ? USE_OBSOLETE_KANA_MAP(map) : map;\n\n if (customKanaMapping) {\n map = mergeCustomMapping(map, customKanaMapping);\n }\n\n return map;\n },\n dequal\n);\n\n/**\n * Convert [Romaji](https://en.wikipedia.org/wiki/Romaji) to [Kana](https://en.wikipedia.org/wiki/Kana), lowercase text will result in [Hiragana](https://en.wikipedia.org/wiki/Hiragana) and uppercase text will result in [Katakana](https://en.wikipedia.org/wiki/Katakana).\n * @param {String} [input=''] text\n * @param {DefaultOptions} [options=defaultOptions]\n * @return {String} converted text\n * @example\n * toKana('onaji BUTTSUUJI')\n * // => 'おなじ ブッツウジ'\n * toKana('ONAJI buttsuuji')\n * // => 'オナジ ぶっつうじ'\n * toKana('座禅‘zazen’スタイル')\n * // => '座禅「ざぜん」スタイル'\n * toKana('batsuge-mu')\n * // => 'ばつげーむ'\n * toKana('!?.:/,~-‘’“”[](){}') // Punctuation conversion\n * // => '!?。:・、〜ー「」『』[](){}'\n * toKana('we', { useObsoleteKana: true })\n * // => 'ゑ'\n * toKana('wanakana', { customKanaMapping: { na: 'に', ka: 'bana' } });\n * // => 'わにbanaに'\n */\nexport function toKana(input = '', options = {}, map) {\n let config;\n if (!map) {\n config = mergeWithDefaultOptions(options);\n map = createRomajiToKanaMap(\n config.IMEMode,\n config.useObsoleteKana,\n config.customKanaMapping\n );\n } else {\n config = options;\n }\n\n // throw away the substring index information and just concatenate all the kana\n return splitIntoConvertedKana(input, config, map)\n .map((kanaToken) => {\n const [start, end, kana] = kanaToken;\n if (kana === null) {\n // haven't converted the end of the string, since we are in IME mode\n return input.slice(start);\n }\n const enforceHiragana = config.IMEMode === TO_KANA_METHODS.HIRAGANA;\n const enforceKatakana = config.IMEMode === TO_KANA_METHODS.KATAKANA\n || [...input.slice(start, end)].every(isCharUpperCase);\n\n return enforceHiragana || !enforceKatakana\n ? kana\n : hiraganaToKatakana(kana);\n })\n .join('');\n}\n\n/**\n *\n * @private\n * @param {String} [input=''] input text\n * @param {DefaultOptions} [options=defaultOptions] toKana options\n * @param {Object} [map] custom mapping\n * @returns {Array[]} [[start, end, token]]\n * @example\n * splitIntoConvertedKana('buttsuuji')\n * // => [[0, 2, 'ぶ'], [2, 6, 'っつ'], [6, 7, 'う'], [7, 9, 'じ']]\n */\nexport function splitIntoConvertedKana(input = '', options = {}, map) {\n const { IMEMode, useObsoleteKana, customKanaMapping } = options;\n\n if (!map) {\n map = createRomajiToKanaMap(IMEMode, useObsoleteKana, customKanaMapping);\n }\n\n return applyMapping(input.toLowerCase(), map, !IMEMode);\n}\n\nexport default toKana;\n","import isJapanese from '../isJapanese';\nimport toKana, { createRomajiToKanaMap } from '../toKana';\nimport mergeWithDefaultOptions from './mergeWithDefaultOptions';\n\nlet LISTENERS = [];\n/**\n * Automagically replaces input values with converted text to kana\n * @param {defaultOptions} [options] user config overrides, default conversion is toKana()\n * @return {Function} event handler with bound options\n * @private\n */\nexport function makeOnInput(options) {\n let prevInput;\n\n // Enforce IMEMode if not already specified\n const mergedConfig = Object.assign({}, mergeWithDefaultOptions(options), {\n IMEMode: options.IMEMode || true,\n });\n\n const preConfiguredMap = createRomajiToKanaMap(\n mergedConfig.IMEMode,\n mergedConfig.useObsoleteKana,\n mergedConfig.customKanaMapping\n );\n\n const triggers = [\n ...Object.keys(preConfiguredMap),\n ...Object.keys(preConfiguredMap).map((char) => char.toUpperCase()),\n ];\n\n return function onInput({ target }) {\n if (\n target.value !== prevInput\n && target.dataset.ignoreComposition !== 'true'\n ) {\n convertInput(target, mergedConfig, preConfiguredMap, triggers, prevInput);\n }\n };\n}\n\nexport function convertInput(target, options, map, triggers, prevInput) {\n const [head, textToConvert, tail] = splitInput(\n target.value,\n target.selectionEnd,\n triggers\n );\n const convertedText = toKana(textToConvert, options, map);\n const changed = textToConvert !== convertedText;\n\n if (changed) {\n const newCursor = head.length + convertedText.length;\n const newValue = head + convertedText + tail;\n // eslint-disable-next-line no-param-reassign\n target.value = newValue;\n // eslint-disable-next-line no-param-reassign\n prevInput = newValue;\n\n if (tail.length) {\n // push later on event loop (otherwise mid-text insertion can be 1 char too far to the right)\n setTimeout(() => target.setSelectionRange(newCursor, newCursor), 1);\n } else {\n target.setSelectionRange(newCursor, newCursor);\n }\n } else {\n // eslint-disable-next-line no-param-reassign\n prevInput = target.value;\n }\n}\n\nexport function onComposition({ type, target, data }) {\n // navigator.platform is not 100% reliable for singling out all OS,\n // but for determining desktop \"Mac OS\" it is effective enough.\n const isMacOS = /Mac/.test(window.navigator && window.navigator.platform);\n // We don't want to ignore on Android:\n // https://github.com/WaniKani/WanaKana/issues/82\n // But MacOS IME auto-closes if we don't ignore:\n // https://github.com/WaniKani/WanaKana/issues/71\n // Other platform Japanese IMEs pass through happily\n if (isMacOS) {\n if (type === 'compositionupdate' && isJapanese(data)) {\n // eslint-disable-next-line no-param-reassign\n target.dataset.ignoreComposition = 'true';\n }\n\n if (type === 'compositionend') {\n // eslint-disable-next-line no-param-reassign\n target.dataset.ignoreComposition = 'false';\n }\n }\n}\n\nexport function trackListeners(id, inputHandler, compositionHandler) {\n LISTENERS = LISTENERS.concat({\n id,\n inputHandler,\n compositionHandler,\n });\n}\n\nexport function untrackListeners({ id: targetId }) {\n LISTENERS = LISTENERS.filter(({ id }) => id !== targetId);\n}\n\nexport function findListeners(el) {\n return (\n el && LISTENERS.find(({ id }) => id === el.getAttribute('data-wanakana-id'))\n );\n}\n\n// Handle non-terminal inserted input conversion:\n// | -> わ| -> わび| -> わ|び -> わs|び -> わsh|び -> わshi|び -> わし|び\n// or multiple ambiguous positioning (to select which \"s\" to work from)\n// こsこs|こsこ -> こsこso|こsこ -> こsこそ|こsこ\nexport function splitInput(text = '', cursor = 0, triggers = []) {\n let head;\n let toConvert;\n let tail;\n\n if (cursor === 0 && triggers.includes(text[0])) {\n [head, toConvert, tail] = workFromStart(text, triggers);\n } else if (cursor > 0) {\n [head, toConvert, tail] = workBackwards(text, cursor);\n } else {\n [head, toConvert] = takeWhileAndSlice(\n text,\n (char) => !triggers.includes(char)\n );\n [toConvert, tail] = takeWhileAndSlice(\n toConvert,\n (char) => !isJapanese(char)\n );\n }\n\n return [head, toConvert, tail];\n}\n\nfunction workFromStart(text, catalystChars) {\n return [\n '',\n ...takeWhileAndSlice(\n text,\n (char) => catalystChars.includes(char) || !isJapanese(char, /[0-9]/)\n ),\n ];\n}\n\nfunction workBackwards(text = '', startIndex = 0) {\n const [toConvert, head] = takeWhileAndSlice(\n [...text.slice(0, startIndex)].reverse(),\n (char) => !isJapanese(char)\n );\n return [\n head.reverse().join(''),\n toConvert\n .split('')\n .reverse()\n .join(''),\n text.slice(startIndex),\n ];\n}\n\nfunction takeWhileAndSlice(source = {}, predicate = (x) => !!x) {\n const result = [];\n const { length } = source;\n let i = 0;\n while (i < length && predicate(source[i], i)) {\n result.push(source[i]);\n i += 1;\n }\n return [result.join(''), source.slice(i)];\n}\n","/* eslint-disable no-console */\nconst onInput = ({ target: { value, selectionStart, selectionEnd } }) => console.log('input:', { value, selectionStart, selectionEnd });\nconst onCompositionStart = () => console.log('compositionstart');\nconst onCompositionUpdate = ({\n target: { value, selectionStart, selectionEnd },\n data,\n}) => console.log('compositionupdate', {\n data,\n value,\n selectionStart,\n selectionEnd,\n});\nconst onCompositionEnd = () => console.log('compositionend');\n\nconst events = {\n input: onInput,\n compositionstart: onCompositionStart,\n compositionupdate: onCompositionUpdate,\n compositionend: onCompositionEnd,\n};\n\nexport const addDebugListeners = (input) => {\n Object.entries(events).forEach(([event, handler]) => input.addEventListener(event, handler)\n );\n};\n\nexport const removeDebugListeners = (input) => {\n Object.entries(events).forEach(([event, handler]) => input.removeEventListener(event, handler)\n );\n};\n","import { makeOnInput, onComposition, trackListeners } from './utils/dom';\nimport { addDebugListeners } from './utils/logInputEvents';\n\nconst ELEMENTS = ['TEXTAREA', 'INPUT'];\n\nlet idCounter = 0;\nconst newId = () => {\n idCounter += 1;\n return `${Date.now()}${idCounter}`;\n};\n\n/**\n * Binds eventListener for 'input' events to an input field to automagically replace values with kana\n * Can pass `{ IMEMode: 'toHiragana' || 'toKatakana' }` to enforce kana conversion type\n * @param {HTMLElement} element textarea, input[type=\"text\"] etc\n * @param {DefaultOptions} [options=defaultOptions] defaults to { IMEMode: true } using `toKana`\n * @example\n * bind(document.querySelector('#myInput'));\n */\nfunction bind(element = {}, options = {}, debug = false) {\n if (!ELEMENTS.includes(element.nodeName)) {\n throw new Error(\n `Element provided to Wanakana bind() was not a valid input or textarea element.\\n Received: (${JSON.stringify(\n element\n )})`\n );\n }\n const onInput = makeOnInput(options);\n const id = newId();\n element.setAttribute('data-wanakana-id', id);\n element.setAttribute('lang', 'ja');\n element.setAttribute('autoCapitalize', 'none');\n element.setAttribute('autoCorrect', 'off');\n element.setAttribute('autoComplete', 'off');\n element.setAttribute('spellCheck', 'false');\n element.addEventListener('input', onInput);\n element.addEventListener('compositionupdate', onComposition);\n element.addEventListener('compositionend', onComposition);\n trackListeners(id, onInput, onComposition);\n if (debug === true) {\n addDebugListeners(element);\n }\n}\n\nexport default bind;\n","import isEmpty from './isEmpty';\nimport isCharInRange from './isCharInRange';\nimport { ROMAJI_RANGES } from '../constants';\n\n/**\n * Tests a character. Returns true if the character is [Romaji](https://en.wikipedia.org/wiki/Romaji) (allowing [Hepburn romanisation](https://en.wikipedia.org/wiki/Hepburn_romanization))\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharRomaji(char = '') {\n if (isEmpty(char)) return false;\n return ROMAJI_RANGES.some(([start, end]) => isCharInRange(char, start, end));\n}\n\nexport default isCharRomaji;\n","import typeOf from './utils/typeOf';\nimport isEmpty from './utils/isEmpty';\nimport isCharRomaji from './utils/isCharRomaji';\n\n/**\n * Test if `input` is [Romaji](https://en.wikipedia.org/wiki/Romaji) (allowing [Hepburn romanisation](https://en.wikipedia.org/wiki/Hepburn_romanization))\n * @param {String} [input=''] text\n * @param {Regexp} [allowed] additional test allowed to pass for each char\n * @return {Boolean} true if [Romaji](https://en.wikipedia.org/wiki/Romaji)\n * @example\n * isRomaji('Tōkyō and Ōsaka')\n * // => true\n * isRomaji('12a*b&c-d')\n * // => true\n * isRomaji('あアA')\n * // => false\n * isRomaji('お願い')\n * // => false\n * isRomaji('a!b&cーd') // Zenkaku punctuation fails\n * // => false\n * isRomaji('a!b&cーd', /[!ー]/)\n * // => true\n */\nfunction isRomaji(input = '', allowed) {\n const augmented = typeOf(allowed) === 'regexp';\n return isEmpty(input)\n ? false\n : [...input].every((char) => {\n const isRoma = isCharRomaji(char);\n return !augmented ? isRoma : isRoma || allowed.test(char);\n });\n}\n\nexport default isRomaji;\n","import {\n KATAKANA_START,\n KATAKANA_END,\n} from '../constants';\n\nimport isCharInRange from './isCharInRange';\n\n/**\n * Tests a character. Returns true if the character is [Katakana](https://en.wikipedia.org/wiki/Katakana).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharKatakana(char = '') {\n return isCharInRange(char, KATAKANA_START, KATAKANA_END);\n}\n\nexport default isCharKatakana;\n","import isEmpty from './isEmpty';\nimport isCharHiragana from './isCharHiragana';\nimport isCharKatakana from './isCharKatakana';\n\n/**\n * Tests a character. Returns true if the character is [Hiragana](https://en.wikipedia.org/wiki/Hiragana) or [Katakana](https://en.wikipedia.org/wiki/Katakana).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharKana(char = '') {\n if (isEmpty(char)) return false;\n return isCharHiragana(char) || isCharKatakana(char);\n}\n\nexport default isCharKana;\n","import isEmpty from './utils/isEmpty';\nimport isCharKana from './utils/isCharKana';\n\n/**\n * Test if `input` is [Kana](https://en.wikipedia.org/wiki/Kana) ([Katakana](https://en.wikipedia.org/wiki/Katakana) and/or [Hiragana](https://en.wikipedia.org/wiki/Hiragana))\n * @param {String} [input=''] text\n * @return {Boolean} true if all [Kana](https://en.wikipedia.org/wiki/Kana)\n * @example\n * isKana('あ')\n * // => true\n * isKana('ア')\n * // => true\n * isKana('あーア')\n * // => true\n * isKana('A')\n * // => false\n * isKana('あAア')\n * // => false\n */\nfunction isKana(input = '') {\n if (isEmpty(input)) return false;\n return [...input].every(isCharKana);\n}\n\nexport default isKana;\n","import isEmpty from './utils/isEmpty';\nimport isCharHiragana from './utils/isCharHiragana';\n\n/**\n * Test if `input` is [Hiragana](https://en.wikipedia.org/wiki/Hiragana)\n * @param {String} [input=''] text\n * @return {Boolean} true if all [Hiragana](https://en.wikipedia.org/wiki/Hiragana)\n * @example\n * isHiragana('げーむ')\n * // => true\n * isHiragana('A')\n * // => false\n * isHiragana('あア')\n * // => false\n */\nfunction isHiragana(input = '') {\n if (isEmpty(input)) return false;\n return [...input].every(isCharHiragana);\n}\n\nexport default isHiragana;\n","import isEmpty from './utils/isEmpty';\nimport isCharKatakana from './utils/isCharKatakana';\n\n/**\n * Test if `input` is [Katakana](https://en.wikipedia.org/wiki/Katakana)\n * @param {String} [input=''] text\n * @return {Boolean} true if all [Katakana](https://en.wikipedia.org/wiki/Katakana)\n * @example\n * isKatakana('ゲーム')\n * // => true\n * isKatakana('あ')\n * // => false\n * isKatakana('A')\n * // => false\n * isKatakana('あア')\n * // => false\n */\nfunction isKatakana(input = '') {\n if (isEmpty(input)) return false;\n return [...input].every(isCharKatakana);\n}\n\nexport default isKatakana;\n","import {\n KANJI_START,\n KANJI_END,\n} from '../constants';\n\nimport isCharInRange from './isCharInRange';\n/**\n * Tests a character. Returns true if the character is a CJK ideograph (kanji).\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharKanji(char = '') {\n return isCharInRange(char, KANJI_START, KANJI_END);\n}\n\nexport default isCharKanji;\n","import isEmpty from './utils/isEmpty';\nimport isCharKanji from './utils/isCharKanji';\n\n/**\n * Tests if `input` is [Kanji](https://en.wikipedia.org/wiki/Kanji) ([Japanese CJK ideographs](https://en.wikipedia.org/wiki/CJK_Unified_Ideographs))\n * @param {String} [input=''] text\n * @return {Boolean} true if all [Kanji](https://en.wikipedia.org/wiki/Kanji)\n * @example\n * isKanji('刀')\n * // => true\n * isKanji('切腹')\n * // => true\n * isKanji('勢い')\n * // => false\n * isKanji('あAア')\n * // => false\n * isKanji('🐸')\n * // => false\n */\nfunction isKanji(input = '') {\n if (isEmpty(input)) return false;\n return [...input].every(isCharKanji);\n}\n\nexport default isKanji;\n","import isKanji from './isKanji';\nimport isHiragana from './isHiragana';\nimport isKatakana from './isKatakana';\nimport isRomaji from './isRomaji';\n\n/**\n * Test if `input` contains a mix of [Romaji](https://en.wikipedia.org/wiki/Romaji) *and* [Kana](https://en.wikipedia.org/wiki/Kana), defaults to pass through [Kanji](https://en.wikipedia.org/wiki/Kanji)\n * @param {String} input text\n * @param {Object} [options={ passKanji: true }] optional config to pass through kanji\n * @return {Boolean} true if mixed\n * @example\n * isMixed('Abあア'))\n * // => true\n * isMixed('お腹A')) // ignores kanji by default\n * // => true\n * isMixed('お腹A', { passKanji: false }))\n * // => false\n * isMixed('ab'))\n * // => false\n * isMixed('あア'))\n * // => false\n */\nfunction isMixed(input = '', options = { passKanji: true }) {\n const chars = [...input];\n let hasKanji = false;\n if (!options.passKanji) {\n hasKanji = chars.some(isKanji);\n }\n return (chars.some(isHiragana) || chars.some(isKatakana)) && chars.some(isRomaji) && !hasKanji;\n}\n\nexport default isMixed;\n","import { KATAKANA_START, HIRAGANA_START } from '../constants';\n\nimport isCharLongDash from './isCharLongDash';\nimport isCharSlashDot from './isCharSlashDot';\nimport isCharKatakana from './isCharKatakana';\nconst isCharInitialLongDash = (char, index) => isCharLongDash(char) && index < 1;\nconst isCharInnerLongDash = (char, index) => isCharLongDash(char) && index > 0;\nconst isKanaAsSymbol = (char) => ['ヶ', 'ヵ'].includes(char);\nconst LONG_VOWELS = {\n a: 'あ',\n i: 'い',\n u: 'う',\n e: 'え',\n o: 'う',\n};\n\n// inject toRomaji to avoid circular dependency between toRomaji <-> katakanaToHiragana\nfunction katakanaToHiragana(\n input = '',\n toRomaji,\n { isDestinationRomaji, convertLongVowelMark } = {}\n) {\n let previousKana = '';\n\n return input\n .split('')\n .reduce((hira, char, index) => {\n // Short circuit to avoid incorrect codeshift for 'ー' and '・'\n if (\n isCharSlashDot(char)\n || isCharInitialLongDash(char, index)\n || isKanaAsSymbol(char)\n ) {\n return hira.concat(char);\n }\n\n // Transform long vowels: 'オー' to 'おう'\n if (\n convertLongVowelMark\n && previousKana\n && isCharInnerLongDash(char, index)\n ) {\n // Transform previousKana back to romaji, and slice off the vowel\n const romaji = toRomaji(previousKana).slice(-1);\n // However, ensure 'オー' => 'おお' => 'oo' if this is a transform on the way to romaji\n if (\n isCharKatakana(input[index - 1])\n && romaji === 'o'\n && isDestinationRomaji\n ) {\n return hira.concat('お');\n }\n return hira.concat(LONG_VOWELS[romaji]);\n // Transform all other chars\n }\n\n if (!isCharLongDash(char) && isCharKatakana(char)) {\n const code = char.charCodeAt(0) + (HIRAGANA_START - KATAKANA_START);\n const hiraChar = String.fromCharCode(code);\n previousKana = hiraChar;\n return hira.concat(hiraChar);\n }\n\n // Pass non katakana chars through\n previousKana = '';\n return hira.concat(char);\n }, [])\n .join('');\n}\n\nexport default katakanaToHiragana;\n","import { transform, getSubTreeOf } from './kanaMapping';\nimport { ROMANIZATIONS } from '../constants';\n\nlet kanaToHepburnMap = null;\n\n/* eslint-disable */\n// prettier-ignore\nconst BASIC_ROMAJI = {\n あ:'a', い:'i', う:'u', え:'e', お:'o',\n か:'ka', き:'ki', く:'ku', け:'ke', こ:'ko',\n さ:'sa', し:'shi', す:'su', せ:'se', そ:'so',\n た:'ta', ち:'chi', つ:'tsu', て:'te', と:'to',\n な:'na', に:'ni', ぬ:'nu', ね:'ne', の:'no',\n は:'ha', ひ:'hi', ふ:'fu', へ:'he', ほ:'ho',\n ま:'ma', み:'mi', む:'mu', め:'me', も:'mo',\n ら:'ra', り:'ri', る:'ru', れ:'re', ろ:'ro',\n や:'ya', ゆ:'yu', よ:'yo',\n わ:'wa', ゐ:'wi', ゑ:'we', を:'wo',\n ん: 'n',\n が:'ga', ぎ:'gi', ぐ:'gu', げ:'ge', ご:'go',\n ざ:'za', じ:'ji', ず:'zu', ぜ:'ze', ぞ:'zo',\n だ:'da', ぢ:'ji', づ:'zu', で:'de', ど:'do',\n ば:'ba', び:'bi', ぶ:'bu', べ:'be', ぼ:'bo',\n ぱ:'pa', ぴ:'pi', ぷ:'pu', ぺ:'pe', ぽ:'po',\n ゔぁ:'va', ゔぃ:'vi', ゔ:'vu', ゔぇ:'ve', ゔぉ:'vo',\n};\n/* eslint-enable */\n\nconst SPECIAL_SYMBOLS = {\n '。': '.',\n '、': ',',\n ':': ':',\n '・': '/',\n '!': '!',\n '?': '?',\n '〜': '~',\n 'ー': '-',\n '「': '‘',\n '」': '’',\n '『': '“',\n '』': '”',\n '[': '[',\n ']': ']',\n '(': '(',\n ')': ')',\n '{': '{',\n '}': '}',\n ' ': ' ',\n};\n\n// んい -> n'i\nconst AMBIGUOUS_VOWELS = ['あ', 'い', 'う', 'え', 'お', 'や', 'ゆ', 'よ'];\nconst SMALL_Y = { ゃ: 'ya', ゅ: 'yu', ょ: 'yo' };\nconst SMALL_Y_EXTRA = { ぃ: 'yi', ぇ: 'ye' };\nconst SMALL_AIUEO = {\n ぁ: 'a',\n ぃ: 'i',\n ぅ: 'u',\n ぇ: 'e',\n ぉ: 'o',\n};\nconst YOON_KANA = [\n 'き',\n 'に',\n 'ひ',\n 'み',\n 'り',\n 'ぎ',\n 'び',\n 'ぴ',\n 'ゔ',\n 'く',\n 'ふ',\n];\nconst YOON_EXCEPTIONS = {\n し: 'sh',\n ち: 'ch',\n じ: 'j',\n ぢ: 'j',\n};\nconst SMALL_KANA = {\n っ: '',\n ゃ: 'ya',\n ゅ: 'yu',\n ょ: 'yo',\n ぁ: 'a',\n ぃ: 'i',\n ぅ: 'u',\n ぇ: 'e',\n ぉ: 'o',\n};\n\n// going with the intuitive (yet incorrect) solution where っや -> yya and っぃ -> ii\n// in other words, just assume the sokuon could have been applied to anything\nconst SOKUON_WHITELIST = {\n b: 'b',\n c: 't',\n d: 'd',\n f: 'f',\n g: 'g',\n h: 'h',\n j: 'j',\n k: 'k',\n m: 'm',\n p: 'p',\n q: 'q',\n r: 'r',\n s: 's',\n t: 't',\n v: 'v',\n w: 'w',\n x: 'x',\n z: 'z',\n};\n\nfunction getKanaToHepburnTree() {\n if (kanaToHepburnMap == null) {\n kanaToHepburnMap = createKanaToHepburnMap();\n }\n return kanaToHepburnMap;\n}\n\nexport function getKanaToRomajiTree(romanization) {\n switch (romanization) {\n case ROMANIZATIONS.HEPBURN:\n return getKanaToHepburnTree();\n default:\n return {};\n }\n}\n\nfunction createKanaToHepburnMap() {\n const romajiTree = transform(BASIC_ROMAJI);\n\n const subtreeOf = (string) => getSubTreeOf(romajiTree, string);\n const setTrans = (string, transliteration) => {\n subtreeOf(string)[''] = transliteration;\n };\n\n Object.entries(SPECIAL_SYMBOLS).forEach(([jsymbol, symbol]) => {\n subtreeOf(jsymbol)[''] = symbol;\n });\n\n [...Object.entries(SMALL_Y), ...Object.entries(SMALL_AIUEO)].forEach(\n ([roma, kana]) => {\n setTrans(roma, kana);\n }\n );\n\n // きゃ -> kya\n YOON_KANA.forEach((kana) => {\n const firstRomajiChar = subtreeOf(kana)[''][0];\n Object.entries(SMALL_Y).forEach(([yKana, yRoma]) => {\n setTrans(kana + yKana, firstRomajiChar + yRoma);\n });\n // きぃ -> kyi\n Object.entries(SMALL_Y_EXTRA).forEach(([yKana, yRoma]) => {\n setTrans(kana + yKana, firstRomajiChar + yRoma);\n });\n });\n\n Object.entries(YOON_EXCEPTIONS).forEach(([kana, roma]) => {\n // じゃ -> ja\n Object.entries(SMALL_Y).forEach(([yKana, yRoma]) => {\n setTrans(kana + yKana, roma + yRoma[1]);\n });\n // じぃ -> jyi, じぇ -> je\n setTrans(`${kana}ぃ`, `${roma}yi`);\n setTrans(`${kana}ぇ`, `${roma}e`);\n });\n\n romajiTree['っ'] = resolveTsu(romajiTree);\n\n Object.entries(SMALL_KANA).forEach(([kana, roma]) => {\n setTrans(kana, roma);\n });\n\n AMBIGUOUS_VOWELS.forEach((kana) => {\n setTrans(`ん${kana}`, `n'${subtreeOf(kana)['']}`);\n });\n\n // NOTE: could be re-enabled with an option?\n // // んば -> mbo\n // const LABIAL = [\n // 'ば', 'び', 'ぶ', 'べ', 'ぼ',\n // 'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ',\n // 'ま', 'み', 'む', 'め', 'も',\n // ];\n // LABIAL.forEach((kana) => {\n // setTrans(`ん${kana}`, `m${subtreeOf(kana)['']}`);\n // });\n\n return Object.freeze(JSON.parse(JSON.stringify(romajiTree)));\n}\n\nfunction resolveTsu(tree) {\n return Object.entries(tree).reduce((tsuTree, [key, value]) => {\n if (!key) {\n // we have reached the bottom of this branch\n const consonant = value.charAt(0);\n // eslint-disable-next-line no-param-reassign\n tsuTree[key] = Object.keys(SOKUON_WHITELIST).includes(consonant)\n ? SOKUON_WHITELIST[consonant] + value\n : value;\n } else {\n // more subtrees\n // eslint-disable-next-line no-param-reassign\n tsuTree[key] = resolveTsu(value);\n }\n return tsuTree;\n }, {});\n}\n","import memoizeOne from 'memoize-one';\nimport { dequal } from 'dequal';\n\nimport mergeWithDefaultOptions from './utils/mergeWithDefaultOptions';\nimport katakanaToHiragana from './utils/katakanaToHiragana';\nimport isKatakana from './isKatakana';\nimport { getKanaToRomajiTree } from './utils/kanaToRomajiMap';\nimport { applyMapping, mergeCustomMapping } from './utils/kanaMapping';\n\n// memoize and deeply compare args so we only recreate when necessary\nexport const createKanaToRomajiMap = memoizeOne(\n (romanization, customRomajiMapping) => {\n let map = getKanaToRomajiTree(romanization);\n\n if (customRomajiMapping) {\n map = mergeCustomMapping(map, customRomajiMapping);\n }\n\n return map;\n },\n dequal\n);\n\n/**\n * Convert kana to romaji\n * @param {String} kana text input\n * @param {DefaultOptions} [options=defaultOptions]\n * @param {Object} map custom mapping\n * @return {String} converted text\n * @example\n * toRomaji('ひらがな カタカナ')\n * // => 'hiragana katakana'\n * toRomaji('げーむ ゲーム')\n * // => 'ge-mu geemu'\n * toRomaji('ひらがな カタカナ', { upcaseKatakana: true })\n * // => 'hiragana KATAKANA'\n * toRomaji('つじぎり', { customRomajiMapping: { じ: 'zi', つ: 'tu', り: 'li' } });\n * // => 'tuzigili'\n */\nexport function toRomaji(input = '', options = {}, map) {\n const config = mergeWithDefaultOptions(options);\n\n if (!map) {\n map = createKanaToRomajiMap(\n config.romanization,\n config.customRomajiMapping\n );\n }\n\n // just throw away the substring index information and simply concatenate all the kana\n return splitIntoRomaji(input, config, map)\n .map((romajiToken) => {\n const [start, end, romaji] = romajiToken;\n const makeUpperCase = config.upcaseKatakana && isKatakana(input.slice(start, end));\n return makeUpperCase ? romaji.toUpperCase() : romaji;\n })\n .join('');\n}\n\nfunction splitIntoRomaji(input, options, map) {\n if (!map) {\n map = createKanaToRomajiMap(\n options.romanization,\n options.customRomajiMapping\n );\n }\n\n const config = Object.assign({}, { isDestinationRomaji: true }, options);\n\n return applyMapping(\n katakanaToHiragana(input, toRomaji, config),\n map,\n !options.IMEMode\n );\n}\n\nexport default toRomaji;\n","import isEmpty from './isEmpty';\nimport { EN_PUNCTUATION_RANGES } from '../constants';\nimport isCharInRange from './isCharInRange';\n\n/**\n * Tests a character. Returns true if the character is considered English punctuation.\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharEnglishPunctuation(char = '') {\n if (isEmpty(char)) return false;\n return EN_PUNCTUATION_RANGES.some(([start, end]) => isCharInRange(char, start, end));\n}\n\nexport default isCharEnglishPunctuation;\n","import isEmpty from './isEmpty';\nimport { JA_PUNCTUATION_RANGES } from '../constants';\nimport isCharInRange from './isCharInRange';\n\n/**\n * Tests a character. Returns true if the character is considered English punctuation.\n * @param {String} char character string to test\n * @return {Boolean}\n */\nfunction isCharJapanesePunctuation(char = '') {\n if (isEmpty(char)) return false;\n return JA_PUNCTUATION_RANGES.some(([start, end]) => isCharInRange(char, start, end));\n}\n\nexport default isCharJapanesePunctuation;\n","import isEmpty from './utils/isEmpty';\nimport isCharEnglishPunctuation from './utils/isCharEnglishPunctuation';\nimport isCharJapanesePunctuation from './utils/isCharJapanesePunctuation';\nimport isCharRomaji from './utils/isCharRomaji';\nimport isCharKanji from './utils/isCharKanji';\nimport isCharHiragana from './utils/isCharHiragana';\nimport isCharKatakana from './utils/isCharKatakana';\nimport isCharJapanese from './utils/isCharJapanese';\n\nconst isCharEnSpace = (x) => x === ' ';\nconst isCharJaSpace = (x) => x === ' ';\nconst isCharJaNum = (x) => /[0-9]/.test(x);\nconst isCharEnNum = (x) => /[0-9]/.test(x);\n\nexport const TOKEN_TYPES = {\n EN: 'en',\n JA: 'ja',\n EN_NUM: 'englishNumeral',\n JA_NUM: 'japaneseNumeral',\n EN_PUNC: 'englishPunctuation',\n JA_PUNC: 'japanesePunctuation',\n KANJI: 'kanji',\n HIRAGANA: 'hiragana',\n KATAKANA: 'katakana',\n SPACE: 'space',\n OTHER: 'other',\n};\n\n// prettier-ignore\nexport function getType(input, compact = false) {\n const {\n EN, JA, EN_NUM, JA_NUM, EN_PUNC, JA_PUNC, KANJI, HIRAGANA, KATAKANA, SPACE, OTHER,\n } = TOKEN_TYPES;\n\n if (compact) {\n switch (true) {\n case isCharJaNum(input): return OTHER;\n case isCharEnNum(input): return OTHER;\n case isCharEnSpace(input): return EN;\n case isCharEnglishPunctuation(input): return OTHER;\n case isCharJaSpace(input): return JA;\n case isCharJapanesePunctuation(input): return OTHER;\n case isCharJapanese(input): return JA;\n case isCharRomaji(input): return EN;\n default: return OTHER;\n }\n } else {\n switch (true) {\n case isCharJaSpace(input): return SPACE;\n case isCharEnSpace(input): return SPACE;\n case isCharJaNum(input): return JA_NUM;\n case isCharEnNum(input): return EN_NUM;\n case isCharEnglishPunctuation(input): return EN_PUNC;\n case isCharJapanesePunctuation(input): return JA_PUNC;\n case isCharKanji(input): return KANJI;\n case isCharHiragana(input): return HIRAGANA;\n case isCharKatakana(input): return KATAKANA;\n case isCharJapanese(input): return JA;\n case isCharRomaji(input): return EN;\n default: return OTHER;\n }\n }\n}\n\n/**\n * Splits input into array of strings separated by opinionated token types\n * `'en', 'ja', 'englishNumeral', 'japaneseNumeral','englishPunctuation', 'japanesePunctuation','kanji', 'hiragana', 'katakana', 'space', 'other'`.\n * If `{ compact: true }` then many same-language tokens are combined (spaces + text, kanji + kana, numeral + punctuation).\n * If `{ detailed: true }` then return array will contain `{ type, value }` instead of `'value'`\n * @param {String} input text\n * @param {Object} [options={ compact: false, detailed: false}] options to modify output style\n * @return {String|Object[]} text split into tokens containing values, or detailed object\n * @example\n * tokenize('ふふフフ')\n * // ['ふふ', 'フフ']\n *\n * tokenize('感じ')\n * // ['感', 'じ']\n *\n * tokenize('truly 私は悲しい')\n * // ['truly', ' ', '私', 'は', '悲', 'しい']\n *\n * tokenize('truly 私は悲しい', { compact: true })\n * // ['truly ', '私は悲しい']\n *\n * tokenize('5romaji here...!?漢字ひらがな4カタ カナ「SHIO」。!')\n * // [ '5', 'romaji', ' ', 'here', '...!?', '漢字', 'ひらがな', 'カタ', ' ', 'カナ', '4', '「', 'SHIO', '」。!']\n *\n * tokenize('5romaji here...!?漢字ひらがな4カタ カナ「SHIO」。!', { compact: true })\n * // [ '5', 'romaji here', '...!?', '漢字ひらがなカタ カナ', '4「', 'SHIO', '」。!']\n *\n * tokenize('5romaji here...!?漢字ひらがなカタ カナ4「SHIO」。! لنذهب', { detailed: true })\n * // [\n * { type: 'englishNumeral', value: '5' },\n * { type: 'en', value: 'romaji' },\n * { type: 'space', value: ' ' },\n * { type: 'en', value: 'here' },\n * { type: 'englishPunctuation', value: '...!?' },\n * { type: 'kanji', value: '漢字' },\n * { type: 'hiragana', value: 'ひらがな' },\n * { type: 'katakana', value: 'カタ' },\n * { type: 'space', value: ' ' },\n * { type: 'katakana', value: 'カナ' },\n * { type: 'japaneseNumeral', value: '4' },\n * { type: 'japanesePunctuation', value: '「' },\n * { type: 'ja', value: 'SHIO' },\n * { type: 'japanesePunctuation', value: '」。!' },\n * { type: 'space', value: ' ' },\n * { type: 'other', value: 'لنذهب' },\n * ]\n *\n * tokenize('5romaji here...!?漢字ひらがなカタ カナ4「SHIO」。! لنذهب', { compact: true, detailed: true})\n * // [\n * { type: 'other', value: '5' },\n * { type: 'en', value: 'romaji here' },\n * { type: 'other', value: '...!?' },\n * { type: 'ja', value: '漢字ひらがなカタ カナ' },\n * { type: 'other', value: '4「' },\n * { type: 'ja', value: 'SHIO' },\n * { type: 'other', value: '」。!' },\n * { type: 'en', value: ' ' },\n * { type: 'other', value: 'لنذهب' },\n *]\n */\nfunction tokenize(input, { compact = false, detailed = false } = {}) {\n if (input == null || isEmpty(input)) {\n return [];\n }\n const chars = [...input];\n let initial = chars.shift();\n let prevType = getType(initial, compact);\n initial = detailed ? { type: prevType, value: initial } : initial;\n\n const result = chars.reduce(\n (tokens, char) => {\n const currType = getType(char, compact);\n const sameType = currType === prevType;\n prevType = currType;\n let newValue = char;\n\n if (sameType) {\n newValue = (detailed ? tokens.pop().value : tokens.pop()) + newValue;\n }\n\n return detailed\n ? tokens.concat({ type: currType, value: newValue })\n : tokens.concat(newValue);\n },\n [initial]\n );\n return result;\n}\n\nexport default tokenize;\n","import isJapanese from './isJapanese';\nimport isKana from './isKana';\nimport isKanji from './isKanji';\nimport tokenize from './tokenize';\n\nconst isLeadingWithoutInitialKana = (input, leading) => leading && !isKana(input[0]);\nconst isTrailingWithoutFinalKana = (input, leading) => !leading && !isKana(input[input.length - 1]);\nconst isInvalidMatcher = (input, matchKanji) =>\n (matchKanji && ![...matchKanji].some(isKanji)) || (!matchKanji && isKana(input));\n\n/**\n * Strips [Okurigana](https://en.wikipedia.org/wiki/Okurigana)\n * @param {String} input text\n * @param {Object} [options={ leading: false, matchKanji: '' }] optional config\n * @return {String} text with okurigana removed\n * @example\n * stripOkurigana('踏み込む')\n * // => '踏み込'\n * stripOkurigana('お祝い')\n * // => 'お祝'\n * stripOkurigana('お腹', { leading: true });\n * // => '腹'\n * stripOkurigana('ふみこむ', { matchKanji: '踏み込む' });\n * // => 'ふみこ'\n * stripOkurigana('おみまい', { matchKanji: 'お祝い', leading: true });\n * // => 'みまい'\n */\nfunction stripOkurigana(input = '', { leading = false, matchKanji = '' } = {}) {\n if (\n !isJapanese(input) ||\n isLeadingWithoutInitialKana(input, leading) ||\n isTrailingWithoutFinalKana(input, leading) ||\n isInvalidMatcher(input, matchKanji)\n ) {\n return input;\n }\n\n const chars = matchKanji || input;\n const okuriganaRegex = new RegExp(\n leading ? `^${tokenize(chars).shift()}` : `${tokenize(chars).pop()}$`\n );\n return input.replace(okuriganaRegex, '');\n}\n\nexport default stripOkurigana;\n","import mergeWithDefaultOptions from './utils/mergeWithDefaultOptions';\nimport katakanaToHiragana from './utils/katakanaToHiragana';\nimport isCharEnglishPunctuation from './utils/isCharEnglishPunctuation';\nimport isRomaji from './isRomaji';\nimport isMixed from './isMixed';\nimport toKana from './toKana';\nimport toRomaji from './toRomaji';\n\n/**\n * Convert input to [Hiragana](https://en.wikipedia.org/wiki/Hiragana)\n * @param {String} [input=''] text\n * @param {DefaultOptions} [options=defaultOptions]\n * @return {String} converted text\n * @example\n * toHiragana('toukyou, オオサカ')\n * // => 'とうきょう、 おおさか'\n * toHiragana('only カナ', { passRomaji: true })\n * // => 'only かな'\n * toHiragana('wi')\n * // => 'うぃ'\n * toHiragana('wi', { useObsoleteKana: true })\n * // => 'ゐ'\n */\nfunction toHiragana(input = '', options = {}) {\n const config = mergeWithDefaultOptions(options);\n if (config.passRomaji) {\n return katakanaToHiragana(input, toRomaji, config);\n }\n\n if (isMixed(input, { passKanji: true })) {\n const convertedKatakana = katakanaToHiragana(input, toRomaji, config);\n return toKana(convertedKatakana.toLowerCase(), config);\n }\n\n if (isRomaji(input) || isCharEnglishPunctuation(input)) {\n return toKana(input.toLowerCase(), config);\n }\n\n return katakanaToHiragana(input, toRomaji, config);\n}\n\nexport default toHiragana;\n","import mergeWithDefaultOptions from './utils/mergeWithDefaultOptions';\nimport hiraganaToKatakana from './utils/hiraganaToKatakana';\nimport isCharEnglishPunctuation from './utils/isCharEnglishPunctuation';\nimport toKana from './toKana';\nimport isRomaji from './isRomaji';\nimport isMixed from './isMixed';\n\n/**\n * Convert input to [Katakana](https://en.wikipedia.org/wiki/Katakana)\n * @param {String} [input=''] text\n * @param {DefaultOptions} [options=defaultOptions]\n * @return {String} converted text\n * @example\n * toKatakana('toukyou, おおさか')\n * // => 'トウキョウ、 オオサカ'\n * toKatakana('only かな', { passRomaji: true })\n * // => 'only カナ'\n * toKatakana('wi')\n * // => 'ウィ'\n * toKatakana('wi', { useObsoleteKana: true })\n * // => 'ヰ'\n */\nfunction toKatakana(input = '', options = {}) {\n const mergedOptions = mergeWithDefaultOptions(options);\n if (mergedOptions.passRomaji) {\n return hiraganaToKatakana(input);\n }\n\n if (isMixed(input) || isRomaji(input) || isCharEnglishPunctuation(input)) {\n const hiragana = toKana(input.toLowerCase(), mergedOptions);\n return hiraganaToKatakana(hiragana);\n }\n\n return hiraganaToKatakana(input);\n}\n\nexport default toKatakana;\n","import { findListeners, untrackListeners } from './utils/dom';\nimport { removeDebugListeners } from './utils/logInputEvents';\n\n/**\n * Unbinds eventListener from input field\n * @param {HTMLElement} element textarea, input\n */\nexport function unbind(element, debug = false) {\n const listeners = findListeners(element);\n if (listeners == null) {\n throw new Error(\n `Element provided to Wanakana unbind() had no listener registered.\\n Received: ${JSON.stringify(\n element\n )}`\n );\n }\n const { inputHandler, compositionHandler } = listeners;\n element.removeAttribute('data-wanakana-id');\n element.removeAttribute('data-ignore-composition');\n element.removeEventListener('input', inputHandler);\n element.removeEventListener('compositionstart', compositionHandler);\n element.removeEventListener('compositionupdate', compositionHandler);\n element.removeEventListener('compositionend', compositionHandler);\n untrackListeners(listeners);\n if (debug === true) {\n removeDebugListeners(element);\n }\n}\n\nexport default unbind;\n"],"names":["typeOf","value","Object","_typeof","toString","call","slice","toLowerCase","isEmpty","input","length","isCharInRange","char","start","arguments","undefined","end","code","charCodeAt","VERSION","TO_KANA_METHODS","HIRAGANA","KATAKANA","ROMANIZATIONS","HEPBURN","DEFAULT_OPTIONS","useObsoleteKana","passRomaji","upcaseKatakana","IMEMode","convertLongVowelMark","romanization","HIRAGANA_START","KATAKANA_START","KANA_PUNCTUATION","JA_PUNCTUATION_RANGES","JAPANESE_RANGES","concat","ZENKAKU_UPPERCASE","ROMAJI_RANGES","EN_PUNCTUATION_RANGES","SMART_QUOTE_RANGES","isCharJapanese","some","_ref","_ref2","_slicedToArray","isJapanese","allowed","augmented","_toConsumableArray","every","isJa","test","safeIsNaN","Number","isNaN","areInputsEqual","newInputs","lastInputs","i","first","second","memoizeOne","resultFn","isEqual","cache","memoized","newArgs","_i","lastThis","this","lastArgs","lastResult","apply","clear","has","prototype","hasOwnProperty","find","iter","tar","key","_step","keys","_iterator","s","n","done","dequal","err","e","f","foo","bar","ctor","len","tmp","constructor","Date","getTime","RegExp","Array","Set","size","_step2","_iterator2","_createForOfIteratorHelper","Map","_step3","_iterator3","get","ArrayBuffer","Uint8Array","DataView","byteLength","getInt8","isView","mergeWithDefaultOptions","opts","assign","applyMapping","string","mapping","convertEnding","root","newChunk","remaining","currentCursor","firstChar","charAt","parse","tree","lastCursor","subtree","nextChar","nextSubtree","transform","entries","reduce","map","endOfBranch","getSubTreeOf","split","correctSubTree","createCustomMapping","customMap","customTree","forEach","_ref3","_ref4","roma","kana","subTree","transformMap","mapSubtree","customSubtree","newSubtree","_ref5","_ref6","JSON","stringify","mergeCustomMapping","customMapping","BASIC_KUNREI","a","u","o","k","t","h","m","y","r","w","g","z","d","b","p","v","SPECIAL_SYMBOLS","CONSONANTS","q","SMALL_Y","ya","yi","yu","ye","yo","SMALL_VOWELS","ALIASES","sh","ch","cy","chy","shy","j","jy","shi","chi","tsu","ji","fu","SMALL_LETTERS","tu","wa","ka","ke","SPECIAL_CASES","wu","wi","we","kwa","whu","tha","thu","tho","dha","dhu","dho","AIUEO_CONSTRUCTIONS","wh","kw","qw","gw","sw","ts","th","tw","dh","dw","fw","createRomajiToKanaMap","kanaTree","subtreeOf","addTsu","tsuTree","_ref19","_ref20","consonant","yKana","symbol","jsymbol","_ref7","_ref8","aiueoKana","_ref9","_ref10","vowel","nChar","c","_ref11","_ref12","alternative","allExceptLast","last","_ref15","_ref16","kunreiRoma","chars","xRoma","xSubtree","list","_ref13","_ref14","alt","startsWith","replace","altRoma","prefix","_ref17","_ref18","freeze","romajiToKanaMap","USE_OBSOLETE_KANA_MAP","isCharUpperCase","isCharLongDash","isCharSlashDot","isCharHiragana","hiraganaToKatakana","kata","push","kataChar","String","fromCharCode","join","customKanaMapping","mapCopy","IME_MODE_MAP","toKana","config","options","splitIntoConvertedKana","kanaToken","_kanaToken","enforceHiragana","enforceKatakana","LISTENERS","makeOnInput","prevInput","mergedConfig","preConfiguredMap","triggers","toUpperCase","target","dataset","ignoreComposition","splitInput","_splitInput2","text","head","toConvert","tail","cursor","includes","_workFromStart2","workFromStart","_workBackwards2","workBackwards","_takeWhileAndSlice2","takeWhileAndSlice","_takeWhileAndSlice4","selectionEnd","textToConvert","convertedText","newCursor","newValue","setTimeout","setSelectionRange","convertInput","onComposition","type","data","window","navigator","platform","trackListeners","id","inputHandler","compositionHandler","untrackListeners","targetId","filter","findListeners","el","getAttribute","catalystChars","startIndex","_takeWhileAndSlice5","reverse","_takeWhileAndSlice6","source","predicate","x","result","events","_ref$target","selectionStart","console","log","compositionstart","compositionupdate","_ref2$target","compositionend","addDebugListeners","event","handler","addEventListener","removeDebugListeners","removeEventListener","ELEMENTS","idCounter","newId","now","isCharRomaji","isRomaji","isRoma","isCharKatakana","isCharKana","isKana","isHiragana","isKatakana","isCharKanji","isKanji","isMixed","passKanji","hasKanji","isCharInitialLongDash","index","isCharInnerLongDash","isKanaAsSymbol","LONG_VOWELS","katakanaToHiragana","toRomaji","isDestinationRomaji","previousKana","hira","romaji","hiraChar","kanaToHepburnMap","BASIC_ROMAJI","あ","い","う","え","お","か","き","く","け","こ","さ","し","す","せ","そ","た","ち","つ","て","と","な","に","ぬ","ね","の","は","ひ","ふ","へ","ほ","ま","み","む","め","も","ら","り","る","れ","ろ","や","ゆ","よ","わ","ゐ","ゑ","を","ん","が","ぎ","ぐ","げ","ご","ざ","じ","ず","ぜ","ぞ","だ","ぢ","づ","で","ど","ば","び","ぶ","べ","ぼ","ぱ","ぴ","ぷ","ぺ","ぽ","ゔぁ","ゔぃ","ゔ","ゔぇ","ゔぉ","AMBIGUOUS_VOWELS","ゃ","ゅ","ょ","SMALL_Y_EXTRA","ぃ","ぇ","SMALL_AIUEO","ぁ","ぅ","ぉ","YOON_KANA","YOON_EXCEPTIONS","SMALL_KANA","っ","SOKUON_WHITELIST","getKanaToHepburnTree","romajiTree","setTrans","transliteration","firstRomajiChar","yRoma","resolveTsu","createKanaToRomajiMap","customRomajiMapping","getKanaToRomajiTree","splitIntoRomaji","romajiToken","_romajiToken","isCharEnglishPunctuation","isCharJapanesePunctuation","isCharEnSpace","isCharJaSpace","isCharJaNum","isCharEnNum","TOKEN_TYPES","getType","compact","EN","JA","EN_NUM","JA_NUM","EN_PUNC","JA_PUNC","KANJI","SPACE","OTHER","tokenize","_ref$compact","_ref$detailed","detailed","initial","shift","prevType","tokens","currType","sameType","pop","isLeadingWithoutInitialKana","leading","isTrailingWithoutFinalKana","isInvalidMatcher","matchKanji","element","debug","nodeName","Error","onInput","setAttribute","_ref$leading","_ref$matchKanji","okuriganaRegex","convertedKatakana","mergedOptions","hiragana","listeners","removeAttribute"],"mappings":"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"} \ No newline at end of file diff --git a/docs/constants.js.html b/docs/constants.js.html index 096fd82..3b920d9 100644 --- a/docs/constants.js.html +++ b/docs/constants.js.html @@ -90,7 +90,7 @@

-
export const VERSION = '5.0.1';
+    
export const VERSION = '5.0.2';
 
 export const TO_KANA_METHODS = {
   HIRAGANA: 'toHiragana',
diff --git a/docs/toKana.js.html b/docs/toKana.js.html
index 75a327b..010f0ce 100644
--- a/docs/toKana.js.html
+++ b/docs/toKana.js.html
@@ -164,9 +164,8 @@ 

return input.slice(start); } const enforceHiragana = config.IMEMode === TO_KANA_METHODS.HIRAGANA; - const enforceKatakana = - config.IMEMode === TO_KANA_METHODS.KATAKANA || - [...input.slice(start, end)].every(isCharUpperCase); + const enforceKatakana = config.IMEMode === TO_KANA_METHODS.KATAKANA + || [...input.slice(start, end)].every(isCharUpperCase); return enforceHiragana || !enforceKatakana ? kana