Commit 4a5b8d99 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

simplify the 'chart/scatterplot' and 'chart/linechart' elements

parent 3e6eafae
Loading
Loading
Loading
Loading
+17 −20
Original line number Diff line number Diff line
@@ -289,6 +289,7 @@ ReturnCode build(
  ExprStorage legend_opts;

  auto config_rc = expr_walk_map(expr_next(expr), {
    /* scale options */
    {"limit-x", bind(&expr_to_float64_opt_pair, _1, &scale_x.min, &scale_x.max)},
    {"limit-x-min", bind(&expr_to_float64_opt, _1, &scale_x.min)},
    {"limit-x-max", bind(&expr_to_float64_opt, _1, &scale_x.max)},
@@ -313,6 +314,8 @@ ReturnCode build(
    },
    {"scale-x-padding", bind(&expr_to_float64, _1, &scale_x.padding)},
    {"scale-y-padding", bind(&expr_to_float64, _1, &scale_y.padding)},

    /* axis options */
    {"axes", bind(&expr_to_stringset, _1, &axes_auto)},
    {"axis-top", bind(&configure_axis, "chart/axis-top", 0, _1, &axes)},
    {"axis-right", bind(&configure_axis, "chart/axis-right", 1, _1, &axes)},
@@ -334,29 +337,29 @@ ReturnCode build(
    },
    {"axis-x-labels", bind(&expr_rewritev, _1, "labels", &axis_x_opts)},
    {"axis-y-labels", bind(&expr_rewritev, _1, "labels", &axis_y_opts)},
    {"axis-x-label-font-size", bind(&expr_rewritev, _1, "label-font-size", &axis_x_opts)},
    {"axis-y-label-font-size", bind(&expr_rewritev, _1, "label-font-size", &axis_y_opts)},
    {"axis-x-label-color", bind(&expr_rewritev, _1, "label-color", &axis_x_opts)},
    {"axis-y-label-color", bind(&expr_rewritev, _1, "label-color", &axis_y_opts)},
    {"axis-x-label-padding", bind(&expr_rewritev, _1, "label-padding", &axis_x_opts)},
    {"axis-y-label-padding", bind(&expr_rewritev, _1, "label-padding", &axis_y_opts)},
    {"axis-x-title", bind(&expr_rewritev, _1, "title", &axis_x_opts)},
    {"axis-y-title", bind(&expr_rewritev, _1, "title", &axis_y_opts)},
    {"axis-x-title-font-size", bind(&expr_rewritev, _1, "title-font-size", &axis_x_opts)},
    {"axis-y-title-font-size", bind(&expr_rewritev, _1, "title-font-size", &axis_y_opts)},
    {"axis-x-title-color", bind(&expr_rewritev, _1, "title-color", &axis_x_opts)},
    {"axis-y-title-color", bind(&expr_rewritev, _1, "title-color", &axis_y_opts)},
    {"axis-x-title-padding", bind(&expr_rewritev, _1, "title-padding", &axis_x_opts)},
    {"axis-y-title-padding", bind(&expr_rewritev, _1, "title-padding", &axis_y_opts)},
    {"axis-x-title-rotate", bind(&expr_rewritev, _1, "title-padding", &axis_x_opts)},
    {"axis-y-title-rotate", bind(&expr_rewritev, _1, "title-padding", &axis_y_opts)},

    /* geom options */
    {"areas", bind(&configure_geom, "chart/areas", _1, &geoms, &x, &y)},
    {"bars", bind(&configure_geom, "chart/bars", _1, &geoms, &x, &y)},
    {"lines", bind(&configure_geom, "chart/lines", _1, &geoms, &x, &y)},
    {"labels", bind(&configure_geom, "chart/labels", _1, &geoms, &x, &y)},
    {"points", bind(&configure_geom, "chart/points", _1, &geoms, &x, &y)},

    /* grid & legend */
    {"grid", bind(&expr_to_copy, _1, &grid_opts)},
    {"legend", bind(&expr_to_copy, _1, &legend_opts)},

    /* extra elements */
    {"body", bind(&element_build_list, env, _1, &config->body_elements)},
    {"top", bind(&element_build_list, env, _1, &config->margin_elements[0])},
    {"right", bind(&element_build_list, env, _1, &config->margin_elements[1])},
    {"bottom", bind(&element_build_list, env, _1, &config->margin_elements[2])},
    {"left", bind(&element_build_list, env, _1, &config->margin_elements[3])},

    /* background, margins, borders */
    {"background", bind(&expr_to_color_opt, _1, &config->background)},
    {
      "margin",
      expr_calln_fn({
@@ -370,7 +373,6 @@ ReturnCode build(
    {"margin-right", bind(&expr_to_measure, _1, &config->margins[1])},
    {"margin-bottom", bind(&expr_to_measure, _1, &config->margins[2])},
    {"margin-left", bind(&expr_to_measure, _1, &config->margins[3])},
    {"background", bind(&expr_to_color_opt, _1, &config->background)},
    {
      "border",
      expr_calln_fn({
@@ -410,11 +412,6 @@ ReturnCode build(
    {"border-right-width", bind(&expr_to_measure, _1, &config->borders[1].line_width)},
    {"border-bottom-width", bind(&expr_to_measure, _1, &config->borders[2].line_width)},
    {"border-left-width", bind(&expr_to_measure, _1, &config->borders[3].line_width)},
    {"body", bind(&element_build_list, env, _1, &config->body_elements)},
    {"top", bind(&element_build_list, env, _1, &config->margin_elements[0])},
    {"right", bind(&element_build_list, env, _1, &config->margin_elements[1])},
    {"bottom", bind(&element_build_list, env, _1, &config->margin_elements[2])},
    {"left", bind(&element_build_list, env, _1, &config->margin_elements[3])},
  });

  if (!config_rc) {
+48 −245
Original line number Diff line number Diff line
@@ -30,140 +30,68 @@ ReturnCode build(
    const Environment& env,
    const Expr* expr,
    ElementRef* elem) {
  std::vector<Measure> x;
  std::vector<Measure> y;
  ScaleConfig scale_x;
  ScaleConfig scale_y;

  ExprStorage data_x;
  ExprStorage data_y;

  std::set<std::string> axes;
  std::vector<ExprStorage> layout_opts;
  std::vector<ExprStorage> line_opts;
  std::vector<ExprStorage> axis_opts;
  std::vector<ExprStorage> axis_x_opts;
  std::vector<ExprStorage> axis_y_opts;
  ExprStorage grid_opts;
  std::vector<ExprStorage> grid_extra_opts;
  ExprStorage legend_opts;
  std::vector<ExprStorage> geom_opts;

  auto config_rc = expr_walk_map(expr_next(expr), {
    {
      "data-x",
      expr_calln_fn({
        bind(&data_load, _1, &x),
        bind(&expr_to_copy, _1, &data_x),
      }),
    },
    {
      "data-y",
      expr_calln_fn({
        bind(&data_load, _1, &y),
        bind(&expr_to_copy, _1, &data_y),
      }),
    },
    {"limit-x", bind(&expr_to_float64_opt_pair, _1, &scale_x.min, &scale_x.max)},
    {"limit-x-min", bind(&expr_to_float64_opt, _1, &scale_x.min)},
    {"limit-x-max", bind(&expr_to_float64_opt, _1, &scale_x.max)},
    {"limit-y", bind(&expr_to_float64_opt_pair, _1, &scale_y.min, &scale_y.max)},
    {"limit-y-min", bind(&expr_to_float64_opt, _1, &scale_y.min)},
    {"limit-y-max", bind(&expr_to_float64_opt, _1, &scale_y.max)},
    {
      "scale-x",
      expr_calln_fn({
        bind(&scale_configure_kind, _1, &scale_x),
        bind(&expr_rewritev, _1, "scale-x", &line_opts),
        bind(&expr_rewritev, _1, "scale", &axis_x_opts)
      })
    },
    {
      "scale-y",
      expr_calln_fn({
        bind(&scale_configure_kind, _1, &scale_y),
        bind(&expr_rewritev, _1, "scale-y", &line_opts),
        bind(&expr_rewritev, _1, "scale", &axis_y_opts)
      })
    },
    {"scale-x-padding", bind(&expr_to_float64, _1, &scale_x.padding)},
    {"scale-y-padding", bind(&expr_to_float64, _1, &scale_y.padding)},
    {
      "axis-x-ticks",
      expr_calln_fn({
        bind(&expr_rewritev, _1, "ticks", &axis_x_opts),
        bind(&expr_rewritev, _1, "axis-x-ticks", &grid_extra_opts),
      })
    },
    {
      "axis-y-ticks",
      expr_calln_fn({
        bind(&expr_rewritev, _1, "ticks", &axis_y_opts),
        bind(&expr_rewritev, _1, "axis-y-ticks", &grid_extra_opts),
      })
    },
    {"axis-x-labels", bind(&expr_rewritev, _1, "labels", &axis_x_opts)},
    {"axis-y-labels", bind(&expr_rewritev, _1, "labels", &axis_y_opts)},
    {"axis-x-label-font-size", bind(&expr_rewritev, _1, "label-font-size", &axis_x_opts)},
    {"axis-y-label-font-size", bind(&expr_rewritev, _1, "label-font-size", &axis_y_opts)},
    {"axis-x-label-color", bind(&expr_rewritev, _1, "label-color", &axis_x_opts)},
    {"axis-y-label-color", bind(&expr_rewritev, _1, "label-color", &axis_y_opts)},
    {"axis-x-label-padding", bind(&expr_rewritev, _1, "label-padding", &axis_x_opts)},
    {"axis-y-label-padding", bind(&expr_rewritev, _1, "label-padding", &axis_y_opts)},
    {"axis-x-title", bind(&expr_rewritev, _1, "title", &axis_x_opts)},
    {"axis-y-title", bind(&expr_rewritev, _1, "title", &axis_y_opts)},
    {"axis-x-title-font-size", bind(&expr_rewritev, _1, "title-font-size", &axis_x_opts)},
    {"axis-y-title-font-size", bind(&expr_rewritev, _1, "title-font-size", &axis_y_opts)},
    {"axis-x-title-color", bind(&expr_rewritev, _1, "title-color", &axis_x_opts)},
    {"axis-y-title-color", bind(&expr_rewritev, _1, "title-color", &axis_y_opts)},
    {"axis-x-title-padding", bind(&expr_rewritev, _1, "title-padding", &axis_x_opts)},
    {"axis-y-title-padding", bind(&expr_rewritev, _1, "title-padding", &axis_y_opts)},
    {"axis-x-title-rotate", bind(&expr_rewritev, _1, "title-padding", &axis_x_opts)},
    {"axis-y-title-rotate", bind(&expr_rewritev, _1, "title-padding", &axis_y_opts)},
    {"color", bind(&expr_rewritev, _1, "color", &line_opts)},
    {"colors", bind(&expr_rewritev, _1, "colors", &line_opts)},
    {"stroke", bind(&expr_rewritev, _1, "stroke", &line_opts)},
    {"marker-size", bind(&expr_rewritev, _1, "marker-size", &line_opts)},
    {"marker-sizes", bind(&expr_rewritev, _1, "marker-sizes", &line_opts)},
    {"labels", bind(&expr_rewritev, _1, "labels", &line_opts)},
    {"label-font-size", bind(&expr_rewritev, _1, "label-font-size", &line_opts)},
    {"axes", bind(&expr_to_stringset, _1, &axes)},
    {"grid", bind(&expr_to_copy, _1, &grid_opts)},
    {"legend", bind(&expr_to_copy, _1, &legend_opts)},
    /* linechart options */
    {"data-x", bind(&expr_rewritev, _1, "data-x", &geom_opts)},
    {"data-y", bind(&expr_rewritev, _1, "data-y", &geom_opts)},
    {"color", bind(&expr_rewritev, _1, "color", &geom_opts)},
    {"colors", bind(&expr_rewritev, _1, "colors", &geom_opts)},
    {"stroke", bind(&expr_rewritev, _1, "stroke", &geom_opts)},
    {"marker-size", bind(&expr_rewritev, _1, "marker-size", &geom_opts)},
    {"marker-sizes", bind(&expr_rewritev, _1, "marker-sizes", &geom_opts)},
    {"labels", bind(&expr_rewritev, _1, "labels", &geom_opts)},
    {"label-font-size", bind(&expr_rewritev, _1, "label-font-size", &geom_opts)},

    /* scale options */
    {"limit-x", bind(&expr_rewritev, _1, "limit-x", &layout_opts)},
    {"limit-x-min", bind(&expr_rewritev, _1, "limit-x-min", &layout_opts)},
    {"limit-x-max", bind(&expr_rewritev, _1, "limit-x-max", &layout_opts)},
    {"limit-y", bind(&expr_rewritev, _1, "limit-y", &layout_opts)},
    {"limit-y-min", bind(&expr_rewritev, _1, "limit-y-min", &layout_opts)},
    {"limit-y-max", bind(&expr_rewritev, _1, "limit-y-max", &layout_opts)},
    {"scale-x", bind(&expr_rewritev, _1, "scale-x", &layout_opts)},
    {"scale-y", bind(&expr_rewritev, _1, "scale-y", &layout_opts)},
    {"scale-x-padding", bind(&expr_rewritev, _1, "scale-x-padding", &layout_opts)},
    {"scale-y-padding", bind(&expr_rewritev, _1, "scale-y-padding", &layout_opts)},

    /* axis options */
    {"axes", bind(&expr_rewritev, _1, "axes", &layout_opts)},
    {"axis-top", bind(&expr_rewritev, _1, "axis-top", &layout_opts)},
    {"axis-right", bind(&expr_rewritev, _1, "axis-right", &layout_opts)},
    {"axis-bottom", bind(&expr_rewritev, _1, "axis-bottom", &layout_opts)},
    {"axis-left", bind(&expr_rewritev, _1, "axis-left", &layout_opts)},
    {"axis-x-ticks", bind(&expr_rewritev, _1, "axis-x-ticks", &layout_opts)},
    {"axis-y-ticks", bind(&expr_rewritev, _1, "axis-y-ticks", &layout_opts)},
    {"axis-x-labels", bind(&expr_rewritev, _1, "axis-x-labels", &layout_opts)},
    {"axis-y-labels", bind(&expr_rewritev, _1, "axis-y-labels", &layout_opts)},
    {"axis-x-title", bind(&expr_rewritev, _1, "axis-x-title", &layout_opts)},
    {"axis-y-title", bind(&expr_rewritev, _1, "axis-y-title", &layout_opts)},

    /* grid & legend */
    {"grid", bind(&expr_rewritev, _1, "grid", &layout_opts)},
    {"legend", bind(&expr_rewritev, _1, "legend", &layout_opts)},

    /* background, margins, borders */
    {"background", bind(&expr_rewritev, _1, "background", &layout_opts)},
    {"margin", bind(&expr_rewritev, _1, "margin", &layout_opts)},
    {"margin-top", bind(&expr_rewritev, _1, "margin-top", &layout_opts)},
    {"margin-right", bind(&expr_rewritev, _1, "margin-right", &layout_opts)},
    {"margin-bottom", bind(&expr_rewritev, _1, "margin-bottom", &layout_opts)},
    {"margin-left", bind(&expr_rewritev, _1, "margin-left", &layout_opts)},
    {"background", bind(&expr_rewritev, _1, "background", &layout_opts)},
    {
      "border",
      expr_calln_fn({
        bind(&expr_rewritev, _1, "border", &axis_opts),
        bind(&expr_rewritev, _1, "border", &layout_opts)
      })
    },
    {"border", bind(&expr_rewritev, _1, "border", &layout_opts)},
    {"border-top", bind(&expr_rewritev, _1, "border-top", &layout_opts)},
    {"border-right", bind(&expr_rewritev, _1, "border-right", &layout_opts)},
    {"border-bottom", bind(&expr_rewritev, _1, "border-bottom", &layout_opts)},
    {"border-left", bind(&expr_rewritev, _1, "border-left", &layout_opts)},
    {
      "border-color",
      expr_calln_fn({
        bind(&expr_rewritev, _1, "border-color", &axis_opts),
        bind(&expr_rewritev, _1, "border-color", &layout_opts)
      })
    },
    {"border-color", bind(&expr_rewritev, _1, "border-color", &layout_opts)},
    {"border-top-color", bind(&expr_rewritev, _1, "border-top-color", &layout_opts)},
    {"border-right-color", bind(&expr_rewritev, _1, "border-right-color", &layout_opts)},
    {"border-bottom-color", bind(&expr_rewritev, _1, "border-bottom-color", &layout_opts)},
    {"border-left-color", bind(&expr_rewritev, _1, "border-left-color", &layout_opts)},
    {
      "border-width",
      expr_calln_fn({
        bind(&expr_rewritev, _1, "border-width", &axis_opts),
        bind(&expr_rewritev, _1, "border-width", &layout_opts)
      })
    },
    {"border-width", bind(&expr_rewritev, _1, "border-width", &layout_opts)},
    {"border-top-width", bind(&expr_rewritev, _1, "border-top-width", &layout_opts)},
    {"border-right-width", bind(&expr_rewritev, _1, "border-right-width", &layout_opts)},
    {"border-bottom-width", bind(&expr_rewritev, _1, "border-bottom-width", &layout_opts)},
@@ -174,136 +102,11 @@ ReturnCode build(
    return config_rc;
  }

  /* check configuraton */
  if (!data_x) {
    return error(ERROR, "the 'data-x' argument is mandatory");
  }

  if (!data_y) {
    return error(ERROR, "the 'data-y' argument is mandatory");
  }

  /* scale autoconfig */
  for (const auto& v : x) {
    if (v.unit == Unit::USER) {
      scale_fit(v.value, &scale_x);
    }
  }

  for (const auto& v : y) {
    if (v.unit == Unit::USER) {
      scale_fit(v.value, &scale_y);
    }
  }

  auto xmin = expr_create_value(std::to_string(scale_min(scale_x)));
  auto xmax = expr_create_value(std::to_string(scale_max(scale_x)));
  auto ymin = expr_create_value(std::to_string(scale_min(scale_y)));
  auto ymax = expr_create_value(std::to_string(scale_max(scale_y)));

  auto chart_points = expr_build(
      "chart/lines",
      "data-x",
      std::move(data_x),
      "data-y",
      std::move(data_y),
      "limit-x-min",
      expr_clone(xmin.get()),
      "limit-x-max",
      expr_clone(xmax.get()),
      "limit-y-min",
      expr_clone(ymin.get()),
      "limit-y-max",
      expr_clone(ymax.get()),
      std::move(line_opts));

  ExprStorage chart_gridlines;
  if (grid_opts) {
    chart_gridlines = expr_build(
        "chart/gridlines",
        "limit-x-min",
        expr_clone(xmin.get()),
        "limit-x-max",
        expr_clone(xmax.get()),
        "limit-y-min",
        expr_clone(ymin.get()),
        "limit-y-max",
        expr_clone(ymax.get()),
        expr_unwrap(std::move(grid_opts)),
        expr_clonev(grid_extra_opts));
  }

  ExprStorage chart_legend;
  if (legend_opts) {
    chart_legend = expr_build(
        "chart/legend",
        expr_unwrap(std::move(legend_opts)));
  }

  ExprStorage chart_axis_top;
  if (axes.empty() || axes.count("top")) {
    chart_axis_top = expr_build(
        "chart/axis-top",
        "limit-min",
        expr_clone(xmin.get()),
        "limit-max",
        expr_clone(xmax.get()),
        expr_clonev(axis_opts),
        expr_clonev(axis_x_opts));
  }

  ExprStorage chart_axis_right;
  if (axes.empty() || axes.count("right")) {
    chart_axis_right = expr_build(
        "chart/axis-right",
        "limit-min",
        expr_clone(ymin.get()),
        "limit-max",
        expr_clone(ymax.get()),
        expr_clonev(axis_opts),
        expr_clonev(axis_y_opts));
  }

  ExprStorage chart_axis_bottom;
  if (axes.empty() || axes.count("bottom")) {
    chart_axis_bottom = expr_build(
        "chart/axis-bottom",
        "limit-min",
        expr_clone(xmin.get()),
        "limit-max",
        expr_clone(xmax.get()),
        expr_clonev(axis_opts),
        expr_clonev(axis_x_opts));
  }

  ExprStorage chart_axis_left;
  if (axes.empty() || axes.count("left")) {
    chart_axis_left = expr_build(
        "chart/axis-left",
        "limit-min",
        expr_clone(ymin.get()),
        "limit-max",
        expr_clone(ymax.get()),
        expr_clonev(axis_opts),
        expr_clonev(axis_y_opts));
  }

  auto chart = expr_build(
      "chart/layout",
      std::move(layout_opts),
      "top",
      expr_build(std::move(chart_axis_top)),
      "right",
      expr_build(std::move(chart_axis_right)),
      "bottom",
      expr_build(std::move(chart_axis_bottom)),
      "left",
      expr_build(std::move(chart_axis_left)),
      "body",
      expr_build(
          std::move(chart_gridlines),
          std::move(chart_points),
          std::move(chart_legend)));
      "lines",
      expr_build(std::move(geom_opts)));

  return element_build_macro(env, chart.get(), elem);
}
+49 −246

File changed.

Preview size limit exceeded, changes collapsed.