Обробка тексту та графіки.

build
Конспект за результатами переходу від старого до нового сайту. Пакетна і одинична обробка текстових та графічних документів. Слідами виконаних робіт згрібаю все в купу.

Взяти вказаний html-файл, прибити там всі html-теги і зберегти результат у текстовому файлі:

sed -e :a -e 's/<[^>]*>//g;/</N;//ba' file.html > file.txt

Додати в кінці кожного рядка вказаного файлу <br>. Після дня з бубном довелося використати vi у неекранному режимі(ex-mode command) бо ні sed, ні awk, хоч ти трісни, вставляли на початок рядка, причому із заміною. Хоча у іншому проекті пару років тому варіант sed ‘s/$/ла-ла-ла/’ прекрасно справлявся з задачею дописувати текст в кінець рядка і саме такий варіант всюди описаний в інтернетах.

ex +"%s/$/&lt;br&gt;/g" -cwq data_file_1.txt

Вирізати в кожному рядку файлу даних 3,4,5 символ та перезаписати дані в інший файл, потім витерти всі символи після 35го та записати результат у 3й файл:

cat data_file_1.txt | cut --complement -b '3-5' &gt; data_file_2.txt
cat data_file_2.txt | cut --complement -b 35- &gt; data_file_3.txt

Видалити всі пробіли в кінці рядків:

sed -i 's/ *$//' data_file_4.txt

В деяких випадках коли треба потерти щось з кінця рядків неоднакової довжини варіант cut –complement -b не підходить і використовується варіант з оберненням напрямку рядка, видаленням і оберненням назад. На прикладі видалення 9 останніх символів кожного рядка:

rev data_file_5.txt  | cut -c 9- | rev

Так був вибраний і перебраний корисний контент із сайту бородатих років та підготовлений до використання деякий абсолютно новий. Побічним завданням сумнівної необхідності було перегнати купу графіки під варіант однакової ширини зі збереженням пропорцій. У даному випадку ширина 256px:

for i in *.webp; do convert -verbose -quality 80 -resize 256x $i $i; done
for i in *.webp; do convert -verbose -quality 80 -resize 256x $i $i; done
for i in *.jpeg; do convert -verbose -quality 80 -resize 256x $i $i; done
for i in *.gif; do convert -verbose -quality 80 -resize 256x $i $i; done

І ще більш сумнівної необхідності операція конвертації svg у.webp. Для цього ще треба доставити одну бібліотеку:

sudo apt-get install librsvg2-bin

в результаті можемо піддивитися rsvg-convert –help. Використовуємо так:

for i in *.svg; do rsvg-convert $i -a -w 256 -o `echo $i | sed -e 's/svg$.webp/'`; done

Є не зовсім зрозумілий нюанс, якщо в директорії уже є.webp-файли вони чомусь також оброблювалися і ламалися. Якщо встановлений Inkscape то можна так:

for i in *; do inkscape $i --export.webp=`echo $i | sed -e 's/svg$.webp/'`; done

або якщо треба переконвертити також у піддиректоріях то виориствуємо так:

find . -iname \*.webp -exec convert -verbose -quality 80 -resize 256x "{}" "{}" \;

Ну і в кінці допилюємо до пристойного вигляду сам html-код:

tidy -i -m -w 260 -ashtml -utf8 index.html

Тут ще один момент - система може містити tidy без підтримки html5, як моя ubuntu 12.04. Треба прибити встановлену і зібрати новий варіант з github:

sudo apt-get remove libtidy-0.99-0 tidy
sudo apt-get install git-core automake libtool
git clone https://github.com/w3c/tidy-html5cd tidy-html5/build/cmake&nbsp;
cmake ../.. -DCMAKE_BUILD_TYPE=Release
sudo make install

далі ще ніби треба вставити у файл /etc/ld.so.conf рядок /usr/local/lib і виконати

sudo ldconfig

але я здається цього не робив і все працює нормально, а інструкція хоч і писалася для ubuntu 10.04/12.04 але після

git clone

вже була не правильна, там далі вже мої правки. А в результаті ще й довелося у всіх файлах перевести всі назви картинок до того ж вигляду що і назви файлів(в даному випадку в нижній регістр), вінді й апачу це до лампочки, але якщо вести роботу в лінуксі то не відображається графіка при неспівпадінні регістру.

for i in *.html; do sed -i '/src=\"logo/ s/[[:upper:]]/\L&amp;/g' $i $i; done

Механізм наступний - sed шукає рядки в яких є входження logo/ і переводить весь рядок у нижній регістр, все знаходиться у циклі який проганяє всі html-файли в директорії. Якщо необхідно перевести все у верхній регістр то

for i in *.html; do sed -i '/src=\"logo/ s/[[:lower:]]/\U&amp;/g' $i $i; done