JsoupEditTools.java

package eu.javaexperience.dom.jsoup;

import org.jsoup.nodes.Element;
import org.jsoup.parser.Tag;

import eu.javaexperience.interfaces.simple.publish.SimplePublish1;
import eu.javaexperience.semantic.references.MayNull;
import eu.javaexperience.web.dom.build.CPathBuilder;
import eu.javaexperience.web.dom.build.CPathExpression;

public class JsoupEditTools
{
	public static void doOn(Element doc, String selector, SimplePublish1<Element> actor)
	{
		for(Element e:doc.select(selector))
		{
			actor.publish(e);
		}
	}
	
	public static SimplePublish1<Element> setAttr(final String attr, final String value)
	{
		return new SimplePublish1<Element>()
		{
			@Override
			public void publish(Element a)
			{
				if(null == value)
				{
					a.attr(attr, false);
				}
				else
				{
					if(0 == value.length())
					{
						a.attr(attr, true);
					}
					else
					{
						a.attr(attr, value);
					}
				}
			}
		};
	}
	
	public static SimplePublish1<Element> setInnerText(final String value)
	{
		return new SimplePublish1<Element>()
		{
			@Override
			public void publish(Element a)
			{
				a.text(value);
			}
		};
	}
	
	public static SimplePublish1<Element> setInnerHTML(final String value)
	{
		return new SimplePublish1<Element>()
		{
			@Override
			public void publish(Element a)
			{
				a.html(value);
			}
		};
	}
	
	public static SimplePublish1<Element> setOuterHTML(final String value)
	{
		return new SimplePublish1<Element>()
		{
			@Override
			public void publish(Element a)
			{
				a.wrap(value);
			}
		};
	}
	
	public static enum AdjacentPosition
	{
		BeforeBegin,
		AfterBegin,
		BeforeEnd,
		AfterEnd
	}
	
	public static SimplePublish1<Element> insertAdjacentHTML(final AdjacentPosition poz, final String html)
	{
		return new SimplePublish1<Element>()
		{
			@Override
			public void publish(Element a)
			{
				switch(poz)
				{
					case AfterBegin:
						a.before(html);
						break;
					case AfterEnd:
						a.prepend(html);
						break;
					case BeforeBegin:
						a.append(html);
						break;
					case BeforeEnd:
						a.after(html);
						break;
					default:
						break;
					
				}
			}
		};
	}
	
	public static final CPathBuilder<Element> CPATH_BUILDER = new CPathBuilder<Element>()
	{

		@Override
		public Element createTag(String name)
		{
			return new Element(name);
		}

		@Override
		public void addChild(Element elem, Element t)
		{
			elem.appendChild(t);
		}

		@Override
		public void setId(Element ref, String group)
		{
			ref.attr("id", group);
		}

		@Override
		public void setText(Element ref, String group)
		{
			ref.text(group);
		}

		@Override
		public void addClass(Element ref, String group)
		{
			ref.addClass(group);
		}

		@Override
		public void addAttribute(Element ref, String k, @MayNull String v)
		{
			if(null == v)
			{
				ref.attr(k, true);
			}
			else
			{
				ref.attr(k, v);
			}
		}
	};

	public static Element createDomByExpression(String expression)
	{
		return CPathExpression.parse(CPATH_BUILDER, expression);
	}
		
	public static String createDomStringByExpression(String expression)
	{
		return createDomByExpression(expression).toString();
	}

	public static SimplePublish1<Element> addText(final String text)
	{
		return new SimplePublish1<Element>()
		{
			@Override
			public void publish(Element a)
			{
				a.appendText(text);
			}
		};
	}
}