weasyprint 64.1__tar.gz → 65.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. {weasyprint-64.1 → weasyprint-65.1}/PKG-INFO +2 -2
  2. {weasyprint-64.1 → weasyprint-65.1}/docs/changelog.rst +143 -0
  3. {weasyprint-64.1 → weasyprint-65.1}/docs/first_steps.rst +1 -1
  4. {weasyprint-64.1 → weasyprint-65.1}/pyproject.toml +1 -1
  5. weasyprint-65.1/tests/css/test_ua.py +13 -0
  6. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_opacity.py +0 -2
  7. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_text.py +38 -0
  8. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_text.py +107 -0
  9. weasyprint-65.1/tests/layout/test_flex.py +1833 -0
  10. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_float.py +8 -0
  11. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_page.py +68 -0
  12. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_table.py +17 -0
  13. weasyprint-65.1/tests/resources/weasyprint.otf +0 -0
  14. {weasyprint-64.1 → weasyprint-65.1}/tests/test_api.py +25 -0
  15. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/__init__.py +2 -1
  16. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/computed_values.py +1 -1
  17. weasyprint-65.1/weasyprint/css/html5_ph.css +79 -0
  18. weasyprint-65.1/weasyprint/css/html5_ua.css +263 -0
  19. weasyprint-65.1/weasyprint/css/html5_ua_form.css +5 -0
  20. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/validation/descriptors.py +9 -0
  21. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/draw/border.py +4 -4
  22. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/draw/text.py +12 -8
  23. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/formatting_structure/build.py +17 -17
  24. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/images.py +2 -2
  25. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/__init__.py +17 -0
  26. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/absolute.py +1 -1
  27. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/block.py +23 -20
  28. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/column.py +2 -3
  29. weasyprint-65.1/weasyprint/layout/flex.py +932 -0
  30. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/float.py +6 -4
  31. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/inline.py +23 -27
  32. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/page.py +22 -18
  33. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/percent.py +41 -46
  34. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/preferred.py +13 -16
  35. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/pdf/fonts.py +22 -23
  36. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/stacking.py +2 -2
  37. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/svg/__init__.py +6 -3
  38. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/text/constants.py +5 -0
  39. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/text/ffi.py +12 -0
  40. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/text/fonts.py +12 -3
  41. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/text/line_break.py +8 -7
  42. weasyprint-64.1/tests/layout/test_flex.py +0 -799
  43. weasyprint-64.1/tests/resources/weasyprint.otf +0 -0
  44. weasyprint-64.1/weasyprint/css/html5_ph.css +0 -192
  45. weasyprint-64.1/weasyprint/css/html5_ua.css +0 -763
  46. weasyprint-64.1/weasyprint/css/html5_ua_form.css +0 -15
  47. weasyprint-64.1/weasyprint/layout/flex.py +0 -1107
  48. {weasyprint-64.1 → weasyprint-65.1}/LICENSE +0 -0
  49. {weasyprint-64.1 → weasyprint-65.1}/README.rst +0 -0
  50. {weasyprint-64.1 → weasyprint-65.1}/docs/api_reference.rst +0 -0
  51. {weasyprint-64.1 → weasyprint-65.1}/docs/common_use_cases.rst +0 -0
  52. {weasyprint-64.1 → weasyprint-65.1}/docs/conf.py +0 -0
  53. {weasyprint-64.1 → weasyprint-65.1}/docs/contribute.rst +0 -0
  54. {weasyprint-64.1 → weasyprint-65.1}/docs/going_further.rst +0 -0
  55. {weasyprint-64.1 → weasyprint-65.1}/docs/index.rst +0 -0
  56. {weasyprint-64.1 → weasyprint-65.1}/docs/manpage.rst +0 -0
  57. {weasyprint-64.1 → weasyprint-65.1}/docs/support.rst +0 -0
  58. {weasyprint-64.1 → weasyprint-65.1}/tests/__init__.py +0 -0
  59. {weasyprint-64.1 → weasyprint-65.1}/tests/conftest.py +0 -0
  60. {weasyprint-64.1 → weasyprint-65.1}/tests/css/__init__.py +0 -0
  61. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_common.py +0 -0
  62. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_counters.py +0 -0
  63. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_descriptors.py +0 -0
  64. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_errors.py +0 -0
  65. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_expanders.py +0 -0
  66. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_fonts.py +0 -0
  67. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_nesting.py +0 -0
  68. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_pages.py +0 -0
  69. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_target.py +0 -0
  70. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_validation.py +0 -0
  71. {weasyprint-64.1 → weasyprint-65.1}/tests/css/test_variables.py +0 -0
  72. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/__init__.py +0 -0
  73. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/__init__.py +0 -0
  74. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_bounding_box.py +0 -0
  75. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_clip.py +0 -0
  76. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_defs.py +0 -0
  77. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_gradients.py +0 -0
  78. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_images.py +0 -0
  79. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_markers.py +0 -0
  80. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_paths.py +0 -0
  81. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_patterns.py +0 -0
  82. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_shapes.py +0 -0
  83. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_transform.py +0 -0
  84. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_units.py +0 -0
  85. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/svg/test_visibility.py +0 -0
  86. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_absolute.py +0 -0
  87. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_background.py +0 -0
  88. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_before_after.py +0 -0
  89. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_box.py +0 -0
  90. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_column.py +0 -0
  91. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_current_color.py +0 -0
  92. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_float.py +0 -0
  93. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_footnote.py +0 -0
  94. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_footnote_column.py +0 -0
  95. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_gradient.py +0 -0
  96. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_image.py +0 -0
  97. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_leader.py +0 -0
  98. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_list.py +0 -0
  99. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_opacity.py +0 -0
  100. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_overflow.py +0 -0
  101. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_page.py +0 -0
  102. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_table.py +0 -0
  103. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_transform.py +0 -0
  104. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_visibility.py +0 -0
  105. {weasyprint-64.1 → weasyprint-65.1}/tests/draw/test_whitespace.py +0 -0
  106. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/__init__.py +0 -0
  107. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_block.py +0 -0
  108. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_column.py +0 -0
  109. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_footnotes.py +0 -0
  110. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_grid.py +0 -0
  111. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_image.py +0 -0
  112. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_inline.py +0 -0
  113. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_inline_block.py +0 -0
  114. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_list.py +0 -0
  115. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_position.py +0 -0
  116. {weasyprint-64.1 → weasyprint-65.1}/tests/layout/test_shrink_to_fit.py +0 -0
  117. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/acid2-reference.html +0 -0
  118. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/acid2-test.html +0 -0
  119. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/blue.jpg +0 -0
  120. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/border.svg +0 -0
  121. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/border2.svg +0 -0
  122. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/doc1.html +0 -0
  123. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/doc1_UTF-16BE.html +0 -0
  124. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/icon.png +0 -0
  125. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/latin1-test.css +0 -0
  126. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/logo_small.png +0 -0
  127. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/mask.svg +0 -0
  128. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/mini_ua.css +0 -0
  129. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/not-optimized-exif.jpg +0 -0
  130. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/not-optimized.jpg +0 -0
  131. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/pattern-transparent.svg +0 -0
  132. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/pattern.gif +0 -0
  133. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/pattern.palette.png +0 -0
  134. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/pattern.png +0 -0
  135. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/pattern.svg +0 -0
  136. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/really-a-png.svg +0 -0
  137. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/really-a-svg.png +0 -0
  138. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/sheet2.css +0 -0
  139. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/sub_directory/sheet1.css +0 -0
  140. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/tests_ua.css +0 -0
  141. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/user.css +0 -0
  142. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/utf8-test.css +0 -0
  143. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/weasyprint.otb +0 -0
  144. {weasyprint-64.1 → weasyprint-65.1}/tests/resources/weasyprint.woff +0 -0
  145. {weasyprint-64.1 → weasyprint-65.1}/tests/test_acid2.py +0 -0
  146. {weasyprint-64.1 → weasyprint-65.1}/tests/test_boxes.py +0 -0
  147. {weasyprint-64.1 → weasyprint-65.1}/tests/test_fonts.py +0 -0
  148. {weasyprint-64.1 → weasyprint-65.1}/tests/test_pdf.py +0 -0
  149. {weasyprint-64.1 → weasyprint-65.1}/tests/test_presentational_hints.py +0 -0
  150. {weasyprint-64.1 → weasyprint-65.1}/tests/test_stacking.py +0 -0
  151. {weasyprint-64.1 → weasyprint-65.1}/tests/test_text.py +0 -0
  152. {weasyprint-64.1 → weasyprint-65.1}/tests/test_unicode.py +0 -0
  153. {weasyprint-64.1 → weasyprint-65.1}/tests/test_url.py +0 -0
  154. {weasyprint-64.1 → weasyprint-65.1}/tests/testing_utils.py +0 -0
  155. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/__main__.py +0 -0
  156. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/anchors.py +0 -0
  157. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/__init__.py +0 -0
  158. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/counters.py +0 -0
  159. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/media_queries.py +0 -0
  160. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/properties.py +0 -0
  161. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/targets.py +0 -0
  162. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/utils.py +0 -0
  163. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/validation/__init__.py +0 -0
  164. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/validation/expanders.py +0 -0
  165. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/css/validation/properties.py +0 -0
  166. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/document.py +0 -0
  167. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/draw/__init__.py +0 -0
  168. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/draw/color.py +0 -0
  169. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/draw/stack.py +0 -0
  170. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/formatting_structure/boxes.py +0 -0
  171. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/html.py +0 -0
  172. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/background.py +0 -0
  173. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/grid.py +0 -0
  174. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/leader.py +0 -0
  175. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/min_max.py +0 -0
  176. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/replaced.py +0 -0
  177. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/layout/table.py +0 -0
  178. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/logger.py +0 -0
  179. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/matrix.py +0 -0
  180. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/pdf/__init__.py +0 -0
  181. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/pdf/anchors.py +0 -0
  182. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/pdf/debug.py +0 -0
  183. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/pdf/metadata.py +0 -0
  184. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/pdf/pdfa.py +0 -0
  185. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/pdf/pdfua.py +0 -0
  186. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/pdf/sRGB2014.icc +0 -0
  187. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/pdf/stream.py +0 -0
  188. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/svg/bounding_box.py +0 -0
  189. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/svg/css.py +0 -0
  190. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/svg/defs.py +0 -0
  191. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/svg/images.py +0 -0
  192. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/svg/path.py +0 -0
  193. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/svg/shapes.py +0 -0
  194. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/svg/text.py +0 -0
  195. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/svg/utils.py +0 -0
  196. {weasyprint-64.1 → weasyprint-65.1}/weasyprint/urls.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: weasyprint
