include ./report.pug mixin post(post, truncate, manage=false, globalmanage=false, ban=false) .anchor(id=post.postId) div(class=`post-container ${post.thread || ban === true ? '' : 'op'}` data-board=post.board data-post-id=post.postId data-user-id=post.userId) - const postURL = `/${post.board}/${modview ? 'manage/' : ''}thread/${post.thread || post.postId}.html`; .post-info span.noselect label if globalmanage input.post-check(type='checkbox', name='globalcheckedposts' value=post._id) else if !ban input.post-check(type='checkbox', name='checkedposts' value=post.postId) | if manage - const ip = permLevel > ipHashPermLevel ? post.ip.single.slice(-10) : post.ip.single; a.bold(href=`${upLevel ? '../' : ''}recent.html?ip=${encodeURIComponent(ip)}`) [#{ip}] else if modview a.bold(href=`${upLevel ? '../' : ''}recent.html?postid=${post.postId}`) [+] else if globalmanage - const ip = permLevel > ipHashPermLevel ? post.ip.single.slice(-10) : post.ip.single; a.bold(href=`?ip=${encodeURIComponent(ip)}`) [#{ip}] | if !post.thread include ../includes/posticons.pug if post.subject span.post-subject #{post.subject} | if post.email a.post-name(href=`mailto:${post.email}`) #{post.name} else span.post-name #{post.name} | if post.country && post.country.code span(class=`flag flag-${post.country.code.toLowerCase()}` title=post.country.name alt=post.country.name) | if post.tripcode span.post-tripcode #{post.tripcode} | if post.capcode span.post-capcode #{post.capcode} | - const postDate = new Date(post.date); time.post-date.reltime(datetime=postDate.toISOString()) #{postDate.toLocaleString(undefined, { hour12:false })} | if post.userId span.user-id(style=`background-color: #${post.userId}`) #{post.userId} | span.post-links a.noselect.no-decoration(href=`${postURL}#${post.postId}`) No. span.post-quoters a.no-decoration(href=`${postURL}#postform`) #{post.postId} if !post.thread | span.noselect: a(href=`${postURL}#postform`) [Reply] | select.jsonly.postmenu option Hide if post.userId option Hide by ID .post-data if post.files.length > 0 .post-files(class=(post.files.length > 1 ? 'fn' : '')) each file in post.files .post-file span.post-file-info span: a(href='/file/'+file.filename title='Download '+file.originalFilename download=file.originalFilename) #{post.spoiler ? 'Spoiler File' : file.originalFilename} br span | (#{file.sizeString} if file.geometryString | , #{file.geometryString} if file.durationString | , #{file.durationString} | ) - const type = file.mimetype.split('/')[0] .post-file-src(data-type=type data-attachment=(file.attachment ? "true" : "false")) a(target='_blank' href=`/file/${file.filename}`) if post.spoiler div.spoilerimg.file-thumb else if file.attachment div.attachmentimg.file-thumb else if type === 'audio' div.audioimg.file-thumb else if file.hasThumb img.file-thumb(src=`/file/thumb-${file.hash}${file.thumbextension}` height=file.geometry.thumbheight width=file.geometry.thumbwidth loading='lazy') else img.file-thumb(src=`/file/${file.filename}` height=file.geometry.height width=file.geometry.width loading='lazy') - if (post.message && modview) { post.message = post.message.replace(new RegExp(`