summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2011-04-23 20:09:54 -0400
committerDries Buytaert <dries@buytaert.net>2011-04-23 20:09:54 -0400
commitd379f3d7bdfe4ef9c0f0fe629394048229d6c2e2 (patch)
tree851846fad7e3cd46f28f11827c6b9f13c9870d0c
parent7418dedf51659f3d1840486477b74755928bc89a (diff)
downloadbrdo-d379f3d7bdfe4ef9c0f0fe629394048229d6c2e2.tar.gz
brdo-d379f3d7bdfe4ef9c0f0fe629394048229d6c2e2.tar.bz2
- Patch #733192 by pillarsdotnet, Sutharsan, Letharion, clemens.tolboom: tokens enclosed in [ ] are not recognized.
-rw-r--r--includes/token.inc15
-rw-r--r--modules/system/system.test29
2 files changed, 40 insertions, 4 deletions
diff --git a/includes/token.inc b/includes/token.inc
index c31f9e6c3..63481f788 100644
--- a/includes/token.inc
+++ b/includes/token.inc
@@ -17,7 +17,7 @@
*
* 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
- * 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
* 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()) {
* An associative array of discovered tokens, grouped by type.
*/
function token_scan($text) {
- // Matches tokens with the following pattern: [$type:$token]
- // $type and $token may not contain white spaces.
- preg_match_all('/\[([^\s\]:]*):([^\s\]]*)\]/', $text, $matches);
+ // Matches tokens with the following pattern: [$type:$name]
+ // $type and $name may not contain [ ] or whitespace characters.
+ // $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];
$tokens = $matches[2];
diff --git a/modules/system/system.test b/modules/system/system.test
index fb6a6e867..cba19f3ff 100644
--- a/modules/system/system.test
+++ b/modules/system/system.test
@@ -1596,6 +1596,35 @@ class TokenReplaceTestCase extends DrupalWebTestCase {
}
/**
+ * 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.
*/
function testSystemSiteTokenReplacement() {