[BACK]Return to html.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/html.c between version 1.177 and 1.192

version 1.177, 2014/10/26 17:12:03 version 1.192, 2016/01/04 12:45:29
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) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011-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
  * copyright notice and this permission notice appear in all copies.   * copyright notice and this permission notice appear in all copies.
  *   *
  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  * 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
Line 30 
Line 30 
   
 #include "mandoc.h"  #include "mandoc.h"
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
 #include "libmandoc.h"  
 #include "out.h"  #include "out.h"
 #include "html.h"  #include "html.h"
   #include "manconf.h"
 #include "main.h"  #include "main.h"
   
 struct  htmldata {  struct  htmldata {
Line 122  static const char *const roffscales[SCALE_MAX] = {
Line 122  static const char *const roffscales[SCALE_MAX] = {
 };  };
   
 static  void     bufncat(struct html *, const char *, size_t);  static  void     bufncat(struct html *, const char *, size_t);
 static  void     print_ctag(struct html *, enum htmltag);  static  void     print_ctag(struct html *, struct tag *);
 static  int      print_escape(char);  static  int      print_escape(char);
 static  int      print_encode(struct html *, const char *, int);  static  int      print_encode(struct html *, const char *, int);
 static  void     print_metaf(struct html *, enum mandoc_esc);  static  void     print_metaf(struct html *, enum mandoc_esc);
 static  void     print_attr(struct html *, const char *, const char *);  static  void     print_attr(struct html *, const char *, const char *);
 static  void     *ml_alloc(char *);  
   
   
 static void *  void *
 ml_alloc(char *outopts)  html_alloc(const struct manoutput *outopts)
 {  {
         struct html     *h;          struct html     *h;
         const char      *toks[5];  
         char            *v;  
   
         toks[0] = "style";  
         toks[1] = "man";  
         toks[2] = "includes";  
         toks[3] = "fragment";  
         toks[4] = NULL;  
   
         h = mandoc_calloc(1, sizeof(struct html));          h = mandoc_calloc(1, sizeof(struct html));
   
         h->tags.head = NULL;          h->tags.head = NULL;
         h->symtab = mchars_alloc();          h->style = outopts->style;
           h->base_man = outopts->man;
           h->base_includes = outopts->includes;
           if (outopts->fragment)
                   h->oflags |= HTML_FRAGMENT;
   
         while (outopts && *outopts)          return h;
                 switch (getsubopt(&outopts, UNCONST(toks), &v)) {  
                 case 0:  
                         h->style = v;  
                         break;  
                 case 1:  
                         h->base_man = v;  
                         break;  
                 case 2:  
                         h->base_includes = v;  
                         break;  
                 case 3:  
                         h->oflags |= HTML_FRAGMENT;  
                         break;  
                 default:  
                         break;  
                 }  
   
         return(h);  
 }  }
   
 void *  
 html_alloc(char *outopts)  
 {  
   
         return(ml_alloc(outopts));  
 }  
   
 void *  
 xhtml_alloc(char *outopts)  
 {  
   
         return(ml_alloc(outopts));  
 }  
   
 void  void
 html_free(void *p)  html_free(void *p)
 {  {
Line 196  html_free(void *p)
Line 159  html_free(void *p)
                 free(tag);                  free(tag);
         }          }
   
         if (h->symtab)  
                 mchars_free(h->symtab);  
   
         free(h);          free(h);
 }  }
   
Line 256  print_metaf(struct html *h, enum mandoc_esc deco)
Line 216  print_metaf(struct html *h, enum mandoc_esc deco)
                 font = HTMLFONT_BI;                  font = HTMLFONT_BI;
                 break;                  break;
         case ESCAPE_FONT:          case ESCAPE_FONT:
                 /* FALLTHROUGH */  
         case ESCAPE_FONTROMAN:          case ESCAPE_FONTROMAN:
                 font = HTMLFONT_NONE;                  font = HTMLFONT_NONE;
                 break;                  break;
         default:          default:
                 abort();                  abort();
                 /* NOTREACHED */  
         }          }
   
         if (h->metaf) {          if (h->metaf) {
Line 320  html_strlen(const char *cp)
Line 278  html_strlen(const char *cp)
                 cp++;                  cp++;
                 switch (mandoc_escape(&cp, NULL, NULL)) {                  switch (mandoc_escape(&cp, NULL, NULL)) {
                 case ESCAPE_ERROR:                  case ESCAPE_ERROR:
                         return(sz);                          return sz;
                 case ESCAPE_UNICODE:                  case ESCAPE_UNICODE:
                         /* FALLTHROUGH */  
                 case ESCAPE_NUMBERED:                  case ESCAPE_NUMBERED:
                         /* FALLTHROUGH */  
                 case ESCAPE_SPECIAL:                  case ESCAPE_SPECIAL:
                   case ESCAPE_OVERSTRIKE:
                         if (skip)                          if (skip)
                                 skip = 0;                                  skip = 0;
                         else                          else
Line 338  html_strlen(const char *cp)
Line 295  html_strlen(const char *cp)
                         break;                          break;
                 }                  }
         }          }
         return(sz);          return sz;
 }  }
   
 static int  static int
