mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-06 11:20:32 +00:00
doc: fix graphviz scanning and processing
The doc build process copies files using script/extract-content.py from outside of the doc/ folder (specifically content in the tools/ folders). The script was not copying graphviz directive files. This has been fixed and the embedded graphviz directives are not (properly) stored in separate image/*.dot files. Note the extract-content.py file is derived from the Zephyr project. Signed-off-by: David B. Kinder <david.b.kinder@intel.com>
This commit is contained in:
committed by
David Kinder
parent
e49c42d698
commit
348422dba6
@@ -42,7 +42,7 @@ doxy:
|
||||
$(Q)(cat acrn.doxyfile) | doxygen - > doc.log 2>&1
|
||||
|
||||
content:
|
||||
$(Q)scripts/extract_content.py
|
||||
$(Q)scripts/extract_content.py . tools
|
||||
|
||||
kconfig:
|
||||
$(Q)srctree=../hypervisor \
|
||||
|
@@ -1,62 +1,113 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Copyright (c) 2018, Nordic Semiconductor ASA
|
||||
# Copyright (c) 2017, Intel Corporation
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Script to move docs from different places into the doc directory
|
||||
# Very quick script to move docs from different places into the doc directory
|
||||
# to fix the website and external links
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import re
|
||||
import sys
|
||||
import argparse
|
||||
import errno
|
||||
import filecmp
|
||||
import fnmatch
|
||||
|
||||
|
||||
# direcories to search for .rst files
|
||||
CONTENT_DIRS = ["tools"]
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
|
||||
# directives to parse for included files
|
||||
DIRECTIVES = ["figure","include","image","literalinclude"]
|
||||
DIRECTIVES = ["figure","include","image","literalinclude", "graphviz"]
|
||||
|
||||
# should get this from the environment...
|
||||
ACRN_BASE = "../"
|
||||
ZEPHYR_BASE = "../"
|
||||
ZEPHYR_BUILD = None
|
||||
|
||||
def get_rst_files(dir):
|
||||
def copy_if_different(src, dst):
|
||||
# Copies 'src' as 'dst', but only if dst does not exist or if itx contents
|
||||
# differ from src.This avoids unnecessary # timestamp updates, which
|
||||
# trigger documentation rebuilds.
|
||||
if os.path.exists(dst) and filecmp.cmp(src, dst):
|
||||
return
|
||||
shutil.copyfile(src, dst)
|
||||
|
||||
def get_files(all, dest, dir):
|
||||
matches = []
|
||||
for root, dirnames, filenames in os.walk('%s/%s' %(ACRN_BASE, dir)):
|
||||
for filename in fnmatch.filter(filenames, '*.rst'):
|
||||
for root, dirnames, filenames in os.walk('%s/%s' %(ZEPHYR_BASE, dir)):
|
||||
if ZEPHYR_BUILD:
|
||||
if os.path.normpath(root).startswith(os.path.normpath(ZEPHYR_BUILD)):
|
||||
# Build folder, skip it
|
||||
continue
|
||||
|
||||
for filename in fnmatch.filter(filenames, '*' if all else '*.rst'):
|
||||
matches.append(os.path.join(root, filename))
|
||||
for file in matches:
|
||||
frel = file.replace(ACRN_BASE,"").strip("/")
|
||||
frel = file.replace(ZEPHYR_BASE,"").strip("/")
|
||||
dir=os.path.dirname(frel)
|
||||
if not os.path.exists(os.path.join(ACRN_BASE, "doc", dir)):
|
||||
os.makedirs(os.path.join(ACRN_BASE, "doc", dir))
|
||||
if not os.path.exists(os.path.join(dest, dir)):
|
||||
os.makedirs(os.path.join(dest, dir))
|
||||
|
||||
shutil.copyfile(file, os.path.join(ACRN_BASE, "doc", frel))
|
||||
copy_if_different(file, os.path.join(dest, frel))
|
||||
|
||||
with open(file, encoding="utf-8") as f:
|
||||
content = f.readlines()
|
||||
content = [x.strip() for x in content]
|
||||
directives = "|".join(DIRECTIVES)
|
||||
pattern = re.compile("\s*\.\.\s+(%s)::\s+(.*)" %directives)
|
||||
for l in content:
|
||||
m = pattern.match(l)
|
||||
if m:
|
||||
inf = m.group(2)
|
||||
ind = os.path.dirname(inf)
|
||||
if not os.path.exists(os.path.join(ACRN_BASE, "doc", dir, ind)):
|
||||
os.makedirs(os.path.join(ACRN_BASE, "doc", dir, ind))
|
||||
# Inspect only .rst files for directives referencing other files
|
||||
# we'll need to copy (as configured in the DIRECTIVES variable)
|
||||
if not fnmatch.fnmatch(file, "*.rst"):
|
||||
continue
|
||||
|
||||
shutil.copyfile(os.path.join(ACRN_BASE, dir, inf),
|
||||
os.path.join(ACRN_BASE, "doc", dir, inf))
|
||||
try:
|
||||
with open(file, encoding="utf-8") as f:
|
||||
content = f.readlines()
|
||||
|
||||
content = [x.strip() for x in content]
|
||||
directives = "|".join(DIRECTIVES)
|
||||
pattern = re.compile("\s*\.\.\s+(%s)::\s+(.*)" %directives)
|
||||
for l in content:
|
||||
m = pattern.match(l)
|
||||
if m:
|
||||
inf = m.group(2)
|
||||
ind = os.path.dirname(inf)
|
||||
if not os.path.exists(os.path.join(dest, dir, ind)):
|
||||
os.makedirs(os.path.join(dest, dir, ind))
|
||||
|
||||
src = os.path.join(ZEPHYR_BASE, dir, inf)
|
||||
dst = os.path.join(dest, dir, inf)
|
||||
try:
|
||||
copy_if_different(src, dst)
|
||||
|
||||
except FileNotFoundError:
|
||||
sys.stderr.write("File not found: %s\n reference by %s\n" % (inf, file))
|
||||
|
||||
except UnicodeDecodeError as e:
|
||||
sys.stderr.write(
|
||||
"Malformed {} in {}\n"
|
||||
" Context: {}\n"
|
||||
" Problematic data: {}\n"
|
||||
" Reason: {}\n".format(
|
||||
e.encoding, file,
|
||||
e.object[max(e.start - 40, 0):e.end + 40],
|
||||
e.object[e.start:e.end],
|
||||
e.reason))
|
||||
|
||||
f.close()
|
||||
|
||||
def main():
|
||||
for d in CONTENT_DIRS:
|
||||
get_rst_files(d)
|
||||
|
||||
parser = argparse.ArgumentParser(description='Recursively copy .rst files '
|
||||
'from the origin folder(s) to the '
|
||||
'destination folder, plus files referenced '
|
||||
'in those .rst files by a configurable '
|
||||
'list of directives: {}.'.format(DIRECTIVES))
|
||||
|
||||
parser.add_argument('-a', '--all', action='store_true', help='Copy all files '
|
||||
'(recursively) in the specified source folder(s).')
|
||||
parser.add_argument('dest', nargs=1)
|
||||
parser.add_argument('src', nargs='+')
|
||||
args = parser.parse_args()
|
||||
|
||||
dest = args.dest[0]
|
||||
|
||||
for d in args.src:
|
||||
get_files(args.all, dest, d)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
Reference in New Issue
Block a user