[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.16 and 1.19

version 1.16, 2009/10/03 15:08:09 version 1.19, 2009/10/03 19:02:45
Line 21 
Line 21 
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
 #include <err.h>  #include <err.h>
 #include <stdarg.h>  
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
Line 54  static int    a2width(const char *);
Line 53  static int    a2width(const char *);
 static  int               a2offs(const char *);  static  int               a2offs(const char *);
 static  int               a2list(const struct mdoc_node *);  static  int               a2list(const struct mdoc_node *);
   
 static  void              buffmt_man(struct html *,  
                                 const char *, const char *);  
 static  void              buffmt(struct html *, const char *, ...);  
 static  void              bufcat(struct html *, const char *);  
 static  void              bufncat(struct html *, const char *, size_t);  
   
   
 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_tbl_pre(MDOC_ARGS, int);  static  int               mdoc_tbl_pre(MDOC_ARGS, int);
Line 281  html_mdoc(void *arg, const struct mdoc *m)
Line 273  html_mdoc(void *arg, const struct mdoc *m)
 }  }
   
   
 static void  
 bufinit(struct html *h)  
 {  
   
         h->buf[0] = '\0';  
         h->buflen = 0;  
 }  
   
   
 static void  
 bufcat(struct html *h, const char *p)  
 {  
   
         bufncat(h, p, strlen(p));  
 }  
   
   
 static void  
 buffmt(struct html *h, const char *fmt, ...)  
 {  
         va_list          ap;  
   
         va_start(ap, fmt);  
         (void)vsnprintf(h->buf + h->buflen,  
                         BUFSIZ - h->buflen - 1, fmt, ap);  
         va_end(ap);  
         h->buflen = strlen(h->buf);  
         assert('\0' == h->buf[h->buflen]);  
 }  
   
   
 static void  
 bufncat(struct html *h, const char *p, size_t sz)  
 {  
   
         if (h->buflen + sz > BUFSIZ - 1)  
                 sz = BUFSIZ - 1 - h->buflen;  
   
         (void)strncat(h->buf, p, sz);  
         h->buflen += sz;  
         assert('\0' == h->buf[h->buflen]);  
 }  
   
   
 static void  
 buffmt_man(struct html *h,  
                 const char *name, const char *sec)  
 {  
         const char      *p, *pp;  
   
         pp = h->base_man;  
   
         /* FIXME: URL-encode contents. */  
   
         while ((p = strchr(pp, '%'))) {  
                 bufncat(h, pp, p - pp);  
                 switch (*(p + 1)) {  
                 case('S'):  
                         bufcat(h, sec);  
                         break;  
                 case('N'):  
                         buffmt(h, name ? name : "1");  
                         break;  
                 default:  
                         bufncat(h, p, 2);  
                         break;  
                 }  
                 pp = p + 2;  
         }  
         if (pp)  
                 bufcat(h, pp);  
 }  
   
   
 static int  static int
 a2list(const struct mdoc_node *n)  a2list(const struct mdoc_node *n)
 {  {
Line 829  mdoc_xr_pre(MDOC_ARGS)
Line 747  mdoc_xr_pre(MDOC_ARGS)
 {  {
         struct htmlpair          tag[2];          struct htmlpair          tag[2];
         const struct mdoc_node  *nn;          const struct mdoc_node  *nn;
           int                      i;
   
         buffmt_man(h, n->child->string,          i = 0;
                         n->child->next ?          tag[i].key = ATTR_CLASS;
                         n->child->next->string : NULL);          tag[i++].val = "link-man";
   
         tag[0].key = ATTR_CLASS;          if (h->base_man) {
         tag[0].val = "link-man";                  buffmt_man(h, n->child->string, n->child->next ?
         tag[1].key = ATTR_HREF;                                  n->child->next->string : NULL);
         tag[1].val = h->buf;                  tag[i].key = ATTR_HREF;
         print_otag(h, TAG_A, 2, tag);                  tag[i++].val = h->buf;
           }
   
           print_otag(h, TAG_A, i, tag);
   
         nn = n->child;          nn = n->child;
         print_text(h, nn->string);          print_text(h, nn->string);
   
Line 1516  mdoc_an_pre(MDOC_ARGS)
Line 1438  mdoc_an_pre(MDOC_ARGS)
 {  {
         struct htmlpair tag;          struct htmlpair tag;
   
           /* TODO: -split and -nosplit (see termp_an_pre()). */
   
         tag.key = ATTR_CLASS;          tag.key = ATTR_CLASS;
         tag.val = "author";          tag.val = "author";
         print_otag(h, TAG_SPAN, 1, &tag);          print_otag(h, TAG_SPAN, 1, &tag);
Line 1694  mdoc_fn_pre(MDOC_ARGS)
Line 1618  mdoc_fn_pre(MDOC_ARGS)
         }          }
   
         /* Split apart into type and name. */          /* Split apart into type and name. */
   
         tag[0].key = ATTR_CLASS;  
         tag[0].val = "ftype";  
         t = print_otag(h, TAG_SPAN, 1, tag);  
   
         assert(n->child->string);          assert(n->child->string);
         sp = n->child->string;          sp = n->child->string;
         while (NULL != (ep = strchr(sp, ' '))) {  
                 sz = MIN((int)(ep - sp), BUFSIZ - 1);          if ((ep = strchr(sp, ' '))) {
                 (void)memcpy(nbuf, sp, (size_t)sz);                  tag[0].key = ATTR_CLASS;
                 nbuf[sz] = '\0';                  tag[0].val = "ftype";
                 print_text(h, nbuf);  
                 sp = ++ep;                  t = print_otag(h, TAG_SPAN, 1, tag);
   
                   while (ep) {
                           sz = MIN((int)(ep - sp), BUFSIZ - 1);
                           (void)memcpy(nbuf, sp, (size_t)sz);
                           nbuf[sz] = '\0';
                           print_text(h, nbuf);
                           sp = ++ep;
                           ep = strchr(sp, ' ');
                   }
                   print_tagq(h, t);
         }          }
   
         print_tagq(h, t);  
   
         tag[0].key = ATTR_CLASS;          tag[0].key = ATTR_CLASS;
         tag[0].val = "fname";          tag[0].val = "fname";
         t = print_otag(h, TAG_SPAN, 1, tag);          t = print_otag(h, TAG_SPAN, 1, tag);
Line 1896  static int
Line 1823  static int
 mdoc_in_pre(MDOC_ARGS)  mdoc_in_pre(MDOC_ARGS)
 {  {
         const struct mdoc_node  *nn;          const struct mdoc_node  *nn;
         struct htmlpair          tag;          struct htmlpair          tag[2];
           struct tag              *t;
           int                      i;
   
         if (SEC_SYNOPSIS == n->sec) {          if (SEC_SYNOPSIS == n->sec) {
                 if (n->next && MDOC_In != n->next->tok) {                  if (n->next && MDOC_In != n->next->tok) {
                         tag.key = ATTR_STYLE;                          tag[0].key = ATTR_STYLE;
                         tag.val = "margin-bottom: 1em;";                          tag[0].val = "margin-bottom: 1em;";
                         print_otag(h, TAG_DIV, 1, &tag);                          print_otag(h, TAG_DIV, 1, tag);
                 } else                  } else
                         print_otag(h, TAG_DIV, 0, NULL);                          print_otag(h, TAG_DIV, 0, NULL);
         }          }
   
         tag.key = ATTR_CLASS;          tag[0].key = ATTR_CLASS;
         tag.val = "includes";          tag[0].val = "includes";
   
         print_otag(h, TAG_SPAN, 1, &tag);          print_otag(h, TAG_SPAN, 1, tag);
   
         if (SEC_SYNOPSIS == n->sec)          if (SEC_SYNOPSIS == n->sec)
                 print_text(h, "#include");                  print_text(h, "#include");
Line 1920  mdoc_in_pre(MDOC_ARGS)
Line 1849  mdoc_in_pre(MDOC_ARGS)
   
         /* XXX -- see warning in termp_in_post(). */          /* XXX -- see warning in termp_in_post(). */
   
         for (nn = n->child; nn; nn = nn->next)          for (nn = n->child; nn; nn = nn->next) {
                   assert(MDOC_TEXT == nn->type);
                   i = 0;
                   tag[i].key = ATTR_CLASS;
                   tag[i++].val = "link-includes";
                   if (h->base_includes) {
                           buffmt_includes(h, nn->string);
                           tag[i].key = ATTR_HREF;
                           tag[i++].val = h->buf;
                   }
                   t = print_otag(h, TAG_A, i, tag);
                 print_mdoc_node(m, nn, h);                  print_mdoc_node(m, nn, h);
                   print_tagq(h, t);
           }
   
         h->flags |= HTML_NOSPACE;          h->flags |= HTML_NOSPACE;
         print_text(h, ">");          print_text(h, ">");

Legend:
Removed from v.1.16  
changed lines
  Added in v.1.19

CVSweb