├── .classpath ├── .gitignore ├── .npmignore ├── .project ├── .settings ├── .jsdtscope ├── com.palantir.typescript.prefs ├── org.eclipse.core.resources.prefs ├── org.eclipse.jdt.core.prefs ├── org.eclipse.m2e.core.prefs ├── org.eclipse.wst.jsdt.ui.superType.container └── org.eclipse.wst.jsdt.ui.superType.name ├── LICENSE ├── README.md ├── demo ├── demo.js ├── index.html └── style.css ├── dist ├── jaconv.d.ts ├── jaconv.js ├── jaconv.js.map ├── jaconv.mjs └── jaconv.mjs.map ├── package-lock.json ├── package.json ├── pom.xml ├── src ├── main │ ├── java │ │ └── com │ │ │ └── d_project │ │ │ └── jaconv │ │ │ └── JaConv.java │ └── ts │ │ ├── jaconv.ts │ │ └── jaconv │ │ ├── hebon.ts │ │ ├── katahira.ts │ │ └── zenhan.ts └── test │ ├── java │ └── com │ │ └── d_project │ │ └── jaconv │ │ └── JaConvTest.java │ └── ts │ └── jaconv │ ├── hebon.spec.ts │ ├── katahira.spec.ts │ └── zenhan.spec.ts ├── tsconfig.json ├── vite.config.mts └── web-test-runner.config.mjs /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.tscache 2 | /*.tgz 3 | /build 4 | /target 5 | /node_modules 6 | /coverage 7 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.tgz 2 | .project 3 | .settings 4 | .classpath 5 | pom.xml 6 | target 7 | src/main/java 8 | src/test/java 9 | coverage 10 | demo 11 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | jaconv 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.wst.jsdt.core.javascriptValidator 10 | 11 | 12 | 13 | 14 | org.eclipse.jdt.core.javabuilder 15 | 16 | 17 | 18 | 19 | org.eclipse.m2e.core.maven2Builder 20 | 21 | 22 | 23 | 24 | 25 | org.eclipse.m2e.core.maven2Nature 26 | org.eclipse.wst.jsdt.core.jsNature 27 | org.eclipse.jdt.core.javanature 28 | 29 | 30 | 31 | 1477081816460 32 | 33 | 26 34 | 35 | org.eclipse.ui.ide.multiFilter 36 | 1.0-name-matches-true-false-node_modules 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /.settings/.jsdtscope: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.settings/com.palantir.typescript.prefs: -------------------------------------------------------------------------------- 1 | build.path.exportedFolder= 2 | build.path.sourceFolder=src 3 | compiler.outputDirOption= 4 | compiler.outputFileOption= 5 | eclipse.preferences.version=1 6 | -------------------------------------------------------------------------------- /.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding//src/main/java=UTF-8 3 | encoding//src/test/java=UTF-8 4 | encoding/=UTF-8 5 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate 4 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 5 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 6 | org.eclipse.jdt.core.compiler.compliance=1.8 7 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 8 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 9 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 10 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 11 | org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled 12 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 13 | org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning 14 | org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore 15 | org.eclipse.jdt.core.compiler.release=disabled 16 | org.eclipse.jdt.core.compiler.source=1.8 17 | -------------------------------------------------------------------------------- /.settings/org.eclipse.m2e.core.prefs: -------------------------------------------------------------------------------- 1 | activeProfiles= 2 | eclipse.preferences.version=1 3 | resolveWorkspaceProjects=true 4 | version=1 5 | -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.jsdt.ui.superType.container: -------------------------------------------------------------------------------- 1 | org.eclipse.wst.jsdt.launching.baseBrowserLibrary -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.jsdt.ui.superType.name: -------------------------------------------------------------------------------- 1 | Window -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Kazuhiko Arase 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 日本語文字変換ライブラリ (javascript) 2 | === 3 | 4 | [online demo](https://kazuhikoarase.github.io/jaconv/demo/#%E3%81%AB%E3%81%BB%E3%82%93%E3%81%94) 5 | 6 | * ヘボン式ローマ字変換 7 | * ひらがな-カタカナ変換 8 | * 全角-半角変換 (英数記号/カタカナ) 9 | 10 | ## API Documentation 11 | 12 | | Param | Type | Description | 13 | | ----- | ------------------- | -------------------- | 14 | | s | string | a string to convert | 15 | 16 | #### jaconv.toHebon(s) => string 17 | 18 | 全角ひらがなをヘボン式ローマ字で半角英文字に変換します。 19 | 20 | ※ ひらがなを一意にアルファベットに変換することを目的としており、一部意図通りに変換されない場合があります 21 | 22 | #### jaconv.toKatakana(s) => string 23 | 24 | 全角ひらがなを全角カタカナに変換します。 25 | 26 | #### jaconv.toHiragana(s) => string 27 | 28 | 全角カタカナを全角ひらがなに変換します。 29 | 30 | #### jaconv.toHanAscii(s) => string 31 | 32 | 全角英数記号を半角に変換します。 33 | 34 | #### jaconv.toZenAscii(s) => string 35 | 36 | 半角英数記号を全角に変換します。 37 | 38 | #### jaconv.toHanKana(s) => string 39 | 40 | 全角カタカナを半角に変換します。 41 | 42 | #### jaconv.toZenKana(s) => string 43 | 44 | 半角カタカナを全角に変換します。 45 | 46 | #### jaconv.toHan(s) => string 47 | 48 | 全角英数記号、カタカナを半角に変換します。 49 | (toHanAscii, toHanKana の組み合わせ) 50 | 51 | #### jaconv.toZen(s) => string 52 | 53 | 半角英数記号、カタカナを全角に変換します。 54 | (toZenAscii, toZenKana の組み合わせ) 55 | 56 | #### jaconv.normalize(s) => string 57 | 58 | 全角英数記号を半角に、半角カタカナを全角に変換します。 59 | (toHanAscii, toZenKana の組み合わせ) 60 | -------------------------------------------------------------------------------- /demo/demo.js: -------------------------------------------------------------------------------- 1 | 2 | import jaconv from '../dist/jaconv.mjs'; 3 | 4 | $(function() { 5 | 6 | var funcs = [ 7 | { name: 'toHebon', desc: '全角ひらがなをヘボン式ローマ字で半角英文字に変換' }, 8 | { name: 'toKatakana', desc: '全角ひらがなを全角カタカナに変換' }, 9 | { name: 'toHiragana', desc: '全角カタカナを全角ひらがなに変換' }, 10 | { name: 'toHanAscii', desc: '全角英数記号を半角に変換' }, 11 | { name: 'toZenAscii', desc: '半角英数記号を全角に変換' }, 12 | { name: 'toHanKana', desc: '全角カタカナを半角に変換' }, 13 | { name: 'toZenKana', desc: '半角カタカナを全角に変換' }, 14 | { name: 'toHan', desc: '全角英数記号、カタカナを半角に変換' }, 15 | { name: 'toZen', desc: '半角英数記号、カタカナを全角に変換' }, 16 | { name: 'normalize', desc: '全角英数記号を半角に、半角カタカナを全角に変換' } 17 | ]; 18 | 19 | var $inTxt = $('').addClass('txt'). 20 | attr('placeholder', 'ここに文字を入力'). 21 | on('keyup', function(event) { 22 | if (event.keyCode == 13) { 23 | // ENTER 24 | location.href = '#' + encodeURIComponent($inTxt.val() ); 25 | return; 26 | } 27 | $.each(funcs, function(i, func) { 28 | $('#' + func.name).val(jaconv[func.name]($inTxt.val() ) ); 29 | } ); 30 | }); 31 | 32 | var $body = $('#placeHolder').children('TBODY'); 33 | var addRow = function($cell1, $cell2) { 34 | $body.append($(''). 35 | append($('').addClass('lbl').append($cell1) ). 36 | append($('').append($cell2) ) ); 37 | }; 38 | addRow($('').text(''), $inTxt); 39 | $.each(funcs, function(i, func) { 40 | addRow($('').text('jaconv.' + func.name). 41 | attr('title', func.desc), 42 | $(''). 43 | addClass('txt').addClass('result'). 44 | attr('id', func.name). 45 | attr('tabindex', '-1'). 46 | prop('readonly', true) ); 47 | }); 48 | 49 | if (location.hash.match(/^#(.+)$/) ) { 50 | $inTxt.val(decodeURIComponent(location.hash.substring(1) ) ). 51 | trigger('keyup'); 52 | } 53 | 54 | $inTxt.focus(); 55 | }); 56 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | jaconv - 日本語文字変換ライブラリ (javascript) 6 | 7 | 8 | 9 | 10 | 11 | home 12 | Fork me on GitHub 13 |

日本語文字変換ライブラリ (javascript)

14 |
15 |
16 |
Contents Copyright © Kazuhiko Arase
17 | 18 | 19 | -------------------------------------------------------------------------------- /demo/style.css: -------------------------------------------------------------------------------- 1 | 2 | * { 3 | font-family: arial, sans-serif; 4 | } 5 | 6 | H1 { font-size: 20pt; } 7 | H2 { font-size: 16pt; } 8 | H3 { font-size: 14pt; } 9 | H4 { font-size: 11pt; } 10 | H5 { font-size: 10pt; } 11 | H6 { font-size: 9pt; } 12 | 13 | .lbl { 14 | text-align: right; 15 | } 16 | 17 | .txt { 18 | width: 300px; 19 | border: 1px solid #cccccc; 20 | } 21 | 22 | .result { 23 | background-color: #f0f0f0; 24 | } 25 | -------------------------------------------------------------------------------- /dist/jaconv.d.ts: -------------------------------------------------------------------------------- 1 | declare const _default: { 2 | toHebon: typeof hebon.toHebon; 3 | toHiragana: typeof katahira.toHiragana; 4 | toKatakana: typeof katahira.toKatakana; 5 | normalize: typeof zenhan.normalize; 6 | toHan: typeof zenhan.toHan; 7 | toHanAscii: typeof zenhan.toHanAscii; 8 | toHanKana: typeof zenhan.toHanKana; 9 | toZen: typeof zenhan.toZen; 10 | toZenAscii: typeof zenhan.toZenAscii; 11 | toZenKana: typeof zenhan.toZenKana; 12 | }; 13 | export default _default; 14 | 15 | declare namespace hebon { 16 | export { 17 | toHebon 18 | } 19 | } 20 | 21 | declare namespace katahira { 22 | export { 23 | toKatakana, 24 | toHiragana 25 | } 26 | } 27 | 28 | /** 29 | * 全角英数記号を半角に、半角カタカナを全角に変換します。 30 | * (toHanAscii, toZenKana の組み合わせ) 31 | */ 32 | declare function normalize(s: string): string; 33 | 34 | /** 35 | * 全角英数記号、カタカナを半角に変換します。 36 | * (toHanAscii, toHanKana の組み合わせ) 37 | */ 38 | declare function toHan(s: string): string; 39 | 40 | /** 41 | * 全角英数記号を半角に変換します。 42 | */ 43 | declare function toHanAscii(s: string): string; 44 | 45 | /** 46 | * 全角カタカナを半角に変換します。 47 | */ 48 | declare function toHanKana(s: string): string; 49 | 50 | /** 51 | * 全角ひらがなをヘボン式ローマ字で半角英文字に変換します。 52 | */ 53 | declare function toHebon(s: string): string; 54 | 55 | /** 56 | * 全角カタカナを全角ひらがなに変換します。 57 | */ 58 | declare function toHiragana(s: string): string; 59 | 60 | /** 61 | * 全角ひらがなを全角カタカナに変換します。 62 | */ 63 | declare function toKatakana(s: string): string; 64 | 65 | /** 66 | * 半角英数記号、カタカナを全角に変換します。 67 | * (toZenAscii, toZenKana の組み合わせ) 68 | */ 69 | declare function toZen(s: string): string; 70 | 71 | /** 72 | * 半角英数記号を全角に変換します。 73 | */ 74 | declare function toZenAscii(s: string): string; 75 | 76 | /** 77 | * 半角カタカナを全角に変換します。 78 | */ 79 | declare function toZenKana(s: string): string; 80 | 81 | declare namespace zenhan { 82 | export { 83 | toHanAscii, 84 | toZenAscii, 85 | toHanKana, 86 | toZenKana, 87 | toHan, 88 | toZen, 89 | normalize 90 | } 91 | } 92 | 93 | export { } 94 | -------------------------------------------------------------------------------- /dist/jaconv.js: -------------------------------------------------------------------------------- 1 | "use strict";const g={あ:"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",や:"YA",ゆ:"YU",よ:"YO",ら:"RA",り:"RI",る:"RU",れ:"RE",ろ:"RO",わ:"WA",ゐ:"I",ゑ:"E",を:"O",ぁ:"A",ぃ:"I",ぅ:"U",ぇ:"E",ぉ:"O",が:"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",きゃ:"KYA",きゅ:"KYU",きょ:"KYO",しゃ:"SHA",しゅ:"SHU",しょ:"SHO",ちゃ:"CHA",ちゅ:"CHU",ちょ:"CHO",ちぇ:"CHE",にゃ:"NYA",にゅ:"NYU",にょ:"NYO",ひゃ:"HYA",ひゅ:"HYU",ひょ:"HYO",みゃ:"MYA",みゅ:"MYU",みょ:"MYO",りゃ:"RYA",りゅ:"RYU",りょ:"RYO",ぎゃ:"GYA",ぎゅ:"GYU",ぎょ:"GYO",じゃ:"JA",じゅ:"JU",じょ:"JO",びゃ:"BYA",びゅ:"BYU",びょ:"BYO",ぴゃ:"PYA",ぴゅ:"PYU",ぴょ:"PYO"},M={AA:!0,EE:!0,II:!1,OO:!0,OU:!0,UU:!0},h=function(t,o){let n=null,e=null;return o+12&&(c=c.substring(c.length-2)),M[c]&&(r.h="")}o+=r.h}else o+=r.c;n=r.h,e+=r.c.length}return o}const s=12353,m=12438,f=12449,Z=12534;function B(t){let o="";for(let n=0;n",">","?","?","@","@","A","A","B","B","C","C","D","D","E","E","F","F","G","G","H","H","I","I","J","J","K","K","L","L","M","M","N","N","O","O","P","P","Q","Q","R","R","S","S","T","T","U","U","V","V","W","W","X","X","Y","Y","Z","Z","[","[","\\","¥","]","]","^","^","_","_","`","‘","a","a","b","b","c","c","d","d","e","e","f","f","g","g","h","h","i","i","j","j","k","k","l","l","m","m","n","n","o","o","p","p","q","q","r","r","s","s","t","t","u","u","v","v","w","w","x","x","y","y","z","z","{","{","|","|","}","}","~","~"],d=["。","。","「","「","」","」","、","、","・","・","ヲ","ヲ","ァ","ァ","ィ","ィ","ゥ","ゥ","ェ","ェ","ォ","ォ","ャ","ャ","ュ","ュ","ョ","ョ","ッ","ッ","ー","ー","ア","ア","イ","イ","ウ","ウ","エ","エ","オ","オ","カ","カ","キ","キ","ク","ク","ケ","ケ","コ","コ","ガ","ガ","ギ","ギ","グ","グ","ゲ","ゲ","ゴ","ゴ","サ","サ","シ","シ","ス","ス","セ","セ","ソ","ソ","ザ","ザ","ジ","ジ","ズ","ズ","ゼ","ゼ","ゾ","ゾ","タ","タ","チ","チ","ツ","ツ","テ","テ","ト","ト","ダ","ダ","ヂ","ヂ","ヅ","ヅ","デ","デ","ド","ド","ナ","ナ","ニ","ニ","ヌ","ヌ","ネ","ネ","ノ","ノ","ハ","ハ","ヒ","ヒ","フ","フ","ヘ","ヘ","ホ","ホ","バ","バ","ビ","ビ","ブ","ブ","ベ","ベ","ボ","ボ","パ","パ","ピ","ピ","プ","プ","ペ","ペ","ポ","ポ","マ","マ","ミ","ミ","ム","ム","メ","メ","モ","モ","ヤ","ヤ","ユ","ユ","ヨ","ヨ","ラ","ラ","リ","リ","ル","ル","レ","レ","ロ","ロ","ワ","ワ","ン","ン","ヴ","ヴ","゛","゙","゜","゚","ヰ","イ","ヱ","エ","ヮ","ワ","ヵ","カ","ヶ","ケ"],E=function(t){const o={},n={},e=function(a,l){o[a]||(o[a]=l),n[l]||(n[l]=a)},r=function(a,l){const O=l?n:o;let u="";for(let i=0;i 2) {\n htest = htest.substring(htest.length - 2);\n }\n if (aaSet[htest]) {\n hr.h = '';\n }\n }\n\n hebon += hr.h;\n\n } else {\n\n // 変換できない文字の場合\n hebon += hr.c;\n }\n\n lastHebon = hr.h;\n lastChar = hr.c;\n i += hr.c.length;\n }\n\n return hebon;\n}\n","//---------------------------------------------------------------------\n// カタカナ・ひらがな変換\n//\n// 2025/6/23 Kazuhiko Arase\n//\n\nconst minHira = 'ぁ'.charCodeAt(0);\nconst maxHira = 'ゖ'.charCodeAt(0);\nconst minKata= 'ァ'.charCodeAt(0);\nconst maxKata = 'ヶ'.charCodeAt(0);\n\n/**\n * 全角ひらがなを全角カタカナに変換します。\n */\nexport function toKatakana(s : string) {\n let res = '';\n for (let i = 0; i < s.length; i += 1) {\n const cd = s.charCodeAt(i);\n res += (minHira <= cd && cd <= maxHira)?\n String.fromCharCode(cd - minHira + minKata) : s.charAt(i);\n }\n return res;\n}\n\n/**\n * 全角カタカナを全角ひらがなに変換します。\n */\nexport function toHiragana(s : string) {\n let res = '';\n for (let i = 0; i < s.length; i += 1) {\n const cd = s.charCodeAt(i);\n res += (minKata <= cd && cd <= maxKata)?\n String.fromCharCode(cd - minKata + minHira) : s.charAt(i);\n }\n return res;\n}\n","//---------------------------------------------------------------------\n// 全角・半角変換\n//\n// 2005/2/26 Kazuhiko Arase\n//\n\nconst asciiData = [\n\n '\\u0020', '\\u3000',\n '!', '!',\n\n // 2重引用符\n //'\\\"', '"',\n '\\\"', '”', // 一対多の変換の逆変換は先優先\n '\\\"', '“',\n\n '#', '#',\n '$', '$',\n '%', '%',\n '&', '&',\n '\\'', '’',\n '(', '(',\n ')', ')',\n '*', '*',\n '+', '+',\n ',', ',',\n '-', '-',\n '.', '.',\n '/', '/',\n '0', '0',\n '1', '1',\n '2', '2',\n '3', '3',\n '4', '4',\n '5', '5',\n '6', '6',\n '7', '7',\n '8', '8',\n '9', '9',\n ':', ':',\n ';', ';',\n '<', '<',\n '=', '=',\n '>', '>',\n '?', '?',\n '@', '@',\n 'A', 'A',\n 'B', 'B',\n 'C', 'C',\n 'D', 'D',\n 'E', 'E',\n 'F', 'F',\n 'G', 'G',\n 'H', 'H',\n 'I', 'I',\n 'J', 'J',\n 'K', 'K',\n 'L', 'L',\n 'M', 'M',\n 'N', 'N',\n 'O', 'O',\n 'P', 'P',\n 'Q', 'Q',\n 'R', 'R',\n 'S', 'S',\n 'T', 'T',\n 'U', 'U',\n 'V', 'V',\n 'W', 'W',\n 'X', 'X',\n 'Y', 'Y',\n 'Z', 'Z',\n '[', '[',\n\n // 円記号\n //'\\\\', '\',\n '\\\\', '¥',\n\n ']', ']',\n '^', '^',\n '_', '_',\n '`', '‘',\n 'a', 'a',\n 'b', 'b',\n 'c', 'c',\n 'd', 'd',\n 'e', 'e',\n 'f', 'f',\n 'g', 'g',\n 'h', 'h',\n 'i', 'i',\n 'j', 'j',\n 'k', 'k',\n 'l', 'l',\n 'm', 'm',\n 'n', 'n',\n 'o', 'o',\n 'p', 'p',\n 'q', 'q',\n 'r', 'r',\n 's', 's',\n 't', 't',\n 'u', 'u',\n 'v', 'v',\n 'w', 'w',\n 'x', 'x',\n 'y', 'y',\n 'z', 'z',\n '{', '{',\n '|', '|',\n '}', '}',\n '~', '~'\n];\n\nconst kanaData = [\n '。', '。',\n '「', '「',\n '」', '」',\n '、', '、',\n '・', '・',\n 'ヲ', 'ヲ',\n\n 'ァ', 'ァ',\n 'ィ', 'ィ',\n 'ゥ', 'ゥ',\n 'ェ', 'ェ',\n 'ォ', 'ォ',\n\n 'ャ', 'ャ',\n 'ュ', 'ュ',\n 'ョ', 'ョ',\n\n 'ッ', 'ッ',\n\n 'ー', 'ー',\n\n 'ア', 'ア',\n 'イ', 'イ',\n 'ウ', 'ウ',\n 'エ', 'エ',\n 'オ', 'オ',\n\n 'カ', 'カ',\n 'キ', 'キ',\n 'ク', 'ク',\n 'ケ', 'ケ',\n 'コ', 'コ',\n\n 'ガ', 'ガ',\n 'ギ', 'ギ',\n 'グ', 'グ',\n 'ゲ', 'ゲ',\n 'ゴ', 'ゴ',\n\n 'サ', 'サ',\n 'シ', 'シ',\n 'ス', 'ス',\n 'セ', 'セ',\n 'ソ', 'ソ',\n\n 'ザ', 'ザ',\n 'ジ', 'ジ',\n 'ズ', 'ズ',\n 'ゼ', 'ゼ',\n 'ゾ', 'ゾ',\n\n 'タ', 'タ',\n 'チ', 'チ',\n 'ツ', 'ツ',\n 'テ', 'テ',\n 'ト', 'ト',\n\n 'ダ', 'ダ',\n 'ヂ', 'ヂ',\n 'ヅ', 'ヅ',\n 'デ', 'デ',\n 'ド', 'ド',\n\n 'ナ', 'ナ',\n 'ニ', 'ニ',\n 'ヌ', 'ヌ',\n 'ネ', 'ネ',\n 'ノ', 'ノ',\n\n 'ハ', 'ハ',\n 'ヒ', 'ヒ',\n 'フ', 'フ',\n 'ヘ', 'ヘ',\n 'ホ', 'ホ',\n\n 'バ', 'バ',\n 'ビ', 'ビ',\n 'ブ', 'ブ',\n 'ベ', 'ベ',\n 'ボ', 'ボ',\n\n 'パ', 'パ',\n 'ピ', 'ピ',\n 'プ', 'プ',\n 'ペ', 'ペ',\n 'ポ', 'ポ',\n\n 'マ', 'マ',\n 'ミ', 'ミ',\n 'ム', 'ム',\n 'メ', 'メ',\n 'モ', 'モ',\n\n 'ヤ', 'ヤ',\n 'ユ', 'ユ',\n 'ヨ', 'ヨ',\n\n 'ラ', 'ラ',\n 'リ', 'リ',\n 'ル', 'ル',\n 'レ', 'レ',\n 'ロ', 'ロ',\n\n 'ワ', 'ワ',\n 'ン', 'ン',\n\n 'ヴ', 'ヴ',\n\n '゛', '゙',\n '゜', '゚',\n\n 'ヰ', 'イ',\n 'ヱ', 'エ',\n 'ヮ', 'ワ',\n 'ヵ', 'カ',\n 'ヶ', 'ケ'\n];\n\ndeclare type StringMap = { [k : string] : string };\n\nconst createConversionMap = function(data : string[]) {\n\n const map1 : StringMap = {};\n const map2 : StringMap = {};\n\n const add = function(s1 : string, s2 : string) {\n if (!map1[s1]) {\n map1[s1] = s2;\n }\n if (!map2[s2]) {\n map2[s2] = s1;\n }\n };\n\n const convert = function(s : string, reverse : boolean) {\n\n const map = !reverse? map1 : map2;\n\n let converted = '';\n\n for (let i = 0; i < s.length; i += 1) {\n\n if (i + 1 < s.length) {\n const c = map[s.substring(i, i + 2)];\n if (c) {\n converted += c;\n i += 1;\n continue;\n }\n }\n\n const c = map[s.substring(i, i + 1)];\n if (c) {\n converted += c;\n continue;\n }\n\n // 変換テーブルに該当無し\n converted += s.substring(i, i + 1);\n }\n\n return converted;\n }\n\n if (data.length % 2 != 0) {\n throw 'bad data length:' + data.length;\n }\n const len = data.length / 2;\n for (let i = 0; i < len; i += 1) {\n add(data[i * 2], data[i * 2 + 1]);\n }\n\n return { convert : convert };\n};\n\n//---------------------------------------------------------\n// 全角-半角 マッピング (ASCII)\n//\n\nconst asciiMap = createConversionMap(asciiData);\n\n//---------------------------------------------------------\n// 全角-半角 マッピング (カタカナ)\n//\n\nconst kanaMap = createConversionMap(kanaData);\n\n// exports\n\n/**\n * 全角英数記号を半角に変換します。\n */\nexport function toHanAscii(s : string) {\n return asciiMap.convert(s, true);\n}\n\n/**\n * 半角英数記号を全角に変換します。\n */\nexport function toZenAscii(s : string) {\n return asciiMap.convert(s, false);\n}\n\n/**\n * 全角カタカナを半角に変換します。\n */\nexport function toHanKana(s : string) {\n return kanaMap.convert(s, false);\n}\n\n/**\n * 半角カタカナを全角に変換します。\n */\nexport function toZenKana(s : string) {\n return kanaMap.convert(s, true);\n}\n\n/**\n * 全角英数記号、カタカナを半角に変換します。\n * (toHanAscii, toHanKana の組み合わせ)\n */\nexport function toHan(s : string) {\n return toHanAscii(toHanKana(s) );\n}\n\n/**\n * 半角英数記号、カタカナを全角に変換します。\n * (toZenAscii, toZenKana の組み合わせ)\n */\nexport function toZen(s : string) {\n return toZenAscii(toZenKana(s) );\n}\n\n/**\n * 全角英数記号を半角に、半角カタカナを全角に変換します。\n * (toHanAscii, toZenKana の組み合わせ)\n */\nexport function normalize(s : string) {\n return toHanAscii(toZenKana(s) );\n}\n","//---------------------------------------------------------------------\n// 日本語文字変換ライブラリ (javascript)\n//\n// Copyright (c) 2025 Kazuhiko Arase\n//\n// URL: https://github.com/kazuhikoarase/jaconv\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n//---------------------------------------------------------------------\n\n\nimport * as hebon from './jaconv/hebon';\nimport * as katahira from './jaconv/katahira';\nimport * as zenhan from './jaconv/zenhan';\n\nexport default {\n\n toHebon: hebon.toHebon,\n\n toHiragana: katahira.toHiragana,\n toKatakana: katahira.toKatakana,\n\n normalize: zenhan.normalize,\n toHan: zenhan.toHan,\n toHanAscii: zenhan.toHanAscii,\n toHanKana: zenhan.toHanKana,\n toZen: zenhan.toZen,\n toZenAscii: zenhan.toZenAscii,\n toZenKana: zenhan.toZenKana,\n};\n"],"names":["hebonMap","aaSet","getHebon","s","index","h","c","toHebon","hebon","lastHebon","i","hr","nextHr","htest","minHira","maxHira","minKata","maxKata","toKatakana","res","cd","toHiragana","asciiData","kanaData","createConversionMap","data","map1","map2","add","s1","s2","convert","reverse","map","converted","len","asciiMap","kanaMap","toHanAscii","toZenAscii","toHanKana","toZenKana","toHan","toZen","normalize","jaconv","hebon.toHebon","katahira.toHiragana","katahira.toKatakana","zenhan.normalize","zenhan.toHan","zenhan.toHanAscii","zenhan.toHanKana","zenhan.toZen","zenhan.toZenAscii","zenhan.toZenKana"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/jaconv.mjs: -------------------------------------------------------------------------------- 1 | const g = { 2 | あ: "A", 3 | い: "I", 4 | う: "U", 5 | え: "E", 6 | お: "O", 7 | か: "KA", 8 | き: "KI", 9 | く: "KU", 10 | け: "KE", 11 | こ: "KO", 12 | さ: "SA", 13 | し: "SHI", 14 | す: "SU", 15 | せ: "SE", 16 | そ: "SO", 17 | た: "TA", 18 | ち: "CHI", 19 | つ: "TSU", 20 | て: "TE", 21 | と: "TO", 22 | な: "NA", 23 | に: "NI", 24 | ぬ: "NU", 25 | ね: "NE", 26 | の: "NO", 27 | は: "HA", 28 | ひ: "HI", 29 | ふ: "FU", 30 | へ: "HE", 31 | ほ: "HO", 32 | ま: "MA", 33 | み: "MI", 34 | む: "MU", 35 | め: "ME", 36 | も: "MO", 37 | や: "YA", 38 | ゆ: "YU", 39 | よ: "YO", 40 | ら: "RA", 41 | り: "RI", 42 | る: "RU", 43 | れ: "RE", 44 | ろ: "RO", 45 | わ: "WA", 46 | ゐ: "I", 47 | ゑ: "E", 48 | を: "O", 49 | ぁ: "A", 50 | ぃ: "I", 51 | ぅ: "U", 52 | ぇ: "E", 53 | ぉ: "O", 54 | が: "GA", 55 | ぎ: "GI", 56 | ぐ: "GU", 57 | げ: "GE", 58 | ご: "GO", 59 | ざ: "ZA", 60 | じ: "JI", 61 | ず: "ZU", 62 | ぜ: "ZE", 63 | ぞ: "ZO", 64 | だ: "DA", 65 | ぢ: "JI", 66 | づ: "ZU", 67 | で: "DE", 68 | ど: "DO", 69 | ば: "BA", 70 | び: "BI", 71 | ぶ: "BU", 72 | べ: "BE", 73 | ぼ: "BO", 74 | ぱ: "PA", 75 | ぴ: "PI", 76 | ぷ: "PU", 77 | ぺ: "PE", 78 | ぽ: "PO", 79 | きゃ: "KYA", 80 | きゅ: "KYU", 81 | きょ: "KYO", 82 | しゃ: "SHA", 83 | しゅ: "SHU", 84 | しょ: "SHO", 85 | ちゃ: "CHA", 86 | ちゅ: "CHU", 87 | ちょ: "CHO", 88 | ちぇ: "CHE", 89 | にゃ: "NYA", 90 | にゅ: "NYU", 91 | にょ: "NYO", 92 | ひゃ: "HYA", 93 | ひゅ: "HYU", 94 | ひょ: "HYO", 95 | みゃ: "MYA", 96 | みゅ: "MYU", 97 | みょ: "MYO", 98 | りゃ: "RYA", 99 | りゅ: "RYU", 100 | りょ: "RYO", 101 | ぎゃ: "GYA", 102 | ぎゅ: "GYU", 103 | ぎょ: "GYO", 104 | じゃ: "JA", 105 | じゅ: "JU", 106 | じょ: "JO", 107 | びゃ: "BYA", 108 | びゅ: "BYU", 109 | びょ: "BYO", 110 | ぴゃ: "PYA", 111 | ぴゅ: "PYU", 112 | ぴょ: "PYO" 113 | }, M = { 114 | AA: !0, 115 | EE: !0, 116 | II: !1, 117 | // I は連続しても省略しない 118 | OO: !0, 119 | OU: !0, 120 | UU: !0 121 | }, h = function(t, o) { 122 | let n = null, e = null; 123 | return o + 1 < t.length && (e = t.substring(o, o + 2), n = g[e]), !n && o < t.length && (e = t.substring(o, o + 1), n = g[e]), { c: e, h: n || null }; 124 | }; 125 | function S(t) { 126 | let o = "", n = "", e = 0; 127 | for (; e < t.length; ) { 128 | const r = h(t, e); 129 | if (r.c == "っ") { 130 | const c = h(t, e + 1); 131 | c.h != null && (c.h.indexOf("CH") == 0 ? r.h = "T" : r.h = c.h.substring(0, 1)); 132 | } else if (r.c == "ん") { 133 | const c = h(t, e + 1); 134 | c.h != null && "BMP".indexOf(c.h.charAt(0)) != -1 ? r.h = "M" : r.h = "N"; 135 | } else r.c == "ー" && (r.h = ""); 136 | if (r.h != null) { 137 | if (n != null) { 138 | let c = n + r.h; 139 | c.length > 2 && (c = c.substring(c.length - 2)), M[c] && (r.h = ""); 140 | } 141 | o += r.h; 142 | } else 143 | o += r.c; 144 | n = r.h, e += r.c.length; 145 | } 146 | return o; 147 | } 148 | const f = 12353, m = 12438, s = 12449, Z = 12534; 149 | function d(t) { 150 | let o = ""; 151 | for (let n = 0; n < t.length; n += 1) { 152 | const e = t.charCodeAt(n); 153 | o += f <= e && e <= m ? String.fromCharCode(e - f + s) : t.charAt(n); 154 | } 155 | return o; 156 | } 157 | function B(t) { 158 | let o = ""; 159 | for (let n = 0; n < t.length; n += 1) { 160 | const e = t.charCodeAt(n); 161 | o += s <= e && e <= Z ? String.fromCharCode(e - s + f) : t.charAt(n); 162 | } 163 | return o; 164 | } 165 | const N = [ 166 | " ", 167 | " ", 168 | "!", 169 | "!", 170 | // 2重引用符 171 | //'\"', '"', 172 | '"', 173 | "”", 174 | // 一対多の変換の逆変換は先優先 175 | '"', 176 | "“", 177 | "#", 178 | "#", 179 | "$", 180 | "$", 181 | "%", 182 | "%", 183 | "&", 184 | "&", 185 | "'", 186 | "’", 187 | "(", 188 | "(", 189 | ")", 190 | ")", 191 | "*", 192 | "*", 193 | "+", 194 | "+", 195 | ",", 196 | ",", 197 | "-", 198 | "-", 199 | ".", 200 | ".", 201 | "/", 202 | "/", 203 | "0", 204 | "0", 205 | "1", 206 | "1", 207 | "2", 208 | "2", 209 | "3", 210 | "3", 211 | "4", 212 | "4", 213 | "5", 214 | "5", 215 | "6", 216 | "6", 217 | "7", 218 | "7", 219 | "8", 220 | "8", 221 | "9", 222 | "9", 223 | ":", 224 | ":", 225 | ";", 226 | ";", 227 | "<", 228 | "<", 229 | "=", 230 | "=", 231 | ">", 232 | ">", 233 | "?", 234 | "?", 235 | "@", 236 | "@", 237 | "A", 238 | "A", 239 | "B", 240 | "B", 241 | "C", 242 | "C", 243 | "D", 244 | "D", 245 | "E", 246 | "E", 247 | "F", 248 | "F", 249 | "G", 250 | "G", 251 | "H", 252 | "H", 253 | "I", 254 | "I", 255 | "J", 256 | "J", 257 | "K", 258 | "K", 259 | "L", 260 | "L", 261 | "M", 262 | "M", 263 | "N", 264 | "N", 265 | "O", 266 | "O", 267 | "P", 268 | "P", 269 | "Q", 270 | "Q", 271 | "R", 272 | "R", 273 | "S", 274 | "S", 275 | "T", 276 | "T", 277 | "U", 278 | "U", 279 | "V", 280 | "V", 281 | "W", 282 | "W", 283 | "X", 284 | "X", 285 | "Y", 286 | "Y", 287 | "Z", 288 | "Z", 289 | "[", 290 | "[", 291 | // 円記号 292 | //'\\', '\', 293 | "\\", 294 | "¥", 295 | "]", 296 | "]", 297 | "^", 298 | "^", 299 | "_", 300 | "_", 301 | "`", 302 | "‘", 303 | "a", 304 | "a", 305 | "b", 306 | "b", 307 | "c", 308 | "c", 309 | "d", 310 | "d", 311 | "e", 312 | "e", 313 | "f", 314 | "f", 315 | "g", 316 | "g", 317 | "h", 318 | "h", 319 | "i", 320 | "i", 321 | "j", 322 | "j", 323 | "k", 324 | "k", 325 | "l", 326 | "l", 327 | "m", 328 | "m", 329 | "n", 330 | "n", 331 | "o", 332 | "o", 333 | "p", 334 | "p", 335 | "q", 336 | "q", 337 | "r", 338 | "r", 339 | "s", 340 | "s", 341 | "t", 342 | "t", 343 | "u", 344 | "u", 345 | "v", 346 | "v", 347 | "w", 348 | "w", 349 | "x", 350 | "x", 351 | "y", 352 | "y", 353 | "z", 354 | "z", 355 | "{", 356 | "{", 357 | "|", 358 | "|", 359 | "}", 360 | "}", 361 | "~", 362 | "~" 363 | ], P = [ 364 | "。", 365 | "。", 366 | "「", 367 | "「", 368 | "」", 369 | "」", 370 | "、", 371 | "、", 372 | "・", 373 | "・", 374 | "ヲ", 375 | "ヲ", 376 | "ァ", 377 | "ァ", 378 | "ィ", 379 | "ィ", 380 | "ゥ", 381 | "ゥ", 382 | "ェ", 383 | "ェ", 384 | "ォ", 385 | "ォ", 386 | "ャ", 387 | "ャ", 388 | "ュ", 389 | "ュ", 390 | "ョ", 391 | "ョ", 392 | "ッ", 393 | "ッ", 394 | "ー", 395 | "ー", 396 | "ア", 397 | "ア", 398 | "イ", 399 | "イ", 400 | "ウ", 401 | "ウ", 402 | "エ", 403 | "エ", 404 | "オ", 405 | "オ", 406 | "カ", 407 | "カ", 408 | "キ", 409 | "キ", 410 | "ク", 411 | "ク", 412 | "ケ", 413 | "ケ", 414 | "コ", 415 | "コ", 416 | "ガ", 417 | "ガ", 418 | "ギ", 419 | "ギ", 420 | "グ", 421 | "グ", 422 | "ゲ", 423 | "ゲ", 424 | "ゴ", 425 | "ゴ", 426 | "サ", 427 | "サ", 428 | "シ", 429 | "シ", 430 | "ス", 431 | "ス", 432 | "セ", 433 | "セ", 434 | "ソ", 435 | "ソ", 436 | "ザ", 437 | "ザ", 438 | "ジ", 439 | "ジ", 440 | "ズ", 441 | "ズ", 442 | "ゼ", 443 | "ゼ", 444 | "ゾ", 445 | "ゾ", 446 | "タ", 447 | "タ", 448 | "チ", 449 | "チ", 450 | "ツ", 451 | "ツ", 452 | "テ", 453 | "テ", 454 | "ト", 455 | "ト", 456 | "ダ", 457 | "ダ", 458 | "ヂ", 459 | "ヂ", 460 | "ヅ", 461 | "ヅ", 462 | "デ", 463 | "デ", 464 | "ド", 465 | "ド", 466 | "ナ", 467 | "ナ", 468 | "ニ", 469 | "ニ", 470 | "ヌ", 471 | "ヌ", 472 | "ネ", 473 | "ネ", 474 | "ノ", 475 | "ノ", 476 | "ハ", 477 | "ハ", 478 | "ヒ", 479 | "ヒ", 480 | "フ", 481 | "フ", 482 | "ヘ", 483 | "ヘ", 484 | "ホ", 485 | "ホ", 486 | "バ", 487 | "バ", 488 | "ビ", 489 | "ビ", 490 | "ブ", 491 | "ブ", 492 | "ベ", 493 | "ベ", 494 | "ボ", 495 | "ボ", 496 | "パ", 497 | "パ", 498 | "ピ", 499 | "ピ", 500 | "プ", 501 | "プ", 502 | "ペ", 503 | "ペ", 504 | "ポ", 505 | "ポ", 506 | "マ", 507 | "マ", 508 | "ミ", 509 | "ミ", 510 | "ム", 511 | "ム", 512 | "メ", 513 | "メ", 514 | "モ", 515 | "モ", 516 | "ヤ", 517 | "ヤ", 518 | "ユ", 519 | "ユ", 520 | "ヨ", 521 | "ヨ", 522 | "ラ", 523 | "ラ", 524 | "リ", 525 | "リ", 526 | "ル", 527 | "ル", 528 | "レ", 529 | "レ", 530 | "ロ", 531 | "ロ", 532 | "ワ", 533 | "ワ", 534 | "ン", 535 | "ン", 536 | "ヴ", 537 | "ヴ", 538 | "゛", 539 | "゙", 540 | "゜", 541 | "゚", 542 | "ヰ", 543 | "イ", 544 | "ヱ", 545 | "エ", 546 | "ヮ", 547 | "ワ", 548 | "ヵ", 549 | "カ", 550 | "ヶ", 551 | "ケ" 552 | ], E = function(t) { 553 | const o = {}, n = {}, e = function(a, l) { 554 | o[a] || (o[a] = l), n[l] || (n[l] = a); 555 | }, r = function(a, l) { 556 | const O = l ? n : o; 557 | let u = ""; 558 | for (let i = 0; i < a.length; i += 1) { 559 | if (i + 1 < a.length) { 560 | const Y = O[a.substring(i, i + 2)]; 561 | if (Y) { 562 | u += Y, i += 1; 563 | continue; 564 | } 565 | } 566 | const U = O[a.substring(i, i + 1)]; 567 | if (U) { 568 | u += U; 569 | continue; 570 | } 571 | u += a.substring(i, i + 1); 572 | } 573 | return u; 574 | }; 575 | if (t.length % 2 != 0) 576 | throw "bad data length:" + t.length; 577 | const c = t.length / 2; 578 | for (let a = 0; a < c; a += 1) 579 | e(t[a * 2], t[a * 2 + 1]); 580 | return { convert: r }; 581 | }, C = E(N), I = E(P); 582 | function A(t) { 583 | return C.convert(t, !0); 584 | } 585 | function K(t) { 586 | return C.convert(t, !1); 587 | } 588 | function b(t) { 589 | return I.convert(t, !1); 590 | } 591 | function H(t) { 592 | return I.convert(t, !0); 593 | } 594 | function p(t) { 595 | return A(b(t)); 596 | } 597 | function v(t) { 598 | return K(H(t)); 599 | } 600 | function G(t) { 601 | return A(H(t)); 602 | } 603 | const R = { 604 | toHebon: S, 605 | toHiragana: B, 606 | toKatakana: d, 607 | normalize: G, 608 | toHan: p, 609 | toHanAscii: A, 610 | toHanKana: b, 611 | toZen: v, 612 | toZenAscii: K, 613 | toZenKana: H 614 | }; 615 | export { 616 | R as default 617 | }; 618 | //# sourceMappingURL=jaconv.mjs.map 619 | -------------------------------------------------------------------------------- /dist/jaconv.mjs.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"jaconv.mjs","sources":["../src/main/ts/jaconv/hebon.ts","../src/main/ts/jaconv/katahira.ts","../src/main/ts/jaconv/zenhan.ts","../src/main/ts/jaconv.ts"],"sourcesContent":["//---------------------------------------------------------------------\n// ヘボン式ローマ字変換\n//\n// Copyright (c) 2011 Kazuhiko Arase\n//\n// URL: https://github.com/kazuhikoarase/jaconv\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n//---------------------------------------------------------------------\n\n// 'ん' は、別途ハンドリングするのでデータに含めない\nconst hebonMap : { [ hiragana : string ] : string } = {\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 'や':'YA','ゆ':'YU','よ':'YO',\n 'ら':'RA','り':'RI','る':'RU','れ':'RE','ろ':'RO',\n 'わ':'WA','ゐ':'I','ゑ':'E','を':'O',\n 'ぁ':'A','ぃ':'I','ぅ':'U','ぇ':'E','ぉ':'O',\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 'きゃ':'KYA','きゅ':'KYU','きょ':'KYO',\n 'しゃ':'SHA','しゅ':'SHU','しょ':'SHO',\n 'ちゃ':'CHA','ちゅ':'CHU','ちょ':'CHO','ちぇ':'CHE',\n 'にゃ':'NYA','にゅ':'NYU','にょ':'NYO',\n 'ひゃ':'HYA','ひゅ':'HYU','ひょ':'HYO',\n 'みゃ':'MYA','みゅ':'MYU','みょ':'MYO',\n 'りゃ':'RYA','りゅ':'RYU','りょ':'RYO',\n 'ぎゃ':'GYA','ぎゅ':'GYU','ぎょ':'GYO',\n 'じゃ':'JA','じゅ':'JU','じょ':'JO',\n 'びゃ':'BYA','びゅ':'BYU','びょ':'BYO',\n 'ぴゃ':'PYA','ぴゅ':'PYU','ぴょ':'PYO'\n};\n\nconst aaSet : { [ aa : string ] : boolean } = {\n 'AA': true, 'EE': true, 'II': false, // I は連続しても省略しない\n 'OO': true, 'OU': true, 'UU': true\n};\n\nconst getHebon = function(s : string, index : number) {\n let h : any = null;\n let c : any = null;\n if (index + 1 < s.length) {\n c = s.substring(index, index + 2);\n h = hebonMap[c];\n }\n if (!h && index < s.length) {\n c = s.substring(index, index + 1);\n h = hebonMap[c];\n }\n return {c: c, h: h || null};\n};\n\n/**\n * 全角ひらがなをヘボン式ローマ字で半角英文字に変換します。\n */\nexport function toHebon(s : string) {\n\n let hebon = '';\n let lastHebon = '';\n let lastChar :any = '';\n let i = 0;\n\n while (i < s.length) {\n\n const hr = getHebon(s, i);\n\n if (hr.c == 'っ') {\n\n // 'っち'\n const nextHr = getHebon(s, i + 1);\n if (nextHr.h != null) {\n if (nextHr.h.indexOf('CH') == 0) {\n hr.h = 'T';\n } else {\n hr.h = nextHr.h.substring(0, 1);\n }\n }\n\n } else if (hr.c == 'ん') {\n\n // B,M,P の前の 'ん' は 'M' とする。\n const nextHr = getHebon(s, i + 1);\n if (nextHr.h != null && 'BMP'.indexOf(nextHr.h.charAt(0) ) != -1) {\n hr.h = 'M';\n } else {\n hr.h = 'N';\n }\n\n } else if (hr.c == 'ー') {\n\n // 長音は無視\n hr.h = '';\n }\n\n if (hr.h != null) {\n\n // 変換できる文字の場合\n if (lastHebon != null) {\n\n // 連続する母音の除去\n let htest = lastHebon + hr.h;\n if (htest.length > 2) {\n htest = htest.substring(htest.length - 2);\n }\n if (aaSet[htest]) {\n hr.h = '';\n }\n }\n\n hebon += hr.h;\n\n } else {\n\n // 変換できない文字の場合\n hebon += hr.c;\n }\n\n lastHebon = hr.h;\n lastChar = hr.c;\n i += hr.c.length;\n }\n\n return hebon;\n}\n","//---------------------------------------------------------------------\n// カタカナ・ひらがな変換\n//\n// 2025/6/23 Kazuhiko Arase\n//\n\nconst minHira = 'ぁ'.charCodeAt(0);\nconst maxHira = 'ゖ'.charCodeAt(0);\nconst minKata= 'ァ'.charCodeAt(0);\nconst maxKata = 'ヶ'.charCodeAt(0);\n\n/**\n * 全角ひらがなを全角カタカナに変換します。\n */\nexport function toKatakana(s : string) {\n let res = '';\n for (let i = 0; i < s.length; i += 1) {\n const cd = s.charCodeAt(i);\n res += (minHira <= cd && cd <= maxHira)?\n String.fromCharCode(cd - minHira + minKata) : s.charAt(i);\n }\n return res;\n}\n\n/**\n * 全角カタカナを全角ひらがなに変換します。\n */\nexport function toHiragana(s : string) {\n let res = '';\n for (let i = 0; i < s.length; i += 1) {\n const cd = s.charCodeAt(i);\n res += (minKata <= cd && cd <= maxKata)?\n String.fromCharCode(cd - minKata + minHira) : s.charAt(i);\n }\n return res;\n}\n","//---------------------------------------------------------------------\n// 全角・半角変換\n//\n// 2005/2/26 Kazuhiko Arase\n//\n\nconst asciiData = [\n\n '\\u0020', '\\u3000',\n '!', '!',\n\n // 2重引用符\n //'\\\"', '"',\n '\\\"', '”', // 一対多の変換の逆変換は先優先\n '\\\"', '“',\n\n '#', '#',\n '$', '$',\n '%', '%',\n '&', '&',\n '\\'', '’',\n '(', '(',\n ')', ')',\n '*', '*',\n '+', '+',\n ',', ',',\n '-', '-',\n '.', '.',\n '/', '/',\n '0', '0',\n '1', '1',\n '2', '2',\n '3', '3',\n '4', '4',\n '5', '5',\n '6', '6',\n '7', '7',\n '8', '8',\n '9', '9',\n ':', ':',\n ';', ';',\n '<', '<',\n '=', '=',\n '>', '>',\n '?', '?',\n '@', '@',\n 'A', 'A',\n 'B', 'B',\n 'C', 'C',\n 'D', 'D',\n 'E', 'E',\n 'F', 'F',\n 'G', 'G',\n 'H', 'H',\n 'I', 'I',\n 'J', 'J',\n 'K', 'K',\n 'L', 'L',\n 'M', 'M',\n 'N', 'N',\n 'O', 'O',\n 'P', 'P',\n 'Q', 'Q',\n 'R', 'R',\n 'S', 'S',\n 'T', 'T',\n 'U', 'U',\n 'V', 'V',\n 'W', 'W',\n 'X', 'X',\n 'Y', 'Y',\n 'Z', 'Z',\n '[', '[',\n\n // 円記号\n //'\\\\', '\',\n '\\\\', '¥',\n\n ']', ']',\n '^', '^',\n '_', '_',\n '`', '‘',\n 'a', 'a',\n 'b', 'b',\n 'c', 'c',\n 'd', 'd',\n 'e', 'e',\n 'f', 'f',\n 'g', 'g',\n 'h', 'h',\n 'i', 'i',\n 'j', 'j',\n 'k', 'k',\n 'l', 'l',\n 'm', 'm',\n 'n', 'n',\n 'o', 'o',\n 'p', 'p',\n 'q', 'q',\n 'r', 'r',\n 's', 's',\n 't', 't',\n 'u', 'u',\n 'v', 'v',\n 'w', 'w',\n 'x', 'x',\n 'y', 'y',\n 'z', 'z',\n '{', '{',\n '|', '|',\n '}', '}',\n '~', '~'\n];\n\nconst kanaData = [\n '。', '。',\n '「', '「',\n '」', '」',\n '、', '、',\n '・', '・',\n 'ヲ', 'ヲ',\n\n 'ァ', 'ァ',\n 'ィ', 'ィ',\n 'ゥ', 'ゥ',\n 'ェ', 'ェ',\n 'ォ', 'ォ',\n\n 'ャ', 'ャ',\n 'ュ', 'ュ',\n 'ョ', 'ョ',\n\n 'ッ', 'ッ',\n\n 'ー', 'ー',\n\n 'ア', 'ア',\n 'イ', 'イ',\n 'ウ', 'ウ',\n 'エ', 'エ',\n 'オ', 'オ',\n\n 'カ', 'カ',\n 'キ', 'キ',\n 'ク', 'ク',\n 'ケ', 'ケ',\n 'コ', 'コ',\n\n 'ガ', 'ガ',\n 'ギ', 'ギ',\n 'グ', 'グ',\n 'ゲ', 'ゲ',\n 'ゴ', 'ゴ',\n\n 'サ', 'サ',\n 'シ', 'シ',\n 'ス', 'ス',\n 'セ', 'セ',\n 'ソ', 'ソ',\n\n 'ザ', 'ザ',\n 'ジ', 'ジ',\n 'ズ', 'ズ',\n 'ゼ', 'ゼ',\n 'ゾ', 'ゾ',\n\n 'タ', 'タ',\n 'チ', 'チ',\n 'ツ', 'ツ',\n 'テ', 'テ',\n 'ト', 'ト',\n\n 'ダ', 'ダ',\n 'ヂ', 'ヂ',\n 'ヅ', 'ヅ',\n 'デ', 'デ',\n 'ド', 'ド',\n\n 'ナ', 'ナ',\n 'ニ', 'ニ',\n 'ヌ', 'ヌ',\n 'ネ', 'ネ',\n 'ノ', 'ノ',\n\n 'ハ', 'ハ',\n 'ヒ', 'ヒ',\n 'フ', 'フ',\n 'ヘ', 'ヘ',\n 'ホ', 'ホ',\n\n 'バ', 'バ',\n 'ビ', 'ビ',\n 'ブ', 'ブ',\n 'ベ', 'ベ',\n 'ボ', 'ボ',\n\n 'パ', 'パ',\n 'ピ', 'ピ',\n 'プ', 'プ',\n 'ペ', 'ペ',\n 'ポ', 'ポ',\n\n 'マ', 'マ',\n 'ミ', 'ミ',\n 'ム', 'ム',\n 'メ', 'メ',\n 'モ', 'モ',\n\n 'ヤ', 'ヤ',\n 'ユ', 'ユ',\n 'ヨ', 'ヨ',\n\n 'ラ', 'ラ',\n 'リ', 'リ',\n 'ル', 'ル',\n 'レ', 'レ',\n 'ロ', 'ロ',\n\n 'ワ', 'ワ',\n 'ン', 'ン',\n\n 'ヴ', 'ヴ',\n\n '゛', '゙',\n '゜', '゚',\n\n 'ヰ', 'イ',\n 'ヱ', 'エ',\n 'ヮ', 'ワ',\n 'ヵ', 'カ',\n 'ヶ', 'ケ'\n];\n\ndeclare type StringMap = { [k : string] : string };\n\nconst createConversionMap = function(data : string[]) {\n\n const map1 : StringMap = {};\n const map2 : StringMap = {};\n\n const add = function(s1 : string, s2 : string) {\n if (!map1[s1]) {\n map1[s1] = s2;\n }\n if (!map2[s2]) {\n map2[s2] = s1;\n }\n };\n\n const convert = function(s : string, reverse : boolean) {\n\n const map = !reverse? map1 : map2;\n\n let converted = '';\n\n for (let i = 0; i < s.length; i += 1) {\n\n if (i + 1 < s.length) {\n const c = map[s.substring(i, i + 2)];\n if (c) {\n converted += c;\n i += 1;\n continue;\n }\n }\n\n const c = map[s.substring(i, i + 1)];\n if (c) {\n converted += c;\n continue;\n }\n\n // 変換テーブルに該当無し\n converted += s.substring(i, i + 1);\n }\n\n return converted;\n }\n\n if (data.length % 2 != 0) {\n throw 'bad data length:' + data.length;\n }\n const len = data.length / 2;\n for (let i = 0; i < len; i += 1) {\n add(data[i * 2], data[i * 2 + 1]);\n }\n\n return { convert : convert };\n};\n\n//---------------------------------------------------------\n// 全角-半角 マッピング (ASCII)\n//\n\nconst asciiMap = createConversionMap(asciiData);\n\n//---------------------------------------------------------\n// 全角-半角 マッピング (カタカナ)\n//\n\nconst kanaMap = createConversionMap(kanaData);\n\n// exports\n\n/**\n * 全角英数記号を半角に変換します。\n */\nexport function toHanAscii(s : string) {\n return asciiMap.convert(s, true);\n}\n\n/**\n * 半角英数記号を全角に変換します。\n */\nexport function toZenAscii(s : string) {\n return asciiMap.convert(s, false);\n}\n\n/**\n * 全角カタカナを半角に変換します。\n */\nexport function toHanKana(s : string) {\n return kanaMap.convert(s, false);\n}\n\n/**\n * 半角カタカナを全角に変換します。\n */\nexport function toZenKana(s : string) {\n return kanaMap.convert(s, true);\n}\n\n/**\n * 全角英数記号、カタカナを半角に変換します。\n * (toHanAscii, toHanKana の組み合わせ)\n */\nexport function toHan(s : string) {\n return toHanAscii(toHanKana(s) );\n}\n\n/**\n * 半角英数記号、カタカナを全角に変換します。\n * (toZenAscii, toZenKana の組み合わせ)\n */\nexport function toZen(s : string) {\n return toZenAscii(toZenKana(s) );\n}\n\n/**\n * 全角英数記号を半角に、半角カタカナを全角に変換します。\n * (toHanAscii, toZenKana の組み合わせ)\n */\nexport function normalize(s : string) {\n return toHanAscii(toZenKana(s) );\n}\n","//---------------------------------------------------------------------\n// 日本語文字変換ライブラリ (javascript)\n//\n// Copyright (c) 2025 Kazuhiko Arase\n//\n// URL: https://github.com/kazuhikoarase/jaconv\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n//---------------------------------------------------------------------\n\n\nimport * as hebon from './jaconv/hebon';\nimport * as katahira from './jaconv/katahira';\nimport * as zenhan from './jaconv/zenhan';\n\nexport default {\n\n toHebon: hebon.toHebon,\n\n toHiragana: katahira.toHiragana,\n toKatakana: katahira.toKatakana,\n\n normalize: zenhan.normalize,\n toHan: zenhan.toHan,\n toHanAscii: zenhan.toHanAscii,\n toHanKana: zenhan.toHanKana,\n toZen: zenhan.toZen,\n toZenAscii: zenhan.toZenAscii,\n toZenKana: zenhan.toZenKana,\n};\n"],"names":["hebonMap","aaSet","getHebon","s","index","h","c","toHebon","hebon","lastHebon","i","hr","nextHr","htest","minHira","maxHira","minKata","maxKata","toKatakana","res","cd","toHiragana","asciiData","kanaData","createConversionMap","data","map1","map2","add","s1","s2","convert","reverse","map","converted","len","asciiMap","kanaMap","toHanAscii","toZenAscii","toHanKana","toZenKana","toHan","toZen","normalize","jaconv","hebon.toHebon","katahira.toHiragana","katahira.toKatakana","zenhan.normalize","zenhan.toHan","zenhan.toHanAscii","zenhan.toHanKana","zenhan.toZen","zenhan.toZenAscii","zenhan.toZenKana"],"mappings":"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;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAM;AAAA,EACN;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA;AAAA;AAAA,EAIL;AAAA,EAAM;AAAA,EAEN;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AACP,GAEMC,IAAW;AAAA,EACf;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EAEL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AAAA,EACL;AAAA,EAAK;AACP,GAIMC,IAAsB,SAASC,GAAiB;AAEpD,QAAMC,IAAmB,CAAA,GACnBC,IAAmB,CAAA,GAEnBC,IAAM,SAASC,GAAaC,GAAa;AAC7C,IAAKJ,EAAKG,CAAE,MACVH,EAAKG,CAAE,IAAIC,IAERH,EAAKG,CAAE,MACVH,EAAKG,CAAE,IAAID;AAAA,EACb,GAGIE,IAAU,SAAS5B,GAAa6B,GAAmB;AAEvD,UAAMC,IAAOD,IAAgBL,IAAPD;AAEtB,QAAIQ,IAAY;AAEhB,aAAS,IAAI,GAAG,IAAI/B,EAAE,QAAQ,KAAK,GAAG;AAEpC,UAAI,IAAI,IAAIA,EAAE,QAAQ;AACpB,cAAMG,IAAI2B,EAAI9B,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;AACnC,YAAIG,GAAG;AACL,UAAA4B,KAAa5B,GACb,KAAK;AACL;AAAA,QAAA;AAAA,MACF;AAGF,YAAMA,IAAI2B,EAAI9B,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;AACnC,UAAIG,GAAG;AACL,QAAA4B,KAAa5B;AACb;AAAA,MAAA;AAIF,MAAA4B,KAAa/B,EAAE,UAAU,GAAG,IAAI,CAAC;AAAA,IAAA;AAGnC,WAAO+B;AAAA,EAAA;AAGT,MAAIT,EAAK,SAAS,KAAK;AACrB,UAAM,qBAAqBA,EAAK;AAElC,QAAMU,IAAMV,EAAK,SAAS;AAC1B,WAASf,IAAI,GAAGA,IAAIyB,GAAKzB,KAAK;AAC5B,IAAAkB,EAAIH,EAAKf,IAAI,CAAC,GAAGe,EAAKf,IAAI,IAAI,CAAC,CAAC;AAGlC,SAAO,EAAE,SAAAqB,EAAA;AACX,GAMMK,IAAWZ,EAAoBF,CAAS,GAMxCe,IAAUb,EAAoBD,CAAQ;AAOrC,SAASe,EAAWnC,GAAY;AACrC,SAAOiC,EAAS,QAAQjC,GAAG,EAAI;AACjC;AAKO,SAASoC,EAAWpC,GAAY;AACrC,SAAOiC,EAAS,QAAQjC,GAAG,EAAK;AAClC;AAKO,SAASqC,EAAUrC,GAAY;AACpC,SAAOkC,EAAQ,QAAQlC,GAAG,EAAK;AACjC;AAKO,SAASsC,EAAUtC,GAAY;AACpC,SAAOkC,EAAQ,QAAQlC,GAAG,EAAI;AAChC;AAMO,SAASuC,EAAMvC,GAAY;AAChC,SAAOmC,EAAWE,EAAUrC,CAAC,CAAE;AACjC;AAMO,SAASwC,EAAMxC,GAAY;AAChC,SAAOoC,EAAWE,EAAUtC,CAAC,CAAE;AACjC;AAMO,SAASyC,EAAUzC,GAAY;AACpC,SAAOmC,EAAWG,EAAUtC,CAAC,CAAE;AACjC;ACjVA,MAAA0C,IAAe;AAAA,EAEb,SAASC;AAAAA,EAET,YAAYC;AAAAA,EACZ,YAAYC;AAAAA,EAEZ,WAAWC;AAAAA,EACX,OAAOC;AAAAA,EACP,YAAYC;AAAAA,EACZ,WAAWC;AAAAA,EACX,OAAOC;AAAAA,EACP,YAAYC;AAAAA,EACZ,WAAWC;AACb;"} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jaconv", 3 | "version": "1.1.2", 4 | "description": "Japanese character conversion library", 5 | "author": "Kazuhiko Arase", 6 | "main": "dist/jaconv.js", 7 | "module": "dist/jaconv.mjs", 8 | "types": "dist/jaconv.d.ts", 9 | "exports": { 10 | "types": "./dist/jaconv.d.ts", 11 | "require": "./dist/jaconv.js", 12 | "import": "./dist/jaconv.mjs" 13 | }, 14 | "directories": { 15 | "dist": "dist" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "https://github.com/kazuhikoarase/jaconv.git" 20 | }, 21 | "bugs": { 22 | "url": "https://github.com/kazuhikoarase/jaconv/issues" 23 | }, 24 | "keywords": [ 25 | "japanese", 26 | "conversion", 27 | "hebon", 28 | "hepburn", 29 | "romaji", 30 | "roman", 31 | "romanization", 32 | "hankaku", 33 | "zenkaku", 34 | "hiragana", 35 | "katakana" 36 | ], 37 | "scripts": { 38 | "dev": "vite", 39 | "build": "vite build", 40 | "test": "wtr" 41 | }, 42 | "license": "MIT", 43 | "devDependencies": { 44 | "@open-wc/testing": "^4.0.0", 45 | "@types/node": "^24.0.3", 46 | "@web/dev-server-esbuild": "^1.0.4", 47 | "@web/test-runner": "^0.20.2", 48 | "typescript": "~5.8.3", 49 | "vite": "^6.3.5", 50 | "vite-plugin-dts": "^4.5.4" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 4 | 4.0.0 5 | 6 | com.d_project 7 | jaconv 8 | 0.1.0-SNAPSHOT 9 | jar 10 | 11 | jaconv 12 | Japanese Character Converter 13 | https://github.com/kazuhikoarase/jaconv 14 | 15 | 16 | 17 | MIT License 18 | http://www.opensource.org/licenses/mit-license.php 19 | 20 | 21 | 22 | 23 | 24 | Kazuhiko Arase 25 | kazuhiko.arase@gmail.com 26 | kazuhikoarase 27 | https://kazuhikoarase.github.io/ 28 | 29 | 30 | 31 | 32 | scm:git:git://github.com/kazuhikoarase/jaconv.git 33 | scm:git:ssh://github.com:kazuhikoarase/jaconv.git 34 | https://github.com/kazuhikoarase/jaconv/tree/master 35 | 36 | 37 | 38 | UTF-8 39 | UTF-8 40 | 41 | 42 | 43 | 44 | junit 45 | junit 46 | 4.13.1 47 | test 48 | 49 | 50 | 51 | 52 | 53 | 54 | src/test/java 55 | 56 | **/*.java 57 | 58 | 59 | 60 | 61 | 62 | maven-compiler-plugin 63 | 3.7.0 64 | 65 | 1.8 66 | 1.8 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /src/main/java/com/d_project/jaconv/JaConv.java: -------------------------------------------------------------------------------- 1 | package com.d_project.jaconv; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * JaConv 8 | * @author kazuhiko arase 9 | */ 10 | @SuppressWarnings({"serial", "unused"}) 11 | public class JaConv { 12 | 13 | private JaConv() { 14 | } 15 | 16 | protected static class JMap extends HashMap { 17 | JMap _$(K k, V v) { put(k, v); return this; } 18 | } 19 | 20 | // 'ん' は、別途ハンドリングするのでデータに含めない 21 | private static final Map hebonMap = 22 | new JMap(). 23 | _$("あ", "A")._$("い", "I")._$("う", "U")._$("え", "E")._$("お", "O"). 24 | _$("か", "KA")._$("き", "KI")._$("く", "KU")._$("け", "KE")._$("こ", "KO"). 25 | _$("さ", "SA")._$("し", "SHI")._$("す", "SU")._$("せ", "SE")._$("そ", "SO"). 26 | _$("た", "TA")._$("ち", "CHI")._$("つ", "TSU")._$("て", "TE")._$("と", "TO"). 27 | _$("な", "NA")._$("に", "NI")._$("ぬ", "NU")._$("ね", "NE")._$("の", "NO"). 28 | _$("は", "HA")._$("ひ", "HI")._$("ふ", "FU")._$("へ", "HE")._$("ほ", "HO"). 29 | _$("ま", "MA")._$("み", "MI")._$("む", "MU")._$("め", "ME")._$("も", "MO"). 30 | _$("や", "YA")._$("ゆ", "YU")._$("よ", "YO"). 31 | _$("ら", "RA")._$("り", "RI")._$("る", "RU")._$("れ", "RE")._$("ろ", "RO"). 32 | _$("わ", "WA")._$("ゐ", "I")._$("ゑ", "E")._$("を", "O"). 33 | _$("ぁ", "A")._$("ぃ", "I")._$("ぅ", "U")._$("ぇ", "E")._$("ぉ", "O"). 34 | _$("が", "GA")._$("ぎ", "GI")._$("ぐ", "GU")._$("げ", "GE")._$("ご", "GO"). 35 | _$("ざ", "ZA")._$("じ", "JI")._$("ず", "ZU")._$("ぜ", "ZE")._$("ぞ", "ZO"). 36 | _$("だ", "DA")._$("ぢ", "JI")._$("づ", "ZU")._$("で", "DE")._$("ど", "DO"). 37 | _$("ば", "BA")._$("び", "BI")._$("ぶ", "BU")._$("べ", "BE")._$("ぼ", "BO"). 38 | _$("ぱ", "PA")._$("ぴ", "PI")._$("ぷ", "PU")._$("ぺ", "PE")._$("ぽ", "PO"). 39 | _$("きゃ", "KYA")._$("きゅ", "KYU")._$("きょ", "KYO"). 40 | _$("しゃ", "SHA")._$("しゅ", "SHU")._$("しょ", "SHO"). 41 | _$("ちゃ", "CHA")._$("ちゅ", "CHU")._$("ちょ", "CHO")._$("ちぇ", "CHE"). 42 | _$("にゃ", "NYA")._$("にゅ", "NYU")._$("にょ", "NYO"). 43 | _$("ひゃ", "HYA")._$("ひゅ", "HYU")._$("ひょ", "HYO"). 44 | _$("みゃ", "MYA")._$("みゅ", "MYU")._$("みょ", "MYO"). 45 | _$("りゃ", "RYA")._$("りゅ", "RYU")._$("りょ", "RYO"). 46 | _$("ぎゃ", "GYA")._$("ぎゅ", "GYU")._$("ぎょ", "GYO"). 47 | _$("じゃ", "JA")._$("じゅ", "JU")._$("じょ", "JO"). 48 | _$("びゃ", "BYA")._$("びゅ", "BYU")._$("びょ", "BYO"). 49 | _$("ぴゃ", "PYA")._$("ぴゅ", "PYU")._$("ぴょ","PYO"); 50 | 51 | private static final Map aaSet = 52 | new JMap(). 53 | _$("AA", true)._$("EE", true)._$("II", false). // I は連続しても省略しない 54 | _$("OO", true)._$("OU", true)._$("UU", true); 55 | 56 | protected static Hebon getHebon(String s, int index) { 57 | String h = null; 58 | String c = null; 59 | if (index + 1 < s.length() ) { 60 | c = s.substring(index, index + 2); 61 | h = hebonMap.get(c); 62 | } 63 | if (h == null && index < s.length() ) { 64 | c = s.substring(index, index + 1); 65 | h = hebonMap.get(c); 66 | } 67 | return new Hebon(c, h); 68 | } 69 | 70 | protected static class Hebon { 71 | public String c; 72 | public String h; 73 | public Hebon(String c, String h) { 74 | this.c = c; 75 | this.h = h; 76 | } 77 | } 78 | 79 | /** 80 | * 全角ひらがなをヘボン式ローマ字で半角英文字に変換します。 81 | */ 82 | public static String toHebon(String s) { 83 | 84 | StringBuilder hebon = new StringBuilder(); 85 | String lastHebon = ""; 86 | String lastChar = ""; 87 | int i = 0; 88 | 89 | while (i < s.length() ) { 90 | 91 | Hebon hr = getHebon(s, i); 92 | 93 | if (hr.c.equals("っ") ) { 94 | 95 | // 'っち' 96 | Hebon nextHr = getHebon(s, i + 1); 97 | if (nextHr.h != null) { 98 | if (nextHr.h.indexOf("CH") == 0) { 99 | hr.h = "T"; 100 | } else { 101 | hr.h = nextHr.h.substring(0, 1); 102 | } 103 | } 104 | 105 | } else if (hr.c.equals("ん") ) { 106 | 107 | // B,M,P の前の 'ん' は 'M' とする。 108 | Hebon nextHr = getHebon(s, i + 1); 109 | if (nextHr.h != null && "BMP".indexOf(nextHr.h.charAt(0) ) != -1) { 110 | hr.h = "M"; 111 | } else { 112 | hr.h = "N"; 113 | } 114 | 115 | } else if (hr.c.equals("ー") ) { 116 | 117 | // 長音は無視 118 | hr.h = ""; 119 | } 120 | 121 | if (hr.h != null) { 122 | 123 | // 変換できる文字の場合 124 | if (lastHebon != null) { 125 | 126 | // 連続する母音の除去 127 | String htest = lastHebon + hr.h; 128 | if (htest.length() > 2) { 129 | htest = htest.substring(htest.length() - 2); 130 | } 131 | Boolean b = aaSet.get(htest); 132 | if (b != null && b.booleanValue() ) { 133 | hr.h = ""; 134 | } 135 | } 136 | 137 | hebon.append(hr.h); 138 | 139 | } else { 140 | 141 | // 変換できない文字の場合 142 | hebon.append(hr.c); 143 | } 144 | 145 | lastHebon = hr.h; 146 | lastChar = hr.c; 147 | i += hr.c.length(); 148 | } 149 | 150 | return hebon.toString(); 151 | } 152 | 153 | private static final char minHira = 'ぁ'; 154 | private static final char maxHira = 'ゖ'; 155 | private static final char minKata= 'ァ'; 156 | private static final char maxKata = 'ヶ'; 157 | 158 | /** 159 | * 全角ひらがなを全角カタカナに変換します。 160 | */ 161 | public static String toKatakana(String s) { 162 | StringBuilder res = new StringBuilder(); 163 | for (int i = 0; i < s.length(); i += 1) { 164 | char c = s.charAt(i); 165 | res.append( (minHira <= c && c <= maxHira)? 166 | (char)(c - minHira + minKata) : s.charAt(i) ); 167 | } 168 | return res.toString(); 169 | } 170 | 171 | /** 172 | * 全角カタカナを全角ひらがなに変換します。 173 | */ 174 | public static String toHiragana(String s) { 175 | StringBuilder res = new StringBuilder(); 176 | for (int i = 0; i < s.length(); i += 1) { 177 | char c = s.charAt(i); 178 | res.append( (minKata <= c && c <= maxKata)? 179 | (char)(c - minKata + minHira) : s.charAt(i) ); 180 | } 181 | return res.toString(); 182 | } 183 | 184 | //--------------------------------------------------------- 185 | // 全角-半角 マッピング (ASCII) 186 | // 187 | 188 | private static final ConversionMap asciiMap; 189 | 190 | //--------------------------------------------------------- 191 | // 全角-半角 マッピング (カタカナ) 192 | // 193 | 194 | private static final ConversionMap kanaMap; 195 | 196 | static { 197 | 198 | String[] asciiData = { 199 | 200 | "\u0020", "\u3000", 201 | "!", "!", 202 | 203 | // 2重引用符 204 | //"\"", """, 205 | "\"", "”", // 一対多の変換の逆変換は先優先 206 | "\"", "“", 207 | 208 | "#", "#", 209 | "$", "$", 210 | "%", "%", 211 | "&", "&", 212 | "\'", "’", 213 | "(", "(", 214 | ")", ")", 215 | "*", "*", 216 | "+", "+", 217 | ",", ",", 218 | "-", "-", 219 | ".", ".", 220 | "/", "/", 221 | "0", "0", 222 | "1", "1", 223 | "2", "2", 224 | "3", "3", 225 | "4", "4", 226 | "5", "5", 227 | "6", "6", 228 | "7", "7", 229 | "8", "8", 230 | "9", "9", 231 | ":", ":", 232 | ";", ";", 233 | "<", "<", 234 | "=", "=", 235 | ">", ">", 236 | "?", "?", 237 | "@", "@", 238 | "A", "A", 239 | "B", "B", 240 | "C", "C", 241 | "D", "D", 242 | "E", "E", 243 | "F", "F", 244 | "G", "G", 245 | "H", "H", 246 | "I", "I", 247 | "J", "J", 248 | "K", "K", 249 | "L", "L", 250 | "M", "M", 251 | "N", "N", 252 | "O", "O", 253 | "P", "P", 254 | "Q", "Q", 255 | "R", "R", 256 | "S", "S", 257 | "T", "T", 258 | "U", "U", 259 | "V", "V", 260 | "W", "W", 261 | "X", "X", 262 | "Y", "Y", 263 | "Z", "Z", 264 | "[", "[", 265 | 266 | // 円記号 267 | //"\\", "\", 268 | "\\", "¥", 269 | 270 | "]", "]", 271 | "^", "^", 272 | "_", "_", 273 | "`", "‘", 274 | "a", "a", 275 | "b", "b", 276 | "c", "c", 277 | "d", "d", 278 | "e", "e", 279 | "f", "f", 280 | "g", "g", 281 | "h", "h", 282 | "i", "i", 283 | "j", "j", 284 | "k", "k", 285 | "l", "l", 286 | "m", "m", 287 | "n", "n", 288 | "o", "o", 289 | "p", "p", 290 | "q", "q", 291 | "r", "r", 292 | "s", "s", 293 | "t", "t", 294 | "u", "u", 295 | "v", "v", 296 | "w", "w", 297 | "x", "x", 298 | "y", "y", 299 | "z", "z", 300 | "{", "{", 301 | "|", "|", 302 | "}", "}", 303 | "~", "~" 304 | }; 305 | 306 | String[] kanaData = { 307 | "。", "。", 308 | "「", "「", 309 | "」", "」", 310 | "、", "、", 311 | "・", "・", 312 | "ヲ", "ヲ", 313 | 314 | "ァ", "ァ", 315 | "ィ", "ィ", 316 | "ゥ", "ゥ", 317 | "ェ", "ェ", 318 | "ォ", "ォ", 319 | 320 | "ャ", "ャ", 321 | "ュ", "ュ", 322 | "ョ", "ョ", 323 | 324 | "ッ", "ッ", 325 | 326 | "ー", "ー", 327 | 328 | "ア", "ア", 329 | "イ", "イ", 330 | "ウ", "ウ", 331 | "エ", "エ", 332 | "オ", "オ", 333 | 334 | "カ", "カ", 335 | "キ", "キ", 336 | "ク", "ク", 337 | "ケ", "ケ", 338 | "コ", "コ", 339 | 340 | "ガ", "ガ", 341 | "ギ", "ギ", 342 | "グ", "グ", 343 | "ゲ", "ゲ", 344 | "ゴ", "ゴ", 345 | 346 | "サ", "サ", 347 | "シ", "シ", 348 | "ス", "ス", 349 | "セ", "セ", 350 | "ソ", "ソ", 351 | 352 | "ザ", "ザ", 353 | "ジ", "ジ", 354 | "ズ", "ズ", 355 | "ゼ", "ゼ", 356 | "ゾ", "ゾ", 357 | 358 | "タ", "タ", 359 | "チ", "チ", 360 | "ツ", "ツ", 361 | "テ", "テ", 362 | "ト", "ト", 363 | 364 | "ダ", "ダ", 365 | "ヂ", "ヂ", 366 | "ヅ", "ヅ", 367 | "デ", "デ", 368 | "ド", "ド", 369 | 370 | "ナ", "ナ", 371 | "ニ", "ニ", 372 | "ヌ", "ヌ", 373 | "ネ", "ネ", 374 | "ノ", "ノ", 375 | 376 | "ハ", "ハ", 377 | "ヒ", "ヒ", 378 | "フ", "フ", 379 | "ヘ", "ヘ", 380 | "ホ", "ホ", 381 | 382 | "バ", "バ", 383 | "ビ", "ビ", 384 | "ブ", "ブ", 385 | "ベ", "ベ", 386 | "ボ", "ボ", 387 | 388 | "パ", "パ", 389 | "ピ", "ピ", 390 | "プ", "プ", 391 | "ペ", "ペ", 392 | "ポ", "ポ", 393 | 394 | "マ", "マ", 395 | "ミ", "ミ", 396 | "ム", "ム", 397 | "メ", "メ", 398 | "モ", "モ", 399 | 400 | "ヤ", "ヤ", 401 | "ユ", "ユ", 402 | "ヨ", "ヨ", 403 | 404 | "ラ", "ラ", 405 | "リ", "リ", 406 | "ル", "ル", 407 | "レ", "レ", 408 | "ロ", "ロ", 409 | 410 | "ワ", "ワ", 411 | "ン", "ン", 412 | 413 | "ヴ", "ヴ", 414 | 415 | "゛", "゙", 416 | "゜", "゚", 417 | 418 | "ヰ", "イ", 419 | "ヱ", "エ", 420 | "ヮ", "ワ", 421 | "ヵ", "カ", 422 | "ヶ", "ケ" 423 | }; 424 | 425 | asciiMap = new ConversionMap(asciiData); 426 | kanaMap = new ConversionMap(kanaData); 427 | } 428 | 429 | /** 430 | * 全角英数記号を半角に変換します。 431 | */ 432 | public static String toHanAscii(String s) { 433 | return asciiMap.convert(s, true); 434 | } 435 | 436 | /** 437 | * 半角英数記号を全角に変換します。 438 | */ 439 | public static String toZenAscii(String s) { 440 | return asciiMap.convert(s, false); 441 | } 442 | 443 | /** 444 | * 全角カタカナを半角に変換します。 445 | */ 446 | public static String toHanKana(String s) { 447 | return kanaMap.convert(s, false); 448 | } 449 | 450 | /** 451 | * 半角カタカナを全角に変換します。 452 | */ 453 | public static String toZenKana(String s) { 454 | return kanaMap.convert(s, true); 455 | } 456 | 457 | /** 458 | * 全角英数記号、カタカナを半角に変換します。 459 | * (toHanAscii, toHanKana の組み合わせ) 460 | */ 461 | public static String toHan(String s) { 462 | return toHanAscii(toHanKana(s) ); 463 | } 464 | 465 | /** 466 | * 半角英数記号、カタカナを全角に変換します。 467 | * (toZenAscii, toZenKana の組み合わせ) 468 | */ 469 | public static String toZen(String s) { 470 | return toZenAscii(toZenKana(s) ); 471 | } 472 | 473 | /** 474 | * 全角英数記号を半角に、半角カタカナを全角に変換します。 475 | * (toHanAscii, toZenKana の組み合わせ) 476 | */ 477 | public static String normalize(String s) { 478 | return toHanAscii(toZenKana(s) ); 479 | } 480 | 481 | protected static class ConversionMap { 482 | 483 | private Map map1 = new HashMap(); 484 | private Map map2 = new HashMap(); 485 | 486 | public ConversionMap(String[] data) { 487 | if (data.length % 2 != 0) { 488 | throw new IllegalArgumentException("bad data length:" + data.length); 489 | } 490 | int len = data.length / 2; 491 | for (int i = 0; i < len; i += 1) { 492 | add(data[i * 2], data[i * 2 + 1]); 493 | } 494 | } 495 | 496 | protected void add(String s1, String s2) { 497 | if (!map1.containsKey(s1) ) { 498 | map1.put(s1, s2); 499 | } 500 | if (!map2.containsKey(s2) ) { 501 | map2.put(s2, s1); 502 | } 503 | } 504 | 505 | public String convert(String s, boolean reverse) { 506 | 507 | Map map = !reverse? map1 : map2; 508 | 509 | StringBuilder converted = new StringBuilder(); 510 | 511 | for (int i = 0; i < s.length(); i += 1) { 512 | 513 | if (i + 1 < s.length() ) { 514 | String c = map.get(s.substring(i, i + 2) ); 515 | if (c != null) { 516 | converted.append(c); 517 | i += 1; 518 | continue; 519 | } 520 | } 521 | 522 | String c = map.get(s.substring(i, i + 1) ); 523 | if (c != null) { 524 | converted.append(c); 525 | continue; 526 | } 527 | 528 | // 変換テーブルに該当無し 529 | converted.append(s.substring(i, i + 1) ); 530 | } 531 | 532 | return converted.toString(); 533 | } 534 | } 535 | } 536 | -------------------------------------------------------------------------------- /src/main/ts/jaconv.ts: -------------------------------------------------------------------------------- 1 | //--------------------------------------------------------------------- 2 | // 日本語文字変換ライブラリ (javascript) 3 | // 4 | // Copyright (c) 2025 Kazuhiko Arase 5 | // 6 | // URL: https://github.com/kazuhikoarase/jaconv 7 | // 8 | // Licensed under the MIT license: 9 | // http://www.opensource.org/licenses/mit-license.php 10 | // 11 | //--------------------------------------------------------------------- 12 | 13 | 14 | import * as hebon from './jaconv/hebon'; 15 | import * as katahira from './jaconv/katahira'; 16 | import * as zenhan from './jaconv/zenhan'; 17 | 18 | export default { 19 | 20 | toHebon: hebon.toHebon, 21 | 22 | toHiragana: katahira.toHiragana, 23 | toKatakana: katahira.toKatakana, 24 | 25 | normalize: zenhan.normalize, 26 | toHan: zenhan.toHan, 27 | toHanAscii: zenhan.toHanAscii, 28 | toHanKana: zenhan.toHanKana, 29 | toZen: zenhan.toZen, 30 | toZenAscii: zenhan.toZenAscii, 31 | toZenKana: zenhan.toZenKana, 32 | }; 33 | -------------------------------------------------------------------------------- /src/main/ts/jaconv/hebon.ts: -------------------------------------------------------------------------------- 1 | //--------------------------------------------------------------------- 2 | // ヘボン式ローマ字変換 3 | // 4 | // Copyright (c) 2011 Kazuhiko Arase 5 | // 6 | // URL: https://github.com/kazuhikoarase/jaconv 7 | // 8 | // Licensed under the MIT license: 9 | // http://www.opensource.org/licenses/mit-license.php 10 | // 11 | //--------------------------------------------------------------------- 12 | 13 | // 'ん' は、別途ハンドリングするのでデータに含めない 14 | const hebonMap : { [ hiragana : string ] : string } = { 15 | 'あ':'A','い':'I','う':'U','え':'E','お':'O', 16 | 'か':'KA','き':'KI','く':'KU','け':'KE','こ':'KO', 17 | 'さ':'SA','し':'SHI','す':'SU','せ':'SE','そ':'SO', 18 | 'た':'TA','ち':'CHI','つ':'TSU','て':'TE','と':'TO', 19 | 'な':'NA','に':'NI','ぬ':'NU','ね':'NE','の':'NO', 20 | 'は':'HA','ひ':'HI','ふ':'FU','へ':'HE','ほ':'HO', 21 | 'ま':'MA','み':'MI','む':'MU','め':'ME','も':'MO', 22 | 'や':'YA','ゆ':'YU','よ':'YO', 23 | 'ら':'RA','り':'RI','る':'RU','れ':'RE','ろ':'RO', 24 | 'わ':'WA','ゐ':'I','ゑ':'E','を':'O', 25 | 'ぁ':'A','ぃ':'I','ぅ':'U','ぇ':'E','ぉ':'O', 26 | 'が':'GA','ぎ':'GI','ぐ':'GU','げ':'GE','ご':'GO', 27 | 'ざ':'ZA','じ':'JI','ず':'ZU','ぜ':'ZE','ぞ':'ZO', 28 | 'だ':'DA','ぢ':'JI','づ':'ZU','で':'DE','ど':'DO', 29 | 'ば':'BA','び':'BI','ぶ':'BU','べ':'BE','ぼ':'BO', 30 | 'ぱ':'PA','ぴ':'PI','ぷ':'PU','ぺ':'PE','ぽ':'PO', 31 | 'きゃ':'KYA','きゅ':'KYU','きょ':'KYO', 32 | 'しゃ':'SHA','しゅ':'SHU','しょ':'SHO', 33 | 'ちゃ':'CHA','ちゅ':'CHU','ちょ':'CHO','ちぇ':'CHE', 34 | 'にゃ':'NYA','にゅ':'NYU','にょ':'NYO', 35 | 'ひゃ':'HYA','ひゅ':'HYU','ひょ':'HYO', 36 | 'みゃ':'MYA','みゅ':'MYU','みょ':'MYO', 37 | 'りゃ':'RYA','りゅ':'RYU','りょ':'RYO', 38 | 'ぎゃ':'GYA','ぎゅ':'GYU','ぎょ':'GYO', 39 | 'じゃ':'JA','じゅ':'JU','じょ':'JO', 40 | 'びゃ':'BYA','びゅ':'BYU','びょ':'BYO', 41 | 'ぴゃ':'PYA','ぴゅ':'PYU','ぴょ':'PYO' 42 | }; 43 | 44 | const aaSet : { [ aa : string ] : boolean } = { 45 | 'AA': true, 'EE': true, 'II': false, // I は連続しても省略しない 46 | 'OO': true, 'OU': true, 'UU': true 47 | }; 48 | 49 | const getHebon = function(s : string, index : number) { 50 | let h : any = null; 51 | let c : any = null; 52 | if (index + 1 < s.length) { 53 | c = s.substring(index, index + 2); 54 | h = hebonMap[c]; 55 | } 56 | if (!h && index < s.length) { 57 | c = s.substring(index, index + 1); 58 | h = hebonMap[c]; 59 | } 60 | return {c: c, h: h || null}; 61 | }; 62 | 63 | /** 64 | * 全角ひらがなをヘボン式ローマ字で半角英文字に変換します。 65 | */ 66 | export function toHebon(s : string) { 67 | 68 | let hebon = ''; 69 | let lastHebon = ''; 70 | let lastChar :any = ''; 71 | let i = 0; 72 | 73 | while (i < s.length) { 74 | 75 | const hr = getHebon(s, i); 76 | 77 | if (hr.c == 'っ') { 78 | 79 | // 'っち' 80 | const nextHr = getHebon(s, i + 1); 81 | if (nextHr.h != null) { 82 | if (nextHr.h.indexOf('CH') == 0) { 83 | hr.h = 'T'; 84 | } else { 85 | hr.h = nextHr.h.substring(0, 1); 86 | } 87 | } 88 | 89 | } else if (hr.c == 'ん') { 90 | 91 | // B,M,P の前の 'ん' は 'M' とする。 92 | const nextHr = getHebon(s, i + 1); 93 | if (nextHr.h != null && 'BMP'.indexOf(nextHr.h.charAt(0) ) != -1) { 94 | hr.h = 'M'; 95 | } else { 96 | hr.h = 'N'; 97 | } 98 | 99 | } else if (hr.c == 'ー') { 100 | 101 | // 長音は無視 102 | hr.h = ''; 103 | } 104 | 105 | if (hr.h != null) { 106 | 107 | // 変換できる文字の場合 108 | if (lastHebon != null) { 109 | 110 | // 連続する母音の除去 111 | let htest = lastHebon + hr.h; 112 | if (htest.length > 2) { 113 | htest = htest.substring(htest.length - 2); 114 | } 115 | if (aaSet[htest]) { 116 | hr.h = ''; 117 | } 118 | } 119 | 120 | hebon += hr.h; 121 | 122 | } else { 123 | 124 | // 変換できない文字の場合 125 | hebon += hr.c; 126 | } 127 | 128 | lastHebon = hr.h; 129 | lastChar = hr.c; 130 | i += hr.c.length; 131 | } 132 | 133 | return hebon; 134 | } 135 | -------------------------------------------------------------------------------- /src/main/ts/jaconv/katahira.ts: -------------------------------------------------------------------------------- 1 | //--------------------------------------------------------------------- 2 | // カタカナ・ひらがな変換 3 | // 4 | // 2025/6/23 Kazuhiko Arase 5 | // 6 | 7 | const minHira = 'ぁ'.charCodeAt(0); 8 | const maxHira = 'ゖ'.charCodeAt(0); 9 | const minKata= 'ァ'.charCodeAt(0); 10 | const maxKata = 'ヶ'.charCodeAt(0); 11 | 12 | /** 13 | * 全角ひらがなを全角カタカナに変換します。 14 | */ 15 | export function toKatakana(s : string) { 16 | let res = ''; 17 | for (let i = 0; i < s.length; i += 1) { 18 | const cd = s.charCodeAt(i); 19 | res += (minHira <= cd && cd <= maxHira)? 20 | String.fromCharCode(cd - minHira + minKata) : s.charAt(i); 21 | } 22 | return res; 23 | } 24 | 25 | /** 26 | * 全角カタカナを全角ひらがなに変換します。 27 | */ 28 | export function toHiragana(s : string) { 29 | let res = ''; 30 | for (let i = 0; i < s.length; i += 1) { 31 | const cd = s.charCodeAt(i); 32 | res += (minKata <= cd && cd <= maxKata)? 33 | String.fromCharCode(cd - minKata + minHira) : s.charAt(i); 34 | } 35 | return res; 36 | } 37 | -------------------------------------------------------------------------------- /src/main/ts/jaconv/zenhan.ts: -------------------------------------------------------------------------------- 1 | //--------------------------------------------------------------------- 2 | // 全角・半角変換 3 | // 4 | // 2005/2/26 Kazuhiko Arase 5 | // 6 | 7 | const asciiData = [ 8 | 9 | '\u0020', '\u3000', 10 | '!', '!', 11 | 12 | // 2重引用符 13 | //'\"', '"', 14 | '\"', '”', // 一対多の変換の逆変換は先優先 15 | '\"', '“', 16 | 17 | '#', '#', 18 | '$', '$', 19 | '%', '%', 20 | '&', '&', 21 | '\'', '’', 22 | '(', '(', 23 | ')', ')', 24 | '*', '*', 25 | '+', '+', 26 | ',', ',', 27 | '-', '-', 28 | '.', '.', 29 | '/', '/', 30 | '0', '0', 31 | '1', '1', 32 | '2', '2', 33 | '3', '3', 34 | '4', '4', 35 | '5', '5', 36 | '6', '6', 37 | '7', '7', 38 | '8', '8', 39 | '9', '9', 40 | ':', ':', 41 | ';', ';', 42 | '<', '<', 43 | '=', '=', 44 | '>', '>', 45 | '?', '?', 46 | '@', '@', 47 | 'A', 'A', 48 | 'B', 'B', 49 | 'C', 'C', 50 | 'D', 'D', 51 | 'E', 'E', 52 | 'F', 'F', 53 | 'G', 'G', 54 | 'H', 'H', 55 | 'I', 'I', 56 | 'J', 'J', 57 | 'K', 'K', 58 | 'L', 'L', 59 | 'M', 'M', 60 | 'N', 'N', 61 | 'O', 'O', 62 | 'P', 'P', 63 | 'Q', 'Q', 64 | 'R', 'R', 65 | 'S', 'S', 66 | 'T', 'T', 67 | 'U', 'U', 68 | 'V', 'V', 69 | 'W', 'W', 70 | 'X', 'X', 71 | 'Y', 'Y', 72 | 'Z', 'Z', 73 | '[', '[', 74 | 75 | // 円記号 76 | //'\\', '\', 77 | '\\', '¥', 78 | 79 | ']', ']', 80 | '^', '^', 81 | '_', '_', 82 | '`', '‘', 83 | 'a', 'a', 84 | 'b', 'b', 85 | 'c', 'c', 86 | 'd', 'd', 87 | 'e', 'e', 88 | 'f', 'f', 89 | 'g', 'g', 90 | 'h', 'h', 91 | 'i', 'i', 92 | 'j', 'j', 93 | 'k', 'k', 94 | 'l', 'l', 95 | 'm', 'm', 96 | 'n', 'n', 97 | 'o', 'o', 98 | 'p', 'p', 99 | 'q', 'q', 100 | 'r', 'r', 101 | 's', 's', 102 | 't', 't', 103 | 'u', 'u', 104 | 'v', 'v', 105 | 'w', 'w', 106 | 'x', 'x', 107 | 'y', 'y', 108 | 'z', 'z', 109 | '{', '{', 110 | '|', '|', 111 | '}', '}', 112 | '~', '~' 113 | ]; 114 | 115 | const kanaData = [ 116 | '。', '。', 117 | '「', '「', 118 | '」', '」', 119 | '、', '、', 120 | '・', '・', 121 | 'ヲ', 'ヲ', 122 | 123 | 'ァ', 'ァ', 124 | 'ィ', 'ィ', 125 | 'ゥ', 'ゥ', 126 | 'ェ', 'ェ', 127 | 'ォ', 'ォ', 128 | 129 | 'ャ', 'ャ', 130 | 'ュ', 'ュ', 131 | 'ョ', 'ョ', 132 | 133 | 'ッ', 'ッ', 134 | 135 | 'ー', 'ー', 136 | 137 | 'ア', 'ア', 138 | 'イ', 'イ', 139 | 'ウ', 'ウ', 140 | 'エ', 'エ', 141 | 'オ', 'オ', 142 | 143 | 'カ', 'カ', 144 | 'キ', 'キ', 145 | 'ク', 'ク', 146 | 'ケ', 'ケ', 147 | 'コ', 'コ', 148 | 149 | 'ガ', 'ガ', 150 | 'ギ', 'ギ', 151 | 'グ', 'グ', 152 | 'ゲ', 'ゲ', 153 | 'ゴ', 'ゴ', 154 | 155 | 'サ', 'サ', 156 | 'シ', 'シ', 157 | 'ス', 'ス', 158 | 'セ', 'セ', 159 | 'ソ', 'ソ', 160 | 161 | 'ザ', 'ザ', 162 | 'ジ', 'ジ', 163 | 'ズ', 'ズ', 164 | 'ゼ', 'ゼ', 165 | 'ゾ', 'ゾ', 166 | 167 | 'タ', 'タ', 168 | 'チ', 'チ', 169 | 'ツ', 'ツ', 170 | 'テ', 'テ', 171 | 'ト', 'ト', 172 | 173 | 'ダ', 'ダ', 174 | 'ヂ', 'ヂ', 175 | 'ヅ', 'ヅ', 176 | 'デ', 'デ', 177 | 'ド', 'ド', 178 | 179 | 'ナ', 'ナ', 180 | 'ニ', 'ニ', 181 | 'ヌ', 'ヌ', 182 | 'ネ', 'ネ', 183 | 'ノ', 'ノ', 184 | 185 | 'ハ', 'ハ', 186 | 'ヒ', 'ヒ', 187 | 'フ', 'フ', 188 | 'ヘ', 'ヘ', 189 | 'ホ', 'ホ', 190 | 191 | 'バ', 'バ', 192 | 'ビ', 'ビ', 193 | 'ブ', 'ブ', 194 | 'ベ', 'ベ', 195 | 'ボ', 'ボ', 196 | 197 | 'パ', 'パ', 198 | 'ピ', 'ピ', 199 | 'プ', 'プ', 200 | 'ペ', 'ペ', 201 | 'ポ', 'ポ', 202 | 203 | 'マ', 'マ', 204 | 'ミ', 'ミ', 205 | 'ム', 'ム', 206 | 'メ', 'メ', 207 | 'モ', 'モ', 208 | 209 | 'ヤ', 'ヤ', 210 | 'ユ', 'ユ', 211 | 'ヨ', 'ヨ', 212 | 213 | 'ラ', 'ラ', 214 | 'リ', 'リ', 215 | 'ル', 'ル', 216 | 'レ', 'レ', 217 | 'ロ', 'ロ', 218 | 219 | 'ワ', 'ワ', 220 | 'ン', 'ン', 221 | 222 | 'ヴ', 'ヴ', 223 | 224 | '゛', '゙', 225 | '゜', '゚', 226 | 227 | 'ヰ', 'イ', 228 | 'ヱ', 'エ', 229 | 'ヮ', 'ワ', 230 | 'ヵ', 'カ', 231 | 'ヶ', 'ケ' 232 | ]; 233 | 234 | declare type StringMap = { [k : string] : string }; 235 | 236 | const createConversionMap = function(data : string[]) { 237 | 238 | const map1 : StringMap = {}; 239 | const map2 : StringMap = {}; 240 | 241 | const add = function(s1 : string, s2 : string) { 242 | if (!map1[s1]) { 243 | map1[s1] = s2; 244 | } 245 | if (!map2[s2]) { 246 | map2[s2] = s1; 247 | } 248 | }; 249 | 250 | const convert = function(s : string, reverse : boolean) { 251 | 252 | const map = !reverse? map1 : map2; 253 | 254 | let converted = ''; 255 | 256 | for (let i = 0; i < s.length; i += 1) { 257 | 258 | if (i + 1 < s.length) { 259 | const c = map[s.substring(i, i + 2)]; 260 | if (c) { 261 | converted += c; 262 | i += 1; 263 | continue; 264 | } 265 | } 266 | 267 | const c = map[s.substring(i, i + 1)]; 268 | if (c) { 269 | converted += c; 270 | continue; 271 | } 272 | 273 | // 変換テーブルに該当無し 274 | converted += s.substring(i, i + 1); 275 | } 276 | 277 | return converted; 278 | } 279 | 280 | if (data.length % 2 != 0) { 281 | throw 'bad data length:' + data.length; 282 | } 283 | const len = data.length / 2; 284 | for (let i = 0; i < len; i += 1) { 285 | add(data[i * 2], data[i * 2 + 1]); 286 | } 287 | 288 | return { convert : convert }; 289 | }; 290 | 291 | //--------------------------------------------------------- 292 | // 全角-半角 マッピング (ASCII) 293 | // 294 | 295 | const asciiMap = createConversionMap(asciiData); 296 | 297 | //--------------------------------------------------------- 298 | // 全角-半角 マッピング (カタカナ) 299 | // 300 | 301 | const kanaMap = createConversionMap(kanaData); 302 | 303 | // exports 304 | 305 | /** 306 | * 全角英数記号を半角に変換します。 307 | */ 308 | export function toHanAscii(s : string) { 309 | return asciiMap.convert(s, true); 310 | } 311 | 312 | /** 313 | * 半角英数記号を全角に変換します。 314 | */ 315 | export function toZenAscii(s : string) { 316 | return asciiMap.convert(s, false); 317 | } 318 | 319 | /** 320 | * 全角カタカナを半角に変換します。 321 | */ 322 | export function toHanKana(s : string) { 323 | return kanaMap.convert(s, false); 324 | } 325 | 326 | /** 327 | * 半角カタカナを全角に変換します。 328 | */ 329 | export function toZenKana(s : string) { 330 | return kanaMap.convert(s, true); 331 | } 332 | 333 | /** 334 | * 全角英数記号、カタカナを半角に変換します。 335 | * (toHanAscii, toHanKana の組み合わせ) 336 | */ 337 | export function toHan(s : string) { 338 | return toHanAscii(toHanKana(s) ); 339 | } 340 | 341 | /** 342 | * 半角英数記号、カタカナを全角に変換します。 343 | * (toZenAscii, toZenKana の組み合わせ) 344 | */ 345 | export function toZen(s : string) { 346 | return toZenAscii(toZenKana(s) ); 347 | } 348 | 349 | /** 350 | * 全角英数記号を半角に、半角カタカナを全角に変換します。 351 | * (toHanAscii, toZenKana の組み合わせ) 352 | */ 353 | export function normalize(s : string) { 354 | return toHanAscii(toZenKana(s) ); 355 | } 356 | -------------------------------------------------------------------------------- /src/test/java/com/d_project/jaconv/JaConvTest.java: -------------------------------------------------------------------------------- 1 | package com.d_project.jaconv; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class JaConvTest { 7 | 8 | @Test 9 | public void toHebon() { 10 | Assert.assertEquals("HEBONSHIKIROMAJI", JaConv.toHebon("へぼんしきろーまじ") ); 11 | Assert.assertEquals("NIHONGO", JaConv.toHebon("にほんご") ); 12 | Assert.assertEquals("NIHOMBASHI", JaConv.toHebon("にほんばし") ); 13 | Assert.assertEquals("IIDABASHI", JaConv.toHebon("いいだばし") ); 14 | Assert.assertEquals("OITA", JaConv.toHebon("おおいた") ); 15 | Assert.assertEquals("TOKYO", JaConv.toHebon("とうきょう") ); 16 | Assert.assertEquals("ROPPONGI", JaConv.toHebon("ろっぽんぎ") ); 17 | Assert.assertEquals("GUMMA", JaConv.toHebon("ぐんま") ); 18 | Assert.assertEquals("HAMPUKU", JaConv.toHebon("はんぷく") ); 19 | Assert.assertEquals("カタカナ", JaConv.toHebon("カタカナ") ); 20 | Assert.assertEquals("KITCHIN", JaConv.toHebon("きっちん") ); 21 | } 22 | 23 | @Test 24 | public void toKatakana() { 25 | Assert.assertEquals("アアアAA11", JaConv.toKatakana("あアアAA11") ); 26 | } 27 | 28 | @Test 29 | public void toHiragana() { 30 | Assert.assertEquals("ああアAA11", JaConv.toHiragana("あアアAA11") ); 31 | } 32 | 33 | @Test 34 | public void toHanAscii() { 35 | Assert.assertEquals("あアアAA11", JaConv.toHanAscii("あアアAA11") ); 36 | Assert.assertEquals("\"\"", JaConv.toHanAscii("“”") ); 37 | Assert.assertEquals("'", JaConv.toHanAscii("’") ); 38 | Assert.assertEquals("`", JaConv.toHanAscii("‘") ); 39 | Assert.assertEquals("\\", JaConv.toHanAscii("¥") ); 40 | } 41 | 42 | @Test 43 | public void toZenAscii() { 44 | Assert.assertEquals("あアアAA11", JaConv.toZenAscii("あアアAA11") ); 45 | Assert.assertEquals("”", JaConv.toZenAscii("\"") ); 46 | Assert.assertEquals("’", JaConv.toZenAscii("'") ); 47 | Assert.assertEquals("‘", JaConv.toZenAscii("`") ); 48 | Assert.assertEquals("¥", JaConv.toZenAscii("\\") ); 49 | } 50 | 51 | @Test 52 | public void toHanKana() { 53 | Assert.assertEquals("あアアAA11", JaConv.toHanKana("あアアAA11") ); 54 | Assert.assertEquals("ギャ", JaConv.toHanKana("ギャ") ); 55 | Assert.assertEquals("ギャ", JaConv.toHanKana("キ゛ャ") ); 56 | Assert.assertEquals("ピン", JaConv.toHanKana("ヒ゜ン") ); 57 | } 58 | 59 | @Test 60 | public void toZenKana() { 61 | Assert.assertEquals("あアアAA11", JaConv.toZenKana("あアアAA11") ); 62 | Assert.assertEquals("ギャ", JaConv.toZenKana("ギャ") ); 63 | Assert.assertEquals("ピン", JaConv.toZenKana("ピン") ); 64 | } 65 | 66 | @Test 67 | public void toHan() { 68 | Assert.assertEquals("あアアAA11", JaConv.toHan("あアアAA11") ); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/test/ts/jaconv/hebon.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "@open-wc/testing"; 2 | import jaconv from '../../../main/ts/jaconv.ts'; 3 | 4 | describe('hebon', function() { 5 | it('toHebon', function() { 6 | expect(jaconv.toHebon('へぼんしきろーまじ') ).to.equal('HEBONSHIKIROMAJI'); 7 | expect(jaconv.toHebon('にほんご') ).to.equal('NIHONGO'); 8 | expect(jaconv.toHebon('にほんばし') ).to.equal('NIHOMBASHI'); 9 | expect(jaconv.toHebon('いいだばし') ).to.equal('IIDABASHI'); 10 | expect(jaconv.toHebon('おおいた') ).to.equal('OITA'); 11 | expect(jaconv.toHebon('とうきょう') ).to.equal('TOKYO'); 12 | expect(jaconv.toHebon('ろっぽんぎ') ).to.equal('ROPPONGI'); 13 | expect(jaconv.toHebon('ぐんま') ).to.equal('GUMMA'); 14 | expect(jaconv.toHebon('はんぷく') ).to.equal('HAMPUKU'); 15 | expect(jaconv.toHebon('カタカナ') ).to.equal('カタカナ'); 16 | expect(jaconv.toHebon('きっちん') ).to.equal('KITCHIN'); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /src/test/ts/jaconv/katahira.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "@open-wc/testing"; 2 | import jaconv from '../../../main/ts/jaconv.ts'; 3 | 4 | describe('katahira', function() { 5 | it('toKatakana', function() { 6 | expect(jaconv.toKatakana('あアアAA11') ).to.equal('アアアAA11'); 7 | }); 8 | it('toHiragana', function() { 9 | expect(jaconv.toHiragana('あアアAA11') ).to.equal('ああアAA11'); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /src/test/ts/jaconv/zenhan.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "@open-wc/testing"; 2 | import jaconv from '../../../main/ts/jaconv.ts'; 3 | 4 | describe('zenhan', function() { 5 | it('toHanAscii', function() { 6 | expect(jaconv.toHanAscii('あアアAA11') ).to.equal('あアアAA11'); 7 | expect(jaconv.toHanAscii('“”') ).to.equal('""'); 8 | expect(jaconv.toHanAscii('’') ).to.equal("'"); 9 | expect(jaconv.toHanAscii('‘') ).to.equal('`'); 10 | expect(jaconv.toHanAscii('¥') ).to.equal('\\'); 11 | }); 12 | it('toZenAscii', function() { 13 | expect(jaconv.toZenAscii('あアアAA11') ).to.equal('あアアAA11'); 14 | expect(jaconv.toZenAscii('"') ).to.equal('”'); 15 | expect(jaconv.toZenAscii("'") ).to.equal("’"); 16 | expect(jaconv.toZenAscii('`') ).to.equal("‘"); 17 | expect(jaconv.toZenAscii('\\') ).to.equal("¥"); 18 | }); 19 | it('toHanKana', function() { 20 | expect(jaconv.toHanKana('あアアAA11') ).to.equal('あアアAA11'); 21 | expect(jaconv.toHanKana('ギャ') ).to.equal('ギャ'); 22 | expect(jaconv.toHanKana('キ゛ャ') ).to.equal('ギャ'); 23 | expect(jaconv.toHanKana('ヒ゜ン') ).to.equal('ピン'); 24 | }); 25 | it('toZenKana', function() { 26 | expect(jaconv.toZenKana('あアアAA11') ).to.equal('あアアAA11'); 27 | expect(jaconv.toZenKana('ギャ') ).to.equal('ギャ'); 28 | expect(jaconv.toZenKana('ピン') ).to.equal('ピン'); 29 | }); 30 | it('toHan', function() { 31 | expect(jaconv.toHan('あアアAA11') ).to.equal('あアアAA11'); 32 | }); 33 | it('toZen', function() { 34 | expect(jaconv.toZen('あアアAA11') ).to.equal('あアアAA11'); 35 | }); 36 | it('normalize', function() { 37 | expect(jaconv.normalize('あアアAA11') ).to.equal('あアアAA11'); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | 9 | /* Declaration and Map files */ 10 | "declaration": true, 11 | "declarationMap": true, 12 | 13 | /* Bundler mode */ 14 | "moduleResolution": "bundler", 15 | "allowImportingTsExtensions": true, 16 | "verbatimModuleSyntax": true, 17 | "moduleDetection": "force", 18 | "noEmit": true, 19 | 20 | /* Linting */ 21 | "strict": true, 22 | "noUnusedLocals": true, 23 | "noUnusedParameters": true, 24 | "erasableSyntaxOnly": true, 25 | "noFallthroughCasesInSwitch": true, 26 | "noUncheckedSideEffectImports": true 27 | }, 28 | "include": [ "src/main/ts" ] 29 | } 30 | -------------------------------------------------------------------------------- /vite.config.mts: -------------------------------------------------------------------------------- 1 | import { dirname, resolve } from 'node:path'; 2 | import { fileURLToPath } from 'node:url'; 3 | import { defineConfig } from 'vite'; 4 | import dts from 'vite-plugin-dts'; 5 | 6 | const __dirname = dirname(fileURLToPath(import.meta.url)) 7 | 8 | export default defineConfig({ 9 | build: { 10 | outDir: 'dist', 11 | sourcemap: true, 12 | lib: { 13 | entry: resolve(__dirname, 'src/main/ts/jaconv.ts'), 14 | name: 'jaconv', 15 | fileName: 'jaconv', 16 | formats: ['cjs', 'es'], 17 | }, 18 | }, 19 | plugins: [ 20 | dts({ 21 | rollupTypes : true, 22 | }) 23 | ] 24 | }); 25 | -------------------------------------------------------------------------------- /web-test-runner.config.mjs: -------------------------------------------------------------------------------- 1 | import { esbuildPlugin } from '@web/dev-server-esbuild'; 2 | 3 | export default { 4 | files: [ '**/*.spec.ts', ], 5 | plugins: [ esbuildPlugin({ ts: true }) ], 6 | nodeResolve: true, 7 | coverage : true, 8 | }; 9 | --------------------------------------------------------------------------------