Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Your web application, titled **"Unity Chat U1 6.6"**, provides an interactive ch
- **Speech Recognition:** Users can dictate messages through voice input, which captures speech and translates it into textual inputs in real-time.

- **Message Handling:**
- **Markdown Support:** AI-generated responses utilize Markdown, enhanced with syntax highlighting (via PrismJS) for clarity in code snippets.
- **Markdown Support:** AI-generated responses utilize Markdown, enhanced with syntax highlighting (via highlight.js) for clarity in code snippets.
- **Image Embedding:** Automatically embeds images generated by Pollinations based on AI conversation content.
- **Editing and Regeneration:** Users can edit their messages or regenerate AI responses conveniently from within the chat interface.

Expand Down Expand Up @@ -88,7 +88,7 @@ Your web application, titled **"Unity Chat U1 6.6"**, provides an interactive ch
---

## **Technical Stack & Dependencies**
- **Frontend:** HTML, CSS, JavaScript, Bootstrap 5, Font Awesome, PrismJS, Marked.js
- **Frontend:** HTML, CSS, JavaScript, Bootstrap 5, Font Awesome, highlight.js, Marked.js
- **Backend:** Node.js (Express), cors, fs for file operations
- **Speech & Multimedia:** Web Speech API for speech synthesis and recognition
- **Persistent Storage:** Local Storage and server-side JSON file storage (`userData.json`)
Expand Down
12 changes: 3 additions & 9 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css">
<link id="hljs-theme-link" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
<link rel="stylesheet" href="js/ui/styles.css">
<link rel="stylesheet" href="js/ui/stylesScreensaver.css">
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
Expand Down Expand Up @@ -466,14 +466,8 @@ <h3 class="modal-title">Voice Chat</h3>
});
}
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-css.min.js" defer></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-json.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-markup.min.js" defer></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js" defer></script>
<script defer src="js/ui/screensaver.js"></script>
<script defer src="js/storage/storage.js"></script>
<script defer src="js/storage/memory-api.js"></script>
Expand Down
8 changes: 4 additions & 4 deletions js/chat/chat-init.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ document.addEventListener("DOMContentLoaded", () => {
if (newTitle && newTitle !== currentSession.name) Storage.renameSession(currentSession.id, newTitle);
}
};
const highlightAllCodeBlocks = () => {
if (!window.Prism) return;
chatBox.querySelectorAll("pre code").forEach(block => Prism.highlightElement(block));
};
const highlightAllCodeBlocks = () => {
if (!window.hljs) return;
chatBox.querySelectorAll("pre code").forEach(block => hljs.highlightElement(block));
};
const appendMessage = ({ role, content, index, imageUrls = [], audioUrls = [] }) => {
const container = document.createElement("div");
container.classList.add("message");
Expand Down
18 changes: 9 additions & 9 deletions js/chat/chat-storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ document.addEventListener("DOMContentLoaded", () => {
}
}
}
function highlightAllCodeBlocks() {
if (!window.Prism) {
return;
}
const codeBlocks = chatBox.querySelectorAll("pre code");
codeBlocks.forEach((block) => {
Prism.highlightElement(block);
});
}
function highlightAllCodeBlocks() {
if (!window.hljs) {
return;
}
const codeBlocks = chatBox.querySelectorAll("pre code");
codeBlocks.forEach((block) => {
hljs.highlightElement(block);
});
}
function appendMessage({ role, content, index, imageUrls = [], audioUrls = [] }) {
const container = document.createElement("div");
container.classList.add("message");
Expand Down
82 changes: 62 additions & 20 deletions js/ui/ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,27 @@ document.addEventListener("DOMContentLoaded", () => {
const clearUserDataBtn = document.getElementById("clear-user-data-btn");
const toggleSimpleModeBtn = document.getElementById("toggle-simple-mode");

let themeLinkElement = document.getElementById("theme-link");
if (!themeLinkElement) {
themeLinkElement = document.createElement("link");
themeLinkElement.id = "theme-link";
themeLinkElement.rel = "stylesheet";
document.head.appendChild(themeLinkElement);
}
let themeLinkElement = document.getElementById("theme-link");
if (!themeLinkElement) {
themeLinkElement = document.createElement("link");
themeLinkElement.id = "theme-link";
themeLinkElement.rel = "stylesheet";
document.head.appendChild(themeLinkElement);
}
let hljsThemeLink = document.getElementById("hljs-theme-link");
if (!hljsThemeLink) {
hljsThemeLink = document.createElement("link");
hljsThemeLink.id = "hljs-theme-link";
hljsThemeLink.rel = "stylesheet";
document.head.appendChild(hljsThemeLink);
}

const allThemes = [
{ value: "light", label: "Light", file: "themes/light.css" },
{ value: "dark", label: "Dark", file: "themes/dark.css" },
{ value: "hacker", label: "Hacker", file: "themes/hacker.css" },
{ value: "oled", label: "OLED Dark", file: "themes/oled.css" },
{ value: "subtle-light", label: "Subtle Light", file: "themes/subtle_light.css" },
const allThemes = [
{ value: "light", label: "Light", file: "themes/light.css" },
{ value: "dark", label: "Dark", file: "themes/dark.css" },
{ value: "hacker", label: "Hacker", file: "themes/hacker.css" },
{ value: "oled", label: "OLED Dark", file: "themes/oled.css" },
{ value: "subtle-light", label: "Subtle Light", file: "themes/subtle_light.css" },
{ value: "burple", label: "Burple", file: "themes/burple.css" },
{ value: "pretty-pink", label: "Pretty Pink", file: "themes/pretty_pink.css" },
{ value: "nord", label: "Nord", file: "themes/nord.css" },
Expand All @@ -61,9 +68,42 @@ document.addEventListener("DOMContentLoaded", () => {
{ value: "ocean-breeze", label: "Ocean Breeze", file: "themes/ocean_breeze.css" },
{ value: "vintage-paper", label: "Vintage Paper", file: "themes/vintage_paper.css" },
{ value: "honeycomb", label: "Honeycomb", file: "themes/honeycomb.css" },
{ value: "rainbow-throwup", label: "Rainbow Throwup", file: "themes/rainbow_throwup.css" },
{ value: "serenity", label: "Serenity", file: "themes/serenity.css" }
];
{ value: "rainbow-throwup", label: "Rainbow Throwup", file: "themes/rainbow_throwup.css" },
{ value: "serenity", label: "Serenity", file: "themes/serenity.css" }
];

const hljsThemeMap = {
light: "github",
dark: "github-dark",
hacker: "a11y-dark",
oled: "atom-one-dark",
"subtle-light": "atom-one-light",
burple: "atom-one-dark",
"pretty-pink": "github",
nord: "nord",
"solarized-light": "solarized-light",
"solarized-dark": "solarized-dark",
"gruvbox-light": "gruvbox-light",
"gruvbox-dark": "gruvbox-dark",
cyberpunk: "atom-one-dark",
dracula: "dracula",
monokai: "monokai",
"material-dark": "atom-one-dark",
"material-light": "atom-one-light",
"pastel-dream": "github",
"ocean-breeze": "github",
"vintage-paper": "github",
honeycomb: "github",
"rainbow-throwup": "github",
serenity: "atom-one-light"
};

const HLJS_BASE = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/";

function updateHighlightTheme(themeValue) {
const hlTheme = hljsThemeMap[themeValue] || "github-dark";
hljsThemeLink.href = `${HLJS_BASE}${hlTheme}.min.css`;
}

function populateThemeDropdowns() {
themeSelect.innerHTML = "";
Expand All @@ -88,17 +128,19 @@ document.addEventListener("DOMContentLoaded", () => {
const savedTheme = localStorage.getItem("selectedTheme") || "dark";
themeSelect.value = savedTheme;
themeSelectSettings.value = savedTheme;
const found = allThemes.find(t => t.value === savedTheme);
themeLinkElement.href = found ? found.file : "themes/dark.css";
const found = allThemes.find(t => t.value === savedTheme);
themeLinkElement.href = found ? found.file : "themes/dark.css";
updateHighlightTheme(savedTheme);
}
loadUserTheme();

function changeTheme(newThemeValue) {
localStorage.setItem("selectedTheme", newThemeValue);
themeSelect.value = newThemeValue;
themeSelectSettings.value = newThemeValue;
const found = allThemes.find(t => t.value === newThemeValue);
themeLinkElement.href = found ? found.file : "";
const found = allThemes.find(t => t.value === newThemeValue);
themeLinkElement.href = found ? found.file : "";
updateHighlightTheme(newThemeValue);
}

themeSelect.addEventListener("change", () => {
Expand Down
11 changes: 11 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"test": "node tests/run-all.mjs"
},
"devDependencies": {
"highlight.js": "^11.11.1",
"marked": "^11.2.0"
}
}