moth/example-puzzles/example/5/helpers.js

127 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// jshint asi:true
async function helperUpdateAnswer(event) {
let e = event.currentTarget
let value = e.value
let inputs = e.querySelectorAll("input")
if (inputs.length > 0) {
// If there are child input nodes, join their values with commas
let values = []
for (let c of inputs) {
if (c.type == "checkbox") {
if (c.checked) {
values.push(c.value)
}
} else {
values.push(c.value)
}
}
if (e.classList.contains("sort")) {
values.sort()
}
let join = e.dataset.join
if (join === undefined) {
join = ","
}
if (values.length == 0) {
value = "None"
} else {
value = values.join(join)
}
}
// First make any adjustments to the value
if (e.classList.contains("lower")) {
value = value.toLowerCase()
}
if (e.classList.contains("upper")) {
value = value.toUpperCase()
}
// "substrings" answers try all substrings. If any are the answer, they're filled in.
if (e.classList.contains("substring")) {
let validated = null
let anchorEnd = e.classList.contains("anchor-end")
let anchorBeg = e.classList.contains("anchor-beg")
for (let end = 0; end <= value.length; end += 1) {
for (let beg = 0; beg < value.length; beg += 1) {
if (anchorEnd && (end != value.length)) {
continue
}
if (anchorBeg && (beg != 0)) {
continue
}
let sub = value.substring(beg, end)
if (await checkAnswer(sub)) {
validated = sub
}
}
}
value = validated
}
// If anything zeroed out value, don't update the answer field
if (!value) {
return
}
let answer = document.querySelector("#answer")
answer.value = value
answer.dispatchEvent(new InputEvent("input"))
}
function helperRemoveInput(e) {
let item = e.target.parentElement
let container = item.parentElement
item.remove()
var event = new Event("input")
container.dispatchEvent(event)
}
function helperExpandInputs(e) {
let item = e.target.parentElement
let container = item.parentElement
let template = container.firstElementChild
let newElement = template.cloneNode(true)
// Add remove button
let remove = document.createElement("button")
remove.innerText = ""
remove.title = "Remove this input"
remove.addEventListener("click", helperRemoveInput)
newElement.appendChild(remove)
// Zero it out, otherwise whatever's in first element is copied too
newElement.querySelector("input").value = ""
container.insertBefore(newElement, item)
var event = new Event("input")
container.dispatchEvent(event)
}
function helperActivate(e) {
e.addEventListener("input", helperUpdateAnswer)
for (let exp of e.querySelectorAll(".expand")) {
exp.addEventListener("click", helperExpandInputs)
}
}
{
let init = function(event) {
for (let e of document.querySelectorAll(".answer")) {
helperActivate(e)
}
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init)
} else {
init()
}
}