[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.117

version 1.111, 2010/10/10 09:59:48 version 1.117, 2010/12/15 15:59:23
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 138  static const struct htmlmdoc mdocs[MDOC_MAX] = {
Line 131  static const struct htmlmdoc mdocs[MDOC_MAX] = {
         {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 251  static const struct htmlmdoc mdocs[MDOC_MAX] = {
Line 244  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 369  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);
Line 370  print_mdoc(MDOC_ARGS)
Line 376  print_mdoc(MDOC_ARGS)
   
         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 843  mdoc_xx_pre(MDOC_ARGS)
Line 845  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 893  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);          SCALE_VS_INIT(&su, ! bl->data.Bl->comp);
           bufcat_su(h, "margin-top", &su);
           PAIR_STYLE_INIT(&tag[1], h);
   
         /* Mandate compact following `Ss' and `Sh' starts. */          if (MDOC_HEAD == n->type) {
                   switch (type) {
         for (nn = n; nn && ! comp; nn = nn->parent) {                  case(LIST_bullet):
                 if (MDOC_BLOCK != nn->type)                          /* FALLTHROUGH */
                         continue;                  case(LIST_dash):
                 if (MDOC_Ss == nn->tok || MDOC_Sh == nn->tok)                          /* FALLTHROUGH */
                         comp = 1;                  case(LIST_item):
                 if (nn->prev)                          /* FALLTHROUGH */
                   case(LIST_hyphen):
                           /* 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):
                           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):
                           /* FALLTHROUGH */
                           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):
                           print_otag(h, TAG_DD, 1, tag);
                           break;
                   case(LIST_column):
                           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[2];
         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) {          assert(lists[n->data.Bl->type]);
         case (LIST_diag):          PAIR_CLASS_INIT(&tag[0], lists[n->data.Bl->type]);
                 PAIR_CLASS_INIT(&tag, "diag");          i = 1;
                 print_otag(h, TAG_SPAN, 1, &tag);  
                 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);          /* Set the block's left-hand margin. */
 }  
   
           if (n->data.Bl->offs) {
                   a2offs(n->data.Bl->offs, &su);
                   bufcat_su(h, "margin-left", &su);
                   PAIR_STYLE_INIT(&tag[1], h);
                   i = 2;
           }
   
 static int          switch (n->data.Bl->type) {
 mdoc_it_pre(MDOC_ARGS)          case(LIST_bullet):
 {  
         int                      i, comp;  
         const struct mdoc_node  *bl, *nn;  
         struct roffsu            width, offs;  
         enum mdoc_list           type;  
   
         /*  
          * XXX: be very careful in changing anything, here.  Lists in  
          * 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 1331  mdoc_bd_pre(MDOC_ARGS)
Line 1238  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 1675  mdoc_lk_pre(MDOC_ARGS)
Line 1586  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)

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

CVSweb