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;