wip: select elements from html document and css selector
							parent
							
								
									4bab98ef0d
								
							
						
					
					
						commit
						e86a396b8b
					
				
							
								
								
									
										95
									
								
								main.lua
								
								
								
								
							
							
						
						
									
										95
									
								
								main.lua
								
								
								
								
							| 
						 | 
					@ -1,9 +1,10 @@
 | 
				
			||||||
#!/bin/env lua
 | 
					#!/bin/env lua
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local html = require(".html")
 | 
					local html = require(".html")
 | 
				
			||||||
 | 
					local css = require(".css")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local file = io.open("test.html", "r")
 | 
					local file = io.open("small.html", "r")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if file == nil then
 | 
					if file == nil then
 | 
				
			||||||
	error("File doesn't exist")
 | 
						error("File doesn't exist")
 | 
				
			||||||
| 
						 | 
					@ -11,4 +12,94 @@ end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local content = file:read("a")
 | 
					local content = file:read("a")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
html.print_document( html.parse( content ) )
 | 
					local doc = html.parse( content )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print("Write a css selector:")
 | 
				
			||||||
 | 
					local whole_selector = css.parse( io.read() )
 | 
				
			||||||
 | 
					local current_selector = whole_selector
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local elements = {}
 | 
				
			||||||
 | 
					-- start with all elements matching the first selector
 | 
				
			||||||
 | 
					doc:foreach(function( el )
 | 
				
			||||||
 | 
						if el:check_simple_selector( current_selector.selector ) then
 | 
				
			||||||
 | 
							table.insert( elements, el )
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while current_selector.combinator ~= nil do
 | 
				
			||||||
 | 
						local next_selector = current_selector.next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local new_elements = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if current_selector.combinator == css.COMBINATORS.DESCENDANT then
 | 
				
			||||||
 | 
							for _, element in ipairs( elements ) do
 | 
				
			||||||
 | 
								element:foreach(function( el )
 | 
				
			||||||
 | 
									if el:check_simple_selector( next_selector.selector ) then
 | 
				
			||||||
 | 
										table.insert( new_elements, el )
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								end)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							goto continue
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if current_selector.combinator == css.COMBINATORS.DIRECT_DESCENDANT then
 | 
				
			||||||
 | 
							for _, element in ipairs( elements ) do
 | 
				
			||||||
 | 
								for _, child in ipairs( element.children ) do
 | 
				
			||||||
 | 
									if child:check_simple_selector( next_selector.selector ) then
 | 
				
			||||||
 | 
										table.insert( new_elements, child )
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							goto continue
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if current_selector.combinator == css.COMBINATORS.NEXT_SIBLING then
 | 
				
			||||||
 | 
							for _, element in ipairs( elements ) do
 | 
				
			||||||
 | 
								local next_sibling = element:get_next_sibling()
 | 
				
			||||||
 | 
								while next_sibling and next_sibling.tag_name == ":text" do
 | 
				
			||||||
 | 
								 next_sibling = next_sibling:get_next_sibling()
 | 
				
			||||||
 | 
							 end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if next_sibling and next_sibling:check_simple_selector( next_selector.selector ) then
 | 
				
			||||||
 | 
									table.insert( new_elements, next_sibling )
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							goto continue
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if current_selector.combinator == css.COMBINATORS.SUBSEQUENT_SIBLING then
 | 
				
			||||||
 | 
							for _, element in ipairs( elements ) do
 | 
				
			||||||
 | 
								local sibling = element:get_next_sibling()
 | 
				
			||||||
 | 
								while sibling ~= nil do
 | 
				
			||||||
 | 
									if sibling:check_simple_selector( next_selector.selector ) then
 | 
				
			||||||
 | 
										table.insert( new_elements, sibling )
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									sibling = sibling:get_next_sibling()
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							goto continue
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						::continue::
 | 
				
			||||||
 | 
						elements = new_elements
 | 
				
			||||||
 | 
						current_selector = next_selector
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for _, el in ipairs(elements) do
 | 
				
			||||||
 | 
						print( html.tostring( el ) )
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,60 @@
 | 
				
			||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html lang="en">
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					    <meta charset="UTF-8">
 | 
				
			||||||
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
				
			||||||
 | 
					    <title>HTMLQ Test Document</title>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					    <div id="main" class="container wrapper">
 | 
				
			||||||
 | 
					        <header class="header nav-bar">
 | 
				
			||||||
 | 
					            <h1>HTMLQ Test Document</h1>
 | 
				
			||||||
 | 
					            <nav class="nav" data-nav-type="main">
 | 
				
			||||||
 | 
					                <ul>
 | 
				
			||||||
 | 
					                    <li><a href="#" data-link-type="internal">Home</a></li>
 | 
				
			||||||
 | 
					                    <li><a href="#" data-link-type="external">About</a></li>
 | 
				
			||||||
 | 
					                    <li><a href="#" data-link-type="internal">Contact</a></li>
 | 
				
			||||||
 | 
					                </ul>
 | 
				
			||||||
 | 
					            </nav>
 | 
				
			||||||
 | 
					        </header>
 | 
				
			||||||
 | 
					        <main class="content main-content">
 | 
				
			||||||
 | 
					            <section class="section featured" id="featured-section">
 | 
				
			||||||
 | 
					                <h2>Featured Section</h2>
 | 
				
			||||||
 | 
					                <p>This is the featured section.</p>
 | 
				
			||||||
 | 
					                <div class="card featured-card" data-card-type="featured">
 | 
				
			||||||
 | 
					                    <h3>Featured Card</h3>
 | 
				
			||||||
 | 
					                    <p>This is the featured card.</p>
 | 
				
			||||||
 | 
					                    <ul>
 | 
				
			||||||
 | 
					                        <li>Item 1</li>
 | 
				
			||||||
 | 
					                        <li>Item 2</li>
 | 
				
			||||||
 | 
					                        <li>Item 3</li>
 | 
				
			||||||
 | 
					                    </ul>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </section>
 | 
				
			||||||
 | 
					            <section class="section regular" id="regular-section">
 | 
				
			||||||
 | 
					                <h2>Regular Section</h2>
 | 
				
			||||||
 | 
					                <p>This is the regular section.</p>
 | 
				
			||||||
 | 
					                <div class="card regular-card" data-card-type="regular">
 | 
				
			||||||
 | 
					                    <h3>Regular Card</h3>
 | 
				
			||||||
 | 
					                    <p>This is the regular card.</p>
 | 
				
			||||||
 | 
					                    <ol>
 | 
				
			||||||
 | 
					                        <li>Item 1</li>
 | 
				
			||||||
 | 
					                        <li>Item 2</li>
 | 
				
			||||||
 | 
					                        <li>Item 3</li>
 | 
				
			||||||
 | 
					                    </ol>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </section>
 | 
				
			||||||
 | 
					        </main>
 | 
				
			||||||
 | 
					        <footer class="footer nav-bar" data-footer-type="main">
 | 
				
			||||||
 | 
					            <p>© 2024 HTMLQ Test Document</p>
 | 
				
			||||||
 | 
					            <nav class="nav" data-nav-type="footer">
 | 
				
			||||||
 | 
					                <ul>
 | 
				
			||||||
 | 
					                    <li><a href="#" data-link-type="internal">Home</a></li>
 | 
				
			||||||
 | 
					                    <li><a href="#" data-link-type="external">About</a></li>
 | 
				
			||||||
 | 
					                    <li><a href="#" data-link-type="internal">Contact</a></li>
 | 
				
			||||||
 | 
					                </ul>
 | 
				
			||||||
 | 
					            </nav>
 | 
				
			||||||
 | 
					        </footer>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
		Loading…
	
		Reference in New Issue