Rework themes support

- Add theme settings for figures.
- Settings for styles are now in it own class and
  ThemeSettings are wrapping those.
- Prefixed formatting string to have `style-` prefix.
- Templates can now use added `figures` dictionary which
  is resolved per activated theme.
- Create `dump` theme.
- New `ThemeActive` interface where default impl uses dump
  theme if `CI` or `NO_COLOR` env is set.
- Rework existing templates.
- Fixes #442
This commit is contained in:
Janne Valkealahti
2022-06-10 09:11:30 +01:00
parent fa65a2308e
commit 073cd8562c
27 changed files with 807 additions and 256 deletions

View File

@@ -18,6 +18,7 @@ package org.springframework.shell.samples.standard;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
import org.jline.utils.AttributedString;
import org.jline.utils.AttributedStringBuilder;
@@ -26,8 +27,9 @@ import org.jline.utils.AttributedStyle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;
import org.springframework.shell.style.FigureSettings;
import org.springframework.shell.style.StyleSettings;
import org.springframework.shell.style.ThemeResolver;
import org.springframework.shell.style.ThemeSettings;
@ShellComponent
public class StyleCommands {
@@ -39,10 +41,10 @@ public class StyleCommands {
List<String> rgbRedHue = Arrays.asList("#ff0000", "#ff4000", "#ff8000", "#ffbf00", "#ffff00", "#bfff00", "#80ff00",
"#40ff00", "#00ff00", "#00ff40", "#00ff80", "#00ffbf", "#00ffff", "#00bfff", "#0080ff", "#0040ff",
"#0000ff", "#4000ff", "#8000ff", "#bf00ff", "#ff00ff", "#ff00bf", "#ff0080", "#ff0040", "#ff0000");
List<String> themeTags = Arrays.asList(ThemeSettings.TAG_TITLE, ThemeSettings.TAG_VALUE, ThemeSettings.TAG_LIST_KEY,
ThemeSettings.TAG_LIST_VALUE, ThemeSettings.TAG_LEVEL_INFO, ThemeSettings.TAG_LEVEL_WARN,
ThemeSettings.TAG_LEVEL_ERROR, ThemeSettings.TAG_ITEM_ENABLED, ThemeSettings.TAG_ITEM_DISABLED,
ThemeSettings.TAG_ITEM_SELECTED, ThemeSettings.TAG_ITEM_UNSELECTED, ThemeSettings.TAG_ITEM_SELECTOR);
List<String> themeTags = Arrays.asList(StyleSettings.TAG_TITLE, StyleSettings.TAG_VALUE, StyleSettings.TAG_LIST_KEY,
StyleSettings.TAG_LIST_VALUE, StyleSettings.TAG_LEVEL_INFO, StyleSettings.TAG_LEVEL_WARN,
StyleSettings.TAG_LEVEL_ERROR, StyleSettings.TAG_ITEM_ENABLED, StyleSettings.TAG_ITEM_DISABLED,
StyleSettings.TAG_ITEM_SELECTED, StyleSettings.TAG_ITEM_UNSELECTED, StyleSettings.TAG_ITEM_SELECTOR);
@Autowired
private ThemeResolver themeResolver;
@@ -82,14 +84,32 @@ public class StyleCommands {
AttributedStringBuilder builder = new AttributedStringBuilder();
themeTags.stream()
.forEach(tag -> {
String resolvedStyle = themeResolver.resolveTag(tag);
String resolvedStyle = themeResolver.resolveStyleTag(tag);
AttributedStyle style = themeResolver.resolveStyle(resolvedStyle);
AttributedString styledStr = new AttributedString(tag, style);
builder.append(String.format("%-25s", tag));
builder.append(" ");
builder.append(styledStr);
builder.append("\n");
});;
});
return builder.toAttributedString();
}
@ShellMethod(key = "style figure", value = "Showcase figures", group = "Styles")
public AttributedString stylesFigures() {
AttributedStringBuilder builder = new AttributedStringBuilder();
Stream.of(FigureSettings.tags())
.forEach(tag -> {
builder.append(String.format("%-25s", tag));
builder.append(" ");
String resolveFigureTag = themeResolver.resolveFigureTag(tag);
combinations3().stream().forEach(spec -> {
AttributedStyle style = themeResolver.resolveStyle(spec);
builder.append(" ");
builder.append(new AttributedString(resolveFigureTag, style));
});
builder.append("\n");
});
return builder.toAttributedString();
}
@@ -112,4 +132,16 @@ public class StyleCommands {
});
return styles;
}
private List<String> combinations3() {
List<String> styles = new ArrayList<>();
Arrays.asList("fg").stream().forEach(ground -> {
colors.stream().forEach(color -> {
named.stream().forEach(named -> {
styles.add(String.format("%s,%s:%s", named, ground, color));
});
});
});
return styles;
}
}