[О блоге]
[наверх]
[пред]
[2016-10-19 23:28:50+03:00]
[4e492610fc7d071f7554e37d250495c14d4c4f55]
Темы: [doc][perl]
Texinfo и правка его HTML-выхлопа для русского языка
Texinfo мне ОЧЕНЬ нравится как формат. Я местами "задрот" в плане
документации и за годы перепробовал всякое и Texinfo мне пока однозначно
больше всего остального нравится.
Но кроме его HTML представления. Точнее HTML результата для
не-английского языка. Проблема в том что он создаёт навигационные панели
на каждой странице, которые содержат названия нод. Эти же названия нод в
виде кириллицы преобразуются в названия файлов. И тут вот проблема: либо
мы имеем английские названия файлов (contacts, links, overview) и имеем
английский язык в меню навигации, либо мы имеем русский язык в меню
навигации и транслитерируемые файлы (kontakty, ssylki, obzor). Можно
сделать @anchor{}-ы и у нас появятся английские файлы ссылающиеся на
русскоязычные ноды. Но штатно "перемещаясь" по сайту нельзя просто так
взять текущий URL и иметь в нём Links.html, только если заранее знать
что там есть Links файл.
Ничего лучше не придумал как просто пост-обработать весь HTML результат.
Само преобразование из Texinfo в HTML производится Perl скриптом... на
почти 8000 тысяч строк кода. Это перебор и я не смог в нём как-то
разобраться чтобы понять что надо подправить чтобы он в навигацию вместо
названия нод подставлял названия секций.
Сам скрипт получился очень простым и вроде как отлично делающим то что
надо. Сайты http://www.cypherpunks.ru и http://cryptoparty.ru уже
пост-обрабатываются им.
#!/usr/bin/env perl
use strict;
use warnings;
my %rels;
my $header = 0;
my $printed = 0;
while(<STDIN>){
($rels{$2} = $1) if /^<link href="([^#]*)[^"]*" rel="([^"]*)" title/;
if(/^<div class="header">$/){
print "$_<center><p>";
if(defined $rels{"prev"}){
print "<a href=\"$rels{'prev'}\">[<<<]</a>";
};
if(defined $rels{"up"}){
print "<a href=\"$rels{'up'}\">[^^^]</a>";
};
if(defined $rels{"next"}){
print "<a href=\"$rels{'next'}\">[>>>]</a>";
};
$header++;
};
if($header && /^<.div>$/){
print "</p></center>$_";
$header--;
};
next if $header;
print;
};
[оставить комментарий]