forked from 505e06b2/Image-to-Braille
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
136 lines (120 loc) · 3.93 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
const settings = {
last_canvas: null,
last_dithering: null,
last_source: "",
width: 62,
greyscale_mode: "luminance",
dark: true,
inverted: false,
dithering: false,
monospace: false,
}
function copyText() {
navigator.clipboard.writeText(document.querySelector("#text").value).then(
// copy success
function () {
let clip_notify = document.querySelector("#clipboard-notify")
clip_notify.innerText = "Copied!"
clip_notify.className = "green"
setTimeout(() => {
clip_notify.innerText = null
clip_notify.className = null
}, 1500)
},
// copy failed
function () {
let clip_notify = document.querySelector("#clipboard-notify")
clip_notify.innerText = "Failed to copy."
clip_notify.className = "red"
setTimeout(() => {
clip_notify.innerText = null
clip_notify.className = null
}, 1500)
}
)
}
function setUIElement(selector, value) {
const elem = document.querySelector(selector)
switch (
elem.getAttribute("type") //should all be <input>
) {
case "checkbox":
elem.checked = value
break
default:
elem.value = value
}
return elem
}
function initUI() {
document.body.ondragover = (e) => e.preventDefault()
document.body.ondrop = (e) => {
e.preventDefault()
loadNewImage(URL.createObjectURL(e.dataTransfer.items[0].getAsFile()))
}
document.body.onpaste = (e) => {
e.preventDefault()
loadNewImage(URL.createObjectURL(e.clipboardData.items[0].getAsFile()))
}
document.body.onkeydown = (e) => {
if (e.ctrlKey && e.key == "a") {
e.preventDefault()
document.querySelector("#text").select()
} else if (e.ctrlKey && e.key == "c") {
e.preventDefault()
copyText()
}
}
//buttons
const refresh = () => parseCanvas(settings.last_canvas) //shorten for compactness
document.querySelector('input[type="file"]').onchange = (e) => {
loadNewImage(URL.createObjectURL(e.target.files[0]))
}
setUIElement("#darktheme", settings.dark).onchange = (e) => {
const element = document.querySelector("#text")
if (e.target.checked) element.classList.add("dark")
else element.classList.remove("dark")
}
setUIElement("#inverted", settings.inverted).onchange = (e) => {
settings.inverted = e.target.checked
refresh()
}
setUIElement("#dithering", settings.dithering).onchange = (e) => {
settings.dithering = e.target.checked
refresh()
}
setUIElement("#monospace", settings.monospace).onchange = (e) => {
settings.monospace = e.target.checked
refresh()
}
document.querySelector("#greyscale_mode").onchange = (e) => {
settings.greyscale_mode = e.target.value
parseCanvas(settings.last_canvas)
}
setUIElement("#width", settings.width).onchange = (e) => {
settings.width = e.target.value
loadNewImage(settings.last_source)
}
document.querySelector("#clipboard").onclick = (e) => {
copyText()
}
}
async function loadNewImage(src) {
if (src === undefined) return
if (settings.last_source && settings.last_source !== src)
URL.revokeObjectURL(settings.last_source)
settings.last_source = src
const canvas = await createImageCanvas(src)
settings.last_canvas = canvas
settings.last_dithering = null
await parseCanvas(canvas)
}
async function parseCanvas(canvas) {
const text = canvasToText(canvas)
document.querySelector("#text").value = text
document.querySelector("#charcount").innerText = text.length
}
window.onload = () => {
initUI()
loadNewImage("https://github.com/zurrty/Image-to-Braille/blob/master/select.png?raw=true")
}