From 948377791d472a1870800ad414534facc8398036 Mon Sep 17 00:00:00 2001 From: Jon Mease Date: Sat, 27 Jul 2024 11:43:26 -0400 Subject: [PATCH] Handle non-positive text size and zero font width limit (#175) * Handle text limit of 0 * Add test * Handle text with non-positive font size --- vl-convert-rs/src/converter.rs | 4 +- vl-convert-rs/src/text.rs | 5 + vl-convert-rs/tests/test_specs.rs | 1 + .../tests/vl-specs/expected/v5_8/gh_174.png | Bin 0 -> 52930 bytes vl-convert-rs/tests/vl-specs/gh_174.vl.json | 159 ++++++++++++++++++ 5 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 vl-convert-rs/tests/vl-specs/expected/v5_8/gh_174.png create mode 100644 vl-convert-rs/tests/vl-specs/gh_174.vl.json diff --git a/vl-convert-rs/src/converter.rs b/vl-convert-rs/src/converter.rs index 59d1896b..dfc702cb 100644 --- a/vl-convert-rs/src/converter.rs +++ b/vl-convert-rs/src/converter.rs @@ -323,7 +323,7 @@ import('{url}').then((sg) => {{ // weight may be string like "bold" or number like 600. // Convert number form to string - let weight = String(item.fontWeight); + let weight = item.fontWeight == null? null: String(item.fontWeight); let size = sg.fontSize(item); let family = sg.fontFamily(item); @@ -332,7 +332,7 @@ import('{url}').then((sg) => {{ }}, null, 2); let fullWidth = op_text_width(text_info); - return Math.min(fullWidth, item.limit ?? fullWidth) + return item.limit > 0? Math.min(fullWidth, item.limit): fullWidth }}; }}) "#, diff --git a/vl-convert-rs/src/text.rs b/vl-convert-rs/src/text.rs index e1e78324..645b86f0 100644 --- a/vl-convert-rs/src/text.rs +++ b/vl-convert-rs/src/text.rs @@ -333,6 +333,11 @@ pub fn op_text_width(#[string] text_info_str: String) -> Result { Err(err) => bail!("Failed to deserialize text info: {}", err.to_string()), }; + // Return width zero for text with non-positive size + if text_info.size <= 0.0 { + return Ok(0.0); + } + // Return width zero for empty strings and missing text match &text_info.text { Some(Value::String(text)) => { diff --git a/vl-convert-rs/tests/test_specs.rs b/vl-convert-rs/tests/test_specs.rs index 3212a0ab..64efde1b 100644 --- a/vl-convert-rs/tests/test_specs.rs +++ b/vl-convert-rs/tests/test_specs.rs @@ -645,6 +645,7 @@ mod test_png_no_theme { case("geoScale", 1.0), case("table_heatmap", 1.0), case("long_text_lable", 1.0), + case("gh_174", 1.0), )] fn test( name: &str, diff --git a/vl-convert-rs/tests/vl-specs/expected/v5_8/gh_174.png b/vl-convert-rs/tests/vl-specs/expected/v5_8/gh_174.png new file mode 100644 index 0000000000000000000000000000000000000000..468057235b441fc22c68a4fd6e632a288bb1545f GIT binary patch literal 52930 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 WvY%LO(TM*&J$l>|U;p9dxBm~kF7y)s literal 0 HcmV?d00001 diff --git a/vl-convert-rs/tests/vl-specs/gh_174.vl.json b/vl-convert-rs/tests/vl-specs/gh_174.vl.json new file mode 100644 index 00000000..2bfdfcca --- /dev/null +++ b/vl-convert-rs/tests/vl-specs/gh_174.vl.json @@ -0,0 +1,159 @@ +{ + "config": { + "view": {"continuousWidth": 300, "continuousHeight": 300}, + "legend": {"layout": {"expr": "{\"bottom\": {\"anchor\": \"middle\"}}"}}, + "locale": { + "number": { + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["", " €"] + } + } + }, + "layer": [ + { + "mark": {"type": "bar"}, + "encoding": { + "color": { + "field": "Sexo", + "legend": { + "labelFontSize": 12, + "labelLimit": 0, + "labelOffset": 2, + "offset": 15, + "orient": "bottom", + "symbolSize": 50 + }, + "scale": {"range": ["#B07BD7", "#B1D6AF", "#BF9000"]}, + "sort": null, + "title": null, + "type": "nominal" + }, + "xOffset": {"field": "Sexo", "sort": null, "type": "nominal"}, + "y": { + "axis": { + "domain": false, + "labelAngle": 0, + "labelExpr": "split(datum.label, '\\n')", + "labelFontSize": 12, + "labelLimit": 0, + "labelPadding": 8, + "ticks": false, + "titleFontSize": 12, + "titlePadding": 8 + }, + "field": "value", + "title": "Porcentaje", + "type": "quantitative" + } + }, + "transform": [{"filter": "datum.Sexo != 'Diferencia'"}] + }, + { + "mark": {"type": "line", "strokeWidth": 3}, + "encoding": { + "color": { + "field": "Sexo", + "legend": { + "labelFontSize": 12, + "labelLimit": 0, + "labelOffset": 2, + "offset": 15, + "orient": "bottom", + "symbolSize": 50 + }, + "scale": {"range": ["#B07BD7", "#B1D6AF", "#BF9000"]}, + "sort": null, + "title": null, + "type": "nominal" + }, + "y": { + "axis": { + "domain": false, + "labelExpr": "split(datum.label, '\\n')", + "labelFontSize": 12, + "labelLimit": 0, + "labelPadding": 8, + "ticks": false, + "titleFontSize": 12, + "titlePadding": 8 + }, + "field": "value", + "title": "Brecha de género", + "type": "quantitative" + } + }, + "transform": [{"filter": "datum.Sexo == 'Diferencia'"}] + }, + { + "mark": {"type": "text", "dy": -11, "fontSize": 10.666666666666666}, + "encoding": { + "text": {"field": "value", "format": ".1f", "type": "quantitative"}, + "xOffset": {"field": "Sexo", "sort": null, "type": "nominal"}, + "y": { + "axis": null, + "field": "value", + "title": null, + "type": "quantitative" + } + }, + "transform": [{"filter": "datum.Sexo != 'Diferencia'"}] + } + ], + "data": {"name": "data-d9816b078d38723c826db8427f81174e"}, + "encoding": { + "x": { + "axis": { + "domain": false, + "labelAngle": 0, + "labelExpr": "split(datum.label, '\\n')", + "labelFontSize": 12, + "labelLimit": 0, + "labelPadding": 8, + "ticks": false, + "titleFontSize": 12, + "titlePadding": 8 + }, + "field": "Categoría", + "sort": null, + "title": null, + "type": "nominal" + } + }, + "height": 250, + "resolve": {"scale": {"y": "independent"}}, + "width": 500, + "$schema": "https://vega.github.io/schema/vega-lite/v5.17.0.json", + "datasets": { + "data-d9816b078d38723c826db8427f81174e": [ + {"Categoría": "Mala", "Sexo": "Mujeres", "value": 4.888938288354638}, + {"Categoría": "Regular", "Sexo": "Mujeres", "value": 17.20105746322346}, + {"Categoría": "Buena", "Sexo": "Mujeres", "value": 47.73831733721285}, + {"Categoría": "Muy buena", "Sexo": "Mujeres", "value": 22.48178472726535}, + {"Categoría": "Excelente", "Sexo": "Mujeres", "value": 7.689902183943703}, + {"Categoría": "Mala", "Sexo": "Hombres", "value": 3.290678903385191}, + {"Categoría": "Regular", "Sexo": "Hombres", "value": 13.19356745004503}, + {"Categoría": "Buena", "Sexo": "Hombres", "value": 45.60874073590572}, + {"Categoría": "Muy buena", "Sexo": "Hombres", "value": 26.48511010933306}, + {"Categoría": "Excelente", "Sexo": "Hombres", "value": 11.421902801331}, + {"Categoría": "Mala", "Sexo": "Diferencia", "value": 1.598259384969446}, + { + "Categoría": "Regular", + "Sexo": "Diferencia", + "value": 4.007490013178437 + }, + {"Categoría": "Buena", "Sexo": "Diferencia", "value": 2.129576601307129}, + { + "Categoría": "Muy buena", + "Sexo": "Diferencia", + "value": -4.003325382067715 + }, + { + "Categoría": "Excelente", + "Sexo": "Diferencia", + "value": -3.732000617387293 + } + ] + } +} \ No newline at end of file