You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.4 KiB
144 lines
3.4 KiB
const EventEmitter = require("events");
|
|
|
|
let linkSignal = null;
|
|
|
|
module.exports = class {
|
|
onCreate(input) {
|
|
this.state = {
|
|
shortName: "",
|
|
name: "",
|
|
text: "",
|
|
nameSuffix: "",
|
|
modal: null,
|
|
removed: false,
|
|
multipart: false,
|
|
anchored: false,
|
|
prevWasText: false,
|
|
}
|
|
|
|
this.mounted = false;
|
|
|
|
this.updatePost(input)
|
|
}
|
|
|
|
open(modal) {
|
|
this.state.modal = modal
|
|
}
|
|
|
|
close() {
|
|
this.state.modal = null
|
|
}
|
|
|
|
move(toPosition) {
|
|
this.emit("move", toPosition)
|
|
}
|
|
|
|
remove() {
|
|
this.state.removed = true
|
|
this.emit("remove")
|
|
}
|
|
|
|
edited(data) {
|
|
this.emit("edited", data)
|
|
}
|
|
|
|
onInput(input) {
|
|
if (this.state == null) {
|
|
return
|
|
}
|
|
|
|
const timediff = Date.parse(input.post.time) - Date.parse(input.prev.time)
|
|
this.state.multipart = (input.post.nick == input.prev.nick && input.prev.multipart !== false) && (Math.abs(timediff) < 60000);
|
|
this.state.prevWasText = (input.prev.kind === "text");
|
|
|
|
this.updatePost(input)
|
|
}
|
|
|
|
onMount() {
|
|
this.linkSignalCallback = () => {
|
|
this.state.anchored = false
|
|
}
|
|
if (linkSignal == null) {
|
|
linkSignal = new EventEmitter()
|
|
linkSignal.setMaxListeners(10000)
|
|
}
|
|
linkSignal.on("signal", this.linkSignalCallback)
|
|
|
|
this.state.anchored = window.location.hash.slice(1) === this.input.post.id;
|
|
}
|
|
|
|
onUnmount() {
|
|
linkSignal.removeListener("signal", this.linkSignalCallback)
|
|
}
|
|
|
|
link() {
|
|
linkSignal.emit("signal")
|
|
this.state.anchored = true
|
|
}
|
|
|
|
updatePost(input) {
|
|
this.state.shortName = input.post.nick.split("_").shift()
|
|
this.state.name = input.post.nick
|
|
this.state.nameSuffix = ""
|
|
|
|
this.state.text = input.post.text.replace(/\x02/g, "**").replace(/\x1D/g, "*").replace(/\`/g, "\\`").trim();
|
|
|
|
// Fix Ctrl-Bs
|
|
let left = false
|
|
this.state.text = this.state.text.replace(/\s*\*\*\s*/g, str => {
|
|
left = !left
|
|
|
|
if (left) {
|
|
return " **"
|
|
} else if (!left) {
|
|
return "** "
|
|
}
|
|
|
|
return str
|
|
})
|
|
|
|
if (this.state.text.startsWith("|")) {
|
|
this.state.name = ""
|
|
this.state.text = this.state.text.slice(1).trim();
|
|
}
|
|
|
|
if (input.post.kind === "text" && !this.state.text.includes("\"") && !this.state.text.includes("\''") && !this.state.text.includes("|")) {
|
|
const colonIndex = this.state.text.indexOf(": ");
|
|
if (colonIndex != -1 && colonIndex < this.state.text.indexOf(" ")) {
|
|
this.state.text = this.state.text.replace(": ", ": \"") + "\"";
|
|
} else {
|
|
this.state.text = '"' + this.state.text + '"'
|
|
}
|
|
}
|
|
|
|
if (this.state.text.charAt(0) == this.state.text.charAt(0).toUpperCase()) {
|
|
this.state.name = ""
|
|
}
|
|
|
|
if (!input.post.nick.startsWith("=")) {
|
|
const postNick = input.post.nick.replace("'s", "").replace("s'", "s")
|
|
for (const character of input.characters) {
|
|
for (const nick of character.nicks) {
|
|
if (nick === postNick) {
|
|
this.state.name = character.name
|
|
this.state.shortName = character.shortName
|
|
|
|
if (input.post.nick.endsWith("'s") || input.post.nick.endsWith("'")) {
|
|
this.state.nameSuffix = (character.shortName.endsWith("s") || character.shortName.endsWith("z")) ? "'" : "'s"
|
|
}
|
|
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
kindClass(prefix) {
|
|
if (this.input.post == null) {
|
|
return
|
|
}
|
|
|
|
return `${prefix}${this.input.post.kind.replace(".", "-")}`
|
|
}
|
|
}
|