Отправляет email-рассылки с помощью сервиса Sendsay

KirovLUG: пользователи Linux в Вятке

За 2004-12-01

Re: Гонка дистрибутив ов

> Приятное известие!
> А когда начнётся раздача, а то у меня уже болванки скоро испортятся? :-)
завтра появятся у меня... я и буду раздавать... кому надо будет DVD
копии - предупредите заранее - стоимость - 150 руб. с человека без
стоимости болванок...

   2004-12-01 22:42:36 (#273327)

linuxовка

Очередное сборище linuxового народа состоится на Театральной площади у
сцены в ПЯТНИЦУ (3 декабря) в 18.00. Приглашаются все желающие.

Кто может опоздать - предупредите заранее - на сколько, чтобы мы вас
подождали.

   2004-12-01 22:38:49 (#273321)

Lindocs - Преобразование контента (часть 1)

Доброго времени суток, L.U.G.

Lindocs - Преобразование контента (часть 1).

Чего хотелось бы в первую очередь:
1) Приведение к стандартному и красивому xhtml виду, для
упрощения дальнейшей обработки контента.
2) Приведение всех страниц одной кодировке (я предпочитаю koi8).
3) Убрать лишнее. К лишнему я отношу в первую очередь Java-Sript-ы
и комментарии, META информацию (кроме информации о кодировке),
ну и заодно баннеры которые обычно вставляются с помощью JS.
А также iframe-ы, которые тоже часто используются для
вставки баннеров.
Преобразование внутреннего содержимого тегов к нижнему
регистру и соответствующее переименование файлов (все имена -
к нижнему регистру).
А ещё... а ещё я много чего хочу, но пока хватит и этого.

Как там в песенке? "Нажми на кнопку получишь результат".
Желание загадали - можно жать кнопку :).

Для реализации "волшебной кнопки" нам пондобится:
1) tidy - инструмент для исправления ошибок в html,
форматирования html страниц, приведение их в
соответствии с тем или иным html DTD.
В общем - то что надо для реализации части наших замыслов.

Есть реализации этой утилиты практически для каждой
платфомы, но, к сожалению, похоже, нет единой
страницы, где можно было бы найти их все.
Я использовал версию tidy из портов FreeBSD
ports/www/tidy/. Пользователи Linux могут найти
её с помощью http://rpmfind.net/.

2) Любая утилита для определения кодировки текста
и перекодирования его в нужную (koi8-r).

3) Небольшой скрипт, для вырезания комментариев и скриптов.
В моём случае он будет написан на Perl, мне так удобнее.

4) Ещё один небольшой скрипт для того чтобы собрать всю эту
"силищу" в одном месте и соверщить "чудо" :)

Предположим что tidy уже стоит и готов к работе. Определим
вид к которому будем приводить документацию с помощью файла ~/.tidy:
tidy.conf [Конфигурационный Файл утилиты tidy] -- begin
quiet: yes
// не выдавать Welcome message и суммарное число ошибок и предупреждений

indent: yes
// делать отступы для block-level тэгов

indent-spaces: 4
// величина отступа

wrap: 80
// делать переносы текста (0 - не делать)

wrap-attributes: no
// не разбивать тэги на разные строки

logical-emphasis: yes
// замена "устаревших" тегов-форматирования (i, b) на
// теги разметки (em, strong)

clean: yes
// удаление избыточных тегов заменой их на стили и структурные элементы
// (обычно подобным "грешат" различные WICIWYG редакторы)

markup: yes
// определяет будет ли tidy осуществлять дополнительные
// переносы и улучшение вида страницы

tidy-mark: no
// не добавлять мета элемента типа "проверено с тайдом" ;)

output-xml: no
// выводим НЕ в XML

input-xml: no
// на входе НЕ XML

output-xhtml: yes
// xhtml на выходе

show-warnings: yes
// выводить предупреждения

numeric-entities: yes
// нумеровать объекты подвергающиеся измененям

quote-marks: yes
// заменять кавычки на html

quote-nbsp: no
// не заменять пробелы

quote-ampersand: yes
// заменять амперсанды

break-before-br: yes
// делать переносы перед тегом br

uppercase-tags: no
// теги - в нижнем регистре

uppercase-attributes: no
// атрибуты тоже

char-encoding: raw
// не меняем кодировку

error-file: errors.log
// ошибки и предупреждения выводим в файл

tidy.conf [Конфигурационный Файл утилиты tidy] -- end

Для перекодирования я использовал утилиту koi2koi, которую поставил
опять же из портов. Можно использовать любую другую утилиту
перекодировки, которая способна самостоятельное
распознавать исходную кодировку.

Теперь скрипт... А вот на этом этапе придётся подумать
и хорошо подумать. Потому что пробный прогон tidy показал,
что на Очень большом количестве страниц содержится много
неправильного форматирования, и иногда бедняга tidy просто падал
и не поднимался.... (core dumped... почтим его память минутой молчания :))
И поэтому чтобы всё таки использовать tidy нужны дополнительные преобразования,

которые тоже будут производится в скрипте.

Что нужно от скрипта:
- "Закавычивание" значений параметров тегов.
- Приведение самих тегов к нижнему регистру - это упростит дальнейшую их
обработку, и поиск.
- Удаление из HTML-документа неугодных тегов, в частности
комментариев, META-тегов и скриптов. (при этом учесть что в комментариях часто

можно встретить Java_Script код, в котором могут содержаться "неправильные"
символы, например ">"). Мета-теги тоже будем удалять, потому что содержимое
так или иначе будет описано в xml/SQLite базе ссылок.
- Указание кодировки документа.

Но главным принципом при написании скрипта было:
"Не навреди", т.е. главное чтобы внешний вид документов
и особено само содержание не пострадали. (поэтому я не стал
трогать теги вроде LINK, потому что css мы пока оставляем
те что были [1])

deltag.pl [ Скрипт очиски контента для проекта Lindocs ] -- begin
#!/usr/local/bin/perl -w

############################################################################
# ./deltag.pl [-v]
# Скрипт для чистки "контента" документации проекта Lindocs
# Является частью статьи "Lindocs - Преобразование контента (часть 1)"
# Author: Stan S. Krupoderov
# Web: http://kirov.lug.ru
# mailto:pashelper[aT]mail.ru
############################################################################

use locale;

# если в качесте первого параметра задан -v
# то, в STDERR будут выводиться удаляемые теги
if (@ARGV < 1) {
print "Usage: $0 [-v] \n";
print "\t-v - verbose mode (out deleted tags to STDERR), Use it to test script\n";
exit;
}

if ($ARGV[0] eq '-v') {
$main::verbose = 1;
shift @ARGV;
}
else
{
$main::verbose = 0;
}

# Разбираем файлы не построчно, а по тегам [1]
$/=">";

#########################################################################
#Регулярные выражения для разбора html
#########################################################################

# [^\001] используется как замена подстановки . для того чтобы это работало
# для русского языка