3
- Version: 64.1
3
+ Version: 65.1
4
4
  Summary: The Awesome Document Factory
5
5
  Keywords: html,css,pdf,converter
6
6
  Author-email: Simon Sapin <simon.sapin@exyr.org>
@@ -30,7 +30,7 @@ Requires-Dist: pydyf >=0.11.0
30
30
  Requires-Dist: cffi >=0.6
31
31
  Requires-Dist: tinyhtml5 >=2.0.0b1
32
32
  Requires-Dist: tinycss2 >=1.4.0
33
- Requires-Dist: cssselect2 >=0.1
33
+ Requires-Dist: cssselect2 >=0.8.0
34
34
  Requires-Dist: Pyphen >=0.9.1
35
35
  Requires-Dist: Pillow >=9.1.0
36
36
  Requires-Dist: fonttools[woff] >=4.0.0
@@ -2,6 +2,149 @@ Changelog
2
2
  =========
3
3
 
4
4
 
5
+ Version 65.1
6
+ ------------
7
+
8
+ Released on 2025-04-14.
9
+
10
+ Bug fixes:
11
+
12
+ * `#2414 <https://github.com/Kozea/WeasyPrint/issues/2414>`_:
13
+ Correctly handle flex columns split between pages
14
+ * `1b24ad9 <https://github.com/Kozea/WeasyPrint/commit/1b24ad9>`_:
15
+ Include padding in outer size of item elements
16
+ * `#2419 <https://github.com/Kozea/WeasyPrint/issues/2419>`_:
17
+ Set main tag as block by default
18
+ * `#2415 <https://github.com/Kozea/WeasyPrint/issues/2415>`_:
19
+ Fix support of replaced block box as flex items
20
+ * `83da2fe0 <https://github.com/Kozea/WeasyPrint/commit/83da2fe0>`_:
21
+ Fix margins and padding for rtl lists
22
+ * `#2429 <https://github.com/Kozea/WeasyPrint/issues/2429>`_,
23
+ `#1076 <https://github.com/Kozea/WeasyPrint/issues/1076>`_,
24
+ `#2431 <https://github.com/Kozea/WeasyPrint/pull/2431>`_:
25
+ Fix page groups
26
+
27
+ Contributors:
28
+
29
+ * Guillaume Ayoub
30
+
31
+ Backers and sponsors:
32
+
33
+ * Spacinov
34
+ * Kobalt
35
+ * Grip Angebotssoftware
36
+ * Syslifters
37
+ * Simon Sapin
38
+ * Manuel Barkhau
39
+ * Simonsoft
40
+ * Menutech
41
+ * KontextWork
42
+ * TrainingSparkle
43
+ * Healthchecks.io
44
+ * Hammerbacher
45
+ * DocRaptor
46
+ * Yanal-Yves Fargialla
47
+ * Method B
48
+ * FieldHub
49
+ * Morntag
50
+ * Xavid
51
+ * Kai DeLorenzo
52
+ * Charlie S.
53
+ * Alan Villalobos
54
+
55
+
56
+ Version 65.0
57
+ ------------
58
+
59
+ Released on 2025-03-20.
60
+
61
+ Dependencies:
62
+
63
+ * CSSSelect2 0.8.0 is now needed
64
+
65
+ Features:
66
+
67
+ * `#1665 <https://github.com/Kozea/WeasyPrint/issues/1665>`_:
68
+ Support gap properties in Flex layout, with financial support from NLnet.
69
+ * `#378 <https://github.com/Kozea/WeasyPrint/issues/378>`_,
70
+ `#2405 <https://github.com/Kozea/WeasyPrint/pull/2405>`_:
71
+ Handle @font-face unicode-range
72
+ * `#2394 <https://github.com/Kozea/WeasyPrint/pull/2394>`_:
73
+ Modernize and improve default user agent stylesheets
74
+
75
+ Bug fixes:
76
+
77
+ * `#2362 <https://github.com/Kozea/WeasyPrint/issues/2362>`_,
78
+ `#2387 <https://github.com/Kozea/WeasyPrint/pull/2387>`_,
79
+ `#601 <https://github.com/Kozea/WeasyPrint/issues/601>`_,
80
+ `#1967 <https://github.com/Kozea/WeasyPrint/issues/1967>`_,
81
+ `#1805 <https://github.com/Kozea/WeasyPrint/issues/1805>`_,
82
+ `#2163 <https://github.com/Kozea/WeasyPrint/issues/2163>`_,
83
+ `#2342 <https://github.com/Kozea/WeasyPrint/issues/2342>`_,
84
+ `#2374 <https://github.com/Kozea/WeasyPrint/issues/2374>`_,
85
+ `#1109 <https://github.com/Kozea/WeasyPrint/issues/1109>`_,
86
+ `#1356 <https://github.com/Kozea/WeasyPrint/issues/1356>`_,
87
+ `#1327 <https://github.com/Kozea/WeasyPrint/issues/1327>`_,
88
+ `#1563 <https://github.com/Kozea/WeasyPrint/issues/1563>`_,
89
+ `#1652 <https://github.com/Kozea/WeasyPrint/issues/1652>`_,
90
+ `#2351 <https://github.com/Kozea/WeasyPrint/issues/2351>`_,
91
+ `#2312 <https://github.com/Kozea/WeasyPrint/issues/2312>`_,
92
+ `#2340 <https://github.com/Kozea/WeasyPrint/issues/2340>`_,
93
+ `#1311 <https://github.com/Kozea/WeasyPrint/issues/1311>`_,
94
+ `#2066 <https://github.com/Kozea/WeasyPrint/issues/2066>`_,
95
+ `#2359 <https://github.com/Kozea/WeasyPrint/issues/2359>`_,
96
+ `#2053 <https://github.com/Kozea/WeasyPrint/issues/2053>`_:
97
+ Improve Flex layout, with financial support from NLnet.
98
+ * `#1686 <https://github.com/Kozea/WeasyPrint/issues/1686>`_,
99
+ `#2404 <https://github.com/Kozea/WeasyPrint/pull/2404>`_:
100
+ Fix duplicate text selection with right-to-left text
101
+ * `#2372 <https://github.com/Kozea/WeasyPrint/issues/2372>`_,
102
+ `#2389 <https://github.com/Kozea/WeasyPrint/pull/2389>`_:
103
+ Fix justification of right-to-left text
104
+ * `#2403 <https://github.com/Kozea/WeasyPrint/issues/2403>`_:
105
+ Fix emoji rendering with older versions of Pango
106
+ * `#2392 <https://github.com/Kozea/WeasyPrint/issues/2392>`_:
107
+ Fix complex cases involving nested SVG text anchors
108
+ * `#2396 <https://github.com/Kozea/WeasyPrint/issues/2396>`_,
109
+ `#2398 <https://github.com/Kozea/WeasyPrint/pull/2398>`_:
110
+ Fix and improve font names in PDF
111
+ * `#2269 <https://github.com/Kozea/WeasyPrint/issues/2269>`_,
112
+ `#2390 <https://github.com/Kozea/WeasyPrint/pull/2390>`_:
113
+ Apply justification to non-breaking spaces
114
+ * `#2362 <https://github.com/Kozea/WeasyPrint/issues/2362>`_,
115
+ `#2387 <https://github.com/Kozea/WeasyPrint/pull/2387>`_:
116
+ Improve Flex layout, with financial support from NLnet.
117
+
118
+ Contributors:
119
+
120
+ * Guillaume Ayoub
121
+ * Luca Vercelli
122
+
123
+ Backers and sponsors:
124
+
125
+ * Spacinov
126
+ * Kobalt
127
+ * Grip Angebotssoftware
128
+ * Syslifters
129
+ * Simon Sapin
130
+ * Manuel Barkhau
131
+ * Simonsoft
132
+ * Menutech
133
+ * KontextWork
134
+ * TrainingSparkle
135
+ * Healthchecks.io
136
+ * Hammerbacher
137
+ * DocRaptor
138
+ * Yanal-Yves Fargialla
139
+ * Method B
140
+ * FieldHub
141
+ * Morntag
142
+ * Xavid
143
+ * Kai DeLorenzo
144
+ * Charlie S.
145
+ * Alan Villalobos
146
+
147
+
5
148
  Version 64.1
