mirror of
https://github.com/Kozea/WeasyPrint.git
synced 2024-10-05 08:27:22 +03:00
Use Pango instead of uniseg to break lines
This commit is contained in:
parent
d44c738717
commit
0412f54bb4
@ -14,11 +14,9 @@ from __future__ import division, unicode_literals
|
||||
|
||||
import unicodedata
|
||||
|
||||
import uniseg.linebreak
|
||||
|
||||
from ..css.computed_values import ex_ratio, strut_layout
|
||||
from ..formatting_structure import boxes
|
||||
from ..text import split_first_line
|
||||
from ..text import can_break_text, split_first_line
|
||||
from .absolute import AbsolutePlaceholder, absolute_layout
|
||||
from .float import avoid_collisions, float_layout
|
||||
from .min_max import handle_min_max_height, handle_min_max_width
|
||||
@ -703,8 +701,8 @@ def split_inline_box(context, box, position_x, max_x, skip_stack,
|
||||
if None in (last_letter, first):
|
||||
can_break = True
|
||||
else:
|
||||
can_break = bool(list(uniseg.linebreak.line_break_breakables(
|
||||
last_letter + first))[1])
|
||||
can_break = can_break_text(
|
||||
last_letter + first, child.style['lang'])
|
||||
|
||||
if can_break:
|
||||
children.extend(waiting_children)
|
||||
@ -1118,9 +1116,7 @@ def can_break_inside(box):
|
||||
if isinstance(box, boxes.AtomicInlineLevelBox):
|
||||
return False
|
||||
elif isinstance(box, boxes.TextBox):
|
||||
if box.text:
|
||||
return any(uniseg.linebreak.line_break_breakables(box.text[1:]))
|
||||
return can_break_text(box.text, box.style['lang'])
|
||||
elif isinstance(box, boxes.ParentBox):
|
||||
return any(can_break_inside(child) for child in box.children)
|
||||
else:
|
||||
return False
|
||||
return False
|
||||
|
@ -126,6 +126,11 @@ ffi.cdef('''
|
||||
int height;
|
||||
} PangoRectangle;
|
||||
|
||||
typedef struct {
|
||||
guint is_line_break: 1;
|
||||
/* ... */
|
||||
} PangoLogAttr;
|
||||
|
||||
int pango_version (void);
|
||||
|
||||
double pango_units_to_double (int i);
|
||||
@ -210,6 +215,10 @@ ffi.cdef('''
|
||||
|
||||
PangoContext * pango_layout_get_context (PangoLayout *layout);
|
||||
|
||||
void pango_get_log_attrs (
|
||||
const char *text, int length, int level, PangoLanguage *language,
|
||||
PangoLogAttr *log_attrs, int attrs_len);
|
||||
|
||||
|
||||
// PangoCairo
|
||||
|
||||
@ -1168,3 +1177,21 @@ def show_first_line(context, pango_layout, hinting):
|
||||
pango.pango_layout_set_width(pango_layout.layout, -1)
|
||||
pangocairo.pango_cairo_show_layout_line(
|
||||
context, next(pango_layout.iter_lines()))
|
||||
|
||||
|
||||
def can_break_text(text, lang):
|
||||
if not text or len(text) < 2:
|
||||
return False
|
||||
if lang:
|
||||
lang_p, lang = unicode_to_char_p(lang)
|
||||
else:
|
||||
lang = None
|
||||
language = pango.pango_language_get_default()
|
||||
if lang:
|
||||
language = pango.pango_language_from_string(lang_p)
|
||||
text_p, bytestring = unicode_to_char_p(text)
|
||||
length = len(bytestring) + 1
|
||||
log_attrs = ffi.new('PangoLogAttr[]', length)
|
||||
pango.pango_get_log_attrs(
|
||||
text_p, len(bytestring), -1, language, log_attrs, length)
|
||||
return any(attr.is_line_break for attr in log_attrs[1:length - 1])
|
||||
|
Loading…
Reference in New Issue
Block a user