[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.210 and 1.225

version 1.210, 2014/11/17 06:44:58 version 1.225, 2015/02/12 12:24:33
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 26 
Line 26 
 #include <string.h>  #include <string.h>
 #include <unistd.h>  #include <unistd.h>
   
 #include "mandoc.h"  
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
   #include "mdoc.h"
 #include "out.h"  #include "out.h"
 #include "html.h"  #include "html.h"
 #include "mdoc.h"  
 #include "main.h"  #include "main.h"
   
 #define INDENT           5  #define INDENT           5
   
 #define MDOC_ARGS         const struct mdoc_meta *meta, \  #define MDOC_ARGS         const struct mdoc_meta *meta, \
                           const struct mdoc_node *n, \                            struct mdoc_node *n, \
                           struct html *h                            struct html *h
   
 #ifndef MIN  #ifndef MIN
Line 82  static int    mdoc_fl_pre(MDOC_ARGS);
Line 81  static int    mdoc_fl_pre(MDOC_ARGS);
 static  int               mdoc_fn_pre(MDOC_ARGS);  static  int               mdoc_fn_pre(MDOC_ARGS);
 static  int               mdoc_ft_pre(MDOC_ARGS);  static  int               mdoc_ft_pre(MDOC_ARGS);
 static  int               mdoc_em_pre(MDOC_ARGS);  static  int               mdoc_em_pre(MDOC_ARGS);
   static  void              mdoc_eo_post(MDOC_ARGS);
   static  int               mdoc_eo_pre(MDOC_ARGS);
 static  int               mdoc_er_pre(MDOC_ARGS);  static  int               mdoc_er_pre(MDOC_ARGS);
 static  int               mdoc_ev_pre(MDOC_ARGS);  static  int               mdoc_ev_pre(MDOC_ARGS);
 static  int               mdoc_ex_pre(MDOC_ARGS);  static  int               mdoc_ex_pre(MDOC_ARGS);
Line 183  static const struct htmlmdoc mdocs[MDOC_MAX] = {
Line 184  static const struct htmlmdoc mdocs[MDOC_MAX] = {
         {mdoc_quote_pre, mdoc_quote_post}, /* Bq */          {mdoc_quote_pre, mdoc_quote_post}, /* Bq */
         {mdoc_xx_pre, NULL}, /* Bsx */          {mdoc_xx_pre, NULL}, /* Bsx */
         {mdoc_bx_pre, NULL}, /* Bx */          {mdoc_bx_pre, NULL}, /* Bx */
         {NULL, NULL}, /* Db */          {mdoc_skip_pre, NULL}, /* Db */
         {NULL, NULL}, /* Dc */          {NULL, NULL}, /* Dc */
         {mdoc_quote_pre, mdoc_quote_post}, /* Do */          {mdoc_quote_pre, mdoc_quote_post}, /* Do */
         {mdoc_quote_pre, mdoc_quote_post}, /* Dq */          {mdoc_quote_pre, mdoc_quote_post}, /* Dq */
         {NULL, NULL}, /* Ec */ /* FIXME: no space */          {NULL, NULL}, /* Ec */ /* FIXME: no space */
         {NULL, NULL}, /* Ef */          {NULL, NULL}, /* Ef */
         {mdoc_em_pre, NULL}, /* Em */          {mdoc_em_pre, NULL}, /* Em */
         {mdoc_quote_pre, mdoc_quote_post}, /* Eo */          {mdoc_eo_pre, mdoc_eo_post}, /* Eo */
         {mdoc_xx_pre, NULL}, /* Fx */          {mdoc_xx_pre, NULL}, /* Fx */
         {mdoc_ms_pre, NULL}, /* Ms */          {mdoc_ms_pre, NULL}, /* Ms */
         {mdoc_no_pre, NULL}, /* No */          {mdoc_no_pre, NULL}, /* No */
Line 266  void
Line 267  void
 html_mdoc(void *arg, const struct mdoc *mdoc)  html_mdoc(void *arg, const struct mdoc *mdoc)
 {  {
   
         print_mdoc(mdoc_meta(mdoc), mdoc_node(mdoc),          print_mdoc(mdoc_meta(mdoc), mdoc_node(mdoc)->child,
             (struct html *)arg);              (struct html *)arg);
         putchar('\n');          putchar('\n');
 }  }
Line 280  static void
Line 281  static void
 a2width(const char *p, struct roffsu *su)  a2width(const char *p, struct roffsu *su)
 {  {
   
         if ( ! a2roffsu(p, su, SCALE_MAX)) {          if (a2roffsu(p, su, SCALE_MAX) < 2) {
                 su->unit = SCALE_EN;                  su->unit = SCALE_EN;
                 su->scale = html_strlen(p);                  su->scale = html_strlen(p);
         }          } else if (su->scale < 0.0)
                   su->scale = 0.0;
 }  }
   
 /*  /*
Line 371  static void
Line 373  static void
 print_mdoc_nodelist(MDOC_ARGS)  print_mdoc_nodelist(MDOC_ARGS)
 {  {
   
         print_mdoc_node(meta, n, h);          while (n != NULL) {
         if (n->next)                  print_mdoc_node(meta, n, h);
                 print_mdoc_nodelist(meta, n->next, h);                  n = n->next;
           }
 }  }
   
 static void  static void
Line 384  print_mdoc_node(MDOC_ARGS)
Line 387  print_mdoc_node(MDOC_ARGS)
   
         child = 1;          child = 1;
         t = h->tags.head;          t = h->tags.head;
           n->flags &= ~MDOC_ENDED;
   
         switch (n->type) {          switch (n->type) {
         case MDOC_ROOT:          case MDOC_ROOT:
Line 423  print_mdoc_node(MDOC_ARGS)
Line 427  print_mdoc_node(MDOC_ARGS)
                  * the "meta" table state.  This will be reopened on the                   * the "meta" table state.  This will be reopened on the
                  * next table element.                   * next table element.
                  */                   */
                 if (h->tblt) {                  if (h->tblt != NULL) {
                         print_tblclose(h);                          print_tblclose(h);
                         t = h->tags.head;                          t = h->tags.head;
                 }                  }
                   assert(h->tblt == NULL);
                 assert(NULL == h->tblt);                  if (mdocs[n->tok].pre && (n->end == ENDBODY_NOT || n->child))
                 if (mdocs[n->tok].pre && ENDBODY_NOT == n->end)  
                         child = (*mdocs[n->tok].pre)(meta, n, h);                          child = (*mdocs[n->tok].pre)(meta, n, h);
                 break;                  break;
         }          }
   
         if (HTML_KEEP & h->flags) {          if (h->flags & HTML_KEEP && n->flags & MDOC_LINE) {
                 if (n->prev ? (n->prev->lastline != n->line) :                  h->flags &= ~HTML_KEEP;
                     (n->parent && n->parent->line != n->line)) {                  h->flags |= HTML_PREKEEP;
                         h->flags &= ~HTML_KEEP;  
                         h->flags |= HTML_PREKEEP;  
                 }  
         }          }
   
         if (child && n->child)          if (child && n->child)
Line 454  print_mdoc_node(MDOC_ARGS)
Line 454  print_mdoc_node(MDOC_ARGS)
         case MDOC_EQN:          case MDOC_EQN:
                 break;                  break;
         default:          default:
                 if (mdocs[n->tok].post && ENDBODY_NOT == n->end)                  if ( ! mdocs[n->tok].post || n->flags & MDOC_ENDED)
                         (*mdocs[n->tok].post)(meta, n, h);                          break;
                   (*mdocs[n->tok].post)(meta, n, h);
                   if (n->end != ENDBODY_NOT)
                           n->body->flags |= MDOC_ENDED;
                   if (n->end == ENDBODY_NOSPACE)
                           h->flags |= HTML_NOSPACE;
                 break;                  break;
         }          }
 }  }
