From 3deed195f61fa5c9416ae599813a52034c7b77d0 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 30 Aug 2022 16:56:13 +0800 Subject: [PATCH] Check if top-level node has text content --- packages/text-to-speech/src/htmlToSsml.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/text-to-speech/src/htmlToSsml.ts b/packages/text-to-speech/src/htmlToSsml.ts index 699f2b235..17cf7a5c8 100644 --- a/packages/text-to-speech/src/htmlToSsml.ts +++ b/packages/text-to-speech/src/htmlToSsml.ts @@ -70,7 +70,7 @@ function parseDomTree(pageNode: Element) { } function emit(textItems: string[], text: string) { - textItems.push(text.trim()) + textItems.push(text) } function cleanTextNode(textNode: ChildNode): string { @@ -167,6 +167,16 @@ const endSsml = (): string => { return `` } +const hasSignificantText = (node: ChildNode): boolean => { + let text = '' + for (const child of Array.from(node.childNodes)) { + if (child.nodeType === 3 /* Node.TEXT_NODE */) { + text += child.textContent + } + } + return text.trim().length > 0 +} + export const ssmlItemText = (item: SSMLItem): string => { return [item.open, ...item.textItems, item.close].join('') } @@ -198,7 +208,7 @@ export const htmlToSsml = (html: string, options: SSMLOptions): SSMLItem[] => { const textItems: string[] = [] const node = parsedNodes[i - 2] - if (TOP_LEVEL_TAGS.includes(node.nodeName)) { + if (TOP_LEVEL_TAGS.includes(node.nodeName) || hasSignificantText(node)) { i = emitElement(textItems, node, true) items.push({ open: startSsml(node, options),