Added a dark mode color scheme.
[WebKit-https.git] / Websites / webkit.org / wp-content / themes / webkit / functions.php
index 37e8fb6..b10e7f9 100644 (file)
@@ -7,8 +7,16 @@ add_action( 'init', function () {
     register_nav_menu('site-nav', __( 'Site Navigation' ));
     register_nav_menu('footer-nav', __( 'Footer Navigation' ));
     register_nav_menu('sitemap', __( 'Site Map Page' ));
+    register_nav_menu('feature-subnav', __( 'Feature Page Buttons' ));
 } );
 
+//add_action( 'wp_header', 'include_invert_lightness_filter');
+
+add_action( 'wp_dashboard_setup', function () {
+    $SurveyWidget = new WebKit_Nightly_Survey();
+    $SurveyWidget->add_widget();
+});
+
 function modify_contact_methods($profile_fields) {
 
     // Add new fields
@@ -23,7 +31,7 @@ function modify_contact_methods($profile_fields) {
 function get_nightly_build ($type = 'builds') {
     if (!class_exists('SyncWebKitNightlyBuilds'))
         return false;
-    
+
     $WebKitBuilds = SyncWebKitNightlyBuilds::object();
     $build = $WebKitBuilds->latest($type);
     return $build;
@@ -36,7 +44,7 @@ function get_nightly_source () {
 function get_nightly_archives ($limit) {
     if (!class_exists('SyncWebKitNightlyBuilds'))
         return array();
-    
+
     $WebKitBuilds = SyncWebKitNightlyBuilds::object();
     $builds = $WebKitBuilds->records('builds', $limit);
     return (array)$builds;
@@ -96,7 +104,20 @@ add_filter('query_vars', function( $query_vars ) {
 
 add_filter('the_title', function( $title ) {
     if ( is_admin() ) return $title;
-    $title = str_replace(": ", ":<br>", $title);
+    if ( is_feed() ) return $title;
+
+    $title = str_replace(": ", ": <br>", $title);
+
+    $nowrap_strings = array();
+    if ($nowrap_setting = get_option("webkit_org_nowrap_strings")) {
+        $nowrap_strings = explode("\n", $nowrap_setting);
+    } else add_option("webkit_org_nowrap_strings", "\n");
+
+    foreach ($nowrap_strings as $token) {
+        $nobreak = str_replace(" ", " ", trim($token));
+        $title = str_replace(trim($token), $nobreak, $title);
+    }
+
     return $title;
 });
 
@@ -147,11 +168,18 @@ add_action('the_post', function($post) {
     // Transform Markdown
     $Markdown = WPCom_Markdown::get_instance();
     $foreword = wp_unslash( $Markdown->transform($foreword) );
-    
+
     $post->post_content = '<div class="foreword">' . $foreword . '</div>' . $content;
     $pages = array($post->post_content);
 });
 
+add_filter('the_author', function($display_name) {
+    $post = get_post();
+    if (!(is_single() || is_page())) return;
+    $byline = get_post_meta(get_the_ID(), 'byline', true);
+    return empty($byline) ? $display_name : $byline;
+});
+
 function before_the_title() {
     $post = get_post();
 
@@ -176,6 +204,11 @@ add_filter( 'get_the_excerpt', function( $excerpt ) {
 
 });
 
+function show_404_page() {
+    status_header(404);
+    return include( get_query_template( '404' ) );
+}
+
 include('widgets/post.php');
 include('widgets/icon.php');
 include('widgets/twitter.php');
@@ -204,7 +237,33 @@ function is_super_cache_enabled() {
     return (isset($super_cache_enabled) && true === $super_cache_enabled);
 }
 
-function tag_post_image_luminance( $post_id ) {
+function include_post_icons() {
+    echo WebKit_Post_Icons::parse_icons();
+}
+
+function include_invert_lightness_filter() {
+    include('images/invert-lightness.svg');
+}
+
+function get_post_icon() {
+
+    $categories = get_the_category();
+    if (isset($categories[0]))
+        $slug = $categories[0]->slug;
+
+    if ('web-inspector' == $slug) {
+        $tags = get_the_tags();
+        if (isset($tags[0]))
+            $slug = $tags[0]->slug;
+    }
+
+    if (!WebKit_Post_Icons::has_icon($slug))
+        return 'default';
+
+    return $slug;
+}
+
+function tag_post_image_luminance($post_id) {
     $threshold = 128;
     $tags = array();
 
@@ -280,7 +339,7 @@ function html_select_options(array $list, $selected = null, $values = false, $ap
             if ( is_array($text) ) {
                 $label = $value;
                 $_ .= '<optgroup label="' . esc_attr($label) . '">';
-                $_ .= self::menuoptions($text, $selected, $values);
+                $_ .= html_select_options($text, $selected, $values);
                 $_ .= '</optgroup>';
                 continue;
             } else $_ .= "<option$value_attr$selected_attr>$text</option>";
@@ -398,6 +457,31 @@ class Responsive_Toggle_Walker_Nav_Menu extends Walker_Nav_Menu {
 
 }
 
+class WebKit_Post_Icons {
+
+    private static $registry = array();
+
+    public static function parse_icons() {
+        if (!empty(self::$registry))
+            return '';
+
+        $svg_string = file_get_contents(get_stylesheet_directory() . '/images/icons.svg');
+        $svg = new SimpleXMLElement( $svg_string );
+        $svg->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg');
+
+        $matches = $svg->xpath('//svg:symbol/@id');
+        foreach ($matches as $symbol)
+            self::$registry[(string)$symbol['id']] = true;
+
+        return $svg_string;
+    }
+
+    public static function has_icon($id) {
+        return isset(self::$registry[$id]);
+    }
+
+}
+
 class Front_Page_Posts {
 
     private static $object;     // Singleton instance
@@ -409,7 +493,7 @@ class Front_Page_Posts {
             self::$object = new self;
 
         if ( empty(self::$wp_query) )
-            self::$wp_query = new WP_Query(array('post_type' => 'post'));
+            self::$wp_query = new WP_Query(array('post_type' => 'post', 'posts_per_page' => 16));
 
         return self::$object;
     }
@@ -418,4 +502,145 @@ class Front_Page_Posts {
         return self::$wp_query;
     }
 
+}
+
+class WebKit_Nightly_Survey {
+
+    const COOKIE_PREFIX = 'webkitnightlysurvey_';
+    const DATA_SETTING_NAME = 'webkit_nightly_survey_data';
+    const SURVEY_FILENAME = 'survey.json';
+
+    public function add_widget() {
+
+        wp_add_dashboard_widget(
+            'webkit_nightly_survey_results', // Widget slug
+            'WebKit Nightly Survey Results', // Title
+            array($this, 'display_widget')   // Display function
+        );
+
+        if (isset($_GET['wksurvey']) && $_GET['wksurvey'] == 'download')
+            $this->download() && exit;
+
+    }
+
+    public function display_widget() {
+        $data = get_option(self::DATA_SETTING_NAME);
+        $styles = "
+            <style>
+            .survey_table .question {
+                text-align: left;
+            }
+            .survey_table .score {
+                font-size: 15px;
+                min-width: 30px;
+                text-align: right;
+                vertical-align: top;
+                padding-right: 10px;
+            }
+            .survey_table .others {
+                font-style: italic;
+            }
+            </style>
+        ";
+
+        $response_limit = 10;
+        $table = '';
+        foreach ($data as $question => $responses) {
+            $question_row = '<tr><th colspan="2" class="question">' . $question . '</th></tr>';
+            $response_rows = '';
+            arsort($responses);
+            $response_count = 0;
+            $total_responses = count($responses);
+            foreach ($responses as $response => $votes) {
+                $response_rows .= '<tr><td class="score">' . intval($votes) . '</td><td class="response">' . stripslashes($response) . '</td></tr>';
+                if ( ++$response_count >= $response_limit && $response_count < $total_responses) {
+                    $response_rows .= '<tr><td class="score others">' . intval($total_responses - $response_limit) . '</td><td class="response others">more "other" responses</td></tr>';
+                    break;
+                }
+            }
+            $table .= $question_row . $response_rows;
+        }
+        echo $styles;
+        echo '<table class="survey_table">' . $table . '</table>';
+        echo '<p class="textright"><a class="button button-primary" href="' . add_query_arg('wksurvey','download',admin_url()) . '">Download Results as CSV</a></p>';
+    }
+
+    private function download() {
+        $data = get_option(self::DATA_SETTING_NAME);
+        $table = '';
+
+        header('Content-type: text/csv; charset=UTF-8');
+        header('Content-Disposition: attachment; filename="webkit_nightly_survey.csv"');
+        header('Content-Description: Delivered by webkit.org');
+        header('Cache-Control: maxage=1');
+        header('Pragma: public');
+
+        foreach ($data as $question => $responses) {
+            $question_row = 'Score,' . $question . "\n";
+            $response_rows = '';
+            arsort($responses);
+            foreach ($responses as $response => $votes) {
+                $response_rows .= intval($votes) . ',' . stripslashes($response) . "\n";
+            }
+            $table .= $question_row . $response_rows . "\n";
+        }
+        echo $table;
+
+        exit;
+    }
+
+    public function process() {
+        if ( empty($_POST) ) return;
+
+        if ( ! wp_verify_nonce($_POST['_nonce'], self::SURVEY_FILENAME) )
+            wp_die('Invalid WebKit Nightly Survey submission.');
+
+        $score = $data = get_option(self::DATA_SETTING_NAME);
+        $Survey = self::survey();
+        foreach ($Survey as $id => $SurveyQuestion) {
+            if ( ! isset($score[ $SurveyQuestion->question ]) )
+                $score[ $SurveyQuestion->question ] = array();
+            $response = $_POST['questions'][ $id ];
+            $answer = empty($SurveyQuestion->responses[ $response ]) ? $response : $SurveyQuestion->responses[ $response ];
+            if ($answer == 'Other:')
+                $answer = $_POST['other'][ $id ];
+            $score[ $SurveyQuestion->question ][ $answer ]++;
+        }
+
+        if ( $data === false ) {
+            $deprecated = null;
+            $autoload = 'no';
+            add_option(self::DATA_SETTING_NAME, $score, $deprecated, $autoload);
+        } else {
+            update_option(self::DATA_SETTING_NAME, $score);
+        }
+
+        $httponly = false;
+        $secure = false;
+        setcookie(self::cookie_name(), 1, time() + YEAR_IN_SECONDS, '/', WP_HOST, $secure, $httponly );
+        $_COOKIE[ self::cookie_name() ] = 1;
+    }
+
+    public static function responded() {
+        return isset($_COOKIE[ self::cookie_name() ]);
+    }
+
+    private static function cookie_name() {
+        return self::COOKIE_PREFIX . COOKIEHASH;
+    }
+
+    public static function survey_file() {
+        return dirname(__FILE__) . '/' . self::SURVEY_FILENAME;
+    }
+
+    public static function form_nonce() {
+        return '<input type="hidden" name="_nonce" value="' . wp_create_nonce( self::SURVEY_FILENAME ) . '">';
+    }
+
+    public static function survey () {
+        $survey_json = file_get_contents(self::survey_file());
+        $Decoded = json_decode($survey_json);
+        return isset($Decoded->survey) ? $Decoded->survey : array();
+    }
+
 }
\ No newline at end of file