Come faccio a convertire le pagine man di Linux in HTML senza usare groff?


11

Vorrei convertire alcune pagine man di Linux in HTML senza usare groff. Il mio pregiudizio contro groff è dovuto ad alcuni problemi di rendering PNG che mi sta dando che sembra essere localizzato su Sabayon (poiché questi problemi non sembrano verificarsi sulle mie VM VirtualBox per altre distro). Mi rendo conto che si tratta di un bug, ma una soluzione sembra non essere nel prossimo futuro, quindi vorrei chiedere se ci sono altri modi per convertire le pagine man di Linux in HTML. L'uso delle pagine HTML su http://linux.die.net/man non è una soluzione accettabile in quanto alcune delle pagine man che mi interessano non ci sono (ad esempio, emerge(1)non c'è).


Perché non usi troff? È gratis.
schily,

Non so come, ho imparato a usare groff leggendo alcune risposte su questo sito e sui siti correlati. Se scrivi una risposta che coinvolge troff, posso accettarla, a seconda della qualità delle altre risposte a questa domanda.
BH2017,

perché non inviare una segnalazione di bug a sabayon e convincerli a correggere i loro bug?
Cas

@cas Il primo collegamento (i problemi di rendering PNG) è una segnalazione di bug Sabayon che ho presentato nel momento in cui ho posto questa domanda.
BH2017,

prova a trovare e correggere l'origine del warning: can't find font `b'messaggio, che potrebbe essere la causa poiché i file png creati tendono ad essere solo testo in formato grafico. probabilmente un pacchetto di font mancante che deve essere installato.
Cas

Risposte:


10

Ci sono molte alternative come roffit , troff , man2html . Esistono anche browser manpage online basati su perl, come manServer .

Il mio preferito è pandoc, anche se purtroppo non sembra supportare l'input ROFF per impostazione predefinita (anche se è possibile utilizzarlo probabilmente se è necessario concatenare più filtri di trasformazione insieme.

esempio di man2html:

zcat /usr/share/man/man1/dd.1.gz \ 
    | man2html \
    | sudo tee /var/www/html/dd.html

esempio roffit:

git clone git://github.com/bagder/roffit.git
cd roffit
zcat /usr/share/man/man1/dd.1.gz \
    | perl roffit \
    | sudo tee /var/www/html/dd-roffit.html

Altri strumenti:


Ah, dovrei chiarire che non sono solo interessato al nome dei programmi, sono interessato a come usarli per convertire le pagine man in HTML. Quindi, scegli almeno uno di questi programmi e mostrami come convertire pagine man in HTML con esso.
BH2017,

Grazie per la modifica, molto meglio! Ho un paio di domande però. Perché reindirizzare stderr al file html man2htmlnell'esempio? E perché reindirizzare a un file in /var/www/html? Non è necessario un server web, basta reindirizzare a un file locale e puoi puntare il browser ad esso. Inoltre, hai controllato il tuo man2htmloutput? L'ho provato sul mio Arch e non produce output formattato.
terdon

Non c'è bisogno di reindirizzare stderr, ignoralo :-). L'ho reindirizzato su / var / www / html in modo da poter visualizzare i risultati durante i miei test (sto usando un sistema remoto su SSH). Non è necessario: l'utilizzo di un browser a livello locale funziona perfettamente. Ho controllato entrambi - e sembrano OK sul mio sistema. Non ho verificato se sono in grado di produrre PNG (o qualunque sia il problema con Arch).
Criveti Mihai,

Mi piace questa risposta, penso che finirò per accettarla, ma c'è un ultimo problema con questa risposta. Vedi Sabayon usa le manpage in .bz2formato anziché .gz, quindi potresti riscrivere la tua risposta di conseguenza? Come modificare le linee zcat con quelle che funzioneranno con le pagine man compresse di bzip2.
BH2017,

man2html ha bisogno dell'output di nroff e non funziona con input trodd Il tuo esempio è sbagliato.
schily,

6

Questo primo pezzo è uno strappo spudorato dal sito ufficiale :

mandocè una suite di strumenti di compilazione mdoc, il rofflinguaggio macro di scelta per le pagine dei manuali BSD e manil linguaggio storico predominante per i manuali UNIX. È piccolo, ISO C, con licenza ISC e abbastanza veloce. Il componente principale del set di strumenti è il mandocprogramma di utilità, basato sul libmandoccompilatore di convalida, per formattare l'output per terminali UNIX (con supporto per le localizzazioni a caratteri grandi) , XHTML, HTML, PostScript e PDF.

mandocè stato prevalentemente sviluppato su OpenBSD ed è sia un progetto OpenBSD che un progetto BSD.lv. Ci impegniamo a supportare tutti i sistemi operativi gratuiti interessati, in particolare FreeBSD, NetBSD, DragonFly, illumos, Minix 3 e GNU / Linux, nonché tutti i sistemi che eseguono il pkgsrcsistema di compilazione di pacchetti portatili. Per supportare lo mandocsviluppo, considera la possibilità di donare alla fondazione OpenBSD.

pacmanmi informa che la dimensione del mio mdocmlpacchetto installato localmente è 3.28mb e che include i seguenti file /usr/binbinari:

/usr/bin/demandoc
/usr/bin/makewhatis
/usr/bin/mandoc
/usr/bin/mapropos
/usr/bin/mman
/usr/bin/mwhatis

Con esso posso fare:

mman -Thtml mman >/tmp/html
firefox file:///tmp/html

inserisci qui la descrizione dell'immagine

Puoi applicare i tuoi fogli di stile come preferisci. Tutta la documentazione è anche online . E tutto ciò, come penso, è anche compilato mandoc.


Il progetto è stato rinominato in mandoc.
Franklin Yu,

5

In primo luogo, va notato che esiste più di un programma chiamato man2html.

Un'utilità chiamata man2htmlè un programma C originariamente scritto alla fine degli anni '90 da Richard Verhoeven alla Eindhoven University of Technology alla fine degli anni '90. Il programma ha interni sostanzialmente eccentrici. Tuttavia, si ha il vantaggio che funziona con il sorgente della pagina man prime, piuttosto che troffo nroffuscita. Questo programma è stato aggiunto alla suite uomo di Frederico Lucifredi.

Il programma comprende la semantica del mane mandocmacro, ed emette una struttura HTML ragionevole. Ad esempio, quando usi paragrafi rientrati, in questo modo:

Parola .IP
Definizione di
parola.
.RS

il programma pubblicherà un elenco di definizioni HTML.

Mantengo una pagina man molto grande (la maggior parte di un megabyte di sorgente e lunga quasi 400 pagine, quando convertito in formato PDF da:) groff:

$ ls -l txr.1
-rw-rw-r-- 1 kaz kaz 980549 3 gennaio 11:38 txr.1

Quando avevo bisogno di convertirlo in HTML, circa cinque anni fa, l'unica cosa che ho trovato che ha fatto un lavoro ragionevole era il man2htmlprogramma C, oltre a post-elaborazione del suo output in "stagione a piacere".

Alla fine, volevo un documento HTML di qualità molto migliore, quindi ho iniziato a scrivere troffmacro. I limiti del programma C sono diventati dolorosamente evidenti, quindi l'ho biforcuta. Sul mio sito git, puoi trovare un repository git con 30 patch per man2html . Queste patch risolvono una serie di bug e migliorano il programma con una capacità molto migliorata di interpretare macro di troff, condizionali, loop e altri costrutti. Ho anche aggiunto un M2registro per mezzo del quale è possibile scrivere codice che rileva che è in esecuzione man2htmle che può fare condizionalmente alcune cose in modo diverso (scorrere verso il basso per un esempio). Inoltre, ho aggiunto un .M2SScomando che ti consente di emettere una sezione di intestazione HTML personalizzata.

La mia grande manpage è ospitata qui . Questo è prodotto con man2html, post-elaborato dal mio genman.txrprogramma, che riorganizza le sezioni e aggiunge hyperlink in tutto il documento. Riscrive anche i collegamenti interni nel sommario in modo che siano URL stabili (basati sull'hash anziché sull'enumerazione arbitraria) e rende il sommario pieghevole tramite alcuni Javascript.

I comandi esatti usati dal mio Makefile:

man2html txr.1 | ./txr genman.txr -> txr-manpage.html
tbl txr.1 | pdfroff -man --no-toc -> txr-manpage.pdf

Per un esempio di come l'output è condizionatamente diverso tra HTML e nroffpossiamo guardare una sezione mandell'output:

       9.19.4 Macro defstruct

       Sintassi:

                (defstruct {<name> | (<name> <arg> *)} <super>
                   <Slot specificatore> *)

              La macro defstruct definisce un nuovo tipo di struttura e registri
              sotto <name>, che deve essere un simbolo associabile, secondo
              la funzione associabile. Allo stesso modo, il nome di ogni <slot> deve
              anche essere un simbolo vincolante.

Sopra, nota come sono indicati i parametri <angle> <brackets>. Nella versione HTML, appaiono in corsivo .

La sezione della sintassi appare nel codice sorgente in questo modo:

.coNP Macro @ defstruct
.synb
.mets (defstruct >> {name | >> (name << arg *)} <super
.mets \ \ << specificatore di slot *)
.syne

che è tutte le macro personalizzate definite nello stesso documento. Sotto .mets, < bsignifica bè una variabile meta-sintattica. >> a bsignifica aè una sintassi concreta, accanto alla quale si trova la meta-sintattica bsenza alcuno spazio intermedio , e <> a b cindica buna meta-sintattica stretta tra ae cletterali.

La mia versione migliorata di man2htmlcomprende la macro piuttosto complicata che implementa queste convenzioni di markup.

Inoltre, nota come il manuale abbia numerato automaticamente le sezioni: tutto ciò è fatto dal codice troff, che man2htmlcapisce.


1

Poiché OpenSolaris è stato reso disponibile come OSS, è disponibile un servizio gratuito troff.

Una serie di fonti portate sono qui:

http://heirloom.sourceforge.net/doctools.html

ma Heirloom è un progetto morto dall'aprox. 2007. Potresti voler controllare

https://github.com/nt-roff/heirloom-doctools

dove alcune persone continuano il progetto del cimelio morto.

Insieme a man2html, troff ti permette di creare automaticamente belle pagine man HTML.

Vedi ad esempio le pagine man di SchilliX:

http://schillix.sourceforge.net/man/

con la Schily Bourne Shell:

http://schillix.sourceforge.net/man/man1/bosh.1.html

Sono contento di questo e delle opzioni giuste, ottieni pagine man collegate ad altra documentazione dello stesso gruppo. Uso ad esempio questo comando:

soelim sh.1 | tbl | nroff -u1 -Tlp -man - | col -x | \
                        (sed -e 's/XXX/sh.1/g' ../conf/pre.html; \
                        man2html  -cgiurl '../man$section$subsection/$title.$section$subsection.html' -compress -nodepage; \
                        cat ../conf/post.html) | \
                        egrep -v 'HTML|BODY'> sh.1.html

che fa parte del file system make negli strumenti schily. Nota i file ../conf/pre.htmle ../conf/post.htmldal schily makefilesystem che sono necessari per il titolo e altri. Ti potrebbe piacere cambiare queste quattro esigenze.

Un potenziato man2thmlfa parte degli strumenti schily (vedi in fondo alla boshpagina man).

A proposito: un'informazione divertente: l'intero troffcodice sorgente più tutte le fonti per tutti i programmi di supporto come soelim, tbl... più la manfonte del programma è solo la metà del codice necessario per il mandocprogramma e mandocha solo un tblsupporto molto limitato che rompe la maggior parte dell'uomo di Solaris pagine.

Se hai bisogno di supporto per mandocfonti troff formattate da FreeBSD e simili, ho creato un set di macro mandoc per cui funzionano troff. Controlla le fonti di SchilliX su: https://sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/src/cmd/troff/troff.d/tmac.d/ Il codice in questione è nei file andoce doc*.

Le manfonti del programma in SchilliX-ON sono state modificate in call nroff -mandocanziché nroff -man.


Ah, mi hai battuto! Ho appena installato heirloom-doctoolsanche io . Ho dovuto giocherellare mk.config:-).
Criveti Mihai,

0

I problemi di OP con i file PNG corrispondono alla mia esperienza con groff per la pagina di manuale di xterm e la documentazione delle sequenze di controllo. Il problema è che groff sta tentando di eseguire il rendering delle tabelle come immagine ritagliata dal file PDF e che è stato danneggiato per diversi anni. Mentre ho usato lo script Perl man2html dagli anni '90 per la documentazione di ncurses, per altri programmi ho trovato più semplice generare file html e pdf ad hoc usando groff. I file PDF funzionano bene; i file html no.

Allo stesso tempo, lo script Perl aveva i suoi problemi.

Poiché nessuno dei due stava scomparendo (e poiché le alternative suggerite non sono state un miglioramento, a causa dell'aggiunta di dipendenze o dell'introduzione di altre limitazioni), ho risolto il problema apportando miglioramenti a man2html (oltre a quelli che avevo apportato nel corso di diversi anni) e ha aggiunto una nuova opzione di script di configurazione per ciascun programma per consentire l'utilizzo di groff come convertitore da manpage predefinito a html, ma usando man2html quando ho impostato l'opzione. Fatto questo, ho rimosso tutti i file html generati da groff quest'anno dal mio sito web . C'è una pagina "man2html" sul sito web che documenta questo; lo script attuale è disponibile sulla mia pagina di script vari .

Alcuni dei suggerimenti e dei commenti sembrano non aver notato che esistono (almeno) due programmi chiamati man2html:

  • la sceneggiatura del Perl di Earl Hood (collegata da @ criveti-mihai ) e
  • un programma C originariamente scritto da Richard Verhoeven (e assunto nell'esempio dato da @ criveti-mihai ).

Il programma C ha una sua formattazione, non si basa su nroff / groff / qualunque cosa. Può leggere una manpage dall'input standard o come un file reale (tra le altre cose - vedi la sua pagina di manuale ). Data una pagina di manuale di sintassi nroff "foo.1", è possibile formattarla utilizzando uno di questi comandi:

man2html - <foo.1 >foo.1.html
cat foo.1 |man2html - >foo.1.html
man2html foo.1 >foo.1.html

Lo script Perl legge pagine di manuale formattate , ad esempio, da nroff(che per la domanda di OP è un wrapper per groff). Puoi usarlo in questo modo:

nroff -man foo.1 |man2html >foo.1.html

Ho studiato usando il programma C come alternativa allo script Perl, ma l'ho scartato perché

  • non fa un buon lavoro di formattazione dell'output. In un rapido controllo con il file terminfo.5 di ncurses, posso vedere errori nella formattazione dell'output.
  • il programma C ha una nozione integrata delle macro manpage che non copre i vari casi (inclusa la scrittura di nuove macro) di cui ho bisogno per le pagine di manuale sul mio sito web.

Per inciso, gestisce i reindirizzamenti multipli utilizzati in questo file (che è un problema con il troff legacy - il motivo per cui le istruzioni di installazione di ncurses hanno consigliato di usare groff negli ultimi 20 anni).


Come accennato in precedenza: man2htmlprende l'output di nroff come input, quindi non è possibile dargli un file sorgente della pagina man come input.
schily,

1
@shily Dipende da quale man2htmlstai parlando.
Kaz,

> il programma C ha una nozione integrata delle macro di manpage che non copre i vari casi (inclusa la scrittura di nuove macro) di cui ho bisogno per le pagine di manuale sul mio sito web. Guarda qui: kylheku.com/cgit/man/log
Kaz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.