From 3560b1f75010ed309808d799761aa1a4cc4d8851 Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Mon, 20 May 2024 13:48:42 +0200
Subject: [PATCH] fix: exclude works with bash completion

---
 examples/example3/source/page1.html         | 21 ++++++
 examples/example3/source/page2.html         | 17 +++++
 examples/example3/source/parts/exclude.html | 16 +++++
 examples/example3/sync.yaml                 |  9 +++
 source/html/sync.go                         | 78 ++++++++++++---------
 5 files changed, 107 insertions(+), 34 deletions(-)
 create mode 100644 examples/example3/source/page1.html
 create mode 100644 examples/example3/source/page2.html
 create mode 100644 examples/example3/source/parts/exclude.html
 create mode 100644 examples/example3/sync.yaml

diff --git a/examples/example3/source/page1.html b/examples/example3/source/page1.html
new file mode 100644
index 0000000..c2ce39f
--- /dev/null
+++ b/examples/example3/source/page1.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="color-scheme" content="dark light">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Page 1</title>
+    <style>
+        *:not(:defined) {
+            visibility: hidden;
+        }
+    </style>
+</head>
+<body>
+    <h1>Page 1</h1>
+
+
+<footer>
+    <p>Footer</p>
+</footer>
+</body>
\ No newline at end of file
diff --git a/examples/example3/source/page2.html b/examples/example3/source/page2.html
new file mode 100644
index 0000000..a1c106b
--- /dev/null
+++ b/examples/example3/source/page2.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html><html lang="en"><head>
+    <meta charset="UTF-8"/>
+    <meta name="color-scheme" content="dark light"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <title>Page 2</title>
+    <style>
+        *:not(:defined) {
+            visibility: hidden;
+        }
+    </style>
+</head>
+<body>
+<h1>Page 2</h1>
+<footer>
+    <p>Footer</p>
+</footer>
+</body></html>
\ No newline at end of file
diff --git a/examples/example3/source/parts/exclude.html b/examples/example3/source/parts/exclude.html
new file mode 100644
index 0000000..df25c90
--- /dev/null
+++ b/examples/example3/source/parts/exclude.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="color-scheme" content="dark light">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Exclude this</title>
+    <style>
+        *:not(:defined) {
+            visibility: hidden;
+        }
+    </style>
+</head>
+<body>
+<h1>Exclude This</h1>
+</body>
\ No newline at end of file
diff --git a/examples/example3/sync.yaml b/examples/example3/sync.yaml
new file mode 100644
index 0000000..cd25680
--- /dev/null
+++ b/examples/example3/sync.yaml
@@ -0,0 +1,9 @@
+sync:
+  - source:
+      path: "source/page1.html"
+      selector: "footer"
+    destination:
+      path: "source/"
+      exclude:
+        - "source/page1.html"
+        - "source/parts/*"
diff --git a/source/html/sync.go b/source/html/sync.go
index 93c76ce..f65c0d0 100644
--- a/source/html/sync.go
+++ b/source/html/sync.go
@@ -91,31 +91,28 @@ func SyncHtml(p string) error {
 						return nil
 					}
 
-					if exclude != nil {
-						for _, e := range exclude {
-							e, err := filepath.Abs(e)
-							if err != nil {
-								return err
-							}
-							if e == pp {
-								return nil
-							}
-						}
-					}
-
 					ext := filepath.Ext(pp)
-					if ext == ".html" {
+					if ext != ".html" {
+						return nil
+					}
 
-						var dd *html.Node
-						if dd, err = readHTML(pp); err != nil {
-							return err
-						}
+					excludeFlag, err2 := checkExcludes(exclude, pp)
+					if err2 != nil {
+						return err2
+					}
 
-						destinationFiles[pp] = dd
-						destinationFile[absSource] = append(destinationFile[absSource], pp)
+					if excludeFlag {
+						return nil
+					}
 
+					var dd *html.Node
+					if dd, err = readHTML(pp); err != nil {
+						return err
 					}
 
+					destinationFiles[pp] = dd
+					destinationFile[absSource] = append(destinationFile[absSource], pp)
+
 					return nil
 				}); err != nil {
 					return err
@@ -123,22 +120,13 @@ func SyncHtml(p string) error {
 			} else if filepath.Ext(d) == ".html" {
 
 				if exclude != nil {
-					for _, e := range exclude {
-						e, err := filepath.Abs(e)
-						if err != nil {
-							return err
-						}
-
-						if e == d {
-							return nil
-						}
-
-						if r, err := filepath.Match(e, d); err != nil {
-							return err
-						} else if r {
-							return nil
-						}
+					excludeFlag, err2 := checkExcludes(exclude, d)
+					if err2 != nil {
+						return err2
+					}
 
+					if excludeFlag {
+						continue
 					}
 				}
 
@@ -259,3 +247,25 @@ func SyncHtml(p string) error {
 
 	return nil
 }
+
+func checkExcludes(exclude []string, d string) (bool, error) {
+	for _, e := range exclude {
+		e, err := filepath.Abs(e)
+		if err != nil {
+			return false, err
+		}
+
+		if e == d {
+			return true, nil
+		}
+
+		if r, err := filepath.Match(e, d); err != nil {
+			return false, err
+		} else if r {
+			return true, nil
+		}
+
+	}
+
+	return false, nil
+}
-- 
GitLab