// Found gather point: // - gather any loose ends // - set the gather as the main container to dump new content in void AddRuntimeForGather(Gather gather) { // Determine whether this Gather should be auto-entered: // - It is auto-entered if there were no choices in the last section // - A section is "since the previous gather" - so reset now bool autoEnter = !hasSeenChoiceInSection; hasSeenChoiceInSection = false; var gatherContainer = gather.runtimeContainer; if (gather.name == null) { // Use disallowed character so it's impossible to have a name collision gatherContainer.name = "g-" + _unnamedGatherCount; _unnamedGatherCount++; } // Auto-enter: include in main content if (autoEnter) { currentContainer.AddContent (gatherContainer); } // Don't auto-enter: // Add this gather to the main content, but only accessible // by name so that it isn't stepped into automatically, but only via // a divert from a loose end. else { currentContainer.AddToNamedContentOnly (gatherContainer); } // Consume loose ends: divert them to this gather foreach (Parsed.Object looseEnd in looseEnds) { // Skip gather loose ends that are at the same level // since they'll be handled by the auto-enter code below // that only jumps into the gather if (current runtime choices == 0) if (looseEnd is Gather) { var prevGather = (Gather)looseEnd; if (prevGather.indentationDepth == gather.indentationDepth) { continue; } } Runtime.Divert divert = null; if (looseEnd is Parsed.Divert) { divert = (Runtime.Divert) looseEnd.runtimeObject; } else { var looseWeavePoint = looseEnd as IWeavePoint; var looseChoice = looseWeavePoint as Parsed.Choice; if (looseChoice && looseChoice.hasTerminatingDivert) { divert = looseChoice.terminatingDivert.runtimeObject as Runtime.Divert; } else { divert = new Runtime.Divert (); looseWeavePoint.runtimeContainer.AddContent (divert); } } // Pass back knowledge of this loose end being diverted // to the FlowBase so that it can maintain a list of them, // and resolve the divert references later gatherPointsToResolve.Add (new GatherPointToResolve{ divert = divert, targetRuntimeObj = gatherContainer }); } looseEnds.Clear (); // Replace the current container itself currentContainer = gatherContainer; }
// Found gather point: // - gather any loose ends // - set the gather as the main container to dump new content in void AddRuntimeForGather(Gather gather) { // Determine whether this Gather should be auto-entered: // - It is auto-entered if there were no choices in the last section // - A section is "since the previous gather" - so reset now bool autoEnter = !hasSeenChoiceInSection; hasSeenChoiceInSection = false; var gatherContainer = gather.runtimeContainer; if (gather.name == null) { // Use disallowed character so it's impossible to have a name collision gatherContainer.name = "g-" + _unnamedGatherCount; _unnamedGatherCount++; } // Auto-enter: include in main content if (autoEnter) { currentContainer.AddContent(gatherContainer); } // Don't auto-enter: // Add this gather to the main content, but only accessible // by name so that it isn't stepped into automatically, but only via // a divert from a loose end. else { _rootContainer.AddToNamedContentOnly(gatherContainer); } // Consume loose ends: divert them to this gather foreach (IWeavePoint looseEndWeavePoint in looseEnds) { var looseEnd = (Parsed.Object)looseEndWeavePoint; // Skip gather loose ends that are at the same level // since they'll be handled by the auto-enter code below // that only jumps into the gather if (current runtime choices == 0) if (looseEnd is Gather) { var prevGather = (Gather)looseEnd; if (prevGather.indentationDepth == gather.indentationDepth) { continue; } } Runtime.Divert divert = null; if (looseEnd is Parsed.Divert) { divert = (Runtime.Divert)looseEnd.runtimeObject; } else { divert = new Runtime.Divert(); var looseWeavePoint = looseEnd as IWeavePoint; looseWeavePoint.runtimeContainer.AddContent(divert); } // Pass back knowledge of this loose end being diverted // to the FlowBase so that it can maintain a list of them, // and resolve the divert references later gatherPointsToResolve.Add(new GatherPointToResolve { divert = divert, targetRuntimeObj = gatherContainer }); } looseEnds.Clear(); // Replace the current container itself currentContainer = gatherContainer; }
protected Gather Gather() { object gatherDashCountObj = Parse(GatherDashes); if (gatherDashCountObj == null) { return null; } int gatherDashCount = (int)gatherDashCountObj; // Optional name for the gather string optionalName = Parse(BracketedName); var gather = new Gather (optionalName, gatherDashCount); // Optional newline before gather's content begins Newline (); return gather; }