6
149
  ------------
7
150
 
@@ -15,7 +15,7 @@ WeasyPrint |version| depends on:
15
15
  * CFFI_ ≥ 0.6
16
16
  * tinyhtml5_ ≥ 2.0.0b1
17
17
  * tinycss2_ ≥ 1.3.0
18
- * cssselect2_ ≥ 0.1
18
+ * cssselect2_ ≥ 0.8.0
19
19
  * Pyphen_ ≥ 0.9.1
20
20
  * Pillow_ ≥ 9.1.0
21
21
  * fontTools_ ≥ 4.0.0
@@ -16,7 +16,7 @@ dependencies = [
16
16
  'cffi >=0.6',
17
17
  'tinyhtml5 >=2.0.0b1',
18
18
  'tinycss2 >=1.4.0',
19
- 'cssselect2 >=0.1',
19
+ 'cssselect2 >=0.8.0',
20
20
  'Pyphen >=0.9.1',
21
21
  'Pillow >=9.1.0',
22
22
  'fonttools[woff] >=4.0.0',
@@ -0,0 +1,13 @@
1
+ """Test the user-agent stylesheet."""
2
+
3
+ import pytest
4
+
5
+ from weasyprint.html import CSS, HTML5_PH, HTML5_UA, HTML5_UA_FORM
6
+
7
+ from ..testing_utils import assert_no_logs
8
+
9
+
10
+ @assert_no_logs
11
+ @pytest.mark.parametrize('css', (HTML5_UA, HTML5_UA_FORM, HTML5_PH))
12
+ def test_ua_stylesheets(css):
13
+ CSS(string=css)
@@ -82,10 +82,8 @@ def test_stroke_fill_opacity(assert_same_renderings):
82
82
  )
