All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fitnesse.wikitext.parser.Define Maven / Gradle / Ivy

package fitnesse.wikitext.parser;

import fitnesse.html.HtmlTag;

public class Define extends SymbolType implements Rule, Translation {
  public Define() {
    super("Define");
    wikiMatcher(new Matcher().startLineOrCell().string("!define"));
    wikiRule(this);
    htmlTranslation(this);
  }

  @Override
  public Maybe parse(Symbol current, Parser parser) {
    if (!parser.isMoveNext(SymbolType.Whitespace)) return Symbol.nothing;

    Maybe name = parser.parseToAsString(SymbolType.Whitespace);
    if (name.isNothing()) return Symbol.nothing;
    String variableName = name.getValue();
    if (!ScanString.isVariableName(variableName)) return Symbol.nothing;

    Symbol next = parser.moveNext(1);
    Maybe valueString = (next.isType(SymbolType.Text))
      ? copyVariableValue(parser, next)
      : parseVariableValue(parser, next);
    if (valueString.isNothing()) return Symbol.nothing;

    String variableValue = valueString.getValue();
    parser.getPage().putVariable(variableName, variableValue);
    return new Maybe<>(current.add(variableName).add(variableValue));
  }

  private Maybe copyVariableValue(Parser parser, Symbol next) {
    String fromVariableName = next.getContent();
    if (!ScanString.isVariableName(fromVariableName)) return Maybe.noString;
    return parser.getVariableSource().findVariable(fromVariableName)
      .map(Maybe::new)
      .orElse(Maybe.noString);
  }

  private Maybe parseVariableValue(Parser parser, Symbol next) {
    SymbolType close = next.getType().closeType();
    if (close == SymbolType.Empty) return Maybe.noString;
    return parser.parseToAsString(close);
  }

  @Override
  public String toTarget(Translator translator, Symbol symbol) {
    HtmlTag result = new HtmlTag("span", "variable defined: "
      + translator.translate(symbol.childAt(0))
      + "="
      + translator.translate(symbol.childAt(1)));
    result.addAttribute("class", "meta");
    return result.html();
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy