[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.23 and 1.27

version 1.23, 2009/10/07 12:35:24 version 1.27, 2009/10/08 23:00:15
Line 49  static void    print_mdoc_nodelist(MDOC_ARGS);
Line 49  static void    print_mdoc_nodelist(MDOC_ARGS);
   
 static  void              a2width(const char *, struct roffsu *);  static  void              a2width(const char *, struct roffsu *);
 static  void              a2offs(const char *, struct roffsu *);  static  void              a2offs(const char *, struct roffsu *);
   
 static  int               a2list(const struct mdoc_node *);  static  int               a2list(const struct mdoc_node *);
   
 static  void              mdoc_root_post(MDOC_ARGS);  static  void              mdoc_root_post(MDOC_ARGS);
 static  int               mdoc_root_pre(MDOC_ARGS);  static  int               mdoc_root_pre(MDOC_ARGS);
 static  int               mdoc_it_block_pre(MDOC_ARGS, int,  
                                 struct roffsu *, int,  
                                 struct roffsu *);  
 static  int               mdoc_it_head_pre(MDOC_ARGS, int,  
                                 struct roffsu *);  
 static  int               mdoc_it_body_pre(MDOC_ARGS, int);  
   
 static  void              mdoc__x_post(MDOC_ARGS);  static  void              mdoc__x_post(MDOC_ARGS);
 static  int               mdoc__x_pre(MDOC_ARGS);  static  int               mdoc__x_pre(MDOC_ARGS);
Line 96  static void    mdoc_fo_post(MDOC_ARGS);
Line 91  static void    mdoc_fo_post(MDOC_ARGS);
 static  int               mdoc_fo_pre(MDOC_ARGS);  static  int               mdoc_fo_pre(MDOC_ARGS);
 static  int               mdoc_ic_pre(MDOC_ARGS);  static  int               mdoc_ic_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, int, int,
                                   struct roffsu *, struct roffsu *);
   static  int               mdoc_it_head_pre(MDOC_ARGS, int,
                                   struct roffsu *);
   static  int               mdoc_it_body_pre(MDOC_ARGS, int);
 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 326  static void
Line 326  static void
 a2width(const char *p, struct roffsu *su)  a2width(const char *p, struct roffsu *su)
 {  {
   
         if ( ! a2roffsu(p, su))          if (a2roffsu(p, su))
                 SCALE_HS_INIT(su, (int)strlen(p));                  return;
           su->unit = SCALE_EM;
           su->scale = (int)strlen(p);
 }  }
   
   
Line 346  a2offs(const char *p, struct roffsu *su)
Line 348  a2offs(const char *p, struct roffsu *su)
                 SCALE_HS_INIT(su, INDENT);                  SCALE_HS_INIT(su, INDENT);
         else if (0 == strcmp(p, "indent-two"))          else if (0 == strcmp(p, "indent-two"))
                 SCALE_HS_INIT(su, INDENT * 2);                  SCALE_HS_INIT(su, INDENT * 2);
         else if ( ! a2roffsu(p, su))          else if ( ! a2roffsu(p, su)) {
                 SCALE_HS_INIT(su, (int)strlen(p));                  su->unit = SCALE_EM;
                   su->scale = (int)strlen(p);
           }
 }  }
   
   