Line 359  print_escape(char c)
Line 316  print_escape(char c)
                 printf("&quot;");                  printf("&quot;");
                 break;                  break;
         case ASCII_NBRSP:          case ASCII_NBRSP:
                 putchar('-');                  printf("&nbsp;");
                 break;                  break;
         case ASCII_HYPH:          case ASCII_HYPH:
                 putchar('-');                  putchar('-');
                 /* FALLTHROUGH */                  break;
         case ASCII_BREAK:          case ASCII_BREAK:
                 break;                  break;
         default:          default:
                 return(0);                  return 0;
         }          }
         return(1);          return 1;
 }  }
   
 static int  static int
Line 408  print_encode(struct html *h, const char *p, int norecu
Line 365  print_encode(struct html *h, const char *p, int norecu
   
                 switch (esc) {                  switch (esc) {
                 case ESCAPE_FONT:                  case ESCAPE_FONT:
                         /* FALLTHROUGH */  
                 case ESCAPE_FONTPREV:                  case ESCAPE_FONTPREV:
                         /* FALLTHROUGH */  
                 case ESCAPE_FONTBOLD:                  case ESCAPE_FONTBOLD:
                         /* FALLTHROUGH */  
                 case ESCAPE_FONTITALIC:                  case ESCAPE_FONTITALIC:
                         /* FALLTHROUGH */  
                 case ESCAPE_FONTBI:                  case ESCAPE_FONTBI:
                         /* FALLTHROUGH */  
                 case ESCAPE_FONTROMAN:                  case ESCAPE_FONTROMAN:
                         if (0 == norecurse)                          if (0 == norecurse)
                                 print_metaf(h, esc);                                  print_metaf(h, esc);
Line 437  print_encode(struct html *h, const char *p, int norecu
Line 389  print_encode(struct html *h, const char *p, int norecu
                 case ESCAPE_UNICODE:                  case ESCAPE_UNICODE:
                         /* Skip past "u" header. */                          /* Skip past "u" header. */
                         c = mchars_num2uc(seq + 1, len - 1);                          c = mchars_num2uc(seq + 1, len - 1);
   
                         /*  
                          * XXX Security warning:  
                          * For now, forbid Unicode obfuscation of ASCII  
                          * characters.  An audit of the callers is  
                          * required before this can be removed.  
                          */  
   
                         if (c < 0x80)  
                                 c = 0xFFFD;  
   
                         printf("&#x%x;", c);  
                         break;                          break;
                 case ESCAPE_NUMBERED:                  case ESCAPE_NUMBERED:
                         c = mchars_num2char(seq, len);                          c = mchars_num2char(seq, len);
                         if ( ! ('\0' == c || print_escape(c)))                          if (c < 0)
                                 putchar(c);                                  continue;
                         break;                          break;
                 case ESCAPE_SPECIAL:                  case ESCAPE_SPECIAL:
                         c = mchars_spec2cp(h->symtab, seq, len);                          c = mchars_spec2cp(seq, len);
                         if (c > 0)                          if (c <= 0)
                                 printf("&#%d;", c);                                  continue;
                         else if (-1 == c && 1 == len &&  
                             !print_escape(*seq))  
                                 putchar((int)*seq);  
                         break;                          break;
                 case ESCAPE_NOSPACE:                  case ESCAPE_NOSPACE:
                         if ('\0' == *p)                          if ('\0' == *p)
                                 nospace = 1;                                  nospace = 1;
                           continue;
                   case ESCAPE_OVERSTRIKE:
                           if (len == 0)
                                   continue;
                           c = seq[len - 1];
                         break;                          break;
                 default:                  default:
                         break;                          continue;
                 }                  }
                   if ((c < 0x20 && c != 0x09) ||
                       (c > 0x7E && c < 0xA0))
                           c = 0xFFFD;
                   if (c > 0x7E)
                           printf("&#%d;", c);
                   else if ( ! print_escape(c))
                           putchar(c);
         }          }
   
         return(nospace);          return nospace;
 }  }
   
 static void  static void
