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

Diff for /mandoc/mdoc_markdown.c between version 1.13 and 1.22

version 1.13, 2017/03/08 18:17:21 version 1.22, 2017/05/30 16:31:29
Line 43  static void  md_rawword(const char *);
Line 43  static void  md_rawword(const char *);
 static  void     md_word(const char *);  static  void     md_word(const char *);
 static  void     md_named(const char *);  static  void     md_named(const char *);
 static  void     md_char(unsigned char);  static  void     md_char(unsigned char);
   static  void     md_uri(const char *);
   
 static  int      md_cond_head(struct roff_node *);  static  int      md_cond_head(struct roff_node *);
 static  int      md_cond_body(struct roff_node *);  static  int      md_cond_body(struct roff_node *);
Line 67  static int  md_pre_Fo(struct roff_node *);
Line 68  static int  md_pre_Fo(struct roff_node *);
 static  int      md_pre_In(struct roff_node *);  static  int      md_pre_In(struct roff_node *);
 static  int      md_pre_It(struct roff_node *);  static  int      md_pre_It(struct roff_node *);
 static  int      md_pre_Lk(struct roff_node *);  static  int      md_pre_Lk(struct roff_node *);
   static  int      md_pre_Mt(struct roff_node *);
 static  int      md_pre_Nd(struct roff_node *);  static  int      md_pre_Nd(struct roff_node *);
 static  int      md_pre_Nm(struct roff_node *);  static  int      md_pre_Nm(struct roff_node *);
 static  int      md_pre_No(struct roff_node *);  static  int      md_pre_No(struct roff_node *);