83
83
 
84
84
 
85
- @pytest.mark.xfail
86
85
  @assert_no_logs
87
86
  def test_pattern_gradient_stroke_fill_opacity(assert_same_renderings):
88
- # TODO: broken with old versons of Ghostscript
89
87
  assert_same_renderings(
90
88
  opacity_source % '''
91
89
  <defs>
@@ -343,6 +343,44 @@ def test_text_anchor_end_tspan(assert_pixels):
343
343
  ''')
344
344
 
345
345
 
346
+ @assert_no_logs
347
+ def test_text_anchor_middle_tspan_head_tail(assert_pixels):
348
+ assert_pixels('''
349
+ ____BBBBRRRRRRBB____
350
+ ____BBBBRRRRRRBB____
351
+ ''', '''
352
+ <style>
353
+ @page { size: 20px 2px }
354
+ svg { display: block }
355
+ </style>
356
+ <svg width="20px" height="2px" xmlns="http://www.w3.org/2000/svg">
357
+ <text x="10" y="1.5" font-family="weasyprint" font-size="2" fill="blue"
358
+ text-anchor="middle">
359
+ AA<tspan fill="red">ABC</tspan>A
360
+ </text>
361
+ </svg>
362
+ ''')
363
+
364
+
365
+ @assert_no_logs
366
+ def test_text_anchor_end_tspan_head_tail(assert_pixels):
367
+ assert_pixels('''
368
+ ______BBBBRRRRRRBB__
369
+ ______BBBBRRRRRRBB__
370
+ ''', '''
371
+ <style>
372
+ @page { size: 20px 2px }
373
+ svg { display: block }
374
+ </style>
375
+ <svg width="20px" height="2px" xmlns="http://www.w3.org/2000/svg">
376
+ <text x="18" y="1.5" font-family="weasyprint" font-size="2" fill="blue"
377
+ text-anchor="end">
378
+ AA<tspan fill="red">ABC</tspan>A
379
+ </text>
380
+ </svg>
381
+ ''')
382
+
383
+
346
384
  @assert_no_logs
