Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Последние сообщения
Ответить
1 2 3

Делаем jsvascript генератор тегов для нашей CMS

boriska

  • Атом-мозг
  • Пользователь
  • 846
  • Репутация:65 
  • Предупреждения: 0 
  • Регистрация:
    29 Янв 2013
#1
Сегодня, смотрев задачи форка AtomM, увидел задачу про генератор тегов... Ну делать было нечего и решил таки заморочиться. Но написать сам не смог, найти готовое решение тоже. В итоге спионерил с какого то сайта несколько строк и доработал их под наш редактор и формы, но обнаружил, что автор того кода не учел функцию игнорирования указанных ключевых слов.

Собственно html такой:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<li class="margin">
            <textarea {{ editor_text }} class="text-area" name="mainText">{{ context.main_text }}</textarea>
          </li>
<li id="tags" style="display:none;">
            <span class="siu_title"><strong>Теги:</strong>Слова по которым будет искаться файл</span>
            <span class="siu_data">
               <input id="keywords" size="70" type="text" name="tags" value="{{ context.tags }}" />
               <input type="button" value="Get keywords!" onclick="countKeywords()">
         </span>
         <span class="siu_title"><strong>Минимальная длина слова</strong></span>
         <span class="siu_data"><input type="text" value="4" id="minLengthKeyword"></span>
         <br>
         <span class="siu_title"><strong>Минимальное число повторений</strong></span>
         <span class="siu_data"><input type="text" value="3" id="minRepeatKeyword"></span>
         <br>
         <span class="siu_title"><strong>Коэффициент совпадения:</strong>Например - keyword ~ keywords</span>
         <span class="siu_data"><input type="text" value="0.8" id="coincidence"></span>
          </li>

Соразработчик Atom-M CMS

boriska

  • Атом-мозг
  • Пользователь
  • 846
  • Репутация:65 
  • Предупреждения: 0 
  • Регистрация:
    29 Янв 2013
#2
А сам js вот такой.(моя доработка заключается в том, что я учел тот факт, что редактор может быть не всегда включен)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
var keywords1, keywords2 = new Array(), keywords3 =  new Array();
function getWords(s) {   
   return s.replace(/[^а-яА-Яa-zA-Z]+/g, " ").toLowerCase(); // returns text.. removing of numbers, commas, any spec chars
}
function getKeywords(s) {
   var tmp;
   tmp = getWords(s);
   return tmp.split(" "); // returns Array of words
}
function countKeywords () {
   var s = $('#editor').value + $('.wysibb-text-editor').html();
   var minLengthKeyword = parseInt(document.getElementById('minLengthKeyword').value);
   var minRepeatKeyword = parseInt(document.getElementById('minRepeatKeyword').value);
   var coincidence = parseFloat(document.getElementById('coincidence').value);
   
   var tmpKeywords1 = getKeywords(s);
   var tmpKeywords2 = new Array();
   
   
   //alert(keywords1.length);
   for (i=0;i<tmpKeywords1.length;i++) {
      var currentWord = tmpKeywords1[i];
      //alert(currentWord.substring(0, 3) );
      if (currentWord.length >= minLengthKeyword) {
         keywords2.push(currentWord); // put the word to the Array keyword2 if the length >= minLengthKeyword
      }
   }
 
 
   for (i=0;i<keywords2.length;i++) {
      var currentWord = keywords2[i];
      currentWordCore = currentWord.substr(0,Math.round(currentWord.length*coincidence));
      
      //alert(currentWordCore);
      var inwords2 = keywords2.grep(currentWordCore);
      //alert(inwords2);
      if (inwords2.length >= minRepeatKeyword && keywords3.grep(currentWordCore).length <1) { 
         // the word must repeat 3 or more times .. and do not put the word one more time to result array of keywords3
         keywords3.push(currentWord);
      }
   }   
   document.getElementById('keywords').value = keywords3;
   keywords2 = new Array();
   keywords3 = new Array();
}
function grep(str) {
   var ar = new Array();
   var arSub = 0;
   for (var i in this) {
      if (typeof this[i] == "string" && this[i].indexOf(str) != -1){
         ar[arSub] = this[i];
         arSub++;
      }
   }
   return ar;
}
Array.prototype.remove=function(s){
  for(i=0;i<this .length;i++){
    if(s==this[i]) this.splice(i, 1);
  }
}
 
