mirror of
https://github.com/LalleSX/4chan-XZ.git
synced 2026-01-30 09:48:12 +01:00
Reverted some files due to bug
This commit is contained in:
parent
27d267b4f0
commit
64e532a31a
2
Makefile
2
Makefile
@ -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
|
||||||
@ -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 = []
|
||||||
@ -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
|
|
||||||
@ -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
61
src/Menu/Menu.js
Normal 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
|
||||||
@ -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;
|
|
||||||
@ -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 (
|
||||||
|
|||||||
@ -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
6
src/platform/$$.ts
Normal 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 $$;
|
||||||
@ -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>,
|
||||||
|
|||||||
@ -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
|
||||||
Loading…
x
Reference in New Issue
Block a user