2018-08-18 14:58:36 +03:00

141 lines
3.9 KiB
Java

package ru.noties.markwon.syntax;
import android.support.annotation.ColorInt;
import android.support.annotation.FloatRange;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import java.util.HashMap;
import ru.noties.prism4j.Prism4j;
public abstract class Prism4jThemeBase implements Prism4jTheme {
@ColorInt
protected static int applyAlpha(@IntRange(from = 0, to = 255) int alpha, @ColorInt int color) {
return (color & 0x00FFFFFF) | (alpha << 24);
}
@ColorInt
protected static int applyAlpha(@FloatRange(from = .0F, to = 1.F) float alpha, @ColorInt int color) {
return applyAlpha((int) (255 * alpha + .5F), color);
}
protected static boolean isOfType(@NonNull String expected, @NonNull String type, @Nullable String alias) {
return expected.equals(type) || expected.equals(alias);
}
private final ColorHashMap colorHashMap;
protected Prism4jThemeBase() {
this.colorHashMap = init();
}
@NonNull
protected abstract ColorHashMap init();
@ColorInt
protected int color(@NonNull String language, @NonNull String type, @Nullable String alias) {
Color color = colorHashMap.get(type);
if (color == null
&& alias != null) {
color = colorHashMap.get(alias);
}
return color != null
? color.color
: 0;
}
@Override
public void apply(
@NonNull String language,
@NonNull Prism4j.Syntax syntax,
@NonNull SpannableStringBuilder builder,
int start,
int end) {
final String type = syntax.type();
final String alias = syntax.alias();
final int color = color(language, type, alias);
if (color != 0) {
applyColor(language, type, alias, color, builder, start, end);
}
}
@SuppressWarnings("unused")
protected void applyColor(
@NonNull String language,
@NonNull String type,
@Nullable String alias,
@ColorInt int color,
@NonNull SpannableStringBuilder builder,
int start,
int end) {
builder.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
protected static class Color {
@NonNull
public static Color of(@ColorInt int color) {
return new Color(color);
}
@ColorInt
protected final int color;
protected Color(@ColorInt int color) {
this.color = color;
}
}
protected static class ColorHashMap extends HashMap<String, Color> {
@NonNull
protected ColorHashMap add(@ColorInt int color, String name) {
put(name, Color.of(color));
return this;
}
@NonNull
protected ColorHashMap add(
@ColorInt int color,
@NonNull String name1,
@NonNull String name2) {
final Color c = Color.of(color);
put(name1, c);
put(name2, c);
return this;
}
@NonNull
protected ColorHashMap add(
@ColorInt int color,
@NonNull String name1,
@NonNull String name2,
@NonNull String name3) {
final Color c = Color.of(color);
put(name1, c);
put(name2, c);
put(name3, c);
return this;
}
@NonNull
protected ColorHashMap add(@ColorInt int color, String... names) {
final Color c = Color.of(color);
for (String name : names) {
put(name, c);
}
return this;
}
}
}