internal string ConvertPTag(ref PTag tag) { string result = "DataKeepTag("; result += '"' + tag.name + "\", ["; int i = 0; foreach (string arg in tag.arguments) { if (arg.Contains("$")) { result += '"' + arg.Replace("$", "") + '"'; } else { result += arg; } if (i != tag.arguments.Length - 1) { result += ", "; } i++; } return(result + "])"); }
/// <summary> /// Player的标签域不能有两个同名标签 /// </summary> /// <param name="Tag">如果为数字标签,数字相加</param> public void CreateTag(PTag Tag) { if (Owner != null && ExistTag(Tag.Name)) { if (Tag is PNumberedTag) { FindPeekTag <PNumberedTag>(Tag.Name).Value += ((PNumberedTag)Tag).Value; } else { PopTag <PTag>(Tag.Name); } } if (Owner == null || !ExistTag(Tag.Name)) { PLogger.Log("创建标签:" + Tag.Name); Tag.FieldList.ForEach((PTag.PTagField Field) => PLogger.Log(" 域 " + Field + " = " + (Field.Field != null ? Field.Field.ToString() : "null"))); TagList.Add(Tag); } if (Owner != null) { PNetworkManager.NetworkServer.TellClients(new PRefreshMarkStringOrder(Owner)); } }
public static string ConvertToUbb(string htmlContent, ContentConvert beforeConvert, ContentConvert afterConvert) { string msg = string.Empty; htmlContent = htmlContent.Replace("\n", string.Empty); htmlContent = htmlContent.Replace("\r", string.Empty); htmlContent = regScript.Replace(htmlContent, string.Empty); htmlContent = regStyle.Replace(htmlContent, string.Empty); // htmlContent = htmlContent.Trim(); if (beforeConvert != null) { htmlContent = beforeConvert(htmlContent); } MatchCollection matchs = regTag.Matches(htmlContent); int tagIndex = 0; List <HtmlTagBase> tags = new List <HtmlTagBase>() , beginTags = new List <HtmlTagBase>() , endTages = new List <HtmlTagBase>() , singleTags = new List <HtmlTagBase>(); foreach (Match m in matchs) { HtmlTagBase t; string tagName = m.Groups[1].Value; //这里也可以根据HTML标签来反射生成Html标签类, 代码可以少很多, 但是这样性能不好。 switch (tagName.ToLower()) { case "img": t = new ImgTag(tagIndex, m.Value, m.Index); break; case "a": t = new ATag(tagIndex, m.Value, m.Index); break; case "font": t = new FontTag(tagIndex, m.Value, m.Index); break; case "span": t = new SpanTag(tagIndex, m.Value, m.Index); break; case "br": t = new BrTag(tagIndex, m.Value, m.Index); break; case "div": t = new DivTag(tagIndex, m.Value, m.Index); break; case "p": t = new PTag(tagIndex, m.Value, m.Index); break; case "table": t = new TableTag(tagIndex, m.Value, m.Index); break; case "ol": case "ul": t = new ListTag(tagIndex, m.Value, m.Index); break; case "td": case "tr": case "s": case "b": case "i": case "sub": case "sup": case "u": t = new PairTag(tagIndex, m.Value, m.Index); break; case "th": t = new PairTag(tagIndex, m.Value, m.Index); ((PairTag)t).UbbTag = "td"; break; case "strong": t = new PairTag(tagIndex, m.Value, m.Index); ((PairTag)t).UbbTag = "b"; break; case "em": t = new PairTag(tagIndex, m.Value, m.Index); ((PairTag)t).UbbTag = "i"; break; case "strike": t = new PairTag(tagIndex, m.Value, m.Index); ((PairTag)t).UbbTag = "s"; break; case "blockquote": t = new PairTag(tagIndex, m.Value, m.Index); ((PairTag)t).UbbTag = "indent"; break; case "h1": case "h2": case "h3": case "h4": case "h5": case "h6": t = new HTag(tagIndex, m.Value, m.Index); break; case "embed": t = new EmbedTag(tagIndex, m.Value, m.Index); break; default: t = new HtmlTagBase(tagIndex, m.Value, m.Index); break; } tagIndex++; t.TagList = tags; tags.Add(t); if (t.IsSingleTag) { singleTags.Add(t); } else { if (!t.IsEndTag) { beginTags.Add(t); } else { int flag = -1; for (int i = beginTags.Count - 1; i >= 0; i--) { if (beginTags[i].TagName == t.TagName)//匹配开始标记和结束标记 { flag = i; beginTags[i].Pair = t; t.Pair = beginTags[i]; break; } } if (flag >= 0) { for (int i = beginTags.Count - 1; i >= flag; i--) { beginTags.RemoveAt(i); } } } } } StringBuilder builder = new StringBuilder(htmlContent); for (int i = 0; i < tags.Count; i++) { if (!tags[i].IsSingleTag) { if (tags[i].Pair == null) { msg += tags[i].TagName + "没有对应的" + (tags[i].IsEndTag ? "开始" : "结束") + "标记\r\n"; } } if (!tags[i].IsEndTag || tags[i].IsSingleTag) { builder = tags[i].ConvertToUBB(builder); } } //builder.Replace(" ", string.Empty); builder.Replace("\t", string.Empty); htmlContent = builder.ToString(); htmlContent = new Regex("<.*?>").Replace(htmlContent, string.Empty); htmlContent = HttpUtility.HtmlDecode(htmlContent); if (afterConvert != null) { htmlContent = afterConvert(htmlContent); } return(htmlContent); }
public static ITag Create(string str) { ITag tag = null; var strTag = CreateTag(str); var value = CreateValue(str); switch (strTag) { case TagConfig.START: tag = new StartTag(); break; case TagConfig.BGM_PLAY: tag = new BgmPlayTag(); break; case TagConfig.BGM_STOP: tag = new BgmStopTag(); break; case TagConfig.EFFECT_SHOW: tag = new EffectShowTag(); break; case TagConfig.END: tag = new EndTag(); break; case TagConfig.CHARA_LOAD: tag = new CharaLoadTag(); break; case TagConfig.BG_LOAD: tag = new BgLoadTag(); break; case TagConfig.LOAD_EFFECT: tag = new LoadEffectTag(); break; case TagConfig.MSG: tag = new MsgTag(); break; case TagConfig.NAME: tag = new NameTag(); break; case TagConfig.SE_PLAY: tag = new SePlayTag(); break; case TagConfig.BG_SHOW: tag = new BgShowTag(); break; case TagConfig.TITLE_HIDE: tag = new TitleHideTag(); break; case TagConfig.TITLE_SHOW: tag = new TitleShowTag(); break; case TagConfig.CHARA_SHOW: tag = new CharaShowTag(); break; case TagConfig.BG_HIDE: tag = new BgHideTag(); break; case TagConfig.CHARA_HIDE: tag = new CharaHideTag(); break; case TagConfig.WAIT: tag = new WaitTag(); break; case TagConfig.P: tag = new PTag(); break; case TagConfig.ER: tag = new ErTag(); break; case TagConfig.CAMERA_GRAIN: tag = new CameraGrainEffectTag(); break; case TagConfig.CAMERA_COLOR: tag = new CameraColorEffectTag(); break; case TagConfig.CAMERA_VIGNETTE: tag = new CameraVignetteEffectTag(); break; case TagConfig.CAMERA_EFFECT_STOP: tag = new CameraEffectStopTag(); break; } if (tag == null) { Debug.LogError(strTag + "にマッチするタグはありませんでした"); return(null); } tag.Create(value); return(tag); }