Something went wrong. Try again.
@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
Something went wrong. Try again.
2.0 kB · 66 lines
PHP
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667<?php
final class PHUIDiffInlineThreader extends Phobject {
public function reorderAndThreadCommments(array $comments) { $comments = msort($comments, 'getID');
// Build an empty map of all the comments we actually have. If a comment // is a reply but the parent has gone missing, we don't want it to vanish // completely. $comment_phids = mpull($comments, 'getPHID'); $replies = array_fill_keys($comment_phids, array());
// Now, remove all comments which are replies, leaving only the top-level // comments. foreach ($comments as $key => $comment) { $reply_phid = $comment->getReplyToCommentPHID(); if (isset($replies[$reply_phid])) { $replies[$reply_phid][] = $comment; unset($comments[$key]); } }
// For each top level comment, add the comment, then add any replies // to it. Do this recursively so threads are shown in threaded order. $results = array(); foreach ($comments as $comment) { $results[] = $comment; $phid = $comment->getPHID(); $descendants = $this->getInlineReplies($replies, $phid, 1); foreach ($descendants as $descendant) { $results[] = $descendant; } }
// If we have anything left, they were cyclic references. Just dump // them in a the end. This should be impossible, but users are very // creative. foreach ($replies as $phid => $comments) { foreach ($comments as $comment) { $results[] = $comment; } }
return $results; }
private function getInlineReplies(array &$replies, $phid, $depth) { $comments = idx($replies, $phid, array()); unset($replies[$phid]);
$results = array(); foreach ($comments as $comment) { $results[] = $comment; $descendants = $this->getInlineReplies( $replies, $comment->getPHID(), $depth + 1); foreach ($descendants as $descendant) { $results[] = $descendant; } }
return $results; }}