| Yannick Torres | | Mehdi Achour | | Maciej Sobaczewski | +----------------------------------------------------------------------+ */ $TRANSLATION_STATUSES = [ 'TranslatedOk' => 'Up to date', 'TranslatedOld' => 'Outdated', 'TranslatedWip' => 'Work in progress', 'RevTagProblem' => 'No revision tag', 'NotInEnTree' => 'Not in EN tree', 'Untranslated' => 'Available for translation', ]; function get_language_intro($idx, $lang) { $result = $idx->query("SELECT intro FROM languages WHERE lang = '$lang'"); $answer = $result->fetchArray(); return is_array($answer) ? $answer[0] : null; } // Return an array of directory containing outdated files function get_dirs($idx, $lang) { $sql = <<query($sql); $tmp = array(); while ($r = $result->fetchArray()) { $tmp[$r['dir']] = $r['dir']; } return $tmp; } // return an array with the outdated files; can be optionally filtered by user or dir function get_outdated_files($idx, $lang, $filter = null, $value = null) { $value = SQLite3::escapeString($value ?? ''); $sql_filter = match ($filter) { 'dir' => "AND path = '{$value}'", 'translator' => "AND maintainer = '{$value}'", default => '' }; $sql = <<query($sql); $tmp = array(); while ($r = $result->fetchArray(SQLITE3_ASSOC)) { $tmp[] = $r; } return $tmp; } // Return an array of available languages for manual function revcheck_available_languages($idx) { $result = $idx->query('SELECT lang FROM languages'); while ($row = $result->fetchArray(SQLITE3_NUM)) { $tmp[] = $row[0]; } return $tmp; } function get_missfiles($idx, $lang) { $sql = <<query($sql); while ($r = $result->fetchArray(SQLITE3_ASSOC)) { $tmp[] = $r; } return $tmp; } function get_oldfiles($idx, $lang) { $sql = <<query($sql); $tmp = array(); while ($r = $result->fetchArray(SQLITE3_ASSOC)) { $tmp[] = $r; } return $tmp; } function get_misstags($idx, $lang) { $sql = <<query($sql); while($row = $result->fetchArray()) { $tmp[] = $row; } return $tmp; } function get_translators($idx, $lang) { $sql = <<query($sql); while ($r = $result->fetchArray(SQLITE3_ASSOC)) { $persons[$r['nick']] = $r; } return $persons; } /* * Returns statistics for specified language */ function get_lang_stats($idx, $lang) { $sql = <<query($sql); $stats = []; $total = [ 'total' => 0, 'size' => 0 ]; while ($row = $result->fetchArray(SQLITE3_ASSOC)) { $stats[$row['status']] = $row; if ($row['status'] != 'NotInEnTree') { $total['total'] += $row['total']; $total['size'] += $row['size']; } } if ($total['total'] > 0) { $stats['total'] = $total; } return $stats; } function showdiff () { if (isset($_GET['f'])) { $gitfile = $_GET['f']; if (isset($_GET['hbp'])) $h = $_GET['hbp']; if (isset($_GET['c'])) $c = $_GET['c']; $cwd = getcwd(); $safedir = 'safe.directory=' . GIT_DIR . 'en'; chdir( GIT_DIR . 'en' ); $arg_h = escapeshellarg($h); $arg_f = escapeshellarg($gitfile); $file = `git -c {$safedir} diff --ignore-space-at-eol {$arg_h} -- {$arg_f}`; if ($file == null) $file = `git -c {$safedir} diff {$arg_h} -- {$arg_f}`; $hash = `git -c {$safedir} log -n 1 --pretty=format:%H -- {$arg_f}`; chdir( $cwd ); if (!$file) return; $raw = htmlspecialchars( $file, ENT_XML1, 'UTF-8' ); $lines = explode ( "\n" , $raw ); echo "
"; $codeStyles = 'flex-grow: 1; min-width: 0; white-space: pre-wrap; padding: 0 4px;'; $lineNumberStyles = 'flex: 0 0 40px; text-align: right; user-select: none; padding: 0 4px;'; // Base gray palette $addBg = 'background-color: #f0f0f0;'; $addAccentBg = 'background-color: #d8d8d8;'; $delBg = $addBg; $delAccentBg = $addAccentBg; $tagBg = $addBg; $tagAccentBg = $addAccentBg; // Override palette for colored diff if ($c == 'on') { $addBg = 'background-color: #e6ffec;'; $addAccentBg = 'background-color: #ccffd8;'; $delBg = 'background-color: #ffebe9;'; $delAccentBg = 'background-color: #ffd7d5;'; $tagBg = 'background-color: #eff0f6;'; $tagAccentBg = 'background-color: #d4d8e7;'; } echo "
$gitfile
$hash
"; // Count how many lines to skip diff header $diffStartLine = substr_count($raw, "\n", 0, strpos($raw, " @@")); foreach (array_slice($lines, $diffStartLine) as $line) { $fc = substr($line, 0, 1); $code = substr($line, 1); if ($code === '') { $code = "
"; } echo "
"; if ($fc == "+") { echo "
"; echo "
$newLineNumber
"; echo "
$fc
"; echo "
" . $code . "
\n"; $newLineNumber++; } else if ($fc == "-") { echo "
$oldLineNumber
"; echo "
"; echo "
$fc
"; echo "
" . $code . "
\n"; $oldLineNumber++; } else if ($fc == "@") { preg_match('/-(\d+),\d+ \+(\d+)/', $line, $matches); $oldLineNumber = $matches[1]; $newLineNumber = $matches[2]; echo "
...
"; echo "
...
"; echo "
"; echo "
$line
\n"; } else { echo "
$oldLineNumber
"; echo "
$newLineNumber
"; echo "
"; echo "
" . $code . "
\n"; $oldLineNumber++; $newLineNumber++; } echo '
'; } echo "

"; } } function gen_date($file) { $unix = filemtime($file); return ''; }