public static IList <string> IntegrateExistingStylesAndAlterations(string textToParse, StyleDefinition styleDef, bool doStylesFirst)
        {
            if (string.IsNullOrEmpty(textToParse))
            {
                return(new List <string>());
            }

            var styleParts = new List <string>();

            styleParts.AddRange(textToParse.ToUpperInvariant().Split(SplittingStrings.ToArray(), StringSplitOptions.RemoveEmptyEntries));
            styleParts = styleParts.Where(x => SplittingStrings.Where(y => y.Trim().ToUpperInvariant().Contains(x.Trim().ToUpperInvariant())).Count() == 0).ToList();
            var partsToRemove = new List <string>();

            int?idx = null;

            foreach (var part in styleParts)
            {
                #region search main style
                if (doStylesFirst)
                {
                    if (MainStylesRepository.TryRetrieveValueIndex(part, ref idx))
                    {
                        partsToRemove.Add(part);
                        if (idx.HasValue)
                        {
                            try
                            {
                                styleDef.ThrowIfAddMainStyleIsForbidden();
                            }
                            catch (InvalidMusicStyleParsingException)
                            {
                                var message = string.Format("while parsing style part '{0}' we detect too many main styles. string '{1}' will be ignored", textToParse, part);
                                Logging.Logging.Instance.LogError(string.Format("A turnaround will happen : {0}", message), ErrorLevel.Info);
                                continue;
                            }

                            styleDef.AddMainStyleIdx(idx.Value);
                        }
                        continue;
                    }
                }
                #endregion

                #region search style alteration

                if (StyleAlterationsRepository.TryRetrieveValueIndex(part, ref idx))
                {
                    partsToRemove.Add(part);
                    if (idx.HasValue)
                    {
                        try
                        {
                            styleDef.ThrowIfAddStyleAlterationIsForbidden();
                        }
                        catch (InvalidMusicStyleParsingException)
                        {
                            var message = string.Format("while parsing style part '{0}' we detect too many style alterations. string '{1}' will be ignored", textToParse, part);
                            Logging.Logging.Instance.LogError(string.Format("A workaround will happen  : {0}", message), ErrorLevel.Info);
                            continue;
                        }
                        styleDef.AddStyleAlterationIdx(idx.Value);
                    }
                    continue;
                }
                #endregion

                #region search main style
                if (!doStylesFirst)
                {
                    if (MainStylesRepository.TryRetrieveValueIndex(part, ref idx))
                    {
                        partsToRemove.Add(part);
                        if (idx.HasValue)
                        {
                            try
                            {
                                styleDef.ThrowIfAddMainStyleIsForbidden();
                            }
                            catch (InvalidMusicStyleParsingException)
                            {
                                var message = string.Format("while parsing style part '{0}' we detect too many main styles. string '{1}' will be ignored", textToParse, part);
                                Logging.Logging.Instance.LogError(string.Format("A turnaround will happen : {0}", message), ErrorLevel.Info);
                                continue;
                            }

                            styleDef.AddMainStyleIdx(idx.Value);
                        }
                        continue;
                    }
                }
                #endregion
            }

            foreach (var part in partsToRemove)
            {
                styleParts.Remove(part);
            }
            return(styleParts);
        }