diff --git a/wise-webapp/pom.xml b/wise-webapp/pom.xml index 19f6f29e..bbb42f98 100644 --- a/wise-webapp/pom.xml +++ b/wise-webapp/pom.xml @@ -295,8 +295,13 @@ 0.0.7 compile + + + org.jsoup + jsoup + 1.7.1 + - diff --git a/wise-webapp/src/main/java/com/wisemapping/importer/freemind/FreemindImporter.java b/wise-webapp/src/main/java/com/wisemapping/importer/freemind/FreemindImporter.java index eb096107..f060d3b0 100755 --- a/wise-webapp/src/main/java/com/wisemapping/importer/freemind/FreemindImporter.java +++ b/wise-webapp/src/main/java/com/wisemapping/importer/freemind/FreemindImporter.java @@ -18,7 +18,6 @@ package com.wisemapping.importer.freemind; -import com.sun.org.apache.xerces.internal.dom.TextImpl; import com.wisemapping.importer.Importer; import com.wisemapping.importer.ImporterException; import com.wisemapping.importer.VersionNumber; @@ -33,12 +32,20 @@ import com.wisemapping.jaxb.wisemap.TopicType; import com.wisemapping.jaxb.wisemap.Link; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jsoup.Jsoup; +import org.jsoup.nodes.*; +import org.jsoup.nodes.Document; import org.w3c.dom.*; +import org.w3c.dom.Element; import javax.xml.bind.JAXBException; +import javax.xml.transform.*; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import java.io.InputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.StringWriter; import java.nio.charset.Charset; import java.util.*; import java.math.BigInteger; @@ -150,8 +157,9 @@ public class FreemindImporter throw new ImporterException(e); } catch (IOException e) { throw new ImporterException(e); + } catch (TransformerException e) { + throw new ImporterException(e); } - return result; } @@ -214,7 +222,7 @@ public class FreemindImporter } } - private void convertChildNodes(@NotNull Node freeParent, @NotNull TopicType wiseParent, final int depth) { + private void convertChildNodes(@NotNull Node freeParent, @NotNull TopicType wiseParent, final int depth) throws TransformerException { final List freeChilden = freeParent.getArrowlinkOrCloudOrEdge(); TopicType currentWiseTopic = wiseParent; @@ -290,10 +298,10 @@ public class FreemindImporter final String type = content.getTYPE(); if (type.equals("NODE")) { - String text = getText(content); + String text = html2text(content); currentWiseTopic.setText(text); } else { - String text = getRichContent(content); + String text = html2text(content); final com.wisemapping.jaxb.wisemap.Note mindmapNote = new com.wisemapping.jaxb.wisemap.Note(); text = text != null ? text : EMPTY_NOTE; mindmapNote.setText(text); @@ -480,61 +488,26 @@ public class FreemindImporter // } // return result; // } - private String getRichContent(Richcontent content) { - String result = null; - List elementList = content.getHtml().getAny(); - - Element body = null; - for (Element elem : elementList) { - if (elem.getNodeName().equals("body")) { - body = elem; - break; - } - } - if (body != null) { - result = body.getTextContent(); - } - return result; - } - @NotNull - private String getText(Richcontent content) { - String result = ""; - List elementList = content.getHtml().getAny(); + private String html2text(@NotNull Richcontent content) throws TransformerException { + final Element html = (Element) content.getHtml(); - Element body = null; - for (Element elem : elementList) { - if (elem.getNodeName().equals("body")) { - body = elem; - break; - } - } - if (body != null) { - String textNode = buildTextFromChildren(body); - if (textNode != null) - result = textNode.trim(); + // Convert any to HTML piece ... + TransformerFactory transFactory = TransformerFactory.newInstance(); + Transformer transformer = transFactory.newTransformer(); + StringWriter buffer = new StringWriter(); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + transformer.transform(new DOMSource(html), new StreamResult(buffer)); + + // Keep return lines in place ... + final Document document = Jsoup.parse(buffer.toString()); + document.select("br").append("\\n"); + document.select("p").prepend("\\n"); + document.select("div").prepend("\\n"); + return document.text().replaceAll("\\\\n", "\n").trim(); - } - return result; } - private String buildTextFromChildren(org.w3c.dom.Node body) { - StringBuilder text = new StringBuilder(); - NodeList childNodes = body.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - org.w3c.dom.Node child = childNodes.item(i); - if (child instanceof TextImpl) { - text.append(" "); - text.append(child.getTextContent()); - } else { - String textElem = buildTextFromChildren(child); - if (textElem != null && !textElem.equals("")) { - text.append(textElem); - } - } - } - return text.toString(); - } private void convertNodeProperties(@NotNull com.wisemapping.jaxb.freemind.Node freeNode, @NotNull com.wisemapping.jaxb.wisemap.TopicType wiseTopic) { final String text = freeNode.getTEXT(); diff --git a/wise-webapp/src/main/resources/freemind_0.9.0.xsd b/wise-webapp/src/main/resources/freemind_0.9.0.xsd index 59c54621..c42064e3 100755 --- a/wise-webapp/src/main/resources/freemind_0.9.0.xsd +++ b/wise-webapp/src/main/resources/freemind_0.9.0.xsd @@ -74,20 +74,11 @@ - - - - - - - - - - + diff --git a/wise-webapp/src/test/resources/data/freemind/XMLcharacter.mm b/wise-webapp/src/test/resources/data/freemind/XMLcharacter.mm deleted file mode 100644 index b1035fd0..00000000 --- a/wise-webapp/src/test/resources/data/freemind/XMLcharacter.mm +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/wise-webapp/src/test/resources/data/freemind/longnodes.mmr b/wise-webapp/src/test/resources/data/freemind/longnodes.mmr index f5381e8a..593fce3e 100644 --- a/wise-webapp/src/test/resources/data/freemind/longnodes.mmr +++ b/wise-webapp/src/test/resources/data/freemind/longnodes.mmr @@ -1,6 +1,6 @@ - + diff --git a/wise-webapp/src/test/resources/data/freemind/longnodes.wxml b/wise-webapp/src/test/resources/data/freemind/longnodes.wxml index 006115ab..d2c8df20 100644 --- a/wise-webapp/src/test/resources/data/freemind/longnodes.wxml +++ b/wise-webapp/src/test/resources/data/freemind/longnodes.wxml @@ -3,7 +3,11 @@ - + diff --git a/wise-webapp/src/test/resources/data/freemind/richtextnode.mm b/wise-webapp/src/test/resources/data/freemind/richtextnode.mm new file mode 100644 index 00000000..5b25cde7 --- /dev/null +++ b/wise-webapp/src/test/resources/data/freemind/richtextnode.mm @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ 1) Adapter et améliorer +

+

+ notre offre de services +

+

+ selon l'évolution des besoins +

+ +
+ + + + + + + + + + + + + + + + + +

+ 1.1. .Renforcer et structurer +

+

+ le service "accueil et orientation" +

+ +
+ + + + + + + + + +

+ 1.2. Adapter l'offre Halte-Garderie +

+

+ aux besoins des familles +

+ +
+ + + + + + + + + +

+ 1.3. Renforcer et structurer les services +

+

+ de soutien à la parentalité +

+ +
+ + + + + + + + + +

+ 1.4 Améliorer la qualité des +

+

+ projets pédagogiques des ALSH +

+ +
+ + + + + + + + + +

+ 1.5 Renforcer et améliorer les +

+

+ activités de loisirs existantes +

+ +
+ + + + + + + + + +

+ 1.6 Renforcer et améliorer les ateliers   +

+

+ visant à  rompre l'isolement lié à la langue, +

+

+ la pauvreté, la pression de la consommation +

+ +
+ + + +
+ + + + + + +

+ 2) Consolider nos moyens d'action : +

+

+ locaux, organisation, communication interne +

+ +
+ + + + + + + + +

+ 2.1 Formaliser notre offre de services +

+

+ et les modèles économiques correspondants +

+ +
+ + + + + + + + + + +

+ 2.2 Formaliser le "qui fait quoi" +

+

+ en lien avec notre offre de service +

+ +
+ + + + + + + + + + +

+ 2.3. Elaborer un projet immobilier de proximité +

+

+ réalisable au  centre ville +

+ +
+ + + + +
+ + + + + + +

+ 3) Renforcer nos +

+

+ partenariats et +

+

+ notre notoriété +

+ +
+ + + + + + + + +

+ 3.1 Organiser pour chaque segment de notre offre +

+

+ l'identification et la rencontre des partenaires concernés +

+ +
+ + + + + + + + + + +

+ 3.2 Formaliser et contractualiser les partenariats +

+

+ émergeants autour d'actions communes +

+ +
+ + + + + + + + + + + + + + +

+ 3.4 définir et faire vivre un plan de communication +

+

+ à partir de notre segmentation de l'offre +

+ +
+ + + + +
+
+
+
diff --git a/wise-webapp/src/test/resources/data/freemind/richtextnode.mmr b/wise-webapp/src/test/resources/data/freemind/richtextnode.mmr new file mode 100644 index 00000000..f1cb63d5 --- /dev/null +++ b/wise-webapp/src/test/resources/data/freemind/richtextnode.mmr @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wise-webapp/src/test/resources/data/freemind/richtextnode.wxml b/wise-webapp/src/test/resources/data/freemind/richtextnode.wxml new file mode 100644 index 00000000..2d065ac4 --- /dev/null +++ b/wise-webapp/src/test/resources/data/freemind/richtextnode.wxml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +