5737850f42132589759e399effa57b1421b6888e
[WebKit-https.git] / Websites / webkit.org / wp-content / themes / webkit / functions.php
1 <?php
2
3 // Declare theme features
4 add_theme_support( 'post-thumbnails' ); 
5
6 function register_menus() {
7 }
8 add_action( 'init', function () {
9     register_nav_menu('site-nav', __( 'Site Navigation' ));
10     register_nav_menu('footer-nav', __( 'Footer Navigation' ));
11     register_nav_menu('sitemap', __( 'Site Map Page' ));
12 } );
13
14 function modify_contact_methods($profile_fields) {
15
16         // Add new fields
17         $profile_fields['twitter'] = 'Twitter Handle';
18         unset($profile_fields['aim']);
19         unset($profile_fields['yim']);
20         unset($profile_fields['jabber']);
21
22         return $profile_fields;
23 }
24
25 add_filter('user_contactmethods', function ($fields) {
26     // Add Twitter field to user profiles
27         $fields['twitter'] = 'Twitter Handle';
28     
29     // Remove unused social networks
30         unset($fields['aim']);
31         unset($fields['yim']);
32         unset($fields['jabber']);
33
34         return $fields;
35 });
36
37 add_action('init', function () {
38         register_sidebar(array(
39                 'name'=> 'Home Tiles',
40                 'id' => 'tiles',
41                 'before_widget' => '',
42                 'after_widget' => '',
43                 'before_title' => '',
44                 'after_title' => '',
45         ));
46 } );
47
48 add_filter('the_title', function( $title ) {
49     if ( is_admin() ) return $title;
50     $title = str_replace(": ", ":<br>", $title);
51     return $title;
52 });
53
54 // Hide category 41: Legacy from archives
55 add_filter('pre_get_posts', function ($query) {
56     if ( $query->is_home() )
57         $query->set('cat', '-41');
58     return $query;
59 });
60
61
62 include('widgets/post.php');
63 include('widgets/icon.php');
64 include('widgets/twitter.php');
65 include('widgets/page.php');
66
67 add_filter( 'get_the_excerpt', function( $excerpt ) {
68     $sentences = preg_split( '/(\.|!|\?)\s/', $excerpt, 2, PREG_SPLIT_DELIM_CAPTURE );
69     
70     // if ( empty($sentences[1]) )
71     //     $sentences[1] = '&hellip;';
72     
73     return $sentences[0] . $sentences[1];
74
75 });
76
77 function table_of_contents() {
78     if ( class_exists('WebKitTableOfContents') )
79         WebKitTableOfContents::markup();
80 }
81
82 function has_table_of_contents() {
83     if ( class_exists('WebKitTableOfContents') )
84         return WebKitTableOfContents::hasIndex();
85 }
86
87 function table_of_contents_index( $content, $post_id ) {
88     if ( ! class_exists('WebKitTableOfContents') )
89         return $content;
90     $content = WebKitTableOfContents::parse($content);
91     WebKitTableOfContents::wp_insert_post($post_id);
92     return $content;
93 }
94
95 function tag_post_image_luminance( $post_id ) {
96     $threshold = 128;
97     $tags = array();
98
99     // Get the image data
100         $image_url = wp_get_attachment_image_src( get_post_thumbnail_id($post_id), 'small' )[0];
101     
102     if ( empty($image_url) ) return $post_id;
103     
104     // detect luminence value
105     $luminance = calculate_image_luminance($image_url);
106     $tags = wp_get_post_tags($post_id, array('fields' => 'names'));
107
108     if ( $luminance < $threshold )
109         $tags[] = 'dark';
110     elseif ( false !== ( $key = array_search('dark', $messages) ) )
111         unset($tags[ $key ]);
112
113     // Set a tag class
114     if ( ! empty($tags) )
115         wp_set_post_tags( $post_id, $tags, true );
116     
117     return $post_id;
118 }
119
120 function calculate_image_luminance($image_url) {
121     // Get original image dimensions
122     $size = getimagesize($image_url);
123     
124     // Create image resource from source image
125     $image = ImageCreateFromString(file_get_contents($image_url));
126     
127     // Allocate image resource
128     $sample = ImageCreateTrueColor(1, 1);
129     
130     // Flood fill with a white background (to properly calculate luminance of PNGs with alpha)
131     ImageFill($sample , 0, 0, ImageColorAllocate($sample, 255, 255, 255));
132     
133     // Downsample to 1x1 image
134     ImageCopyResampled($sample, $image, 0, 0, 0, 0, 1, 1, $size[0], $size[1]);
135
136     // Get the RGB value of the pixel
137     $rgb   = ImageColorAt($sample, 0, 0);    
138     $red   = ($rgb >> 16) & 0xFF;
139     $green = ($rgb >> 8) & 0xFF;
140     $blue  = $rgb & 0xFF;
141     
142     // Calculate relative luminance value (https://en.wikipedia.org/wiki/Relative_luminance)
143     return ( 0.2126 * $red + 0.7152 * $green + 0.0722 * $blue);
144 }
145
146 function html_select_options(array $list, $selected = null, $values = false, $append = false) {
147                 if ( ! is_array($list) ) return '';
148
149                 $_ = '';
150         
151                 // Append the options if the selected value doesn't exist
152                 if ( ( ! in_array($selected, $list) && ! isset($list[ $selected ])) && $append )
153                         $_ .= '<option value="' . esc_attr($selected) . '">' .esc_html($selected) . '</option>';
154
155                 foreach ( $list as $value => $text ) {
156
157                         $value_attr = $selected_attr = '';
158
159                         if ( $values ) $value_attr = ' value="' . esc_attr($value) . '"';
160                         if ( ( $values && (string)$value === (string)$selected)
161                                 || ( ! $values && (string)$text === (string)$selected ) )
162                                         $selected_attr = ' selected="selected"';
163     
164                         if ( is_array($text) ) {
165                                 $label = $value;
166                                 $_ .= '<optgroup label="' . esc_attr($label) . '">';
167                                 $_ .= self::menuoptions($text, $selected, $values);
168                                 $_ .= '</optgroup>';
169                                 continue;
170                         } else $_ .= "<option$value_attr$selected_attr>$text</option>";
171
172                 }
173                 return $_;
174         }
175
176 add_filter('save_post', 'tag_post_image_luminance');
177
178 add_filter('next_post_link', function ( $format ) {
179     return str_replace('href=', 'class="page-numbers next-post" href=', $format);
180 });
181 add_filter('previous_post_link', function ( $format ) {
182     return str_replace('href=', 'class="page-numbers prev-post" href=', $format);
183 });
184
185
186
187 // Queue global scripts
188 add_action( 'wp_enqueue_scripts', function () {
189     wp_register_script(
190         'theme-global',
191         get_stylesheet_directory_uri() . '/scripts/global.js',
192         false,
193         '1.0',
194         true
195     );
196
197     wp_enqueue_script( 'theme-global' );
198
199 } );
200
201 class Responsive_Toggle_Walker_Nav_Menu extends Walker_Nav_Menu {
202     
203     private $toggleid = null;
204     
205         public function start_lvl( &$output, $depth = 0, $args = array() ) {
206         $output .= "\n" . str_repeat("\t", $depth);
207         if ( ! empty($this->toggleid) )
208             $output .= "<input type=\"checkbox\" id=\"toggle-{$this->toggleid}\" class=\"menu-toggle\" />";
209         $classes = array("sub-menu");
210         if ( 0 == $depth ) {
211             $classes[] = "sub-menu-layer";
212         }
213         $id = ( 0 == $depth ) ? " id=\"sub-menu-for-{$this->toggleid}\"" : '';
214         $class_names = esc_attr(join( ' ', $classes ));
215         $output .= "<ul class=\"$class_names\" role=\"menu\"$id>\n";
216     }
217     
218         public function end_lvl( &$output, $depth = 0, $args = array() ) {
219                 $indent = str_repeat("\t", $depth);
220                 $output .= "$indent</ul>\n";
221         }
222     
223     public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
224         
225         $before = $args->link_before;
226         $after = $args->link_after;
227         
228         if ( in_array('menu-item-has-children', $item->classes) && 0 == $depth ) {
229             $args->link_before = "<label for=\"toggle-{$item->ID}\" class=\"label-toggle\">" . $args->link_before;
230             $args->link_after .= "</label>";
231             $this->toggleid = $item->ID;
232             $item->url = '#nav-sub-menu';
233         } elseif ( in_array('menu-item-has-children', $item->classes) && 1 == $depth ) {
234             // $item->role = "presentation";
235         } else $toggleid = null;        
236         
237                 $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
238
239                 $classes = empty( $item->classes ) ? array() : (array) $item->classes;
240                 $classes[] = 'menu-item-' . $item->ID;
241
242                 $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
243                 $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
244
245                 $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth );
246                 $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
247
248                 $output .= $indent . '<li' . $id . $class_names . '>';
249
250                 $atts = array();
251                 $atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
252                 $atts['target'] = ! empty( $item->target )     ? $item->target     : '';
253                 $atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';
254                 $atts['href']   = ! empty( $item->url )        ? $item->url        : '';
255         $atts['role']   = ! empty( $item->role )       ? $item->role       : '';
256         
257         if ( in_array('menu-item-has-children', $item->classes) && 0 == $depth ) {
258             $atts['aria-haspopup'] = "true";
259             $atts['aria-owns'] = 'sub-menu-for-' . $item->ID;
260             $atts['aria-controls'] = 'sub-menu-for-' . $item->ID;
261             $atts['aria-expanded'] = 'true';
262         }
263         
264                 $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );
265
266                 $attributes = '';
267                 foreach ( $atts as $attr => $value ) {
268                         if ( ! empty( $value ) ) {
269                                 $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
270                                 $attributes .= ' ' . $attr . '="' . $value . '"';
271                         }
272                 }
273
274                 $item_output = $args->before;
275                 $item_output .= '<a'. $attributes .'>';
276                 $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
277                 $item_output .= '</a>';
278                 $item_output .= $args->after;
279
280                 $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
281         
282         $args->link_before = $before;
283         $args->link_after = $after;
284     }
285     
286 }
287
288 class Front_Page_Posts {
289     
290         private static $object;     // Singleton instance
291  
292     private static $wp_query;   // WP_Query instance
293     
294         public static function &object () {
295                 if ( ! self::$object instanceof self )
296                         self::$object = new self;
297         
298         if ( empty(self::$wp_query) )
299             self::$wp_query = new WP_Query(array('post_type' => 'post'));
300         
301                 return self::$object;
302         }
303     
304     public static function WP_Query() {
305         return self::$wp_query;
306     }
307     
308 }