6
6
import net .dv8tion .jda .api .interactions .components .Button ;
7
7
import net .dv8tion .jda .api .interactions .components .ButtonStyle ;
8
8
import org .jetbrains .annotations .NotNull ;
9
- import org .jetbrains .annotations .Nullable ;
10
9
import org .scilab .forge .jlatexmath .ParseException ;
11
10
import org .scilab .forge .jlatexmath .TeXConstants ;
12
11
import org .scilab .forge .jlatexmath .TeXFormula ;
@@ -63,6 +62,7 @@ public void onSlashCommand(@NotNull final SlashCommandEvent event) {
63
62
String latex = Objects .requireNonNull (event .getOption (LATEX_OPTION )).getAsString ();
64
63
String userID = (Objects .requireNonNull (event .getMember ()).getId ());
65
64
TeXFormula formula ;
65
+
66
66
try {
67
67
if (latex .contains ("$" )) {
68
68
latex = convertInlineLatexToFull (latex );
@@ -72,49 +72,76 @@ public void onSlashCommand(@NotNull final SlashCommandEvent event) {
72
72
event .reply ("That is an invalid latex: " + e .getMessage ()).setEphemeral (true ).queue ();
73
73
return ;
74
74
}
75
+
75
76
event .deferReply ().queue ();
76
- Image image = formula .createBufferedImage (TeXConstants .STYLE_DISPLAY , DEFAULT_IMAGE_SIZE ,
77
- FOREGROUND_COLOR , BACKGROUND_COLOR );
78
- if (image .getWidth (null ) == -1 || image .getHeight (null ) == -1 ) {
79
- event .getHook ().setEphemeral (true ).editOriginal (RENDERING_ERROR ).queue ();
80
- logger .warn (
81
- "Unable to render latex, image does not have an accessible width or height. Formula was {}" ,
82
- latex );
83
- return ;
84
- }
85
- BufferedImage renderedTextImage = new BufferedImage (image .getWidth (null ),
86
- image .getHeight (null ), BufferedImage .TYPE_4BYTE_ABGR );
87
- renderedTextImage .getGraphics ().drawImage (image , 0 , 0 , null );
88
- ByteArrayOutputStream renderedTextImageStream = new ByteArrayOutputStream ();
89
77
90
78
try {
91
- ImageIO .write (renderedTextImage , "png" , renderedTextImageStream );
79
+ Image image = renderImage (formula );
80
+ sendImage (event , userID , image );
92
81
} catch (IOException e ) {
93
- event .getHook ().setEphemeral ( true ). editOriginal (RENDERING_ERROR ).queue ();
82
+ event .getHook ().editOriginal (RENDERING_ERROR ).queue ();
94
83
logger .warn (
95
84
"Unable to render latex, could not convert the image into an attachable form. Formula was {}" ,
96
85
latex , e );
97
- return ;
86
+
87
+ } catch (IllegalStateException e ) {
88
+ event .getHook ().editOriginal (RENDERING_ERROR ).queue ();
89
+
90
+ logger .warn (
91
+ "Unable to render latex, image does not have an accessible width or height. Formula was {}" ,
92
+ latex , e );
93
+ }
94
+ }
95
+
96
+ private @ NotNull Image renderImage (@ NotNull TeXFormula formula ) {
97
+ Image image = formula .createBufferedImage (TeXConstants .STYLE_DISPLAY , DEFAULT_IMAGE_SIZE ,
98
+ FOREGROUND_COLOR , BACKGROUND_COLOR );
99
+
100
+ if (image .getWidth (null ) == -1 || image .getHeight (null ) == -1 ) {
101
+ throw new IllegalStateException ("Image has no height or width" );
98
102
}
103
+ return image ;
104
+ }
105
+
106
+ private void sendImage (@ NotNull SlashCommandEvent event , @ NotNull String userID ,
107
+ @ NotNull Image image ) throws IOException {
108
+
109
+ ByteArrayOutputStream renderedTextImageStream = getRenderedTextImageStream (image );
99
110
event .getHook ()
100
111
.editOriginal (renderedTextImageStream .toByteArray (), "tex.png" )
101
112
.setActionRow (Button .of (ButtonStyle .DANGER , generateComponentId (userID ), "Delete" ))
102
113
.queue ();
103
114
}
104
115
116
+ @ NotNull
117
+ private ByteArrayOutputStream getRenderedTextImageStream (@ NotNull Image image )
118
+ throws IOException {
119
+
120
+ BufferedImage renderedTextImage = new BufferedImage (image .getWidth (null ),
121
+ image .getHeight (null ), BufferedImage .TYPE_4BYTE_ABGR );
122
+
123
+ renderedTextImage .getGraphics ().drawImage (image , 0 , 0 , null );
124
+ ByteArrayOutputStream renderedTextImageStream = new ByteArrayOutputStream ();
125
+
126
+ ImageIO .write (renderedTextImage , "png" , renderedTextImageStream );
127
+
128
+ return renderedTextImageStream ;
129
+ }
130
+
105
131
/**
106
- *
107
132
* Converts inline latex like: {@code hello $\frac{x}{2}$ world} to full latex
108
133
* {@code \text{hello}\frac{x}{2}\text{ world}}.
109
- *
110
134
*/
111
135
@ NotNull
112
136
private String convertInlineLatexToFull (@ NotNull String latex ) {
113
137
if (isInvalidInlineFormat (latex )) {
114
- throw new ParseException ("One dollar sign is invalid, wrap whole expression with it. " );
138
+ throw new ParseException (
139
+ "The amount of $-symbols must be divisible by two. Did you forget to close an expression? " );
115
140
}
141
+
116
142
Matcher matcher = INLINE_LATEX_REPLACEMENT .matcher (latex );
117
143
StringBuilder sb = new StringBuilder ();
144
+
118
145
while (matcher .find ()) {
119
146
boolean isInsideMathRegion = matcher .group (1 ) != null ;
120
147
if (isInsideMathRegion ) {
0 commit comments