async function RenderMarkdown(mountPoint, values) {
if (!values.markdownId) return;
const response = await fetch(`/api/v1/markdowns/${values.markdownId}`);
markdownData = await response.json();
document.title = markdownData.name;
mountPoint.innerHTML = `
`
let doc = mountPoint.querySelector(".markdown_document")
const renderer = {
image(token) {
console.log(token)
let r = /^(.*)#(!?)(\d+)x(!?)(\d+)$/
let matches = token.match(r)
let style = ""
if (matches && matches.length >= 4) {
let [_, src, bx, x, by, y] = matches
token = src
let width = ""
let height = ""
if (+x != 0) {
width = `${bx === '' ? "max-" : ""}width: ${x}px; `
} else {
width = `width: auto; `
}
if (+y != 0) {
height = `${by === '' ? "max-" : ""}height: ${y}px; `
} else {
height = `height: auto; `
}
style = `style="${width}${height}"`
console.log(style)
}
return `
`
}
}
marked.use({ renderer })
doc.innerHTML = marked.parse(markdownData.text)
const save = async () => {
if (view === "markdown") {
markdownData.text = doc.innerText
}
const response = await fetch(`/api/v1/markdowns/${markdownData.id}`,
{
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
method: "PUT",
body: JSON.stringify(markdownData)
})
const result = await response.text();
console.log(result)
setSaveButtonState(false)
}
const save_button = mountPoint.querySelector("#save_button")
save_button.addEventListener('click', async (e) => {
if (e.button !== 0) return
await save()
})
const setSaveButtonState = (needToSave) => {
if (needToSave) {
save_button.classList.remove('boards_sidebar__button')
save_button.classList.add('boards_sidebar__save_button')
} else {
save_button.classList.add('boards_sidebar__button')
save_button.classList.remove('boards_sidebar__save_button')
}
}
setSaveButtonState(false)
doc.addEventListener('input', () => {
setSaveButtonState(true)
})
document.addEventListener('keydown', async e => {
if (e.ctrlKey && e.code === 'KeyS') {
e.preventDefault();
await save()
}
});
let view = "rendered"
const change_view_button = mountPoint.querySelector("#change_view_button")
change_view_button.addEventListener('click', async (e) => {
if (e.button !== 0) return
if (view === "markdown") {
view = "rendered"
markdownData.text = doc.innerText
doc.innerHTML = marked.parse(markdownData.text)
doc.contentEditable = "false"
change_view_button.innerText = "Edit Markdown"
} else if (view === "rendered") {
view = "markdown"
doc.innerText = markdownData.text
doc.contentEditable = "true"
change_view_button.innerText = "View Rendered"
}
})
const addImageButton = mountPoint.querySelector("#add_image_button")
addImageButton.addEventListener('click', async (e) => {
const imageId = await fullScreenImageSelect()
markdownData.text += `\n`
if (view === "markdown") {
doc.innerText = markdownData.text
} else if (view === "rendered") {
doc.innerHTML = marked.parse(markdownData.text)
}
setSaveButtonState(true)
})
document.addEventListener("paste", async (e) => {
for (const file of e.clipboardData.files) {
if (!file.type.startsWith('image/')) return;
const response = await fetch(`/api/v1/images/${file.name}`,
{
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
method: "PUT",
body: await file.arrayBuffer()
})
const imageId = (await response.json()).image;
markdownData.text += `\n`
if (view === "markdown") {
doc.innerText = markdownData.text
} else if (view === "rendered") {
doc.innerHTML = marked.parse(markdownData.text)
}
setSaveButtonState(true)
}
})
}