public static string HtmlizeTags(string[] tags, MetaDocs meta)
        {
            StringBuilder tagOutput = new StringBuilder();

            foreach (string tag in tags)
            {
                string[] parts      = tag.Split(' ', 2);
                string   properName = $"<code>{ScriptHighlighter.ColorArgument(Util.EscapeForHTML(parts[0]), false)}</code>";
                if (parts.Length == 2)
                {
                    tagOutput.Append(properName).Append(' ').Append(ParseAndEscape(parts[1]));
                }
                else
                {
                    MetaTag actualTag = meta.FindTag(parts[0]);
                    if (actualTag == null)
                    {
                        string nameLow = parts[0].ToLowerFast();
                        tagOutput.Append(Util.EscapeForHTML(parts[0])).Append((nameLow == "none" || nameLow == "todo") ? "" : " ERROR: TAG INVALID");
                    }
                    else
                    {
                        string desc = ParseAndEscape(actualTag.Description);
                        if (desc.Contains('\n'))
                        {
                            desc = desc.Before('\n') + $" <a href=\"/Docs/Tags/{actualTag.CleanedName}\">(...)</a>";
                        }
                        tagOutput.Append($"<a href=\"/Docs/Tags/{actualTag.CleanedName}\">").Append(properName).Append("</a> ").Append(desc);
                    }
                }
                tagOutput.Append("\n<br>");
            }
            return(tagOutput.ToString());
        }
Exemplo n.º 2
0
 /// <summary>
 /// Post-check handler for tags, used in <see cref="MetaCommand"/> and <see cref="MetaMechanism"/>.
 /// </summary>
 /// <param name="docs">The relevant docs object.</param>
 /// <param name="tags">The relevant tags list.</param>
 public void PostCheckTags(MetaDocs docs, string[] tags)
 {
     foreach (string tag in tags)
     {
         if (tag.EndsWith(">"))
         {
             MetaTag realTag = docs.FindTag(tag);
             if (realTag == null)
             {
                 docs.LoadErrors.Add($"{Type.Name} '{Name}' references tag '{tag}', which doesn't exist.");
             }
         }
         PostCheckLinkableText(docs, tag);
     }
 }
Exemplo n.º 3
0
        /// <summary>
        /// Post-check handler for linkable text, to find bad links.
        /// </summary>
        /// <param name="docs">The relevant docs object.</param>
        /// <param name="linkedtext">The relevant linkable list.</param>
        public void PostCheckLinkableText(MetaDocs docs, string linkedtext)
        {
            if (string.IsNullOrWhiteSpace(linkedtext))
            {
                return;
            }
            int nextLinkIndex = linkedtext.IndexOf("<@link");

            if (nextLinkIndex < 0)
            {
                return;
            }
            while (nextLinkIndex >= 0)
            {
                int endIndex = FindClosingTagMark(linkedtext, nextLinkIndex + 1);
                if (endIndex < 0)
                {
                    return;
                }
                int    startOfMetaCommand = nextLinkIndex + "<@link ".Length;
                string metaCommand        = linkedtext.Substring(startOfMetaCommand, endIndex - startOfMetaCommand);
                if (!metaCommand.StartsWith("url"))
                {
                    int firstSpace = metaCommand.IndexOf(' ');
                    if (firstSpace < 0)
                    {
                        docs.LoadErrors.Add($"{Type.Name} '{Name}' contains text link '{metaCommand}', which is formatted incorrectly.");
                        return;
                    }
                    string type       = metaCommand.Substring(0, firstSpace).ToLowerFast();
                    string searchText = metaCommand.Substring(firstSpace + 1).ToLowerFast();
                    bool   exists;
                    if (type.Equals("command"))
                    {
                        exists = docs.Commands.ContainsKey(searchText);
                    }
                    else if (type.Equals("tag"))
                    {
                        exists = docs.FindTag(searchText) != null;
                    }
                    else if (type.Equals("mechanism"))
                    {
                        exists = docs.Mechanisms.ContainsKey(searchText);
                    }
                    else if (type.Equals("event"))
                    {
                        if (searchText.StartsWith("on "))
                        {
                            searchText = searchText.Substring("on ".Length);
                        }
                        exists = docs.Events.Values.Any(e => e.CleanEvents.Any(s => s.Contains(searchText)));
                        if (!exists)
                        {
                            exists = docs.Events.Values.Any(e => e.RegexMatcher.IsMatch(searchText));
                        }
                    }
                    else if (type.Equals("action"))
                    {
                        if (searchText.StartsWith("on "))
                        {
                            searchText = searchText.Substring("on ".Length);
                        }
                        exists = docs.Actions.Values.Any(a => a.CleanActions.Any(s => s.Contains(searchText)));
                    }
                    else if (type.Equals("language"))
                    {
                        exists = docs.Languages.Keys.Any(s => s.Contains(searchText));
                    }
                    else
                    {
                        docs.LoadErrors.Add($"{Type.Name} '{Name}' contains text link '{metaCommand}', which refers to an unknown meta type.");
                        return;
                    }
                    if (!exists)
                    {
                        docs.LoadErrors.Add($"{Type.Name} '{Name}' contains text link '{metaCommand}', which does not exist.");
                        return;
                    }
                }
                nextLinkIndex = linkedtext.IndexOf("<@link", endIndex + 1);
            }
        }