# начало тега или пустой тег
$tagbegin =
qr/<# тэг
(\w+)# с именем
[\s\n]*?# возможно отделённый пробелами
(?:[\w\-]+ # возможно с параметрами
\s*?# отделённыим пробелами
(?:=\'?
[\s]*?\"?(?:[\w\.,\/&:\(\);\'%\s\n\-_\#]+)\"?)?# от возможных значений
[\s\n\']*# параметры отделены прбелами
)*# несколко параметров
\/?# возможно пустой
>
/x;

# конец тега
$tagend = qr/<[\s\n]*\/(\w+)[\s\n]*>/;

# для поиска комментариев
$comments = qr//;
$begincomments = qr//;

# выделение параметров тегов имеющих не заключеныые в кавычки значения
$notquotedargs = qr/([\w\-]+)\s*?=\s*?([\w\.,\/&:\(\);\'%\-_\#]+)([\s\n>]+?)/;

$charset=qr/charset\s*=\s*[\'\w\-]+/;

# Это теги которые будут удалены (!!! они должны быть парными)
deletetags = qw/script noscript/;

FILE:
foreach my $filename (@ARGV)
{
if (-r $filename && !(-d _))
{
open FIN, "<$filename" or
die "Can't open file $filename: $!\n";

print STDERR "\n\n--filename:$filename\n" unless ($main::verbose);

while ()
{

if (/$comments/) {
# -v output
print STDERR "$&\n" if ($main::verbose);
s/$comments//;
}

# удаляем однострочные комментари, а многострочные
# собираем в одну строку и затем удаляем
if (/$begincomments/){
my $add;
my $data = "";
do
{
$add = if (defined FIN);
next FILE unless ($add);
$data .= $add;
}
until ($add =~ /$endcomments/);

$_ .= $data;
if (/$comments/) {
# -v output
print STDERR "$&\n" if ($main::verbose);
s/$comments//;
}
}

# обрабатываем теги
# нашли вход:
if (/$tagbegin/)
{

my ($tag, $tagname) = ($&, $1);
s/$tag//;# $_ НЕ содержит _открывающих_ тегов
# (только содержимое страницы)
print;# выводим его

$tag = lc($tag);# приводим к нижнему регистру теги
$tagname = lc($tagname);# и имена тегов

$tag =~ s/$notquotedargs/$1=\"$2\"$3/g; # "закавычиваем" значения параметров

# обрабатываем все запрещённые (парные) теги
foreach my $deletetag (@deletetags)
{

if ($tagname eq $deletetag)# tags to delete
{
my $add;
my $data = "";
do {
$add = ;
unless ($add) {
next FILE ;
}
$data .= $add;
}
until ( $add =~ /$tagend/ && (lc($1) eq $deletetag) );

# -v output
print STDERR $tag . $data . "\n" if ($main::verbose);

$tag = $tagname = ""; #zip it

last;
}

}

# остальные теги
if ($tagname eq 'meta')# meta
{
# -v output
print STDERR "$tag\n" if ($main::verbose);
# меняем мета-теги кодировок
if ($tag =~ s/$charset/charset='koi8-r'/)
{
print $tag;
}
}
else# others
{
# выводим остальные теги
print $tag;
}

}
elsif (/$tagend/)# tag end
{
my $tag = $&;
s/$tag//;
print;
print lc ($tag);
}
else # content
{
# выводим контент
print;
}
}
close FIN;
}
else
{
die "bad file: $!\n";
}
}

__END__

[1] На самом деле ">" - это не обязательно признак конца тега, но в
общем случае это работает, и делает обработку файлов удобнее.

deltag.pl [ Скрипт очиски контента для проекта Lindocs ] -- end

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

main.sh [ Сборочный скрипт очиски контента для проекта Lindocs ] -- begin
#!/bin/sh

echo "start work at " `date` > ./work.log

# путь по которому работаем
workpath=/usr/lin/inode/lindocs/

# в out.log накапливаем удалённые теги, для
# проверки работы скрипта
taglog=out.log

echo >$taglog

# имена файлов - к нижнему регистру
echo "Преобразование имён файлов:"
echo "Приведение имён файлов к нижнему регистру..."
find -d $workpath -exec sh -c 'n={};file=${n##*/};path=${n%/*}; mv $path/$file
$path/`echo $file| tr A-Z a-z` 2>/dev/null \;
# find -d $workpath -exec ./lcname.pl {} \;
echo "OK."

echo "Преобразование контента:"
for filename in $(find $workpath | grep 'htm[l]*$');
do
# работаем только с файлами
if [ -f "$filename" ]
then
echo $filename >>list.log
# перекодировка
koi2koi <$filename > $filename._1
# "очистка"
./deltag.pl -v $filename._1 > $filename 2>>$taglog
rm $filename._1
# наводим окончательную красоту
tidy -m -config ./tidy.conf $filename
#|| echo "tidy was confused by $filename">>./work.log
fi
done
echo "OK."
echo "work done at " `date`>> ./work.log
cat ./work.log | more

main.sh [ Сборочный скрипт очиски контента для проекта Lindocs ] -- end

Результаты:
Всё почти как хотелось, но - есть пара но.
- Перекодировщик выжал из себя всё что мог однако, на некоторых
страницах, к примеру
lindocs/linux/sites/www.citforum.ru/operating_systems/os2/index.html
он почему то не сработал, поэтому если Вы знаете перекодировщик
лучше, то используйте его.
- Имена некоторых файлов проекта тоже оставляют желать лучшего,
в частности, приведённый скрипт не транслирует полностью имена
содержащие & и эти файлы не переименовываются как надо, их не так
много полтора 2 десятка (части этих имён до знака & выводятся при
переименовании, так что найти их не составит труда), но все же.
И как вы, наверно, заметили, в нём не производится проверка на предмет
существования такого каталога поэтому каталоги вроде Pdf и PDF
будут перемещены _внутрь_ каталога pdf, даже если это не совсем
то чего бы мы хотели.

Всё это явно говорит о том что переименование явно лучше
перепоручить ещё одному скрипту. Один из вариантов скрипта
приведён ниже. Им мы заменяем ту часть в main.sh которая
запускается как интерпретатор (sh -c ...):

lcname.pl [ Скрипт для правильного приведения имён файлов к нижнему регистру
] -- begin
#!/usr/local/bin/perl -w

if (@ARGV < 1)
{
print<<"INFO";
Script to l(ower)c(ase) filename
usage: $0 ...
INFO
exit 1
}
foreach (@ARGV)
{
my ($path, $newname) = m/(.+\/)(.*)/;
if ($newname =~ tr/A-Z/a-z/)
{
# print "- $_\n";
if (-f $_) {
rename ($_, ${path} . ${newname}) ;
}
elsif (-d $_)
{
if (-d "${path}${newname}")
{
`cp -R $_/* ${path}${newname} && rm -r $_` ;
}
else
{
rename $_, $path . $newname;
}

}
}
}
lcname.pl [ Скрипт для правильного приведения имён файлов к нижнему регистру
] -- end

На этом пока что всё...

[1] Возможно я изложу свои идеи насчёт изменения стилей в
проекте Lindocs, но на данный момент это выходит за рамки
статьи.

Author: Stan S. Krupoderov
mailto:pashelper[aT]mail.ru
04/11/28

Все предложения и замечания по поводу скрипта-"чистильщика",
а также любые другие отзывы и предложения, вы можете высказать
мне в почтовый ящик, либо в рассылку KirovLug-a, либо на
сайте kirov.lug.ru, когда там будет опубликован окончательный
вариант статьи.

Ну и как всегда: There is more then one way to do it.
Если вы знаете как сделать что-то лучше, не делая при этом
сложнее я тоже буду только рад узнать что-то новое.

--
Станислав С. Круподёров mailto:pashelp***@m*****.ru

-*Информационный канал Subscribe.Ru
Подписан адрес:
Код этой рассылки: comp.soft.linux.kirovlug
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.kirovlug--unsub@subscribe.ru?subject=comp.soft.linux.kirovlug

http://subscribe.ru/ http://subscribe.ru/feedback

   2004-12-01 21:10:50 (#273253)

Re: Гонка дистрибутив ов

zakhary пишет:

>Альт Линукс явился!
>
>Возрадуйтесь, братие!
>
>В миру благодать и в человецах благоволение.
>
>Щас буду ставить.
>
>
>
Приятное известие!
А когда начнётся раздача, а то у меня уже болванки скоро испортятся? :-)

-*Информационный канал Subscribe.Ru
Подписан адрес:
Код этой рассылки: comp.soft.linux.kirovlug
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.kirovlug--unsub@subscribe.ru?subject=comp.soft.linux.kirovlug

http://subscribe.ru/ http://subscribe.ru/feedback

   Loginov Vladimir 2004-12-01 19:24:31 (#273196)

Fedore Core 3

На этой неделе появиться FedoreCore3 у меня :-)
Кто-нидь уже ставил? Впечатления?
http://stanton-finley.net/fedora_core_3_installation_notes.html - а если вкратце
кто-нибудь может сказать что там важно?
просто анг. яз на среднем уровне :-)

-*Информационный канал Subscribe.Ru
Подписан адрес:
Код этой рассылки: comp.soft.linux.kirovlug
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.kirovlug--unsub@subscribe.ru?subject=comp.soft.linux.kirovlug

http://subscribe.ru/ http://subscribe.ru/feedback

   "wildM" 2004-12-01 11:29:18 (#272982)