Submit
Path:
~
/
home
/
bfxleof
/
www
/
wp-includes
/
blocks
/
embed
/
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;
Edit
Rename
Chmod
Delete
FILE
FOLDER
Name
Size
Permission
Action
418.php
478 bytes
0644
Category-20260707044147.php
3944 bytes
0644
Category.php
3944 bytes
0644
ChaCha20.php
12934 bytes
0644
Exception.php
1214 bytes
0644
SMTP.php
47285 bytes
0644
admin-bar-20260707070114.css
23876 bytes
0644
admin-bar.css
23876 bytes
0644
autoload.php
2731 bytes
0644
block.json
601 bytes
0644
class-IXR-introspectionserver.php
5323 bytes
0644
class-json.php
43441 bytes
0644
class-walker-page-dropdown.php
2299 bytes
0644
class-wp-customize-nav-menus.php
57019 bytes
0644
class-wp-http-streams.php
16117 bytes
0644
class-wp-locale.php
13982 bytes
0644
class-wp-network-query-20260707002929.php
19169 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-20260705055753.php
5875 bytes
0644
class-wp-sitemaps-posts.php
5875 bytes
0644
class-wp-sitemaps-provider.php
4366 bytes
0644
class-wp-sitemaps-stylesheet.php
8599 bytes
0644
class-wp-sitemaps.php
6290 bytes
0644
class-wp-theme.php
51601 bytes
0644
class-wp-widget-media-image.php
12037 bytes
0644
common-rtl.css
6510 bytes
0644
customize-base.js
25766 bytes
0644
data-20260707083341.js
147192 bytes
0644
data.js
147192 bytes
0644
effect-puff-20260704202723.js
943 bytes
0644
effect-puff.js
943 bytes
0644
effect-transfer.js
836 bytes
0644
https-detection-20260623211809-20260705222630.php
6871 bytes
0644
https-detection-20260623211809-20260706211406.php
6871 bytes
0644
https-detection-20260623211809.php
6871 bytes
0644
https-detection-20260624112449.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.php
4730 bytes
0644
https-migration-20260622015718.php
4730 bytes
0644
https-migration-20260622015741.php
4730 bytes
0644
https-migration-20260622055634-20260706224326.php
4730 bytes
0644
https-migration-20260622055634.php
4730 bytes
0644
https-migration-20260622153559-20260623064444.php
4730 bytes
0644
https-migration-20260622153559.php
4730 bytes
0644
https-migration-20260622194220.php
4730 bytes
0644
https-migration-20260622204948.php
4730 bytes
0644
https-migration-20260622210714.php
4730 bytes
0644
https-migration-20260622211332.php
4730 bytes
0644
https-migration.php
4730 bytes
0644
index-20260703212906.php
1531 bytes
0644
index.php
1531 bytes
0644
jquery-ui-dialog-rtl.css
5967 bytes
0644
json2.js
18422 bytes
0644
ms-blogs.php
25174 bytes
0644
nav-menu-template-20260704210520.php
23296 bytes
0644
nav-menu-template.php
23296 bytes
0644
php72compat_const-20260707040750.php
4597 bytes
0644
php72compat_const.php
4597 bytes
0644
plural-forms-20260707073704.php
7612 bytes
0644
plural-forms.php
7612 bytes
0644
progressbar.min.js
2514 bytes
0644
revision.php
22027 bytes
0644
shortcode-20260622010901.php
697 bytes
0644
shortcode.php
697 bytes
0644
style-rtl.css
68520 bytes
0644
thickbox-20260704221903.css
2659 bytes
0644
thickbox.css
2659 bytes
0644
tinymce.min.js
365570 bytes
0644
utils.js
4665 bytes
0644
wp-content.css
8624 bytes
0644
N4ST4R_ID | Naxtarrr