Skip to content

fix ansi_html() when same style repeated#807

Open
trevorld wants to merge 1 commit intor-lib:mainfrom
trevorld:issue752_ansi_html
Open

fix ansi_html() when same style repeated#807
trevorld wants to merge 1 commit intor-lib:mainfrom
trevorld:issue752_ansi_html

Conversation

@trevorld
Copy link

After closing the span in html_cb_text(), reset state->old so the next text segment correctly detects it needs styling.

I manually wrote the unit tests, Claude Code proposed the fix but I manually moved their fix from the end of html_cb_text() to instead be inside clic__html_end() which I felt was a more natural location. Unsure if this is the "right" way to reset state...

closes #752

After closing the span in `html_cb_text()`, reset `state->old` so the next text segment correctly detects it needs styling.

closes r-lib#752

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@trevorld trevorld changed the title fix ansi_html() when same same style repeated fix ansi_html() when same style repeated Feb 14, 2026
@trevorld
Copy link
Author

  • I observed a bunch of snapshot failures when I ran devtools::test() before I made any changes but observed no regressions particularly in test-ansi-html.R.

@trevorld
Copy link
Author

  • To be more thorough some additional tests of pasted together identical styles combined with various types of style nesting
  • These extra tests all pass with this fix
test_that("nested styles: add then remove one while another remains active", {
  expect_equal(
    ansi_html("\033[1m\033[4mbold underline\033[24m just bold\033[22m"),
    "<span class=\"ansi ansi-bold ansi-underline\">bold underline</span><span class=\"ansi ansi-bold\"> just bold</span>"
  )
})

test_that("nested styles: foreground and background colors", {
  expect_equal(
    ansi_html("\033[31mred\033[42mred on green\033[49m red only\033[39m"),
    "<span class=\"ansi ansi-color-1\">red</span><span class=\"ansi ansi-color-1 ansi-bg-color-2\">red on green</span><span class=\"ansi ansi-color-1\"> red only</span>"
  )
})

test_that("consecutive strings with the same nested style pasted together", {
  x <- "\033[1m\033[31mred bold\033[39m\033[22m\033[1m\033[31mred bold\033[39m\033[22m"
  expect_equal(
    ansi_html(x),
    "<span class=\"ansi ansi-bold ansi-color-1\">red bold</span><span class=\"ansi ansi-bold ansi-color-1\">red bold</span>"
  )
  expect_equal(
    ansi_html(ansi_simplify(x)),
    "<span class=\"ansi ansi-bold ansi-color-1\">red boldred bold</span>"
  )
})

test_that("consecutive strings with the same inner style within an outer style", {
  x <- "\033[1m\033[31mR\033[39m\033[31mR\033[39m\033[22m"
  expect_equal(
    ansi_html(x),
    "<span class=\"ansi ansi-bold ansi-color-1\">R</span><span class=\"ansi ansi-bold ansi-color-1\">R</span>"
  )
  expect_equal(
    ansi_html(ansi_simplify(x)),
    "<span class=\"ansi ansi-bold ansi-color-1\">RR</span>"
  )
})

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.

ansi_html() bug when strings with the same style have been pasted together

1 participant