Line 1118  mdoc_bd_pre(MDOC_ARGS)
Line 1123  mdoc_bd_pre(MDOC_ARGS)
 {  {
         struct htmlpair          tag[2];          struct htmlpair          tag[2];
         int                      comp, sv;          int                      comp, sv;
         const struct mdoc_node  *nn;          struct mdoc_node        *nn;
         struct roffsu            su;          struct roffsu            su;
   
         if (MDOC_HEAD == n->type)          if (MDOC_HEAD == n->type)
Line 1198  mdoc_bd_pre(MDOC_ARGS)
Line 1203  mdoc_bd_pre(MDOC_ARGS)
                 default:                  default:
                         break;                          break;
                 }                  }
                 if (nn->next && nn->next->line == nn->line)                  if (h->flags & HTML_NONEWLINE ||
                       (nn->next && ! (nn->next->flags & MDOC_LINE)))
                         continue;                          continue;
                 else if (nn->next)                  else if (nn->next)
                         print_text(h, "\n");                          print_text(h, "\n");
Line 1248  mdoc_an_pre(MDOC_ARGS)
Line 1254  mdoc_an_pre(MDOC_ARGS)
                 return(0);                  return(0);
         }          }
   
         if (n->child == NULL)  
                 return(0);  
   
         if (h->flags & HTML_SPLIT)          if (h->flags & HTML_SPLIT)
                 print_otag(h, TAG_BR, 0, NULL);                  print_otag(h, TAG_BR, 0, NULL);
   
Line 1562  mdoc_sp_pre(MDOC_ARGS)
Line 1565  mdoc_sp_pre(MDOC_ARGS)
         SCALE_VS_INIT(&su, 1);          SCALE_VS_INIT(&su, 1);
   
         if (MDOC_sp == n->tok) {          if (MDOC_sp == n->tok) {
                 if (NULL != (n = n->child))                  if (NULL != (n = n->child)) {
                         if ( ! a2roffsu(n->string, &su, SCALE_VS))                          if ( ! a2roffsu(n->string, &su, SCALE_VS))
                                 SCALE_VS_INIT(&su, atoi(n->string));                                  su.scale = 1.0;
                           else if (su.scale < 0.0)
                                   su.scale = 0.0;
                   }
         } else          } else
                 su.scale = 0.0;                  su.scale = 0.0;
   
