mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-12-16 08:18:59 +00:00
HTMLCollection: add match by links
This commit is contained in:
@@ -15,6 +15,7 @@ const Matcher = union(enum) {
|
|||||||
matchByName: MatchByName,
|
matchByName: MatchByName,
|
||||||
matchByTagName: MatchByTagName,
|
matchByTagName: MatchByTagName,
|
||||||
matchByClassName: MatchByClassName,
|
matchByClassName: MatchByClassName,
|
||||||
|
matchByLinks: MatchByLinks,
|
||||||
matchTrue: struct {},
|
matchTrue: struct {},
|
||||||
|
|
||||||
pub fn match(self: Matcher, node: *parser.Node) !bool {
|
pub fn match(self: Matcher, node: *parser.Node) !bool {
|
||||||
@@ -23,6 +24,7 @@ const Matcher = union(enum) {
|
|||||||
inline .matchByTagName => |case| return case.match(node),
|
inline .matchByTagName => |case| return case.match(node),
|
||||||
inline .matchByClassName => |case| return case.match(node),
|
inline .matchByClassName => |case| return case.match(node),
|
||||||
inline .matchByName => |case| return case.match(node),
|
inline .matchByName => |case| return case.match(node),
|
||||||
|
inline .matchByLinks => return MatchByLinks.match(node),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,6 +34,7 @@ const Matcher = union(enum) {
|
|||||||
inline .matchByTagName => |case| return case.deinit(alloc),
|
inline .matchByTagName => |case| return case.deinit(alloc),
|
||||||
inline .matchByClassName => |case| return case.deinit(alloc),
|
inline .matchByClassName => |case| return case.deinit(alloc),
|
||||||
inline .matchByName => |case| return case.deinit(alloc),
|
inline .matchByName => |case| return case.deinit(alloc),
|
||||||
|
inline .matchByLinks => return,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -170,6 +173,34 @@ pub fn HTMLCollectionChildren(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MatchByLinks matches the a and area elements in the Document that have href
|
||||||
|
// attributes.
|
||||||
|
// https://html.spec.whatwg.org/#dom-document-links
|
||||||
|
pub const MatchByLinks = struct {
|
||||||
|
pub fn match(node: *parser.Node) !bool {
|
||||||
|
const tag = try parser.nodeName(node);
|
||||||
|
if (!std.ascii.eqlIgnoreCase(tag, "a") and !std.ascii.eqlIgnoreCase(tag, "area")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const elem = @as(*parser.Element, @ptrCast(node));
|
||||||
|
return parser.elementHasAttribute(elem, "href");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn HTMLCollectionByLinks(
|
||||||
|
root: ?*parser.Node,
|
||||||
|
include_root: bool,
|
||||||
|
) !HTMLCollection {
|
||||||
|
return HTMLCollection{
|
||||||
|
.root = root,
|
||||||
|
.walker = Walker{ .walkerDepthFirst = .{} },
|
||||||
|
.matcher = Matcher{
|
||||||
|
.matchByLinks = MatchByLinks{},
|
||||||
|
},
|
||||||
|
.include_root = include_root,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const Walker = union(enum) {
|
const Walker = union(enum) {
|
||||||
walkerDepthFirst: WalkerDepthFirst,
|
walkerDepthFirst: WalkerDepthFirst,
|
||||||
walkerChildren: WalkerChildren,
|
walkerChildren: WalkerChildren,
|
||||||
|
|||||||
Reference in New Issue
Block a user