Обсуждение:GentooBookRU

Материал из Gentoo Linux Wiki

Перейти к: навигация, поиск

Цель - составить содержание и скрипт MakeGentooBookRU.sh такие чтобы можна было автоматически создавать отформатированую книгу "Сборник статей о Gentoo Linux" в html формате.


Содержание

[править] MakeGentooBookRU.sh

#!/bin/bash
# 20071215 MakeGentooBookRU.sh hse@ukr.net
# Distributed under the terms of the GNU General Public License v3 or later

# Depends on:
# converter -   wiki2html       http://tools.wikimedia.de/~merphant/wiki2html/
# converter -   odt2html        http://holloway.co.nz/docvert/

# Edit to suite yours configuration:
# Location of documentations:
gentoodoc=~/GentooBookRU
# url:
link='http://ru.gentoo-wiki.com'
# page:
page='/index.php'
# Documentation name:
name='GentooBookRU'
# Download format
if [ -z $1 ]
  then
#	download='wiki'
	download='html'
  else
	download="$1"
fi
if [[ "$download" == 'wiki' ]]
  then
	ext=''; sufix='&action=raw'
elif [[ "$download" == 'html' ]]
  then
	ext='.html'; sufix='&printable=yes'
else
	echo "Usage:
MakeGentooBookRU.sh wiki
MakeGentooBookRU.sh html
"
	exit 1
fi


echo -n "Create list of documentations and $gentoodoc/index ... "
# Create if needed output dir:
mkdir -p $gentoodoc
wget -q -c -N -O $gentoodoc/index "${link}${page}?title=${name}&action=raw"
echo "index" > $gentoodoc/doclist
echo '  OK!'

((i=1)); s=`awk "{if (NR==$i) print}" $gentoodoc/index`
while [ -n "$s" ]
  do
	s6="`echo $s |cut -c -6`"
	s5="`echo $s |cut -c -5`"
        # Download wiki formated documentations from ru.gentoo-wiki.com to local file:
        if [[ "`echo $s |cut -c -2`" == '[[' ]]
          then
                pagename="`echo $s |cut -c 3- |awk -F'|' '{print$1}'`"
                filename=`echo $pagename |sed "s/$name\///"`
                echo -n "Download to: $gentoodoc/$filename$ext ..."
                wget -q -c -N -O $gentoodoc/$filename$ext "${link}${page}?title=$pagename$sufix"
                echo "$filename$ext" >> $gentoodoc/doclist
                echo '  OK!'
        elif [[ "$s6" == '<h1>[[' || "$s6" == '<h2>[[' || "$s6" == '<h3>[[' || "$s6" == '<h4>[[' ]]
          then
                pagename="`echo $s |cut -c 7- |awk -F'|' '{print$1}'`"
                filename=`echo $pagename |sed "s/$name\///"`
                echo -n "Download to: $gentoodoc/$filename$ext ..."
                wget -q -c -N -O $gentoodoc/$filename$ext "${link}${page}?title=$pagename$sufix"
                echo "$filename$ext" >> $gentoodoc/doclist
                echo '  OK!'
        # Download html formated documentations from other site to local file:
        elif [[ "`echo $s |cut -c -1`" == '[' ]]
          then
                url="`echo $s |cut -c 2- |awk '{print $1}'`"
                pagename=`echo $s |cut -c 2- |awk -F']' '{print $1}' |awk -F"$url " '{print $2}'`
                ((j=10))
                while [ -z "$pagename" ];
                  do
                        u="`echo $url |cut -c $j-`"; ((j=$j+10))
                        pagename=`echo $s |cut -c 2- |awk -F']' '{print $1}' |awk -F"$u " '{print $2}'`
                  done
                echo -n "Download to: $gentoodoc/$pagename.html ..."
                wget -q -c -N -O "$gentoodoc/$pagename.html" "$url"
                echo '  OK!'
        elif [[ "$s5" == '<h1>[' || "$s5" == '<h2>[' || "$s5" == '<h3>[' || "$s5" == '<h4>[' ]]
          then
                url="`echo $s |cut -c 6- |awk '{print $1}'`"
                pagename=`echo $s |cut -c 6- |awk -F']' '{print $1}' |awk -F"$url " '{print $2}'`
                ((j=10))
                while [ -z "$pagename" ];
                  do
                        u="`echo $url |cut -c $j-`"; ((j=$j+10))
                        pagename=`echo $s |cut -c 2- |awk -F']' '{print $1}' |awk -F"$u " '{print $2}'`
                  done
                echo -n "Download to: $gentoodoc/$pagename.html ..."
                wget -q -c -N -O "$gentoodoc/$pagename.html" "$url"
                echo '  OK!'
        fi
        ((i=$i+1)); s=`awk "{if (NR==$i) print}" $gentoodoc/index`
  done

# Download immages for documentations to local file:
for i in `cat $gentoodoc/doclist`
  do
        cat $gentoodoc/$i |grep '\[\[Image:' |awk -F'Image:' '{print $2 }' |awk '{print $1 }' |awk -F']]' '{print $1 }' >> $gentoodoc/imglist
  done
page='/Изображение:'
for i in `cat $gentoodoc/imglist`
  do
        echo -n "Download to: $gentoodoc/$i ..."
        wget -q -c -N -O $gentoodoc/$i "${link}${page}$i"
        page1=`cat $gentoodoc/$i | grep '<a href="/images/' |awk '{if (NR==1) print}' |awk -F'<a href="' '{print $2}' |awk -F'"' '{print $1}'`
        rm $gentoodoc/$i
        wget -q -c -N -O $gentoodoc/$i "${link}${page1}"
        echo '      OK!'
  done


sed 's/|/.html|/' $gentoodoc/index > $gentoodoc/index.tmp && mv $gentoodoc/index.tmp $gentoodoc/index
sed "s/\[\[$name\//\[\[/" $gentoodoc/index > $gentoodoc/index.tmp && mv $gentoodoc/index.tmp $gentoodoc/index

# Converting to UTF-8
iconv -f KOI8-R -t UTF-8 -o "$gentoodoc/Создание файловых систем.tmp" "$gentoodoc/Создание файловых систем.html" && mv "$gentoodoc/Создание файловых систем.tmp" "$gentoodoc/Создание файловых систем.html"
iconv -f CP1251 -t UTF-8 -o "$gentoodoc/Linux и файловые системы: еще раз о проблеме выбора.tmp" "$gentoodoc/Linux и файловые системы: еще раз о проблеме выбора.html" && mv "$gentoodoc/Linux и файловые системы: еще раз о проблеме выбора.tmp" "$gentoodoc/Linux и файловые системы: еще раз о проблеме выбора.html"
iconv -f CP1251 -t UTF-8 -o "$gentoodoc/Советы пользователям Gentoo.tmp" "$gentoodoc/Советы пользователям Gentoo.html" && mv "$gentoodoc/Советы пользователям Gentoo.tmp" "$gentoodoc/Советы пользователям Gentoo.html"
iconv -f CP1251 -t UTF-8 -o "$gentoodoc/Тонкая настройка IDE дисков с помощью hdparm.tmp" "$gentoodoc/Тонкая настройка IDE дисков с помощью hdparm.html" && mv "$gentoodoc/Тонкая настройка IDE дисков с помощью hdparm.tmp" "$gentoodoc/Тонкая настройка IDE дисков с помощью hdparm.html"

# Converting odt to html
cp "$gentoodoc/Linux не для идиотов: сборник рассказов и рецептов.html" "$gentoodoc/Linux_не_для_идиотов.odt"
odt2html "$gentoodoc/Linux_не_для_идиотов.odt" > "$gentoodoc/Linux не для идиотов: сборник рассказов и рецептов.html"

