#!/usr/bin/perl # Intermediate Search, Version 1.1 # Copyright 1997 by Fluid Dynamics # You are free to use the script, but please ask before you # distribute it. # # For latest version and help files, visit: # http://www.xav.com/scripts/search/ # __________________________________________________________________ $basedir = '/wrk1/TY/vladislav/public_html/poesia/'; # The directory location of all your files. Remember the trailing # slash. $baseurl = 'http://www.aai.ee/~vladislav/poesia/'; # The URL corresponding to the base directory. @files = ('rus/poets/*.html', 'rus/copies/Akmay/Sborniki/*.html', 'rus/copies/Akmay/Sborniki/*.htm', 'rus/copies/Akmay/*.html', 'rus/copies/Akmay/*.htm', 'rus/copies/Apuhtin/*.html', 'rus/copies/Barat/*.html', 'rus/copies/Blok/*.html', 'rus/copies/Fet/*.html', 'rus/copies/Lermontov/*.html', 'rus/copies/Lorca/*.html', 'rus/copies/Majkov/*.html', 'rus/copies/Nekrasov/*.html', 'rus/copies/Polonskij/*.html', 'rus/copies/Pushkin/*.html', 'rus/copies/Sasha/*.html', 'rus/copies/poets/*.html', 'ssl/*.html', ); # These are all the files that will be listed. The asterisk is a # wildcard - it will list all files and directories. $summary_file = '/wrk1/TY/vladislav/admin/summaries.html'; # Make this writable (chmod 777 summaries.html) and hide it well! # It holds the results of everybody's searches so you'll know what # people are really looking for when they come to your site. We # have placed our summary file in a non-web directory so others # can't see it - you could put it in a hidden or secure directory. $link_url = 'http://www.aai.ee/~vladislav/poesia/'; $link_title = 'Русская Классическая Поэзия'; # Enter the URL and title of your main web page. $java_toys = 'on'; # If your visitors can't handle Java, better set this to 'off'. $searchpict = 'http://www.xav.com/images/search.gif'; # The URL of the E3 picture. $cgi_url = 'search.cgi'; # Change this to the full URL only if your rename this script. # This array holds info on all the directories and filetypes you'd like # your visitors to search. Visit the readme file for more customizing # information. # Options for Weighted Search: # # All occurrences of a search term count as one point. The occurrence # of a term in the filename, title, META keywords, or META description # can have added weight (equivalent to a multiplier per hit). Enter # the multipliers in the array below - the defaults are (2,2,4,2). If # this makes no sense to you, just ignore it and leave the defaults as # they are - they work pretty well. Note that this will give extra # weight to those pages that have a properly formatted title and META # tags, even if they contain the same basic information. ($name_x, $title_x, $keywords_x, $description_x) = (4,10,0,10); # No further editing is necessary, but feel free to play around... # Note that much of the code below is straight HTML, and very easy to # modify if you know a little about HTML programming. # # __________________________________________________________________ read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } if ($FORM{'terms'}) { &get_files; &search; &return_html; } else { &prompt; } sub prompt { print "Content-type: text/html\n\n"; print < Русская классическая поэзия: поиск в Собрании

Реклама в Коллекции привлекает внимание к Поэзии...

Поиск в Собрании

С помощью поисковой системы Собрания вы можете легко найти нужное вас стихотворение по цитате, отыскать сведения о том или ином поэте — если требуемая информация содержится в Собрании. Поисковую систему можно использовать для отыскания стихотворений на заданную тему по ключевым словам.

Настоятельно рекомендуется ознакомиться перед началом поиска с инструкцией к системе — это поможет вам правильно оформить запрос и избежать типичных ошибок. Тем самым вы быстрее найдёте то, что вам нужно.

 
EOM if ($java_toys eq 'on') { print "\n"; } print <Типичные ошибки
Как не следует оформлять запрос
 
Как следует оформлять запрос
 
Заключайте целостные фразы в кавычки! Заключайте целостные фразы в кавычки!
"Заключайте целостные фразы в кавычки!"
 
Система не понимает логику фраз, а ищет слова и фрагменты слов! Система не понимает логику фраз, а ищет слова и фрагменты слов!
Система не понимает логику фраз, а ищет слова и фрагменты слов! Чтобы слово или фрагмент слова обязательно было на находимых страницах, ставьте перед ним знак "+"!
 
