phpmyadmin/libraries/classes/Command/AdvisoryRulesCommand.php
Maurício Meneghini Fauth adea61314e Add a console tool
Adds a console tool for phpMyAdmin using the symfony/console component
and moves the advisor2po script to the the console tool.

Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
2019-10-11 22:04:26 -03:00

113 lines
3.3 KiB
PHP

<?php
/**
* Translates advisory rules to Gettext format
*
* @package PhpMyAdmin\Command
*/
declare(strict_types=1);
namespace PhpMyAdmin\Command;
use PhpMyAdmin\Advisor;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Translates advisory rules to Gettext format
*
* @package PhpMyAdmin\Command
*/
class AdvisoryRulesCommand extends Command
{
/** @var string */
protected static $defaultName = 'po:advisory-rules';
/** @var array */
private $messages = [];
/** @var array */
private $locations = [];
/**
* @return void
*/
protected function configure(): void
{
$this->setDescription('Translates advisory rules to Gettext format');
$this->setHelp(
'This command parses advisory rules and output them'
. ' as Gettext POT formatted strings for translation.'
);
}
/**
* @param InputInterface $input input
* @param OutputInterface $output output
*
* @return void
*/
protected function execute(InputInterface $input, OutputInterface $output): void
{
$ruleFiles = [];
$ruleFiles[Advisor::GENERIC_RULES_FILE] = Advisor::parseRulesFile(
Advisor::GENERIC_RULES_FILE
);
$ruleFiles[Advisor::BEFORE_MYSQL80003_RULES_FILE] = Advisor::parseRulesFile(
Advisor::BEFORE_MYSQL80003_RULES_FILE
);
foreach ($ruleFiles as $file => $rules) {
foreach ($rules['rules'] as $idx => $rule) {
$this->addMessage($file, $rules, $idx, 'name');
$this->addMessage($file, $rules, $idx, 'issue');
$this->addMessage($file, $rules, $idx, 'recommendation');
$this->addMessage($file, $rules, $idx, 'justification');
}
}
foreach ($this->messages as $index => $message) {
$output->writeln('');
$output->write('#: ');
$output->writeln(implode(' ', $this->locations[$index]));
if (strstr($this->messages[$index], '%') !== false) {
$output->writeln('#, php-format');
}
$output->write('msgid "');
$output->write(addcslashes(
Advisor::escapePercent($this->messages[$index]),
'"\\'
));
$output->writeln('"');
$output->writeln('msgstr ""');
}
}
/**
* @param string $file file name
* @param array $rules rules array
* @param int $index rule index
* @param string $type rule type
*
* @return void
*/
private function addMessage(string $file, array $rules, int $index, string $type): void
{
if ($type == 'justification') {
$messages = Advisor::splitJustification($rules['rules'][$index]);
$message = $messages[0];
} else {
$message = $rules['rules'][$index][$type];
}
$line = $file . ':' . $rules['lines'][$index][$type];
$pos = array_search($message, $this->messages);
if ($pos === false) {
$this->messages[] = $message;
$this->locations[] = [$line];
} else {
$this->locations[$pos][] = $line;
}
}
}