aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2022-03-04 23:08:26 +0700
committerShulhan <ms@kilabit.info>2022-03-04 23:10:00 +0700
commit09ab0af3e9f48c173fb32a7a148c6b11fc4782f4 (patch)
tree24e2966584209bf15587c69964ae550fc745971b
parent753642c8297e2a7ba419fef02588d36a99207101 (diff)
downloadciigo-09ab0af3e9f48c173fb32a7a148c6b11fc4782f4.tar.xz
all: re-convert markup files if HTML template is newer on GoEmbed
Calling GoEmbed with updated HTML template will reconvert all markup files automatically, as long as the generated Go file is older than the HTML template file.
-rw-r--r--ciigo.go59
-rw-r--r--cmd/ciigo-example/static.go35
2 files changed, 88 insertions, 6 deletions
diff --git a/ciigo.go b/ciigo.go
index d307649..a6029cb 100644
--- a/ciigo.go
+++ b/ciigo.go
@@ -12,6 +12,8 @@ package ciigo
import (
"fmt"
+ "io/fs"
+ "log"
"os"
"path/filepath"
"regexp"
@@ -45,7 +47,8 @@ var (
//
func Convert(opts *ConvertOptions) (err error) {
var (
- logp = "Convert"
+ logp = "Convert"
+
htmlg *htmlGenerator
fileMarkups map[string]*fileMarkup
)
@@ -87,10 +90,12 @@ func Convert(opts *ConvertOptions) (err error) {
//
func GoEmbed(opts *EmbedOptions) (err error) {
var (
- logp = "GoEmbed"
- htmlg *htmlGenerator
- fileMarkups map[string]*fileMarkup
- mfs *memfs.MemFS
+ logp = "GoEmbed"
+
+ htmlg *htmlGenerator
+ fileMarkups map[string]*fileMarkup
+ mfs *memfs.MemFS
+ convertForce bool
)
if opts == nil {
@@ -111,7 +116,11 @@ func GoEmbed(opts *EmbedOptions) (err error) {
return fmt.Errorf("%s: %w", logp, err)
}
- htmlg.convertFileMarkups(fileMarkups, false)
+ if isHtmlTemplateNewer(opts) {
+ convertForce = true
+ }
+
+ htmlg.convertFileMarkups(fileMarkups, convertForce)
memfsOpts := &memfs.Options{
Root: opts.Root,
@@ -211,6 +220,44 @@ func Watch(opts *ConvertOptions) (err error) {
return nil
}
+//
+// isHtmlTemplateNewer will return true if HtmlTemplate is not defined or
+// newer than embedded GoFileName.
+//
+func isHtmlTemplateNewer(opts *EmbedOptions) bool {
+ var (
+ logp = "isHtmlTemplateNewer"
+
+ fiHtmlTmpl fs.FileInfo
+ fiGoEmbed fs.FileInfo
+ err error
+ )
+
+ if len(opts.HtmlTemplate) == 0 {
+ return true
+ }
+
+ fiHtmlTmpl, err = os.Stat(opts.HtmlTemplate)
+ if err != nil {
+ log.Fatalf("%s: %s", logp, err)
+ }
+
+ if len(opts.EmbedOptions.GoFileName) == 0 {
+ // No output file for GoEmbed.
+ return false
+ }
+
+ fiGoEmbed, err = os.Stat(opts.EmbedOptions.GoFileName)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return false
+ }
+ log.Fatalf("%s: %s", logp, err)
+ }
+
+ return fiHtmlTmpl.ModTime().After(fiGoEmbed.ModTime())
+}
+
func isExtensionMarkup(ext string) bool {
return ext == extAsciidoc
}
diff --git a/cmd/ciigo-example/static.go b/cmd/ciigo-example/static.go
index 9941480..b63a4cd 100644
--- a/cmd/ciigo-example/static.go
+++ b/cmd/ciigo-example/static.go
@@ -26,6 +26,7 @@ func generate__example() *memfs.Node {
node.AddChild(_ciigoFS_getNode(ciigoFS, "/index.css", generate__example_index_css))
node.AddChild(_ciigoFS_getNode(ciigoFS, "/index.html", generate__example_index_html))
node.AddChild(_ciigoFS_getNode(ciigoFS, "/sub", generate__example_sub))
+ node.AddChild(_ciigoFS_getNode(ciigoFS, "_internal", generate__internal))
return node
}
@@ -149,6 +150,36 @@ func generate__example_sub_index_html() *memfs.Node {
return node
}
+func generate__internal() *memfs.Node {
+ node := &memfs.Node{
+ SysPath: "_internal",
+ Path: "_internal",
+ ContentType: "",
+ GenFuncName: "generate__internal",
+ }
+ node.SetMode(2147483648)
+ node.SetModTimeUnix(-62135596800, 0)
+ node.SetName("_internal")
+ node.SetSize(0)
+ node.AddChild(_ciigoFS_getNode(ciigoFS, "_internal/.template", generate__internal__template))
+ return node
+}
+
+func generate__internal__template() *memfs.Node {
+ node := &memfs.Node{
+ SysPath: "_example/html.tmpl",
+ Path: "_internal/.template",
+ ContentType: "text/plain; charset=utf-8",
+ GenFuncName: "generate__internal__template",
+ Content: []byte("\x3C\x21\x2D\x2D\x0A\x2F\x2F\x20\x53\x50\x44\x58\x2D\x46\x69\x6C\x65\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x54\x65\x78\x74\x3A\x20\x32\x30\x32\x30\x20\x53\x68\x75\x6C\x68\x61\x6E\x20\x3C\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x3E\x0A\x2F\x2F\x20\x53\x50\x44\x58\x2D\x4C\x69\x63\x65\x6E\x73\x65\x2D\x49\x64\x65\x6E\x74\x69\x66\x69\x65\x72\x3A\x20\x47\x50\x4C\x2D\x33\x2E\x30\x2D\x6F\x72\x2D\x6C\x61\x74\x65\x72\x0A\x2D\x2D\x21\x3E\x0A\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x68\x74\x6D\x6C\x3E\x0A\x09\x3C\x68\x65\x61\x64\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x75\x74\x66\x2D\x38\x22\x20\x2F\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x22\x20\x2F\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x74\x68\x65\x6D\x65\x2D\x63\x6F\x6C\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x23\x33\x37\x35\x45\x41\x42\x22\x20\x2F\x3E\x0A\x0A\x09\x09\x3C\x74\x69\x74\x6C\x65\x3E\x7B\x7B\x2E\x54\x69\x74\x6C\x65\x7D\x7D\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x09\x09\x3C\x6C\x69\x6E\x6B\x20\x72\x65\x6C\x3D\x22\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x22\x20\x68\x72\x65\x66\x3D\x22\x2F\x69\x6E\x64\x65\x78\x2E\x63\x73\x73\x22\x20\x2F\x3E\x0A\x09\x09\x7B\x7B\x2D\x20\x72\x61\x6E\x67\x65\x20\x2E\x53\x74\x79\x6C\x65\x73\x7D\x7D\x0A\x09\x09\x3C\x6C\x69\x6E\x6B\x20\x72\x65\x6C\x3D\x22\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x22\x20\x68\x72\x65\x66\x3D\x22\x7B\x7B\x2E\x7D\x7D\x22\x20\x2F\x3E\x0A\x09\x09\x7B\x7B\x2D\x20\x65\x6E\x64\x7D\x7D\x0A\x09\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x09\x3C\x62\x6F\x64\x79\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x22\x3E\x63\x69\x69\x67\x6F\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6D\x65\x6E\x75\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x66\x6F\x72\x6D\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x74\x65\x6D\x22\x20\x61\x63\x74\x69\x6F\x6E\x3D\x22\x2F\x5F\x69\x6E\x74\x65\x72\x6E\x61\x6C\x2F\x73\x65\x61\x72\x63\x68\x22\x3E\x0A\x09\x09\x09\x09\x09\x09\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x20\x6E\x61\x6D\x65\x3D\x22\x71\x22\x20\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x3D\x22\x53\x65\x61\x72\x63\x68\x22\x20\x2F\x3E\x0A\x09\x09\x09\x09\x09\x3C\x2F\x66\x6F\x72\x6D\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6D\x65\x6E\x75\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x73\x75\x62\x22\x3E\x53\x75\x62\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x67\x65\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x09\x09\x09\x09\x7B\x7B\x2E\x42\x6F\x64\x79\x7D\x7D\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x21\x2D\x2D\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x2D\x2D\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x21\x2D\x2D\x20\x2E\x70\x61\x67\x65\x20\x2D\x2D\x3E\x0A\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x09\x09\x09\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x20\x3C\x61\x0A\x09\x09\x09\x09\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x63\x69\x69\x67\x6F\x22\x0A\x09\x09\x09\x3E\x0A\x09\x09\x09\x09\x63\x69\x69\x67\x6F\x0A\x09\x09\x09\x3C\x2F\x61\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"),
+ }
+ node.SetMode(420)
+ node.SetModTimeUnix(1646153539, 855679767)
+ node.SetName(".template")
+ node.SetSize(1112)
+ return node
+}
+
//
// _ciigoFS_getNode is internal function to minimize duplicate node
// created on Node.AddChild() and on generatedPathNode.Set().
@@ -202,6 +233,10 @@ func init() {
_ciigoFS_getNode(ciigoFS, "/sub", generate__example_sub))
ciigoFS.PathNodes.Set("/sub/index.html",
_ciigoFS_getNode(ciigoFS, "/sub/index.html", generate__example_sub_index_html))
+ ciigoFS.PathNodes.Set("_internal",
+ _ciigoFS_getNode(ciigoFS, "_internal", generate__internal))
+ ciigoFS.PathNodes.Set("_internal/.template",
+ _ciigoFS_getNode(ciigoFS, "_internal/.template", generate__internal__template))
ciigoFS.Root = ciigoFS.PathNodes.Get("/")
}