Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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,
        )
Example #5
0
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()