optimized search

This commit is contained in:
oppofind 2020-12-19 05:15:05 +08:00
parent b4b145873c
commit 8413dd6135
17 changed files with 268 additions and 714 deletions

View File

@ -36,9 +36,11 @@ import org.beetl.core.Template;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static com.power.doc.constants.DocGlobalConstants.FILE_SEPARATOR;
import static com.power.doc.constants.DocGlobalConstants.SEARCH_JS;
/**
* @author yu 2019/9/26.
@ -147,6 +149,46 @@ public class DocBuilderTemplate extends BaseDocBuilderTemplate {
FileUtil.nioWriteFile(tpl.render(), outPath + FILE_SEPARATOR + outPutFileName);
}
public void buildSearchJs(ApiConfig config, JavaProjectBuilder javaProjectBuilder, List<ApiDoc> apiDocList, String template) {
List<ApiErrorCode> errorCodeList = errorCodeDictToList(config);
Template tpl = BeetlTemplateUtil.getByName(template);
// directory tree
List<ApiDoc> apiDocs = new ArrayList<>();
for (ApiDoc apiDoc1 : apiDocList) {
apiDoc1.setOrder(apiDocs.size() + 1);
apiDocs.add(apiDoc1);
}
Map<String, String> titleMap = setDirectoryLanguageVariable(config, tpl);
// set error code
if (CollectionUtil.isNotEmpty(errorCodeList)) {
ApiDoc apiDoc1 = new ApiDoc();
apiDoc1.setOrder(apiDocs.size() + 1);
apiDoc1.setDesc(titleMap.get(TemplateVariable.ERROR_LIST_TITLE.getVariable()));
apiDoc1.setList(new ArrayList<>(0));
apiDoc1.setLink("error_code_list");
apiDoc1.setAlias("error");
apiDocs.add(apiDoc1);
}
// set dict list
List<ApiDocDict> apiDocDictList = buildDictionary(config, javaProjectBuilder);
ApiDoc apiDoc1 = new ApiDoc();
apiDoc1.setOrder(apiDocs.size() + 1);
apiDoc1.setLink("dict_list");
apiDoc1.setAlias("dict");
apiDoc1.setDesc(titleMap.get(TemplateVariable.DICT_LIST_TITLE.getVariable()));
List<ApiMethodDoc> methodDocs = new ArrayList<>();
for (ApiDocDict apiDocDict : apiDocDictList) {
ApiMethodDoc methodDoc = new ApiMethodDoc();
methodDoc.setOrder(apiDocDict.getOrder());
methodDoc.setDesc(apiDocDict.getTitle());
methodDocs.add(methodDoc);
}
apiDoc1.setList(methodDocs);
apiDocs.add(apiDoc1);
tpl.binding(TemplateVariable.API_DOC_LIST.getVariable(), apiDocs);
FileUtil.nioWriteFile(tpl.render(), config.getOutPath() + FILE_SEPARATOR + SEARCH_JS);
}
/**
* build error_code adoc

View File

@ -87,7 +87,7 @@ public class HtmlApiDocBuilder {
} else {
builderTemplate.buildAllInOne(apiDocList, config, javaProjectBuilder, ALL_IN_ONE_HTML_TPL, INDEX_HTML);
}
buildSearchJs(apiDocList, config,"js/search_all.js.btl");
builderTemplate.buildSearchJs(config,javaProjectBuilder,apiDocList, "js/search_all.js.btl");
} else {
String indexAlias;
if (config.isCreateDebugPage()) {
@ -103,7 +103,7 @@ public class HtmlApiDocBuilder {
"error.html", indexAlias);
builderTemplate.buildDirectoryDataDoc(config, javaProjectBuilder, apiDocList,
SINGLE_DICT_HTML_TPL, "dict.html", indexAlias);
buildSearchJs(apiDocList, config,"js/search.js.btl");
builderTemplate.buildSearchJs(config,javaProjectBuilder,apiDocList, "js/search.js.btl");
}
}
@ -132,10 +132,4 @@ public class HtmlApiDocBuilder {
index++;
}
}
private static void buildSearchJs(List<ApiDoc> apiDocList, ApiConfig config, String template) {
Template tpl = BeetlTemplateUtil.getByName(template);
tpl.binding(TemplateVariable.API_DOC_LIST.getVariable(), apiDocList);
FileUtil.nioWriteFile(tpl.render(), config.getOutPath() + FILE_SEPARATOR + "search.js");
}
}

View File

@ -52,8 +52,11 @@ public interface DocGlobalConstants {
String MARKDOWN_CSS_TPL = "markdown.css";
String SEARCH_JS = "search.js";
String DEBUG_PAGE_TPL = "mock.html";
String DEBUG_PAGE_ALL_TPL = "mock-all.html";
String DEBUG_PAGE_SINGLE_TPL = "html/mock.html";

View File

@ -23,6 +23,8 @@
package com.power.doc.model;
import com.power.common.util.StringUtil;
import java.util.List;
import java.util.Objects;
@ -57,6 +59,11 @@ public class ApiDoc implements Comparable<ApiDoc> {
*/
private String desc;
/**
* link
*/
private String link;
public String getName() {
return name;
}
@ -97,6 +104,17 @@ public class ApiDoc implements Comparable<ApiDoc> {
this.alias = alias;
}
public String getLink() {
if (StringUtil.isNotEmpty(link)) {
return link;
}
return desc.replace(" ", "_").toLowerCase();
}
public void setLink(String link) {
this.link = link;
}
@Override
public int compareTo(ApiDoc o) {
if (Objects.nonNull(o.getDesc())) {
@ -105,6 +123,7 @@ public class ApiDoc implements Comparable<ApiDoc> {
return name.compareTo(o.getName());
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");

View File

@ -22,6 +22,7 @@
*/
package com.power.doc.model;
import com.power.common.util.StringUtil;
import com.power.doc.constants.DocGlobalConstants;
import com.power.doc.model.request.ApiRequestExample;
@ -154,12 +155,12 @@ public class ApiMethodDoc implements Serializable {
/**
* return schema
*/
private Map<String,Object> returnSchema;
private Map<String, Object> returnSchema;
/**
* request schema
*/
private Map<String,Object> requestSchema;
private Map<String, Object> requestSchema;
/**
* api group
@ -171,6 +172,11 @@ public class ApiMethodDoc implements Serializable {
*/
private boolean download;
/**
* link
*/
private String link;
public String getMethodId() {
return methodId;
}
@ -372,6 +378,17 @@ public class ApiMethodDoc implements Serializable {
this.download = download;
}
public String getLink() {
if (StringUtil.isNotEmpty(link)) {
return link;
}
return desc.replace(" ", "_").toLowerCase();
}
public void setLink(String link) {
this.link = link;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");

View File

@ -17,7 +17,7 @@
padding: 0em;
}</style>
<script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/10.3.2/highlight.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
</head>
<body class="book toc2 toc-left">
<div id="header"><%if(isNotEmpty(projectName)){%><h1>${projectName}</h1><%}%>

View File

@ -1,207 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width initial-scale=1'>
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<link rel="stylesheet" href="index.css?v=${version}"/>
<title>api doc</title>
</head>
<body>
<div class="book without-animation with-summary font-size-2 font-family-1">
<div class="book-summary">
<div id="book-search-input"><input id="search" type="text" placeholder="Type to search"></div>
<nav role="navigation">
<ul class="summary">
<li><ul id="reference">API Reference</ul></li>
<li class="divider"></li>
<div id="doc">
<%
for(api in apiDocList){
%>
<li class="chapter " data-level="${api.alias}" data-path="${api.alias}.html">
<a href="javascript:void(0)" onclick="go('${api.alias}', '${api.desc}');">${api.order} ${api.desc}</a>
<ul class="articles">
<%
for(doc in api.list){
%>
<li class="chapter " data-level="${api.alias}" data-path="${api.alias}.html">
<%if(doc.deprecated){%>
<a href="javascript:void(0)" onclick="go('${api.alias}', '${doc.desc}');">${api.order}.${doc.order}&nbsp;<span class="line-through">${doc.desc}</span></a></li>
<%}else{%>
<a href="javascript:void(0)" onclick="go('${api.alias}', '${doc.desc}');">${api.order}.${doc.order}&nbsp;${doc.desc}</a></li>
<%}%>
<%}%>
</ul>
</li>
<%}%>
</div>
<%if(isNotEmpty(errorCodeList)){%>
<li class="chapter " data-level="error_code" data-path="error_code.html">
<a href="error_code.html?v=${version}" target="book_iframe">${apiDocList.~size+1}. ${errorListTitle}</a>
</li>
<%}%>
<%if(isNotEmpty(dictList)){%>
<li class="chapter " data-level="dict" data-path="dict.html">
<a href="dict.html?v=${version}" target="book_iframe">${dictListOrder}. ${dictListTitle}</a>
<ul class="articles">
<%
for(dict in dictList){
%>
<li class="chapter " data-level="${dict.title}" data-path="dict.html">
<a href="dict.html?v=${version}" target="book_iframe">${dictListOrder}.${dictLP.index} ${dict.title}</a></li>
<%}%>
</ul>
</li>
<%}%>
<li class="divider"></li>
<li class="footer_link"><a href="https://github.com/smart-doc-group/smart-doc" target="_blank" class="gitbook-link">Created by smart-doc</a>
</li>
</ul>
</nav>
</div>
<div id="book-body" class="book-body" height="100%">
<iframe src="${homePage}.html?v=${version}" frameborder="0" id="book_iframe" name="book_iframe" width="100%" height="100%"></iframe>
</div>
</div>
<script type="text/javascript">
var api = [];
function changeFrameHeight() {
var ifm = document.getElementById("book_iframe");
ifm.height = document.documentElement.clientHeight;
}
function toPage() {
var page = localStorage.getItem('page');
var title = localStorage.getItem('title');
if(page) {
var iframe = document.getElementById("book_iframe");
iframe.src = page + ".html";
var obj = iframe.contentWindow;
obj.onload = function(){
var h2 = obj.document.getElementsByTagName('h2');
for(j = 0; j < h2.length; j++) {
var dom = h2[j];
if(dom.innerText == title){
obj.scroll(0, dom.offsetTop);
break;
}
}
}
}
}
toPage();
function go(alias, desc) {
console.log(alias, desc);
var iframe = document.getElementById("book_iframe");
var page = localStorage.getItem('page');
if(page != alias){
iframe.src = alias + ".html";
}
localStorage.setItem('page', alias);
localStorage.setItem('title', desc);
setTimeout(() => {
var obj = iframe.contentWindow;
var h2 = obj.document.getElementsByTagName('h2');
for(j = 0; j < h2.length; j++) {
var dom = h2[j];
if(dom.innerText == desc){
obj.scroll(0, dom.offsetTop);
break;
}
}
}, 200)
}
changeFrameHeight();
setInterval(function(){changeFrameHeight(); }, 500);
document.onkeydown = keyDownSearch;
function keyDownSearch(e) {
var theEvent = e || window.event;
var code = theEvent.keyCode || theEvent.which || theEvent.charCode;
if (code == 13) {
var search = document.getElementById('search');
var searchArr = [];
<% for(api in apiDocList) { %>
searchArr.push({
alias: '${api.alias}',
order: '${api.order}',
desc: '${api.desc}',
list: []
})
api.push({
alias: '${api.alias}',
order: '${api.order}',
desc: '${api.desc}',
list: []
})
<% for(doc in api.list) { %>
api[${apiLP.dataIndex}].list.push({
order: '${doc.order}',
desc: '${doc.desc}',
});
if('${doc.desc}'.indexOf(search.value) > -1) {
searchArr[${apiLP.dataIndex}].list.push({
order: '${doc.order}',
desc: '${doc.desc}',
});
}
<%}%>
<%}%>
var searchResult = searchArr.filter(obj => obj.list.length > 0);
if(searchResult.length > 0) {
var html = '';
for(j = 0; j < searchResult.length; j++) {
html += '<li class="chapter " data-level="' + searchResult[j].alias + '" data-path="' + searchResult[j].alias + '.html">';
html += ' <a href="javascript:void(0)" onclick="go(\'' + searchResult[j].alias + '\', \'' + searchResult[j].desc + '\');">' + searchResult[j].order + ' ' + searchResult[j].desc + '</a>';
html += ' <ul class="articles">';
var doc = searchResult[j].list;
for(m = 0; m < doc.length; m++) {
html += ' <li class="chapter " data-level="' + searchResult[j].alias + '" data-path="' + searchResult[j].alias + '.html">';
html += ' <a href="javascript:void(0)" onclick="go(\'' + searchResult[j].alias + '\', \'' + doc[m].desc + '\');">' + searchResult[j].order + '.' + doc[m].order + ' ' + doc[m].desc + '</a></li>';
html += ' </li>';
}
html += '</ul>';
}
document.getElementById('doc').innerHTML = html;
} else {
if(search.value == '') {
var html = '';
for(j = 0; j < api.length; j++) {
html += '<li class="chapter " data-level="' + api[j].alias + '" data-path="' + api[j].alias + '.html">';
html += ' <a href="javascript:void(0)" onclick="go(\'' + api[j].alias + '\', \'' + api[j].desc + '\');">' + api[j].order + ' ' +api[j].desc + '</a>';
html += ' <ul class="articles">';
var doc = api[j].list;
for(m = 0; m < doc.length; m++) {
html += ' <li class="chapter " data-level="' + searchResult[j].alias + '" data-path="' + searchResult[j].alias + '.html">';
html += ' <a href="javascript:void(0)" onclick="go(\'' + api[j].alias + '\', \'' + doc[m].desc + '\');">' + searchResult[j].order + '.' + doc[m].order + ' ' + doc[m].desc + '</a></li>';
html += ' </li>';
}
html += '</ul>';
}
document.getElementById('doc').innerHTML = html;
} else {
document.getElementById('doc').innerHTML = '';
}
}
}
}
</script>
</body>
</html>

View File

@ -17,7 +17,7 @@
padding: 0em;
}</style>
<script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/10.3.2/highlight.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
</head>
<body class="book toc2 toc-left">
<div id="header">

View File

@ -17,7 +17,7 @@
padding: 0em;
}</style>
<script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/10.3.2/highlight.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
</head>
<body class="book toc2 toc-left">
<div id="header">
@ -54,7 +54,7 @@
<%}%><%}%><%if(isNotEmpty(errorCodeList)){%>
<li class="open"><a href="error.html#header">${apiDocList.~size+1}.${errorListTitle}</a>
<ul class="sectlevel2" style="display: block">
<li><a href="dict.html#_${apiDocList.~size+1}_1_${errorListTitle}">${apiDocList.~size+1}.1.&nbsp;${errorListTitle}</a>
<li><a href="error.html#_${apiDocList.~size+1}_1_${errorListTitle}">${apiDocList.~size+1}.1.&nbsp;${errorListTitle}</a>
</li>
</ul>

View File

@ -18,7 +18,7 @@
}
</style>
<script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/10.3.2/highlight.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
</head>
<body class="book toc2 toc-left">
<div id="header">

