$object ). * @return boolean */ function arrays_intersect( array $array1, array $array2 ) { foreach ( $array1 as $value ) { if ( isset( $array2[ spl_object_hash( $value ) ] ) ) { return true; } } return false; } /** * Convert \DOMNodeList to array; * * @param \DOMNodeList $list Required. * @return array An associative array in the form ( $spl_object_hash => $node ). */ function nodelist_to_array( \DOMNodeList $list ) { $out = array(); foreach ( $list as $node ) { $out[ spl_object_hash( $node ) ] = $node; } return $out; } /** * Retrieve an array containing all the ancestors of the node. This could be done * via an XPath query for "ancestor::*", but DOM walking is in all likelyhood faster. * * @param \DOMNode $node Required. * @return array An array of \DOMNode. */ function get_ancestors( \DOMNode $node ) { $result = array(); while ( ( $node = $node->parentNode ) && ( $node instanceof \DOMElement ) ) { // @codingStandardsIgnoreLine. $result[] = $node; } return $result; } /** * Checks whether the \DOMNode has one of the given classes. * If $tag is a \DOMText, the parent DOMElement is checked instead. * * @param \DOMNode $tag An element or textnode. * @param string|array $classnames A single classname or an array of classnames. * * @return boolean True if the element has any of the given class(es). */ function has_class( \DOMNode $tag, $classnames ) { if ( $tag instanceof \DOMText ) { $tag = $tag->parentNode; // @codingStandardsIgnoreLine. } // Bail if we are not working with a tag or if there is no classname. if ( ! ( $tag instanceof \DOMElement ) || empty( $classnames ) ) { return false; } // Ensure we always have an array of classnames. if ( ! is_array( $classnames ) ) { $classnames = array( $classnames ); } if ( $tag->hasAttribute( 'class' ) ) { $tag_classes = array_flip( explode( ' ', $tag->getAttribute( 'class' ) ) ); foreach ( $classnames as $classname ) { if ( isset( $tag_classes[ $classname ] ) ) { return true; } } } return false; } /** * Convert decimal value to unicode character. * * @param string|array $codes Decimal value(s) coresponding to unicode character(s). * @return string Unicode character(s). */ function uchr( $codes ) { if ( is_scalar( $codes ) ) { $codes = func_get_args(); } $str = ''; foreach ( $codes as $code ) { $str .= html_entity_decode( '&#' . $code . ';', ENT_NOQUOTES, 'UTF-8' ); } return $str; } /** * Is a number odd? * * @param integer $number Required. * @return boolean true if $number is odd, false if it is even. */ function is_odd( $number ) { return (boolean) ( $number % 2 ); } /** * Multibyte-safe str_split function. * * @param string $str Required. * @param int $length Optional. Default 1. * @param string $encoding Optional. Default 'UTF-8'. */ function mb_str_split( $str, $length = 1, $encoding = 'UTF-8' ) { if ( $length < 1 ) { return false; } $result = array(); $multibyte_length = mb_strlen( $str, $encoding ); for ( $i = 0; $i < $multibyte_length; $i += $length ) { $result[] = mb_substr( $str, $i, $length, $encoding ); } return $result; } /** * Retrieve the list of valid language plugins in the given directory. * * @param string $path The path in which to look for language plugin files. * @param string $language_name_variable The variable used for the language name in the plugin files. * * @return array An array in the form ( $language_code => $translated_language_name ). */ function get_language_plugin_list( $path, $language_name_variable ) { $language_name_pattern = '/\$' . $language_name_variable . '\s*=\s*((".+")|(\'.+\'))\s*;/'; $languages = array(); $handler = opendir( $path ); // Read all files in directory. while ( $file = readdir( $handler ) ) { // We only want the PHP files. if ( '.php' === substr( $file, -4 ) ) { $file_content = file_get_contents( $path . $file ); if ( preg_match( $language_name_pattern, $file_content, $matches ) ) { // Normally this doesn't work, but we may have added the language name in the patgen file already. $language_name = /*__(*/ substr( $matches[1], 1, -1 ) /*, 'wp-typography' ) */; // @codingStandardsIgnoreLine. $language_code = substr( $file, 0, -4 ); $languages[ $language_code ] = $language_name; } } } closedir( $handler ); // Sort translated language names according to current locale. asort( $languages ); return $languages; } /** * Include debugging helpers */ if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { // @codeCoverageIgnoreStart define( 'WP_TYPOGRAPHY_DEBUG', true ); } if ( defined( 'WP_TYPOGRAPHY_DEBUG' ) && WP_TYPOGRAPHY_DEBUG ) { include_once 'php-typography-debug.php'; } // @codeCoverageIgnoreEnd