Serving static HTML content with CommandBox multi-server
Robert explains configuring CommandBox multi-server to serve HTML files
cfmlGenerate sitemap.xml and feed.rss with Jasper 0.18.0
My schedule has been full lately leaving little time for fun side projects, but one thing I really wanted to get working in Jasper was the ability to generate templates from CFML. Eleventy allows you to set the output file using the permalink attribute in the front matter and generate a template dynamically using liquid script. I would like Jasper to function in much the same way, but using CFML to generate the page.
As a quick example, here is a template that will generate sitemap.xml for a Jasper blog.
<!---
layout: none
permalink: /sitemap.xml
excludeFromCollections: true
--->
<cfscript>
function getPages(collections){
var ret = collections.all.filter((item) => {
return item.excludeFromCollections == false && (item.type == "page" || item.type == "post");
});
ret.sort( ( e1, e2 ) => {
return compare( e1.permalink, e2.permalink );
} );
return ret;
}
lastMod = dateFormat(now(), "yyyy-mm-dd");
savecontent variable="xml" {
writeOutput('<?xml version="1.0" encoding="UTF-8"?>#chr(10)#');
writeoutput('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">#chr(10)#');
for(var p in getPages(collections)){
writeoutput('
<url>
<loc>#prc.site.url##p.permalink#</loc>
<lastmod>#lastMod#</lastmod>
</url>
');
}
writeoutput('</urlset>#chr(10)#');
}
</cfscript>
<cfoutput>#xml#</cfoutput>
The layout in the front matter is set to none so no layout will be rendered. The template content will be to the path specified by the permalink attribute.
The example blog also has an example feed.rss file, but it still a work in progress.
Jasper 0.18.0 has two major sources of data used to render templates.
First, the prc scope contains all front matter attributes and metadata required to render the page as well as data about the page.
var prc = {
"rootDir" : rootDir,
"directory" : template.directory,
"fileSlug" : template.name.listFirst( "." ),
"inFile" : template.directory & "/" & template.name,
"outFile" : "",
"headers" : [],
"meta" : {
"title" : "",
"description" : "",
"author" : "",
"url" : ""
},
// core properties
"title" : "",
"description" : "",
"image" : "",
"published" : false,
"publishDate" : "",
// other
"content" : "",
"type" : "page",
"layout" : "main",
"permalink" : true,
"fileExt" : "html",
"excludeFromCollections" : false
};
Next is the collections scope which details all the known templates. Inside collections, collections.all is an array of all templates detected by jasper, templates are also broken out by type ("page" or "post") as well as templates broken out by tag ("coldfusion", "coldbox", "lucee", etc.). The tags array in collections lists all tags, collections.byTag contains all posts with a given tag.
I would encourage you to take a look at debug.cfm in the example blog. This can be installed using the jasper commandbox module box install commandbox-jasper, then box jasper build, finally box server start to run the development server.
Jasper 0.18.0 will now add opengraph and twitter metadata when the template type is "post". When the template is rendered the appropriate headers will be set for you. Metadata for other page types will be added in a later release.
I still have quite a bit of code to clean up, but the next major feature I would like to work on is pagination. Look out for more updates!
Photo by Mark Tegethoff on Unsplash
Comments
Sign in with Google to leave a comment.
By signing in you agree to the Terms of Service and Privacy Policy.
No comments yet — be the first.