View File

@ -8,7 +8,7 @@
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<link rel="stylesheet" href="AllInOne.css?v=${version}"/>
<script src="https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
</head>
<body class="book toc2 toc-left">
<div id="header">

View File

@ -1,135 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width initial-scale=1'>
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<link rel="stylesheet" href="index.css?v=${version}"/>
<link rel="stylesheet" href="markdown.css?v=${version}"/>
<title>api doc</title>
</head>
<div class="book without-animation with-summary font-size-2 font-family-1">
<div class="book-summary">
<div id="book-search-input"><input type="text" placeholder="Type to search"></div>
<nav role="navigation">
<ul class="summary">
<li><ul id="reference">API Reference</ul></li>
<li class="divider"></li>
<%
for(api in apiDocList){
%>
<li class="chapter " data-level="${api.alias}" data-path="${api.alias}.html">
<a href="#_${api.desc}">${api.order}. ${api.desc}</a>
<ul class="articles">
<%
for(doc in api.list){
%>
<li class="chapter " data-level="${api.alias}" data-path="${api.alias}.html">
<a href="#_${doc.desc}">${api.order}.${doc.order} ${doc.desc}</a></li>
<%}%>
</ul>
</li>
<%}%>
<li class="chapter " data-level="error_code" data-path="error_code.html">
<a href="error_code.html?v=${version}" target="book_iframe">${errorListTitle}</a>
</li>
<li class="divider"></li>
<li class="footer_link"><a href="https://github.com/shalousun/smart-doc" target="_blank" class="gitbook-link">Created by smart-doc</a>
</li>
</ul>
</nav>
</div>
<div id="book-body" class="book-body" height="100%">
<div class="markdown-body">
<%
for(api in apiDocList){
%>
<h1 id="_${api.desc}">
<a class="anchor" href="#_${api.desc}"></a><a class="link" href="#_${api.desc}">${api.order}. ${api.desc}</a>
</h1>
<%
for(doc in api.list){
%>
<h2 id="_${doc.desc}">
<a class="anchor" href="#_${doc.desc}"></a><a class="link" href="#_${doc.desc}">${api.order}.${doc.order} ${doc.desc}</a>
</h2>
<p><strong>URL:</strong>${doc.url}</p>
<p><strong>Type:</strong>${doc.type}</p>
<p><strong>Content-Type:</strong> ${doc.contentType}</p>
<p><strong>Description:</strong> ${doc.detail}</p>
<%if(isNotEmpty(doc.requestHeaders)){%>
<p><strong>Request-headers:</strong></p>
<table>
<thead>
<tr><th>Header</th><th>Type</th><th>Description</th><th>Required</th><th>Since</th></tr>
</thead>
<tbody>
<%
for(header in doc.requestHeaders){
%>
<tr><td>${header.name}</td><td>${header.type}</td><td>${header.desc}</td><td>${header.required}</td><td>${header.since}</td></tr>
<%}%>
</tbody>
</table>
<%}%>
<%if(isNotEmpty(doc.requestParams)){%>
<p><strong>Request-parameters:</strong></p>
<table>
<thead>
<tr><th>Parameter</th><th>Type</th><th>Description</th><th>Required</th><th>Since</th></tr>
</thead>
<tbody>
<%
for(param in doc.requestParams){
%>
<tr><td>${param.field}</td><td>${param.type}</td><td>${param.desc}</td><td>${param.required}</td><td>${param.version}</td></tr>
<%}%>
</tbody>
</table>
<%}%>
<%if(isNotEmpty(doc.requestUsage)&&isRequestExample){%>
<p><strong>Request-example:</strong></p>
<pre><code>${doc.requestUsage}
</code></pre>
<%}%>
<%if(isNotEmpty(doc.responseParams)){%>
<p><strong>Response-fields:</strong></p>
<table>
<thead>
<tr><th>Field</th><th>Type</th><th>Description</th><th>Since</th></tr>
</thead>
<tbody>
<%
for(param in doc.responseParams){
%>
<tr><td> ${param.field}</td><td>${param.type}</td><td>${param.desc}</td><td>${param.version}</td></tr>
<%}%>
</tbody>
</table>
<%}%>
<%if(isNotEmpty(doc.responseUsage)&&isResponseExample){%>
<p><strong>Response-example:</strong></p>
<pre><code>${doc.responseUsage}
</code></pre>
<%}%>
<%}%>
<%}%>
<footer class="page-footer">
<span class="copyright">Generated by smart-doc at ${createTime}</span>
<span class="footer-modification">Suggestions, contact, support and error reporting on
<a href="https://gitee.com/smart-doc-team/smart-doc" target="_blank">Gitee</a> or
<a href="https://github.com/smart-doc-group/smart-doc" target="_blank">Github</a>
</span>
</footer>
</div>
</div>
</div>
</body>
</html>

