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) pageViewInfo.loadClass() + (Class) 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 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 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