next_tag()){ $value=$processor->get_attribute('class'); if(is_string($value)){foreach(preg_split('/\s+/',trim($value)) as $class){$classes[$class]=true;}} } ksort($classes);$signature=hash('sha256',implode(' ',array_keys($classes))); if(isset(self::$compiled[$signature])){return self::$compiled[$signature];} $css=''; foreach($manifest['rules'] as $rule){ foreach($rule['any'] as $required){ foreach($required as $class){if(!isset($classes[$class])){continue 2;}} $css.=$rule['css'];break; } } if(count(self::$compiled)<64){self::$compiled[$signature]=$css;} return $css; } /** Called before the document markup; never writes draft, HTML or user data. */ public static function stylesheet(string $html,int $source): string { if(wp_style_is('digibl-front','done')){return '';} $css=self::compile($html); return self::asset($css,$source,'page'); } /** Generated styles are emitted by WordPress at their original cascade positions. */ public static function layout(string $html,int $source): string { return $html; } private static function asset(string $css,int $source,string $kind): string { if($css===''){return '';} $key=hash('sha256',get_current_blog_id().'|'.DIGIBL_VERSION.'|'.$css); if(isset(self::$emitted[$kind.$key])){return '';} self::$emitted[$kind.$key]=true; $uploads=wp_upload_dir(null,false); $directory=trailingslashit($uploads['basedir']).'digiter-builder/css'; $name=$kind.'-'.absint($source).'-'.$key.'.css'; $file=$directory.'/'.$name; if(empty($uploads['error']) && (is_dir($directory)||wp_mkdir_p($directory))){ if(!is_file($file) && wp_is_writable($directory)){ $temp=@tempnam($directory,'dbs-'); if($temp!==false){ $written=@file_put_contents($temp,$css,LOCK_EX); if($written===strlen($css)){@LocalFiles::get()->chmod($temp,0644);if(!@LocalFiles::get()->move($temp,$file)){@wp_delete_file($temp);}} else{@wp_delete_file($temp);} } } if(is_readable($file) && @filesize($file)===strlen($css)){ if(@filemtime($file)touch($file);} return Assets::stylesheet(trailingslashit($uploads['baseurl']).'digiter-builder/css/'.$name,$kind.'-'.$key); } } // Read-only/object-storage uploads must never result in an unstyled page. return Assets::inline_style($css,$kind.'-'.$key); } public static function cleanup(): void { $uploads=wp_upload_dir(null,false);$dir=trailingslashit($uploads['basedir']).'digiter-builder/css'; if(!is_dir($dir)||!is_readable($dir)){return;} $checked=0;$cutoff=time()-45*DAY_IN_SECONDS; foreach(new \DirectoryIterator($dir) as $file){ if($file->isDot()||$file->isLink()||!$file->isFile()){continue;} if(++$checked>2000){break;} if(preg_match('/^(?:page|layout)-\d+-[a-f0-9]{64}\.css$/D',$file->getFilename())&&$file->getMTime()<$cutoff){@wp_delete_file($file->getPathname());} } } }