docgen: search feature
This commit is contained in:
parent
37c3c0033d
commit
7621bb05c9
3 changed files with 73 additions and 0 deletions
|
|
@ -74,9 +74,14 @@ $content
|
||||||
doc.body_toc = """
|
doc.body_toc = """
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="three columns">
|
<div class="three columns">
|
||||||
|
<div>
|
||||||
|
Search: <input type="text" id="searchInput"
|
||||||
|
onkeyup="search()" />
|
||||||
|
</div>
|
||||||
$tableofcontents
|
$tableofcontents
|
||||||
</div>
|
</div>
|
||||||
<div class="nine columns" id="content">
|
<div class="nine columns" id="content">
|
||||||
|
<div id="tocRoot"></div>
|
||||||
<p class="module-desc">$moduledesc</p>
|
<p class="module-desc">$moduledesc</p>
|
||||||
$content
|
$content
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -86,6 +91,10 @@ doc.body_toc = """
|
||||||
doc.body_toc_group = """
|
doc.body_toc_group = """
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="three columns">
|
<div class="three columns">
|
||||||
|
<div>
|
||||||
|
Search: <input type="text" id="searchInput"
|
||||||
|
onkeyup="search()" />
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Group by:
|
Group by:
|
||||||
<select onchange="groupBy(this.value)">
|
<select onchange="groupBy(this.value)">
|
||||||
|
|
|
||||||
|
|
@ -229,3 +229,62 @@ proc groupBy*(value: cstring) {.exportc.} =
|
||||||
else:
|
else:
|
||||||
replaceById("tocRoot", tree("DIV"))
|
replaceById("tocRoot", tree("DIV"))
|
||||||
togglevis(getElementById"toc-list")
|
togglevis(getElementById"toc-list")
|
||||||
|
|
||||||
|
var
|
||||||
|
db: seq[Element]
|
||||||
|
contents: seq[cstring]
|
||||||
|
|
||||||
|
template normalize(x: cstring): cstring = x.toLower.replace("_", "")
|
||||||
|
|
||||||
|
proc dosearch(value: cstring): Element =
|
||||||
|
if db.isNil:
|
||||||
|
var stuff: Element
|
||||||
|
{.emit: """
|
||||||
|
var request = new XMLHttpRequest();
|
||||||
|
request.open("GET", "theindex.html", false);
|
||||||
|
request.send(null);
|
||||||
|
|
||||||
|
// var doc = document.implementation.createHTMLDocument("theindex");
|
||||||
|
// doc.documentElement.innerHTML = request.responseText;
|
||||||
|
|
||||||
|
parser=new DOMParser();
|
||||||
|
doc=parser.parseFromString(request.responseText, "text/html");
|
||||||
|
|
||||||
|
`stuff` = doc.documentElement;
|
||||||
|
""".}
|
||||||
|
db = stuff.getElementsByClass"reference external"
|
||||||
|
contents = @[]
|
||||||
|
for ahref in db:
|
||||||
|
contents.add ahref.textContent.normalize
|
||||||
|
let ul = tree("UL")
|
||||||
|
result = tree("DIV")
|
||||||
|
result.setClass"search_results"
|
||||||
|
var matches = 0
|
||||||
|
let key = value.normalize
|
||||||
|
for i in 0..<db.len:
|
||||||
|
if containsWord(key, contents[i]):
|
||||||
|
ul.add(tree("LI", db[i]))
|
||||||
|
inc matches
|
||||||
|
if matches > 10: break
|
||||||
|
if ul.len == 0:
|
||||||
|
result.add text"no search results"
|
||||||
|
else:
|
||||||
|
result.add ul
|
||||||
|
|
||||||
|
var oldtoc: Element
|
||||||
|
var timer: Timeout
|
||||||
|
|
||||||
|
proc search*() {.exportc.} =
|
||||||
|
proc wrapper() =
|
||||||
|
let elem = getElementById("searchInput")
|
||||||
|
let value = elem.value
|
||||||
|
if value != "":
|
||||||
|
if oldtoc.isNil:
|
||||||
|
oldtoc = getElementById("tocRoot")
|
||||||
|
let results = dosearch(value)
|
||||||
|
replaceById("tocRoot", results)
|
||||||
|
elif not oldtoc.isNil:
|
||||||
|
replaceById("tocRoot", oldtoc)
|
||||||
|
|
||||||
|
if timer != nil: clearTimeout(timer)
|
||||||
|
timer = setTimeout(wrapper, 400)
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,11 @@ proc `value=`*(e: Element; v: cstring) {.importcpp: "#.value = #", nodecl.}
|
||||||
|
|
||||||
proc getElementsByClass*(e: Element; name: cstring): seq[Element] {.importcpp: "#.getElementsByClassName(#)", nodecl.}
|
proc getElementsByClass*(e: Element; name: cstring): seq[Element] {.importcpp: "#.getElementsByClassName(#)", nodecl.}
|
||||||
|
|
||||||
|
proc toLower*(x: cstring): cstring {.
|
||||||
|
importcpp: "#.toLowerCase()", nodecl.}
|
||||||
|
proc replace*(x: cstring; search, by: cstring): cstring {.
|
||||||
|
importcpp: "#.replace(#, #)", nodecl.}
|
||||||
|
|
||||||
type
|
type
|
||||||
EventHandler* = proc(ev: Event)
|
EventHandler* = proc(ev: Event)
|
||||||
EventHandlerId* = proc(ev: Event; id: int)
|
EventHandlerId* = proc(ev: Event; id: int)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue