Skip to content
Browse files

Refactoring extract shell. Supporting use of $foo['bar'] as $count.

  • Loading branch information...
1 parent ff04c76 commit ae89e709d2b48df183e49ff3a53077a5c55d7d2d @renan renan committed
View
105 cake/console/libs/tasks/extract.php
@@ -280,13 +280,13 @@ function __extractTokens() {
}
}
unset($allTokens);
- $this->basic();
- $this->basic('__c');
- $this->extended();
- $this->extended('__dc', 2);
- $this->extended('__n', 0, true);
- $this->extended('__dn', 2, true);
- $this->extended('__dcn', 4, true);
+ $this->__parse('__', array('singular'));
+ $this->__parse('__n', array('singular', 'plural'));
+ $this->__parse('__d', array('domain', 'singular'));
+ $this->__parse('__c', array('singular'));
+ $this->__parse('__dc', array('domain', 'singular'));
+ $this->__parse('__dn', array('domain', 'singular', 'plural'));
+ $this->__parse('__dcn', array('domain', 'singular', 'plural'));
}
$this->__buildFiles();
$this->__writeFiles();
@@ -294,50 +294,13 @@ function __extractTokens() {
}
/**
- * Will parse __(), __c() functions
+ * Parse tokens
*
* @param string $functionName Function name that indicates translatable string (e.g: '__')
+ * @param array $map Array containing what variables it will find (e.g: domain, singular, plural)
* @access public
*/
- function basic($functionName = '__') {
- $count = 0;
- $tokenCount = count($this->__tokens);
-
- while (($tokenCount - $count) > 3) {
- list($countToken, $parenthesis, $middle, $right) = array($this->__tokens[$count], $this->__tokens[$count + 1], $this->__tokens[$count + 2], $this->__tokens[$count + 3]);
- if (!is_array($countToken)) {
- $count++;
- continue;
- }
-
- list($type, $string, $line) = $countToken;
- if (($type == T_STRING) && ($string == $functionName) && ($parenthesis == '(')) {
-
- if (in_array($right, array(')', ','))
- && (is_array($middle) && ($middle[0] == T_CONSTANT_ENCAPSED_STRING))) {
-
- if ($this->__oneFile === true) {
- $this->__strings[$this->__formatString($middle[1])][$this->__file][] = $line;
- } else {
- $this->__strings[$this->__file][$this->__formatString($middle[1])][] = $line;
- }
- } else {
- $this->__markerError($this->__file, $line, $functionName, $count);
- }
- }
- $count++;
- }
- }
-
-/**
- * Will parse __d(), __dc(), __n(), __dn(), __dcn()
- *
- * @param string $functionName Function name that indicates translatable string (e.g: '__')
- * @param integer $shift Number of parameters to shift to find translateable string
- * @param boolean $plural Set to true if function supports plural format, false otherwise
- * @access public
- */
- function extended($functionName = '__d', $shift = 0, $plural = false) {
+ function __parse($functionName, $map) {
$count = 0;
$tokenCount = count($this->__tokens);
@@ -362,50 +325,28 @@ function extended($functionName = '__d', $shift = 0, $plural = false) {
$position++;
}
- if ($plural) {
- $end = $position + $shift + 7;
-
- if ($this->__tokens[$position + $shift + 5] === ')') {
- $end = $position + $shift + 5;
+ $mapCount = count($map);
+ $strings = array();
+ while (count($strings) < $mapCount && ($this->__tokens[$position] == ',' || $this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING)) {
+ if ($this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING) {
+ $strings[] = $this->__tokens[$position][1];
}
-
- if (empty($shift)) {
- list($singular, $firstComma, $plural, $seoncdComma, $endParenthesis) = array($this->__tokens[$position], $this->__tokens[$position + 1], $this->__tokens[$position + 2], $this->__tokens[$position + 3], $this->__tokens[$end]);
- $condition = ($seoncdComma == ',');
- } else {
- list($domain, $firstComma, $singular, $seoncdComma, $plural, $comma3, $endParenthesis) = array($this->__tokens[$position], $this->__tokens[$position + 1], $this->__tokens[$position + 2], $this->__tokens[$position + 3], $this->__tokens[$position + 4], $this->__tokens[$position + 5], $this->__tokens[$end]);
- $condition = ($comma3 == ',');
- }
- $condition = $condition &&
- (is_array($singular) && ($singular[0] == T_CONSTANT_ENCAPSED_STRING)) &&
- (is_array($plural) && ($plural[0] == T_CONSTANT_ENCAPSED_STRING));
- } else {
- if ($this->__tokens[$position + $shift + 5] === ')') {
- $comma = $this->__tokens[$position + $shift + 3];
- $end = $position + $shift + 5;
- } else {
- $comma = null;
- $end = $position + $shift + 3;
- }
-
- list($domain, $firstComma, $text, $seoncdComma, $endParenthesis) = array($this->__tokens[$position], $this->__tokens[$position + 1], $this->__tokens[$position + 2], $comma, $this->__tokens[$end]);
- $condition = ($seoncdComma == ',' || $seoncdComma === null) &&
- (is_array($domain) && ($domain[0] == T_CONSTANT_ENCAPSED_STRING)) &&
- (is_array($text) && ($text[0] == T_CONSTANT_ENCAPSED_STRING));
+ $position++;
}
- if (($endParenthesis == ')') && $condition) {
+ if ($mapCount == count($strings)) {
+ extract(array_combine($map, $strings));
if ($this->__oneFile === true) {
- if ($plural) {
- $this->__strings[$this->__formatString($singular[1]) . "\0" . $this->__formatString($plural[1])][$this->__file][] = $line;
+ if (isset($plural)) {
+ $this->__strings[$this->__formatString($singular) . "\0" . $this->__formatString($plural)][$this->__file][] = $line;
} else {
- $this->__strings[$this->__formatString($text[1])][$this->__file][] = $line;
+ $this->__strings[$this->__formatString($singular)][$this->__file][] = $line;
}
} else {
if ($plural) {
- $this->__strings[$this->__file][$this->__formatString($singular[1]) . "\0" . $this->__formatString($plural[1])][] = $line;
+ $this->__strings[$this->__file][$this->__formatString($singular) . "\0" . $this->__formatString($plural)][] = $line;
} else {
- $this->__strings[$this->__file][$this->__formatString($text[1])][] = $line;
+ $this->__strings[$this->__file][$this->__formatString($singular)][] = $line;
}
}
} else {
View
12 cake/tests/cases/console/libs/tasks/extract.test.php
@@ -107,6 +107,7 @@ function testExecute() {
$pattern = '/"Plural-Forms\: nplurals\=INTEGER; plural\=EXPRESSION;/';
$this->assertPattern($pattern, $result);
+ // home.ctp
$pattern = '/msgid "Your tmp directory is writable."\nmsgstr ""\n/';
$this->assertPattern($pattern, $result);
$pattern = '/msgid "Your tmp directory is NOT writable."\nmsgstr ""\n/';
@@ -134,6 +135,17 @@ function testExecute() {
$pattern .= 'edit: %s.*You can also add some CSS styles for your pages at: %s"\nmsgstr ""/s';
$this->assertPattern($pattern, $result);
+ // extract.ctp
+ $pattern = '/msgid "You have %d new message."\nmsgid_plural "You have %d new messages."/';
+ $this->assertPattern($pattern, $result);
+ $pattern = '/msgid "You deleted %d message."\nmsgid_plural "You deleted %d messages."/';
+ $this->assertPattern($pattern, $result);
+
+ $pattern = '/msgid "You have %d new message \(domain\)."\nmsgid_plural "You have %d new messages \(domain\)."/';
+ $this->assertPattern($pattern, $result);
+ $pattern = '/msgid "You deleted %d message \(domain\)."\nmsgid_plural "You deleted %d messages \(domain\)."/';
+ $this->assertPattern($pattern, $result);
+
$Folder = new Folder($path);
$Folder->delete();
}
View
11 cake/tests/test_app/views/pages/extract.ctp
@@ -0,0 +1,11 @@
+<?php
+$count = 10;
+$message = array('count' => 10);
+
+// Plural
+__n('You have %d new message.', 'You have %d new messages.', $count);
+__n('You deleted %d message.', 'You deleted %d messages.', $messages['count']);
+
+// Domain Plural
+__dn('domain', 'You have %d new message (domain).', 'You have %d new messages (domain).', '10');
+__dn('domain', 'You deleted %d message (domain).', 'You deleted %d messages (domain).', $messages['count']);

0 comments on commit ae89e70

Please sign in to comment.
Something went wrong with that request. Please try again.