summaryrefslogtreecommitdiff
path: root/lib/lettering/font.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lettering/font.py')
-rw-r--r--lib/lettering/font.py81
1 files changed, 59 insertions, 22 deletions
diff --git a/lib/lettering/font.py b/lib/lettering/font.py
index 0c02de84..a554183e 100644
--- a/lib/lettering/font.py
+++ b/lib/lettering/font.py
@@ -324,40 +324,69 @@ class Font(object):
group = inkex.Group()
group.label = line
+ if self.text_direction == 'rtl':
+ group.label = line[::-1]
group.set("inkstitch:letter-group", "line")
last_character = None
words = line.split(" ")
for word in words:
+
word_group = inkex.Group()
- word_group.label = word
+ label = word
+ if self.text_direction == 'rtl':
+ label = word[::-1]
+ word_group.label = label
word_group.set("inkstitch:letter-group", "word")
- for character in word:
- if self.letter_case == "upper":
- character = character.upper()
- elif self.letter_case == "lower":
- character = character.lower()
-
- glyph = glyph_set[character]
+ if self.text_direction == 'rtl':
+ glyphs = self._get_word_glyphs(glyph_set, word[::-1])
+ glyphs = glyphs[::-1]
+ else:
+ glyphs = self._get_word_glyphs(glyph_set, word)
- if glyph is None and self.default_glyph == " ":
+ last_character = None
+ for glyph in glyphs:
+ if glyph is None:
position.x += self.word_spacing
last_character = None
- else:
- if glyph is None:
- glyph = glyph_set[self.default_glyph]
+ continue
+ node = self._render_glyph(destination_group, glyph, position, glyph.name, last_character)
+ word_group.append(node)
+ last_character = glyph.name
+ group.append(word_group)
+ position.x += self.word_spacing
+ return group
- if glyph is not None:
- node = self._render_glyph(destination_group, glyph, position, character, last_character)
- word_group.append(node)
+ def _get_word_glyphs(self, glyph_set, word):
+ glyphs = []
+ skip = []
+ previous_is_binding = True
- last_character = character
- position.x += self.word_spacing
- last_character = None
- group.append(word_group)
+ for i, character in enumerate(word):
+ if i in skip:
+ continue
- return group
+ # forced letter case
+ if self.letter_case == "upper":
+ character = character.upper()
+ elif self.letter_case == "lower":
+ character = character.lower()
+
+ glyph, glyph_len, binding = glyph_set.get_next_glyph(word, i, previous_is_binding)
+ previous_is_binding = binding
+
+ skip = list(range(i, i+glyph_len))
+
+ if glyph is None and self.default_glyph == " ":
+ glyphs.append(None)
+ else:
+ if glyph is None:
+ glyphs.append(glyph_set[self.default_glyph])
+ if glyph is not None:
+ glyphs.append(glyph)
+
+ return glyphs
def _render_glyph(self, destination_group, glyph, position, character, last_character):
"""Render a single glyph.
@@ -383,9 +412,17 @@ class Font(object):
node = deepcopy(glyph.node)
if last_character is not None:
if self.text_direction != "rtl":
- position.x += glyph.min_x - self.kerning_pairs.get(last_character + character, 0)
+ kerning = self.kerning_pairs.get(f'{last_character} {character}', None)
+ if kerning is None:
+ # legacy kerning without space
+ kerning = self.kerning_pairs.get(last_character + character, 0)
+ position.x += glyph.min_x - kerning
else:
- position.x += glyph.min_x - self.kerning_pairs.get(character + last_character, 0)
+ kerning = self.kerning_pairs.get(f'{character} {last_character}', None)
+ if kerning is None:
+ # legacy kerning without space
+ kerning = self.kerning_pairs.get(character + last_character, 0)
+ position.x += glyph.min_x - kerning
transform = "translate(%s, %s)" % position.as_tuple()
node.set('transform', transform)