1
1
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:
Guillaume Ayoub 2017-10-24 08:47:22 +02:00
parent d44c738717
commit 0412f54bb4
2 changed files with 32 additions and 9 deletions

View File

@ -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

View File

@ -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])