/* Function: GenerateJSON * Generates JSON for all the entries in the passed container. */ protected void GenerateJSON(MenuEntries.Base.Container container) { ContainerExtraData containerExtraData = new ContainerExtraData(container); container.ExtraData = containerExtraData; containerExtraData.GenerateJSON(HTMLBuilder, this); foreach (var member in container.Members) { if (member is MenuEntries.Base.Target) { TargetExtraData targetExtraData = new TargetExtraData((MenuEntries.Base.Target)member); member.ExtraData = targetExtraData; targetExtraData.GenerateJSON(HTMLBuilder, this); } else if (member is MenuEntries.Base.Container) { GenerateJSON((MenuEntries.Base.Container)member); } } }
/* Function: AppendMembers * A support function for <BuildOutput()>. Appends the output of the container's members to the string, recursively * going through sub-containers as well. This will not include the surrounding brackets, only the comma-separated * member entries. If it finds any sub-containers that start a new data file, it will add them to containersToBuild. */ protected void AppendMembers(MenuEntries.Base.Container container, StringBuilder output, int indent, Stack <MenuEntries.Base.Container> containersToBuild) { for (int i = 0; i < container.Members.Count; i++) { var member = container.Members[i]; if (!EngineInstance.Config.ShrinkFiles) { output.Append(' ', indent * IndentSpaces); } if (member is MenuEntries.Base.Target) { TargetExtraData targetExtraData = (TargetExtraData)member.ExtraData; output.Append(targetExtraData.JSON); } else if (member is MenuEntries.Base.Container) { ContainerExtraData containerExtraData = (ContainerExtraData)member.ExtraData; output.Append(containerExtraData.JSONBeforeMembers); if (containerExtraData.StartsNewDataFile) { output.Append('"'); output.StringEscapeAndAppend(containerExtraData.DataFileName); output.Append('"'); containersToBuild.Push((MenuEntries.Base.Container)member); } else { output.Append('['); if (!EngineInstance.Config.ShrinkFiles) { output.AppendLine(); } AppendMembers((MenuEntries.Base.Container)member, output, indent + 1, containersToBuild); if (!EngineInstance.Config.ShrinkFiles) { output.Append(' ', (indent + 1) * IndentSpaces); } output.Append(']'); } output.Append(containerExtraData.JSONAfterMembers); } #if DEBUG else { throw new Exception("Can't append JSON for menu entry " + member.Title + "."); } #endif if (i < container.Members.Count - 1) { output.Append(','); } if (!EngineInstance.Config.ShrinkFiles) { output.AppendLine(); } } }