blob: 5300ca0b670c905c11d2958b82d113cd5655c2d6 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2005, 2020 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.r.ui.text.rd;
import java.util.List;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.WhitespaceRule;
import org.eclipse.jface.text.rules.WordRule;
import org.eclipse.statet.ecommons.text.DefaultWhitespaceDetector;
import org.eclipse.statet.ecommons.text.core.rules.OperatorRule;
import org.eclipse.statet.ecommons.text.ui.presentation.AbstractRuleBasedScanner;
import org.eclipse.statet.ecommons.text.ui.settings.TextStyleManager;
import org.eclipse.statet.r.core.rdoc.RdTags;
/**
* Scanner for common Rd code (in no verbatim-like sections).
*/
public class RdCodeScanner extends AbstractRuleBasedScanner {
private static class TagDetector implements IWordDetector {
@Override
public boolean isWordStart(final char c) {
return (c == '\\');
}
@Override
public boolean isWordPart(final char c) {
return Character.isLetter(c);
}
}
public RdCodeScanner(final TextStyleManager textStyles) {
super(textStyles);
initRules();
}
@Override
protected void createRules(final List<IRule> rules) {
final IToken tDefaultText= getToken(RdTextTokens.DEFAULT);
final IToken tSectionTag= getToken(RdTextTokens.SECTION_TAG);
final IToken tSubSectionTag= getToken(RdTextTokens.SUBSECTION_TAG);
final IToken tOtherTag= getToken(RdTextTokens.OTHER_TAG);
final IToken tUnlistedTag= getToken(RdTextTokens.UNLISTED_TAG);
final IToken tBrackets= getToken(RdTextTokens.BRACKETS);
setDefaultReturnToken(tDefaultText);
// Add generic whitespace rule.
rules.add(new WhitespaceRule(new DefaultWhitespaceDetector()));
final OperatorRule charRule= new OperatorRule(new char[] { '\\', '{', '}' });
charRule.addOps(RdTags.ESCAPED_CHARS, tOtherTag);
charRule.addOps(RdTags.BRACKETS, tBrackets);
rules.add(charRule);
final WordRule tagRule= new WordRule(new TagDetector(), tUnlistedTag);
for (final String tag : RdTags.MAIN_SECTIONS) {
tagRule.addWord(tag, tSectionTag);
}
for (final String tag : RdTags.SUB_SECTIONS) {
tagRule.addWord(tag, tSubSectionTag);
}
for (final String tag : RdTags.TEXT_MARKUP_TAGs) {
tagRule.addWord(tag, tOtherTag);
}
for (final String tag : RdTags.LIST_TABLE_TAGS) {
tagRule.addWord(tag, tOtherTag);
}
for (final String tag : RdTags.MATH_TAGS) {
tagRule.addWord(tag, tOtherTag);
}
for (final String tag : RdTags.INSERTIONS) {
tagRule.addWord(tag, tOtherTag);
}
rules.add(tagRule);
}
}