| /*=============================================================================# |
| # Copyright (c) 2014, 2018 Stephan Wahlbrink and others. |
| # |
| # This program and the accompanying materials are made available under the |
| # terms of the Eclipse Public License 2.0 which is available at |
| # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 |
| # which is available at https://www.apache.org/licenses/LICENSE-2.0. |
| # |
| # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 |
| # |
| # Contributors: |
| # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation |
| #=============================================================================*/ |
| |
| package org.eclipse.statet.redocs.wikitext.r.core.source; |
| |
| import static org.eclipse.statet.redocs.r.core.source.AbstractRChunkPartitionNodeScanner.R_CHUNK_BASE_TYPE; |
| |
| import org.eclipse.statet.ecommons.text.core.treepartitioner.ITreePartitionNode; |
| import org.eclipse.statet.ecommons.text.core.treepartitioner.ITreePartitionNodeType; |
| |
| import org.eclipse.statet.docmlet.wikitext.core.markup.IMarkupLanguage; |
| import org.eclipse.statet.docmlet.wikitext.core.source.EmbeddingAttributes; |
| import org.eclipse.statet.docmlet.wikitext.core.source.extdoc.WikidocPartitionNodeScanner; |
| import org.eclipse.statet.r.core.source.RPartitionNodeType; |
| import org.eclipse.statet.redocs.r.core.source.AbstractRChunkPartitionNodeScanner; |
| |
| |
| public class WikidocRweavePartitionNodeScanner extends WikidocPartitionNodeScanner { |
| |
| |
| private AbstractRChunkPartitionNodeScanner rScanner; |
| |
| |
| public WikidocRweavePartitionNodeScanner(final IMarkupLanguage markupLanguage) { |
| super(markupLanguage); |
| } |
| |
| public WikidocRweavePartitionNodeScanner(final IMarkupLanguage markupLanguage, |
| final int markupLanguageMode) { |
| super(markupLanguage, markupLanguageMode); |
| } |
| |
| |
| @Override |
| protected void init() { |
| { final IMarkupLanguage markupLanguage= getMarkupLanguage(); |
| if (markupLanguage instanceof IRweaveMarkupLanguage) { |
| final IRweaveMarkupLanguage rweaveLanguage= (IRweaveMarkupLanguage) markupLanguage; |
| |
| this.rScanner= rweaveLanguage.getRChunkPartitionScanner(); |
| } |
| else { |
| throw new IllegalArgumentException("markupLanguage"); //$NON-NLS-1$ |
| } |
| } |
| |
| final ITreePartitionNode beginNode= getScan().getBeginNode(); |
| if (beginNode.getType() instanceof RPartitionNodeType) { |
| assert (false); |
| // this.rBeginNode= beginNode; |
| // while (beginNode.getParent().getType() instanceof RPartitionNodeType) { |
| // beginNode= beginNode.getParent(); |
| // } |
| // // !(beginNode.getParent().getType() instanceof RPartitionNodeType) |
| // final RPartitionNodeType rType= (RPartitionNodeType) beginNode.getType(); |
| // if (rType == WikitextRChunkPartitionNodeScanner.R_CHUNK_CONTROL_TYPE) { |
| // initNode(beginNode, RCHUNK_WIKITEXT_TYPE); |
| // } |
| // else { |
| // initNode(beginNode, RINLINE_WIKITEXT_TYPE); |
| // } |
| // return; |
| } |
| super.init(); |
| } |
| |
| |
| @Override |
| protected void beginEmbeddingBlock(final BlockType type, |
| final EmbeddingAttributes attributes) { |
| if (type == BlockType.CODE |
| && attributes.getForeignType() == IRweaveMarkupLanguage.EMBEDDED_R) { |
| addNode(R_CHUNK_BASE_TYPE, getEventBeginOffset()); |
| setEmbedded(getNode(), attributes); |
| return; |
| } |
| super.beginEmbeddingBlock(type, attributes); |
| } |
| |
| @Override |
| protected void endEmbeddingBlock(final ITreePartitionNodeType type, |
| final EmbeddingAttributes attributes) { |
| if (type instanceof RPartitionNodeType) { |
| // this.embeddedContentEndOffset= getScan().getDocument().getLength(); |
| executeForeignScanner(this.rScanner); |
| exitNode(getEventEndOffset(), 0); |
| return; |
| } |
| super.endEmbeddingBlock(type, attributes); |
| } |
| |
| @Override |
| protected void beginEmbeddingSpan(final SpanType type, final EmbeddingAttributes attributes) { |
| if (type == SpanType.CODE |
| && attributes.getForeignType() == IRweaveMarkupLanguage.EMBEDDED_R) { |
| addNode(this.rScanner.getDefaultRootType(), |
| getBeginOffset() + attributes.getContentRegion().getOffset() ); |
| setEmbedded(getNode(), attributes); |
| return; |
| } |
| super.beginEmbeddingSpan(type, attributes); |
| } |
| |
| @Override |
| protected void endEmbeddingSpan(final ITreePartitionNodeType type, final EmbeddingAttributes attributes) { |
| if (type instanceof RPartitionNodeType) { |
| if (this.embeddedContentEndOffset < 0) { |
| this.embeddedContentEndOffset= getEventEndOffset() - 1; |
| } |
| |
| exitNode(this.embeddedContentEndOffset, 0); |
| |
| if (this.embeddingNode.getLength() > 0) { |
| executeForeignScanner(this.rScanner); |
| } |
| return; |
| } |
| super.endEmbeddingSpan(type, attributes); |
| } |
| |
| } |