diff --git a/weasyprint/css/properties.py b/weasyprint/css/properties.py index d2aa94432f..21e75537b5 100644 --- a/weasyprint/css/properties.py +++ b/weasyprint/css/properties.py @@ -148,6 +148,7 @@ 'letter_spacing': 'normal', 'tab_size': 8, 'text_align': 'start', + 'text_align_last': 'auto', 'text_indent': Dimension(0, 'px'), 'text_transform': 'none', 'white_space': 'normal', @@ -258,6 +259,7 @@ 'quotes', 'tab_size', 'text_align', + 'text_align_last', 'text_decoration_line', 'text_decoration_color', 'text_decoration_style', diff --git a/weasyprint/css/validation/properties.py b/weasyprint/css/validation/properties.py index 10627a894b..79fbe6d5b9 100644 --- a/weasyprint/css/validation/properties.py +++ b/weasyprint/css/validation/properties.py @@ -1101,6 +1101,13 @@ def text_align(keyword): return keyword in ('left', 'right', 'center', 'justify', 'start', 'end') +@property() +@single_keyword +def text_align_last(keyword): + """``text-align-last`` property validation.""" + return keyword in ('auto', 'left', 'right', 'center', 'justify', 'start', 'end') + + @property() def text_decoration_line(tokens): """``text-decoration-line`` property validation.""" diff --git a/weasyprint/layout/inlines.py b/weasyprint/layout/inlines.py index da7e571b02..b59919c9b8 100644 --- a/weasyprint/layout/inlines.py +++ b/weasyprint/layout/inlines.py @@ -1316,6 +1316,12 @@ def text_align(context, line, available_width, last): return 0 align = line.style['text_align'] + align_last = line.style['text_align_last'] + if last: + if align_last != 'auto': + align = align_last + elif align == 'justify': + align = 'start' space_collapse = line.style['white_space'] in ( 'normal', 'nowrap', 'pre-line') if align in ('left', 'right'): @@ -1323,8 +1329,6 @@ def text_align(context, line, available_width, last): align = 'start' else: align = 'end' - if align == 'justify' and last: - align = 'start' if align == 'start': return 0 offset = available_width - line.width