[BACK]Return to mdoc_html.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/mdoc_html.c between version 1.111 and 1.123

version 1.111, 2010/10/10 09:59:48 version 1.123, 2010/12/17 00:18:29
Line 72  static int    mdoc_bd_pre(MDOC_ARGS);
Line 72  static int    mdoc_bd_pre(MDOC_ARGS);
 static  int               mdoc_bf_pre(MDOC_ARGS);  static  int               mdoc_bf_pre(MDOC_ARGS);
 static  void              mdoc_bk_post(MDOC_ARGS);  static  void              mdoc_bk_post(MDOC_ARGS);
 static  int               mdoc_bk_pre(MDOC_ARGS);  static  int               mdoc_bk_pre(MDOC_ARGS);
 static  void              mdoc_bl_post(MDOC_ARGS);  
 static  int               mdoc_bl_pre(MDOC_ARGS);  static  int               mdoc_bl_pre(MDOC_ARGS);
 static  int               mdoc_bt_pre(MDOC_ARGS);  static  int               mdoc_bt_pre(MDOC_ARGS);
 static  int               mdoc_bx_pre(MDOC_ARGS);  static  int               mdoc_bx_pre(MDOC_ARGS);
Line 93  static int    mdoc_fo_pre(MDOC_ARGS);
Line 92  static int    mdoc_fo_pre(MDOC_ARGS);
 static  int               mdoc_ic_pre(MDOC_ARGS);  static  int               mdoc_ic_pre(MDOC_ARGS);
 static  int               mdoc_igndelim_pre(MDOC_ARGS);  static  int               mdoc_igndelim_pre(MDOC_ARGS);
 static  int               mdoc_in_pre(MDOC_ARGS);  static  int               mdoc_in_pre(MDOC_ARGS);
 static  int               mdoc_it_block_pre(MDOC_ARGS, enum mdoc_list,  
                                 int, struct roffsu *, struct roffsu *);  
 static  int               mdoc_it_head_pre(MDOC_ARGS, enum mdoc_list,  
                                 struct roffsu *);  
 static  int               mdoc_it_body_pre(MDOC_ARGS, enum mdoc_list,  
                                 struct roffsu *);  
 static  int               mdoc_it_pre(MDOC_ARGS);  static  int               mdoc_it_pre(MDOC_ARGS);
 static  int               mdoc_lb_pre(MDOC_ARGS);  static  int               mdoc_lb_pre(MDOC_ARGS);
 static  int               mdoc_li_pre(MDOC_ARGS);  static  int               mdoc_li_pre(MDOC_ARGS);
Line 110  static int    mdoc_nm_pre(MDOC_ARGS);
Line 103  static int    mdoc_nm_pre(MDOC_ARGS);
 static  int               mdoc_ns_pre(MDOC_ARGS);  static  int               mdoc_ns_pre(MDOC_ARGS);
 static  int               mdoc_pa_pre(MDOC_ARGS);  static  int               mdoc_pa_pre(MDOC_ARGS);
 static  void              mdoc_pf_post(MDOC_ARGS);  static  void              mdoc_pf_post(MDOC_ARGS);
   static  int               mdoc_pp_pre(MDOC_ARGS);
 static  void              mdoc_quote_post(MDOC_ARGS);  static  void              mdoc_quote_post(MDOC_ARGS);
 static  int               mdoc_quote_pre(MDOC_ARGS);  static  int               mdoc_quote_pre(MDOC_ARGS);
 static  int               mdoc_rs_pre(MDOC_ARGS);  static  int               mdoc_rs_pre(MDOC_ARGS);