View File

@ -1,232 +0,0 @@
.book-summary {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
position: absolute;
top: 0;
left: -300px;
bottom: 0;
z-index: 1;
overflow-y: auto;
width: 300px;
color: #364149;
background: #fafafa;
border-right: 1px solid rgba(0, 0, 0, .07);
-webkit-transition: left 250ms ease;
-moz-transition: left 250ms ease;
-o-transition: left 250ms ease;
transition: left 250ms ease
}
.book-summary ul.summary {
list-style: none;
margin: 0;
padding: 0;
-webkit-transition: top .5s ease;
-moz-transition: top .5s ease;
-o-transition: top .5s ease;
transition: top .5s ease
}
.book-summary ul.summary li {
list-style: none
}
.book-summary ul.summary li.header {
padding: 10px 15px;
padding-top: 20px;
text-transform: uppercase;
color: #939da3
}
.book-summary ul.summary li.divider {
height: 1px;
margin: 7px 0;
overflow: hidden;
background: rgba(0, 0, 0, .07)
}
.book-summary ul.summary li i.fa-check {
display: none;
position: absolute;
right: 9px;
top: 16px;
font-size: 9px;
color: #3c3
}
.book-summary ul.summary li.done > a {
color: #364149;
font-weight: 400
}
.book-summary ul.summary li.done > a i {
display: inline
}
.book-summary ul.summary li a, .book-summary {
display: block;
padding: 10px 15px;
border-bottom: 0;
color: #364149;
background: 0;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
position: relative
}
.book-summary ul.summary li a:hover {
text-decoration: underline
}
.book-summary ul.summary li a:focus {
outline: 0
}
.book-summary ul.summary li.active > a {
color: #008cff;
background: 0;
text-decoration: none
}
.book-summary ul.summary li ul {
padding-left: 20px
}
@media (max-width: 600px) {
.book-summary {
width: calc(100% - 60px);
bottom: 0;
left: -100%
}
}
.book.with-summary .book-summary {
left: 0
}
.book.without-animation .book-summary {
-webkit-transition: none !important;
-moz-transition: none !important;
-o-transition: none !important;
transition: none !important
}
.book {
position: relative;
width: 100%;
height: 100%
}
@media (min-width: 600px) {
.book.with-summary .book-body {
left: 300px
}
}
@media (max-width: 600px) {
.book.with-summary {
overflow: hidden
}
.book.with-summary .book-body {
-webkit-transform: translate(calc(100% - 60px), 0);
-moz-transform: translate(calc(100% - 60px), 0);
-ms-transform: translate(calc(100% - 60px), 0);
-o-transform: translate(calc(100% - 60px), 0);
transform: translate(calc(100% - 60px), 0)
}
}
.book.without-animation .book-body {
-webkit-transition: none !important;
-moz-transition: none !important;
-o-transition: none !important;
transition: none !important
}
.book-body {
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
overflow-y: hidden;
color: #000;
background: #fff;
-webkit-transition: left 250ms ease;
-moz-transition: left 250ms ease;
-o-transition: left 250ms ease;
transition: left 250ms ease
}
@media (max-width: 1240px) {
.book-body {
-webkit-transition: -webkit-transform 250ms ease;
-moz-transition: -moz-transform 250ms ease;
-o-transition: -o-transform 250ms ease;
transition: transform 250ms ease;
padding-bottom: 20px
}
}
#book-search-input {
padding: 6px;
background: 0;
transition: top .5s ease;
border-bottom: 1px solid rgba(0, 0, 0, .07);
border-top: 1px solid rgba(0, 0, 0, .07);
margin-bottom: 10px;
margin-top: -1px
}
#book-search-input input, #book-search-input input:focus, #book-search-input input:hover {
width: 100%;
background: 0;
border: 1px solid transparent;
box-shadow: none;
outline: 0;
line-height: 22px;
padding: 7px 7px;
color: inherit
}
a {
text-decoration: none
}
body, html {
height: 100%
}
html {
font-size: 62.5%
}
body {
margin: 0
}
body {
text-rendering: optimizeLegibility;
font-smoothing: antialiased;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
letter-spacing: .2px;
text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%
}
#reference {
padding-top: 10px;
padding-bottom: 10px;
padding-left: 15px
}
.footer_link {
margin-bottom: 45px
}
.line-through {
text-decoration: line-through;
}

