From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from scc-mailout-kit-01.scc.kit.edu (scc-mailout-kit-01.scc.kit.edu [129.13.231.81]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTP id e3e007f7 for ; Sat, 2 Mar 2019 12:09:52 -0500 (EST) Received: from asta-nat.asta.uni-karlsruhe.de ([172.22.63.82] helo=hekate.usta.de) by scc-mailout-kit-01.scc.kit.edu with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (envelope-from ) id 1h088z-00043s-TM; Sat, 02 Mar 2019 18:09:51 +0100 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.77) (envelope-from ) id 1h088y-00063K-Qw; Sat, 02 Mar 2019 18:09:48 +0100 Received: from athene.usta.de ([172.24.96.10]) by donnerwolke.usta.de with esmtp (Exim 4.84_2) (envelope-from ) id 1h088y-0006EC-Mu; Sat, 02 Mar 2019 18:09:48 +0100 Received: from localhost (athene.usta.de [local]) by athene.usta.de (OpenSMTPD) with ESMTPA id 7eaaefe5; Sat, 2 Mar 2019 18:09:48 +0100 (CET) Date: Sat, 2 Mar 2019 18:09:48 +0100 From: Ingo Schwarze To: Pali =?utf-8?B?Um9ow6Fy?= Cc: discuss@mandoc.bsd.lv Subject: Re: mandoc & perl documentation Message-ID: <20190302170948.GB79342@athene.usta.de> References: <20180913151226.oaon3nvlvgcqioau@pali> <20181011075247.2jo4of7bkpvhkekm@pali> <20181023174545.GD58247@athene.usta.de> <20181024080322.hc6ifwgydpccjif3@pali> <20181025015133.GD20422@athene.usta.de> <20181025081035.qo3i4vrrkm2nwnbf@pali> <20181025213027.GA41690@athene.usta.de> <20181026081519.jbqkllanc4x7snod@pali> <20181124193152.GC16061@athene.usta.de> <20181125133426.s77sfsadbkz6jhcl@pali> X-Mailinglist: mandoc-discuss Reply-To: discuss@mandoc.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20181125133426.s77sfsadbkz6jhcl@pali> User-Agent: Mutt/1.8.0 (2017-02-23) Hi Pali, i just implemented the last feature request mentioned in the mail cited below, see the commit at the end, and i believe that everything touched in that conversation has now been taken care of. If there is something i missed, pleasde speak up! Yours, Ingo Pali Rohar wrote on Sun, Nov 25, 2018 at 02:34:26PM +0100: > Here is simple test.pod file: > > $ cat test.pod > =pod > > =over > > =item * > > Description of item1 > > =item * > > Description of item2 > > =back > > =cut > > Converting it directly to HTML via pod2html results in: > > $ pod2html test.pod > ... >
    >
  • Description of item1

    >
  • >
  • Description of item2

    >
  • >
> ... Mandoc from CVS HEAD nor renders:
  • Description of item1
  • Description of item2
