# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. """ Sphinx extension to replace ${executorch_version:TAG} with version numbers. This custom extension pulls third-party version strings from files in the .ci/docker/ci_commit_pins directory, and uses them to expand specific strings in markdown files. For example, `${executorch_version:pytorch}` will be replaced with the appropriate pytorch version string used by CI. """ import os from docutils import nodes version_file_names = [ "buck2.txt", "pytorch.txt", ] variables = {} def read_version_files(): cwd = os.getcwd() version_file_path = os.path.join(cwd, "..", ".ci", "docker", "ci_commit_pins") for file_name in version_file_names: file_path = os.path.join(version_file_path, file_name) with open(file_path, "r") as f: var_name = "${executorch_version:" + file_name.split(".")[0] + "}" variables[var_name] = f.read().strip() read_version_files() def replace_variables(app, doctree, docname): # Replace in regular text: for node in doctree.traverse(nodes.Text): new_text = node.astext() for var, value in variables.items(): new_text = new_text.replace(var, value) node.parent.replace(node, nodes.Text(new_text)) # Replace in code blocks: for node in doctree.traverse(nodes.literal_block): new_text = node.astext() for var, value in variables.items(): new_text = new_text.replace(var, value) classes = node.get("classes", []) # check if the output is generated by sphinx-gallery and if yes, keep the original # CSS classes. Otherwise, the sphinx-gallery generated outputs are # formatted as regular code blocks with gray background instead of pink. is_sphinx_gallery = any("sphx-glr" in class_ for class_ in classes) language = node.get("language") if is_sphinx_gallery: new_literal_block = nodes.literal_block(new_text, new_text, classes=classes) else: new_literal_block = nodes.literal_block( new_text, new_text, classes=["highlight-none", "notranslate"], language=language, ) node.parent.replace(node, new_literal_block) def setup(app): app.connect("doctree-resolved", replace_variables)