Add language-specific syntax highlighting via highlight.js (#802)

* Add language-specific syntax highlighting via highlight.js

- Add highlight.js to our assets CDN for fast load and compliance with the CSP
- See other stylesheets options here: https://cdnjs.com/libraries/highlight.js

* Bonus: set min-height to prevent increasing length of the sessions pane

* Fix references rendering and add highlight.js in public conversation
This commit is contained in:
sabaimran
2024-06-08 15:17:09 +05:30
committed by GitHub
parent 5f2442450c
commit 06a47ee457
3 changed files with 35 additions and 3 deletions

View File

@@ -10,6 +10,8 @@
</head> </head>
<script type="text/javascript" src="./assets/purify.min.js?v={{ khoj_version }}"></script> <script type="text/javascript" src="./assets/purify.min.js?v={{ khoj_version }}"></script>
<script type="text/javascript" src="./assets/markdown-it.min.js"></script> <script type="text/javascript" src="./assets/markdown-it.min.js"></script>
<link rel="stylesheet" href="https://assets.khoj.dev/higlightjs/solarized-dark.min.css">
<script src="https://assets.khoj.dev/higlightjs/highlight.min.js"></script>
<script src="./utils.js"></script> <script src="./utils.js"></script>
<script> <script>
@@ -314,6 +316,13 @@
codeElement.parentNode.insertBefore(parentDiv, codeElement); codeElement.parentNode.insertBefore(parentDiv, codeElement);
// Move the code element into the parent div // Move the code element into the parent div
parentDiv.appendChild(codeElement); parentDiv.appendChild(codeElement);
// Check if hijs has been loaded
if (typeof hljs !== 'undefined') {
// Highlight the code block
hljs.highlightBlock(codeElement);
}
// Add a copy button to each element // Add a copy button to each element
if (willReplace === true) { if (willReplace === true) {
let copyButton = document.createElement('button'); let copyButton = document.createElement('button');
@@ -1353,7 +1362,8 @@
} }
div#side-panel-wrapper { div#side-panel-wrapper {
display: flex display: flex;
min-height: 0;
} }

View File

@@ -30,6 +30,8 @@
<script type="text/javascript" src="/static/assets/purify.min.js?v={{ khoj_version }}"></script> <script type="text/javascript" src="/static/assets/purify.min.js?v={{ khoj_version }}"></script>
<script type="text/javascript" src="/static/assets/utils.js?v={{ khoj_version }}"></script> <script type="text/javascript" src="/static/assets/utils.js?v={{ khoj_version }}"></script>
<script type="text/javascript" src="/static/assets/markdown-it.min.js?v={{ khoj_version }}"></script> <script type="text/javascript" src="/static/assets/markdown-it.min.js?v={{ khoj_version }}"></script>
<link rel="stylesheet" href="https://assets.khoj.dev/higlightjs/solarized-dark.min.css">
<script src="https://assets.khoj.dev/higlightjs/highlight.min.js"></script>
<script> <script>
let welcome_message = ` let welcome_message = `
Hi, I am Khoj, your open, personal AI 👋🏽. I can: Hi, I am Khoj, your open, personal AI 👋🏽. I can:
@@ -447,6 +449,13 @@ To get started, just start typing below. You can also type / to see a list of co
codeElement.parentNode.insertBefore(parentDiv, codeElement); codeElement.parentNode.insertBefore(parentDiv, codeElement);
// Move the code element into the parent div // Move the code element into the parent div
parentDiv.appendChild(codeElement); parentDiv.appendChild(codeElement);
// Check if hijs has been loaded
if (typeof hljs !== 'undefined') {
// Highlight the code block
hljs.highlightBlock(codeElement);
}
// Add a copy button to each code block, if it doesn't already exist // Add a copy button to each code block, if it doesn't already exist
if (willReplace === true) { if (willReplace === true) {
let copyButton = document.createElement('button'); let copyButton = document.createElement('button');

View File

@@ -16,6 +16,9 @@
<!-- To automatically render math in text elements, include the auto-render extension: --> <!-- To automatically render math in text elements, include the auto-render extension: -->
<script defer src="https://assets.khoj.dev/katex/auto-render.min.js" onload="renderMathInElement(document.body);"></script> <script defer src="https://assets.khoj.dev/katex/auto-render.min.js" onload="renderMathInElement(document.body);"></script>
<link rel="stylesheet" href="https://assets.khoj.dev/higlightjs/solarized-dark.min.css">
<script src="https://assets.khoj.dev/higlightjs/highlight.min.js"></script>
</head> </head>
<script type="text/javascript" src="/static/assets/utils.js?v={{ khoj_version }}"></script> <script type="text/javascript" src="/static/assets/utils.js?v={{ khoj_version }}"></script>
<script type="text/javascript" src="/static/assets/markdown-it.min.js?v={{ khoj_version }}"></script> <script type="text/javascript" src="/static/assets/markdown-it.min.js?v={{ khoj_version }}"></script>
@@ -69,12 +72,15 @@ To get started, just start typing below. You can also type / to see a list of co
return `${time_string}, ${date_string}`; return `${time_string}, ${date_string}`;
} }
function generateReference(reference, index) { function generateReference(referenceJson, index) {
let reference = referenceJson.hasOwnProperty("compiled") ? referenceJson.compiled : referenceJson;
let referenceFile = referenceJson.hasOwnProperty("file") ? referenceJson.file : null;
// Escape reference for HTML rendering // Escape reference for HTML rendering
let escaped_ref = reference.replaceAll('"', '&quot;'); let escaped_ref = reference.replaceAll('"', '&quot;');
// Generate HTML for Chat Reference // Generate HTML for Chat Reference
let short_ref = escaped_ref.slice(0, 140); let short_ref = escaped_ref.slice(0, 100);
short_ref = short_ref.length < escaped_ref.length ? short_ref + "..." : short_ref; short_ref = short_ref.length < escaped_ref.length ? short_ref + "..." : short_ref;
let referenceButton = document.createElement('button'); let referenceButton = document.createElement('button');
referenceButton.textContent = short_ref; referenceButton.textContent = short_ref;
@@ -383,6 +389,13 @@ To get started, just start typing below. You can also type / to see a list of co
codeElement.parentNode.insertBefore(parentDiv, codeElement); codeElement.parentNode.insertBefore(parentDiv, codeElement);
// Move the code element into the parent div // Move the code element into the parent div
parentDiv.appendChild(codeElement); parentDiv.appendChild(codeElement);
// Check if hijs has been loaded
if (typeof hljs !== 'undefined') {
// Highlight the code block
hljs.highlightBlock(codeElement);
}
// Add a copy button to each code block, if it doesn't already exist // Add a copy button to each code block, if it doesn't already exist
if (willReplace === true) { if (willReplace === true) {
let copyButton = document.createElement('button'); let copyButton = document.createElement('button');