/// <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 TestKaraokeLineEncodeAndDecode() { const string lyricText = "[00:17:97]帰[00:18:37]り[00:18:55]道[00:18:94]は[00:19:22]"; var timeTagComponent = new TimeTagParserComponent(); var lyric = timeTagComponent.Decode(lyricText); // Test lyric Assert.AreEqual(lyric.Text, "帰り道は"); // Test time tag Assert.AreEqual(lyric.TimeTags.Length, 10); Assert.AreEqual(lyric.TimeTags[0].Time, -1); Assert.AreEqual(lyric.TimeTags[1].Time, 17970); Assert.AreEqual(lyric.TimeTags[2].Time, -1); Assert.AreEqual(lyric.TimeTags[3].Time, 18370); // Then encode var encodeResult = timeTagComponent.Encode(lyric); // Test encode result Assert.AreEqual(encodeResult, encodeResult); }
/// <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()); }