diff --git a/app/data/global_rules.php b/app/data/global_rules.php index 21d1c75..66346e5 100644 --- a/app/data/global_rules.php +++ b/app/data/global_rules.php @@ -6,90 +6,61 @@ * Este arquivo define regras que são aplicadas por padrão a todos os sites, * organizadas em categorias para melhor manutenção e compreensão. * - * Estrutura das regras globais: - * - * classElementRemove: Classes HTML que devem ser removidas, agrupadas por categoria - * - paywall: Classes relacionadas a paywalls e conteúdo premium - * - social: Classes de elementos de compartilhamento social - * - newsletter: Classes de popups e formulários de newsletter - * - * scriptTagRemove: Scripts que devem ser removidos, agrupados por categoria - * - tracking: Scripts de analytics e rastreamento - * - paywall: Scripts relacionados a paywalls e conteúdo premium - * - cookies: Scripts de gerenciamento de cookies e GDPR/LGPD - * - misc: Scripts diversos como push notifications - * * Nota: Estas regras podem ser sobrescritas ou desativadas para domínios específicos * usando a configuração 'excludeGlobalRules' em domain_rules.php */ return [ 'classElementRemove' => [ - 'paywall' => [ - 'subscription', - 'subscriber-content', - 'premium-content', - 'signin-wall', - 'register-wall', - 'paid-content', - 'premium-article', - 'subscription-box', - 'piano-offer', - 'piano-inline', - 'piano-modal', - 'paywall-container', - 'paywall-overlay', - 'paywall-wrapper', - 'paywall-notification' - ], - 'social' => [ - 'social-share', - 'social-buttons', - 'share-container' - ], - 'newsletter' => [ - 'newsletter-popup', - 'subscribe-form', - 'signup-overlay' - ] + 'subscription', + 'subscriber-content', + 'premium-content', + 'signin-wall', + 'register-wall', + 'paid-content', + 'premium-article', + 'subscription-box', + 'piano-offer', + 'piano-inline', + 'piano-modal', + 'paywall-container', + 'paywall-overlay', + 'paywall-wrapper', + 'paywall-notification', + 'leaky_paywall_message_wrap', + 'subscribe-form', + 'signup-overlay' ], 'scriptTagRemove' => [ - 'tracking' => [ - 'gtm.js', - 'ga.js', - 'fbevents.js', - 'pixel.js', - 'chartbeat', - 'analytics.js', - 'cmp.js', - ], - 'paywall' => [ - 'wall.js', - 'paywall.js', - 'subscriber.js', - 'piano.js', - 'tiny.js', - 'pywll.js', - 'content-gate.js', - 'signwall.js', - 'pw.js', - 'pw-', - 'piano-', - 'tinypass.js', - 'tinypass.min.js', - 'tp.min.js', - 'premium.js', - 'amp-access-0.1.js', - 'zephrBarriersScripts', - ], - 'cookies' => [ - 'cookie', - 'gdpr', - 'lgpd' - ], - 'misc' => [ - 'push', - 'sw.js', - 'stats.js' - ] + 'gtm.js', + 'ga.js', + 'fbevents.js', + 'pixel.js', + 'chartbeat', + 'analytics.js', + 'cmp.js', + 'wall.js', + 'paywall.js', + 'subscriber.js', + 'piano.js', + 'tiny.js', + 'pywll.js', + 'content-gate.js', + 'signwall.js', + 'pw.js', + 'pw-', + 'piano-', + 'tinypass.js', + 'tinypass.min.js', + 'tp.min.js', + 'premium.js', + 'amp-access-0.1.js', + 'zephrBarriersScripts', + 'leaky-paywall', + 'cookie', + 'gdpr', + 'lgpd', + 'push', + 'sw.js', + 'stats.js' ] ]; diff --git a/app/inc/Rules.php b/app/inc/Rules.php index 30a5994..4eca657 100644 --- a/app/inc/Rules.php +++ b/app/inc/Rules.php @@ -15,24 +15,27 @@ class Rules * * Configurações possíveis para cada domínio: * @var array - * - * - idElementRemove: IDs de elementos HTML que devem ser removidos - * - classElementRemove: Classes de elementos HTML que devem ser removidos - * - scriptTagRemove: Scripts que devem ser removidos - * - cookies: Cookies que devem ser definidos ou removidos - * - classAttrRemove: Classes que devem ser removidas de elementos - * - clearStorage: Se deve limpar o storage do navegador - * - customCode: Código JavaScript personalizado para execução - * - excludeGlobalRules: Array de regras globais a serem excluídas - * - userAgent: User Agent personalizado - * - headers: Headers HTTP personalizados - * - fixRelativeUrls: Habilita correção de URLs relativas */ private $domainRules = DOMAIN_RULES; // Regras globais expandidas private $globalRules = GLOBAL_RULES; + /** + * Lista de tipos de regras suportados + * @var array + */ + private $supportedRuleTypes = [ + 'userAgent', + 'headers', + 'idElementRemove', + 'classElementRemove', + 'scriptTagRemove', + 'cookies', + 'classAttrRemove', + 'customCode' + ]; + /** * Obtém o domínio base removendo o prefixo www * @@ -103,32 +106,57 @@ class Rules private function mergeWithGlobalRules($rules) { $globalRules = $this->getGlobalRules(); + $mergedRules = $rules; + // Processa excludeGlobalRules primeiro + $excludedRules = []; if (isset($rules['excludeGlobalRules']) && is_array($rules['excludeGlobalRules'])) { - foreach ($rules['excludeGlobalRules'] as $ruleType => $categories) { - if (isset($globalRules[$ruleType])) { - foreach ($categories as $category => $itemsToExclude) { - if (isset($globalRules[$ruleType][$category])) { - $globalRules[$ruleType][$category] = array_diff( - $globalRules[$ruleType][$category], - $itemsToExclude - ); - } + foreach ($rules['excludeGlobalRules'] as $ruleType => $excluded) { + if (isset($excluded) && is_array($excluded)) { + foreach ($excluded as $category => $items) { + $excludedRules[$ruleType] = array_merge( + $excludedRules[$ruleType] ?? [], + (array)$items + ); } } } } - foreach ($globalRules as $ruleType => $categories) { - if (!isset($rules[$ruleType])) { - $rules[$ruleType] = []; - } - foreach ($categories as $category => $items) { - $rules[$ruleType] = array_merge($rules[$ruleType], $items); + // Mescla cada tipo de regra suportado + foreach ($this->supportedRuleTypes as $ruleType) { + if (isset($globalRules[$ruleType])) { + if (!isset($mergedRules[$ruleType])) { + $mergedRules[$ruleType] = []; + } + + // Garante que estamos trabalhando com arrays + $domainTypeRules = (array)$mergedRules[$ruleType]; + $globalTypeRules = (array)$globalRules[$ruleType]; + + // Aplica exclusões se existirem para este tipo + if (isset($excludedRules[$ruleType])) { + $globalTypeRules = array_diff($globalTypeRules, $excludedRules[$ruleType]); + } + + // Mescla as regras + if (in_array($ruleType, ['cookies', 'headers'])) { + // Para cookies e headers, preserva as chaves + $mergedRules[$ruleType] = array_merge($globalTypeRules, $domainTypeRules); + } else { + // Para outros tipos, mescla como arrays simples + $mergedRules[$ruleType] = array_values(array_unique(array_merge( + $domainTypeRules, + $globalTypeRules + ))); + } } } - return $rules; + // Remove excludeGlobalRules do resultado final + unset($mergedRules['excludeGlobalRules']); + + return $mergedRules; } /** diff --git a/app/inc/URLAnalyzer.php b/app/inc/URLAnalyzer.php index 4dc80ce..3a61c30 100644 --- a/app/inc/URLAnalyzer.php +++ b/app/inc/URLAnalyzer.php @@ -804,7 +804,7 @@ class URLAnalyzer foreach ($elements as $element) { if ($element instanceof DOMElement) { $style = $element->getAttribute('style'); - $style = preg_replace('/(max-height|height|overflow|position|display)\s*:\s*[^;]+;?/', '', $style); + $style = preg_replace('/(max-height|height|overflow|position|display|visibility)\s*:\s*[^;]+;?/', '', $style); $element->setAttribute('style', $style); } }