#!/usr/bin/env python
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: © 2021 Massachusetts Institute of Technology.
# SPDX-FileCopyrightText: © 2021 Lee McCuller <mcculler@caltech.edu>
# NOTICE: authors should document their contributions in concisely in NOTICE
# with details inline in source files, comments, and docstrings.
"""
"""
import os
import re
import errno
import os.path as path
from ..utilities.mpl import asavefig
from ..utilities.strings import padding_remove
[docs]
def docdb_md_section(
F_md,
doc_db,
section_history,
heading_level,
md_verbosity=None,
plot_verbosity=None,
plot_fname_func=None,
do_plot=True,
regex_secname="",
use_ext=True,
plot_format="png",
):
if md_verbosity is not None:
if doc_db.verbosity:
if doc_db.verbosity > md_verbosity:
return
header = header_line(
heading_level,
section_history,
doc_db.name,
)
lines = [
header,
"",
]
if doc_db.method:
lines.append("> `{0}`".format(padding_remove(doc_db.method)))
lines.append("")
if doc_db.about:
lines.append(padding_remove(doc_db.about))
lines.append("")
if not do_plot:
if re.findall(regex_secname, doc_db.name):
do_plot = True
will_plot = True
if plot_verbosity is not None:
if doc_db.verbosity:
if doc_db.verbosity > plot_verbosity:
will_plot = False
if do_plot and will_plot and doc_db.plotter and doc_db.fitter:
title = doc_db.plot_title
if not title:
title = ""
plot_fname = plot_fname_func(
section_history,
doc_db,
with_folder=False,
)
if use_ext:
ext = "." + plot_format
else:
ext = ""
lines.append("".format(plot_fname + ext, title=title))
lines.append("")
F_md.writelines((l + "\n" for l in lines))
if doc_db.sequence:
for idx, seq_name in enumerate(doc_db.sequence):
docdb_md_section(
F_md,
doc_db[seq_name],
section_history=section_history + [idx + 1],
heading_level=heading_level + 1,
md_verbosity=md_verbosity,
plot_verbosity=plot_verbosity,
plot_fname_func=plot_fname_func,
do_plot=do_plot,
regex_secname=regex_secname,
plot_format=plot_format,
use_ext=use_ext,
)
return
[docs]
def docdb_md_plots(
doc_db,
section_history,
plot_verbosity=None,
plot_fname_func=None,
do_plot=True,
regex_secname="",
clear_plots=False,
plot_format="png",
dpi=100,
):
if plot_verbosity is not None:
if doc_db.verbosity:
if doc_db.verbosity > plot_verbosity:
return
if not do_plot:
if re.findall(regex_secname, doc_db.name):
do_plot = True
if do_plot and doc_db.plotter and doc_db.fitter:
plot_fname = plot_fname_func(
section_history,
doc_db,
with_folder=True,
)
print("PLOTTING: ", plot_fname)
Fb = doc_db.plotter(doc_db.fitter)
Fb.formats[plot_format].use = True
Fb.formats[plot_format].facecolorize = True
Fb.formats[plot_format].dpi = dpi
Fb.save_show = False
Fb.save(plot_fname, fixname=False)
elif clear_plots:
plot_fname = plot_fname_func(
section_history,
doc_db,
with_folder=True,
)
print("REMOVING: ", plot_fname)
try:
os.remove(plot_fname + "." + plot_format)
except OSError as e:
if e.errno != errno.ENOENT:
print(e)
if doc_db.sequence:
for idx, seq_name in enumerate(doc_db.sequence):
docdb_md_plots(
doc_db[seq_name],
section_history=section_history + [idx + 1],
plot_verbosity=plot_verbosity,
plot_fname_func=plot_fname_func,
do_plot=do_plot,
regex_secname=regex_secname,
clear_plots=clear_plots,
plot_format=plot_format,
dpi=dpi,
)
return
[docs]
def docdb2markdown(
folder_name,
doc_db_root,
md_name="digest.md",
include_plots=True,
include_md=True,
plot_verbosity=None,
md_verbosity=None,
clear_plots=False,
regex_plotsections=None,
ipy_display=False,
use_ext=True,
plot_format="png",
dpi=100,
exporter=None,
MP_workers=1,
):
try:
os.makedirs(folder_name)
except OSError as e:
if e.errno != errno.EEXIST:
raise
def plot_fname_func(
section_history,
doc_db,
with_folder=True,
):
section_link = "-".join([str(n) for n in section_history])
if section_link:
fname = "plot-" + section_link
else:
fname = "plot-main"
fname = fname.replace("_", "-")
if with_folder:
return path.join(folder_name, fname)
else:
return fname
if regex_plotsections is not None:
do_plot = False
else:
do_plot = True
if include_md:
with open(path.join(folder_name, md_name), "w") as F_md:
docdb_md_section(
F_md,
doc_db_root,
section_history=[],
heading_level=0,
md_verbosity=None,
plot_fname_func=plot_fname_func,
plot_verbosity=plot_verbosity,
regex_secname=regex_plotsections,
do_plot=do_plot,
plot_format=plot_format,
use_ext=use_ext,
)
if include_plots:
with asavefig.pool(workers=MP_workers):
docdb_md_plots(
doc_db_root,
section_history=[],
plot_verbosity=plot_verbosity,
plot_fname_func=plot_fname_func,
regex_secname=regex_plotsections,
do_plot=do_plot,
clear_plots=clear_plots,
plot_format=plot_format,
dpi=dpi,
)
if ipy_display:
with open(path.join(folder_name, md_name), "r") as F_md:
md_data = F_md.read()
md_data = re.sub(r"\((.*)\.png\)", r"({0}/\1.png)".format(folder_name), md_data)
try:
from IPython.display import display_markdown
except ImportError:
print("Can't Import IPython.display")
else:
display_markdown(md_data, raw=True)
if exporter is not None:
exporter(
md_name=md_name,
folder=folder_name,
)
return