Exemple #1
0
        private static MediaQuery ParseQuery(string value, IPosition forPositon)
        {
            int i = value.IndexOf(' ');

            if (i == -1)
            {
                i = value.Length;
            }

            var   mediaType = value.Substring(0, i);
            Media media;

            if (!Enum.TryParse <Media>(mediaType, ignoreCase: true, result: out media))
            {
                Current.RecordError(ErrorType.Parser, forPositon, "Unrecognized media type '" + mediaType + "'");
                throw new StoppedParsingException();
            }

            var clauses = new List <MediaQuery>();

            var rest = value.Substring(i).Trim();

            while (rest.StartsWith("and ", StringComparison.InvariantCultureIgnoreCase))
            {
                int j = rest.IndexOf(" and ", "and ".Length, StringComparison.InvariantCultureIgnoreCase);
                if (j == -1)
                {
                    j = rest.Length;
                }

                var clause = rest.Substring("and ".Length, j - "and ".Length).Trim();

                clauses.Add(ParseMediaClause(clause, forPositon));

                rest = rest.Substring(j).Trim();
            }

            if (rest.Length != 0)
            {
                Current.RecordError(ErrorType.Parser, forPositon, "Unexpected tail on media query, found '" + rest + "'");
                throw new StoppedParsingException();
            }

            var mediaClause = new MediaType(media, forPositon);

            if (clauses.Count == 0)
            {
                return(mediaClause);
            }

            MediaQuery ret = mediaClause;

            foreach (var clause in clauses)
            {
                ret = new AndMedia(ret, clause, forPositon);
            }

            return(ret);
        }
Exemple #2
0
        private static MediaQuery ParseQuery(string value, IPosition forPositon)
        {
            int i = value.IndexOf(' ');
            if (i == -1) i = value.Length;

            var mediaType = value.Substring(0, i);
            Media media;
            if (!Enum.TryParse<Media>(mediaType, ignoreCase: true, result: out media))
            {
                Current.RecordError(ErrorType.Parser, forPositon, "Unrecognized media type '" + mediaType + "'");
                throw new StoppedParsingException();
            }

            var clauses = new List<MediaQuery>();

            var rest = value.Substring(i).Trim();
            while (rest.StartsWith("and ", StringComparison.InvariantCultureIgnoreCase))
            {
                int j = rest.IndexOf(" and ", "and ".Length, StringComparison.InvariantCultureIgnoreCase);
                if (j == -1) j = rest.Length;

                var clause = rest.Substring("and ".Length, j - "and ".Length).Trim();

                clauses.Add(ParseMediaClause(clause, forPositon));

                rest = rest.Substring(j).Trim();
            }

            if (rest.Length != 0)
            {
                Current.RecordError(ErrorType.Parser, forPositon, "Unexpected tail on media query, found '" + rest + "'");
                throw new StoppedParsingException();
            }

            var mediaClause = new MediaType(media, forPositon);

            if (clauses.Count == 0) return mediaClause;

            MediaQuery ret = mediaClause;

            foreach (var clause in clauses)
            {
                ret = new AndMedia(ret, clause, forPositon);
            }

            return ret;
        }