I implemented the merge of the indexes.
Here is the script.
merge_searchindex.py
#!/usr/bin/env python
import json
import os
import shutil
import sys
import copy
import glob
PREFIX = 'Search.setIndex('
SUFFIX = ')'
def main(dirname):
indexes = {}
index_files = glob.glob(
os.path.join(dirname, '**', 'searchindex.js'), recursive=True)
for index_file in index_files:
index_file_orig = f'{index_file}.orig'
if os.path.exists(index_file_orig):
to_load = index_file_orig
else:
shutil.copyfile(index_file, index_file_orig)
to_load = index_file
indexes[index_file] = load_index(to_load)
for target_name, target in indexes.items():
target = copy.deepcopy(target)
for index_file, index in indexes.items():
if index_file != target_name:
prefix = os.path.relpath(
os.path.dirname(index_file),
os.path.dirname(target_name))
merge_index(target, index, prefix)
with open(target_name, 'w') as fp:
fp.write(PREFIX)
fp.write(json.dumps(target))
fp.write(SUFFIX)
def load_index(filename):
with open(filename, 'r') as fp:
content = fp.read()
return json.loads(content[len(PREFIX):-len(SUFFIX)])
def merge_index(target, index, prefix):
file_offset = len(target['filenames'])
obj_offset = len(target['objnames'])
for filename in index['filenames']:
target['filenames'].append(os.path.join(prefix, filename))
for docname in index['docnames']:
target['docnames'].append(os.path.join(prefix, docname))
for title in index['titles']:
target['titles'].append(title)
for title, titles in index['alltitles'].items():
for file, id in titles:
target['alltitles'].setdefault(title, []).append(
[file + file_offset, id])
for entry, entries in index['indexentries'].items():
try:
for file, id, is_main in entries:
target['indexentries'].setdefault(entry, []).append(
[file + file_offset, id, is_main])
except ValueError:
for file, id in entries:
target['indexentries'].setdefault(entry, []).append(
[file + file_offset, id])
for key, value in index['objnames'].items():
target['objnames'][str(int(key) + obj_offset)] = value
for key, value in index['objtypes'].items():
target['objtypes'][str(int(key) + obj_offset)] = value
for object_, objects in index['objects'].items():
for file, obj, score, anchor, name in objects:
target['objects'].setdefault(object_, []).append(
[file + file_offset, obj + obj_offset, score, anchor, name])
for word, files in index['terms'].items():
if not isinstance(files, list):
files = [files]
if not isinstance(target['terms'].setdefault(word, []), list):
target['terms'][word] = [target['terms'][word]]
for file in files:
target['terms'][word].append(file + file_offset)
for word, files in index['titleterms'].items():
if not isinstance(files, list):
files = [files]
if not isinstance(target['titleterms'].setdefault(word, []), list):
target['titleterms'][word] = [target['titleterms'][word]]
for file in files:
target['titleterms'][word].append(file + file_offset)
if __name__ == '__main__':
try:
dirname = sys.argv[1]
except IndexError:
dirname = '.'
main(dirname)
It is hosted on the server and backup like the others.
It should be available in the next days after nightly rebuild and CDN refresh.
I also created Use base URL as logo link and include homepage in TOC (!2203) · Merge requests · Tryton / Tryton · GitLab to unify the navigation.