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

fix(filter): properly handle options with ansi styles #789

Merged
merged 4 commits into from
Jan 7, 2025
Merged

Conversation

caarlos0
Copy link
Member

@caarlos0 caarlos0 commented Jan 6, 2025

Fixes #785

  • it will fuzzy match against the stripped string
  • it will then render the styles string, taking ansi escape codes into account
  • when a char matches, it'll use the matched style instead of whatever style the item had previously
  • other chars will have their previous style though
  • refactored the matches styling to do it in ranges instead of per char basis, as we now need to ansi.Truncate/ansi.TruncateLeft to avoid breaking styles

some screenshots:

CleanShot 2025-01-06 at 17 17 09@2x
CleanShot 2025-01-06 at 17 17 30@2x
CleanShot 2025-01-06 at 17 17 38@2x
CleanShot 2025-01-06 at 17 17 42@2x

@meowgorithm
Copy link
Member

Awesome. I'm having a hard time reproducing this one. What am I doing wrong?

printf "\x1b[38;5;212;48;5;63mOption 1,Option 2,Option3\x1b[m" | go run . filter --input-delimiter="," --height="10"

@caarlos0
Copy link
Member Author

caarlos0 commented Jan 7, 2025

missing --no-strip-ansi

see #785 for a reproducible

caarlos0 added a commit to charmbracelet/lipgloss that referenced this pull request Jan 7, 2025
Extracted from charmbracelet/gum#789 , this
allows to style ranges of a given string without breaking its current
styles.

The resulting ansi sequences aren't that beautiful (as there might be
many styles+reset with nothing in them), but it works. We can optimize
this later I think.
caarlos0 added a commit to charmbracelet/lipgloss that referenced this pull request Jan 7, 2025
Extracted from charmbracelet/gum#789 , this
allows to style ranges of a given string without breaking its current
styles.

The resulting ansi sequences aren't that beautiful (as there might be
many styles+reset with nothing in them), but it works. We can optimize
this later I think.
@caarlos0 caarlos0 merged commit d3d20ef into main Jan 7, 2025
14 checks passed
@caarlos0 caarlos0 deleted the filter-ansi branch January 7, 2025 14:08
@meowgorithm
Copy link
Member

Nice, I see it now. So in that case can we start and stop sequences at the delimiter with the great new ansi.Cut to keep ANSI from bleeding into the UI?

Untitled.mov

caarlos0 added a commit to charmbracelet/lipgloss that referenced this pull request Jan 9, 2025
* feat: style ranges

Extracted from charmbracelet/gum#789 , this
allows to style ranges of a given string without breaking its current
styles.

The resulting ansi sequences aren't that beautiful (as there might be
many styles+reset with nothing in them), but it works. We can optimize
this later I think.

* fix: wide characters

* feat: helper to style a single range

* chore: review
@bashbunni bashbunni added this to the v0.15.0 milestone Jan 12, 2025
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.

--no-strip-ansi prints ANSI codes and garbles output
3 participants