// Path: humanize-slim/src/main/java/humanize/text/util/InterpolationHelper.java
// public static String interpolate(String text, Pattern pattern, Replacer replacer)
// {
// 
//     Matcher matcher = pattern.matcher(text);
//     StringBuffer sb = new StringBuffer();
// 
//     while (matcher.find())
//     {
//         String replacement = replacer.replace(matcher.group(1));
//         matcher.appendReplacement(sb, Strings.nullToEmpty(replacement));
//     }
// 
//     matcher.appendTail(sb);
// 
//     return (sb.length() > 0) ? sb.toString() : text;
// }
// 
// Path: humanize-slim/src/main/java/humanize/spi/MessageFormat.java
// public class MessageFormat extends ExtendedMessageFormat
// {
// 
//     private static final long serialVersionUID = -5384364921909539710L;
// 
//     private final static Map<String, FormatFactory> formatFactories = loadFormatFactories();
// 
//     private static Map<String, FormatFactory> loadFormatFactories()
//     {
// 
//         Map<String, FormatFactory> factories = new HashMap<String, FormatFactory>();
//         ServiceLoader<FormatProvider> ldr = ServiceLoader.load(FormatProvider.class);
// 
//         for (FormatProvider provider : ldr)
//         {
//             registerProvider(factories, provider);
//         }
// 
//         return factories;
// 
//     }
// 
//     private static void registerProvider(Map<String, FormatFactory> factories, FormatProvider provider)
//     {
// 
//         String formatName = provider.getFormatName();
//         FormatFactory factory = provider.getFactory();
// 
//         if (formatName.indexOf('|') > -1)
//         {
//             String[] names = formatName.split("\\|");
//             for (String name : names)
//             {
//                 factories.put(name, factory);
//             }
//         } else
//         {
//             factories.put(formatName, factory);
//         }
// 
//     }
// 
//     public MessageFormat(String pattern)
//     {
// 
//         super(pattern, formatFactories);
// 
//     }
// 
//     public MessageFormat(String pattern, Locale locale)
//     {
// 
//         super(pattern, locale, formatFactories);
// 
//     }
// 
//     public MessageFormat(String pattern, Locale locale, Map<String, ? extends FormatFactory> registry)
//     {
// 
//         super(pattern, locale, registry);
// 
//     }
// 
//     public MessageFormat(String pattern, Map<String, ? extends FormatFactory> registry)
//     {
// 
//         super(pattern, registry);
// 
//     }
// 
//     /**
//      * Formats the current pattern with the given arguments.
//      * 
//      * @param arguments
//      *            The formatting arguments
//      * @return Formatted message
//      */
//     public String render(Object... arguments)
//     {
// 
//         return format(arguments);
// 
//     }
// 
//     /**
//      * Formats the current pattern with the given arguments.
//      * 
//      * @param buffer
//      *            The StringBuffer
//      * @param arguments
//      *            The formatting arguments
//      * @return StringBuffer with the formatted message
//      */
//     public StringBuffer render(StringBuffer buffer, Object... arguments)
//     {
// 
//         return format(arguments, buffer, null);
// 
//     }
// 
// }
// 
// Path: humanize-slim/src/main/java/humanize/text/util/Replacer.java
// public interface Replacer
// {
// 
//     String replace(String replacement);
// 
// }
// 
// Path: humanize-slim/src/main/java/humanize/text/util/UnicodeInterpolator.java
// public class UnicodeInterpolator extends UnicodeEscaper
// {
//     private final Replacer replacer;
//     private final Collection<Range<Integer>> ranges;
// 
//     public UnicodeInterpolator(Replacer replacer)
//     {
//         this.replacer = replacer;
//         this.ranges = new ArrayList<Range<Integer>>();
//     }
// 
//     public void addRange(int lower, int upper)
//     {
//         addRange(Range.closed(lower, upper));
//     }
// 
//     public void addRange(Range<Integer> range)
//     {
//         ranges.add(range);
//     }
// 
//     @Override
//     protected char[] escape(int codePoint)
//     {
//         for (Range<Integer> range : ranges)
//         {
//             if (range.contains(codePoint))
//             {
//                 return Strings.nullToEmpty(replacer.replace(Integer.toHexString(codePoint))).toCharArray();
//             }
//         }
// 
//         return Character.toChars(codePoint);
//     }
// }


