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 { } else {
r"([[:alpha:]])([[:word:]])*" => WORD r"([[:alpha:]])([[:word:]])*" => WORD
// r"(\p{L}|\p{Emoji})(\p{L}|\p{Emoji}|\p{Dash}|\p{N})*" => WORD, // r"(\p{L}|\p{Emoji})(\p{L}|\p{Emoji}|\p{Dash}|\p{N})*" => WORD,
// } else {
// r#"'([^']+)'"# => SEPARATOR,
} else { } else {
r#""[^"]+""# => PATH, // " r#""[^"]+""# => PATH, // " <- ignore comment, its for the linter in emacs
} else { } else {
_ _
} }
@ -99,7 +97,8 @@ pub Set: RSset = {
Set_of_entities: RSset = { Set_of_entities: RSset = {
"{" "}" => RSset::from(vec![]), "{" "}" => RSset::from(vec![]),
"{" <t: Separated_Or<Literal, ",">> "}" => "{" <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), "Hide" => presets::NodeDisplay::Display(graph::GraphMapNodes::Hide),
"Entities" => presets::NodeDisplay::Display(graph::GraphMapNodes::Entities), "Entities" => presets::NodeDisplay::Display(graph::GraphMapNodes::Entities),
"MaskEntities" <mask: Set> => "MaskEntities" <mask: Set> =>
presets::NodeDisplay::Display(graph::GraphMapNodes::MaskEntities{ mask }), presets::NodeDisplay::Display(graph::GraphMapNodes::MaskEntities{mask}),
"Context" => presets::NodeDisplay::Display(graph::GraphMapNodes::Context) "Context" => presets::NodeDisplay::Display(graph::GraphMapNodes::Context)
} }
@ -285,9 +284,19 @@ SeparatorNode: Vec<presets::NodeDisplay> = {
<v: NodeDisplay> => vec![v], <v: NodeDisplay> => vec![v],
<v:(<NodeDisplay> <LiteralSeparatorNode>)+> <e: NodeDisplay?> => <v:(<NodeDisplay> <LiteralSeparatorNode>)+> <e: NodeDisplay?> =>
match e { 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) => { 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.push(e);
v v
} }
@ -295,22 +304,66 @@ SeparatorNode: Vec<presets::NodeDisplay> = {
} }
EdgeDisplay: presets::EdgeDisplay = { EdgeDisplay: presets::EdgeDisplay = {
"Hide" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Hide), "Hide" =>
"Products" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Products), presets::EdgeDisplay::Display(
graph::GraphMapEdges::Hide
),
"Products" =>
presets::EdgeDisplay::Display(
graph::GraphMapEdges::Products
),
"MaskProducts" <mask: Set> => "MaskProducts" <mask: Set> =>
presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntities{ mask }), presets::EdgeDisplay::Display(
"Entities" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Entities), graph::GraphMapEdges::MaskEntities{ mask }
"MaskEntities" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntities{ mask }), ),
"Context" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Context), "Entities" =>
"MaskContext" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskContext{ mask }), presets::EdgeDisplay::Display(
"Union" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Union), graph::GraphMapEdges::Entities
"MaskUnion" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskUnion{ mask }), ),
"Difference" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Difference), "MaskEntities" <mask: Set> =>
"MaskDifference" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskDifference{ mask }), presets::EdgeDisplay::Display(
"EntitiesDeleted" => presets::EdgeDisplay::Display(graph::GraphMapEdges::EntitiesDeleted), graph::GraphMapEdges::MaskEntities{ mask }
"MaskEntitiesDeleted" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntitiesDeleted{ mask }), ),
"EntitiesAdded" => presets::EdgeDisplay::Display(graph::GraphMapEdges::EntitiesAdded), "Context" =>
"MaskEntitiesAdded" <mask: Set> => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntitiesAdded{ mask }), 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 /// Edge display formatters separated by arbitrary strings in quotes
@ -318,25 +371,92 @@ SeparatorEdge: Vec<presets::EdgeDisplay> = {
<v: EdgeDisplay> => vec![v], <v: EdgeDisplay> => vec![v],
<v:(<EdgeDisplay> <LiteralSeparatorEdge>)+> <e: EdgeDisplay?> => <v:(<EdgeDisplay> <LiteralSeparatorEdge>)+> <e: EdgeDisplay?> =>
match e { 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) => { 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.push(e);
v 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 = { GraphSaveOptions: presets::GraphSaveOptions = {
"Dot" <s_node: SeparatorNode> "|" <s_edge: SeparatorEdge> ">" "Dot" <s_node: SeparatorNode> "|" <s_edge: SeparatorEdge> "|"
<c_node: ColorNode> ">"
<so: SaveOptions> => <so: SaveOptions> =>
presets::GraphSaveOptions::Dot { node_display: s_node, presets::GraphSaveOptions::Dot { node_display: s_node,
edge_display: s_edge, edge_display: s_edge,
node_color: graph::NodeColor { node_color: c_node,
conditionals: vec![],
base_color: "white".into()
},
so }, so },
"GraphML" <s_node: SeparatorNode> "|" <s_edge: SeparatorEdge> ">" "GraphML" <s_node: SeparatorNode> "|" <s_edge: SeparatorEdge> ">"
<so: SaveOptions> => <so: SaveOptions> =>
@ -371,7 +491,9 @@ pub Run: presets::Instructions = {
<sys: System> <instr: Separated_Or<Instruction, ",">> => <sys: System> <instr: Separated_Or<Instruction, ",">> =>
Instructions { system: presets::System::RSsystem { sys }, Instructions { system: presets::System::RSsystem { sys },
instructions: instr }, instructions: instr },
"Deserialize" "(" <path: Path> ")" <instr: Separated_Or<Instruction, ",">> =>
"Deserialize" "(" <path: Path> ")"
<instr: Separated_Or<Instruction, ",">> =>
Instructions { system: presets::System::Deserialize { path }, Instructions { system: presets::System::Deserialize { path },
instructions: instr }, instructions: instr },
} }

View File

@ -433,6 +433,13 @@ pub struct NodeColor {
pub base_color: String pub base_color: String
} }
pub fn node_formatter_base_color(
base_color: String
) -> String
{
", fillcolor=".to_string() + &base_color
}
pub fn node_formatter( pub fn node_formatter(
original_graph: Rc<RSgraph>, original_graph: Rc<RSgraph>,
rule: NodeColorConditional, rule: NodeColorConditional,

View File

@ -570,7 +570,7 @@ fn generate_node_color_fn<'a>(
return s return s
} }
} }
node_color.base_color.to_string() graph::node_formatter_base_color(node_color.base_color.to_string())
} }
) )
} }

View File

@ -4,5 +4,4 @@ Context: [({a,b}.{a}.{a,c}.x + {a,b}.{a}.{a}.nill)]
Reactions: ([{a,b}, {c}, {b}]) Reactions: ([{a,b}, {c}, {b}])
Digraph > Dot Entities ", " Entities | Context "; " Difference > Print, Digraph > Dot Context | Hide | Context.EntitySet ⊆ {a, c} ? "HERE" || Context.NonDeterministicChoice ? "ASDASDSAD" ! "#123" > Print
LimitFrequency("testing/first.experiment") > Print