Список всех ссылок на странице: формируем и сохраняем в файле

(JAWS и технологии Com/Automation)
Дата публикации:2004
Поделиться в Twitter Поделиться в F******k Поделиться в VKontakte Поделиться в Telegram Поделиться в Mastodon

Если вы знакомы с языком сценариев Jaws for Windows, то, вероятно, знаете, что сценарии Jaws практически не поддерживают работу с файлами, за исключением файлов .ini (О работе с файлами .ini можно прочитать в Справочнике разработчика скриптов). Нередко на практике возникает необходимость сохранить информацию в файле, например, в текстовом формате (.txt). Как же быть в этом случае?

На помощь нам приходит технология COM, а именно объект под названием "FileSystemObject" (FSO), который входит в состав операционных систем Windows (начиная с Windows 98). Этот COM-объект позволяет читать и записывать текстовые файлы, переименовывать файлы и папки, копировать и удалять их. Нам же в этот раз понадобится лишь одна из его возможностей - сохранение текстовых данных в файле. Другой COM-объект, свойствами которого мы воспользуемся, будет InternetExplorer, известная программа просмотра html-документов.

Задача, которую мы будем решать, сформулирована в заголовке этой статьи. Уточним только некоторые моменты. Во-первых, создаваемый скрипт должен быть помещен в файл скриптов для InternetExplorer, так как вызов этого скрипта имеет смысл только при работе с этой программой (в других браузерах скрипт выполняться не будет или возникнут ошибки в его работе). Во-вторых, предполагается, что вы уже освоили написание и отладку скриптов (сценариев) Jaws for Windows.

Алгоритм работы скрипта несложен. Сначала через COM-интерфейс InternetExplorer скрипт получает все ссылки на текущей странице (которые сохраняются в переменной типа object). Затем происходит перебор этих ссылок и формирование текстовых данных, каждая строка которых состоит из описания ссылки (свойство innerText - регистр букв имеет значение) и гиперссылки (свойство href - регистр букв имеет значение).Если ссылка графическая, то есть отображается на странице в виде картинки, то описание её берётся из атрибута alt, который используется в html-документов для словесного описания изображения. Если на странице ссылок нет или версия InternetExplorer ниже четвертой, то озвучивается соответствующее сообщение и работа скрипта прекращается.

После того как текстовые данные сформированы, выводится диалог, предлагающий пользователю выбрать, куда сохранить данные (буфер обмена или файл). В зависимости от выбора пользователя данные передаются в буфер обмена (при этом в ряде случаев может возникнуть проблема кодировки символов - наблюдалась для Jaws 5.00 - при вставке текста в редакторы Блокнот, WordPad, MicrosoftWord, но проблем не возникает при вставке, например, в текстовом редакторе Bred), либо сохраняются в файле (в этом случае никаких сложностей с кодировкой не возникает). Прежде чем сохранить данные в файле, пользователю предлагается ввести полное имя файла. Однако, в целях простоты изложения, проверка корректности пути не производится, поэтому указываемые папки должны существовать. Сам же файл будет создан, если не существует, или записан поверх существующего.

Скрипт должен быть помещён в файл скриптов, соответствующих Internet Explorer, для чего, находясь в InternetExplorer, следует нажать комбинацию Insert + 0 на основной клавиатуре. После того как загрузится Диспетчер скриптов (Script Manager), следует средствами Диспетчера создать скрипт, исходный код которого приведен ниже. Скрипт был проверен для Jaws версии 4.51 и более поздних.

Подробную информацию о COM-объектах FSO и InternetExplorer можно получить из сборника статей по работе с различными Windows, который можно скачать отсюда.

Script ListOfLinks ()
Var
	Object fso,
	Object file,
	Object doc,
	Object links,
	Object all,
	Int nLinks,
	String buffer,
	String strTemp,
	String url,
	Int nIdx

If (ieVersion == IE3) Then
	Say("Поддерживаются только версии InternetExplorer от 4 и выше",OT_MESSAGE)
	return
EndIf
let doc = ie4GetCurrentDocument ()
let links = doc.links
let all = doc.all
let nLinks = links.length
If (nLinks == 0) Then
	Say("На этой странице ссылок нет", OT_MESSAGE)
	return
EndIf
let buffer = "Список ссылок на странице: "
let strTemp = doc.title
let url = doc.location.href
let buffer =buffer + strTemp +" ("+url+")\r\n"
let buffer =buffer + "Всего ссылок: "+IntToString(nLinks)+"\r\n"
let nIdx = 0
; Начинаем цикл по всем ссылкам на странице.
While (nIdx < nLinks)
;Получаем текстовое поле ссылки.
	let strTemp = links(nIdx).InnerText
;Если ссылка в виде картинки, то получаем текст ее описания из атрибута alt.
	If (! strTemp) Then
		let strTemp = all(links(nIdx).SourceIndex + 1).alt
	EndIf
	let url = links(nIdx).href
	let strTemp =strTemp + " "+ url
	let buffer = buffer + "\r\n"+ strTemp
	let nIdx = nIdx+1
EndWhile
let strTemp = "Копировать в буфер\007Сохранить в файл"
let nIdx = DlgSelectItemInList (strTemp, "Список ссылок", false)
If nIdx ==1 Then
	CopyToClipboard (buffer)
	Say("Список ссылок помещен в буфер обмена. Всего обнаружено " +
IntToString (nLinks) + " ссылок., OT_MESSAGE")
Elif nIdx ==2 Then
	; Имя файла по умолчанию
	let strTemp= "c:\\temp\\list_of_links.txt"
If InputBox("Введите полное имя файла: ", "Сохранение списка ссылок", strTemp) Then
	; Если пользователь нажал Ок, то сохраняем список в файле
	let fso = CreateObject ("Scripting.FileSystemObject")
	let file =fso.CreateTextFile(strTemp, 1)
	file.WriteLine(buffer)
	file.Close()
	Say("Список ссылок помещен в файл " + strTemp, OT_MESSAGE)
EndIf
EndIF
EndScript


Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024