/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.core.tool.plugindoc;
/**
* @author Joseph Marques
*/
public class DocConverter {
public static String htmlToDocBook(String htmlContent) {
if (htmlContent == null) {
return null;
}
String result = htmlContent;
while (true) {
int startHeaderIndex = result.indexOf("<h3>");
if (startHeaderIndex == -1) {
break;
}
int endHeaderIndex = result.indexOf("</h3>", startHeaderIndex + 4);
int startParaIndex = result.indexOf("<p>", endHeaderIndex + 5);
int endParaIndex = result.indexOf("</p>", startParaIndex + 3);
String firstPart = result.substring(0, startHeaderIndex);
String header = result.substring(startHeaderIndex + 4, endHeaderIndex);
String middle = result.substring(endHeaderIndex + 5, startParaIndex);
String paragraph = result.substring(startParaIndex + 3, endParaIndex);
String lastPart = result.substring(endParaIndex + 4);
String replacement = "<formalpara><title>" + header + "</title>" + middle + "<para>" + paragraph
+ "</para></formalpara>";
result = firstPart + replacement + lastPart;
}
String[][] tagConversions = { //
new String[] { "<code>", "<screen>" }, //
new String[] { "</code>", "</screen>" }, //
new String[] { "<tt>", "<filename>" }, //
new String[] { "</tt>", "</filename>" }, //
new String[] { "<p>", "<para>" }, //
new String[] { "</p>", "</para>" }, //
new String[] { "<pre>", "" }, //
new String[] { "</pre>", "" }, //
new String[] { "<a href=", "<ulink url=" }, //
new String[] { "</a>", "</ulink>" }, //
new String[] { "<div class=\"note\">", "<important><title>Important</title><para>" }, //
new String[] { "</div>", "</para></important>" }, //
new String[] { "<ul>", "<itemizedlist>" }, //
new String[] { "</ul>", "</itemizedlist>" }, //
new String[] { "<ol>", "<orderedlist>" }, //
new String[] { "</ol>", "</orderedlist>" }, //
new String[] { "<li>", "<listitem><para>" }, //
new String[] { "</li>", "</para></listitem>" }, //
};
result = convert(result, tagConversions);
return result;
}
public static String htmlToConfluence(String htmlContent) {
if (htmlContent == null) {
return null;
}
String result = htmlContent;
while (true) {
int startLinkIndex = result.indexOf("<a ");
if (startLinkIndex == -1) {
break;
}
int endLinkIndex = result.indexOf("</a>", startLinkIndex + 1);
String firstPart = result.substring(0, startLinkIndex);
String htmlLink = result.substring(startLinkIndex, endLinkIndex);
String lastPart = result.substring(endLinkIndex + 4);
int hrefIndex = htmlLink.indexOf("href=");
int startQuoteIndex = hrefIndex + 5;
int endQuoteIndex = htmlLink.indexOf("\"", startQuoteIndex + 1);
int endTagIndex = htmlLink.indexOf(">", endQuoteIndex + 1);
String url = htmlLink.substring(startQuoteIndex + 1, endQuoteIndex);
String label = htmlLink.substring(endTagIndex + 1).replaceAll("\n", " ");
String replacement = "[" + label + "|" + url + "]";
result = firstPart + replacement + lastPart;
}
String[][] tagConversions = { //
new String[] { "<code>", "{code}" }, //
new String[] { "</code>", "{code}" }, //
new String[] { "<tt>", "{{" }, //
new String[] { "</tt>", "}}" }, //
new String[] { "<p>", "\n\n" }, //
new String[] { "</p>", "" }, //
new String[] { "<p/>", "\n\n" }, //
new String[] { "<p />", "\n\n" }, //
new String[] { "<br>", "\n" }, //
new String[] { "<br/>", "\n" }, //
new String[] { "<br />", "\n" }, //
new String[] { "<pre>", "" }, //
new String[] { "</pre>", "" }, //
new String[] { "<div class=\"note\">", "{note}" }, //
new String[] { "</div>", "{note}" }, //
new String[] { "<h1>", "h1. " }, //
new String[] { "</h1>", "" }, //
new String[] { "<h2>", "h2. " }, //
new String[] { "</h2>", "" }, //
new String[] { "<h3>", "h3. " }, //
new String[] { "</h3>", "" }, //
new String[] { "<h4>", "h4. " }, //
new String[] { "</h4>", "" }, //
new String[] { "<h5>", "h5. " }, //
new String[] { "</h5>", "" }, //
new String[] { "<h6>", "h6. " }, //
new String[] { "</h6>", "" }, //
new String[] { "<ul>", "" }, //
new String[] { "</ul>", "\n\n" }, //
new String[] { "<li>", "* " }, //
new String[] { "</li>", "" } //
};
result = convert(result, tagConversions);
return result;
}
private static String convert(String message, String[][] tagConversions) {
String result = message;
for (String[] conversion : tagConversions) {
String from = conversion[0];
String to = conversion[1];
while (result.indexOf(from) != -1) {
result = result.replaceFirst(from, to);
}
}
return result;
}
public static void testHtmlToDocBook() {
String html = "" //
+ " <h3>header</h3>\n" //
+ " \n" //
+ " <p>some paragraph\n" //
+ " <a href=\"url\">label</a> with <tt>property</tt> \n" //
+ " <div class=\"note\">some urgent thing</div> </p>";
String expectedDocBookFormat = "" //
+ " <formalpara><title>header</title>\n" //
+ " \n" //
+ " <para>some paragraph\n" //
+ " <ulink url=\"url\">label</ulink> with <filename>property</filename> \n" //
+ " <important><title>Important</title><para>some urgent thing</para></important> </para></formalpara>";
String actualDocBookFormat = DocConverter.htmlToDocBook(html);
if (actualDocBookFormat.equals(expectedDocBookFormat) == false) {
System.out.println("Expected: \"" + expectedDocBookFormat + "\"");
System.out.println("Actual: \"" + actualDocBookFormat + "\"");
} else {
System.out.println("Success");
}
}
public static void testHtmlToConfluence() {
String html = "" //
+ " <h3>header</h3>\n" //
+ " \n" //
+ " <p>some paragraph\n" //
+ " <a href=\"url\">label</a> with <tt>property</tt> \n" //
+ " <div class=\"note\">some urgent thing</div> </p>";
String expectedDocBookFormat = "" //
+ " h3. header\n" //
+ " \n" //
+ " some paragraph\n" //
+ " [label|url] with {{property}} \n" //
+ " {note}some urgent thing{note} ";
String actualDocBookFormat = DocConverter.htmlToConfluence(html);
if (actualDocBookFormat.equals(expectedDocBookFormat) == false) {
System.out.println("Expected: \"" + expectedDocBookFormat + "\"");
System.out.println("Actual: \"" + actualDocBookFormat + "\"");
} else {
System.out.println("Success");
}
}
public static void main(String[] args) {
testHtmlToDocBook();
testHtmlToConfluence();
}
}