diff --git a/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy b/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy
index fd70525..8568889 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy
@@ -15,7 +15,12 @@ import com.jessebrault.ssg.view.PageView
import com.jessebrault.ssg.view.WvcPageView
import groovy.transform.TupleConstructor
import groowt.util.di.RegistryObjectFactory
+import groowt.view.component.compiler.DefaultComponentTemplateCompilerConfiguration
+import groowt.view.component.compiler.SimpleComponentTemplateClassFactory
+import groowt.view.component.compiler.source.ComponentTemplateSource
import groowt.view.component.web.DefaultWebViewComponentContext
+import groowt.view.component.web.DefaultWebViewComponentScope
+import groowt.view.component.web.compiler.DefaultWebViewComponentTemplateCompileUnit
import io.github.classgraph.ClassGraph
import org.slf4j.Logger
import org.slf4j.LoggerFactory
@@ -142,7 +147,10 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
pageSpec.name(),
pageSpec.path(),
pageSpec.fileExtension(),
- (Class extends PageView>) pageViewInfo.loadClass()
+ (Class extends PageView>) pageViewInfo.loadClass(),
+ !pageSpec.templateResource().empty
+ ? pageSpec.templateResource()
+ : pageViewInfo.simpleName + 'Template.wvc'
)
}
}
@@ -172,6 +180,9 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
}
def diagnostics = [] as Collection
+ def wvcCompilerConfiguration = new DefaultComponentTemplateCompilerConfiguration()
+ wvcCompilerConfiguration.groovyClassLoader = this.groovyClassLoader
+ def componentTemplateClassFactory = new SimpleComponentTemplateClassFactory(this.groovyClassLoader)
pages.each {
// instantiate PageView
@@ -191,7 +202,33 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
pageView.pageTitle = it.name
pageView.url = buildSpec.baseUrl.get() + it.path
if (pageView instanceof WvcPageView) {
- pageView.context = new DefaultWebViewComponentContext()
+ pageView.context = new DefaultWebViewComponentContext().tap {
+ configureRootScope {
+ // TODO: scan components in same package, add them to the scope with factories which
+ // use the object factory to construct the component
+ }
+ }
+
+ if (pageView.componentTemplate == null) {
+ def templateUrl = pageView.class.getResource(it.templateResource)
+ if (templateUrl == null) {
+ diagnostics.add(new Diagnostic(
+ "Could not find templateResource: $it.templateResource"
+ ))
+ return
+ }
+ def source = ComponentTemplateSource.of(templateUrl)
+ def compileUnit = new DefaultWebViewComponentTemplateCompileUnit(
+ source.descriptiveName,
+ pageView.class,
+ source,
+ pageView.class.packageName
+ )
+ def compileResult = compileUnit.compile(wvcCompilerConfiguration)
+ def templateClass = componentTemplateClassFactory.getTemplateClass(compileResult)
+ def componentTemplate = templateClass.getConstructor().newInstance()
+ pageView.componentTemplate = componentTemplate
+ }
}
// Render the page
diff --git a/api/src/main/groovy/com/jessebrault/ssg/page/DefaultPage.groovy b/api/src/main/groovy/com/jessebrault/ssg/page/DefaultPage.groovy
index 6f26827..a3e2e33 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/page/DefaultPage.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/page/DefaultPage.groovy
@@ -14,10 +14,11 @@ class DefaultPage implements Page {
final String path
final String fileExtension
final Class extends PageView> viewType
+ final String templateResource
@Override
String toString() {
- "SimplePage(name: $name, path: $path, fileExtension: $fileExtension)"
+ "SimplePage(name: $name, path: $path, fileExtension: $fileExtension, templateResource: $templateResource)"
}
}
diff --git a/api/src/main/groovy/com/jessebrault/ssg/page/Page.groovy b/api/src/main/groovy/com/jessebrault/ssg/page/Page.groovy
index 9488e38..c37a886 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/page/Page.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/page/Page.groovy
@@ -7,4 +7,5 @@ interface Page {
String getPath()
String getFileExtension()
Class extends PageView> getViewType()
+ String getTemplateResource()
}
diff --git a/api/src/main/groovy/com/jessebrault/ssg/page/PageSpec.groovy b/api/src/main/groovy/com/jessebrault/ssg/page/PageSpec.groovy
index a54c605..9434c21 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/page/PageSpec.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/page/PageSpec.groovy
@@ -10,5 +10,6 @@ import java.lang.annotation.Target
@interface PageSpec {
String name()
String path()
+ String templateResource() default ''
String fileExtension() default '.html'
}
diff --git a/api/src/main/groovy/com/jessebrault/ssg/view/WvcPageView.groovy b/api/src/main/groovy/com/jessebrault/ssg/view/WvcPageView.groovy
index 460e64c..34bbc49 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/view/WvcPageView.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/view/WvcPageView.groovy
@@ -13,6 +13,8 @@ abstract class WvcPageView extends BaseWebViewComponent implements PageView, Wit
String pageTitle
String url
+ WvcPageView() {}
+
WvcPageView(ComponentTemplate template) {
super(template)
}
diff --git a/test-ssg-project/components/groovy/com/jessebrault/site/Head.groovy b/test-ssg-project/components/groovy/com/jessebrault/site/Head.groovy
new file mode 100644
index 0000000..dacb619
--- /dev/null
+++ b/test-ssg-project/components/groovy/com/jessebrault/site/Head.groovy
@@ -0,0 +1,14 @@
+package com.jessebrault.site
+
+import groowt.view.component.web.BaseWebViewComponent
+
+class Head extends BaseWebViewComponent {
+
+ final String title
+
+ Head(Map attr) {
+ super(Head.getResource('HeadTemplate.wvc'))
+ this.title = attr.title()
+ }
+
+}
diff --git a/test-ssg-project/components/resources/com/jessebrault/site/HeadTemplate.wvc b/test-ssg-project/components/resources/com/jessebrault/site/HeadTemplate.wvc
new file mode 100644
index 0000000..f97e2d2
--- /dev/null
+++ b/test-ssg-project/components/resources/com/jessebrault/site/HeadTemplate.wvc
@@ -0,0 +1,6 @@
+---
+package com.jessebrault.site
+---
+
+ $title
+
diff --git a/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy b/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy
index dc606d6..1c5cb10 100644
--- a/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy
+++ b/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy
@@ -4,6 +4,7 @@ import com.jessebrault.ssg.di.InjectText
import com.jessebrault.ssg.page.PageSpec
import com.jessebrault.ssg.text.Text
import com.jessebrault.ssg.view.WvcPageView
+import groowt.view.component.web.WebViewComponentScope
import jakarta.inject.Inject
@PageSpec(name = 'Biography', path = '/biography')
@@ -15,8 +16,14 @@ class Biography extends WvcPageView {
@Inject
Biography(@InjectText('/Biography.md') Text biographyText) {
- super(Biography.getResource('BiographyTemplate.wvc'))
this.biographyText = biographyText
}
+ @Override
+ protected void beforeRender() {
+ context.configureRootScope(WebViewComponentScope) {
+ addWithAttr(Head)
+ }
+ }
+
}
diff --git a/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc b/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc
index b904c90..8be6719 100644
--- a/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc
+++ b/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc
@@ -2,9 +2,7 @@
package com.jessebrault.site
---
-
- $pageTitle
-
+
$pageTitle
$url