Submit
Path:
~
/
home
/
bfxleof
/
www
/
wp-includes
/
js
/
File Content:
plural-forms.php
<?php /** * A gettext Plural-Forms parser. * * @since 4.9.0 */ if ( ! class_exists( 'Plural_Forms', false ) ) : class Plural_Forms { /** * Operator characters. * * @since 4.9.0 * @var string OP_CHARS Operator characters. */ const OP_CHARS = '|&><!=%?:'; /** * Valid number characters. * * @since 4.9.0 * @var string NUM_CHARS Valid number characters. */ const NUM_CHARS = '0123456789'; /** * Operator precedence. * * Operator precedence from highest to lowest. Higher numbers indicate * higher precedence, and are executed first. * * @see https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence * * @since 4.9.0 * @var array $op_precedence Operator precedence from highest to lowest. */ protected static $op_precedence = array( '%' => 6, '<' => 5, '<=' => 5, '>' => 5, '>=' => 5, '==' => 4, '!=' => 4, '&&' => 3, '||' => 2, '?:' => 1, '?' => 1, '(' => 0, ')' => 0, ); /** * Tokens generated from the string. * * @since 4.9.0 * @var array $tokens List of tokens. */ protected $tokens = array(); /** * Cache for repeated calls to the function. * * @since 4.9.0 * @var array $cache Map of $n => $result */ protected $cache = array(); /** * Constructor. * * @since 4.9.0 * * @param string $str Plural function (just the bit after `plural=` from Plural-Forms) */ public function __construct( $str ) { $this->parse( $str ); } /** * Parse a Plural-Forms string into tokens. * * Uses the shunting-yard algorithm to convert the string to Reverse Polish * Notation tokens. * * @since 4.9.0 * * @throws Exception If there is a syntax or parsing error with the string. * * @param string $str String to parse. */ protected function parse( $str ) { $pos = 0; $len = strlen( $str ); // Convert infix operators to postfix using the shunting-yard algorithm. $output = array(); $stack = array(); while ( $pos < $len ) { $next = substr( $str, $pos, 1 ); switch ( $next ) { // Ignore whitespace. case ' ': case "\t": $pos++; break; // Variable (n). case 'n': $output[] = array( 'var' ); $pos++; break; // Parentheses. case '(': $stack[] = $next; $pos++; break; case ')': $found = false; while ( ! empty( $stack ) ) { $o2 = $stack[ count( $stack ) - 1 ]; if ( '(' !== $o2 ) { $output[] = array( 'op', array_pop( $stack ) ); continue; } // Discard open paren. array_pop( $stack ); $found = true; break; } if ( ! $found ) { throw new Exception( 'Mismatched parentheses' ); } $pos++; break; // Operators. case '|': case '&': case '>': case '<': case '!': case '=': case '%': case '?': $end_operator = strspn( $str, self::OP_CHARS, $pos ); $operator = substr( $str, $pos, $end_operator ); if ( ! array_key_exists( $operator, self::$op_precedence ) ) { throw new Exception( sprintf( 'Unknown operator "%s"', $operator ) ); } while ( ! empty( $stack ) ) { $o2 = $stack[ count( $stack ) - 1 ]; // Ternary is right-associative in C. if ( '?:' === $operator || '?' === $operator ) { if ( self::$op_precedence[ $operator ] >= self::$op_precedence[ $o2 ] ) { break; } } elseif ( self::$op_precedence[ $operator ] > self::$op_precedence[ $o2 ] ) { break; } $output[] = array( 'op', array_pop( $stack ) ); } $stack[] = $operator; $pos += $end_operator; break; // Ternary "else". case ':': $found = false; $s_pos = count( $stack ) - 1; while ( $s_pos >= 0 ) { $o2 = $stack[ $s_pos ]; if ( '?' !== $o2 ) { $output[] = array( 'op', array_pop( $stack ) ); $s_pos--; continue; } // Replace. $stack[ $s_pos ] = '?:'; $found = true; break; } if ( ! $found ) { throw new Exception( 'Missing starting "?" ternary operator' ); } $pos++; break; // Default - number or invalid. default: if ( $next >= '0' && $next <= '9' ) { $span = strspn( $str, self::NUM_CHARS, $pos ); $output[] = array( 'value', intval( substr( $str, $pos, $span ) ) ); $pos += $span; break; } throw new Exception( sprintf( 'Unknown symbol "%s"', $next ) ); } } while ( ! empty( $stack ) ) { $o2 = array_pop( $stack ); if ( '(' === $o2 || ')' === $o2 ) { throw new Exception( 'Mismatched parentheses' ); } $output[] = array( 'op', $o2 ); } $this->tokens = $output; } /** * Get the plural form for a number. * * Caches the value for repeated calls. * * @since 4.9.0 * * @param int $num Number to get plural form for. * @return int Plural form value. */ public function get( $num ) { if ( isset( $this->cache[ $num ] ) ) { return $this->cache[ $num ]; } $this->cache[ $num ] = $this->execute( $num ); return $this->cache[ $num ]; } /** * Execute the plural form function. * * @since 4.9.0 * * @throws Exception If the plural form value cannot be calculated. * * @param int $n Variable "n" to substitute. * @return int Plural form value. */ public function execute( $n ) { $stack = array(); $i = 0; $total = count( $this->tokens ); while ( $i < $total ) { $next = $this->tokens[ $i ]; $i++; if ( 'var' === $next[0] ) { $stack[] = $n; continue; } elseif ( 'value' === $next[0] ) { $stack[] = $next[1]; continue; } // Only operators left. switch ( $next[1] ) { case '%': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 % $v2; break; case '||': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 || $v2; break; case '&&': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 && $v2; break; case '<': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 < $v2; break; case '<=': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 <= $v2; break; case '>': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 > $v2; break; case '>=': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 >= $v2; break; case '!=': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 != $v2; break; case '==': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 == $v2; break; case '?:': $v3 = array_pop( $stack ); $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 ? $v2 : $v3; break; default: throw new Exception( sprintf( 'Unknown operator "%s"', $next[1] ) ); } } if ( count( $stack ) !== 1 ) { throw new Exception( 'Too many values remaining on the stack' ); } return (int) $stack[0]; } } endif;
Submit
FILE
FOLDER
Name
Size
Permission
Action
codemirror
---
0755
crop
---
0755
dist
---
0755
imgareaselect
---
0755
jcrop
---
0755
jquery
---
0755
mediaelement
---
0755
plupload
---
0755
swfupload
---
0755
thickbox
---
0755
tinymce
---
0755
418.php
478 bytes
0644
Category.php
3944 bytes
0644
ChaCha20.php
12934 bytes
0644
Exception.php
1214 bytes
0644
admin-bar.css
23876 bytes
0644
admin-bar.js
10762 bytes
0644
admin-bar.min.js
3556 bytes
0644
autoload.php
2731 bytes
0644
autosave.js
22518 bytes
0644
autosave.min.js
5847 bytes
0644
backbone.js
77794 bytes
0604
backbone.min.js
23818 bytes
0644
block.json
458 bytes
0644
class-wp-http-streams-20260704171429.php
16117 bytes
0644
class-wp-http-streams.php
16117 bytes
0644
class-wp-network-query.php
19169 bytes
0644
class-wp-network.php
12379 bytes
0644
class-wp-oembed-controller-20260621150705.php
6793 bytes
0644
class-wp-oembed-controller.php
6793 bytes
0644
class-wp-site.php
7428 bytes
0644
class-wp-sitemaps-posts-20260705060716.php
5875 bytes
0644
class-wp-sitemaps-posts.php
5875 bytes
0644
class-wp-theme.php
51601 bytes
0644
clipboard.js
29493 bytes
0644
clipboard.min.js
10419 bytes
0644
colorpicker.js
29083 bytes
0604
colorpicker.min.js
16562 bytes
0644
comment-reply.js
12457 bytes
0644
comment-reply.min.js
2984 bytes
0644
common-rtl.css
6510 bytes
0644
customize-base.js
25766 bytes
0644
customize-base.min.js
7858 bytes
0644
customize-loader.js
7904 bytes
0644
customize-loader.min.js
3553 bytes
0644
customize-models.js
6821 bytes
0644
customize-models.min.js
3693 bytes
0644
customize-preview-nav-menus.js
15024 bytes
0644
customize-preview-nav-menus.min.js
5038 bytes
0644
customize-preview-widgets.js
23253 bytes
0644
customize-preview-widgets.min.js
7824 bytes
0644
customize-preview.js
27960 bytes
0644
customize-preview.min.js
10758 bytes
0644
customize-selective-refresh.js
33332 bytes
0644
customize-selective-refresh.min.js
10693 bytes
0644
customize-views.js
5065 bytes
0604
customize-views.min.js
2451 bytes
0644
data.js
147192 bytes
0644
editor.js
472144 bytes
0644
heartbeat.js
23154 bytes
0644
heartbeat.min.js
5883 bytes
0644
hoverintent-js.min.js
1718 bytes
0604
https-detection-20260622230655.php
6871 bytes
0644
https-detection-20260623211809-20260705134447.php
6871 bytes
0644
https-detection-20260623211809-20260706014449.php
6871 bytes
0644
https-detection-20260623211809.php
6871 bytes
0644
https-detection.php
6871 bytes
0644
https-migration-20260621215951.php
4730 bytes
0644
https-migration-20260621222700-20260622020253.php
4730 bytes
0644
https-migration-20260621222700-20260622150413.php
4730 bytes
0644
https-migration-20260621222700.php
4730 bytes
0644
https-migration-20260622015718.php
4730 bytes
0644
https-migration-20260622015815.php
4730 bytes
0644
https-migration-20260622055634.php
4730 bytes
0644
https-migration-20260622145328.php
4730 bytes
0644
https-migration-20260622165410.php
4730 bytes
0644
https-migration-20260622194220.php
4730 bytes
0644
https-migration-20260622204948.php
4730 bytes
0644
https-migration-20260622211332.php
4730 bytes
0644
https-migration-20260622230538.php
4730 bytes
0644
https-migration.php
4730 bytes
0644
imagesloaded.min.js
5629 bytes
0644
json2.js
18422 bytes
0604
json2.min.js
3153 bytes
0644
kses.php
63459 bytes
0644
masonry.min.js
24138 bytes
0644
mce-view.js
26059 bytes
0644
mce-view.min.js
9883 bytes
0644
media-audiovideo.js
27553 bytes
0644
media-audiovideo.min.js
12921 bytes
0644
media-editor.js
29119 bytes
0644
media-editor.min.js
10909 bytes
0644
media-grid.js
29532 bytes
0644
media-grid.min.js
14165 bytes
0644
media-models.js
45137 bytes
0644
media-models.min.js
13811 bytes
0644
media-views.js
267734 bytes
0644
media-views.min.js
107493 bytes
0644
ms-blogs.php
25174 bytes
0644
nav-menu-template.php
23296 bytes
0644
php72compat_const.php
4597 bytes
0644
plural-forms.php
7612 bytes
0644
quicktags.js
22615 bytes
0604
quicktags.min.js
11149 bytes
0644
revision.php
22027 bytes
0644
shortcode.min.js
4096 bytes
0644
shortcode.php
697 bytes
0644
swfobject.js
10231 bytes
0604
tw-sack.js
4969 bytes
0604
tw-sack.min.js
3299 bytes
0604
twemoji.js
28010 bytes
0644
twemoji.min.js
11307 bytes
0644
underscore.min.js
16045 bytes
0644
utils.js
4665 bytes
0604
utils.min.js
1864 bytes
0644
wp-ajax-response.js
3214 bytes
0644
wp-ajax-response.min.js
2098 bytes
0644
wp-api.js
46983 bytes
0644
wp-api.min.js
14687 bytes
0644
wp-auth-check.js
4225 bytes
0644
wp-auth-check.min.js
1674 bytes
0644
wp-backbone.js
15240 bytes
0644
wp-backbone.min.js
3037 bytes
0644
wp-custom-header.js
10447 bytes
0644
wp-custom-header.min.js
4442 bytes
0644
wp-embed-template.min.js
3154 bytes
0644
wp-embed.js
3414 bytes
0644
wp-embed.min.js
1478 bytes
0644
wp-emoji-loader.js
6953 bytes
0644
wp-emoji-loader.min.js
1852 bytes
0644
wp-emoji-release.min.js
14229 bytes
0644
wp-emoji.js
8989 bytes
0604
wp-emoji.min.js
2873 bytes
0644
wp-list-revisions.js
970 bytes
0604
wp-list-revisions.min.js
597 bytes
0644
wp-lists.js
25315 bytes
0644
wp-lists.min.js
7434 bytes
0644
wp-sanitize.js
1350 bytes
0604
wp-sanitize.min.js
458 bytes
0644
wp-util.js
4113 bytes
0644
wp-util.min.js
1169 bytes
0644
wpdialog.js
560 bytes
0604
wpdialog.min.js
272 bytes
0604
wplink.js
21160 bytes
0644
wplink.min.js
11283 bytes
0644
zxcvbn-async.js
821 bytes
0604
zxcvbn-async.min.js
351 bytes
0644
zxcvbn.min.js
822237 bytes
0604
N4ST4R_ID | Naxtarrr