2

我正在使用 jQuery 和一个非常简单的脚本来用它们的“智能”对应物替换引号、撇号和双破折号:

function smarten(a) {
  a = a.replace(/(^|[-\u2014/(\[{"\s])'/g, "$1\u2018");      // opening singles
  a = a.replace(/'/g, "\u2019");                             // closing singles & apostrophes
  a = a.replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1\u201c"); // opening doubles
  a = a.replace(/"/g, "\u201d");                             // closing doubles
  a = a.replace(/--/g, "\u2014");                            // em-dashes
  return a
  };

我将其用作TwitterJS的回调,它解析链接并生成如下块:

<ul>
<li>Here's a link! <a href="http://www.foobar.com">http://www.foobar.com</a></li>
</ul>

问题是,如果我这样做:

$('#tweet li').html(smarten($('#tweet li').html()))

它破坏了链接,如果我这样做:

$('#tweet li').html(smarten($('#tweet li').text()))

它完全丢弃它们。有没有一种聪明、健壮的方法来只抓取文本(<a>如有必要,也可以从标签中取出),“smarten”,然后将其放回去,而不干扰 TwitterJS 的链接解析?

4

2 回答 2

1

让我们制作一个 jQuery 插件:

jQuery.fn.smarten = (function(){

    function smartenNode(node) {
        if (node.nodeType === 3) {
            node.data = node.data
                .replace(/(^|[-\u2014/(\[{"\s])'/g, "$1\u2018")
                .replace(/'/g, "\u2019")
                .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1\u201c")
                .replace(/"/g, "\u201d")
                .replace(/--/g, "\u2014");
        } else if (node.nodeType === 1) {
            if (node = node.firstChild) do {
                smartenNode(node);
            } while (node = node.nextSibling);
        }
    }

    return function() {
        return this.each(function(){
            smartenNode(this);
        });
    };

}());

用法:

$('#tweet li').smarten();
于 2011-04-10T04:56:16.233 回答
0

尝试:

$('#tweet li a').each( function() { $(this).text( smarten( $(this).text() ) ); } );
于 2011-04-10T04:49:57.893 回答