else: ret=ret+o.icon
ret=ret+'" border=0 width=18 height=16>
<a ref="'+o.absolute_url()
ret=ret+'">'+o.title_or_id()+'</a><br>'
# возвращаем результат - список файлов и количество найденных документов.
return ret,count
На языке DTML был написан документ, содержащий форму поиска, и отображающий результат действия скрипта.
Вызывается скрипт из DTML-документа при помощи следующего тэга:
<dtml-var "scr.site_search(PARENTS[0],'text to search',0)">
DTML-документ содержит JavaScript, переводящий фокус курсора в строку поиска:
<script>
document.searchform.search_expr.focus();
</script>
2.3. Реализация системы конференции
Система конференции была реализована с помощью технологии DOM, языка XML и скриптового языка Python.
Текст сообщений хранится в xml-файле, имеющего следующую структуру:
<?xml version="1.0" encoding="windows-1251"?>
<news>
<n>
<title>Заголовок сообщения</title>
<description>Содержание сообщения. </description>
</n>
………..
</news>
Этот xml-файл обрабатывается с помощью технологии DOM:
Вся обработка ведется с помощью скрипта, написанного на языке JavaScript:
Подключаем xml-файл:
function onLoad()
{
news = new ActiveXObject("Microsoft.XMLDOM")
news.async = false
news.load("news.xml")
if (news.parseError != 0) {
alert(news.parseError.reason)
return
}
Далее следует его обработка: Выводим заголовок сообщения:
function main() {
N = root.childNodes.length
str = ""
for (i=0; i <= N - 1; i++) {
curNode = root.childNodes.item(i)
str = str + "<li><a href='news.htm?" +
i + "'>" +
curNode.getElementsByTagName("title").item(0).text +
"</a> <i>" +
}
xmlnews.innerHTML = str
}
Выводим содержание сообщения:
function descr() {
curNode = root.childNodes.item(parseInt(id))
str = "<p><b>" +
curNode.getElementsByTagName("title").item(0).text +
"</b> <i>" +
curNode.getElementsByTagName("description").item(0).text +
"<p>"
str = str + "<p>[<a href='news.htm'>Все сообщения</a>]"
xmlnews.innerHTML = str
}
Добавление сообщений ведется скриптом, реализованном на языке Python. При добавлении сообщения:
1. Cкрипт считывает xml-файл.
2. Разбивает его на две части. Первая часть – заголовок xml-файла с тегом <news>. Вторая – оставшаяся часть xml-файла.
3. Формирует строку для добавления.
4. Производит конкатенацию следующим образом: первая часть файла+сообщение+вторая часть файла.
5. Записывает контент в xml-файл.
2.4. Реализация системы голосования на сайте
Система голосования аналогична системе конференции, за исключением того, что здесь в дополнение используется технология XSL, которая обрабатывает xml-файл. А с помощью технологии DOM поизводится подключение 2 файлов: xml и xsl следующим образом:
<script language="JScript">
<!--
var doc, st
// создаем 2 объекта ActiveX, являющихся обьектами DOM
doc = new ActiveXObject("Microsoft.XMLDOM")
st = new ActiveXObject("Microsoft.XMLDOM")
// синхронно обрабатываем их, загружая xml и xsl файлы
doc.async = false
st.async = false
doc.load("results")
st.load("result.xsl")
// если возникает ошибка при обработке, сообщеем о ней
if (doc.parseError == 0 && st.parseError == 0) {
XmlTreeMenu.innerHTML = doc.transformNode(st)
}
else {
XmlTreeMenu.innerHTML = "Error !"
}
//-->
</script>
2.5. Разработка и реализация методов защиты
HTML-документов, публикуемых на сервере Zope
Одной из задач курсовой работы являлась разработка и реализация методов защиты HTML-документов.
На основе анализа методов защиты HTML-документов, был предложен собственный метод защиты HTML-документов.
Схема защиты HTML-документа следующая:
1.Читаем содержимое HTML-документа
2. Каждый символ контента переводим в HEX-отображение:
Например,
if i=='6':
gg=hex(ord(i)) #Получаем hex значение символа
u=u+"%"+gg[2:] #Берем два последних значащих символа
Для решения проблемы кодировки русских символов использовалось прямое указание значений символов:
Например,
if i==а':
u=u+"%u0430"
3. Добавляем к контенту строку, содержащую закодированный скрип Java, запрещающий выделение и нажатие правой клавиши мыши:
<script language="JavaScript1.2">
<!--
var message="";
function clickIE() {
if (document.all) {
alert(message);return false;
}
}
function clickNS(e) {
if (document.layers||(document.getElementById&&!document.all)) {
if (e.which==2||e.which==3) {
alert(message);return false;
}
}
}
if (document.layers) {
document.captureEvents(Event.MOUSEDOWN);document.onmousedown=clickNS;}
else {
document.onmouseup=clickNS;document.oncontextmenu=clickIE;
}
document.oncontextmenu=new Function("return false")
// -->
document.oncontextmenu=new Function("return false")
function disableselect(e){
return false
}
function reEnable(){
return true
}
//if IE4+
document.onselectstart=new Function ("return false")
//if NS6
if (window.sidebar){
document.onkeypress=disableselect
document.onmousedown=disableselect
document.onclick=reEnable
}
</script>
<script language="JavaScript">
function goaway(evnt){
if (evnt.which == 0){
location.href = "blank.htm"
return false;
}
}
document.onkeypress=goaway;
</script>
4. Формируем JavaScript, который декодирует контент с помощью функции unescape(контент) - перевод из кода символа в символ “..”
Пример:
<script language=JavaScript>
m='Строка закодированных символов';
d=unescape(m);
document.write(d);
</script>
5. Запись контента в HTML-документ.
Метод реализован для поддержки браузерами Internet Explorer, начиная с версии 3.0, а также Netscape Navigator, начиная с версии 6.0.
2.6. Адаптирование разработанного программного обеспечения для поддерживаемого сайта
В качестве применения метода защиты HTML-документов, реализованы скрип на языке Python и интерфейс, позволяющие защищать документы, публикуемые на сервере Zope.
На вход скрипту поступает 2 параметра:
1) file - cсылка на файл, находящийся на машине клиента или в локальной сети;
2) id – название документа после его публикации на сервере Zope.
Алгоритм работы скрипта может быть представлен следующим образом:
Публикация документа на сервере Zope в каталог, в котором находится скрипт:
container.manage_addFile(id,title="", content_type= "text/plain", file=file)
Получение доступа к содержимому документа.
Чтение содержимого HTML-документа
Посимвольный перевод контента в HEX-отображение(аналогично пункту 2.5.)
Добавление к контенту строки, содержащей закодированный скрип Java, запрещающий выделение и нажатие правой клавиши мыши (скрипт описан в пункте 2.5.)
Формирование JavaScript, который декодирует контент с помощью функции unescape(контент)-перевод из кода символа в символ “..”
Удаление загруженного документа:
container.manage_delObjects(id)
Публикация документа в закодированном виде на сервере Zope в текущий каталог:
container.manage_addFile(id, title="", content_type= "text/plain", file=t)
# t – текстовая переменная, где содержится зашифрованный текст
Возвращает в каталог, где находится скрипт:
if REQUEST is not None:
try: u=context.DestinationURL()
except: u=REQUEST['URL1']
REQUEST.RESPONSE.redirect('self.absolute_url()+'/manage_main')
Таким образом, цель работы была достигнута. Все задачи для достижения поставленной цели были успешно решены:
· Модернизированы разделы сайта “Программирование” и ”Курсовые работы”.
· Реализована система поиска.
· Реализована система конференций.
· Реализована система голосования на сайте.
· Изучены возможности скриптового языка Python.
· Разработаны и реализованы методы защиты HTML-документов, публикуемых на сервере Zope.
· Адаптировано разработанное программное обеспечение для поддерживаемого сайта.
· Поддержка сайта осуществлялась в течении учебного года.
В результате разработки персонального сайта преподавателя были получены практические навыки по использованию следующих технологий:
- XML
- XSL
- DOM 1.0 и 2.0
И языков:
- HTML
- DTML
- Python
- Java Script
Результат работы можно посмотреть по адресу http://mf.grsu.by/home/livak.
Список использованной литературы
1. Дидье Мартин, Никола Озу, Брюс Пит и др. XML для профессионалов. - ЛОРИ - Москва, 2001. – 865 стр.
2. Официальный сайт организации World Wide Web Consortium // www.w3c.org
3. Сайт Нижегородского Государственного Университета // www.xml.nsu.ru
4. Didier Martin. XML for beginners. - Wrox Press. - Birmingham, 2002. – 597 стр.
5. Сайт издательского дома Wrox Press // www.wrox.com
6. Сайт компании Digital Creations // www.zope.org