|
2 | 2 |
|
3 | 3 | import java.nio.charset.Charset; |
4 | 4 | import java.nio.charset.StandardCharsets; |
| 5 | +import java.util.ArrayList; |
5 | 6 | import java.util.Collections; |
6 | 7 | import java.util.Comparator; |
7 | 8 | import java.util.List; |
@@ -69,7 +70,7 @@ public enum JResType { |
69 | 70 | } |
70 | 71 |
|
71 | 72 | private final transient String name; |
72 | | - private final transient String shortName; |
| 73 | + private transient String shortName; |
73 | 74 | private final transient JResType type; |
74 | 75 | private final transient ResourceFile resFile; |
75 | 76 |
|
@@ -159,6 +160,50 @@ private static void sortResNodes(List<JResource> nodes) { |
159 | 160 | } |
160 | 161 | } |
161 | 162 |
|
| 163 | + /** |
| 164 | + * Collapse single-child DIR chains into one node with a slash-joined display name (GitHub-style). |
| 165 | + */ |
| 166 | + public static void mergeMiddleDirs(JResource root) { |
| 167 | + mergeChildren(root.subNodes); |
| 168 | + } |
| 169 | + |
| 170 | + public static void mergeMiddleDirs(List<JResource> roots) { |
| 171 | + mergeChildren(roots); |
| 172 | + } |
| 173 | + |
| 174 | + private static void mergeChildren(List<JResource> children) { |
| 175 | + for (int i = 0; i < children.size(); i++) { |
| 176 | + JResource sub = children.get(i); |
| 177 | + JResource replaced = mergeChain(sub, new ArrayList<>()); |
| 178 | + if (replaced != sub) { |
| 179 | + children.set(i, replaced); |
| 180 | + } |
| 181 | + mergeChildren(replaced.subNodes); |
| 182 | + } |
| 183 | + } |
| 184 | + |
| 185 | + private static JResource mergeChain(JResource node, List<JResource> merged) { |
| 186 | + if (node.type == JResType.DIR) { |
| 187 | + List<JResource> subs = node.subNodes; |
| 188 | + if (subs.size() == 1 && subs.get(0).type == JResType.DIR) { |
| 189 | + merged.add(node); |
| 190 | + return mergeChain(subs.get(0), merged); |
| 191 | + } |
| 192 | + } |
| 193 | + if (!merged.isEmpty()) { |
| 194 | + merged.add(node); |
| 195 | + StringBuilder sb = new StringBuilder(); |
| 196 | + for (int i = 0; i < merged.size(); i++) { |
| 197 | + if (i > 0) { |
| 198 | + sb.append('/'); |
| 199 | + } |
| 200 | + sb.append(merged.get(i).shortName); |
| 201 | + } |
| 202 | + node.shortName = sb.toString(); |
| 203 | + } |
| 204 | + return node; |
| 205 | + } |
| 206 | + |
162 | 207 | @Override |
163 | 208 | public boolean hasContent() { |
164 | 209 | return resFile != null; |
|
0 commit comments