|
32 | 32 | import org.grails.forge.template.URLTemplate; |
33 | 33 |
|
34 | 34 | import java.util.Set; |
| 35 | +import java.util.List; |
35 | 36 |
|
36 | 37 | @Singleton |
37 | 38 | public class AssetPipeline implements DefaultFeature { |
@@ -91,21 +92,49 @@ public void apply(GeneratorContext generatorContext) { |
91 | 92 | .artifactId("jquery") |
92 | 93 | .testAndDevelopmentOnly()); |
93 | 94 |
|
94 | | - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); |
95 | | - generatorContext.addTemplate("advancedgrails_svg", new URLTemplate("grails-app/assets/images/advancedgrails.svg", classLoader.getResource("assets/images/advancedgrails.svg"))); |
96 | | - generatorContext.addTemplate("apple-touch-icon_png", new URLTemplate("grails-app/assets/images/apple-touch-icon.png", classLoader.getResource("assets/images/apple-touch-icon.png"))); |
97 | | - generatorContext.addTemplate("apple-touch-icon-retina_png", new URLTemplate("grails-app/assets/images/apple-touch-icon-retina.png", classLoader.getResource("assets/images/apple-touch-icon-retina.png"))); |
98 | | - generatorContext.addTemplate("documentation_svg", new URLTemplate("grails-app/assets/images/documentation.svg", classLoader.getResource("assets/images/documentation.svg"))); |
99 | | - generatorContext.addTemplate("favicon_ico", new URLTemplate("grails-app/assets/images/favicon.ico", classLoader.getResource("assets/images/favicon.ico"))); |
100 | | - generatorContext.addTemplate("grails_svg", new URLTemplate("grails-app/assets/images/grails.svg", classLoader.getResource("assets/images/grails.svg"))); |
101 | | - generatorContext.addTemplate("grails-cupsonly-logo-white_svg", new URLTemplate("grails-app/assets/images/grails-cupsonly-logo-white.svg", classLoader.getResource("assets/images/grails-cupsonly-logo-white.svg"))); |
102 | | - generatorContext.addTemplate("slack_svg", new URLTemplate("grails-app/assets/images/slack.svg", classLoader.getResource("assets/images/slack.svg"))); |
103 | | - |
104 | | - generatorContext.addTemplate("application_js", new URLTemplate("grails-app/assets/javascripts/application.js", classLoader.getResource("assets/javascripts/application.js"))); |
105 | | - |
106 | | - generatorContext.addTemplate("application_css", new URLTemplate("grails-app/assets/stylesheets/application.css", classLoader.getResource("assets/stylesheets/application.css"))); |
107 | | - generatorContext.addTemplate("errors_css", new URLTemplate("grails-app/assets/stylesheets/errors.css", classLoader.getResource("assets/stylesheets/errors.css"))); |
108 | | - generatorContext.addTemplate("grails_css", new URLTemplate("grails-app/assets/stylesheets/grails.css", classLoader.getResource("assets/stylesheets/grails.css"))); |
| 95 | + var assetPaths = List.of( |
| 96 | + // Keep categories separate for readability. |
| 97 | + "grails-app/assets/images/advancedgrails.svg", |
| 98 | + "grails-app/assets/images/community.svg", |
| 99 | + "grails-app/assets/images/documentation.svg", |
| 100 | + "grails-app/assets/images/favicon.ico", |
| 101 | + "grails-app/assets/images/grails.svg", |
| 102 | + "grails-app/assets/images/groovy.svg", |
| 103 | + "grails-app/assets/images/java.svg", |
| 104 | + "grails-app/assets/images/spring.svg", |
| 105 | + "grails-app/assets/images/spring-boot.svg", |
| 106 | + |
| 107 | + "grails-app/assets/javascripts/application.js", |
| 108 | + "grails-app/assets/javascripts/welcome.js", |
| 109 | + |
| 110 | + "grails-app/assets/stylesheets/application.css", |
| 111 | + "grails-app/assets/stylesheets/errors.css", |
| 112 | + "grails-app/assets/stylesheets/grails.css", |
| 113 | + "grails-app/assets/stylesheets/welcome.css" |
| 114 | + ); |
| 115 | + |
| 116 | + var classLoader = Thread.currentThread().getContextClassLoader(); |
| 117 | + for (var assetTemplate : assetPaths) { |
| 118 | + addAssetTemplate(generatorContext, classLoader, assetTemplate); |
| 119 | + } |
| 120 | + } |
| 121 | + |
| 122 | + private static void addAssetTemplate(GeneratorContext generatorContext, ClassLoader classLoader, String assetPath) { |
| 123 | + |
| 124 | + // The template key is the filename with extension dot replaced by underscore, |
| 125 | + // e.g. application.css -> application_css |
| 126 | + var fileName = assetPath.substring(assetPath.lastIndexOf('/') + 1); |
| 127 | + var templateKey = fileName.replaceFirst("\\.", "_"); |
| 128 | + |
| 129 | + // Resource paths are relative to the classpath root (no leading slash) |
| 130 | + var resourcePath = assetPath.replaceFirst("^grails-app/", ""); |
| 131 | + generatorContext.addTemplate( |
| 132 | + templateKey, |
| 133 | + new URLTemplate( |
| 134 | + assetPath, |
| 135 | + classLoader.getResource(resourcePath) |
| 136 | + ) |
| 137 | + ); |
109 | 138 | } |
110 | 139 |
|
111 | 140 | @Override |
|
0 commit comments