Update of 
/var/cvs/contributions/CMSContainer/cmsc/richtext/src/java/com/finalist/cmsc/richtext
In directory 
james.mmbase.org:/tmp/cvs-serv16943/richtext/src/java/com/finalist/cmsc/richtext

Modified Files:
      Tag: b1_6
        RichText.java RichTextGetProcessor.java 
Log Message:
CMSC-1298 Clone channel feature


See also: 
http://cvs.mmbase.org/viewcvs/contributions/CMSContainer/cmsc/richtext/src/java/com/finalist/cmsc/richtext
See also: http://www.mmbase.org/jira/browse/CMSC-1298


Index: RichText.java
===================================================================
RCS file: 
/var/cvs/contributions/CMSContainer/cmsc/richtext/src/java/com/finalist/cmsc/richtext/RichText.java,v
retrieving revision 1.9
retrieving revision 1.9.2.1
diff -u -b -r1.9 -r1.9.2.1
--- RichText.java       24 Dec 2008 13:08:23 -0000      1.9
+++ RichText.java       5 Mar 2009 06:34:48 -0000       1.9.2.1
@@ -15,7 +15,14 @@
  */
 package com.finalist.cmsc.richtext;
 
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
 import org.mmbase.applications.wordfilter.WordHtmlCleaner;
+import org.mmbase.bridge.Field;
+import org.mmbase.bridge.Node;
+import org.mmbase.datatypes.DataType;
 import org.mmbase.util.logging.Logger;
 import org.mmbase.util.logging.Logging;
 import org.w3c.dom.Document;
@@ -94,4 +101,34 @@
       return doc;
    }
 
+   public final static Object stripLinkAndImage(Node sourceNode,Field 
field,Map<Integer, Integer> copiedNodes,List<Integer> channels) {
+      DataType dataType = field.getDataType();
+      while (StringUtils.isEmpty(dataType.getName())) {
+         dataType = dataType.getOrigin();
+      }
+      if ("cmscrichtext".equals(dataType.getName())) {
+         String fieldname = field.getName();
+         String fieldValue = (String) 
sourceNode.getValueWithoutProcess(fieldname);
+         log.debug("richtext field: " + fieldname.trim());
+       //  htmlFields.add(fieldname);
+         if (StringUtils.isNotEmpty(fieldValue)) {
+            try {
+               if (hasRichtextItems(fieldValue)) {
+                  Document doc = getRichTextDocument(fieldValue);
+                  RichTextGetProcessor richTextGetProcessor = new 
RichTextGetProcessor();
+                  
richTextGetProcessor.resolve(sourceNode,doc,copiedNodes,channels);
+                  String out = getRichTextString(doc);
+                  out = WordHtmlCleaner.fixEmptyAnchors(out);
+                  log.debug("final richtext text = " + out);
+                  return out;
+               }
+            }
+            catch (Exception e) {
+               log.error("An error occured while resolving inline resources!", 
e);
+            }
+         }
+      }
+      return sourceNode.getValueWithoutProcess(field.getName());
+   }
+
 }


Index: RichTextGetProcessor.java
===================================================================
RCS file: 
/var/cvs/contributions/CMSContainer/cmsc/richtext/src/java/com/finalist/cmsc/richtext/RichTextGetProcessor.java,v
retrieving revision 1.14
retrieving revision 1.14.2.1
diff -u -b -r1.14 -r1.14.2.1
--- RichTextGetProcessor.java   6 Feb 2009 06:08:19 -0000       1.14
+++ RichTextGetProcessor.java   5 Mar 2009 06:34:48 -0000       1.14.2.1
@@ -9,11 +9,17 @@
  */
 package com.finalist.cmsc.richtext;
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.lang.StringUtils;
-import org.mmbase.bridge.*;
+import org.mmbase.bridge.Cloud;
+import org.mmbase.bridge.Field;
 import org.mmbase.bridge.Node;
+import org.mmbase.bridge.Relation;
+import org.mmbase.bridge.RelationList;
 import org.mmbase.datatypes.processors.ParameterizedProcessorFactory;
 import org.mmbase.datatypes.processors.Processor;
 import org.mmbase.security.Rank;
@@ -21,9 +27,11 @@
 import org.mmbase.util.functions.Parameters;
 import org.mmbase.util.logging.Logger;
 import org.mmbase.util.logging.Logging;
-import org.w3c.dom.*;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
+import com.finalist.cmsc.mmbase.RelationUtil;
 import com.finalist.cmsc.mmbase.ResourcesUtil;
 
 @SuppressWarnings("serial")
@@ -299,4 +307,114 @@
       return ResourcesUtil.getServletPathWithAssociation("content", 
"/content/*", id, title);
    }
 
