docgen: working search feature

This commit is contained in:
Araq 2016-09-09 20:42:02 +02:00
commit 3dfc866710
4 changed files with 26 additions and 19 deletions

View file

@ -19,20 +19,14 @@ proc renderPlainSymbolName*(n: PNode): string =
## for the HTML hyperlinks. ## for the HTML hyperlinks.
result = "" result = ""
case n.kind case n.kind
of nkPostfix: of nkPostfix, nkAccQuoted:
for i in 0 .. <n.len:
result = renderPlainSymbolName(n[<n.len]) result = renderPlainSymbolName(n[<n.len])
if result.len > 0:
return
of nkIdent: of nkIdent:
if n.ident.s != "*":
result = n.ident.s result = n.ident.s
of nkSym: of nkSym:
result = n.sym.renderDefinitionName(noQuotes = true) result = n.sym.renderDefinitionName(noQuotes = true)
of nkPragmaExpr: of nkPragmaExpr:
result = renderPlainSymbolName(n[0]) result = renderPlainSymbolName(n[0])
of nkAccQuoted:
result = renderPlainSymbolName(n[<n.len])
else: else:
internalError(n.info, "renderPlainSymbolName() with " & $n.kind) internalError(n.info, "renderPlainSymbolName() with " & $n.kind)
assert(not result.isNil) assert(not result.isNil)

View file

@ -1275,6 +1275,13 @@ dt pre > span.Operator ~ span.Identifier, dt pre > span.Operator ~ span.Operator
span.pragmaend { span.pragmaend {
cursor: pointer; cursor: pointer;
} }
div.search_results {
background-color: antiquewhite;
margin: 3em;
border-style: inset;
padding: 1em;
}
</style> </style>
<script type="text/javascript" src="../dochack.js"></script> <script type="text/javascript" src="../dochack.js"></script>

View file

@ -419,10 +419,10 @@ proc escapeLink(s: string): string =
result = newStringOfCap(s.len + s.len shr 2) result = newStringOfCap(s.len + s.len shr 2)
for c in items(s): for c in items(s):
case c case c
of 'a'..'z', '_', 'A'..'Z', '0'..'9': of 'a'..'z', '_', 'A'..'Z', '0'..'9', '.', '#', ',', '/':
result.add c result.add c
else: else:
add(result, "X") add(result, "%")
add(result, toHex(ord(c), 2)) add(result, toHex(ord(c), 2))
proc generateSymbolIndex(symbols: seq[IndexEntry]): string = proc generateSymbolIndex(symbols: seq[IndexEntry]): string =
@ -436,7 +436,7 @@ proc generateSymbolIndex(symbols: seq[IndexEntry]): string =
var j = i var j = i
while j < symbols.len and keyword == symbols[j].keyword: while j < symbols.len and keyword == symbols[j].keyword:
let let
url = symbols[j].link.escapeLink #replace("&", "&amp;") url = symbols[j].link.escapeLink
text = if not symbols[j].linkTitle.isNil: symbols[j].linkTitle else: url text = if not symbols[j].linkTitle.isNil: symbols[j].linkTitle else: url
desc = if not symbols[j].linkDesc.isNil: symbols[j].linkDesc else: "" desc = if not symbols[j].linkDesc.isNil: symbols[j].linkDesc else: ""
if desc.len > 0: if desc.len > 0:

View file

@ -241,7 +241,7 @@ proc dosearch(value: cstring): Element =
var stuff: Element var stuff: Element
{.emit: """ {.emit: """
var request = new XMLHttpRequest(); var request = new XMLHttpRequest();
request.open("GET", "theindex.html", false); request.open("GET", "http://nim-lang.org/0.15.0/theindex.html", false);
request.send(null); request.send(null);
var doc = document.implementation.createHTMLDocument("theindex"); var doc = document.implementation.createHTMLDocument("theindex");
@ -259,16 +259,22 @@ proc dosearch(value: cstring): Element =
let ul = tree("UL") let ul = tree("UL")
result = tree("DIV") result = tree("DIV")
result.setClass"search_results" result.setClass"search_results"
var matches = 0 var matches: seq[(Element, int)] = @[]
let key = value.normalize let key = value.normalize
for i in 0..<db.len: for i in 0..<db.len:
if containsWord(key, contents[i]): let c = contents[i]
ul.add(tree("LI", db[i])) if c.containsWord(key):
inc matches matches.add((db[i], -(30_000 - c.len)))
if matches > 10: break elif c.contains(key):
matches.add((db[i], c.len))
matches.sort do (a, b: auto) -> int:
a[1] - b[1]
for i in 0..min(<matches.len, 19):
ul.add(tree("LI", matches[i][0]))
if ul.len == 0: if ul.len == 0:
result.add text"no search results" result.add tree("B", text"no search results")
else: else:
result.add tree("B", text"search results")
result.add ul result.add ul
var oldtoc: Element var oldtoc: Element