# Converting wiki2html
echo -n "Converting wiki to html  ... "
for i in `cat $gentoodoc/doclist`
  do
    if [[ "${i##*.}" == 'html' ]]
      then
	sed -s 's/>\[</></' "$gentoodoc/$i" > "$gentoodoc/tmp"
	sed -s 's/>править<\/a>\]/><\/a>/' "$gentoodoc/tmp" > "$gentoodoc/$i"
	sed -s 's/<div id="jump-to-nav">Перейти к: <a href="#column-one">навигация<\/a>, <a href="#searchInput">поиск<\/a><\/div>//' "$gentoodoc/$i" > "$gentoodoc/tmp"
	echo '</body></html>' >> "$gentoodoc/tmp" 	# to prevent error
	rm -f "$gentoodoc/$i"
	((j=1)); s=`awk "{if (NR==$j) print}" $gentoodoc/tmp`
	while [[ "`echo $s |cut -c -35`" != '<!-- Saved in parser cache with key' && "`echo $s |cut -c -14`" != '</body></html>' ]]
	  do
	    echo $s >> "$gentoodoc/$i"
	    ((j=$j+1)); s=`awk "{if (NR==$j) print}" $gentoodoc/tmp`
	  done
	echo '</body></html>' >> "$gentoodoc/$i"

    else
    wiki2html -b . -i . -t $name -o $gentoodoc/$i.html $gentoodoc/$i
    sed 's/<title>GentooBookRU<\/title>/<meta http-equiv=Content-Type content="text\/html; charset=UTF-8">\n<title>GentooBookRU<\/title>/' $gentoodoc/$i.html > $gentoodoc/$i.tmp && mv $gentoodoc/$i.tmp $gentoodoc/$i.html
    sed 's/<link rel="stylesheet" type="text\/css" href="http:\/\/localhost\/wiki.css">/ /' $gentoodoc/$i.html > $gentoodoc/$i.tmp && mv $gentoodoc/$i.tmp $gentoodoc/$i.html
    sed 's/=".\//="/' $gentoodoc/$i.html > $gentoodoc/$i.tmp && mv $gentoodoc/$i.tmp $gentoodoc/$i.html
    sed 's/<body>/<body>\n<a name="top" id="top"><\/a>/' $gentoodoc/$i.html > $gentoodoc/$i.tmp && mv $gentoodoc/$i.tmp $gentoodoc/$i.html
    sed 's/<\/body>/\n<br><br><a href="#top">наверх<\/a><br>\n<\/body>/' $gentoodoc/$i.html > $gentoodoc/$i.tmp && mv $gentoodoc/$i.tmp $gentoodoc/$i.html
    rm $gentoodoc/$i
    fi
  done
rm -f "$gentoodoc/tmp"
echo "  OK!"


echo -n "Create indexes ... "
rm -f $gentoodoc/index
((i=1)); s=`awk "{if (NR==$i) print}" $gentoodoc/index.html`
while [ -n "$s" ]
  do
    if [[ "`echo $s |cut -c -32`" == '<a class="extlink" href="http://' ]]
      then
        pagename="`echo $s |awk -F'>' '{print $2}' |awk -F'<' '{print $1}'`"
        echo '<a class="internal" href="'$pagename.html'">'"$pagename</a>`echo $s |awk -F'</a>' '{print $2}'`" >> $gentoodoc/index
    elif [[ "`echo $s |cut -c -36`" == '<h1><a class="extlink" href="http://' ]]
      then
        pagename="`echo $s |awk -F'>' '{print $3}' |awk -F'<' '{print $1}'`"
        echo '<h1><a class="internal" href="'$pagename.html'">'"$pagename</a>`echo $s |awk -F'</a>' '{print $2}'`" >> $gentoodoc/index
    elif [[ "`echo $s |cut -c -36`" == '<h2><a class="extlink" href="http://' ]]
      then
        pagename="`echo $s |awk -F'>' '{print $3}' |awk -F'<' '{print $1}'`"
        echo '<h2><a class="internal" href="'$pagename.html'">'"$pagename</a>`echo $s |awk -F'</a>' '{print $2}'`" >> $gentoodoc/index
    elif [[ "`echo $s |cut -c -36`" == '<h3><a class="extlink" href="http://' ]]
      then
        pagename="`echo $s |awk -F'>' '{print $3}' |awk -F'<' '{print $1}'`"
        echo '<h3><a class="internal" href="'$pagename.html'">'"$pagename</a>`echo $s |awk -F'</a>' '{print $2}'`" >> $gentoodoc/index
    elif [[ "`echo $s |cut -c -36`" == '<h4><a class="extlink" href="http://' ]]
      then
        pagename="`echo $s |awk -F'>' '{print $3}' |awk -F'<' '{print $1}'`"
        echo '<h4><a class="internal" href="'$pagename.html'">'"$pagename</a>`echo $s |awk -F'</a>' '{print $2}'`" >> $gentoodoc/index
      else
        echo "$s" >> $gentoodoc/index
    fi
    ((i=$i+1)); s=`awk "{if (NR==$i) print}" $gentoodoc/index.html`
  done