+   public void resolve(Node node,Document doc,Map<Integer, Integer> 
copiedNodes,List<Integer> channels) {
+      resolveLinks(doc,  node,copiedNodes,channels);
+      resolveImages(doc,  node,copiedNodes,channels);
+   }
+   /**
+    *    To resolve the links in Richtext fields
+    * @param doc
+    * @param sourceNode
+    * @param copiedNodes
+    * @param channels
+    */
+   public static void resolveLinks(Document doc, Node sourceNode,Map<Integer, 
Integer> copiedNodes,List<Integer> channels) {
+      if (doc == null) {
+         return;
+      }
+      // collect <A> tags
+      org.w3c.dom.NodeList nl = doc.getElementsByTagName("a");
+      log.debug("number of links: " + nl.getLength());
+
+      for (int i = 0, len = nl.getLength(); i < len; i++) {
+         Element link = (Element) nl.item(i);
+
+         if (link.hasAttribute(RichText.DESTINATION_ATTR)
+               && 
"undefined".equalsIgnoreCase(link.getAttribute(RichText.DESTINATION_ATTR))) {
+            link.removeAttribute(RichText.DESTINATION_ATTR);
+         }
+         if (link.hasAttribute(RichText.RELATIONID_ATTR)
+               && 
"undefined".equalsIgnoreCase(link.getAttribute(RichText.RELATIONID_ATTR))) {
+            link.removeAttribute(RichText.RELATIONID_ATTR);
+         }
+         // handle relations to other objects
+         if (link.hasAttribute(RichText.DESTINATION_ATTR) && 
link.hasAttribute(RichText.RELATIONID_ATTR)) {
+            // get id of the link
+            //String id = link.getAttribute("relationID");
+            int source = 
Integer.parseInt(link.getAttribute(RichText.DESTINATION_ATTR));
+            org.w3c.dom.Node parentNode = link.getParentNode();
+            if (source > 0) {
+               Node node = sourceNode.getCloud().getNode(source);
+               Object number = copiedNodes.get(node.getNumber());
+               if (number == null) {
+                  Element newNode = doc.createElement("span");
+                  newNode.appendChild(link.getFirstChild());
+                  parentNode.replaceChild(newNode,link);
+               }
+               else {
+                  Integer destination = copiedNodes.get(source);
+                  if (destination  != null && destination > 0 && 
sourceNode.getCloud().hasNode(destination)) {
+                     Relation rel = RelationUtil.createRelation(sourceNode, 
sourceNode.getCloud().getNode(destination), "inlinerel");
+                     link.setAttribute(RichText.DESTINATION_ATTR, 
String.valueOf(destination));
+                     link.setAttribute(RichText.RELATIONID_ATTR, 
String.valueOf(rel.getNumber()));
+                  }
+               }
+            }
+         }
+      }
+   }
+
+
+   /**
+    *   To resolve the images used in the richtext fileds
+    * @param doc
+    * @param sourceNode
+    * @param copiedNodes
+    * @param channels
+    */
+   public static  void resolveImages(Document doc,Node sourceNode,Map<Integer, 
Integer> copiedNodes,List<Integer> channels) {
+      if (doc == null) {
+         return;
+      }
+      org.w3c.dom.NodeList nl = doc.getElementsByTagName("img");
+      log.debug("number of images: " + nl.getLength());
+      for (int i = 0, len = nl.getLength(); i < len; i++) {
+         Element image = (Element) nl.item(i);
+
+         if (image.hasAttribute(RichText.DESTINATION_ATTR)
+               && 
"undefined".equalsIgnoreCase(image.getAttribute(RichText.DESTINATION_ATTR))) {
+            image.removeAttribute(RichText.DESTINATION_ATTR);
+         }
+         if (image.hasAttribute(RichText.RELATIONID_ATTR)
+               && 
"undefined".equalsIgnoreCase(image.getAttribute(RichText.RELATIONID_ATTR))) {
+            image.removeAttribute(RichText.RELATIONID_ATTR);
+         }
+
+         if (image.hasAttribute(RichText.DESTINATION_ATTR) && 
image.hasAttribute(RichText.RELATIONID_ATTR)) {
+            // get id of the image
+            int source = 
Integer.parseInt(image.getAttribute(RichText.DESTINATION_ATTR));
+           
+            org.w3c.dom.Node parentNode = image.getParentNode();
+           // parentNode.removeChild(image);
+           // MMObjectNode imagerel = getImageInlineRel(id);
+            if (source > 0 ) {
+               Node node = sourceNode.getCloud().getNode(source);
+               Object number = copiedNodes.get(node.getNumber());
+               if (number == null) {
+                  parentNode.removeChild(image);
+               }
+               else {
+                  Integer destination = copiedNodes.get(source);
+                  if (destination  != null && destination > 0 && 
sourceNode.getCloud().hasNode(destination)) {
+                     Relation rel = RelationUtil.createRelation(sourceNode, 
sourceNode.getCloud().getNode(destination), "imageinlinerel");
+                     image.setAttribute(RichText.DESTINATION_ATTR, 
String.valueOf(destination));
+                     image.setAttribute(RichText.RELATIONID_ATTR, 
String.valueOf(rel.getNumber()));
+                  }
+               }
+            }
+         }
+
+      }
+   }
+
 }
_______________________________________________
Cvs mailing list
Cvs@lists.mmbase.org
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to