Array.prototype.grep = grep;

В общем прошу помощи в вопросах:
1. Возможность добавления некоторых слов в игнор.(ну это я примерно знаю как сделать)
2. Преобразование в плагин, который выводит специальной меткой атрибут полю "теги" и другой меткой выводит поля с настройкой генератора.
3. Показать как выпилить из движка стандартный генератор тегов на PHP.

Заранее благодарен

Добавлено2013.12.24 19-58

аууу ? что помогать то будете?

Отредактировано автором 24 Дек 2013
Соразработчик Atom-M CMS

boriska

  • Атом-мозг
  • Пользователь
  • 846
  • Репутация:65 
  • Предупреждения: 0 
  • Регистрация:
    29 Янв 2013
#3
boriska пишет:
1. Возможность добавления некоторых слов в игнор.
реализовать почему то не получается, точнее не получается сплитом выделить массив слов из формы.

разве вот так не правильно?

1
2
var noRepeatKeyword = $('#noRepeatKeyword').value,//  'слово1, слово2,слово3'
       ArrIgnorKeyword = noRepeatKeyword.split(',');// тут находит ошибку

Добавлено2013.12.25 21-17

Вроде написал нормальный код... только он не работает нифига хотя ошибку не выдает. Ну помогите бедным не опытным людям

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
var keywords1, keywords2 = new Array(), keywords3 =  new Array();
function getWords(s) {   
   return s.replace(/[^а-яА-Яa-zA-Z]+/g, " ").toLowerCase(); // returns text.. removing of numbers, commas, any spec chars
}
function getKeywords(s) {
   var tmp;
   tmp = getWords(s);
   return tmp.split(" "); // returns Array of words
}
function countKeywords () {
   var s = $('#editor').value + $('.wysibb-text-editor').html();
   
   var noRepeatKeyword = $('#noRepeatKeyword').attr("value"),
         re = /\s*,\s*/, // убираем пробелы вокруг запятых
         NoTags = noRepeatKeyword.split(re);// Выделяем массив слов-исключений 
 
 
   var minLengthKeyword = parseInt(document.getElementById('minLengthKeyword').value),
        minRepeatKeyword = parseInt(document.getElementById('minRepeatKeyword').value),
        coincidence = parseFloat(document.getElementById('coincidence').value);
   
   var tmpKeywords1 = getKeywords(s);
   var tmpKeywords2 = new Array();
 
   for (i=0;i<tmpKeywords1.length;i++) {
      var currentWord = tmpKeywords1[i],
        DeleteWord = false,
      n=0;
 
      while ((n<NoTags.length) && (DeleteWord = true)) {
      if (currentWord = NoTags[n]) {DeleteWord = true;} // если элемент из тегов совпадает с одним из исключаений назначаем флаг
      n= n+1;
      }
      if ((currentWord.length >= minLengthKeyword) && (DeleteWord = false))  {
         keywords2.push(currentWord); // Добавляем в массив результатов если length >= minLengthKeyword и если это слово не входит в исключения
      }
   }
 
 
   for (i=0;i<keywords2.length;i++) {
      var currentWord = keywords2[i];
      currentWordCore = currentWord.substr(0,Math.round(currentWord.length*coincidence));
      
      //alert(currentWordCore);
      var inwords2 = keywords2.grep(currentWordCore);
      //alert(inwords2);
      if (inwords2.length >= minRepeatKeyword && keywords3.grep(currentWordCore).length <1) { 
         // the word must repeat 3 or more times .. and do not put the word one more time to result array of keywords3
         keywords3.push(currentWord);
      }
   }   
   document.getElementById('keywords').value = keywords3;
   keywords2 = new Array();
   keywords3 = new Array();
}
function grep(str) {
   var ar = new Array();
   var arSub = 0;
   for (var i in this) {
      if (typeof this[i] == "string" && this[i].indexOf(str) != -1){
         ar[arSub] = this[i];
         arSub++;
      }
   }
   return ar;
}
Array.prototype.remove=function(s){
  for(i=0;i<this .length;i++){
    if(s==this[i]) this.splice(i, 1);
  }
}
 