import static humanize.text.util.InterpolationHelper.interpolate;
import humanize.spi.MessageFormat;
import humanize.text.util.Replacer;
import humanize.text.util.UnicodeInterpolator;
import java.util.regex.Pattern;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
package humanize.emoji;




/**
 * <p>
 * Sexy and easy text interpolation of Unicode emoji code points and aliases.
 * </p>
 * <h5>Examples:</h5>
 * 
 * <pre>
 * EmojiInterpolator.interpolateAlias(&quot;&lt;img src=\&quot;imgs/{0}.png\&quot; title=\&quot;{1}\&quot; /&gt;&quot;, &quot;Hi :sparkles:!&quot;);
 * // == &quot;Hi &lt;img src=\&quot;imgs/2728.png\&quot; title=\&quot;sparkles\&quot; /&gt;!&quot;
 * 
 * EmojiInterpolator.interpolateUnicode(&quot;&lt;img src=\&quot;imgs/{0}.png\&quot; /&gt;&quot;,
 *         &quot;Lorem ipsum \u2639 dolorem\uD83D\uDD36 and dolorem sit amet&quot;);
 * // ==
 * // &quot;Lorem ipsum &lt;img src=\&quot;imgs/2639.png\&quot; /&gt; dolorem&lt;img src=\&quot;imgs/1f536.png\&quot; /&gt; and dolorem sit amet&quot;
 * 
 * </pre>
 * 
 * @see Emoji
 * 
 */
public final class EmojiInterpolator
{

