0 Votes

TodoListsGroovy

Last modified by Ryan C on 2025/04/24 09:30

/*
#*
TodoMacroGroovy

*#
*/

import org.xwiki.rendering.block.*;
import org.xwiki.rendering.renderer.*;
import org.xwiki.rendering.syntax.*;
import org.xwiki.rendering.parser.*;
import org.xwiki.rendering.renderer.printer.DefaultWikiPrinter;
import org.xwiki.rendering.renderer.printer.WikiPrinter;
import com.xpn.xwiki.web.Utils;
import com.xpn.xwiki.api.*;
import java.util.*;
import java.lang.reflect.*;
import groovy.json.JsonSlurper;


public class TodoListGroovy {
   def xwiki;
   def context;

   public setContext(context, xwiki) {
      this.xwiki = xwiki;
      this.context = context;
   }

   public int updateDocumentXDOM(xdom, newcontent, append) {
      def xdomchanged = false;
      // Finding Macro Block
      List<MacroBlock> macroBlocks = xdom.getChildrenByType(MacroBlock.class, true);
      for (MacroBlock macroBlock : macroBlocks) {
        def id = macroBlock.getId();
        if (id.equals("todolist")) {
    
        def currentContent = macroBlock.getContent();
        currentContent = (currentContent==null) ? "" : currentContent;
       
        // System.out.println("found macro");
        boolean done = true;

        if ((currentContent!=newcontent) || append) {
             // System.out.println("priority different changing it");
             newcontent = (append) ? currentContent + newcontent :  newcontent;

             def replacementBlock = new MacroBlock(id, macroBlock.getParameters(), newcontent, macroBlock.isInline())
             macroBlock.getParent().replaceChild(replacementBlock, macroBlock)
             return 1;
             done = true;
        }
       }
     }
     return 0;
   }

   public String getContentFromXDOM(xdom) {
     WikiPrinter printer = new DefaultWikiPrinter();
     BlockRenderer renderer = (BlockRenderer) Utils.getComponent(BlockRenderer.class, Syntax.XWIKI_2_0.toIdString());
     renderer.render(xdom, printer);
     return printer.toString();
   }

   public XDOM getXDOMFromContent(content) {
     Parser parser = (Parser) Utils.getComponent(Parser.class, Syntax.XWIKI_2_0.toIdString());
     return parser.parse(new StringReader(content));
   }

   public int updateDocument(doc, newcontent) {
      def slurper = new JsonSlurper()
      def jsonobj = slurper.parseText(newcontent)
      def finalcontent = ""
      for (item in jsonobj) {
        finalcontent += item.title + "|" + (item.isCompleted ? "1" : "0") + "\r\n";
      }

      XDOM xdom = (doc == null) ? null : doc.getDocument().getXDOM();
      xdom = (xdom == null) ? null : xdom.clone();

      def result = updateDocumentXDOM(xdom, finalcontent, false);

      // we updated the xdom, apply it
      if (result!=0) {
         doc.setContent(getContentFromXDOM(xdom));
         return result;
      }

      return 0;
   }

   public int addToDocument(doc, newcontent) {
      def slurper = new JsonSlurper()
      def item = slurper.parseText(newcontent)
      def finalcontent = ""
      finalcontent += item.title + "|" + (item.isCompleted ? "1" : "0") + "\r\n";

      XDOM xdom = (doc == null) ? null : doc.getDocument().getXDOM();
      xdom = (xdom == null) ? null : xdom.clone();

      def result = updateDocumentXDOM(xdom, finalcontent, true);

      // we updated the xdom, apply it
      if (result!=0) {
         doc.setContent(getContentFromXDOM(xdom));
         return result;
      }

      return 0;
   }
  public List getTodos(Document doc) {
      def counter = 0;
      XDOM xdom = (doc == null) ? null : doc.getDocument().getXDOM();
      xdom = (xdom == null) ? null : xdom.clone();
      def res = getTodosFromXDOM(xdom);
      def list = res.split("\r\n")
      def list2 = new ArrayList();
      for (item in list) {
        counter++;
        def map = new HashMap();
        map.put("id", counter);
        map.put("title", "")
        map.put("isCompleted", "false")
        def item2 = item.split("\\|")
        if (item2.length>1)
         map.put("isCompleted", ((item2[1]=="1") ? true : false))
        if (item2.length>0)
         map.put("title", item2[0])
        list2.add(map);
      }
    return list2;
  }

  public String getTodosFromXDOM(xdom) {
      // Finding Macro Block
      List<MacroBlock> macroBlocks = xdom?.getChildrenByType(MacroBlock.class, true);
      for (MacroBlock macroBlock : macroBlocks) {
        def id = macroBlock.getId();
        if (id.equals("todolist")) {
            return macroBlock.getContent();
        }
      }
      return "";
   }
}