Mercurial Hosting > luan
view src/luan/modules/lucene/Web_search.luan @ 1355:b84f60ebe196
minor fixes
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 17 Apr 2019 01:32:52 -0600 |
parents | 2de84f128be3 |
children | 9dfff82dfc59 |
line wrap: on
line source
local Luan = require "luan:Luan.luan" local error = Luan.error local pairs = Luan.pairs or error() local ipairs = Luan.ipairs or error() local range = Luan.range or error() local to_string = Luan.to_string or error() local stringify = Luan.stringify or error() local Io = require "luan:Io.luan" local Http = require "luan:http/Http.luan" local String = require "luan:String.luan" local string_to_number = String.to_number or error() local Html = require "luan:Html.luan" local Web_search = {} local function style() %> body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 2em 5%; } h2 { margin-bottom: .5em; } label { text-align: right; min-width: 6em; display: inline-block; margin-right: .5em; } <% end local function form() %> <!doctype html> <html> <head> <title>Lucene Query</title> <style> <% style() %> input { margin-top: 1em; } input[type="text"] { font: inherit; padding: .5em .8em; border-radius: 8px; border-style: groove; } input[type="text"]:focus { border-color: #66afe9; outline: none; } span[tip] { color: #888; font-size: smaller; margin-left: .5em; } input[type="submit"] { color: white; background: #337ab7; border-color: #337ab7; font: inherit; padding: .5em; border-radius: 4px; } input[type="submit"]:hover { background: #236aa7 !important; } </style> </head> <body> <h2>Lucene Query</h2> <form horizontal method="post"> <div> <label>Query:</label> <input type=text name="query" size="80" autofocus /> </div> <div> <label></label> <span tip>Query examples: <i>type:user</i> or <i>+type:user +name:Joe"</i></span> </div> <div> <label>Max Rows:</label> <input type=text name="rows" value="100" size="3" maxlength="5" /> </div> <div> <label>Sort:</label> <input type=text name="sort" size="60" /> </div> <div> <label></label> <span tip>Sort examples: <i>name, id</i></span> </div> <div> <label></label> <input type="submit" /> </div> </form> </body> </html> <% end local function result(query,sort,headers,table) %> <!doctype html> <html> <head> <title>Lucene Query</title> <style> <% style() %> table { border-collapse: collapse; width: 100%; font-size: smaller; } th, td { text-align: left; padding: .5em; border: solid 1px #ddd; } </style> </head> <body> <h2>Lucene Query Results</h2> <p><label>Query:</label> <b><%=Html.encode(to_string(query))%></b></p> <p><label>Sort:</label> <b><%=Html.encode(to_string(sort))%></b></p> <table> <tr> <th></th> <% for _, header in ipairs(headers) do %> <th><%=header%></th> <% end %> </tr> <% for i, row in ipairs(table) do %> <tr> <td><%=i%></td> <% for col in range(1, #headers) do local val = row[col] %><td><%= val and stringify(val) or "" %></td><% end %> </tr> <% end %> </table> </body> </html> <% end local function index_of(tbl,val) for i, v in ipairs(tbl) do if v == val then return i end end local n = #tbl + 1 tbl[n] = val return n end function Web_search.of(index) index or error "index is nil" return function() Io.stdout = Http.response.text_writer() local query = Http.request.parameters.query if query == nil then form() return end local rows = string_to_number(Http.request.parameters.rows) local sort = Http.request.parameters.sort local results = index.search(query,1,rows,{sort=sort}) local headers = {} local table = {} for _, doc in ipairs(results) do local row = {} for field, value in pairs(doc) do row[index_of(headers,field)] = value end table[#table+1] = row end result(query,sort,headers,table) end end return Web_search