@pie-players/pie-assessment-toolkit 0.3.51 → 0.3.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/PieAssessmentToolkit.custom-element.js +219 -24
- package/dist/context/assessment-toolkit-context.d.ts +2 -0
- package/dist/context/assessment-toolkit-context.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/HighlightCoordinator.d.ts +6 -0
- package/dist/services/HighlightCoordinator.js +20 -5
- package/dist/services/HighlightCoordinator.js.map +1 -1
- package/dist/services/TTSService.d.ts +17 -0
- package/dist/services/TTSService.js +238 -21
- package/dist/services/TTSService.js.map +1 -1
- package/dist/services/createDefaultToolRegistry.d.ts +2 -1
- package/dist/services/createDefaultToolRegistry.js +2 -1
- package/dist/services/createDefaultToolRegistry.js.map +1 -1
- package/dist/services/interfaces.d.ts +11 -0
- package/dist/services/interfaces.js.map +1 -1
- package/dist/services/tool-config-defaults.d.ts +11 -0
- package/dist/services/tool-config-defaults.js +18 -0
- package/dist/services/tool-config-defaults.js.map +1 -1
- package/dist/services/tts/highlight-target-resolver.d.ts +17 -0
- package/dist/services/tts/highlight-target-resolver.js +2 -0
- package/dist/services/tts/highlight-target-resolver.js.map +1 -0
- package/package.json +7 -7
|
@@ -21066,27 +21066,27 @@ class HighlightCoordinator {
|
|
|
21066
21066
|
|
|
21067
21067
|
/* Annotation highlights - persistent */
|
|
21068
21068
|
::highlight(annotation-yellow) {
|
|
21069
|
-
background-color:
|
|
21069
|
+
background-color: var(--pie-annotation-yellow-highlight, rgba(253, 233, 149, 0.5));
|
|
21070
21070
|
color: inherit;
|
|
21071
21071
|
}
|
|
21072
21072
|
|
|
21073
21073
|
::highlight(annotation-green) {
|
|
21074
|
-
background-color:
|
|
21074
|
+
background-color: var(--pie-annotation-green-highlight, rgba(166, 225, 197, 0.5));
|
|
21075
21075
|
color: inherit;
|
|
21076
21076
|
}
|
|
21077
21077
|
|
|
21078
21078
|
::highlight(annotation-blue) {
|
|
21079
|
-
background-color:
|
|
21079
|
+
background-color: var(--pie-annotation-blue-highlight, rgba(167, 224, 246, 0.5));
|
|
21080
21080
|
color: inherit;
|
|
21081
21081
|
}
|
|
21082
21082
|
|
|
21083
21083
|
::highlight(annotation-pink) {
|
|
21084
|
-
background-color:
|
|
21084
|
+
background-color: var(--pie-annotation-pink-highlight, rgba(255, 159, 174, 0.5));
|
|
21085
21085
|
color: inherit;
|
|
21086
21086
|
}
|
|
21087
21087
|
|
|
21088
21088
|
::highlight(annotation-orange) {
|
|
21089
|
-
background-color:
|
|
21089
|
+
background-color: var(--pie-annotation-orange-highlight, rgba(255, 165, 0, 0.5));
|
|
21090
21090
|
color: inherit;
|
|
21091
21091
|
}
|
|
21092
21092
|
|
|
@@ -21129,6 +21129,16 @@ class HighlightCoordinator {
|
|
|
21129
21129
|
}
|
|
21130
21130
|
this.highlightTTSElementFallbacks(ranges);
|
|
21131
21131
|
}
|
|
21132
|
+
highlightTTSSentenceElements(elements) {
|
|
21133
|
+
if (!this.ttsSentenceHighlight)
|
|
21134
|
+
return;
|
|
21135
|
+
this.applyAdaptiveTTSStyle(elements[0] || null);
|
|
21136
|
+
this.clearTTSSentence();
|
|
21137
|
+
for (const element2 of elements) {
|
|
21138
|
+
element2.setAttribute("data-pie-tts-sentence-element", "true");
|
|
21139
|
+
this.ttsSentenceElementHighlights.add(element2);
|
|
21140
|
+
}
|
|
21141
|
+
}
|
|
21132
21142
|
static SENTENCE_FALLBACK_SELECTOR = "math, mjx-container, svg, img, canvas, [role='img']";
|
|
21133
21143
|
static WORD_FALLBACK_SELECTOR = "svg, img, canvas, [role='img']";
|
|
21134
21144
|
highlightTTSElementFallbacks(ranges) {
|
|
@@ -23888,6 +23898,7 @@ class TTSService {
|
|
|
23888
23898
|
currentProvider = null;
|
|
23889
23899
|
provider = null;
|
|
23890
23900
|
highlightCoordinator = null;
|
|
23901
|
+
highlightTargetResolverProvider = null;
|
|
23891
23902
|
catalogResolver = null;
|
|
23892
23903
|
state = PlaybackState.IDLE;
|
|
23893
23904
|
ttsConfig = {};
|
|
@@ -23900,6 +23911,7 @@ class TTSService {
|
|
|
23900
23911
|
currentBoundaryOffset = 0;
|
|
23901
23912
|
activeWordBoundaryOffset = 0;
|
|
23902
23913
|
seekSegments = [];
|
|
23914
|
+
playbackChunks = [];
|
|
23903
23915
|
sentenceHighlightSegments = [];
|
|
23904
23916
|
currentSeekSegmentIndex = 0;
|
|
23905
23917
|
activeSentenceStartOffset = null;
|
|
@@ -23978,9 +23990,137 @@ class TTSService {
|
|
|
23978
23990
|
setHighlightCoordinator(coordinator) {
|
|
23979
23991
|
this.highlightCoordinator = coordinator;
|
|
23980
23992
|
}
|
|
23993
|
+
setHighlightTargetResolverProvider(provider) {
|
|
23994
|
+
this.highlightTargetResolverProvider = provider;
|
|
23995
|
+
return () => {
|
|
23996
|
+
if (this.highlightTargetResolverProvider === provider) {
|
|
23997
|
+
this.highlightTargetResolverProvider = null;
|
|
23998
|
+
}
|
|
23999
|
+
};
|
|
24000
|
+
}
|
|
23981
24001
|
setCatalogResolver(resolver) {
|
|
23982
24002
|
this.catalogResolver = resolver;
|
|
23983
24003
|
}
|
|
24004
|
+
getHighlightResolverRuntime() {
|
|
24005
|
+
let provided = null;
|
|
24006
|
+
try {
|
|
24007
|
+
provided = this.highlightTargetResolverProvider?.() ?? null;
|
|
24008
|
+
} catch {
|
|
24009
|
+
provided = null;
|
|
24010
|
+
}
|
|
24011
|
+
const providedContext = provided?.context ?? {};
|
|
24012
|
+
const fallbackScope = typeof HTMLElement !== "undefined" && this.currentContentElement instanceof HTMLElement ? this.currentContentElement : null;
|
|
24013
|
+
return {
|
|
24014
|
+
context: {
|
|
24015
|
+
...providedContext,
|
|
24016
|
+
scopeElement: providedContext.scopeElement ?? fallbackScope
|
|
24017
|
+
},
|
|
24018
|
+
resolver: provided?.resolver ?? null
|
|
24019
|
+
};
|
|
24020
|
+
}
|
|
24021
|
+
getNodeElement(node) {
|
|
24022
|
+
if (!node)
|
|
24023
|
+
return null;
|
|
24024
|
+
return node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
|
|
24025
|
+
}
|
|
24026
|
+
isElementWithinScope(element2, scope) {
|
|
24027
|
+
if (!scope)
|
|
24028
|
+
return true;
|
|
24029
|
+
return element2 === scope || scope.contains(element2);
|
|
24030
|
+
}
|
|
24031
|
+
isRangeWithinScope(range, scope) {
|
|
24032
|
+
const startElement = this.getNodeElement(range.startContainer);
|
|
24033
|
+
const endElement = this.getNodeElement(range.endContainer);
|
|
24034
|
+
if (!startElement || !endElement)
|
|
24035
|
+
return false;
|
|
24036
|
+
return this.isElementWithinScope(startElement, scope) && this.isElementWithinScope(endElement, scope);
|
|
24037
|
+
}
|
|
24038
|
+
resolveWordHighlightRange(nativeRange) {
|
|
24039
|
+
const { context, resolver } = this.getHighlightResolverRuntime();
|
|
24040
|
+
const scope = context.scopeElement ?? this.currentContentElement;
|
|
24041
|
+
try {
|
|
24042
|
+
const resolved = resolver?.resolveWordRange?.(nativeRange, context);
|
|
24043
|
+
if (resolved && this.isRangeWithinScope(resolved, scope)) {
|
|
24044
|
+
return { range: resolved, remapped: !sameRange(nativeRange, resolved) };
|
|
24045
|
+
}
|
|
24046
|
+
} catch {}
|
|
24047
|
+
return { range: nativeRange, remapped: false };
|
|
24048
|
+
}
|
|
24049
|
+
resolveSentenceHighlightTargets(nativeRanges) {
|
|
24050
|
+
const { context, resolver } = this.getHighlightResolverRuntime();
|
|
24051
|
+
const scope = context.scopeElement ?? this.currentContentElement;
|
|
24052
|
+
try {
|
|
24053
|
+
const resolved = resolver?.resolveSentenceRanges?.(nativeRanges, context);
|
|
24054
|
+
if (!resolved)
|
|
24055
|
+
return { ranges: nativeRanges, elements: [] };
|
|
24056
|
+
const ranges = [];
|
|
24057
|
+
const elements = [];
|
|
24058
|
+
for (const target of resolved) {
|
|
24059
|
+
if (typeof Range !== "undefined" && target instanceof Range) {
|
|
24060
|
+
if (!this.isRangeWithinScope(target, scope)) {
|
|
24061
|
+
return { ranges: nativeRanges, elements: [] };
|
|
24062
|
+
}
|
|
24063
|
+
ranges.push(target);
|
|
24064
|
+
continue;
|
|
24065
|
+
}
|
|
24066
|
+
if (typeof Element !== "undefined" && target instanceof Element) {
|
|
24067
|
+
if (!this.isElementWithinScope(target, scope)) {
|
|
24068
|
+
return { ranges: nativeRanges, elements: [] };
|
|
24069
|
+
}
|
|
24070
|
+
elements.push(target);
|
|
24071
|
+
continue;
|
|
24072
|
+
}
|
|
24073
|
+
return { ranges: nativeRanges, elements: [] };
|
|
24074
|
+
}
|
|
24075
|
+
return { ranges, elements };
|
|
24076
|
+
} catch {
|
|
24077
|
+
return { ranges: nativeRanges, elements: [] };
|
|
24078
|
+
}
|
|
24079
|
+
}
|
|
24080
|
+
createTextRange(node, startOffset, endOffset) {
|
|
24081
|
+
if (typeof document === "undefined")
|
|
24082
|
+
return null;
|
|
24083
|
+
if (typeof document.createRange !== "function")
|
|
24084
|
+
return null;
|
|
24085
|
+
try {
|
|
24086
|
+
const range = document.createRange();
|
|
24087
|
+
range.setStart(node, startOffset);
|
|
24088
|
+
range.setEnd(node, endOffset);
|
|
24089
|
+
if (range.startContainer !== node || range.endContainer !== node) {
|
|
24090
|
+
return null;
|
|
24091
|
+
}
|
|
24092
|
+
return range;
|
|
24093
|
+
} catch {
|
|
24094
|
+
return null;
|
|
24095
|
+
}
|
|
24096
|
+
}
|
|
24097
|
+
paintTTSWordRange(range) {
|
|
24098
|
+
if (!this.highlightCoordinator)
|
|
24099
|
+
return;
|
|
24100
|
+
try {
|
|
24101
|
+
if (range.startContainer === range.endContainer && range.startContainer.nodeType === Node.TEXT_NODE) {
|
|
24102
|
+
this.highlightCoordinator.highlightTTSWord(range.startContainer, range.startOffset, range.endOffset);
|
|
24103
|
+
return;
|
|
24104
|
+
}
|
|
24105
|
+
} catch {}
|
|
24106
|
+
this.highlightCoordinator.highlightRange(range, HighlightType.TTS_WORD, HighlightColor.YELLOW);
|
|
24107
|
+
}
|
|
24108
|
+
paintTTSSentenceRanges(nativeRanges) {
|
|
24109
|
+
if (!this.highlightCoordinator)
|
|
24110
|
+
return;
|
|
24111
|
+
const { ranges, elements } = this.resolveSentenceHighlightTargets(nativeRanges);
|
|
24112
|
+
if (elements.length > 0 && ranges.length === 0 && this.highlightCoordinator.highlightTTSSentenceElements) {
|
|
24113
|
+
this.highlightCoordinator.highlightTTSSentenceElements(elements);
|
|
24114
|
+
return;
|
|
24115
|
+
}
|
|
24116
|
+
const paintedRanges = [...ranges];
|
|
24117
|
+
for (const element2 of elements) {
|
|
24118
|
+
const elementRange = document.createRange();
|
|
24119
|
+
elementRange.selectNodeContents(element2);
|
|
24120
|
+
paintedRanges.push(elementRange);
|
|
24121
|
+
}
|
|
24122
|
+
this.highlightCoordinator.highlightTTSSentence(paintedRanges);
|
|
24123
|
+
}
|
|
23984
24124
|
getCapabilities() {
|
|
23985
24125
|
return this.currentProvider?.getCapabilities() || null;
|
|
23986
24126
|
}
|
|
@@ -24270,6 +24410,20 @@ class TTSService {
|
|
|
24270
24410
|
const structuralBoundaries = args.playbackSegments.map((segment) => segment.startOffset).filter((offset) => offset > 0);
|
|
24271
24411
|
return this.splitSegmentsAtBoundaries(grammaticalSegments, structuralBoundaries, args.contentToSpeak);
|
|
24272
24412
|
}
|
|
24413
|
+
createSeekSegmentsFromSpeechChunks(chunks) {
|
|
24414
|
+
let offset = 0;
|
|
24415
|
+
return chunks.map((chunk) => {
|
|
24416
|
+
const speechText = chunk.plainFallback?.speechText || (this.hasExplicitBreakSemantics(chunk.speechText) ? chunk.visibleText : chunk.speechText) || chunk.visibleText;
|
|
24417
|
+
const text2 = normalizeTextForSpeech(speechText) || chunk.visibleText || "";
|
|
24418
|
+
const segment = {
|
|
24419
|
+
text: text2,
|
|
24420
|
+
startOffset: offset,
|
|
24421
|
+
pauseMsAfter: 0
|
|
24422
|
+
};
|
|
24423
|
+
offset += Math.max(1, text2.length + 1);
|
|
24424
|
+
return segment;
|
|
24425
|
+
});
|
|
24426
|
+
}
|
|
24273
24427
|
getCurrentSeekSegmentIndex() {
|
|
24274
24428
|
if (this.seekSegments.length === 0)
|
|
24275
24429
|
return 0;
|
|
@@ -24342,7 +24496,7 @@ class TTSService {
|
|
|
24342
24496
|
const range = document.createRange();
|
|
24343
24497
|
range.setStart(start.node, start.offset);
|
|
24344
24498
|
range.setEnd(end.node, end.offset + 1);
|
|
24345
|
-
this.
|
|
24499
|
+
this.paintTTSSentenceRanges([range]);
|
|
24346
24500
|
this.activeSentenceStartOffset = startOffset;
|
|
24347
24501
|
}
|
|
24348
24502
|
getSegmentIndexForOffset(segments, offset) {
|
|
@@ -24433,7 +24587,8 @@ class TTSService {
|
|
|
24433
24587
|
this.activeWordBoundaryOffset = options?.wordBoundaryOffset || 0;
|
|
24434
24588
|
const hasExplicitBreaks = this.hasExplicitBreakSemantics(contentToSpeak);
|
|
24435
24589
|
const shouldUsePlan = !!this.currentContentElement && !usedCatalogSpoken && !hasExplicitBreaks && speechMatchesVisibleText;
|
|
24436
|
-
this.
|
|
24590
|
+
this.playbackChunks = speechChunks?.length ? speechChunks : [];
|
|
24591
|
+
this.seekSegments = this.playbackChunks.length ? this.createSeekSegmentsFromSpeechChunks(this.playbackChunks) : hasExplicitBreaks || !speechMatchesVisibleText ? [] : shouldUsePlan && this.currentContentElement ? this.createSpeechPlan(this.currentContentElement, normalizedText) : this.createSeekSegmentsFromText(highlightText);
|
|
24437
24592
|
this.sentenceHighlightSegments = hasExplicitBreaks ? [] : this.createSentenceHighlightSegments({
|
|
24438
24593
|
contentToSpeak: highlightText,
|
|
24439
24594
|
shouldUsePlan,
|
|
@@ -24790,6 +24945,7 @@ class TTSService {
|
|
|
24790
24945
|
this.currentContentElement = options?.contentElement || null;
|
|
24791
24946
|
this.lastError = null;
|
|
24792
24947
|
this.currentBoundaryOffset = 0;
|
|
24948
|
+
this.playbackChunks = [];
|
|
24793
24949
|
this.currentSeekSegmentIndex = 0;
|
|
24794
24950
|
this.activeSentenceStartOffset = null;
|
|
24795
24951
|
}
|
|
@@ -24808,7 +24964,7 @@ class TTSService {
|
|
|
24808
24964
|
try {
|
|
24809
24965
|
const range = document.createRange();
|
|
24810
24966
|
range.selectNodeContents(this.currentContentElement);
|
|
24811
|
-
this.
|
|
24967
|
+
this.paintTTSSentenceRanges([range]);
|
|
24812
24968
|
} catch {}
|
|
24813
24969
|
}
|
|
24814
24970
|
}
|
|
@@ -24824,7 +24980,12 @@ class TTSService {
|
|
|
24824
24980
|
if (highlightRange && this.highlightCoordinator) {
|
|
24825
24981
|
const highlightText = highlightRange.node.textContent?.substring(highlightRange.start, highlightRange.end) || "";
|
|
24826
24982
|
this.debugLog(`[TTSService] Highlighting "${highlightText}" (word: "${word}") at position ${globalIndex}`);
|
|
24827
|
-
this.
|
|
24983
|
+
const nativeRange = this.createTextRange(highlightRange.node, highlightRange.start, highlightRange.end);
|
|
24984
|
+
if (nativeRange) {
|
|
24985
|
+
this.paintTTSWordRange(this.resolveWordHighlightRange(nativeRange).range);
|
|
24986
|
+
} else {
|
|
24987
|
+
this.highlightCoordinator.highlightTTSWord(highlightRange.node, highlightRange.start, highlightRange.end);
|
|
24988
|
+
}
|
|
24828
24989
|
} else {
|
|
24829
24990
|
console.warn(`[TTSService] Could not find highlight range for position ${globalIndex}, length ${wordLength}`);
|
|
24830
24991
|
}
|
|
@@ -24843,7 +25004,7 @@ class TTSService {
|
|
|
24843
25004
|
this.lastRenderedRegionTarget = null;
|
|
24844
25005
|
if (chunk.regionRange) {
|
|
24845
25006
|
this.highlightCoordinator.clearHighlights?.(HighlightType.TTS_WORD);
|
|
24846
|
-
this.
|
|
25007
|
+
this.paintTTSSentenceRanges([chunk.regionRange]);
|
|
24847
25008
|
return;
|
|
24848
25009
|
}
|
|
24849
25010
|
if (!element2)
|
|
@@ -24851,23 +25012,19 @@ class TTSService {
|
|
|
24851
25012
|
const range = document.createRange();
|
|
24852
25013
|
range.selectNodeContents(element2);
|
|
24853
25014
|
this.highlightCoordinator.clearHighlights?.(HighlightType.TTS_WORD);
|
|
24854
|
-
this.
|
|
25015
|
+
this.paintTTSSentenceRanges([range]);
|
|
24855
25016
|
} catch {}
|
|
24856
25017
|
}
|
|
24857
25018
|
highlightCatalogActiveRange(range) {
|
|
24858
25019
|
if (!this.highlightCoordinator)
|
|
24859
25020
|
return;
|
|
24860
|
-
|
|
24861
|
-
this.highlightCoordinator.highlightTTSWord(range.startContainer, range.startOffset, range.endOffset);
|
|
24862
|
-
return;
|
|
24863
|
-
}
|
|
24864
|
-
this.highlightCoordinator.highlightRange(range, HighlightType.TTS_WORD, HighlightColor.YELLOW);
|
|
25021
|
+
this.paintTTSWordRange(this.resolveWordHighlightRange(range).range);
|
|
24865
25022
|
}
|
|
24866
25023
|
highlightRenderableRegionTarget(target) {
|
|
24867
25024
|
if (!this.highlightCoordinator || !target || typeof document === "undefined") {
|
|
24868
25025
|
return;
|
|
24869
25026
|
}
|
|
24870
|
-
if (sameRenderableHighlightTarget(this.lastRenderedRegionTarget, target)) {
|
|
25027
|
+
if (!this.highlightTargetResolverProvider && sameRenderableHighlightTarget(this.lastRenderedRegionTarget, target)) {
|
|
24871
25028
|
return;
|
|
24872
25029
|
}
|
|
24873
25030
|
try {
|
|
@@ -24875,14 +25032,14 @@ class TTSService {
|
|
|
24875
25032
|
if (target.type === "element") {
|
|
24876
25033
|
range.selectNodeContents(target.element);
|
|
24877
25034
|
} else if (target.type === "range") {
|
|
24878
|
-
this.
|
|
25035
|
+
this.paintTTSSentenceRanges([target.range]);
|
|
24879
25036
|
this.lastRenderedRegionTarget = target;
|
|
24880
25037
|
return;
|
|
24881
25038
|
} else {
|
|
24882
25039
|
range.setStart(target.node, target.startOffset);
|
|
24883
25040
|
range.setEnd(target.node, target.endOffset);
|
|
24884
25041
|
}
|
|
24885
|
-
this.
|
|
25042
|
+
this.paintTTSSentenceRanges([range]);
|
|
24886
25043
|
this.lastRenderedRegionTarget = target;
|
|
24887
25044
|
} catch {}
|
|
24888
25045
|
}
|
|
@@ -24895,13 +25052,25 @@ class TTSService {
|
|
|
24895
25052
|
return;
|
|
24896
25053
|
}
|
|
24897
25054
|
if (target.type === "text-range") {
|
|
24898
|
-
this.
|
|
25055
|
+
const nativeRange = this.createTextRange(target.node, target.startOffset, target.endOffset);
|
|
25056
|
+
if (nativeRange) {
|
|
25057
|
+
this.paintTTSWordRange(this.resolveWordHighlightRange(nativeRange).range);
|
|
25058
|
+
} else {
|
|
25059
|
+
this.highlightCoordinator.highlightTTSWord(target.node, target.startOffset, target.endOffset);
|
|
25060
|
+
}
|
|
24899
25061
|
return;
|
|
24900
25062
|
}
|
|
24901
25063
|
if (target.type === "range") {
|
|
24902
25064
|
this.highlightCatalogActiveRange(target.range);
|
|
24903
25065
|
return;
|
|
24904
25066
|
}
|
|
25067
|
+
const elementNativeRange = document.createRange();
|
|
25068
|
+
elementNativeRange.selectNodeContents(target.element);
|
|
25069
|
+
const resolvedElementRange = this.resolveWordHighlightRange(elementNativeRange);
|
|
25070
|
+
if (resolvedElementRange.remapped) {
|
|
25071
|
+
this.paintTTSWordRange(resolvedElementRange.range);
|
|
25072
|
+
return;
|
|
25073
|
+
}
|
|
24905
25074
|
const onlyChild = target.element.childNodes.length === 1 ? target.element.firstChild : null;
|
|
24906
25075
|
if (target.quality === "semantic-token" && onlyChild?.nodeType === Node.TEXT_NODE) {
|
|
24907
25076
|
this.highlightCoordinator.highlightTTSWord(onlyChild, 0, onlyChild.textContent?.length || 0);
|
|
@@ -24986,9 +25155,15 @@ class TTSService {
|
|
|
24986
25155
|
}
|
|
24987
25156
|
async executeSpeakPlayback(args) {
|
|
24988
25157
|
if (args.speechChunks?.length && this.provider) {
|
|
24989
|
-
for (
|
|
25158
|
+
for (let index2 = 0;index2 < args.speechChunks.length; index2++) {
|
|
24990
25159
|
if (args.runId !== this.speakRunId)
|
|
24991
25160
|
return;
|
|
25161
|
+
this.currentSeekSegmentIndex = index2;
|
|
25162
|
+
const segment = this.seekSegments[index2];
|
|
25163
|
+
if (segment) {
|
|
25164
|
+
this.currentBoundaryOffset = segment.startOffset;
|
|
25165
|
+
}
|
|
25166
|
+
const chunk = args.speechChunks[index2];
|
|
24992
25167
|
await this.speakCatalogChunk(chunk, args.runId);
|
|
24993
25168
|
}
|
|
24994
25169
|
return;
|
|
@@ -25018,6 +25193,7 @@ class TTSService {
|
|
|
25018
25193
|
this.currentBoundaryOffset = 0;
|
|
25019
25194
|
this.activeWordBoundaryOffset = 0;
|
|
25020
25195
|
this.seekSegments = [];
|
|
25196
|
+
this.playbackChunks = [];
|
|
25021
25197
|
this.sentenceHighlightSegments = [];
|
|
25022
25198
|
this.currentSeekSegmentIndex = 0;
|
|
25023
25199
|
this.activeSentenceStartOffset = null;
|
|
@@ -25080,6 +25256,7 @@ class TTSService {
|
|
|
25080
25256
|
if (!this.provider || this.seekSegments.length === 0)
|
|
25081
25257
|
return;
|
|
25082
25258
|
const safeTargetIndex = Math.max(0, Math.min(this.seekSegments.length - 1, targetIndex));
|
|
25259
|
+
const restartChunks = this.playbackChunks.length ? this.playbackChunks.slice(safeTargetIndex) : null;
|
|
25083
25260
|
this.speakRunId += 1;
|
|
25084
25261
|
this.provider.onWordBoundary = undefined;
|
|
25085
25262
|
this.provider.stop();
|
|
@@ -25092,19 +25269,35 @@ class TTSService {
|
|
|
25092
25269
|
highlightMode: this.activeHighlightMode,
|
|
25093
25270
|
wordBoundaryOffset: this.activeWordBoundaryOffset
|
|
25094
25271
|
});
|
|
25095
|
-
|
|
25096
|
-
|
|
25097
|
-
|
|
25272
|
+
if (restartChunks) {
|
|
25273
|
+
for (let index2 = 0;index2 < restartChunks.length; index2++) {
|
|
25274
|
+
if (runId !== this.speakRunId)
|
|
25275
|
+
return;
|
|
25276
|
+
const absoluteIndex = safeTargetIndex + index2;
|
|
25277
|
+
this.currentSeekSegmentIndex = absoluteIndex;
|
|
25278
|
+
const segment = this.seekSegments[absoluteIndex];
|
|
25279
|
+
if (segment) {
|
|
25280
|
+
this.currentBoundaryOffset = segment.startOffset;
|
|
25281
|
+
}
|
|
25282
|
+
await this.speakCatalogChunk(restartChunks[index2], runId);
|
|
25283
|
+
}
|
|
25284
|
+
} else {
|
|
25285
|
+
await this.speakWithPlan(restartSegments, runId, {
|
|
25286
|
+
highlightMode: this.activeHighlightMode
|
|
25287
|
+
});
|
|
25288
|
+
}
|
|
25098
25289
|
if (runId !== this.speakRunId)
|
|
25099
25290
|
return;
|
|
25100
25291
|
this.setState(PlaybackState.IDLE);
|
|
25101
25292
|
this.clearHighlightsAndTracking();
|
|
25293
|
+
this.highlightTargetResolverProvider = null;
|
|
25102
25294
|
} catch (error) {
|
|
25103
25295
|
if (runId !== this.speakRunId)
|
|
25104
25296
|
return;
|
|
25105
25297
|
this.lastError = error instanceof Error ? error.message : String(error);
|
|
25106
25298
|
this.setState(PlaybackState.ERROR);
|
|
25107
25299
|
this.clearHighlightsAndTracking();
|
|
25300
|
+
this.highlightTargetResolverProvider = null;
|
|
25108
25301
|
throw error;
|
|
25109
25302
|
}
|
|
25110
25303
|
}
|
|
@@ -25149,6 +25342,7 @@ class TTSService {
|
|
|
25149
25342
|
this.speakRunId += 1;
|
|
25150
25343
|
this.provider.onWordBoundary = undefined;
|
|
25151
25344
|
this.provider.stop();
|
|
25345
|
+
this.highlightTargetResolverProvider = null;
|
|
25152
25346
|
this.setState(PlaybackState.IDLE);
|
|
25153
25347
|
this.currentText = null;
|
|
25154
25348
|
if (this.highlightCoordinator) {
|
|
@@ -25160,6 +25354,7 @@ class TTSService {
|
|
|
25160
25354
|
this.currentBoundaryOffset = 0;
|
|
25161
25355
|
this.activeWordBoundaryOffset = 0;
|
|
25162
25356
|
this.seekSegments = [];
|
|
25357
|
+
this.playbackChunks = [];
|
|
25163
25358
|
this.sentenceHighlightSegments = [];
|
|
25164
25359
|
this.currentSeekSegmentIndex = 0;
|
|
25165
25360
|
this.activeSentenceStartOffset = null;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { LoaderConfig } from "@pie-players/pie-players-shared/loader-config";
|
|
2
2
|
import type { AccessibilityCatalogResolverApi, ElementToolStateStoreApi, HighlightCoordinatorApi, ToolCoordinatorApi, ToolkitCoordinatorApi, TtsServiceApi } from "../services/interfaces.js";
|
|
3
|
+
import type { TTSHighlightTargetResolver } from "../services/tts/highlight-target-resolver.js";
|
|
3
4
|
export type ItemPlayerType = "iife" | "esm" | "preloaded" | "custom";
|
|
4
5
|
export interface ItemPlayerConfig {
|
|
5
6
|
type: ItemPlayerType;
|
|
@@ -48,6 +49,7 @@ export declare const assessmentToolkitShellContext: {
|
|
|
48
49
|
};
|
|
49
50
|
export interface AssessmentToolkitRegionScopeContext {
|
|
50
51
|
scopeElement: HTMLElement | null;
|
|
52
|
+
ttsHighlightTargetResolver?: TTSHighlightTargetResolver | null;
|
|
51
53
|
}
|
|
52
54
|
export declare const assessmentToolkitRegionScopeContext: {
|
|
53
55
|
__context__: AssessmentToolkitRegionScopeContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assessment-toolkit-context.js","sourceRoot":"","sources":["../../src/context/assessment-toolkit-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"assessment-toolkit-context.js","sourceRoot":"","sources":["../../src/context/assessment-toolkit-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqCzD,MAAM,CAAC,MAAM,+BAA+B,GAC3C,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAClD,CAAC;AAOH,MAAM,CAAC,MAAM,mCAAmC,GAC/C,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CACtD,CAAC;AAeH,MAAM,CAAC,MAAM,6BAA6B,GACzC,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAChD,CAAC;AAOH,MAAM,CAAC,MAAM,mCAAmC,GAC/C,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CACtD,CAAC","sourcesContent":["import { createContext } from \"@pie-players/pie-context\";\nimport type { LoaderConfig } from \"@pie-players/pie-players-shared/loader-config\";\nimport type {\n\tAccessibilityCatalogResolverApi,\n\tElementToolStateStoreApi,\n\tHighlightCoordinatorApi,\n\tToolCoordinatorApi,\n\tToolkitCoordinatorApi,\n\tTtsServiceApi,\n} from \"../services/interfaces.js\";\nimport type { TTSHighlightTargetResolver } from \"../services/tts/highlight-target-resolver.js\";\n\nexport type ItemPlayerType = \"iife\" | \"esm\" | \"preloaded\" | \"custom\";\n\nexport interface ItemPlayerConfig {\n\ttype: ItemPlayerType;\n\ttagName: string;\n\tversion?: string;\n\tsource?: string;\n\tloaderConfig?: LoaderConfig;\n\tloaderOptions?: Record<string, unknown>;\n\tisDefault: boolean;\n}\n\nexport interface AssessmentToolkitRuntimeContext {\n\ttoolkitCoordinator: ToolkitCoordinatorApi;\n\ttoolCoordinator: ToolCoordinatorApi;\n\tttsService: TtsServiceApi;\n\thighlightCoordinator: HighlightCoordinatorApi;\n\tcatalogResolver: AccessibilityCatalogResolverApi;\n\telementToolStateStore: ElementToolStateStoreApi;\n\tassessmentId: string;\n\tsectionId: string;\n\titemPlayer: ItemPlayerConfig;\n\treportSessionChanged?: (itemId: string, detail: unknown) => void;\n}\n\nexport const assessmentToolkitRuntimeContext =\n\tcreateContext<AssessmentToolkitRuntimeContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.runtimeContext\"),\n\t);\n\nexport interface AssessmentToolkitHostRuntimeContext {\n\truntimeId: string;\n\tcoordinator: ToolkitCoordinatorApi;\n}\n\nexport const assessmentToolkitHostRuntimeContext =\n\tcreateContext<AssessmentToolkitHostRuntimeContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.hostRuntimeContext\"),\n\t);\n\nexport type ShellContextKind = \"item\" | \"passage\";\n\nexport interface AssessmentToolkitShellContext {\n\tkind: ShellContextKind;\n\titemId: string;\n\tcanonicalItemId: string;\n\tcontentKind: string;\n\tregionPolicy: string;\n\tscopeElement: HTMLElement | null;\n\titem: unknown;\n\tcontextVersion: number;\n}\n\nexport const assessmentToolkitShellContext =\n\tcreateContext<AssessmentToolkitShellContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.shellContext\"),\n\t);\n\nexport interface AssessmentToolkitRegionScopeContext {\n\tscopeElement: HTMLElement | null;\n\tttsHighlightTargetResolver?: TTSHighlightTargetResolver | null;\n}\n\nexport const assessmentToolkitRegionScopeContext =\n\tcreateContext<AssessmentToolkitRegionScopeContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.regionScopeContext\"),\n\t);\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* @packageDocumentation
|
|
8
8
|
*/
|
|
9
9
|
export type { AssessmentToolkitHostRuntimeContext, AssessmentToolkitRegionScopeContext, AssessmentToolkitRuntimeContext, AssessmentToolkitShellContext, ItemPlayerConfig, ItemPlayerType, ShellContextKind, } from "./context/assessment-toolkit-context.js";
|
|
10
|
+
export type { TTSHighlightContext, TTSHighlightTargetResolver, TTSHighlightTargetResolverProvider, TTSHighlightTargetResolverRuntime, } from "./services/tts/highlight-target-resolver.js";
|
|
10
11
|
export { assessmentToolkitHostRuntimeContext, assessmentToolkitRegionScopeContext, assessmentToolkitRuntimeContext, assessmentToolkitShellContext, } from "./context/assessment-toolkit-context.js";
|
|
11
12
|
export { connectAssessmentToolkitHostRuntimeContext, connectAssessmentToolkitRegionScopeContext, connectAssessmentToolkitRuntimeContext, connectAssessmentToolkitShellContext, } from "./context/runtime-context-consumer.js";
|
|
12
13
|
export { PIE_INTERNAL_CONTENT_LOADED_EVENT, PIE_INTERNAL_ITEM_SESSION_CHANGED_EVENT, PIE_INTERNAL_ITEM_PLAYER_ERROR_EVENT, PIE_ITEM_SESSION_CHANGED_EVENT, PIE_REGISTER_EVENT, PIE_UNREGISTER_EVENT, type InternalContentLoadedDetail, type InternalItemSessionChangedDetail, type InternalItemPlayerErrorDetail, type ItemSessionChangedDetail, type RuntimeRegistrationDetail, type RuntimeRegistrationKind, } from "./runtime/registration-events.js";
|
|
@@ -26,7 +27,7 @@ export type { ResolvedToolContext, ToolbarContext, ToolContextResolver, ToolCont
|
|
|
26
27
|
export { ToolRegistry } from "./services/ToolRegistry.js";
|
|
27
28
|
export type { AssessmentToolContext, BaseToolContext, ElementToolContext, ItemToolContext, PassageToolContext, RubricToolContext, SectionToolContext, ToolContext, ToolLevel, } from "./services/tool-context.js";
|
|
28
29
|
export { extractTextContent, hasChoiceInteraction, hasMathContent, hasReadableText, isAssessmentContext, isElementContext, isItemContext, isPassageContext, isRubricContext, isSectionContext, } from "./services/tool-context.js";
|
|
29
|
-
export { DEFAULT_TOOL_PLACEMENT, DEFAULT_TOOL_ORDER, createPackagedToolRegistry, PACKAGED_TOOL_PLACEMENT, registerPackagedTools, } from "./services/createDefaultToolRegistry.js";
|
|
30
|
+
export { DEFAULT_TOOL_PLACEMENT, DEFAULT_TOOL_ORDER, createPackagedToolRegistry, PACKAGED_TOOL_PLACEMENT, registerPackagedTools, SECTION_PLAYER_PREFERRED_TOOL_PLACEMENT, } from "./services/createDefaultToolRegistry.js";
|
|
30
31
|
export type { CreateToolsConfigArgs } from "./services/create-tools-config.js";
|
|
31
32
|
export { createToolsConfig } from "./services/create-tools-config.js";
|
|
32
33
|
export { DEFAULT_PERSONAL_NEEDS_PROFILE, createDefaultPersonalNeedsProfile, } from "./services/defaultPersonalNeedsProfile.js";
|
package/dist/index.js
CHANGED
|
@@ -20,7 +20,7 @@ export { RangeSerializer } from "./services/RangeSerializer.js";
|
|
|
20
20
|
export { I18nService } from "./services/I18nService.js";
|
|
21
21
|
export { ToolRegistry } from "./services/ToolRegistry.js";
|
|
22
22
|
export { extractTextContent, hasChoiceInteraction, hasMathContent, hasReadableText, isAssessmentContext, isElementContext, isItemContext, isPassageContext, isRubricContext, isSectionContext, } from "./services/tool-context.js";
|
|
23
|
-
export { DEFAULT_TOOL_PLACEMENT, DEFAULT_TOOL_ORDER, createPackagedToolRegistry, PACKAGED_TOOL_PLACEMENT, registerPackagedTools, } from "./services/createDefaultToolRegistry.js";
|
|
23
|
+
export { DEFAULT_TOOL_PLACEMENT, DEFAULT_TOOL_ORDER, createPackagedToolRegistry, PACKAGED_TOOL_PLACEMENT, registerPackagedTools, SECTION_PLAYER_PREFERRED_TOOL_PLACEMENT, } from "./services/createDefaultToolRegistry.js";
|
|
24
24
|
export { createToolsConfig } from "./services/create-tools-config.js";
|
|
25
25
|
export { DEFAULT_PERSONAL_NEEDS_PROFILE, createDefaultPersonalNeedsProfile, } from "./services/defaultPersonalNeedsProfile.js";
|
|
26
26
|
export { createToolElement, DEFAULT_TOOL_TAG_MAP, resolveToolTag, toToolIdFromTag, } from "./tools/tool-tag-map.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PIE Assessment Toolkit\n *\n * Independent, composable services for coordinating tools, accommodations,\n * and item players in assessment applications.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Infrastructure\n// ============================================================================\n\nexport type {\n\tAssessmentToolkitHostRuntimeContext,\n\tAssessmentToolkitRegionScopeContext,\n\tAssessmentToolkitRuntimeContext,\n\tAssessmentToolkitShellContext,\n\tItemPlayerConfig,\n\tItemPlayerType,\n\tShellContextKind,\n} from \"./context/assessment-toolkit-context.js\";\nexport {\n\tassessmentToolkitHostRuntimeContext,\n\tassessmentToolkitRegionScopeContext,\n\tassessmentToolkitRuntimeContext,\n\tassessmentToolkitShellContext,\n} from \"./context/assessment-toolkit-context.js\";\nexport {\n\tconnectAssessmentToolkitHostRuntimeContext,\n\tconnectAssessmentToolkitRegionScopeContext,\n\tconnectAssessmentToolkitRuntimeContext,\n\tconnectAssessmentToolkitShellContext,\n} from \"./context/runtime-context-consumer.js\";\nexport {\n\tPIE_INTERNAL_CONTENT_LOADED_EVENT,\n\tPIE_INTERNAL_ITEM_SESSION_CHANGED_EVENT,\n\tPIE_INTERNAL_ITEM_PLAYER_ERROR_EVENT,\n\tPIE_ITEM_SESSION_CHANGED_EVENT,\n\tPIE_REGISTER_EVENT,\n\tPIE_UNREGISTER_EVENT,\n\ttype InternalContentLoadedDetail,\n\ttype InternalItemSessionChangedDetail,\n\ttype InternalItemPlayerErrorDetail,\n\ttype ItemSessionChangedDetail,\n\ttype RuntimeRegistrationDetail,\n\ttype RuntimeRegistrationKind,\n} from \"./runtime/registration-events.js\";\nexport {\n\tconnectToolRegionScopeContext,\n\tconnectToolRuntimeContext,\n\tconnectToolShellContext,\n\tcreateCrossBoundaryEvent,\n\tdispatchCrossBoundaryEvent,\n\tisContextValueDefined,\n} from \"./runtime/tool-host-contract.js\";\n\n// ============================================================================\n// Service Interfaces\n// ============================================================================\n\nexport type {\n\tAccessibilityCatalogResolverApi,\n\tElementToolStateStoreApi,\n\tHighlightCoordinatorApi,\n\tI18nServiceApi,\n\tThemeProviderApi,\n\tToolCoordinatorApi,\n\tToolkitCoordinatorApi,\n\tTtsServiceApi,\n\tToolState,\n} from \"./services/interfaces.js\";\n\n// ============================================================================\n// Toolkit Services\n// ============================================================================\n\n// Accessibility Catalog Resolver (QTI 3.0 Accessibility Catalogs)\nexport type {\n\tCatalogLookupContext,\n\tCatalogLookupOptions,\n\tCatalogOwnerContext,\n\tCatalogOwnerKind,\n\tCatalogStatistics,\n\tCatalogType,\n\tResolvedCatalog,\n} from \"./services/AccessibilityCatalogResolver.js\";\nexport { AccessibilityCatalogResolver } from \"./services/AccessibilityCatalogResolver.js\";\n// Context Variable Store (QTI 3.0 Context Declarations)\nexport { ContextVariableStore } from \"./services/ContextVariableStore.js\";\n// Element Tool State Store (Element-level ephemeral tool state)\nexport { ElementToolStateStore } from \"./services/ElementToolStateStore.js\";\n// Highlight Coordinator\nexport type { Annotation } from \"./services/HighlightCoordinator.js\";\nexport {\n\tHighlightColor,\n\tHighlightCoordinator,\n\tHighlightType,\n} from \"./services/HighlightCoordinator.js\";\n// Range Serializer (for annotation persistence)\nexport type { SerializedRange } from \"./services/RangeSerializer.js\";\nexport { RangeSerializer } from \"./services/RangeSerializer.js\";\n// I18n Service\nexport type {\n\tI18nConfig,\n\tPluralTranslation,\n\tTranslationBundle,\n} from \"./services/I18nService.js\";\nexport { I18nService } from \"./services/I18nService.js\";\n// Tool Registry (Registry-based tool system)\nexport type {\n\tResolvedToolContext,\n\tToolbarContext,\n\tToolContextResolver,\n\tToolContextResolverContext,\n\tToolContextResolverMap,\n\tToolContextResolverResult,\n\tToolModuleLoader,\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolRegistration,\n} from \"./services/ToolRegistry.js\";\nexport { ToolRegistry } from \"./services/ToolRegistry.js\";\nexport type {\n\tAssessmentToolContext,\n\tBaseToolContext,\n\tElementToolContext,\n\tItemToolContext,\n\tPassageToolContext,\n\tRubricToolContext,\n\tSectionToolContext,\n\tToolContext,\n\tToolLevel,\n} from \"./services/tool-context.js\";\nexport {\n\textractTextContent,\n\thasChoiceInteraction,\n\thasMathContent,\n\thasReadableText,\n\tisAssessmentContext,\n\tisElementContext,\n\tisItemContext,\n\tisPassageContext,\n\tisRubricContext,\n\tisSectionContext,\n} from \"./services/tool-context.js\";\nexport {\n\tDEFAULT_TOOL_PLACEMENT,\n\tDEFAULT_TOOL_ORDER,\n\tcreatePackagedToolRegistry,\n\tPACKAGED_TOOL_PLACEMENT,\n\tregisterPackagedTools,\n} from \"./services/createDefaultToolRegistry.js\";\nexport type { CreateToolsConfigArgs } from \"./services/create-tools-config.js\";\nexport { createToolsConfig } from \"./services/create-tools-config.js\";\nexport {\n\tDEFAULT_PERSONAL_NEEDS_PROFILE,\n\tcreateDefaultPersonalNeedsProfile,\n} from \"./services/defaultPersonalNeedsProfile.js\";\nexport type {\n\tToolComponentFactory,\n\tToolComponentFactoryMap,\n\tToolComponentOverrides,\n\tToolTagMap,\n} from \"./tools/tool-tag-map.js\";\nexport {\n\tcreateToolElement,\n\tDEFAULT_TOOL_TAG_MAP,\n\tresolveToolTag,\n\ttoToolIdFromTag,\n} from \"./tools/tool-tag-map.js\";\n// QTI 3.0 Standard Access Features\nexport {\n\tALL_STANDARD_ACCESS_FEATURES,\n\tEXAMPLE_PNP_CONFIGURATIONS,\n\tgetFeatureCategory,\n\tgetFeaturesInCategory,\n\tisStandardAccessFeature,\n\tQTI_STANDARD_ACCESS_FEATURES,\n} from \"./services/pnp-standard-features.js\";\n// SSML Extractor (Auto-generates catalogs from embedded SSML)\nexport type { ExtractionResult } from \"./services/SSMLExtractor.js\";\nexport { SSMLExtractor } from \"./services/SSMLExtractor.js\";\n// Theme Provider\nexport type { FontSize, ThemeConfig } from \"./services/ThemeProvider.js\";\nexport { ThemeProvider } from \"./services/ThemeProvider.js\";\n// Tool Coordinator\nexport { ToolCoordinator, ZIndexLayer } from \"./services/ToolCoordinator.js\";\n// Toolkit Coordinator (Centralized service management)\nexport type {\n\tAnswerEliminatorToolConfig,\n\tProviderLifecycleContext,\n\tSectionControllerContext,\n\tSectionControllerEvent,\n\tSectionControllerEventType,\n\tSectionItemEvent,\n\tSectionItemEventType,\n\tSectionControllerFactoryDefaults,\n\tSectionControllerHandle,\n\tSectionControllerKey,\n\tSectionScopedEvent,\n\tSectionScopedEventType,\n\tSectionSessionPersistenceConfig,\n\tSectionItemEventSubscriptionArgs,\n\tSectionScopedEventSubscriptionArgs,\n\tSectionEventSubscriptionArgs,\n\tSectionSessionPersistenceStrategy,\n\tSectionControllerLoadedRenderable,\n\tSectionControllerRuntimeState,\n\tSectionControllerSessionState,\n\tSectionPersistenceFactoryDefaults,\n\tToolConfig,\n\tToolkitCoordinatorConfig,\n\tToolkitCoordinatorHooks,\n\tToolkitErrorContext,\n\tToolkitInitStatus,\n\tToolkitServiceBundle,\n\tToolkitToolsConfig,\n\tTTSToolConfig,\n} from \"./services/ToolkitCoordinator.js\";\nexport { ToolkitCoordinator } from \"./services/ToolkitCoordinator.js\";\nexport type {\n\tCanonicalToolsConfig,\n\tToolPlacementConfig,\n\tToolPlacementLevel,\n\tToolPolicyConfig,\n\tToolProvidersConfig,\n} from \"./services/tools-config-normalizer.js\";\nexport type {\n\tFrameworkErrorKind,\n\tFrameworkErrorModel,\n\tFrameworkErrorSeverity,\n} from \"./services/framework-error.js\";\nexport {\n\tformatFrameworkErrorForConsole,\n\tframeworkErrorFromToolConfigDiagnostics,\n\tframeworkErrorFromUnknown,\n\ttoFrameworkErrorModel,\n} from \"./services/framework-error.js\";\nexport type { FrameworkErrorListener } from \"./services/framework-error-bus.js\";\nexport type {\n\tToolConfigDiagnostic,\n\tToolConfigDiagnosticSeverity,\n\tToolConfigStrictness,\n\tToolConfigValidationOptions,\n\tToolConfigValidationResult,\n} from \"./services/tool-config-validation.js\";\nexport type {\n\tToolbarButtonItem,\n\tToolbarItem,\n\tToolbarItemBase,\n\tToolbarLinkItem,\n} from \"./services/toolbar-items.js\";\nexport {\n\tisExternalIconUrl,\n\tisInlineSvgIcon,\n\tisToolbarLinkItem,\n\tisValidToolbarItemShape,\n} from \"./services/toolbar-items.js\";\nexport {\n\tnormalizeToolsConfig,\n\tnormalizeToolAlias,\n\tnormalizeToolList,\n\tparseToolList,\n} from \"./services/tools-config-normalizer.js\";\nexport {\n\tframeworkErrorFromToolConfigValidation,\n\tnormalizeAndValidateToolsConfig,\n} from \"./services/tool-config-validation.js\";\nexport type {\n\tParsedToolInstanceId,\n\tToolScopeLevel,\n} from \"./services/tool-instance-id.js\";\nexport {\n\tcreateScopedToolId,\n\tparseScopedToolId,\n\ttoOverlayToolId,\n} from \"./services/tool-instance-id.js\";\n// Text-to-Speech Service\nexport type { TTSConfig } from \"./services/TTSService.js\";\nexport { PlaybackState, TTSService } from \"./services/TTSService.js\";\nexport {\n\tPIE_TTS_CONTROL_HANDOFF_EVENT,\n\ttype TTSControlHandoffDetail,\n} from \"./services/tts-control-events.js\";\nexport { BrowserTTSProvider } from \"./services/tts/browser-provider.js\";\nexport type { SREMathSpeechOptions } from \"./services/tts/math-speech.js\";\nexport type {\n\tNormalizedTTSSpeedOption,\n\tTTSHostToolbarLayout,\n\tTTSLayoutMode,\n\tTTSRuntimeSettings,\n\tTTSSpeedOption,\n\tTTSSpeedOptionConfig,\n} from \"./services/tts-runtime-config.js\";\nexport {\n\tDEFAULT_TTS_SPEED_OPTIONS,\n\tformatTTSSpeedOptionsAsText,\n\tnormalizeTTSLayoutMode,\n\tnormalizeTTSSpeedControlOptions,\n\tnormalizeTTSSpeedOptionConfigs,\n\tnormalizeTTSSpeedOptions,\n\tparseTTSSpeedOptionsFromText,\n\tresolveTTSHostToolbarLayout,\n\tresolveTTSLayoutMode,\n\tresolveTTSRuntimeSettings,\n} from \"./services/tts-runtime-config.js\";\n// TTS Provider System\nexport type {\n\tITTSProvider,\n\tITTSProviderImplementation,\n\tTTSSpeechSegment,\n\tTTSFeature,\n\tTTSProviderCapabilities,\n} from \"@pie-players/pie-tts\";\n\n// ============================================================================\n// Item loading (client-resolvable default; optional backend hook)\n// ============================================================================\n\nexport type {\n\tCreateLoadItemOptions,\n\tLoadItem,\n\tLoadItemOptions,\n} from \"./item-loader.js\";\nexport {\n\tcreateFetchItemLoader,\n\tcreateLoadItem,\n\tItemLoadError,\n} from \"./item-loader.js\";\n\n// ============================================================================\n// Attempt Session\n// ============================================================================\n\nexport type {\n\tStorageLike,\n\tTestAttemptItemSession,\n\tTestAttemptSession,\n\tTestAttemptSessionNavigationState,\n\tTestAttemptSessionRealization,\n} from \"./attempt/TestSession.js\";\nexport {\n\tcreateMemoryStorage,\n\tcreateTestAttemptSessionIdentifier,\n\tcreateNewTestAttemptSession,\n\tgetBrowserLocalStorage,\n\tgetOrCreateAnonymousDeviceId,\n\tgetTestAttemptSessionStorageKey,\n\tloadTestAttemptSession,\n\tsaveTestAttemptSession,\n\tsetCurrentPosition,\n\tupsertItemSessionFromPieSessionChange,\n\tupsertVisitedItem,\n} from \"./attempt/TestSession.js\";\nexport type {\n\tAssessmentSession,\n\tAssessmentSectionSessionState,\n\tAssessmentSessionNavigationState,\n\tAssessmentSessionRealization,\n} from \"./attempt/AssessmentSession.js\";\nexport {\n\tcreateNewAssessmentSession,\n\tgetAssessmentSessionStorageKey,\n\tloadAssessmentSession,\n\tsaveAssessmentSession,\n\tsetCurrentSectionPosition,\n\tupsertSectionSession,\n} from \"./attempt/AssessmentSession.js\";\nexport type {\n\tActivitySessionPatchPayload,\n\tMapActivityToTestAttemptSessionArgs,\n\tPieBackendActivityDefinition,\n\tPieBackendActivityItemRef,\n\tPieBackendActivitySession,\n} from \"./attempt/adapters/activity-to-test-attempt-session.js\";\nexport {\n\tbuildActivitySessionItemUpdate,\n\tbuildActivitySessionPatchFromTestAttemptSession,\n\tmapActivityToTestAttemptSession,\n\ttoItemSessionsRecord,\n} from \"./attempt/adapters/activity-to-test-attempt-session.js\";\n\n// Section Player - Use @pie-players/pie-section-player web component\n\n// ============================================================================\n// Shared Components\n// ============================================================================\n\n// ItemToolBar custom element registration helper is exported via package.json exports field\n// Import using: import '@pie-players/pie-assessment-toolkit/components/item-toolbar-element';\n// PieAssessmentToolkit custom element registration helper is exported via package.json exports field\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PIE Assessment Toolkit\n *\n * Independent, composable services for coordinating tools, accommodations,\n * and item players in assessment applications.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Infrastructure\n// ============================================================================\n\nexport type {\n\tAssessmentToolkitHostRuntimeContext,\n\tAssessmentToolkitRegionScopeContext,\n\tAssessmentToolkitRuntimeContext,\n\tAssessmentToolkitShellContext,\n\tItemPlayerConfig,\n\tItemPlayerType,\n\tShellContextKind,\n} from \"./context/assessment-toolkit-context.js\";\nexport type {\n\tTTSHighlightContext,\n\tTTSHighlightTargetResolver,\n\tTTSHighlightTargetResolverProvider,\n\tTTSHighlightTargetResolverRuntime,\n} from \"./services/tts/highlight-target-resolver.js\";\nexport {\n\tassessmentToolkitHostRuntimeContext,\n\tassessmentToolkitRegionScopeContext,\n\tassessmentToolkitRuntimeContext,\n\tassessmentToolkitShellContext,\n} from \"./context/assessment-toolkit-context.js\";\nexport {\n\tconnectAssessmentToolkitHostRuntimeContext,\n\tconnectAssessmentToolkitRegionScopeContext,\n\tconnectAssessmentToolkitRuntimeContext,\n\tconnectAssessmentToolkitShellContext,\n} from \"./context/runtime-context-consumer.js\";\nexport {\n\tPIE_INTERNAL_CONTENT_LOADED_EVENT,\n\tPIE_INTERNAL_ITEM_SESSION_CHANGED_EVENT,\n\tPIE_INTERNAL_ITEM_PLAYER_ERROR_EVENT,\n\tPIE_ITEM_SESSION_CHANGED_EVENT,\n\tPIE_REGISTER_EVENT,\n\tPIE_UNREGISTER_EVENT,\n\ttype InternalContentLoadedDetail,\n\ttype InternalItemSessionChangedDetail,\n\ttype InternalItemPlayerErrorDetail,\n\ttype ItemSessionChangedDetail,\n\ttype RuntimeRegistrationDetail,\n\ttype RuntimeRegistrationKind,\n} from \"./runtime/registration-events.js\";\nexport {\n\tconnectToolRegionScopeContext,\n\tconnectToolRuntimeContext,\n\tconnectToolShellContext,\n\tcreateCrossBoundaryEvent,\n\tdispatchCrossBoundaryEvent,\n\tisContextValueDefined,\n} from \"./runtime/tool-host-contract.js\";\n\n// ============================================================================\n// Service Interfaces\n// ============================================================================\n\nexport type {\n\tAccessibilityCatalogResolverApi,\n\tElementToolStateStoreApi,\n\tHighlightCoordinatorApi,\n\tI18nServiceApi,\n\tThemeProviderApi,\n\tToolCoordinatorApi,\n\tToolkitCoordinatorApi,\n\tTtsServiceApi,\n\tToolState,\n} from \"./services/interfaces.js\";\n\n// ============================================================================\n// Toolkit Services\n// ============================================================================\n\n// Accessibility Catalog Resolver (QTI 3.0 Accessibility Catalogs)\nexport type {\n\tCatalogLookupContext,\n\tCatalogLookupOptions,\n\tCatalogOwnerContext,\n\tCatalogOwnerKind,\n\tCatalogStatistics,\n\tCatalogType,\n\tResolvedCatalog,\n} from \"./services/AccessibilityCatalogResolver.js\";\nexport { AccessibilityCatalogResolver } from \"./services/AccessibilityCatalogResolver.js\";\n// Context Variable Store (QTI 3.0 Context Declarations)\nexport { ContextVariableStore } from \"./services/ContextVariableStore.js\";\n// Element Tool State Store (Element-level ephemeral tool state)\nexport { ElementToolStateStore } from \"./services/ElementToolStateStore.js\";\n// Highlight Coordinator\nexport type { Annotation } from \"./services/HighlightCoordinator.js\";\nexport {\n\tHighlightColor,\n\tHighlightCoordinator,\n\tHighlightType,\n} from \"./services/HighlightCoordinator.js\";\n// Range Serializer (for annotation persistence)\nexport type { SerializedRange } from \"./services/RangeSerializer.js\";\nexport { RangeSerializer } from \"./services/RangeSerializer.js\";\n// I18n Service\nexport type {\n\tI18nConfig,\n\tPluralTranslation,\n\tTranslationBundle,\n} from \"./services/I18nService.js\";\nexport { I18nService } from \"./services/I18nService.js\";\n// Tool Registry (Registry-based tool system)\nexport type {\n\tResolvedToolContext,\n\tToolbarContext,\n\tToolContextResolver,\n\tToolContextResolverContext,\n\tToolContextResolverMap,\n\tToolContextResolverResult,\n\tToolModuleLoader,\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolRegistration,\n} from \"./services/ToolRegistry.js\";\nexport { ToolRegistry } from \"./services/ToolRegistry.js\";\nexport type {\n\tAssessmentToolContext,\n\tBaseToolContext,\n\tElementToolContext,\n\tItemToolContext,\n\tPassageToolContext,\n\tRubricToolContext,\n\tSectionToolContext,\n\tToolContext,\n\tToolLevel,\n} from \"./services/tool-context.js\";\nexport {\n\textractTextContent,\n\thasChoiceInteraction,\n\thasMathContent,\n\thasReadableText,\n\tisAssessmentContext,\n\tisElementContext,\n\tisItemContext,\n\tisPassageContext,\n\tisRubricContext,\n\tisSectionContext,\n} from \"./services/tool-context.js\";\nexport {\n\tDEFAULT_TOOL_PLACEMENT,\n\tDEFAULT_TOOL_ORDER,\n\tcreatePackagedToolRegistry,\n\tPACKAGED_TOOL_PLACEMENT,\n\tregisterPackagedTools,\n\tSECTION_PLAYER_PREFERRED_TOOL_PLACEMENT,\n} from \"./services/createDefaultToolRegistry.js\";\nexport type { CreateToolsConfigArgs } from \"./services/create-tools-config.js\";\nexport { createToolsConfig } from \"./services/create-tools-config.js\";\nexport {\n\tDEFAULT_PERSONAL_NEEDS_PROFILE,\n\tcreateDefaultPersonalNeedsProfile,\n} from \"./services/defaultPersonalNeedsProfile.js\";\nexport type {\n\tToolComponentFactory,\n\tToolComponentFactoryMap,\n\tToolComponentOverrides,\n\tToolTagMap,\n} from \"./tools/tool-tag-map.js\";\nexport {\n\tcreateToolElement,\n\tDEFAULT_TOOL_TAG_MAP,\n\tresolveToolTag,\n\ttoToolIdFromTag,\n} from \"./tools/tool-tag-map.js\";\n// QTI 3.0 Standard Access Features\nexport {\n\tALL_STANDARD_ACCESS_FEATURES,\n\tEXAMPLE_PNP_CONFIGURATIONS,\n\tgetFeatureCategory,\n\tgetFeaturesInCategory,\n\tisStandardAccessFeature,\n\tQTI_STANDARD_ACCESS_FEATURES,\n} from \"./services/pnp-standard-features.js\";\n// SSML Extractor (Auto-generates catalogs from embedded SSML)\nexport type { ExtractionResult } from \"./services/SSMLExtractor.js\";\nexport { SSMLExtractor } from \"./services/SSMLExtractor.js\";\n// Theme Provider\nexport type { FontSize, ThemeConfig } from \"./services/ThemeProvider.js\";\nexport { ThemeProvider } from \"./services/ThemeProvider.js\";\n// Tool Coordinator\nexport { ToolCoordinator, ZIndexLayer } from \"./services/ToolCoordinator.js\";\n// Toolkit Coordinator (Centralized service management)\nexport type {\n\tAnswerEliminatorToolConfig,\n\tProviderLifecycleContext,\n\tSectionControllerContext,\n\tSectionControllerEvent,\n\tSectionControllerEventType,\n\tSectionItemEvent,\n\tSectionItemEventType,\n\tSectionControllerFactoryDefaults,\n\tSectionControllerHandle,\n\tSectionControllerKey,\n\tSectionScopedEvent,\n\tSectionScopedEventType,\n\tSectionSessionPersistenceConfig,\n\tSectionItemEventSubscriptionArgs,\n\tSectionScopedEventSubscriptionArgs,\n\tSectionEventSubscriptionArgs,\n\tSectionSessionPersistenceStrategy,\n\tSectionControllerLoadedRenderable,\n\tSectionControllerRuntimeState,\n\tSectionControllerSessionState,\n\tSectionPersistenceFactoryDefaults,\n\tToolConfig,\n\tToolkitCoordinatorConfig,\n\tToolkitCoordinatorHooks,\n\tToolkitErrorContext,\n\tToolkitInitStatus,\n\tToolkitServiceBundle,\n\tToolkitToolsConfig,\n\tTTSToolConfig,\n} from \"./services/ToolkitCoordinator.js\";\nexport { ToolkitCoordinator } from \"./services/ToolkitCoordinator.js\";\nexport type {\n\tCanonicalToolsConfig,\n\tToolPlacementConfig,\n\tToolPlacementLevel,\n\tToolPolicyConfig,\n\tToolProvidersConfig,\n} from \"./services/tools-config-normalizer.js\";\nexport type {\n\tFrameworkErrorKind,\n\tFrameworkErrorModel,\n\tFrameworkErrorSeverity,\n} from \"./services/framework-error.js\";\nexport {\n\tformatFrameworkErrorForConsole,\n\tframeworkErrorFromToolConfigDiagnostics,\n\tframeworkErrorFromUnknown,\n\ttoFrameworkErrorModel,\n} from \"./services/framework-error.js\";\nexport type { FrameworkErrorListener } from \"./services/framework-error-bus.js\";\nexport type {\n\tToolConfigDiagnostic,\n\tToolConfigDiagnosticSeverity,\n\tToolConfigStrictness,\n\tToolConfigValidationOptions,\n\tToolConfigValidationResult,\n} from \"./services/tool-config-validation.js\";\nexport type {\n\tToolbarButtonItem,\n\tToolbarItem,\n\tToolbarItemBase,\n\tToolbarLinkItem,\n} from \"./services/toolbar-items.js\";\nexport {\n\tisExternalIconUrl,\n\tisInlineSvgIcon,\n\tisToolbarLinkItem,\n\tisValidToolbarItemShape,\n} from \"./services/toolbar-items.js\";\nexport {\n\tnormalizeToolsConfig,\n\tnormalizeToolAlias,\n\tnormalizeToolList,\n\tparseToolList,\n} from \"./services/tools-config-normalizer.js\";\nexport {\n\tframeworkErrorFromToolConfigValidation,\n\tnormalizeAndValidateToolsConfig,\n} from \"./services/tool-config-validation.js\";\nexport type {\n\tParsedToolInstanceId,\n\tToolScopeLevel,\n} from \"./services/tool-instance-id.js\";\nexport {\n\tcreateScopedToolId,\n\tparseScopedToolId,\n\ttoOverlayToolId,\n} from \"./services/tool-instance-id.js\";\n// Text-to-Speech Service\nexport type { TTSConfig } from \"./services/TTSService.js\";\nexport { PlaybackState, TTSService } from \"./services/TTSService.js\";\nexport {\n\tPIE_TTS_CONTROL_HANDOFF_EVENT,\n\ttype TTSControlHandoffDetail,\n} from \"./services/tts-control-events.js\";\nexport { BrowserTTSProvider } from \"./services/tts/browser-provider.js\";\nexport type { SREMathSpeechOptions } from \"./services/tts/math-speech.js\";\nexport type {\n\tNormalizedTTSSpeedOption,\n\tTTSHostToolbarLayout,\n\tTTSLayoutMode,\n\tTTSRuntimeSettings,\n\tTTSSpeedOption,\n\tTTSSpeedOptionConfig,\n} from \"./services/tts-runtime-config.js\";\nexport {\n\tDEFAULT_TTS_SPEED_OPTIONS,\n\tformatTTSSpeedOptionsAsText,\n\tnormalizeTTSLayoutMode,\n\tnormalizeTTSSpeedControlOptions,\n\tnormalizeTTSSpeedOptionConfigs,\n\tnormalizeTTSSpeedOptions,\n\tparseTTSSpeedOptionsFromText,\n\tresolveTTSHostToolbarLayout,\n\tresolveTTSLayoutMode,\n\tresolveTTSRuntimeSettings,\n} from \"./services/tts-runtime-config.js\";\n// TTS Provider System\nexport type {\n\tITTSProvider,\n\tITTSProviderImplementation,\n\tTTSSpeechSegment,\n\tTTSFeature,\n\tTTSProviderCapabilities,\n} from \"@pie-players/pie-tts\";\n\n// ============================================================================\n// Item loading (client-resolvable default; optional backend hook)\n// ============================================================================\n\nexport type {\n\tCreateLoadItemOptions,\n\tLoadItem,\n\tLoadItemOptions,\n} from \"./item-loader.js\";\nexport {\n\tcreateFetchItemLoader,\n\tcreateLoadItem,\n\tItemLoadError,\n} from \"./item-loader.js\";\n\n// ============================================================================\n// Attempt Session\n// ============================================================================\n\nexport type {\n\tStorageLike,\n\tTestAttemptItemSession,\n\tTestAttemptSession,\n\tTestAttemptSessionNavigationState,\n\tTestAttemptSessionRealization,\n} from \"./attempt/TestSession.js\";\nexport {\n\tcreateMemoryStorage,\n\tcreateTestAttemptSessionIdentifier,\n\tcreateNewTestAttemptSession,\n\tgetBrowserLocalStorage,\n\tgetOrCreateAnonymousDeviceId,\n\tgetTestAttemptSessionStorageKey,\n\tloadTestAttemptSession,\n\tsaveTestAttemptSession,\n\tsetCurrentPosition,\n\tupsertItemSessionFromPieSessionChange,\n\tupsertVisitedItem,\n} from \"./attempt/TestSession.js\";\nexport type {\n\tAssessmentSession,\n\tAssessmentSectionSessionState,\n\tAssessmentSessionNavigationState,\n\tAssessmentSessionRealization,\n} from \"./attempt/AssessmentSession.js\";\nexport {\n\tcreateNewAssessmentSession,\n\tgetAssessmentSessionStorageKey,\n\tloadAssessmentSession,\n\tsaveAssessmentSession,\n\tsetCurrentSectionPosition,\n\tupsertSectionSession,\n} from \"./attempt/AssessmentSession.js\";\nexport type {\n\tActivitySessionPatchPayload,\n\tMapActivityToTestAttemptSessionArgs,\n\tPieBackendActivityDefinition,\n\tPieBackendActivityItemRef,\n\tPieBackendActivitySession,\n} from \"./attempt/adapters/activity-to-test-attempt-session.js\";\nexport {\n\tbuildActivitySessionItemUpdate,\n\tbuildActivitySessionPatchFromTestAttemptSession,\n\tmapActivityToTestAttemptSession,\n\ttoItemSessionsRecord,\n} from \"./attempt/adapters/activity-to-test-attempt-session.js\";\n\n// Section Player - Use @pie-players/pie-section-player web component\n\n// ============================================================================\n// Shared Components\n// ============================================================================\n\n// ItemToolBar custom element registration helper is exported via package.json exports field\n// Import using: import '@pie-players/pie-assessment-toolkit/components/item-toolbar-element';\n// PieAssessmentToolkit custom element registration helper is exported via package.json exports field\n"]}
|
|
@@ -118,6 +118,12 @@ export declare class HighlightCoordinator implements HighlightCoordinatorApi {
|
|
|
118
118
|
* @param ranges Line (or sentence) ranges to paint with `--pie-tts-line-highlight`
|
|
119
119
|
*/
|
|
120
120
|
highlightTTSSentence(ranges: Range[]): void;
|
|
121
|
+
/**
|
|
122
|
+
* Highlight sentence/block elements for TTS (background layer).
|
|
123
|
+
*
|
|
124
|
+
* @param elements Visible elements to paint with `--pie-tts-line-highlight`
|
|
125
|
+
*/
|
|
126
|
+
highlightTTSSentenceElements(elements: Element[]): void;
|
|
121
127
|
private static readonly SENTENCE_FALLBACK_SELECTOR;
|
|
122
128
|
private static readonly WORD_FALLBACK_SELECTOR;
|
|
123
129
|
private highlightTTSElementFallbacks;
|
|
@@ -309,27 +309,27 @@ export class HighlightCoordinator {
|
|
|
309
309
|
|
|
310
310
|
/* Annotation highlights - persistent */
|
|
311
311
|
::highlight(annotation-yellow) {
|
|
312
|
-
background-color:
|
|
312
|
+
background-color: var(--pie-annotation-yellow-highlight, rgba(253, 233, 149, 0.5));
|
|
313
313
|
color: inherit;
|
|
314
314
|
}
|
|
315
315
|
|
|
316
316
|
::highlight(annotation-green) {
|
|
317
|
-
background-color:
|
|
317
|
+
background-color: var(--pie-annotation-green-highlight, rgba(166, 225, 197, 0.5));
|
|
318
318
|
color: inherit;
|
|
319
319
|
}
|
|
320
320
|
|
|
321
321
|
::highlight(annotation-blue) {
|
|
322
|
-
background-color:
|
|
322
|
+
background-color: var(--pie-annotation-blue-highlight, rgba(167, 224, 246, 0.5));
|
|
323
323
|
color: inherit;
|
|
324
324
|
}
|
|
325
325
|
|
|
326
326
|
::highlight(annotation-pink) {
|
|
327
|
-
background-color:
|
|
327
|
+
background-color: var(--pie-annotation-pink-highlight, rgba(255, 159, 174, 0.5));
|
|
328
328
|
color: inherit;
|
|
329
329
|
}
|
|
330
330
|
|
|
331
331
|
::highlight(annotation-orange) {
|
|
332
|
-
background-color:
|
|
332
|
+
background-color: var(--pie-annotation-orange-highlight, rgba(255, 165, 0, 0.5));
|
|
333
333
|
color: inherit;
|
|
334
334
|
}
|
|
335
335
|
|
|
@@ -410,6 +410,21 @@ export class HighlightCoordinator {
|
|
|
410
410
|
}
|
|
411
411
|
this.highlightTTSElementFallbacks(ranges);
|
|
412
412
|
}
|
|
413
|
+
/**
|
|
414
|
+
* Highlight sentence/block elements for TTS (background layer).
|
|
415
|
+
*
|
|
416
|
+
* @param elements Visible elements to paint with `--pie-tts-line-highlight`
|
|
417
|
+
*/
|
|
418
|
+
highlightTTSSentenceElements(elements) {
|
|
419
|
+
if (!this.ttsSentenceHighlight)
|
|
420
|
+
return;
|
|
421
|
+
this.applyAdaptiveTTSStyle(elements[0] || null);
|
|
422
|
+
this.clearTTSSentence();
|
|
423
|
+
for (const element of elements) {
|
|
424
|
+
element.setAttribute("data-pie-tts-sentence-element", "true");
|
|
425
|
+
this.ttsSentenceElementHighlights.add(element);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
413
428
|
// The read-along (sentence) band legitimately covers whole equations and
|
|
414
429
|
// replaced elements, so it escalates to them.
|
|
415
430
|
static SENTENCE_FALLBACK_SELECTOR = "math, mjx-container, svg, img, canvas, [role='img']";
|