Compare commits

...

2 Commits

Author SHA1 Message Date
Lalle
aaa196e3b7
types 2023-05-10 02:20:31 +02:00
Lalle
7cb3ec8b6e
update diagnostic and add types 2023-05-09 23:30:02 +02:00
19 changed files with 1690 additions and 2951 deletions

File diff suppressed because it is too large Load Diff

43
src/General/index.txt Normal file
View File

@ -0,0 +1,43 @@
selectRev: 0,
selectAll: false,
selectMode: false,
showHiddenThreads: false,
changed: false,
currentPage: 0,
currentSort: '',
navLinks: null,
selectSort: null,
selectSize: null,
lastLongOptions: null,
root: null,
button: null,
inputs: null,
pagelist: null,
search: '',
pageNum: 0,
req: null,
isReply: false,
isThread: false,
isClone: false,
enabled: false,
searchInput: null,
hideLabel: null,
lastLongInputs: null,
lastLongThresholds: null,
loaded: false,
liveThreadData: null,
pagesNum: 0,
ID: 0,
thread: null,
threadPosition: 0,
threadsNumPerPage: 0,
notice: null,
nodes: null,
nTimeout: 0,
replyData: null,
replyNodes: null,
sortedThreadIDs: null,
liveThreadDict: null,
parsedThreads: null,
liveThreadIDs: null,
initFinishedFired: false,

View File

