def unindex_content(object, event): """ Unindex content (an IObjectWillBeRemovedEvent subscriber) """ catalog = find_catalog(object) if catalog is not None: path = resource_path(object) num, docids = catalog.search(path=path) for docid in docids: catalog.unindex_doc(docid) catalog.document_map.remove_docid(docid)
def reindex_content(object, event): """ Reindex a single piece of content (non-recursive); an IObjectModifed event subscriber """ catalog = find_catalog(object) if catalog is not None: path = resource_path(object) docid = catalog.document_map.docid_for_address(path) catalog.reindex_doc(docid, object) catalog.document_map.remove_metadata(docid) adapter = queryAdapter(object, IMetadata) if adapter is not None: metadata = adapter() catalog.document_map.add_metadata(docid, metadata)
def index_content(object, event): """ Index content (an IObjectAddedEvent subscriber) """ catalog = find_catalog(object) if catalog is not None: for node in postorder(object): if is_content(object): path = resource_path(node) docid = catalog.document_map.add(path) catalog.index_doc(docid, node) adapter = queryAdapter(node, IMetadata) if adapter is not None: metadata = adapter() catalog.document_map.add_metadata(docid, metadata)
def searchresults(context, request): catalog = find_catalog(context) text = request.params.get('text') batch_size = int(request.params.get('batch_size', 20)) batch_start = int(request.params.get('batch_start', 0)) sort_index = request.params.get('sort_index', None) reverse = bool(request.params.get('reverse', False)) message = '' if text is not None: if text: try: numdocs, docids = catalog.search(sort_index=sort_index, reverse=reverse, text=text) docids = list(docids) except ParseError: numdocs, docids = 0, [] else: numdocs, docids = 0, [] message = 'Bad query' else: numdocs, docids = 0, [] i = 0 batch = [] if numdocs > 0: for docid in docids: i += 1 if i > batch_start+ batch_size: break if i < batch_start: continue path = catalog.document_map.address_for_docid(docid) md = dict(catalog.document_map.get_metadata(docid)) if path.startswith('sphinx:'): scheme, rest = path.split(':', 1) if text.lower() in md['text'].lower(): firstpos = md['text'].lower().find(text.lower()) else: firstpos = 0 start = firstpos -150 if start < 0: start = 0 teaser = '%s ...' % md['text'][start:start+300] md['url'] = rest md['teaser'] = teaser else: model = find_model(context, path) url = resource_url(model, request) md['url'] = url batch.append(md) def _batchURL(query, batch_start=0): query['batch_start'] = batch_start return resource_url(context, request, request.view_name, query=query) batch_info = {} previous_start = batch_start - batch_size if previous_start < 0: previous_batch_info = None else: previous_end = previous_start + batch_size if previous_end > numdocs: previous_end = numdocs size = previous_end - previous_start previous_batch_info = {} query = {'text':text, 'reverse':reverse, 'batch_size':batch_size} previous_batch_info['url'] = _batchURL(query, previous_start) previous_batch_info['name'] = ( 'Previous %s entries (%s - %s)' % (size, previous_start+1, previous_end)) batch_info['previous_batch'] = previous_batch_info next_start = batch_start + batch_size if next_start >= numdocs: next_batch_info = None else: next_end = next_start + batch_size if next_end > numdocs: next_end = numdocs size = next_end - next_start next_batch_info = {} query = {'text':text, 'reverse':reverse, 'batch_size':batch_size} next_batch_info['url'] = _batchURL(query, next_start) next_batch_info['name'] = ( 'Next %s entries (%s - %s of %s)' % (size, next_start+1, next_end, numdocs)) batch_info['next_batch'] = next_batch_info batch_info['batching_required'] = next_batch_info or previous_batch_info return dict( api = API(context, request), batch = batch, batch_info = batch_info, numdocs = numdocs, message = message, )
def main(argv=sys.argv): config = None if len(argv) > 1: config = sys.argv[1] if not config: # we assume that the console script lives in the 'bin' dir of a # sandbox or buildout, and that the .ini file lives in the 'etc' # directory of the sandbox or buildout me = sys.argv[0] me = os.path.abspath(me) sandbox = os.path.dirname(os.path.dirname(me)) config = os.path.join(sandbox, "marlton.ini") exe = sys.executable sandbox = os.path.dirname(os.path.dirname(os.path.abspath(exe))) app = get_app(config, name="website") app_root, closer = get_root(app) catalog = find_catalog(app_root) for address in list(catalog.document_map.address_to_docid.keys()): if address.startswith("external:") or address.startswith("sphinx:"): docid = catalog.document_map.address_to_docid[address] catalog.unindex_doc(docid) catalog.document_map.remove_address(address) settings = get_current_registry().settings docroot = settings["sphinx_docroot"] roots = settings["sphinx_roots"] oldcwd = os.getcwd() for root in roots: package_dir = roots[root]["package_dir"] docs_subpath = roots[root]["docs_subpath"] url_prefix = roots[root]["url_prefix"] virtual_home = os.path.join(docroot, root) os.system("%s/bin/virtualenv --no-site-packages %s" % (sys.prefix, virtual_home)) os.system("%s/bin/easy_install Sphinx" % virtual_home) os.system("%s/bin/easy_install docutils" % virtual_home) os.system("%s/bin/easy_install repoze.sphinx.autointerface" % virtual_home) try: os.chdir(package_dir) os.system("%s/bin/python setup.py develop" % virtual_home) finally: os.chdir(oldcwd) docs_source = os.path.join(package_dir, docs_subpath) os.system( "%s/bin/sphinx-build -b html -d %s/doctrees " "%s %s/html" % (virtual_home, virtual_home, docs_source, virtual_home) ) os.system( "%s/bin/sphinx-build -b text -d %s/doctrees " "%s %s/text" % (virtual_home, virtual_home, docs_source, virtual_home) ) textpath = "%s/text/" % virtual_home gen = os.walk(textpath) for path, directories, files in gen: relpath = path[len(textpath) :] for filename in files: if filename.endswith(".txt"): text = open(os.path.join(path, filename)).read() text = text.decode("utf-8") ob = SphinxDocument(text) filename_no_ext = filename[:-4] path_info = os.path.join(relpath, filename_no_ext) address = "sphinx:%s/%s.html" % (url_prefix, path_info) docid = catalog.document_map.add(address) catalog.index_doc(docid, ob) data = {"title": filename_no_ext, "type": "Documentation", "text": text} catalog.document_map.add_metadata(docid, data) transaction.commit()