347
385
  def test_text_anchor_middle_end_tspan(assert_pixels):
348
386
  assert_pixels('''
@@ -109,6 +109,62 @@ def test_text_align_rtl_trailing_whitespace(assert_pixels):
109
109
  ''')
110
110
 
111
111
 
112
+ def test_rtl_default_direction(assert_pixels):
113
+ assert_pixels('''
114
+ _____BBBBB_____
115
+ _____BBBBB_____
116
+ _____BBBBB_____
117
+ _____BBBBB_____
118
+ BBBBBBBBBB_____
119
+ ''', '''
120
+ <style>
121
+ @page { size: 15px 5px }
122
+ body { font-family: weasyprint; color: blue; font-size: 5px; line-height: 1 }
123
+ </style>
124
+ اب
125
+ ''')
126
+
127
+
128
+ def test_rtl_forced_direction(assert_pixels):
129
+ assert_pixels('''
130
+ __________BBBBB
131
+ __________BBBBB
132
+ __________BBBBB
133
+ __________BBBBB
134
+ _____BBBBBBBBBB
135
+ ''', '''
136
+ <style>
137
+ @page { size: 15px 5px }
138
+ body { font-family: weasyprint; color: blue; font-size: 5px; line-height: 1 }
139
+ </style>
140
+ <div style="direction: rtl">اب</div>
141
+ ''')
142
+
143
+
144
+ def test_rtl_nested_inline(assert_pixels):
145
+ assert_pixels('''
146
+ RRRRR________________BBBBB___________RRRRR___________BBBBB
147
+ RRRRR________________BBBBB___________RRRRR___________BBBBB
148
+ RRRRR________________BBBBB___________RRRRR___________BBBBB
149
+ RRRRR________________BBBBB___________RRRRR___________BBBBB
150
+ RRRRRRRRRR______BBBBBBBBBB______RRRRRRRRRR______BBBBBBBBBB
151
+ ______________________________________BBBBB__________RRRRR
152
+ ______________________________________BBBBB__________RRRRR
153
+ ______________________________________BBBBB__________RRRRR
154
+ ______________________________________BBBBB__________RRRRR
155
+ _________________________________BBBBBBBBBB_____RRRRRRRRRR
156
+ ''', '''
157
+ <style>
158
+ @page { size: 58px 10px }
159
+ body { font-family: weasyprint; color: blue; font-size: 5px; line-height: 1 }
160
+ span { color: red }
161
+ </style>
162
+ <div style="direction: rtl; text-align: justify">
163
+ اب <span>اب</span> اب <span>با اب</span> اب
164
+ </div>
165
+ ''')
166
+
167
+
112
168
  def test_max_lines_ellipsis(assert_pixels):