Array.prototype.grep = grep;


Отредактировано автором 25 Дек 2013
Соразработчик Atom-M CMS

jevgenj

  • Истенный Атомовод
  • Пользователь
  • 344
  • Репутация:24 
  • Предупреждения: 0 
  • Регистрация:
    4 Фев 2012
#4
boriska пишет:
помогите бедным не опытным людям
я тут по нету рылся посмотри может это поможет но php

Code:
<?php
$title ="Заголовок страницы";
$content = "Контент страницы";

?>

<?php
class Counter
{
var $origin_arr;
var $modif_arr;
var $min_word_length = 3;

function explode_str_on_words($text)
{
$search = array ("'ё'",
"'<script[^>]*?>.*?</script>'si", // Вырезается javascript
"'<[\/\!]*?[^<>]*?>'si", // Вырезаются html-тэги
"'([\r\n])[\s]+'", // Вырезается пустое пространство
"'&(quot|#34);'i", // Замещаются html-элементы
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(\d+);'e");

$replace = array ("е",
" ",
" ",
"\\1 ",
"\" ",
" ",
" ",
" ",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");

$text = preg_replace ($search, $replace, $text);

// То, что нельзя использовать в ключевых словах
$del_symbols = array(",", ".", ";", ":", "\"", "#", "\$", "%", "^", "!", "@", "`", "~", "*", "-", "=", "+", "\\", "|", "/", ">", "<", "(", ")", "&", "?", "№", "\t", "\r", "\n", "{","}","[","]", "'", "“", "”", "•", "как", " для ", "что", "или", "это", "этих", "всех", "вас", "они", "оно", "еще", "когда", "где", "эта", "лишь", "уже", "вам", "нет", "если", "надо", "все", "так", "его", "чем", "при", "даже", "мне", "есть", "раз ", "два", "только", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9");

$text = str_replace($del_symbols, array(" "), $text);
$text = ereg_replace("( +)", " ", $text);
$this->origin_arr = explode(" ", trim($text));
return $this->origin_arr;
}

function count_words()
{
$tmp_arr = array();
foreach ($this->origin_arr as $val)
{
if (strlen($val)>=$this->min_word_length)
{
$val = strtolower($val);
if (array_key_exists($val, $tmp_arr))
{
$tmp_arr[$val]++;
}
else
{
$tmp_arr[$val] = 1;
}
}
}
arsort ($tmp_arr);
$this->modif_arr = $tmp_arr;
}

function get_keywords($text)
{
$this->explode_str_on_words($text);
$this->count_words();
$arr = array_slice($this->modif_arr, 0, 15);
//После последнего слова
$str = ", ";
foreach ($arr as $key=>$val)
{
//После каждого слова
$str .= $key . ", ";
}
return trim(substr($str, 0, strlen($str)-2));
}
}

// создание экземпляра класса
$word_counter = new Counter();

// если длинна строки больше 50000
if (strlen($content)>50000)
{
// подбор слов
$keywords. = $word_counter->get_keywords(substr($content, 0, 50000));
}
else // если меньше
{
// подбор слов
$keywords. = $word_counter->get_keywords($content);
}

//Генерация ключевых слов из заголовка:
preg_match_all("/[A-Za-zА-Яа-я0-9]{4,}/", $title, $matches);
$keywords. = implode(", ", $matches[0]);
?>

<meta name="keywords" content="<?=$keywords?>">

но тема немного другая

Добавлено2013.12.26 00-16

а в обще неплохо бы  под нашу цмс подогнать этот скрипт вроде штука полезная хотя бы как снипет сделать или плагин

шаблоны потихоньку адаптирую
хостинг для сайта идеальный вариант за бесплатно http://api.3owl.com/redir/3710254/

boriska

  • Атом-мозг
  • Пользователь
  • 846
  • Репутация:65 
  • Предупреждения: 0 
  • Регистрация:
    29 Янв 2013
#5
jevgenj,  спасибо, но на php и так есть. Дело в том, что нужно сделать такой, который будет работать без перезагрузки, в принципе мой код должен работать... есть еще одна догадочка... буду проверять почему не работает, на форуме яваскрипта уже народ помогает мне)

Добавлено2013.12.27 01-25

В общем вот такой код мне написали, а я его опять чуть доработав привел к идеалу. Решили выкинуть настройку коэффициента, но зато есть все остальное и написано лучше.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function gen(str, len, repeat,tabu) { 
var str = $('#editor').val() + $('.wysibb-text-editor').html(), // Получаем текст из которого нужно выделить теги
       tabu = $('#noRepeatKeyword').val(), // Получаем слова-исключения
       len = parseInt($('#minLengthKeyword').val()), // Минимальная длинна тега
      repeat = parseInt($('#minRepeatKeyword').val()), // Минимальное количество его повторений
      tabu = tabu.split(/\s*,\s*/),
      output = ' ';
   var obj_tabu = {};
     for (var i=0; i<tabu.length; i++)  {obj_tabu[tabu[i]]=!0};//сформировали обьект из запретных слов
     str = str.replace(/<[^>]*>/g, ' ');//выкусили теги
     str = str.replace(/[^a-zа-яё\s]/gi, ' '); //убрали небуквы
     str = str.split(/\s+/) ;//сформировали массив слов из строки
     var obj_output = {};
     for (var i=0; i<str.length; i++)  {
       var word = str[i];
       if(word.length >= len && !obj_tabu[word])  obj_output[word]=(obj_output[word]||0)+1; 
    } // сформировали обьект из разрешённых слов  и нужной длины
     var output1 = [];
     for(var word in obj_output) if (obj_output[word] >= repeat) output1.push(word);//отобрали слова с нужным повторением 
    for (var i=0; i<output1.length; i++) {if (i<1) {output += output1[i];} else {output += ', ' + output1[i];}}   // преобразовали в строку
    
     document.getElementById('keywords').value = output;
   }

Добавлено2013.12.27 21-16

В общем вот он, скорее всего окончательный вариант (может быть чуть по позже прикручу коэффициент совпадения)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function gen(str,tabu,len,repeat,tags) { 
     var str, // Получаем текст из которого нужно выделить теги
     tabu = tabu.val(), tabu = tabu.split(/\s*,\s*/), // Получаем слова-исключения
     len = parseInt(len.val()), // Минимальная длинна тега
    repeat = parseInt(repeat.val()), // Минимальное количество его повторений
    tags,output = '';
     var obj_tabu = {};
     for (var i=0; i<tabu.length; i++)  {obj_tabu[tabu[i]]=!0};//сформировали обьект из запретных слов
     str = str.replace(/<[^>]*>/g, ' ');//выкусили теги
     str = str.replace(/[^a-zа-яё\s]/gi, ' '); //убрали небуквы
     str = str.split(/\s+/) ;//сформировали массив слов из строки
    
     var obj_output = {};
     for (var i=0; i<str.length; i++)  {
       var word = str[i];
       if(word.length >= len && !obj_tabu[word])  obj_output[word]=(obj_output[word]||0)+1; // сформировали обьект из разрешённых слов  и нужной длины
    } 
    
     var output1 = [];
     for(var word in obj_output) if (obj_output[word] >= repeat) output1.push(word);//отобрали слова с нужным повторением 
    for (var i=0; i<output1.length; i++) if (i<1) output += output1[i]; else output += ', ' + output1[i];   // преобразовали в строку
    
     return tags.val(output); 
   }

А вызов будет такой gen(str,tabu,len,repeat,tags)

Где str объект со строкой, из которой нужно формировать теги.
tabu - объект слов-исключений.
len - объект с минимальным числом букв в словах.
repeat - объект с минимальным количеством совпадений слова, чтобы стать тегом.
tags - объект в который нужно вывести полученные теги.

В шаблоне default вызов функции будет выглядеть так.

1
gen($('#editor').val() + $('.wysibb-text-editor').html(),$('#noRepeatKeyword'),$('#minLengthKeyword'),$('#minRepeatKeyword'),$('#keywords'))

Теперь бы еще реализовать эту функцию плагином наверно? И убрать стандартный генератор на пыхе из движка.

Добавлено2013.12.27 21-21

Думаю еще может упростить вызов так, чтобы в параметрах вводить только само название идентификатора? Но тогда генератор будет работать только с идентификаторами...

и думаю что делать с редакторами, как узнать блок в котором у них текст, ведь у каждого он разный....

Отредактировано автором 27 Дек 2013
Соразработчик Atom-M CMS

Destroy

  • Атом-мастер
  • Юзер
  • 271
  • Репутация:17 
  • Предупреждения: 0 
  • Регистрация:
    4 Дек 2013
#6
Я думаю выпилить старый, и поставить этот плагином, зачем их два то)
Тем более что, то что есть сейчас работает магко сказать "плохо"

Добавлено2013.12.28 13-48

кстати, сегодня случайно зашел в редактор статистических страниц, что там за  bb редактор?

Добавлено2013.12.28 15-06

Да и плагином будет удобно тем, что можно будет сделать облако тегов.

Отредактировано автором 28 Дек 2013

boriska

