hellgate/preload.js

84 lines
2.7 KiB
JavaScript

const { contextBridge, ipcRenderer } = require("electron")
window.stop()
function md_parse(selector) {
var data = ""
var readme_elements = document.querySelector(selector).children
for (let i = 0; i < readme_elements.length; i++) {
let element = readme_elements[i]
let tag_name = element.tagName
if (tag_name.startsWith("H") && tag_name.length === 2) {
let header_lvl = tag_name[1]
data += "\n" + "#".repeat(header_lvl) + " " + element.innerText
} else if (tag_name === "P") {
data += element.innerText
} else if (tag_name === "UL") {
let list_items = element.children
for (let j = 0; j < list_items.length ; j++) {
list_item = list_items[j]
data += "\n* " + list_item.innerText.replaceAll("\n", "\n\t - ")
}
} else if (tag_name === "PRE") {
data += "```\n" + element.innerText + "\n```\n"
} else {
data += "```\n" + element.innerText + "\n```\n"
}
data += "\n"
}
return data
}
function escape_gemtext(string) {
return string.replaceAll(/\n\*/g, "\n *")
.replaceAll(/\n>/g, "\n >")
.replaceAll(/\n#/g, "\n #")
.replaceAll(/^```/g, " ```")
.replaceAll(/\n```/g, "\n ```")
}
function abs_href(href) {
var current_site = window.location.protocol + "//" + window.location.hostname
if (href.indexOf("http://") === 0 || href.indexOf("https://") === 0) {
return "?" + href
} else if (href.indexOf("gemini://") === 0) {
return href
} else if (href.startsWith("/")) {
return "?" + current_site + href
} else {
return "?" + window.location.href + href
}
}
function simple_convert() {
var title = window.document.title
var link_elements = document.getElementsByTagName("a")
var pre_elements = document.getElementsByTagName("pre")
var gemtext
if (title) { title = "# " + title + "\n\n" }
for (let link_element of link_elements) {
let href = link_element.getAttribute("href")
if (href === null) { continue }
link_element.innerText = "\n=> " + abs_href(href) + " " + link_element.innerText + "\n"
}
gemtext = escape_gemtext(document.getRootNode().children[0].innerText)
return title + gemtext
}
contextBridge.exposeInMainWorld(
"electron",
{
send_gemtext: (gemtext) => {
ipcRenderer.send("page-gemtext", gemtext)
},
request_sigil: (sigil_name) => {
return ipcRenderer.invoke("request-sigil", sigil_name)
},
default_sigil: simple_convert,
escape_gemtext: escape_gemtext,
abs_href: abs_href,
md_parse: md_parse,
}
)