diff --git a/CHANGELOG.md b/CHANGELOG.md index a599bb4..378d73e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## v0.4.1 - 2020-05-30 +- Fixed `.dirs` being glommed as source paths +- Added config option `scripts` +- Added config option `stylesheets` +- Added config option `jquery` +- Added `custom` theme +- Added ability to use `HOME.md` as main page +- Added additional fix for inline `` blocks +- Added `.poxy-toc` to table-of-contents elements +- Added floating page table-of-contents +- Removed m.css favicon fallback +- Made improvements to the `light` and `dark` themes +- Updated C++ doxygen tagfile + ## v0.4.0 - 2020-05-29 - Added config option `theme` - Added version number to CSS and javascript filenames to prevent browser cache issues diff --git a/poxy/data/cppreference-doxygen-web.tag.xml b/poxy/data/cppreference-doxygen-web.tag.xml index 48452a1..7fa5639 100644 --- a/poxy/data/cppreference-doxygen-web.tag.xml +++ b/poxy/data/cppreference-doxygen-web.tag.xml @@ -1024,6 +1024,10 @@ std::bad_weak_ptr std::basic_common_reference std::basic_filebuf + std::basic_format_arg + std::basic_format_args + std::basic_format_context + std::basic_format_parse_context std::basic_fstream std::basic_ifstream std::basic_ios @@ -2123,6 +2127,40 @@ (T... args) + + T + format + cpp/utility/format/format + + (T... args) + + std::format_args + std::format_args_t + std::format_context + std::format_error + std::format_parse_context + + T + format_to + cpp/utility/format/format_to + + (T... args) + + + T + format_to_n + cpp/utility/format/format_to_n + + (T... args) + + + T + formatted_size + cpp/utility/format/formatted_size + + (T... args) + + std::formatter T forward @@ -3909,6 +3947,13 @@ (T... args) + + T + make_format_args + cpp/utility/format/make_format_args + + (T... args) + T make_from_tuple @@ -3985,6 +4030,13 @@ std::make_unsigned std::make_unsigned_t + + T + make_wformat_args + cpp/utility/format/make_format_args + + (T... args) + T malloc @@ -6153,6 +6205,20 @@ std::vector + + T + vformat + cpp/utility/format/vformat + + (T... args) + + + T + vformat_to + cpp/utility/format/vformat_to + + (T... args) + T vfprintf @@ -6188,6 +6254,13 @@ (T... args) + + T + visit_format_arg + cpp/utility/format/visit_format_arg + + (T... args) + std::void_t T @@ -6511,6 +6584,9 @@ std::weak_ptr std::weibull_distribution std::wfilebuf + std::wformat_args + std::wformat_context + std::wformat_parse_context std::wfstream std::wifstream std::wiostream @@ -15148,6 +15224,22 @@ (T... args) + + std::basic_format_arg + cpp/utility/format/basic_format_arg + + + std::basic_format_args + cpp/utility/format/basic_format_args + + + std::basic_format_context + cpp/utility/format/basic_format_context + + + std::basic_format_parse_context + cpp/utility/format/basic_format_parse_context + std::basic_fstream cpp/io/basic_fstream @@ -29382,6 +29474,30 @@ (T... args) + + std::format_args + cpp/utility/format/basic_format_args + + + std::format_args_t + cpp/utility/format/basic_format_args + + + std::format_context + cpp/utility/format/basic_format_context + + + std::format_error + cpp/utility/format/format_error + + + std::format_parse_context + cpp/utility/format/basic_format_parse_context + + + std::formatter + cpp/utility/format/formatter + std::forward_iterator_tag cpp/iterator/iterator_tags @@ -54518,6 +54634,18 @@ (T... args) + + std::wformat_args + cpp/utility/format/basic_format_args + + + std::wformat_context + cpp/utility/format/basic_format_context + + + std::wformat_parse_context + cpp/utility/format/basic_format_parse_context + std::wfstream cpp/io/basic_fstream diff --git a/poxy/data/poxy-custom-theme-base.css b/poxy/data/poxy-custom-theme-base.css new file mode 100644 index 0000000..e69de29 diff --git a/poxy/data/poxy-dark.css b/poxy/data/poxy-dark.css index a9e663e..ee490df 100644 --- a/poxy/data/poxy-dark.css +++ b/poxy/data/poxy-dark.css @@ -45,6 +45,31 @@ ul.m-doc > li.m-doc-collapsible li opacity: 0.85; } +/* lists */ +.m-block li, +.m-note li, +section > ul li, +section > ol li +{ + margin-bottom: 0.2rem; +} +.m-block li:last-child, +.m-note li:last-child, +section > ul li:last-child, +section > ol li:last-child +{ + margin-bottom: initial; +} + +/* nested lists */ +.m-block li > ul > li:first-child, +.m-note li > ul > li:first-child, +.m-block li > ol > li:first-child, +.m-note li > ol > li:first-child +{ + margin-top: 0.2rem; +} + /* ==================================================== code blocks ==================================================== */ diff --git a/poxy/data/poxy-light.css b/poxy/data/poxy-light.css index 95fcb48..ed2a417 100644 --- a/poxy/data/poxy-light.css +++ b/poxy/data/poxy-light.css @@ -52,6 +52,98 @@ ul.m-doc li > span.m-doc a opacity: 0.75; } +/* page header */ +body > header +{ + -webkit-box-shadow: 0px 0px 15px 3px rgba(0,0,0,0.25); + box-shadow: 0px 0px 15px 3px rgba(0,0,0,0.25); +} +body > header > nav +{ + background-color: #ea7944; +} +body > header > nav a:hover, +body > header > nav #m-navbar-collapse a#m-navbar-current:hover +{ + color: #444444 !important; +} +body > header > nav #m-navbar-collapse a +{ + +} +body > header > nav #m-navbar-collapse a#m-navbar-current +{ + color: #ffffff !important; + border-color: #ffffff !important; +} +body > header > nav #m-navbar-collapse a:hover +{ + +} + +/* page footer */ +body > footer > nav +{ + color: #F3F3F3; + background-color: #161616; +} +body > footer > nav a +{ + color: #ea7944; +} +body > footer > nav a:hover +{ + color: #e99168; +} + +/* search overlay box */ +.m-doc-search-content +{ + background-color: #fdfdfd; + border: 1px solid #cccccc; +} + +/* search overlay help text */ +.m-doc-search-content #search-help +{ + color: #666; +} +.m-doc-search-content #search-help .m-label.m-dim +{ + background-color: #666; +} + +/* search overlay background flood-fill */ +.m-doc-search +{ + background-color: rgba(225, 225, 225, 0.85); +} + +/* lists */ +.m-block li, +.m-note li, +section > ul li, +section > ol li +{ + margin-bottom: 0.4rem; +} +.m-block li:last-child, +.m-note li:last-child, +section > ul li:last-child, +section > ol li:last-child +{ + margin-bottom: initial; +} + +/* nested lists */ +.m-block li > ul > li:first-child, +.m-note li > ul > li:first-child, +.m-block li > ol > li:first-child, +.m-note li > ol > li:first-child +{ + margin-top: 0.4rem; +} + /* ==================================================== code blocks ==================================================== */ diff --git a/poxy/data/poxy.css b/poxy/data/poxy.css index c9a4125..6b541fc 100644 --- a/poxy/data/poxy.css +++ b/poxy/data/poxy.css @@ -43,7 +43,7 @@ a article div > section { - margin-top: 3rem; + margin-top: 4rem; } article div > section > section @@ -241,19 +241,6 @@ figure.m-figure::before font-size: 1em; } -/* lists inside blocks and notes */ -.m-block li, -.m-note li -{ - margin-bottom: 0.2rem; -} - -.m-block li:last-child, -.m-note li:last-child -{ - margin-bottom: initial; -} - /* m-special (purple) */ .m-note.m-special, table.m-table tr.m-special td, @@ -339,6 +326,24 @@ h6:last-child margin-left: inherit; } +/* table of contents */ +@media screen and (min-width: 1350px) and (min-height: 900px) +{ + .poxy-toc + { + position: fixed; + top: 9rem; + left: calc(50% + 430px); + min-width: 200px; + z-index: 5; + margin: 0px 20px 0px 0px !important; + } + div.poxy-toc + section + { + margin-top: 2rem; + } +} + /* ==================================================== code blocks ==================================================== */ diff --git a/poxy/data/version.txt b/poxy/data/version.txt index 1d0ba9e..267577d 100644 --- a/poxy/data/version.txt +++ b/poxy/data/version.txt @@ -1 +1 @@ -0.4.0 +0.4.1 diff --git a/poxy/fixers.py b/poxy/fixers.py index 872eaf3..fb20ff3 100644 --- a/poxy/fixers.py +++ b/poxy/fixers.py @@ -598,9 +598,9 @@ def __call__(self, doc, context): for code_block in code_blocks: parent = code_block.parent if (parent is None - or parent.name != 'p' + or parent.name != r'p' or parent.parent is None - or parent.parent.name != 'div'): + or parent.parent.name not in (r'div', r'section')): continue changed_this_pass = True code_block.name = 'pre' @@ -853,12 +853,6 @@ def __call__(self, doc, context): for tag in meta: self.__append(doc, r'meta', tag) - # stylesheets and scripts - self.__append(doc, r'link', { r'href' : rf'poxy-{context.version_string}.css', r'rel' : r'stylesheet' }) - self.__append(doc, r'link', { r'href' : rf'poxy-{context.version_string}-{context.theme}.css', r'rel' : r'stylesheet' }) - self.__append(doc, r'script', { r'src' : rf'poxy-{context.version_string}.js' }) - self.__append(doc, r'script', { r'src' : context.jquery.name }) - # google structured data if doc.path.name in context.compound_pages and context.compound_pages[doc.path.name][r'kind'] == r'page': tag = self.__append(doc, r'script', { r'type' : r'application/ld+json' }) @@ -867,6 +861,31 @@ def __call__(self, doc, context): data[r'@type'] = r'Article' data[r'dateModified'] = context.now.isoformat() data[r'headline'] = doc.head.title.string - tag.string = json.dumps(data, indent=" ") + tag.string = json.dumps(data, indent=r' ') + + # stylesheets + for stylesheet in context.stylesheets: + self.__append(doc, r'link', { r'href' : stylesheet, r'rel' : r'stylesheet' }) + + # scripts + for script in context.scripts: + self.__append(doc, r'script', { r'src' : script }) + + + return True + + +#======================================================================================================================= +# misc +#======================================================================================================================= + +class MarkTOC(HTMLFixer): + ''' + Marks any table-of-contents with a custom class. + ''' + def __call__(self, doc, context): + if doc.table_of_contents is None: + return False + soup.add_class(doc.table_of_contents, r'poxy-toc') return True diff --git a/poxy/project.py b/poxy/project.py index 6e4036c..6dd8e93 100644 --- a/poxy/project.py +++ b/poxy/project.py @@ -783,7 +783,7 @@ def __init__(self, config, key, input_dir): raise Error(rf"{key}: '{path}' was not a directory or file") paths.add(str(path)) if recursive and path.is_dir(): - for subdir in enum_subdirs(path): + for subdir in enum_subdirs(path, filter=lambda p: not p.name.startswith(r'.')): paths.add(str(subdir)) self.paths = list(paths) self.paths.sort() @@ -881,6 +881,7 @@ class Context(object): Optional(r'implementation_headers') : {str : ValueOrArray(str)}, Optional(r'inline_namespaces') : ValueOrArray(str, name=r'inline_namespaces'), Optional(r'internal_docs') : bool, + Optional(r'jquery') : bool, Optional(r'license') : ValueOrArray(str, length=2, name=r'license'), Optional(r'logo') : str, Optional(r'macros') : {str : Or(str, int, bool)}, @@ -889,10 +890,12 @@ class Context(object): Optional(r'navbar') : ValueOrArray(str, name=r'navbar'), Optional(r'private_repo') : bool, Optional(r'robots') : bool, + Optional(r'scripts') : ValueOrArray(str, name=r'scripts'), Optional(r'show_includes') : bool, Optional(r'sources') : _Sources.schema, + Optional(r'stylesheets') : ValueOrArray(str, name=r'stylesheets'), Optional(r'tagfiles') : {str : str}, - Optional(r'theme') : Or(r'dark', r'light'), + Optional(r'theme') : Or(r'dark', r'light', r'custom'), Optional(r'warnings') : _Warnings.schema, }, ignore_extra_keys=True @@ -1102,13 +1105,18 @@ def __init__(self, config_path, output_dir, threads, cleanup, verbose, mcss_dir, # temp dirs self.global_temp_dir = Path(tempfile.gettempdir(), r'poxy') self.verbose_value(r'Context.global_temp_dir', self.global_temp_dir) - self.global_temp_dir.mkdir(exist_ok=True) - temp_dir_hash_source = str(self.input_dir) - if not self.case_sensitive_paths: - temp_dir_hash_source = temp_dir_hash_source.upper() - self.temp_dir = Path(self.global_temp_dir, sha1(temp_dir_hash_source)) - self.temp_dir.mkdir(exist_ok=True) + self.temp_dir = re.sub(r'''[!@#$%^&*()+={}<>;:'"_\\/\n\t -]+''', r'_', str(self.input_dir).strip(r'\/')) + if len(self.temp_dir) > 256: + self.temp_dir = str(self.input_dir) + if not self.case_sensitive_paths: + self.temp_dir = self.temp_dir.upper() + self.temp_dir = sha1(self.temp_dir) + self.temp_dir = Path(self.global_temp_dir, self.temp_dir) self.verbose_value(r'Context.temp_dir', self.temp_dir) + self.blog_dir = Path(self.temp_dir, r'blog') + self.verbose_value(r'Context.blog_dir', self.blog_dir) + self.pages_dir = Path(self.temp_dir, r'pages') + self.verbose_value(r'Context.pages_dir', self.pages_dir) # output paths self.xml_dir = Path(self.temp_dir, 'xml') @@ -1153,6 +1161,8 @@ def __init__(self, config_path, output_dir, threads, cleanup, verbose, mcss_dir, if 1: extra_files = [] badges = [] + self.scripts = [] + self.stylesheets = [] config = dict() if self.config_path is not None: @@ -1253,14 +1263,58 @@ def __init__(self, config_path, output_dir, threads, cleanup, verbose, mcss_dir, self.logo = file.resolve() self.verbose_value(r'Context.logo', self.logo) - # theme (M_THEME_COLOR) + # theme (HTML_EXTRA_STYLESHEETS, M_THEME_COLOR) self.theme = r'dark' if r'theme' in config: self.theme = str(config[r'theme']) + if self.theme != r'custom': + extra_files.append((rf'poxy-{self.version_string}.css', Path(self.data_dir, r'poxy.css'))) + extra_files.append((rf'poxy-{self.version_string}-{self.theme}.css', Path(self.data_dir, rf'poxy-{self.theme}.css'))) + extra_files.append((r'poxy-github.svg', Path(self.data_dir, rf'poxy-github-{"black" if self.theme == "light" else "white"}.svg'))) + self.stylesheets.append(rf'poxy-{self.version_string}.css') + self.stylesheets.append(rf'poxy-{self.version_string}-{self.theme}.css') self.verbose_value(r'Context.theme', self.theme) + # stylesheets (HTML_EXTRA_STYLESHEETS) + if r'stylesheets' in config: + for f in coerce_collection(config[r'stylesheets']): + file = f.strip() + if file: + if is_uri(file): + self.stylesheets.append(file) + else: + file = Path(file) + self.stylesheets.append(file.name) + extra_files.append(file) + self.verbose_value(r'Context.stylesheets', self.stylesheets) + + # jquery + if r'jquery' in config and config[r'jquery']: + jquery = get_all_files(self.data_dir, any=(r'jquery*.js'))[0] + if jquery is not None: + extra_files.append(jquery) + self.scripts.append(jquery.name) + + # scripts + self.scripts.append(rf'poxy-{self.version_string}.js') + extra_files.append((rf'poxy-{self.version_string}.js', Path(self.data_dir, r'poxy.js'))) + if r'scripts' in config: + for f in coerce_collection(config[r'scripts']): + file = f.strip() + if file: + if is_uri(file): + self.scripts.append(file) + else: + file = Path(file) + self.scripts.append(file.name) + extra_files.append(file) + self.verbose_value(r'Context.scripts', self.scripts) + # sources (INPUT, FILE_PATTERNS, STRIP_FROM_PATH, STRIP_FROM_INC_PATH, EXTRACT_ALL) self.sources = _Sources(config, 'sources', self.input_dir) + self.sources.paths.append(str(self.blog_dir)) + self.sources.paths.append(str(self.pages_dir)) + self.sources.paths.sort() self.verbose_object(r'Context.sources', self.sources) # images (IMAGE_PATH) @@ -1442,24 +1496,13 @@ def __init__(self, config_path, output_dir, threads, cleanup, verbose, mcss_dir, self.badges = tuple(badges + user_badges) self.verbose_value(r'Context.badges', self.badges) - # extra_files (HTML_EXTRA_FILES) - if 'extra_files' in config: + # user-specified extra_files (HTML_EXTRA_FILES) + if r'extra_files' in config: for f in coerce_collection(config['extra_files']): file = f.strip() if file: extra_files.append(Path(file)) - # add built-ins to extra files - extra_files.append((rf'poxy-{self.version_string}.css', Path(self.data_dir, r'poxy.css'))) - extra_files.append((rf'poxy-{self.version_string}-{self.theme}.css', Path(self.data_dir, rf'poxy-{self.theme}.css'))) - extra_files.append((rf'poxy-{self.version_string}.js', Path(self.data_dir, r'poxy.js'))) - extra_files.append((r'poxy-github.svg', Path(self.data_dir, rf'poxy-github-{"black" if self.theme == "light" else "white"}.svg'))) - - # add jquery - self.jquery = get_all_files(self.data_dir, any=(r'jquery*.js'))[0] - self.verbose_value(r'Context.jquery', self.jquery) - extra_files.append(self.jquery) - # finalize extra_files self.extra_files = {} for i in range(len(extra_files)): @@ -1472,7 +1515,7 @@ def __init__(self, config_path, output_dir, threads, cleanup, verbose, mcss_dir, file = (file[0], file[1].resolve()) if not file[1].exists() or not file[1].is_file(): raise Error(rf'extra_files: {file[1]} did not exist or was not a file') - if file[0] in extra_files: + if file[0] in self.extra_files: raise Error(rf'extra_files: Multiple files with the name {file[0]}') self.extra_files[file[0]] = file[1] self.verbose_value(r'Context.extra_files', self.extra_files) @@ -1487,10 +1530,19 @@ def __init__(self, config_path, output_dir, threads, cleanup, verbose, mcss_dir, def __enter__(self): + if not self.dry_run: + if self.cleanup: + delete_directory(self.temp_dir, logger=self.verbose_logger) + delete_directory(self.html_dir, logger=self.verbose_logger) + delete_directory(self.xml_dir, logger=self.verbose_logger) + self.global_temp_dir.mkdir(exist_ok=True) + self.temp_dir.mkdir(exist_ok=True) + self.blog_dir.mkdir(exist_ok=True) + self.pages_dir.mkdir(exist_ok=True) return self def __exit__(self, type, value, traceback): - if self.cleanup and self.temp_dir is not None: + if self.cleanup and not self.dry_run: delete_directory(self.temp_dir, logger=self.verbose_logger) def __bool__(self): diff --git a/poxy/run.py b/poxy/run.py index ee49ee3..4a57766 100644 --- a/poxy/run.py +++ b/poxy/run.py @@ -135,6 +135,7 @@ (r'TYPEDEF_HIDES_STRUCT', False), (r'UML_LOOK', False), (r'USE_HTAGS', False), + (r'USE_MDFILE_AS_MAINPAGE', None), (r'VERBATIM_HEADERS', False), (r'WARN_IF_DOC_ERROR', True), (r'WARN_IF_INCOMPLETE_DOC', True), @@ -221,9 +222,25 @@ def _preprocess_doxyfile(context): df.add_value(r'CLANG_OPTIONS', rf'-std=c++{context.cpp%100}') df.add_value(r'CLANG_OPTIONS', r'-Wno-everything') + # these are necessary here to suppress m.css' automatic inclusion of the dark theme + # (otherwise I'd add them to context.extra_files and context.stylesheets) if context.theme == r'light': df.add_value(r'HTML_EXTRA_STYLESHEET', r'https://fonts.googleapis.com/css?family=Libre+Baskerville:400,400i,700,700i%7CSource+Code+Pro:400,400i,600') df.add_value(r'HTML_EXTRA_STYLESHEET', r'../css/m-light+documentation.compiled.css') + elif context.theme == r'custom': + df.add_value(r'HTML_EXTRA_STYLESHEET', Path(context.data_dir, r'poxy-custom-theme-base.css')) + + home_md_path = None + for home_md in (r'HOME.md', r'home.md', r'INDEX.md', r'index.md', r'README.md', r'readme.md'): + p = Path(context.input_dir, home_md) + if p.exists() and p.is_file(): + home_md_path = p + break + if home_md_path is not None: + home_md_temp_path = Path(context.pages_dir, r'home.poxy_md') + if not context.dry_run: + copy_file(home_md_path, home_md_temp_path, logger=context.verbose_logger) + df.set_value(r'USE_MDFILE_AS_MAINPAGE', home_md_temp_path) df.append() df.append(r'# context.warnings', end='\n\n') # --------------------------------------------------- @@ -248,6 +265,7 @@ def _preprocess_doxyfile(context): df.add_value(r'INPUT', context.sources.paths) df.set_value(r'FILE_PATTERNS', context.sources.patterns) + df.add_value(r'FILE_PATTERNS', [ r'*.poxy_blog', r'*.poxy_md', r'*.poxy_cpp', r'*.poxy_h', r'*.poxy_dox' ]) df.add_value(r'EXCLUDE', context.html_dir) df.add_value(r'STRIP_FROM_PATH', context.sources.strip_paths) @@ -261,6 +279,7 @@ def _preprocess_doxyfile(context): df.add_value(r'EXAMPLE_PATH', context.examples.paths) df.set_value(r'EXAMPLE_PATTERNS', context.examples.patterns) + df.add_value(r'EXTENSION_MAPPING', [ r'poxy_blog=md', r'poxy_md=md', r'poxy_cpp=C++', r'poxy_h=C++', r'poxy_dox=C++' ]) if context.images.paths: # ---------------------------------------------------- df.append() @@ -286,9 +305,12 @@ def _preprocess_doxyfile(context): if 1: conf = lambda s='', end='\n': print(s, file=conf_py, end=end) conf(rf"DOXYFILE = r'{context.doxyfile_path}'") - conf(rf"""THEME_COLOR = r'{"#cb4b16" if context.theme == "light" else "#22272e"}'""") - if not df.contains(r'M_FAVICON') and context.favicon: - conf(rf'FAVICON = {context.favicon}') + if context.theme == r'custom': + conf(rf"""THEME_COLOR = r''""") + else: + conf(rf"""THEME_COLOR = r'{"#cb4b16" if context.theme == "light" else "#22272e"}'""") + if not df.contains(r'M_FAVICON'): + conf(rf"""FAVICON = r'{context.favicon if context.favicon else ""}'""") if not df.contains(r'M_SHOW_UNDOCUMENTED'): conf(rf'SHOW_UNDOCUMENTED = {context.sources.extract_all}') if not df.contains(r'M_CLASS_TREE_EXPAND_LEVELS'): @@ -428,8 +450,9 @@ def _postprocess_xml(context): # pre-pass to delete file and dir entries where appropriate: if 1: - dox_files = (r'dox', r'md') - dox_files = [rf'*_8{ext}.xml' for ext in dox_files] + dox_files = (r'.dox', r'.md', r'.poxy_md', r'.poxy_blog', r'.poxy_dox') + dox_files = [rf'*{doxygen.mangle_name(ext)}.xml' for ext in dox_files] + dox_files.append(r'md_home.xml') for xml_file in get_all_files(context.xml_dir, any=dox_files): delete_file(xml_file, logger=context.verbose_logger) deleted = True @@ -814,18 +837,19 @@ def _postprocess_html(context): with ScopeTimer(rf'Post-processing {len(files)} HTML files', print_start=True, print_end=context.verbose_logger): context.fixers = ( - fixers.CodeBlocks() - , fixers.IndexPage() - , fixers.Modifiers1() - , fixers.Modifiers2() - , fixers.TemplateTemplate() - , fixers.StripIncludes() - , fixers.AutoDocLinks() - , fixers.Links() - , fixers.CustomTags() - , fixers.EmptyTags() - , fixers.HeadTags() - , fixers.ImplementationDetails() + fixers.MarkTOC(), + fixers.CodeBlocks(), + fixers.IndexPage(), + fixers.Modifiers1(), + fixers.Modifiers2(), + fixers.TemplateTemplate(), + fixers.StripIncludes(), + fixers.AutoDocLinks(), + fixers.Links(), + fixers.CustomTags(), + fixers.EmptyTags(), + fixers.HeadTags(), + fixers.ImplementationDetails(), ) context.verbose(rf'Post-processing {len(files)} HTML files...') if threads > 1: @@ -959,14 +983,9 @@ def run(config_path='.', _preprocess_doxyfile(context) context.verbose_object(r'Context.warnings', context.warnings) - if dry_run: + if context.dry_run: return - # delete any leftovers from the previous run - if 1: - delete_directory(context.xml_dir, logger=context.verbose_logger) - delete_directory(context.html_dir, logger=context.verbose_logger) - # resolve any uri tagfiles if context.unresolved_tagfiles: with ScopeTimer(r'Resolving remote tagfiles', print_start=True, print_end=context.verbose_logger) as t: diff --git a/poxy/utils.py b/poxy/utils.py index ab859ca..1ae0099 100644 --- a/poxy/utils.py +++ b/poxy/utils.py @@ -62,14 +62,16 @@ def log(logger, msg, level=logging.INFO): -def enum_subdirs(root): +def enum_subdirs(root, filter=None): root = coerce_path(root) assert root.is_dir() subdirs = [] for p in root.iterdir(): if p.is_dir(): + if filter is not None and not filter(p): + continue subdirs.append(p) - subdirs = subdirs + enum_subdirs(p) + subdirs = subdirs + enum_subdirs(p, filter=filter) return subdirs