View File

@ -1,76 +1,104 @@
let api = [];
<%for(api in apiDocList){%>
api.push({
alias: '${api.alias}',
order: '${api.order}',
desc: '${api.desc}',
link: '${api.link}',
list: []
})
<%for(doc in api.list) {%>
api[${apiLP.dataIndex}].list.push({
order: '${doc.order}',
desc: '${doc.desc}',
});
<%}%>
<%}%>
document.onkeydown = keyDownSearch;
function keyDownSearch(e) {
let j;
let m;
let doc;
let html;
const theEvent = e || window.event;
const code = theEvent.keyCode || theEvent.which || theEvent.charCode;
if (code == 13) {
const search = document.getElementById('search');
const searchArr = [];
<%for(api in apiDocList){%>
searchArr.push({
alias: '${api.alias}',
order: '${api.order}',
desc: '${api.desc}',
list: []
})
api.push({
alias: '${api.alias}',
order: '${api.order}',
desc: '${api.desc}',
list: []
})
<%for (doc in api.list) {%>
api[${apiLP.dataIndex}].list.push({
order: '${doc.order}',
desc: '${doc.desc}',
});
if ('${doc.desc}'.indexOf(search.value) > -1) {
searchArr[${apiLP.dataIndex}].list.push({
order: '${doc.order}',
desc: '${doc.desc}',
});
}
<%}%>
<%}%>
const searchResult = searchArr.filter(obj => obj.list.length > 0);
if (searchResult.length > 0) {
html = '';
for (j = 0; j < searchResult.length; j++) {
html += '<li class="open">';
html += ' <a class="dd" href="' + searchResult[j].alias + '.html#header">' + searchResult[j].order + '.&nbsp;' + searchResult[j].desc + '</a>';
html += ' <ul class="sectlevel2" style="display: block">';
doc = searchResult[j].list;
for (m = 0; m < doc.length; m++) {
html += '<li><a href="' + searchResult[j].alias + '.html#_' + searchResult[j].order + '_' + doc[m].order + '_' + doc[m].desc + '">' + searchResult[j].order + '.' + doc[m].order + '.&nbsp;' + doc[m].desc + '</a> </li>';
const searchValue = search.value;
let searchArr = [];
for (let i = 0; i < api.length; i++) {
let apiData = api[i];
const desc = apiData.desc;
if (desc.indexOf(searchValue) > -1) {
searchArr.push({
order: apiData.order,
desc: apiData.desc,
link: apiData.link,
alias: apiData.alias,
list: apiData.list
});
} else {
let methodList = apiData.list || [];
let methodListTemp = [];
for (let j = 0; j < methodList.length; j++) {
const methodData = methodList[j];
const methodDesc = methodData.desc;
if (methodDesc.indexOf(searchValue) > -1) {
methodListTemp.push(methodData);
break;
}
}
if (methodListTemp.length > 0) {
const data = {
order: apiData.order,
desc: apiData.desc,
alias: apiData.alias,
link: apiData.link,
list: methodListTemp
};
searchArr.push(data);
}
html += '</ul>';
html += '</li>';
}
}
let html;
if (searchValue == '') {
html = buildAccordion(api);
console.log(html);
document.getElementById('accordion').innerHTML = html;
} else {
if (search.value == '') {
html = '';
for (j = 0; j < api.length; j++) {
html += '<li class="open">';
html += ' <a class="dd" href="' + api[j].alias + '.html#header">' + api[j].order + '.&nbsp;' + api[j].desc + '</a>';
html += ' <ul class="sectlevel2" style="display: block">';
doc = api[j].list;
for (m = 0; m < doc.length; m++) {
html += '<li><a href="' + api[j].alias + '.html#_' + searchResult[j].order + '_' + doc[m].order + '_' + doc[m].desc + '">' + searchResult[j].order + '.' + doc[m].order + '.&nbsp;' + doc[m].desc + '</a> </li>';
}
html += '</ul>';
html += '</li>';
}
document.getElementById('accordion').innerHTML = html;
} else {
document.getElementById('accordion').innerHTML = '';
html = buildAccordion(searchArr);
document.getElementById('accordion').innerHTML = html;
}
const Accordion = function (el, multiple) {
this.el = el || {};
this.multiple = multiple || false;
const links = this.el.find('.dd');
links.on('click', {el: this.el, multiple: this.multiple}, this.dropdown);
};
Accordion.prototype.dropdown = function (e) {
const $el = e.data.el;
$this = $(this), $next = $this.next();
$next.slideToggle();
$this.parent().toggleClass('open');
if (!e.data.multiple) {
$el.find('.submenu').not($next).slideUp("20").parent().removeClass('open');
}
};
new Accordion($('#accordion'), false);
}
}
function buildAccordion(apiData) {
let html = "";
let doc;
if (apiData.length > 0) {
for (let j = 0; j < apiData.length; j++) {
html += '<li class="open">';
html += ' <a class="dd" href="' + apiData[j].alias + '.html#header">' + apiData[j].order + '.&nbsp;' + apiData[j].desc + '</a>';
html += ' <ul class="sectlevel2" style="display: block">';
doc = apiData[j].list;
for (m = 0; m < doc.length; m++) {
html += '<li><a href="' + apiData[j].alias + '.html#_' + apiData[j].order + '_' + doc[m].order + '_' + doc[m].desc + '">' + apiData[j].order + '.' + doc[m].order + '.&nbsp;' + doc[m].desc + '</a> </li>';
}
html += '</ul>';
html += '</li>';
}
}
return html;
}

View File

@ -1,76 +1,102 @@
let api = [];
<%for(api in apiDocList){%>
api.push({
alias: '${api.alias}',
order: '${api.order}',
link: '${api.link}',
desc: '${api.desc}',
list: []
})
<%for(doc in api.list) {%>
api[${apiLP.dataIndex}].list.push({
order: '${doc.order}',
desc: '${doc.desc}',
});
<%}%>
<%}%>
document.onkeydown = keyDownSearch;
function keyDownSearch(e) {
let j;
let m;
let doc;
let html;
const theEvent = e || window.event;
const code = theEvent.keyCode || theEvent.which || theEvent.charCode;
if (code == 13) {
const search = document.getElementById('search');
const searchArr = [];
<%for(api in apiDocList){%>
searchArr.push({
alias: '${api.alias}',
order: '${api.order}',
desc: '${api.desc}',
list: []
})
api.push({
alias: '${api.alias}',
order: '${api.order}',
desc: '${api.desc}',
list: []
})
<%for (doc in api.list) {%>
api[${apiLP.dataIndex}].list.push({
order: '${doc.order}',
desc: '${doc.desc}',
});
if ('${doc.desc}'.indexOf(search.value) > -1) {
searchArr[${apiLP.dataIndex}].list.push({
order: '${doc.order}',
desc: '${doc.desc}',
});
}
<%}%>
<%}%>
const searchResult = searchArr.filter(obj => obj.list.length > 0);
if (searchResult.length > 0) {
html = '';
for (j = 0; j < searchResult.length; j++) {
html += '<li class="open">';
html += ' <a class="dd" href="#_' + searchResult[j].desc + '">' + searchResult[j].order + '.&nbsp;' + searchResult[j].desc + '</a>';
html += ' <ul class="sectlevel2" style="display: block">';
doc = searchResult[j].list;
for (m = 0; m < doc.length; m++) {
html += '<li><a href="#_' + searchResult[j].order + '_' + doc[m].order + '_' + doc[m].desc + '">' + searchResult[j].order + '.' + doc[m].order + '.&nbsp;' + doc[m].desc + '</a> </li>';
const searchValue = search.value;
let searchArr = [];
for (let i = 0; i < api.length; i++) {
let apiData = api[i];
const desc = apiData.desc;
if (desc.indexOf(searchValue) > -1) {
searchArr.push({
order: apiData.order,
desc: apiData.desc,
link: apiData.link,
list: apiData.list
});
} else {
let methodList = apiData.list || [];
let methodListTemp = [];
for (let j = 0; j < methodList.length; j++) {
const methodData = methodList[j];
const methodDesc = methodData.desc;
if (methodDesc.indexOf(searchValue) > -1) {
methodListTemp.push(methodData);
break;
}
}
if (methodListTemp.length > 0) {
const data = {
order: apiData.order,
desc: apiData.desc,
link: apiData.link,
list: methodListTemp
};
searchArr.push(data);
}
html += '</ul>';
html += '</li>';
}
}
let html;
if (searchValue == '') {
html = buildAccordion(api);
console.log(html);
document.getElementById('accordion').innerHTML = html;
} else {
if (search.value == '') {
html = '';
for (j = 0; j < api.length; j++) {
html += '<li class="open">';
html += ' <a class="dd" href="#_' + api[j].desc + '">' + api[j].order + '.&nbsp;' + api[j].desc + '</a>';
html += ' <ul class="sectlevel2" style="display: block">';
doc = api[j].list;
for (m = 0; m < doc.length; m++) {
html += '<li><a href="#_' + searchResult[j].order + '_' + doc[m].order + '_' + doc[m].desc + '">' + searchResult[j].order + '.' + doc[m].order + '.&nbsp;' + doc[m].desc + '</a> </li>';
}
html += '</ul>';
html += '</li>';
}
document.getElementById('accordion').innerHTML = html;
} else {
document.getElementById('accordion').innerHTML = '';
html = buildAccordion(searchArr);
document.getElementById('accordion').innerHTML = html;
}
const Accordion = function (el, multiple) {
this.el = el || {};
this.multiple = multiple || false;
const links = this.el.find('.dd');
links.on('click', {el: this.el, multiple: this.multiple}, this.dropdown);
};
Accordion.prototype.dropdown = function (e) {
const $el = e.data.el;
$this = $(this), $next = $this.next();
$next.slideToggle();
$this.parent().toggleClass('open');
if (!e.data.multiple) {
$el.find('.submenu').not($next).slideUp("20").parent().removeClass('open');
}
};
new Accordion($('#accordion'), false);
}
}
function buildAccordion(apiData) {
let html = "";
let doc;
if (apiData.length > 0) {
for (let j = 0; j < apiData.length; j++) {
html += '<li class="open">';
html += ' <a class="dd" href="#_' + apiData[j].link + '">' + apiData[j].order + '.&nbsp;' + apiData[j].desc + '</a>';
html += ' <ul class="sectlevel2" style="display: block">';
doc = apiData[j].list;
for (let m = 0; m < doc.length; m++) {
html += '<li><a href="#_' + apiData[j].order + '_' + doc[m].order + '_' + doc[m].desc + '">' + apiData[j].order + '.' + doc[m].order + '.&nbsp;' + doc[m].desc + '</a> </li>';
}
html += '</ul>';
html += '</li>';
}
}
return html;
}

View File

@ -1 +0,0 @@
body{margin:0;padding:0;height:auto;bottom:0;top:0;left:0;right:0;font-size:1rem;line-height:1.42857;overflow-x:hidden;background:inherit;tab-size:4}.margin-tb-zero,.markdown-body ol ol,.markdown-body ul ol,.markdown-body ol ul,.markdown-body ul ul,.markdown-body ol ul ol,.markdown-body ul ul ol,.markdown-body ol ul ul,.markdown-body ul ul ul{margin-top:0;margin-bottom:0}.markdown-body{font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px;color:#333;line-height:1.6;word-wrap:break-word;padding:45px;background:#fff;#border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;#max-width:55%;#margin-left:15%;border-radius:0 0 3px 3px;max-width:800px;margin:0 auto;padding:30px 30px 100px}.markdown-body>*:first-child{margin-top:0!important}.markdown-body>*:last-child{margin-bottom:0!important}.markdown-body *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:1em;margin-bottom:16px;font-weight:bold;line-height:1.4}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre{margin-top:0;margin-bottom:16px}.markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown-body h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown-body h3{font-size:1.5em;line-height:1.43}.markdown-body h4{font-size:1.25em}.markdown-body h5{font-size:1em}.markdown-body h6{font-size:1em;color:#777}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ul,.markdown-body ul ul{list-style-type:circle}.markdown-body ol ul ul,.markdown-body ul ul ul{list-style-type:square}.markdown-body ol{list-style-type:decimal}.markdown-body ul{list-style-type:disc}.markdown-body blockquote{margin-left:0;margin-right:0;padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown-body table{#display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all;border-collapse:collapse;border-spacing:0;text-align:left}thead{background-color:#f8f8f8}.markdown-body table tr{#background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid #ddd}.markdown-body pre{word-wrap:normal;padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;-webkit-border-radius:3px;border-radius:3px}.markdown-body pre code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;font-size:100%;line-height:inherit;word-wrap:normal;white-space:pre;border:0;-webkit-border-radius:3px;border-radius:3px;background-color:transparent}.markdown-body pre code:before,.markdown-body pre code:after{content:normal}.markdown-body code{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,0.04);-webkit-border-radius:3px;border-radius:3px}.markdown-body code:before,.markdown-body code:after{letter-spacing:-0.2em;content:"\00a0"}.markdown-body a{color:#4078c0;text-decoration:none;background:transparent}.markdown-body img{max-width:100%;max-height:100%;-webkit-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 0 10px #555;box-shadow:0 0 10px #555}.markdown-body strong{font-weight:bold}.markdown-body em{font-style:italic}.markdown-body del{text-decoration:line-through}.task-list-item{list-style-type:none}.task-list-item input{font:13px/1.4 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";margin:0 .35em .25em -1.6em;vertical-align:middle}.task-list-item input[disabled]{cursor:default}.task-list-item input[type="checkbox"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}.task-list-item input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}.markdown-body .page-footer{margin-top:45px;height:50px;border-top:1px solid #ccc;overflow:hidden;padding:10px 0;font-size:14px;color:gray}.markdown-body .footer-modification{float:right}.markdown-body .footer-modification a{text-decoration:none}

View File

@ -8,7 +8,7 @@
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<link rel="stylesheet" href="AllInOne.css?v=${version}"/>
<script src="https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
</head>
<body class="book toc2 toc-left">
<div id="header"><%if(isNotEmpty(projectName)){%><h1>${projectName}</h1><%}%>