namespace Easy_Plugins\Table_Of_Contents\Cord; // Exit if accessed directly if ( ! defined( 'ABSPATH' ) ) exit; /** * Replace `
` tags with parameter. * * @since 2.0.8 * * @param string $string * @param string $to * * @return string */ function br2( $string, $to = "\r\n" ) { $string = preg_replace( '``i', $to, $string ); return $string; } /** * Replace `
` tags with new lines. * * @link https://stackoverflow.com/a/27509016/5351316 * * @since 2.0.8 * * @param string $string * * @return string */ function br2nl( $string ) { return br2( $string ); } /** * Pulled from WordPress formatting functions. * * Edited to add space before self closing tags. * * @since 2.0 * * @param string $text * * @return string|string[] */ function force_balance_tags( $text ) { $tagstack = array(); $stacksize = 0; $tagqueue = ''; $newtext = ''; // Known single-entity/self-closing tags $single_tags = array( 'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param', 'source' ); // Tags that can be immediately nested within themselves $nestable_tags = array( 'blockquote', 'div', 'object', 'q', 'span' ); // WP bug fix for comments - in case you REALLY meant to type '< !--' $text = str_replace( '< !--', '< !--', $text ); // WP bug fix for LOVE <3 (and other situations with '<' before a number) $text = preg_replace( '#<([0-9]{1})#', '<$1', $text ); /** * Matches supported tags. * * To get the pattern as a string without the comments paste into a PHP * REPL like `php -a`. * * @see https://html.spec.whatwg.org/#elements-2 * @see https://w3c.github.io/webcomponents/spec/custom/#valid-custom-element-name * * @example * ~# php -a * php > $s = [paste copied contents of expression below including parentheses]; * php > echo $s; */ $tag_pattern = ( '#<' . // Start with an opening bracket. '(/?)' . // Group 1 - If it's a closing tag it'll have a leading slash. '(' . // Group 2 - Tag name. // Custom element tags have more lenient rules than HTML tag names. '(?:[a-z](?:[a-z0-9._]*)-(?:[a-z0-9._-]+)+)' . '|' . // Traditional tag rules approximate HTML tag names. '(?:[\w:]+)' . ')' . '(?:' . // We either immediately close the tag with its '>' and have nothing here. '\s*' . '(/?)' . // Group 3 - "attributes" for empty tag. '|' . // Or we must start with space characters to separate the tag name from the attributes (or whitespace). '(\s+)' . // Group 4 - Pre-attribute whitespace. '([^>]*)' . // Group 5 - Attributes. ')' . '>#' // End with a closing bracket. ); while ( preg_match( $tag_pattern, $text, $regex ) ) { $full_match = $regex[0]; $has_leading_slash = ! empty( $regex[1] ); $tag_name = $regex[2]; $tag = strtolower( $tag_name ); $is_single_tag = in_array( $tag, $single_tags, true ); $pre_attribute_ws = isset( $regex[4] ) ? $regex[4] : ''; $attributes = trim( isset( $regex[5] ) ? $regex[5] : $regex[3] ); $has_self_closer = '/' === substr( $attributes, -1 ); $newtext .= $tagqueue; $i = strpos( $text, $full_match ); $l = strlen( $full_match ); // Clear the shifter. $tagqueue = ''; if ( $has_leading_slash ) { // End Tag. // If too many closing tags. if ( $stacksize <= 0 ) { $tag = ''; // Or close to be safe $tag = '/' . $tag. // If stacktop value = tag close value, then pop. } elseif ( $tagstack[ $stacksize - 1 ] === $tag ) { // Found closing tag. $tag = ''; // Close Tag. array_pop( $tagstack ); $stacksize--; } else { // Closing tag not at top, search for it. for ( $j = $stacksize - 1; $j >= 0; $j-- ) { if ( $tagstack[ $j ] === $tag ) { // Add tag to tagqueue. for ( $k = $stacksize - 1; $k >= $j; $k-- ) { $tagqueue .= ''; $stacksize--; } break; } } $tag = ''; } } else { // Begin Tag. if ( $has_self_closer ) { // If it presents itself as a self-closing tag... // ...but it isn't a known single-entity self-closing tag, then don't let it be treated as such and // immediately close it with a closing tag (the tag will encapsulate no text as a result) if ( ! $is_single_tag ) { $attributes = trim( substr( $attributes, 0, -1 ) ) . "> 0 && ! in_array( $tag, $nestable_tags, true ) && $tagstack[ $stacksize - 1 ] === $tag ) { $tagqueue = ''; $stacksize--; } $stacksize = array_push( $tagstack, $tag ); } // Attributes. if ( $has_self_closer && $is_single_tag ) { // We need some space - avoid
and prefer
. $pre_attribute_ws = ' '; } $tag = '<' . $tag . $pre_attribute_ws . $attributes . '>'; // If already queuing a close tag, then put this tag on too. if ( ! empty( $tagqueue ) ) { $tagqueue .= $tag; $tag = ''; } } $newtext .= substr( $text, 0, $i ) . $tag; $text = substr( $text, $i + $l ); } // Clear Tag Queue. $newtext .= $tagqueue; // Add remaining text. $newtext .= $text; while ( $x = array_pop( $tagstack ) ) { $newtext .= ''; // Add remaining tags to close. } // WP fix for the bug with HTML comments. $newtext = str_replace( '< !--', ' Protected by its moat, Apple has time to get AI right – Computerworld - Extra Hacking

Protected by its moat, Apple has time to get AI right – Computerworld

Protected by its moat, Apple has time to get AI right – Computerworld

[ad_1]

“We acknowledge that Apple might not have fully finalized their own approach to AI, but we also believe that anyone thinking Apple will acquire an AI-powered search engine to ‘solve their AI shortfalls’ is misguided,” Woodring said. “Apple almost certainly is not, and does not, want to compete directly in search, regardless of what happens in the DOJ v. GOOGL remedy ruling.”

Where is Apple going?

The analyst, instead, believes Apple’s approach will be to build a broad ecosystem of new virtual-assistant-like features embedded into their OS, “some of which run on homegrown LLMs with Siri acting as central command, and others (arguably more) leveraging white-labeled technology from leading AI labs (Perplexity, Google, Grok, Anthropic, Mistral, etc.) — that make their products and services better…”

If that’s true — that Apple wants to create its own unique family of AI tools and services to make life better for its customers, while integrating services from others for those tasks it does not provide — then getting there will take time.

[ad_2]

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *