private SlideVuller InvullenLiedTekst(string tempinhoud)
            {
                var returnValue = new SlideVuller();
                var regels = SplitRegels.Split(tempinhoud);

                // We moeten goed opletten bij het invullen van een liedtekst op een slide:
                // -Het mogen niet te veel regels zijn (instellingen beperken dat)
                // -We willen niet beginregels verspillen aan witruimte
                // -Tussenwitregels willen we wel respecteren
                // -Als we afbreken in een aaneengesloten stuk tekst moeten we kijken of we toch niet
                //  naar een voorgaande witruimte kunnen afbreken

                // kijk waar we gaan beginnen. Sla begin witregels over
                var beginIndex = regels.Select((r, i) => new { Regel = r, Index = i })
                  .Where(r => !SkipRegel(r.Regel))
                  .Select(r => (int?)r.Index)  // nullable int zodat als we niets vinden we dat weten
                  .FirstOrDefault();
                if (!beginIndex.HasValue)
                    return returnValue;  // er is niets over

                // kijk waar we eindigen als we instellinge-aantal tellen vanaf ons startpunt
                var eindIndex = regels.Select((r, i) => new { Regel = r, Index = i })
                  .Where(r => r.Index >= beginIndex && (r.Index - beginIndex) < _buildDefaults.RegelsPerLiedSlide && r.Regel != NieuweSlideAanduiding)
                  .Select(r => r.Index)  // eindindex is er altijd als er een begin is
                  .LastOrDefault();

                var optimaliseerEindIndex = eindIndex;
                // Kijk of we niet beter op een eerdere witregel kunnen stoppen
                if (!SkipRegel(regels[optimaliseerEindIndex]) && regels.Length != optimaliseerEindIndex + 1)
                {
                    var tryOptimaliseerEindIndex = regels.Select((r, i) => new { Regel = r, Index = i })
                      .Skip(beginIndex.Value).Take(optimaliseerEindIndex + 1 - beginIndex.Value)
                      .OrderByDescending(r => r.Index)
                      .Where(r => SkipRegel(r.Regel))
                      .Select(r => (int?)r.Index)
                      .FirstOrDefault();
                    if (tryOptimaliseerEindIndex.HasValue && tryOptimaliseerEindIndex.Value > beginIndex.Value)
                        optimaliseerEindIndex = tryOptimaliseerEindIndex.Value;
                }

                // haal regels van het vers op
                var insertLines = regels
                  .Skip(beginIndex.Value).Take(optimaliseerEindIndex + 1 - beginIndex.Value)
                  .Select(r => (r ?? "").Trim()).ToList();

                // plaats de in te voegen regels in het tekstveld (geen enter aan het einde)
                returnValue.Invullen = string.Join("", insertLines.Select((l, i) => l + (i + 1 == insertLines.Count ? "" : "\r\n")));

                var overStart = optimaliseerEindIndex + 1;
                if (overStart >= regels.Length)
                    return returnValue;
                if (regels[overStart] == NieuweSlideAanduiding)
                    overStart++;
                var overLines = regels.Skip(overStart).ToList();

                // afbreek teken tonen alleen als een vers doormidden gebroken is
                if (!SkipRegel(insertLines.Last()) && overLines.Any() && !SkipRegel(overLines.First()))
                    returnValue.Invullen += "\r\n >>";

                // Geef de resterende regels terug
                returnValue.Over = string.Join("", overLines.Select((l, i) => l + (i + 1 == overLines.Count ? "" : "\r\n")));
                return returnValue;
            }
Example #2
0
        /// <summary>
        /// Vul de liedtekst over meerdere slides
        /// </summary>
        public static SlideVuller InvullenLiedTekst(string tempinhoud, int regelsPerLiedSlide, bool visualiseerAfbreking)
        {
            var returnValue = new SlideVuller();
            var regels      = SplitRegels.Split(tempinhoud);

            // We moeten goed opletten bij het invullen van een liedtekst op een slide:
            // -Het mogen niet te veel regels zijn (instellingen beperken dat)
            // -We willen niet beginregels verspillen aan witruimte
            // -Tussenwitregels willen we wel respecteren
            // -Als we afbreken in een aaneengesloten stuk tekst moeten we kijken of we toch niet
            //  naar een voorgaande witruimte kunnen afbreken

            // kijk waar we gaan beginnen. Sla begin witregels over
            var beginIndex = regels.Select((r, i) => new { Regel = r, Index = i })
                             .Where(r => !SkipRegel(r.Regel))
                             .Select(r => (int?)r.Index) // nullable int zodat als we niets vinden we dat weten
                             .FirstOrDefault();

            if (!beginIndex.HasValue)
            {
                return(returnValue);  // er is niets over
            }
            // kijk waar we eindigen als we instellinge-aantal tellen vanaf ons startpunt
            var eindIndex = regels.Select((r, i) => new { Regel = r, Index = i })
                            .Where(r => r.Index >= beginIndex && (r.Index - beginIndex) < regelsPerLiedSlide && r.Regel != NieuweSlideAanduiding)
                            .Select(r => r.Index) // eindindex is er altijd als er een begin is
                            .LastOrDefault();

            var optimaliseerEindIndex = eindIndex;

            // Kijk of we niet beter op een eerdere witregel kunnen stoppen
            if (!SkipRegel(regels[optimaliseerEindIndex]) && regels.Length != optimaliseerEindIndex + 1)
            {
                var tryOptimaliseerEindIndex = regels.Select((r, i) => new { Regel = r, Index = i })
                                               .Skip(beginIndex.Value).Take(optimaliseerEindIndex + 1 - beginIndex.Value)
                                               .OrderByDescending(r => r.Index)
                                               .Where(r => SkipRegel(r.Regel))
                                               .Select(r => (int?)r.Index)
                                               .FirstOrDefault();
                if (tryOptimaliseerEindIndex.HasValue && tryOptimaliseerEindIndex.Value > beginIndex.Value)
                {
                    optimaliseerEindIndex = tryOptimaliseerEindIndex.Value;
                }
            }

            // haal regels van het vers op
            var insertLines = regels
                              .Skip(beginIndex.Value).Take(optimaliseerEindIndex + 1 - beginIndex.Value)
                              .Select(r => (r ?? "").Trim()).ToList();

            // plaats de in te voegen regels in het tekstveld (geen enter aan het einde)
            returnValue.Invullen = string.Join("", insertLines.Select((l, i) => l + (i + 1 == insertLines.Count ? "" : "\r\n")));

            var overStart = optimaliseerEindIndex + 1;

            if (overStart >= regels.Length)
            {
                return(returnValue);
            }
            if (regels[overStart] == NieuweSlideAanduiding)
            {
                overStart++;
            }
            var overLines = regels.Skip(overStart).ToList();

            // afbreek teken tonen alleen als een vers doormidden gebroken is
            if (visualiseerAfbreking && !SkipRegel(insertLines.Last()) && overLines.Any() && !SkipRegel(overLines.First()))
            {
                returnValue.Invullen += $"\r\n{OnderbrekingAanduiding}";
            }

            // Geef de resterende regels terug
            returnValue.Over = string.Join("", overLines.Select((l, i) => l + (i + 1 == overLines.Count ? "" : "\r\n")));
            return(returnValue);
        }