Учебник по Яндекс-ASP

Мой первый скрипт

Написать простейший ASP-скрипт для поисковой странички с использованием Яндекс-компонентов очень легко. Рассмотрим следующий пример, использующий VBScript. Скрипт, интерпретируемый Web-сервером, выделен цветом. Предполагается, что поисковая машина Яндекс имеет имя Default, задаваемое по умолчанию.

<%
'-------------- Sample1.asp -----------------

Text = Request("t")
Dim Ynd, DocList
If Text <> "" Then
	Set Ynd = Server.CreateObject("Yandex.YandexAsp")
	Set DocList = Ynd.FindDocuments(Text)
End If
%>
<HTML>
<HEAD>
<TITLE>Поисковая страничка</TITLE>
</HEAD>
<BODY>

<FORM NAME=search METHOD=get ACTION="Sample1.asp">
<TABLE><TR>
<TD><B>Запрос</B></TD>
<TD><INPUT TYPE=text NAME=t SIZE=42 VALUE="<%=Text%>"></TD>
<TD><INPUT type=submit value="Найти!"></TD>
</TR></TABLE>
</FORM>

<%If Text <> "" And DocList.Count > 0 Then%>
<HR>
<OL>
<%
For i = 0 To DocList.Count-1
	Set Doc = DocList.Item(i)
%>
<LI><A HREF="<%=Doc.FileName%>"><%=Doc.FileName%></A>
<%Next%>	
</OL>
<%End If%>

</BODY></HTML>

Скрипт выводит форму, содержащую поле для ввода запроса к поисковой системе Яндекс. Обработка данных формы также производится этим скриптом. Если скрипт вызывается в первый раз, поле для ввода запроса пустое. Если скрипт вызывается в ответ на запрос, поле для ввода запроса содержит текст предыдущего запроса, который извлекается из встроенного ASP-объекта Request. Кроме того, в этом случае скрипт обрабатывает запрос и выводит список найденных документов.

Для обработки запроса скрипт создает объект YandexAsp, представляющий сервис Яндекса, и предлагает этому объекту обработать запрос. Для этого вызывается функция FindDocuments, которой в качестве параметра передается текст запроса. Функция возвращает объект AspDocuments, представляющий список найденных документов. Каждый элемент списка может быть получен вызовом функции Item(i) этого объекта, где i - номер документа по-порядку. Число найденных документов содержится в свойстве Count. В заключение скрипт выводит список найденных документов, используя свойство FileName документа.

Чем плох этот простой пример?

1. Приведенный скрипт практически не будет работать, если Ваш сервер содержит больше нескольких десятков документов. Дело в том, что в примере все найденные документы выводятся на одну страницу. При большом количестве найденных документов это неудобно, а при очень большом - не работает вовсе. Чтобы обойти указанную проблему, необходимо использовать разбивку списка найденных документов на страницы. Для этого следует запоминать номер запроса, возвращаемый сервисом Яндекса, и загружать необходимую часть списка найденных документов, используя этот номер. В следующем примере будет показано, как это сделать.

2. Ссылки в списке найденных документов указывают только на оригинальные документы. Однако часто бывает удобно посмотреть так называемые "документы с подсветкой", в которых слова из запроса, повлиявшие на результат поиска, выделены каким-либо образом. Такой документ получается в результате специальной обработки, выполняемой сервисом Яндекса, и в ASP-скриптах выводится с использованием объекта AspHighlighter. Соответствующий пример будет рассмотрен далее.

Разбивка на страницы

Следующий скрипт разбивает список найденных документов на страницы по 10 документов. Новые по-сравнению с предыдущим примером строчки скрипта выделены более ярко.

<%
'-------------- Sample2.asp -----------------

Sub WriteOtherPages(QueryId, DocCount, CurPage, DocPerPage)
If DocCount <= DocPerPage Then
	Exit Sub
End If
PageCount = CInt((DocCount+DocPerPage-1)/DocPerPage)
PageRank = 10
PageFirst = CurPage-PageRank
PageLast = CurPage+PageRank
If PageFirst < 1 Then
	PageFirst = 1
End If
If PageLast > PageCount Then
	PageLast = PageCount
End If
Response.Write("Другие страницы найденных документов: ")
If CurPage > 1 Then
	Str = "<A HREF=Sample2.asp?q=" + QueryId+ "&p=" + CStr(CurPage-1) + ">[Пред.]</A>"
	Response.Write(Str)
End If
For i = PageFirst To PageLast
	If i = CurPage Then
		Response.Write(i)
	Else
		Str = "<A HREF=Sample2.asp?q=" + QueryId + "&p=" + CStr(i) + ">" + CStr(i) + "</A>"
		Response.Write(Str)
	End If
Next
If CurPage < PageLast Then
	Str = "<A HREF=Sample2.asp?q=" + QueryId+ "&p=" + CStr(CurPage+1) + ">[След.]</A>"
	Response.Write(Str)
End If
End Sub

Text = Request("t")
Query = Request("q")
Page = CInt(Request("p"))
If Page = "" Then
	Page = 1