mv $gentoodoc/index $gentoodoc/index.html && sed 's/index/index.html/' $gentoodoc/doclist > $gentoodoc/doclist.tmp && mv $gentoodoc/doclist.tmp $gentoodoc/doclist

cd $gentoodoc/
ls A.* B.* C.* D.* > $gentoodoc/doclist
declare -a symbolnum; symbolnum=(A B C D)
echo 'Настольная книга Gentoo Linux x86.html' >> $gentoodoc/doclist
echo 'Настольная книга по безопасности Gentoo.html' >> $gentoodoc/doclist
((i=1)); f=`awk "{if (NR==$i) print}" $gentoodoc/doclist`
while [ -n "$f" ]
  do
    rm -f "$gentoodoc/$f.tmp"
    ((j=1)); s=`awk "{if (NR==$j) print}" "$gentoodoc/$f"`; ((symboln=0))
    while [ -n "$s" ]
      do
        if [[ "`echo $s |cut -c -18`" == '<b><a href="?part=' ]]
          then
            pagename="`echo $s |awk -F'>' '{print $3}' |awk -F'<' '{print $1}'`"
#            num="`echo $s |awk -F'&chap=' '{print $2}' |awk -F'\">' '{print $1}' |awk -F'&amp' '{print $1}' `"
            num="`echo $s |awk -F'chap=' '{print $2}' |awk -F'\">' '{print $1}' |awk -F'&amp' '{print $1}' `"
            [ -z "$num" ] && num="${symbolnum[$symboln]}" && ((symboln=$symboln+1))
            echo '<a class="internal" href="'$num. $pagename.html'">'"$pagename</a>`echo $s |awk -F'</a>' '{print $2}'`" >> "$gentoodoc/$f.tmp"
          else
            echo "$s" >> "$gentoodoc/$f.tmp"
        fi
        ((j=$j+1)); s=`awk "{if (NR==$j) print}" "$gentoodoc/$f"`
      done
    mv "$gentoodoc/$f.tmp" "$gentoodoc/$f"
    ((i=$i+1)); f=`awk "{if (NR==$i) print}" $gentoodoc/doclist`
  done

sed -s 's/пользователей\/групп/пользователей и групп/' "A. Безопасность системы.html" > "A. Безопасность системы.html.tmp" && mv "A. Безопасность системы.html.tmp" "A. Безопасность системы.html"
sed -s 's/пользователей\/групп/пользователей и групп/' "Настольная книга по безопасности Gentoo.html" > "Настольная книга по безопасности Gentoo.html.tmp" && mv "Настольная книга по безопасности Gentoo.html.tmp" "Настольная книга по безопасности Gentoo.html"
echo "  OK!"
rm $gentoodoc/doclist
rm $gentoodoc/imglist

exit 0


[править] Bugs

1. Мой konqueror не открывает http://ru.wikipedia.org/wiki/UNIX это страница такая навороченая или какаято зараза к ней ципляется?

2. Содержание может иметь пустые строки только в конце!

3. Плохо написан и долго работает, надо бы бампануть код...

Других багов пока не замечено.

[править] To do

1. Протестировать скрипт и подправить где надо чтобы лучше формировались страницы, проверить ссылки, добавить опцию дающюю возможность создавать всю книгу в одном html файле.

2. Думаю целесообразно завести второй том книги куда скидывать ссылки на прикладное програмное обеспечение.

3. Нарисовать красивую обложку :)

[править] <br>

Скриптик которым добавлял <br> в конец строки.

#!/bin/bash

echo '' > 2
((i=1))
s=`awk "{if (NR==$i) print}" 1`
while [ -n "$s" ];
  do
	echo "${s}"'<br>' >> 2
	((i=$i+1))
	s=`awk "{if (NR==$i) print}" 1`
  done 
mv -f 2 1
exit 0

Табличька делается простой заменой.

Личные инструменты