Line 534  print_otag(struct html *h, enum htmltag tag,
Line 483  print_otag(struct html *h, enum htmltag tag,
         if ((HTML_AUTOCLOSE | HTML_CLRLINE) & htmltags[tag].flags)          if ((HTML_AUTOCLOSE | HTML_CLRLINE) & htmltags[tag].flags)
                 putchar('\n');                  putchar('\n');
   
         return(t);          return t;
 }  }
   
 static void  static void
 print_ctag(struct html *h, enum htmltag tag)  print_ctag(struct html *h, struct tag *tag)
 {  {
   
         printf("</%s>", htmltags[tag].name);          /*
         if (HTML_CLRLINE & htmltags[tag].flags) {           * Remember to close out and nullify the current
            * meta-font and table, if applicable.
            */
           if (tag == h->metaf)
                   h->metaf = NULL;
           if (tag == h->tblt)
                   h->tblt = NULL;
   
           printf("</%s>", htmltags[tag->tag].name);
           if (HTML_CLRLINE & htmltags[tag->tag].flags) {
                 h->flags |= HTML_NOSPACE;                  h->flags |= HTML_NOSPACE;
                 putchar('\n');                  putchar('\n');
         }          }
   
           h->tags.head = tag->next;
           free(tag);
 }  }
   
 void  void
Line 589  print_text(struct html *h, const char *word)
Line 550  print_text(struct html *h, const char *word)
         if ( ! print_encode(h, word, 0)) {          if ( ! print_encode(h, word, 0)) {
                 if ( ! (h->flags & HTML_NONOSPACE))                  if ( ! (h->flags & HTML_NONOSPACE))
                         h->flags &= ~HTML_NOSPACE;                          h->flags &= ~HTML_NOSPACE;
                   h->flags &= ~HTML_NONEWLINE;
         } else          } else
                 h->flags |= HTML_NOSPACE;                  h->flags |= HTML_NOSPACE | HTML_NONEWLINE;
   
         if (h->metaf) {          if (h->metaf) {
                 print_tagq(h, h->metaf);                  print_tagq(h, h->metaf);
Line 606  print_tagq(struct html *h, const struct tag *until)
Line 568  print_tagq(struct html *h, const struct tag *until)
         struct tag      *tag;          struct tag      *tag;
   
         while ((tag = h->tags.head) != NULL) {          while ((tag = h->tags.head) != NULL) {
                 /*                  print_ctag(h, tag);
                  * Remember to close out and nullify the current  
                  * meta-font and table, if applicable.  
                  */  
                 if (tag == h->metaf)  
                         h->metaf = NULL;  
                 if (tag == h->tblt)  
                         h->tblt = NULL;  
                 print_ctag(h, tag->tag);  
                 h->tags.head = tag->next;  
                 free(tag);  
                 if (until && tag == until)                  if (until && tag == until)
                         return;                          return;
         }          }
Line 630  print_stagq(struct html *h, const struct tag *suntil)
Line 582  print_stagq(struct html *h, const struct tag *suntil)
         while ((tag = h->tags.head) != NULL) {          while ((tag = h->tags.head) != NULL) {
                 if (suntil && tag == suntil)                  if (suntil && tag == suntil)
                         return;                          return;
                 /*                  print_ctag(h, tag);
                  * Remember to close out and nullify the current  
                  * meta-font and table, if applicable.  
                  */  
                 if (tag == h->metaf)  
                         h->metaf = NULL;  
                 if (tag == h->tblt)  
                         h->tblt = NULL;  
                 print_ctag(h, tag->tag);  
                 h->tags.head = tag->next;  
                 free(tag);  
         }          }
 }  }
   
Line 778  void
Line 720  void
 bufcat_id(struct html *h, const char *src)  bufcat_id(struct html *h, const char *src)
 {  {
   
         /* Cf. <http://www.w3.org/TR/html4/types.html#h-6.2>. */          /* Cf. <http://www.w3.org/TR/html5/dom.html#the-id-attribute>. */
   
         while ('\0' != *src)          for (; '\0' != *src; src++)
                 bufcat_fmt(h, "%.2x", *src++);                  bufncat(h, *src == ' ' ? "_" : src, 1);
 }  }

Legend:
Removed from v.1.177  
changed lines
  Added in v.1.192

CVSweb