예제 #1
0
        private IEnumerable <CreoleRichTextElementNodeData> _GetHyperlinkContentElementNodesData(TokenRange <CreoleTokenCode> tokens, IEnumerable <CreoleRichTextElementType> excludedElementTypes)
        {
            var baseElementsData = new List <CreoleRichTextElementData>();

            using (var baseElementProcessor = _GetHyperlinkBaseElementProcessor(_context, tokens))
                while (baseElementProcessor.MoveNext())
                {
                    baseElementsData.Add(baseElementProcessor.Current);
                }

            IElementDataIterator elementDataIterator;
            var styleElementsIterator = _GetStyleElementIterator(_context, tokens, baseElementsData, excludedElementTypes);

            if (styleElementsIterator != null)
            {
                elementDataIterator = new MergeElementDataIterator(styleElementsIterator, new ElementDataCollectionIteratorAdapter(baseElementsData));
            }
            else
            {
                elementDataIterator = new ElementDataCollectionIteratorAdapter(baseElementsData);
            }

            var elementsData = new List <CreoleRichTextElementData>();

            using (elementDataIterator)
                while (elementDataIterator.MoveNext())
                {
                    elementsData.Add(elementDataIterator.Current);
                }

            return(_GetRootNodesFrom(tokens, elementsData));
        }
예제 #2
0
        internal IEnumerable <Element> Process(TokenRange <CreoleTokenCode> tokens)
        {
            var baseElementsData = new List <CreoleRichTextElementData>();

            using (var baseElementProcessor = _GetBaseElementProcessor(_context, tokens))
                while (baseElementProcessor.MoveNext())
                {
                    baseElementsData.Add(baseElementProcessor.Current);
                }

            var elementsData = new List <CreoleRichTextElementData>();

            using (var elementDataIterator = new MergeElementDataIterator(_GetStyleElementIterator(_context, tokens, baseElementsData), new ElementDataCollectionIteratorAdapter(baseElementsData)))
                while (elementDataIterator.MoveNext())
                {
                    elementsData.Add(elementDataIterator.Current);
                }

            return(_GetCreoleElements(tokens, elementsData));
        }
예제 #3
0
        private IElementDataIterator _GetStyleElementIterator(CreoleParserContext context, TokenRange <CreoleTokenCode> tokens, IEnumerable <CreoleRichTextElementData> baseElementsData, IEnumerable <CreoleRichTextElementType> excludedElementTypes)
        {
            var processors = new List <IElementDataIterator>();

            if (excludedElementTypes == null)
            {
                foreach (var styleElementFactory in _styleElementFactories)
                {
                    var elementType = styleElementFactory.Key;
                    processors.Add(new ElementProcessorFilterIterator(styleElementFactory.Value(_context, tokens, baseElementsData), elementType));
                }
            }
            else
            {
                foreach (var styleElementFactory in _styleElementFactories)
                {
                    var elementType = styleElementFactory.Key;
                    if (!_Contains(excludedElementTypes, elementType))
                    {
                        processors.Add(new ElementProcessorFilterIterator(styleElementFactory.Value(_context, tokens, baseElementsData), elementType));
                    }
                }
            }

            IElementDataIterator styleElementIterator = null;

            using (var processor = processors.GetEnumerator())
                if (processor.MoveNext())
                {
                    styleElementIterator = processor.Current;
                    while (processor.MoveNext())
                    {
                        styleElementIterator = new MergeElementDataIterator(styleElementIterator, processor.Current);
                    }
                }
            return(styleElementIterator);
        }