#
# This is a Sphinx documentation tool extension which makes .only::
# directives be eagerly processed early in the parsing stage. This
# makes sure that content in .only:: blocks gets actually excluded
# as a typical user expects, instead of bits of information in
# these blocks leaking to documentation in various ways (e.g.,
# indexes containing entries for functions which are actually in
# .only:: blocks and thus excluded from documentation, etc.)
# Note that with this extension, you may need to completely
# rebuild a doctree when switching builders (i.e. completely
# remove _build/doctree dir between generation of HTML vs PDF
# documentation).
#
# This extension works by monkey-patching Sphinx core, so potentially
# may not work with untested Sphinx versions. It tested to work with
# 1.2.2 and 1.4.2
#
# Copyright (c) 2016 Paul Sokolovsky
# Based on idea by Andrea Cassioli:
# https://github.com/sphinx-doc/sphinx/issues/2150#issuecomment-171912290
#
# SPDX-License-Identifier: Apache-2.0
#
import sphinx
from docutils.parsers.rst import directives


class EagerOnly(sphinx.directives.other.Only):

    def run(self, *args):
        # Evaluate the condition eagerly, and if false return no nodes right away
        env = self.state.document.settings.env
        env.app.builder.tags.add('TRUE')

        if not env.app.builder.tags.eval_condition(self.arguments[0]):
            return []

        # Otherwise, do the usual processing
        nodes = super(EagerOnly, self).run()
        if len(nodes) == 1:
            nodes[0]['expr'] = 'TRUE'
        return nodes


def setup(app):
    directives.register_directive('only', EagerOnly)

    # The tags.add call above is setting tags.tags['TRUE'] = True.
    # The operation is idempotent and will have taken effect before
    # the next eval_condition() which may rely on it so this is thread
    # safe both for read and writes (all other operations are local to
    # the local nodes variable).
    return {
        'parallel_read_safe': True,
        'parallel_write_safe': True,
        }
