package info.bliki.wiki.filter; import info.bliki.htmlcleaner.ContentToken; import info.bliki.htmlcleaner.Utils; import info.bliki.wiki.model.Configuration; import info.bliki.wiki.model.IWikiModel; import info.bliki.wiki.tags.HTMLTag; import info.bliki.wiki.tags.WPTag; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class WPCodeBlock extends WPTag { private String contents = ""; private Map<String, String> fAttributes; public WPCodeBlock() { super("{code}"); fAttributes = null; } public void setContents(String contents) { this.contents = contents; } @SuppressWarnings("unchecked") @Override public void renderHTML(ITextConverter converter, Appendable buf, IWikiModel wikiModel) throws IOException { if (NEW_LINES) { buf.append("\n<pre"); } else { buf.append("<pre"); } HTMLTag.appendEscapedAttributes(buf, fAttributes); buf.append(">"); String rawWikiText = Utils.ltrimNewline(contents); /** prevent preTag duplicate */ @SuppressWarnings("rawtypes") List mockNodeList = new ArrayList(); ContentToken token = new ContentToken(rawWikiText); mockNodeList.add(token); converter.nodesToText(mockNodeList, buf, wikiModel); /** regular way */ /** * AbstractParser parser = wikiModel.createNewInstance(rawWikiText); * TagStack fStack = parser.parseRecursiveInternal(wikiModel, true, false); * converter.nodesToText(fStack.getNodeList(), buf, wikiModel); */ buf.append("</pre>"); } @Override public Object clone() { WPCodeBlock tt = (WPCodeBlock) super.clone(); if (fAttributes == null) { tt.fAttributes = null; } else { tt.fAttributes = new HashMap<String, String>(fAttributes); } return tt; } @Override public boolean isReduceTokenStack() { return true; } @Override public String getParents() { return Configuration.SPECIAL_BLOCK_TAGS; } }