Bug 16680

Summary: Одинарная кавычка показыается как <B4>
Product: Sisyphus Reporter: Andrey Cherepanov <cas>
Component: manAssignee: Alexey Gladkov <legion>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: alexei.mezin, dottedmag, evg, imz, ldv, shrek, voins
Version: unstable   
Hardware: all   
OS: Linux   

Description Andrey Cherepanov 2008-08-13 14:03:45 MSD
В тексте man-страницы одинарная кавычка (') показывается как <B4>.

Пример: man udev
All empty lines or lines beginning with <B4>#<B4> will be ignored.
Comment 1 Slava Semushin 2008-08-13 14:06:42 MSD
У меня показывает нормально (man-1.6f-alt1, ru_RU.UTF-8):

All empty lines or lines beginning with '#' will be ignored.

Какая версия пакета man? Какая локаль?
Comment 2 Valery Inozemtsev 2008-08-13 14:14:38 MSD
man-1.6f-alt1
udev-126-alt3
ru_RU.UTF-8, хотя локаль не важна
Comment 3 Slava Semushin 2008-08-13 14:17:20 MSD
Возможно, виноват less как $PAGES? У меня less-424-alt2
Comment 4 Slava Semushin 2008-08-13 14:19:21 MSD
Зато у меня man scanf показывает <B7> вместо какого-то символа, типа точки.
Comment 5 Valery Inozemtsev 2008-08-13 14:21:39 MSD
less тот же, в нем отображается все правильно
"All empty lines, or lines beginning with ´#´ will be ignored."
Comment 6 Slava Semushin 2008-08-13 14:33:37 MSD
Попробуйте исправить в /etc/man.conf строчку

NROFF       /usr/bin/nroff -Tlatin1 -mandoc

на

NROFF       /usr/bin/nroff -Tutf8 -mandoc

Мне это помогло увидеть точку в man scanf. Возможно, поможет вам с <B4>
Comment 7 Sir Raorn 2008-08-13 14:37:40 MSD
ru_RU.KOI8-R, последний сизиф, aterm (есл и имеет значение).  Кавычки в man udev как в comment 5, точки в man scanf (после "A directive is one of the following:"?) показываются точками.
Comment 8 Sir Raorn 2008-08-13 14:38:17 MSD
man.conf не трогал.
Comment 9 Slava Semushin 2008-08-13 14:43:06 MSD
(In reply to comment #7)
> ru_RU.KOI8-R, последний сизиф, aterm (есл и имеет значение).  Кавычки в man udev как в comment
> 5, точки в man scanf (после "A directive is one of the following:"?) показываются точками.

Т.е. у тебя работает вообще всё? (кстати, я смотрел man в xterm, опять же если это имеет значение).

Comment 10 Valery Inozemtsev 2008-08-13 14:43:53 MSD
с -Tutf8 отображает правильно

(In reply to comment #7)
> ru_RU.KOI8-R

koi8-r и т.п. давно никого не интересует
Comment 11 Slava Semushin 2008-08-13 14:49:09 MSD
(In reply to comment #10)
> с -Tutf8 отображает правильно

Это хорошо. Значит дело в ключах nroff
 
> (In reply to comment #7)
> > ru_RU.KOI8-R
> 
> koi8-r и т.п. давно никого не интересует

Валерий, не надо говорить за всех, пожалуйста :) У меня дома CP1251 и я очень не хотел бы что-то ломать.
Comment 12 Alexey Gladkov 2008-08-13 14:50:48 MSD
(In reply to comment #6)
> Мне это помогло увидеть точку в man scanf. Возможно, поможет вам с <B4>

Спасибо. У меня появились символы копирайта ( например в printf(1) ).
Comment 13 Alexey Gladkov 2008-08-13 14:52:13 MSD
(In reply to comment #11)
> Это хорошо. Значит дело в ключах nroff

Я сейчас потихоньку пилю новую версию.
Comment 14 Sir Raorn 2008-08-13 14:57:02 MSD
(In reply to comment #9)
> Т.е. у тебя работает вообще всё?
И даже символ копирайта.

(In reply to comment #10)
> koi8-r и т.п. давно никого не интересует
Отучаемся говорить за всех...

(In reply to comment #11)
> > с -Tutf8 отображает правильно
> Это хорошо. Значит дело в ключах nroff
А оно умеет само, без пинков на кодировку локали смотреть?
Comment 15 Slava Semushin 2008-08-13 15:00:49 MSD
(In reply to comment #12)
> (In reply to comment #6)
> > Мне это помогло увидеть точку в man scanf. Возможно, поможет вам с <B4>
> Спасибо. У меня появились символы копирайта ( например в printf(1) ).

У меня русские маны перестали показываться после этого ;( (например, тот же printf(1))
Comment 16 Mikhail Gusarov 2008-08-13 15:06:21 MSD
"The nroff script emulates the nroff command using groff.  Only ascii, latin1, utf8, and cp1047 are valid  arguments  for  the -T option"

так что без iconv не обойтись. Но пинок "nroff -Tutf8 | iconv -t моякодировка" в пакет, вероятно, уместен.
Comment 17 Mikhail Gusarov 2008-08-13 15:07:58 MSD
(In reply to comment #15)

> У меня русские маны перестали показываться после этого ;( (например, тот же
> printf(1))

Попробуй добиться следующего:

1) маны, в какой бы кодировке они ни были, перекодируются в UTF-8 перед запихиванием в nroff
2) nroff работает в UTF-8
3) результат конвертируется в кодировку локали.

Посмотри ещё обсуждения в багтракере редхата и debian - там были какие-то подводные грабли.
Comment 18 Valery Inozemtsev 2008-08-13 15:10:06 MSD
да, русские маны сломались
Comment 19 Alexey Gladkov 2008-08-13 15:17:39 MSD
(In reply to comment #17)
> 1) маны, в какой бы кодировке они ни были, перекодируются в UTF-8 перед
> запихиванием в nroff

Это старая проблема. В мане нет указания кодировки.
Comment 20 Mikhail Gusarov 2008-08-13 15:20:43 MSD
(In reply to comment #19)

> > 1) маны, в какой бы кодировке они ни были, перекодируются в UTF-8 перед
> > запихиванием в nroff
> Это старая проблема. В мане нет указания кодировки.
Вроде ведь порешали спецфайликом с укзанием кодировки для данного языка?

Я понимаю, что в разных пакетах могут лежать маны в разной кодировке. Но что ещё делать? Разве что к локализованному ману опционально файл с его кодировкой укладывать.

Без знания кодировки всё равно эти маны только в одной локали работают.
Comment 21 Alexey Gladkov 2008-08-13 15:28:13 MSD
(In reply to comment #20)
> (In reply to comment #19)
> 
> > > 1) маны, в какой бы кодировке они ни были, перекодируются в UTF-8 перед
> > > запихиванием в nroff
> > Это старая проблема. В мане нет указания кодировки.
> Вроде ведь порешали спецфайликом с укзанием кодировки для данного языка?
> 
> Я понимаю, что в разных пакетах могут лежать маны в разной кодировке. Но что
> ещё делать? Разве что к локализованному ману опционально файл с его
> кодировкой укладывать.

Да. Есть файлик: /usr/share/man/ru/.charset

Лучше бы в начале мана был комментарий с указанием кодировки. Тогда маны можно было делать в разных кодировках.

Всё это ооочень старые проблемы :(
Comment 22 Slava Semushin 2008-08-13 15:49:12 MSD
(In reply to comment #17)
> 1) маны, в какой бы кодировке они ни были, перекодируются в UTF-8 перед
> запихиванием в nroff
> 2) nroff работает в UTF-8
> 3) результат конвертируется в кодировку локали.

Пункт 2) не выполняется: "Так как groff не переваривает utf на входе, то хранить manы в utf невозможно" и "groff внутри сломан от рождения" -- это всё цитаты voins@ из bug #6988

С тех пор так ничего и не изменилось.
Comment 23 Mikhail Gusarov 2008-08-13 15:50:33 MSD
Тогда заставить его всё выплёвывать в UTF-8 и конвертировать в текущую кодировку.
Comment 24 Alexey Gladkov 2008-08-13 15:54:03 MSD
(In reply to comment #22)
> С тех пор так ничего и не изменилось.

Как дособеру новую версию, так смогу подтвердить ещё раз эти слова. Сейчас это действительно так.
Comment 25 Andrey Cherepanov 2008-08-13 16:38:26 MSD
(In reply to comment #21)\
> Лучше бы в начале мана был комментарий с указанием кодировки.
Проще все man-pages-* переконвертировать в UTF-8 и использовать эту кодировку по умолчанию.

Comment 26 Mikhail Gusarov 2008-08-13 16:40:28 MSD
(In reply to comment #25)
> Проще все man-pages-* переконвертировать в UTF-8 и использовать эту кодировку по умолчанию.

Читай комментарии 22 и 24
Comment 27 Andrey Cherepanov 2008-08-13 16:44:43 MSD
(In reply to comment #26)
> Читай комментарии 22 и 24
Починить нереально?

Comment 28 Alexey Gladkov 2008-08-13 16:52:05 MSD
(In reply to comment #27)
> Починить нереально?

Вообще, раньше это было трудно починить. Как сейчас пока не знаю.
Comment 29 Andrey Rahmatullin 2008-08-13 20:14:23 MSD
beginning with a '#'
·      A  sequence  of  white-space
Copyright   ©   2008   Free   Software   Foundation

man-1.6f-alt1
ru_RU.CP1251
Comment 30 Alexey Gladkov 2008-08-18 14:37:07 MSD
(In reply to comment #28)
> Вообще, раньше это было трудно починить. Как сейчас пока не знаю.

Теперь знаю. Продвижения есть, но нужна поддержка со стороны man: groff научился искать признаки указания кодировке в man странице и есть ключ чтобы указать кодировку жёстко.
Comment 31 Slava Semushin 2008-08-18 14:41:38 MSD
(In reply to comment #30)
> Теперь знаю. Продвижения есть, но нужна поддержка со стороны man: groff научился
> искать признаки указания кодировке в man странице и есть ключ чтобы указать
> кодировку жёстко.

Поддержку обеспечу, ты лучше выложи новый groff в Сизиф или на people, чтобы можно было потетстировать.
Comment 32 Alexey Gladkov 2008-08-19 02:36:33 MSD
(In reply to comment #31)
> Поддержку обеспечу, ты лучше выложи новый groff в Сизиф или на people, чтобы
> можно было потетстировать.

Разумеется:

http://git.altlinux.org/people/legion/packages/groff.git?p=groff.git;a=shortlog;h=refs/heads/1.19.3

обрати внимание на утилиту preconv и groff (-k|-Karg).
Comment 33 Slava Semushin 2008-08-19 08:50:02 MSD
(In reply to comment #32)
http://git.altlinux.org/people/legion/packages/groff.git?p=groff.git;a=shortlog;h=refs/heads/1.19.3

Ок. Если где-нибудь положишь ещё и RPM-ки, то будет совсем замечательно (я бы тогда уже начал тестировать).

Comment 34 Slava Semushin 2008-08-19 11:25:53 MSD
(In reply to comment #33)
> (In reply to comment #32)
> http://git.altlinux.org/people/legion/packages/groff.git?p=groff.git;a=shortlog;h=refs/heads/1.19.3

в man preconf похоже не подставилось что-то:

preconv  reads  files and converts its encoding(s) to a form GNU troff(@MAN1EXT) can process

Это trivial баг тебе :)

Comment 35 Slava Semushin 2008-08-19 11:52:35 MSD
(In reply to comment #32)
> обрати внимание на утилиту preconv и groff (-k|-Karg).

Пока сработал такой рецепт:
- поставить твой groff
- переместить (или удалить) файл /usr/share/man/ru/.charset (для того, чтобы man не пытался перекодировать из koi8-r насильно, в дальнейшем это можно будет сделать просто отключив два патча)
- заменить в /etc/man.conf

NROFF       /usr/bin/nroff -Tlatin1 -mandoc

на

NROFF       /usr/bin/nroff -Kkoi8-r -Tutf8 -mandoc

Надо проверить ещё, но сейчас у меня работает на юникодной локали, вероятно, не будет работать на однобитных локалях.

Я почитал про preconv и вижу, что есть даже возможность избавиться от нашего строгого ограничения, чтобы все маны были в кодировке koi8-r: нужно изменить порядок по которому troff ищет кодировку. Сейчас ищет так:

- если указана ключом -e
- смотрит последовательность байт (BOM)
- ищет магический комментарий
- использует текущую локаль или же latin1, если локаль установлена в С или POSIX

Так вот. Я предалагаю изменить порядок на следующий:

- ищет магический комментарий
- если указана ключом -e
- смотрит последовательность байт (BOM)
- использует текущую локаль или же latin1, если локаль установлена в С или POSIX

В таком случае именно значащий комментарий будет "хвататься" первым, а не опция -e. Тогда любой мэйнтейнер сможет указать кодировку мана и она обработается правильно. А вот если кодировка не указана (как в большинстве манов сейчас), то будет использоваться та, что передаётся в ключе -e и тут уже мы укажем KOI8-R, которая сейчас во всех манах.

Как вам идея?
Comment 36 Mikhail Gusarov 2008-08-19 11:57:48 MSD
(In reply to comment #35)

> NROFF       /usr/bin/nroff -Kkoi8-r -Tutf8 -mandoc
> 
> Надо проверить ещё, но сейчас у меня работает на юникодной локали, вероятно,
> не будет работать на однобитных локалях.

Здесь добавишь перекодировку из UTF-8 в текущую локаль и всё заработает. Правда, лучше не iconv'ом, а тем, что умеет © на (c) заменять и т.д.

> то будет использоваться та, что передаётся в ключе -e и тут уже
> мы укажем KOI8-R, которая сейчас во всех манах.

Лучше передавать сюда как раз /usr/share/man/<lang>/.charset - manpages-RU мир не исчерпывается.

> Как вам идея?

В остальном - нормально.
Comment 37 Slava Semushin 2008-08-19 12:04:50 MSD
(In reply to comment #36)
[...]
> Здесь добавишь перекодировку из UTF-8 в текущую локаль и всё заработает.
> Правда, лучше не iconv'ом, а тем, что умеет © на (c) заменять и т.д.

А кто это умеет?

> > то будет использоваться та, что передаётся в ключе -e и тут уже
> > мы укажем KOI8-R, которая сейчас во всех манах.
> 
> Лучше передавать сюда как раз /usr/share/man/<lang>/.charset - manpages-RU мир не исчерпывается.

Не знаю пока как это сделать, потому что это значение в конфиге прописывается.
Comment 38 Mikhail Gusarov 2008-08-19 12:13:01 MSD
(In reply to comment #37)
> А кто это умеет?

Например, recode.

[mag@frontier:~]% echo © | recode UTF-8/..ASCII/ 
(c)
[mag@frontier:~]% 

> Не знаю пока как это сделать, потому что это значение в конфиге
> прописывается.

Там shell-команда. Что хочешь, то и пиши. Типа такого:

NROFF           /usr/bin/nroff -Tutf8 -e`cat /usr/share/man/$LANG/.charset` -mandoc

Или shell-враппер вокруг nroff и его в NROFF указать.

Вообще, я бы добавил отдельный ключик - "fallback encoding". Тогда -e можно оставить первым в поиске (и не указывать в конфигурации), а содержимое .charset подсовывать в качестве "fallback".
Comment 39 Alexey Gladkov 2008-08-19 14:17:11 MSD
(In reply to comment #35)
> (In reply to comment #32)
> > обрати внимание на утилиту preconv и groff (-k|-Karg).
> 
> Пока сработал такой рецепт:

Когда я тестировал, то в итоге man генерировал мне:

cd "/usr/share/man/ru" &&
(echo ".ll 8.1i";
 echo ".nr LL 8.1i";
 echo ".pl 1100i";
 /bin/bzcat '/usr/share/man/ru/man1/ls.1.bz2';
 echo ".\\\"";
 echo ".pl \n(nlu+10") |
/usr/bin/gtbl |
/usr/bin/iconv -c -f KOI8-R -t utf8 |
/usr/bin/nroff -Kutf8 -Tutf8 -mandoc |
/usr/bin/iconv -c -f utf8 |
/usr/bin/less -isR

KOI8-R берётся из .charset

> Так вот. Я предалагаю изменить порядок на следующий:

Мне не нравится идея менять порядок т.к. если комментарий будет неправильный заинфорсить ты его не сможешь. Но ничего лучше пока в голову не приходит.
Нужно подумать.
Comment 40 Alexey Gladkov 2008-08-20 02:48:39 MSD
Я добавил в preconv/groff/nroff опцию -D для того чтобы менять возможность менять кодировку по умолчанию в preconv.
Comment 41 Alexey Gladkov 2008-08-22 02:20:05 MSD
ping
Comment 42 Slava Semushin 2008-08-22 13:41:41 MSD
(In reply to comment #41)
> ping

Когда ждать новый groff в Сизифе? 

Comment 43 Alexey Gladkov 2008-08-22 13:47:42 MSD
(In reply to comment #42)
> Когда ждать новый groff в Сизифе? 

Когда в нём будут всё, что нужно для нормальной работы man. Если в нём достаточно средств, то я сделаю релиз сегодня.
Comment 44 Slava Semushin 2008-08-22 13:51:17 MSD
(In reply to comment #43)
> Когда в нём будут всё, что нужно для нормальной работы man. Если в нём
> достаточно средств, то я сделаю релиз сегодня.

Release early, release often (c) :-)
 
(Собственно, для нормального тестирования мне нужны готовые RPM-ки, потому что тянуть из git-а и собирать самому накладно как по трафику, так и по времени.)
Comment 45 Alexey Gladkov 2008-08-22 13:55:56 MSD
(In reply to comment #44)
> (Собственно, для нормального тестирования мне нужны готовые RPM-ки, потому
> что тянуть из git-а и собирать самому накладно как по трафику, так и по
> времени.)

Ты же уже собирал groff из git. Если ты не удалял репозиторий, то его обповление будет *сильно* меньше rpm'ок.
Comment 46 Alexey Gladkov 2008-08-22 14:30:24 MSD
(In reply to comment #44)
> (Собственно, для нормального тестирования мне нужны готовые RPM-ки, потому
> что тянуть из git-а и собирать самому накладно как по трафику, так и по
> времени.)

Если тебе нужны rpm, то они тут: ftp.altlinux.org/people/legion/repo/
Comment 47 Alexey Gladkov 2008-08-23 03:26:52 MSD
В сизиф ушла сборка: groff-1.19.3-alt1.20080822
Comment 48 Slava Semushin 2008-08-24 12:12:34 MSD
(In reply to comment #47)
> В сизиф ушла сборка: groff-1.19.3-alt1.20080822

В Сизифе пока её нет, а на people/ старая версия (пока поставил её).

Comment 49 Slava Semushin 2008-08-25 00:26:26 MSD
Сборка с фиксом готова: http://lists.altlinux.org/pipermail/sisyphus/2008-August/217346.html
Comment 50 Slava Semushin 2008-08-30 15:25:21 MSD
Reassign to new maintainer.
Comment 51 Ivan Zakharyaschev 2008-09-03 04:36:08 MSD
(In reply to comment #49)
> Сборка с фиксом готова: http://lists.altlinux.org/pipermail/sisyphus/2008-August/217346.html
> 

А нет смысла в новый прекрасный man сделать зависимость на именно новую прекрасную версию groff-base? А то я заметил, что у меня фигня вместо каких-то особых знаков (да и в разных терминалах -- разная), обновил man -- и нет хорошего эффекта; это при: 

man-1.6f-alt1
groff-base-1.19.2-alt2.0

(Прочитал это, попробую теперь с новым groff.)
Comment 52 Ivan Zakharyaschev 2008-09-03 04:47:22 MSD
(In reply to comment #51)

> А то я заметил, что у меня фигня вместо каких-то
> особых знаков (да и в разных терминалах -- разная)

> (Прочитал это, попробую теперь с новым groff.)

Нет, не исправилось; при

man-1.6f-alt1
groff-base-1.19.3-alt2.20080822
git-doc-1.5.6.5-alt2


в xterm-236-alt1:

$ man gitglossary | fgrep 'means to get'
           Fetching a branch means to get the branch╢s head ref from a remote
           Pushing a branch means to get the branch╢s head ref from a remote
$ locale
LANG=ru_RU.KOI8-R
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES=POSIX
LC_PAPER="ru_RU.KOI8-R"
LC_NAME="ru_RU.KOI8-R"
LC_ADDRESS="ru_RU.KOI8-R"
LC_TELEPHONE="ru_RU.KOI8-R"
LC_MEASUREMENT="ru_RU.KOI8-R"
LC_IDENTIFICATION="ru_RU.KOI8-R"
LC_ALL=
$ 

(только вот эти ╢ (вместо апострофов) реально в xterm выглядит как вообще пустое место (нулевой ширины). В rxvt-unicode-9.02-alt1 выглядит именно так, как оно сюда скопировалсь (видно эти символы псевдографики. Ну т.е. отличия разных терминалов, про которое я говорил, оказалось чисто видимостью.)
Comment 53 Alexey Gladkov 2008-09-05 02:48:36 MSD
(In reply to comment #52)
> $ man gitglossary | fgrep 'means to get'
>            Fetching a branch means to get the branch╢s head ref from a remote
>            Pushing a branch means to get the branch╢s head ref from a remote

В данном случае это ошибка в man-странице. В gitglossary(7) написано:

Fetching a branch means to get the branch\'s head ref from a remote repository

Цитирую groff(7):

\'     The acute accent .; same as \(aa.  Unescaped: apostrophe
Comment 54 Ivan Zakharyaschev 2008-10-28 16:29:49 MSK
(In reply to comment #53)
> (In reply to comment #52)
> > $ man gitglossary | fgrep 'means to get'
> >            Fetching a branch means to get the branch╢s head ref from a remote
> >            Pushing a branch means to get the branch╢s head ref from a remote
> 
> В данном случае это ошибка в man-странице. В gitglossary(7) написано:

Ясно. Спасибо за ответ!

https://bugzilla.altlinux.org/show_bug.cgi?id=17701 -- a note for me; I should check this after I'll upgrade from Sisyphus.
Comment 55 Alexei V. Mezin 2009-07-21 00:18:03 MSD
[alexei@threebears ~]$ rpm -qf /usr/bin/man-source       
man-1.6f-alt11


При вызове man-source --help последние строки выглядят так:

General help using GNU software: <http://www.gnu.org/gethelp/>
Report cat translation bugs to <http://translationproject.org/team/>

."
.pl \n(nlu+10


Вот этот мусор в конце должен быть там?
Comment 56 Alexey Gladkov 2009-07-21 13:44:09 MSD
(В ответ на комментарий №55)

> При вызове man-source --help последние строки выглядят так:

man-source - это хелпер. У него нет опций.

Зачем он вам понадобился?

> Вот этот мусор в конце должен быть там?

Это не мусор.
Comment 57 Alexey Gladkov 2009-08-28 20:53:05 MSD
Изначальная проблема исправлена.