The awesome document factory
This report summarizes scanner evidence for Kozea/WeasyPrint, a Python project with 9,672 GitHub stars. SynthScan examined 81,163 lines of code across 178 source files, recording 1020 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 10.7 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 924 finding(s).
Are imports declared and package/API names verified? 63 finding(s).
Are wrappers, guards, and repeated structures necessary? 710 finding(s).
Which changes need focused human review? 1020 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1020 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 107 | def assert_different_renderings(request, *args, **kwargs): | CODE |
| LOW⚡ | tests/test_pdf.py | 383 | def test_relative_links_no_height(): | STRING |
| LOW⚡ | tests/test_pdf.py | 393 | def test_relative_links_missing_base(): | STRING |
| LOW⚡ | tests/test_pdf.py | 403 | def test_relative_links_internal(): | STRING |
| LOW | tests/test_pdf.py | 420 | def test_relative_links_anchors(): | STRING |
| LOW | tests/test_pdf.py | 436 | def test_relative_links_different_base(): | STRING |
| LOW | tests/test_pdf.py | 444 | def test_relative_links_same_base(): | STRING |
| LOW | tests/test_pdf.py | 475 | def test_anchor_multiple_pages(): | STRING |
| LOW | tests/test_pdf.py | 517 | def test_embed_images_from_pages(): | STRING |
| LOW | tests/test_pdf.py | 556 | def test_embedded_files_attachments(tmp_path): | STRING |
| LOW | tests/test_pdf.py | 625 | def test_attachments_data_with_anchor(): | STRING |
| LOW | tests/test_pdf.py | 664 | def test_attachments_none_empty(): | STRING |
| LOW | tests/test_pdf.py | 732 | def test_default_rdf_metadata(): | STRING |
| LOW | tests/test_pdf.py | 768 | def test_color_spaces_with_icc_output_intent(): | STRING |
| LOW⚡ | tests/test_pdf.py | 791 | def test_pdf_tags_inline_table(): | STRING |
| LOW⚡ | tests/test_pdf.py | 799 | def test_pdf_tags_anonymous_table_cells(): | STRING |
| LOW⚡ | tests/test_pdf.py | 809 | def test_pdf_tags_split_table_with_caption(): | STRING |
| LOW | tests/test_pdf.py | 820 | def test_pdf_tags_nested_lists_order(): | STRING |
| LOW | tests/test_pdf.py | 842 | def test_pdf_tags_table_headers(): | STRING |
| LOW | tests/test_pdf.py | 918 | def test_svg_gradient_color_ops_before_path(): | STRING |
| LOW | tests/test_fonts.py | 26 | def test_font_face_harfbuzz_face_lifetime(): | CODE |
| LOW | tests/test_fonts.py | 67 | def test_ligatures_word_space(): | CODE |
| LOW | tests/test_fonts.py | 107 | def test_kerning_ligature_deactivate(): | CODE |
| LOW | tests/test_fonts.py | 134 | def test_font_face_descriptors(): | CODE |
| LOW | tests/test_html.py | 338 | def test_parse_integer_invalid(string): | STRING |
| LOW | tests/test_html.py | 359 | def test_parse_non_negative_integer(string, expected): | STRING |
| LOW | tests/test_html.py | 374 | def test_parse_non_negative_integer_invalid(string): | STRING |
| LOW | tests/test_html.py | 392 | def test_parse_dimension_value(string, expected): | STRING |
| LOW | tests/test_html.py | 411 | def test_parse_dimension_value_invalid(string): | STRING |
| LOW | tests/test_html.py | 448 | def test_map_to_pixel_length_invalid(string): | STRING |
| LOW | tests/test_html.py | 466 | def test_map_to_dimension_property(string, expected): | STRING |
| LOW | tests/test_html.py | 485 | def test_map_to_dimension_property_invalid(string): | STRING |
| LOW | tests/test_html.py | 502 | def test_map_to_dimension_property_ignoring_zero(string, expected): | STRING |
| LOW | tests/test_html.py | 524 | def test_map_to_dimension_property_ignoring_zero_invalid(string): | STRING |
| LOW | tests/test_text.py | 326 | def test_text_align_justify_all(): | CODE |
| LOW | tests/test_text.py | 406 | def test_text_align_not_enough_space(): | CODE |
| LOW | tests/test_text.py | 421 | def test_text_align_justify_no_space(): | CODE |
| LOW | tests/test_text.py | 478 | def test_text_align_justify_no_break_between_children(): | CODE |
| LOW | tests/test_text.py | 1056 | def test_overflow_wrap_trailing_space(wrap, text, body_width, expected_width): | CODE |
| LOW | tests/test_text.py | 1073 | def test_overflow_wrap_no_break_on_space(): | CODE |
| LOW | tests/test_text.py | 1089 | def test_line_break_before_trailing_space(): | CODE |
| LOW | tests/test_text.py | 89 | def test_line_breaking_trailing_inline_width(): | STRING |
| LOW | tests/test_text.py | 164 | def test_text_font_size_very_small(): | STRING |
| LOW | tests/test_text.py | 438 | def test_text_align_justify_text_indent(): | STRING |
| LOW | tests/test_text.py | 638 | def test_text_indent_multipage(indent): | STRING |
| LOW | tests/test_text.py | 821 | def test_hyphenate_manual_keep_hyphen(): | STRING |
| LOW | tests/test_text.py | 928 | def test_hyphenate_limit_chars(css, result): | STRING |
| LOW | tests/test_text.py | 947 | def test_hyphenate_limit_chars_punctuation(css): | STRING |
| LOW | tests/test_text.py | 1004 | def test_wrap_overflow_word_break(span_css, expected_lines): | STRING |
| LOW | tests/test_text.py | 1102 | def test_line_break_before_nested_trailing_space(): | STRING |
| LOW | tests/test_text.py | 1347 | def test_text_transform_lang_uppercase(lang, lowercase, uppercase): | STRING |
| LOW | tests/test_text.py | 1367 | def test_text_transform_lang_lowercase(lang, uppercase, lowercase): | STRING |
| LOW | tests/test_text.py | 1399 | def test_text_transform_capitalize(original, transformed, lang_code): | STRING |
| LOW | tests/test_text.py | 1406 | def test_text_floating_pre_line(): | STRING |
| LOW | tests/test_text.py | 1492 | def test_first_letter_line_height(): | STRING |
| LOW | tests/test_text.py | 1511 | def test_first_letter_text_transform(): | STRING |
| LOW | tests/test_text.py | 1559 | def test_first_line_line_height(): | STRING |
| LOW | tests/test_text.py | 1578 | def test_first_line_text_transform(): | STRING |
| LOW | tests/test_text.py | 1628 | def test_first_line_first_letter(): | STRING |
| LOW | tests/test_api.py | 232 | def test_css_base_url_as_path(): | CODE |
| 609 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/testing_utils.py | 108 | CODE | |
| LOW | tests/testing_utils.py | 142 | CODE | |
| LOW | tests/testing_utils.py | 111 | CODE | |
| LOW | tests/test_api.py | 1259 | CODE | |
| LOW | tests/layout/test_table.py | 2348 | CODE | |
| LOW | tests/layout/test_table.py | 2402 | CODE | |
| LOW | tests/layout/test_page.py | 1137 | CODE | |
| LOW | tests/layout/test_inline.py | 147 | CODE | |
| LOW | weasyprint/html.py | 312 | CODE | |
| LOW | weasyprint/anchors.py | 30 | CODE | |
| LOW | weasyprint/images.py | 290 | CODE | |
| LOW | weasyprint/images.py | 368 | CODE | |
| LOW | weasyprint/images.py | 262 | CODE | |
| LOW | weasyprint/images.py | 695 | CODE | |
| LOW | weasyprint/stacking.py | 69 | CODE | |
| LOW | weasyprint/urls.py | 122 | CODE | |
| LOW | weasyprint/urls.py | 162 | CODE | |
| LOW | weasyprint/__main__.py | 57 | CODE | |
| LOW | weasyprint/svg/defs.py | 282 | CODE | |
| LOW | weasyprint/svg/defs.py | 442 | CODE | |
| LOW | weasyprint/svg/__init__.py | 457 | CODE | |
| LOW | weasyprint/svg/__init__.py | 618 | CODE | |
| LOW | weasyprint/svg/__init__.py | 729 | CODE | |
| LOW | weasyprint/svg/__init__.py | 806 | CODE | |
| LOW | weasyprint/svg/css.py | 13 | CODE | |
| LOW | weasyprint/svg/css.py | 68 | CODE | |
| LOW | weasyprint/svg/bounding_box.py | 68 | CODE | |
| LOW | weasyprint/svg/utils.py | 27 | CODE | |
| LOW | weasyprint/svg/utils.py | 149 | CODE | |
| LOW | weasyprint/svg/utils.py | 166 | CODE | |
| LOW | weasyprint/svg/text.py | 25 | CODE | |
| LOW | weasyprint/svg/path.py | 18 | CODE | |
| LOW | weasyprint/css/counters.py | 23 | CODE | |
| LOW | weasyprint/css/counters.py | 44 | CODE | |
| LOW | weasyprint/css/counters.py | 103 | CODE | |
| LOW | weasyprint/css/functions.py | 126 | CODE | |
| LOW | weasyprint/css/functions.py | 177 | CODE | |
| LOW | weasyprint/css/functions.py | 23 | CODE | |
| LOW | weasyprint/css/targets.py | 184 | CODE | |
| LOW | weasyprint/css/units.py | 58 | CODE | |
| LOW | weasyprint/css/__init__.py | 282 | CODE | |
| LOW | weasyprint/css/__init__.py | 301 | CODE | |
| LOW | weasyprint/css/__init__.py | 349 | CODE | |
| LOW | weasyprint/css/__init__.py | 603 | CODE | |
| LOW | weasyprint/css/__init__.py | 668 | CODE | |
| LOW | weasyprint/css/__init__.py | 737 | CODE | |
| LOW | weasyprint/css/__init__.py | 792 | CODE | |
| LOW | weasyprint/css/__init__.py | 810 | CODE | |
| LOW | weasyprint/css/__init__.py | 1376 | CODE | |
| LOW | weasyprint/css/__init__.py | 1493 | CODE | |
| LOW | weasyprint/css/__init__.py | 62 | CODE | |
| LOW | weasyprint/css/__init__.py | 163 | CODE | |
| LOW | weasyprint/css/__init__.py | 204 | CODE | |
| LOW | weasyprint/css/__init__.py | 1114 | CODE | |
| LOW | weasyprint/css/__init__.py | 1157 | CODE | |
| LOW | weasyprint/css/tokens.py | 159 | CODE | |
| LOW | weasyprint/css/tokens.py | 187 | CODE | |
| LOW | weasyprint/css/tokens.py | 236 | CODE | |
| LOW | weasyprint/css/tokens.py | 337 | CODE | |
| LOW | weasyprint/css/tokens.py | 368 | CODE | |
| 145 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_api.py | 0 | ________ ________ __rbbb__ __bbbb__ __bbbb__ __bbbb__ ________ ________ __rbbb__ __bbbb__ __bbbb__ __bbbb__ ________ ___ | STRING |
| HIGH | tests/draw/test_image.py | 0 | ________ ________ __rbbb__ __bbbb__ __bbbb__ __bbbb__ ________ ________ __rbbb__ __bbbb__ __bbbb__ __bbbb__ ________ ___ | STRING |
| HIGH | tests/draw/test_transform.py | 0 | ________ ________ __rbbb__ __bbbb__ __bbbb__ __bbbb__ ________ ________ __rbbb__ __bbbb__ __bbbb__ __bbbb__ ________ ___ | STRING |
| HIGH | tests/draw/test_overflow.py | 0 | ________ ________ __rbbb__ __bbbb__ __bbbb__ __bbbb__ ________ ________ __rbbb__ __bbbb__ __bbbb__ __bbbb__ ________ ___ | STRING |
| HIGH | tests/draw/test_list.py | 0 | __________ __________ __________ __________ __________ __________ __________ __________ __________ __________ | STRING |
| HIGH | tests/draw/test_background.py | 0 | __________ __________ __________ __________ __________ __________ __________ __________ __________ __________ | STRING |
| HIGH | tests/draw/svg/test_gradients.py | 0 | __________ __________ __________ __________ __________ __________ __________ __________ __________ __________ | STRING |
| HIGH | tests/draw/svg/test_transform.py | 0 | _rrrrrrr_ _rr___rr_ _rr___rr_ _rr___rr_ _rrrrrrr_ _rrrrrrr_ _________ _________ _________ | STRING |
| HIGH | tests/draw/svg/test_units.py | 0 | _rrrrrrr_ _rr___rr_ _rr___rr_ _rr___rr_ _rrrrrrr_ _rrrrrrr_ _________ _________ _________ | STRING |
| HIGH | tests/draw/svg/test_shapes.py | 0 | _rrrrrrr_ _rr___rr_ _rr___rr_ _rr___rr_ _rrrrrrr_ _rrrrrrr_ _________ _________ _________ | STRING |
| HIGH | tests/draw/svg/test_transform.py | 0 | <style> @page { size: 9px } svg { display: block } </style> <svg width="9px" height="9px" xmlns="http://www.w3.org/2000/ | STRING |
| HIGH | tests/draw/svg/test_shapes.py | 0 | <style> @page { size: 9px } svg { display: block } </style> <svg width="9px" height="9px" xmlns="http://www.w3.org/2000/ | STRING |
| HIGH | tests/draw/svg/test_clip.py | 0 | <style> @page { size: 9px } svg { display: block } </style> <svg width="9px" height="9px" xmlns="http://www.w3.org/2000/ | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_text.py | 522 | <body><strong>Lorem ipsum dolor<em>sit amet</em></strong>''') | CODE |
| LOW⚡ | tests/test_text.py | 510 | 'Lorem ipsum dolor<em>sit amet</em>', | STRING |
| LOW⚡ | tests/test_text.py | 511 | 'Lorem ipsum <em>dolorsit</em> amet', | STRING |
| LOW⚡ | tests/test_text.py | 512 | 'Lorem ipsum <em></em>dolorsit amet', | STRING |
| LOW⚡ | tests/test_text.py | 513 | 'Lorem ipsum<em> </em>dolorsit amet', | STRING |
| LOW⚡ | tests/test_text.py | 514 | 'Lorem ipsum<em> dolorsit</em> amet', | STRING |
| LOW⚡ | tests/test_text.py | 515 | 'Lorem ipsum <em>dolorsit </em>amet', | STRING |
| LOW | tests/test_boxes.py | 225 | ('p', 'Text', 'Lorem ipsum '), | STRING |
| LOW | tests/test_boxes.py | 724 | <p><q>Lorem ipsum <q>dolor</q> sit amet</q></p> | CODE |
| LOW | tests/test_boxes.py | 731 | ('q', 'Text', 'Lorem ipsum '), | STRING |
| LOW | tests/test_boxes.py | 777 | <p><q>Lorem ipsum <q>dolor</q> sit amet</q></p> | CODE |
| LOW | tests/test_boxes.py | 784 | ('q', 'Text', 'Lorem ipsum '), | STRING |
| LOW | tests/test_boxes.py | 804 | <p><q>Lorem ipsum <q>dolor</q> sit amet</q></p> | CODE |
| LOW | tests/test_boxes.py | 811 | ('q', 'Text', 'Lorem ipsum '), | STRING |
| LOW | tests/test_boxes.py | 830 | <p lang="fr"><q>Lorem ipsum <q>dolor</q> sit amet</q></p> | CODE |
| LOW | tests/test_boxes.py | 837 | ('q', 'Text', 'Lorem ipsum '), | STRING |
| LOW⚡ | tests/test_boxes.py | 856 | <p lang="fr_CH"><q>Lorem ipsum <q>dolor</q> sit amet</q></p> | CODE |
| LOW⚡ | tests/test_boxes.py | 863 | ('q', 'Text', 'Lorem ipsum '), | STRING |
| LOW | tests/test_boxes.py | 882 | <p lang="fr_CH_alt"><q>Lorem ipsum <q>dolor</q> sit amet</q></p> | CODE |
| LOW | tests/test_boxes.py | 889 | ('q', 'Text', 'Lorem ipsum '), | STRING |
| LOW | tests/test_boxes.py | 917 | <p>lorem ipsum | CODE |
| LOW | tests/test_boxes.py | 1239 | <p>lorem ipsum dolor | CODE |
| LOW | tests/layout/test_block.py | 369 | <p id=p1>Lorem ipsum | CODE |
| LOW | tests/layout/test_block.py | 370 | <p id=p2>dolor sit amet | CODE |
| LOW | tests/layout/test_block.py | 390 | <p id=p1>Lorem ipsum | CODE |
| LOW | tests/layout/test_block.py | 392 | <p id=p2>dolor sit amet | CODE |
| LOW | tests/layout/test_block.py | 412 | <p id=p1>Lorem ipsum | CODE |
| LOW | tests/layout/test_block.py | 414 | <p id=p2>dolor sit amet | CODE |
| LOW | tests/layout/test_block.py | 435 | <p id=p1>Lorem ipsum | CODE |
| LOW | tests/layout/test_block.py | 438 | <p id=p2>dolor sit amet | CODE |
| LOW | tests/layout/test_block.py | 461 | <p>Lorem ipsum | CODE |
| LOW | tests/layout/test_block.py | 464 | <p id=p2>dolor sit amet | CODE |
| LOW | tests/layout/test_block.py | 490 | <p>Lorem ipsum | CODE |
| LOW | tests/layout/test_block.py | 493 | <p id=p2>dolor sit amet | CODE |
| LOW | tests/layout/test_block.py | 517 | <p id=p1>Lorem ipsum | CODE |
| LOW | tests/layout/test_block.py | 519 | <p id=p2>dolor sit amet | CODE |
| LOW | tests/layout/test_block.py | 537 | <p>Lorem ipsum | CODE |
| LOW | tests/layout/test_block.py | 556 | <p>Lorem ipsum | CODE |
| LOW | tests/layout/test_inline_block.py | 20 | Ipsum dolor sit amet, | CODE |
| LOW | tests/layout/test_inline.py | 493 | <p><em>Lorem Ipsum</em>is very <strong>coool</strong></p> | CODE |
| LOW | tests/layout/test_inline.py | 505 | assert text == 'Lorem Ipsumis very coool' | STRING |
| LOW⚡ | tests/layout/test_inline.py | 544 | <pre>Lorem ipsum dolor sit amet, | CODE |
| LOW⚡ | tests/layout/test_inline.py | 544 | <pre>Lorem ipsum dolor sit amet, | CODE |
| LOW⚡ | tests/layout/test_inline.py | 566 | <p>Lorem ipsum dolor sit amet,<br> | CODE |
| LOW⚡ | tests/layout/test_inline.py | 566 | <p>Lorem ipsum dolor sit amet,<br> | CODE |
| LOW | tests/layout/test_column.py | 25 | Ipsum dolor sit amet, | CODE |
| LOW | tests/layout/test_column.py | 56 | Ipsum dolor sit amet, | CODE |
| LOW | tests/layout/test_float.py | 347 | Lorem ipsum dolor sit amet, | CODE |
| LOW | tests/layout/test_float.py | 347 | Lorem ipsum dolor sit amet, | CODE |
| LOW | tests/layout/test_float.py | 359 | assert get_float_width(1000000) == len('Lorem ipsum dolor sit amet,') * 16 | STRING |
| LOW | tests/layout/test_float.py | 359 | assert get_float_width(1000000) == len('Lorem ipsum dolor sit amet,') * 16 | STRING |
| LOW⚡ | tests/layout/test_flex.py | 808 | Lorem ipsum dolor sit amet | CODE |
| LOW⚡ | tests/layout/test_flex.py | 808 | Lorem ipsum dolor sit amet | CODE |
| LOW⚡ | tests/layout/test_flex.py | 813 | Lorem ipsum dolor sit amet | CODE |
| LOW⚡ | tests/layout/test_flex.py | 813 | Lorem ipsum dolor sit amet | CODE |
| LOW⚡ | tests/layout/test_flex.py | 832 | Lorem ipsum dolor sit amet | CODE |
| LOW⚡ | tests/layout/test_flex.py | 832 | Lorem ipsum dolor sit amet | CODE |
| LOW⚡ | tests/layout/test_flex.py | 835 | Lorem ipsum dolor sit amet | CODE |
| LOW⚡ | tests/layout/test_flex.py | 835 | Lorem ipsum dolor sit amet | CODE |
| LOW | tests/draw/test_before_after.py | 36 | <p><q>Lorem ipsum <q>dolor</q> sit amet</q></p> | STRING |
| 2 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | weasyprint/images.py | 671 | # Define the coordinates of the starting and ending points | COMMENT |
| MEDIUM | weasyprint/images.py | 700 | # Define the center of the gradient | COMMENT |
| MEDIUM | weasyprint/images.py | 766 | # Define the coordinates of the gradient circles | COMMENT |
| MEDIUM | weasyprint/layout/preferred.py | 456 | # Create the grid | COMMENT |
| MEDIUM | weasyprint/layout/preferred.py | 475 | # Define the total horizontal border spacing | COMMENT |
| MEDIUM | weasyprint/layout/preferred.py | 515 | # Define the intermediate content widths | COMMENT |
| MEDIUM | weasyprint/layout/column.py | 50 | # Define the number of columns and their widths | COMMENT |
| MEDIUM | weasyprint/text/fonts.py | 136 | # Create a pattern that matches font name. | COMMENT |
| MEDIUM | weasyprint/formatting_structure/boxes.py | 131 | # Create a new instance without calling __init__: parameters are | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | weasyprint/layout/page.py | 813 | # Step 1: page based back-references | COMMENT |
| LOW⚡ | weasyprint/layout/page.py | 823 | # Step 2: local counters | COMMENT |
| LOW | weasyprint/layout/page.py | 842 | # Step 3: targeted counters | COMMENT |
| LOW | weasyprint/text/line_break.py | 477 | # Step 5: Try to break word if it's too long for the line | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 268 | # Step 1: getting the default, we rely on Pango for this. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 269 | # Step 2: @font-face font-variant, done in fonts.add_font_face. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 270 | # Step 3: @font-face font-feature-settings, done in fonts.add_font_face. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 272 | # Step 4: font-variant and OpenType features. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 317 | # Step 5: incompatible non-OpenType features, already handled by Pango. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 319 | # Step 6: font-feature-settings. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/testing_utils.py | 115 | except Exception: # pragma: no cover | CODE |
| LOW | weasyprint/html.py | 304 | except Exception as exception: | CODE |
| LOW | weasyprint/document.py | 132 | except Exception: | CODE |
| MEDIUM | weasyprint/document.py | 127 | def __del__(self): | CODE |
| LOW⚡ | weasyprint/images.py | 308 | except Exception as svg_exception: | CODE |
| LOW⚡ | weasyprint/images.py | 314 | except Exception as raster_exception: | CODE |
| LOW⚡ | weasyprint/images.py | 322 | except Exception: | CODE |
| LOW⚡ | weasyprint/images.py | 332 | except Exception as raster_exception: | CODE |
| LOW | weasyprint/urls.py | 374 | except Exception: # pragma: no cover | CODE |
| LOW | weasyprint/urls.py | 419 | except Exception as exception: | CODE |
| MEDIUM | weasyprint/urls.py | 371 | def close(self): | CODE |
| LOW | weasyprint/svg/defs.py | 23 | except Exception: | CODE |
| LOW | weasyprint/css/__init__.py | 1271 | except Exception: | CODE |
| LOW | weasyprint/pdf/fonts.py | 169 | except Exception as exception: | CODE |
| LOW | weasyprint/text/fonts.py | 171 | except Exception as exception: | CODE |
| LOW | weasyprint/text/fonts.py | 188 | except Exception as exc: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | weasyprint/layout/page.py | 813 | # Step 1: page based back-references | COMMENT |
| LOW⚡ | weasyprint/layout/page.py | 823 | # Step 2: local counters | COMMENT |
| LOW | weasyprint/layout/page.py | 842 | # Step 3: targeted counters | COMMENT |
| LOW | weasyprint/text/line_break.py | 477 | # Step 5: Try to break word if it's too long for the line | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 268 | # Step 1: getting the default, we rely on Pango for this. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 272 | # Step 4: font-variant and OpenType features. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 317 | # Step 5: incompatible non-OpenType features, already handled by Pango. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 319 | # Step 6: font-feature-settings. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | weasyprint/document.py | 132 | except Exception: | CODE |
| HIGH | weasyprint/urls.py | 357 | except ValueError: | CODE |
| HIGH | weasyprint/css/validation/expanders.py | 916 | except InvalidValues: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_pdf.py | 81 | ''').write_pdf() | COMMENT |
| LOW | tests/layout/test_position.py | 281 | assert (p1.position_x, p1.position_y) == (0, 0) | COMMENT |
| LOW | weasyprint/__init__.py | 21 | #: command-line. | COMMENT |
| LOW | weasyprint/__init__.py | 41 | #: :param bool pdf_tags: | COMMENT |
| LOW | weasyprint/document.py | 41 | #: ``'bottom'`` and ``'left'`` as keys, and values in CSS pixels. | COMMENT |
| LOW | weasyprint/document.py | 61 | #: The anchor might be defined in another page, | COMMENT |
| LOW | weasyprint/css/__init__.py | 61 | """Convenience function to get the computed styles for an element.""" | COMMENT |
| LOW | weasyprint/layout/preferred.py | 381 | # "The line breaking behavior of a replaced element | COMMENT |
| LOW | weasyprint/layout/column.py | 81 | COMMENT | |
| LOW | weasyprint/pdf/metadata.py | 41 | #: Extracted from the ``<meta name=author>`` elements in HTML | COMMENT |
| LOW | weasyprint/pdf/metadata.py | 61 | #: Extracted from the ``<meta name=dcterms.created>`` element in HTML | COMMENT |
| LOW | weasyprint/pdf/anchors.py | 321 | def add_annotations(links, matrix, document, pdf, page, annot_files, compress): | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weasyprint/__init__.py | 158 | CODE | |
| LOW | weasyprint/__init__.py | 287 | CODE | |
| LOW | weasyprint/__init__.py | 347 | CODE | |
| LOW | weasyprint/urls.py | 162 | CODE | |
| LOW | weasyprint/css/__init__.py | 1864 | CODE | |
| LOW | weasyprint/layout/block.py | 18 | CODE | |
| LOW | weasyprint/pdf/metadata.py | 32 | CODE | |
| LOW | weasyprint/text/fonts.py | 257 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weasyprint/layout/float.py | 172 | # Assign locals to avoid slow attribute lookups. | COMMENT |
| LOW | weasyprint/layout/table.py | 363 | # Set baseline to lowest bottom content edge. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weasyprint/layout/table.py | 565 | # If the height property has a bigger value, just add blank space | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weasyprint/__init__.py | 88 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weasyprint/__init__.py | 379 | CODE |