summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrion Vibber <brion@pobox.com>2010-11-29 15:04:21 -0800
committerBrion Vibber <brion@pobox.com>2010-11-29 15:07:55 -0800
commit82799f675f2afa067ecb46e829d9b93b79b773b2 (patch)
tree6e0e974cd2a7245f7a0027b0ae708f8e2435caa7
parentfffc10a23084f1bb4b47de926dc1034c8f9ee9b8 (diff)
Add Nickname test cases for @-reply regexes in common_find_mentions
-rw-r--r--lib/util.php47
-rw-r--r--tests/NicknameTest.php19
2 files changed, 55 insertions, 11 deletions
diff --git a/lib/util.php b/lib/util.php
index c170c8380..317a7aa42 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -564,6 +564,16 @@ function common_render_content($text, $notice)
return $r;
}
+/**
+ * Finds @-mentions within the partially-rendered text section and
+ * turns them into live links.
+ *
+ * Should generally not be called except from common_render_content().
+ *
+ * @param string $text partially-rendered HTML
+ * @param Notice $notice in-progress or complete Notice object for context
+ * @return string partially-rendered HTML
+ */
function common_linkify_mentions($text, $notice)
{
$mentions = common_find_mentions($text, $notice);
@@ -669,17 +679,7 @@ function common_find_mentions($text, $notice)
}
}
- preg_match_all('/^T (' . Nickname::DISPLAY_FMT . ') /',
- $text,
- $tmatches,
- PREG_OFFSET_CAPTURE);
-
- preg_match_all('/(?:^|\s+)@(' . Nickname::DISPLAY_FMT . ')\b/',
- $text,
- $atmatches,
- PREG_OFFSET_CAPTURE);
-
- $matches = array_merge($tmatches[1], $atmatches[1]);
+ $matches = common_find_mentions_raw($text);
foreach ($matches as $match) {
try {
@@ -753,6 +753,31 @@ function common_find_mentions($text, $notice)
return $mentions;
}
+/**
+ * Does the actual regex pulls to find @-mentions in text.
+ * Should generally not be called directly; for use in common_find_mentions.
+ *
+ * @param string $text
+ * @return array of PCRE match arrays
+ */
+function common_find_mentions_raw($text)
+{
+ $tmatches = array();
+ preg_match_all('/^T (' . Nickname::DISPLAY_FMT . ') /',
+ $text,
+ $tmatches,
+ PREG_OFFSET_CAPTURE);
+
+ $atmatches = array();
+ preg_match_all('/(?:^|\s+)@(' . Nickname::DISPLAY_FMT . ')\b/',
+ $text,
+ $atmatches,
+ PREG_OFFSET_CAPTURE);
+
+ $matches = array_merge($tmatches[1], $atmatches[1]);
+ return $matches;
+}
+
function common_render_text($text)
{
$r = htmlspecialchars($text);
diff --git a/tests/NicknameTest.php b/tests/NicknameTest.php
index a59cada7a..f49aeba60 100644
--- a/tests/NicknameTest.php
+++ b/tests/NicknameTest.php
@@ -51,6 +51,25 @@ class NicknameTest extends PHPUnit_Framework_TestCase
}
}
+ /**
+ * Test on the regex matching used in common_find_mentions
+ * (testing on the full notice rendering is difficult as it needs
+ * to be able to pull from global state)
+ *
+ * @dataProvider provider
+ */
+ public function testAtReply($input, $expected, $expectedException=null)
+ {
+ if ($expected == false) {
+ // nothing to do
+ } else {
+ $text = "@{$input} awesome! :)";
+ $matches = common_find_mentions_raw($text);
+ $this->assertEquals(1, count($matches));
+ $this->assertEquals($expected, Nickname::normalize($matches[0][0]));
+ }
+ }
+
static public function provider()
{
return array(