244 lines
6.6 KiB
Lua
244 lines
6.6 KiB
Lua
local searchBtn = gurt.select('#searchButton')
|
|
local luckyBtn = gurt.select('#luckyButton')
|
|
local searchQuery = gurt.select('#searchQuery')
|
|
local loading = gurt.select('#loading')
|
|
local results = gurt.select('#results')
|
|
local stats = gurt.select('#stats')
|
|
|
|
local function showLoading()
|
|
loading.classList:remove('hidden')
|
|
|
|
local children = results.children
|
|
for i = #children, 1, -1 do
|
|
children[i]:remove()
|
|
end
|
|
|
|
stats.text = ''
|
|
end
|
|
|
|
local function displayResults(data)
|
|
loading.classList:add('hidden')
|
|
|
|
local children = results.children
|
|
for i = #children, 1, -1 do
|
|
children[i]:remove()
|
|
end
|
|
|
|
if not data.results or #data.results == 0 then
|
|
local noResultsItem = gurt.create('div', {
|
|
text = 'No results found for your query.',
|
|
style = 'result-item'
|
|
})
|
|
results:append(noResultsItem)
|
|
stats.text = 'No results found'
|
|
return
|
|
end
|
|
|
|
for i, result in ipairs(data.results) do
|
|
local resultItem = gurt.create('div', { style = 'result-item' })
|
|
|
|
resultItem:on('click', function()
|
|
gurt.location.goto(result.url)
|
|
end)
|
|
|
|
local headerDiv = gurt.create('div', { style = 'result-header' })
|
|
|
|
if result.icon and result.icon ~= '' then
|
|
local iconImg = gurt.create('img', {
|
|
src = result.icon,
|
|
style = 'result-icon',
|
|
alt = 'Site icon'
|
|
})
|
|
headerDiv:append(iconImg)
|
|
end
|
|
|
|
local titleDiv = gurt.create('p', {
|
|
text = result.title or result.url,
|
|
style = 'result-title'
|
|
})
|
|
|
|
headerDiv:append(titleDiv)
|
|
|
|
local urlDiv = gurt.create('p', {
|
|
text = result.url,
|
|
style = 'result-url'
|
|
})
|
|
|
|
local previewText = result.preview or result.description or ''
|
|
if #previewText > 150 then
|
|
previewText = previewText:sub(1, 147) .. '...'
|
|
end
|
|
|
|
local previewDiv = gurt.create('p', {
|
|
text = previewText,
|
|
style = 'result-preview'
|
|
})
|
|
|
|
resultItem:append(headerDiv)
|
|
resultItem:append(urlDiv)
|
|
resultItem:append(previewDiv)
|
|
|
|
results:append(resultItem)
|
|
end
|
|
|
|
local resultCount = #data.results
|
|
local totalResults = data.total_results or resultCount
|
|
stats.text = 'Found ' .. totalResults .. ' result' .. (totalResults == 1 and '' or 's')
|
|
end
|
|
|
|
local function performSearch(query)
|
|
if not query or query == '' then
|
|
return
|
|
end
|
|
|
|
showLoading()
|
|
|
|
local url = 'https://135.125.163.131:4880/api/search?q=' .. urlEncode(query) .. '&per_page=20'
|
|
local response = fetch(url, {
|
|
method = 'GET'
|
|
})
|
|
|
|
if response:ok() then
|
|
local data = response:json()
|
|
displayResults(data)
|
|
else
|
|
loading.classList:add('hidden')
|
|
|
|
-- Clear all existing children from results
|
|
local children = results.children
|
|
for i = #children, 1, -1 do
|
|
children[i]:remove()
|
|
end
|
|
|
|
stats.text = 'Search failed: ' .. response.status .. ' ' .. response.statusText
|
|
end
|
|
end
|
|
|
|
local function performLuckySearch()
|
|
showLoading()
|
|
|
|
local luckyTerms = {'test', 'demo', 'api', 'web', 'site', 'page', 'home', 'index'}
|
|
local randomTerm = luckyTerms[math.random(#luckyTerms)]
|
|
|
|
local url = 'https://135.125.163.131:4880/api/search?q=' .. urlEncode(randomTerm) .. '&per_page=50'
|
|
local response = fetch(url, {
|
|
method = 'GET'
|
|
})
|
|
|
|
if response:ok() then
|
|
local data = response:json()
|
|
if data.results and #data.results > 0 then
|
|
local randomResult = data.results[math.random(#data.results)]
|
|
gurt.location.goto(randomResult.url)
|
|
else
|
|
loading.classList:add('hidden')
|
|
|
|
local children = results.children
|
|
for i = #children, 1, -1 do
|
|
children[i]:remove()
|
|
end
|
|
|
|
stats.text = 'No sites available for lucky search'
|
|
end
|
|
else
|
|
loading.classList:add('hidden')
|
|
|
|
local children = results.children
|
|
for i = #children, 1, -1 do
|
|
children[i]:remove()
|
|
end
|
|
|
|
stats.text = 'Lucky search failed'
|
|
end
|
|
end
|
|
|
|
searchBtn:on('click', function()
|
|
local query = searchQuery.value
|
|
if query and query ~= '' then
|
|
performSearch(query:trim())
|
|
end
|
|
end)
|
|
|
|
luckyBtn:on('click', function()
|
|
performLuckySearch()
|
|
end)
|
|
|
|
searchQuery:on('keydown', function(e)
|
|
if e.key == 'Enter' then
|
|
local query = searchQuery.value
|
|
if query and query ~= '' then
|
|
performSearch(query:trim())
|
|
end
|
|
elseif e.key == 'Escape' then
|
|
-- Clear search on Escape
|
|
searchQuery.value = ''
|
|
|
|
-- Clear results
|
|
local children = results.children
|
|
for i = #children, 1, -1 do
|
|
children[i]:remove()
|
|
end
|
|
|
|
stats.text = ''
|
|
loading.classList:add('hidden')
|
|
|
|
-- Update URL to remove query parameter
|
|
local baseUrl = gurt.location.pathname
|
|
if gurt.location.href ~= baseUrl then
|
|
gurt.location.goto(baseUrl)
|
|
end
|
|
end
|
|
end)
|
|
|
|
|
|
local function checkForQueryParam()
|
|
local url = gurt.location.href
|
|
local queryIndex = url:find('?')
|
|
|
|
if queryIndex then
|
|
local queryString = url:sub(queryIndex + 1)
|
|
local params = {}
|
|
|
|
-- Parse query parameters
|
|
for param in queryString:gmatch('([^&]+)') do
|
|
local key, value = param:match('([^=]+)=(.+)')
|
|
if key and value then
|
|
params[key] = urlDecode(value)
|
|
end
|
|
end
|
|
|
|
-- If 'q' parameter exists, populate search box and perform search
|
|
if params.q then
|
|
searchQuery.value = params.q
|
|
performSearch(params.q)
|
|
return
|
|
end
|
|
end
|
|
|
|
-- Focus search input if no query parameter
|
|
searchQuery:focus()
|
|
end
|
|
|
|
searchQuery:on('input', function()
|
|
local query = searchQuery.value:trim()
|
|
|
|
if query == '' then
|
|
-- Clear results when search box is empty
|
|
local children = results.children
|
|
for i = #children, 1, -1 do
|
|
children[i]:remove()
|
|
end
|
|
|
|
stats.text = ''
|
|
loading.classList:add('hidden')
|
|
|
|
-- Update URL to remove query parameter
|
|
local baseUrl = gurt.location.pathname
|
|
if gurt.location.href ~= baseUrl then
|
|
gurt.location.goto(baseUrl)
|
|
end
|
|
end
|
|
end)
|
|
|
|
checkForQueryParam()
|