@ -79,7 +79,7 @@ const ImageCommon = {
}
}
const threadJSON = g.SITE.urls.threadJSON?.(post)
const threadJSON = g.SITE.urls.threadJSON?.(post, fileObj)
if (!threadJSON) { return }
const parseJSON = function (isArchiveURL) {
let needle, postObj

View File

@ -4,12 +4,7 @@ import $ from "../platform/$"
import { dict } from "../platform/helpers"
import QR from "../Posting/QR"
import Menu from "./Menu"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const DeleteLink = {
auto: [dict(), dict()],
@ -119,8 +114,7 @@ const DeleteLink = {
withCredentials: true,
onloadend() { return DeleteLink.load(link, post, fileOnly, this.response) },
form: $.formData(form)
}
)
})
},
load(link, post, fileOnly, resDoc) {

View File

@ -1,13 +1,8 @@
import { Conf,g } from "../globals/globals"
import { Conf, g } from "../globals/globals"
import ImageCommon from "../Images/ImageCommon"
import $ from "../platform/$"
import Menu from "./Menu"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const DownloadLink = {
init() {
if (!['index', 'thread'].includes(g.VIEW) || !Conf['Menu'] || !Conf['Download Link']) { return }
@ -24,9 +19,9 @@ const DownloadLink = {
return Menu.menu.addEntry({
el: a,
order: 100,
open({file}) {
open({ file }) {
if (!file) { return false }
a.href = file.url
a.href = file.url
a.download = file.name
return true
}

View File

@ -33,7 +33,7 @@ const FileInfo = {
const oldInfo = $.el('span', {className: 'fileText-original'})
$.prepend(this.file.link.parentNode, oldInfo)
$.add(oldInfo, [this.file.link.previousSibling, this.file.link, this.file.link.nextSibling])
$.add(oldInfo, this.file.link)
const info = $.el('span', {className: 'file-info'})
FileInfo.format(Conf['fileInfo'], this, info)

View File

@ -15,12 +15,12 @@ const Flash = {
initReady() {
if ($.hasStorage) {
return $.global(function () { if (JSON.parse(localStorage['4chan-settings'] || '{}').disableAll) { return window.SWFEmbed.init() } })
return $.global(function () { if (JSON.parse(localStorage['4chan-settings'] || '{}').disableAll) { return window.SWFEmbed.init() } }, 'SWFEmbed')
} else {
if (g.VIEW === 'thread') {
$.global(() => window.Main.tid = location.pathname.split(/\/+/)[3])
$.global(() => window.Main.tid = location.pathname.split(/\/+/)[3], 'Main')
}
return $.global(() => window.SWFEmbed.init())
return $.global(() => window.SWFEmbed.init(), 'SWFEmbed')
}
}
}

View File

@ -6,11 +6,7 @@ import $ from "../platform/$"
import $$ from "../platform/$$"
import ExpandComment from "./ExpandComment"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const Fourchan = {
init() {
if ((g.SITE.software !== 'yotsuba') || !['index', 'thread', 'archive'].includes(g.VIEW)) { return }
@ -65,7 +61,7 @@ const Fourchan = {
}
}
}
, false))
, false), 'MathJax')
Callbacks.Post.push({
name: 'Parse [math] tags',
cb: Fourchan.math

View File

@ -1,4 +1,5 @@
import Callbacks from "../classes/Callbacks"
import Post from "../classes/Post"
import { g } from "../globals/globals"
import $ from "../platform/$"
@ -25,12 +26,12 @@ const IDHighlight = {
if (!this.isClone) { return IDHighlight.set(this) }
},
set(post) {
set(post: Post) {
const match = (post.info.uniqueID || post.info.capcode) === IDHighlight.uniqueID
return $[match ? 'addClass' : 'rmClass'](post.nodes.post, 'highlight')
},
click(post) {
click(post: Post) {
return function () {
const uniqueID = post.info.uniqueID || post.info.capcode
IDHighlight.uniqueID = IDHighlight.uniqueID === uniqueID ? null : uniqueID

View File

@ -6,6 +6,7 @@ import { Conf, g } from "../globals/globals"
import $ from "../platform/$"
const IDPostCount = {
thread: null as Thread,
init() {
if ((g.VIEW !== 'thread') || !Conf['Count Posts by ID']) { return }
Callbacks.Thread.push({

View File

@ -10,6 +10,7 @@ import CaptchaT from "./Captcha.t"
import QR from "./QR"
const Captcha = {
replace: CaptchaReplace,
cache: {
init() {
$.on(d, 'SaveCaptcha', e => {

View File

@ -80,7 +80,12 @@ const Quotify = {
// Don't (Dead) when quotifying in an archived post,
// and we know the post still exists.
a = $.el('a', {
href: g.SITE.Build.postURL(boardID, post.thread.ID, postID),
href: g.SITE.Build.postURL({
siteID: boardID,
boardID,
threadID: post.thread.ID,
postID
}),
className: 'quotelink',
textContent: quote
}
@ -88,12 +93,17 @@ const Quotify = {
} else {
// Replace the .deadlink span if we can redirect.
a = $.el('a', {
href: g.SITE.Build.postURL(boardID, post.thread.ID, postID),
href: g.SITE.Build.postURL({
siteID: boardID,
boardID,
threadID: 0,
postID
}),
className: 'quotelink deadlink',
textContent: quote
}
)
$.add(a, Post.deadMark.cloneNode(true))
$.add(a, Post.deadMark.cloneNode(true) as Element)
$.extend(a.dataset, { boardID, threadID: post.thread.ID, postID })
}
@ -108,7 +118,7 @@ const Quotify = {
textContent: quote
}
)
$.add(a, Post.deadMark.cloneNode(true))
$.add(a, Post.deadMark.cloneNode(true) as Element)
if (fetchable) {
// Make it function as a normal quote if we can fetch the post.
$.addClass(a, 'quotelink')
@ -120,7 +130,7 @@ const Quotify = {
if (!this.quotes.includes(quoteID)) { this.quotes.push(quoteID) }
if (!a) {
$.add(deadlink, Post.deadMark.cloneNode(true))
$.add(deadlink, Post.deadMark.cloneNode(true) as Element)
return
}
@ -138,7 +148,11 @@ const Quotify = {
$.before(deadlink, green)
$.add(green, deadlink)
}
return $.replace(deadlink, [...Array.from(deadlink.childNodes)])
return $.replace(deadlink, $.el('span', {
className: 'deadlink',
textContent: deadlink.textContent
}
))
}
}
export default Quotify

View File

@ -7,9 +7,16 @@ export default class CatalogThread {
ID: string | number
thread: Thread
board: Board
nodes: { root: Post; thumb: HTMLElement; icons: any; postCount: number; fileCount: number; pageCount: number; replies: any }
nodes: {
root: Post,
thumb: Element,
icons: Element,
postCount: Element,
fileCount: Element,
pageCount: Element,
replies: Element
}
toString() { return this.ID }
constructor(root: Post, thread: Thread) {
this.thread = thread
this.ID = this.thread.ID + ''

View File

@ -58,6 +58,7 @@ export default class Post {
})()
normalizedOriginal: any
indexRefreshSeen: any
callbacksExecuted: boolean
toString() { return this.ID }

View File

@ -1,23 +0,0 @@
class ShimSet {
elements: Element
size: number
constructor() {
this.elements
this.size = 0
}
has(value) {
return value in this.elements
}
add(value) {
if (this.elements[value]) { return }
this.elements[value] = true
return this.size++
}
delete(value) {
if (!this.elements[value]) { return }
delete this.elements[value]
return this.size--
}
}
if (!('Set' in window)) { window.Set = ShimSet }

View File

@ -10,10 +10,12 @@ declare global {
wrappedJSObject: any
Tegaki: any
FCX: any
Parser: any
}
}
// interfaces might be incomplete
export interface BoardConfig {
code_tags: 1 | 0,
sjis_tags: string,
math_tags: string,
forced_anon: boolean,

View File

@ -239,7 +239,7 @@ $.ajax = (function () {
pageXHR = XMLHttpRequest
}
const r = (function (url: string, options = dict(), cb: Callbacks) {
const r = (function (url: string, options = dict(), cb?: (this: XMLHttpRequest, e: ProgressEvent) => void) {
if (options.responseType == null) { options.responseType = 'json' }
if (!options.type) { options.type = (options.form && 'post') || 'get' }
url = url.replace(/^((?:https?:)?\/\/(?:\w+\.)?(?:4chan|4channel|4cdn)\.org)\/adv\//, '$1//adv/')

View File

@ -74,7 +74,6 @@ const SWTinyboard = {
}
return false
},
ID: 'sw-tinyboard',
parseThreadMetadata(el: HTMLElement) {
const thread = dict()
const op = el.querySelector('.op')
@ -219,6 +218,9 @@ $\
},
Build: {
postURL({ siteID, boardID, threadID, postID }) {
return `${Conf['siteProperties'][siteID]?.root || `http://${siteID}/`}${boardID}/res/${threadID}.html#${postID}`
},
parseJSON(data, board) {
const o = this.parseJSON(data, board)
if (data.ext === 'deleted') {
@ -315,7 +317,7 @@ $\
if (!(info = infoNode.textContent.match(/\((.*,\s*)?([\d.]+ ?[KMG]?B).*\)/))) { return false }
const nameNode = $('.postfilename', text)
$.extend(file, {
name: nameNode ? (nameNode.title || nameNode.textContent) : link.pathname.match(/[^/]*$/)[0],
name: nameNode ? (nameNode.textContent || '').trim() : '',
size: info[2],
dimensions: info[0].match(/\d+x\d+/)?.[0]
})

View File

@ -306,11 +306,19 @@ $\
insertTags(bq) {
let node
for (node of $$('s, .removed-spoiler', bq)) {
$.replace(node, [$.tn('[spoiler]'), ...Array.from(node.childNodes), $.tn('[/spoiler]')])
const nodes = []
const {children} = bq
for (let i = 0; i < children.length; i++) {
if ((node = children[i]) && (node.nodeName === 'A') && (node.textContent === '>>')) {
nodes.push(node)
}
}
for (node of $$('.prettyprint', bq)) {
$.replace(node, [$.tn('[code]'), ...Array.from(node.childNodes), $.tn('[/code]')])
for (const node of nodes) {
const {href} = node
const {textContent} = node.nextSibling
const tag = $.el('a', {href, textContent})
$.after(node, tag)
$.rm(node)
}
},
@ -342,7 +350,7 @@ $\
},
transformBoardList() {
let node
let node = null
const nodes = []
const spacer = () => $.el('span', {className: 'spacer'})
const items = $.X('.//a|.//text()[not(ancestor::a)]', $(SWYotsuba.selectors.boardList))
@ -622,7 +630,7 @@ $\
thread(thread, data, withReplies) {
let root
if (root = thread.nodes.root) {
$.rmAll(root)
$.rmAll(root, thread.OP.nodes.root)
} else {
thread.nodes.root = (root = $.el('div', {
className: 'thread',
@ -678,7 +686,7 @@ $\
'div',
generateCatalogThreadHtml(thread, src, imgClass, data, postCount, fileCount, pageCount, staticPath, gifIcon)
)
$.before(thread.OP.nodes.info, [...Array.from(container.childNodes)])
$.before(thread.OP.nodes.info, container)
for (const br of $$('br', thread.OP.nodes.comment)) {
if (br.previousSibling && (br.previousSibling.nodeName === 'BR')) {
@ -691,7 +699,7 @@ $\
id: `t${thread}`
}
)
if (thread.OP.highlights) { $.addClass(root, ...Array.from(thread.OP.highlights)) }
if (thread.OP.highlights) { $.addClass(root, 'highlight') }
if (!thread.OP.file) { $.addClass(root, 'noFile') }
root.style.cssText = cssText || ''