Working color for nodes

This commit is contained in:
elvis
2025-07-13 18:14:35 +02:00
parent 28b5288535
commit 6fd606d75d
4 changed files with 161 additions and 33 deletions

View File

@ -49,10 +49,8 @@ match {
} else {
r"([[:alpha:]])([[:word:]])*" => WORD
// r"(\p{L}|\p{Emoji})(\p{L}|\p{Emoji}|\p{Dash}|\p{N})*" => WORD,
// } else {
// r#"'([^']+)'"# => SEPARATOR,
} else {
r#""[^"]+""# => PATH, // "
r#""[^"]+""# => PATH, // " <- ignore comment, its for the linter in emacs
} else {
_
}
@ -99,7 +97,8 @@ pub Set: RSset = {
Set_of_entities: RSset = {
"{" "}" => RSset::from(vec![]),
"{" <t: Separated_Or<Literal, ",">> "}" =>
RSset::from(t.into_iter().map(|t| translator.encode(t)).collect::<Vec<_>>())
RSset::from(t.into_iter().map(|t| translator.encode(t))
.collect::<Vec<_>>())
};
@ -276,7 +275,7 @@ NodeDisplay: presets::NodeDisplay = {
"Hide" => presets::NodeDisplay::Display(graph::GraphMapNodes::Hide),
"Entities" => presets::NodeDisplay::Display(graph::GraphMapNodes::Entities),
"MaskEntities" <mask: Set> =>
presets::NodeDisplay::Display(graph::GraphMapNodes::MaskEntities{ mask }),
presets::NodeDisplay::Display(graph::GraphMapNodes::MaskEntities{mask}),
"Context" => presets::NodeDisplay::Display(graph::GraphMapNodes::Context)
}
@ -285,9 +284,19 @@ SeparatorNode: Vec<presets::NodeDisplay> = {
<v: NodeDisplay> => vec![v],
<v:(<NodeDisplay> <LiteralSeparatorNode>)+> <e: NodeDisplay?> =>
match e {
None => v.iter().fold(vec![], |mut acc, (a, b)| {acc.push(a.clone()); acc.push(b.clone()); acc.clone()}),
None => v.iter().fold(vec![],
|mut acc, (a, b)| {
acc.push(a.clone());
acc.push(b.clone());
acc.clone()
}),
Some(e) => {
let mut v = v.iter().fold(vec![], |mut acc, (a, b)| {acc.push(a.clone()); acc.push(b.clone()); acc.clone()});
let mut v = v.iter().fold(vec![],
|mut acc, (a, b)| {
acc.push(a.clone());
acc.push(b.clone());
acc.clone()
});
v.push(e);
v
}
@ -295,22 +304,66 @@ SeparatorNode: Vec<presets::NodeDisplay> = {
}
EdgeDisplay: presets::EdgeDisplay = {
"Hide" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Hide),
"Products" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Products),
"Hide" =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::Hide
),
"Products" =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::Products
),
"MaskProducts" <mask: Set> =>
presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntities{ mask }),
"Entities" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Entities),
"MaskEntities" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntities{ mask }),
"Context" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Context),
"MaskContext" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskContext{ mask }),
"Union" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Union),
"MaskUnion" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskUnion{ mask }),
"Difference" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Difference),
"MaskDifference" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskDifference{ mask }),
"EntitiesDeleted" => presets::EdgeDisplay::Display(graph::GraphMapEdges::EntitiesDeleted),
"MaskEntitiesDeleted" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntitiesDeleted{ mask }),
"EntitiesAdded" => presets::EdgeDisplay::Display(graph::GraphMapEdges::EntitiesAdded),
"MaskEntitiesAdded" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntitiesAdded{ mask }),
presets::EdgeDisplay::Display(
graph::GraphMapEdges::MaskEntities{ mask }
),
"Entities" =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::Entities
),
"MaskEntities" <mask: Set> =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::MaskEntities{ mask }
),
"Context" =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::Context
),
"MaskContext" <mask: Set> =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::MaskContext{ mask }
),
"Union" =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::Union
),
"MaskUnion" <mask: Set> =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::MaskUnion{ mask }
),
"Difference" =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::Difference
),
"MaskDifference" <mask: Set> =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::MaskDifference{ mask }
),
"EntitiesDeleted" =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::EntitiesDeleted
),
"MaskEntitiesDeleted" <mask: Set> =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::MaskEntitiesDeleted{ mask }
),
"EntitiesAdded" =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::EntitiesAdded
),
"MaskEntitiesAdded" <mask: Set> =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::MaskEntitiesAdded{ mask }
),
}
/// Edge display formatters separated by arbitrary strings in quotes
@ -318,25 +371,92 @@ SeparatorEdge: Vec<presets::EdgeDisplay> = {
<v: EdgeDisplay> => vec![v],
<v:(<EdgeDisplay> <LiteralSeparatorEdge>)+> <e: EdgeDisplay?> =>
match e {
None => v.iter().fold(vec![], |mut acc, (a, b)| {acc.push(a.clone()); acc.push(b.clone()); acc.clone()}),
None => v.iter().fold(vec![],
|mut acc, (a, b)| {
acc.push(a.clone());
acc.push(b.clone());
acc.clone()
}),
Some(e) => {
let mut v = v.iter().fold(vec![], |mut acc, (a, b)| {acc.push(a.clone()); acc.push(b.clone()); acc.clone()});
let mut v = v.iter().fold(vec![],
|mut acc, (a, b)| {
acc.push(a.clone());
acc.push(b.clone());
acc.clone()
});
v.push(e);
v
}
}
}
Operation: graph::OperationType = {
"==" => graph::OperationType::Equals,
"=" => graph::OperationType::Equals,
"<" => graph::OperationType::Subset,
"⊂" => graph::OperationType::Subset,
"<=" => graph::OperationType::SubsetEqual,
"⊆" => graph::OperationType::SubsetEqual,
">" => graph::OperationType::Superset,
"⊃" => graph::OperationType::Superset,
">=" => graph::OperationType::SupersetEqual,
"⊇" => graph::OperationType::SupersetEqual
}
NodeColorConditional: (graph::NodeColorConditional, String) = {
"Entities" <op: Operation> <set: Set> "?" <color: PATH> =>
(graph::NodeColorConditional::EntitiesConditional(op, set),
color.to_string()),
"Context.Nill" "?" <color: PATH> =>
(graph::NodeColorConditional::ContextConditional(
graph::ContextColorConditional::Nill),
color.to_string()),
"Context.RecursiveIdentifier" "(" <x: Literal> ")" "?" <color: PATH> =>
(graph::NodeColorConditional::ContextConditional(
graph::ContextColorConditional::RecursiveIdentifier(
translator.encode(x)
)),
color.to_string()),
"Context.EntitySet" <op: Operation> <set: Set> "?" <color: PATH> =>
(graph::NodeColorConditional::ContextConditional(
graph::ContextColorConditional::EntitySet(op, set)),
color.to_string()),
"Context.NonDeterministicChoice" "?" <color: PATH> =>
(graph::NodeColorConditional::ContextConditional(
graph::ContextColorConditional::NonDeterministicChoice),
color.to_string()),
"Context.Summation" "?" <color: PATH> =>
(graph::NodeColorConditional::ContextConditional(
graph::ContextColorConditional::Summation),
color.to_string()),
"Context.WaitEntity" "?" <color: PATH> =>
(graph::NodeColorConditional::ContextConditional(
graph::ContextColorConditional::WaitEntity),
color.to_string()),
}
/// Node color formatter
ColorNode: graph::NodeColor = {
<conditionals: Separated_Or<NodeColorConditional, "||">>
"!" <base_color: PATH> =>
graph::NodeColor { conditionals: conditionals,
base_color: base_color.to_string() },
"!" <base_color: PATH> =>
graph::NodeColor { conditionals: vec![],
base_color: base_color.to_string() },
}
GraphSaveOptions: presets::GraphSaveOptions = {
"Dot" <s_node: SeparatorNode> "|" <s_edge: SeparatorEdge> ">"
"Dot" <s_node: SeparatorNode> "|" <s_edge: SeparatorEdge> "|"
<c_node: ColorNode> ">"
<so: SaveOptions> =>
presets::GraphSaveOptions::Dot { node_display: s_node,
edge_display: s_edge,
node_color: graph::NodeColor {
conditionals: vec![],
base_color: "white".into()
},
node_color: c_node,
so },
"GraphML" <s_node: SeparatorNode> "|" <s_edge: SeparatorEdge> ">"
<so: SaveOptions> =>
@ -371,7 +491,9 @@ pub Run: presets::Instructions = {
<sys: System> <instr: Separated_Or<Instruction, ",">> =>
Instructions { system: presets::System::RSsystem { sys },
instructions: instr },
"Deserialize" "(" <path: Path> ")" <instr: Separated_Or<Instruction, ",">> =>
"Deserialize" "(" <path: Path> ")"
<instr: Separated_Or<Instruction, ",">> =>
Instructions { system: presets::System::Deserialize { path },
instructions: instr },
}