X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fbuffer_funcs.cpp;h=ff4512b5c6a1279774f434f957140bd294ad90cd;hb=01dc4e4b83a863c7503cb471a7b8adc19f134761;hp=ed699084f2851a8f877bde38285605e65df87c1e;hpb=4e394eb9c502ed384b187806be624fa68c5609a2;p=lyx.git diff --git a/src/buffer_funcs.cpp b/src/buffer_funcs.cpp index ed699084f2..ff4512b5c6 100644 --- a/src/buffer_funcs.cpp +++ b/src/buffer_funcs.cpp @@ -179,12 +179,19 @@ Buffer * newUnnamedFile(FileName const & path, string const & prefix, * are similar but, unfortunately, they seem to have a different * notion of what to count. Since nobody ever complained about that, * this proves (again) that any number beats no number ! (JMarc) + * We have two use cases: + * 1. Count the words of the given range for document statistics + * - ignore inset content without output. (skipNoOutput == true) + * 2. Count the words to present a progress bar for the spell checker + * - has to count whole content. (skipNoOutput == false) */ -int countWords(DocIterator const & from, DocIterator const & to) +int countWords(DocIterator const & from, DocIterator const & to, + bool skipNoOutput) { int count = 0; bool inword = false; - for (DocIterator dit = from ; dit != to ; ) { + + for (DocIterator dit = from ; dit != to && !dit.atEnd(); ) { if (!dit.inTexted()) { dit.forwardPos(); continue; @@ -192,13 +199,18 @@ int countWords(DocIterator const & from, DocIterator const & to) Paragraph const & par = dit.paragraph(); pos_type const pos = dit.pos(); - + // Copied and adapted from isWordSeparator() in Paragraph - if (pos != dit.lastpos() && !par.isDeleted(pos)) { + if (pos == dit.lastpos()) { + inword = false; + } else if (!par.isDeleted(pos)) { Inset const * ins = par.getInset(pos); - if (ins && !ins->producesOutput()) { - //skip this inset + if (ins && skipNoOutput && !ins->producesOutput()) { + // skip this inset ++dit.top().pos(); + // stop if end of range was skipped + if (!to.atEnd() && dit >= to) + break; continue; } if (par.isWordSeparator(pos))