diff --git a/.editorconfig b/.editorconfig index 33cca13..0959717 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,6 +14,15 @@ ij_smart_tabs = false ij_visual_guides = 80, 120 ij_wrap_on_typing = false +[*.yml] +indent_size = 2 +tab_width = 2 +ij_yaml_keep_indents_on_empty_lines = false +ij_yaml_keep_line_breaks = true +ij_yaml_space_before_colon = false +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = false + [*.java] ij_java_align_consecutive_assignments = false ij_java_align_consecutive_variable_declarations = false @@ -72,12 +81,12 @@ ij_java_case_statement_on_separate_line = true ij_java_catch_on_new_line = false ij_java_class_annotation_wrap = split_into_lines ij_java_class_brace_style = end_of_line -ij_java_class_count_to_use_import_on_demand = 5 +ij_java_class_count_to_use_import_on_demand = 3 ij_java_class_names_in_javadoc = 1 ij_java_deconstruction_list_wrap = on_every_item ij_java_do_not_indent_top_level_class_members = false -ij_java_do_not_wrap_after_single_annotation = false -ij_java_do_not_wrap_after_single_annotation_in_parameter = false +ij_java_do_not_wrap_after_single_annotation = true +ij_java_do_not_wrap_after_single_annotation_in_parameter = true ij_java_do_while_brace_force = if_multiline ij_java_doc_add_blank_line_after_description = true ij_java_doc_add_blank_line_after_param_comments = false @@ -102,7 +111,7 @@ ij_java_enum_constants_wrap = on_every_item ij_java_enum_field_annotation_wrap = off ij_java_extends_keyword_wrap = normal ij_java_extends_list_wrap = normal -ij_java_field_annotation_wrap = split_into_lines +ij_java_field_annotation_wrap = normal ij_java_field_name_prefix = ij_java_field_name_suffix = ij_java_finally_on_new_line = false @@ -154,7 +163,7 @@ ij_java_new_line_after_lparen_in_deconstruction_pattern = true ij_java_new_line_after_lparen_in_record_header = true ij_java_new_line_when_body_is_presented = false ij_java_packages_to_use_import_on_demand = java.awt.*, javax.swing.* -ij_java_parameter_annotation_wrap = off +ij_java_parameter_annotation_wrap = normal ij_java_parameter_name_prefix = ij_java_parameter_name_suffix = ij_java_parentheses_expression_new_line_after_left_paren = true @@ -267,7 +276,7 @@ ij_java_use_external_annotations = false ij_java_use_fq_class_names = false ij_java_use_relative_indents = false ij_java_use_single_class_imports = true -ij_java_variable_annotation_wrap = off +ij_java_variable_annotation_wrap = normal ij_java_visibility = public ij_java_while_brace_force = if_multiline ij_java_while_on_new_line = false diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 471f526..e1e36ab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,4 +37,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: Artifacts - path: build/libs/ \ No newline at end of file + path: build/libs/ diff --git a/src/main/java/com/kevinsundqvistnorlen/rubi/IRubyStyle.java b/src/main/java/com/kevinsundqvistnorlen/rubi/IRubyStyle.java index 4434f2e..588063a 100644 --- a/src/main/java/com/kevinsundqvistnorlen/rubi/IRubyStyle.java +++ b/src/main/java/com/kevinsundqvistnorlen/rubi/IRubyStyle.java @@ -2,12 +2,14 @@ import net.minecraft.text.Style; -public interface IRubyStyle { - Style withRuby(String word, String ruby); - RubyText getRuby(); - Style removeRuby(); +import java.util.Optional; - static RubyText getRuby(Style style) { - return ((IRubyStyle) style).getRuby(); +public interface IRubyStyle { + static Optional getRuby(Style style) { + return Optional.ofNullable(((IRubyStyle) style).rubi$getRuby()); } + + Style rubi$withRuby(String word, String ruby); + RubyText rubi$getRuby(); + Style rubi$removeRuby(); } diff --git a/src/main/java/com/kevinsundqvistnorlen/rubi/RubyText.java b/src/main/java/com/kevinsundqvistnorlen/rubi/RubyText.java index caffc2e..aab0a1e 100644 --- a/src/main/java/com/kevinsundqvistnorlen/rubi/RubyText.java +++ b/src/main/java/com/kevinsundqvistnorlen/rubi/RubyText.java @@ -1,24 +1,17 @@ package com.kevinsundqvistnorlen.rubi; -import com.kevinsundqvistnorlen.rubi.option.ITextHandler; import com.kevinsundqvistnorlen.rubi.option.RubyRenderMode; import net.minecraft.client.font.TextHandler; -import net.minecraft.text.OrderedText; -import net.minecraft.text.Style; -import net.minecraft.text.TextVisitFactory; +import net.minecraft.text.*; import org.apache.commons.lang3.mutable.MutableFloat; -import org.apache.commons.lang3.mutable.MutableObject; import org.joml.Matrix4f; -import java.util.*; +import java.util.Objects; import java.util.regex.Pattern; -public record RubyText(String text, String ruby) { - +public record RubyText(String text, String ruby, Style style) { public static final Pattern RUBY_PATTERN = Pattern.compile("\\^\\s*(.+?)\\s*\\(\\s*(.+?)\\s*\\)"); - public static final Pattern RUBY_PATTERN_FOR_STRIPPING = Pattern.compile("§\\^\\s*(.+?)\\s*\\(\\s*(.+?)\\s*\\)"); - - public static final char RUBY_MARKER = '\uFFFC';//'\ue9c0'; + public static final Pattern RUBY_PATTERN_FOR_STRIPPING = Pattern.compile("§" + RUBY_PATTERN.pattern()); public static final float RUBY_SCALE = 0.5f; public static final float RUBY_OVERLAP = 0.1f; @@ -34,39 +27,48 @@ public static String strip(String returnValue) { return sb.toString(); } - public float getWidth(ITextHandler textHandler, Style style) { - var mode = RubyRenderMode.getOption().getValue(); - float baseWidth = 0f, - rubyWidth = 0f; - if (mode != RubyRenderMode.REPLACE) baseWidth = textHandler.getWidth(OrderedText.styledForwardsVisitedString(this.text(), style)); - if (mode != RubyRenderMode.HIDDEN) rubyWidth = textHandler.getWidth(OrderedText.styledForwardsVisitedString(this.ruby(), style)); - return switch (mode) { - case ABOVE, BELOW -> Math.max( - baseWidth * RubyText.TEXT_SCALE, - rubyWidth * RubyText.RUBY_SCALE - ); - case HIDDEN -> baseWidth; - case REPLACE -> rubyWidth; - }; + public float draw( + float x, + float y, + Matrix4f matrix, + TextHandler handler, + int fontHeight, + TextDrawer drawer + ) { + float width = handler.getWidth(OrderedText.styled('', this.style)); + + switch (RubyRenderMode.getOption().getValue()) { + case ABOVE -> this.drawAbove(x, y, width, matrix, handler, fontHeight, drawer); + case BELOW -> this.drawBelow(x, y, width, matrix, handler, fontHeight, drawer); + case REPLACE -> this.drawReplace(x, y, matrix, drawer); + case HIDDEN -> this.drawHidden(x, y, matrix, drawer); + } + + return width; } - public float getWidth(TextHandler.WidthRetriever widthRetriever, Style style) { - var mode = RubyRenderMode.getOption().getValue(); - MutableFloat baseWidth = new MutableFloat(), - rubyWidth = new MutableFloat(); - if (mode != RubyRenderMode.REPLACE) TextVisitFactory.visitForwards(this.text(), style, (unused, s, codePoint) -> { - baseWidth.add(widthRetriever.getWidth(codePoint, s)); - return true; - }); - if (mode != RubyRenderMode.HIDDEN) TextVisitFactory.visitForwards(this.ruby(), style, (unused, s, codePoint) -> { - rubyWidth.add(widthRetriever.getWidth(codePoint, s)); - return true; - }); + public float getWidth(TextHandler.WidthRetriever widthRetriever) { + final var mode = RubyRenderMode.getOption().getValue(); + final var style = ((IRubyStyle) this.style).rubi$removeRuby(); + MutableFloat baseWidth = new MutableFloat(), rubyWidth = new MutableFloat(); + + if (mode != RubyRenderMode.REPLACE) { + TextVisitFactory.visitForwards(this.text, style, (unused, s, codePoint) -> { + baseWidth.add(widthRetriever.getWidth(codePoint, s)); + return true; + }); + } + + if (mode != RubyRenderMode.HIDDEN) { + TextVisitFactory.visitForwards(this.ruby, style, (unused, s, codePoint) -> { + rubyWidth.add(widthRetriever.getWidth(codePoint, s)); + return true; + }); + } + return switch (mode) { - case ABOVE, BELOW -> Math.max( - baseWidth.getValue() * RubyText.TEXT_SCALE, - rubyWidth.getValue() * RubyText.RUBY_SCALE - ); + case ABOVE, BELOW -> + Math.max(baseWidth.getValue() * RubyText.TEXT_SCALE, rubyWidth.getValue() * RubyText.RUBY_SCALE); case HIDDEN -> baseWidth.getValue(); case REPLACE -> rubyWidth.getValue(); }; @@ -74,52 +76,17 @@ public float getWidth(TextHandler.WidthRetriever widthRetriever, Style style) { @Override public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - RubyText rubyText = (RubyText) o; - return Objects.equals(text, rubyText.text) && Objects.equals(ruby, rubyText.ruby); + if (o == null || this.getClass() != o.getClass()) return false; + RubyText other = (RubyText) o; + return Objects.equals(this.text, other.text()) && Objects.equals(this.ruby, other.ruby()); } @Override public int hashCode() { - return Objects.hash(text, ruby); - } - - public static float draw( - OrderedText rubiCharacter, - float x, - float y, - Matrix4f matrix, - TextHandler handler, - int fontHeight, - TextDrawer drawer - ) { - float width = handler.getWidth(rubiCharacter); - - final MutableObject rubyTextWrapper = new MutableObject<>(null); - final MutableObject