Skip to content

Commit 5f15ebf

Browse files
committed
Implement JSON filter and start web-worker implementation
1 parent a5a9cfe commit 5f15ebf

File tree

7 files changed

+67
-5
lines changed

7 files changed

+67
-5
lines changed

doc-tool/resources/_includes/sidebar.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
var input = document.getElementById("search-api-input");
1818
input.onkeydown = function(evt) {
1919
evt = evt || window.event;
20-
if (evt.keyCode == 13)
21-
window.location = "{{ site.baseurl }}/api/search.html?searchTerm=" + input.value;
20+
if (evt.keyCode == 13) window.location = (
21+
"{{ site.baseurl }}/api/search.html?" +
22+
"searchTerm=" + input.value +
23+
"&previousUrl=" + encodeURI(window.location)
24+
);
2225
};
2326
</script>
2427
</li>

doc-tool/resources/_layouts/search.html

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,41 @@
77

88
{% include "toolbar" %}
99

10+
<a id="back-anchor" href="">&lt; Back</a>
1011
<h1 id="searching-for"></h1>
1112

1213
<script>
13-
document.getElementById("searching-for").innerHTML =
14-
location.search;
14+
// Parse parameters from URL:
15+
var parameters = [];
16+
var apiSearch = undefined;
17+
(function() {
18+
var pairs = location.search.substring(1).split('&');
19+
for (var i = 0; i < pairs.length; i++) {
20+
var keyVal = pairs[i].split('=');
21+
parameters[keyVal[0]] = keyVal.length == 2 ? keyVal[1] : undefined;
22+
}
23+
})();
24+
25+
// Set search term and back button:
26+
var searchTerm = parameters["searchTerm"];
27+
document.getElementById("searching-for").innerHTML = 'Seaching for "' + searchTerm + '"...';
28+
document.getElementById("back-anchor").href = parameters["previousUrl"];
29+
30+
if (!window.Worker) {
31+
document.getElementById("searching-for").innerHTML =
32+
"Couldn't search for \"" + searchTerm + "\", " +
33+
"web workers not supported. Please update your browser.";
34+
}
35+
else {
36+
apiSearch = new Worker("{{ site.baseurl }}/js/api-search.js");
37+
apiSearch.postMessage({
38+
"type": "setup",
39+
"search": searchTerm,
40+
"docs": {{ docs | json }},
41+
});
42+
43+
apiSearch.onmessage = function(res) {
44+
console.log("got res: " + res.data);
45+
};
46+
}
1547
</script>

doc-tool/resources/js/api-search.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
onmessage = function(e) {
2+
var docs = e.data.docs;
3+
var searchTerm = e.data.search;
4+
postMessage(
5+
"Search not implemented, couldn't find: " + searchTerm
6+
);
7+
}

doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ case class Site(
141141
"css/color-brewer.css" -> "/css/color-brewer.css",
142142
"css/font-awesome.min.css" -> "/css/font-awesome.min.css",
143143
"css/bootstrap.min.css" -> "/css/bootstrap.min.css",
144+
"js/api-search.js" -> "/js/api-search.js",
144145
"js/bootstrap.min.js" -> "/js/bootstrap.min.js",
145146
"js/jquery.min.js" -> "/js/jquery.min.js",
146147
"js/tether.min.js" -> "/js/tether.min.js",

doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ case class LiquidTemplate(path: String, content: SourceFile) extends Template wi
3535
/** Register filters to static container */
3636
Filter.registerFilter(new Reverse)
3737
Filter.registerFilter(new First)
38+
Filter.registerFilter(new Json)
3839

3940
// For some reason, liqp rejects a straight conversion using `.asJava`
4041
private def toJavaMap(map: Map[String, AnyRef]): HashMap[String, Object] =

doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package dotty.tools
22
package dottydoc
33
package staticsite
44

5-
import java.util.{ Map => JMap }
5+
import java.util.{ Map => JMap, List => JList }
66

7+
import com.fasterxml.jackson.databind.ObjectMapper
78
import liqp.filters.Filter
89

910
/** Custom liquid template filters */
@@ -39,4 +40,20 @@ object filters {
3940
case _ => null
4041
}
4142
}
43+
44+
/** Used to transform java representation to valid JSON
45+
*
46+
* This can be used on things like the docs (`java.util.List[Map[String,_]]`)
47+
* which are available globally:
48+
*
49+
* ```html
50+
* {{ docs | json }}
51+
* ```
52+
*/
53+
final class Json extends Filter("json") {
54+
override def apply(value: Any, params: AnyRef*): AnyRef = value match {
55+
case map: JList[_] => new ObjectMapper().writeValueAsString(map)
56+
case _ => null
57+
}
58+
}
4259
}

doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class SiteTests extends DottyDocTest with SourceFileOps {
9090
"css/color-brewer.css",
9191
"css/bootstrap.min.css",
9292
"css/font-awesome.min.css",
93+
"js/api-search.js",
9394
"js/highlight.pack.js",
9495
"js/bootstrap.min.js",
9596
"js/tether.min.js",

0 commit comments

Comments
 (0)