-
Notifications
You must be signed in to change notification settings - Fork 27
Added tests for multiline text support #261
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
base: master
Are you sure you want to change the base?
Conversation
Tests check that \n converts to <br/> in: - plot titles (ggtitle) - axis titles (xlab/ylab) - legend titles - geom_text labels Currently fail since feature not implemented. Addresses #221
Changes: - R/z_multiline.R: new helper to convert \n to <br/> - R/z_animint.R: apply conversion to plot title, x/y axis titles - R/z_animintHelpers.R: apply conversion to legend titles and geom_text labels - inst/htmljs/animint.js: render <br/> as SVG tspan elements, fix overlap with proper height calculation - DESCRIPTION: add z_multiline.R to Collate - NEWS.md: document multiline text support Fixes #221
Add Multi-line Text Support Throughout animint2Fixes #221 SummaryThis PR enables newline characters ( What Now Works✅ Plot titles - Visual VerificationThe screenshot below demonstrates multi-line text working correctly in all contexts:
Example Usagelibrary(animint2)
data <- data.frame(
x = 1:5,
y = 1:5,
group = c("A", "B", "C", "A", "B"),
label = c("Single", "Two\nLines", "Three\nLines\nHere", "Text", "Label")
)
viz <- animint(
plot1 = ggplot(data, aes(x, y, color = group, label = label)) +
geom_point(size = 5) +
geom_text(vjust = -1) +
ggtitle("Multi-line Test\nIssue #221 Demonstration") +
xlab("X Axis\n(Horizontal Position)") +
ylab("Y Axis\n(Vertical Position)") +
scale_color_discrete(name = "Data Group\n(Click to Select)")
)
animint2dir(viz, "output-dir") |
|
No obvious timing issues in HEAD=multiline-text-support-221 Generated via commit 4ac0712 Download link for the artifact containing the test results: ↓ atime-results.zip
|
|
Ran tests locally - all 19 multiline text tests pass successfully. The test failures shown are due to missing optional packages (mapproj, sp, XML) and GitHub API permissions, not related to this PR. Sir can you please help me figure out on how to pass the JS_Coverage test suite . |
|
To get this PR to close the corresponding issue, please add Closes #221 on its own line, in the first comment of the PR. |
|
looks like a step in the right direction, thanks! |
|
Also in #261 (comment) it seems like there is an inconsistency between the X and Y axes.
can this be adjusted to be more consistent please? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please add tests then fix
Tests check: - plot title doesn't overlap with plot area - x-axis and y-axis spacing is consistent - multiline spacing matches single-line baseline Tests currently fail, demonstrating the bugs in current code. Addresses feedback on PR #261.
Two fixes: 1. Add 5px margin below title to prevent overlap with plot area 2. Use same base spacing (30px) for both X and Y axis labels Both axes now have consistent spacing, and multiline titles stay above the plot area. Addresses feedback on PR #261.
inst/htmljs/animint.js
Outdated
| var lines = textStr.split('<br/>'); | ||
|
|
||
| if (lines.length > 1) { | ||
| // Multi-line text: create tspan elements to measure properly | ||
| var lineHeight = 1.2; // em units | ||
| lines.forEach(function(line, i) { | ||
| textElement.append('tspan') | ||
| .attr('x', -1000) | ||
| .attr('dy', i === 0 ? 0 : lineHeight + 'em') | ||
| .text(line); | ||
| }); | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this seems like an ovely complex way of measuring.
can't you just get the bounding box after rendering or something simpler like that?
also where does the -1000 come from? please avoid such "magic numbers"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done , please review and also give your feedback if anything else need to be changed .
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please simplify height/width calculation
- removed hardcoded -1000 positioning - reuse setMultilineText() instead of duplicating logic - rely on getBBox() for accurate measurements fixes spacing issues
inst/htmljs/animint.js
Outdated
| setMultilineText(textElement, pText); | ||
| } else { | ||
| // Single line: simple text rendering | ||
| textElement.text(pText); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it seems unusual that there needs to be a special case for multiple lines.
also this if length > 1 else pattern is repeated in the setMultilineText function.
please simplify
…nt/animint2 into multiline-text-support-221
…nt/animint2 into multiline-text-support-221
| xlab("X Label\nLine 2") + | ||
| ylab("Y Label\nLine 2") | ||
| ) | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please undo addition of empty space in functions and test_that blocks
|
can you please post an updated screen shot? |
|
can you please test increasing and decreasing font size? |




Add Multi-line Text Support Throughout animint2
Closes #221
This PR enables newline characters (\n) to work in all text elements of animint2 visualizations. Users can now create multi-line text in plot titles, axis labels, legend titles, and geom_text labels.
What Now Works:
✅ Plot titles - ggtitle("Line 1\nLine 2")
✅ X-axis titles - xlab("X Axis\nSubtitle")
✅ Y-axis titles - ylab("Y Axis\nSubtitle")
✅ Legend titles - scale_color_discrete(name="Legend\nTitle")
✅ Text labels - geom_text(aes(label="Text\nLabel"))
✅ Tooltips - Already worked, still works (backward compatible)
Below is the screenshots of the scripts i ran locally to verify the test locally they fail as aspected

