• Enable the root document to be excluded, and additional manual indexing control (#176, #177).


  • Fix a bug (#171) where some generated pages are missing a blank line (before the heading markup, after the backlink to the parent directory) resulting in warnings from sphinx (#172).


  • Fix a regression introduced by #159. Nested template specializations need to have their name extracted to be documented correctly, but the implementation checked for having the same number of < and >. This breaks operator overloading (#168). Skip asserting the same number of < and > when node.kind == "function" and operator is in See comments in (#169).


  • Fix sphinx-bootstrap-theme styling, the introduction of the page hierarchies broke the bootstrap tree for any project that does not use page. Solution is to only select / apply the treeview functions if the id anchors are found (#167).


  • Exhale requires python 3.7+ (#163).

  • Development (local and CI) now support doxygen 1.9.x. Additionally, fix parsing of function signatures where doxygen will erroneously create e.g., template <typenameC> rather than template <typename C> with a space needed. It does not happen with all typename, so the hack just replaces "typename" with "typename " and then replaces two spaces with one (#157).

  • Fix a bug where nested classes with specialized templates had the incorrect name being displayed (#156, fix: #159). Nodes with <> in their name (doxygen presents specialized templates in the name attribute) get tokenized and the various parameters extracted. As a result of fixing, exhale now has stronger capabilities to understand template parameters. Substantive testing framework overhaul was required, exhale may still not handle all templates correctly.

    Huge thanks to @florianhumblot for devising the strategy and spending time helping flesh this out.



  • Do not write source files for empty hierarchies (#134, #147).

  • Support specialized template functions (#117).

  • Prevent sphinx from processing files that are incorporated via a .. include:: directive by renaming them to .rst.include suffix (#136).

  • Add :project: {app.config.breathe_default_project} to every breathe directive to make the monkeypatch (#27) work (#139, #148).

  • Do not require containmentFolder to be a “direct” subdirectory of app.srcdir, allow any arbitrary subdirectory (#144).

  • Update how css and js are added using a dubious check into the sphinx internals before adding css / js to avoid duplicates (#144).


  • Use the correct PyPI name beautifulsoup4 rather than bs4 (#120).

  • Fix deprecated MutableMapping import for python 3.10 support (#124).

  • Enable parallel builds (use the right setup function…) (#126).

  • Add support for .. doxygenpage:: (#114). Huge thanks to:
    • @hidmic for the initial implementiation, and

    • @2bndy5 and @clalancette for their efforts in improving the doxygen-breathe-exhale-sphinx ecosystem (and consequently, encouraging me to resume work on this project).

  • Escape * in template page titles (#118).

  • Fix titles / links for directories with underscores (#127).


  • Allow unabridged API to exclude different kinds (#67). unabridgedOrphanKinds allows users to exclude a specific kind from getting dumped in the unabridged API beneath the hierarchies.

    By default, the unabridged API will exclude "file" and "dir", given that the file hierarchy already includes these.


  • Make sure spaces in directory / filenames are quoted when sent to Doxygen (#60).


  • Fix bug where a union child of a namespace does not link correctly in the class hierarchy (#40).

  • Do not force pygments lexer to unconditionally use cpp for <programlisting> pages. Doxygen encodes a language, which is parsed and converted to the appropriate pygments lexer (#42).

    • Added new configuration variable lexerMapping for additional control over pygments language to use.

    • This marks the beginning of mixed-language support, but much more needs to be done for this!

  • Most overloaded functions should now work. See #45 for more information, including function overloads that do not currently work.

    • For consistency, the full api listing includes fully qualified function names (previously: Function foo, now: Function namespace::foo(int)).

  • Stopped using deprecated sphinx API (#47).

  • Tree view hierarchies are minified by default (#48).

  • Parent directory links generated for directory and file pages (#49).

  • Tree view and namespace exclusion bypass configuration variable listingExclude added (#50).

    • Better logic for finding the file node that defined a given compound.

    • Doxygen produces inconsistencies with the paths, some are Windows paths and some are *nix paths. These should now all be corrected using os.path.normpath.


  • Exhale no longer produces filenames that are longer than the operating system can handle (#35).

    • Internal links have changed, more heavily discouraged in docs. Ideally the internal link generation scheme will not need to change again, but they might.

    • Exhale can handle absurdly long file paths by using the \\?\ prefix on Windows. If you run into a situation where this affects you, Sphinx actually cannot handle this. So try and build in a higher directory, e.g. C:\your_project (paths greater than 260 characters cause this issue).

  • First mostly functional release for Windows (there were many locations where os.path.normpath needed to be used.

  • Bug: bug introduced where a union child of a namespace does not link correctly in the class hierarchy.


  • Fix bug that prevents Customizing Breathe Output from working. Was checking isinstance(val_t, six.string_types), but should have been checking isinstance(val, six.string_types).

  • Fix / improve key guessing for when an invalid key is given in exhale_args.


  • Colorized printing on Read The Docs is disabled, since their build logs online don’t display the color.

  • Doxygen stdout and stderr are directed to /dev/null on Read The Docs. See #14.


  • First release with manual namespace documentation parsing (same as files).

  • Fixed bad error message when multiple potential file parents are found, which produced an exception preventing the rest of the build. Full description can be found in #12.


  • Page level configuration metadata added to all pages (rather than just leaf-like pages).

  • Fixed textwrap.dedent inconsistencies when more than one nested type is enumerated.