diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ansi/AnsiColorWrapper.java b/hutool-core/src/main/java/cn/hutool/core/lang/ansi/AnsiColorWrapper.java new file mode 100644 index 000000000..b78487865 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ansi/AnsiColorWrapper.java @@ -0,0 +1,79 @@ +package cn.hutool.core.lang.ansi; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; + +import java.util.Objects; + +/** + * ANSI 颜色包装类 + * + * @author TomXin + * @since 5.8.6 + */ +public class AnsiColorWrapper { + + private final int code; + + private final AnsiColors.BitDepth bitDepth; + + /** + * 创建指定位深度的 {@link AnsiColorWrapper} 实例 + * @param code 颜色编码,位深度为4bit时,code取值范围[30~37],[90~97]。位深度为8bit时,code取值范围[0~255] + * @param bitDepth 位深度 + */ + public AnsiColorWrapper(int code, AnsiColors.BitDepth bitDepth) { + if (bitDepth==AnsiColors.BitDepth.FOUR){ + Assert.isTrue((30<=code&&code<=37)||(90<=code&&code<=97),"The value of 4 bit color only supported [30~37],[90~97]."); + } + Assert.isTrue((0<=code&&code<=255),"The value of 8 bit color only supported [0~255]."); + this.code = code; + this.bitDepth = bitDepth; + } + + /** + * 转换为 {@link AnsiElement} 实例 + * + * @param foreOrBack 区分前景还是背景 + * @return {@link AnsiElement} 实例 + */ + public AnsiElement toAnsiElement(ForeOrBack foreOrBack){ + if (bitDepth== AnsiColors.BitDepth.FOUR){ + if (foreOrBack == ForeOrBack.FORE){ + for (AnsiColor item : AnsiColor.values()) { + if (StrUtil.equals(item.toString(), StrUtil.toString(this.code))) { + return item; + } + } + throw new IllegalArgumentException(StrUtil.format("No matched AnsiColor instance,code={}",this.code)); + } + for (AnsiBackground item : AnsiBackground.values()) { + if (StrUtil.equals(item.toString(), StrUtil.toString(this.code+10))) { + return item; + } + } + throw new IllegalArgumentException(StrUtil.format("No matched AnsiBackground instance,code={}",this.code)); + } + if (foreOrBack == ForeOrBack.FORE){ + return Ansi8BitColor.foreground(this.code); + } + return Ansi8BitColor.background(this.code); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AnsiColorWrapper that = (AnsiColorWrapper) o; + return this.code == that.code && this.bitDepth == that.bitDepth; + } + + @Override + public int hashCode() { + return Objects.hash(this.code, this.bitDepth); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ansi/AnsiColors.java b/hutool-core/src/main/java/cn/hutool/core/lang/ansi/AnsiColors.java new file mode 100644 index 000000000..f0aa749b5 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ansi/AnsiColors.java @@ -0,0 +1,282 @@ +package cn.hutool.core.lang.ansi; + +import cn.hutool.core.lang.Assert; + +import java.awt.Color; +import java.awt.color.ColorSpace; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * + * 在 {@link Color AWT Colors} 的上下文中使用 {@link AnsiColor} 的实用程序 + *
来自Spring Boot
+ * + * @author Craig Burke,Ruben Dijkstra,Phillip Webb,Michael Simons,Tom Xin + * @since 5.8.6 + */ +public final class AnsiColors { + + private static final Map