Line 133  static const struct htmlmdoc mdocs[MDOC_MAX] = {
Line 127  static const struct htmlmdoc mdocs[MDOC_MAX] = {
         {NULL, NULL}, /* Os */          {NULL, NULL}, /* Os */
         {mdoc_sh_pre, NULL }, /* Sh */          {mdoc_sh_pre, NULL }, /* Sh */
         {mdoc_ss_pre, NULL }, /* Ss */          {mdoc_ss_pre, NULL }, /* Ss */
         {mdoc_sp_pre, NULL}, /* Pp */          {mdoc_pp_pre, NULL}, /* Pp */
         {mdoc_d1_pre, NULL}, /* D1 */          {mdoc_d1_pre, NULL}, /* D1 */
         {mdoc_d1_pre, NULL}, /* Dl */          {mdoc_d1_pre, NULL}, /* Dl */
         {mdoc_bd_pre, NULL}, /* Bd */          {mdoc_bd_pre, NULL}, /* Bd */
         {NULL, NULL}, /* Ed */          {NULL, NULL}, /* Ed */
         {mdoc_bl_pre, mdoc_bl_post}, /* Bl */          {mdoc_bl_pre, NULL}, /* Bl */
         {NULL, NULL}, /* El */          {NULL, NULL}, /* El */
         {mdoc_it_pre, NULL}, /* It */          {mdoc_it_pre, NULL}, /* It */
         {mdoc_ad_pre, NULL}, /* Ad */          {mdoc_ad_pre, NULL}, /* Ad */
Line 234  static const struct htmlmdoc mdocs[MDOC_MAX] = {
Line 228  static const struct htmlmdoc mdocs[MDOC_MAX] = {
         {NULL, NULL}, /* Fr */          {NULL, NULL}, /* Fr */
         {mdoc_ud_pre, NULL}, /* Ud */          {mdoc_ud_pre, NULL}, /* Ud */
         {mdoc_lb_pre, NULL}, /* Lb */          {mdoc_lb_pre, NULL}, /* Lb */
         {mdoc_sp_pre, NULL}, /* Lp */          {mdoc_pp_pre, NULL}, /* Lp */
         {mdoc_lk_pre, NULL}, /* Lk */          {mdoc_lk_pre, NULL}, /* Lk */
         {mdoc_mt_pre, NULL}, /* Mt */          {mdoc_mt_pre, NULL}, /* Mt */
         {mdoc_quote_pre, mdoc_quote_post}, /* Brq */          {mdoc_quote_pre, mdoc_quote_post}, /* Brq */
Line 251  static const struct htmlmdoc mdocs[MDOC_MAX] = {
Line 245  static const struct htmlmdoc mdocs[MDOC_MAX] = {
         {NULL, NULL}, /* Ta */          {NULL, NULL}, /* Ta */
 };  };
   
   static  const char * const lists[LIST_MAX] = {
           NULL,
           "list-bul",
           "list-col",
           "list-dash",
           "list-diag",
           "list-enum",
           "list-hang",
           "list-hyph",
           "list-inset",
           "list-item",
           "list-ohang",
           "list-tag"
   };
   
 void  void
 html_mdoc(void *arg, const struct mdoc *m)  html_mdoc(void *arg, const struct mdoc *m)
Line 362  static void
Line 370  static void
 print_mdoc(MDOC_ARGS)  print_mdoc(MDOC_ARGS)
 {  {
         struct tag      *t;          struct tag      *t;
         struct htmlpair  tag;  
   
         t = print_otag(h, TAG_HEAD, 0, NULL);          t = print_otag(h, TAG_HEAD, 0, NULL);
         print_mdoc_head(m, n, h);          print_mdoc_head(m, n, h);
         print_tagq(h, t);          print_tagq(h, t);
   
         t = print_otag(h, TAG_BODY, 0, NULL);          t = print_otag(h, TAG_BODY, 0, NULL);
   
         tag.key = ATTR_CLASS;  
         tag.val = "body";  
         print_otag(h, TAG_DIV, 1, &tag);  
   
         print_mdoc_nodelist(m, n, h);          print_mdoc_nodelist(m, n, h);
         print_tagq(h, t);          print_tagq(h, t);
 }  }
Line 472  mdoc_root_post(MDOC_ARGS)
Line 474  mdoc_root_post(MDOC_ARGS)
   
         time2a(m->date, b, DATESIZ);          time2a(m->date, b, DATESIZ);
   
         /*  
          * XXX: this should use divs, but in Firefox, divs with nested  
          * divs for some reason puke when trying to put a border line  
          * below.  So I use tables, instead.  
          */  
   
         PAIR_CLASS_INIT(&tag[0], "footer");          PAIR_CLASS_INIT(&tag[0], "footer");
         bufcat_style(h, "width", "100%");          bufcat_style(h, "width", "100%");
         PAIR_STYLE_INIT(&tag[1], h);          PAIR_STYLE_INIT(&tag[1], h);
Line 511  mdoc_root_pre(MDOC_ARGS)
Line 507  mdoc_root_pre(MDOC_ARGS)
         struct tag      *t, *tt;          struct tag      *t, *tt;
         char             b[BUFSIZ], title[BUFSIZ];          char             b[BUFSIZ], title[BUFSIZ];
   
         (void)strlcpy(b, m->vol, BUFSIZ);          strlcpy(b, m->vol, BUFSIZ);
   
         if (m->arch) {          if (m->arch) {
                 (void)strlcat(b, " (", BUFSIZ);                  strlcat(b, " (", BUFSIZ);
                 (void)strlcat(b, m->arch, BUFSIZ);                  strlcat(b, m->arch, BUFSIZ);
                 (void)strlcat(b, ")", BUFSIZ);                  strlcat(b, ")", BUFSIZ);
         }          }
   
         (void)snprintf(title, BUFSIZ - 1,          snprintf(title, BUFSIZ - 1, "%s(%s)", m->title, m->msec);
                         "%s(%s)", m->title, m->msec);  
   
         /* XXX: see note in mdoc_root_post() about divs. */  
   
         PAIR_CLASS_INIT(&tag[0], "header");          PAIR_CLASS_INIT(&tag[0], "header");
         bufcat_style(h, "width", "100%");          bufcat_style(h, "width", "100%");
         PAIR_STYLE_INIT(&tag[1], h);          PAIR_STYLE_INIT(&tag[1], h);
Line 564  mdoc_root_pre(MDOC_ARGS)
Line 557  mdoc_root_pre(MDOC_ARGS)
 static int  static int
 mdoc_sh_pre(MDOC_ARGS)  mdoc_sh_pre(MDOC_ARGS)
 {  {
         struct htmlpair          tag[2];          struct htmlpair  tag;
         const struct mdoc_node  *nn;          char             buf[BUFSIZ];
         char                     buf[BUFSIZ];  
         struct roffsu            su;  
   
         if (MDOC_BODY == n->type) {          if (MDOC_BLOCK == n->type) {
                 SCALE_HS_INIT(&su, INDENT);                  PAIR_CLASS_INIT(&tag, "section");
                 bufcat_su(h, "margin-left", &su);                  print_otag(h, TAG_DIV, 1, &tag);
                 PAIR_CLASS_INIT(&tag[0], "sec-body");  
                 PAIR_STYLE_INIT(&tag[1], h);  
                 print_otag(h, TAG_DIV, 2, tag);  
                 return(1);                  return(1);
         } else if (MDOC_BLOCK == n->type) {          } else if (MDOC_BODY == n->type)
                 PAIR_CLASS_INIT(&tag[0], "sec-block");  
                 if (n->prev && NULL == n->prev->body->child) {  
                         print_otag(h, TAG_DIV, 1, tag);  
                         return(1);  
                 }  
   
                 SCALE_VS_INIT(&su, 1);  
                 bufcat_su(h, "margin-top", &su);  
                 if (NULL == n->next)  
                         bufcat_su(h, "margin-bottom", &su);  
   
                 PAIR_STYLE_INIT(&tag[1], h);  
                 print_otag(h, TAG_DIV, 2, tag);  
                 return(1);                  return(1);
         }  
   
         buf[0] = '\0';          buf[0] = '\0';
         for (nn = n->child; nn; nn = nn->next) {          for (n = n->child; n; n = n->next) {
                 html_idcat(buf, nn->string, BUFSIZ);                  html_idcat(buf, n->string, BUFSIZ);
                 if (nn->next)                  if (n->next)
                         html_idcat(buf, " ", BUFSIZ);                          html_idcat(buf, " ", BUFSIZ);
         }          }
   
         PAIR_CLASS_INIT(&tag[0], "sec-head");          PAIR_ID_INIT(&tag, buf);
         PAIR_ID_INIT(&tag[1], buf);          print_otag(h, TAG_H1, 1, &tag);
   
         print_otag(h, TAG_DIV, 2, tag);  
         return(1);          return(1);
 }  }
   
Line 612  mdoc_sh_pre(MDOC_ARGS)
Line 584  mdoc_sh_pre(MDOC_ARGS)
 static int  static int
 mdoc_ss_pre(MDOC_ARGS)  mdoc_ss_pre(MDOC_ARGS)
 {  {
         struct htmlpair          tag[3];          struct htmlpair  tag;
         const struct mdoc_node  *nn;          char             buf[BUFSIZ];
         char                     buf[BUFSIZ];  
         struct roffsu            su;  
   
         SCALE_VS_INIT(&su, 1);          if (MDOC_BLOCK == n->type) {
                   PAIR_CLASS_INIT(&tag, "subsection");
         if (MDOC_BODY == n->type) {                  print_otag(h, TAG_DIV, 1, &tag);
                 PAIR_CLASS_INIT(&tag[0], "ssec-body");  
                 if (n->parent->next && n->child) {  
                         bufcat_su(h, "margin-bottom", &su);  
                         PAIR_STYLE_INIT(&tag[1], h);  
                         print_otag(h, TAG_DIV, 2, tag);  
                 } else  
                         print_otag(h, TAG_DIV, 1, tag);  
                 return(1);                  return(1);
         } else if (MDOC_BLOCK == n->type) {          } else if (MDOC_BODY == n->type)
                 PAIR_CLASS_INIT(&tag[0], "ssec-block");  
                 if (n->prev) {  
                         bufcat_su(h, "margin-top", &su);  
                         PAIR_STYLE_INIT(&tag[1], h);  
                         print_otag(h, TAG_DIV, 2, tag);  
                 } else  
                         print_otag(h, TAG_DIV, 1, tag);  
                 return(1);                  return(1);
         }  
   
         /* TODO: see note in mdoc_sh_pre() about duplicates. */  
   
         buf[0] = '\0';          buf[0] = '\0';
         for (nn = n->child; nn; nn = nn->next) {          for (n = n->child; n; n = n->next) {
                 html_idcat(buf, nn->string, BUFSIZ);                  html_idcat(buf, n->string, BUFSIZ);
                 if (nn->next)                  if (n->next)
                         html_idcat(buf, " ", BUFSIZ);                          html_idcat(buf, " ", BUFSIZ);
         }          }
   
         SCALE_HS_INIT(&su, INDENT - HALFINDENT);          PAIR_ID_INIT(&tag, buf);
         su.scale = -su.scale;          print_otag(h, TAG_H2, 1, &tag);
         bufcat_su(h, "margin-left", &su);  
   
         PAIR_CLASS_INIT(&tag[0], "ssec-head");  
         PAIR_STYLE_INIT(&tag[1], h);  
         PAIR_ID_INIT(&tag[2], buf);  
   
         print_otag(h, TAG_DIV, 3, tag);  
         return(1);          return(1);
 }  }
   
Line 843  mdoc_xx_pre(MDOC_ARGS)
Line 789  mdoc_xx_pre(MDOC_ARGS)
   
         switch (n->tok) {          switch (n->tok) {
         case (MDOC_Bsx):          case (MDOC_Bsx):
                 pp = "BSDI BSD/OS";                  pp = "BSD/OS";
                 break;                  break;
         case (MDOC_Dx):          case (MDOC_Dx):
                 pp = "DragonFly";                  pp = "DragonFly";
Line 891  mdoc_bx_pre(MDOC_ARGS)
Line 837  mdoc_bx_pre(MDOC_ARGS)
         return(0);          return(0);
 }  }
   
   
 /* ARGSUSED */  
 static int  static int
 mdoc_it_block_pre(MDOC_ARGS, enum mdoc_list type, int comp,  mdoc_it_pre(MDOC_ARGS)
                 struct roffsu *offs, struct roffsu *width)  
 {  {
         struct htmlpair          tag;          struct roffsu    su;
         const struct mdoc_node  *nn;          enum mdoc_list   type;
         struct roffsu            su;          struct htmlpair  tag[2];
           const struct mdoc_node *bl;
   
         nn = n->parent->parent;          bl = n->parent;
           while (bl && MDOC_Bl != bl->tok)
                   bl = bl->parent;
   
         /* XXX: see notes in mdoc_it_pre(). */          assert(bl);
   
         if (LIST_column == type) {          type = bl->data.Bl->type;
                 /* Don't width-pad on the left. */  
                 SCALE_HS_INIT(width, 0);  
                 /* Also disallow non-compact. */  
                 comp = 1;  
         }  
         if (LIST_diag == type)  
                 /* Mandate non-compact with empty prior. */  
                 if (n->prev && NULL == n->prev->body->child)  
                         comp = 1;  
   
         bufcat_style(h, "clear", "both");          assert(lists[type]);
         if (offs->scale > 0)          PAIR_CLASS_INIT(&tag[0], lists[type]);
                 bufcat_su(h, "margin-left", offs);  
         if (width->scale > 0)  
                 bufcat_su(h, "padding-left", width);  
   
         PAIR_STYLE_INIT(&tag, h);          if (MDOC_HEAD == n->type) {
                   switch (type) {
         /* Mandate compact following `Ss' and `Sh' starts. */                  case(LIST_bullet):
                           /* FALLTHROUGH */
         for (nn = n; nn && ! comp; nn = nn->parent) {                  case(LIST_dash):
                 if (MDOC_BLOCK != nn->type)                          /* FALLTHROUGH */
                         continue;                  case(LIST_item):
                 if (MDOC_Ss == nn->tok || MDOC_Sh == nn->tok)                          /* FALLTHROUGH */
                         comp = 1;                  case(LIST_hyphen):
                 if (nn->prev)                          /* FALLTHROUGH */
                   case(LIST_enum):
                           return(0);
                   case(LIST_diag):
                           /* FALLTHROUGH */
                   case(LIST_hang):
                           /* FALLTHROUGH */
                   case(LIST_inset):
                           /* FALLTHROUGH */
                   case(LIST_ohang):
                           /* FALLTHROUGH */
                   case(LIST_tag):
                           SCALE_VS_INIT(&su, ! bl->data.Bl->comp);
                           bufcat_su(h, "margin-top", &su);
                           PAIR_STYLE_INIT(&tag[1], h);
                           print_otag(h, TAG_DT, 2, tag);
                         break;                          break;
                   case(LIST_column):
                           break;
                   default:
                           break;
                   }
           } else if (MDOC_BODY == n->type) {
                   switch (type) {
                   case(LIST_bullet):
                           /* FALLTHROUGH */
                   case(LIST_hyphen):
                           /* FALLTHROUGH */
                   case(LIST_dash):
                           /* FALLTHROUGH */
                   case(LIST_enum):
                           /* FALLTHROUGH */
                   case(LIST_item):
                           SCALE_VS_INIT(&su, ! bl->data.Bl->comp);
                           bufcat_su(h, "margin-top", &su);
                           PAIR_STYLE_INIT(&tag[1], h);
                           print_otag(h, TAG_LI, 2, tag);
                           break;
                   case(LIST_diag):
                           /* FALLTHROUGH */
                   case(LIST_hang):
                           /* FALLTHROUGH */
                   case(LIST_inset):
                           /* FALLTHROUGH */
                   case(LIST_ohang):
                           /* FALLTHROUGH */
                   case(LIST_tag):
                           if (NULL == bl->data.Bl->width) {
                                   print_otag(h, TAG_DD, 1, tag);
                                   break;
                           }
                           a2width(bl->data.Bl->width, &su);
                           bufcat_su(h, "margin-left", &su);
                           PAIR_STYLE_INIT(&tag[1], h);
                           print_otag(h, TAG_DD, 2, tag);
                           break;
                   case(LIST_column):
                           SCALE_VS_INIT(&su, ! bl->data.Bl->comp);
                           bufcat_su(h, "margin-top", &su);
                           PAIR_STYLE_INIT(&tag[1], h);
                           print_otag(h, TAG_TD, 2, tag);
                           break;
                   default:
                           break;
                   }
           } else {
                   switch (type) {
                   case (LIST_column):
                           print_otag(h, TAG_TR, 1, tag);
                           break;
                   default:
                           break;
                   }
         }          }
   
         if ( ! comp) {  
                 SCALE_VS_INIT(&su, 1);  
                 bufcat_su(h, "padding-top", &su);  
         }  
   
         PAIR_STYLE_INIT(&tag, h);  
         print_otag(h, TAG_DIV, 1, &tag);  
         return(1);          return(1);
 }  }
   
   
 /* ARGSUSED */  /* ARGSUSED */
 static int  static int
 mdoc_it_body_pre(MDOC_ARGS, enum mdoc_list type, struct roffsu *width)  mdoc_bl_pre(MDOC_ARGS)
 {  {
         struct htmlpair  tag;          size_t           i;
           struct htmlpair  tag[3];
         struct roffsu    su;          struct roffsu    su;
   
         switch (type) {          if (MDOC_BODY == n->type) {
         case (LIST_item):                  if (LIST_column == n->data.Bl->type)
                 /* FALLTHROUGH */                          print_otag(h, TAG_TBODY, 0, NULL);
         case (LIST_ohang):                  return(1);
                 /* FALLTHROUGH */  
         case (LIST_column):  
                 bufcat_su(h, "min-width", width);  
                 bufcat_style(h, "clear", "none");  
                 if (n->next)  
                         bufcat_style(h, "float", "left");  
                 PAIR_STYLE_INIT(&tag, h);  
                 print_otag(h, TAG_DIV, 1, &tag);  
                 break;  
         default:  
                 /*  
                  * XXX: this tricks CSS into aligning the bodies with  
                  * the right-padding in the head.  
                  */  
                 SCALE_HS_INIT(&su, 2);  
                 bufcat_su(h, "margin-left", &su);  
                 PAIR_STYLE_INIT(&tag, h);  
                 print_otag(h, TAG_DIV, 1, &tag);  
                 break;  
         }          }
   
         return(1);          if (MDOC_HEAD == n->type) {
 }                  if (LIST_column != n->data.Bl->type)
                           return(0);
   
                   /*
                    * For each column, print out the <COL> tag with our
                    * suggested width.  The last column gets min-width, as
                    * in terminal mode it auto-sizes to the width of the
                    * screen and we want to preserve that behaviour.
                    */
   
 /* ARGSUSED */                  for (i = 0; i < n->data.Bl->ncols; i++) {
 static int                          a2width(n->data.Bl->cols[i], &su);
 mdoc_it_head_pre(MDOC_ARGS, enum mdoc_list type, struct roffsu *width)                          bufinit(h);
 {                          if (i < n->data.Bl->ncols - 1)
         struct htmlpair  tag;                                  bufcat_su(h, "width", &su);
         struct ord      *ord;                          else
         char             nbuf[BUFSIZ];                                  bufcat_su(h, "min-width", &su);
                           PAIR_STYLE_INIT(&tag[0], h);
                           print_otag(h, TAG_COL, 1, tag);
                   }
   
         switch (type) {  
         case (LIST_item):  
                 return(0);                  return(0);
         case (LIST_ohang):  
                 print_otag(h, TAG_DIV, 0, &tag);  
                 return(1);  
         case (LIST_column):  
                 break;  
         default:  
                 bufcat_su(h, "min-width", width);  
                 SCALE_INVERT(width);  
                 bufcat_su(h, "margin-left", width);  
                 if (n->next && n->next->child)  
                         bufcat_style(h, "float", "left");  
   
                 /* XXX: buffer if we run into body. */  
                 SCALE_HS_INIT(width, 1);  
                 bufcat_su(h, "margin-right", width);  
                 PAIR_STYLE_INIT(&tag, h);  
                 print_otag(h, TAG_DIV, 1, &tag);  
                 break;  
         }          }
   
         switch (type) {          SCALE_VS_INIT(&su, 0);
         case (LIST_diag):          bufcat_su(h, "margin-top", &su);
                 PAIR_CLASS_INIT(&tag, "diag");          bufcat_su(h, "margin-bottom", &su);
                 print_otag(h, TAG_SPAN, 1, &tag);          PAIR_STYLE_INIT(&tag[0], h);
                 break;  
         case (LIST_enum):  
                 ord = h->ords.head;  
                 assert(ord);  
                 nbuf[BUFSIZ - 1] = 0;  
                 (void)snprintf(nbuf, BUFSIZ - 1, "%d.", ord->pos++);  
                 print_text(h, nbuf);  
                 return(0);  
         case (LIST_dash):  
                 print_text(h, "\\(en");  
                 return(0);  
         case (LIST_hyphen):  
                 print_text(h, "\\(hy");  
                 return(0);  
         case (LIST_bullet):  
                 print_text(h, "\\(bu");  
                 return(0);  
         default:  
                 break;  
         }  
   
         return(1);          assert(lists[n->data.Bl->type]);
 }          PAIR_CLASS_INIT(&tag[1], lists[n->data.Bl->type]);
           i = 2;
   
           /* Set the block's left-hand margin. */
   
 static int          if (n->data.Bl->offs) {
 mdoc_it_pre(MDOC_ARGS)                  a2offs(n->data.Bl->offs, &su);
 {                  bufcat_su(h, "margin-left", &su);
         int                      i, comp;                  PAIR_STYLE_INIT(&tag[2], h);
         const struct mdoc_node  *bl, *nn;                  i = 3;
         struct roffsu            width, offs;          }
         enum mdoc_list           type;  
   
         /*          switch (n->data.Bl->type) {
          * XXX: be very careful in changing anything, here.  Lists in          case(LIST_bullet):
          * mandoc have many peculiarities; furthermore, they don't  
          * translate well into HTML and require a bit of mangling.  
          */  
   
         bl = n->parent->parent;  
         if (MDOC_BLOCK != n->type)  
                 bl = bl->parent;  
   
         SCALE_HS_INIT(&offs, 0);  
   
         assert(bl->data.Bl);  
         type = bl->data.Bl->type;  
         comp = bl->data.Bl->comp;  
   
         if (bl->data.Bl->offs)  
                 a2offs(bl->data.Bl->offs, &offs);  
   
         switch (type) {  
         case (LIST_enum):  
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (LIST_dash):          case(LIST_dash):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (LIST_hyphen):          case(LIST_hyphen):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (LIST_bullet):          case(LIST_item):
                 SCALE_HS_INIT(&width, 2);                  print_otag(h, TAG_UL, i, tag);
                 break;                  break;
         default:          case(LIST_enum):
                 SCALE_HS_INIT(&width, INDENT);                  print_otag(h, TAG_OL, i, tag);
                 break;                  break;
         }          case(LIST_diag):
   
         if (bl->data.Bl->width)  
                 a2width(bl->data.Bl->width, &width);  
   
         /* Override width in some cases. */  
   
         switch (type) {  
         case (LIST_ohang):  
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (LIST_item):          case(LIST_hang):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (LIST_inset):          case(LIST_inset):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (LIST_diag):          case(LIST_ohang):
                 SCALE_HS_INIT(&width, 0);                  /* FALLTHROUGH */
           case(LIST_tag):
                   print_otag(h, TAG_DL, i, tag);
                 break;                  break;
         default:          case(LIST_column):
                 if (0 == width.scale)                  print_otag(h, TAG_TABLE, i, tag);
                         SCALE_HS_INIT(&width, INDENT);  
                 break;                  break;
           default:
                   abort();
                   /* NOTREACHED */
         }          }
   
         if (LIST_column == type && MDOC_BODY == n->type) {  
                 nn = n->parent->child;  
                 for (i = 0; nn && nn != n; nn = nn->next)  
                         if (MDOC_BODY == nn->type)  
                                 i++;  
                 if (i < (int)bl->data.Bl->ncols)  
                         a2width(bl->data.Bl->cols[i], &width);  
         }  
   
         if (MDOC_HEAD == n->type)  
                 return(mdoc_it_head_pre(m, n, h, type, &width));  
         else if (MDOC_BODY == n->type)  
                 return(mdoc_it_body_pre(m, n, h, type, &width));  
   
         return(mdoc_it_block_pre(m, n, h, type, comp, &offs, &width));  
 }  
   
   
 /* ARGSUSED */  
 static int  
 mdoc_bl_pre(MDOC_ARGS)  
 {  
         struct ord      *ord;  
   
         if (MDOC_HEAD == n->type)  
                 return(0);  
         if (MDOC_BLOCK != n->type)  
                 return(1);  
         assert(n->data.Bl);  
         if (LIST_enum != n->data.Bl->type)  
                 return(1);  
   
         ord = malloc(sizeof(struct ord));  
         if (NULL == ord) {  
                 perror(NULL);  
                 exit((int)MANDOCLEVEL_SYSERR);  
         }  
         ord->cookie = n;  
         ord->pos = 1;  
         ord->next = h->ords.head;  
         h->ords.head = ord;  
         return(1);          return(1);
 }  }
   
   
 /* ARGSUSED */  /* ARGSUSED */
 static void  
 mdoc_bl_post(MDOC_ARGS)  
 {  
         struct ord      *ord;  
   
         if (MDOC_BLOCK != n->type)  
                 return;  
         if (LIST_enum != n->data.Bl->type)  
                 return;  
   
         ord = h->ords.head;  
         assert(ord);  
         h->ords.head = ord->next;  
         free(ord);  
 }  
   
   
 /* ARGSUSED */  
 static int  static int
 mdoc_ex_pre(MDOC_ARGS)  mdoc_ex_pre(MDOC_ARGS)
 {  {
Line 1226  mdoc_d1_pre(MDOC_ARGS)
Line 1093  mdoc_d1_pre(MDOC_ARGS)
         if (MDOC_BLOCK != n->type)          if (MDOC_BLOCK != n->type)
                 return(1);                  return(1);
   
         /* FIXME: D1 shouldn't be literal. */          SCALE_VS_INIT(&su, 0);
           bufcat_su(h, "margin-top", &su);
           bufcat_su(h, "margin-bottom", &su);
           PAIR_STYLE_INIT(&tag[0], h);
           print_otag(h, TAG_BLOCKQUOTE, 1, tag);
   
         SCALE_VS_INIT(&su, INDENT - 2);          /* BLOCKQUOTE needs a block body. */
         bufcat_su(h, "margin-left", &su);  
         PAIR_CLASS_INIT(&tag[0], "lit");          if (MDOC_Dl == n->tok) {
         PAIR_STYLE_INIT(&tag[1], h);                  PAIR_CLASS_INIT(&tag[1], "lit");
         print_otag(h, TAG_DIV, 2, tag);                  print_otag(h, TAG_DIV, 1, tag);
           } else
                   print_otag(h, TAG_DIV, 0, tag);
   
         return(1);          return(1);
 }  }
   
Line 1331  mdoc_bd_pre(MDOC_ARGS)
Line 1205  mdoc_bd_pre(MDOC_ARGS)
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (MDOC_Bl):                  case (MDOC_Bl):
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                   case (MDOC_D1):
                           /* FALLTHROUGH */
                   case (MDOC_Dl):
                           /* FALLTHROUGH */
                 case (MDOC_Lp):                  case (MDOC_Lp):
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (MDOC_Pp):                  case (MDOC_Pp):
Line 1623  mdoc_sm_pre(MDOC_ARGS)
Line 1501  mdoc_sm_pre(MDOC_ARGS)
         return(0);          return(0);
 }  }
   
   /* ARGSUSED */
   static int
   mdoc_pp_pre(MDOC_ARGS)
   {
   
           print_otag(h, TAG_P, 0, NULL);
           return(0);
   
   }
   
 /* ARGSUSED */  /* ARGSUSED */
 static int  static int
 mdoc_sp_pre(MDOC_ARGS)  mdoc_sp_pre(MDOC_ARGS)
 {  {
         int              len;  
         struct htmlpair  tag;  
         struct roffsu    su;          struct roffsu    su;
           struct htmlpair  tag;
   
         switch (n->tok) {          SCALE_VS_INIT(&su, 1);
         case (MDOC_sp):  
                 /* FIXME: can this have a scaling indicator? */  
                 len = n->child ? atoi(n->child->string) : 1;  
                 break;  
         case (MDOC_br):  
                 len = 0;  
                 break;  
         default:  
                 assert(n->parent);  
                 if ((NULL == n->next || NULL == n->prev) &&  
                                 (MDOC_Ss == n->parent->tok ||  
                                  MDOC_Sh == n->parent->tok))  
                         return(0);  
                 len = 1;  
                 break;  
         }  
   
         SCALE_VS_INIT(&su, len);          if (MDOC_sp == n->tok) {
                   if (n->child)
                           a2roffsu(n->child->string, &su, SCALE_VS);
           } else
                   su.scale = 0;
   
         bufcat_su(h, "height", &su);          bufcat_su(h, "height", &su);
         PAIR_STYLE_INIT(&tag, h);          PAIR_STYLE_INIT(&tag, h);
         print_otag(h, TAG_DIV, 1, &tag);          print_otag(h, TAG_DIV, 1, &tag);
   
         /* So the div isn't empty: */          /* So the div isn't empty: */
         print_text(h, "\\~");          print_text(h, "\\~");
   
Line 1661  mdoc_sp_pre(MDOC_ARGS)
Line 1537  mdoc_sp_pre(MDOC_ARGS)
   
 }  }
   
   
 /* ARGSUSED */  /* ARGSUSED */
 static int  static int
 mdoc_lk_pre(MDOC_ARGS)  mdoc_lk_pre(MDOC_ARGS)
Line 1675  mdoc_lk_pre(MDOC_ARGS)
Line 1550  mdoc_lk_pre(MDOC_ARGS)
         PAIR_HREF_INIT(&tag[1], nn->string);          PAIR_HREF_INIT(&tag[1], nn->string);
         print_otag(h, TAG_A, 2, tag);          print_otag(h, TAG_A, 2, tag);
   
         if (NULL == nn->next)          if (NULL == nn || NULL == nn->next)
                 return(1);                  return(1);
   
         for (nn = nn->next; nn; nn = nn->next)          for (nn = nn->next; nn; nn = nn->next)
Line 1948  mdoc_rs_pre(MDOC_ARGS)
Line 1823  mdoc_rs_pre(MDOC_ARGS)
         if (MDOC_BLOCK != n->type)          if (MDOC_BLOCK != n->type)
                 return(1);                  return(1);
   
         if (n->prev && SEC_SEE_ALSO == n->sec) {          if (n->prev && SEC_SEE_ALSO == n->sec)
                 print_otag(h, TAG_BR, 0, NULL);                  print_otag(h, TAG_P, 0, NULL);
                 print_otag(h, TAG_BR, 0, NULL);  
         }  
   
         PAIR_CLASS_INIT(&tag, "ref");          PAIR_CLASS_INIT(&tag, "ref");
         print_otag(h, TAG_SPAN, 1, &tag);          print_otag(h, TAG_SPAN, 1, &tag);

Legend:
Removed from v.1.111  
changed lines
  Added in v.1.123

CVSweb