| <?php |
| /** |
| * Template Name: Build Archives |
| **/ |
| |
| WebKitBuildArchives::object(); |
| |
| class WebKitBuildArchives { |
| |
| private static $object = null; |
| |
| public static $platforms = array( |
| 'mac-catalina-x86_64' => 'Catalina', |
| 'mac-mojave-x86_64' => 'Mojave', |
| 'mac-highsierra-x86_64' => 'High Sierra', |
| ); |
| |
| public static function object() { |
| if (self::$object === null) |
| self::$object = new self(); |
| return self::$object; |
| } |
| |
| private function call ($endpoint, $params = array()) { |
| $url = add_query_arg($params, 'https://q1tzqfy48e.execute-api.us-west-2.amazonaws.com/v2/' . $endpoint); |
| $api = wp_remote_get($url); |
| $response = wp_remote_retrieve_body($api); |
| |
| if (is_wp_error($response)) |
| return $response; |
| |
| return json_decode($response); |
| } |
| |
| public function get_latest($platform_key) { |
| $latest = array(); |
| $cachekey = 'webkit_build_archives_latest_' . $platform_key; |
| |
| if (false !== ($cached = get_transient($cachekey))) |
| return unserialize($cached); |
| |
| $data = $this->call("latest/$platform_key-release"); |
| |
| $latest[$platform_key] = array(); |
| |
| foreach ($data->Items as &$entry) { |
| $revision = new stdClass(); |
| $revision->url = $entry->s3_url->S; |
| $revision->creationTime = $entry->creationTime->N; |
| $latest[$platform_key]["r" . $entry->revision->N] = $revision; |
| } |
| |
| set_transient($cachekey, serialize($latest), 600); // expire cache every 10 minutes |
| |
| return $latest; |
| } |
| |
| } // class WebKitBuildArchives |
| |
| add_action('wp_head', function() { ?> |
| <script type="text/javascript"> |
| (function(document) { |
| document.addEventListener("DOMContentLoaded", function () { |
| |
| var creationTimeNodes = Array.prototype.slice.call(document.getElementsByClassName("date")); |
| for (var timestamp of creationTimeNodes) { |
| var date = new Date(parseInt(timestamp.textContent)); |
| timestamp.textContent = date.toLocaleDateString("en", { |
| "timeZoneName": "short", |
| "minute": "2-digit", |
| "hour": "2-digit", |
| "day": "numeric", |
| "month": "long", |
| "year": "numeric" |
| }) |
| } |
| |
| var tabnav = Array.prototype.slice.call(document.getElementsByClassName("tabnav-link")), |
| currentTab = function(e) { |
| var target = e.target ? e.target : e, |
| currentLink = document.getElementsByClassName("tabnav-link current") |
| if (currentLink.length) |
| currentLink[0].classList.remove("current"); |
| target.classList.add("current"); |
| |
| var results = document.getElementById("results"), |
| currentList = results.getElementsByClassName("current"); |
| if (currentList.length) |
| currentList[0].classList.remove("current"); |
| |
| var list = results.getElementsByClassName(target.classList.item(1))[0]; |
| list.classList.add("current"); |
| }; |
| |
| var currentHash = window.location.hash.length ? window.location.hash.replace("#", "") : "mac-catalina-x86_64"; |
| for (var link of tabnav) { |
| link.addEventListener("click", currentTab); |
| if (link.className.indexOf(currentHash) !== -1) |
| currentTab(link); |
| } |
| |
| }); |
| }(document)) |
| </script> |
| <?php |
| }); |
| |
| add_action('wp_head', function() { |
| echo '<meta name="robots" content="nofollow">'; |
| }); |
| |
| add_filter('the_content', function ($content) { |
| $API = WebKitBuildArchives::object(); |
| |
| $error_markup = '<div class="note"><h2>Error</h2> <p>There was an problem loading the build archives data.</p></div>'; |
| |
| $archives = array(); |
| $tabs = '<nav class="tabnav"><ul class="tabnav-items">'; |
| foreach (WebKitBuildArchives::$platforms as $platform => $label) { |
| $platform_latest = $API->get_latest($platform); |
| if (!empty($platform_latest)) { |
| $archives = array_merge($archives, $platform_latest); |
| $tabs .= '<li class="tabnav-item"><a href="#' . esc_attr($platform) . '" class="tabnav-link ' . esc_attr($platform) . '">' . $label . '</a></li>'; |
| } |
| } |
| |
| $tabs .= '</ul></nav>'; |
| |
| if (empty($archives)) |
| return $error_markup; |
| |
| $lists = ''; |
| ob_start(); |
| foreach ($archives as $platform => $revisions): |
| |
| if (empty($revisions)) { |
| echo '<div class="platform-items ' . esc_attr($platform) . '">' . $error_markup . '</div>'; |
| continue; |
| } |
| ?> |
| |
| <ul class="platform-items <?php echo esc_attr($platform); ?>"> |
| <?php foreach ($revisions as $revision => $entry): ?> |
| <li> |
| <h6><a href="<?php echo esc_url($entry->url); ?>"><?php echo $revision; ?></a></h6> |
| <span class="date"><?php echo intval($entry->creationTime) * 1000; ?></span> |
| </li> |
| <?php endforeach?> |
| </ul> |
| <?php endforeach; |
| $lists .= ob_get_clean(); |
| |
| $content = $tabs . "<div id=\"search-errors\"></div><div id=\"results\">$lists</div>"; |
| |
| return $content; |
| }); |
| |
| get_header(); |
| ?> |
| <style> |
| #archives h1 { |
| text-align: center; |
| } |
| |
| .bodycopy ul > li { |
| line-height: 1; |
| } |
| |
| #results .date { |
| display: block; |
| border: none; |
| font-size: 1.4rem; |
| text-transform: uppercase; |
| padding-left: 0; |
| line-height: 3rem; |
| color: hsl(0, 0%, 87%); |
| color: var(--text-color-light); |
| } |
| |
| .bodycopy ul { |
| list-style: none; |
| margin: 0; |
| padding: 0; |
| } |
| |
| .platform-items li { |
| display: inline-block; |
| flex: 1; |
| min-width: 33%; |
| margin-bottom: 3rem; |
| } |
| |
| .bodycopy .search { |
| position: relative; |
| text-align: center; |
| } |
| |
| .search { |
| position: relative; |
| } |
| |
| .search input { |
| width: 60%; |
| position: relative; |
| left: 2.25rem; |
| padding-right: 4rem; |
| } |
| |
| #search-spinner { |
| left: -2.25rem; |
| position: relative; |
| width: 3rem; |
| height: 3rem; |
| padding: 0.5rem; |
| visibility: hidden; |
| } |
| |
| #search-spinner.searching { |
| visibility: visible; |
| } |
| |
| .tabnav { |
| margin-top: 0px; |
| margin-right: auto; |
| margin-bottom: 3rem; |
| margin-left: auto; |
| padding-top: 0px; |
| padding-right: 0px; |
| padding-bottom: 0px; |
| padding-left: 0px; |
| width: 100%; |
| text-align: center; |
| position: relative; |
| white-space: nowrap; |
| overflow-x: auto; |
| overflow-y: hidden; |
| } |
| |
| .tabnav-items { |
| display: inline-block; |
| margin-top: 0px; |
| margin-right: 0px; |
| margin-bottom: 0px; |
| margin-left: 0px; |
| } |
| |
| .tabnav-item { |
| padding-left: 60px; |
| border-bottom-width: 1px; |
| border-bottom-style: solid; |
| border-bottom-color: hsl(0, 0%, 86.7%); |
| border-bottom-color: var(--horizontal-rule-color); |
| display: inline-block; |
| list-style-type: none; |
| list-style-position: initial; |
| list-style-image: initial; |
| outline-color: initial; |
| outline-style: none; |
| outline-width: initial; |
| } |
| |
| .tabnav-item:first-child { |
| padding-left: 0px; |
| } |
| |
| .tabnav-link { |
| font-size: 1.7rem; |
| line-height: 1; |
| font-weight: 400; |
| letter-spacing: -0.021rem; |
| padding-top: 1.1rem; |
| padding-right: 0px; |
| padding-bottom: 1.1rem; |
| padding-left: 0px; |
| color: rgb(102, 102, 102); |
| text-align: left; |
| text-decoration: none; |
| display: block; |
| margin-bottom: 0.4rem; |
| position: relative; |
| z-index: 0; |
| } |
| |
| .tabnav-link.current { |
| pointer-events: none; |
| color: hsl(0, 0%, 26.7%); |
| color: var(--text-color-heading); |
| text-decoration: none; |
| cursor: default; |
| z-index: 10; |
| } |
| |
| .tabnav-link.current::after { |
| left: 0px; |
| position: absolute; |
| bottom: -5px; |
| width: 100%; |
| border-bottom-width: 1px; |
| border-bottom-style: solid; |
| border-bottom-color: hsl(0, 0%, 26.7%); |
| border-bottom-color: var(--text-color-heading); |
| content: ""; |
| } |
| |
| .tabnav-link:hover { |
| color: hsl(200, 100%, 40%); |
| color: var(--link-color); |
| text-decoration: none; |
| } |
| |
| .platform-items { |
| display: none; |
| } |
| |
| .platform-items.current { |
| display: flex; |
| flex-wrap: wrap; |
| } |
| |
| .platform-items.current .note { |
| flex-grow: 1; |
| } |
| </style> |
| |
| <?php if (have_posts()) : while (have_posts()) : the_post(); ?> |
| |
| <article class="page" id="archives"> |
| |
| <h1><?php before_the_title(); ?><a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h1> |
| |
| <div class="bodycopy"> |
| <?php the_content(); ?> |
| </div> |
| |
| </article> |
| |
| <?php endwhile; endif; ?> |
| |
| <?php get_footer(); ?> |