Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: consistent zk-link-format and POSIX regexp conversion for grep #68

Open
wants to merge 6 commits into
base: main
Choose a base branch
from

Conversation

boyechko
Copy link
Contributor

This is a new version of PR #63 that fixes the zk-backlinks bug.

Consistent zk-link-format

This changes zk-link-format to use same %-sequences as other zk-*-format variables.
Having consistent syntax is helpful to avoid mistakes. Additionally, this change allows 1) simplifying zk--format so it doesn't need to handle two different sets of %-sequences, and 2) experimenting with other link markup, such as [[%i][%t]] for org-mode links without explicit link type or [[%i|%t]] for syntax used by MediaWiki.

Extend zk-link-regexp to generate targeted regexps

Also, zk-link-regexp function now accepts optional ID and/or title to generate a regexp matching specific links, so that with the default zk-link-format, (zk-link-regexp "202307090142") returns "\\[\\[\\(?1:202307090142\\)]]". The explicitly numbered capture groups are consistent with zk-file-name-regexp.

Introduce zk--posix-regexp

So far, functions like zk--grep-file-list have just passed Elisp-style regexp to grep and hoped it works, which it does for zk-ID or other literal strings. Changes to zk-link-regexp in PR #63 broke things because it introduced explicit capture groups (\(?1:...\)), which is not supported by POSIX regexps that grep uses.

The new function, zk--posix-regexp, does some basic conversion from Elisp-style regexps to POSIX-style. There is package pcre2el that does it in a more complete and sophisticated way, but for our purposes, this should be enough.

Functions that pass regexps to grep, such as zk--grep-file-list, zk--grep-tag-list, and zk--grep-link-id-list are updated to sanitize ("POSIXize") the regexps they pass. The cost is minuscule ("Elapsed time: 0.000379s" for 10,000 calls with a complex regexp).

* `zk-format-function`'s docstring pointed to a very sparse `zk--format`
  docstring.

* Other `*-format` variables had wrong information (`zk-format-function` should
  never be nil) and repeated information that pertains properly only to
  `zk-format-id-and-title`.
It's generally a good practice to avoid hardcoded values, but this also allows
the user to customize what the title looks like.
Since `zk--grep-file-list` expects a regexp anyway, might as well use the
`zk-link-regexp` to generate it rather than doing it locally and repeating code.
This increases consistency, which should help to avoid obscure bugs.
Having consistent syntax is helpful to avoid mistakes. Additionally, this change
allows 1) simplifying `zk--format` so it doesn't need to handle two different
sets of %-sequences, and 2) experimenting with other link markup, such as
`[[%i][%t]]` for org-mode links without explicit link type or `[[%i|%t]]` for
syntax used by MediaWiki.
So far, functions like `zk--grep-file-list` have just passed Elisp-style regexp
to `grep` and hoped it works, which it does for zk-ID or other literal strings.
Changes to `zk-link-regexp` in PR localauthor#63 broke things because it introduced
explicit capture groups (`\(?1:...\)`), which is not supported by POSIX regexps
that `grep` uses.

The new function, `zk--posix-regexp`, does some basic conversion from
Elisp-style regexps to POSIX-style. There is package `pcre2el` that does it in a
more complete and sophisticated way, but for our purposes, this should be
enough.

Functions that pass regexps to `grep`, such as `zk--grep-file-list`,
`zk--grep-tag-list`, and `zk--grep-link-id-list` are updated to
sanitize ("POSIXize") the regexps they pass. The cost is minuscule ("Elapsed
time: 0.000379s" for 10,000 calls with a complex regexp).
boyechko added a commit to boyechko/octavo that referenced this pull request Jul 16, 2023
@boyechko boyechko closed this Jul 16, 2023
@boyechko boyechko deleted the feature/consisent-zk-link-format-and-posix-regexp branch July 16, 2023 19:06
@boyechko boyechko restored the feature/consisent-zk-link-format-and-posix-regexp branch July 16, 2023 19:48
@boyechko boyechko reopened this Jul 16, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant