private static function fuukaFormat(Post $post) : array { $fuukaData = ['doc_id' => $post->getDocId(), 'num' => $post->getNo(), 'subnum' => 0, 'thread_num' => $post->getThreadId(), 'op' => $post->getNo() == $post->getThreadId() ? 1 : 0, 'fourchan_date' => $post->getChanTime(), 'timestamp' => $post->getTime(), 'name' => $post->name, 'name_processed' => $post->getName(), 'email' => $post->email, 'email_processed' => $post->getEmail(), 'trip' => $post->trip, 'trip_processed' => $post->getTripcode(), 'poster_hash_processed' => $post->getID(), 'poster_hash' => $post->id, 'comment_sanitized' => Yotsuba::toBBCode($post->getComment()), 'comment' => Yotsuba::toBBCode($post->getComment()), 'comment_processed' => $post->getComment(), 'title' => $post->sub, 'title_processed' => $post->getSubject()]; if ($post->hasImage()) { $fuukaData['media'] = ['op' => $post->getThreadId() == $post->getNo() ? 1 : 0, 'preview_w' => $post->getThumbWidth(), 'preview_h' => $post->getThumbHeight(), 'media_filename' => $post->getFullFilename(), 'media_filename_processed' => $post->getFullFilename(), 'media_w' => $post->getWidth(), 'media_h' => $post->getHeight(), 'media_size' => $post->getFilesize(), 'media_hash' => base64_encode($post->getMD5Bin()), 'media_orig' => $post->getTim() . $post->getExtension(), 'media' => $post->getTim() . $post->getExtension(), 'preview_reply' => $post->getTim() . "s.jpg", 'remote_media_link' => $post->getImgUrl(), 'media_link' => $post->getImgUrl(), 'thumb_link' => $post->getThumbUrl()]; } else { $fuukaData['media'] = null; } return $fuukaData; }
private function renderSwfBoard(int $page) { $threads = $this->board->getPage($page); $pages = $this->renderPageNumbers($page); $main = div('', 'board'); $main->append($pages); $main->append("<table class='flashListing' style='border:none;'>" . "<tbody>" . "<tr>" . "<td class='postblock'>No.</td><td class='postblock'>Name</td>" . "<td class='postblock'>File</td><td class='postblock'></td>" . "<td class='postblock'>Tag</td><td class='postblock'>Subject</td>" . "<td class='postblock'>Size</td><td class='postblock'>Date</td>" . "<td class='postblock'>Replies</td><td class='postblock'></td>" . "</tr>"); $nums = array_map(function (Thread $thread) { return $thread->getThreadId(); }, $threads); sort($nums); $nums = array_slice($nums, 0, 5); foreach ($threads as $thread) { $thread->loadOP(); $op = $thread->getPost(0); $preview = $op->getSubject() != "" ? $op->getSubject() : ($op->hasComment() ? Yotsuba::toBBCode($op->com) : ""); $highlight = array_search($thread->getThreadId(), $nums) ? " class='highlightPost'" : ""; $repostSearch = "/" . $this->board->getName() . "/search/md5/" . $op->getMD5Hex(); $tr = "<tr{$highlight}>" . "<td>{$op->getNo()}</td>" . "<td class='name-col'><span class='name'>{$op->getName()}</span>" . ($op->getTripcode() != '' ? " <span class='postertrip'>{$op->getTripcode()}</span>" : "") . "</td>" . "<td>[<a href='" . $op->getSwfUrl() . "' title='" . str_replace("'", "'", $op->getFilename()) . "' data-width='{$op->getWidth()}' data-height='{$op->getHeight()}' target='_blank'>" . (mb_strlen($op->getFilename()) > 30 ? mb_substr($op->getFilename(), 0, 25) . "(...)" : $op->getFilename()) . "</a>]</td>" . "<td>[<a href='{$repostSearch}'>Reposts</a>]</td>" . "<td>[" . str_replace("O", "?", substr($thread->getTag(), 0, 1)) . "]</td>" . "<td class='subject'><span title='" . str_replace("'", "'", $preview) . "'>" . (mb_strlen($preview) > 30 ? mb_substr($preview, 0, 30) . "(...)" : $preview) . "</span></td>" . "<td>" . human_filesize($op->getFilesize(), 2) . "</td>" . "<td>" . date("Y-m-d(D)H:i", $op->getTime()) . "</td>" . "<td>{$thread->getChanPosts()}</td>" . "<td>[<a href='thread/{$op->getNo()}'>View</a>]</td>" . "</tr>"; $main->append($tr); } $main->append("</tbody></table><br>"); $main->append($pages); $this->appendToBody($main); }
/** * Naiive attempt at making an imageboard. * * @todo: Make this not as spaghetti * * @return string * @throws Exception * @throws \NotFoundException */ static function post() : string { srand((int) (microtime(true) * 1000)); if (post('captcha') != $_SESSION['captcha']) { $_SESSION['captcha'] = rand(100000, 999999); throw new Exception("Invalid Captcha"); } $_SESSION['captcha'] = rand(100000, 999999); $model = Model::get(); if (post('mode') != 'regist') { throw new Exception("invalid mode"); } $board = $model->getBoard(post('board')); if ($board->isArchive()) { throw new Exception("Board is an archive"); } $name = post('name', 'Anonymous'); if ($name == '') { $name = 'Anonymous'; } $trip = Yotsuba::parseTripcode($name); if ($trip == false) { $trip = null; } else { $trip = '!' . $trip; } $name = strtok($name, '#'); $com = post('com'); if ($com == '') { $com = null; } $file = self::checkUploadedFile(); if ($com == null && $file == null) { throw new Exception("Post must contain image"); } $post = $model->addPost($board, post('resto', 0), htmlspecialchars($name), $trip, htmlspecialchars(post('email')), htmlspecialchars(post('sub')), $com, $file); // auto-noko return "/{$board->getName()}/thread/{$post->getThreadId()}"; }
private static function transformHtml(Post $p) : string { return Yotsuba::parseBBCode($p); }