From 6fd606d75d93784982f67138870c5b039214523a Mon Sep 17 00:00:00 2001 From: elvis Date: Sun, 13 Jul 2025 18:14:35 +0200 Subject: [PATCH] Working color for nodes --- src/rsprocess/grammar.lalrpop | 182 ++++++++++++++++++++++++++++------ src/rsprocess/graph.rs | 7 ++ src/rsprocess/presets.rs | 2 +- testing/first.system | 3 +- 4 files changed, 161 insertions(+), 33 deletions(-) diff --git a/src/rsprocess/grammar.lalrpop b/src/rsprocess/grammar.lalrpop index 1a5e1da..1c22c54 100644 --- a/src/rsprocess/grammar.lalrpop +++ b/src/rsprocess/grammar.lalrpop @@ -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![]), "{" > "}" => - RSset::from(t.into_iter().map(|t| translator.encode(t)).collect::>()) + RSset::from(t.into_iter().map(|t| translator.encode(t)) + .collect::>()) }; @@ -276,7 +275,7 @@ NodeDisplay: presets::NodeDisplay = { "Hide" => presets::NodeDisplay::Display(graph::GraphMapNodes::Hide), "Entities" => presets::NodeDisplay::Display(graph::GraphMapNodes::Entities), "MaskEntities" => - 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 = { => vec![v], )+> => 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 = { } 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" => - presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntities{ mask }), - "Entities" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Entities), - "MaskEntities" => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntities{ mask }), - "Context" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Context), - "MaskContext" => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskContext{ mask }), - "Union" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Union), - "MaskUnion" => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskUnion{ mask }), - "Difference" => presets::EdgeDisplay::Display(graph::GraphMapEdges::Difference), - "MaskDifference" => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskDifference{ mask }), - "EntitiesDeleted" => presets::EdgeDisplay::Display(graph::GraphMapEdges::EntitiesDeleted), - "MaskEntitiesDeleted" => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntitiesDeleted{ mask }), - "EntitiesAdded" => presets::EdgeDisplay::Display(graph::GraphMapEdges::EntitiesAdded), - "MaskEntitiesAdded" => presets::EdgeDisplay::Display(graph::GraphMapEdges::MaskEntitiesAdded{ mask }), + presets::EdgeDisplay::Display( + graph::GraphMapEdges::MaskEntities{ mask } + ), + "Entities" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::Entities + ), + "MaskEntities" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::MaskEntities{ mask } + ), + "Context" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::Context + ), + "MaskContext" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::MaskContext{ mask } + ), + "Union" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::Union + ), + "MaskUnion" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::MaskUnion{ mask } + ), + "Difference" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::Difference + ), + "MaskDifference" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::MaskDifference{ mask } + ), + "EntitiesDeleted" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::EntitiesDeleted + ), + "MaskEntitiesDeleted" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::MaskEntitiesDeleted{ mask } + ), + "EntitiesAdded" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::EntitiesAdded + ), + "MaskEntitiesAdded" => + presets::EdgeDisplay::Display( + graph::GraphMapEdges::MaskEntitiesAdded{ mask } + ), } /// Edge display formatters separated by arbitrary strings in quotes @@ -318,25 +371,92 @@ SeparatorEdge: Vec = { => vec![v], )+> => 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" "?" => + (graph::NodeColorConditional::EntitiesConditional(op, set), + color.to_string()), + "Context.Nill" "?" => + (graph::NodeColorConditional::ContextConditional( + graph::ContextColorConditional::Nill), + color.to_string()), + "Context.RecursiveIdentifier" "(" ")" "?" => + (graph::NodeColorConditional::ContextConditional( + graph::ContextColorConditional::RecursiveIdentifier( + translator.encode(x) + )), + color.to_string()), + "Context.EntitySet" "?" => + (graph::NodeColorConditional::ContextConditional( + graph::ContextColorConditional::EntitySet(op, set)), + color.to_string()), + "Context.NonDeterministicChoice" "?" => + (graph::NodeColorConditional::ContextConditional( + graph::ContextColorConditional::NonDeterministicChoice), + color.to_string()), + "Context.Summation" "?" => + (graph::NodeColorConditional::ContextConditional( + graph::ContextColorConditional::Summation), + color.to_string()), + "Context.WaitEntity" "?" => + (graph::NodeColorConditional::ContextConditional( + graph::ContextColorConditional::WaitEntity), + color.to_string()), +} + + +/// Node color formatter +ColorNode: graph::NodeColor = { + > + "!" => + graph::NodeColor { conditionals: conditionals, + base_color: base_color.to_string() }, + + "!" => + graph::NodeColor { conditionals: vec![], + base_color: base_color.to_string() }, +} + + GraphSaveOptions: presets::GraphSaveOptions = { - "Dot" "|" ">" + "Dot" "|" "|" + ">" => 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" "|" ">" => @@ -371,7 +491,9 @@ pub Run: presets::Instructions = { > => Instructions { system: presets::System::RSsystem { sys }, instructions: instr }, - "Deserialize" "(" ")" > => + + "Deserialize" "(" ")" + > => Instructions { system: presets::System::Deserialize { path }, instructions: instr }, } diff --git a/src/rsprocess/graph.rs b/src/rsprocess/graph.rs index 1b4540b..39a4a15 100644 --- a/src/rsprocess/graph.rs +++ b/src/rsprocess/graph.rs @@ -433,6 +433,13 @@ pub struct NodeColor { pub base_color: String } +pub fn node_formatter_base_color( + base_color: String +) -> String +{ + ", fillcolor=".to_string() + &base_color +} + pub fn node_formatter( original_graph: Rc, rule: NodeColorConditional, diff --git a/src/rsprocess/presets.rs b/src/rsprocess/presets.rs index a20b624..24e5567 100644 --- a/src/rsprocess/presets.rs +++ b/src/rsprocess/presets.rs @@ -570,7 +570,7 @@ fn generate_node_color_fn<'a>( return s } } - node_color.base_color.to_string() + graph::node_formatter_base_color(node_color.base_color.to_string()) } ) } diff --git a/testing/first.system b/testing/first.system index 760a9f3..e020aa9 100644 --- a/testing/first.system +++ b/testing/first.system @@ -4,5 +4,4 @@ Context: [({a,b}.{a}.{a,c}.x + {a,b}.{a}.{a}.nill)] Reactions: ([{a,b}, {c}, {b}]) -Digraph > Dot Entities ", " Entities | Context "; " Difference > Print, -LimitFrequency("testing/first.experiment") > Print \ No newline at end of file +Digraph > Dot Context | Hide | Context.EntitySet ⊆ {a, c} ? "HERE" || Context.NonDeterministicChoice ? "ASDASDSAD" ! "#123" > Print