1

Тема: Auto link words

Приветствую!
Для CuteNews есть плагин под названием "Auto link words", который заменяет определенные слова на нужные ссылки, допустим: бегемот >> begemotina.ru и т.п.
Все бы хорошо, но плагин не подходит для Strawberry 1.1.1, посему пришел на этот форум за подсказкой что и где подредактировать для успешной работы в Клубнике.

Прилагаю код:

<?php
/*
Plugin Name:    Auto link words
Plugin URI:        http://cutenews.ru
Description:    Create a list with words which are automatically converted into links.
Version:        0.2
Application:    CuteNews
Author:            FI-DD
Author URI:        http://english.cutenews.ru/forum/profile.php?mode=viewprofile&u=2
*/


add_filter('news-entry-content', 'link_filter');

add_filter('cutenews-options', 'link_AddToOptions');
add_action('plugin-options', 'link_CheckAdminOptions');

function link_filter($output){

    $barword = new PluginSettings('linkwords');

        foreach($barword->settings as $bad){
            list($link, $replacement) = $bad;
            $find = "#(| |\{nl\})$link( |\{nl\})#i";
            $replace = ' <a href="'.$replacement.'">'.$replacement.'</a> ';
            $output = preg_replace($find, $replace, $output);
        }

return $output;

}

function link_AddToOptions($options){
global $PHP_SELF;

    $options[] = array(
        'name'        => 'Linkwords',
        'url'        => $PHP_SELF.'?mod=options&amp;action=linkwords',
        'access'    => '1',
    );

return $options;
}

function link_CheckAdminOptions(){
    if ($_GET['action'] == 'linkwords'){link_AdminOptions();}
}

function link_AdminOptions(){
global $PHP_SELF;

    echoheader('options', 'Linkwords');

    $barword = new PluginSettings('linkwords');

    $buffer = '<table border=0 cellpading=0 cellspacing=0 width="645">
              <table border=0 cellpading=0 cellspacing=0 width="645" >
              <form method=post action="'.$PHP_SELF.'?mod=options&amp;action=linkwords">
              <td width=321 height="33"><b>Add a word</b>
              <table border=0 cellpading=0 cellspacing=0 width=379    class="panel" cellpadding="7" >
              <tr>
              <td valign="top" width=350 height="25">Word:<br /><input type="text" name="add_badword">
              <td width=350 height="25">Replacement:<br /><input type="text" name="add_replacement">
              <br />e.g. http://www.domain.com
              </tr>
              <tr>
              <td><input type="submit" value="Add to list">
              </tr>
              </form>
              </table>

    <tr>
    <td width=654 height="11">
        <img height=20 border=0 src="skins/images/blank.gif" width=1>
    </tr><tr>
    <td width=654 height=14>
    <b>Word list</b>
    </tr>
    <tr>
    <td width=654 height=1>
  <table width=641 height=100% cellspacing=2 cellpadding=2>
    <tr>
      <td width=200 class="panel"><b>Word</b></td>
      <td width=340 class="panel"><b>Replacement</b></td>
      <td width=40 class="panel">&nbsp;<b>Action</b></td>
    </tr>';

    if ($words = $barword->settings){
        foreach($words as $key => $bad){
            list($link, $replacement) = $bad;
            
                $i++;
                if ($i%2 == 0){$bg = ' class="enabled"';}
                else {$bg = ' class="disabled"';}
    
            if ($bad){$buffer .= '<tr'.$bg.'><td>'.$link.'</td><td>'.$replacement.'</td><td><a href="'.$PHP_SELF.'?mod=options&amp;action=linkwords&amp;subaction=remove&amp;id='.$key.'">[Remove]</a></td>';}
        }
    }

    $buffer .= '</table></table>';

    if ($_POST['add_badword']){
        $barword -> settings[] = array($_POST['add_badword'], $_POST['add_replacement']);
        $barword -> save();

        $buffer = 'The word was added!<br><br><a href="'.$PHP_SELF.'?mod=options&amp;action=linkwords">Back to the list</a>';
    }

    if ($_GET['subaction'] == 'remove'){
        unset($barword -> settings[$_GET['id']]);
        $barword -> save();

        $buffer = 'The word was removed from the list!<br><br><a href="'.$PHP_SELF.'?mod=options&amp;action=linkwords">Back to the list</a>';
    }

    echo $buffer;

    echofooter();
}
?>

Сам сидел сравнивал коды одних и тех же плагинов для CuteNews и Strawberry, отличия замечаю, но понять их смысл не могу, т.к. в php не силен.

С уважением, Василий.

2

Re: Auto link words

<?php
/*
Plugin Name:    Auto link words
Plugin URI:        http://cutenews.ru
Description:    Create a list with words which are automatically converted into links.
Version:        0.2
Application:    Strawberry
Author:            FI-DD
Author URI:        http://english.cutenews.ru/forum/profile.php?mode=viewprofile&u=2
*/


add_filter('news-entry-content', 'link_filter');

add_filter('options', 'link_AddToOptions');
add_action('plugins', 'link_CheckAdminOptions');

function link_filter($output){

    $barword = new PluginSettings('linkwords');

        foreach($barword->settings as $bad){
            list($link, $replacement) = $bad;
            $find = "#(| |\{nl\})$link( |\{nl\})#i";
            $replace = ' <a href="'.$replacement.'">'.$replacement.'</a> ';
            $output = preg_replace($find, $replace, $output);
        }

return $output;

}

function link_AddToOptions($options){
global $PHP_SELF;

    $options[] = array(
        'name'        => 'Linkwords',
        'url'        => 'plugin=linkwords',
        'access'    => '1',
    );

return $options;
}

function link_CheckAdminOptions(){
    if ($_GET['plugin'] == 'linkwords'){link_AdminOptions();}
}

function link_AdminOptions(){
global $PHP_SELF;

    echoheader('options', 'Linkwords');

    $barword = new PluginSettings('linkwords');

    $buffer = '<table border=0 cellpading=0 cellspacing=0 width="645">
              <table border=0 cellpading=0 cellspacing=0 width="645" >
              <form method=post action="'.$PHP_SELF.'?plugin=linkwords">
              <td width=321 height="33"><b>Add a word</b>
              <table border=0 cellpading=0 cellspacing=0 width=379    class="panel" cellpadding="7" >
              <tr>
              <td valign="top" width=350 height="25">Word:<br /><input type="text" name="add_badword">
              <td width=350 height="25">Replacement:<br /><input type="text" name="add_replacement">
              <br />e.g. http://www.domain.com
              </tr>
              <tr>
              <td><input type="submit" value="Add to list">
              </tr>
              </form>
              </table>

    <tr>
    <td width=654 height="11">
        <img height=20 border=0 src="skins/images/blank.gif" width=1>
    </tr><tr>
    <td width=654 height=14>
    <b>Word list</b>
    </tr>
    <tr>
    <td width=654 height=1>
  <table width=641 height=100% cellspacing=2 cellpadding=2>
    <tr>
      <td width=200 class="panel"><b>Word</b></td>
      <td width=340 class="panel"><b>Replacement</b></td>
      <td width=40 class="panel">&nbsp;<b>Action</b></td>
    </tr>';

    if ($words = $barword->settings){
        foreach($words as $key => $bad){
            list($link, $replacement) = $bad;

                $i++;
                if ($i%2 == 0){$bg = ' class="enabled"';}
                else {$bg = ' class="disabled"';}

            if ($bad){$buffer .= '<tr'.$bg.'><td>'.$link.'</td><td>'.$replacement.'</td><td><a href="'.$PHP_SELF.'?plugin=linkwords&amp;action=remove&amp;id='.$key.'">[Remove]</a></td>';}
        }
    }

    $buffer .= '</table></table>';

    if ($_POST['add_badword']){
        $barword -> settings[] = array($_POST['add_badword'], $_POST['add_replacement']);
        $barword -> save();

        $buffer = 'The word was added!<br><br><a href="'.$PHP_SELF.'?plugin=linkwords">Back to the list</a>';
    }

    if ($_GET['action'] == 'remove'){
        unset($barword -> settings[$_GET['id']]);
        $barword -> save();

        $buffer = 'The word was removed from the list!<br><br><a href="'.$PHP_SELF.'?plugin=linkwords">Back to the list</a>';
    }

    echo $buffer;

    echofooter();
}
?>
Признанный мастер чинпоко, а-ай ^_^

Re: Auto link words

А можно ли сделать так, что бы этот плагин не заменял слово ссылкой, а делал выбранное слово ссылкой?

4

Re: Auto link words

bombos, конечно, просто замени строчку

           $replace = ' <a href="'.$replacement.'">'.$replacement.'</a> ';

На

          $replace = ''.$replacement.'';

Только потом в админке нужно делать так:
Бегемотина => <a href="http://www.begemotina.ru">Бегемотина</a>

Re: Auto link words

Bulldo3er,  СПАСИБО ОГРОМНОЕ!!!:)

6

Re: Auto link words

Мелкая ошибка smile
Если использовать

$replace = ''.$replacement.'';

, то обрезаются пробелы. Надо просто добавить пробелы примерно вот так

$replace = '&nbsp;'.$replacement.'&nbsp;';

Хотя можно и так

$replace = ' <a href="'.$replacement.'">'.$link.'</a> ';

Имейте ввиду что слово ищется обрамленное пробелами с обоих сторон.

Отредактировано Hunter Alex (03 Dec 2008 14:42:22)

Я не крутой ...
... я только учусь!

Re: Auto link words

А по корню слова нет возможности прилинковывать? или все словоформы со всеми окончаниями надо в список вбивать?
А если добавить словосочетания... А если ещё добавить тот факт, что на конце у каждого слова в любом падеже может стоять запятая...
Ох, не легкая это работа из болота тащит бегемота....

Точно нельзя по корню слово прилинковать?

Re: Auto link words

cmd, если в строке

$find = "#(| |\{nl\})$link( |\{nl\})#i";

убрать все пробелы, то будет осуществлен поиск без выделения пробелами по краям. Вот вам и "поиск по корню". Правда, при данном способе гиперссылкой будет только корень слова. Например, если укажем слово банк, то получим:

банк
банкир
банкнота
банка
ва-банк

Re: Auto link words

Для того, чтобы расставить точки над "i" напишу:

Пробелы надо убирать не только в строке

$find = "#(| |\{nl\})$link( |\{nl\})#i";

но и в строке

$replace = ' <span class=autolink><a href="'.$replacement.'">'.$link.'</a></span> ';

тоже надо убрать соответствующим образом.


ВОПРОС: а есть ли возможность проводить замену в доп. полях? Я так понял, что надо доп. поля не входят в news-entry-content. На фарт пытался в в show.news.php вписать $tpl['post']['xfields']['author'], но ничего не вышло... Ув. ANT-Soft, уповаю на вас.

____
Strawberry 1.1.1, MySQL

Отредактировано cmd (30 May 2009 19:53:29)

Re: Auto link words

Strawberry 1.1.1, мускул.

Как нужно настроить плагин, чтобы замена осуществлялась только в full-story ( т.е. только в полной новости ) ?

Когда происходит замена в заглавии или в короткой новости, то происходит вставка слова со ссылкой вместо слова.
И тогда в краткой новости появляется несколько ссылок. А это не нужно.

У меня такой вариант настроек скрипта:

function link_filter($output){

    $barword = new PluginSettings('linkwords');

        foreach($barword->settings as $bad){
            list($link, $replacement) = $bad;
            $find = "#(| |\{nl\})$link( |\{nl\}|.)#i";
            $replace = str_replace($link, "<a href=".$replacement.">".$link."</a>", $replace);
            $output = str_replace(" ".$link." ", " <a href=".$replacement." target=_blank>".$link."</a> ", $output);
        }

return $output;

}

11

Re: Auto link words

olafsen, предложу может быть несколько бредовую идею (т.к. не проверял на деле):

1. В файле plugins/linkwords.php закомментировать строку:

// add_filter('news-entry-content', 'link_filter');

2. В шаблонах полной новости (в файлах full.tpl) там, где выводите <?=$tpl['post']['full-story']; ?> фильтровать полную новость через функцию link_filter "вручную":

<?=link_filter($tpl['post']['full-story']); ?>

Re: Auto link words

ANT-Soft, Вам огромнейшее СПАСИБО.

Всё прекрасно работает, идея не бредовая, а очень даже толковая.

Может кому надо, выкладываю код файла linkwords.php ( названия синонимы - insert-links.php , auto-link-words.php  ) , очень даже ХОРОШО скорректированного ANT-Soft:

<?php
/*
Plugin Name:    Auto link words
Plugin URI:        http://cutenews.ru
Description:    Create a list with words which are automatically converted into links.
Version:        0.2
Application:    Strawberry
Author:            FI-DD
Author URI:        http://english.cutenews.ru/forum/profile.php?mode=viewprofile&u=2
*/


// add_filter('news-entry-content', 'link_filter');

add_filter('options', 'link_AddToOptions');
add_action('plugins', 'link_CheckAdminOptions');

function link_filter($output){

    $barword = new PluginSettings('linkwords');

        foreach($barword->settings as $bad){
            list($link, $replacement) = $bad;
            $find = "#(| |\{nl\})$link( |\{nl\}|.)#i";
            $replace = str_replace($link, "<a href=".$replacement.">".$link."</a>", $replace);
            $output = str_replace("".$link."", " <a href=".$replacement." target=_blank>".$link."</a> ", $output);
        }

return $output;

}

function link_AddToOptions($options){
global $PHP_SELF;

    $options[] = array(
        'name'        => 'Linkwords',
        'url'        => 'plugin=linkwords',
        'access'    => '1',
    );

return $options;
}

function link_CheckAdminOptions(){
    if ($_GET['plugin'] == 'linkwords'){link_AdminOptions();}
}

function link_AdminOptions(){
global $PHP_SELF;

    echoheader('options', 'Linkwords');

    $barword = new PluginSettings('linkwords');

    $buffer = '<table border=0 cellpading=0 cellspacing=0 width="645">
              <table border=0 cellpading=0 cellspacing=0 width="645" >
              <form method=post action="'.$PHP_SELF.'?plugin=linkwords">
              <td width=321 height="33"><b>Add a word</b>
              <table border=0 cellpading=0 cellspacing=0 width=379    class="panel" cellpadding="7" >
              <tr>
              <td valign="top" width=350 height="25">Word:<br /><input type="text" name="add_badword">
              <td width=350 height="25">Replacement:<br /><input type="text" name="add_replacement">
              <br />e.g. http://www.domain.com
              </tr>
              <tr>
              <td><input type="submit" value="Add to list">
              </tr>
              </form>
              </table>

    <tr>
    <td width=654 height="11">
        <img height=20 border=0 src="skins/images/blank.gif" width=1>
    </tr><tr>
    <td width=654 height=14>
    <b>Word list</b>
    </tr>
    <tr>
    <td width=654 height=1>
  <table width=641 height=100% cellspacing=2 cellpadding=2>
    <tr>
      <td width=200 class="panel"><b>Word</b></td>
      <td width=340 class="panel"><b>Replacement</b></td>
      <td width=40 class="panel">&nbsp;<b>Action</b></td>
    </tr>';

    if ($words = $barword->settings){
        foreach($words as $key => $bad){
            list($link, $replacement) = $bad;

                $i++;
                if ($i%2 == 0){$bg = ' class="enabled"';}
                else {$bg = ' class="disabled"';}

            if ($bad){$buffer .= '<tr'.$bg.'><td>'.$link.'</td><td>'.$replacement.'</td><td><a href="'.$PHP_SELF.'?plugin=linkwords&amp;action=remove&amp;id='.$key.'">[Remove]</a></td>';}
        }
    }

    $buffer .= '</table></table>';

    if ($_POST['add_badword']){
        $barword -> settings[] = array($_POST['add_badword'], $_POST['add_replacement']);
        $barword -> save();

        $buffer = 'The word was added!<br><br><a href="'.$PHP_SELF.'?plugin=linkwords">Back to the list</a>';
    }

    if ($_GET['action'] == 'remove'){
        unset($barword -> settings[$_GET['id']]);
        $barword -> save();

        $buffer = 'The word was removed from the list!<br><br><a href="'.$PHP_SELF.'?plugin=linkwords">Back to the list</a>';
    }

    echo $buffer;

    echofooter();
}
?>

При такой автозамене происходит поиск слов "без пробелов", а если нужно определить "фильтр", то в строке:

$output = str_replace("".$link."", " <a href=".$replacement." target=_blank>".$link."</a> ", $output);

можно выставить фильтр в коде

"".$link.""

( могут быть варианты -

" ".$link."" или "".$link." "  или " ".$link." "

).

Вроде-бы так....

Отредактировано olafsen (06 Sep 2010 10:48:45)