inspectMark = (marks, { facet } = {}) => {
penguins;
const facets =
facet && facet.data && (facet.x || facet.y)
? ((X) => d3.group(d3.range(facet.data.length), (i) => X[i]))(
Plot.valueof(facet.data, facet.x || facet.y)
)
: undefined;
let displayMark = "";
if (typeof marks === "string") {
displayMark = md`~~~js\n${marks.replace(/^\n+|\n+$/g, "")}\n~~~`;
marks = eval(marks);
}
if (!Array.isArray(marks)) marks = [marks];
else marks = marks.flat();
return html`${marks
.filter((d) => d)
.map((mark) => {
const V = mark.initialize(facets ? facets.values() : undefined);
return md`
${displayMark}
<!-- Constants -->
<h4 style="font: bold 13px/1.2 var(--sans-serif);">Constants</h4>
${Inputs.table(
Object.entries(mark)
.filter(
([key, value]) =>
value !== undefined && !["data", "channels"].includes(key)
)
.map(([key, value]) => ({ key, value })),
{ maxWidth: 500, select: false, sort: "key" }
)}
<!-- Channels -->
<h4 style="font: bold 13px/1.2 var(--sans-serif);">Channels</h4>
${Array.from(
V.facets,
(index, i) => html`
${
facets
? html`<span style="font: italic 13px/1.2 var(--sans-serif);">facet: ${
[...facets.keys()][i]
}</span>`
: ""
}
${Inputs.table(
Array.from(index, (i) =>
Object.fromEntries([
["i", i],
...Object.entries(V.channels).map(([key, { value }]) => [key, value[i]])
])
),
{
layout: "fixed",
maxWidth: 500,
select: false
}
)}`
)}`;
})}`;
}