Log Message: ----------- Represent multiple subsequent .IP blocks having a consistent head argument of *, \-, or \(bu as
    rather than as
    , using a bit of heuristics. Basic idea suggested by Dagfinn Ilmari Mannsaker in https://github.com/Debian/debiman/issues/67 and independently by on . Modified Files: -------------- mandoc: TODO man_html.c Revision Data ------------- Index: TODO =================================================================== RCS file: /home/cvs/mandoc/mandoc/TODO,v retrieving revision 1.285 retrieving revision 1.286 diff -LTODO -LTODO -u -p -r1.285 -r1.286 --- TODO +++ TODO @@ -342,11 +342,6 @@ are mere guesses, and some may be wrong. --- HTML issues -------------------------------------------------------- -- format ".IP *" etc. as
      rather than
      - https://github.com/Debian/debiman/issues/67 - reminded by Pali Rohar 25 Nov 2018 14:34:26 +0100 - loc ** exist ** algo ** size * imp *** - - .Bf at the beginning of a paragraph inserts a bogus 1ex horizontal space, see for example random(3). Introduced in http://mdocml.bsd.lv/cgi-bin/cvsweb/mdoc_html.c.diff?r1=1.91&r2=1.92 Index: man_html.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/man_html.c,v retrieving revision 1.172 retrieving revision 1.173 diff -Lman_html.c -Lman_html.c -u -p -r1.172 -r1.173 --- man_html.c +++ man_html.c @@ -46,6 +46,8 @@ static void print_man_head(const stru struct html *); static void print_man_nodelist(MAN_ARGS); static void print_man_node(MAN_ARGS); +static char list_continues(const struct roff_node *, + const struct roff_node *); static int man_B_pre(MAN_ARGS); static int man_IP_pre(MAN_ARGS); static int man_I_pre(MAN_ARGS); @@ -236,16 +238,13 @@ print_man_node(MAN_ARGS) if (n->type == ROFFT_BLOCK && (n->tok == MAN_IP || n->tok == MAN_TP || n->tok == MAN_TQ)) { t = h->tag; - while (t->tag != TAG_DL) + while (t->tag != TAG_DL && t->tag != TAG_UL) t = t->next; /* * Close the list if no further item of the same type * follows; otherwise, close the item only. */ - if (n->next == NULL || - (n->tok == MAN_IP && n->next->tok != MAN_IP) || - (n->tok != MAN_IP && - n->next->tok != MAN_TP && n->next->tok != MAN_TQ)) { + if (list_continues(n, n->next) == '\0') { print_tagq(h, t); t = NULL; } @@ -416,29 +415,82 @@ man_PP_pre(MAN_ARGS) return 1; } +static char +list_continues(const struct roff_node *n1, const struct roff_node *n2) +{ + const char *s1, *s2; + char c1, c2; + + if (n1 == NULL || n1->type != ROFFT_BLOCK || + n2 == NULL || n2->type != ROFFT_BLOCK) + return '\0'; + if ((n1->tok == MAN_TP || n1->tok == MAN_TQ) && + (n2->tok == MAN_TP || n2->tok == MAN_TQ)) + return ' '; + if (n1->tok != MAN_IP || n2->tok != MAN_IP) + return '\0'; + n1 = n1->head->child; + n2 = n2->head->child; + s1 = n1 == NULL ? "" : n1->string; + s2 = n2 == NULL ? "" : n2->string; + c1 = strcmp(s1, "*") == 0 ? '*' : + strcmp(s1, "\\-") == 0 ? '-' : + strcmp(s1, "\\(bu") == 0 ? 'b' : ' '; + c2 = strcmp(s2, "*") == 0 ? '*' : + strcmp(s2, "\\-") == 0 ? '-' : + strcmp(s2, "\\(bu") == 0 ? 'b' : ' '; + return c1 != c2 ? '\0' : c1 == 'b' ? '*' : c1; +} + static int man_IP_pre(MAN_ARGS) { const struct roff_node *nn; + const char *list_class; + enum htmltag list_elem, body_elem; + char list_type; + + nn = n->type == ROFFT_BLOCK ? n : n->parent; + if ((list_type = list_continues(nn->prev, nn)) == '\0') { + /* Start a new list. */ + if ((list_type = list_continues(nn, nn->next)) == '\0') + list_type = ' '; + switch (list_type) { + case ' ': + list_class = "Bl-tag"; + list_elem = TAG_DL; + break; + case '*': + list_class = "Bl-bullet"; + list_elem = TAG_UL; + break; + case '-': + list_class = "Bl-dash"; + list_elem = TAG_UL; + break; + default: + abort(); + } + } else { + /* Continue a list that was started earlier. */ + list_class = NULL; + list_elem = TAG_MAX; + } + body_elem = list_type == ' ' ? TAG_DD : TAG_LI; switch (n->type) { case ROFFT_BLOCK: html_close_paragraph(h); - /* - * Open a new list unless there is an immediately - * preceding item of the same type. - */ - if (n->prev == NULL || - (n->tok == MAN_IP && n->prev->tok != MAN_IP) || - (n->tok != MAN_IP && - n->prev->tok != MAN_TP && n->prev->tok != MAN_TQ)) - print_otag(h, TAG_DL, "c", "Bl-tag"); + if (list_elem != TAG_MAX) + print_otag(h, list_elem, "c", list_class); return 1; case ROFFT_HEAD: + if (body_elem == TAG_LI) + return 0; print_otag(h, TAG_DT, ""); break; case ROFFT_BODY: - print_otag(h, TAG_DD, ""); + print_otag(h, body_elem, ""); return 1; default: abort(); -- To unsubscribe send an email to discuss+unsubscribe@mandoc.bsd.lv