diff --git a/src/classes/SignatureClient.ts b/src/classes/SignatureClient.ts index c7c4485..ad0de4d 100644 --- a/src/classes/SignatureClient.ts +++ b/src/classes/SignatureClient.ts @@ -35,7 +35,12 @@ export class SignatureClient { } get regex() { - const escaped = [...this.nameSet].map(k => k.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); + const names = [...this.nameSet]; + // 빈 목록이면 new RegExp("()", "g")가 모든 위치에서 매칭돼 + // text.split() 결과가 글자 단위로 쪼개진다. 절대 매칭되지 않는 + // 패턴을 돌려줘 split 호출자가 원문을 그대로 받게 한다. + if (names.length === 0) return /$^/g; + const escaped = names.map(k => k.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); return new RegExp(`(${escaped.join("|")})`, "g"); } diff --git a/src/classes/TTSClient.ts b/src/classes/TTSClient.ts index 7e52b42..26fa809 100644 --- a/src/classes/TTSClient.ts +++ b/src/classes/TTSClient.ts @@ -92,7 +92,11 @@ export class TTSClient { private async getSource(text: string): Promise { - const parts = text.split(signature.regex); + // 시그니처 목록이 비어 있으면 split을 건너뛰고 원문을 한 번에 합성한다. + // (SignatureClient.regex가 빈 목록일 때 never-match 패턴을 돌려주지만, + // 소비자 측에서도 명시적으로 가드해 의도를 분명히 한다.) + const names = signature.nameSet; + const parts = names.size === 0 ? [text] : text.split(signature.regex); const bufferList: Buffer[] = []; for (const part of parts) {