Beispiel #1
0
        /// <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);
        }
Beispiel #4
0
        /// <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());
        }