[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.335 and 1.336

version 1.335, 2020/02/27 22:28:13 version 1.336, 2020/03/13 15:32:28
Line 1 
Line 1 
 /*      $Id$ */  /* $Id$ */
 /*  /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>  
  * Copyright (c) 2014-2020 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2014-2020 Ingo Schwarze <schwarze@openbsd.org>
    * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  *   *
  * 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 14 
Line 14 
  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    *
    * HTML formatter for mdoc(7) used by mandoc(1).
  */   */
 #include "config.h"  #include "config.h"
   
Line 47  struct mdoc_html_act {
Line 49  struct mdoc_html_act {
         void            (*post)(MDOC_ARGS);          void            (*post)(MDOC_ARGS);
 };  };
   
 static  char             *cond_id(const struct roff_node *);  
 static  void              print_mdoc_head(const struct roff_meta *,  static  void              print_mdoc_head(const struct roff_meta *,
                                 struct html *);                                  struct html *);
 static  void              print_mdoc_node(MDOC_ARGS);  static  void              print_mdoc_node(MDOC_ARGS);
Line 72  static void    mdoc_bk_post(MDOC_ARGS);
Line 73  static void    mdoc_bk_post(MDOC_ARGS);
 static  int               mdoc_bk_pre(MDOC_ARGS);  static  int               mdoc_bk_pre(MDOC_ARGS);
 static  int               mdoc_bl_pre(MDOC_ARGS);  static  int               mdoc_bl_pre(MDOC_ARGS);
 static  int               mdoc_cd_pre(MDOC_ARGS);  static  int               mdoc_cd_pre(MDOC_ARGS);
 static  int               mdoc_cm_pre(MDOC_ARGS);  static  int               mdoc_code_pre(MDOC_ARGS);
 static  int               mdoc_d1_pre(MDOC_ARGS);  static  int               mdoc_d1_pre(MDOC_ARGS);
 static  int               mdoc_dv_pre(MDOC_ARGS);  
 static  int               mdoc_fa_pre(MDOC_ARGS);  static  int               mdoc_fa_pre(MDOC_ARGS);
 static  int               mdoc_fd_pre(MDOC_ARGS);  static  int               mdoc_fd_pre(MDOC_ARGS);
 static  int               mdoc_fl_pre(MDOC_ARGS);  static  int               mdoc_fl_pre(MDOC_ARGS);
Line 83  static int    mdoc_ft_pre(MDOC_ARGS);
Line 83  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  void              mdoc_eo_post(MDOC_ARGS);
 static  int               mdoc_eo_pre(MDOC_ARGS);  static  int               mdoc_eo_pre(MDOC_ARGS);
 static  int               mdoc_er_pre(MDOC_ARGS);  
 static  int               mdoc_ev_pre(MDOC_ARGS);  
 static  int               mdoc_ex_pre(MDOC_ARGS);  static  int               mdoc_ex_pre(MDOC_ARGS);
 static  void              mdoc_fo_post(MDOC_ARGS);  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_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_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_lk_pre(MDOC_ARGS);  static  int               mdoc_lk_pre(MDOC_ARGS);
 static  int               mdoc_mt_pre(MDOC_ARGS);  static  int               mdoc_mt_pre(MDOC_ARGS);
 static  int               mdoc_ms_pre(MDOC_ARGS);  
 static  int               mdoc_nd_pre(MDOC_ARGS);  static  int               mdoc_nd_pre(MDOC_ARGS);
 static  int               mdoc_nm_pre(MDOC_ARGS);  static  int               mdoc_nm_pre(MDOC_ARGS);
 static  int               mdoc_no_pre(MDOC_ARGS);  static  int               mdoc_no_pre(MDOC_ARGS);
Line 139  static const struct mdoc_html_act mdoc_html_acts[MDOC_
Line 134  static const struct mdoc_html_act mdoc_html_acts[MDOC_
         {mdoc_ap_pre, NULL}, /* Ap */          {mdoc_ap_pre, NULL}, /* Ap */
         {mdoc_ar_pre, NULL}, /* Ar */          {mdoc_ar_pre, NULL}, /* Ar */
         {mdoc_cd_pre, NULL}, /* Cd */          {mdoc_cd_pre, NULL}, /* Cd */
         {mdoc_cm_pre, NULL}, /* Cm */          {mdoc_code_pre, NULL}, /* Cm */
         {mdoc_dv_pre, NULL}, /* Dv */          {mdoc_code_pre, NULL}, /* Dv */
         {mdoc_er_pre, NULL}, /* Er */          {mdoc_code_pre, NULL}, /* Er */
         {mdoc_ev_pre, NULL}, /* Ev */          {mdoc_code_pre, NULL}, /* Ev */
         {mdoc_ex_pre, NULL}, /* Ex */          {mdoc_ex_pre, NULL}, /* Ex */
         {mdoc_fa_pre, NULL}, /* Fa */          {mdoc_fa_pre, NULL}, /* Fa */
         {mdoc_fd_pre, NULL}, /* Fd */          {mdoc_fd_pre, NULL}, /* Fd */
         {mdoc_fl_pre, NULL}, /* Fl */          {mdoc_fl_pre, NULL}, /* Fl */
         {mdoc_fn_pre, NULL}, /* Fn */          {mdoc_fn_pre, NULL}, /* Fn */
         {mdoc_ft_pre, NULL}, /* Ft */          {mdoc_ft_pre, NULL}, /* Ft */
         {mdoc_ic_pre, NULL}, /* Ic */          {mdoc_code_pre, NULL}, /* Ic */
         {mdoc_in_pre, NULL}, /* In */          {mdoc_in_pre, NULL}, /* In */
         {mdoc_li_pre, NULL}, /* Li */          {mdoc_code_pre, NULL}, /* Li */
         {mdoc_nd_pre, NULL}, /* Nd */          {mdoc_nd_pre, NULL}, /* Nd */
         {mdoc_nm_pre, NULL}, /* Nm */          {mdoc_nm_pre, NULL}, /* Nm */
         {mdoc_quote_pre, mdoc_quote_post}, /* Op */          {mdoc_quote_pre, mdoc_quote_post}, /* Op */
Line 192  static const struct mdoc_html_act mdoc_html_acts[MDOC_
Line 187  static const struct mdoc_html_act mdoc_html_acts[MDOC_
         {mdoc_em_pre, NULL}, /* Em */          {mdoc_em_pre, NULL}, /* Em */
         {mdoc_eo_pre, mdoc_eo_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_no_pre, NULL}, /* Ms */
         {mdoc_no_pre, NULL}, /* No */          {mdoc_no_pre, NULL}, /* No */
         {mdoc_ns_pre, NULL}, /* Ns */          {mdoc_ns_pre, NULL}, /* Ns */
         {mdoc_xx_pre, NULL}, /* Nx */          {mdoc_xx_pre, NULL}, /* Nx */
Line 507  mdoc_root_pre(const struct roff_meta *meta, struct htm
Line 502  mdoc_root_pre(const struct roff_meta *meta, struct htm
         return 1;          return 1;
 }  }
   
 static char *  static int
 cond_id(const struct roff_node *n)  mdoc_code_pre(MDOC_ARGS)
 {  {
         if (n->child != NULL &&          print_otag_id(h, TAG_CODE, roff_name[n->tok], n);
             n->child->type == ROFFT_TEXT &&          return 1;
             (n->prev == NULL ||  
              (n->prev->type == ROFFT_TEXT &&  
               strcmp(n->prev->string, "|") == 0)) &&  
             (n->parent->tok == MDOC_It ||  
              (n->parent->tok == MDOC_Xo &&  
               n->parent->parent->prev == NULL &&  
               n->parent->parent->parent->tok == MDOC_It)))  
                 return html_make_id(n, 1);  
         return NULL;  
 }  }
   
 static int  static int
Line 583  mdoc_sh_pre(MDOC_ARGS)
Line 569  mdoc_sh_pre(MDOC_ARGS)
                 print_otag(h, TAG_SECTION, "c", "Sh");                  print_otag(h, TAG_SECTION, "c", "Sh");
                 break;                  break;
         case ROFFT_HEAD:          case ROFFT_HEAD:
                 id = html_make_id(n, 1);                  n->flags |= NODE_ID;
                 print_otag(h, TAG_H1, "ci", "Sh", id);                  print_otag_id(h, TAG_H1, "Sh", n);
                 if (id != NULL)  
                         print_otag(h, TAG_A, "chR", "permalink", id);  
                 break;                  break;
         case ROFFT_BODY:          case ROFFT_BODY:
                 if (n->sec == SEC_AUTHORS)                  if (n->sec == SEC_AUTHORS)
Line 601  mdoc_sh_pre(MDOC_ARGS)
Line 585  mdoc_sh_pre(MDOC_ARGS)
 static int  static int
 mdoc_ss_pre(MDOC_ARGS)  mdoc_ss_pre(MDOC_ARGS)
 {  {
         char    *id;  
   
         switch (n->type) {          switch (n->type) {
         case ROFFT_BLOCK:          case ROFFT_BLOCK:
                 html_close_paragraph(h);                  html_close_paragraph(h);
                 print_otag(h, TAG_SECTION, "c", "Ss");                  print_otag(h, TAG_SECTION, "c", "Ss");
                 return 1;                  break;
         case ROFFT_HEAD:          case ROFFT_HEAD:
                   n->flags |= NODE_ID;
                   print_otag_id(h, TAG_H2, "Ss", n);
                 break;                  break;
         case ROFFT_BODY:          case ROFFT_BODY:
                 return 1;                  break;
         default:          default:
                 abort();                  abort();
         }          }
   
         id = html_make_id(n, 1);  
         print_otag(h, TAG_H2, "ci", "Ss", id);  
         if (id != NULL)  
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         return 1;          return 1;
 }  }
   
Line 627  static int
Line 606  static int
 mdoc_fl_pre(MDOC_ARGS)  mdoc_fl_pre(MDOC_ARGS)
 {  {
         struct roff_node        *nn;          struct roff_node        *nn;
         char                    *id;  
   
         if ((id = cond_id(n)) != NULL)          print_otag_id(h, TAG_CODE, "Fl", n);
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         print_otag(h, TAG_CODE, "ci", "Fl", id);  
   
         print_text(h, "\\-");          print_text(h, "\\-");
         if (n->child != NULL ||          if (n->child != NULL ||
             ((nn = roff_node_next(n)) != NULL &&              ((nn = roff_node_next(n)) != NULL &&
Line 644  mdoc_fl_pre(MDOC_ARGS)
Line 619  mdoc_fl_pre(MDOC_ARGS)
 }  }
   
 static int  static int
 mdoc_cm_pre(MDOC_ARGS)  
 {  
         char    *id;  
   
         if ((id = cond_id(n)) != NULL)  
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         print_otag(h, TAG_CODE, "ci", "Cm", id);  
         return 1;  
 }  
   
 static int  
 mdoc_nd_pre(MDOC_ARGS)  mdoc_nd_pre(MDOC_ARGS)
 {  {
         switch (n->type) {          switch (n->type) {
Line 926  mdoc_st_pre(MDOC_ARGS)
Line 890  mdoc_st_pre(MDOC_ARGS)
 static int  static int
 mdoc_em_pre(MDOC_ARGS)  mdoc_em_pre(MDOC_ARGS)
 {  {
         print_otag(h, TAG_I, "c", "Em");          print_otag_id(h, TAG_I, "Em", n);
         return 1;          return 1;
 }  }
   
Line 1052  mdoc_cd_pre(MDOC_ARGS)
Line 1016  mdoc_cd_pre(MDOC_ARGS)
 }  }
   
 static int  static int
 mdoc_dv_pre(MDOC_ARGS)  
 {  
         char    *id;  
   
         if ((id = cond_id(n)) != NULL)  
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         print_otag(h, TAG_CODE, "ci", "Dv", id);  
         return 1;  
 }  
   
 static int  
 mdoc_ev_pre(MDOC_ARGS)  
 {  
         char    *id;  
   
         if ((id = cond_id(n)) != NULL)  
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         print_otag(h, TAG_CODE, "ci", "Ev", id);  
         return 1;  
 }  
   
 static int  
 mdoc_er_pre(MDOC_ARGS)  
 {  
         char    *id;  
   
         id = n->sec == SEC_ERRORS &&  
             (n->parent->tok == MDOC_It ||  
              (n->parent->tok == MDOC_Bq &&  
               n->parent->parent->parent->tok == MDOC_It)) ?  
             html_make_id(n, 1) : NULL;  
   
         if (id != NULL)  
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         print_otag(h, TAG_CODE, "ci", "Er", id);  
         return 1;  
 }  
   
 static int  
 mdoc_fa_pre(MDOC_ARGS)  mdoc_fa_pre(MDOC_ARGS)
 {  {
         const struct roff_node  *nn;          const struct roff_node  *nn;
Line 1222  mdoc_fn_pre(MDOC_ARGS)
Line 1147  mdoc_fn_pre(MDOC_ARGS)
                 print_tagq(h, t);                  print_tagq(h, t);
         }          }
   
         t = print_otag(h, TAG_CODE, "c", "Fn");          t = print_otag_id(h, TAG_CODE, "Fn", n);
   
         if (sp)          if (sp)
                 print_text(h, sp);                  print_text(h, sp);
Line 1341  mdoc_mt_pre(MDOC_ARGS)
Line 1266  mdoc_mt_pre(MDOC_ARGS)
   
         for (n = n->child; n; n = n->next) {          for (n = n->child; n; n = n->next) {
                 assert(n->type == ROFFT_TEXT);                  assert(n->type == ROFFT_TEXT);
   
                 mandoc_asprintf(&cp, "mailto:%s", n->string);                  mandoc_asprintf(&cp, "mailto:%s", n->string);
                 t = print_otag(h, TAG_A, "ch", "Mt", cp);                  t = print_otag(h, TAG_A, "ch", "Mt", cp);
                 print_text(h, n->string);                  print_text(h, n->string);
                 print_tagq(h, t);                  print_tagq(h, t);
                 free(cp);                  free(cp);
         }          }
   
         return 0;          return 0;
 }  }
   
Line 1357  mdoc_fo_pre(MDOC_ARGS)
Line 1280  mdoc_fo_pre(MDOC_ARGS)
 {  {
         struct tag      *t;          struct tag      *t;
   
         if (n->type == ROFFT_BODY) {          switch (n->type) {
           case ROFFT_BLOCK:
                   synopsis_pre(h, n);
                   return 1;
           case ROFFT_HEAD:
                   if (n->child != NULL) {
                           t = print_otag_id(h, TAG_CODE, "Fn", n);
                           print_text(h, n->child->string);
                           print_tagq(h, t);
                   }
                   return 0;
           case ROFFT_BODY:
                 h->flags |= HTML_NOSPACE;                  h->flags |= HTML_NOSPACE;
                 print_text(h, "(");                  print_text(h, "(");
                 h->flags |= HTML_NOSPACE;                  h->flags |= HTML_NOSPACE;
                 return 1;                  return 1;
         } else if (n->type == ROFFT_BLOCK) {          default:
                 synopsis_pre(h, n);                  abort();
                 return 1;  
         }          }
   
         if (n->child == NULL)  
                 return 0;  
   
         assert(n->child->string);  
         t = print_otag(h, TAG_CODE, "c", "Fn");  
         print_text(h, n->child->string);  
         print_tagq(h, t);  
         return 0;  
 }  }
   
 static void  static void
 mdoc_fo_post(MDOC_ARGS)  mdoc_fo_post(MDOC_ARGS)
 {  {
   
         if (n->type != ROFFT_BODY)          if (n->type != ROFFT_BODY)
                 return;                  return;
         h->flags |= HTML_NOSPACE;          h->flags |= HTML_NOSPACE;
Line 1430  mdoc_in_pre(MDOC_ARGS)
Line 1353  mdoc_in_pre(MDOC_ARGS)
                 assert(n->type == ROFFT_TEXT);                  assert(n->type == ROFFT_TEXT);
                 print_text(h, n->string);                  print_text(h, n->string);
         }          }
   
         return 0;          return 0;
 }  }
   
 static int  static int
 mdoc_ic_pre(MDOC_ARGS)  
 {  
         char    *id;  
   
         if ((id = cond_id(n)) != NULL)  
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         print_otag(h, TAG_CODE, "ci", "Ic", id);  
         return 1;  
 }  
   
 static int  
 mdoc_va_pre(MDOC_ARGS)  mdoc_va_pre(MDOC_ARGS)
 {  {
         print_otag(h, TAG_VAR, "c", "Va");          print_otag(h, TAG_VAR, "c", "Va");
Line 1455  mdoc_va_pre(MDOC_ARGS)
Line 1366  mdoc_va_pre(MDOC_ARGS)
 static int  static int
 mdoc_ap_pre(MDOC_ARGS)  mdoc_ap_pre(MDOC_ARGS)
 {  {
   
         h->flags |= HTML_NOSPACE;          h->flags |= HTML_NOSPACE;
         print_text(h, "\\(aq");          print_text(h, "\\(aq");
         h->flags |= HTML_NOSPACE;          h->flags |= HTML_NOSPACE;
Line 1494  mdoc_bf_pre(MDOC_ARGS)
Line 1404  mdoc_bf_pre(MDOC_ARGS)
 }  }
   
 static int  static int
 mdoc_ms_pre(MDOC_ARGS)  
 {  
         char *id;  
   
         if ((id = cond_id(n)) != NULL)  
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         print_otag(h, TAG_SPAN, "ci", "Ms", id);  
         return 1;  
 }  
   
 static int  
 mdoc_igndelim_pre(MDOC_ARGS)  mdoc_igndelim_pre(MDOC_ARGS)
 {  {
   
         h->flags |= HTML_IGNDELIM;          h->flags |= HTML_IGNDELIM;
         return 1;          return 1;
 }  }
Line 1515  mdoc_igndelim_pre(MDOC_ARGS)
Line 1413  mdoc_igndelim_pre(MDOC_ARGS)
 static void  static void
 mdoc_pf_post(MDOC_ARGS)  mdoc_pf_post(MDOC_ARGS)
 {  {
   
         if ( ! (n->next == NULL || n->next->flags & NODE_LINE))          if ( ! (n->next == NULL || n->next->flags & NODE_LINE))
                 h->flags |= HTML_NOSPACE;                  h->flags |= HTML_NOSPACE;
 }  }
Line 1544  mdoc_rs_pre(MDOC_ARGS)
Line 1441  mdoc_rs_pre(MDOC_ARGS)
 static int  static int
 mdoc_no_pre(MDOC_ARGS)  mdoc_no_pre(MDOC_ARGS)
 {  {
         char *id;          print_otag_id(h, TAG_SPAN, roff_name[n->tok], n);
   
         if ((id = cond_id(n)) != NULL)  
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         print_otag(h, TAG_SPAN, "ci", "No", id);  
         return 1;          return 1;
 }  }
   
 static int  static int
 mdoc_li_pre(MDOC_ARGS)  
 {  
         char    *id;  
   
         if ((id = cond_id(n)) != NULL)  
                 print_otag(h, TAG_A, "chR", "permalink", id);  
         print_otag(h, TAG_CODE, "ci", "Li", id);  
         return 1;  
 }  
   
 static int  
 mdoc_sy_pre(MDOC_ARGS)  mdoc_sy_pre(MDOC_ARGS)
 {  {
         print_otag(h, TAG_B, "c", "Sy");          print_otag_id(h, TAG_B, "Sy", n);
         return 1;          return 1;
 }  }
   

Legend:
Removed from v.1.335  
changed lines
  Added in v.1.336

CVSweb