Line 101  static void  md_post_Pf(struct roff_node *);
Line 103  static void  md_post_Pf(struct roff_node *);
 static  void     md_post_Vt(struct roff_node *);  static  void     md_post_Vt(struct roff_node *);
 static  void     md_post__T(struct roff_node *);  static  void     md_post__T(struct roff_node *);
   
 static  const struct md_act md_acts[MDOC_MAX + 1] = {  static  const struct md_act __md_acts[MDOC_MAX - MDOC_Dd] = {
         { NULL, md_pre_Ap, NULL, NULL, NULL }, /* Ap */  
         { NULL, NULL, NULL, NULL, NULL }, /* Dd */          { NULL, NULL, NULL, NULL, NULL }, /* Dd */
         { NULL, NULL, NULL, NULL, NULL }, /* Dt */          { NULL, NULL, NULL, NULL, NULL }, /* Dt */
         { NULL, NULL, NULL, NULL, NULL }, /* Os */          { NULL, NULL, NULL, NULL, NULL }, /* Os */
Line 118  static const struct md_act md_acts[MDOC_MAX + 1] = {
Line 119  static const struct md_act md_acts[MDOC_MAX + 1] = {
         { NULL, md_pre_It, md_post_It, NULL, NULL }, /* It */          { NULL, md_pre_It, md_post_It, NULL, NULL }, /* It */
         { NULL, md_pre_raw, md_post_raw, "*", "*" }, /* Ad */          { NULL, md_pre_raw, md_post_raw, "*", "*" }, /* Ad */
         { NULL, md_pre_An, NULL, NULL, NULL }, /* An */          { NULL, md_pre_An, NULL, NULL, NULL }, /* An */
           { NULL, md_pre_Ap, NULL, NULL, NULL }, /* Ap */
         { NULL, md_pre_raw, md_post_raw, "*", "*" }, /* Ar */          { NULL, md_pre_raw, md_post_raw, "*", "*" }, /* Ar */
         { NULL, md_pre_raw, md_post_raw, "**", "**" }, /* Cd */          { NULL, md_pre_raw, md_post_raw, "**", "**" }, /* Cd */
         { NULL, md_pre_raw, md_post_raw, "**", "**" }, /* Cm */          { NULL, md_pre_raw, md_post_raw, "**", "**" }, /* Cm */
Line 211  static const struct md_act md_acts[MDOC_MAX + 1] = {
Line 213  static const struct md_act md_acts[MDOC_MAX + 1] = {
         { NULL, NULL, md_post_Lb, NULL, NULL }, /* Lb */          { NULL, NULL, md_post_Lb, NULL, NULL }, /* Lb */
         { NULL, md_pre_Pp, NULL, NULL, NULL }, /* Lp */          { NULL, md_pre_Pp, NULL, NULL, NULL }, /* Lp */
         { NULL, md_pre_Lk, NULL, NULL, NULL }, /* Lk */          { NULL, md_pre_Lk, NULL, NULL, NULL }, /* Lk */
         { NULL, md_pre_raw, md_post_raw, "<", ">" }, /* Mt */          { NULL, md_pre_Mt, NULL, NULL, NULL }, /* Mt */
         { md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Brq */          { md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Brq */
         { md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Bro */          { md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Bro */
         { NULL, NULL, NULL, NULL, NULL }, /* Brc */          { NULL, NULL, NULL, NULL, NULL }, /* Brc */
Line 220  static const struct md_act md_acts[MDOC_MAX + 1] = {
Line 222  static const struct md_act md_acts[MDOC_MAX + 1] = {
         { md_cond_body, md_pre_En, md_post_En, NULL, NULL }, /* En */          { md_cond_body, md_pre_En, md_post_En, NULL, NULL }, /* En */
         { NULL, NULL, NULL, NULL, NULL }, /* Dx */          { NULL, NULL, NULL, NULL, NULL }, /* Dx */
         { NULL, NULL, md_post_pc, NULL, NULL }, /* %Q */          { NULL, NULL, md_post_pc, NULL, NULL }, /* %Q */
         { NULL, md_pre_br, NULL, NULL, NULL }, /* br */  
         { NULL, md_pre_Pp, NULL, NULL, NULL }, /* sp */  
         { NULL, md_pre_Lk, md_post_pc, NULL, NULL }, /* %U */          { NULL, md_pre_Lk, md_post_pc, NULL, NULL }, /* %U */
         { NULL, NULL, NULL, NULL, NULL }, /* Ta */          { NULL, NULL, NULL, NULL, NULL }, /* Ta */
         { NULL, NULL, NULL, NULL, NULL }, /* ll */  
         { NULL, NULL, NULL, NULL, NULL }, /* ROOT */  
 };  };
   static  const struct md_act *const md_acts = __md_acts - MDOC_Dd;
   
 static  int      outflags;  static  int      outflags;
 #define MD_spc           (1 << 0)  /* Blank character before next word. */  #define MD_spc           (1 << 0)  /* Blank character before next word. */
Line 244  static int  escflags; /* Escape in generated markdown 
Line 243  static int  escflags; /* Escape in generated markdown 
 #define ESC_BOL  (1 << 0)  /* "#*+-" near the beginning of a line. */  #define ESC_BOL  (1 << 0)  /* "#*+-" near the beginning of a line. */
 #define ESC_NUM  (1 << 1)  /* "." after a leading number. */  #define ESC_NUM  (1 << 1)  /* "." after a leading number. */
 #define ESC_HYP  (1 << 2)  /* "(" immediately after "]". */  #define ESC_HYP  (1 << 2)  /* "(" immediately after "]". */
 #define ESC_PAR  (1 << 3)  /* ")" when "(" is open. */  
 #define ESC_SQU  (1 << 4)  /* "]" when "[" is open. */  #define ESC_SQU  (1 << 4)  /* "]" when "[" is open. */
 #define ESC_FON  (1 << 5)  /* "*" immediately after unrelated "*". */  #define ESC_FON  (1 << 5)  /* "*" immediately after unrelated "*". */
 #define ESC_EOL  (1 << 6)  /* " " at the and of a line. */  #define ESC_EOL  (1 << 6)  /* " " at the and of a line. */
Line 309  md_node(struct roff_node *n)
Line 307  md_node(struct roff_node *n)
         process_children = 1;          process_children = 1;
         n->flags &= ~NODE_ENDED;          n->flags &= ~NODE_ENDED;
   
         switch (n->type) {          if (n->type == ROFFT_TEXT) {
         case ROFFT_TEXT:  
                 if (n->flags & NODE_DELIMC)                  if (n->flags & NODE_DELIMC)
                         outflags &= ~(MD_spc | MD_spc_force);                          outflags &= ~(MD_spc | MD_spc_force);
                 else if (outflags & MD_Sm)                  else if (outflags & MD_Sm)
Line 320  md_node(struct roff_node *n)
Line 317  md_node(struct roff_node *n)
                         outflags &= ~(MD_spc | MD_spc_force);                          outflags &= ~(MD_spc | MD_spc_force);
                 else if (outflags & MD_Sm)                  else if (outflags & MD_Sm)
                         outflags |= MD_spc;                          outflags |= MD_spc;
                 break;          } else if (n->tok < ROFF_MAX) {
         default:                  switch (n->tok) {
                   case ROFF_br:
                           process_children = md_pre_br(n);
                           break;
                   case ROFF_sp:
                           process_children = md_pre_Pp(n);
                           break;
                   default:
                           process_children = 0;
                           break;
                   }
           } else {
                   assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);
                 act = md_acts + n->tok;                  act = md_acts + n->tok;
                 cond = act->cond == NULL || (*act->cond)(n);                  cond = act->cond == NULL || (*act->cond)(n);
                 if (cond && act->pre != NULL &&                  if (cond && act->pre != NULL &&
                     (n->end == ENDBODY_NOT || n->child != NULL))                      (n->end == ENDBODY_NOT || n->child != NULL))
                         process_children = (*act->pre)(n);                          process_children = (*act->pre)(n);
                 break;  
         }          }
   
         if (process_children && n->child != NULL)          if (process_children && n->child != NULL)
Line 455  md_rawword(const char *s)
Line 463  md_rawword(const char *s)
   
         while (*s != '\0') {          while (*s != '\0') {
                 switch(*s) {                  switch(*s) {
                 case '(':  
                         escflags |= ESC_PAR;  
                         break;  
                 case ')':  
                         escflags |= ~ESC_PAR;  
                         break;  
                 case '*':                  case '*':
                         if (s[1] == '\0')                          if (s[1] == '\0')
                                 escflags |= ESC_FON;                                  escflags |= ESC_FON;
Line 535  md_word(const char *s)
Line 537  md_word(const char *s)
                         bs = escflags & ESC_HYP && !code_blocks;                          bs = escflags & ESC_HYP && !code_blocks;
                         break;                          break;
                 case ')':                  case ')':
                         bs = escflags & (ESC_NUM | ESC_PAR) && !code_blocks;                          bs = escflags & ESC_NUM && !code_blocks;
                         break;                          break;
                 case '*':                  case '*':
                 case '[':                  case '[':
Line 1286  md_post_Lb(struct roff_node *n)
Line 1288  md_post_Lb(struct roff_node *n)
                 outflags |= MD_br;                  outflags |= MD_br;
 }  }
   
   static void
   md_uri(const char *s)
   {
           while (*s != '\0') {
                   if (strchr("%()<>", *s) != NULL) {
                           printf("%%%2.2hhX", *s);
                           outcount += 3;
                   } else {
                           putchar(*s);
                           outcount++;
                   }
                   s++;
           }
   }
   
 static int  static int
 md_pre_Lk(struct roff_node *n)  md_pre_Lk(struct roff_node *n)
 {  {
         const struct roff_node *link, *descr;          const struct roff_node *link, *descr, *punct;
         const unsigned char *s;  
   
         if ((link = n->child) == NULL)          if ((link = n->child) == NULL)
                 return 0;                  return 0;
   
         if ((descr = link->next) != NULL) {          /* Find beginning of trailing punctuation. */
                 md_rawword("[");          punct = n->last;
                 outflags &= ~MD_spc;          while (punct != link && punct->flags & NODE_DELIMC)
                 while (descr != NULL) {                  punct = punct->prev;
                         md_word(descr->string);          punct = punct->next;
                         descr = descr->next;  
                 }  
                 outflags &= ~MD_spc;  
                 md_rawword("](");  
         } else  
                 md_rawword("<");  
   
         for (s = link->string; *s != '\0'; s++) {          /* Link text. */
                 if (strchr("%)<>", *s) != NULL) {          descr = link->next;
                         printf("%%%2.2hhX", *s);          if (descr == punct)
                         outcount += 3;                  descr = link;  /* no text */
                 } else {          md_rawword("[");
                         putchar(*s);          outflags &= ~MD_spc;
           do {
                   md_word(descr->string);
                   descr = descr->next;
           } while (descr != punct);
           outflags &= ~MD_spc;
   
           /* Link target. */
           md_rawword("](");
           md_uri(link->string);
           outflags &= ~MD_spc;
           md_rawword(")");
   
           /* Trailing punctuation. */
           while (punct != NULL) {
                   md_word(punct->string);
                   punct = punct->next;
           }
           return 0;
   }
   
   static int
   md_pre_Mt(struct roff_node *n)
   {
           const struct roff_node *nch;
   
           md_rawword("[");
           outflags &= ~MD_spc;
           for (nch = n->child; nch != NULL; nch = nch->next)
                   md_word(nch->string);
           outflags &= ~MD_spc;
           md_rawword("](mailto:");
           for (nch = n->child; nch != NULL; nch = nch->next) {
                   md_uri(nch->string);
                   if (nch->next != NULL) {
                           putchar(' ');
                         outcount++;                          outcount++;
                 }                  }
         }          }
   
         outflags &= ~MD_spc;          outflags &= ~MD_spc;
         md_rawword(link->next == NULL ? ">" : ")");          md_rawword(")");
         return 0;          return 0;
 }  }
   

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.22

CVSweb