%PDF- %PDF-
| Direktori : /data/www_bck/varak.net_bck/gnufm.varak.net/vendor/bin/ |
| Current File : //data/www_bck/varak.net_bck/gnufm.varak.net/vendor/bin/tsmarty2c.php |
#!/usr/bin/env php
<?php
/**
* tsmarty2c.php - rips gettext strings from smarty template
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* This commandline script rips gettext strings from smarty file,
* and prints them to stdout in already gettext encoded format, which you can
* later manipulate with standard gettext tools.
*
* Usage:
* ./tsmarty2c.php -o template.pot <filename or directory> <file2> <..>
*
* If a parameter is a directory, the template files within will be parsed.
*
* @package smarty-gettext
* @link https://github.com/glensc/smarty-gettext
* @author Sagi Bashari <sagi@boom.org.il>
* @author Elan Ruusamäe <glen@delfi.ee>
* @copyright 2004-2005 Sagi Bashari
* @copyright 2010-2013 Elan Ruusamäe
*/
// smarty open tag
$ldq = preg_quote('{');
// smarty close tag
$rdq = preg_quote('}');
// smarty command
$cmd = preg_quote('t');
// extensions of smarty files, used when going through a directory
$extensions = array('tpl');
// we msgcat found strings from each file.
// need header for each temporary .pot file to be merged.
// https://help.launchpad.net/Translations/YourProject/PartialPOExport
define('MSGID_HEADER', 'msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
');
// "fix" string - strip slashes, escape and convert new lines to \n
function fs($str) {
$str = stripslashes($str);
$str = str_replace('"', '\"', $str);
$str = str_replace("\n", '\n', $str);
return $str;
}
function lineno_from_offset($content, $offset) {
return substr_count($content, "\n", 0, $offset) + 1;
}
function msgmerge($outfile, $data) {
// skip empty
if (empty($data)) {
return;
}
// write new data to tmp file
$tmp = tempnam(TMPDIR, 'tsmarty2c');
file_put_contents($tmp, $data);
// temp file for result cat
$tmp2 = tempnam(TMPDIR, 'tsmarty2c');
passthru('msgcat -o '.escapeshellarg($tmp2).' '.escapeshellarg($outfile).' '.escapeshellarg($tmp), $rc);
unlink($tmp);
if ($rc) {
fwrite(STDERR, "msgcat failed with $rc\n");
exit($rc);
}
// rename if output was produced
if (file_exists($tmp2)) {
rename($tmp2, $outfile);
}
}
// rips gettext strings from $file and prints them in C format
function do_file($outfile, $file) {
$content = file_get_contents($file);
if (empty($content)) {
return;
}
global $ldq, $rdq, $cmd;
preg_match_all(
"/{$ldq}\s*({$cmd})\s*([^{$rdq}]*){$rdq}+([^{$ldq}]*){$ldq}\/\\1{$rdq}/",
$content,
$matches,
PREG_OFFSET_CAPTURE
);
$msgids = array();
$msgids_plural = array();
for ($i = 0; $i < count($matches[0]); $i++) {
if (preg_match('/plural\s*=\s*["\']?\s*(.[^\"\']*)\s*["\']?/', $matches[2][$i][0], $match)) {
$msgid = $matches[3][$i][0];
$msgids_plural[$msgid] = $match[1];
} else {
$msgid = $matches[3][$i][0];
}
$lineno = lineno_from_offset($content, $matches[2][$i][1]);
$msgids[$msgid][] = "$file:$lineno";
}
ob_start();
echo MSGID_HEADER;
foreach ($msgids as $msgid => $files) {
echo "#: ", join(' ', $files), "\n";
if (isset($msgids_plural[$msgid])) {
echo 'msgid "'.fs($msgid).'"', "\n";
echo 'msgid_plural "'.fs($msgids_plural[$msgid]).'"', "\n";
echo 'msgstr[0] ""', "\n";
echo 'msgstr[1] ""', "\n";
} else {
echo 'msgid "'.fs($msgid).'"', "\n";
echo 'msgstr ""', "\n";
}
echo "\n";
}
$out = ob_get_contents();
ob_end_clean();
msgmerge($outfile, $out);
}
// go through a directory
function do_dir($outfile, $dir) {
$d = dir($dir);
while (false !== ($entry = $d->read())) {
if ($entry == '.' || $entry == '..') {
continue;
}
$entry = $dir.'/'.$entry;
if (is_dir($entry)) { // if a directory, go through it
do_dir($outfile, $entry);
} else { // if file, parse only if extension is matched
$pi = pathinfo($entry);
if (isset($pi['extension']) && in_array($pi['extension'], $GLOBALS['extensions'])) {
do_file($outfile, $entry);
}
}
}
$d->close();
}
if ('cli' != php_sapi_name()) {
error_log("ERROR: This program is for command line mode only.");
exit(1);
}
define('PROGRAM', basename(array_shift($argv)));
define('TMPDIR', sys_get_temp_dir());
$opt = getopt('o:');
$outfile = isset($opt['o']) ? $opt['o'] : tempnam(TMPDIR, 'tsmarty2c');
// remove -o FILENAME from $argv.
if (isset($opt['o'])) {
foreach ($argv as $i => $v) {
if ($v != '-o') {
continue;
}
unset($argv[$i]);
unset($argv[$i + 1]);
break;
}
}
// initialize output
file_put_contents($outfile, MSGID_HEADER);
// process dirs/files
foreach ($argv as $arg) {
if (is_dir($arg)) {
do_dir($outfile, $arg);
} else {
do_file($outfile, $arg);
}
}
// output and cleanup
if (!isset($opt['o'])) {
echo file_get_contents($outfile);
unlink($outfile);
}