diff --git a/src/text-editing.cpp b/src/text-editing.cpp
index 44450f8fa7e39a7281c72b85f872f9cf84d44adc..f0cb4bd9da12967f29a32a30863485bc1154a367 100644 (file)
--- a/src/text-editing.cpp
+++ b/src/text-editing.cpp
return length;
}
+/** Recursively gets the length of all the SPStrings at or below the given
+\a item, before and not including \a upto. Also adds 1 for each line break encountered. */
+unsigned sp_text_get_length_upto(SPObject const *item, SPObject const *upto)
+{
+ unsigned length = 0;
+
+ if (SP_IS_STRING(item)) {
+ return SP_STRING(item)->string.length();
+ }
+ if (is_line_break_object(item) && !SP_IS_TEXT(item)) {
+ if (item != SP_OBJECT_PARENT(item)->firstChild()) {
+ // add 1 for each newline
+ length++;
+ }
+ }
+ for (SPObject const *child = item->firstChild() ; child ; child = SP_OBJECT_NEXT(child)) {
+ if (upto && child == upto) {
+ // hit upto, return immediately
+ return length;
+ }
+ if (SP_IS_STRING(child)) {
+ length += SP_STRING(child)->string.length();
+ }
+ else {
+ if (upto && child->isAncestorOf(upto)) {
+ // upto is below us, recurse and break loop
+ length += sp_text_get_length_upto(child, upto);
+ return length;
+ } else {
+ // recurse and go to the next sibling
+ length += sp_text_get_length_upto(child, upto);
+ }
+ }
+ }
+ return length;
+}
+
static Inkscape::XML::Node* duplicate_node_without_children(Inkscape::XML::Node const *old_node)
{
switch (old_node->type()) {