  • Атом-мозг
  • Пользователь
  • 846
  • Репутация:65 
  • Предупреждения: 0 
  • Регистрация:
    29 Янв 2013
#7
Тэкс вот собственно плагин, что я сделал в нем не правильно а ? Метки не заменяются. 

Добавлено2013.12.28 15-08

Destroy пишет:
кстати, сегодня случайно зашел в редактор статистических страниц, что там за  bb редактор?
там не бб редактор а html редактор
Прикрепленные файлы:
Прикрепление1: Открыть файл 2.162 Kb
Соразработчик Atom-M CMS

Destroy

  • Атом-мастер
  • Юзер
  • 271
  • Репутация:17 
  • Предупреждения: 0 
  • Регистрация:
    4 Дек 2013
#8
boriska, "//убрали небуквы" :0

Добавлено2013.12.28 15-50

boriska, не в тему, поправь шаблон пожалуйста я не знаю как там закрыть от гостей. (на форк шаблона кидал задачу)

boriska

  • Атом-мозг
  • Пользователь
  • 846
  • Репутация:65 
  • Предупреждения: 0 
  • Регистрация:
    29 Янв 2013
#9
Destroy пишет:
boriska, не в тему, поправь шаблон пожалуйста я не знаю как там закрыть от гостей. (на форк шаблона кидал задачу)
я так и не понял что ты хочешь, толи в постах, толи в шаблоне, толи для ссылок...

Соразработчик Atom-M CMS

Destroy

  • Атом-мастер
  • Юзер
  • 271
  • Репутация:17 
  • Предупреждения: 0 
  • Регистрация:
    4 Дек 2013
#10
boriska, там везде ошибка.
Везде где написал видят гости то что не нужно, посмотреть же можно, или ты все на бум делаеш?)

1 2 3
Сейчас online: 7. Зарегистрированных: 0. Гостей: 7.