4chan-XZ/src/Miscellaneous/FileInfo.tsx
2023-04-27 22:21:31 +02:00

182 lines
4.4 KiB
TypeScript

import Callbacks from '../classes/Callbacks'
import Filter from '../Filtering/Filter'
import { Conf, E,g } from '../globals/globals'
import h, { isEscaped } from '../globals/jsx'
import ImageCommon from '../Images/ImageCommon'
import $ from '../platform/$'
import $$ from '../platform/$$'
import SW from '../site/SW'
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const FileInfo = {
init() {
if (
!['index', 'thread', 'archive'].includes(g.VIEW) ||
!Conf['File Info Formatting']
) {
return
}
return Callbacks.Post.push({
name: 'File Info Formatting',
cb: this.node,
})
},
node() {
if (!this.file) {
return
}
if (this.isClone) {
let a
for (a of $$('.file-info .download-button', this.file.text)) {
$.on(a, 'click', ImageCommon.download)
}
for (a of $$('.file-info .quick-filter-md5', this.file.text)) {
$.on(a, 'click', Filter.quickFilterMD5)
}
return
}
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,
])
const info = $.el('span', { className: 'file-info' })
FileInfo.format(Conf['fileInfo'], this, info)
return $.prepend(this.file.text, info)
},
format(formatString, post, outputNode) {
let a
const output = []
formatString.replace(/%(.)|[^%]+/g, function (s, c) {
output.push(
$.hasOwn(FileInfo.formatters, c)
? FileInfo.formatters[c].call(post)
: { innerHTML: E(s) }
)
return ''
})
$.extend(outputNode, { innerHTML: E.cat(output) })
for (a of $$('.download-button', outputNode)) {
$.on(a, 'click', ImageCommon.download)
}
for (a of $$('.quick-filter-md5', outputNode)) {
$.on(a, 'click', Filter.quickFilterMD5)
}
},
formatters: {
t() {
return {
innerHTML: E(this.file.url.match(/[^/]*$/)[0]),
[isEscaped]: true,
}
},
T() {
return (
<a href={this.file.url} target="_blank">
{FileInfo.formatters.t.call(this)}
</a>
)
},
l() {
return (
<a href={this.file.url} target="_blank">
{FileInfo.formatters.n.call(this)}
</a>
)
},
L() {
return (
<a href={this.file.url} target="_blank">
{FileInfo.formatters.N.call(this)}
</a>
)
},
n() {
const fullname = this.file.name
const shortname = this.file.url.match(/[^/]*$/)[0]
if (fullname === shortname) {
return { innerHTML: E(fullname), [isEscaped]: true }
} else {
return (
<span class="fnswitch">
<span class="fntrunc">{shortname}</span>
<span class="fnfull">{fullname}</span>
</span>
)
}
},
N() {
return { innerHTML: E(this.file.name), [isEscaped]: true }
},
d() {
return (
<a
href={this.file.url}
download={this.file.name}
class="fa fa-download download-button"
></a>
)
},
f() {
return {
innerHTML:
'<a href="javascript:;" class="fa fa-times quick-filter-md5"></a>',
[isEscaped]: true,
}
},
p() {
return {
innerHTML: this.file.isSpoiler ? 'Spoiler, ' : '',
[isEscaped]: true,
}
},
s() {
return { innerHTML: E(this.file.size), [isEscaped]: true }
},
B() {
return {
innerHTML: Math.round(this.file.sizeInBytes) + ' Bytes',
[isEscaped]: true,
}
},
K() {
return {
innerHTML: Math.round(this.file.sizeInBytes / 1024) + ' KB',
[isEscaped]: true,
}
},
M() {
return {
innerHTML:
Math.round((this.file.sizeInBytes / 1048576) * 100) / 100 + ' MB',
[isEscaped]: true,
}
},
r() {
return { innerHTML: E(this.file.dimensions || 'PDF'), [isEscaped]: true }
},
g() {
return {
innerHTML: this.file.tag ? ', ' + E(this.file.tag) : '',
[isEscaped]: true,
}
},
'%'() {
return { innerHTML: '%', [isEscaped]: true }
},
},
}
export default FileInfo