view src/luan/modules/parsers/BBCodeLuan.java @ 1702:8ad468cc88d4

add goodjava/bbcode
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 30 Jun 2022 20:04:34 -0600
parents src/luan/modules/parsers/BBCode.java@8fbcc4747091
children a6e27c8e7ef4
line wrap: on
line source

package luan.modules.parsers;

import java.util.List;
import java.util.ArrayList;
import luan.Luan;
import luan.LuanFunction;
import luan.LuanException;
import luan.LuanRuntimeException;
import luan.modules.Utils;
import luan.modules.HtmlLuan;
import goodjava.bbcode.BBCode;


public final class BBCodeLuan {

	private static BBCode.Quoter quoter(final Luan luan,final LuanFunction quoterFn) {
		return new BBCode.Quoter() {
			public String quote(BBCode.Target target,String text,String param) {
				try {
					Object obj = quoterFn.call(luan,text,param);
					if( !(obj instanceof String) )
						throw new LuanException("BBCode quoter function returned "+Luan.type(obj)+" but string required");
					return (String)obj;
				} catch(LuanException e) {
					throw new LuanRuntimeException(e);
				}
			}
		};
	}

	public static String toHtml(Luan luan,String text,LuanFunction quoterFn) throws LuanException {
		return parse(luan,text,quoterFn,BBCode.Target.HTML);
	}

	public static String toText(Luan luan,String text,LuanFunction quoterFn) throws LuanException {
		return parse(luan,text,quoterFn,BBCode.Target.TEXT);
	}

	private static String parse(Luan luan,String text,LuanFunction quoterFn,BBCode.Target target)
		throws LuanException
	{
		Utils.checkNotNull(text,1);
		BBCode bbcode = new BBCode(text);
		bbcode.target = target;
		if( quoterFn != null )
			bbcode.quoter = quoter(luan,quoterFn);
		try {
			return bbcode.parse();
		} catch(LuanRuntimeException e) {
			throw (LuanException)e.getCause();
		}
	}

}