예제 #1
0
        /// <summary>
        /// Loads a scenario from a text given in our domain-specific language created for this purpose and returns it
        /// as a list of commands.
        /// </summary>
        /// <param name="data">Contents of the scenario file.</param>
        /// <returns></returns>
        public static List <ScenarioCommand> LoadFromText(string data)
        {
            List <ScenarioCommand> commands = new List <ScenarioCommand>();

            string[] lines = data.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < lines.Length; i++)
            {
                string line = lines[i];
                if (line.Trim() == "")
                {
                    continue;
                }
                ParsedLine parsedLine = ParsedLine.Parse(line);
                if (parsedLine.Command == "menu")
                {
                    ParsedLine option1     = ParsedLine.Parse(lines[i + 1]);
                    ParsedLine option1Then = ParsedLine.Parse(lines[i + 2]);
                    ParsedLine option2     = ParsedLine.Parse(lines[i + 3]);
                    ParsedLine option2Then = ParsedLine.Parse(lines[i + 4]);
                    i += 4;
                    commands.Add(new MenuCommand(option1, option1Then, option2, option2Then));
                }
                else
                {
                    commands.AddRange(ParseCommand(parsedLine));
                }
            }
            commands.Add(new EndScenarioCommand());
            return(commands);
        }
        private void UpdateTextEditor()
        {
            Uri tryUri;

            try
            {
                InitGraph();

                var nLabel = G.CreateUriNode(UriFactory.Create("http://www.w3.org/2000/01/rdf-schema#label"));
                G.Assert(new Triple(G.CreateUriNode(UriFactory.Create(GraphUri)), nLabel,
                                    G.CreateLiteralNode(GraphLabel)));

                var lines =
                    textBoxTextEditor.Text.Replace("\t", new string(' ', 4))
                    .Replace("\r", "")
                    .Split(new[] { '\n' })
                    .ToList();

                var parsedLines = new List <ParsedLine>();
                foreach (var line in lines)
                {
                    if (line.Trim() == "")
                    {
                        continue;
                    }
                    var parsedLine = ParsedLine.Parse(line);
                    parsedLines.Add(parsedLine);
                    parsedLines.AddRange(parsedLine.InnerLines.Select(ParsedLine.Parse));
                }

                var rList = new List <string>();
                var pList = new List <string>();
                foreach (var parsedLine in parsedLines)
                {
                    var tab = parsedLine.Tab;

                    for (var i = rList.Count() - 1; i > tab; i--)
                    {
                        rList.RemoveAt(i);
                    }
                    for (var i = rList.Count() - 1; i < tab; i++)
                    {
                        rList.Add("");
                    }
                    for (var i = pList.Count() - 1; i > tab; i--)
                    {
                        pList.RemoveAt(i);
                    }
                    for (var i = pList.Count() - 1; i < tab; i++)
                    {
                        pList.Add("");
                    }

                    if (parsedLine.Predicate != "")
                    {
                        pList[tab] = parsedLine.Predicate;
                    }
                    if (parsedLine.Resource == "")
                    {
                        continue;
                    }

                    var predicate = "";
                    for (var i = pList.Count - 1; i >= 0 && predicate == ""; i--)
                    {
                        predicate = pList[i];
                    }
                    if (predicate == "")
                    {
                        predicate = "http://rdfs.org/sioc/ns#container_of";
                    }

                    if (!Uri.TryCreate(predicate, UriKind.Absolute, out tryUri))
                    {
                        predicate = Uri.EscapeUriString(
                            string.Format("{0}p#{1}", MainForm.config.GlobalPrefix, predicate));
                    }

                    var resource = parsedLine.Resource;

                    string currUri, currLabel;
                    if (resource[0] == '#')
                    {
                        currUri = Uri.EscapeUriString(
                            string.Format("{0}r#{1}", MainForm.config.GlobalPrefix,
                                          resource.Substring(1)));
                        currLabel = resource.Substring(1);
                    }
                    else
                    {
                        if (Uri.TryCreate(resource, UriKind.Absolute, out tryUri))
                        {
                            currUri   = tryUri.ToString();
                            currLabel = tryUri.Segments.Last().Replace("/", "");
                        }
                        else
                        {
                            var objUri = resource;
                            if (objUri.Length > 64)
                            {
                                objUri = objUri.Substring(0, 64);
                            }

                            currUri   = Uri.EscapeUriString(string.Format("{0}/r#{1}", GraphUri, objUri));
                            currLabel = resource;
                        }
                    }
                    rList[tab] = currUri;

                    var prevUri = "";
                    for (var i = tab - 1; i >= 0 && prevUri == ""; i--)
                    {
                        prevUri = rList[i];
                    }

                    if (prevUri != "")
                    {
                        var nS = G.CreateUriNode(UriFactory.Create(prevUri));
                        var nP = G.CreateUriNode(UriFactory.Create(predicate));
                        var nO = G.CreateUriNode(UriFactory.Create(currUri));
                        G.Assert(new Triple(nS, nP, nO));

                        var nLabelVal = G.CreateLiteralNode(currLabel);
                        G.Assert(new Triple(nO, nLabel, nLabelVal));
                    }
                    else
                    {
                        var nO        = G.CreateUriNode(UriFactory.Create(currUri));
                        var nLabelVal = G.CreateLiteralNode(currLabel);
                        G.Assert(new Triple(nO, nLabel, nLabelVal));
                    }
                }
                ReportMsg("");
            }
            catch (Exception ex)
            {
                ReportMsg(ex);
            }
        }