Commit 736d914e authored by Paul Asmuth's avatar Paul Asmuth
Browse files

improved separation of static and variable properties

before, some properties, such as colour could take on the following
values:

   color: <literal_def> | <series_def>;

where

   literal_def := <literal colour>
   series_def := var(<variable name>) | csv(<file>, <column>)

the new scheme is to separate such properties into two properties
each. for example:

  color: <literal_def>
  colors: <series_def>
parent ff08cf77
Loading
Loading
Loading
Loading
+10 −14
Original line number Diff line number Diff line
@@ -287,7 +287,7 @@ ReturnCode parse_data_series_csv(
  }

  if (prop.size() < 2) {
    return ERROR_INVALID_ARGUMENT; // FIXME
    return ReturnCode::errorf("EARG", "csv() takes exactly two or more arguments, got: $0", prop.size());
  }

  const auto& csv_path = prop[0].value;
@@ -322,7 +322,7 @@ ReturnCode parse_data_series_csv(
ReturnCode parse_data_series_inline(
    const plist::Property& prop,
    SeriesRef* data_ref) {
  if (!plist::is_list(prop)) {
  if (!plist::is_enum(prop, "inline")) {
    return ERROR_INVALID_ARGUMENT;
  }

@@ -339,15 +339,11 @@ ReturnCode parse_data_series_var(
    const plist::Property& prop,
    const DataContext& ctx,
    SeriesRef* data) {
  if (!plist::is_enum(prop, "var")) {
  if (!plist::is_value_literal(prop)) {
    return ERROR_INVALID_ARGUMENT;
  }

  if (prop.size() != 1) {
    return ReturnCode::errorf("EARG", "var() takes exactly one argument, got: $0", prop.size());
  }

  const auto& var_name = prop[0].value;
  const auto& var_name = prop.value;
  auto var_data = find_maybe(ctx.by_name, var_name);
  if (!var_data) {
    return ReturnCode::errorf("EARG", "variable not found: '$0'", var_name);
@@ -365,12 +361,12 @@ ReturnCode configure_series(
    return parse_data_series_csv(prop, data);
  }

  if (plist::is_enum(prop, "var")) {
    return parse_data_series_var(prop, ctx, data);
  if (plist::is_enum(prop, "inline")) {
    return parse_data_series_inline(prop, data);
  }

  if (plist::is_list(prop)) {
    return parse_data_series_inline(prop, data);
  if (plist::is_value_literal(prop)) {
    return parse_data_series_var(prop, ctx, data);
  }

  return ERROR_INVALID_ARGUMENT;
@@ -388,8 +384,8 @@ ParserFn configure_var(
    ParserFn parser) {
  return [=] (const plist::Property& prop) -> ReturnCode {
    if (plist::is_enum(prop, "csv") ||
        plist::is_enum(prop, "var") ||
        plist::is_list(prop)) {
        plist::is_enum(prop, "inline") ||
        plist::is_value_literal(prop)) {
      return configure_series(prop, ctx, series);
    } else {
      return parser(prop);
+6 −5
Original line number Diff line number Diff line
@@ -109,8 +109,8 @@ ReturnCode configure(

  std::string legend_key = LEGEND_DEFAULT;

  std::optional<Color> color_default;
  SeriesRef color_var = find_maybe(data.defaults, "color");
  std::optional<Color> color;
  SeriesRef colors = find_maybe(data.defaults, "colors");
  DomainConfig color_domain;
  ColorScheme color_palette;

@@ -122,7 +122,8 @@ ReturnCode configure(
    {"y", configure_series_fn(data, &data_y)},
    {"y-scale", bind(&configure_string, _1, &scale_y)},
    {"group", configure_series_fn(data, &data_group)},
    {"color", configure_var(&color_var, data, configure_color_opt(&color_default))},
    {"color", configure_color_opt(&color)},
    {"colors", configure_series_fn(data, &colors)},
    {"width", bind(&configure_measure_rel, _1, doc.dpi, doc.font_size, &line_width)},
  };

@@ -172,8 +173,8 @@ ReturnCode configure(
  config->y = domain_translate(*domain_y, *data_y);
  config->line_width = measure_or(line_width, from_pt(kDefaultLineWidthPT, doc.dpi));
  config->colors = fallback(
      series_to_colors(color_var, color_domain, color_palette),
      color_default,
      color,
      series_to_colors(colors, color_domain, color_palette),
      groups_to_colors(config->groups, color_palette));

  /* build legend items */
+6 −5
Original line number Diff line number Diff line
@@ -83,8 +83,8 @@ ReturnCode configure(
  std::string scale_x = SCALE_DEFAULT_X;
  std::string scale_y = SCALE_DEFAULT_Y;

  std::optional<Color> color_default;
  SeriesRef color_var = find_maybe(data.defaults, "color");
  std::optional<Color> color;
  SeriesRef colors = find_maybe(data.defaults, "colors");
  DomainConfig color_domain;
  ColorScheme color_palette;

@@ -96,7 +96,8 @@ ReturnCode configure(
    {"y", configure_series_fn(data, &data_y)},
    {"y-scale", bind(&configure_string, _1, &scale_y)},
    {"group", configure_series_fn(data, &data_group)},
    {"color", configure_var(&color_var, data, configure_color_opt(&color_default))},
    {"color", configure_color_opt(&color)},
    {"colors", configure_series_fn(data, &colors)},
    {"size", bind(&configure_measure_rel, _1, doc.dpi, doc.font_size, &point_size)},
  };

@@ -146,8 +147,8 @@ ReturnCode configure(
  config->y = domain_translate(*domain_y, *data_y);
  config->point_size = measure_or(point_size, from_pt(kDefaultPointSizePT, doc.dpi));
  config->colors = fallback(
      series_to_colors(color_var, color_domain, color_palette),
      color_default,
      color,
      series_to_colors(colors, color_domain, color_palette),
      groups_to_colors(groups, color_palette));

  return OK;
+3 −3
Original line number Diff line number Diff line
@@ -3,9 +3,9 @@ height: 480px;

plot {
  data: csv('tests/testdata/city_temperatures.csv');
  x: var(month);
  y: var(temperature);
  group: var(city);
  x: month;
  y: temperature;
  group: city;

  axis-y-min: -10;
  axis-y-max: 32;
+3 −3
Original line number Diff line number Diff line
@@ -3,9 +3,9 @@ height: 480px;

plot {
  data: csv('tests/testdata/city_temperatures.csv');
  x: var(month);
  y: var(temperature);
  group: var(city);
  x: month;
  y: temperature;
  group: city;

  axis-y-min: -10;
  axis-y-max: 32;
Loading