summaryrefslogtreecommitdiffstats
path: root/hugofs
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-09-14 11:58:45 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-09-14 19:09:20 +0200
commit74daca6b3050d96cd3a08b13f45de24edb450163 (patch)
treed740f7e7174c4685dae8cb262a790300b005be76 /hugofs
parent1fd4c562afd467f246c632e9f3fed0a1f350d8dc (diff)
Support PostProcess for all file types
Not just HTML. Fixes #10269
Diffstat (limited to 'hugofs')
-rw-r--r--hugofs/hasbytes_fs.go90
1 files changed, 90 insertions, 0 deletions
diff --git a/hugofs/hasbytes_fs.go b/hugofs/hasbytes_fs.go
new file mode 100644
index 000000000..b5f82877e
--- /dev/null
+++ b/hugofs/hasbytes_fs.go
@@ -0,0 +1,90 @@
+// Copyright 2022 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package hugofs
+
+import (
+ "os"
+
+ "github.com/gohugoio/hugo/common/hugio"
+ "github.com/spf13/afero"
+)
+
+var (
+ _ afero.Fs = (*hasBytesFs)(nil)
+ _ FilesystemUnwrapper = (*hasBytesFs)(nil)
+)
+
+type hasBytesFs struct {
+ afero.Fs
+ hasBytesCallback func(name string, match bool)
+ pattern []byte
+}
+
+func NewHasBytesReceiver(delegate afero.Fs, hasBytesCallback func(name string, match bool), pattern []byte) afero.Fs {
+ return &hasBytesFs{Fs: delegate, hasBytesCallback: hasBytesCallback, pattern: pattern}
+}
+
+func (fs *hasBytesFs) UnwrapFilesystem() afero.Fs {
+ return fs.Fs
+}
+
+func (fs *hasBytesFs) Create(name string) (afero.File, error) {
+ f, err := fs.Fs.Create(name)
+ if err == nil {
+ f = fs.wrapFile(f)
+ }
+ return f, err
+}
+
+func (fs *hasBytesFs) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) {
+ f, err := fs.Fs.OpenFile(name, flag, perm)
+ if err == nil && isWrite(flag) {
+ f = fs.wrapFile(f)
+ }
+ return f, err
+}
+
+func (fs *hasBytesFs) wrapFile(f afero.File) afero.File {
+ return &hasBytesFile{
+ File: f,
+ hbw: &hugio.HasBytesWriter{
+ Pattern: fs.pattern,
+ },
+ hasBytesCallback: fs.hasBytesCallback,
+ }
+
+}
+
+func (fs *hasBytesFs) Name() string {
+ return "hasBytesFs"
+}
+
+type hasBytesFile struct {
+ hasBytesCallback func(name string, match bool)
+ hbw *hugio.HasBytesWriter
+ afero.File
+}
+
+func (h *hasBytesFile) Write(p []byte) (n int, err error) {
+ n, err = h.File.Write(p)
+ if err != nil {
+ return
+ }
+ return h.hbw.Write(p)
+}
+
+func (h *hasBytesFile) Close() error {
+ h.hasBytesCallback(h.Name(), h.hbw.Match)
+ return h.File.Close()
+}