package com.garyhodgson.jira.renderer.tinymce; import com.atlassian.core.util.HTMLUtils; import com.atlassian.event.api.EventPublisher; import com.atlassian.jira.ComponentManager; import com.atlassian.jira.config.properties.PropertiesManager; import com.atlassian.jira.issue.fields.renderer.IssueRenderContext; import com.atlassian.jira.issue.fields.renderer.JiraRendererPlugin; import com.atlassian.jira.issue.fields.renderer.wiki.AtlassianWikiRenderer; import com.atlassian.jira.plugin.renderer.JiraRendererModuleDescriptor; import com.atlassian.jira.util.JiraKeyUtils; import com.atlassian.jira.util.velocity.VelocityRequestContextFactory; import com.opensymphony.module.propertyset.PropertyException; import com.opensymphony.module.propertyset.PropertySet; import com.opensymphony.util.TextUtils; public class TinyMCERendererPlugin implements JiraRendererPlugin { public static final String TYPE = "tinymce-renderer"; public static final String LINE_SEPARATOR = System.getProperty("line.separator"); private JiraRendererModuleDescriptor jiraRendererModuleDescriptor; private AtlassianWikiRenderer atlassianWikiRenderer; private PropertySet properties; public TinyMCERendererPlugin(EventPublisher eventPublisher, VelocityRequestContextFactory velocityRequestContextFactory) { this.atlassianWikiRenderer = new AtlassianWikiRenderer(eventPublisher, velocityRequestContextFactory); PropertiesManager propertiesManager = ComponentManager.getComponent(PropertiesManager.class); this.properties = propertiesManager.getPropertySet(); } public void init(JiraRendererModuleDescriptor jiraRendererModuleDescriptor) { this.jiraRendererModuleDescriptor = jiraRendererModuleDescriptor; } public JiraRendererModuleDescriptor getDescriptor() { return jiraRendererModuleDescriptor; } public String getRendererType() { return TYPE; } public String render(String s, IssueRenderContext issueRenderContext) { if (s == null) { return ""; } if (renderWikiText() && !s.startsWith("<")) { s = atlassianWikiRenderer.render(s, issueRenderContext); } s = transformLineBreaks(s); StringBuilder text = new StringBuilder(); text.append(LINE_SEPARATOR).append(LINE_SEPARATOR); text.append(JiraKeyUtils.linkBugKeys(TextUtils.hyperlink(s))); return text.toString(); } public String renderAsText(String s, IssueRenderContext issueRenderContext) { return JiraKeyUtils.linkBugKeys(TextUtils.hyperlink(HTMLUtils.stripTags(s))); } public Object transformForEdit(Object obj) { if (obj == null) { return obj; } String s = (String) obj; if (renderWikiText() && !s.startsWith("<")) { s = atlassianWikiRenderer.render(s, null); } s = transformLineBreaks(s); return s; } public Object transformFromEdit(Object obj) { return obj; } private boolean renderWikiText() throws PropertyException { return properties.getBoolean(TinyMCERendererAdminAction.RENDER_WIKI_TEXT_PROPERTY); } private String transformLineBreaks(String s) { if (!s.startsWith("<")) { s = s.replaceAll("\n", "<br>"); } return s; } }