forked from Mirrors/openclonk
docs: Implement client-side search
Search is now performed with a pre-computed index file. This commit removes the old PHP-based search.master
parent
6aa72c1bdd
commit
f4c854b651
|
@ -18,7 +18,7 @@ C4Version.h
|
||||||
Makefile
|
Makefile
|
||||||
C4Include.h.gch
|
C4Include.h.gch
|
||||||
intermediate
|
intermediate
|
||||||
build*
|
/build*
|
||||||
CMakeScripts
|
CMakeScripts
|
||||||
CMakeFiles
|
CMakeFiles
|
||||||
CMakeCache.txt
|
CMakeCache.txt
|
||||||
|
@ -35,13 +35,15 @@ tests/CTestTestfile.cmake
|
||||||
|
|
||||||
# Documentation
|
# Documentation
|
||||||
*.pyc
|
*.pyc
|
||||||
docs/online
|
node_modules
|
||||||
docs/chm
|
/docs/online
|
||||||
docs/sdk-de
|
/docs/chm
|
||||||
docs/sdk/content.xml
|
/docs/sdk-de
|
||||||
docs/*.mo
|
/docs/sdk/content.xml
|
||||||
docs/doku.pot
|
/docs/*.mo
|
||||||
docs/Functions.txt
|
/docs/doku.pot
|
||||||
|
/docs/Functions.txt
|
||||||
|
/docs/lunr.js
|
||||||
|
|
||||||
# Visual studio files
|
# Visual studio files
|
||||||
openclonk.opensdf
|
openclonk.opensdf
|
||||||
|
|
|
@ -19,6 +19,7 @@ HHC = hhc.exe
|
||||||
MKDIR_P = mkdir -p
|
MKDIR_P = mkdir -p
|
||||||
CP = cp
|
CP = cp
|
||||||
CP_R = cp -r
|
CP_R = cp -r
|
||||||
|
NODE = node
|
||||||
|
|
||||||
stylesheet = clonk.xsl
|
stylesheet = clonk.xsl
|
||||||
|
|
||||||
|
@ -29,9 +30,10 @@ sdk-dirs := $(shell find sdk -name '.*' -prune -o -type d -print)
|
||||||
|
|
||||||
# find all *.xml files recursively in sdk/
|
# find all *.xml files recursively in sdk/
|
||||||
xmlfiles := $(sort $(shell find sdk -name '.*' -prune -o -name 'content.xml' -prune -o -name \*.xml -print))
|
xmlfiles := $(sort $(shell find sdk -name '.*' -prune -o -name 'content.xml' -prune -o -name \*.xml -print))
|
||||||
|
xmlfiles-de := $(subst sdk, sdk-de, $(xmlfiles))
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
extra-files := $(sort $(wildcard *.css *.php *.js images/*.*))
|
extra-files := $(sort $(wildcard *.css *.js images/*.*) lunr.js)
|
||||||
extra-files-chm := $(sort $(wildcard *.css *.js images/*.*))
|
extra-files-chm := $(sort $(wildcard *.css *.js images/*.*))
|
||||||
|
|
||||||
# Targets:
|
# Targets:
|
||||||
|
@ -46,15 +48,16 @@ sdk-de-dirs := $(subst sdk, sdk-de, $(sdk-dirs))
|
||||||
online-dirs := $(foreach lang, en de, $(addprefix online/$(lang)/, $(sdk-dirs) images))
|
online-dirs := $(foreach lang, en de, $(addprefix online/$(lang)/, $(sdk-dirs) images))
|
||||||
online-sdk-files := $(foreach lang, en de, $(addprefix online/$(lang)/, $(htmlfiles) sdk/content.html))
|
online-sdk-files := $(foreach lang, en de, $(addprefix online/$(lang)/, $(htmlfiles) sdk/content.html))
|
||||||
online-extra-files := $(foreach lang, en de, $(addprefix online/$(lang)/, $(extra-files)))
|
online-extra-files := $(foreach lang, en de, $(addprefix online/$(lang)/, $(extra-files)))
|
||||||
|
online-index-files := $(foreach lang, en de, $(addprefix online/$(lang)/, index.json))
|
||||||
|
|
||||||
# For Entwickler.chm
|
# For Entwickler.chm
|
||||||
chm-dirs := $(foreach lang, en de, $(addprefix chm/$(lang)/, . $(sdk-dirs) images))
|
chm-dirs := $(foreach lang, en de, $(addprefix chm/$(lang)/, . $(sdk-dirs) images))
|
||||||
|
|
||||||
.PHONY: all online-en chm install check clean
|
.PHONY: all online-en chm install check clean
|
||||||
|
|
||||||
all: $(sdk-de-dirs) $(online-dirs) $(online-sdk-files) $(online-extra-files)
|
all: $(sdk-de-dirs) $(online-dirs) $(online-sdk-files) $(online-extra-files) $(online-index-files)
|
||||||
|
|
||||||
online-en: $(addprefix online/en/, $(sdk-dirs) images $(htmlfiles) sdk/content.html $(extra-files))
|
online-en: $(addprefix online/en/, $(sdk-dirs) images $(htmlfiles) sdk/content.html $(extra-files) index.json)
|
||||||
|
|
||||||
chm: $(sdk-de-dirs) $(chm-dirs) chm/en/Developer.chm chm/de/Entwickler.chm
|
chm: $(sdk-de-dirs) $(chm-dirs) chm/en/Developer.chm chm/de/Entwickler.chm
|
||||||
|
|
||||||
|
@ -69,23 +72,36 @@ clean:
|
||||||
rm -f *.mo Entwickler.chm Developer.chm doku.pot sdk/content.xml
|
rm -f *.mo Entwickler.chm Developer.chm doku.pot sdk/content.xml
|
||||||
rm -rf online sdk-de chm
|
rm -rf online sdk-de chm
|
||||||
|
|
||||||
sdk/content.xml: sdk/content.xml.in $(xmlfiles) build_contents.py experimental.py
|
sdk/content.xml: sdk/content.xml.in $(xmlfiles) tools/build_contents.py tools/experimental.py
|
||||||
@echo generate $@
|
@echo generate $@
|
||||||
@python2 build_contents.py $(xmlfiles)
|
@python2 tools/build_contents.py $(xmlfiles)
|
||||||
|
|
||||||
chm/en/Output.hhp: $(xmlfiles) chm/en/. build_hhp.py Template.hhp
|
# Node dependencies for index.
|
||||||
|
node_modules/.make: package.json
|
||||||
|
npm install
|
||||||
|
@touch $@
|
||||||
|
|
||||||
|
lunr.js: node_modules/.make
|
||||||
|
$(CP) node_modules/lunr/lunr.js $@
|
||||||
|
|
||||||
|
online/en/index.json: node_modules/.make $(xmlfiles) tools/build_index.js
|
||||||
|
@$(NODE) tools/build_index.js $@ $(xmlfiles)
|
||||||
|
online/de/index.json: node_modules/.make $(xmlfiles-de) tools/build_index.js
|
||||||
|
@$(NODE) tools/build_index.js $@ $(xmlfiles-de)
|
||||||
|
|
||||||
|
chm/en/Output.hhp: $(xmlfiles) chm/en/. tools/build_hhp.py Template.hhp
|
||||||
@echo generate $@
|
@echo generate $@
|
||||||
@python2 build_hhp.py $@ Template.hhp $(xmlfiles)
|
@python2 tools/build_hhp.py $@ Template.hhp $(xmlfiles)
|
||||||
chm/de/Output.hhp: $(xmlfiles) chm/de/. build_hhp.py Template.de.hhp
|
chm/de/Output.hhp: $(xmlfiles) chm/de/. tools/build_hhp.py Template.de.hhp
|
||||||
@echo generate $@
|
@echo generate $@
|
||||||
@python2 build_hhp.py $@ Template.de.hhp $(xmlfiles)
|
@python2 tools/build_hhp.py $@ Template.de.hhp $(xmlfiles)
|
||||||
|
|
||||||
$(sdk-de-dirs) $(online-dirs) $(chm-dirs):
|
$(sdk-de-dirs) $(online-dirs) $(chm-dirs):
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
|
|
||||||
doku.pot: $(xmlfiles) extra-strings.xml sdk/content.xml.in xml2po.py clonk.py
|
doku.pot: $(xmlfiles) extra-strings.xml sdk/content.xml.in tools/xml2po.py tools/clonk.py
|
||||||
@echo extract strings to $@
|
@echo extract strings to $@
|
||||||
@python2 xml2po.py -e -m clonk -o $@ $(xmlfiles) extra-strings.xml sdk/content.xml.in
|
@python2 tools/xml2po.py -e -m clonk -o $@ $(xmlfiles) extra-strings.xml sdk/content.xml.in
|
||||||
|
|
||||||
%.po: doku.pot
|
%.po: doku.pot
|
||||||
@echo update $@
|
@echo update $@
|
||||||
|
@ -96,9 +112,9 @@ doku.pot: $(xmlfiles) extra-strings.xml sdk/content.xml.in xml2po.py clonk.py
|
||||||
@echo compile $@
|
@echo compile $@
|
||||||
@msgfmt --statistics -o $@ $<
|
@msgfmt --statistics -o $@ $<
|
||||||
|
|
||||||
sdk-de/%.xml: sdk/%.xml de.mo xml2po.py clonk.py
|
sdk-de/%.xml: sdk/%.xml de.mo tools/xml2po.py tools/clonk.py
|
||||||
@echo generate $@
|
@echo generate $@
|
||||||
@python2 xml2po.py -e -m clonk -t de.mo -o $@ $<
|
@python2 tools/xml2po.py -e -m clonk -t de.mo -o $@ $<
|
||||||
|
|
||||||
define run-xslt
|
define run-xslt
|
||||||
@echo generate $@
|
@echo generate $@
|
||||||
|
|
|
@ -35,7 +35,12 @@
|
||||||
</title>
|
</title>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
<xsl:template match="script">
|
<xsl:template match="script">
|
||||||
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
|
<xsl:copy>
|
||||||
|
<xsl:for-each select="@*">
|
||||||
|
<xsl:copy />
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:apply-templates />
|
||||||
|
</xsl:copy>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
<xsl:template match="func|const" mode="head">
|
<xsl:template match="func|const" mode="head">
|
||||||
<xsl:apply-templates mode="head" />
|
<xsl:apply-templates mode="head" />
|
||||||
|
@ -349,16 +354,6 @@
|
||||||
<caption><xsl:apply-templates select="@id|node()" /></caption>
|
<caption><xsl:apply-templates select="@id|node()" /></caption>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
|
|
||||||
<xsl:template match="search">
|
|
||||||
<xsl:if test="not($chm)">
|
|
||||||
<form action="../search.php" method="get">
|
|
||||||
<input name="search" type="text"></input>
|
|
||||||
<input type="submit" name="func" value="Search"></input>
|
|
||||||
<input type="submit" name="fulltext" value="Fulltext"></input>
|
|
||||||
</form>
|
|
||||||
</xsl:if>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template match="table/bitmask">
|
<xsl:template match="table/bitmask">
|
||||||
<xsl:value-of select="." />:
|
<xsl:value-of select="." />:
|
||||||
<input id="input" onKeyUp="Calc();" name="input" type="text">
|
<input id="input" onKeyUp="Calc();" name="input" type="text">
|
||||||
|
|
2131
docs/de.po
2131
docs/de.po
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +1,7 @@
|
||||||
@font-face{
|
@font-face{
|
||||||
font-family: Endeavour;
|
font-family: Endeavour;
|
||||||
src: url('/Endeavour.eot');
|
/*src: url('/Endeavour.eot');
|
||||||
src: local('Endeavour'),url('/Endeavour.ttf') format("truetype");
|
src: local('Endeavour'),url('/Endeavour.ttf') format("truetype");*/
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
@ -243,10 +243,6 @@ ul.nav a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.nav a:hover, ul.nav a:hover {
|
|
||||||
background: #333 url(images/stripe-wide.gif) left repeat-x;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.nav li.switchlang img {
|
ul.nav li.switchlang img {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
{
|
||||||
|
"name": "openclonk-docs",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"requires": true,
|
||||||
|
"dependencies": {
|
||||||
|
"lunr": {
|
||||||
|
"version": "2.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.1.6.tgz",
|
||||||
|
"integrity": "sha512-ydJpB8CX8cZ/VE+KMaYaFcZ6+o2LruM6NG76VXdflYTgluvVemz1lW4anE+pyBbLvxJHZdvD1Jy/fOqdzAEJog=="
|
||||||
|
},
|
||||||
|
"sax": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
|
||||||
|
},
|
||||||
|
"xml2js": {
|
||||||
|
"version": "0.4.19",
|
||||||
|
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
|
||||||
|
"integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
|
||||||
|
"requires": {
|
||||||
|
"sax": "1.2.4",
|
||||||
|
"xmlbuilder": "9.0.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xmlbuilder": {
|
||||||
|
"version": "9.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
|
||||||
|
"integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"name": "openclonk-docs",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Developer documentation for OpenClonk",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/openclonk/openclonk.git"
|
||||||
|
},
|
||||||
|
"author": "The OpenClonk Team",
|
||||||
|
"license": "ISC",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/openclonk/openclonk/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/openclonk/openclonk#readme",
|
||||||
|
"dependencies": {
|
||||||
|
"lunr": "^2.1.6",
|
||||||
|
"xml2js": "^0.4.19"
|
||||||
|
}
|
||||||
|
}
|
|
@ -211,6 +211,10 @@
|
||||||
window.scrollTo(0, y0);
|
window.scrollTo(0, y0);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
// Collapse the index.
|
||||||
|
document.querySelector('.index > img').onclick();
|
||||||
]]>
|
]]>
|
||||||
</script>
|
</script>
|
||||||
|
<script src="../lunr.js"></script>
|
||||||
|
<script src="../search.js"></script>
|
||||||
</toc>
|
</toc>
|
||||||
|
|
|
@ -13,8 +13,6 @@
|
||||||
<h>Get started</h>
|
<h>Get started</h>
|
||||||
<text><emlink href="files.html">Game data</emlink> - Get an overview over the game data needed for the creation of custom game content.</text>
|
<text><emlink href="files.html">Game data</emlink> - Get an overview over the game data needed for the creation of custom game content.</text>
|
||||||
<text><emlink href="script/index.html">C4Script</emlink> - View the introduction to the script language C4Script.</text>
|
<text><emlink href="script/index.html">C4Script</emlink> - View the introduction to the script language C4Script.</text>
|
||||||
<h>Search the documentation</h>
|
|
||||||
<search/>
|
|
||||||
</part>
|
</part>
|
||||||
<author>Newton</author><date>2011-08</date>
|
<author>Newton</author><date>2011-08</date>
|
||||||
</doc>
|
</doc>
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
(function() {
|
||||||
|
'use strict'
|
||||||
|
fetch('../index.json').then(r => r.json()).then(data => {
|
||||||
|
var index = lunr.Index.load(data.index)
|
||||||
|
var titles = data.titles
|
||||||
|
|
||||||
|
var toc = document.getElementById('toc')
|
||||||
|
var searchWrapper = document.createElement('div')
|
||||||
|
searchWrapper.innerHTML = `
|
||||||
|
Search: <input type="search">
|
||||||
|
<ul class="results">
|
||||||
|
</ul>
|
||||||
|
`
|
||||||
|
toc.insertBefore(searchWrapper, toc.querySelector('.contents'))
|
||||||
|
var searchInput = searchWrapper.querySelector('input[type=search]')
|
||||||
|
var resultsList = searchWrapper.querySelector('.results')
|
||||||
|
searchInput.addEventListener('change', doSearch)
|
||||||
|
|
||||||
|
// Allow specifying search query via query parameter.
|
||||||
|
var m = window.top.location.search.match(/[?&]q=([^&]+)/)
|
||||||
|
if (m) {
|
||||||
|
searchInput.value = m[1]
|
||||||
|
doSearch()
|
||||||
|
}
|
||||||
|
|
||||||
|
function doSearch() {
|
||||||
|
var searchTerm = searchInput.value.trim()
|
||||||
|
var html = ''
|
||||||
|
if (searchTerm) {
|
||||||
|
html = search(index, searchInput.value).map(result => `<li><a href='${result.ref}'>${titles[result.ref]}</a></li>`).join('\n')
|
||||||
|
if (!html) html = `<li><em>No results</em></li>`
|
||||||
|
}
|
||||||
|
resultsList.innerHTML = html
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
function search(index, searchTerm) {
|
||||||
|
return index.query(query => {
|
||||||
|
searchTerm.split(/\s+/).forEach(term => {
|
||||||
|
query.term(term, {
|
||||||
|
fields: ["title"],
|
||||||
|
boost: 10,
|
||||||
|
wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING,
|
||||||
|
})
|
||||||
|
query.term(term, {
|
||||||
|
fields: ["body"],
|
||||||
|
editDistance: 1,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})()
|
174
docs/search.php
174
docs/search.php
|
@ -1,174 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
//parameters: $_GET('func')
|
|
||||||
|
|
||||||
//search?
|
|
||||||
if(isset($_GET['search']))
|
|
||||||
{
|
|
||||||
if(strlen($_GET['search']) < 3) {
|
|
||||||
$less = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(isset($_GET['func'])) {
|
|
||||||
$path = "sdk/script/fn/";
|
|
||||||
$search = strtolower($_GET['search']);
|
|
||||||
$result = array();
|
|
||||||
|
|
||||||
|
|
||||||
$dir = opendir($path);
|
|
||||||
//search
|
|
||||||
while (($item = readdir($dir)) !== FALSE)
|
|
||||||
{
|
|
||||||
$name = substr($item,0,strpos($item,'.'));
|
|
||||||
if ("." != $item && ".." != $item
|
|
||||||
&& (strpos(strtolower($name), $search) !== FALSE)
|
|
||||||
&& !is_dir($path.$item))
|
|
||||||
{
|
|
||||||
// exact match -> redirect
|
|
||||||
if ($search == strtolower($name))
|
|
||||||
{
|
|
||||||
header("Location: $path$item");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
array_push($result,array($path,$item));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$showresults = 1;
|
|
||||||
}
|
|
||||||
elseif(isset($_GET['fulltext'])) {
|
|
||||||
$result = SearchDir('sdk/');
|
|
||||||
$showresults = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function SearchDir($path) {
|
|
||||||
if(!$dir = opendir($path))
|
|
||||||
return;
|
|
||||||
|
|
||||||
$result = array();
|
|
||||||
$search = strtolower($_GET['search']);
|
|
||||||
|
|
||||||
while (false !== ($file = readdir($dir))) {
|
|
||||||
if ($file != "." && $file != "..") {
|
|
||||||
if(is_dir($path.$file))
|
|
||||||
$result = array_merge($result, SearchDir($path.$file.'/'));
|
|
||||||
else {
|
|
||||||
// HTML-Dokument auslesen
|
|
||||||
$doc = new DOMDocument();
|
|
||||||
@$doc->loadHTMLFile($path.$file);
|
|
||||||
$divs = $doc->getElementsByTagName('div');
|
|
||||||
foreach($divs as $div) {
|
|
||||||
if(strpos($div->getAttribute('class'), 'text') !== false) {
|
|
||||||
if(strpos(strtolower(strip_tags($div->nodeValue)),htmlspecialchars($search)) !== false) {
|
|
||||||
$dirname = basename(rtrim($path, '/'));
|
|
||||||
if(!isset($result[$dirname]))
|
|
||||||
$result[$dirname] = array();
|
|
||||||
|
|
||||||
$name = $doc->getElementsByTagName('h1')->item(0)->nodeValue;
|
|
||||||
array_push($result[$dirname], array($path.$file,$name));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
closedir($dir);
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
$lang = basename(dirname(__FILE__));
|
|
||||||
?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="doku.css">
|
|
||||||
<link rel="stylesheet" type="text/css" href="https://www.openclonk.org/header/header.css">
|
|
||||||
<title>OpenClonk <?php echo $lang == 'de' ? 'Referenz' : 'Reference' ?></title>
|
|
||||||
<style>
|
|
||||||
ul {
|
|
||||||
list-style-position: inside;
|
|
||||||
list-style-image: url(images/bullet_sheet.png);
|
|
||||||
}
|
|
||||||
ul a {
|
|
||||||
color: navy;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
ul a.visited {
|
|
||||||
color: navy;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<?php
|
|
||||||
readfile("https://www.openclonk.org/header/header.html");
|
|
||||||
?>
|
|
||||||
<div id="iframe"><iframe src="sdk/content.html"></iframe></div>
|
|
||||||
<div id="content">
|
|
||||||
<h1><?php print ($lang == 'de' ? 'Suche' : 'Search'); ?></h1>
|
|
||||||
<div class="text">
|
|
||||||
<form action="search.php" method="get">
|
|
||||||
<?php
|
|
||||||
echo ' <input type="text" name="search"';
|
|
||||||
if (isset($_GET['search'])) echo ' value="' . htmlspecialchars($_GET['search']) . '"';
|
|
||||||
echo '> ';
|
|
||||||
echo '<input type="submit" name="func" value="' . ($lang == 'de' ? 'Suche' : 'Search') . '"> ';
|
|
||||||
echo '<input type="submit" name="fulltext" value="' . ($lang == 'de' ? 'Volltext' : 'Fulltext') . '">';
|
|
||||||
?>
|
|
||||||
</form>
|
|
||||||
<?php
|
|
||||||
if($less) {
|
|
||||||
echo $lang == 'de' ? 'Mindestens 3 Zeichen.' : '3 characters minimum.';
|
|
||||||
}
|
|
||||||
|
|
||||||
$dirtrans = array('de' => array('sdk' => 'Dokumentation', 'script' => 'Script', 'fn' => 'Funktionen', 'scenario' => 'Szenario', 'particle' => 'Partikel', 'material' => 'Material', 'folder' => 'Rundenordner', 'definition' => 'Objektdefinition'),
|
|
||||||
'en' => array('sdk' => 'Documentation', 'script' => 'Script', 'fn' => 'Functions', 'scenario' => 'Scenario', 'particle' => 'Particle', 'material' => 'Material', 'folder' => 'Folder', 'definition' => 'Definition'));
|
|
||||||
//nothing found
|
|
||||||
if($showresults == 1) {
|
|
||||||
if (count($result) == 0)
|
|
||||||
{
|
|
||||||
echo $lang == 'de' ? 'Es wurde keine Funktion gefunden.' : 'No function found.';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
echo "<ul>\n";
|
|
||||||
for($i = 0; $i < count($result); ++$i)
|
|
||||||
{
|
|
||||||
$item = $result[$i][1];
|
|
||||||
if(!$name = $result[$i][2])
|
|
||||||
$name = substr($item,0,strpos($item,'.'));
|
|
||||||
$path = $result[$i][0];
|
|
||||||
echo "<li><a href=\"$path$item\">$name</a></li>\n";
|
|
||||||
}
|
|
||||||
echo "</ul>\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elseif($showresults == 2) {
|
|
||||||
if (count($result) == 0)
|
|
||||||
{
|
|
||||||
echo $lang == 'de' ? 'Nichts gefunden.' : 'Nothing found.';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
foreach($result as $dirname => $values) {
|
|
||||||
$dirname = $dirtrans[$lang][$dirname];
|
|
||||||
echo "<b>$dirname</b>\n";
|
|
||||||
echo "<ul>\n";
|
|
||||||
foreach($values as $val)
|
|
||||||
{
|
|
||||||
$item = $val[0];
|
|
||||||
$name = $val[1];
|
|
||||||
echo "<li><a href=\"$item\">$name</a></li>\n";
|
|
||||||
}
|
|
||||||
echo "</ul>\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body></html>
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const lunr = require('lunr')
|
||||||
|
const xml2js = require('xml2js')
|
||||||
|
const fs = require('fs')
|
||||||
|
|
||||||
|
if (process.argv.length < 4) {
|
||||||
|
console.log(`Usage: ${__filename} <output> <files...>`)
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
const outfile = process.argv[2]
|
||||||
|
const files = process.argv.slice(3)
|
||||||
|
|
||||||
|
let builder = new lunr.Builder()
|
||||||
|
builder.pipeline.add(
|
||||||
|
lunr.trimmer,
|
||||||
|
lunr.stopWordFilter,
|
||||||
|
lunr.stemmer
|
||||||
|
)
|
||||||
|
|
||||||
|
builder.ref('path')
|
||||||
|
builder.field('title')
|
||||||
|
builder.field('body')
|
||||||
|
|
||||||
|
function extractText(obj) {
|
||||||
|
if (typeof obj == 'string') return obj
|
||||||
|
let result = ''
|
||||||
|
for (let o of Array.isArray(obj) ? obj : Object.values(obj)) {
|
||||||
|
result += extractText(o) + '\n'
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
let titles = {}
|
||||||
|
for (let file of files) {
|
||||||
|
let contents = fs.readFileSync(file)
|
||||||
|
let xml;
|
||||||
|
xml2js.parseString(contents, {async: false}, (err, result) => {
|
||||||
|
if (err) { console.error(file, err); process.exit(1) }
|
||||||
|
xml = result
|
||||||
|
})
|
||||||
|
// sdk/script/fn/Explode.xml => script/fn/Explode.html
|
||||||
|
let doc = {path: file.replace(/^.*sdk(-de)?\//, '').slice(0, -3) + 'html'}
|
||||||
|
if ('doc' in xml) {
|
||||||
|
doc.title = xml.doc.title.toString()
|
||||||
|
doc.body = extractText(xml.doc)
|
||||||
|
} else if ('funcs' in xml) {
|
||||||
|
let fn = 'func' in xml.funcs ? xml.funcs.func[0] : xml.funcs.const[0]
|
||||||
|
doc.title = fn.title.toString()
|
||||||
|
doc.body = fn.desc.toString()
|
||||||
|
}
|
||||||
|
builder.add(doc)
|
||||||
|
titles[doc.path] = doc.title
|
||||||
|
}
|
||||||
|
|
||||||
|
let index = builder.build()
|
||||||
|
fs.writeFileSync(outfile, JSON.stringify({index, titles}))
|
Loading…
Reference in New Issue