113
169
  assert_pixels('''
114
170
  BBBBBBBB__
@@ -453,6 +509,31 @@ def test_text_align_justify(assert_pixels):
453
509
  <div>a c e</div>''')
454
510
 
455
511
 
512
+ def test_text_align_justify_nbsp(assert_pixels):
513
+ assert_pixels('''
514
+ ___________________
515
+ _RR___RR___RR___RR_
516
+ _RR___RR___RR___RR_
517
+ ___________________
518
+ ''', '''
519
+ <style>
520
+ @page {
521
+ size: 19px 4px;
522
+ }
523
+ body {
524
+ color: red;
525
+ font-family: weasyprint;
526
+ font-size: 2px;
527
+ }
528
+ div {
529
+ line-height: 1;
530
+ margin: 1px;
531
+ text-align: justify-all;
532
+ }
533
+ </style>
534
+ <div>a b&nbsp;c&nbsp;d</div>''')
535
+
536
+
456
537
  def test_text_word_spacing(assert_pixels):
457
538
  assert_pixels('''
458
539
  ___________________
@@ -1149,3 +1230,29 @@ def test_font_variant_caps_titling(assert_pixels):
1149
1230
  </style>
1150
1231
  <p>Pp</p>
1151
1232
  ''' % SANS_FONTS)
1233
+
1234
+
1235
+ def test_unicode_range(assert_pixels):
1236
+ assert_pixels('''
1237
+ __________
1238
+ _RRRRRR___
1239
+ _RRRRRRzz_
1240
+ __________
1241
+ ''', '''
1242
+ <style>
1243
+ @font-face {
1244
+ font-family: uni;
1245
+ src: url(weasyprint.otf);
1246
+ unicode-range: u+41, u+043-045, u+005?;
1247
+ }
1248
+ @page {
1249
+ size: 10px 4px;
1250
+ }
1251
+ body {
1252
+ color: red;
1253
+ font-family: uni;
1254
+ font-size: 2px;
1255
+ line-height: 0;
1256
+ margin: 2px 1px;
1257
+ }
1258
+ </style>ADZB''')