Оформляйте запрос кратко, тогда меньше вероятность ошибиться! Оформляйте запрос кратко, тогда меньше вероятность ошибиться!
Оформляйте запрос кратко, тогда меньше вероятность ошибиться!
 

Подробные указания по методике поиска

Формат запроса

Система не понимает правил грамматики и не фильтрует запрос от посторонних слов. Транслитерация не воспринимается.

Разницы между заглавными и прописными буквами не делается, поэтому слова можно вводить как в нижнем, так и в верхнем регистре. Буквы «е» и «ё» не различаются, поэтому поиск «елка» и «ёлка» выдаст одни и те же страницы.

Перед каждым словом могут стоять определители not (не), and (и), or (или). Если вы ищете сны not мечты, вы найдете все страницы, содержащие слово «сны», помимо тех страниц, где также есть слово «мечты». Если вы наберете and позабытые and сны and мечты, вы найдёте только те страницы, которые содержат все три искомых слова. По умолчанию используется определитель или. Таким образом, набрав "позабытые сны мечты", вы найдёте страницы по меньшей мере с одним из этих трёх слов.

NB! Сокращённая запись системы Altavista тоже работает. Поиск сны -позабытые равнозначен первому примеру, а "+позабытые +сны +мечты" найдёт те же документы, что во втором примере.

NB! Скобки () исключаются из поиска. Не следует искать цитаты, содержащие кавычки или тире — для этих знаков препинания в собрании используются специальные символы, и в результате поиск будет безуспешным.

Чтобы сгруппировать набор слов, используйте двойные кавычки "...". Например, запрос "былые дни" (включая кавычки) позволит ограничть поиск страницами, где оба этих слова идут подряд (если ввести эту фразу без кавычек, то есть в виде былые дни, то системой будет предложено множество страниц со словами былые и дни). Логические определители действуют и на кавычки: запрос +былые +дни not "былые дни" выдаст только те страницы, где слова былые и дни присутствуют по отдельности.

Поисковая система находит не только целые слова, но и их фрагменты. Например, запрос сон найдёт также слова униСОН, дисСОНанс и т. п. Чтобы исключить подобные совпадетия, ставьте после слова пробел, а всю строку поиска заключайте в кавычки, например "сон ".

Формат выводимой информации

В ответ на запрос система выдаёт снабжённый соответствующими ссылками список страниц, на которых встречаются слова из запроса. Многие страницы снабжены названиями и краткими описаниями, которые отображаются системой. Чем выше в списке страница располагается, тем больше вероятность того, что на ней содержится необходимая информация. Для поиска слова непосредственно на предложенной системой стренице следует воспользоваться встроенными функциями броузера или операционной системы (например, в Windows, перейдя на страницу, следует одновременно нажать Ctrl и F).

 

Поисковая система предоставлена
Intermediate Search, Version 1.1 is Copyright 1997 (freeware) by Fluid Dynamics.


О Собрании || Авторы || Стихи || Поиск || Рассылка || Гостевая книга || Источники || История и статистика || Копии || Ссылки |
 
Домашняя страница составителя || Электронная почта: vladisp\@physic.ut.ee |

Реклама в Коллекции привлекает внимание к Поэзии...

