Reverted some files due to bug

This commit is contained in:
Lalle 2023-04-16 22:42:50 +02:00
parent 27d267b4f0
commit 64e532a31a
No known key found for this signature in database
GPG Key ID: A6583D207A8F6B0D
11 changed files with 138 additions and 192 deletions

View File

@ -5,4 +5,4 @@ install:
npm run build npm run build
sneed: clean install sneed: clean install
cat dist/4chan-XT.user.js | xclip -selection clipboard cat dist/4chan-XT.user.js | xclip -selection clipboard

View File

@ -1,20 +1,16 @@
import { Conf, g } from '../globals/globals' import { Conf, g } from '../globals/globals'
import $ from '../platform/$' import $ from '../platform/$'
import type Thread from '../classes/Thread'
import type Post from '../classes/Post' /*
interface Get { * decaffeinate suggestions:
url(type: any, IDs: { siteID: string }, ...args: any[]): string | undefined * DS101: Remove unnecessary use of Array.from
threadExcerpt(thread: Thread): string * DS102: Remove unnecessary code created because of implicit returns
threadFromRoot(root: HTMLElement): Thread | null * DS207: Consider shorter variations of null checks
threadFromNode(node: HTMLElement): Thread | null * Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
postFromRoot(root: HTMLElement): Post | null */
postFromNode(root: HTMLElement): Post | null var Get = {
allQuotelinksLinkingTo(post: Post): HTMLAnchorElement[]
postDataFromLink(link: HTMLAnchorElement): { boardID: string; postID: number }
}
var Get: Get = {
url(type, IDs, ...args) { url(type, IDs, ...args) {
let f: ((IDs: { siteID: string }, ...args: any[]) => string) | undefined, site: typeof g.sites[0] let f, site
if ((site = g.sites[IDs.siteID]) && (f = $.getOwn(site.urls, type))) { if ((site = g.sites[IDs.siteID]) && (f = $.getOwn(site.urls, type))) {
return f(IDs, ...Array.from(args)) return f(IDs, ...Array.from(args))
} else { } else {
@ -47,7 +43,7 @@ interface Get {
}, },
threadFromNode(node) { threadFromNode(node) {
return Get.threadFromRoot( return Get.threadFromRoot(
$.x(`ancestor-or-self::${g.SITE.xpath.threadContainer}[1]`, node)[0], $.x(`ancestor-or-self::${g.SITE.xpath.thread}`, node),
) )
}, },
postFromRoot(root) { postFromRoot(root) {
@ -64,23 +60,20 @@ interface Get {
}, },
postFromNode(root) { postFromNode(root) {
return Get.postFromRoot( return Get.postFromRoot(
$.x(`ancestor-or-self::${g.SITE.xpath.postContainer}`, root)[0], $.x(`ancestor-or-self::${g.SITE.xpath.postContainer}[1]`, root),
) )
}, },
postDataFromLink(link: any) { postDataFromLink(link) {
let boardID: any, postID: any, threadID: any let boardID, postID, threadID
if (link.dataset?.postID) { if (link.dataset.postID) {
// resurrected quote // resurrected quote
({ boardID, threadID, postID } = link.dataset) ;({ boardID, threadID, postID } = link.dataset)
if (!threadID) { if (!threadID) {
threadID = '0' threadID = 0
} }
} else { } else {
const match = link.href.match(g?.SITE?.regexp?.quotelink) const match = link.href.match(g.SITE.regexp.quotelink)
if (!match) { ;[boardID, threadID, postID] = Array.from(match.slice(1))
throw new Error('Invalid link')
}
[boardID, threadID, postID] = match.slice(1)
if (!postID) { if (!postID) {
postID = threadID postID = threadID
} }
@ -90,7 +83,7 @@ interface Get {
threadID: +threadID, threadID: +threadID,
postID: +postID, postID: +postID,
} }
}, },
allQuotelinksLinkingTo(post) { allQuotelinksLinkingTo(post) {
// Get quotelinks & backlinks linking to the given post. // Get quotelinks & backlinks linking to the given post.
const quotelinks = [] const quotelinks = []

View File

@ -1,47 +0,0 @@
import { g, Conf, d } from '../globals/globals'
import $ from '../platform/$'
import Menu from './Menu'
import type Post from '../classes/Post'
var CopyTextLink = {
text: '',
init(): void {
if (
!['index', 'thread'].includes(g.VIEW) ||
!Conf['Menu'] ||
!Conf['Copy Text Link']
) {
return
}
const a: HTMLAnchorElement = $.el('a', {
className: 'copy-text-link',
href: 'javascript:;',
textContent: 'Copy Text',
})
$.on(a, 'click', CopyTextLink.copy)
return Menu.menu.addEntry({
el: a,
order: 12,
open(post: Post): boolean {
CopyTextLink.text = (post.origin || post).commentOrig()
return true
},
})
},
copy() {
const el: HTMLTextAreaElement = $.el('textarea', {
className: 'copy-text-element',
value: CopyTextLink.text,
})
$.add(d.body, el)
el.select()
try {
d.execCommand('copy')
} catch (error) {}
return $.rm(el)
},
}
export default CopyTextLink

View File

@ -3,8 +3,13 @@ import ImageCommon from '../Images/ImageCommon'
import $ from '../platform/$' import $ from '../platform/$'
import Menu from './Menu' 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 = { const DownloadLink = {
init(): void { init() {
if ( if (
!['index', 'thread'].includes(g.VIEW) || !['index', 'thread'].includes(g.VIEW) ||
!Conf['Menu'] || !Conf['Menu'] ||
@ -13,7 +18,7 @@ const DownloadLink = {
return return
} }
const a: HTMLAnchorElement = $.el('a', { const a = $.el('a', {
className: 'download-link', className: 'download-link',
textContent: 'Download file', textContent: 'Download file',
}) })
@ -24,7 +29,7 @@ const DownloadLink = {
return Menu.menu.addEntry({ return Menu.menu.addEntry({
el: a, el: a,
order: 100, order: 100,
open({file}) { open({ file }) {
if (!file) { if (!file) {
return false return false
} }

61
src/Menu/Menu.js Normal file
View File

@ -0,0 +1,61 @@
import Callbacks from '../classes/Callbacks'
import UI from '../General/UI'
import { g, Conf } from '../globals/globals'
import $ from '../platform/$'
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
var Menu = {
init() {
if (!['index', 'thread'].includes(g.VIEW) || !Conf['Menu']) {
return
}
this.button = $.el('a', {
className: 'menu-button',
href: 'javascript:;',
})
$.extend(this.button, { innerHTML: '<i class="fa fa-angle-down"></i>' })
this.menu = new UI.Menu('post')
Callbacks.Post.push({
name: 'Menu',
cb: this.node,
})
return Callbacks.CatalogThread.push({
name: 'Menu',
cb: this.catalogNode,
})
},
node() {
if (this.isClone) {
const button = $('.menu-button', this.nodes.info)
$.rmClass(button, 'active')
$.rm($('.dialog', this.nodes.info))
Menu.makeButton(this, button)
return
}
return $.add(this.nodes.info, Menu.makeButton(this))
},
catalogNode() {
return $.after(this.nodes.icons, Menu.makeButton(this.thread.OP))
},
makeButton(post, button) {
if (!button) {
button = Menu.button.cloneNode(true)
}
$.on(button, 'click', function (e) {
return Menu.menu.toggle(e, this, post)
})
return button
},
}
export default Menu

View File

@ -1,71 +0,0 @@
import Callbacks from '../classes/Callbacks';
import UI from '../General/UI';
import { g, Conf } from '../globals/globals';
import $ from '../platform/$';
interface Post {
isClone?: boolean;
nodes: {
info: HTMLElement;
icons: HTMLElement;
};
thread?: {
OP: Post;
};
}
const Menu = {
button: document.createElement('a'),
menu: new UI.Menu('post'),
init(): void | ReturnType<typeof Callbacks.CatalogThread.push> {
if (!['index', 'thread'].includes(g.VIEW) || !Conf['Menu']) {
return;
}
this.button = $.el('a', {
className: 'menu-button',
href: 'javascript:;',
});
$.extend(this.button, { innerHTML: '<i class="fa fa-angle-down"></i>' });
this.menu = new UI.Menu('post');
Callbacks.Post.push({
name: 'Menu',
cb: this.node,
});
return Callbacks.CatalogThread.push({
name: 'Menu',
cb: this.catalogNode,
});
},
node(this: Post): void | HTMLElement {
if (this.isClone) {
const button = $('.menu-button', this.nodes.info);
$.rmClass(button, 'active');
$.rm($('.dialog', this.nodes.info));
Menu.makeButton(this, button);
return;
}
return $.add(this.nodes.info, Menu.makeButton(this));
},
catalogNode(this: Post): void {
return $.after(this.nodes.icons, Menu.makeButton(this.thread!.OP));
},
makeButton(post: Post, button?: HTMLElement): HTMLElement {
if (!button) {
button = Menu.button.cloneNode(true) as HTMLElement;
}
$.on(button, 'click', function (this: HTMLElement, e: Event) {
return Menu.menu.toggle(e, this, post);
});
return button;
},
};
export default Menu;

View File

@ -2,6 +2,11 @@ import { g, Conf, d } from '../globals/globals'
import $ from '../platform/$' import $ from '../platform/$'
import Menu from './Menu' 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
*/
var ReportLink = { var ReportLink = {
init() { init() {
if ( if (

View File

@ -1,12 +0,0 @@
import { d } from '../globals/globals'
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const $$ = (selector, root = d.body) => [
...Array.from(root.querySelectorAll(selector)),
]
export default $$

6
src/platform/$$.ts Normal file
View File

@ -0,0 +1,6 @@
import { d } from '../globals/globals';
const $$ = (selector: string, root: HTMLElement | null = d.body): Element[] =>
Array.from(root?.querySelectorAll(selector) ?? []) as Element[];
export default $$;

View File

@ -2,29 +2,29 @@ import { g } from '../../globals/globals'
import h, { EscapedHtml } from '../../globals/jsx' import h, { EscapedHtml } from '../../globals/jsx'
export default function generatePostInfoHtml( export default function generatePostInfoHtml(
ID, ID: number,
o, o: any,
subject, subject: string,
capcode, capcode: string,
email, email: string,
name, name: string,
tripcode, tripcode: string,
pass, pass: string,
capcodeLC, capcodeLC: string,
capcodePlural, capcodePlural: string,
staticPath, staticPath: string,
gifIcon, gifIcon: string,
capcodeDescription, capcodeDescription: string,
uniqueID, uniqueID: string,
flag, flag: string,
flagCode, flagCode: string,
flagCodeTroll, flagCodeTroll: string,
dateUTC, dateUTC: string,
dateText, dateText: string,
postLink, postLink: string,
quoteLink, quoteLink: string,
boardID, boardID: string,
threadID, threadID: number,
): EscapedHtml { ): EscapedHtml {
const nameHtml: (EscapedHtml | string)[] = [ const nameHtml: (EscapedHtml | string)[] = [
<span class={`name${capcode ? ' ' + capcode : ''}`}>{name}</span>, <span class={`name${capcode ? ' ' + capcode : ''}`}>{name}</span>,

View File

@ -4,6 +4,11 @@ import $ from '../platform/$'
import { dict } from '../platform/helpers' import { dict } from '../platform/helpers'
import SW from './SW' import SW from './SW'
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
var Site = { var Site = {
defaultProperties: { defaultProperties: {
'4chan.org': { software: 'yotsuba' }, '4chan.org': { software: 'yotsuba' },
@ -14,7 +19,7 @@ var Site = {
'smug.nepu.moe': { canonical: 'smuglo.li' }, 'smug.nepu.moe': { canonical: 'smuglo.li' },
}, },
init(cb: () => void): void { init(cb) {
$.extend(Conf['siteProperties'], Site.defaultProperties) $.extend(Conf['siteProperties'], Site.defaultProperties)
let hostname = Site.resolve() let hostname = Site.resolve()
if (hostname && $.hasOwn(SW, Conf['siteProperties'][hostname].software)) { if (hostname && $.hasOwn(SW, Conf['siteProperties'][hostname].software)) {
@ -23,7 +28,7 @@ var Site = {
} }
return $.onExists(doc, 'body', () => { return $.onExists(doc, 'body', () => {
for (var software in SW) { for (var software in SW) {
var changes = null var changes
if ((changes = SW[software].detect?.())) { if ((changes = SW[software].detect?.())) {
changes.software = software changes.software = software
hostname = location.hostname.replace(/^www\./, '') hostname = location.hostname.replace(/^www\./, '')
@ -50,13 +55,13 @@ var Site = {
}) })
}, },
resolve(url = location.href): string { resolve(url = location) {
let { hostname: hostname } = new URL(url) let { hostname } = url
while (hostname && !$.hasOwn(Conf['siteProperties'], hostname)) { while (hostname && !$.hasOwn(Conf['siteProperties'], hostname)) {
hostname = hostname.replace(/^[^.]*\.?/, '') hostname = hostname.replace(/^[^.]*\.?/, '')
} }
if (hostname) { if (hostname) {
let canonical: string let canonical
if ((canonical = Conf['siteProperties'][hostname].canonical)) { if ((canonical = Conf['siteProperties'][hostname].canonical)) {
hostname = canonical hostname = canonical
} }
@ -64,13 +69,14 @@ var Site = {
return hostname return hostname
}, },
parseURL(url: any): any { parseURL(url) {
const siteID = Site.resolve(url) const siteID = Site.resolve(url)
return Main.parseURL(g.sites[siteID], url) return Main.parseURL(g.sites[siteID], url)
}, },
set(hostname: string) {
set(hostname) {
for (var ID in Conf['siteProperties']) { for (var ID in Conf['siteProperties']) {
var site: HTMLElement var site
var properties = Conf['siteProperties'][ID] var properties = Conf['siteProperties'][ID]
if (properties.canonical) { if (properties.canonical) {
continue continue