Skip to content

Commit 5fe4ca7

Browse files
committed
Add citation links
1 parent 7854735 commit 5fe4ca7

1 file changed

Lines changed: 19 additions & 5 deletions

File tree

bases/rsptx/interactives/runestone/common/js/bookfuncs.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -448,10 +448,14 @@ function getCookie(name) {
448448

449449
let studyCluesConversationId = -1;
450450

451-
function appendStudyCluesMessage(messagesEl, role, text) {
451+
function appendStudyCluesMessage(messagesEl, role, text, isHtml = false) {
452452
const bubble = document.createElement("div");
453453
bubble.className = `studyclues-message ${role}`;
454-
bubble.textContent = text;
454+
if (isHtml) {
455+
bubble.innerHTML = text;
456+
} else {
457+
bubble.textContent = text;
458+
}
455459
messagesEl.appendChild(bubble);
456460
messagesEl.scrollTop = messagesEl.scrollHeight;
457461
}
@@ -671,7 +675,7 @@ function createStudyCluesWidget() {
671675
<div class="studyclues-header">
672676
<span>StudyClues</span>
673677
<label class="studyclues-coach-toggle">
674-
<input type="checkbox" id="studyclues-coach-mode" />
678+
<input type="checkbox" id="studyclues-coach-mode" checked />
675679
Coach Mode
676680
</label>
677681
<button class="studyclues-close" aria-label="Close chat">✕</button>
@@ -692,7 +696,7 @@ function createStudyCluesWidget() {
692696
const sendBtn = chat.querySelector(".studyclues-inputbar button");
693697
const coachToggle = chat.querySelector("#studyclues-coach-mode");
694698

695-
let coachMode = false;
699+
let coachMode = coachToggle.checked;
696700
coachToggle.addEventListener("change", () => {
697701
coachMode = coachToggle.checked;
698702
});
@@ -755,15 +759,25 @@ function createStudyCluesWidget() {
755759
const detail = payload?.detail || {};
756760
const studycluesResponse = detail?.response || {};
757761
const llmResponse = studycluesResponse?.llm_response;
762+
const references = studycluesResponse?.references || {};
758763

759764
if (typeof detail.conversation_id === "number") {
760765
studyCluesConversationId = detail.conversation_id;
761766
}
762767

768+
const formattedResponse = (llmResponse || "No response available from StudyClues.").replace(
769+
/\[([^\]]+)\]\(([^)]+)\)/g,
770+
(match, text, key) => {
771+
const url = references[key]?.content_url;
772+
return url ? `<a href="${url}" target="_blank" rel="noopener noreferrer">${text}</a>` : match;
773+
}
774+
);
775+
763776
appendStudyCluesMessage(
764777
messagesEl,
765778
"assistant",
766-
llmResponse || "No response available from StudyClues.",
779+
formattedResponse,
780+
true,
767781
);
768782
} catch (err) {
769783
appendStudyCluesMessage(

0 commit comments

Comments
 (0)