Проблема «умничать» и разбора ссылок на один и тот же текст - PullRequest
2 голосов
/ 10 апреля 2011

Я использую 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>, если необходимо), «умнее», а затем вернуть его обратно, не мешая анализу ссылок в TwitterJS?

Ответы [ 2 ]

1 голос
/ 10 апреля 2011

Давайте сделаем плагин 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();
0 голосов
/ 10 апреля 2011

Попробуйте:

$('#tweet li a').each( function() { $(this).text( smarten( $(this).text() ) ); } );
...