feat: Implement syntactic sugar and site-specific discovery config

- Add syntactic sugar for container transformation: .insertr containers → children get .insertr
- Fix discovery auto-running when disabled with site-specific config loading
- Add comprehensive styling test examples for HTML attribute preservation
- Include test input for syntactic sugar validation
- Update discovery defaults to respect developer intent (disabled by default)
This commit is contained in:
2025-09-19 15:57:28 +02:00
parent 2a0915dda0
commit 00c2ba34e6
9 changed files with 959 additions and 31 deletions

View File

@@ -90,6 +90,7 @@ type FileDiscoveryResult struct {
ElementsEnhanced int
ContainersAdded int
IndividualsAdded int
SugarTransformed int // Count of syntactic sugar transformations
Document *html.Node
}
@@ -124,7 +125,30 @@ func (disc *Discoverer) discoverNode(node *html.Node, result *FileDiscoveryResul
return
}
// Skip if already has insertr class
// Handle syntactic sugar: containers with .insertr class
if disc.hasInsertrClass(node) && disc.isGoodContainer(node) {
// Syntactic sugar transformation: remove .insertr from container, add to viable children
viableChildren := engine.FindViableChildren(node)
if len(viableChildren) >= 1 {
disc.removeInsertrClass(node) // Remove from container
for _, child := range viableChildren {
if !disc.hasInsertrClass(child) {
disc.addInsertrClass(child)
result.IndividualsAdded++
result.ElementsEnhanced++
}
}
result.ContainersAdded++
result.SugarTransformed++ // Track sugar transformations
// Don't process children since we just processed them
return
}
// If no viable children, leave .insertr on the element (individual editing)
return
}
// Skip if already has insertr class (individual editing elements)
if disc.hasInsertrClass(node) {
return
}
@@ -258,6 +282,18 @@ func (disc *Discoverer) addInsertrClass(node *html.Node) {
disc.setClasses(node, classes)
}
// removeInsertrClass removes the insertr class from a node
func (disc *Discoverer) removeInsertrClass(node *html.Node) {
classes := disc.getClasses(node)
var filteredClasses []string
for _, class := range classes {
if class != "insertr" {
filteredClasses = append(filteredClasses, class)
}
}
disc.setClasses(node, filteredClasses)
}
// getClasses extracts CSS classes from a node
func (disc *Discoverer) getClasses(node *html.Node) []string {
for i, attr := range node.Attr {