Skip to content

Commit 7ee876d

Browse files
committed
Improved rendering, add hyperlink support
1 parent 72aa5af commit 7ee876d

File tree

3 files changed

+65
-23
lines changed

3 files changed

+65
-23
lines changed

checkstyle.xml

-3
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,6 @@
199199
<!-- Number of possible paths through the source -->
200200
<property name="max" value="15"/>
201201
</module>
202-
<module name="AnonInnerLength">
203-
<property name="max" value="60"/>
204-
</module>
205202
<module name="OneStatementPerLine"/>
206203
<module name="OneTopLevelClass"/>
207204
<module name="UnusedImports"/>

src/main/java/me/coley/recaf/ui/controls/pane/UpdatePane.java

+59-19
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import javafx.geometry.Insets;
44
import javafx.scene.control.Button;
5+
import javafx.scene.control.Hyperlink;
56
import javafx.scene.control.Label;
67
import javafx.scene.layout.BorderPane;
78
import javafx.scene.layout.GridPane;
@@ -11,11 +12,14 @@
1112
import me.coley.recaf.ui.controls.ActionButton;
1213
import me.coley.recaf.ui.controls.ExceptionAlert;
1314
import me.coley.recaf.util.Log;
15+
import me.coley.recaf.util.UiUtil;
1416
import me.coley.recaf.util.self.SelfUpdater;
1517
import org.commonmark.node.*;
1618
import org.commonmark.parser.Parser;
1719

1820
import java.io.IOException;
21+
import java.net.URL;
22+
import java.util.function.Consumer;
1923

2024
import static me.coley.recaf.util.LangUtil.translate;
2125

@@ -60,58 +64,94 @@ private BorderPane getHeader() {
6064
private BorderPane getNotes() {
6165
TextFlow flow = new TextFlow();
6266
Parser parser = Parser.builder().build();
63-
Node document = parser.parse(SelfUpdater.getLatestPatchnotes().replaceAll("\\(\\[.+\\)\\)", ""));
67+
Node document = parser.parse(SelfUpdater.getLatestPatchnotes());
6468
document.accept(new AbstractVisitor() {
6569
@Override
6670
public void visit(Paragraph paragraph) {
67-
StringBuilder sb = new StringBuilder();
68-
Node node = paragraph.getFirstChild();
69-
build(sb, node);
70-
addLine(sb.toString(), null);
71+
// Add all content to same line
72+
parse(paragraph, this::text, this::link);
73+
newLine();
7174
}
7275

7376
@Override
7477
public void visit(Heading heading) {
7578
// Skip the version H2 text
7679
if (heading.getLevel() <= 2)
7780
return;
78-
addLine(build(heading), "h2");
81+
// Extract heading text
82+
StringBuilder sb = new StringBuilder();
83+
parse(heading, text -> sb.append(text.getLiteral()), null);
84+
// Render
85+
addText(sb.toString(), "h2");
86+
newLine();
7987
}
8088

8189
@Override
8290
public void visit(BulletList list) {
8391
Node item = list.getFirstChild();
8492
do {
85-
String itemText = build(item);
86-
addLine(" ● " + itemText, null);
93+
// Prefix with bullet point
94+
addText(" ● ", null);
95+
// Add all content to same line
96+
parse(item, this::text, this::link);
97+
// New line between items
98+
newLine();
8799
item = item.getNext();
88100
} while (item != null);
89101
}
90102

91-
private String build(Node node) {
92-
StringBuilder sb = new StringBuilder();
93-
build(sb, node);
94-
return sb.toString();
103+
private void text(Text text) {
104+
addText(text.getLiteral(), null);
105+
}
106+
107+
private void link(Link link) {
108+
String text = link.getTitle();
109+
if (text == null) {
110+
StringBuilder sb = new StringBuilder();
111+
parse(link, t -> sb.append(t.getLiteral()), null);
112+
text = sb.toString();
113+
}
114+
addLink(text, link.getDestination());
95115
}
96116

97-
private void build(StringBuilder sb, Node node) {
98-
if (node instanceof Text)
99-
sb.append(((Text) node).getLiteral());
100-
else {
117+
private void parse(Node node, Consumer<Text> textHandler, Consumer<Link> linkHandler) {
118+
if (node instanceof Text) {
119+
if (textHandler != null) textHandler.accept((Text) node);
120+
} else if (linkHandler != null && node instanceof Link) {
121+
linkHandler.accept((Link) node);
122+
} else {
101123
Node child = node.getFirstChild();
102124
do {
103-
build(sb, child);
125+
parse(child, textHandler, linkHandler);
104126
child = child.getNext();
105127
} while (child != null);
106128
}
107129
}
108130

109-
private void addLine(String text, String style) {
110-
javafx.scene.text.Text t = new javafx.scene.text.Text(text + "\n");
131+
private void addLink(String text, String url) {
132+
Hyperlink link = new Hyperlink(text);
133+
link.getStyleClass().add("a");
134+
link.setOnAction(e -> {
135+
try {
136+
UiUtil.showDocument(new URL(url).toURI());
137+
} catch (Exception ex) {
138+
Log.error("Could not open URL: " + url);
139+
}
140+
});
141+
flow.getChildren().add(link);
142+
}
143+
144+
private void addText(String text, String style) {
145+
javafx.scene.text.Text t = new javafx.scene.text.Text(text);
111146
if (style != null)
112147
t.getStyleClass().add(style);
113148
flow.getChildren().add(t);
114149
}
150+
151+
private void newLine() {
152+
javafx.scene.text.Text t = new javafx.scene.text.Text("\n");
153+
flow.getChildren().add(t);
154+
}
115155
});
116156
BorderPane pane = new BorderPane(flow);
117157
pane.getStyleClass().add("content");

src/main/resources/style/base.css

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,19 @@
1010
-fx-font-size: 15px;
1111
-fx-font-weight: bold;
1212
}
13+
.a {
14+
-fx-underline: true;
15+
-fx-text-fill: rgb(24, 101, 217);
16+
-fx-fill: rgb(24, 101, 217);
17+
}
1318
.bold {
1419
-fx-font-weight: bold;
1520
}
1621
.underlined {
1722
-fx-underline: true;
1823
}
1924
.faint {
20-
-fx-text-fill: rgb(116, 116, 116);
25+
-fx-fill: rgb(116, 116, 116);
2126
}
2227
.no-border {
2328
-fx-border-width: 0;

0 commit comments

Comments
 (0)