From bad30877282ff2e584c49ea1a656bf0fa0f3b1fa Mon Sep 17 00:00:00 2001 From: Shulhan Date: Mon, 6 Nov 2023 21:33:45 +0700 Subject: all: use modification time when deciding when to convert to HTML Previously, in changes 46bd8b68dc8c we pass the force=true to Convert function. In this changes, we derive the decision based on modification time of HTML template and markup file. If the HTML template or markup file is newer that HTML file then the new HTML file will be generated. --- ciigo.go | 2 +- converter.go | 51 +++++++++++++++++++++++++++++++++++++++++---------- file_markup.go | 12 ------------ 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/ciigo.go b/ciigo.go index 033f74f..d9b467e 100644 --- a/ciigo.go +++ b/ciigo.go @@ -66,7 +66,7 @@ func Convert(opts *ConvertOptions) (err error) { return fmt.Errorf(`%s: %w`, logp, err) } - converter.convertFileMarkups(fileMarkups, true) + converter.convertFileMarkups(fileMarkups, false) return nil } diff --git a/converter.go b/converter.go index 316bfc5..2350b5d 100644 --- a/converter.go +++ b/converter.go @@ -9,6 +9,7 @@ import ( "log" "os" "path/filepath" + "time" "git.sr.ht/~shulhan/asciidoctor-go" "github.com/yuin/goldmark" @@ -18,8 +19,12 @@ import ( // Converter a single, reusable AsciiDoc converter. type Converter struct { - tmpl *template.Template - tmplSearch *template.Template + tmpl *template.Template + tmplSearch *template.Template + + // htmlTemplateModtime modification time for HtmlTemplate. + htmlTemplateModtime time.Time + htmlTemplate string // Path to HTML template in storage. } @@ -30,7 +35,6 @@ func NewConverter(htmlTemplate string) (converter *Converter, err error) { logp = `NewConverter` tmplContent string - bhtml []byte ) converter = &Converter{} @@ -42,12 +46,23 @@ func NewConverter(htmlTemplate string) (converter *Converter, err error) { } else { converter.htmlTemplate = filepath.Clean(htmlTemplate) + var fi os.FileInfo + + fi, err = os.Stat(converter.htmlTemplate) + if err != nil { + return nil, fmt.Errorf(`%s: %w`, logp, err) + } + + converter.htmlTemplateModtime = fi.ModTime() + + var bhtml []byte + bhtml, err = os.ReadFile(converter.htmlTemplate) if err != nil { - tmplContent = templateIndexHTML - } else { - tmplContent = string(bhtml) + return nil, fmt.Errorf(`%s: %w`, logp, err) } + + tmplContent = string(bhtml) } converter.tmpl, err = converter.tmpl.Parse(tmplContent) @@ -69,13 +84,29 @@ func (converter *Converter) convertFileMarkups(fileMarkups map[string]*FileMarku var ( logp = `convertFileMarkups` - fmarkup *FileMarkup - err error + fmarkup *FileMarkup + htmlInfo os.FileInfo + htmlModtime time.Time + err error + skip bool ) for _, fmarkup = range fileMarkups { - if !fmarkup.isNewerThanHtml() { - if !isForce { + skip = true + if !isForce { + htmlInfo, _ = os.Stat(fmarkup.pathHtml) + if htmlInfo == nil { + // HTML file may not exist. + skip = false + } else { + htmlModtime = htmlInfo.ModTime() + if converter.htmlTemplateModtime.After(htmlModtime) { + skip = false + } else if fmarkup.info.ModTime().After(htmlModtime) { + skip = false + } + } + if skip { continue } } diff --git a/file_markup.go b/file_markup.go index 131b8f7..bca9be2 100644 --- a/file_markup.go +++ b/file_markup.go @@ -60,18 +60,6 @@ func NewFileMarkup(filePath string, fi os.FileInfo) (fmarkup *FileMarkup, err er return fmarkup, nil } -// isNewerThanHtml return true if the markup file is newer than HTML file. -func (fm *FileMarkup) isNewerThanHtml() bool { - var ( - fi os.FileInfo - ) - fi, _ = os.Stat(fm.pathHtml) - if fi == nil { - return true - } - return fm.info.ModTime().After(fi.ModTime()) -} - func markupKind(ext string) int { switch ext { case extAsciidoc: -- cgit v1.3