*/ function GetApiResults(string $api_url): mixed { $response = file_get_contents($api_url); return json_decode($response, true); } /** * Formats a given set of API results into an HTML section * * @access public * @param mixed $api_results The decoded API results * @param string $inline_title The

title to use in the HTML * @return string $html_output The formatted HTML result of stories from the API or the error message * @author cmc */ function ParseStories(mixed $api_results, string $inline_title): string { if ($api_results == "null") { return '

ERROR: Stories not found. API returned `null`.

'; } else { $html_output = '

' . $inline_title . '

'; for ($i = 0; $i < count($api_results); $i++) { $story_api_results = GetApiResults('https://hacker-news.firebaseio.com/v0/item/' . $api_results[$i] . '.json'); $html_output .= ConstructStory($story_api_results); } return $html_output; } } /** *Extract a user's profile from Hacker News API and format in HTML * * @access public * @param mixed $api_results The decoded API results * @param string $inline_title The

title to use in the HTML * @return string $html_output The formatted HTML result of stories from the API * @author cmc */ function ParseUser(mixed $api_results, string $inline_title): string { if ($api_results == "null") { return '

ERROR: User not found.

'; } else { $about = $api_results['about']; $karma = $api_results['karma']; $created = date('Y-m-d h:m:s', $api_results['created']); $html_output = <<

$inline_title

About: $about

Karma: $karma

Created:


Recently Submitted

EOT; $limit = (count($api_results['submitted']) > 10) ? 10 : count($api_results['submitted']); if (count($api_results['submitted']) > 0) { for ($i = 0; $i < $limit; $i++) { $user_api_results = GetApiResults('https://hacker-news.firebaseio.com/v0/item/' . $api_results['submitted'][$i] . '.json'); $html_output .= GetItem($user_api_results); } } else { $html_output .= '

User has no submissions.

'; } return $html_output; } } /** * Formats one specific item requested by the user * * @access public * @param mixed $api_results The decoded API results * @param string $inline_title The

title to use in the HTML * @return string $html_output The formatted HTML result of stories from the API or the error message * @author cmc */ function ParseItem(mixed $api_results, string $inline_title): string { // TODO: Need to create a page specifially for /item/ requests // TODO: Use the GetItem() and Construct*() functions below, then output in it's own page - possibly with a single parent and descendat, if exist return 'TODO'; } /** * Formats one item from the API to HTML * * @access public * @param mixed $api_results The decoded API results * @return string The formatted HTML result of stories from the API or the error message * @author cmc */ function GetItem(mixed $api_results): string { $type = $api_results['type']; return match ($type) { 'story', 'job' => ConstructStory($api_results), 'comment' => ConstructComment($api_results), 'poll' => ConstructPoll($api_results), 'pollopt' => ConstructPollOpt($api_results), default => 'ERROR: Item type not found.', }; } /** * Creates a story HTML element * * @access public * @param mixed $api_results The decoded API results * @return string The formatted HTML result of stories from the API or the error message * @author cmc */ function ConstructStory(mixed $api_results): string { $id = $api_results['id']; $url = $api_results['url']; $title = $api_results['title']; $time = date('Y-m-d h:m:s', $api_results['time']); $by = $api_results['by']; $score = $api_results['score']; $descendants = $api_results['descendants']; return << $title

by $by | $score points | $descendants comments

EOT; } /** * Creates a story discussion page with comments * * @access public * @return string The formatted HTML result of stories from the API or the error message * @author cmc */ function ConstructStoryDiscussion(): string { // TODO: Create discussion page, using mostly the same details as ConstructStory - except you need to check for $api_results['text'] to see if the poster left text in addition to the link. // : Also need to show comments (at least a list of top level ones to start) return 'TODO'; } /** * Creates a comment HTML element * * @access public * @param mixed $api_results The decoded API results * @return string The formatted HTML result of stories from the API or the error message * @author cmc */ function ConstructComment($api_results): string { $time = date('Y-m-d h:m:s', $api_results['time']); $text = $api_results['text']; $parent = $api_results['parent']; return <<

$text

Submitted in response to: $parent

EOT; } /** * Creates a poll HTML element * * @access public * @param mixed $api_results The decoded API results * @return string The formatted HTML result of stories from the API or the error message * @author cmc */ function ConstructPoll($api_results): string { return 'TODO'; } /** * Creates a poll-option HTML element * * @access public * @param mixed $api_results The decoded API results * @return string The formatted HTML result of stories from the API or the error message * @author cmc */ function ConstructPollOpt($api_results): string { return 'TODO'; }