Line 1865  static void
Line 1871  static void
 mdoc_pf_post(MDOC_ARGS)  mdoc_pf_post(MDOC_ARGS)
 {  {
   
         h->flags |= HTML_NOSPACE;          if ( ! (n->next == NULL || n->next->flags & MDOC_LINE))
                   h->flags |= HTML_NOSPACE;
 }  }
   
 static int  static int
Line 2075  mdoc_quote_pre(MDOC_ARGS)
Line 2082  mdoc_quote_pre(MDOC_ARGS)
         case MDOC_Ao:          case MDOC_Ao:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case MDOC_Aq:          case MDOC_Aq:
                 print_text(h, "\\(la");                  print_text(h, n->nchild == 1 &&
                       n->child->tok == MDOC_Mt ?  "<" : "\\(la");
                 break;                  break;
         case MDOC_Bro:          case MDOC_Bro:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
Line 2101  mdoc_quote_pre(MDOC_ARGS)
Line 2109  mdoc_quote_pre(MDOC_ARGS)
                         return(1);                          return(1);
                 print_text(h, n->norm->Es->child->string);                  print_text(h, n->norm->Es->child->string);
                 break;                  break;
         case MDOC_Eo:  
                 break;  
         case MDOC_Do:          case MDOC_Do:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case MDOC_Dq:          case MDOC_Dq:
Line 2141  static void
Line 2147  static void
 mdoc_quote_post(MDOC_ARGS)  mdoc_quote_post(MDOC_ARGS)
 {  {
   
         if (MDOC_BODY != n->type)          if (n->type != MDOC_BODY && n->type != MDOC_ELEM)
                 return;                  return;
   
         if (MDOC_En != n->tok)          h->flags |= HTML_NOSPACE;
                 h->flags |= HTML_NOSPACE;  
   
         switch (n->tok) {          switch (n->tok) {
         case MDOC_Ao:          case MDOC_Ao:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case MDOC_Aq:          case MDOC_Aq:
                 print_text(h, "\\(ra");                  print_text(h, n->nchild == 1 &&
                       n->child->tok == MDOC_Mt ?  ">" : "\\(ra");
                 break;                  break;
         case MDOC_Bro:          case MDOC_Bro:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
Line 2168  mdoc_quote_post(MDOC_ARGS)
Line 2174  mdoc_quote_post(MDOC_ARGS)
                 print_text(h, "\\(rB");                  print_text(h, "\\(rB");
                 break;                  break;
         case MDOC_En:          case MDOC_En:
                 if (NULL != n->norm->Es &&                  if (n->norm->Es == NULL ||
                     NULL != n->norm->Es->child &&                      n->norm->Es->child == NULL ||
                     NULL != n->norm->Es->child->next) {                      n->norm->Es->child->next == NULL)
                         h->flags |= HTML_NOSPACE;                          h->flags &= ~HTML_NOSPACE;
                   else
                         print_text(h, n->norm->Es->child->next->string);                          print_text(h, n->norm->Es->child->next->string);
                 }  
                 break;                  break;
         case MDOC_Eo:  
                 break;  
         case MDOC_Qo:          case MDOC_Qo:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case MDOC_Qq:          case MDOC_Qq:
Line 2202  mdoc_quote_post(MDOC_ARGS)
Line 2206  mdoc_quote_post(MDOC_ARGS)
                 abort();                  abort();
                 /* NOTREACHED */                  /* NOTREACHED */
         }          }
   }
   
   static int
   mdoc_eo_pre(MDOC_ARGS)
   {
   
           if (n->type != MDOC_BODY)
                   return(1);
   
           if (n->end == ENDBODY_NOT &&
               n->parent->head->child == NULL &&
               n->child != NULL &&
               n->child->end != ENDBODY_NOT)
                   print_text(h, "\\&");
           else if (n->end != ENDBODY_NOT ? n->child != NULL :
               n->parent->head->child != NULL && (n->child != NULL ||
               (n->parent->tail != NULL && n->parent->tail->child != NULL)))
                   h->flags |= HTML_NOSPACE;
           return(1);
   }
   
   static void
   mdoc_eo_post(MDOC_ARGS)
   {
           int      body, tail;
   
           if (n->type != MDOC_BODY)
                   return;
   
           if (n->end != ENDBODY_NOT) {
                   h->flags &= ~HTML_NOSPACE;
                   return;
           }
   
           body = n->child != NULL || n->parent->head->child != NULL;
           tail = n->parent->tail != NULL && n->parent->tail->child != NULL;
   
           if (body && tail)
                   h->flags |= HTML_NOSPACE;
           else if ( ! tail)
                   h->flags &= ~HTML_NOSPACE;
 }  }

Legend:
Removed from v.1.210  
changed lines
  Added in v.1.225

CVSweb