Patch 9.0.0110
Problem:    Help tag generation picks up words in code examples.
Solution:   Skip over examples. (Carlo Teubner, closes #10813)
Files:      src/help.c, runtime/doc/doctags.c, src/testdir/test_help.vim


*** ../vim-9.0.0109/src/help.c  2022-04-15 13:30:30.000000000 +0100
--- src/help.c  2022-07-30 12:02:00.415529097 +0100
***************
*** 960,965 ****
--- 960,967 ----
      int               utf8 = MAYBE;
      int               this_utf8;
      int               firstline;
+     int               in_example;
+     int               len;
      int               mix = FALSE;    // detected mixed encodings
  
      // Find all *.txt files.
***************
*** 1025,1030 ****
--- 1027,1033 ----
        }
        fname = files[fi] + dirlen + 1;
  
+       in_example = FALSE;
        firstline = TRUE;
        while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int)
        {
***************
*** 1059,1064 ****
--- 1062,1074 ----
                }
                firstline = FALSE;
            }
+           if (in_example)
+           {
+               // skip over example; a non-white in the first column ends it
+               if (vim_strchr((char_u *)" \t\n\r", IObuff[0]))
+                   continue;
+               in_example = FALSE;
+           }
            p1 = vim_strchr(IObuff, '*');       // find first '*'
            while (p1 != NULL)
            {
***************
*** 1103,1108 ****
--- 1113,1122 ----
                }
                p1 = p2;
            }
+           len = (int)STRLEN(IObuff);
+           if ((len == 2 && STRCMP(&IObuff[len - 2], ">\n") == 0)
+                   || (len >= 3 && STRCMP(&IObuff[len - 3], " >\n") == 0))
+               in_example = TRUE;
            line_breakcheck();
        }
  
*** ../vim-9.0.0109/runtime/doc/doctags.c       2019-05-12 16:16:24.000000000 
+0100
--- runtime/doc/doctags.c       2022-07-30 11:58:40.431442901 +0100
***************
*** 21,26 ****
--- 21,28 ----
        char    *p1, *p2;
        char    *p;
        FILE    *fd;
+       int             len;
+       int             in_example;
  
        if (argc <= 1)
        {
***************
*** 37,58 ****
                        fprintf(stderr, "Unable to open %s for reading\n", 
argv[0]);
                        continue;
                }
                while (fgets(line, LINELEN, fd) != NULL)
                {
!                       p1 = strchr(line, '*');                         /* find 
first '*' */
                        while (p1 != NULL)
                        {
!                               p2 = strchr(p1 + 1, '*');               /* find 
second '*' */
!                               if (p2 != NULL && p2 > p1 + 1)  /* skip "*" and 
"**" */
                                {
                                        for (p = p1 + 1; p < p2; ++p)
                                                if (*p == ' ' || *p == '\t' || 
*p == '|')
                                                        break;
!                                       /*
!                                        * Only accept a *tag* when it consists 
of valid
!                                        * characters, there is white space 
before it and is
!                                        * followed by a white character or 
end-of-line.
!                                        */
                                        if (p == p2
                                                        && (p1 == line || 
p1[-1] == ' ' || p1[-1] == '\t')
                                                                && (strchr(" 
\t\n\r", p[1]) != NULL
--- 39,66 ----
                        fprintf(stderr, "Unable to open %s for reading\n", 
argv[0]);
                        continue;
                }
+               in_example = 0;
                while (fgets(line, LINELEN, fd) != NULL)
                {
!                       if (in_example)
!                       {
!                               // skip over example; non-blank in first column 
ends example
!                               if (strchr(" \t\n\r", line[0]) != NULL)
!                                       continue;
!                               in_example = 0;
!                       }
!                       p1 = strchr(line, '*');                         // find 
first '*'
                        while (p1 != NULL)
                        {
!                               p2 = strchr(p1 + 1, '*');               // find 
second '*'
!                               if (p2 != NULL && p2 > p1 + 1)  // skip "*" and 
"**"
                                {
                                        for (p = p1 + 1; p < p2; ++p)
                                                if (*p == ' ' || *p == '\t' || 
*p == '|')
                                                        break;
!                                       // Only accept a *tag* when it consists 
of valid
!                                       // characters, there is white space 
before it and is
!                                       // followed by a white character or 
end-of-line.
                                        if (p == p2
                                                        && (p1 == line || 
p1[-1] == ' ' || p1[-1] == '\t')
                                                                && (strchr(" 
\t\n\r", p[1]) != NULL
***************
*** 63,80 ****
                                                printf("%s\t%s\t/*", p1, 
argv[0]);
                                                while (*p1)
                                                {
!                                                       /* insert backslash 
before '\\' and '/' */
                                                        if (*p1 == '\\' || *p1 
== '/')
                                                                putchar('\\');
                                                        putchar(*p1);
                                                        ++p1;
                                                }
                                                printf("*\n");
!                                               p2 = strchr(p2 + 1, '*');       
        /* find next '*' */
                                        }
                                }
                                p1 = p2;
                        }
                }
                fclose(fd);
        }
--- 71,92 ----
                                                printf("%s\t%s\t/*", p1, 
argv[0]);
                                                while (*p1)
                                                {
!                                                       // insert backslash 
before '\\' and '/'
                                                        if (*p1 == '\\' || *p1 
== '/')
                                                                putchar('\\');
                                                        putchar(*p1);
                                                        ++p1;
                                                }
                                                printf("*\n");
!                                               p2 = strchr(p2 + 1, '*');       
        // find next '*'
                                        }
                                }
                                p1 = p2;
                        }
+                       len = strlen(line);
+                       if ((len == 2 && strcmp(&line[len - 2], ">\n") == 0)
+                                       || (len >= 3 && strcmp(&line[len - 3], 
" >\n") == 0))
+                               in_example = 1;
                }
                fclose(fd);
        }
*** ../vim-9.0.0109/src/testdir/test_help.vim   2022-05-04 22:04:47.000000000 
+0100
--- src/testdir/test_help.vim   2022-07-30 11:54:26.815321230 +0100
***************
*** 141,146 ****
--- 141,153 ----
    call assert_equal(["help-tags\ttags\t1"], readfile('Xdir/tags'))
    call delete('Xdir/tags')
  
+   " Test parsing tags
+   call writefile(['*tag1*', 'Example: >', '  *notag*', 'Example end: *tag2*'],
+     \ 'Xdir/a/doc/sample.txt')
+   helptags Xdir
+   call assert_equal(["tag1\ta/doc/sample.txt\t/*tag1*",
+                   \  "tag2\ta/doc/sample.txt\t/*tag2*"], 
readfile('Xdir/tags'))
+ 
    " Duplicate tags in the help file
    call writefile(['*tag1*', '*tag1*', '*tag2*'], 'Xdir/a/doc/sample.txt')
    call assert_fails('helptags Xdir', 'E154:')
*** ../vim-9.0.0109/src/version.c       2022-07-30 11:39:52.402622438 +0100
--- src/version.c       2022-07-30 11:54:15.711315491 +0100
***************
*** 737,738 ****
--- 737,740 ----
  {   /* Add new patch number below this line */
+ /**/
+     110,
  /**/

-- 
Some of the well known MS-Windows errors:
        EHUH            Unexpected error
        EUSER           User error, not our fault!
        EGOD            Horrible problem, god knows what has happened
        EERR            Errornous error: nothing wrong

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220730110353.180891C0ED5%40moolenaar.net.

Raspunde prin e-mail lui