2024-08-23 18:43:52 +02:00
|
|
|
import { Marked } from "marked";
|
2024-08-04 16:15:09 +02:00
|
|
|
import hljs from "highlight.js";
|
2024-08-23 18:43:52 +02:00
|
|
|
import { markedHighlight } from "marked-highlight";
|
2024-08-04 16:15:09 +02:00
|
|
|
|
2024-07-31 07:23:32 +02:00
|
|
|
export const sortOptions = [
|
|
|
|
|
{ value: "creation-time", text: "Creation time" },
|
|
|
|
|
{ value: "last-modified", text: "Last modified" },
|
|
|
|
|
{ value: "title-a-to-z", text: "Title - A to Z" },
|
|
|
|
|
{ value: "title-z-to-a", text: "Title - Z to A" }
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
export const ALLOWED_MIME_TYPES = ["image/jpeg", "image/png", "image/svg+xml", "image/webp"];
|
2024-08-04 16:15:09 +02:00
|
|
|
|
2024-08-23 18:43:52 +02:00
|
|
|
const createMarkdownParser = () => {
|
|
|
|
|
const marked = new Marked(
|
|
|
|
|
markedHighlight({
|
|
|
|
|
langPrefix: "hljs language-",
|
|
|
|
|
highlight(code, lang) {
|
|
|
|
|
const language = hljs.getLanguage(lang) ? lang : "plaintext";
|
|
|
|
|
return hljs.highlight(code, { language }).value;
|
2024-08-18 18:17:59 +02:00
|
|
|
}
|
2024-08-23 18:43:52 +02:00
|
|
|
})
|
|
|
|
|
);
|
2024-08-18 18:17:59 +02:00
|
|
|
|
2024-08-23 18:43:52 +02:00
|
|
|
marked.use({
|
|
|
|
|
async: true,
|
|
|
|
|
pedantic: false,
|
|
|
|
|
gfm: true
|
|
|
|
|
});
|
2024-08-18 18:17:59 +02:00
|
|
|
|
2024-08-23 18:43:52 +02:00
|
|
|
return marked;
|
|
|
|
|
};
|
2024-08-18 18:17:59 +02:00
|
|
|
|
2024-08-23 18:43:52 +02:00
|
|
|
const marked = createMarkdownParser();
|
2024-08-18 18:17:59 +02:00
|
|
|
|
2024-08-23 18:43:52 +02:00
|
|
|
export const md = async (markdownContent: string) => {
|
|
|
|
|
const html = await marked.parse(markdownContent);
|
2024-08-18 18:17:59 +02:00
|
|
|
|
2024-08-23 18:43:52 +02:00
|
|
|
return html;
|
|
|
|
|
};
|
2024-08-14 19:33:41 +02:00
|
|
|
|
2024-08-19 20:33:23 +02:00
|
|
|
export const handleImagePaste = async (event: ClipboardEvent, API_BASE_PREFIX: string) => {
|
2024-08-19 19:31:41 +02:00
|
|
|
const clipboardItems = Array.from(event.clipboardData?.items || []);
|
|
|
|
|
const file = clipboardItems.find((item) => item.type.startsWith("image/"));
|
|
|
|
|
|
2024-08-20 19:17:05 +02:00
|
|
|
if (!file) return null;
|
2024-08-19 19:31:41 +02:00
|
|
|
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
|
|
|
|
|
const fileObject = file.getAsFile();
|
|
|
|
|
|
|
|
|
|
if (!fileObject) return;
|
|
|
|
|
|
|
|
|
|
const formData = new FormData();
|
|
|
|
|
formData.append("file", fileObject);
|
|
|
|
|
|
|
|
|
|
const request = await fetch("?/pasteImage", {
|
|
|
|
|
method: "POST",
|
|
|
|
|
body: formData
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const response = await request.json();
|
|
|
|
|
const fileId = JSON.parse(response.data)[1];
|
|
|
|
|
const fileUrl = `${API_BASE_PREFIX}/rpc/retrieve_file?id=${fileId}`;
|
|
|
|
|
|
|
|
|
|
const target = event.target as HTMLTextAreaElement;
|
|
|
|
|
const newContent =
|
|
|
|
|
target.value.slice(0, target.selectionStart) +
|
|
|
|
|
`` +
|
|
|
|
|
target.value.slice(target.selectionStart);
|
|
|
|
|
|
|
|
|
|
return newContent;
|
|
|
|
|
};
|