package fitnesse.wikitext.parser; import fitnesse.FitNesseContext; import fitnesse.FitNesseVersion; import util.Maybe; import java.util.HashMap; public class ParsingPage { private static SymbolProvider variableDefinitionSymbolProvider = new SymbolProvider(new SymbolType[] { Literal.symbolType, new Define(), new Include(), SymbolType.CloseLiteral, Comment.symbolType, SymbolType.Whitespace, SymbolType.Newline, Variable.symbolType, Preformat.symbolType, SymbolType.ClosePreformat, SymbolType.Text }); private SourcePage page; private SourcePage namedPage; private HashMap<String, HashMap<String, Maybe<String>>> cache; public ParsingPage(SourcePage page) { this(page, page, new HashMap<String, HashMap<String, Maybe<String>>>()); } public ParsingPage copyForPage(SourcePage page) { return new ParsingPage(page, page, this.cache); } public ParsingPage copyForNamedPage(SourcePage namedPage) { return new ParsingPage(this.page, namedPage, this.cache); } private ParsingPage(SourcePage page, SourcePage namedPage, HashMap<String, HashMap<String, Maybe<String>>> cache) { this.page = page; this.namedPage = namedPage; this.cache = cache; } public SourcePage getPage() { return page; } public SourcePage getNamedPage() { return namedPage; } public Maybe<String> getSpecialVariableValue(String key) { String value; if (key.equals("RUNNING_PAGE_NAME")) value = page.getName(); else if (key.equals("RUNNING_PAGE_PATH")) value = page.getPath(); else if (key.equals("PAGE_NAME")) value = namedPage.getName(); else if (key.equals("PAGE_PATH")) value = namedPage.getPath(); else if (key.equals("FITNESSE_PORT")) value = Integer.toString(FitNesseContext.globalContext.port); else if (key.equals("FITNESSE_ROOTPATH")) value = FitNesseContext.globalContext.rootPath; else if (key.equals("FITNESSE_VERSION")) value = new FitNesseVersion().toString(); else return Maybe.noString; return new Maybe<String>(value); } public boolean inCache(SourcePage page) { return cache.containsKey(page.getFullName()); } public Maybe<String> findVariable(SourcePage page, String name) { String key = page.getFullName(); if (!cache.containsKey(key)) return Maybe.noString; if (!cache.get(key).containsKey(name)) return Maybe.noString; return cache.get(key).get(name); } public Maybe<String> findVariable(String name) { return findVariable(page, name); } public void putVariable(SourcePage page, String name, Maybe<String> value) { String key = page.getFullName(); if (!cache.containsKey(key)) cache.put(key, new HashMap<String, Maybe<String>>()); cache.get(key).put(name, value); } public void putVariable(String name, String value) { putVariable(page, name, new Maybe<String>(value)); } public String renderVariableValue(String variableValue) { return new HtmlTranslator(null, this).translate(Parser.make(this, "", variableDefinitionSymbolProvider).parseWithParent(variableValue, null)); } }