openSUSE:Перевод документации/Скрипты
Содержание
Сборка документации
html
Здесь находятся стабильные версии скриптов для автоматического обновления из svn репозитория и сборки документации openSUSE.
Последние версии скриптов и дополнительную информацию можно найти тут
Скрипт make_susedochtml.sh
- обновляет данные из svn репозитория
- если данные обновились, производит html сборку документации
- если сборка завершилась успешно, копирует файлы в директорию web сервера
#! /bin/bash
PIDFILE=~/.make_susedochtml.pid
dSource=~/121_trans
dTarget=/srv/www/htdocs/xboct.org/doc/121_trans
if [ -e $PIDFILE ]
then
PID=$(cat $PIDFILE)
date -u "+%F %T Процесс сборки HTML уже запущен. $PID" >&2
exit 4
fi
echo $$ >$PIDFILE
cd $dSource
date -u "+%F %T Проверяем, есть ли обновления в репозитории"
SVNret=$(svn up | tail -n 1)
if [[ $SVNret =~ ^Updated\ to\ revision\ [0-9]*\.$ ]]
then
date -u "+%F %T Репозиторий обновлен ($SVNret), приступаем к сборке."
daps -e ENV-opensuse-html html || {
date -u "+%F %T Сбой при выполнении make html. $?" >&2
rm $PIDFILE
exit 1
}
date -u "+%F %T Сборка HTML версии выполнена, копируем в каталог веб сервера"
if [ -d $dTarget ]
then
( rsync -au --delete-after --exclude=images $dSource/build/opensuse-html/html/opensuse-html/* $dTarget &&
rsync -au --delete-after --copy-links $dSource/build/opensuse-html/html/opensuse-html/images $dTarget ) || {
date -u "+%F %T Сбой при копировании файлов в каталог '$dTarget'. $?" >&2
rm $PIDFILE
exit 3
}
date -u "+%F %T Сборка новой версии завершена успешно ($SVNret)." >&2
date -u "+%F %T ======================================================"
else
date -u "+%F %T Целевой каталог '$dTarget' недоступен." >&2
rm $PIDFILE
exit 2
fi
else
date -u "+%F %T Обновлений нет ($SVNret)."
fi
rm $PIDFILE
exit 0
в разработке
Построение дерева вложений
#! /bin/bash
dXML=~/temp/susedocs/114_trans/xml
fMain=MAIN.opensuse.xml
sTab=". "
if [ -n "$1" ]
then
fMain=$1
fi
function maketree {
list=$(perl -0777 -p -e "s/<!--.*?-->//gs; s/<(\w+)(?=[^>]*os=)(?![^>]*osuse)[^>\/]*>.*?<\/\1>//gsi; s/.*?(<xi:include(?(?=[^>]*os=)[^>]*(?=osuse)[^>]*|[^>]*)>)|.*/\1\n/gs; s/.*?href=\"([^\"]*)[^<]*/\1 /gs" $dXML/$1)
#echo "list: $list"
for item in $list; do
echo "$2$item"
maketree $item "$sTab$2"
done
}
echo $fMain
maketree $fMain "$sTab"
exit 0
Статистика
Скрипты для подсчета количества переведенных слов производят следующие действия
Очищают данные находящиеся в xml файлах от:
- Комментариев (s/<!--.*?-->//gs;)
- Содержимого тегов screen, remark, keycap (s/<screen>.*?<\/screen>//gsi; s/<remark>.*?<\/remark>//gsi; s/<keycap>.*?<\/keycap>//gsi;)
- От содержимого тегов, которые не относятся к osuse (s/<(\w+)(?=[^>]*os=)(?![^>]*osuse)[^>\/]*>.*?<\/\1>//gsi;)
- От таблиц, превращая их в параграфы не содержащие тегов(while (s/<table[^>]*>(.*?)<\/table>//si) {print $1=~ m/(?<=>)[^<]*(?=<)/gsi; print "</para>";})
- От переносов строк, перенос строки ставится в конце абзаца (s/\n//gsi; s/<\/para>/\n/;)
- Самих тегов (s/<.*?>//gs;)
- От переменных(s/[&%][a-z]*?;//gi;)
- От надписи "Have a lot of fun" (s/Have a lot of fun//gi;)
- От любых символов кроме букв и пробелов (s/[^ a-zA-Zа-яА-Я]*//g;)
- От пробелов в начале строки (s/^ *//g;)
- От пустых строк (/^ *$/d;)
Дальше подсчитывают количество всех слов, и количество слов в строках, где встречаются русские буквы.
в виде списка
#! /bin/bash
dXML=~/temp/susedocs/121_trans/xml
tmpfile=/tmp/statsusedoc.$$
if [ -n "$1" ]; then
dXML=$(echo "$1" | sed "s/\/$//")
fi
cd $dXML
for file in *.xml
do
#tmpfile=$file.tmp~
perl -0777 -p -e 's/<!--.*?-->//gs; s/<screen>.*?<\/screen>//gsi; s/<remark>.*?<\/remark>//gsi; s/<keycap>.*?<\/keycap>//gsi; s/<(\w+)(?=[^>]*os=)(?![^>]*osuse)[^>\/]*>.*?<\/\1>//gsi; while (s/<table[^>]*>(.*?)<\/table>//si) {print $1=~ m/(?<=>)[^<]*(?=<)/gsi; print "</para>";}' $file | perl -0777 -p -e 's/\n/ /gsi; s/<\/para>/\n/gsi; s/<.*?>//gs; s/[&%][a-z]*?;//gi; s/Have a lot of fun//gi;' | sed 's/[^ a-zA-Zа-яА-Я]*//g; s/ */ /g;' > $tmpfile
sWall=$(cat $tmpfile | wc -w)
if [ $sWall != 0 ]
then
sWtrans=$(grep -i "[а-я]" $tmpfile | wc -w)
let "sPerc = sWtrans * 100 / sWall"
echo "$file слов $sWall переведено $sWtrans ($sPerc%)"
let "sAll = sAll + sWall"
let "sAtrans = sAtrans + sWtrans"
fi
#rm $tmpfile
done
let "sPerc = sAtrans * 100 / sAll"
echo "Итого: слов $sAll переведено $sAtrans ($sPerc%)"
rm $tmpfile
exit 0
в виде дерева
#! /bin/bash
dXML=~/temp/susedocs/121_trans/xml
fMain=MAIN.opensuse.xml
sTab=". "
cd $dXML
for file in *.xml
do
tmpfile=$file.tmp~
perl -0777 -p -e 's/<!--.*?-->//gs; s/<screen>.*?<\/screen>//gsi; s/<remark>.*?<\/remark>//gsi; s/<keycap>.*?<\/keycap>//gsi; s/<(\w+)(?=[^>]*os=)(?![^>]*osuse)[^>\/]*>.*?<\/\1>//gsi; while (s/<table[^>]*>(.*?)<\/table>//si) {print $1=~ m/(?<=>)[^<]*(?=<)/gsi; print "</para>";}' $file | perl -0777 -p -e 's/\n/ /gsi; s/<\/para>/\n/gsi; s/<.*?>//gs; s/[&%][a-z]*?;//gi; s/Have a lot of fun//gi;' | sed 's/[^ a-zA-Zа-яА-Я]*//g; s/ */ /g;' > $tmpfile
done
function maketree {
sAll="0"
sAtrans="0"
sWall="0"
sWtrans="0"
val=""
if [ -z "$1" ]
then
list=`echo $fMain`
# $2=$sTab
else
list=$(perl -0777 -p -e "s/<!--.*?-->//gs; s/<(\w+)(?=[^>]*os=)(?![^>]*osuse)[^>\/]*>.*?<\/\1>//gsi; s/.*?(<xi:include(?(?=[^>]*os=)[^>]*(?=osuse)[^>]*|[^>]*)>)|.*/\1\n/gs; s/.*?href=\"([^\"]*)[^<]*/\1 /gs" $1)
#echo "list: $list"
fi
for item in $list; do
retval=`maketree $item "$sTab$2"`
if [ -s $item.tmp~ ]
then
sWall=$(cat $item.tmp~ | wc -w)
#if [ $sWall != 0 ]
#then
sWtrans=$(grep -i "[а-я]" $item.tmp~ | wc -w)
rm $item.tmp~
let "sPerc = sWtrans * 100 / sWall"
if [ -z "$val" ]; then
val="$2$item $sWtrans из $sWall ($sPerc%)"
else
val="$val
$2$item $sWtrans из $sWall ($sPerc%)"
fi
let "sAll = sAll + sWall"
let "sAtrans = sAtrans + sWtrans"
else
if [ -z "$val" ]; then
val="$2$item ( ^ )"
else
val="$val
$2$item ( ^ )"
fi
fi
if [ -n "$retval" ]; then
ret=`echo "$retval" | tail -n 1`
sInclAll=`echo "$ret" | awk '{print $1}'`
sInclTrans=`echo "$ret" | awk '{print $2}'`
if [ "$sInclAll" != "0" ]; then
let "sInclPerc = sInclTrans * 100 / sInclAll"
val="$val + $sInclTrans из $sInclAll ($sInclPerc%)"
let "sAll = sAll + sInclAll"
let "sAtrans = sAtrans + sInclTrans"
let "sSumAll = sWall + sInclAll"
let "sSumTrans = sWtrans + sInclTrans"
let "sSumPerc = sSumTrans * 100 / sSumAll"
val="$val = $sSumTrans из $sSumAll ( $sSumPerc% )";
fi
val=`echo "$val"; echo "$retval" | sed '$d'`
fi
done
if [ -n "$val" ]
then
echo "$val
$sAll $sAtrans"
fi
}
#echo $fMain
#maketree $fMain "$sTab"
wow=`maketree`
echo "$wow" | sed '$d'
exit 0
в виде дерева с wiki разметкой
#! /bin/bash
dXML=~/temp/susedocs/121_trans/xml
fMain=MAIN.opensuse.xml
sTab="*"
br="
"
cd $dXML
for file in *.xml
do
tmpfile=$file.tmp~
perl -0777 -p -e 's/<!--.*?-->//gs; s/<screen>.*?<\/screen>//gsi; s/<remark>.*?<\/remark>//gsi; s/<keycap>.*?<\/keycap>//gsi; s/<(\w+)(?=[^>]*os=)(?![^>]*osuse)[^>\/]*>.*?<\/\1>//gsi; while (s/<table[^>]*>(.*?)<\/table>//si) {print $1=~ m/(?<=>)[^<]*(?=<)/gsi; print "</para>";}' $file | perl -0777 -p -e 's/\n/ /gsi; s/<\/para>/\n/gsi; s/<.*?>//gs; s/[&%][a-z]*?;//gi; s/Have a lot of fun//gi;' | sed 's/[^ a-zA-Zа-яА-Я]*//g; s/ */ /g;' > $tmpfile
done
function maketree {
sAll="0"
sAtrans="0"
sWall="0"
sWtrans="0"
val=""
if [ -z "$1" ]
then
list=`echo $fMain`
# $2=$sTab
else
list=$(perl -0777 -p -e "s/<!--.*?-->//gs; s/<(\w+)(?=[^>]*os=)(?![^>]*osuse)[^>\/]*>.*?<\/\1>//gsi; s/.*?(<xi:include(?(?=[^>]*os=)[^>]*(?=osuse)[^>]*|[^>]*)>)|.*/\1\n/gs; s/.*?href=\"([^\"]*)[^<]*/\1 /gs" $1)
#echo "list: $list"
fi
for item in $list; do
retval=`maketree $item "$sTab$2"`
if [ -s $item.tmp~ ]
then
sWall=$(cat $item.tmp~ | wc -w)
#if [ $sWall != 0 ]
#then
sWtrans=$(grep -i "[а-я]" $item.tmp~ | wc -w)
rm $item.tmp~
let "sPerc = sWtrans * 100 / sWall"
if [ -n "$val" ]; then
val="$val$br"
fi
if [ "$2" == "*" ]; then
val="$val
==$item==
"
fi
val="$val$2{{Docprogress|file=$item|fileTrans=$sWtrans|fileAll=$sWall|filePerc=$sPerc%"
let "sAll = sAll + sWall"
let "sAtrans = sAtrans + sWtrans"
else
if [ -n "$val" ]; then
val="$val$br"
fi
val="$val$2{{Docprogress|file=$item"
fi
if [ -n "$retval" ]; then
ret=`echo "$retval" | tail -n 1`
sInclAll=`echo "$ret" | awk '{print $1}'`
sInclTrans=`echo "$ret" | awk '{print $2}'`
if [ "$sInclAll" != "0" ]; then
let "sInclPerc = sInclTrans * 100 / sInclAll"
# val="$val + $sInclTrans из $sInclAll ($sInclPerc%)"
let "sAll = sAll + sInclAll"
let "sAtrans = sAtrans + sInclTrans"
let "sSumAll = sWall + sInclAll"
let "sSumTrans = sWtrans + sInclTrans"
let "sSumPerc = sSumTrans * 100 / sSumAll"
val="$val|inclTrans=$sSumTrans|inclAll=$sSumAll|inclPerc=$sSumPerc%"
fi
val=`echo "$val}}"; echo "$retval" | sed '$d'`
else
val="$val}}"
fi
done
if [ -n "$val" ]
then
echo "$val
$sAll $sAtrans"
fi
}
wikitree=`maketree`
echo "$wikitree" | sed '$d'
ret=`echo "$wikitree" | tail -n 1`
sInclAll=`echo "$ret" | awk '{print $1}'`
sInclTrans=`echo "$ret" | awk '{print $2}'`
echo "
[[Слов в документации::$sInclAll| ]] [[Переведено слов в документации::$sInclTrans| ]]"
exit 0
Cкорость перевода для wiki
#! /bin/bash
svnurl=http://svn.opensuse.org/svn/opensuse-doc/trunk/documents/distribution/ru
days=14
tmpdir=susedocoldxml.$$
tmpfile=/tmp/statsusedoc.$$
mkdir $tmpdir
cd /tmp
date=$(date --utc +%s)
let "date=date-86400*$days"
svndate=$(date +%F --date "1970-01-01 $date sec")
svn co -r \{$svndate\} $svnurl $tmpdir/
cd $tmpdir
for file in *.xml
do
#tmpfile=$file.tmp~
perl -0777 -p -e 's/<!--.*?-->//gs; s/<screen>.*?<\/screen>//gsi; s/<remark>.*?<\/remark>//gsi; s/<keycap>.*?<\/keycap>//gsi; s/<(\w+)(?=[^>]*os=)(?![^>]*osuse)[^>\/]*>.*?<\/\1>//gsi; while (s/<table[^>]*>(.*?)<\/table>//si) {print $1=~ m/(?<=>)[^<]*(?=<)/gsi; print "</para>";}' $file | perl -0777 -p -e 's/\n/ /gsi; s/<\/para>/\n/gsi; s/<.*?>//gs; s/[&%][a-z]*?;//gi; s/Have a lot of fun//gi;' | sed 's/[^ a-zA-Zа-яА-Я]*//g; s/ */ /g;' > $tmpfile
sWall=$(cat $tmpfile | wc -w)
if [ $sWall != 0 ]
then
sWtrans=$(grep -i "[а-я]" $tmpfile | wc -w)
let "sAll = sAll + sWall"
let "sAtrans = sAtrans + sWtrans"
fi
#rm $tmpfile
done
echo "
_______________________________________________________________
{{docspeed|переведено=$sAtrans|time=$date}}
_______________________________________________________________
"
cd ..
rm $tmpfile
rm -rf $tmpdir
exit 0