UNPKG

react-furigana

Version:

A simple React component for handling Japanese text with furigana.

3 lines (2 loc) 2.08 kB
(function(n,s){typeof exports=="object"&&typeof module<"u"?module.exports=s(require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["react/jsx-runtime","react"],s):(n=typeof globalThis<"u"?globalThis:n||self,n["react-furigana"]=s(n.jsxRuntime,n.React))})(this,function(n,s){"use strict";function c(e){return n.jsxs("ruby",{children:[e.kanji,n.jsx("rt",{children:e.furigana})]})}function h(e){return e.token.furigana?n.jsx(c,{kanji:e.token.kanji,furigana:e.token.furigana}):e.token.kanji}class a{static hiraganaRanges=[[12352,12447]];static punctuationsMarksRanges=[[12288,12292],[12294,12351],[65280,65295],[65306,65381],[65440,65519]];text;separator;leftBracket;rightBracket;tokens=[];currentKanji="";currentFurigana;constructor(t,i=" ",r="[",u="]"){this.text=t,this.separator=i,this.leftBracket=r,this.rightBracket=u}parse(){if(this.tokens.length>0)return this.tokens;for(const t of this.text)this.currentFurigana===void 0?this.parseKanji(t):this.parseFurigana(t);return this.addToken(),this.tokens}parseKanji(t){t===this.leftBracket?this.currentFurigana="":t===this.separator?this.addToken():(this.currentKanji+=t,a.allowsFurigana(t)||this.addToken())}parseFurigana(t){t===this.rightBracket?this.addToken():this.currentFurigana+=t}static allowsFurigana(t){const i=t.charCodeAt(0);return!a.isHiragana(i)&&!a.isPunctuationMark(i)}static isHiragana(t){return a.isInRange(t,a.hiraganaRanges)}static isPunctuationMark(t){return a.isInRange(t,a.punctuationsMarksRanges)}static isInRange(t,i){return i.some(r=>t>=r[0]&&t<=r[1])}addToken(){this.currentKanji&&(this.tokens.push({kanji:this.currentKanji,furigana:this.currentFurigana}),this.currentKanji="",this.currentFurigana=void 0)}}function f(e){const t=s.useMemo(()=>new a(e.text,e.separator,e.leftBracket,e.rightBracket).parse(),[e.text,e.separator,e.leftBracket,e.rightBracket]),i=s.useCallback(r=>e.render?e.render(r):n.jsx(h,{token:r}),[e.render]);return n.jsx(n.Fragment,{children:t.map((r,u)=>n.jsx(s.Fragment,{children:i(r)},u))})}return f}); //# sourceMappingURL=react-furigana.umd.cjs.map