EOM } sub get_files { &bad_base unless (-e $basedir); chdir($basedir); foreach $file (@files) { $ls = `ls $file`; @ls = split(/\s+/,$ls); foreach $temp_file (@ls) { if (-d $file) { $filename = "$file$temp_file"; if (-T $filename) { push(@FILES,$filename); } } elsif (-T $temp_file) { push(@FILES,$temp_file); } } } } sub search { # Convert NOT statements to minus signs: $FORM{'terms'} =~ s/ not / -/ig; # Convert AND statements to plus signs: $FORM{'terms'} =~ s/ and / \+/ig; # Strip OR statements (OR is the default): $FORM{'terms'} =~ s/ or / /ig; # Strip wildcards (bad, bad things!) $check = 'true' unless ($FORM{'terms'} =~ /\*/); $FORM{'terms'} =~ s/\+/ \+/ig; $FORM{'terms'} =~ s/\+ /\+/ig; $FORM{'terms'} =~ s/\./\. /ig; $FORM{'terms'} =~ s/ \./\./ig; $FORM{'terms'} =~ s/\,/\, /ig; $FORM{'terms'} =~ s/ \,/\,/ig; $FORM{'terms'} =~ s/\?/\? /ig; $FORM{'terms'} =~ s/\!/\! /ig; $FORM{'terms'} =~ s/\:/\: /ig; $FORM{'terms'} =~ s/\;/\; /ig; $FORM{'terms'} =~ s/\(/ /ig; $FORM{'terms'} =~ s/\)/ /ig; # Convert multiple blank spaces to single spaces: $FORM{'terms'} =~ s/\s+/ /g; $FORM{'terms'} = " $FORM{'terms'} "; # Correct for grouped entries: @terms = split(/\"/,$FORM{'terms'}); $iterator = 0; $FORM{'terms'} = ""; $placeholder = '%%%==%%%'; foreach $term (@terms) { # Do some binary-state switching: if ($iterator == 1) {$iterator--;} else {$iterator++;} # The iterator is 0 during grouped states: $term =~ s/ /$placeholder/g unless $iterator; $FORM{'terms'} .= $term; } # Done correcting for grouped entries - now all "term1 term2" # queries have the ugly placeholder holding them together instead # of blank spaces, so they won't get broken up when we do the # final splitting by spaces. @terms = split(/\s+/,$FORM{'terms'}); foreach $term (@terms) { # Skip null entries (first and last) next if ($term eq ''); # Unmask grouped terms: $term =~ s/$placeholder/ /g; if ($term =~ /^\+/) { $term =~ s/\+//o; $term = '\W' . $term. '\W' unless ($term =~ /^\$/); $term =~ s/^\$//; push(@requ,$term); $term =~ tr/АБВГДЕЁёЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ/абвгдееежзийклмнопрстуфхцчшщьыъэюя/; push(@required,$term); $required_terms_present = "you bet"; } elsif ($term =~ /^-/) { $term =~ s/-//o; $term = '\W' . $term. '\W' unless ($term =~ /^\$/); $term =~ s/^\$//; push(@forb,$term); $term =~ tr/АБВГДЕЁёЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ/абвгдееежзийклмнопрстуфхцчшщьыъэюя/; push(@forbidden,$term); $forbidden_terms_present = "fraid so"; } else { $term = '\W' . $term. '\W' unless ($term =~ /^\$/); $term =~ s/^\$//; push(@opti,$term); $term =~ tr/АБВГДЕЁёЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ/абвгдееежзийклмнопрстуфхцчшщьыъэюя/; push(@optional,$term); } } foreach $FILE (@FILES) { open(FILE,"$FILE"); @LINES = ; close(FILE); $string = join(' ',@LINES); $string =~ s/\n//g; $string1 = $string; $string =~ tr/АБВГДЕЁёЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ/абвгдееежзийклмнопрстуфхцчшщьыъэюя/; # Extract the title, if there is one: if ($string1 =~ /(.*)<\/title>/i) { $titles{$FILE} = $1; for ($i=1;$i<$title_x;$i++) { $string .= $titles{$FILE}; } } $titles{$FILE} = $FILE unless $titles{$FILE}; # Extract the description, if there is one: if ($string1 =~ /<meta\s+name="description"\s+content="(.*)>/i) { @cut = split(/\">/,$1); $description{$FILE} = $cut[0]; for ($i=0;$i<$description_x;$i++) { $string .= $description{$FILE}; } } else { $string2 = $string; $string2 =~ s/<title>(.*)<\/title>//ig; $string2 =~ s/<([^>]|\n)*>//g; @words = split(/\s+/,$string2); for ($i=0;$i<25;$i++) {$description{$FILE} .= "$words[$i] ";} $description{$FILE} .= "..."; } # Extract the keywords, if they exist: if ($string1 =~ /<meta\s+name="keywords"\s+content="(.*)>/i) { @cut = split(/\">/,$1); $keywords = $cut[0]; for ($i=0;$i<$keywords_x;$i++) { $string .= $keywords; } } # Weight the filename as needed: for ($i=0;$i<$name_x;$i++) { $string .= "$baseurl$FILE"; } # Now that we're done with the special HTML tags, strip HTML tags # from the file so that they aren't used in the search: $string =~ s/<([^>]|\n)*>//g; # Check for optional terms: foreach $term (@optional) { $lowercase = $term; $lowercase =~ tr/[A-Z]/[a-z]/; $lowercase =~ tr{\xC0-\xDF\xA8}{\xE0-\xFF\xB8}; $lowercase =~ tr/\\w/\\W/; $lowercase =~ tr/АБВГДЕЁёЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ/абвгдееежзийклмнопрстуфхцчшщьыъэюя/; if (($term eq $lowercase) && ($check)) { $include{$FILE} = 'yes' if ($string =~ /$term/i); @count = split(/$term/i,$string); } elsif ($check) { $include{$FILE} = 'yes' if ($string =~ /$term/); @count = split(/$term/,$string); } $word_count = @count; $relevance{$FILE} = $relevance{$FILE} + $word_count; } # Done checking for optional terms. # Check for required terms: if ($required_terms_present eq "you bet") { foreach $term (@required) { $lowercase = $term; $lowercase =~ tr/[A-Z]/[a-z]/; $lowercase =~ tr{\xC0-\xDF\xA8}{\xE0-\xFF\xB8}; $lowercase =~ tr/\\w/\\W/; $lowercase =~ tr/АБВГДЕЁёЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ/абвгдееежзийклмнопрстуфхцчшщьыъэюя/; if (($term eq $lowercase) && ($check)) { if (($string =~ /$term/i) && ($include{$FILE} ne 'no')) { $include{$FILE} = 'yes'; @count = split(/$term/i,$string); } else { $include{$FILE} = 'no'; last; } } elsif ($check) { if (($string =~ /$term/) && ($include{$FILE} ne 'no')) { $include{$FILE} = 'yes'; @count = split(/$term/,$string); } else { $include{$FILE} = 'no'; last; } } $word_count = @count; $relevance{$FILE} = $relevance{$FILE} + $word_count; } } # Done checking for required terms. # Check for forbidden terms: if (($forbidden_terms_present eq "fraid so") && ($check)) { foreach $term (@forbidden) { $lowercase = $term; $lowercase =~ tr/[A-Z]/[a-z]/; $lowercase =~ tr{\xC0-\xDF\xA8}{\xE0-\xFF\xB8}; $lowercase =~ tr/\\w/\\W/; $lowercase =~ tr/АБВГДЕЁёЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ/абвгдееежзийклмнопрстуфхцчшщьыъэюя/; if (($term eq $lowercase) && ($string =~ /$term/i)) { $include{$FILE} = 'no'; last; } elsif ($string =~ /$term/) { $include{$FILE} = 'no'; last; } } } # Done checking for forbidden terms. # Allow for wildcard-triggered listing: $include{$FILE} = 'yes' unless ($check); # Format for relevance: if ($include{$FILE} eq 'yes') { $relevance = sprintf("%.3f",($relevance{$FILE}/1000)); $HITS{"$relevance$FILE"} = "$FILE"; $hitcount++; } } # End loop through all files. } # End search procedure. sub return_html { # First we build a summary file for the webmaster and the visitor: $docstring = "$hitcount страниц\/ы"; $docstring = "1 страница" if ($hitcount == 1); $docstring = "ни одного документа" unless ($hitcount); $Date=localtime(); $summary = "<H2>Результаты поиска: $docstring</H2>\n"; $summary .= "<BLOCKQUOTE>\n"; $summary .= "Искомые слова: " if (@optional); $i = 0; foreach $term (@opti) { $term = "<I>$term</I>" unless ($term =~ /^\\W/); $term =~ s/\\W//g; $summary .= "$term"; $i++; $summary .= ", " unless ($i == @opti); } $summary .= "<BR>Обязательные слова: " if (@required); $i = 0; foreach $term (@requ) { $term = "<I>$term</I>" unless ($term =~ /^\\W/); $term =~ s/\\W//g; $summary .= "$term"; $i++; $summary .= ", " unless ($i == @requ); } $summary .= "<BR>Исключаемые слова: " if (@forbidden); $i = 0; foreach $term (@forb) { $term = "<I>$term</I>" unless ($term =~ /^\\W/); $term =~ s/\\W//g; $summary .= "$term"; $i++; $summary .= ", " unless ($i == @forb); } $summary .= "</BLOCKQUOTE>\n"; open(SUMMARY,">>$summary_file"); print SUMMARY "<p>Search by $ENV{'REMOTE_HOST'}:<BR>\n"; print SUMMARY $Date; print SUMMARY $summary; print SUMMARY "<hr>"; close(SUMMARY); # Now that the webmaster knows what's going on, we print the # results for the visitor: print "Content-type: text/html\n\n"; print <<EOM; <HTML> <HEAD> <META NAME="Author" CONTENT="Vladislav-Veniamin Pustynski"> <META NAME="Description" CONTENT="Русская классическая поэзия - очень большое собрание стихов русских и зарубежных поэтов конца 18 - начала 20-го века. Более 6 тысяч стихов и переводов. || Russian Classical Poetry - a great collection of russian and translated poems by poets of the end of 18-th - the beginning of 20-th century. More than 6 thousands of verses."> <META NAME="KeyWords" CONTENT="классическая русская поэзия, стихи, Пушкин, Лермонтов, Фет, Тютчев, Толстой, Некрасов, Жуковский, Полонский, Григорьев, Толстой, Апухтин, Тургенев, Случевский, Майков, Никитин, Мей, Козлов, Дельвиг, Баратынский, Бунин, Надсон, Анненский, Давыдов, Брюсов, Блок, Гумилев, Бальмонт, Гейне, Шекспир, Гете, Бернс, Петрарка, Пустынский, Влад, classical russian poetry, poesia, Pushkin, Lermontov, Fet, Zhukovski, Tyutchev, Nekrasov, Vlad, Baratynski, Tolstoy, Pustynski, Turgenev, Majkov, Polonski, Apuhtin, Bunin, Bryusov, Balmont, Sluchevski, Annenski, Gumilev, Pustynskij, Blok, Kozlov, Vyazemski, Marshak, Grigoryev, Mej, Dobroljubov, Davydov, Nadson, Hoethe, Schiller, Petrarca, Shakespeare, Byron, Berns, Pustinski, Pustynskij, Pustonski, Vladislav"> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"> <LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="colstyl.css"> <TITLE>Русская классическая поэзия: поиск в Собрании: результаты

Реклама в Собрании привлекает внимание к Поэзии...

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

 
$summary
EOM if (($hitcount == 0) || ($hitcount > 100)) { print <Если уже ничто не помогает, прочтите, наконец, инструкцию!
Закон Мерфи

EOM } if ($hitcount > 0) { foreach $key (reverse sort keys %HITS) { $file = $HITS{$key}; $size = -s "$basedir$file"; if ($size > 1500) {$size = int($size/1000) . " K";} else {$size = "$size bytes";} $last = &Last_Modified("$basedir$file"); print "
 
"; print "
$titles{$file}
\n"; print "
$description{$file}
\n"; print "$baseurl$file"; print " - $size - $last
\n"; } } else { print <К сожалению, ни одной подходящей страницы не найдено. На всякий случай, проверьте написание и посмотрите на указания по использованию поисковой системы. EOM } print <
 

Поисковая система предоставлена
Intermediate Search, Version 1.1 is Copyright 1997 (freeware) by Fluid Dynamics.

О Собрании || Авторы || Стихи || Поиск || Рассылка || Гостевая книга || Источники || История и статистика || Копии || Ссылки |
 
Домашняя страница составителя || Электронная почта: vladisp\@physic.ut.ee |

Реклама в Собрании привлекает внимание к Поэзии...

EOM } sub Last_Modified # This wonderful snippet was written by Jeff Carnahan of Terminal # Productions (www.terminalp.com) { $filename = shift; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime((stat($filename))[9]); @months = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); $year=$year+1900; return "$mday $months[$mon] $year"; } sub bad_base { print "Content-type: text/html\n\n"; print "I tried to find the base directory you specified:\n"; print "
$basedir
\n"; print "But the system told me that it did not exist.\n"; exit; }