75 строки
2.7 KiB
Python
75 строки
2.7 KiB
Python
# flake8: noqa
|
|
# Disable Flake8 because of all the sphinx imports
|
|
#
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""Remove Transform Mark for Sphinx"""
|
|
import re
|
|
|
|
from docutils import nodes
|
|
from pygments.lexers import Python3Lexer, PythonLexer, guess_lexer # noqa pylint: disable=no-name-in-module
|
|
from sphinx.transforms import SphinxTransform
|
|
from sphinx.transforms.post_transforms.code import TrimDoctestFlagsTransform
|
|
|
|
docmark_re = re.compile(r"\s*#\s*\[(START|END)\s*[a-z_A-Z]+].*$", re.MULTILINE)
|
|
|
|
|
|
class TrimDocMarkerFlagsTransform(SphinxTransform):
|
|
"""
|
|
Trim doc marker like ``# [START howto_concept]` from python code-blocks.
|
|
|
|
Based on:
|
|
https://github.com/sphinx-doc/sphinx/blob/master/sphinx/transforms/post_transforms/code.py
|
|
class TrimDoctestFlagsTransform
|
|
"""
|
|
|
|
default_priority = TrimDoctestFlagsTransform.default_priority + 1
|
|
|
|
def apply(self, **kwargs):
|
|
for node in self.document.traverse(nodes.literal_block):
|
|
if self.is_pycode(node):
|
|
source = node.rawsource
|
|
source = docmark_re.sub("", source)
|
|
node.rawsource = source
|
|
node[:] = [nodes.Text(source)]
|
|
|
|
@staticmethod
|
|
def is_pycode(node: nodes.literal_block) -> bool:
|
|
"""Checks if the node is literal block of python"""
|
|
if node.rawsource != node.astext():
|
|
return False # skip parsed-literal node
|
|
|
|
language = node.get("language")
|
|
if language in ("py", "py3", "python", "python3", "default"):
|
|
return True
|
|
elif language == "guess":
|
|
try:
|
|
lexer = guess_lexer(node.rawsource)
|
|
return isinstance(lexer, (PythonLexer, Python3Lexer))
|
|
except Exception: # noqa pylint: disable=broad-except
|
|
pass
|
|
|
|
return False
|
|
|
|
|
|
def setup(app):
|
|
"""Sets the transform up"""
|
|
app.add_post_transform(TrimDocMarkerFlagsTransform)
|
|
|
|
return {"version": "builtin", "parallel_read_safe": False, "parallel_write_safe": False}
|