End If
DocPerPage =10
Dim Ynd, DocList
If Text <> "" Then
	Set Ynd = Server.CreateObject("Yandex.YandexAsp")
	Set DocList = Ynd.FindDocuments(Text)
ElseIf Query <> "" Then
	Set Ynd = Server.CreateObject("Yandex.YandexAsp")
	Set DocList = Ynd.LoadDocuments(Query)
End If
DocFirst = (Page-1)*DocPerPage
DocLast = DocFirst + DocPerPage - 1
If DocLast >= DocList.Count Then
	DocLast = DocList.Count - 1
End If
%>
<HTML>
<HEAD>
<TITLE>Поисковая страничка</TITLE>
</HEAD>
<BODY>

<FORM NAME=search METHOD=get ACTION="Sample2.asp">
<TABLE><TR>
<TD><B>Запрос</B></TD>
<TD>
<INPUT TYPE=text NAME=t SIZE=42 VALUE="<%=DocList.SearchText%>">
<INPUT TYPE=hidden NAME=q VALUE=<%=DocList.Id%>>
</TD>
<TD><INPUT type=submit value="Найти!"></TD>
</TR></TABLE>
</FORM>

<%If (Text <> "" Or Query <> "") And DocList.Count > 0 Then%>
<HR>
Документы <%=DocFirst+1%>-<%=DocLast+1%> из <%=DocList.Count%> найденных уникальных документов. 
<OL start=<%=DocFirst+1%>>
<%
For i = DocFirst To DocLast
	Set Doc = DocList.Item(i)
%>
<LI><A HREF="<%=Doc.FileName%>"><%=Doc.FileName%></A>
<%Next%>	
</OL>
<%End If%>

<%
Call WriteOtherPages(DocList.Id, DocList.Count, Page, DocPerPage)
%>
</BODY></HTML>

Если в браузере нажата кнопка "Найти!" поисковой формы, этот скрипт работает также, как и предыдущий, с тем отличием, что выводит на страницу только первые 10 документов из списка найденных. Однако в отличие от примера "Sample1.asp", данный скрипт имеет дополнительные два входных параметра: номер запроса и номер страницы. Номер запроса хранится в свойстве Id коллекции AspDocuments, полученной в результате предыдущей работы скрипта. Если известен номер запроса, скрипт не выполняет запрос заново, а загружает выполненный ранее запрос, используя функцию LoadDocuments объекта YandexAsp, представляющего сервис Яндекса. Если известен номер страницы, скрипт вычисляет номера первого и последнего документов на странице, после чего показывает только эти документы.

Чтобы сформировать список страниц, скрипт использует подпрограмму WriteOtherPages(QueryId, DocCount, CurPage, DocPerPage), где QueryId - номер запроса, DocCount - число найденных документов, CurPage - текущая страница, DocPerPage - число документов на страницу, равное 10 в данном примере. Подпрограмма вычисляет диапазон страниц, которые надо вывести в списке страниц, после чего формирует список ссылок и выводит его с помощью внутреннего ASP-объекта Response. В каждой ссылке передается номер запроса и номер страницы.

Подсветка документа

Добавим в предыдущий пример строчку, ссылающуюся на документ с подсветкой, и рассмотрим скрипт Sample3.asp, создающий такой документ.

<%
'-------------- Sample2.asp -----------------
            < . . . >
For i = DocFirst To DocLast
	Set Doc = DocList.Item(i)
%>
<LI><A HREF="<%=Doc.FileName%>"><%=Doc.FileName%></A>
<BR><A HREF="Sample3.asp?q=<%=DocList.Id%>&d=<%=i%>">Документ с подсветкой</A>
<%Next%>	
            < . . . >

В качестве параметров скрипту Sample3.asp передаются номер запроса и номер документа. Пример скрипта выглядит следующим образом.

<%'-------------- Sample3.asp -----------------%>
<!--#include file = "Yandasp.inc"-->
<%
brk = 0
Set Ynd = Server.CreateObject("Yandex.YandexAsp")
Set HL = Ynd.HighlightDoc(Request("q"), Request("d"))
Do While brk = 0
	Point = HL.WriteTextPortion()
	If Point = HILITE_FIRST_WORD_START Or Point = HILITE_WORD_START Then
		Response.Write("<FONT COLOR=#FF0000>")
	ElseIf Point = HILITE_WORD_END Or Point = HILITE_LAST_WORD_END Then 
		Response.Write("</FONT>")
	ElseIf Point = HILITE_TEXT_END Then 
		brk=1
	End If 
Loop
%>

Скрипт выводит найденный документ, подсвечивая в нем слова из запроса красным цветом. Создав объект YandexAsp, представляющий сервис Яндекса, скрипт вызывает функцию HighlightDoc этого объекта, принимающую в качестве параметра номер запроса и номер документа и возвращающую объект AspHighlighter, подсвечивающий документ. Функция WriteTextPortion этого объекта записывает очередную порцию текста документа в выходной поток, возвращая тип возможной вставки. Включаемый файл Yandasp.inc содержит описания констант HILITE_...