    private static final Pattern EMOJI_ALIAS = Pattern.compile(":([\\w\\s-]+):");

// Path: humanize-slim/src/main/java/humanize/text/util/InterpolationHelper.java
// public static String interpolate(String text, Pattern pattern, Replacer replacer)
// {
// 
//     Matcher matcher = pattern.matcher(text);
//     StringBuffer sb = new StringBuffer();
// 
//     while (matcher.find())
//     {
//         String replacement = replacer.replace(matcher.group(1));
//         matcher.appendReplacement(sb, Strings.nullToEmpty(replacement));
//     }
// 
//     matcher.appendTail(sb);
// 
//     return (sb.length() > 0) ? sb.toString() : text;
// }
// 
// Path: humanize-slim/src/main/java/humanize/spi/MessageFormat.java
// public class MessageFormat extends ExtendedMessageFormat
// {
// 
//     private static final long serialVersionUID = -5384364921909539710L;
// 
//     private final static Map<String, FormatFactory> formatFactories = loadFormatFactories();
// 
//     private static Map<String, FormatFactory> loadFormatFactories()
//     {
// 
//         Map<String, FormatFactory> factories = new HashMap<String, FormatFactory>();
//         ServiceLoader<FormatProvider> ldr = ServiceLoader.load(FormatProvider.class);
// 
//         for (FormatProvider provider : ldr)
//         {
//             registerProvider(factories, provider);
//         }
// 
//         return factories;
// 
//     }
// 
//     private static void registerProvider(Map<String, FormatFactory> factories, FormatProvider provider)
//     {
// 
//         String formatName = provider.getFormatName();
//         FormatFactory factory = provider.getFactory();
// 
//         if (formatName.indexOf('|') > -1)
//         {
//             String[] names = formatName.split("\\|");
//             for (String name : names)
//             {
//                 factories.put(name, factory);
//             }
//         } else
//         {
//             factories.put(formatName, factory);
//         }
// 
//     }
// 
//     public MessageFormat(String pattern)
//     {
// 
//         super(pattern, formatFactories);
// 
//     }
// 
//     public MessageFormat(String pattern, Locale locale)
//     {
// 
//         super(pattern, locale, formatFactories);
// 
//     }
// 
//     public MessageFormat(String pattern, Locale locale, Map<String, ? extends FormatFactory> registry)
//     {
// 
//         super(pattern, locale, registry);
// 
//     }
// 
//     public MessageFormat(String pattern, Map<String, ? extends FormatFactory> registry)
//     {
// 
//         super(pattern, registry);
// 
//     }
// 
//     /**
//      * Formats the current pattern with the given arguments.
//      * 
//      * @param arguments
//      *            The formatting arguments
//      * @return Formatted message
//      */
//     public String render(Object... arguments)
//     {
// 
//         return format(arguments);
// 
//     }
// 
//     /**
//      * Formats the current pattern with the given arguments.
//      * 
//      * @param buffer
//      *            The StringBuffer
//      * @param arguments
//      *            The formatting arguments
//      * @return StringBuffer with the formatted message
//      */
//     public StringBuffer render(StringBuffer buffer, Object... arguments)
//     {
// 
//         return format(arguments, buffer, null);
// 
//     }
// 
// }
// 
// Path: humanize-slim/src/main/java/humanize/text/util/Replacer.java
// public interface Replacer
// {
// 
//     String replace(String replacement);
// 
// }
// 
// Path: humanize-slim/src/main/java/humanize/text/util/UnicodeInterpolator.java
// public class UnicodeInterpolator extends UnicodeEscaper
// {
//     private final Replacer replacer;
//     private final Collection<Range<Integer>> ranges;
// 
//     public UnicodeInterpolator(Replacer replacer)
//     {
//         this.replacer = replacer;
//         this.ranges = new ArrayList<Range<Integer>>();
//     }
// 
//     public void addRange(int lower, int upper)
//     {
//         addRange(Range.closed(lower, upper));
//     }
// 
//     public void addRange(Range<Integer> range)
//     {
//         ranges.add(range);
//     }
// 
//     @Override
//     protected char[] escape(int codePoint)
//     {
//         for (Range<Integer> range : ranges)
//         {
//             if (range.contains(codePoint))
//             {
//                 return Strings.nullToEmpty(replacer.replace(Integer.toHexString(codePoint))).toCharArray();
//             }
//         }
// 
//         return Character.toChars(codePoint);
//     }
// }


// Path: humanize-emoji/src/main/java/humanize/emoji/EmojiInterpolator.java
import static humanize.text.util.InterpolationHelper.interpolate;
import humanize.spi.MessageFormat;
import humanize.text.util.Replacer;
import humanize.text.util.UnicodeInterpolator;
import java.util.regex.Pattern;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;

package humanize.emoji;




/**
 * <p>
 * Sexy and easy text interpolation of Unicode emoji code points and aliases.
 * </p>
 * <h5>Examples:</h5>
 * 
 * <pre>
 * EmojiInterpolator.interpolateAlias(&quot;&lt;img src=\&quot;imgs/{0}.png\&quot; title=\&quot;{1}\&quot; /&gt;&quot;, &quot;Hi :sparkles:!&quot;);
 * // == &quot;Hi &lt;img src=\&quot;imgs/2728.png\&quot; title=\&quot;sparkles\&quot; /&gt;!&quot;
 * 
 * EmojiInterpolator.interpolateUnicode(&quot;&lt;img src=\&quot;imgs/{0}.png\&quot; /&gt;&quot;,
 *         &quot;Lorem ipsum \u2639 dolorem\uD83D\uDD36 and dolorem sit amet&quot;);
 * // ==
 * // &quot;Lorem ipsum &lt;img src=\&quot;imgs/2639.png\&quot; /&gt; dolorem&lt;img src=\&quot;imgs/1f536.png\&quot; /&gt; and dolorem sit amet&quot;
 * 
 * </pre>
 * 
 * @see Emoji
 * 
 */
public final class EmojiInterpolator
{

    private static final Pattern EMOJI_ALIAS = Pattern.compile(":([\\w\\s-]+):");

    public static UnicodeInterpolator createEmojiInterpolator(String pattern)