false, 'unnecessaryTitles' => false, ]; protected function run(array $arguments) { foreach ($arguments as $method => $run) { if (!$run) { continue; } $methodName = 'fix_'.ucfirst($method); if (!method_exists($this, $methodName)) { continue; } $this->log('Running "'.$method.'"...'); $this->{$methodName}(); $this->log('Done "'.$method.'"'); } $this->fix_StrongTexts(); } public function fix_UnnecessaryTitles(): void { $stats = [ 'defaultUpdated' => 0, 'translatedUpdated' => 0, ]; $filterSpec = Operator::andX( Operator::orX( Operator::like(['content' => '%POPIS%']), Operator::like(['content' => '% '%font size="5"%']), ), Operator::like(['json_content' => '%legacy%']) ); $qb = sqlQueryBuilder() ->select('id, content, json_content') ->from('blocks') ->where($filterSpec); $config = \HTMLPurifier_Config::createDefault(); $config->set('AutoFormat.AutoParagraph', true); $config->set('AutoFormat.RemoveEmpty', true); $purifier = new \HTMLPurifier($config); $prepareBlockData = function (array $item) use ($purifier) { $lines = explode(PHP_EOL, $item['content']); $firstLineRemoved = false; foreach ($lines as $index => $line) { if ($index === 0 && count($lines) > 1 && (str_contains($line, 'font size="5"') || str_contains($line, 'popis')) { unset($lines[$index]); } } // odebrat br na zacatku textu, ktere tam jsou ted zbytecne foreach ($lines as $index => $line) { if (preg_match('/^$/', trim($line))) { unset($lines[$index]); continue; } // jakmile jednou podminka nebude platit, tak prestavam break; } $content = implode(PHP_EOL, $lines); $content = $purifier->purify($content); $json = json_decode($item['json_content'], true); $json[0]['settings']['html'] = $content; return [ 'content' => $content, 'json_content' => json_encode($json), ]; }; // base language foreach ($qb->execute() as $item) { $update = $prepareBlockData($item); sqlQueryBuilder() ->update('blocks') ->directValues($update) ->where(Operator::equals(['id' => $item['id']])) ->execute(); $stats['defaultUpdated']++; } $qb = sqlQueryBuilder() ->select('id, content, json_content') ->from('blocks_translations') ->where($filterSpec); // translations foreach ($qb->execute() as $item) { $update = $prepareBlockData($item); sqlQueryBuilder() ->update('blocks_translations') ->directValues($update) ->where(Operator::equals(['id' => $item['id']])) ->execute(); $stats['translatedUpdated']++; } foreach ($stats as $name => $value) { $this->log("{$name}: {$value}"); } } /** * Fixes the strong texts in the 'blocks' and 'blocks_translations' tables. * * This method searches for invalid strong text syntax, represented by two asterisks (**), in the 'content' column * of the 'blocks' and 'blocks_translations' tables. It replaces the invalid syntax with the correct HTML strong tag. * The method updates the 'content' and 'json_content' columns in both tables to reflect the changes. */ public function fix_StrongTexts(): void { $qb = sqlQueryBuilder() ->select('id, content, json_content') ->from('blocks') ->where("content REGEXP '\\\\*\\\\*.+\\\\*\\\\*'"); $updateBlock = function (array $block) { $removeInvalidSyntax = fn (string $content) => preg_replace_callback('/\*\*(.+?)\*\*/', fn ($x) => ''.trim($x[1]).'', $content); $block['content'] = $removeInvalidSyntax($block['content']); $data = json_decode($block['json_content'], true) ?? []; if (($data[0]['type'] ?? null) === 'legacy') { $data[0]['settings']['html'] = $removeInvalidSyntax($data[0]['settings']['html']); } $block['json_content'] = json_encode($data); return $block; }; foreach ($qb->execute() as $item) { $block = $updateBlock($item); sqlQueryBuilder() ->update('blocks') ->directValues( [ 'content' => $block['content'], 'json_content' => $block['json_content'], ] ) ->where(Operator::equals(['id' => $item['id']])) ->execute(); } $qbTranslations = sqlQueryBuilder() ->select('id, content, json_content') ->from('blocks_translations') ->where("content REGEXP '\\\\*\\\\*.+\\\\*\\\\*'"); foreach ($qbTranslations->execute() as $item) { $block = $updateBlock($item); sqlQueryBuilder() ->update('blocks_translations') ->directValues( [ 'content' => $block['content'], 'json_content' => $block['json_content'], ] ) ->where(Operator::equals(['id' => $item['id']])) ->execute(); } } } return ZNZFixBlocksScript::class;