|
58 | 58 | from ietf.utils.mail import is_valid_email
|
59 | 59 | from ietf.utils.text import parse_unicode, normalize_text
|
60 | 60 | from ietf.utils.timezone import date_today
|
61 |
| -from ietf.utils.xmldraft import InvalidMetadataError, XMLDraft |
| 61 | +from ietf.utils.xmldraft import InvalidMetadataError, XMLDraft, capture_xml2rfc_output |
62 | 62 | from ietf.person.name import unidecode_name
|
63 | 63 |
|
64 | 64 |
|
@@ -926,105 +926,101 @@ def render_missing_formats(submission):
|
926 | 926 | If a txt file already exists, leaves it in place. Overwrites an existing html file
|
927 | 927 | if there is one.
|
928 | 928 | """
|
929 |
| - # Capture stdio/stdout from xml2rfc |
930 |
| - xml2rfc_stdout = io.StringIO() |
931 |
| - xml2rfc_stderr = io.StringIO() |
932 |
| - xml2rfc.log.write_out = xml2rfc_stdout |
933 |
| - xml2rfc.log.write_err = xml2rfc_stderr |
934 |
| - xml_path = staging_path(submission.name, submission.rev, '.xml') |
935 |
| - parser = xml2rfc.XmlRfcParser(str(xml_path), quiet=True) |
936 |
| - try: |
937 |
| - # --- Parse the xml --- |
938 |
| - xmltree = parser.parse(remove_comments=False) |
939 |
| - except Exception as err: |
940 |
| - raise XmlRfcError( |
941 |
| - "Error parsing XML", |
942 |
| - xml2rfc_stdout=xml2rfc_stdout.getvalue(), |
943 |
| - xml2rfc_stderr=xml2rfc_stderr.getvalue(), |
944 |
| - ) from err |
945 |
| - # If we have v2, run it through v2v3. Keep track of the submitted version, though. |
946 |
| - xmlroot = xmltree.getroot() |
947 |
| - xml_version = xmlroot.get('version', '2') |
948 |
| - if xml_version == '2': |
949 |
| - v2v3 = xml2rfc.V2v3XmlWriter(xmltree) |
| 929 | + with capture_xml2rfc_output() as xml2rfc_logs: |
| 930 | + xml_path = staging_path(submission.name, submission.rev, '.xml') |
| 931 | + parser = xml2rfc.XmlRfcParser(str(xml_path), quiet=True) |
950 | 932 | try:
|
951 |
| - xmltree.tree = v2v3.convert2to3() |
| 933 | + # --- Parse the xml --- |
| 934 | + xmltree = parser.parse(remove_comments=False) |
952 | 935 | except Exception as err:
|
953 | 936 | raise XmlRfcError(
|
954 |
| - "Error converting v2 XML to v3", |
955 |
| - xml2rfc_stdout=xml2rfc_stdout.getvalue(), |
956 |
| - xml2rfc_stderr=xml2rfc_stderr.getvalue(), |
| 937 | + "Error parsing XML", |
| 938 | + xml2rfc_stdout=xml2rfc_logs["stdout"].getvalue(), |
| 939 | + xml2rfc_stderr=xml2rfc_logs["stderr"].getvalue(), |
957 | 940 | ) from err
|
958 |
| - |
959 |
| - # --- Prep the xml --- |
960 |
| - today = date_today() |
961 |
| - prep = xml2rfc.PrepToolWriter(xmltree, quiet=True, liberal=True, keep_pis=[xml2rfc.V3_PI_TARGET]) |
962 |
| - prep.options.accept_prepped = True |
963 |
| - prep.options.date = today |
964 |
| - try: |
965 |
| - xmltree.tree = prep.prep() |
966 |
| - except RfcWriterError: |
967 |
| - raise XmlRfcError( |
968 |
| - f"Error during xml2rfc prep: {prep.errors}", |
969 |
| - xml2rfc_stdout=xml2rfc_stdout.getvalue(), |
970 |
| - xml2rfc_stderr=xml2rfc_stderr.getvalue(), |
971 |
| - ) |
972 |
| - except Exception as err: |
973 |
| - raise XmlRfcError( |
974 |
| - "Unexpected error during xml2rfc prep", |
975 |
| - xml2rfc_stdout=xml2rfc_stdout.getvalue(), |
976 |
| - xml2rfc_stderr=xml2rfc_stderr.getvalue(), |
977 |
| - ) from err |
978 |
| - |
979 |
| - # --- Convert to txt --- |
980 |
| - txt_path = staging_path(submission.name, submission.rev, '.txt') |
981 |
| - if not txt_path.exists(): |
982 |
| - writer = xml2rfc.TextWriter(xmltree, quiet=True) |
983 |
| - writer.options.accept_prepped = True |
| 941 | + # If we have v2, run it through v2v3. Keep track of the submitted version, though. |
| 942 | + xmlroot = xmltree.getroot() |
| 943 | + xml_version = xmlroot.get('version', '2') |
| 944 | + if xml_version == '2': |
| 945 | + v2v3 = xml2rfc.V2v3XmlWriter(xmltree) |
| 946 | + try: |
| 947 | + xmltree.tree = v2v3.convert2to3() |
| 948 | + except Exception as err: |
| 949 | + raise XmlRfcError( |
| 950 | + "Error converting v2 XML to v3", |
| 951 | + xml2rfc_stdout=xml2rfc_logs["stdout"].getvalue(), |
| 952 | + xml2rfc_stderr=xml2rfc_logs["stderr"].getvalue(), |
| 953 | + ) from err |
| 954 | + |
| 955 | + # --- Prep the xml --- |
| 956 | + today = date_today() |
| 957 | + prep = xml2rfc.PrepToolWriter(xmltree, quiet=True, liberal=True, keep_pis=[xml2rfc.V3_PI_TARGET]) |
| 958 | + prep.options.accept_prepped = True |
| 959 | + prep.options.date = today |
| 960 | + try: |
| 961 | + xmltree.tree = prep.prep() |
| 962 | + except RfcWriterError: |
| 963 | + raise XmlRfcError( |
| 964 | + f"Error during xml2rfc prep: {prep.errors}", |
| 965 | + xml2rfc_stdout=xml2rfc_logs["stdout"].getvalue(), |
| 966 | + xml2rfc_stderr=xml2rfc_logs["stderr"].getvalue(), |
| 967 | + ) |
| 968 | + except Exception as err: |
| 969 | + raise XmlRfcError( |
| 970 | + "Unexpected error during xml2rfc prep", |
| 971 | + xml2rfc_stdout=xml2rfc_logs["stdout"].getvalue(), |
| 972 | + xml2rfc_stderr=xml2rfc_logs["stderr"].getvalue(), |
| 973 | + ) from err |
| 974 | + |
| 975 | + # --- Convert to txt --- |
| 976 | + txt_path = staging_path(submission.name, submission.rev, '.txt') |
| 977 | + if not txt_path.exists(): |
| 978 | + writer = xml2rfc.TextWriter(xmltree, quiet=True) |
| 979 | + writer.options.accept_prepped = True |
| 980 | + writer.options.date = today |
| 981 | + try: |
| 982 | + writer.write(txt_path) |
| 983 | + except Exception as err: |
| 984 | + raise XmlRfcError( |
| 985 | + "Error generating text format from XML", |
| 986 | + xml2rfc_stdout=xml2rfc_logs["stdout"].getvalue(), |
| 987 | + xml2rfc_stderr=xml2rfc_logs["stderr"].getvalue(), |
| 988 | + ) from err |
| 989 | + log.log( |
| 990 | + 'In %s: xml2rfc %s generated %s from %s (version %s)' % ( |
| 991 | + str(xml_path.parent), |
| 992 | + xml2rfc.__version__, |
| 993 | + txt_path.name, |
| 994 | + xml_path.name, |
| 995 | + xml_version, |
| 996 | + ) |
| 997 | + ) |
| 998 | + # When the blobstores become autoritative - the guard at the |
| 999 | + # containing if statement needs to be based on the store |
| 1000 | + with Path(txt_path).open("rb") as f: |
| 1001 | + store_file("staging", f"{submission.name}-{submission.rev}.txt", f) |
| 1002 | + |
| 1003 | + # --- Convert to html --- |
| 1004 | + html_path = staging_path(submission.name, submission.rev, '.html') |
| 1005 | + writer = xml2rfc.HtmlWriter(xmltree, quiet=True) |
984 | 1006 | writer.options.date = today
|
985 | 1007 | try:
|
986 |
| - writer.write(txt_path) |
| 1008 | + writer.write(str(html_path)) |
987 | 1009 | except Exception as err:
|
988 | 1010 | raise XmlRfcError(
|
989 |
| - "Error generating text format from XML", |
990 |
| - xml2rfc_stdout=xml2rfc_stdout.getvalue(), |
991 |
| - xml2rfc_stderr=xml2rfc_stderr.getvalue(), |
| 1011 | + "Error generating HTML format from XML", |
| 1012 | + xml2rfc_stdout=xml2rfc_logs["stdout"].getvalue(), |
| 1013 | + xml2rfc_stderr=xml2rfc_logs["stderr"].getvalue(), |
992 | 1014 | ) from err
|
993 | 1015 | log.log(
|
994 | 1016 | 'In %s: xml2rfc %s generated %s from %s (version %s)' % (
|
995 | 1017 | str(xml_path.parent),
|
996 | 1018 | xml2rfc.__version__,
|
997 |
| - txt_path.name, |
| 1019 | + html_path.name, |
998 | 1020 | xml_path.name,
|
999 | 1021 | xml_version,
|
1000 | 1022 | )
|
1001 | 1023 | )
|
1002 |
| - # When the blobstores become autoritative - the guard at the |
1003 |
| - # containing if statement needs to be based on the store |
1004 |
| - with Path(txt_path).open("rb") as f: |
1005 |
| - store_file("staging", f"{submission.name}-{submission.rev}.txt", f) |
1006 |
| - |
1007 |
| - # --- Convert to html --- |
1008 |
| - html_path = staging_path(submission.name, submission.rev, '.html') |
1009 |
| - writer = xml2rfc.HtmlWriter(xmltree, quiet=True) |
1010 |
| - writer.options.date = today |
1011 |
| - try: |
1012 |
| - writer.write(str(html_path)) |
1013 |
| - except Exception as err: |
1014 |
| - raise XmlRfcError( |
1015 |
| - "Error generating HTML format from XML", |
1016 |
| - xml2rfc_stdout=xml2rfc_stdout.getvalue(), |
1017 |
| - xml2rfc_stderr=xml2rfc_stderr.getvalue(), |
1018 |
| - ) from err |
1019 |
| - log.log( |
1020 |
| - 'In %s: xml2rfc %s generated %s from %s (version %s)' % ( |
1021 |
| - str(xml_path.parent), |
1022 |
| - xml2rfc.__version__, |
1023 |
| - html_path.name, |
1024 |
| - xml_path.name, |
1025 |
| - xml_version, |
1026 |
| - ) |
1027 |
| - ) |
1028 | 1024 | with Path(html_path).open("rb") as f:
|
1029 | 1025 | store_file("staging", f"{submission.name}-{submission.rev}.html", f)
|
1030 | 1026 |
|
|
0 commit comments