(
message: ContentviewMessage,
flow: flow.Flow,
view_name: str = "auto",
registry: ContentviewRegistry = registry,
)
| 60 | |
| 61 | |
| 62 | def prettify_message( |
| 63 | message: ContentviewMessage, |
| 64 | flow: flow.Flow, |
| 65 | view_name: str = "auto", |
| 66 | registry: ContentviewRegistry = registry, |
| 67 | ) -> ContentviewResult: |
| 68 | data, enc = get_data(message) |
| 69 | if data is None: |
| 70 | return ContentviewResult( |
| 71 | text="Content is missing.", |
| 72 | syntax_highlight="error", |
| 73 | description="", |
| 74 | view_name=None, |
| 75 | ) |
| 76 | |
| 77 | # Determine the correct view |
| 78 | metadata = make_metadata(message, flow) |
| 79 | view = registry.get_view(data, metadata, view_name) |
| 80 | |
| 81 | # Finally, we can pretty-print! |
| 82 | try: |
| 83 | ret = ContentviewResult( |
| 84 | text=view.prettify(data, metadata), |
| 85 | syntax_highlight=view.syntax_highlight, |
| 86 | view_name=view.name, |
| 87 | description=enc, |
| 88 | ) |
| 89 | except Exception as e: |
| 90 | logger.debug(f"Contentview {view.name!r} failed: {e}", exc_info=True) |
| 91 | if view_name == "auto": |
| 92 | # If the contentview was chosen as the best matching one, fall back to raw. |
| 93 | ret = ContentviewResult( |
| 94 | text=raw.prettify(data, metadata), |
| 95 | syntax_highlight=raw.syntax_highlight, |
| 96 | view_name=raw.name, |
| 97 | description=f"{enc}[failed to parse as {view.name}]", |
| 98 | ) |
| 99 | else: |
| 100 | # Cut the exception traceback for display. |
| 101 | exc, value, tb = sys.exc_info() |
| 102 | tb_cut = cut_traceback(tb, "prettify_message") |
| 103 | if ( |
| 104 | tb_cut == tb |
| 105 | ): # If there are no extra frames, just skip displaying the traceback. |
| 106 | tb_cut = None |
| 107 | # If the contentview has been set explicitly, we display a hard error. |
| 108 | err = "".join(traceback.format_exception(exc, value=value, tb=tb_cut)) |
| 109 | ret = ContentviewResult( |
| 110 | text=f"Couldn't parse as {view.name}:\n{err}", |
| 111 | syntax_highlight="error", |
| 112 | view_name=view.name, |
| 113 | description=enc, |
| 114 | ) |
| 115 | |
| 116 | ret.text = strutils.escape_control_characters(ret.text) |
| 117 | return ret |
| 118 | |
| 119 |
searching dependent graphs…