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

Diff for /mandoc/html.c between version 1.237 and 1.238

version 1.237, 2018/06/25 14:13:54 version 1.238, 2018/06/25 16:54:59
Line 104  static const struct htmldata htmltags[TAG_MAX] = {
Line 104  static const struct htmldata htmltags[TAG_MAX] = {
         {"mover",       0},          {"mover",       0},
 };  };
   
 static  const char      *const roffscales[SCALE_MAX] = {  
         "cm", /* SCALE_CM */  
         "in", /* SCALE_IN */  
         "pc", /* SCALE_PC */  
         "pt", /* SCALE_PT */  
         "em", /* SCALE_EM */  
         "em", /* SCALE_MM */  
         "ex", /* SCALE_EN */  
         "ex", /* SCALE_BU */  
         "em", /* SCALE_VS */  
         "ex", /* SCALE_FS */  
 };  
   
 /* Avoid duplicate HTML id= attributes. */  /* Avoid duplicate HTML id= attributes. */
 static  struct ohash     id_unique;  static  struct ohash     id_unique;
   
Line 323  html_make_id(const struct roff_node *n, int unique)
Line 310  html_make_id(const struct roff_node *n, int unique)
         return buf;          return buf;
 }  }
   
 int  
 html_strlen(const char *cp)  
 {  
         size_t           rsz;  
         int              skip, sz;  
   
         /*  
          * Account for escaped sequences within string length  
          * calculations.  This follows the logic in term_strlen() as we  
          * must calculate the width of produced strings.  
          * Assume that characters are always width of "1".  This is  
          * hacky, but it gets the job done for approximation of widths.  
          */  
   
         sz = 0;  
         skip = 0;  
         while (1) {  
                 rsz = strcspn(cp, "\\");  
                 if (rsz) {  
                         cp += rsz;  
                         if (skip) {  
                                 skip = 0;  
                                 rsz--;  
                         }  
                         sz += rsz;  
                 }  
                 if ('\0' == *cp)  
                         break;  
                 cp++;  
                 switch (mandoc_escape(&cp, NULL, NULL)) {  
                 case ESCAPE_ERROR:  
                         return sz;  
                 case ESCAPE_UNICODE:  
                 case ESCAPE_NUMBERED:  
                 case ESCAPE_SPECIAL:  
                 case ESCAPE_OVERSTRIKE:  
                         if (skip)  
                                 skip = 0;  
                         else  
                                 sz++;  
                         break;  
                 case ESCAPE_SKIPCHAR:  
                         skip = 1;  
                         break;  
                 default:  
                         break;  
                 }  
         }  
         return sz;  
 }  
   
 static int  static int
 print_escape(struct html *h, char c)  print_escape(struct html *h, char c)
 {  {
Line 553  struct tag *
Line 489  struct tag *
 print_otag(struct html *h, enum htmltag tag, const char *fmt, ...)  print_otag(struct html *h, enum htmltag tag, const char *fmt, ...)
 {  {
         va_list          ap;          va_list          ap;
         struct roffsu   *su;  
         char             numbuf[16];  
         struct tag      *t;          struct tag      *t;
         const char      *attr;          const char      *attr;
         char            *arg1, *arg2;          char            *arg1, *arg2;
         double           v;          int              tflags;
         int              have_style, tflags;  
   
         tflags = htmltags[tag].flags;          tflags = htmltags[tag].flags;
   
Line 599  print_otag(struct html *h, enum htmltag tag, const cha
Line 532  print_otag(struct html *h, enum htmltag tag, const cha
   
         va_start(ap, fmt);          va_start(ap, fmt);
   
         have_style = 0;  
         while (*fmt != '\0') {          while (*fmt != '\0') {
                 if (*fmt == 's') {  
                         have_style = 1;  
                         fmt++;  
                         break;  
                 }  
   
                 /* Parse a non-style attribute and its arguments. */                  /* Parse attributes and arguments. */
   
                 arg1 = va_arg(ap, char *);                  arg1 = va_arg(ap, char *);
                   arg2 = NULL;
                 switch (*fmt++) {                  switch (*fmt++) {
                 case 'c':                  case 'c':
                         attr = "class";                          attr = "class";
Line 620  print_otag(struct html *h, enum htmltag tag, const cha
Line 548  print_otag(struct html *h, enum htmltag tag, const cha
                 case 'i':                  case 'i':
                         attr = "id";                          attr = "id";
                         break;                          break;
                   case 's':
                           attr = "style";
                           arg2 = va_arg(ap, char *);
                           break;
                 case '?':                  case '?':
                         attr = arg1;                          attr = arg1;
                         arg1 = va_arg(ap, char *);                          arg1 = va_arg(ap, char *);
Line 627  print_otag(struct html *h, enum htmltag tag, const cha
Line 559  print_otag(struct html *h, enum htmltag tag, const cha
                 default:                  default:
                         abort();                          abort();
                 }                  }
                 arg2 = NULL;  
                 if (*fmt == 'M')                  if (*fmt == 'M')
                         arg2 = va_arg(ap, char *);                          arg2 = va_arg(ap, char *);
                 if (arg1 == NULL)                  if (arg1 == NULL)
                         continue;                          continue;
   
                 /* Print the non-style attributes. */                  /* Print the attributes. */
   
                 print_byte(h, ' ');                  print_byte(h, ' ');
                 print_word(h, attr);                  print_word(h, attr);
Line 660  print_otag(struct html *h, enum htmltag tag, const cha
Line 591  print_otag(struct html *h, enum htmltag tag, const cha
                         fmt++;                          fmt++;
                         break;                          break;
                 default:                  default:
                         print_encode(h, arg1, NULL, 1);                          if (arg2 == NULL)
                                   print_encode(h, arg1, NULL, 1);
                           else {
                                   print_word(h, arg1);
                                   print_byte(h, ':');
                                   print_byte(h, ' ');
                                   print_word(h, arg2);
                                   print_byte(h, ';');
                           }
                         break;                          break;
                 }                  }
                 print_byte(h, '"');                  print_byte(h, '"');
         }          }
   
         /* Print out styles. */  
   
         while (*fmt != '\0') {  
                 arg1 = NULL;  
                 su = NULL;  
   
                 /* First letter: input argument type. */  
   
                 switch (*fmt++) {  
                 case 's':  
                         arg1 = va_arg(ap, char *);  
                         break;  
                 case 'u':  
                         su = va_arg(ap, struct roffsu *);  
                         break;  
                 default:  
                         abort();  
                 }  
   
                 /* Second letter: style name. */  
   
                 switch (*fmt++) {  
                 case 'h':  
                         attr = "height";  
                         break;  
                 case '?':  
                         attr = arg1;  
                         arg1 = va_arg(ap, char *);  
                         break;  
                 default:  
                         abort();  
                 }  
                 if (su == NULL && arg1 == NULL)  
                         continue;  
   
                 if (have_style == 1)  
                         print_word(h, " style=\"");  
                 else  
                         print_byte(h, ' ');  
                 print_word(h, attr);  
                 print_byte(h, ':');  
                 print_byte(h, ' ');  
                 if (su != NULL) {  
                         v = su->scale;  
                         if (su->unit == SCALE_MM && (v /= 100.0) == 0.0)  
                                 v = 1.0;  
                         else if (su->unit == SCALE_BU)  
                                 v /= 24.0;  
                         (void)snprintf(numbuf, sizeof(numbuf), "%.2f", v);  
                         print_word(h, numbuf);  
                         print_word(h, roffscales[su->unit]);  
                 } else  
                         print_word(h, arg1);  
                 print_byte(h, ';');  
                 have_style = 2;  
         }  
         if (have_style == 2)  
                 print_byte(h, '"');  
   
         va_end(ap);          va_end(ap);
   
         /* Accommodate for "well-formed" singleton escaping. */          /* Accommodate for "well-formed" singleton escaping. */

Legend:
Removed from v.1.237  
changed lines
  Added in v.1.238

CVSweb