使用facebook api中的offset属性使message_tags可链接

时间:2013-10-25 19:47:50

标签: ruby-on-rails facebook facebook-graph-api

我从Facebook api获得这个帖子对象:

 {
"id"=>"XXX", 
..., 
"message"=>"abcd efg hijkl mn The New York Times opqr", 
"message_tags"=>{
    "18"=>[{
        "id"=>"5281959998", 
        "name"=>"The New York Times", 
        "type"=>"page", 
        "offset"=>18, 
        "length"=>18
        }]
   },
...
} 

如何使用offset和amp;在rails中创建链接到facebook页面长度属性?结果将是这样的:

abcd efg hijkl mn <a href="www.facebook.com/5281959998">The New York Times</a> opqr

1 个答案:

答案 0 :(得分:0)

我现在必须这样做,但是在PHP中。这是我的解决方案:

/**
 * Get message HTML
 *
 * @param string $text The message text
 * @param array $tags The tags array
 * @return string HTML message string with linked tags
 */
public static function getMessageHtml($text, $tags) {
    $doc = new DOMDocument;
    $doc->appendChild($doc->createTextNode($text));
    if (is_array($tags)) {
        foreach ($tags as $tag) {
            $tag = $tag[0];
            $start = 0;
            foreach ($doc->childNodes as $child) {
                if ($tag['offset'] < $start + strlen($child->nodeValue)) {
                    $meat = $child->splitText($tag['offset'] - $start);
                    $tail = $meat->splitText($tag['length']);
                    $a = $doc->createElement('a');
                    $a->setAttribute('href', '//facebook.com/' . $tag['id']);
                    $a->setAttribute('title', $tag['name']);
                    $meat->parentNode->replaceChild($a, $meat);
                    $a->appendChild($meat);
                    break;
                }
                $start += strlen($child->nodeValue);
            }
        }
    }
    return trim($doc->saveHTML());
}

到目前为止,这在我的所有测试用例中都有效,但如果标签重叠或嵌套,它可能会很狡猾。我不确定Facebook是否会返回这样的标签。

希望您可以轻松将其移植到Ruby。