public static void AddDirtWord(string word, DirtWordNode root) { DirtWordNode curNode = root; char[] arr = word.ToCharArray(); for (int i = 0; i < arr.Length; i++) { char c = arr[i]; curNode = curNode.AppendChild(c, i == arr.Length - 1); } }
void RebuildMapping() { needRebuild = false; mapping = new SMap <string, Sprite>(); rootNode = new DirtWordNode(); if (data != null) { foreach (var i in data) { mapping[i.Value] = i.Sprite; DirtWordTool.AddDirtWord(i.Value, rootNode); } } }
public DirtWordNode AppendChild(char c, bool canTerminate) { if (!children.contains(c)) { DirtWordNode node = new DirtWordNode(); node.Character = c; node.Word = word + c; node.CanTerminate = canTerminate; children.put(c, node); return(node); } else { return(children[c]); } }
public static string ReplaceDirtWord(this string str, DirtWordNode root, out SList <DirtWordNode> match) { match = new SList <DirtWordNode>(); if (str == null) { return(null); } char[] arr = str.ToCharArray(); int curIdx = 0; int wordIdx = 0; StringBuilder sb = new StringBuilder(); DirtWordNode curNode = root; DirtWordNode old = curNode; while (curIdx < str.Length) { char c = arr[curIdx + wordIdx]; old = curNode; curNode = curNode[c]; if (curNode != null) { wordIdx++; if (curNode.Terminated) { DirtWordNode newNode = new DirtWordNode(); newNode.Word = curNode.Word; newNode.Index = curIdx; match.add(newNode); for (int i = 0; i < curNode.Word.Length; i++) { sb.Append('*'); } curIdx += wordIdx; wordIdx = 0; curNode = root; } else if (curIdx + wordIdx >= str.Length) { for (int i = 0; i < wordIdx; i++) { sb.Append(arr[curIdx + i]); } curIdx += wordIdx; } } else { if (old != null && old != root) { if (old.CanTerminate) { DirtWordNode newNode = new DirtWordNode(); newNode.Word = curNode.Word; newNode.Index = curIdx; match.add(newNode); for (int i = 0; i < old.Word.Length; i++) { sb.Append('*'); } } else { sb.Append(old.Word); } curNode = root; curIdx += wordIdx; wordIdx = 0; old = null; } else { sb.Append(c); curNode = root; curIdx++; wordIdx = 0; } } } if (old != null && old != root) { if (old.CanTerminate) { DirtWordNode newNode = new DirtWordNode(); newNode.Word = curNode.Word; newNode.Index = curIdx; match.add(newNode); for (int i = 0; i < old.Word.Length; i++) { sb.Append('*'); } } else { sb.Append(old.Word); } curNode = root; curIdx += wordIdx; wordIdx = 0; old = null; } return(sb.ToString()); }