/// <summary> /// Decode lrc format file /// </summary> /// <param name="text"></param> /// <returns></returns> public override Lyric Decode(string text) { // All lyric lines var lines = new List <string>(); // Components var atTags = new List <AtTag>(); var rubyTags = new List <RubyTag>(); // Get all lines var sr = new StringReader(text); for (var s = sr.ReadLine(); s != null; s = sr.ReadLine()) { lines.Add(s); } // Get all atTag(@) in text var atTagComponent = new AtTagParserComponent(); foreach (var line in lines.ToList()) { var atTag = atTagComponent.Decode(line); if (atTag == null) { continue; } atTags.Add(atTag.Value); lines.Remove(line); } // Get all lyric from remain text var timeTagComponent = new TimeTagParserComponent(); var lyric = new Lyric { Lines = lines.Select(line => timeTagComponent.Decode(line)).ToArray() }; // Process ruby tags var rubyTagComponent = new RubyTagParserComponent(lyric); foreach (var atTag in atTags.ToList()) { var rubyTag = rubyTagComponent.Decode(atTag); if (rubyTag == null) { continue; } rubyTags.Add(rubyTag.Value); atTags.Remove(atTag); } lyric.RubyTags = rubyTags.ToArray(); return(lyric); }
public void TestAtTagEncode(string rubyTag, string parent, string ruby) { // At tag component var atTagComponent = new AtTagParserComponent(); var result = atTagComponent.Decode(rubyTag); // Ruby tag component(without filter duplicated) var atRubyTagComponent = new RubyTagParserComponent(null, false); var rubyResult = atRubyTagComponent.Decode(result.Value); // Check is not null; Assert.AreEqual(rubyResult.HasValue, true); var rubyValue = rubyResult.Value; Assert.AreEqual(rubyValue.Parent, parent); Assert.AreEqual(rubyValue.Ruby, ruby); }
public void TestAtTagDecode(string rubyTagText, string parent, string ruby) { // Ruby tag var rubyTag = new RubyTag { Parent = parent, Ruby = ruby }; // Ruby tag component var atRubyTagComponent = new RubyTagParserComponent(null); var atTag = atRubyTagComponent.Encode(rubyTag); // At tag component var atTagComponent = new AtTagParserComponent(); var result = atTagComponent.Encode(atTag); Assert.AreEqual(result, rubyTagText); }
/// <summary> /// Encode lrc format file /// </summary> /// <param name="lyric"></param> /// <returns></returns> public override string Encode(Lyric lyric) { if (lyric == null) { return(null); } var sb = new StringBuilder(); // Get all lyric in remain text var timeTagComponent = new TimeTagParserComponent(); foreach (var line in lyric.Lines) { var lyricResult = timeTagComponent.Encode(line); //Copy result sb.AppendLine(lyricResult); } // Change new line sb.AppendLine(""); // Convert ruby into ast tag var rubyTagComponent = new RubyTagParserComponent(lyric); var atTags = lyric.RubyTags.Select(rubyTag => rubyTagComponent.Encode(rubyTag)).ToList(); // Convert at tag into string var atTagComponent = new AtTagParserComponent(); foreach (var atTagResult in atTags.Select(atTag => atTagComponent.Encode(atTag))) { //Copy result sb.AppendLine(atTagResult); } //return result return(sb.ToString()); }