The awesome document factory
This report presents the forensic synthetic code analysis of Kozea/WeasyPrint, a Python project with 9,380 GitHub stars. SynthScan v2.0 examined 79,172 lines of code across 174 source files, recording 987 pattern matches distributed across 14 syntactic categories. The overall adjusted score of 10.6 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 987 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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_missing_base_link(): | STRING |
| LOW | tests/test_pdf.py | 416 | def test_relative_links_internal(): | STRING |
| LOW | tests/test_pdf.py | 433 | def test_relative_links_anchors(): | STRING |
| LOW | tests/test_pdf.py | 449 | def test_relative_links_different_base(): | STRING |
| LOW | tests/test_pdf.py | 457 | def test_relative_links_same_base(): | STRING |
| LOW | tests/test_pdf.py | 488 | def test_anchor_multiple_pages(): | STRING |
| LOW | tests/test_pdf.py | 530 | def test_embed_images_from_pages(): | STRING |
| LOW | tests/test_pdf.py | 569 | def test_embedded_files_attachments(tmp_path): | STRING |
| LOW | tests/test_pdf.py | 636 | def test_attachments_data_with_anchor(): | STRING |
| LOW | tests/test_pdf.py | 675 | def test_attachments_none_empty(): | STRING |
| LOW | tests/test_pdf.py | 723 | def test_default_rdf_metadata(): | STRING |
| LOW | tests/test_pdf.py | 758 | def test_pdf_tags_inline_table(): | STRING |
| LOW | tests/test_pdf.py | 766 | def test_pdf_tags_split_table_with_caption(): | STRING |
| LOW | tests/test_pdf.py | 785 | 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 | 1044 | def test_overflow_wrap_trailing_space(wrap, text, body_width, expected_width): | CODE |
| LOW | tests/test_text.py | 1061 | def test_overflow_wrap_no_break_on_space(): | CODE |
| LOW | tests/test_text.py | 1077 | 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 | 916 | def test_hyphenate_limit_chars(css, result): | STRING |
| LOW | tests/test_text.py | 935 | def test_hyphenate_limit_chars_punctuation(css): | STRING |
| LOW | tests/test_text.py | 992 | def test_wrap_overflow_word_break(span_css, expected_lines): | STRING |
| LOW | tests/test_text.py | 1090 | def test_line_break_before_nested_trailing_space(): | STRING |
| LOW | tests/test_text.py | 1335 | def test_text_transform_lang_uppercase(lang, lowercase, uppercase): | STRING |
| LOW | tests/test_text.py | 1355 | def test_text_transform_lang_lowercase(lang, uppercase, lowercase): | STRING |
| LOW | tests/test_text.py | 1387 | def test_text_transform_capitalize(original, transformed, lang_code): | STRING |
| LOW | tests/test_text.py | 1394 | def test_text_floating_pre_line(): | STRING |
| LOW | tests/test_text.py | 1480 | def test_first_letter_line_height(): | STRING |
| LOW | tests/test_text.py | 1499 | def test_first_letter_text_transform(): | STRING |
| LOW | tests/test_text.py | 1547 | def test_first_line_line_height(): | STRING |
| LOW | tests/test_text.py | 1566 | def test_first_line_text_transform(): | STRING |
| LOW | tests/test_text.py | 1616 | def test_first_line_first_letter(): | STRING |
| LOW | tests/test_api.py | 252 | def test_css_base_url_as_path(): | CODE |
| LOW | tests/test_api.py | 615 | def test_bad_pdf_custom_metadata(): | STRING |
| LOW | tests/test_api.py | 623 | def test_partial_pdf_custom_metadata(): | STRING |
| LOW | tests/test_api.py | 640 | def test_output_intent_device_cmyk(): | STRING |
| LOW | tests/test_api.py | 706 | def test_no_redirect_fail_on_error(): | STRING |
| 579 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 | 1294 | CODE | |
| LOW | tests/layout/test_table.py | 2349 | CODE | |
| LOW | tests/layout/test_table.py | 2403 | CODE | |
| LOW | tests/layout/test_page.py | 1137 | CODE | |
| LOW | tests/layout/test_inline.py | 147 | CODE | |
| LOW | weasyprint/html.py | 224 | CODE | |
| LOW | weasyprint/html.py | 339 | CODE | |
| LOW | weasyprint/anchors.py | 30 | CODE | |
| LOW | weasyprint/images.py | 287 | CODE | |
| LOW | weasyprint/images.py | 259 | CODE | |
| LOW | weasyprint/images.py | 679 | CODE | |
| LOW | weasyprint/stacking.py | 69 | CODE | |
| LOW | weasyprint/urls.py | 140 | CODE | |
| LOW | weasyprint/urls.py | 180 | CODE | |
| LOW | weasyprint/urls.py | 293 | CODE | |
| LOW | weasyprint/__main__.py | 57 | CODE | |
| LOW | weasyprint/svg/defs.py | 284 | CODE | |
| LOW | weasyprint/svg/defs.py | 444 | CODE | |
| LOW | weasyprint/svg/__init__.py | 455 | CODE | |
| LOW | weasyprint/svg/__init__.py | 616 | CODE | |
| LOW | weasyprint/svg/__init__.py | 727 | CODE | |
| LOW | weasyprint/svg/__init__.py | 804 | 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 | 16 | 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 | 176 | 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 | 265 | CODE | |
| LOW | weasyprint/css/__init__.py | 284 | CODE | |
| LOW | weasyprint/css/__init__.py | 332 | CODE | |
| LOW | weasyprint/css/__init__.py | 589 | CODE | |
| LOW | weasyprint/css/__init__.py | 654 | CODE | |
| LOW | weasyprint/css/__init__.py | 723 | CODE | |
| LOW | weasyprint/css/__init__.py | 778 | CODE | |
| LOW | weasyprint/css/__init__.py | 796 | CODE | |
| LOW | weasyprint/css/__init__.py | 1366 | CODE | |
| LOW | weasyprint/css/__init__.py | 1483 | 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 | 1104 | CODE | |
| LOW | weasyprint/css/__init__.py | 1147 | 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 | |
| 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 | 311 | Lorem ipsum dolor sit amet, | CODE |
| LOW | tests/layout/test_float.py | 311 | Lorem ipsum dolor sit amet, | CODE |
| LOW | tests/layout/test_float.py | 323 | assert get_float_width(1000000) == len('Lorem ipsum dolor sit amet,') * 16 | STRING |
| LOW | tests/layout/test_float.py | 323 | 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 |
| 1 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | weasyprint/images.py | 655 | # Define the coordinates of the starting and ending points | COMMENT |
| MEDIUM | weasyprint/images.py | 684 | # Define the center of the gradient | COMMENT |
| MEDIUM | weasyprint/images.py | 750 | # 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 | 137 | # Create a pattern that matches font name. | COMMENT |
| MEDIUM | weasyprint/formatting_structure/boxes.py | 121 | # Create a new instance without calling __init__: parameters are | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | weasyprint/layout/page.py | 761 | # Step 1: page based back-references | COMMENT |
| LOW⚡ | weasyprint/layout/page.py | 771 | # Step 2: local counters | COMMENT |
| LOW | weasyprint/layout/page.py | 790 | # Step 3: targeted counters | COMMENT |
| LOW | weasyprint/text/line_break.py | 479 | # Step 5: Try to break word if it's too long for the line | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 269 | # Step 1: getting the default, we rely on Pango for this. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 270 | # Step 2: @font-face font-variant, done in fonts.add_font_face. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 271 | # Step 3: @font-face font-feature-settings, done in fonts.add_font_face. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 273 | # Step 4: font-variant and OpenType features. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 318 | # Step 5: incompatible non-OpenType features, already handled by Pango. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 320 | # 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 | 331 | except Exception as exception: # pragma: no cover | CODE |
| LOW | weasyprint/document.py | 132 | except Exception: | CODE |
| MEDIUM | weasyprint/document.py | 127 | def __del__(self): | CODE |
| LOW⚡ | weasyprint/images.py | 305 | except Exception as svg_exception: | CODE |
| LOW⚡ | weasyprint/images.py | 311 | except Exception as raster_exception: | CODE |
| LOW⚡ | weasyprint/images.py | 319 | except Exception: | CODE |
| LOW | weasyprint/urls.py | 399 | except Exception: # pragma: no cover | CODE |
| LOW | weasyprint/urls.py | 444 | except Exception as exception: | CODE |
| MEDIUM | weasyprint/urls.py | 396 | def close(self): | CODE |
| LOW | weasyprint/svg/defs.py | 23 | except Exception: | CODE |
| LOW | weasyprint/css/__init__.py | 1261 | except Exception: | CODE |
| LOW | weasyprint/pdf/fonts.py | 156 | except Exception as exception: | CODE |
| LOW | weasyprint/text/fonts.py | 172 | except Exception as exception: | CODE |
| LOW | weasyprint/text/fonts.py | 189 | except Exception as exc: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | weasyprint/layout/page.py | 761 | # Step 1: page based back-references | COMMENT |
| LOW⚡ | weasyprint/layout/page.py | 771 | # Step 2: local counters | COMMENT |
| LOW | weasyprint/layout/page.py | 790 | # Step 3: targeted counters | COMMENT |
| LOW | weasyprint/text/line_break.py | 479 | # Step 5: Try to break word if it's too long for the line | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 269 | # Step 1: getting the default, we rely on Pango for this. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 273 | # Step 4: font-variant and OpenType features. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 318 | # Step 5: incompatible non-OpenType features, already handled by Pango. | COMMENT |
| LOW⚡ | weasyprint/text/fonts.py | 320 | # Step 6: font-feature-settings. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_pdf.py | 81 | ''').write_pdf() | COMMENT |
| LOW | tests/layout/test_table.py | 2921 | def test_inline_table_baseline(vertical_align, table_position_y): | 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 | 281 | 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 | 180 | CODE | |
| LOW | weasyprint/css/__init__.py | 1854 | CODE | |
| LOW | weasyprint/layout/block.py | 18 | CODE | |
| LOW | weasyprint/pdf/metadata.py | 32 | CODE | |
| LOW | weasyprint/text/fonts.py | 258 | 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 | 370 | # Set baseline to lowest bottom content edge. | COMMENT |
| LOW | weasyprint/pdf/tags.py | 275 | # Check if it is already been referenced before. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weasyprint/layout/table.py | 583 | # 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 | 380 | CODE |