Commit 944edcd0 authored by Dries's avatar Dries
Browse files

- Patch #733192 by pillarsdotnet, Sutharsan, Letharion, clemens.tolboom:...

- Patch #733192 by pillarsdotnet, Sutharsan, Letharion, clemens.tolboom: tokens enclosed in [ ] are not recognized.
parent 1c26ef0e
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* *
* Tokens follow the form: [$type:$name], where $type is a general class of * Tokens follow the form: [$type:$name], where $type is a general class of
* tokens like 'node', 'user', or 'comment' and $name is the name of a given * tokens like 'node', 'user', or 'comment' and $name is the name of a given
* placeholder. For example, [node:title]. * placeholder. For example, [node:title] or [node:created:since].
* *
* In addition to raw text containing placeholders, modules may pass in an array * In addition to raw text containing placeholders, modules may pass in an array
* of objects to be used when performing the replacement. The objects should be * of objects to be used when performing the replacement. The objects should be
...@@ -103,9 +103,16 @@ function token_replace($text, array $data = array(), array $options = array()) { ...@@ -103,9 +103,16 @@ function token_replace($text, array $data = array(), array $options = array()) {
* An associative array of discovered tokens, grouped by type. * An associative array of discovered tokens, grouped by type.
*/ */
function token_scan($text) { function token_scan($text) {
// Matches tokens with the following pattern: [$type:$token] // Matches tokens with the following pattern: [$type:$name]
// $type and $token may not contain white spaces. // $type and $name may not contain [ ] or whitespace characters.
preg_match_all('/\[([^\s\]:]*):([^\s\]]*)\]/', $text, $matches); // $type may not contain : characters, but $name may.
preg_match_all('/
\[ # [ - pattern start
([^\s\[\]:]*) # match $type not containing whitespace : [ or ]
: # : - separator
([^\s\[\]]*) # match $name not containing whitespace [ or ]
\] # ] - pattern end
/x', $text, $matches);
$types = $matches[1]; $types = $matches[1];
$tokens = $matches[2]; $tokens = $matches[2];
......
...@@ -1595,6 +1595,35 @@ class TokenReplaceTestCase extends DrupalWebTestCase { ...@@ -1595,6 +1595,35 @@ class TokenReplaceTestCase extends DrupalWebTestCase {
$this->assertEqual($generated['[node:title]'], $node->title, t('Unsanitized token generated properly.')); $this->assertEqual($generated['[node:title]'], $node->title, t('Unsanitized token generated properly.'));
} }
/**
* Test whether token-replacement works in various contexts.
*/
function testSystemTokenRecognition() {
global $language;
// Generate prefixes and suffixes for the token context.
$tests = array(
array('prefix' => 'this is the ', 'suffix' => ' site'),
array('prefix' => 'this is the', 'suffix' => 'site'),
array('prefix' => '[', 'suffix' => ']'),
array('prefix' => '', 'suffix' => ']]]'),
array('prefix' => '[[[', 'suffix' => ''),
array('prefix' => ':[:', 'suffix' => '--]'),
array('prefix' => '-[-', 'suffix' => ':]:'),
array('prefix' => '[:', 'suffix' => ']'),
array('prefix' => '[site:', 'suffix' => ':name]'),
array('prefix' => '[site:', 'suffix' => ']'),
);
// Check if the token is recognized in each of the contexts.
foreach ($tests as $test) {
$input = $test['prefix'] . '[site:name]' . $test['suffix'];
$expected = $test['prefix'] . 'Drupal' . $test['suffix'];
$output = token_replace($input, array(), array('language' => $language));
$this->assertTrue($output == $expected, t('Token recognized in string %string', array('%string' => $input)));
}
}
/** /**
* Tests the generation of all system site information tokens. * Tests the generation of all system site information tokens.
*/ */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment