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

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

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

Есть такая штука как IceStrawberry 1.04 b. Можете юзать на свой страх и риск... или слямзить что-то. Мне фиолетово.

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)

Есть такая штука как IceStrawberry 1.04 b. Можете юзать на свой страх и риск... или слямзить что-то. Мне фиолетово.

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)