mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-07 04:14:19 +00:00
docgen: search feature
This commit is contained in:
@@ -74,9 +74,14 @@ $content
|
||||
doc.body_toc = """
|
||||
<div class="row">
|
||||
<div class="three columns">
|
||||
<div>
|
||||
Search: <input type="text" id="searchInput"
|
||||
onkeyup="search()" />
|
||||
</div>
|
||||
$tableofcontents
|
||||
</div>
|
||||
<div class="nine columns" id="content">
|
||||
<div id="tocRoot"></div>
|
||||
<p class="module-desc">$moduledesc</p>
|
||||
$content
|
||||
</div>
|
||||
@@ -86,6 +91,10 @@ doc.body_toc = """
|
||||
doc.body_toc_group = """
|
||||
<div class="row">
|
||||
<div class="three columns">
|
||||
<div>
|
||||
Search: <input type="text" id="searchInput"
|
||||
onkeyup="search()" />
|
||||
</div>
|
||||
<div>
|
||||
Group by:
|
||||
<select onchange="groupBy(this.value)">
|
||||
|
||||
@@ -229,3 +229,62 @@ proc groupBy*(value: cstring) {.exportc.} =
|
||||
else:
|
||||
replaceById("tocRoot", tree("DIV"))
|
||||
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 toLower*(x: cstring): cstring {.
|
||||
importcpp: "#.toLowerCase()", nodecl.}
|
||||
proc replace*(x: cstring; search, by: cstring): cstring {.
|
||||
importcpp: "#.replace(#, #)", nodecl.}
|
||||
|
||||
type
|
||||
EventHandler* = proc(ev: Event)
|
||||
EventHandlerId* = proc(ev: Event; id: int)
|
||||
|
||||
Reference in New Issue
Block a user