Line 548  mdoc_sh_pre(MDOC_ARGS)
Line 552  mdoc_sh_pre(MDOC_ARGS)
 {  {
         struct htmlpair          tag[2];          struct htmlpair          tag[2];
         const struct mdoc_node  *nn;          const struct mdoc_node  *nn;
         char                     link[BUFSIZ];          char                     lbuf[BUFSIZ];
         struct roffsu            su;          struct roffsu            su;
   
         if (MDOC_BODY == n->type) {          if (MDOC_BODY == n->type) {
Line 575  mdoc_sh_pre(MDOC_ARGS)
Line 579  mdoc_sh_pre(MDOC_ARGS)
                 return(1);                  return(1);
         }          }
   
         link[0] = 0;          lbuf[0] = 0;
         for (nn = n->child; nn; nn = nn->next) {          for (nn = n->child; nn; nn = nn->next) {
                 (void)strlcat(link, nn->string, BUFSIZ);                  (void)strlcat(lbuf, nn->string, BUFSIZ);
                 if (nn->next)                  if (nn->next)
                         (void)strlcat(link, "_", BUFSIZ);                          (void)strlcat(lbuf, "_", BUFSIZ);
         }          }
   
         /*          /*
Line 589  mdoc_sh_pre(MDOC_ARGS)
Line 593  mdoc_sh_pre(MDOC_ARGS)
   
         PAIR_CLASS_INIT(&tag[0], "sec-head");          PAIR_CLASS_INIT(&tag[0], "sec-head");
         tag[1].key = ATTR_ID;          tag[1].key = ATTR_ID;
         tag[1].val = link;          tag[1].val = lbuf;
         print_otag(h, TAG_DIV, 2, tag);          print_otag(h, TAG_DIV, 2, tag);
         return(1);          return(1);
 }  }
Line 601  mdoc_ss_pre(MDOC_ARGS)
Line 605  mdoc_ss_pre(MDOC_ARGS)
 {  {
         struct htmlpair          tag[3];          struct htmlpair          tag[3];
         const struct mdoc_node  *nn;          const struct mdoc_node  *nn;
         char                     link[BUFSIZ];          char                     lbuf[BUFSIZ];
         struct roffsu            su;          struct roffsu            su;
   
         SCALE_VS_INIT(&su, 1);          SCALE_VS_INIT(&su, 1);
Line 628  mdoc_ss_pre(MDOC_ARGS)
Line 632  mdoc_ss_pre(MDOC_ARGS)
   
         /* TODO: see note in mdoc_sh_pre() about duplicates. */          /* TODO: see note in mdoc_sh_pre() about duplicates. */
   
         link[0] = 0;          lbuf[0] = 0;
         for (nn = n->child; nn; nn = nn->next) {          for (nn = n->child; nn; nn = nn->next) {
                 (void)strlcat(link, nn->string, BUFSIZ);                  (void)strlcat(lbuf, nn->string, BUFSIZ);
                 if (nn->next)                  if (nn->next)
                         (void)strlcat(link, "_", BUFSIZ);                          (void)strlcat(lbuf, "_", BUFSIZ);
         }          }
   
         SCALE_HS_INIT(&su, INDENT - HALFINDENT);          SCALE_HS_INIT(&su, INDENT - HALFINDENT);
Line 642  mdoc_ss_pre(MDOC_ARGS)
Line 646  mdoc_ss_pre(MDOC_ARGS)
         PAIR_CLASS_INIT(&tag[0], "ssec-head");          PAIR_CLASS_INIT(&tag[0], "ssec-head");
         PAIR_STYLE_INIT(&tag[1], h);          PAIR_STYLE_INIT(&tag[1], h);
         tag[2].key = ATTR_ID;          tag[2].key = ATTR_ID;
         tag[2].val = link;          tag[2].val = lbuf;
         print_otag(h, TAG_DIV, 3, tag);          print_otag(h, TAG_DIV, 3, tag);
         return(1);          return(1);
 }  }
Line 673  mdoc_nd_pre(MDOC_ARGS)
Line 677  mdoc_nd_pre(MDOC_ARGS)
         if (MDOC_BODY != n->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
   
         /* XXX - this can contain block elements! */          /* XXX: this tag in theory can contain block elements. */
   
         print_text(h, "\\(em");          print_text(h, "\\(em");
         PAIR_CLASS_INIT(&tag, "desc-body");          PAIR_CLASS_INIT(&tag, "desc-body");
         print_otag(h, TAG_SPAN, 1, &tag);          print_otag(h, TAG_SPAN, 1, &tag);
Line 690  mdoc_op_pre(MDOC_ARGS)
Line 695  mdoc_op_pre(MDOC_ARGS)
         if (MDOC_BODY != n->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
   
         /* XXX - this can contain block elements! */          /* XXX: this tag in theory can contain block elements. */
   
         print_text(h, "\\(lB");          print_text(h, "\\(lB");
         h->flags |= HTML_NOSPACE;          h->flags |= HTML_NOSPACE;
         PAIR_CLASS_INIT(&tag, "opt");          PAIR_CLASS_INIT(&tag, "opt");
Line 849  mdoc_bx_pre(MDOC_ARGS)
Line 855  mdoc_bx_pre(MDOC_ARGS)
   
 /* ARGSUSED */  /* ARGSUSED */
 static int  static int
 mdoc_it_block_pre(MDOC_ARGS, int type, struct roffsu *offs,  mdoc_it_block_pre(MDOC_ARGS, int type, int comp,
                 int comp, struct roffsu *width)                  struct roffsu *offs, struct roffsu *width)
 {  {
         struct htmlpair          tag;          struct htmlpair          tag;
         const struct mdoc_node  *nn;          const struct mdoc_node  *nn;
Line 859  mdoc_it_block_pre(MDOC_ARGS, int type, struct roffsu *
Line 865  mdoc_it_block_pre(MDOC_ARGS, int type, struct roffsu *
         nn = n->parent->parent;          nn = n->parent->parent;
         assert(nn->args);          assert(nn->args);
   
         if (MDOC_Column == type)          /* XXX: see notes in mdoc_it_pre(). */
                 comp = 0;  
           if (MDOC_Column == type) {
                   /* Don't width-pad on the left. */
                   SCALE_HS_INIT(width, 0);
                   /* Also disallow non-compact. */
                   comp = 1;
           }
         if (MDOC_Diag == type)          if (MDOC_Diag == type)
                   /* Mandate non-compact with empty prior. */
                 if (n->prev && NULL == n->prev->body->child)                  if (n->prev && NULL == n->prev->body->child)
                         comp = 1;                          comp = 1;
   
           bufcat_style(h, "clear", "both");
         if (offs->scale > 0)          if (offs->scale > 0)
                 bufcat_su(h, "margin-left", offs);                  bufcat_su(h, "margin-left", offs);
         if (width->scale > 0)          if (width->scale > 0)
Line 872  mdoc_it_block_pre(MDOC_ARGS, int type, struct roffsu *
Line 886  mdoc_it_block_pre(MDOC_ARGS, int type, struct roffsu *
   
         PAIR_STYLE_INIT(&tag, h);          PAIR_STYLE_INIT(&tag, h);
   
           /* Mandate compact following `Ss' and `Sh' starts. */
   
         for (nn = n; nn && ! comp; nn = nn->parent) {          for (nn = n; nn && ! comp; nn = nn->parent) {
                 if (MDOC_BLOCK != nn->type)                  if (MDOC_BLOCK != nn->type)
                         continue;                          continue;
Line 892  mdoc_it_block_pre(MDOC_ARGS, int type, struct roffsu *
Line 908  mdoc_it_block_pre(MDOC_ARGS, int type, struct roffsu *
 }  }
   
   
   /* ARGSUSED */
 static int  static int
 mdoc_it_body_pre(MDOC_ARGS, int type)  mdoc_it_body_pre(MDOC_ARGS, int type)
 {  {
Line 906  mdoc_it_body_pre(MDOC_ARGS, int type)
Line 923  mdoc_it_body_pre(MDOC_ARGS, int type)
         case (MDOC_Column):          case (MDOC_Column):
                 break;                  break;
         default:          default:
                   /*
                    * XXX: this tricks CSS into aligning the bodies with
                    * the right-padding in the head.
                    */
                 SCALE_HS_INIT(&su, 2);                  SCALE_HS_INIT(&su, 2);
                 bufcat_su(h, "margin-left", &su);                  bufcat_su(h, "margin-left", &su);
                 PAIR_STYLE_INIT(&tag, h);                  PAIR_STYLE_INIT(&tag, h);
Line 917  mdoc_it_body_pre(MDOC_ARGS, int type)
Line 938  mdoc_it_body_pre(MDOC_ARGS, int type)
 }  }
   
   
   /* ARGSUSED */
 static int  static int
 mdoc_it_head_pre(MDOC_ARGS, int type, struct roffsu *width)  mdoc_it_head_pre(MDOC_ARGS, int type, struct roffsu *width)
 {  {
Line 944  mdoc_it_head_pre(MDOC_ARGS, int type, struct roffsu *w
Line 966  mdoc_it_head_pre(MDOC_ARGS, int type, struct roffsu *w
                 bufcat_su(h, "margin-left", width);                  bufcat_su(h, "margin-left", width);
                 if (n->next && n->next->child)                  if (n->next && n->next->child)
                         bufcat_style(h, "float", "left");                          bufcat_style(h, "float", "left");
   
                   /* XXX: buffer if we run into body. */
                 SCALE_HS_INIT(width, 1);                  SCALE_HS_INIT(width, 1);
                 bufcat_su(h, "margin-right", width);                  bufcat_su(h, "margin-right", width);
                 PAIR_STYLE_INIT(&tag, h);                  PAIR_STYLE_INIT(&tag, h);
Line 987  mdoc_it_pre(MDOC_ARGS)
Line 1011  mdoc_it_pre(MDOC_ARGS)
         const struct mdoc_node  *bl, *nn;          const struct mdoc_node  *bl, *nn;
         struct roffsu            width, offs;          struct roffsu            width, offs;
   
         /* This is the `Bl' block parent. */          /*
            * 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;          bl = n->parent->parent;
         if (MDOC_BLOCK != n->type)          if (MDOC_BLOCK != n->type)
Line 997  mdoc_it_pre(MDOC_ARGS)
Line 1025  mdoc_it_pre(MDOC_ARGS)
   
         /* Set default width and offset. */          /* Set default width and offset. */
   
           SCALE_HS_INIT(&offs, 0);
   
         switch (type) {          switch (type) {
         case (MDOC_Enum):          case (MDOC_Enum):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
Line 1012  mdoc_it_pre(MDOC_ARGS)
Line 1042  mdoc_it_pre(MDOC_ARGS)
                 break;                  break;
         }          }
   
         SCALE_HS_INIT(&offs, 0);  
   
         /* Get width, offset, and compact arguments. */          /* Get width, offset, and compact arguments. */
   
         for (wp = -1, comp = i = 0; i < (int)bl->args->argc; i++)          for (wp = -1, comp = i = 0; i < (int)bl->args->argc; i++)
                 switch (bl->args->argv[i].arg) {                  switch (bl->args->argv[i].arg) {
                   case (MDOC_Column):
                           wp = i; /* Save for later. */
                           break;
                 case (MDOC_Width):                  case (MDOC_Width):
                         wp = i; /* Save offset. */  
                         a2width(bl->args->argv[i].value[0], &width);                          a2width(bl->args->argv[i].value[0], &width);
                         break;                          break;
                 case (MDOC_Offset):                  case (MDOC_Offset):
Line 1051  mdoc_it_pre(MDOC_ARGS)
Line 1081  mdoc_it_pre(MDOC_ARGS)
         if (MDOC_BODY == n->type)          if (MDOC_BODY == n->type)
                 return(mdoc_it_body_pre(m, n, h, type));                  return(mdoc_it_body_pre(m, n, h, type));
         if (MDOC_BLOCK == n->type)          if (MDOC_BLOCK == n->type)
                 return(mdoc_it_block_pre(m, n, h, type,                  return(mdoc_it_block_pre(m, n, h, type, comp,
                                         &offs, comp, &width));                                          &offs, &width));
   
         /* Override column widths. */          /* Override column widths. */
   
Line 1060  mdoc_it_pre(MDOC_ARGS)
Line 1090  mdoc_it_pre(MDOC_ARGS)
                 nn = n->parent->child;                  nn = n->parent->child;
                 for (i = 0; nn && nn != n; nn = nn->next, i++)                  for (i = 0; nn && nn != n; nn = nn->next, i++)
                         /* Counter... */ ;                          /* Counter... */ ;
                 if (wp >= 0 && i < (int)bl->args[wp].argv->sz)                  if (i < (int)bl->args->argv[wp].sz)
                         a2width(bl->args->argv[wp].value[i], &width);                          a2width(bl->args->argv[wp].value[i], &width);
         }          }
   
Line 1254  mdoc_sx_pre(MDOC_ARGS)
Line 1284  mdoc_sx_pre(MDOC_ARGS)
 {  {
         struct htmlpair          tag[2];          struct htmlpair          tag[2];
         const struct mdoc_node  *nn;          const struct mdoc_node  *nn;
         char                     link[BUFSIZ];          char                     lbuf[BUFSIZ];
   
         /* FIXME: duplicates? */          /* FIXME: duplicates? */
   
         (void)strlcpy(link, "#", BUFSIZ);          (void)strlcpy(lbuf, "#", BUFSIZ);
         for (nn = n->child; nn; nn = nn->next) {          for (nn = n->child; nn; nn = nn->next) {
                 (void)strlcat(link, nn->string, BUFSIZ);                  (void)strlcat(lbuf, nn->string, BUFSIZ);
                 if (nn->next)                  if (nn->next)
                         (void)strlcat(link, "_", BUFSIZ);                          (void)strlcat(lbuf, "_", BUFSIZ);
         }          }
   
         PAIR_CLASS_INIT(&tag[0], "link-sec");          PAIR_CLASS_INIT(&tag[0], "link-sec");
         tag[1].key = ATTR_HREF;          tag[1].key = ATTR_HREF;
         tag[1].val = link;          tag[1].val = lbuf;
   
         print_otag(h, TAG_A, 2, tag);          print_otag(h, TAG_A, 2, tag);
         return(1);          return(1);
Line 1315  mdoc_bd_pre(MDOC_ARGS)
Line 1345  mdoc_bd_pre(MDOC_ARGS)
         else          else
                 bl = n->parent;                  bl = n->parent;
   
           SCALE_VS_INIT(&su, 0);
   
         type = comp = 0;          type = comp = 0;
         for (i = 0; i < (int)bl->args->argc; i++)          for (i = 0; i < (int)bl->args->argc; i++)
                 switch (bl->args->argv[i].arg) {                  switch (bl->args->argv[i].arg) {
                 case (MDOC_Offset):                  case (MDOC_Offset):
                         a2offs(bl->args->argv[i].value[0], &su);                          a2offs(bl->args->argv[i].value[0], &su);
                         bufcat_su(h, "margin-left", &su);  
                         break;                          break;
                 case (MDOC_Compact):                  case (MDOC_Compact):
                         comp = 1;                          comp = 1;
Line 1337  mdoc_bd_pre(MDOC_ARGS)
Line 1368  mdoc_bd_pre(MDOC_ARGS)
                 }                  }
   
         if (MDOC_BLOCK == n->type) {          if (MDOC_BLOCK == n->type) {
                   bufcat_su(h, "margin-left", &su);
                 for (nn = n; nn && ! comp; nn = nn->parent) {                  for (nn = n; nn && ! comp; nn = nn->parent) {
                         if (MDOC_BLOCK != nn->type)                          if (MDOC_BLOCK != nn->type)
                                 continue;                                  continue;
Line 1592  mdoc_fn_pre(MDOC_ARGS)
Line 1624  mdoc_fn_pre(MDOC_ARGS)
         assert(n->child->string);          assert(n->child->string);
         sp = n->child->string;          sp = n->child->string;
   
         if ((ep = strchr(sp, ' '))) {          ep = strchr(sp, ' ');
           if (NULL != ep) {
                 PAIR_CLASS_INIT(&tag[0], "ftype");                  PAIR_CLASS_INIT(&tag[0], "ftype");
                 t = print_otag(h, TAG_SPAN, 1, tag);                  t = print_otag(h, TAG_SPAN, 1, tag);
   

Legend:
Removed from v.1.23  
changed lines
  Added in v.1.27

CVSweb