Files
archtika/web-app/src/lib/utils.ts

79 lines
1.9 KiB
TypeScript
Raw Normal View History

2024-08-23 18:43:52 +02:00
import { Marked } from "marked";
import { markedHighlight } from "marked-highlight";
2024-08-23 18:43:54 +02:00
import hljs from "highlight.js";
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-23 18:43:52 +02:00
const createMarkdownParser = () => {
2024-08-23 18:43:54 +02:00
const marked = new Marked();
marked.use({
async: true,
pedantic: false,
gfm: true
});
marked.use(
2024-08-23 18:43:52 +02:00
markedHighlight({
2024-08-23 18:43:54 +02:00
async: true,
langPrefix: "language-",
2024-08-23 18:43:52 +02:00
highlight(code, lang) {
const language = hljs.getLanguage(lang) ? lang : "plaintext";
return hljs.highlight(code, { language }).value;
}
2024-08-23 18:43:52 +02:00
})
);
2024-08-23 18:43:52 +02:00
return marked;
};
2024-08-23 18:43:52 +02:00
const marked = createMarkdownParser();
2024-08-23 18:43:52 +02:00
export const md = async (markdownContent: string) => {
const html = await marked.parse(markdownContent);
2024-08-23 18:43:52 +02:00
return html;
};
2024-08-23 18:43:54 +02:00
// test
export const handleImagePaste = async (event: ClipboardEvent, API_BASE_PREFIX: string) => {
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;
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) +
`![](${fileUrl})` +
target.value.slice(target.selectionStart);
return newContent;
};