[О блоге] [наверх] [пред] [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'}\">[&lt;&lt;&lt;]</a>";
            };
            if(defined $rels{"up"}){
                print "<a href=\"$rels{'up'}\">[^^^]</a>";
            };
            if(defined $rels{"next"}){
                print "<a href=\"$rels{'next'}\">[&gt;&gt;&gt;]</a>";
            };
            $header++;
        };
        if($header && /^<.div>$/){
            print "</p></center>$_";
            $header--;
        };
        next if $header;
        print;
    };

    [оставить комментарий]